From eafe1c6ae10f4332e1db8e903f644a3ef471899b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Wed, 3 Apr 2024 11:02:44 +0200 Subject: [PATCH] feat: envmap rotation --- README.md | 3 ++- src/core/Environment.tsx | 45 ++++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 7fc057c5d..9287d787d 100644 --- a/README.md +++ b/README.md @@ -4722,7 +4722,8 @@ Sets up a global cubemap, which affects the default `scene.environment`, and opt ```jsx @@ -33,39 +34,50 @@ function setEnvProps( scene: Scene | React.MutableRefObject | undefined, defaultScene: Scene, texture: Texture, - blur = 0 + blur: number = 0, + rotation: Vector3 = [0, 0, 0] ) { const target = resolveScene(scene || defaultScene) const oldbg = target.background const oldenv = target.environment // @ts-ignore const oldBlur = target.backgroundBlurriness || 0 - if (background !== 'only') target.environment = texture - if (background) target.background = texture // @ts-ignore - if (background && target.backgroundBlurriness !== undefined) target.backgroundBlurriness = blur + const oldRotation = target.backgroundBlurriness !== undefined ? target.backgroundRotation.copy() : 0 + if (background !== 'only') target.environment = texture + if (background) { + target.background = texture + // @ts-ignore + if (target.backgroundBlurriness !== undefined) target.backgroundBlurriness = blur + // @ts-ignore + if (target.backgroundRotation !== undefined) applyProps(target, { backgroundRotation: rotation }) + } return () => { if (background !== 'only') target.environment = oldenv - if (background) target.background = oldbg - // @ts-ignore - if (background && target.backgroundBlurriness !== undefined) target.backgroundBlurriness = oldBlur + if (background) { + target.background = oldbg + // @ts-ignore + if (target.backgroundBlurriness !== undefined) target.backgroundBlurriness = oldBlur + // @ts-ignore + if (target.backgroundRotation !== undefined) applyProps(target, { backgroundRotation: oldRotation }) + } } } -export function EnvironmentMap({ scene, background = false, blur, map }: EnvironmentProps) { +export function EnvironmentMap({ scene, background = false, blur, rotation, map }: EnvironmentProps) { const defaultScene = useThree((state) => state.scene) React.useLayoutEffect(() => { - if (map) return setEnvProps(background, scene, defaultScene, map, blur) - }, [defaultScene, scene, map, background, blur]) + if (map) return setEnvProps(background, scene, defaultScene, map, blur, rotation) + }, [defaultScene, scene, map, background, blur, rotation]) return null } -export function EnvironmentCube({ background = false, scene, blur, ...rest }: EnvironmentProps) { +export function EnvironmentCube({ background = false, scene, blur, rotation, ...rest }: EnvironmentProps) { const texture = useEnvironment(rest) const defaultScene = useThree((state) => state.scene) React.useLayoutEffect(() => { - return setEnvProps(background, scene, defaultScene, texture, blur) - }, [texture, background, scene, defaultScene, blur]) + return setEnvProps(background, scene, defaultScene, texture, blur, rotation) + }, [texture, background, scene, defaultScene, blur, rotation]) return null } @@ -78,6 +90,7 @@ export function EnvironmentPortal({ map, background = false, blur, + rotation, scene, files, path, @@ -96,7 +109,7 @@ export function EnvironmentPortal({ React.useLayoutEffect(() => { if (frames === 1) camera.current.update(gl, virtualScene) - return setEnvProps(background, scene, defaultScene, fbo.texture, blur) + return setEnvProps(background, scene, defaultScene, fbo.texture, blur, rotation) }, [children, virtualScene, fbo.texture, scene, defaultScene, background, frames, gl]) let count = 1