feat: spaced armor finish

This commit is contained in:
TrèsAbhi committed 2024-02-27 11:02:14 -06:00
1 parent 080af86e1b
commit fabf649608
11 files changed
+124 -78

No files matched your search

@@ -0,0 +1,54 @@
import {
AdditiveBlending,
MeshBasicMaterial,
Object3D,
ShaderMaterial,
} from 'three';
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 SpacedArmorSubExternalProps {
node: Object3D;
thickness: number;
}
export function SpacedArmorSubExternal({
node,
thickness,
}: SpacedArmorSubExternalProps) {
const penetration = resolveNearPenetration(
useDuel.getState().antagonist!.shell.penetration,
);
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,
}),
})}
</>
);
}
@@ -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);
}
@@ -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) },
},
}),
});
}
@@ -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),
})}
</>
<SpacedArmorSubSpaced node={node} thickness={thickness} />
)}
{type === ArmorType.External && (
<>
{jsxTree(node, {
renderOrder: 4,
material: externalModuleMaterial(thickness, penetration),
})}
{jsxTree(node, {
renderOrder: 3,
material: new MeshBasicMaterial({
colorWrite: false,
depthTest: true,
depthWrite: true,
}),
})}
</>
<SpacedArmorSubExternal node={node} thickness={thickness} />
)}
</>
);
@@ -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 },
},
});
}
@@ -1,6 +0,0 @@
uniform float thickness;
uniform float penetration;
void main() {
gl_FragColor = vec4(thickness / penetration, 0.0, 0.0, 1.0);
}
@@ -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 },
},
});
}