ai-chatbot/components/canvas/model3d/LocalStudioEnvironment.tsx

32 lines
1.0 KiB
TypeScript

"use client";
import { useThree } from "@react-three/fiber";
import { useLayoutEffect } from "react";
import { PMREMGenerator } from "three";
import { RoomEnvironment } from "three/addons/environments/RoomEnvironment.js";
// Generate studio reflections locally: an unavailable HDR CDN must not hide GLB models.
export function LocalStudioEnvironment() {
const { gl, scene } = useThree();
useLayoutEffect(() => {
const room = new RoomEnvironment();
const generator = new PMREMGenerator(gl);
const previous = scene.environment;
let target: ReturnType<PMREMGenerator["fromScene"]> | undefined;
try {
target = generator.fromScene(room, 0.04);
scene.environment = target.texture;
} catch {
// Direct lights still render the model on devices unable to build a PMREM.
} finally {
room.dispose();
generator.dispose();
}
return () => {
if (scene.environment === target?.texture) scene.environment = previous;
target?.dispose();
};
}, [gl, scene]);
return null;
}