fix: remove duplicate mantlets

This commit is contained in:
TrèsAbhi committed 2024-04-13 10:36:13 -05:00
1 parent e23a440508
commit 7372075ba3
12 files changed
+56 -5

No files matched your search

+12
View File
@@ -739,6 +739,17 @@ export async function definitions(production: boolean) {
const gunArmor: ModelArmor = { thickness: {} }; const gunArmor: ModelArmor = { thickness: {} };
const shotDispersionFactors = const shotDispersionFactors =
gun.shotDispersionFactors ?? gunListEntry.shotDispersionFactors; gun.shotDispersionFactors ?? gunListEntry.shotDispersionFactors;
const maskName = `gun_${gunModel.toString().padStart(2, '0')}`;
const maskEnabled =
tankParameters.maskSlice?.[maskName]?.enabled ?? false;
let mask: number | undefined;
if (maskEnabled) {
const maskRaw = tankParameters.maskSlice![maskName]!;
mask = maskRaw.planePosition[1];
} else {
mask = undefined;
}
totalUnlocks.push(gun.unlocks); totalUnlocks.push(gun.unlocks);
Object.keys(gun.armor) Object.keys(gun.armor)
@@ -788,6 +799,7 @@ export async function definitions(production: boolean) {
modelDefinitions[tankId].turrets[turretId].guns[gunId] = { modelDefinitions[tankId].turrets[turretId].guns[gunId] = {
armor: gunArmor, armor: gunArmor,
model: gunModel, model: gunModel,
mask,
thickness: thickness:
gun.armor.gun === undefined gun.armor.gun === undefined
? 0 ? 0
+14
View File
@@ -26,6 +26,20 @@ export interface TankParameters {
averageThickness?: Record<string, number>; averageThickness?: Record<string, number>;
}; };
}; };
maskSlice?: {
[key: string]:
| {
enabled: boolean;
planePosition: Vector3Tuple;
planeNormal: Vector3Tuple;
planeAxis: Vector3Tuple;
frustumConeBaseRadius: number;
frustumConeAngleDegrees: number;
planeSliceMode: number;
frustumConeSliceMode: number;
}
| undefined;
};
} }
export async function tankIcons(production: boolean) { export async function tankIcons(production: boolean) {
@@ -199,6 +199,10 @@ export function TankSandbox() {
{loadModel ? ( {loadModel ? (
<div style={{ width: '100%', height: '100%' }}> <div style={{ width: '100%', height: '100%' }}>
<Canvas <Canvas
gl={{
clippingPlanes: Object.freeze([]),
localClippingEnabled: true,
}}
shadows shadows
ref={canvas} ref={canvas}
onPointerDown={handlePointerDown} onPointerDown={handlePointerDown}
@@ -1,5 +1,5 @@
import { memo, useEffect, useRef } from 'react'; import { memo, useEffect, useRef } from 'react';
import { Euler, Group, Scene, Vector3 } from 'three'; import { Euler, Group, Plane, Scene, Vector3 } from 'three';
import { degToRad } from 'three/src/math/MathUtils'; import { degToRad } from 'three/src/math/MathUtils';
import { I_HAT, J_HAT, K_HAT } from '../../../constants/axis'; import { I_HAT, J_HAT, K_HAT } from '../../../constants/axis';
import { import {
@@ -146,6 +146,8 @@ export const SpacedArmorScene = memo<SpacedArmorSceneProps>(({ scene }) => {
turretModelDefinition.gunOrigin[1], turretModelDefinition.gunOrigin[1],
-turretModelDefinition.gunOrigin[2], -turretModelDefinition.gunOrigin[2],
).applyAxisAngle(I_HAT, Math.PI / 2); ).applyAxisAngle(I_HAT, Math.PI / 2);
const maskOrigin =
gunModelDefinition.mask! + hullOrigin.y + turretOrigin.y + gunOrigin.y;
return ( return (
<group <group
@@ -270,6 +272,7 @@ export const SpacedArmorScene = memo<SpacedArmorSceneProps>(({ scene }) => {
thickness={gunModelDefinition.thickness} thickness={gunModelDefinition.thickness}
variant="gun" variant="gun"
node={node} node={node}
clip={new Plane(new Vector3(0, 0, -1), -maskOrigin)}
/> />
); );
})} })}
@@ -3,6 +3,7 @@ import {
AdditiveBlending, AdditiveBlending,
MeshBasicMaterial, MeshBasicMaterial,
Object3D, Object3D,
Plane,
ShaderMaterial, ShaderMaterial,
} from 'three'; } from 'three';
import { ArmorUserData, ExternalModuleVariant } from '../..'; import { ArmorUserData, ExternalModuleVariant } from '../..';
@@ -20,12 +21,14 @@ interface SpacedArmorSubExternalProps {
node: Object3D; node: Object3D;
thickness: number; thickness: number;
variant: ExternalModuleVariant; variant: ExternalModuleVariant;
clip?: Plane;
} }
export function SpacedArmorSubExternal({ export function SpacedArmorSubExternal({
node, node,
thickness, thickness,
variant, variant,
clip,
}: SpacedArmorSubExternalProps) { }: SpacedArmorSubExternalProps) {
const material = new ShaderMaterial({ const material = new ShaderMaterial({
fragmentShader, fragmentShader,
@@ -34,6 +37,8 @@ export function SpacedArmorSubExternal({
depthTest: true, depthTest: true,
depthWrite: false, depthWrite: false,
blending: AdditiveBlending, blending: AdditiveBlending,
clippingPlanes: clip ? [clip] : undefined,
clipping: true,
uniforms: { uniforms: {
thickness: { value: null }, thickness: { value: null },
@@ -108,6 +113,7 @@ export function SpacedArmorSubExternal({
colorWrite: false, colorWrite: false,
depthTest: true, depthTest: true,
depthWrite: true, depthWrite: true,
clippingPlanes: clip ? [clip] : undefined,
}), }),
onClick() {}, onClick() {},
userData: { userData: {
@@ -116,6 +122,7 @@ export function SpacedArmorSubExternal({
variant, variant,
} satisfies ArmorUserData, } satisfies ArmorUserData,
})} })}
{jsxTree(node, { {jsxTree(node, {
renderOrder: 4, renderOrder: 4,
material, material,
@@ -1,6 +1,10 @@
uniform float thickness; uniform float thickness;
uniform float penetration; uniform float penetration;
#include <clipping_planes_pars_fragment>
void main() { void main() {
#include <clipping_planes_fragment>
gl_FragColor = vec4(thickness / penetration, 0.0, 0.0, 1.0); gl_FragColor = vec4(thickness / penetration, 0.0, 0.0, 1.0);
} }
@@ -1,4 +1,7 @@
#include <clipping_planes_pars_vertex>
void main() { void main() {
vec4 vViewPosition4 = modelViewMatrix * vec4(position, 1.0); #include <begin_vertex>
gl_Position = projectionMatrix * vViewPosition4; #include <project_vertex>
#include <clipping_planes_vertex>
} }
@@ -122,6 +122,7 @@ export function SpacedArmorSubSpaced({
thickness, thickness,
} satisfies ArmorUserData, } satisfies ArmorUserData,
})} })}
{jsxTree(node, { {jsxTree(node, {
renderOrder: 5, renderOrder: 5,
material: depthWriteMaterial, material: depthWriteMaterial,
@@ -3,6 +3,7 @@ import {
Intersection, Intersection,
MeshBasicMaterial, MeshBasicMaterial,
Object3D, Object3D,
Plane,
Quaternion, Quaternion,
Raycaster, Raycaster,
Scene, Scene,
@@ -29,6 +30,7 @@ type SpacedArmorSceneComponentProps = {
node: Object3D; node: Object3D;
thickness: number; thickness: number;
scene: Scene; scene: Scene;
clip?: Plane;
} & ( } & (
| { | {
type: Exclude<ArmorType, ArmorType.External>; type: Exclude<ArmorType, ArmorType.External>;
@@ -71,6 +73,7 @@ export function SpacedArmorSceneComponent({
node, node,
thickness, thickness,
scene, scene,
clip,
...props ...props
}: SpacedArmorSceneComponentProps) { }: SpacedArmorSceneComponentProps) {
const camera = useThree((state) => state.camera); const camera = useThree((state) => state.camera);
@@ -333,6 +336,7 @@ export function SpacedArmorSceneComponent({
node={node} node={node}
thickness={thickness} thickness={thickness}
variant={props.variant} variant={props.variant}
clip={clip}
/> />
)} )}
</> </>
+1
View File
@@ -47,6 +47,7 @@ interface GunModelDefinition {
thickness: number; thickness: number;
model: number; model: number;
pitch: PitchLimits; pitch: PitchLimits;
mask?: number;
} }
export interface PitchLimits { export interface PitchLimits {
min: number; min: number;
@@ -17,5 +17,3 @@ export interface ProvisionDefinitions {
export const provisionDefinitions = fetchCdonLz4<ProvisionDefinitions>( export const provisionDefinitions = fetchCdonLz4<ProvisionDefinitions>(
asset('definitions/provisions.cdon.lz4'), asset('definitions/provisions.cdon.lz4'),
); );
provisionDefinitions.then(console.log);