From e15f202fac99acb930b3d52b9962f67350cba036 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Thu, 2 Apr 2026 20:51:34 +0200 Subject: [PATCH] Implement advanced rendering composer synchronization and shadow state application --- src/viewport-three/viewport-host.ts | 68 +++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index 889568b3..66ee8cc0 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -370,12 +370,68 @@ export class ViewportHost { this.scene.background = texture; this.scene.environment = texture; this.scene.environmentIntensity = world.background.environmentIntensity; + } else { + this.scene.background = null; + this.scene.environment = null; + this.scene.environmentIntensity = 1; + } + + configureAdvancedRenderingRenderer(this.renderer, world.advancedRendering); + this.syncAdvancedRenderingComposer(world.advancedRendering); + this.applyShadowState(); + } + + private syncAdvancedRenderingComposer(settings: AdvancedRenderingSettings) { + const shouldUseComposer = settings.enabled; + const settingsChanged = + this.currentAdvancedRenderingSettings === null || + !areAdvancedRenderingSettingsEqual(this.currentAdvancedRenderingSettings, settings); + + if (!shouldUseComposer) { + if (this.advancedRenderingComposer !== null) { + this.advancedRenderingComposer.dispose(); + this.advancedRenderingComposer = null; + } + + this.currentAdvancedRenderingSettings = null; + this.renderer.autoClear = true; return; } - this.scene.background = null; - this.scene.environment = null; - this.scene.environmentIntensity = 1; + if (this.advancedRenderingComposer !== null && !settingsChanged) { + return; + } + + if (this.advancedRenderingComposer !== null) { + this.advancedRenderingComposer.dispose(); + } + + this.advancedRenderingComposer = createAdvancedRenderingComposer(this.renderer, this.scene, this.camera, settings); + this.currentAdvancedRenderingSettings = cloneAdvancedRenderingSettings(settings); + this.renderer.autoClear = false; + } + + private applyShadowState() { + if (this.currentWorld === null) { + return; + } + + const advancedRendering = this.currentWorld.advancedRendering; + const shadowsEnabled = advancedRendering.enabled && advancedRendering.shadows.enabled; + + applyAdvancedRenderingLightShadowFlags(this.sunLight, advancedRendering); + + for (const renderObjects of this.localLightRenderObjects.values()) { + applyAdvancedRenderingLightShadowFlags(renderObjects.group, advancedRendering); + } + + for (const renderObjects of this.brushRenderObjects.values()) { + applyAdvancedRenderingRenderableShadowFlags(renderObjects.mesh, shadowsEnabled); + } + + for (const renderGroup of this.modelRenderObjects.values()) { + applyAdvancedRenderingRenderableShadowFlags(renderGroup, shadowsEnabled); + } } private rebuildLocalLights(document: SceneDocument) { @@ -397,6 +453,8 @@ export class ViewportHost { } } } + + this.applyShadowState(); } private rebuildBrushMeshes(document: SceneDocument, selection: EditorSelection) { @@ -437,6 +495,8 @@ export class ViewportHost { edges }); } + + this.applyShadowState(); } private rebuildEntityMarkers(document: SceneDocument, selection: EditorSelection) { @@ -463,6 +523,8 @@ export class ViewportHost { this.modelGroup.add(renderGroup); this.modelRenderObjects.set(modelInstance.id, renderGroup); } + + this.applyShadowState(); } private createEntityRenderObjects(entity: EntityInstance, selected: boolean): EntityRenderObjects {