feat: spaced armor thickness

This commit is contained in:
TrèsAbhi committed 2024-01-16 09:52:30 -06:00
1 parent a11975adec
commit 8f4ea5f2fd
9 files changed
+128 -25

No files matched your search

@@ -132,7 +132,6 @@ export function TankDisplay({ duel }: TankDisplayProps) {
>
<TankModel duel={duel} />
<TankArmor duel={duel} />
{/* <SpacedArmorDepth duel={duel} /> */}
</Suspense>
</Canvas>
</div>
@@ -136,6 +136,19 @@ export function ArmorHighlighting({ duel }: ArmorHighlightingProps) {
tankModelDefinition.trackThickness,
gunModelDefinition.barrelThickness,
);
const maxSpacedArmorThickness = Math.max(
...armorNodes
.map((node) => {
const armorId = nameToArmorId(node.name);
const { spaced, thickness } = resolveArmor(
tankModelDefinition.armor,
armorId,
);
return spaced ? thickness : null;
})
.filter(Boolean),
);
return (
<group
@@ -162,6 +175,7 @@ export function ArmorHighlighting({ duel }: ArmorHighlightingProps) {
return (
<ArmorMesh
maxExternalModuleThickness={maxExternalModuleThickness}
maxSpacedArmorThickness={maxSpacedArmorThickness}
duel={duel}
key={node.uuid}
geometry={(node as Mesh).geometry}
@@ -193,6 +207,7 @@ export function ArmorHighlighting({ duel }: ArmorHighlightingProps) {
return (
<ArmorMesh
maxExternalModuleThickness={maxExternalModuleThickness}
maxSpacedArmorThickness={maxSpacedArmorThickness}
duel={duel}
key={node.uuid}
geometry={(node as Mesh).geometry}
@@ -224,6 +239,7 @@ export function ArmorHighlighting({ duel }: ArmorHighlightingProps) {
return (
<ArmorMesh
maxExternalModuleThickness={maxExternalModuleThickness}
maxSpacedArmorThickness={maxSpacedArmorThickness}
duel={duel}
key={node.uuid}
geometry={(node as Mesh).geometry}
@@ -24,6 +24,17 @@ interface SpacedArmorDepthProps {
duel: Duel;
}
/**
* When rendered, this component provides the depth buffer for the armor which
* when compared to the depth of the core armor will give you the distance
* between the first point of contact and the core armor. The color channels
* hold information about the thickness of the spaced armor (external modules
* not included).
* - R: angle of the armor where 0 is 0 and 1 is 90
* - G: normalized thickness; multiply with max thickness to get nominal thickness
* - B: no data
* - A: 1 means is armor; 0 is background
*/
export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(({ duel }) => {
const wrapper = useRef<Group>(null);
const awaitedModelDefinitions = useModelDefinitions();
@@ -127,6 +138,19 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(({ duel }) => {
tankModelDefinition.turrets[duel.protagonist.turret.id];
const gunModelDefinition =
turretModelDefinition.guns[duel.protagonist.gun.id];
const maxThickness = Math.max(
...armorNodes
.map((node) => {
const armorId = nameToArmorId(node.name);
const { spaced, thickness } = resolveArmor(
tankModelDefinition.armor,
armorId,
);
return spaced ? thickness : null;
})
.filter(Boolean),
);
const turretOrigin = new Vector3(
tankModelDefinition.turretOrigin[0],
tankModelDefinition.turretOrigin[1],
@@ -162,7 +186,9 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(({ duel }) => {
return (
<ArmorMeshSpacedArmorDepth
exclude
include={spaced}
thickness={thickness}
maxThickness={maxThickness}
key={node.uuid}
geometry={(node as Mesh).geometry}
/>
@@ -205,7 +231,9 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(({ duel }) => {
return (
<ArmorMeshSpacedArmorDepth
exclude
include={spaced}
thickness={thickness}
maxThickness={maxThickness}
key={node.uuid}
geometry={(node as Mesh).geometry}
position={turretOrigin}
@@ -233,7 +261,9 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(({ duel }) => {
return (
<ArmorMeshSpacedArmorDepth
exclude
include={spaced}
thickness={thickness}
maxThickness={maxThickness}
key={node.uuid}
geometry={(node as Mesh).geometry}
position={turretOrigin.clone().add(gunOrigin)}