From 481880736077f6a7b842019d4dde66e3789fdc08 Mon Sep 17 00:00:00 2001 From: Wassim SAMAD Date: Wed, 17 Jun 2026 14:49:35 -0400 Subject: [PATCH] refactor(paint-slots): share scene IBL as viewer SceneEnvironment Replace the editor-only EditorEnvironment wrapper with a SceneEnvironment component exported from @pascal-app/viewer, mounted as an opt-in child (still not baked into the Viewer component). One source of truth the editor and the community public viewer both inject; embed/thumbnail surfaces simply don't mount it. Sunset preset at environmentIntensity 0.6. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/components/editor-environment.tsx | 20 ----------------- .../editor/src/components/editor/index.tsx | 11 +++++++--- .../components/viewer/scene-environment.tsx | 22 +++++++++++++++++++ packages/viewer/src/index.ts | 1 + 4 files changed, 31 insertions(+), 23 deletions(-) delete mode 100644 packages/editor/src/components/editor-environment.tsx create mode 100644 packages/viewer/src/components/viewer/scene-environment.tsx diff --git a/packages/editor/src/components/editor-environment.tsx b/packages/editor/src/components/editor-environment.tsx deleted file mode 100644 index 9e9bf0d4..00000000 --- a/packages/editor/src/components/editor-environment.tsx +++ /dev/null @@ -1,20 +0,0 @@ -'use client' - -import { Environment } from '@react-three/drei' -import { Suspense } from 'react' - -/** - * Scene IBL for the editor — drei's prefiltered environment map. Injected as a - * *child* (not baked into the Viewer component) so read-only / embed - * viewers don't pull the HDRI. This is what gives PBR metals their reflections - * and lifts the lighting on vertical surfaces (walls), which flat directional + - * hemisphere lights can't do alone. Intensity is dialled below the preset - * default so it complements the scene lights rather than washing them out. - */ -export function EditorEnvironment() { - return ( - - - - ) -} diff --git a/packages/editor/src/components/editor/index.tsx b/packages/editor/src/components/editor/index.tsx index 49bd023d..1398dec3 100644 --- a/packages/editor/src/components/editor/index.tsx +++ b/packages/editor/src/components/editor/index.tsx @@ -7,7 +7,13 @@ import { spatialGridManager, useScene, } from '@pascal-app/core' -import { type HoverStyles, InteractiveSystem, useViewer, Viewer } from '@pascal-app/viewer' +import { + type HoverStyles, + InteractiveSystem, + SceneEnvironment, + useViewer, + Viewer, +} from '@pascal-app/viewer' import { memo, type ReactNode, useCallback, useEffect, useRef, useState } from 'react' import { ViewerOverlay } from '../../components/viewer-overlay' import { ViewerZoneSystem } from '../../components/viewer-zone-system' @@ -21,7 +27,6 @@ import { } from '../../lib/scene' import { initSFXBus } from '../../lib/sfx-bus' import useEditor from '../../store/use-editor' -import { EditorEnvironment } from '../editor-environment' import { CeilingSelectionAffordanceSystem } from '../systems/ceiling/ceiling-selection-affordance-system' import { CeilingSystem } from '../systems/ceiling/ceiling-system' import { RoofEditSystem } from '../systems/roof/roof-edit-system' @@ -603,7 +608,7 @@ const ViewerSceneContent = memo(function ViewerSceneContent({ const noEditing = isVersionPreviewMode || isFirstPersonMode || isStudioMode return ( <> - + {!(isFirstPersonMode || isStudioMode) && } {!noEditing && } {!noEditing && } diff --git a/packages/viewer/src/components/viewer/scene-environment.tsx b/packages/viewer/src/components/viewer/scene-environment.tsx new file mode 100644 index 00000000..1834c8f3 --- /dev/null +++ b/packages/viewer/src/components/viewer/scene-environment.tsx @@ -0,0 +1,22 @@ +'use client' + +import { Environment } from '@react-three/drei' +import { Suspense } from 'react' + +/** + * Scene IBL — drei's prefiltered environment map, exported as an opt-in + * *child* rather than baked into the Viewer component, so embed / + * thumbnail surfaces that don't want the HDRI fetch simply don't mount it. + * This is what gives PBR metals their reflections and lifts the lighting on + * vertical surfaces (walls), which flat directional + hemisphere lights can't + * do alone. Intensity is dialled below the preset default so it complements + * the scene lights rather than washing them out. Only visible in `rendered` + * shading. + */ +export function SceneEnvironment() { + return ( + + + + ) +} diff --git a/packages/viewer/src/index.ts b/packages/viewer/src/index.ts index 7d2c9469..6782d31c 100644 --- a/packages/viewer/src/index.ts +++ b/packages/viewer/src/index.ts @@ -18,6 +18,7 @@ export { DEFAULT_HOVER_STYLES, SSGI_PARAMS, } from './components/viewer/post-processing' +export { SceneEnvironment } from './components/viewer/scene-environment' export { WalkthroughControls } from './components/viewer/walkthrough-controls' export { useAssetUrl } from './hooks/use-asset-url' export { useGLTFKTX2 } from './hooks/use-gltf-ktx2'