mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-22 19:19:52 +02:00
feat: spaced armor thickness
This commit is contained in:
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>
|
||||
|
||||
+16
@@ -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}
|
||||
|
||||
+33
-3
@@ -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)}
|
||||
|
||||
Reference in new issue
Block a user