mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: isolated model hooks
This commit is contained in:
1 parent
95b8532660
commit
1c64305678
6 files changed
+27
-36
No files matched your search
+2
-7
@@ -1,7 +1,5 @@
|
|||||||
import { useLoader } from '@react-three/fiber';
|
|
||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
import { Euler, Group, Mesh, Vector3 } from 'three';
|
import { Euler, Group, Mesh, Vector3 } from 'three';
|
||||||
import { GLTFLoader } from 'three-stdlib';
|
|
||||||
import { degToRad } from 'three/src/math/MathUtils';
|
import { degToRad } from 'three/src/math/MathUtils';
|
||||||
import { ArmorMesh } from '../../../../../../../../../components/ArmorMesh';
|
import { ArmorMesh } from '../../../../../../../../../components/ArmorMesh';
|
||||||
import {
|
import {
|
||||||
@@ -9,13 +7,13 @@ import {
|
|||||||
Y_AXIS,
|
Y_AXIS,
|
||||||
Z_AXIS,
|
Z_AXIS,
|
||||||
} from '../../../../../../../../../constants/axis';
|
} from '../../../../../../../../../constants/axis';
|
||||||
import { asset } from '../../../../../../../../../core/blitzkrieg/asset';
|
|
||||||
import {
|
import {
|
||||||
ModelTransformEventData,
|
ModelTransformEventData,
|
||||||
modelTransformEvent,
|
modelTransformEvent,
|
||||||
} from '../../../../../../../../../core/blitzkrieg/modelTransform';
|
} from '../../../../../../../../../core/blitzkrieg/modelTransform';
|
||||||
import { nameToArmorId } from '../../../../../../../../../core/blitzkrieg/nameToArmorId';
|
import { nameToArmorId } from '../../../../../../../../../core/blitzkrieg/nameToArmorId';
|
||||||
import { resolveArmor } from '../../../../../../../../../core/blitzkrieg/resolveThickness';
|
import { resolveArmor } from '../../../../../../../../../core/blitzkrieg/resolveThickness';
|
||||||
|
import { useArmor } from '../../../../../../../../../hooks/useArmor';
|
||||||
import { useModelDefinitions } from '../../../../../../../../../hooks/useModelDefinitions';
|
import { useModelDefinitions } from '../../../../../../../../../hooks/useModelDefinitions';
|
||||||
import { useTankopedia } from '../../../../../../../../../stores/tankopedia';
|
import { useTankopedia } from '../../../../../../../../../stores/tankopedia';
|
||||||
import { Duel } from '../../../../../page';
|
import { Duel } from '../../../../../page';
|
||||||
@@ -107,10 +105,7 @@ export function ArmorHighlighting({ duel }: ArmorHighlightingProps) {
|
|||||||
return unsubscribe;
|
return unsubscribe;
|
||||||
});
|
});
|
||||||
|
|
||||||
const armorGltf = useLoader(
|
const armorGltf = useArmor(duel.protagonist.tank.id);
|
||||||
GLTFLoader,
|
|
||||||
asset(`3d/tanks/armor/${duel.protagonist.tank.id}.glb`),
|
|
||||||
);
|
|
||||||
|
|
||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const tankModelDefinition = modelDefinitions[duel.protagonist.tank.id];
|
const tankModelDefinition = modelDefinitions[duel.protagonist.tank.id];
|
||||||
|
|||||||
+4
-11
@@ -1,7 +1,5 @@
|
|||||||
import { useLoader } from '@react-three/fiber';
|
|
||||||
import { memo, useEffect, useRef } from 'react';
|
import { memo, useEffect, useRef } from 'react';
|
||||||
import { Euler, Group, Mesh, Vector3 } from 'three';
|
import { Euler, Group, Mesh, Vector3 } from 'three';
|
||||||
import { GLTFLoader } from 'three-stdlib';
|
|
||||||
import { degToRad } from 'three/src/math/MathUtils';
|
import { degToRad } from 'three/src/math/MathUtils';
|
||||||
import { ArmorMeshExternalModuleMask } from '../../../../../../../../../components/ArmorMesh';
|
import { ArmorMeshExternalModuleMask } from '../../../../../../../../../components/ArmorMesh';
|
||||||
import {
|
import {
|
||||||
@@ -9,13 +7,14 @@ import {
|
|||||||
Y_AXIS,
|
Y_AXIS,
|
||||||
Z_AXIS,
|
Z_AXIS,
|
||||||
} from '../../../../../../../../../constants/axis';
|
} from '../../../../../../../../../constants/axis';
|
||||||
import { asset } from '../../../../../../../../../core/blitzkrieg/asset';
|
|
||||||
import {
|
import {
|
||||||
ModelTransformEventData,
|
ModelTransformEventData,
|
||||||
modelTransformEvent,
|
modelTransformEvent,
|
||||||
} from '../../../../../../../../../core/blitzkrieg/modelTransform';
|
} from '../../../../../../../../../core/blitzkrieg/modelTransform';
|
||||||
import { nameToArmorId } from '../../../../../../../../../core/blitzkrieg/nameToArmorId';
|
import { nameToArmorId } from '../../../../../../../../../core/blitzkrieg/nameToArmorId';
|
||||||
import { resolveArmor } from '../../../../../../../../../core/blitzkrieg/resolveThickness';
|
import { resolveArmor } from '../../../../../../../../../core/blitzkrieg/resolveThickness';
|
||||||
|
import { useArmor } from '../../../../../../../../../hooks/useArmor';
|
||||||
|
import { useModel } from '../../../../../../../../../hooks/useModel';
|
||||||
import { useModelDefinitions } from '../../../../../../../../../hooks/useModelDefinitions';
|
import { useModelDefinitions } from '../../../../../../../../../hooks/useModelDefinitions';
|
||||||
import { useTankopedia } from '../../../../../../../../../stores/tankopedia';
|
import { useTankopedia } from '../../../../../../../../../stores/tankopedia';
|
||||||
import { Duel } from '../../../../../page';
|
import { Duel } from '../../../../../page';
|
||||||
@@ -114,14 +113,8 @@ export const ExternalModuleMask = memo<ExternalModuleMaskProps>(({ duel }) => {
|
|||||||
return unsubscribe;
|
return unsubscribe;
|
||||||
});
|
});
|
||||||
|
|
||||||
const armorGltf = useLoader(
|
const armorGltf = useArmor(duel.protagonist.tank.id);
|
||||||
GLTFLoader,
|
const modelGltf = useModel(duel.protagonist.tank.id);
|
||||||
asset(`3d/tanks/armor/${duel.protagonist.tank.id}.glb`),
|
|
||||||
);
|
|
||||||
const modelGltf = useLoader(
|
|
||||||
GLTFLoader,
|
|
||||||
asset(`3d/tanks/models/${duel.protagonist.tank.id}.glb`),
|
|
||||||
);
|
|
||||||
|
|
||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const modelNodes = Object.values(modelGltf.nodes);
|
const modelNodes = Object.values(modelGltf.nodes);
|
||||||
|
|||||||
+4
-11
@@ -1,7 +1,5 @@
|
|||||||
import { useLoader } from '@react-three/fiber';
|
|
||||||
import { memo, useEffect, useRef } from 'react';
|
import { memo, useEffect, useRef } from 'react';
|
||||||
import { Euler, Group, Mesh, Vector3 } from 'three';
|
import { Euler, Group, Mesh, Vector3 } from 'three';
|
||||||
import { GLTFLoader } from 'three-stdlib';
|
|
||||||
import { degToRad } from 'three/src/math/MathUtils';
|
import { degToRad } from 'three/src/math/MathUtils';
|
||||||
import { ArmorMeshSpacedArmorDepth } from '../../../../../../../../../components/ArmorMesh/components/SpacedArmorDepth';
|
import { ArmorMeshSpacedArmorDepth } from '../../../../../../../../../components/ArmorMesh/components/SpacedArmorDepth';
|
||||||
import {
|
import {
|
||||||
@@ -9,13 +7,14 @@ import {
|
|||||||
Y_AXIS,
|
Y_AXIS,
|
||||||
Z_AXIS,
|
Z_AXIS,
|
||||||
} from '../../../../../../../../../constants/axis';
|
} from '../../../../../../../../../constants/axis';
|
||||||
import { asset } from '../../../../../../../../../core/blitzkrieg/asset';
|
|
||||||
import {
|
import {
|
||||||
ModelTransformEventData,
|
ModelTransformEventData,
|
||||||
modelTransformEvent,
|
modelTransformEvent,
|
||||||
} from '../../../../../../../../../core/blitzkrieg/modelTransform';
|
} from '../../../../../../../../../core/blitzkrieg/modelTransform';
|
||||||
import { nameToArmorId } from '../../../../../../../../../core/blitzkrieg/nameToArmorId';
|
import { nameToArmorId } from '../../../../../../../../../core/blitzkrieg/nameToArmorId';
|
||||||
import { resolveArmor } from '../../../../../../../../../core/blitzkrieg/resolveThickness';
|
import { resolveArmor } from '../../../../../../../../../core/blitzkrieg/resolveThickness';
|
||||||
|
import { useArmor } from '../../../../../../../../../hooks/useArmor';
|
||||||
|
import { useModel } from '../../../../../../../../../hooks/useModel';
|
||||||
import { useModelDefinitions } from '../../../../../../../../../hooks/useModelDefinitions';
|
import { useModelDefinitions } from '../../../../../../../../../hooks/useModelDefinitions';
|
||||||
import { useTankopedia } from '../../../../../../../../../stores/tankopedia';
|
import { useTankopedia } from '../../../../../../../../../stores/tankopedia';
|
||||||
import { Duel } from '../../../../../page';
|
import { Duel } from '../../../../../page';
|
||||||
@@ -120,14 +119,8 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(({ duel }) => {
|
|||||||
return unsubscribe;
|
return unsubscribe;
|
||||||
});
|
});
|
||||||
|
|
||||||
const armorGltf = useLoader(
|
const armorGltf = useArmor(duel.protagonist.tank.id);
|
||||||
GLTFLoader,
|
const modelGltf = useModel(duel.protagonist.tank.id);
|
||||||
asset(`3d/tanks/armor/${duel.protagonist.tank.id}.glb`),
|
|
||||||
);
|
|
||||||
const modelGltf = useLoader(
|
|
||||||
GLTFLoader,
|
|
||||||
asset(`3d/tanks/models/${duel.protagonist.tank.id}.glb`),
|
|
||||||
);
|
|
||||||
|
|
||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const modelNodes = Object.values(modelGltf.nodes);
|
const modelNodes = Object.values(modelGltf.nodes);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ThreeEvent, useLoader, useThree } from '@react-three/fiber';
|
import { ThreeEvent, useThree } from '@react-three/fiber';
|
||||||
import { memo, useEffect, useRef, useState } from 'react';
|
import { memo, useEffect, useRef, useState } from 'react';
|
||||||
import {
|
import {
|
||||||
Euler,
|
Euler,
|
||||||
@@ -8,11 +8,9 @@ import {
|
|||||||
Vector2,
|
Vector2,
|
||||||
Vector3,
|
Vector3,
|
||||||
} from 'three';
|
} from 'three';
|
||||||
import { GLTFLoader } from 'three-stdlib';
|
|
||||||
import { degToRad } from 'three/src/math/MathUtils';
|
import { degToRad } from 'three/src/math/MathUtils';
|
||||||
import { X_AXIS, Y_AXIS, Z_AXIS } from '../../../../../../../constants/axis';
|
import { X_AXIS, Y_AXIS, Z_AXIS } from '../../../../../../../constants/axis';
|
||||||
import { applyPitchYawLimits } from '../../../../../../../core/blitz/applyPitchYawLimits';
|
import { applyPitchYawLimits } from '../../../../../../../core/blitz/applyPitchYawLimits';
|
||||||
import { asset } from '../../../../../../../core/blitzkrieg/asset';
|
|
||||||
import {
|
import {
|
||||||
ModelDefinitions,
|
ModelDefinitions,
|
||||||
modelDefinitions,
|
modelDefinitions,
|
||||||
@@ -23,6 +21,7 @@ import {
|
|||||||
} from '../../../../../../../core/blitzkrieg/modelTransform';
|
} from '../../../../../../../core/blitzkrieg/modelTransform';
|
||||||
import { resolveJsxTree } from '../../../../../../../core/blitzkrieg/resolveJsxTree';
|
import { resolveJsxTree } from '../../../../../../../core/blitzkrieg/resolveJsxTree';
|
||||||
import { normalizeAnglePI } from '../../../../../../../core/math/normalizeAngle180';
|
import { normalizeAnglePI } from '../../../../../../../core/math/normalizeAngle180';
|
||||||
|
import { useModel } from '../../../../../../../hooks/useModel';
|
||||||
import mutateTankopedia, {
|
import mutateTankopedia, {
|
||||||
useTankopedia,
|
useTankopedia,
|
||||||
} from '../../../../../../../stores/tankopedia';
|
} from '../../../../../../../stores/tankopedia';
|
||||||
@@ -122,10 +121,7 @@ export const TankModel = memo(({ duel: { protagonist } }: TankModelProps) => {
|
|||||||
tankModelDefinition.turrets[protagonist.turret.id];
|
tankModelDefinition.turrets[protagonist.turret.id];
|
||||||
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
||||||
|
|
||||||
const gltf = useLoader(
|
const gltf = useModel(protagonist.tank.id);
|
||||||
GLTFLoader,
|
|
||||||
asset(`3d/tanks/models/${protagonist.tank.id}.glb`),
|
|
||||||
);
|
|
||||||
const nodes = Object.values(gltf.nodes);
|
const nodes = Object.values(gltf.nodes);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { useLoader } from '@react-three/fiber';
|
||||||
|
import { GLTFLoader } from 'three-stdlib';
|
||||||
|
import { asset } from '../core/blitzkrieg/asset';
|
||||||
|
|
||||||
|
export function useArmor(id: number) {
|
||||||
|
return useLoader(GLTFLoader, asset(`3d/tanks/armor/${id}.glb`));
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { useLoader } from '@react-three/fiber';
|
||||||
|
import { GLTFLoader } from 'three-stdlib';
|
||||||
|
import { asset } from '../core/blitzkrieg/asset';
|
||||||
|
|
||||||
|
export function useModel(id: number) {
|
||||||
|
return useLoader(GLTFLoader, asset(`3d/tanks/models/${id}.glb`));
|
||||||
|
}
|
||||||
Reference in new issue
Block a user