mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
tank model part as components
This commit is contained in:
1 parent
a7d5bd6c75
commit
e6fa17a911
8 files changed
+76
-63
No files matched your search
@@ -0,0 +1,19 @@
|
|||||||
|
import { useProtagonist } from "../hooks/useProtagonist";
|
||||||
|
import { TankModelPart } from "./TankModelPart";
|
||||||
|
|
||||||
|
export function TankModelChassis() {
|
||||||
|
const tank = useProtagonist();
|
||||||
|
|
||||||
|
const map = {
|
||||||
|
Wheels: true,
|
||||||
|
LeftTracks: true,
|
||||||
|
RightTracks: true,
|
||||||
|
LeftTrackCrashed: false,
|
||||||
|
RightTrackCrashed: false,
|
||||||
|
CollisionMesh: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TankModelPart url={`/models/tanks/${tank.id}/chassis.glb`} map={map} />
|
||||||
|
);
|
||||||
|
}
|
||||||
+13
-4
@@ -2,10 +2,14 @@ import {
|
|||||||
VisualChanges_TankPart,
|
VisualChanges_TankPart,
|
||||||
type StageParameters,
|
type StageParameters,
|
||||||
} from "@protos/blitz_static_tank_upgrade_single_stage";
|
} from "@protos/blitz_static_tank_upgrade_single_stage";
|
||||||
import { useProtagonist } from "./useProtagonist";
|
import { useProtagonist } from "../hooks/useProtagonist";
|
||||||
import { useTankModel } from "./useTankModel";
|
import { TankModelPart } from "./TankModelPart";
|
||||||
|
|
||||||
export function useTankGunModel(parameters: StageParameters) {
|
interface Props {
|
||||||
|
parameters: StageParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TankModelGun({ parameters }: Props) {
|
||||||
const tank = useProtagonist();
|
const tank = useProtagonist();
|
||||||
const selected = parameters.visual_changes.find(
|
const selected = parameters.visual_changes.find(
|
||||||
({ tank_part }) => tank_part === VisualChanges_TankPart.TANK_PART_GUN,
|
({ tank_part }) => tank_part === VisualChanges_TankPart.TANK_PART_GUN,
|
||||||
@@ -17,5 +21,10 @@ export function useTankGunModel(parameters: StageParameters) {
|
|||||||
CollisionMesh: false,
|
CollisionMesh: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
return useTankModel(`/models/tanks/${tank.id}/${selected!.name}.glb`, map);
|
return (
|
||||||
|
<TankModelPart
|
||||||
|
url={`/models/tanks/${tank.id}/${selected!.name}.glb`}
|
||||||
|
map={map}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { useProtagonist } from "../hooks/useProtagonist";
|
||||||
|
import { TankModelPart } from "./TankModelPart";
|
||||||
|
|
||||||
|
export function TankModelHull() {
|
||||||
|
const tank = useProtagonist();
|
||||||
|
|
||||||
|
const map = {
|
||||||
|
Mesh: true,
|
||||||
|
CollisionMesh: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
return <TankModelPart url={`/models/tanks/${tank.id}/hull.glb`} map={map} />;
|
||||||
|
}
|
||||||
+9
-5
@@ -1,10 +1,14 @@
|
|||||||
import { useLoader } from "@react-three/fiber";
|
import { useGLTF } from "@react-three/drei";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { Mesh, MeshStandardMaterial } from "three";
|
import { Mesh, MeshStandardMaterial } from "three";
|
||||||
import { GLTFLoader } from "three-stdlib";
|
|
||||||
|
|
||||||
export function useTankModel(url: string, map: Record<string, boolean>) {
|
interface Props {
|
||||||
const gltf = useLoader(GLTFLoader, url);
|
url: string;
|
||||||
|
map: Record<string, boolean>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TankModelPart({ url, map }: Props) {
|
||||||
|
const gltf = useGLTF(url);
|
||||||
const [root] = gltf.scene.children;
|
const [root] = gltf.scene.children;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -36,5 +40,5 @@ export function useTankModel(url: string, map: Record<string, boolean>) {
|
|||||||
}
|
}
|
||||||
}, [url, map]);
|
}, [url, map]);
|
||||||
|
|
||||||
return root;
|
return <primitive object={root} />;
|
||||||
}
|
}
|
||||||
+13
-4
@@ -2,10 +2,14 @@ import {
|
|||||||
VisualChanges_TankPart,
|
VisualChanges_TankPart,
|
||||||
type StageParameters,
|
type StageParameters,
|
||||||
} from "@protos/blitz_static_tank_upgrade_single_stage";
|
} from "@protos/blitz_static_tank_upgrade_single_stage";
|
||||||
import { useProtagonist } from "./useProtagonist";
|
import { useProtagonist } from "../hooks/useProtagonist";
|
||||||
import { useTankModel } from "./useTankModel";
|
import { TankModelPart } from "./TankModelPart";
|
||||||
|
|
||||||
export function useTankTurretModel(parameters: StageParameters) {
|
interface Props {
|
||||||
|
parameters: StageParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TankModelTurret({ parameters }: Props) {
|
||||||
const tank = useProtagonist();
|
const tank = useProtagonist();
|
||||||
const selected = parameters.visual_changes.find(
|
const selected = parameters.visual_changes.find(
|
||||||
({ tank_part }) => tank_part === VisualChanges_TankPart.TANK_PART_TURRET,
|
({ tank_part }) => tank_part === VisualChanges_TankPart.TANK_PART_TURRET,
|
||||||
@@ -16,5 +20,10 @@ export function useTankTurretModel(parameters: StageParameters) {
|
|||||||
CollisionMesh: false,
|
CollisionMesh: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
return useTankModel(`/models/tanks/${tank.id}/${selected!.name}.glb`, map);
|
return (
|
||||||
|
<TankModelPart
|
||||||
|
url={`/models/tanks/${tank.id}/${selected!.name}.glb`}
|
||||||
|
map={map}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { type StageParameters } from "@protos/blitz_static_tank_upgrade_single_stage";
|
import { type StageParameters } from "@protos/blitz_static_tank_upgrade_single_stage";
|
||||||
import { Canvas } from "@react-three/fiber";
|
import { Canvas } from "@react-three/fiber";
|
||||||
import { fov } from "../../config/camera";
|
import { fov } from "../../config/camera";
|
||||||
import { useTankChassisModel } from "../../hooks/useTankChassisModel";
|
import { TankModelChassis } from "../TankModelChassis";
|
||||||
import { useTankGunModel } from "../../hooks/useTankGunModel";
|
import { TankModelGun } from "../TankModelGun";
|
||||||
import { useTankHullModel } from "../../hooks/useTankHullModel";
|
import { TankModelHull } from "../TankModelHull";
|
||||||
import { useTankTurretModel } from "../../hooks/useTankTurretModel";
|
import { TankModelTurret } from "../TankModelTurret";
|
||||||
import { TankopediaControls } from "../TankopediaControls";
|
import { TankopediaControls } from "../TankopediaControls";
|
||||||
import { TankopediaLighting } from "../TankopediaLighting";
|
import { TankopediaLighting } from "../TankopediaLighting";
|
||||||
import { SceneProps } from "../TankopediaSceneProps";
|
import { SceneProps } from "../TankopediaSceneProps";
|
||||||
@@ -32,25 +32,14 @@ export function TankopediaSandbox({ parameters }: TankopediaSandboxProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Content({ parameters }: TankopediaSandboxProps) {
|
function Content({ parameters }: TankopediaSandboxProps) {
|
||||||
const hull = useTankHullModel();
|
|
||||||
const chassis = useTankChassisModel();
|
|
||||||
const turret = useTankTurretModel(parameters);
|
|
||||||
const gun = useTankGunModel(parameters);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<group>
|
<TankModelChassis />
|
||||||
<primitive object={chassis} />
|
<TankModelHull />
|
||||||
<primitive object={hull} />
|
<TankModelTurret parameters={parameters} />
|
||||||
</group>
|
<TankModelGun parameters={parameters} />
|
||||||
|
|
||||||
<group>
|
{/**/}
|
||||||
<primitive object={turret} />
|
|
||||||
</group>
|
|
||||||
|
|
||||||
<group>
|
|
||||||
<primitive object={gun} />
|
|
||||||
</group>
|
|
||||||
|
|
||||||
<TankopediaLighting />
|
<TankopediaLighting />
|
||||||
<SceneProps />
|
<SceneProps />
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
import { useProtagonist } from "./useProtagonist";
|
|
||||||
import { useTankModel } from "./useTankModel";
|
|
||||||
|
|
||||||
export function useTankChassisModel() {
|
|
||||||
const tank = useProtagonist();
|
|
||||||
|
|
||||||
const map = {
|
|
||||||
Wheels: true,
|
|
||||||
LeftTracks: true,
|
|
||||||
RightTracks: true,
|
|
||||||
LeftTrackCrashed: false,
|
|
||||||
RightTrackCrashed: false,
|
|
||||||
CollisionMesh: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
return useTankModel(`/models/tanks/${tank.id}/chassis.glb`, map);
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import { useProtagonist } from "./useProtagonist";
|
|
||||||
import { useTankModel } from "./useTankModel";
|
|
||||||
|
|
||||||
export function useTankHullModel() {
|
|
||||||
const tank = useProtagonist();
|
|
||||||
|
|
||||||
const map = {
|
|
||||||
Mesh: true,
|
|
||||||
CollisionMesh: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
return useTankModel(`/models/tanks/${tank.id}/hull.glb`, map);
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user