777e51efeb
- Extract SHADOW_CONFIG into lightingConfig.ts (bias=0, normalBias=0, cameraSize=95) matching the historically working values from develop. - Drop SceneShadowWarmup; rely on sun.shadow.autoUpdate=true for steady-state refresh. - Enable cloud castShadow and traverse Ebike meshes for cast/receive.
34 lines
902 B
TypeScript
34 lines
902 B
TypeScript
import { useEffect, useRef } from "react";
|
|
import type { RefObject } from "react";
|
|
import type { Object3D } from "three";
|
|
import { Octree } from "three-stdlib";
|
|
import type { OctreeReadyHandler } from "@/types/three/three";
|
|
|
|
export function useOctreeGraphNode(
|
|
graphNodeRef: RefObject<Object3D | null>,
|
|
onOctreeReady: OctreeReadyHandler,
|
|
rebuildKey: string | number = 0,
|
|
enabled = true,
|
|
): void {
|
|
const octreeBuilt = useRef(false);
|
|
|
|
useEffect(() => {
|
|
octreeBuilt.current = false;
|
|
}, [rebuildKey]);
|
|
|
|
useEffect(() => {
|
|
if (!enabled) return;
|
|
|
|
const graphNode = graphNodeRef.current;
|
|
if (!enabled || octreeBuilt.current || !graphNode) return;
|
|
octreeBuilt.current = true;
|
|
|
|
graphNode.updateMatrixWorld(true);
|
|
|
|
const octree = new Octree();
|
|
octree.fromGraphNode(graphNode);
|
|
|
|
onOctreeReady(octree);
|
|
}, [enabled, graphNodeRef, onOctreeReady, rebuildKey]);
|
|
}
|