32 lines
1.0 KiB
TypeScript
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;
|
|
}
|