mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-25 11:39:51 +01:00
fix: remove duplicate mantlets
This commit is contained in:
1 parent
e23a440508
commit
7372075ba3
12 files changed
+56
-5
No files matched your search
@@ -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
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Whitespace-only changes.
@@ -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)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
+7
@@ -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,
|
||||||
|
|||||||
+4
@@ -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);
|
||||||
}
|
}
|
||||||
+5
-2
@@ -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>
|
||||||
}
|
}
|
||||||
+1
@@ -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}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -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);
|
|
||||||
Reference in new issue
Block a user