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

@@ -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<SpacedArmorSceneProps>(
-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 (
<group
ref={wrapper}
@@ -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 },
},
});
}