From fabf649608b14e045675b08b17727281c9596813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:02:14 -0600 Subject: [PATCH] feat: spaced armor finish --- .../TankArmor/components/Spaced.tsx | 12 ----- .../SpacedArmorSubExternal}/fragment.glsl | 0 .../SpacedArmorSubExternal/index.tsx | 54 +++++++++++++++++++ .../SpacedArmorSubExternal}/vertex.glsl | 0 .../SpacedArmorSubSpaced/fragment.glsl | 24 +++++++++ .../components/SpacedArmorSubSpaced/index.ts | 42 +++++++++++++++ .../SpacedArmorSubSpaced}/vertex.glsl | 0 .../Armor/components/SpacedArmor/index.tsx | 26 ++------- .../materials/externalModule/index.ts | 19 ------- .../materials/spaced/fragment.glsl | 6 --- .../SpacedArmor/materials/spaced/index.ts | 19 ------- 11 files changed, 124 insertions(+), 78 deletions(-) rename src/components/Armor/components/SpacedArmor/{materials/externalModule => components/SpacedArmorSubExternal}/fragment.glsl (100%) create mode 100644 src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/index.tsx rename src/components/Armor/components/SpacedArmor/{materials/externalModule => components/SpacedArmorSubExternal}/vertex.glsl (100%) create mode 100644 src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/fragment.glsl create mode 100644 src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.ts rename src/components/Armor/components/SpacedArmor/{materials/spaced => components/SpacedArmorSubSpaced}/vertex.glsl (100%) delete mode 100644 src/components/Armor/components/SpacedArmor/materials/externalModule/index.ts delete mode 100644 src/components/Armor/components/SpacedArmor/materials/spaced/fragment.glsl delete mode 100644 src/components/Armor/components/SpacedArmor/materials/spaced/index.ts diff --git a/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor/components/Spaced.tsx b/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor/components/Spaced.tsx index 3db354953..96fc79bf1 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor/components/Spaced.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/components/TankArmor/components/Spaced.tsx @@ -3,7 +3,6 @@ import { Euler, Group, Vector3 } from 'three'; import { degToRad } from 'three/src/math/MathUtils'; import { SpacedArmor } from '../../../../../../../../../components/Armor/components/SpacedArmor'; import { I_HAT, J_HAT, K_HAT } from '../../../../../../../../../constants/axis'; -import { resolveNearPenetration } from '../../../../../../../../../core/blitz/resolveNearPenetration'; import { ModelTransformEventData, modelTransformEvent, @@ -150,17 +149,6 @@ export const SpacedArmorScene = memo( -turretModelDefinition.gunOrigin[2], ).applyAxisAngle(I_HAT, Math.PI / 2); - console.log( - 'test', - gunModelDefinition.thickness, - resolveNearPenetration(useDuel.getState().antagonist!.shell.penetration), - (gunModelDefinition.thickness / - resolveNearPenetration( - useDuel.getState().antagonist!.shell.penetration, - )) * - 255, - ); - return ( + {jsxTree(node, { + renderOrder: 4, + material: new ShaderMaterial({ + fragmentShader, + vertexShader, + + depthTest: true, + depthWrite: false, + blending: AdditiveBlending, + + uniforms: { + thickness: { value: thickness }, + penetration: { value: penetration }, + }, + }), + })} + {jsxTree(node, { + renderOrder: 3, + material: new MeshBasicMaterial({ + colorWrite: false, + depthTest: true, + depthWrite: true, + }), + })} + + ); +} diff --git a/src/components/Armor/components/SpacedArmor/materials/externalModule/vertex.glsl b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/vertex.glsl similarity index 100% rename from src/components/Armor/components/SpacedArmor/materials/externalModule/vertex.glsl rename to src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/vertex.glsl diff --git a/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/fragment.glsl b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/fragment.glsl new file mode 100644 index 000000000..04057b4d7 --- /dev/null +++ b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/fragment.glsl @@ -0,0 +1,24 @@ +varying vec3 vNormal; +varying vec3 vViewPosition; + +uniform float thickness; +uniform float penetration; +uniform float caliber; +uniform float ricochet; +uniform float normalization; + +void main() { + float angle = acos(dot(vNormal, -vViewPosition) / length(vViewPosition)); + + bool threeCalibersRule = caliber > thickness * 3.0; + if (!threeCalibersRule && angle >= ricochet) { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + return; + } + + bool twoCalibersRule = caliber > thickness * 2.0 && thickness > 0.0; + float finalNormalization = twoCalibersRule ? ((1.4 * normalization * caliber) / (2.0 * thickness)) : normalization; + float finalThickness = thickness / cos(angle - finalNormalization); + + gl_FragColor = vec4(finalThickness / penetration, 0.0, 0.0, 1.0); +} \ No newline at end of file diff --git a/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.ts b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.ts new file mode 100644 index 000000000..ec3ebeb42 --- /dev/null +++ b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.ts @@ -0,0 +1,42 @@ +import { AdditiveBlending, Object3D, ShaderMaterial } from 'three'; +import { degToRad } from 'three/src/math/MathUtils'; +import { resolveNearPenetration } from '../../../../../../core/blitz/resolveNearPenetration'; +import { jsxTree } from '../../../../../../core/blitzkrieg/jsxTree'; +import { useDuel } from '../../../../../../stores/duel'; +import fragmentShader from './fragment.glsl'; +import vertexShader from './vertex.glsl'; + +interface SpacedArmorSubSpacedProps { + node: Object3D; + thickness: number; +} + +export function SpacedArmorSubSpaced({ + node, + thickness, +}: SpacedArmorSubSpacedProps) { + const { shell } = useDuel.getState().antagonist!; + const penetration = resolveNearPenetration(shell.penetration); + + console.log(shell.ricochet); + + return jsxTree(node, { + renderOrder: 2, + material: new ShaderMaterial({ + fragmentShader, + vertexShader, + + depthTest: true, + depthWrite: false, + blending: AdditiveBlending, + + uniforms: { + thickness: { value: thickness }, + penetration: { value: penetration }, + caliber: { value: shell.caliber }, + ricochet: { value: degToRad(shell.ricochet ?? 90) }, + normalization: { value: degToRad(shell.normalization ?? 0) }, + }, + }), + }); +} diff --git a/src/components/Armor/components/SpacedArmor/materials/spaced/vertex.glsl b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/vertex.glsl similarity index 100% rename from src/components/Armor/components/SpacedArmor/materials/spaced/vertex.glsl rename to src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/vertex.glsl diff --git a/src/components/Armor/components/SpacedArmor/index.tsx b/src/components/Armor/components/SpacedArmor/index.tsx index 228df8f10..eab1537af 100644 --- a/src/components/Armor/components/SpacedArmor/index.tsx +++ b/src/components/Armor/components/SpacedArmor/index.tsx @@ -3,8 +3,8 @@ import { ArmorType } from '../../../../app/tools/tankopedia/[id]/components/Mode import { resolveNearPenetration } from '../../../../core/blitz/resolveNearPenetration'; import { jsxTree } from '../../../../core/blitzkrieg/jsxTree'; import { useDuel } from '../../../../stores/duel'; -import { externalModuleMaterial } from './materials/externalModule'; -import { spacedMaterial } from './materials/spaced'; +import { SpacedArmorSubExternal } from './components/SpacedArmorSubExternal'; +import { SpacedArmorSubSpaced } from './components/SpacedArmorSubSpaced'; // import fragmentShader from './shaders/fragment.glsl'; // import vertexShader from './shaders/vertex.glsl'; @@ -42,29 +42,11 @@ export function SpacedArmor({ node, type, thickness }: SpacedArmorProps) { })} {type === ArmorType.Spaced && ( - <> - {jsxTree(node, { - renderOrder: 2, - material: spacedMaterial(thickness, penetration), - })} - + )} {type === ArmorType.External && ( - <> - {jsxTree(node, { - renderOrder: 4, - material: externalModuleMaterial(thickness, penetration), - })} - {jsxTree(node, { - renderOrder: 3, - material: new MeshBasicMaterial({ - colorWrite: false, - depthTest: true, - depthWrite: true, - }), - })} - + )} ); diff --git a/src/components/Armor/components/SpacedArmor/materials/externalModule/index.ts b/src/components/Armor/components/SpacedArmor/materials/externalModule/index.ts deleted file mode 100644 index df5683ddc..000000000 --- a/src/components/Armor/components/SpacedArmor/materials/externalModule/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { AdditiveBlending, ShaderMaterial } from 'three'; -import fragmentShader from './fragment.glsl'; -import vertexShader from './vertex.glsl'; - -export function externalModuleMaterial(thickness: number, penetration: number) { - return new ShaderMaterial({ - fragmentShader, - vertexShader, - - depthTest: true, - depthWrite: false, - blending: AdditiveBlending, - - uniforms: { - thickness: { value: thickness }, - penetration: { value: penetration }, - }, - }); -} diff --git a/src/components/Armor/components/SpacedArmor/materials/spaced/fragment.glsl b/src/components/Armor/components/SpacedArmor/materials/spaced/fragment.glsl deleted file mode 100644 index 0ab70c10d..000000000 --- a/src/components/Armor/components/SpacedArmor/materials/spaced/fragment.glsl +++ /dev/null @@ -1,6 +0,0 @@ -uniform float thickness; -uniform float penetration; - -void main() { - gl_FragColor = vec4(thickness / penetration, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/src/components/Armor/components/SpacedArmor/materials/spaced/index.ts b/src/components/Armor/components/SpacedArmor/materials/spaced/index.ts deleted file mode 100644 index 1e0fb7f4d..000000000 --- a/src/components/Armor/components/SpacedArmor/materials/spaced/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { AdditiveBlending, ShaderMaterial } from 'three'; -import fragmentShader from './fragment.glsl'; -import vertexShader from './vertex.glsl'; - -export function spacedMaterial(thickness: number, penetration: number) { - return new ShaderMaterial({ - fragmentShader, - vertexShader, - - depthTest: true, - depthWrite: false, - blending: AdditiveBlending, - - uniforms: { - thickness: { value: thickness }, - penetration: { value: penetration }, - }, - }); -}