From 4f75c9b7507a8017598fd9387eb9383fb6159f09 Mon Sep 17 00:00:00 2001 From: wass08 Date: Mon, 2 Feb 2026 14:22:21 +0900 Subject: [PATCH] soft shadows & lighting --- .../renderers/item/item-renderer.tsx | 7 +- .../viewer/src/components/viewer/index.tsx | 67 ++++++++++--------- .../viewer/src/components/viewer/lights.tsx | 41 ++++++++++++ 3 files changed, 83 insertions(+), 32 deletions(-) create mode 100644 packages/viewer/src/components/viewer/lights.tsx diff --git a/packages/viewer/src/components/renderers/item/item-renderer.tsx b/packages/viewer/src/components/renderers/item/item-renderer.tsx index ad07d14a..ad9a2528 100644 --- a/packages/viewer/src/components/renderers/item/item-renderer.tsx +++ b/packages/viewer/src/components/renderers/item/item-renderer.tsx @@ -68,15 +68,18 @@ const ModelRenderer = ({ node }: { node: ItemNode }) => { return } - mesh.castShadow = true - mesh.receiveShadow = true + let hasGlass = false; // Handle both single material and material array cases if (Array.isArray(mesh.material)) { mesh.material = mesh.material.map((mat) => getMaterialForOriginal(mat)) + hasGlass = mesh.material.some(mat => mat.name === 'glass'); } else { mesh.material = getMaterialForOriginal(mesh.material) + hasGlass = mesh.material.name === 'glass'; } + mesh.castShadow = !hasGlass + mesh.receiveShadow = !hasGlass } }) }, [scene]) diff --git a/packages/viewer/src/components/viewer/index.tsx b/packages/viewer/src/components/viewer/index.tsx index 14687e9c..37588f9b 100644 --- a/packages/viewer/src/components/viewer/index.tsx +++ b/packages/viewer/src/components/viewer/index.tsx @@ -1,13 +1,14 @@ 'use client' import { CeilingSystem, ItemSystem, RoofSystem, SlabSystem, WallSystem } from '@pascal-app/core' -import { Bvh, Environment } from '@react-three/drei' +import { Bvh } from '@react-three/drei' import { Canvas, extend, type ThreeToJSXElements } from '@react-three/fiber' import * as THREE from 'three/webgpu' import { GuideSystem } from '../../systems/guide/guide-system' import { LevelSystem } from '../../systems/level/level-system' import { ScanSystem } from '../../systems/scan/scan-system' import { SceneRenderer } from '../renderers/scene-renderer' +import { Lights } from './lights' import PostProcessing from './post-processing' import { SelectionManager } from './selection-manager' import { ViewerCamera } from './viewer-camera' @@ -26,38 +27,44 @@ interface ViewerProps { const Viewer: React.FC = ({ children, selectionManager = 'default' }) => { return ( { - const renderer = new THREE.WebGPURenderer(props as any) - await renderer.init() - return renderer - }} - shadows - camera={{ position: [50, 50, 50], fov: 50 }} - > - - + className={'bg-[#303035]'} + gl={async (props) => { + const renderer = new THREE.WebGPURenderer(props as any) + await renderer.init() + renderer.toneMapping = THREE.ACESFilmicToneMapping + renderer.toneMappingExposure = 1.2 + return renderer + }} + shadows={{ + type: THREE.PCFShadowMap, + enabled: true, + }} + camera={{ position: [50, 50, 50], fov: 50 }} + > + + - - - - - + {/* */} + + + + - {/* Default Systems */} - - - - {/* Core systems */} - - - - - - + {/* Default Systems */} + + + + {/* Core systems */} + + + + + + - {selectionManager === 'default' && } - {children} + {selectionManager === 'default' && } + {children} ) } diff --git a/packages/viewer/src/components/viewer/lights.tsx b/packages/viewer/src/components/viewer/lights.tsx new file mode 100644 index 00000000..8739b72f --- /dev/null +++ b/packages/viewer/src/components/viewer/lights.tsx @@ -0,0 +1,41 @@ +import { Environment } from '@react-three/drei' +import { useRef } from 'react' +import type { DirectionalLight, OrthographicCamera } from 'three/webgpu' + +export function Lights() { + const lightRef = useRef(null) + const shadowCamera = useRef(null) + const shadowCameraSize = 50 // The "area" around the camera to shadow + + // useHelper(lightRef, DirectionalLightHelper, 1, 'red') + // useHelper(shadowCamera, CameraHelper) + + return ( + <> + + + + + + + + ) +}