Release Healer Man 0.1.26

This commit is contained in:
phenom committed 2026-09-09 22:18:15 -04:00
1 parent e7cc588bfc
commit 147c2804d4
27 files changed
+1010 -55

No files matched your search

+14 -8
View File
@@ -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} />;