forked from phenom/healer-man
Release Healer Man 0.1.26
This commit is contained in:
1 parent
e7cc588bfc
commit
147c2804d4
27 files changed
+1010
-55
No files matched your search
@@ -1,5 +1,6 @@
|
||||
import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { RigidBody, TrimeshCollider } from "@react-three/rapier";
|
||||
import { useThree } from "@react-three/fiber";
|
||||
import {
|
||||
Mesh,
|
||||
type InstancedMesh,
|
||||
@@ -7,7 +8,7 @@ import {
|
||||
type Object3D,
|
||||
} from "three";
|
||||
import type { ResolvedDungeonAssets } from "../game/dungeonAssets";
|
||||
import type { DungeonDefinition, DungeonMaterialRoles } from "../game/dungeonTypes";
|
||||
import type { DungeonDefinition } from "../game/dungeonTypes";
|
||||
import { useGameStore } from "../game/store";
|
||||
import {
|
||||
collisionLineOfSightTrimeshes,
|
||||
@@ -19,7 +20,8 @@ import {
|
||||
DUNGEON_SIGHT_BLOCKER_COLLISION_GROUPS,
|
||||
} from "./dungeonLineOfSight";
|
||||
import { disposeObject3DResources } from "./threeResourceDisposal";
|
||||
import { instanceRepeatedStaticMeshes } from "./staticSceneInstancing";
|
||||
import { cacheStaticMatrices, instanceRepeatedStaticMeshes } from "./staticSceneInstancing";
|
||||
import { createStaticVisibilityCells, registerStaticVisibility } from "./staticSceneVisibility";
|
||||
import { useGameGLTF } from "./useGameGLTF";
|
||||
import { prepareDungeonMaterial } from "./productionDungeonMaterials";
|
||||
import {
|
||||
@@ -28,7 +30,7 @@ import {
|
||||
advanceDungeonAssetCount,
|
||||
} from "./dungeonLoadSequencing";
|
||||
|
||||
function prepareVisual(root: Object3D, roles: DungeonMaterialRoles): Object3D {
|
||||
function prepareVisual(root: Object3D, definition: DungeonDefinition) {
|
||||
const clone = root.clone(true);
|
||||
const clonedMaterials = new Map<string, Material>();
|
||||
clone.traverse((node) => {
|
||||
@@ -38,7 +40,7 @@ function prepareVisual(root: Object3D, roles: DungeonMaterialRoles): Object3D {
|
||||
const prepared = sources.map((source) => {
|
||||
const cached = clonedMaterials.get(source.uuid);
|
||||
if (cached) return cached;
|
||||
const next = prepareDungeonMaterial(source, roles);
|
||||
const next = prepareDungeonMaterial(source, definition.presentation.materials, definition.environmentMode);
|
||||
clonedMaterials.set(source.uuid, next);
|
||||
return next;
|
||||
});
|
||||
@@ -52,15 +54,19 @@ function prepareVisual(root: Object3D, roles: DungeonMaterialRoles): Object3D {
|
||||
}
|
||||
});
|
||||
instanceRepeatedStaticMeshes(clone);
|
||||
return clone;
|
||||
const cells = createStaticVisibilityCells(clone);
|
||||
cacheStaticMatrices(clone);
|
||||
return { visual: clone, cells };
|
||||
}
|
||||
|
||||
function VisualChunk({ url, definition }: { readonly url: string; readonly definition: DungeonDefinition }) {
|
||||
const gltf = useGameGLTF(url);
|
||||
const visual = useMemo(
|
||||
() => prepareVisual(gltf.scene, definition.presentation.materials),
|
||||
[definition.presentation.materials, gltf.scene],
|
||||
const scene = useThree((state) => state.scene);
|
||||
const { visual, cells } = useMemo(
|
||||
() => prepareVisual(gltf.scene, definition),
|
||||
[definition, gltf.scene],
|
||||
);
|
||||
useEffect(() => registerStaticVisibility(scene, cells), [scene, cells]);
|
||||
useEffect(() => () => { disposeObject3DResources(visual); }, [visual]);
|
||||
const { position, rotation, scale } = definition.transform;
|
||||
return <primitive object={visual} position={position} rotation={rotation} scale={scale} />;
|
||||
|
||||
Reference in new issue
Block a user