@aura3d/rendering 3.0.1 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BlendModes.d.ts +34 -0
- package/dist/BlendModes.d.ts.map +1 -0
- package/dist/BlendModes.js +42 -0
- package/dist/BlendModes.js.map +1 -0
- package/dist/DepthPass.d.ts +18 -0
- package/dist/DepthPass.d.ts.map +1 -1
- package/dist/DepthPass.js +103 -20
- package/dist/DepthPass.js.map +1 -1
- package/dist/EnvironmentBackgroundPass.d.ts +7 -0
- package/dist/EnvironmentBackgroundPass.d.ts.map +1 -1
- package/dist/EnvironmentBackgroundPass.js +39 -14
- package/dist/EnvironmentBackgroundPass.js.map +1 -1
- package/dist/EnvironmentMapResources.d.ts +1 -1
- package/dist/EnvironmentMapResources.d.ts.map +1 -1
- package/dist/EnvironmentMapResources.js +19 -8
- package/dist/EnvironmentMapResources.js.map +1 -1
- package/dist/EnvironmentPlatform.d.ts +6 -0
- package/dist/EnvironmentPlatform.d.ts.map +1 -1
- package/dist/EnvironmentPlatform.js +3 -1
- package/dist/EnvironmentPlatform.js.map +1 -1
- package/dist/EnvironmentPreset.d.ts +7 -0
- package/dist/EnvironmentPreset.d.ts.map +1 -1
- package/dist/EnvironmentPreset.js +11 -11
- package/dist/EnvironmentPreset.js.map +1 -1
- package/dist/EnvironmentPresetPack.d.ts +16 -0
- package/dist/EnvironmentPresetPack.d.ts.map +1 -1
- package/dist/EnvironmentPresetPack.js +28 -0
- package/dist/EnvironmentPresetPack.js.map +1 -1
- package/dist/ExternalParityRenderPreset.d.ts +15 -1
- package/dist/ExternalParityRenderPreset.d.ts.map +1 -1
- package/dist/ExternalParityRenderPreset.js +52 -7
- package/dist/ExternalParityRenderPreset.js.map +1 -1
- package/dist/ForwardPass.d.ts +240 -50
- package/dist/ForwardPass.d.ts.map +1 -1
- package/dist/ForwardPass.js +845 -866
- package/dist/ForwardPass.js.map +1 -1
- package/dist/Geometry.d.ts +44 -1
- package/dist/Geometry.d.ts.map +1 -1
- package/dist/Geometry.js +174 -24
- package/dist/Geometry.js.map +1 -1
- package/dist/InstancedPBRMaterial.d.ts +5 -0
- package/dist/InstancedPBRMaterial.d.ts.map +1 -1
- package/dist/InstancedPBRMaterial.js +7 -0
- package/dist/InstancedPBRMaterial.js.map +1 -1
- package/dist/LightCollector.d.ts +8 -0
- package/dist/LightCollector.d.ts.map +1 -1
- package/dist/LightCollector.js +1 -1
- package/dist/LightCollector.js.map +1 -1
- package/dist/LightUniforms.d.ts +78 -0
- package/dist/LightUniforms.d.ts.map +1 -1
- package/dist/LightUniforms.js +100 -0
- package/dist/LightUniforms.js.map +1 -1
- package/dist/Material.d.ts +15 -0
- package/dist/Material.d.ts.map +1 -1
- package/dist/Material.js +19 -2
- package/dist/Material.js.map +1 -1
- package/dist/MaterialBinding.d.ts +10 -0
- package/dist/MaterialBinding.d.ts.map +1 -1
- package/dist/MaterialBinding.js +91 -1
- package/dist/MaterialBinding.js.map +1 -1
- package/dist/MaterialPresets.d.ts +60 -0
- package/dist/MaterialPresets.d.ts.map +1 -1
- package/dist/MaterialPresets.js +212 -0
- package/dist/MaterialPresets.js.map +1 -1
- package/dist/NormalMappedPBRMaterial.d.ts +5 -0
- package/dist/NormalMappedPBRMaterial.d.ts.map +1 -1
- package/dist/NormalMappedPBRMaterial.js +7 -0
- package/dist/NormalMappedPBRMaterial.js.map +1 -1
- package/dist/OceanSurface.d.ts +8 -0
- package/dist/OceanSurface.d.ts.map +1 -1
- package/dist/OceanSurface.js +10 -79
- package/dist/OceanSurface.js.map +1 -1
- package/dist/PBRLightingDefaults.d.ts +8 -0
- package/dist/PBRLightingDefaults.d.ts.map +1 -1
- package/dist/PBRLightingDefaults.js +8 -0
- package/dist/PBRLightingDefaults.js.map +1 -1
- package/dist/PBRMaterial.d.ts +5 -0
- package/dist/PBRMaterial.d.ts.map +1 -1
- package/dist/PBRMaterial.js +7 -0
- package/dist/PBRMaterial.js.map +1 -1
- package/dist/PostProcessPass.d.ts +6 -490
- package/dist/PostProcessPass.d.ts.map +1 -1
- package/dist/PostProcessPass.js +6 -2016
- package/dist/PostProcessPass.js.map +1 -1
- package/dist/ProceduralMaterialTextures.d.ts +28 -0
- package/dist/ProceduralMaterialTextures.d.ts.map +1 -0
- package/dist/ProceduralMaterialTextures.js +217 -0
- package/dist/ProceduralMaterialTextures.js.map +1 -0
- package/dist/ReflectionProbe.d.ts.map +1 -1
- package/dist/ReflectionProbe.js +4 -1
- package/dist/ReflectionProbe.js.map +1 -1
- package/dist/RenderBackend.d.ts +2 -0
- package/dist/RenderBackend.d.ts.map +1 -1
- package/dist/RenderBackend.js +3 -0
- package/dist/RenderBackend.js.map +1 -1
- package/dist/RenderDevice.d.ts +92 -5
- package/dist/RenderDevice.d.ts.map +1 -1
- package/dist/RenderDevice.js +166 -9
- package/dist/RenderDevice.js.map +1 -1
- package/dist/RenderGraph.d.ts.map +1 -1
- package/dist/RenderGraph.js +17 -0
- package/dist/RenderGraph.js.map +1 -1
- package/dist/RenderPass.d.ts +7 -0
- package/dist/RenderPass.d.ts.map +1 -1
- package/dist/RenderPass.js.map +1 -1
- package/dist/RenderPipeline.d.ts +5 -0
- package/dist/RenderPipeline.d.ts.map +1 -1
- package/dist/RenderPipeline.js +6 -0
- package/dist/RenderPipeline.js.map +1 -1
- package/dist/Renderer.d.ts +261 -66
- package/dist/Renderer.d.ts.map +1 -1
- package/dist/Renderer.js +902 -1256
- package/dist/Renderer.js.map +1 -1
- package/dist/RendererPostprocessPlan.d.ts +4 -0
- package/dist/RendererPostprocessPlan.d.ts.map +1 -1
- package/dist/RendererPostprocessPlan.js +16 -2
- package/dist/RendererPostprocessPlan.js.map +1 -1
- package/dist/RendererTiming.d.ts +27 -0
- package/dist/RendererTiming.d.ts.map +1 -1
- package/dist/RendererTiming.js +179 -12
- package/dist/RendererTiming.js.map +1 -1
- package/dist/ResolutionGovernor.d.ts +56 -0
- package/dist/ResolutionGovernor.d.ts.map +1 -0
- package/dist/ResolutionGovernor.js +87 -0
- package/dist/ResolutionGovernor.js.map +1 -0
- package/dist/Sampler.d.ts +34 -1
- package/dist/Sampler.d.ts.map +1 -1
- package/dist/Sampler.js +55 -2
- package/dist/Sampler.js.map +1 -1
- package/dist/ShaderLibrary.d.ts.map +1 -1
- package/dist/ShaderLibrary.js +15 -10
- package/dist/ShaderLibrary.js.map +1 -1
- package/dist/ShaderLibraryCore.d.ts.map +1 -1
- package/dist/ShaderLibraryCore.js +3 -2
- package/dist/ShaderLibraryCore.js.map +1 -1
- package/dist/ShaderModule.d.ts +7 -1
- package/dist/ShaderModule.d.ts.map +1 -1
- package/dist/ShaderModule.js +20 -5
- package/dist/ShaderModule.js.map +1 -1
- package/dist/ShadowPass.d.ts.map +1 -1
- package/dist/ShadowPass.js +14 -7
- package/dist/ShadowPass.js.map +1 -1
- package/dist/SkinnedLitMaterial.d.ts +5 -0
- package/dist/SkinnedLitMaterial.d.ts.map +1 -1
- package/dist/SkinnedLitMaterial.js +13 -0
- package/dist/SkinnedLitMaterial.js.map +1 -1
- package/dist/SkinningBounds.d.ts +18 -0
- package/dist/SkinningBounds.d.ts.map +1 -1
- package/dist/SkinningBounds.js +78 -0
- package/dist/SkinningBounds.js.map +1 -1
- package/dist/SkinningPaletteTextureCache.d.ts +117 -0
- package/dist/SkinningPaletteTextureCache.d.ts.map +1 -0
- package/dist/SkinningPaletteTextureCache.js +205 -0
- package/dist/SkinningPaletteTextureCache.js.map +1 -0
- package/dist/SkinningUniforms.d.ts +56 -0
- package/dist/SkinningUniforms.d.ts.map +1 -0
- package/dist/SkinningUniforms.js +262 -0
- package/dist/SkinningUniforms.js.map +1 -0
- package/dist/TemporalHistory.d.ts +33 -0
- package/dist/TemporalHistory.d.ts.map +1 -1
- package/dist/TemporalHistory.js +84 -1
- package/dist/TemporalHistory.js.map +1 -1
- package/dist/TerrainHeightfield.d.ts +12 -0
- package/dist/TerrainHeightfield.d.ts.map +1 -1
- package/dist/TerrainHeightfield.js +29 -6
- package/dist/TerrainHeightfield.js.map +1 -1
- package/dist/TerrainTiles.d.ts +40 -10
- package/dist/TerrainTiles.d.ts.map +1 -1
- package/dist/TerrainTiles.js +18 -57
- package/dist/TerrainTiles.js.map +1 -1
- package/dist/Texture.d.ts +47 -2
- package/dist/Texture.d.ts.map +1 -1
- package/dist/Texture.js +119 -3
- package/dist/Texture.js.map +1 -1
- package/dist/TexturedPBRMaterial.d.ts +24 -0
- package/dist/TexturedPBRMaterial.d.ts.map +1 -1
- package/dist/TexturedPBRMaterial.js +72 -20
- package/dist/TexturedPBRMaterial.js.map +1 -1
- package/dist/TransmissionRenderTarget.d.ts +33 -0
- package/dist/TransmissionRenderTarget.d.ts.map +1 -0
- package/dist/TransmissionRenderTarget.js +61 -0
- package/dist/TransmissionRenderTarget.js.map +1 -0
- package/dist/VegetationScatter.js +1 -1
- package/dist/VegetationScatter.js.map +1 -1
- package/dist/VolumetricFog.d.ts +42 -0
- package/dist/VolumetricFog.d.ts.map +1 -1
- package/dist/VolumetricFog.js +52 -1
- package/dist/VolumetricFog.js.map +1 -1
- package/dist/WaterSurface.d.ts +5 -0
- package/dist/WaterSurface.d.ts.map +1 -1
- package/dist/WaterSurface.js +5 -0
- package/dist/WaterSurface.js.map +1 -1
- package/dist/WebGL2Device.d.ts +154 -207
- package/dist/WebGL2Device.d.ts.map +1 -1
- package/dist/WebGL2Device.js +831 -3703
- package/dist/WebGL2Device.js.map +1 -1
- package/dist/WebGL2StateCache.d.ts +15 -1
- package/dist/WebGL2StateCache.d.ts.map +1 -1
- package/dist/WebGL2StateCache.js +31 -2
- package/dist/WebGL2StateCache.js.map +1 -1
- package/dist/WebGPUDevice.d.ts +0 -4
- package/dist/WebGPUDevice.d.ts.map +1 -1
- package/dist/WebGPUDevice.js +31 -605
- package/dist/WebGPUDevice.js.map +1 -1
- package/dist/WebGPUSkinningLimits.d.ts +10 -1
- package/dist/WebGPUSkinningLimits.d.ts.map +1 -1
- package/dist/WebGPUSkinningLimits.js +15 -1
- package/dist/WebGPUSkinningLimits.js.map +1 -1
- package/dist/advanced-runtime/index.d.ts +6 -2
- package/dist/advanced-runtime/index.d.ts.map +1 -1
- package/dist/advanced-runtime/index.js +0 -1
- package/dist/advanced-runtime/index.js.map +1 -1
- package/dist/animation/AnimationRenderPreset.d.ts +1 -1
- package/dist/animation/AnimationRenderPreset.d.ts.map +1 -1
- package/dist/animation/AnimationRenderPreset.js +1 -1
- package/dist/animation/AnimationRenderPreset.js.map +1 -1
- package/dist/animation/applyAnimationRenderPreset.d.ts +1 -1
- package/dist/animation/applyAnimationRenderPreset.d.ts.map +1 -1
- package/dist/animation/index.d.ts +2 -1
- package/dist/animation/index.d.ts.map +1 -1
- package/dist/animation/index.js +1 -1
- package/dist/animation/index.js.map +1 -1
- package/dist/atmosphere/CloudLayer.d.ts +24 -0
- package/dist/atmosphere/CloudLayer.d.ts.map +1 -0
- package/dist/atmosphere/CloudLayer.js +30 -0
- package/dist/atmosphere/CloudLayer.js.map +1 -0
- package/dist/atmosphere/FogVolumes.d.ts +30 -0
- package/dist/atmosphere/FogVolumes.d.ts.map +1 -0
- package/dist/atmosphere/FogVolumes.js +96 -0
- package/dist/atmosphere/FogVolumes.js.map +1 -0
- package/dist/atmosphere/GradientSky.d.ts +40 -0
- package/dist/atmosphere/GradientSky.d.ts.map +1 -0
- package/dist/atmosphere/GradientSky.js +75 -0
- package/dist/atmosphere/GradientSky.js.map +1 -0
- package/dist/atmosphere/HeightFog.d.ts +154 -0
- package/dist/atmosphere/HeightFog.d.ts.map +1 -0
- package/dist/atmosphere/HeightFog.js +379 -0
- package/dist/atmosphere/HeightFog.js.map +1 -0
- package/dist/atmosphere/PreethamSky.d.ts +38 -0
- package/dist/atmosphere/PreethamSky.d.ts.map +1 -0
- package/dist/atmosphere/PreethamSky.js +150 -0
- package/dist/atmosphere/PreethamSky.js.map +1 -0
- package/dist/atmosphere/SkyBackgroundPass.d.ts +63 -0
- package/dist/atmosphere/SkyBackgroundPass.d.ts.map +1 -0
- package/dist/atmosphere/SkyBackgroundPass.js +233 -0
- package/dist/atmosphere/SkyBackgroundPass.js.map +1 -0
- package/dist/atmosphere/SkyCaptureAdapter.d.ts +45 -0
- package/dist/atmosphere/SkyCaptureAdapter.d.ts.map +1 -0
- package/dist/atmosphere/SkyCaptureAdapter.js +65 -0
- package/dist/atmosphere/SkyCaptureAdapter.js.map +1 -0
- package/dist/atmosphere/SkyEval.d.ts +56 -0
- package/dist/atmosphere/SkyEval.d.ts.map +1 -0
- package/dist/atmosphere/SkyEval.js +99 -0
- package/dist/atmosphere/SkyEval.js.map +1 -0
- package/dist/atmosphere/StarField.d.ts +26 -0
- package/dist/atmosphere/StarField.d.ts.map +1 -0
- package/dist/atmosphere/StarField.js +31 -0
- package/dist/atmosphere/StarField.js.map +1 -0
- package/dist/atmosphere/VolumetricFogPass.d.ts +69 -0
- package/dist/atmosphere/VolumetricFogPass.d.ts.map +1 -0
- package/dist/atmosphere/VolumetricFogPass.js +265 -0
- package/dist/atmosphere/VolumetricFogPass.js.map +1 -0
- package/dist/atmosphere/fogChunks.d.ts +8 -0
- package/dist/atmosphere/fogChunks.d.ts.map +1 -0
- package/dist/atmosphere/fogChunks.js +39 -0
- package/dist/atmosphere/fogChunks.js.map +1 -0
- package/dist/atmosphere/fogUniformStore.d.ts +20 -0
- package/dist/atmosphere/fogUniformStore.d.ts.map +1 -0
- package/dist/atmosphere/fogUniformStore.js +45 -0
- package/dist/atmosphere/fogUniformStore.js.map +1 -0
- package/dist/atmosphere/shaders/fog.glsl.d.ts +10 -0
- package/dist/atmosphere/shaders/fog.glsl.d.ts.map +1 -0
- package/dist/atmosphere/shaders/fog.glsl.js +161 -0
- package/dist/atmosphere/shaders/fog.glsl.js.map +1 -0
- package/dist/atmosphere/shaders/volumetric-apply.glsl.d.ts +3 -0
- package/dist/atmosphere/shaders/volumetric-apply.glsl.d.ts.map +1 -0
- package/dist/atmosphere/shaders/volumetric-apply.glsl.js +61 -0
- package/dist/atmosphere/shaders/volumetric-apply.glsl.js.map +1 -0
- package/dist/atmosphere/shaders/volumetric-inject.glsl.d.ts +4 -0
- package/dist/atmosphere/shaders/volumetric-inject.glsl.d.ts.map +1 -0
- package/dist/atmosphere/shaders/volumetric-inject.glsl.js +129 -0
- package/dist/atmosphere/shaders/volumetric-inject.glsl.js.map +1 -0
- package/dist/atmosphere/shaders/volumetric-integrate.glsl.d.ts +3 -0
- package/dist/atmosphere/shaders/volumetric-integrate.glsl.d.ts.map +1 -0
- package/dist/atmosphere/shaders/volumetric-integrate.glsl.js +55 -0
- package/dist/atmosphere/shaders/volumetric-integrate.glsl.js.map +1 -0
- package/dist/atmosphere/shaders/wetness.glsl.d.ts +34 -0
- package/dist/atmosphere/shaders/wetness.glsl.d.ts.map +1 -0
- package/dist/atmosphere/shaders/wetness.glsl.js +101 -0
- package/dist/atmosphere/shaders/wetness.glsl.js.map +1 -0
- package/dist/atmosphere/sky.glsl.d.ts +8 -0
- package/dist/atmosphere/sky.glsl.d.ts.map +1 -0
- package/dist/atmosphere/sky.glsl.js +249 -0
- package/dist/atmosphere/sky.glsl.js.map +1 -0
- package/dist/batching/BatchedGeometryPool.d.ts +72 -0
- package/dist/batching/BatchedGeometryPool.d.ts.map +1 -0
- package/dist/batching/BatchedGeometryPool.js +138 -0
- package/dist/batching/BatchedGeometryPool.js.map +1 -0
- package/dist/batching/ContentKeys.d.ts +29 -0
- package/dist/batching/ContentKeys.d.ts.map +1 -0
- package/dist/batching/ContentKeys.js +220 -0
- package/dist/batching/ContentKeys.js.map +1 -0
- package/dist/batching/DrawDataTexture.d.ts +51 -0
- package/dist/batching/DrawDataTexture.d.ts.map +1 -0
- package/dist/batching/DrawDataTexture.js +99 -0
- package/dist/batching/DrawDataTexture.js.map +1 -0
- package/dist/batching/MultiDrawBatch.d.ts +64 -0
- package/dist/batching/MultiDrawBatch.d.ts.map +1 -0
- package/dist/batching/MultiDrawBatch.js +103 -0
- package/dist/batching/MultiDrawBatch.js.map +1 -0
- package/dist/batching/StaticMergePlanner.d.ts +80 -0
- package/dist/batching/StaticMergePlanner.d.ts.map +1 -0
- package/dist/batching/StaticMergePlanner.js +323 -0
- package/dist/batching/StaticMergePlanner.js.map +1 -0
- package/dist/batching/index.d.ts +8 -0
- package/dist/batching/index.d.ts.map +1 -0
- package/dist/batching/index.js +8 -0
- package/dist/batching/index.js.map +1 -0
- package/dist/batching/shaders/drawId.glsl.d.ts +29 -0
- package/dist/batching/shaders/drawId.glsl.d.ts.map +1 -0
- package/dist/batching/shaders/drawId.glsl.js +93 -0
- package/dist/batching/shaders/drawId.glsl.js.map +1 -0
- package/dist/batching/shaders/instanceEmissive.glsl.d.ts +16 -0
- package/dist/batching/shaders/instanceEmissive.glsl.d.ts.map +1 -0
- package/dist/batching/shaders/instanceEmissive.glsl.js +63 -0
- package/dist/batching/shaders/instanceEmissive.glsl.js.map +1 -0
- package/dist/cinematic/BloomPass.d.ts +5 -9
- package/dist/cinematic/BloomPass.d.ts.map +1 -1
- package/dist/cinematic/BloomPass.js +5 -17
- package/dist/cinematic/BloomPass.js.map +1 -1
- package/dist/cinematic/DepthHazePass.d.ts +5 -11
- package/dist/cinematic/DepthHazePass.d.ts.map +1 -1
- package/dist/cinematic/DepthHazePass.js +5 -19
- package/dist/cinematic/DepthHazePass.js.map +1 -1
- package/dist/cinematic/FilmGrainPass.d.ts +5 -8
- package/dist/cinematic/FilmGrainPass.d.ts.map +1 -1
- package/dist/cinematic/FilmGrainPass.js +5 -16
- package/dist/cinematic/FilmGrainPass.js.map +1 -1
- package/dist/cinematic/VignettePass.d.ts +5 -9
- package/dist/cinematic/VignettePass.d.ts.map +1 -1
- package/dist/cinematic/VignettePass.js +5 -16
- package/dist/cinematic/VignettePass.js.map +1 -1
- package/dist/cinematic/index.d.ts +2 -1
- package/dist/cinematic/index.d.ts.map +1 -1
- package/dist/cinematic/index.js +1 -1
- package/dist/cinematic/index.js.map +1 -1
- package/dist/contracts/atmosphere.d.ts +30 -0
- package/dist/contracts/atmosphere.d.ts.map +1 -0
- package/dist/contracts/atmosphere.js +42 -0
- package/dist/contracts/atmosphere.js.map +1 -0
- package/dist/contracts/blend.d.ts +28 -0
- package/dist/contracts/blend.d.ts.map +1 -0
- package/dist/contracts/blend.js +73 -0
- package/dist/contracts/blend.js.map +1 -0
- package/dist/contracts/core.d.ts +47 -0
- package/dist/contracts/core.d.ts.map +1 -0
- package/dist/contracts/core.js +70 -0
- package/dist/contracts/core.js.map +1 -0
- package/dist/contracts/deform.d.ts +38 -0
- package/dist/contracts/deform.d.ts.map +1 -0
- package/dist/contracts/deform.js +14 -0
- package/dist/contracts/deform.js.map +1 -0
- package/dist/contracts/device.d.ts +71 -0
- package/dist/contracts/device.d.ts.map +1 -0
- package/dist/contracts/device.js +97 -0
- package/dist/contracts/device.js.map +1 -0
- package/dist/contracts/environment.d.ts +55 -0
- package/dist/contracts/environment.d.ts.map +1 -0
- package/dist/contracts/environment.js +115 -0
- package/dist/contracts/environment.js.map +1 -0
- package/dist/contracts/flags.state.d.ts +15 -0
- package/dist/contracts/flags.state.d.ts.map +1 -0
- package/dist/contracts/flags.state.js +45 -0
- package/dist/contracts/flags.state.js.map +1 -0
- package/dist/contracts/frameGraph.d.ts +78 -0
- package/dist/contracts/frameGraph.d.ts.map +1 -0
- package/dist/contracts/frameGraph.js +32 -0
- package/dist/contracts/frameGraph.js.map +1 -0
- package/dist/contracts/frameUniforms.d.ts +43 -0
- package/dist/contracts/frameUniforms.d.ts.map +1 -0
- package/dist/contracts/frameUniforms.js +35 -0
- package/dist/contracts/frameUniforms.js.map +1 -0
- package/dist/contracts/geometry.d.ts +33 -0
- package/dist/contracts/geometry.d.ts.map +1 -0
- package/dist/contracts/geometry.js +59 -0
- package/dist/contracts/geometry.js.map +1 -0
- package/dist/contracts/index.d.ts +27 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +27 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/materialLobes.d.ts +41 -0
- package/dist/contracts/materialLobes.d.ts.map +1 -0
- package/dist/contracts/materialLobes.js +14 -0
- package/dist/contracts/materialLobes.js.map +1 -0
- package/dist/contracts/output.d.ts +35 -0
- package/dist/contracts/output.d.ts.map +1 -0
- package/dist/contracts/output.js +18 -0
- package/dist/contracts/output.js.map +1 -0
- package/dist/contracts/particles.d.ts +41 -0
- package/dist/contracts/particles.d.ts.map +1 -0
- package/dist/contracts/particles.js +15 -0
- package/dist/contracts/particles.js.map +1 -0
- package/dist/contracts/post.d.ts +71 -0
- package/dist/contracts/post.d.ts.map +1 -0
- package/dist/contracts/post.js +28 -0
- package/dist/contracts/post.js.map +1 -0
- package/dist/contracts/program.d.ts +158 -0
- package/dist/contracts/program.d.ts.map +1 -0
- package/dist/contracts/program.js +128 -0
- package/dist/contracts/program.js.map +1 -0
- package/dist/contracts/quality.d.ts +93 -0
- package/dist/contracts/quality.d.ts.map +1 -0
- package/dist/contracts/quality.js +149 -0
- package/dist/contracts/quality.js.map +1 -0
- package/dist/contracts/renderItem.d.ts +58 -0
- package/dist/contracts/renderItem.d.ts.map +1 -0
- package/dist/contracts/renderItem.js +8 -0
- package/dist/contracts/renderItem.js.map +1 -0
- package/dist/contracts/renderSource.d.ts +63 -0
- package/dist/contracts/renderSource.d.ts.map +1 -0
- package/dist/contracts/renderSource.js +7 -0
- package/dist/contracts/renderSource.js.map +1 -0
- package/dist/contracts/rendererFactory.d.ts +42 -0
- package/dist/contracts/rendererFactory.d.ts.map +1 -0
- package/dist/contracts/rendererFactory.js +32 -0
- package/dist/contracts/rendererFactory.js.map +1 -0
- package/dist/contracts/sampling.d.ts +23 -0
- package/dist/contracts/sampling.d.ts.map +1 -0
- package/dist/contracts/sampling.js +17 -0
- package/dist/contracts/sampling.js.map +1 -0
- package/dist/contracts/shadows.d.ts +53 -0
- package/dist/contracts/shadows.d.ts.map +1 -0
- package/dist/contracts/shadows.js +66 -0
- package/dist/contracts/shadows.js.map +1 -0
- package/dist/contracts/testing/ChunkHarness.d.ts +18 -0
- package/dist/contracts/testing/ChunkHarness.d.ts.map +1 -0
- package/dist/contracts/testing/ChunkHarness.js +68 -0
- package/dist/contracts/testing/ChunkHarness.js.map +1 -0
- package/dist/contracts/textureFormats.d.ts +18 -0
- package/dist/contracts/textureFormats.d.ts.map +1 -0
- package/dist/contracts/textureFormats.js +13 -0
- package/dist/contracts/textureFormats.js.map +1 -0
- package/dist/contracts/velocity.d.ts +37 -0
- package/dist/contracts/velocity.d.ts.map +1 -0
- package/dist/contracts/velocity.js +22 -0
- package/dist/contracts/velocity.js.map +1 -0
- package/dist/effects/ResidentGPUParticleRenderer.d.ts.map +1 -1
- package/dist/effects/ResidentGPUParticleRenderer.js +10 -5
- package/dist/effects/ResidentGPUParticleRenderer.js.map +1 -1
- package/dist/environment/EnvUniforms.d.ts +42 -0
- package/dist/environment/EnvUniforms.d.ts.map +1 -0
- package/dist/environment/EnvUniforms.js +54 -0
- package/dist/environment/EnvUniforms.js.map +1 -0
- package/dist/environment/EnvironmentCache.d.ts +83 -0
- package/dist/environment/EnvironmentCache.d.ts.map +1 -0
- package/dist/environment/EnvironmentCache.js +205 -0
- package/dist/environment/EnvironmentCache.js.map +1 -0
- package/dist/environment/EnvironmentProbeFactory.d.ts +41 -0
- package/dist/environment/EnvironmentProbeFactory.d.ts.map +1 -0
- package/dist/environment/EnvironmentProbeFactory.js +52 -0
- package/dist/environment/EnvironmentProbeFactory.js.map +1 -0
- package/dist/environment/GPUPMREMGenerator.d.ts +44 -0
- package/dist/environment/GPUPMREMGenerator.d.ts.map +1 -0
- package/dist/environment/GPUPMREMGenerator.js +98 -0
- package/dist/environment/GPUPMREMGenerator.js.map +1 -0
- package/dist/environment/HdrEquirect.d.ts +28 -0
- package/dist/environment/HdrEquirect.d.ts.map +1 -0
- package/dist/environment/HdrEquirect.js +205 -0
- package/dist/environment/HdrEquirect.js.map +1 -0
- package/dist/environment/LightingSamplerBudget.d.ts +20 -0
- package/dist/environment/LightingSamplerBudget.d.ts.map +1 -0
- package/dist/environment/LightingSamplerBudget.js +94 -0
- package/dist/environment/LightingSamplerBudget.js.map +1 -0
- package/dist/environment/Prd02BackgroundShaderLibrary.d.ts +10 -0
- package/dist/environment/Prd02BackgroundShaderLibrary.d.ts.map +1 -0
- package/dist/environment/Prd02BackgroundShaderLibrary.js +100 -0
- package/dist/environment/Prd02BackgroundShaderLibrary.js.map +1 -0
- package/dist/environment/Rgb9e5Cube.d.ts +25 -0
- package/dist/environment/Rgb9e5Cube.d.ts.map +1 -0
- package/dist/environment/Rgb9e5Cube.js +103 -0
- package/dist/environment/Rgb9e5Cube.js.map +1 -0
- package/dist/environment/RoomEnvironmentScene.d.ts +57 -0
- package/dist/environment/RoomEnvironmentScene.d.ts.map +1 -0
- package/dist/environment/RoomEnvironmentScene.js +165 -0
- package/dist/environment/RoomEnvironmentScene.js.map +1 -0
- package/dist/environment/SphericalHarmonics.d.ts +32 -0
- package/dist/environment/SphericalHarmonics.d.ts.map +1 -0
- package/dist/environment/SphericalHarmonics.js +155 -0
- package/dist/environment/SphericalHarmonics.js.map +1 -0
- package/dist/environment/probeBuild.d.ts +97 -0
- package/dist/environment/probeBuild.d.ts.map +1 -0
- package/dist/environment/probeBuild.js +406 -0
- package/dist/environment/probeBuild.js.map +1 -0
- package/dist/environment/workers/cpuPrefilter.d.ts +58 -0
- package/dist/environment/workers/cpuPrefilter.d.ts.map +1 -0
- package/dist/environment/workers/cpuPrefilter.js +288 -0
- package/dist/environment/workers/cpuPrefilter.js.map +1 -0
- package/dist/forward/Deform.d.ts +56 -0
- package/dist/forward/Deform.d.ts.map +1 -0
- package/dist/forward/Deform.js +517 -0
- package/dist/forward/Deform.js.map +1 -0
- package/dist/forward/DrawSubmit.d.ts +32 -0
- package/dist/forward/DrawSubmit.d.ts.map +1 -0
- package/dist/forward/DrawSubmit.js +75 -0
- package/dist/forward/DrawSubmit.js.map +1 -0
- package/dist/forward/Lighting.d.ts +35 -0
- package/dist/forward/Lighting.d.ts.map +1 -0
- package/dist/forward/Lighting.js +477 -0
- package/dist/forward/Lighting.js.map +1 -0
- package/dist/forward/Transmission.d.ts +62 -0
- package/dist/forward/Transmission.d.ts.map +1 -0
- package/dist/forward/Transmission.js +299 -0
- package/dist/forward/Transmission.js.map +1 -0
- package/dist/forward/Velocity.d.ts +47 -0
- package/dist/forward/Velocity.d.ts.map +1 -0
- package/dist/forward/Velocity.js +153 -0
- package/dist/forward/Velocity.js.map +1 -0
- package/dist/forward/transmissionTargetStore.d.ts +21 -0
- package/dist/forward/transmissionTargetStore.d.ts.map +1 -0
- package/dist/forward/transmissionTargetStore.js +8 -0
- package/dist/forward/transmissionTargetStore.js.map +1 -0
- package/dist/geometry/Primitives.d.ts +28 -0
- package/dist/geometry/Primitives.d.ts.map +1 -0
- package/dist/geometry/Primitives.js +110 -0
- package/dist/geometry/Primitives.js.map +1 -0
- package/dist/index.d.ts +140 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -52
- package/dist/index.js.map +1 -1
- package/dist/lanes/index.d.ts +17 -0
- package/dist/lanes/index.d.ts.map +1 -0
- package/dist/lanes/index.js +17 -0
- package/dist/lanes/index.js.map +1 -0
- package/dist/lanes/prd01.d.ts +6 -0
- package/dist/lanes/prd01.d.ts.map +1 -0
- package/dist/lanes/prd01.js +19 -0
- package/dist/lanes/prd01.js.map +1 -0
- package/dist/lanes/prd02.d.ts +62 -0
- package/dist/lanes/prd02.d.ts.map +1 -0
- package/dist/lanes/prd02.js +117 -0
- package/dist/lanes/prd02.js.map +1 -0
- package/dist/lanes/prd03.d.ts +19 -0
- package/dist/lanes/prd03.d.ts.map +1 -0
- package/dist/lanes/prd03.js +55 -0
- package/dist/lanes/prd03.js.map +1 -0
- package/dist/lanes/prd04.d.ts +22 -0
- package/dist/lanes/prd04.d.ts.map +1 -0
- package/dist/lanes/prd04.js +35 -0
- package/dist/lanes/prd04.js.map +1 -0
- package/dist/lanes/prd05.d.ts +4 -0
- package/dist/lanes/prd05.d.ts.map +1 -0
- package/dist/lanes/prd05.js +31 -0
- package/dist/lanes/prd05.js.map +1 -0
- package/dist/lanes/prd06.d.ts +33 -0
- package/dist/lanes/prd06.d.ts.map +1 -0
- package/dist/lanes/prd06.js +217 -0
- package/dist/lanes/prd06.js.map +1 -0
- package/dist/lanes/prd07.d.ts +49 -0
- package/dist/lanes/prd07.d.ts.map +1 -0
- package/dist/lanes/prd07.js +112 -0
- package/dist/lanes/prd07.js.map +1 -0
- package/dist/lanes/prd08.d.ts +2 -0
- package/dist/lanes/prd08.d.ts.map +1 -0
- package/dist/lanes/prd08.js +17 -0
- package/dist/lanes/prd08.js.map +1 -0
- package/dist/lanes/prd09.d.ts +6 -0
- package/dist/lanes/prd09.d.ts.map +1 -0
- package/dist/lanes/prd09.js +6 -0
- package/dist/lanes/prd09.js.map +1 -0
- package/dist/lanes/prd10.d.ts +2 -0
- package/dist/lanes/prd10.d.ts.map +1 -0
- package/dist/lanes/prd10.js +10 -0
- package/dist/lanes/prd10.js.map +1 -0
- package/dist/lanes/prd11.d.ts +61 -0
- package/dist/lanes/prd11.d.ts.map +1 -0
- package/dist/lanes/prd11.js +244 -0
- package/dist/lanes/prd11.js.map +1 -0
- package/dist/lanes/prd12.d.ts +6 -0
- package/dist/lanes/prd12.d.ts.map +1 -0
- package/dist/lanes/prd12.js +6 -0
- package/dist/lanes/prd12.js.map +1 -0
- package/dist/lanes/prd13.d.ts +6 -0
- package/dist/lanes/prd13.d.ts.map +1 -0
- package/dist/lanes/prd13.js +6 -0
- package/dist/lanes/prd13.js.map +1 -0
- package/dist/lanes/prd14.d.ts +6 -0
- package/dist/lanes/prd14.d.ts.map +1 -0
- package/dist/lanes/prd14.js +6 -0
- package/dist/lanes/prd14.js.map +1 -0
- package/dist/lanes/prd15.d.ts +6 -0
- package/dist/lanes/prd15.d.ts.map +1 -0
- package/dist/lanes/prd15.js +6 -0
- package/dist/lanes/prd15.js.map +1 -0
- package/dist/materials/PhysicalFeatures.d.ts +71 -0
- package/dist/materials/PhysicalFeatures.d.ts.map +1 -0
- package/dist/materials/PhysicalFeatures.js +255 -0
- package/dist/materials/PhysicalFeatures.js.map +1 -0
- package/dist/materials/PhysicalMaterial.d.ts +85 -0
- package/dist/materials/PhysicalMaterial.d.ts.map +1 -1
- package/dist/materials/PhysicalMaterial.js +21 -0
- package/dist/materials/PhysicalMaterial.js.map +1 -1
- package/dist/materials/features.d.ts +47 -0
- package/dist/materials/features.d.ts.map +1 -0
- package/dist/materials/features.js +282 -0
- package/dist/materials/features.js.map +1 -0
- package/dist/materials/lobes.d.ts +3 -0
- package/dist/materials/lobes.d.ts.map +1 -0
- package/dist/materials/lobes.js +225 -0
- package/dist/materials/lobes.js.map +1 -0
- package/dist/output/HdrTarget.d.ts +27 -0
- package/dist/output/HdrTarget.d.ts.map +1 -0
- package/dist/output/HdrTarget.js +48 -0
- package/dist/output/HdrTarget.js.map +1 -0
- package/dist/output/OutputPass.d.ts +28 -0
- package/dist/output/OutputPass.d.ts.map +1 -0
- package/dist/output/OutputPass.js +142 -0
- package/dist/output/OutputPass.js.map +1 -0
- package/dist/output/ToneMappingOperators.glsl.d.ts +22 -0
- package/dist/output/ToneMappingOperators.glsl.d.ts.map +1 -0
- package/dist/output/ToneMappingOperators.glsl.js +217 -0
- package/dist/output/ToneMappingOperators.glsl.js.map +1 -0
- package/dist/passes/ContactShadowPass.d.ts +57 -0
- package/dist/passes/ContactShadowPass.d.ts.map +1 -0
- package/dist/passes/ContactShadowPass.js +151 -0
- package/dist/passes/ContactShadowPass.js.map +1 -0
- package/dist/passes/Prd02ContactShadowsContributor.d.ts +16 -0
- package/dist/passes/Prd02ContactShadowsContributor.d.ts.map +1 -0
- package/dist/passes/Prd02ContactShadowsContributor.js +133 -0
- package/dist/passes/Prd02ContactShadowsContributor.js.map +1 -0
- package/dist/passes/Prd02SubFlags.d.ts +22 -0
- package/dist/passes/Prd02SubFlags.d.ts.map +1 -0
- package/dist/passes/Prd02SubFlags.js +32 -0
- package/dist/passes/Prd02SubFlags.js.map +1 -0
- package/dist/performance/BVH.d.ts +46 -0
- package/dist/performance/BVH.d.ts.map +1 -1
- package/dist/performance/BVH.js +212 -0
- package/dist/performance/BVH.js.map +1 -1
- package/dist/performance/Batcher.d.ts +11 -0
- package/dist/performance/Batcher.d.ts.map +1 -1
- package/dist/performance/Batcher.js +10 -0
- package/dist/performance/Batcher.js.map +1 -1
- package/dist/performance/FrustumCuller.d.ts +29 -0
- package/dist/performance/FrustumCuller.d.ts.map +1 -1
- package/dist/performance/FrustumCuller.js +78 -1
- package/dist/performance/FrustumCuller.js.map +1 -1
- package/dist/performance/LOD.d.ts +6 -0
- package/dist/performance/LOD.d.ts.map +1 -1
- package/dist/performance/LOD.js +12 -0
- package/dist/performance/LOD.js.map +1 -1
- package/dist/performance/RenderItemSorting.d.ts +2 -0
- package/dist/performance/RenderItemSorting.d.ts.map +1 -1
- package/dist/performance/RenderItemSorting.js +5 -1
- package/dist/performance/RenderItemSorting.js.map +1 -1
- package/dist/post/CubeLut.d.ts +15 -0
- package/dist/post/CubeLut.d.ts.map +1 -0
- package/dist/post/CubeLut.js +86 -0
- package/dist/post/CubeLut.js.map +1 -0
- package/dist/post/DisplayLutCache.d.ts +31 -0
- package/dist/post/DisplayLutCache.d.ts.map +1 -0
- package/dist/post/DisplayLutCache.js +44 -0
- package/dist/post/DisplayLutCache.js.map +1 -0
- package/dist/post/PostAntiAlias.d.ts +49 -0
- package/dist/post/PostAntiAlias.d.ts.map +1 -0
- package/dist/post/PostAntiAlias.js +75 -0
- package/dist/post/PostAntiAlias.js.map +1 -0
- package/dist/post/PostGraph.d.ts +206 -0
- package/dist/post/PostGraph.d.ts.map +1 -0
- package/dist/post/PostGraph.js +234 -0
- package/dist/post/PostGraph.js.map +1 -0
- package/dist/post/PostQualityTiers.d.ts +95 -0
- package/dist/post/PostQualityTiers.d.ts.map +1 -0
- package/dist/post/PostQualityTiers.js +62 -0
- package/dist/post/PostQualityTiers.js.map +1 -0
- package/dist/post/PostResources.d.ts +49 -0
- package/dist/post/PostResources.d.ts.map +1 -0
- package/dist/post/PostResources.js +124 -0
- package/dist/post/PostResources.js.map +1 -0
- package/dist/post/PostTimer.d.ts +37 -0
- package/dist/post/PostTimer.d.ts.map +1 -0
- package/dist/post/PostTimer.js +88 -0
- package/dist/post/PostTimer.js.map +1 -0
- package/dist/post/ScreenFeelPass.d.ts +83 -0
- package/dist/post/ScreenFeelPass.d.ts.map +1 -0
- package/dist/post/ScreenFeelPass.js +197 -0
- package/dist/post/ScreenFeelPass.js.map +1 -0
- package/dist/post/ToneOperators.d.ts +42 -0
- package/dist/post/ToneOperators.d.ts.map +1 -0
- package/dist/post/ToneOperators.js +179 -0
- package/dist/post/ToneOperators.js.map +1 -0
- package/dist/post/chunks/indirectFraction.glsl.d.ts +50 -0
- package/dist/post/chunks/indirectFraction.glsl.d.ts.map +1 -0
- package/dist/post/chunks/indirectFraction.glsl.js +82 -0
- package/dist/post/chunks/indirectFraction.glsl.js.map +1 -0
- package/dist/post/chunks/velocity.glsl.d.ts +35 -0
- package/dist/post/chunks/velocity.glsl.d.ts.map +1 -0
- package/dist/post/chunks/velocity.glsl.js +86 -0
- package/dist/post/chunks/velocity.glsl.js.map +1 -0
- package/dist/post/shaders/bloom.glsl.d.ts +21 -0
- package/dist/post/shaders/bloom.glsl.d.ts.map +1 -0
- package/dist/post/shaders/bloom.glsl.js +120 -0
- package/dist/post/shaders/bloom.glsl.js.map +1 -0
- package/dist/post/shaders/bloom.wgsl.d.ts +10 -0
- package/dist/post/shaders/bloom.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/bloom.wgsl.js +121 -0
- package/dist/post/shaders/bloom.wgsl.js.map +1 -0
- package/dist/post/shaders/common.glsl.d.ts +11 -0
- package/dist/post/shaders/common.glsl.d.ts.map +1 -0
- package/dist/post/shaders/common.glsl.js +34 -0
- package/dist/post/shaders/common.glsl.js.map +1 -0
- package/dist/post/shaders/common.wgsl.d.ts +25 -0
- package/dist/post/shaders/common.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/common.wgsl.js +48 -0
- package/dist/post/shaders/common.wgsl.js.map +1 -0
- package/dist/post/shaders/composite.glsl.d.ts +25 -0
- package/dist/post/shaders/composite.glsl.d.ts.map +1 -0
- package/dist/post/shaders/composite.glsl.js +96 -0
- package/dist/post/shaders/composite.glsl.js.map +1 -0
- package/dist/post/shaders/composite.wgsl.d.ts +10 -0
- package/dist/post/shaders/composite.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/composite.wgsl.js +92 -0
- package/dist/post/shaders/composite.wgsl.js.map +1 -0
- package/dist/post/shaders/depthDownsample.glsl.d.ts +20 -0
- package/dist/post/shaders/depthDownsample.glsl.d.ts.map +1 -0
- package/dist/post/shaders/depthDownsample.glsl.js +78 -0
- package/dist/post/shaders/depthDownsample.glsl.js.map +1 -0
- package/dist/post/shaders/depthDownsample.wgsl.d.ts +17 -0
- package/dist/post/shaders/depthDownsample.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/depthDownsample.wgsl.js +87 -0
- package/dist/post/shaders/depthDownsample.wgsl.js.map +1 -0
- package/dist/post/shaders/displayGrade.glsl.d.ts +18 -0
- package/dist/post/shaders/displayGrade.glsl.d.ts.map +1 -0
- package/dist/post/shaders/displayGrade.glsl.js +80 -0
- package/dist/post/shaders/displayGrade.glsl.js.map +1 -0
- package/dist/post/shaders/displayGrade.wgsl.d.ts +9 -0
- package/dist/post/shaders/displayGrade.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/displayGrade.wgsl.js +75 -0
- package/dist/post/shaders/displayGrade.wgsl.js.map +1 -0
- package/dist/post/shaders/dof.glsl.d.ts +25 -0
- package/dist/post/shaders/dof.glsl.d.ts.map +1 -0
- package/dist/post/shaders/dof.glsl.js +129 -0
- package/dist/post/shaders/dof.glsl.js.map +1 -0
- package/dist/post/shaders/dof.wgsl.d.ts +11 -0
- package/dist/post/shaders/dof.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/dof.wgsl.js +119 -0
- package/dist/post/shaders/dof.wgsl.js.map +1 -0
- package/dist/post/shaders/exposure.glsl.d.ts +43 -0
- package/dist/post/shaders/exposure.glsl.d.ts.map +1 -0
- package/dist/post/shaders/exposure.glsl.js +115 -0
- package/dist/post/shaders/exposure.glsl.js.map +1 -0
- package/dist/post/shaders/exposure.wgsl.d.ts +16 -0
- package/dist/post/shaders/exposure.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/exposure.wgsl.js +97 -0
- package/dist/post/shaders/exposure.wgsl.js.map +1 -0
- package/dist/post/shaders/finalize.glsl.d.ts +17 -0
- package/dist/post/shaders/finalize.glsl.d.ts.map +1 -0
- package/dist/post/shaders/finalize.glsl.js +120 -0
- package/dist/post/shaders/finalize.glsl.js.map +1 -0
- package/dist/post/shaders/finalize.wgsl.d.ts +13 -0
- package/dist/post/shaders/finalize.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/finalize.wgsl.js +124 -0
- package/dist/post/shaders/finalize.wgsl.js.map +1 -0
- package/dist/post/shaders/fxaa.glsl.d.ts +26 -0
- package/dist/post/shaders/fxaa.glsl.d.ts.map +1 -0
- package/dist/post/shaders/fxaa.glsl.js +246 -0
- package/dist/post/shaders/fxaa.glsl.js.map +1 -0
- package/dist/post/shaders/fxaa.wgsl.d.ts +17 -0
- package/dist/post/shaders/fxaa.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/fxaa.wgsl.js +268 -0
- package/dist/post/shaders/fxaa.wgsl.js.map +1 -0
- package/dist/post/shaders/godrays.glsl.d.ts +16 -0
- package/dist/post/shaders/godrays.glsl.d.ts.map +1 -0
- package/dist/post/shaders/godrays.glsl.js +70 -0
- package/dist/post/shaders/godrays.glsl.js.map +1 -0
- package/dist/post/shaders/godrays.wgsl.d.ts +8 -0
- package/dist/post/shaders/godrays.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/godrays.wgsl.js +60 -0
- package/dist/post/shaders/godrays.wgsl.js.map +1 -0
- package/dist/post/shaders/gtao.glsl.d.ts +29 -0
- package/dist/post/shaders/gtao.glsl.d.ts.map +1 -0
- package/dist/post/shaders/gtao.glsl.js +190 -0
- package/dist/post/shaders/gtao.glsl.js.map +1 -0
- package/dist/post/shaders/gtao.wgsl.d.ts +13 -0
- package/dist/post/shaders/gtao.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/gtao.wgsl.js +163 -0
- package/dist/post/shaders/gtao.wgsl.js.map +1 -0
- package/dist/post/shaders/gtaoDenoise.glsl.d.ts +22 -0
- package/dist/post/shaders/gtaoDenoise.glsl.d.ts.map +1 -0
- package/dist/post/shaders/gtaoDenoise.glsl.js +121 -0
- package/dist/post/shaders/gtaoDenoise.glsl.js.map +1 -0
- package/dist/post/shaders/gtaoDenoise.wgsl.d.ts +11 -0
- package/dist/post/shaders/gtaoDenoise.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/gtaoDenoise.wgsl.js +117 -0
- package/dist/post/shaders/gtaoDenoise.wgsl.js.map +1 -0
- package/dist/post/shaders/motionBlur.glsl.d.ts +21 -0
- package/dist/post/shaders/motionBlur.glsl.d.ts.map +1 -0
- package/dist/post/shaders/motionBlur.glsl.js +110 -0
- package/dist/post/shaders/motionBlur.glsl.js.map +1 -0
- package/dist/post/shaders/motionBlur.wgsl.d.ts +10 -0
- package/dist/post/shaders/motionBlur.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/motionBlur.wgsl.js +102 -0
- package/dist/post/shaders/motionBlur.wgsl.js.map +1 -0
- package/dist/post/shaders/smaa.glsl.d.ts +28 -0
- package/dist/post/shaders/smaa.glsl.d.ts.map +1 -0
- package/dist/post/shaders/smaa.glsl.js +354 -0
- package/dist/post/shaders/smaa.glsl.js.map +1 -0
- package/dist/post/shaders/smaa.wgsl.d.ts +20 -0
- package/dist/post/shaders/smaa.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/smaa.wgsl.js +375 -0
- package/dist/post/shaders/smaa.wgsl.js.map +1 -0
- package/dist/post/shaders/taa.glsl.d.ts +23 -0
- package/dist/post/shaders/taa.glsl.d.ts.map +1 -0
- package/dist/post/shaders/taa.glsl.js +169 -0
- package/dist/post/shaders/taa.glsl.js.map +1 -0
- package/dist/post/shaders/taa.wgsl.d.ts +10 -0
- package/dist/post/shaders/taa.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/taa.wgsl.js +185 -0
- package/dist/post/shaders/taa.wgsl.js.map +1 -0
- package/dist/post/shaders/velocityDilate.glsl.d.ts +16 -0
- package/dist/post/shaders/velocityDilate.glsl.d.ts.map +1 -0
- package/dist/post/shaders/velocityDilate.glsl.js +45 -0
- package/dist/post/shaders/velocityDilate.glsl.js.map +1 -0
- package/dist/post/shaders/velocityDilate.wgsl.d.ts +8 -0
- package/dist/post/shaders/velocityDilate.wgsl.d.ts.map +1 -0
- package/dist/post/shaders/velocityDilate.wgsl.js +30 -0
- package/dist/post/shaders/velocityDilate.wgsl.js.map +1 -0
- package/dist/post/smaa/textures.d.ts +17 -0
- package/dist/post/smaa/textures.d.ts.map +1 -0
- package/dist/post/smaa/textures.js +17 -0
- package/dist/post/smaa/textures.js.map +1 -0
- package/dist/post/v2Entry.d.ts +25 -0
- package/dist/post/v2Entry.d.ts.map +1 -0
- package/dist/post/v2Entry.js +28 -0
- package/dist/post/v2Entry.js.map +1 -0
- package/dist/post/v2Stages.d.ts +156 -0
- package/dist/post/v2Stages.d.ts.map +1 -0
- package/dist/post/v2Stages.js +1189 -0
- package/dist/post/v2Stages.js.map +1 -0
- package/dist/postprocess/EffectComposer.d.ts +6 -109
- package/dist/postprocess/EffectComposer.d.ts.map +1 -1
- package/dist/postprocess/EffectComposer.js +6 -246
- package/dist/postprocess/EffectComposer.js.map +1 -1
- package/dist/postprocess/NativeBloomPyramid.d.ts +34 -0
- package/dist/postprocess/NativeBloomPyramid.d.ts.map +1 -1
- package/dist/postprocess/NativeBloomPyramid.js +57 -0
- package/dist/postprocess/NativeBloomPyramid.js.map +1 -1
- package/dist/postprocess/SSAOPass.d.ts +5 -5
- package/dist/postprocess/SSAOPass.d.ts.map +1 -1
- package/dist/postprocess/SSAOPass.js +5 -17
- package/dist/postprocess/SSAOPass.js.map +1 -1
- package/dist/probes/IrradianceVolume.d.ts +45 -0
- package/dist/probes/IrradianceVolume.d.ts.map +1 -0
- package/dist/probes/IrradianceVolume.js +230 -0
- package/dist/probes/IrradianceVolume.js.map +1 -0
- package/dist/probes/LtcLuts.d.ts +30 -0
- package/dist/probes/LtcLuts.d.ts.map +1 -0
- package/dist/probes/LtcLuts.js +120 -0
- package/dist/probes/LtcLuts.js.map +1 -0
- package/dist/probes/Prd02ProbesContributor.d.ts +53 -0
- package/dist/probes/Prd02ProbesContributor.d.ts.map +1 -0
- package/dist/probes/Prd02ProbesContributor.js +241 -0
- package/dist/probes/Prd02ProbesContributor.js.map +1 -0
- package/dist/probes/ProbeBoxProjection.d.ts +53 -0
- package/dist/probes/ProbeBoxProjection.d.ts.map +1 -0
- package/dist/probes/ProbeBoxProjection.js +99 -0
- package/dist/probes/ProbeBoxProjection.js.map +1 -0
- package/dist/probes/ReflectionProbeSystem.d.ts +64 -0
- package/dist/probes/ReflectionProbeSystem.d.ts.map +1 -0
- package/dist/probes/ReflectionProbeSystem.js +157 -0
- package/dist/probes/ReflectionProbeSystem.js.map +1 -0
- package/dist/production-runtime/PBRHDRPipeline.d.ts.map +1 -1
- package/dist/production-runtime/PBRHDRPipeline.js +23 -9
- package/dist/production-runtime/PBRHDRPipeline.js.map +1 -1
- package/dist/production-runtime/ProductionRendererTypes.d.ts +16 -6
- package/dist/production-runtime/ProductionRendererTypes.d.ts.map +1 -1
- package/dist/production-runtime/ProductionRendererTypes.js.map +1 -1
- package/dist/production-runtime/ProductionWebGPURenderer.d.ts +4 -4
- package/dist/production-runtime/ProductionWebGPURenderer.d.ts.map +1 -1
- package/dist/production-runtime/ProductionWebGPURenderer.js +10 -45
- package/dist/production-runtime/ProductionWebGPURenderer.js.map +1 -1
- package/dist/production-runtime/backendSelection.d.ts +26 -0
- package/dist/production-runtime/backendSelection.d.ts.map +1 -0
- package/dist/production-runtime/backendSelection.js +46 -0
- package/dist/production-runtime/backendSelection.js.map +1 -0
- package/dist/production-runtime/backends/WebGL2RendererBackend.d.ts +1 -1
- package/dist/production-runtime/backends/WebGL2RendererBackend.d.ts.map +1 -1
- package/dist/production-runtime/backends/WebGL2RendererBackend.js +8 -4
- package/dist/production-runtime/backends/WebGL2RendererBackend.js.map +1 -1
- package/dist/production-runtime/backends/WebGPURendererBackend.d.ts +2 -19
- package/dist/production-runtime/backends/WebGPURendererBackend.d.ts.map +1 -1
- package/dist/production-runtime/backends/WebGPURendererBackend.js +2 -18
- package/dist/production-runtime/backends/WebGPURendererBackend.js.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Buffer.d.ts +2 -10
- package/dist/production-runtime/backends/webgl2/WebGL2Buffer.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Buffer.js +2 -7
- package/dist/production-runtime/backends/webgl2/WebGL2Buffer.js.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Capabilities.d.ts +2 -10
- package/dist/production-runtime/backends/webgl2/WebGL2Capabilities.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Capabilities.js +2 -7
- package/dist/production-runtime/backends/webgl2/WebGL2Capabilities.js.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2RenderTarget.d.ts +2 -10
- package/dist/production-runtime/backends/webgl2/WebGL2RenderTarget.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2RenderTarget.js +2 -7
- package/dist/production-runtime/backends/webgl2/WebGL2RenderTarget.js.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Shader.d.ts +2 -10
- package/dist/production-runtime/backends/webgl2/WebGL2Shader.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Shader.js +2 -7
- package/dist/production-runtime/backends/webgl2/WebGL2Shader.js.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2StateCache.d.ts +1 -0
- package/dist/production-runtime/backends/webgl2/WebGL2StateCache.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2StateCache.js +1 -0
- package/dist/production-runtime/backends/webgl2/WebGL2StateCache.js.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Texture.d.ts +2 -10
- package/dist/production-runtime/backends/webgl2/WebGL2Texture.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgl2/WebGL2Texture.js +2 -7
- package/dist/production-runtime/backends/webgl2/WebGL2Texture.js.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUBuffer.d.ts +2 -10
- package/dist/production-runtime/backends/webgpu/WebGPUBuffer.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUBuffer.js +2 -7
- package/dist/production-runtime/backends/webgpu/WebGPUBuffer.js.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUCapabilities.d.ts +2 -10
- package/dist/production-runtime/backends/webgpu/WebGPUCapabilities.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUCapabilities.js +2 -7
- package/dist/production-runtime/backends/webgpu/WebGPUCapabilities.js.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPURenderTarget.d.ts +2 -10
- package/dist/production-runtime/backends/webgpu/WebGPURenderTarget.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPURenderTarget.js +2 -7
- package/dist/production-runtime/backends/webgpu/WebGPURenderTarget.js.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUShader.d.ts +2 -10
- package/dist/production-runtime/backends/webgpu/WebGPUShader.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUShader.js +2 -7
- package/dist/production-runtime/backends/webgpu/WebGPUShader.js.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUTexture.d.ts +2 -10
- package/dist/production-runtime/backends/webgpu/WebGPUTexture.d.ts.map +1 -1
- package/dist/production-runtime/backends/webgpu/WebGPUTexture.js +2 -7
- package/dist/production-runtime/backends/webgpu/WebGPUTexture.js.map +1 -1
- package/dist/production-runtime/index.d.ts +6 -6
- package/dist/production-runtime/index.d.ts.map +1 -1
- package/dist/production-runtime/index.js +9 -3
- package/dist/production-runtime/index.js.map +1 -1
- package/dist/production-runtime/materials/GLTFMaterialAdapter.d.ts +12 -13
- package/dist/production-runtime/materials/GLTFMaterialAdapter.d.ts.map +1 -1
- package/dist/production-runtime/materials/GLTFMaterialAdapter.js +10 -4
- package/dist/production-runtime/materials/GLTFMaterialAdapter.js.map +1 -1
- package/dist/production-runtime/materials/GLTFPBRMaterialAdapter.d.ts +9 -2
- package/dist/production-runtime/materials/GLTFPBRMaterialAdapter.d.ts.map +1 -1
- package/dist/production-runtime/materials/GLTFPBRMaterialAdapter.js +7 -1
- package/dist/production-runtime/materials/GLTFPBRMaterialAdapter.js.map +1 -1
- package/dist/production-runtime/materials/MaterialCompiler.d.ts +10 -8
- package/dist/production-runtime/materials/MaterialCompiler.d.ts.map +1 -1
- package/dist/production-runtime/materials/MaterialCompiler.js +9 -4
- package/dist/production-runtime/materials/MaterialCompiler.js.map +1 -1
- package/dist/production-runtime/materials/PBRShaderFeatures.d.ts.map +1 -1
- package/dist/production-runtime/materials/PBRShaderFeatures.js +30 -1
- package/dist/production-runtime/materials/PBRShaderFeatures.js.map +1 -1
- package/dist/production-runtime/passes/ContactShadowPass.d.ts.map +1 -1
- package/dist/production-runtime/passes/ContactShadowPass.js +14 -13
- package/dist/production-runtime/passes/ContactShadowPass.js.map +1 -1
- package/dist/production-runtime/renderProofs.d.ts +54 -0
- package/dist/production-runtime/renderProofs.d.ts.map +1 -0
- package/dist/production-runtime/renderProofs.js +245 -0
- package/dist/production-runtime/renderProofs.js.map +1 -0
- package/dist/program/DFGLut.d.ts +23 -0
- package/dist/program/DFGLut.d.ts.map +1 -0
- package/dist/program/DFGLut.js +58 -0
- package/dist/program/DFGLut.js.map +1 -0
- package/dist/program/DFGLutData.d.ts +35 -0
- package/dist/program/DFGLutData.d.ts.map +1 -0
- package/dist/program/DFGLutData.js +52 -0
- package/dist/program/DFGLutData.js.map +1 -0
- package/dist/program/FeatureSelect.d.ts +35 -0
- package/dist/program/FeatureSelect.d.ts.map +1 -0
- package/dist/program/FeatureSelect.js +88 -0
- package/dist/program/FeatureSelect.js.map +1 -0
- package/dist/program/MaterialFeatures.d.ts +66 -0
- package/dist/program/MaterialFeatures.d.ts.map +1 -0
- package/dist/program/MaterialFeatures.js +242 -0
- package/dist/program/MaterialFeatures.js.map +1 -0
- package/dist/program/ProgramCache.d.ts +83 -0
- package/dist/program/ProgramCache.d.ts.map +1 -0
- package/dist/program/ProgramCache.js +194 -0
- package/dist/program/ProgramCache.js.map +1 -0
- package/dist/program/ProgramFeatures.d.ts +21 -0
- package/dist/program/ProgramFeatures.d.ts.map +1 -0
- package/dist/program/ProgramFeatures.js +95 -0
- package/dist/program/ProgramFeatures.js.map +1 -0
- package/dist/program/ProgramGenerator.d.ts +60 -0
- package/dist/program/ProgramGenerator.d.ts.map +1 -0
- package/dist/program/ProgramGenerator.js +760 -0
- package/dist/program/ProgramGenerator.js.map +1 -0
- package/dist/program/ProgramKey.d.ts +10 -0
- package/dist/program/ProgramKey.d.ts.map +1 -0
- package/dist/program/ProgramKey.js +13 -0
- package/dist/program/ProgramKey.js.map +1 -0
- package/dist/program/ProgramWarmup.d.ts +37 -0
- package/dist/program/ProgramWarmup.d.ts.map +1 -0
- package/dist/program/ProgramWarmup.js +68 -0
- package/dist/program/ProgramWarmup.js.map +1 -0
- package/dist/program/UniformLayout.d.ts +40 -0
- package/dist/program/UniformLayout.d.ts.map +1 -0
- package/dist/program/UniformLayout.js +105 -0
- package/dist/program/UniformLayout.js.map +1 -0
- package/dist/program/chunks/alpha.glsl.d.ts +7 -0
- package/dist/program/chunks/alpha.glsl.d.ts.map +1 -0
- package/dist/program/chunks/alpha.glsl.js +17 -0
- package/dist/program/chunks/alpha.glsl.js.map +1 -0
- package/dist/program/chunks/brdf.glsl.d.ts +12 -0
- package/dist/program/chunks/brdf.glsl.d.ts.map +1 -0
- package/dist/program/chunks/brdf.glsl.js +144 -0
- package/dist/program/chunks/brdf.glsl.js.map +1 -0
- package/dist/program/chunks/colorspace.glsl.d.ts +8 -0
- package/dist/program/chunks/colorspace.glsl.d.ts.map +1 -0
- package/dist/program/chunks/colorspace.glsl.js +16 -0
- package/dist/program/chunks/colorspace.glsl.js.map +1 -0
- package/dist/program/chunks/common.glsl.d.ts +7 -0
- package/dist/program/chunks/common.glsl.d.ts.map +1 -0
- package/dist/program/chunks/common.glsl.js +25 -0
- package/dist/program/chunks/common.glsl.js.map +1 -0
- package/dist/program/chunks/depth.glsl.d.ts +9 -0
- package/dist/program/chunks/depth.glsl.d.ts.map +1 -0
- package/dist/program/chunks/depth.glsl.js +18 -0
- package/dist/program/chunks/depth.glsl.js.map +1 -0
- package/dist/program/chunks/drawId.wgsl.d.ts +9 -0
- package/dist/program/chunks/drawId.wgsl.d.ts.map +1 -0
- package/dist/program/chunks/drawId.wgsl.js +29 -0
- package/dist/program/chunks/drawId.wgsl.js.map +1 -0
- package/dist/program/chunks/fog_default.glsl.d.ts +8 -0
- package/dist/program/chunks/fog_default.glsl.d.ts.map +1 -0
- package/dist/program/chunks/fog_default.glsl.js +31 -0
- package/dist/program/chunks/fog_default.glsl.js.map +1 -0
- package/dist/program/chunks/indirect_default.glsl.d.ts +29 -0
- package/dist/program/chunks/indirect_default.glsl.d.ts.map +1 -0
- package/dist/program/chunks/indirect_default.glsl.js +113 -0
- package/dist/program/chunks/indirect_default.glsl.js.map +1 -0
- package/dist/program/chunks/instanceEmissive.wgsl.d.ts +10 -0
- package/dist/program/chunks/instanceEmissive.wgsl.d.ts.map +1 -0
- package/dist/program/chunks/instanceEmissive.wgsl.js +21 -0
- package/dist/program/chunks/instanceEmissive.wgsl.js.map +1 -0
- package/dist/program/chunks/instancing.glsl.d.ts +8 -0
- package/dist/program/chunks/instancing.glsl.d.ts.map +1 -0
- package/dist/program/chunks/instancing.glsl.js +25 -0
- package/dist/program/chunks/instancing.glsl.js.map +1 -0
- package/dist/program/chunks/lights_legacy.glsl.d.ts +15 -0
- package/dist/program/chunks/lights_legacy.glsl.d.ts.map +1 -0
- package/dist/program/chunks/lights_legacy.glsl.js +95 -0
- package/dist/program/chunks/lights_legacy.glsl.js.map +1 -0
- package/dist/program/chunks/manifest.d.ts +42 -0
- package/dist/program/chunks/manifest.d.ts.map +1 -0
- package/dist/program/chunks/manifest.js +48 -0
- package/dist/program/chunks/manifest.js.map +1 -0
- package/dist/program/chunks/normal.glsl.d.ts +8 -0
- package/dist/program/chunks/normal.glsl.d.ts.map +1 -0
- package/dist/program/chunks/normal.glsl.js +34 -0
- package/dist/program/chunks/normal.glsl.js.map +1 -0
- package/dist/program/chunks/shadow_forward.glsl.d.ts +23 -0
- package/dist/program/chunks/shadow_forward.glsl.d.ts.map +1 -0
- package/dist/program/chunks/shadow_forward.glsl.js +73 -0
- package/dist/program/chunks/shadow_forward.glsl.js.map +1 -0
- package/dist/quality/DeviceClasses.d.ts +31 -0
- package/dist/quality/DeviceClasses.d.ts.map +1 -0
- package/dist/quality/DeviceClasses.js +83 -0
- package/dist/quality/DeviceClasses.js.map +1 -0
- package/dist/quality/DeviceProbe.d.ts +42 -0
- package/dist/quality/DeviceProbe.d.ts.map +1 -0
- package/dist/quality/DeviceProbe.js +83 -0
- package/dist/quality/DeviceProbe.js.map +1 -0
- package/dist/quality/FrameStats.d.ts +62 -0
- package/dist/quality/FrameStats.d.ts.map +1 -0
- package/dist/quality/FrameStats.js +220 -0
- package/dist/quality/FrameStats.js.map +1 -0
- package/dist/quality/PostprocessGuard.d.ts +49 -0
- package/dist/quality/PostprocessGuard.d.ts.map +1 -0
- package/dist/quality/PostprocessGuard.js +92 -0
- package/dist/quality/PostprocessGuard.js.map +1 -0
- package/dist/quality/QualityController.d.ts +93 -0
- package/dist/quality/QualityController.d.ts.map +1 -0
- package/dist/quality/QualityController.js +248 -0
- package/dist/quality/QualityController.js.map +1 -0
- package/dist/quality/QualityGovernor.d.ts +78 -0
- package/dist/quality/QualityGovernor.d.ts.map +1 -0
- package/dist/quality/QualityGovernor.js +170 -0
- package/dist/quality/QualityGovernor.js.map +1 -0
- package/dist/quality/QualityTier.d.ts +17 -0
- package/dist/quality/QualityTier.d.ts.map +1 -0
- package/dist/quality/QualityTier.js +23 -0
- package/dist/quality/QualityTier.js.map +1 -0
- package/dist/quality/RenderScaleController.d.ts +35 -0
- package/dist/quality/RenderScaleController.d.ts.map +1 -0
- package/dist/quality/RenderScaleController.js +57 -0
- package/dist/quality/RenderScaleController.js.map +1 -0
- package/dist/quality/RetentionPolicy.d.ts +11 -0
- package/dist/quality/RetentionPolicy.d.ts.map +1 -0
- package/dist/quality/RetentionPolicy.js +12 -0
- package/dist/quality/RetentionPolicy.js.map +1 -0
- package/dist/quality/TierResolver.d.ts +52 -0
- package/dist/quality/TierResolver.d.ts.map +1 -0
- package/dist/quality/TierResolver.js +155 -0
- package/dist/quality/TierResolver.js.map +1 -0
- package/dist/quality/liveTier.d.ts +23 -0
- package/dist/quality/liveTier.d.ts.map +1 -0
- package/dist/quality/liveTier.js +16 -0
- package/dist/quality/liveTier.js.map +1 -0
- package/dist/reference/BloomPass.d.ts +10 -0
- package/dist/reference/BloomPass.d.ts.map +1 -0
- package/dist/reference/BloomPass.js +18 -0
- package/dist/reference/BloomPass.js.map +1 -0
- package/dist/reference/DepthHazePass.d.ts +12 -0
- package/dist/reference/DepthHazePass.d.ts.map +1 -0
- package/dist/reference/DepthHazePass.js +20 -0
- package/dist/reference/DepthHazePass.js.map +1 -0
- package/dist/reference/EffectComposer.d.ts +110 -0
- package/dist/reference/EffectComposer.d.ts.map +1 -0
- package/dist/reference/EffectComposer.js +247 -0
- package/dist/reference/EffectComposer.js.map +1 -0
- package/dist/reference/FilmGrainPass.d.ts +9 -0
- package/dist/reference/FilmGrainPass.d.ts.map +1 -0
- package/dist/reference/FilmGrainPass.js +17 -0
- package/dist/reference/FilmGrainPass.js.map +1 -0
- package/dist/reference/PostProcessPass.d.ts +511 -0
- package/dist/reference/PostProcessPass.d.ts.map +1 -0
- package/dist/reference/PostProcessPass.js +2023 -0
- package/dist/reference/PostProcessPass.js.map +1 -0
- package/dist/reference/SSAOPass.d.ts +6 -0
- package/dist/reference/SSAOPass.d.ts.map +1 -0
- package/dist/reference/SSAOPass.js +18 -0
- package/dist/reference/SSAOPass.js.map +1 -0
- package/dist/reference/VignettePass.d.ts +10 -0
- package/dist/reference/VignettePass.d.ts.map +1 -0
- package/dist/reference/VignettePass.js +17 -0
- package/dist/reference/VignettePass.js.map +1 -0
- package/dist/reference/index.d.ts +15 -0
- package/dist/reference/index.d.ts.map +1 -0
- package/dist/reference/index.js +15 -0
- package/dist/reference/index.js.map +1 -0
- package/dist/renderer/Background.d.ts +49 -0
- package/dist/renderer/Background.d.ts.map +1 -0
- package/dist/renderer/Background.js +259 -0
- package/dist/renderer/Background.js.map +1 -0
- package/dist/renderer/CullingBatching.d.ts +55 -0
- package/dist/renderer/CullingBatching.d.ts.map +1 -0
- package/dist/renderer/CullingBatching.js +362 -0
- package/dist/renderer/CullingBatching.js.map +1 -0
- package/dist/renderer/DeviceLifecycle.d.ts +29 -0
- package/dist/renderer/DeviceLifecycle.d.ts.map +1 -0
- package/dist/renderer/DeviceLifecycle.js +48 -0
- package/dist/renderer/DeviceLifecycle.js.map +1 -0
- package/dist/renderer/FrameGraph.d.ts +96 -0
- package/dist/renderer/FrameGraph.d.ts.map +1 -0
- package/dist/renderer/FrameGraph.js +301 -0
- package/dist/renderer/FrameGraph.js.map +1 -0
- package/dist/renderer/InterleavedTransparentPass.d.ts +31 -0
- package/dist/renderer/InterleavedTransparentPass.d.ts.map +1 -0
- package/dist/renderer/InterleavedTransparentPass.js +65 -0
- package/dist/renderer/InterleavedTransparentPass.js.map +1 -0
- package/dist/renderer/PixelRatio.d.ts +64 -0
- package/dist/renderer/PixelRatio.d.ts.map +1 -0
- package/dist/renderer/PixelRatio.js +81 -0
- package/dist/renderer/PixelRatio.js.map +1 -0
- package/dist/renderer/PostprocessExecution.d.ts +82 -0
- package/dist/renderer/PostprocessExecution.d.ts.map +1 -0
- package/dist/renderer/PostprocessExecution.js +745 -0
- package/dist/renderer/PostprocessExecution.js.map +1 -0
- package/dist/renderer/Prd06ShaderWarmup.d.ts +32 -0
- package/dist/renderer/Prd06ShaderWarmup.d.ts.map +1 -0
- package/dist/renderer/Prd06ShaderWarmup.js +45 -0
- package/dist/renderer/Prd06ShaderWarmup.js.map +1 -0
- package/dist/renderer/RenderShared.d.ts +11 -0
- package/dist/renderer/RenderShared.d.ts.map +1 -0
- package/dist/renderer/RenderShared.js +47 -0
- package/dist/renderer/RenderShared.js.map +1 -0
- package/dist/renderer/RendererFactory.d.ts +3 -0
- package/dist/renderer/RendererFactory.d.ts.map +1 -0
- package/dist/renderer/RendererFactory.js +19 -0
- package/dist/renderer/RendererFactory.js.map +1 -0
- package/dist/renderer/RendererHost.d.ts +25 -0
- package/dist/renderer/RendererHost.d.ts.map +1 -0
- package/dist/renderer/RendererHost.js +4 -0
- package/dist/renderer/RendererHost.js.map +1 -0
- package/dist/renderer/SceneDepthCopyPass.d.ts +50 -0
- package/dist/renderer/SceneDepthCopyPass.d.ts.map +1 -0
- package/dist/renderer/SceneDepthCopyPass.js +124 -0
- package/dist/renderer/SceneDepthCopyPass.js.map +1 -0
- package/dist/renderer/ShadowOrchestration.d.ts +32 -0
- package/dist/renderer/ShadowOrchestration.d.ts.map +1 -0
- package/dist/renderer/ShadowOrchestration.js +491 -0
- package/dist/renderer/ShadowOrchestration.js.map +1 -0
- package/dist/renderer/SkinnedBounds.d.ts +6 -0
- package/dist/renderer/SkinnedBounds.d.ts.map +1 -0
- package/dist/renderer/SkinnedBounds.js +74 -0
- package/dist/renderer/SkinnedBounds.js.map +1 -0
- package/dist/renderer/coreOutputPostRoute.d.ts +40 -0
- package/dist/renderer/coreOutputPostRoute.d.ts.map +1 -0
- package/dist/renderer/coreOutputPostRoute.js +46 -0
- package/dist/renderer/coreOutputPostRoute.js.map +1 -0
- package/dist/renderer/postSkipped.d.ts +12 -0
- package/dist/renderer/postSkipped.d.ts.map +1 -0
- package/dist/renderer/postSkipped.js +54 -0
- package/dist/renderer/postSkipped.js.map +1 -0
- package/dist/renderer/qrSubFlags.d.ts +45 -0
- package/dist/renderer/qrSubFlags.d.ts.map +1 -0
- package/dist/renderer/qrSubFlags.js +130 -0
- package/dist/renderer/qrSubFlags.js.map +1 -0
- package/dist/resources/InstanceBuffer.d.ts +34 -0
- package/dist/resources/InstanceBuffer.d.ts.map +1 -0
- package/dist/resources/InstanceBuffer.js +96 -0
- package/dist/resources/InstanceBuffer.js.map +1 -0
- package/dist/resources/MorphTargetTexture.d.ts +53 -0
- package/dist/resources/MorphTargetTexture.d.ts.map +1 -0
- package/dist/resources/MorphTargetTexture.js +135 -0
- package/dist/resources/MorphTargetTexture.js.map +1 -0
- package/dist/resources/RenderTargetPool.d.ts +47 -0
- package/dist/resources/RenderTargetPool.d.ts.map +1 -0
- package/dist/resources/RenderTargetPool.js +122 -0
- package/dist/resources/RenderTargetPool.js.map +1 -0
- package/dist/resources/ResourceRegistry.d.ts +48 -0
- package/dist/resources/ResourceRegistry.d.ts.map +1 -0
- package/dist/resources/ResourceRegistry.js +95 -0
- package/dist/resources/ResourceRegistry.js.map +1 -0
- package/dist/resources/UniformBlock.d.ts +90 -0
- package/dist/resources/UniformBlock.d.ts.map +1 -0
- package/dist/resources/UniformBlock.js +184 -0
- package/dist/resources/UniformBlock.js.map +1 -0
- package/dist/shaders/camera-fade.glsl.d.ts +26 -0
- package/dist/shaders/camera-fade.glsl.d.ts.map +1 -0
- package/dist/shaders/camera-fade.glsl.js +109 -0
- package/dist/shaders/camera-fade.glsl.js.map +1 -0
- package/dist/shaders/chunks/contact_shadow.glsl.d.ts +12 -0
- package/dist/shaders/chunks/contact_shadow.glsl.d.ts.map +1 -0
- package/dist/shaders/chunks/contact_shadow.glsl.js +53 -0
- package/dist/shaders/chunks/contact_shadow.glsl.js.map +1 -0
- package/dist/shaders/chunks/lighting_ibl.glsl.d.ts +29 -0
- package/dist/shaders/chunks/lighting_ibl.glsl.d.ts.map +1 -0
- package/dist/shaders/chunks/lighting_ibl.glsl.js +122 -0
- package/dist/shaders/chunks/lighting_ibl.glsl.js.map +1 -0
- package/dist/shaders/chunks/lighting_mirrors.d.ts +18 -0
- package/dist/shaders/chunks/lighting_mirrors.d.ts.map +1 -0
- package/dist/shaders/chunks/lighting_mirrors.js +35 -0
- package/dist/shaders/chunks/lighting_mirrors.js.map +1 -0
- package/dist/shaders/chunks/lighting_punctual.glsl.d.ts +17 -0
- package/dist/shaders/chunks/lighting_punctual.glsl.d.ts.map +1 -0
- package/dist/shaders/chunks/lighting_punctual.glsl.js +197 -0
- package/dist/shaders/chunks/lighting_punctual.glsl.js.map +1 -0
- package/dist/shaders/chunks/sh9.glsl.d.ts +9 -0
- package/dist/shaders/chunks/sh9.glsl.d.ts.map +1 -0
- package/dist/shaders/chunks/sh9.glsl.js +41 -0
- package/dist/shaders/chunks/sh9.glsl.js.map +1 -0
- package/dist/shaders/chunks/shadow_caster.glsl.d.ts +10 -0
- package/dist/shaders/chunks/shadow_caster.glsl.d.ts.map +1 -0
- package/dist/shaders/chunks/shadow_caster.glsl.js +32 -0
- package/dist/shaders/chunks/shadow_caster.glsl.js.map +1 -0
- package/dist/shaders/chunks/shadow_receive.glsl.d.ts +13 -0
- package/dist/shaders/chunks/shadow_receive.glsl.d.ts.map +1 -0
- package/dist/shaders/chunks/shadow_receive.glsl.js +136 -0
- package/dist/shaders/chunks/shadow_receive.glsl.js.map +1 -0
- package/dist/shaders/debug-view.glsl.d.ts +18 -0
- package/dist/shaders/debug-view.glsl.d.ts.map +1 -0
- package/dist/shaders/debug-view.glsl.js +153 -0
- package/dist/shaders/debug-view.glsl.js.map +1 -0
- package/dist/shaders/deform/deform.glsl.d.ts +17 -0
- package/dist/shaders/deform/deform.glsl.d.ts.map +1 -0
- package/dist/shaders/deform/deform.glsl.js +99 -0
- package/dist/shaders/deform/deform.glsl.js.map +1 -0
- package/dist/shaders/deform/deform.wgsl.d.ts +15 -0
- package/dist/shaders/deform/deform.wgsl.d.ts.map +1 -0
- package/dist/shaders/deform/deform.wgsl.js +89 -0
- package/dist/shaders/deform/deform.wgsl.js.map +1 -0
- package/dist/shaders/deform/depthFeature.d.ts +22 -0
- package/dist/shaders/deform/depthFeature.d.ts.map +1 -0
- package/dist/shaders/deform/depthFeature.js +44 -0
- package/dist/shaders/deform/depthFeature.js.map +1 -0
- package/dist/shaders/deform/forwardFeature.d.ts +114 -0
- package/dist/shaders/deform/forwardFeature.d.ts.map +1 -0
- package/dist/shaders/deform/forwardFeature.js +300 -0
- package/dist/shaders/deform/forwardFeature.js.map +1 -0
- package/dist/shaders/deform/morph.glsl.d.ts +14 -0
- package/dist/shaders/deform/morph.glsl.d.ts.map +1 -0
- package/dist/shaders/deform/morph.glsl.js +45 -0
- package/dist/shaders/deform/morph.glsl.js.map +1 -0
- package/dist/shaders/deform/morph.wgsl.d.ts +21 -0
- package/dist/shaders/deform/morph.wgsl.d.ts.map +1 -0
- package/dist/shaders/deform/morph.wgsl.js +73 -0
- package/dist/shaders/deform/morph.wgsl.js.map +1 -0
- package/dist/shaders/deform/skinning.glsl.d.ts +8 -0
- package/dist/shaders/deform/skinning.glsl.d.ts.map +1 -0
- package/dist/shaders/deform/skinning.glsl.js +37 -0
- package/dist/shaders/deform/skinning.glsl.js.map +1 -0
- package/dist/shaders/deform/skinning.wgsl.d.ts +26 -0
- package/dist/shaders/deform/skinning.wgsl.d.ts.map +1 -0
- package/dist/shaders/deform/skinning.wgsl.js +58 -0
- package/dist/shaders/deform/skinning.wgsl.js.map +1 -0
- package/dist/shaders/deform/twins.d.ts +8 -0
- package/dist/shaders/deform/twins.d.ts.map +1 -0
- package/dist/shaders/deform/twins.js +20 -0
- package/dist/shaders/deform/twins.js.map +1 -0
- package/dist/shaders/lod-dither.glsl.d.ts +12 -0
- package/dist/shaders/lod-dither.glsl.d.ts.map +1 -0
- package/dist/shaders/lod-dither.glsl.js +101 -0
- package/dist/shaders/lod-dither.glsl.js.map +1 -0
- package/dist/shaders/physical/alpha_a2c.glsl.d.ts +19 -0
- package/dist/shaders/physical/alpha_a2c.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/alpha_a2c.glsl.js +29 -0
- package/dist/shaders/physical/alpha_a2c.glsl.js.map +1 -0
- package/dist/shaders/physical/anisotropy.glsl.d.ts +23 -0
- package/dist/shaders/physical/anisotropy.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/anisotropy.glsl.js +116 -0
- package/dist/shaders/physical/anisotropy.glsl.js.map +1 -0
- package/dist/shaders/physical/bsdf_lobes_common.glsl.d.ts +25 -0
- package/dist/shaders/physical/bsdf_lobes_common.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/bsdf_lobes_common.glsl.js +95 -0
- package/dist/shaders/physical/bsdf_lobes_common.glsl.js.map +1 -0
- package/dist/shaders/physical/clearcoat.glsl.d.ts +23 -0
- package/dist/shaders/physical/clearcoat.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/clearcoat.glsl.js +70 -0
- package/dist/shaders/physical/clearcoat.glsl.js.map +1 -0
- package/dist/shaders/physical/debug_view.glsl.d.ts +19 -0
- package/dist/shaders/physical/debug_view.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/debug_view.glsl.js +76 -0
- package/dist/shaders/physical/debug_view.glsl.js.map +1 -0
- package/dist/shaders/physical/dispersion.glsl.d.ts +18 -0
- package/dist/shaders/physical/dispersion.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/dispersion.glsl.js +67 -0
- package/dist/shaders/physical/dispersion.glsl.js.map +1 -0
- package/dist/shaders/physical/emissive_strength.glsl.d.ts +18 -0
- package/dist/shaders/physical/emissive_strength.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/emissive_strength.glsl.js +20 -0
- package/dist/shaders/physical/emissive_strength.glsl.js.map +1 -0
- package/dist/shaders/physical/index.d.ts +27 -0
- package/dist/shaders/physical/index.d.ts.map +1 -0
- package/dist/shaders/physical/index.js +69 -0
- package/dist/shaders/physical/index.js.map +1 -0
- package/dist/shaders/physical/iridescence.glsl.d.ts +25 -0
- package/dist/shaders/physical/iridescence.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/iridescence.glsl.js +186 -0
- package/dist/shaders/physical/iridescence.glsl.js.map +1 -0
- package/dist/shaders/physical/lobe_calls.glsl.d.ts +83 -0
- package/dist/shaders/physical/lobe_calls.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/lobe_calls.glsl.js +397 -0
- package/dist/shaders/physical/lobe_calls.glsl.js.map +1 -0
- package/dist/shaders/physical/sheen.glsl.d.ts +24 -0
- package/dist/shaders/physical/sheen.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/sheen.glsl.js +108 -0
- package/dist/shaders/physical/sheen.glsl.js.map +1 -0
- package/dist/shaders/physical/specular_ior.glsl.d.ts +20 -0
- package/dist/shaders/physical/specular_ior.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/specular_ior.glsl.js +64 -0
- package/dist/shaders/physical/specular_ior.glsl.js.map +1 -0
- package/dist/shaders/physical/tangent_frame.glsl.d.ts +27 -0
- package/dist/shaders/physical/tangent_frame.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/tangent_frame.glsl.js +71 -0
- package/dist/shaders/physical/tangent_frame.glsl.js.map +1 -0
- package/dist/shaders/physical/transmission.glsl.d.ts +25 -0
- package/dist/shaders/physical/transmission.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/transmission.glsl.js +204 -0
- package/dist/shaders/physical/transmission.glsl.js.map +1 -0
- package/dist/shaders/physical/transmission_copy.glsl.d.ts +15 -0
- package/dist/shaders/physical/transmission_copy.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/transmission_copy.glsl.js +33 -0
- package/dist/shaders/physical/transmission_copy.glsl.js.map +1 -0
- package/dist/shaders/physical/unlit.glsl.d.ts +17 -0
- package/dist/shaders/physical/unlit.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/unlit.glsl.js +19 -0
- package/dist/shaders/physical/unlit.glsl.js.map +1 -0
- package/dist/shaders/physical/uv_transform.glsl.d.ts +18 -0
- package/dist/shaders/physical/uv_transform.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/uv_transform.glsl.js +30 -0
- package/dist/shaders/physical/uv_transform.glsl.js.map +1 -0
- package/dist/shaders/physical/volume.glsl.d.ts +19 -0
- package/dist/shaders/physical/volume.glsl.d.ts.map +1 -0
- package/dist/shaders/physical/volume.glsl.js +47 -0
- package/dist/shaders/physical/volume.glsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/alpha_a2c.wgsl.d.ts +8 -0
- package/dist/shaders/physical-wgsl/alpha_a2c.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/alpha_a2c.wgsl.js +26 -0
- package/dist/shaders/physical-wgsl/alpha_a2c.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/anisotropy.wgsl.d.ts +10 -0
- package/dist/shaders/physical-wgsl/anisotropy.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/anisotropy.wgsl.js +97 -0
- package/dist/shaders/physical-wgsl/anisotropy.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/bsdf_lobes_common.wgsl.d.ts +11 -0
- package/dist/shaders/physical-wgsl/bsdf_lobes_common.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/bsdf_lobes_common.wgsl.js +76 -0
- package/dist/shaders/physical-wgsl/bsdf_lobes_common.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/clearcoat.wgsl.d.ts +9 -0
- package/dist/shaders/physical-wgsl/clearcoat.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/clearcoat.wgsl.js +56 -0
- package/dist/shaders/physical-wgsl/clearcoat.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/debug_view.wgsl.d.ts +10 -0
- package/dist/shaders/physical-wgsl/debug_view.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/debug_view.wgsl.js +71 -0
- package/dist/shaders/physical-wgsl/debug_view.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/dispersion.wgsl.d.ts +10 -0
- package/dist/shaders/physical-wgsl/dispersion.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/dispersion.wgsl.js +51 -0
- package/dist/shaders/physical-wgsl/dispersion.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/emissive_strength.wgsl.d.ts +9 -0
- package/dist/shaders/physical-wgsl/emissive_strength.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/emissive_strength.wgsl.js +15 -0
- package/dist/shaders/physical-wgsl/emissive_strength.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/index.d.ts +35 -0
- package/dist/shaders/physical-wgsl/index.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/index.js +51 -0
- package/dist/shaders/physical-wgsl/index.js.map +1 -0
- package/dist/shaders/physical-wgsl/iridescence.wgsl.d.ts +9 -0
- package/dist/shaders/physical-wgsl/iridescence.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/iridescence.wgsl.js +162 -0
- package/dist/shaders/physical-wgsl/iridescence.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/sheen.wgsl.d.ts +9 -0
- package/dist/shaders/physical-wgsl/sheen.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/sheen.wgsl.js +85 -0
- package/dist/shaders/physical-wgsl/sheen.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/specular_ior.wgsl.d.ts +10 -0
- package/dist/shaders/physical-wgsl/specular_ior.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/specular_ior.wgsl.js +47 -0
- package/dist/shaders/physical-wgsl/specular_ior.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/tangent_frame.wgsl.d.ts +11 -0
- package/dist/shaders/physical-wgsl/tangent_frame.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/tangent_frame.wgsl.js +57 -0
- package/dist/shaders/physical-wgsl/tangent_frame.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/transmission.wgsl.d.ts +14 -0
- package/dist/shaders/physical-wgsl/transmission.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/transmission.wgsl.js +159 -0
- package/dist/shaders/physical-wgsl/transmission.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/unlit.wgsl.d.ts +8 -0
- package/dist/shaders/physical-wgsl/unlit.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/unlit.wgsl.js +13 -0
- package/dist/shaders/physical-wgsl/unlit.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/uv_transform.wgsl.d.ts +10 -0
- package/dist/shaders/physical-wgsl/uv_transform.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/uv_transform.wgsl.js +24 -0
- package/dist/shaders/physical-wgsl/uv_transform.wgsl.js.map +1 -0
- package/dist/shaders/physical-wgsl/volume.wgsl.d.ts +10 -0
- package/dist/shaders/physical-wgsl/volume.wgsl.d.ts.map +1 -0
- package/dist/shaders/physical-wgsl/volume.wgsl.js +35 -0
- package/dist/shaders/physical-wgsl/volume.wgsl.js.map +1 -0
- package/dist/shadows/DirectionalCascadeFitter.d.ts +97 -0
- package/dist/shadows/DirectionalCascadeFitter.d.ts.map +1 -0
- package/dist/shadows/DirectionalCascadeFitter.js +372 -0
- package/dist/shadows/DirectionalCascadeFitter.js.map +1 -0
- package/dist/shadows/Prd02DepthShaderLibrary.d.ts +77 -0
- package/dist/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -0
- package/dist/shadows/Prd02DepthShaderLibrary.js +381 -0
- package/dist/shadows/Prd02DepthShaderLibrary.js.map +1 -0
- package/dist/shadows/Prd02ReceiveShadowContributor.d.ts +20 -0
- package/dist/shadows/Prd02ReceiveShadowContributor.d.ts.map +1 -0
- package/dist/shadows/Prd02ReceiveShadowContributor.js +20 -0
- package/dist/shadows/Prd02ReceiveShadowContributor.js.map +1 -0
- package/dist/shadows/Prd02ShadowBridge.d.ts +111 -0
- package/dist/shadows/Prd02ShadowBridge.d.ts.map +1 -0
- package/dist/shadows/Prd02ShadowBridge.js +267 -0
- package/dist/shadows/Prd02ShadowBridge.js.map +1 -0
- package/dist/shadows/Prd02ShadowFilter.d.ts +29 -0
- package/dist/shadows/Prd02ShadowFilter.d.ts.map +1 -0
- package/dist/shadows/Prd02ShadowFilter.js +35 -0
- package/dist/shadows/Prd02ShadowFilter.js.map +1 -0
- package/dist/shadows/Prd02ShadowsContributor.d.ts +44 -0
- package/dist/shadows/Prd02ShadowsContributor.d.ts.map +1 -0
- package/dist/shadows/Prd02ShadowsContributor.js +197 -0
- package/dist/shadows/Prd02ShadowsContributor.js.map +1 -0
- package/dist/shadows/ShadowAtlas.d.ts +59 -0
- package/dist/shadows/ShadowAtlas.d.ts.map +1 -0
- package/dist/shadows/ShadowAtlas.js +137 -0
- package/dist/shadows/ShadowAtlas.js.map +1 -0
- package/dist/shadows/ShadowDebugViews.d.ts +5 -0
- package/dist/shadows/ShadowDebugViews.d.ts.map +1 -1
- package/dist/shadows/ShadowDebugViews.js +15 -10
- package/dist/shadows/ShadowDebugViews.js.map +1 -1
- package/dist/shadows/ShadowFrameBinding.d.ts +18 -0
- package/dist/shadows/ShadowFrameBinding.d.ts.map +1 -0
- package/dist/shadows/ShadowFrameBinding.js +52 -0
- package/dist/shadows/ShadowFrameBinding.js.map +1 -0
- package/dist/shadows/ShadowSystem.d.ts +125 -0
- package/dist/shadows/ShadowSystem.d.ts.map +1 -0
- package/dist/shadows/ShadowSystem.js +293 -0
- package/dist/shadows/ShadowSystem.js.map +1 -0
- package/dist/textures/TextureBudget.d.ts +42 -0
- package/dist/textures/TextureBudget.d.ts.map +1 -0
- package/dist/textures/TextureBudget.js +180 -0
- package/dist/textures/TextureBudget.js.map +1 -0
- package/dist/vfx/BeamPass.d.ts +42 -0
- package/dist/vfx/BeamPass.d.ts.map +1 -0
- package/dist/vfx/BeamPass.js +249 -0
- package/dist/vfx/BeamPass.js.map +1 -0
- package/dist/vfx/BlendFallback.d.ts +19 -0
- package/dist/vfx/BlendFallback.d.ts.map +1 -0
- package/dist/vfx/BlendFallback.js +73 -0
- package/dist/vfx/BlendFallback.js.map +1 -0
- package/dist/vfx/DecalBatch.d.ts +120 -0
- package/dist/vfx/DecalBatch.d.ts.map +1 -0
- package/dist/vfx/DecalBatch.js +234 -0
- package/dist/vfx/DecalBatch.js.map +1 -0
- package/dist/vfx/DecalPass.d.ts +63 -0
- package/dist/vfx/DecalPass.d.ts.map +1 -0
- package/dist/vfx/DecalPass.js +159 -0
- package/dist/vfx/DecalPass.js.map +1 -0
- package/dist/vfx/LowResParticles.d.ts +31 -0
- package/dist/vfx/LowResParticles.d.ts.map +1 -0
- package/dist/vfx/LowResParticles.js +151 -0
- package/dist/vfx/LowResParticles.js.map +1 -0
- package/dist/vfx/MeshParticleBatch.d.ts +49 -0
- package/dist/vfx/MeshParticleBatch.d.ts.map +1 -0
- package/dist/vfx/MeshParticleBatch.js +184 -0
- package/dist/vfx/MeshParticleBatch.js.map +1 -0
- package/dist/vfx/MeshParticlePass.d.ts +28 -0
- package/dist/vfx/MeshParticlePass.d.ts.map +1 -0
- package/dist/vfx/MeshParticlePass.js +150 -0
- package/dist/vfx/MeshParticlePass.js.map +1 -0
- package/dist/vfx/ParticleBatchPass.d.ts +61 -0
- package/dist/vfx/ParticleBatchPass.d.ts.map +1 -0
- package/dist/vfx/ParticleBatchPass.js +320 -0
- package/dist/vfx/ParticleBatchPass.js.map +1 -0
- package/dist/vfx/ParticleGpuSim.d.ts +85 -0
- package/dist/vfx/ParticleGpuSim.d.ts.map +1 -0
- package/dist/vfx/ParticleGpuSim.js +301 -0
- package/dist/vfx/ParticleGpuSim.js.map +1 -0
- package/dist/vfx/ParticleInstanceLayout.d.ts +38 -0
- package/dist/vfx/ParticleInstanceLayout.d.ts.map +1 -0
- package/dist/vfx/ParticleInstanceLayout.js +105 -0
- package/dist/vfx/ParticleInstanceLayout.js.map +1 -0
- package/dist/vfx/ParticleSort.d.ts +21 -0
- package/dist/vfx/ParticleSort.d.ts.map +1 -0
- package/dist/vfx/ParticleSort.js +80 -0
- package/dist/vfx/ParticleSort.js.map +1 -0
- package/dist/vfx/ProceduralVolumeEmitter.d.ts +90 -0
- package/dist/vfx/ProceduralVolumeEmitter.d.ts.map +1 -0
- package/dist/vfx/ProceduralVolumeEmitter.js +155 -0
- package/dist/vfx/ProceduralVolumeEmitter.js.map +1 -0
- package/dist/vfx/RibbonBatch.d.ts +71 -0
- package/dist/vfx/RibbonBatch.d.ts.map +1 -0
- package/dist/vfx/RibbonBatch.js +234 -0
- package/dist/vfx/RibbonBatch.js.map +1 -0
- package/dist/vfx/RibbonPass.d.ts +21 -0
- package/dist/vfx/RibbonPass.d.ts.map +1 -0
- package/dist/vfx/RibbonPass.js +108 -0
- package/dist/vfx/RibbonPass.js.map +1 -0
- package/dist/vfx/SceneDepthAdapter.d.ts +28 -0
- package/dist/vfx/SceneDepthAdapter.d.ts.map +1 -0
- package/dist/vfx/SceneDepthAdapter.js +70 -0
- package/dist/vfx/SceneDepthAdapter.js.map +1 -0
- package/dist/vfx/VfxAtlas.d.ts +68 -0
- package/dist/vfx/VfxAtlas.d.ts.map +1 -0
- package/dist/vfx/VfxAtlas.js +106 -0
- package/dist/vfx/VfxAtlas.js.map +1 -0
- package/dist/vfx/contributors.d.ts +73 -0
- package/dist/vfx/contributors.d.ts.map +1 -0
- package/dist/vfx/contributors.js +615 -0
- package/dist/vfx/contributors.js.map +1 -0
- package/dist/vfx/decalLighting.d.ts +8 -0
- package/dist/vfx/decalLighting.d.ts.map +1 -0
- package/dist/vfx/decalLighting.js +53 -0
- package/dist/vfx/decalLighting.js.map +1 -0
- package/dist/vfx/depthSampler.d.ts +3 -0
- package/dist/vfx/depthSampler.d.ts.map +1 -0
- package/dist/vfx/depthSampler.js +10 -0
- package/dist/vfx/depthSampler.js.map +1 -0
- package/dist/vfx/prd07FeaturePars.d.ts +12 -0
- package/dist/vfx/prd07FeaturePars.d.ts.map +1 -0
- package/dist/vfx/prd07FeaturePars.js +54 -0
- package/dist/vfx/prd07FeaturePars.js.map +1 -0
- package/dist/vfx/shaders/beam.glsl.d.ts +11 -0
- package/dist/vfx/shaders/beam.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/beam.glsl.js +89 -0
- package/dist/vfx/shaders/beam.glsl.js.map +1 -0
- package/dist/vfx/shaders/decal.glsl.d.ts +14 -0
- package/dist/vfx/shaders/decal.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/decal.glsl.js +157 -0
- package/dist/vfx/shaders/decal.glsl.js.map +1 -0
- package/dist/vfx/shaders/gpu-sim.glsl.d.ts +5 -0
- package/dist/vfx/shaders/gpu-sim.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/gpu-sim.glsl.js +177 -0
- package/dist/vfx/shaders/gpu-sim.glsl.js.map +1 -0
- package/dist/vfx/shaders/lowresComposite.glsl.d.ts +9 -0
- package/dist/vfx/shaders/lowresComposite.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/lowresComposite.glsl.js +64 -0
- package/dist/vfx/shaders/lowresComposite.glsl.js.map +1 -0
- package/dist/vfx/shaders/mesh-particle.glsl.d.ts +4 -0
- package/dist/vfx/shaders/mesh-particle.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/mesh-particle.glsl.js +55 -0
- package/dist/vfx/shaders/mesh-particle.glsl.js.map +1 -0
- package/dist/vfx/shaders/particle.glsl.d.ts +24 -0
- package/dist/vfx/shaders/particle.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/particle.glsl.js +215 -0
- package/dist/vfx/shaders/particle.glsl.js.map +1 -0
- package/dist/vfx/shaders/ribbon.glsl.d.ts +9 -0
- package/dist/vfx/shaders/ribbon.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/ribbon.glsl.js +60 -0
- package/dist/vfx/shaders/ribbon.glsl.js.map +1 -0
- package/dist/vfx/shaders/volume.glsl.d.ts +5 -0
- package/dist/vfx/shaders/volume.glsl.d.ts.map +1 -0
- package/dist/vfx/shaders/volume.glsl.js +52 -0
- package/dist/vfx/shaders/volume.glsl.js.map +1 -0
- package/dist/webgl2/ContextLifecycle.d.ts +43 -0
- package/dist/webgl2/ContextLifecycle.d.ts.map +1 -0
- package/dist/webgl2/ContextLifecycle.js +189 -0
- package/dist/webgl2/ContextLifecycle.js.map +1 -0
- package/dist/webgl2/Counters.d.ts +58 -0
- package/dist/webgl2/Counters.d.ts.map +1 -0
- package/dist/webgl2/Counters.js +207 -0
- package/dist/webgl2/Counters.js.map +1 -0
- package/dist/webgl2/DeviceHost.d.ts +41 -0
- package/dist/webgl2/DeviceHost.d.ts.map +1 -0
- package/dist/webgl2/DeviceHost.js +3 -0
- package/dist/webgl2/DeviceHost.js.map +1 -0
- package/dist/webgl2/LegacyPost.d.ts +279 -0
- package/dist/webgl2/LegacyPost.d.ts.map +1 -0
- package/dist/webgl2/LegacyPost.js +2480 -0
- package/dist/webgl2/LegacyPost.js.map +1 -0
- package/dist/webgl2/MultiDraw.d.ts +96 -0
- package/dist/webgl2/MultiDraw.d.ts.map +1 -0
- package/dist/webgl2/MultiDraw.js +716 -0
- package/dist/webgl2/MultiDraw.js.map +1 -0
- package/dist/webgl2/Probe.d.ts +27 -0
- package/dist/webgl2/Probe.d.ts.map +1 -0
- package/dist/webgl2/Probe.js +329 -0
- package/dist/webgl2/Probe.js.map +1 -0
- package/dist/webgl2/Samplers.d.ts +20 -0
- package/dist/webgl2/Samplers.d.ts.map +1 -0
- package/dist/webgl2/Samplers.js +179 -0
- package/dist/webgl2/Samplers.js.map +1 -0
- package/dist/webgl2/TextureFormats.d.ts +48 -0
- package/dist/webgl2/TextureFormats.d.ts.map +1 -0
- package/dist/webgl2/TextureFormats.js +185 -0
- package/dist/webgl2/TextureFormats.js.map +1 -0
- package/dist/webgl2/TextureUpload.d.ts +38 -0
- package/dist/webgl2/TextureUpload.d.ts.map +1 -0
- package/dist/webgl2/TextureUpload.js +346 -0
- package/dist/webgl2/TextureUpload.js.map +1 -0
- package/dist/webgpu/WebGPUBuffer.d.ts +1 -0
- package/dist/webgpu/WebGPUBuffer.d.ts.map +1 -1
- package/dist/webgpu/WebGPUCompute.d.ts +1 -0
- package/dist/webgpu/WebGPUCompute.d.ts.map +1 -1
- package/dist/webgpu/WebGPUCompute.js +1 -0
- package/dist/webgpu/WebGPUCompute.js.map +1 -1
- package/dist/webgpu/WebGPUPipelineCache.d.ts +4 -0
- package/dist/webgpu/WebGPUPipelineCache.d.ts.map +1 -1
- package/dist/webgpu/WebGPUPipelineCache.js +4 -0
- package/dist/webgpu/WebGPUPipelineCache.js.map +1 -1
- package/dist/webgpu/WebGPUPostShaders.d.ts.map +1 -1
- package/dist/webgpu/WebGPUPostShaders.js +33 -2
- package/dist/webgpu/WebGPUPostShaders.js.map +1 -1
- package/dist/webgpu/WebGPUTexture.d.ts +1 -0
- package/dist/webgpu/WebGPUTexture.d.ts.map +1 -1
- package/dist/webgpu/WebGPUTexture.js.map +1 -1
- package/dist/world/chunks.d.ts +15 -0
- package/dist/world/chunks.d.ts.map +1 -0
- package/dist/world/chunks.js +56 -0
- package/dist/world/chunks.js.map +1 -0
- package/dist/world/index.d.ts +38 -0
- package/dist/world/index.d.ts.map +1 -0
- package/dist/world/index.js +39 -0
- package/dist/world/index.js.map +1 -0
- package/dist/world/shared/shaders/worldLightFallback.d.ts +12 -0
- package/dist/world/shared/shaders/worldLightFallback.d.ts.map +1 -0
- package/dist/world/shared/shaders/worldLightFallback.js +82 -0
- package/dist/world/shared/shaders/worldLightFallback.js.map +1 -0
- package/dist/world/space/PlanetMaterial.d.ts +24 -0
- package/dist/world/space/PlanetMaterial.d.ts.map +1 -0
- package/dist/world/space/PlanetMaterial.js +82 -0
- package/dist/world/space/PlanetMaterial.js.map +1 -0
- package/dist/world/space/SpaceSkyBake.d.ts +46 -0
- package/dist/world/space/SpaceSkyBake.d.ts.map +1 -0
- package/dist/world/space/SpaceSkyBake.js +145 -0
- package/dist/world/space/SpaceSkyBake.js.map +1 -0
- package/dist/world/space/shaders/planet.d.ts +8 -0
- package/dist/world/space/shaders/planet.d.ts.map +1 -0
- package/dist/world/space/shaders/planet.js +55 -0
- package/dist/world/space/shaders/planet.js.map +1 -0
- package/dist/world/space/shaders/spaceBake.d.ts +9 -0
- package/dist/world/space/shaders/spaceBake.d.ts.map +1 -0
- package/dist/world/space/shaders/spaceBake.js +102 -0
- package/dist/world/space/shaders/spaceBake.js.map +1 -0
- package/dist/world/terrain/SplatBake.d.ts +76 -0
- package/dist/world/terrain/SplatBake.d.ts.map +1 -0
- package/dist/world/terrain/SplatBake.js +308 -0
- package/dist/world/terrain/SplatBake.js.map +1 -0
- package/dist/world/terrain/TerrainCdlod.d.ts +67 -0
- package/dist/world/terrain/TerrainCdlod.d.ts.map +1 -0
- package/dist/world/terrain/TerrainCdlod.js +115 -0
- package/dist/world/terrain/TerrainCdlod.js.map +1 -0
- package/dist/world/terrain/TerrainHeightTexture.d.ts +44 -0
- package/dist/world/terrain/TerrainHeightTexture.d.ts.map +1 -0
- package/dist/world/terrain/TerrainHeightTexture.js +173 -0
- package/dist/world/terrain/TerrainHeightTexture.js.map +1 -0
- package/dist/world/terrain/TerrainPatchGeometry.d.ts +18 -0
- package/dist/world/terrain/TerrainPatchGeometry.d.ts.map +1 -0
- package/dist/world/terrain/TerrainPatchGeometry.js +40 -0
- package/dist/world/terrain/TerrainPatchGeometry.js.map +1 -0
- package/dist/world/terrain/shaders/terrain.vert.glsl.d.ts +19 -0
- package/dist/world/terrain/shaders/terrain.vert.glsl.d.ts.map +1 -0
- package/dist/world/terrain/shaders/terrain.vert.glsl.js +162 -0
- package/dist/world/terrain/shaders/terrain.vert.glsl.js.map +1 -0
- package/dist/world/terrain/shaders/terrainCdlod.d.ts +23 -0
- package/dist/world/terrain/shaders/terrainCdlod.d.ts.map +1 -0
- package/dist/world/terrain/shaders/terrainCdlod.js +110 -0
- package/dist/world/terrain/shaders/terrainCdlod.js.map +1 -0
- package/dist/world/terrain/shaders/terrainSplat.d.ts +26 -0
- package/dist/world/terrain/shaders/terrainSplat.d.ts.map +1 -0
- package/dist/world/terrain/shaders/terrainSplat.js +181 -0
- package/dist/world/terrain/shaders/terrainSplat.js.map +1 -0
- package/dist/world/vegetation/FoliageMaterial.d.ts +14 -0
- package/dist/world/vegetation/FoliageMaterial.d.ts.map +1 -0
- package/dist/world/vegetation/FoliageMaterial.js +107 -0
- package/dist/world/vegetation/FoliageMaterial.js.map +1 -0
- package/dist/world/vegetation/GrassField.d.ts +43 -0
- package/dist/world/vegetation/GrassField.d.ts.map +1 -0
- package/dist/world/vegetation/GrassField.js +68 -0
- package/dist/world/vegetation/GrassField.js.map +1 -0
- package/dist/world/vegetation/ImpostorMaterial.d.ts +20 -0
- package/dist/world/vegetation/ImpostorMaterial.d.ts.map +1 -0
- package/dist/world/vegetation/ImpostorMaterial.js +80 -0
- package/dist/world/vegetation/ImpostorMaterial.js.map +1 -0
- package/dist/world/vegetation/InstanceChunkGrid.d.ts +67 -0
- package/dist/world/vegetation/InstanceChunkGrid.d.ts.map +1 -0
- package/dist/world/vegetation/InstanceChunkGrid.js +150 -0
- package/dist/world/vegetation/InstanceChunkGrid.js.map +1 -0
- package/dist/world/vegetation/WindCpu.d.ts +19 -0
- package/dist/world/vegetation/WindCpu.d.ts.map +1 -0
- package/dist/world/vegetation/WindCpu.js +43 -0
- package/dist/world/vegetation/WindCpu.js.map +1 -0
- package/dist/world/vegetation/WindField.d.ts +42 -0
- package/dist/world/vegetation/WindField.d.ts.map +1 -0
- package/dist/world/vegetation/WindField.js +154 -0
- package/dist/world/vegetation/WindField.js.map +1 -0
- package/dist/world/vegetation/shaders/foliage.d.ts +8 -0
- package/dist/world/vegetation/shaders/foliage.d.ts.map +1 -0
- package/dist/world/vegetation/shaders/foliage.js +104 -0
- package/dist/world/vegetation/shaders/foliage.js.map +1 -0
- package/dist/world/vegetation/shaders/grass.d.ts +10 -0
- package/dist/world/vegetation/shaders/grass.d.ts.map +1 -0
- package/dist/world/vegetation/shaders/grass.js +79 -0
- package/dist/world/vegetation/shaders/grass.js.map +1 -0
- package/dist/world/vegetation/shaders/impostor.d.ts +9 -0
- package/dist/world/vegetation/shaders/impostor.d.ts.map +1 -0
- package/dist/world/vegetation/shaders/impostor.js +97 -0
- package/dist/world/vegetation/shaders/impostor.js.map +1 -0
- package/dist/world/vegetation/shaders/wind.d.ts +9 -0
- package/dist/world/vegetation/shaders/wind.d.ts.map +1 -0
- package/dist/world/vegetation/shaders/wind.js +103 -0
- package/dist/world/vegetation/shaders/wind.js.map +1 -0
- package/dist/world/water/GerstnerWaves.d.ts +65 -0
- package/dist/world/water/GerstnerWaves.d.ts.map +1 -0
- package/dist/world/water/GerstnerWaves.js +182 -0
- package/dist/world/water/GerstnerWaves.js.map +1 -0
- package/dist/world/water/ReflectionViewPass.d.ts +46 -0
- package/dist/world/water/ReflectionViewPass.d.ts.map +1 -0
- package/dist/world/water/ReflectionViewPass.js +85 -0
- package/dist/world/water/ReflectionViewPass.js.map +1 -0
- package/dist/world/water/SceneCopyFallback.d.ts +21 -0
- package/dist/world/water/SceneCopyFallback.d.ts.map +1 -0
- package/dist/world/water/SceneCopyFallback.js +150 -0
- package/dist/world/water/SceneCopyFallback.js.map +1 -0
- package/dist/world/water/UnderwaterState.d.ts +25 -0
- package/dist/world/water/UnderwaterState.d.ts.map +1 -0
- package/dist/world/water/UnderwaterState.js +134 -0
- package/dist/world/water/UnderwaterState.js.map +1 -0
- package/dist/world/water/WaterMaterial.d.ts +23 -0
- package/dist/world/water/WaterMaterial.d.ts.map +1 -0
- package/dist/world/water/WaterMaterial.js +129 -0
- package/dist/world/water/WaterMaterial.js.map +1 -0
- package/dist/world/water/shaders/caustics.d.ts +13 -0
- package/dist/world/water/shaders/caustics.d.ts.map +1 -0
- package/dist/world/water/shaders/caustics.js +103 -0
- package/dist/world/water/shaders/caustics.js.map +1 -0
- package/dist/world/water/shaders/gerstner.d.ts +9 -0
- package/dist/world/water/shaders/gerstner.d.ts.map +1 -0
- package/dist/world/water/shaders/gerstner.js +100 -0
- package/dist/world/water/shaders/gerstner.js.map +1 -0
- package/dist/world/water/shaders/water.d.ts +12 -0
- package/dist/world/water/shaders/water.d.ts.map +1 -0
- package/dist/world/water/shaders/water.js +112 -0
- package/dist/world/water/shaders/water.js.map +1 -0
- package/package.json +32 -11
- package/dist/ArchitecturalMaterialCatalog.d.ts +0 -30
- package/dist/ArchitecturalMaterialCatalog.d.ts.map +0 -1
- package/dist/ArchitecturalMaterialCatalog.js +0 -90
- package/dist/ArchitecturalMaterialCatalog.js.map +0 -1
- package/dist/LeanWebGL2Device.d.ts +0 -265
- package/dist/LeanWebGL2Device.d.ts.map +0 -1
- package/dist/LeanWebGL2Device.js +0 -4001
- package/dist/LeanWebGL2Device.js.map +0 -1
- package/dist/advanced-runtime/AdvancedRenderer.d.ts +0 -23
- package/dist/advanced-runtime/AdvancedRenderer.d.ts.map +0 -1
- package/dist/advanced-runtime/AdvancedRenderer.js +0 -45
- package/dist/advanced-runtime/AdvancedRenderer.js.map +0 -1
- package/dist/animation/AnimationMaterialStyle.d.ts +0 -19
- package/dist/animation/AnimationMaterialStyle.d.ts.map +0 -1
- package/dist/animation/AnimationMaterialStyle.js +0 -13
- package/dist/animation/AnimationMaterialStyle.js.map +0 -1
- package/dist/cinematic/CinematicMaterialPresets.d.ts +0 -16
- package/dist/cinematic/CinematicMaterialPresets.d.ts.map +0 -1
- package/dist/cinematic/CinematicMaterialPresets.js +0 -114
- package/dist/cinematic/CinematicMaterialPresets.js.map +0 -1
- package/dist/lean/LeanProductRenderer.d.ts +0 -29
- package/dist/lean/LeanProductRenderer.d.ts.map +0 -1
- package/dist/lean/LeanProductRenderer.js +0 -38
- package/dist/lean/LeanProductRenderer.js.map +0 -1
- package/dist/lean/LeanProductionRenderer.d.ts +0 -38
- package/dist/lean/LeanProductionRenderer.d.ts.map +0 -1
- package/dist/lean/LeanProductionRenderer.js +0 -88
- package/dist/lean/LeanProductionRenderer.js.map +0 -1
- package/dist/lean-core-runtime.d.ts +0 -13
- package/dist/lean-core-runtime.d.ts.map +0 -1
- package/dist/lean-core-runtime.js +0 -10
- package/dist/lean-core-runtime.js.map +0 -1
- package/dist/lean-runtime.d.ts +0 -18
- package/dist/lean-runtime.d.ts.map +0 -1
- package/dist/lean-runtime.js +0 -13
- package/dist/lean-runtime.js.map +0 -1
- package/dist/materials/TransmissionPass.d.ts +0 -16
- package/dist/materials/TransmissionPass.d.ts.map +0 -1
- package/dist/materials/TransmissionPass.js +0 -30
- package/dist/materials/TransmissionPass.js.map +0 -1
- package/dist/production-runtime/ProductionEffectsPipeline.d.ts +0 -20
- package/dist/production-runtime/ProductionEffectsPipeline.d.ts.map +0 -1
- package/dist/production-runtime/ProductionEffectsPipeline.js +0 -65
- package/dist/production-runtime/ProductionEffectsPipeline.js.map +0 -1
- package/dist/production-runtime/ProductionRuntimeRenderer.d.ts +0 -44
- package/dist/production-runtime/ProductionRuntimeRenderer.d.ts.map +0 -1
- package/dist/production-runtime/ProductionRuntimeRenderer.js +0 -179
- package/dist/production-runtime/ProductionRuntimeRenderer.js.map +0 -1
- package/dist/production-runtime/ProductionWebGL2Renderer.d.ts +0 -65
- package/dist/production-runtime/ProductionWebGL2Renderer.d.ts.map +0 -1
- package/dist/production-runtime/ProductionWebGL2Renderer.js +0 -305
- package/dist/production-runtime/ProductionWebGL2Renderer.js.map +0 -1
- package/dist/threejs-example-parity/index.d.ts +0 -57
- package/dist/threejs-example-parity/index.d.ts.map +0 -1
- package/dist/threejs-example-parity/index.js +0 -139
- package/dist/threejs-example-parity/index.js.map +0 -1
package/dist/Renderer.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import { collectEnvironmentBackground, collectEnvironmentFog, collectEnvironmentLighting } from "./renderer/Background.js";
|
|
2
|
+
import { applyRendererOwnedStaticBatching, applyRendererOwnedStaticMeshConsolidation, cullExplicitRenderItems, culledCastersReachingView, explicitCullingFrustum } from "./renderer/CullingBatching.js";
|
|
3
|
+
import { rendererDeviceIsLost, subscribeRendererDeviceLost, subscribeRendererDeviceRestored } from "./renderer/DeviceLifecycle.js";
|
|
4
|
+
import { createRendererFrameHooks, toFrameCamera } from "./renderer/FrameGraph.js";
|
|
5
|
+
import { RendererPostprocessPipeline, collectPostprocess, createPostprocessDiagnostics, defaultPostprocessTargetFormat, postGraphV2LastOutcome, postprocessRequiresDepthTexture } from "./renderer/PostprocessExecution.js";
|
|
6
|
+
import { createRenderer } from "./renderer/RendererFactory.js";
|
|
7
|
+
import { collectItemBounds, isIterable, renderableWorldBounds, sceneFromSource, toMat4 } from "./renderer/RenderShared.js";
|
|
8
|
+
import { RendererShadowOrchestrator, collectForwardShadowMap, collectRendererShadowOptions } from "./renderer/ShadowOrchestration.js";
|
|
9
|
+
import { shadowFrameCamera } from "./shadows/Prd02ShadowBridge.js";
|
|
10
|
+
import {} from "./contracts/renderSource.js";
|
|
1
11
|
import { Bounds3 as SceneBounds3, Camera, DirectionalLight, Light, PerspectiveCamera, PointLight, Scene, SpotLight, identityMat4, invertMat4, multiplyMat4, orthographicMat4, perspectiveMat4, transformPoint, toMathMat4 } from "@aura3d/scene";
|
|
2
12
|
import { Frustum } from "@aura3d/math";
|
|
3
13
|
import { createRenderDevice } from "./RenderBackend.js";
|
|
@@ -18,9 +28,35 @@ import { Sampler } from "./Sampler.js";
|
|
|
18
28
|
import {} from "./Texture.js";
|
|
19
29
|
import { TextureBinding } from "./TextureBinding.js";
|
|
20
30
|
import { computeOrthographicCameraFrame, computePerspectiveCameraFrame } from "./CameraFraming.js";
|
|
31
|
+
import { ResolutionGovernor } from "./ResolutionGovernor.js";
|
|
32
|
+
import { frameStatsSlot } from "./contracts/device.js";
|
|
33
|
+
import { resolveCanvasPixelRatio, watchDevicePixelRatio } from "./renderer/PixelRatio.js";
|
|
34
|
+
import { QUALITY_TIERS } from "./contracts/quality.js";
|
|
35
|
+
import { prd11LiveQualityTier } from "./quality/liveTier.js";
|
|
36
|
+
import { MaterialInstance } from "./MaterialInstance.js";
|
|
37
|
+
import { featuresForGeometry, materialRoutesToGeneratedProgram } from "./program/MaterialFeatures.js";
|
|
38
|
+
import { selectShaderFeatureBits } from "./program/FeatureSelect.js";
|
|
39
|
+
import { collectWarmupFeatures, ProgramWarmup } from "./program/ProgramWarmup.js";
|
|
40
|
+
import { PRD03_EXPOSURE, rendererQrFlags, setRendererQrFlags, withRendererQrFlags } from "./renderer/FrameGraph.js";
|
|
41
|
+
import { consumeTaaHistoryWritten } from "./renderer/postSkipped.js";
|
|
42
|
+
import { qrCoreGeneratorOn, qrCoreOutputOn, qrGeneratedProgramsOn, qrMaterialsLobeProgramsOn, rendererOutputPass, rendererProgramCache } from "./renderer/qrSubFlags.js";
|
|
43
|
+
import { resolveCoreOutputPostRoute, withCoreOutputOff } from "./renderer/coreOutputPostRoute.js";
|
|
44
|
+
import { forwardPassFeatureAxes, prd02IblEnvironmentAvailable, splitForwardItems } from "./ForwardPass.js";
|
|
45
|
+
import { PRD02_IBL_FEATURE } from "./contracts/environment.js";
|
|
46
|
+
import { InterleavedTransparentPass } from "./renderer/InterleavedTransparentPass.js";
|
|
47
|
+
import { ensureSceneDepthCopyTarget, SceneDepthCopyPass } from "./renderer/SceneDepthCopyPass.js";
|
|
48
|
+
import { probeHdrTargetFormat, DEFAULT_TONE_MAPPING } from "./contracts/output.js";
|
|
49
|
+
import { resolveForwardClusteredLighting } from "./forward/Lighting.js";
|
|
21
50
|
import { assertRendererFeatures, createRendererFeatureReport } from "./RendererFeatureGates.js";
|
|
22
51
|
import { batchStaticRenderItems } from "./SceneOptimization.js";
|
|
23
52
|
import { createStaticMeshConsolidationCache } from "./MeshConsolidation.js";
|
|
53
|
+
/**
|
|
54
|
+
* C-05 (PRD-01 §8.4-§8.6): output configuration applied by the OutputPass
|
|
55
|
+
* under `A3D_QR_CORE_OUTPUT`. Flag-off: recorded but never applied (legacy
|
|
56
|
+
* present path is untouched).
|
|
57
|
+
*/
|
|
58
|
+
/** #1140: OutputPass dithering default (three.js parity); `output.dithering` overrides. */
|
|
59
|
+
export const DEFAULT_OUTPUT_DITHERING = false;
|
|
24
60
|
export const DEFAULT_RENDERER_AUTO_FRAME_OPTIONS = {
|
|
25
61
|
paddingRatio: 0.14,
|
|
26
62
|
yawRadians: -0.38,
|
|
@@ -28,32 +64,6 @@ export const DEFAULT_RENDERER_AUTO_FRAME_OPTIONS = {
|
|
|
28
64
|
nearPadding: 0.2,
|
|
29
65
|
farPadding: 2.4
|
|
30
66
|
};
|
|
31
|
-
export const DEFAULT_RENDERER_ENVIRONMENT_LIGHTING = {
|
|
32
|
-
color: [0.78, 0.8, 0.84],
|
|
33
|
-
intensity: 0.42,
|
|
34
|
-
proceduralMap: {
|
|
35
|
-
skyColor: [0.64, 0.76, 0.94],
|
|
36
|
-
horizonColor: [0.94, 0.82, 0.62],
|
|
37
|
-
groundColor: [0.12, 0.13, 0.15],
|
|
38
|
-
specularColor: [1, 0.94, 0.78],
|
|
39
|
-
intensity: 0.5,
|
|
40
|
-
specularIntensity: 0.82
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const DISABLED_RENDERER_ENVIRONMENT_LIGHTING = {
|
|
44
|
-
color: [0, 0, 0],
|
|
45
|
-
intensity: 0,
|
|
46
|
-
proceduralMap: {
|
|
47
|
-
skyColor: [0, 0, 0],
|
|
48
|
-
horizonColor: [0, 0, 0],
|
|
49
|
-
groundColor: [0, 0, 0],
|
|
50
|
-
specularColor: [0, 0, 0],
|
|
51
|
-
intensity: 0,
|
|
52
|
-
specularIntensity: 0
|
|
53
|
-
},
|
|
54
|
-
environmentMapIntensity: 0,
|
|
55
|
-
environmentMapSpecularIntensity: 0
|
|
56
|
-
};
|
|
57
67
|
export const DEFAULT_RENDERER_DIRECT_LIGHTING = {
|
|
58
68
|
key: {
|
|
59
69
|
color: [1, 0.92, 0.78],
|
|
@@ -66,10 +76,12 @@ export const DEFAULT_RENDERER_DIRECT_LIGHTING = {
|
|
|
66
76
|
direction: [-0.35, -0.22, -0.91]
|
|
67
77
|
}
|
|
68
78
|
};
|
|
79
|
+
export { DEFAULT_RENDERER_ENVIRONMENT_LIGHTING } from "./renderer/Background.js";
|
|
69
80
|
export class Renderer {
|
|
70
81
|
device;
|
|
71
82
|
graph = new RenderGraph();
|
|
72
83
|
shaderLibrary;
|
|
84
|
+
host;
|
|
73
85
|
/**
|
|
74
86
|
* Depth target reused by the renderer-owned shadow pass across frames.
|
|
75
87
|
*
|
|
@@ -95,36 +107,190 @@ export class Renderer {
|
|
|
95
107
|
width;
|
|
96
108
|
height;
|
|
97
109
|
clearColor;
|
|
110
|
+
outputClearColor;
|
|
98
111
|
disposed = false;
|
|
99
112
|
animationLoop = null;
|
|
100
113
|
fusedLdrPostprocessScratch = {};
|
|
114
|
+
// §6.9 resolution policy state (present only when `options.resolution` is set).
|
|
115
|
+
resolutionOptions;
|
|
116
|
+
qualityTier;
|
|
117
|
+
qualityTierName;
|
|
118
|
+
programWarmup;
|
|
119
|
+
/** C-05 state: requested output options, the resolved HDR scene target, and the depth copy. */
|
|
120
|
+
outputOptions;
|
|
121
|
+
hdrSceneTarget = null;
|
|
122
|
+
hdrMsaaMrtDegraded = false;
|
|
123
|
+
sceneDepthCopyTarget = null;
|
|
124
|
+
lastAppliedOutput = null;
|
|
125
|
+
warnedV2Postprocess = false;
|
|
126
|
+
/** T0-07: C-36-shaped record of the last legacy postprocess chain skipped
|
|
127
|
+
* under A3D_QR_CORE_OUTPUT (`null` when nothing was skipped). Read by the
|
|
128
|
+
* engine's C-31 `output.postSkipped` section; routing through PostGraph v2
|
|
129
|
+
* is lane 03's Q-03-2/Q-03-3. */
|
|
130
|
+
lastPostSkipped = null;
|
|
131
|
+
get postSkipped() {
|
|
132
|
+
return this.lastPostSkipped;
|
|
133
|
+
}
|
|
134
|
+
warnPostLegacyRoute(record) {
|
|
135
|
+
if (this.warnedV2Postprocess)
|
|
136
|
+
return;
|
|
137
|
+
this.warnedV2Postprocess = true;
|
|
138
|
+
if (typeof console !== "undefined")
|
|
139
|
+
console.warn(`POSTPROCESS_V2_UNMIGRATED: ${record.message}`);
|
|
140
|
+
}
|
|
141
|
+
resolutionGovernor;
|
|
142
|
+
renderScaleCeiling = 1;
|
|
143
|
+
unsubscribeDprWatch;
|
|
144
|
+
/** C-28 FrameStats feeding the governor (intervalMs until lane 11's gpuMs lands). */
|
|
145
|
+
frameStatsMonitor;
|
|
146
|
+
/** PRD-02 S12: private graph for `renderProbeFace` (never the main frame graph). */
|
|
147
|
+
probeGraph;
|
|
101
148
|
constructor(device, options, temporalHistory) {
|
|
102
149
|
this.device = device;
|
|
150
|
+
if (options.qrFlags)
|
|
151
|
+
setRendererQrFlags(options.qrFlags, device);
|
|
103
152
|
this.temporalHistory = temporalHistory;
|
|
104
153
|
this.unsubscribeTemporalDeviceLoss = device.onDeviceLost?.(() => this.temporalHistory.dispose());
|
|
105
154
|
this.canvas = options.canvas;
|
|
106
155
|
this.width = options.width ?? inferInitialCanvasDimension(options.canvas, "width");
|
|
107
156
|
this.height = options.height ?? inferInitialCanvasDimension(options.canvas, "height");
|
|
108
157
|
this.clearColor = options.clearColor ?? [0, 0, 0, 1];
|
|
158
|
+
this.outputClearColor = options.outputClearColor;
|
|
159
|
+
this.outputOptions = options.output ?? {};
|
|
109
160
|
this.shaderLibrary = options.shaderLibrary;
|
|
161
|
+
this.host = {
|
|
162
|
+
device,
|
|
163
|
+
shaderLibrary: options.shaderLibrary,
|
|
164
|
+
fusedLdrPostprocessScratch: this.fusedLdrPostprocessScratch,
|
|
165
|
+
frameIndex: 0
|
|
166
|
+
};
|
|
167
|
+
const host = this.host;
|
|
168
|
+
Object.defineProperty(host, "width", { enumerable: true, get: () => this.width, set: (value) => { this.width = value; } });
|
|
169
|
+
Object.defineProperty(host, "height", { enumerable: true, get: () => this.height, set: (value) => { this.height = value; } });
|
|
170
|
+
Object.defineProperty(host, "shadowDepthTarget", { enumerable: true, get: () => this.shadowDepthTarget, set: (value) => { this.shadowDepthTarget = value; } });
|
|
171
|
+
this.host.post = new RendererPostprocessPipeline(this.host);
|
|
172
|
+
this.host.shadows = new RendererShadowOrchestrator(this.host);
|
|
173
|
+
this.resolutionOptions = options.resolution;
|
|
174
|
+
this.qualityTier = options.qualityTier;
|
|
175
|
+
this.qualityTierName = options.qualityTierName;
|
|
176
|
+
if (options.resolution !== undefined && options.resolution.dynamic !== false) {
|
|
177
|
+
this.resolutionGovernor = new ResolutionGovernor({
|
|
178
|
+
targetFrameMs: options.resolution.targetFrameMs ?? 16.7,
|
|
179
|
+
minRenderScale: options.resolution.minRenderScale ?? options.qualityTier?.minRenderScale ?? 0.5,
|
|
180
|
+
maxRenderScale: 1,
|
|
181
|
+
devicePixelRatio: typeof globalThis !== "undefined" ? globalThis.devicePixelRatio : undefined,
|
|
182
|
+
allowSubCssResolution: options.resolution.allowSubCssResolution
|
|
183
|
+
});
|
|
184
|
+
// C-28 slot: the default impl is a real FrameStats (gpuMs stays null
|
|
185
|
+
// until prd11's timer queries land); flags would pick prd11's provider.
|
|
186
|
+
this.frameStatsMonitor = frameStatsSlot.get({ values: {}, on: () => false })(240);
|
|
187
|
+
}
|
|
188
|
+
// §6.9: re-evaluate the canvas pixel ratio when the display DPR changes.
|
|
189
|
+
this.unsubscribeDprWatch = options.resolution !== undefined && this.canvas
|
|
190
|
+
? watchDevicePixelRatio(() => {
|
|
191
|
+
if (this.disposed)
|
|
192
|
+
return;
|
|
193
|
+
try {
|
|
194
|
+
this.resizeToDisplay();
|
|
195
|
+
}
|
|
196
|
+
catch { /* keep the current backing size on transient reads */ }
|
|
197
|
+
})
|
|
198
|
+
: undefined;
|
|
110
199
|
this.resizeCanvas(this.width, this.height);
|
|
111
200
|
}
|
|
112
|
-
static
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
201
|
+
static create(options = {}) {
|
|
202
|
+
return createRenderer(options);
|
|
203
|
+
}
|
|
204
|
+
/** C-28 monitor (PRD-01 Phase 6): lane capture reads cpuSubmitMs percentiles. */
|
|
205
|
+
get frameStats() {
|
|
206
|
+
return this.frameStatsMonitor;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* PRD-02 S12 (lane-01 half): render `source` into one reflection-probe face.
|
|
210
|
+
* Signature matches `ReflectionFaceRenderer` (probes/ReflectionProbeSystem.ts)
|
|
211
|
+
* so it can be passed straight to the probe system:
|
|
212
|
+
* new ReflectionProbeSystem(..., (face, target, vp) => renderer.renderProbeFace(scene, face, target, vp))
|
|
213
|
+
* - `target` may be any size (128/256 px faces): the probe frame is sized to
|
|
214
|
+
* it, so RENDER_TARGET_VIEWPORT_MISMATCH does not apply.
|
|
215
|
+
* - Call it OUTSIDE a frame (before `render`): it opens and closes its own
|
|
216
|
+
* device frame and throws FRAME_ALREADY_ACTIVE if one is open (no nesting).
|
|
217
|
+
* - It uses a private RenderGraph, so the main frame's graph is not cleared.
|
|
218
|
+
* - Linear output, scene lights + environment, no shadows / post / output
|
|
219
|
+
* encode / frame contributors (a probe is radiance input to shading).
|
|
220
|
+
* Flag-independent; nothing calls it unless a probe system does.
|
|
221
|
+
*/
|
|
222
|
+
renderProbeFace(source, face, target, viewProjection) {
|
|
223
|
+
if (target.disposed) {
|
|
224
|
+
throw new RenderDeviceError("Probe face target is disposed", "RENDER_TARGET_DISPOSED", { face });
|
|
225
|
+
}
|
|
226
|
+
const vp = toMat4(viewProjection, "viewProjection", `probe face ${face}`);
|
|
227
|
+
sceneFromSource(source)?.updateWorldTransforms();
|
|
228
|
+
const items = collectRenderItems(source, vp).filter((item) => !item.environmentCube);
|
|
229
|
+
const split = splitForwardItems(items, undefined);
|
|
230
|
+
const shared = {
|
|
231
|
+
items: split.opaque,
|
|
232
|
+
lights: collectRenderLights(source),
|
|
233
|
+
environmentLighting: collectEnvironmentLighting(source),
|
|
234
|
+
environmentFog: collectEnvironmentFog(source),
|
|
235
|
+
cameraViewProjectionMatrix: vp,
|
|
236
|
+
outputColorSpace: "linear",
|
|
237
|
+
qualityTier: this.liveQualityTier()?.settings
|
|
238
|
+
};
|
|
239
|
+
const graph = (this.probeGraph ??= new RenderGraph());
|
|
240
|
+
graph.clear();
|
|
241
|
+
// A probe face has no screen-space transmission input: transmission items
|
|
242
|
+
// draw with the opaque set; transparent items keep splitForwardItems' sort order.
|
|
243
|
+
graph.addPass(new ForwardPass({ ...shared, items: [...split.opaque, ...split.transmission], framePass: { name: "prd01.probe.opaque", writes: ["aura.probe.color"] } }));
|
|
244
|
+
if (split.transparent.length > 0) {
|
|
245
|
+
graph.addPass(new ForwardPass({ ...shared, items: split.transparent.map((entry) => entry.item), framePass: { name: "prd01.probe.transparent", reads: ["aura.probe.color"], writes: ["aura.probe.color"] } }));
|
|
246
|
+
}
|
|
247
|
+
const previous = this.device.getRenderTarget?.() ?? null;
|
|
248
|
+
this.device.beginFrame(target.width, target.height);
|
|
249
|
+
try {
|
|
250
|
+
this.device.setRenderTarget(target);
|
|
251
|
+
this.device.clear(this.clearColor);
|
|
252
|
+
graph.execute({ device: this.device, width: target.width, height: target.height });
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
this.device.setRenderTarget(previous);
|
|
256
|
+
this.device.endFrame();
|
|
257
|
+
graph.clear();
|
|
116
258
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
259
|
+
return this.device.getDiagnostics();
|
|
260
|
+
}
|
|
261
|
+
/** C-28 (#91): run `fn` under the frameStats "post" scope when a monitor exists. */
|
|
262
|
+
scopePost(fn) {
|
|
263
|
+
return this.frameStatsMonitor ? this.frameStatsMonitor.scope("post", fn) : fn();
|
|
264
|
+
}
|
|
265
|
+
/** C-05: current output configuration (`app.setOutput` / `renderer.output` seam). */
|
|
266
|
+
get output() {
|
|
267
|
+
return this.outputOptions;
|
|
268
|
+
}
|
|
269
|
+
/** C-05: merge output options; takes effect on the next frame under `A3D_QR_CORE_OUTPUT`. */
|
|
270
|
+
setOutput(options) {
|
|
271
|
+
this.outputOptions = { ...this.outputOptions, ...options };
|
|
272
|
+
}
|
|
273
|
+
/** C-05: install/replace the juice overlay (pass `null` to clear). */
|
|
274
|
+
setOutputOverlay(overlay) {
|
|
275
|
+
this.outputOptions = { ...this.outputOptions, overlay: overlay ?? undefined };
|
|
276
|
+
}
|
|
277
|
+
/** What the last OutputPass call actually applied (C-05 diagnostics; null flag-off). */
|
|
278
|
+
get appliedOutput() {
|
|
279
|
+
return this.lastAppliedOutput;
|
|
124
280
|
}
|
|
125
281
|
getFeatureReport() {
|
|
126
282
|
return createRendererFeatureReport(this.device);
|
|
127
283
|
}
|
|
284
|
+
/** C-29 seam (PR 0b): renderer-side device-lifecycle delegates. */
|
|
285
|
+
onDeviceLost(listener) {
|
|
286
|
+
return subscribeRendererDeviceLost(this.device, listener);
|
|
287
|
+
}
|
|
288
|
+
onDeviceRestored(listener) {
|
|
289
|
+
return subscribeRendererDeviceRestored(this.device, listener);
|
|
290
|
+
}
|
|
291
|
+
isDeviceLost() {
|
|
292
|
+
return rendererDeviceIsLost(this.device);
|
|
293
|
+
}
|
|
128
294
|
resize(width, height) {
|
|
129
295
|
this.assertAlive();
|
|
130
296
|
if (width <= 0 || height <= 0 || !Number.isInteger(width) || !Number.isInteger(height)) {
|
|
@@ -143,7 +309,14 @@ export class Renderer {
|
|
|
143
309
|
}
|
|
144
310
|
const cssWidth = options.cssWidth ?? readCanvasCssSize(this.canvas, "width");
|
|
145
311
|
const cssHeight = options.cssHeight ?? readCanvasCssSize(this.canvas, "height");
|
|
146
|
-
|
|
312
|
+
// §6.9: explicit override ?? resolution.pixelRatio ?? min(dpr, tier cap) —
|
|
313
|
+
// identical to `globalThis.devicePixelRatio` while `resolution`/`tier` are unset.
|
|
314
|
+
const devicePixelRatio = resolveCanvasPixelRatio({
|
|
315
|
+
devicePixelRatio: globalThis.devicePixelRatio ?? 1,
|
|
316
|
+
tier: this.qualityTier ?? this.liveQualityTier()?.settings ?? { maxPixelRatio: Number.POSITIVE_INFINITY },
|
|
317
|
+
explicit: options.devicePixelRatio,
|
|
318
|
+
resolution: this.resolutionOptions
|
|
319
|
+
});
|
|
147
320
|
if (![cssWidth, cssHeight, devicePixelRatio].every(Number.isFinite) || cssWidth <= 0 || cssHeight <= 0 || devicePixelRatio <= 0) {
|
|
148
321
|
throw new RenderDeviceError("Display size and DPR must be finite positive values", "INVALID_DISPLAY_SIZE", {
|
|
149
322
|
cssWidth,
|
|
@@ -159,6 +332,43 @@ export class Renderer {
|
|
|
159
332
|
}
|
|
160
333
|
return { resized, cssWidth, cssHeight, devicePixelRatio, width, height };
|
|
161
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* §6.9 manual render-scale ceiling (AuraPerformanceQuality.resolutionScale,
|
|
337
|
+
* request Q-15-1). Caps the scene target only; the canvas backing size is
|
|
338
|
+
* untouched. `renderScale` reports `min(ceiling, governor)`.
|
|
339
|
+
*/
|
|
340
|
+
setRenderScaleCeiling(scale) {
|
|
341
|
+
this.assertAlive();
|
|
342
|
+
if (!Number.isFinite(scale) || scale <= 0) {
|
|
343
|
+
throw new RenderDeviceError("Render-scale ceiling must be a positive finite value", "INVALID_RENDER_SCALE", { scale });
|
|
344
|
+
}
|
|
345
|
+
this.renderScaleCeiling = Math.min(scale, 1);
|
|
346
|
+
}
|
|
347
|
+
get renderScaleCeilingValue() {
|
|
348
|
+
return this.renderScaleCeiling;
|
|
349
|
+
}
|
|
350
|
+
/** Effective render scale: `min(setRenderScaleCeiling, ResolutionGovernor)`. */
|
|
351
|
+
get renderScale() {
|
|
352
|
+
return Math.min(this.renderScaleCeiling, this.resolutionGovernor?.scale ?? 1);
|
|
353
|
+
}
|
|
354
|
+
/** C-31 `resolution` section values observed by the renderer. */
|
|
355
|
+
get resolutionReport() {
|
|
356
|
+
const cssWidth = this.canvas ? readCanvasCssSize(this.canvas, "width") : this.width;
|
|
357
|
+
return {
|
|
358
|
+
pixelRatio: cssWidth > 0 ? this.width / cssWidth : 1,
|
|
359
|
+
renderScale: this.renderScale,
|
|
360
|
+
renderScaleCeiling: this.renderScaleCeiling,
|
|
361
|
+
backingWidth: this.width,
|
|
362
|
+
backingHeight: this.height
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Feeds one frame's timings to the resolution governor (C-28 `gpuMs` wins
|
|
367
|
+
* over the CPU interval when lane 11's timer queries provide it).
|
|
368
|
+
*/
|
|
369
|
+
sampleResolutionGovernor(frameMs, gpuMs) {
|
|
370
|
+
return this.resolutionGovernor?.sample(frameMs, gpuMs) ?? this.renderScale;
|
|
371
|
+
}
|
|
162
372
|
startAnimationLoop(callback) {
|
|
163
373
|
this.assertAlive();
|
|
164
374
|
this.animationLoop?.stop();
|
|
@@ -168,10 +378,42 @@ export class Renderer {
|
|
|
168
378
|
return loop;
|
|
169
379
|
}
|
|
170
380
|
temporalHistory;
|
|
381
|
+
/** PRD-03 Phase 4: camera position at the last temporal frame — the >5 m
|
|
382
|
+
* auto-cut detector. */
|
|
383
|
+
lastTemporalCameraPosition;
|
|
171
384
|
unsubscribeTemporalDeviceLoss;
|
|
172
|
-
|
|
385
|
+
/**
|
|
386
|
+
* PRD-03 §8.6 (flag-on): the v2 S5/S7 stages own the history ping-pong.
|
|
387
|
+
* When a frame was served by another chain (v2 modules still loading, an
|
|
388
|
+
* unfusable pass list), the legacy native TAA wrote its own bytes (alpha =
|
|
389
|
+
* depth, presentation-tuned) into the history target; promoting that seeded
|
|
390
|
+
* the v2 resolve with garbage. Such frames — and TAA frames on which S5
|
|
391
|
+
* did not resolve (`markTaaHistoryWritten`) — reset the history instead.
|
|
392
|
+
*/
|
|
393
|
+
commitTemporalHistory(taa) {
|
|
394
|
+
const written = consumeTaaHistoryWritten();
|
|
395
|
+
if (rendererQrFlags(this.device).on("A3D_QR_POST") && (postGraphV2LastOutcome() !== "v2" || (taa && !written))) {
|
|
396
|
+
this.temporalHistory.reset();
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
this.temporalHistory.commit();
|
|
400
|
+
}
|
|
401
|
+
resetTemporalHistory(_reason = "explicit-reset") { this.temporalHistory.reset(); this.lastTemporalCameraPosition = undefined; }
|
|
173
402
|
render(sourceOrInput, camera) {
|
|
403
|
+
// T0-28: ambient `rendererQrFlags()` readers (Lighting, Background, post…)
|
|
404
|
+
// see this renderer's flags for the duration of the synchronous frame.
|
|
405
|
+
return withRendererQrFlags(this.device, () => this.renderFrame(sourceOrInput, camera));
|
|
406
|
+
}
|
|
407
|
+
renderFrame(sourceOrInput, camera) {
|
|
174
408
|
this.assertAlive();
|
|
409
|
+
// §6.9: FrameStats samples every render while a governor exists (resolution opt-in).
|
|
410
|
+
this.frameStatsMonitor?.begin(typeof performance !== "undefined" ? performance.now() : Date.now());
|
|
411
|
+
// T0-06: reset the per-frame sync-compile bound for this render.
|
|
412
|
+
{
|
|
413
|
+
const flags = rendererQrFlags(this.device);
|
|
414
|
+
if (qrGeneratedProgramsOn(flags))
|
|
415
|
+
rendererProgramCache(this.device, flags).beginFrame?.();
|
|
416
|
+
}
|
|
175
417
|
const { source, camera: inputCamera } = normalizeRendererInput(sourceOrInput, camera);
|
|
176
418
|
sceneFromSource(source)?.updateWorldTransforms();
|
|
177
419
|
const cameraPolicy = collectCameraPolicy(source);
|
|
@@ -184,7 +426,7 @@ export class Renderer {
|
|
|
184
426
|
throw new RenderDeviceError("RenderSource requires an explicit camera but none was supplied or found in the scene.", "CAMERA_REQUIRED");
|
|
185
427
|
}
|
|
186
428
|
let cameraViewProjection = resolvedCamera?.viewProjectionMatrix;
|
|
187
|
-
const collectedItems = collectRenderItemsWithDiagnostics(source, cameraViewProjection, resolvedCamera?.camera);
|
|
429
|
+
const collectedItems = collectRenderItemsWithDiagnostics(source, cameraViewProjection, resolvedCamera?.camera, rendererQrFlags().on("A3D_QR_LIGHTING"));
|
|
188
430
|
const collectionDiagnostics = collectedItems.diagnostics;
|
|
189
431
|
let items = collectedItems.items;
|
|
190
432
|
const lights = collectRenderLights(source);
|
|
@@ -193,10 +435,26 @@ export class Renderer {
|
|
|
193
435
|
const environmentFog = collectEnvironmentFog(source);
|
|
194
436
|
const explicitShadowMap = collectForwardShadowMap(source);
|
|
195
437
|
const shadowOptions = collectRendererShadowOptions(source);
|
|
438
|
+
// C-02/T0-06: sync-path warm — kick generated-program compiles for the
|
|
439
|
+
// exact draw feature records before the pass runs (bounded per frame).
|
|
440
|
+
this.warmGeneratedProgramsSync(items, lights, environmentLighting, environmentFog, explicitShadowMap, cameraViewProjection);
|
|
196
441
|
const sourceCameraPosition = collectSourceCameraPosition(source);
|
|
197
442
|
const explicitRenderTarget = collectRenderTarget(source);
|
|
198
443
|
validateExplicitRenderTarget(explicitRenderTarget, this.width, this.height);
|
|
199
444
|
let cameraPosition = sourceCameraPosition ?? resolvedCamera?.cameraPosition;
|
|
445
|
+
// C-05/T0-07: decide the frame's output route before the hooks exist, so
|
|
446
|
+
// contributors see the same v2/legacy resource names the graph writes.
|
|
447
|
+
const route = resolveCoreOutputPostRoute(qrCoreOutputOn(rendererQrFlags(this.device)), collectPostprocess(source));
|
|
448
|
+
const frameHooks = createRendererFrameHooks({
|
|
449
|
+
device: this.device,
|
|
450
|
+
width: this.width,
|
|
451
|
+
height: this.height,
|
|
452
|
+
source,
|
|
453
|
+
camera: toFrameCamera(resolvedCamera, cameraViewProjection, cameraPosition),
|
|
454
|
+
// PRD 11: the app's live C-27 tier (A3D_QR_TIERS); undefined → high.
|
|
455
|
+
tier: this.liveQualityTier()?.settings,
|
|
456
|
+
...(route.skipped ? { flags: withCoreOutputOff(rendererQrFlags(this.device)) } : {})
|
|
457
|
+
});
|
|
200
458
|
if (!resolvedCamera && cameraPolicy === "auto-frame") {
|
|
201
459
|
const autoFrame = createAutoFrameCamera(source, items, this.width, this.height);
|
|
202
460
|
if (autoFrame) {
|
|
@@ -206,11 +464,24 @@ export class Renderer {
|
|
|
206
464
|
}
|
|
207
465
|
}
|
|
208
466
|
let postprocess = collectPostprocess(source);
|
|
209
|
-
if (!postprocess?.temporal || (!postprocess.motionBlur && !postprocess.taa))
|
|
467
|
+
if (!postprocess?.temporal || (!postprocess.motionBlur && !postprocess.taa)) {
|
|
210
468
|
this.temporalHistory.reset();
|
|
469
|
+
this.lastTemporalCameraPosition = undefined;
|
|
470
|
+
}
|
|
211
471
|
const ownedTargets = [];
|
|
212
472
|
const ownedShadowPasses = [];
|
|
213
473
|
this.graph.clear();
|
|
474
|
+
// C-05 (§8.4): under A3D_QR_CORE_OUTPUT encode happens once, in OutputPass.
|
|
475
|
+
// A configured legacy post chain still encodes itself (lane 03 migrates it
|
|
476
|
+
// into post-hdr contributors, Q-03-2/Q-03-3), so the frame takes the legacy
|
|
477
|
+
// chain and bypasses OutputPass: encode stays single, and the authored
|
|
478
|
+
// effects (bloom) are kept instead of dropped. The bypass is reported.
|
|
479
|
+
const qrOutput = route.qrOutput;
|
|
480
|
+
// §6.2.7: lane passes encode in-shader only on the legacy LDR path.
|
|
481
|
+
frameHooks.setOutputColorSpace(postprocess || qrOutput ? "linear" : "srgb");
|
|
482
|
+
this.lastPostSkipped = route.skipped;
|
|
483
|
+
if (route.skipped)
|
|
484
|
+
this.warnPostLegacyRoute(route.skipped);
|
|
214
485
|
let postprocessTargetFormat;
|
|
215
486
|
if (postprocess) {
|
|
216
487
|
const format = postprocess.targetFormat ?? defaultPostprocessTargetFormat(this.device, postprocess);
|
|
@@ -248,19 +519,52 @@ export class Renderer {
|
|
|
248
519
|
const forwardTarget = this.ensureForwardColorTarget(format, requiresDepthTexture, sampleCount);
|
|
249
520
|
ownedTargets.push(forwardTarget);
|
|
250
521
|
this.device.setRenderTarget(forwardTarget);
|
|
522
|
+
frameHooks.setForwardTarget(forwardTarget);
|
|
523
|
+
}
|
|
524
|
+
else if (qrOutput) {
|
|
525
|
+
// C-05: the v2 scene always renders into the HDR target — also on the
|
|
526
|
+
// no-effects route (§8.4: encode once, in OutputPass). The governor's
|
|
527
|
+
// renderScale applies to this target only; OutputPass upsamples.
|
|
528
|
+
const probed = probeHdrTargetFormat(this.device);
|
|
529
|
+
const format = probed === "rgba8" ? "rgba8" : "rgba16f";
|
|
530
|
+
const hdrTarget = this.ensureHdrSceneTarget(format, this.outputOptions.backgroundCoverage === true);
|
|
531
|
+
ownedTargets.push(hdrTarget);
|
|
532
|
+
this.device.setRenderTarget(hdrTarget);
|
|
533
|
+
frameHooks.setForwardTarget(hdrTarget);
|
|
251
534
|
}
|
|
252
535
|
this.device.beginFrame(this.width, this.height);
|
|
253
536
|
try {
|
|
254
537
|
this.lastShadowEvidence = null;
|
|
255
|
-
|
|
538
|
+
items = frameHooks.collect(items);
|
|
539
|
+
// C-28 (#90): scope the shadow-phase CPU submission for frameStats.
|
|
540
|
+
// 02-S5: under A3D_QR_LIGHTING casters come from the pre-cull set
|
|
541
|
+
// (frustum-culled casters rejoin); flag-off keeps the visible items only.
|
|
542
|
+
const shadowCasterItems = rendererQrFlags().on("A3D_QR_LIGHTING")
|
|
543
|
+
? [
|
|
544
|
+
...items,
|
|
545
|
+
...culledCastersReachingView(collectedItems.culledShadowCasters, items, collectedItems.cullingFrustum, shadowSunTravel(lights))
|
|
546
|
+
].filter((item) => item.castShadow !== false)
|
|
547
|
+
: items.filter((item) => item.castShadow !== false);
|
|
548
|
+
const rendererShadowMap = this.frameStatsMonitor?.scope("shadow", () => explicitShadowMap ?? this.executeRendererShadowMap({
|
|
256
549
|
shadowOptions,
|
|
257
550
|
source,
|
|
258
|
-
items:
|
|
551
|
+
items: shadowCasterItems,
|
|
259
552
|
lights,
|
|
260
553
|
ownedTargets,
|
|
261
554
|
ownedShadowPasses,
|
|
262
|
-
camera: resolvedCamera?.camera
|
|
555
|
+
camera: resolvedCamera?.camera,
|
|
556
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
557
|
+
})) ?? explicitShadowMap ?? this.executeRendererShadowMap({
|
|
558
|
+
shadowOptions,
|
|
559
|
+
source,
|
|
560
|
+
items: shadowCasterItems,
|
|
561
|
+
lights,
|
|
562
|
+
ownedTargets,
|
|
563
|
+
ownedShadowPasses,
|
|
564
|
+
camera: resolvedCamera?.camera,
|
|
565
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
263
566
|
});
|
|
567
|
+
frameHooks.addPasses(this.graph, "shadows", items);
|
|
264
568
|
this.lastShadowEvidence = rendererShadowMap ? {
|
|
265
569
|
lightMatrix: Array.from(rendererShadowMap.lightMatrix),
|
|
266
570
|
cascades: rendererShadowMap.cascades?.map(c => ({ index: c.index, near: c.near, far: c.far, lightMatrix: Array.from(c.shadowMap.lightMatrix) })) ?? [],
|
|
@@ -276,46 +580,162 @@ export class Renderer {
|
|
|
276
580
|
}
|
|
277
581
|
this.device.setRenderTarget(forwardTarget);
|
|
278
582
|
}
|
|
583
|
+
else if (qrOutput) {
|
|
584
|
+
// §9.1: clear the HDR target to the linear background color (no ACES
|
|
585
|
+
// pre-inversion — OutputPass owns the whole encode).
|
|
586
|
+
this.device.setRenderTarget(ownedTargets[0] ?? null);
|
|
587
|
+
}
|
|
279
588
|
else {
|
|
280
589
|
this.device.setRenderTarget(explicitRenderTarget ?? null);
|
|
281
590
|
}
|
|
282
|
-
this.device.clear(this.clearColor);
|
|
591
|
+
this.device.clear(qrOutput && !postprocess ? this.outputClearColor ?? this.clearColor : this.clearColor);
|
|
283
592
|
if (environmentBackground) {
|
|
284
593
|
this.graph.addPass(new EnvironmentBackgroundPass({
|
|
285
594
|
...environmentBackground,
|
|
286
|
-
outputColorSpace: postprocess ? "linear" : environmentBackground.outputColorSpace,
|
|
595
|
+
outputColorSpace: postprocess || qrOutput ? "linear" : environmentBackground.outputColorSpace,
|
|
287
596
|
inverseViewProjectionMatrix: environmentBackground.inverseViewProjectionMatrix ?? invertMat4(cameraViewProjection ?? identityMat4()),
|
|
288
597
|
shaderLibrary: this.shaderLibrary
|
|
289
598
|
}));
|
|
599
|
+
frameHooks.addPasses(this.graph, "background", items);
|
|
600
|
+
}
|
|
601
|
+
// PRD-03 Phase 4 (flag-on): >5 m of camera translation within one frame
|
|
602
|
+
// is a cut — reprojection would smear everything, so seed fresh history.
|
|
603
|
+
let temporalPrevVp;
|
|
604
|
+
let rasterViewProjection = cameraViewProjection;
|
|
605
|
+
let temporalAutoReset = false;
|
|
606
|
+
if (postprocess?.temporal && (postprocess.motionBlur || postprocess.taa) && cameraPosition && rendererQrFlags(this.device).on("A3D_QR_POST")) {
|
|
607
|
+
const prev = this.lastTemporalCameraPosition;
|
|
608
|
+
if (prev) {
|
|
609
|
+
const dx = cameraPosition[0] - prev[0];
|
|
610
|
+
const dy = cameraPosition[1] - prev[1];
|
|
611
|
+
const dz = cameraPosition[2] - prev[2];
|
|
612
|
+
temporalAutoReset = dx * dx + dy * dy + dz * dz > 25;
|
|
613
|
+
}
|
|
614
|
+
this.lastTemporalCameraPosition = [cameraPosition[0], cameraPosition[1], cameraPosition[2]];
|
|
290
615
|
}
|
|
291
616
|
if (postprocess?.temporal && (postprocess.motionBlur || postprocess.taa)) {
|
|
292
617
|
if (postprocess.execution === "cpu-deterministic" || !this.device.presentLdrPostprocess)
|
|
293
618
|
throw new RenderDeviceError("Renderer temporal effects require native GPU presentation", "TEMPORAL_NATIVE_REQUIRED");
|
|
294
|
-
const temporal = this.temporalHistory.prepare(this.device, this.width, this.height, items, cameraViewProjection, { ...postprocess.temporal, jitter: Boolean(postprocess.taa) });
|
|
619
|
+
const temporal = this.temporalHistory.prepare(this.device, this.width, this.height, items, cameraViewProjection, { ...postprocess.temporal, jitter: Boolean(postprocess.taa), ...(temporalAutoReset ? { reset: true } : {}) });
|
|
620
|
+
temporalPrevVp = temporal.v2?.previous;
|
|
621
|
+
// PRD-03 §8.6 (flag-on): generated programs project through the
|
|
622
|
+
// AuraFrame `u_viewProjection`, not the per-item MVP, so the TAA
|
|
623
|
+
// sub-pixel jitter has to ride the camera matrix too — otherwise the
|
|
624
|
+
// raster never moves and S5 has nothing to resolve.
|
|
625
|
+
if (temporal.v2)
|
|
626
|
+
rasterViewProjection = temporal.v2.jittered;
|
|
295
627
|
items = this.temporalHistory.renderItems;
|
|
296
628
|
postprocess = { ...postprocess, ...(postprocess.motionBlur ? { motionBlur: { ...postprocess.motionBlur, temporal } } : {}), ...(postprocess.taa ? { taa: { ...postprocess.taa, temporal } } : {}) };
|
|
297
629
|
this.device.setRenderTarget(ownedTargets[0]);
|
|
298
630
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
cameraPosition
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
631
|
+
if (qrOutput) {
|
|
632
|
+
// §9.1 v2 frame order: opaque → after-opaque (scene-depth copy,
|
|
633
|
+
// contributors) → transmission → transmissive → transparent (engine
|
|
634
|
+
// items + contributor TransparentQueueItems interleaved by sortDepth)
|
|
635
|
+
// → after-transparent.
|
|
636
|
+
const hdrTarget = ownedTargets[0] ?? null;
|
|
637
|
+
const coverage = this.outputOptions.backgroundCoverage === true;
|
|
638
|
+
const split = splitForwardItems(items, cameraPosition ?? undefined);
|
|
639
|
+
const shared = {
|
|
640
|
+
items: split.opaque,
|
|
641
|
+
lights,
|
|
642
|
+
environmentLighting,
|
|
643
|
+
environmentFog,
|
|
644
|
+
inputColorResource: environmentBackground ? ENVIRONMENT_BACKGROUND_COLOR_RESOURCE : undefined,
|
|
645
|
+
shadowMap: rendererShadowMap,
|
|
646
|
+
cameraPosition,
|
|
647
|
+
cameraViewMatrix: resolvedCamera?.viewMatrix,
|
|
648
|
+
cameraViewProjectionMatrix: rasterViewProjection,
|
|
649
|
+
outputColorSpace: "linear",
|
|
650
|
+
shaderLibrary: this.shaderLibrary,
|
|
651
|
+
backgroundCoverage: coverage,
|
|
652
|
+
qualityTier: this.liveQualityTier()?.settings
|
|
653
|
+
};
|
|
654
|
+
// The graph enforces unique names + single-producer writes; per-phase
|
|
655
|
+
// resources chain the order, and `aura.scene.color` is written once —
|
|
656
|
+
// by the final interleaved transparent pass.
|
|
657
|
+
this.graph.addPass(new ForwardPass({ ...shared, framePass: { name: "prd01.opaque", writes: ["aura.scene.color.opaque"] } }));
|
|
658
|
+
if (hdrTarget?.depthTexture) {
|
|
659
|
+
const depthCopy = this.ensureSceneDepthCopy();
|
|
660
|
+
frameHooks.setSceneDepthCopy(depthCopy);
|
|
661
|
+
this.graph.addPass(new SceneDepthCopyPass(hdrTarget, depthCopy));
|
|
662
|
+
}
|
|
663
|
+
frameHooks.addPasses(this.graph, "after-opaque", items);
|
|
664
|
+
frameHooks.addPasses(this.graph, "transmission", items);
|
|
665
|
+
let lastColorResource = "aura.scene.color.opaque";
|
|
666
|
+
if (split.transmission.length > 0) {
|
|
667
|
+
lastColorResource = "aura.scene.color.transmission";
|
|
668
|
+
this.graph.addPass(new ForwardPass({
|
|
669
|
+
...shared,
|
|
670
|
+
items: split.transmission,
|
|
671
|
+
framePass: { name: "prd01.transmission", reads: ["aura.scene.color.opaque"], writes: [lastColorResource] }
|
|
672
|
+
}));
|
|
673
|
+
}
|
|
674
|
+
frameHooks.addTransparentContributorPasses(this.graph, items);
|
|
675
|
+
const { ctx: contributorCtx, queues } = frameHooks.transparentQueues(items);
|
|
676
|
+
this.graph.addPass(new InterleavedTransparentPass({ ...shared, items: [] }, split.transparent, queues, contributorCtx, [lastColorResource]));
|
|
677
|
+
frameHooks.addPasses(this.graph, "after-transparent", items);
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
this.graph.addPass(new ForwardPass({
|
|
681
|
+
items,
|
|
682
|
+
lights,
|
|
683
|
+
environmentLighting,
|
|
684
|
+
environmentFog,
|
|
685
|
+
inputColorResource: environmentBackground ? ENVIRONMENT_BACKGROUND_COLOR_RESOURCE : undefined,
|
|
686
|
+
shadowMap: rendererShadowMap,
|
|
687
|
+
cameraPosition,
|
|
688
|
+
cameraViewMatrix: resolvedCamera?.viewMatrix,
|
|
689
|
+
cameraViewProjectionMatrix: rasterViewProjection,
|
|
690
|
+
outputColorSpace: postprocess ? "linear" : "srgb",
|
|
691
|
+
shaderLibrary: this.shaderLibrary
|
|
692
|
+
}));
|
|
693
|
+
frameHooks.addPasses(this.graph, "after-opaque", items);
|
|
694
|
+
frameHooks.addPasses(this.graph, "transmission", items);
|
|
695
|
+
frameHooks.addPasses(this.graph, "transparent", items);
|
|
696
|
+
frameHooks.addPasses(this.graph, "after-transparent", items);
|
|
697
|
+
}
|
|
698
|
+
// C-28 (#90): scope the forward-phase CPU submission for frameStats.
|
|
699
|
+
if (this.frameStatsMonitor) {
|
|
700
|
+
this.frameStatsMonitor.scope("forward", () => this.graph.execute({ device: this.device, width: this.width, height: this.height }));
|
|
701
|
+
}
|
|
702
|
+
else {
|
|
703
|
+
this.graph.execute({ device: this.device, width: this.width, height: this.height });
|
|
704
|
+
}
|
|
313
705
|
if (postprocess) {
|
|
314
706
|
postprocess = bindRendererSsrProjection(postprocess, cameraViewProjection ?? identityMat4());
|
|
315
|
-
|
|
707
|
+
const frameCamera = toFrameCamera(resolvedCamera, cameraViewProjection, cameraPosition);
|
|
708
|
+
postprocess = {
|
|
709
|
+
...postprocess,
|
|
710
|
+
cameraFrame: frameCamera && temporalPrevVp ? { ...frameCamera, previousViewProjectionMatrix: temporalPrevVp } : frameCamera,
|
|
711
|
+
postFrameContext: {
|
|
712
|
+
source,
|
|
713
|
+
items,
|
|
714
|
+
sceneDepth: {
|
|
715
|
+
texture: ownedTargets[0]?.depthTexture ?? null,
|
|
716
|
+
available: (ownedTargets[0]?.depthTexture ?? null) !== null,
|
|
717
|
+
linearize: {
|
|
718
|
+
near: frameCamera?.near ?? 0.1,
|
|
719
|
+
far: frameCamera?.far ?? 1000,
|
|
720
|
+
orthographic: frameCamera?.projection === "orthographic"
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
};
|
|
725
|
+
// C-28 (#91): the post-hdr contributors and the postprocess chain report
|
|
726
|
+
// under the "post" scope (lane 03 owns the chain internals).
|
|
727
|
+
this.scopePost(() => {
|
|
728
|
+
frameHooks.runPhase("post-hdr", items, postprocess !== undefined);
|
|
729
|
+
this.executePostprocess(postprocess, ownedTargets, explicitRenderTarget);
|
|
730
|
+
});
|
|
316
731
|
if (postprocess.temporal && (postprocess.motionBlur || postprocess.taa))
|
|
317
|
-
this.
|
|
732
|
+
this.commitTemporalHistory(Boolean(postprocess.taa));
|
|
733
|
+
}
|
|
734
|
+
else if (qrOutput) {
|
|
735
|
+
this.scopePost(() => frameHooks.runPhase("post-hdr", items, true));
|
|
736
|
+
this.executeOutputPass(frameHooks, items, ownedTargets[0] ?? null, explicitRenderTarget);
|
|
318
737
|
}
|
|
738
|
+
frameHooks.runPhase("after-output", items);
|
|
319
739
|
}
|
|
320
740
|
catch (error) {
|
|
321
741
|
this.lastShadowEvidence = null;
|
|
@@ -325,6 +745,10 @@ export class Renderer {
|
|
|
325
745
|
}
|
|
326
746
|
finally {
|
|
327
747
|
this.device.endFrame();
|
|
748
|
+
if (this.resolutionGovernor && this.frameStatsMonitor) {
|
|
749
|
+
const frameSample = this.frameStatsMonitor.end();
|
|
750
|
+
this.resolutionGovernor.sample(frameSample.intervalMs, frameSample.gpuMs);
|
|
751
|
+
}
|
|
328
752
|
for (const shadowPass of ownedShadowPasses) {
|
|
329
753
|
shadowPass.dispose();
|
|
330
754
|
}
|
|
@@ -347,6 +771,13 @@ export class Renderer {
|
|
|
347
771
|
}
|
|
348
772
|
async renderAsync(sourceOrInput, camera) {
|
|
349
773
|
this.assertAlive();
|
|
774
|
+
this.frameStatsMonitor?.begin(typeof performance !== "undefined" ? performance.now() : Date.now());
|
|
775
|
+
// T0-06: reset the per-frame sync-compile bound for this render.
|
|
776
|
+
{
|
|
777
|
+
const flags = rendererQrFlags(this.device);
|
|
778
|
+
if (qrGeneratedProgramsOn(flags))
|
|
779
|
+
rendererProgramCache(this.device, flags).beginFrame?.();
|
|
780
|
+
}
|
|
350
781
|
const { source, camera: inputCamera } = normalizeRendererInput(sourceOrInput, camera);
|
|
351
782
|
sceneFromSource(source)?.updateWorldTransforms();
|
|
352
783
|
const cameraPolicy = collectCameraPolicy(source);
|
|
@@ -359,7 +790,7 @@ export class Renderer {
|
|
|
359
790
|
throw new RenderDeviceError("RenderSource requires an explicit camera but none was supplied or found in the scene.", "CAMERA_REQUIRED");
|
|
360
791
|
}
|
|
361
792
|
let cameraViewProjection = resolvedCamera?.viewProjectionMatrix;
|
|
362
|
-
const collectedItems = collectRenderItemsWithDiagnostics(source, cameraViewProjection, resolvedCamera?.camera);
|
|
793
|
+
const collectedItems = collectRenderItemsWithDiagnostics(source, cameraViewProjection, resolvedCamera?.camera, rendererQrFlags().on("A3D_QR_LIGHTING"));
|
|
363
794
|
const collectionDiagnostics = collectedItems.diagnostics;
|
|
364
795
|
let items = collectedItems.items;
|
|
365
796
|
const lights = collectRenderLights(source);
|
|
@@ -368,10 +799,29 @@ export class Renderer {
|
|
|
368
799
|
const environmentFog = collectEnvironmentFog(source);
|
|
369
800
|
const explicitShadowMap = collectForwardShadowMap(source);
|
|
370
801
|
const shadowOptions = collectRendererShadowOptions(source);
|
|
802
|
+
// C-02 (PRD-01 §403): pre-render warm-then-block compile of the generated
|
|
803
|
+
// programs this scene needs. Flag-off: nothing (sync path untouched).
|
|
804
|
+
await this.warmGeneratedPrograms(items, lights, environmentLighting, environmentFog, explicitShadowMap, cameraViewProjection);
|
|
805
|
+
if (this.disposed || this.device.disposed) {
|
|
806
|
+
return withRendererFrameDiagnostics(this.device.getDiagnostics(), collectionDiagnostics);
|
|
807
|
+
}
|
|
371
808
|
const sourceCameraPosition = collectSourceCameraPosition(source);
|
|
372
809
|
const explicitRenderTarget = collectRenderTarget(source);
|
|
373
810
|
validateExplicitRenderTarget(explicitRenderTarget, this.width, this.height);
|
|
374
811
|
let cameraPosition = sourceCameraPosition ?? resolvedCamera?.cameraPosition;
|
|
812
|
+
// C-05/T0-07: decide the frame's output route before the hooks exist, so
|
|
813
|
+
// contributors see the same v2/legacy resource names the graph writes.
|
|
814
|
+
const route = resolveCoreOutputPostRoute(qrCoreOutputOn(rendererQrFlags(this.device)), collectPostprocess(source));
|
|
815
|
+
const frameHooks = createRendererFrameHooks({
|
|
816
|
+
device: this.device,
|
|
817
|
+
width: this.width,
|
|
818
|
+
height: this.height,
|
|
819
|
+
source,
|
|
820
|
+
camera: toFrameCamera(resolvedCamera, cameraViewProjection, cameraPosition),
|
|
821
|
+
// PRD 11: the app's live C-27 tier (A3D_QR_TIERS); undefined → high.
|
|
822
|
+
tier: this.liveQualityTier()?.settings,
|
|
823
|
+
...(route.skipped ? { flags: withCoreOutputOff(rendererQrFlags(this.device)) } : {})
|
|
824
|
+
});
|
|
375
825
|
if (!resolvedCamera && cameraPolicy === "auto-frame") {
|
|
376
826
|
const autoFrame = createAutoFrameCamera(source, items, this.width, this.height);
|
|
377
827
|
if (autoFrame) {
|
|
@@ -381,11 +831,24 @@ export class Renderer {
|
|
|
381
831
|
}
|
|
382
832
|
}
|
|
383
833
|
let postprocess = collectPostprocess(source);
|
|
384
|
-
if (!postprocess?.temporal || (!postprocess.motionBlur && !postprocess.taa))
|
|
834
|
+
if (!postprocess?.temporal || (!postprocess.motionBlur && !postprocess.taa)) {
|
|
385
835
|
this.temporalHistory.reset();
|
|
836
|
+
this.lastTemporalCameraPosition = undefined;
|
|
837
|
+
}
|
|
386
838
|
const ownedTargets = [];
|
|
387
839
|
const ownedShadowPasses = [];
|
|
388
840
|
this.graph.clear();
|
|
841
|
+
// C-05 (§8.4): under A3D_QR_CORE_OUTPUT encode happens once, in OutputPass.
|
|
842
|
+
// A configured legacy post chain still encodes itself (lane 03 migrates it
|
|
843
|
+
// into post-hdr contributors, Q-03-2/Q-03-3), so the frame takes the legacy
|
|
844
|
+
// chain and bypasses OutputPass: encode stays single, and the authored
|
|
845
|
+
// effects (bloom) are kept instead of dropped. The bypass is reported.
|
|
846
|
+
const qrOutput = route.qrOutput;
|
|
847
|
+
// §6.2.7: lane passes encode in-shader only on the legacy LDR path.
|
|
848
|
+
frameHooks.setOutputColorSpace(postprocess || qrOutput ? "linear" : "srgb");
|
|
849
|
+
this.lastPostSkipped = route.skipped;
|
|
850
|
+
if (route.skipped)
|
|
851
|
+
this.warnPostLegacyRoute(route.skipped);
|
|
389
852
|
let postprocessTargetFormat;
|
|
390
853
|
if (postprocess) {
|
|
391
854
|
const format = postprocess.targetFormat ?? defaultPostprocessTargetFormat(this.device, postprocess);
|
|
@@ -423,19 +886,52 @@ export class Renderer {
|
|
|
423
886
|
const forwardTarget = this.ensureForwardColorTarget(format, requiresDepthTexture, sampleCount);
|
|
424
887
|
ownedTargets.push(forwardTarget);
|
|
425
888
|
this.device.setRenderTarget(forwardTarget);
|
|
889
|
+
frameHooks.setForwardTarget(forwardTarget);
|
|
890
|
+
}
|
|
891
|
+
else if (qrOutput) {
|
|
892
|
+
// C-05: the v2 scene always renders into the HDR target — also on the
|
|
893
|
+
// no-effects route (§8.4: encode once, in OutputPass). The governor's
|
|
894
|
+
// renderScale applies to this target only; OutputPass upsamples.
|
|
895
|
+
const probed = probeHdrTargetFormat(this.device);
|
|
896
|
+
const format = probed === "rgba8" ? "rgba8" : "rgba16f";
|
|
897
|
+
const hdrTarget = this.ensureHdrSceneTarget(format, this.outputOptions.backgroundCoverage === true);
|
|
898
|
+
ownedTargets.push(hdrTarget);
|
|
899
|
+
this.device.setRenderTarget(hdrTarget);
|
|
900
|
+
frameHooks.setForwardTarget(hdrTarget);
|
|
426
901
|
}
|
|
427
902
|
this.device.beginFrame(this.width, this.height);
|
|
428
903
|
try {
|
|
429
904
|
this.lastShadowEvidence = null;
|
|
430
|
-
|
|
905
|
+
items = frameHooks.collect(items);
|
|
906
|
+
// C-28 (#90): scope the shadow-phase CPU submission for frameStats.
|
|
907
|
+
// 02-S5: under A3D_QR_LIGHTING casters come from the pre-cull set
|
|
908
|
+
// (frustum-culled casters rejoin); flag-off keeps the visible items only.
|
|
909
|
+
const shadowCasterItems = rendererQrFlags().on("A3D_QR_LIGHTING")
|
|
910
|
+
? [
|
|
911
|
+
...items,
|
|
912
|
+
...culledCastersReachingView(collectedItems.culledShadowCasters, items, collectedItems.cullingFrustum, shadowSunTravel(lights))
|
|
913
|
+
].filter((item) => item.castShadow !== false)
|
|
914
|
+
: items.filter((item) => item.castShadow !== false);
|
|
915
|
+
const rendererShadowMap = this.frameStatsMonitor?.scope("shadow", () => explicitShadowMap ?? this.executeRendererShadowMap({
|
|
916
|
+
shadowOptions,
|
|
917
|
+
source,
|
|
918
|
+
items: shadowCasterItems,
|
|
919
|
+
lights,
|
|
920
|
+
ownedTargets,
|
|
921
|
+
ownedShadowPasses,
|
|
922
|
+
camera: resolvedCamera?.camera,
|
|
923
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
924
|
+
})) ?? explicitShadowMap ?? this.executeRendererShadowMap({
|
|
431
925
|
shadowOptions,
|
|
432
926
|
source,
|
|
433
|
-
items:
|
|
927
|
+
items: shadowCasterItems,
|
|
434
928
|
lights,
|
|
435
929
|
ownedTargets,
|
|
436
930
|
ownedShadowPasses,
|
|
437
|
-
camera: resolvedCamera?.camera
|
|
931
|
+
camera: resolvedCamera?.camera,
|
|
932
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
438
933
|
});
|
|
934
|
+
frameHooks.addPasses(this.graph, "shadows", items);
|
|
439
935
|
this.lastShadowEvidence = rendererShadowMap ? {
|
|
440
936
|
lightMatrix: Array.from(rendererShadowMap.lightMatrix),
|
|
441
937
|
cascades: rendererShadowMap.cascades?.map(c => ({ index: c.index, near: c.near, far: c.far, lightMatrix: Array.from(c.shadowMap.lightMatrix) })) ?? [],
|
|
@@ -451,45 +947,167 @@ export class Renderer {
|
|
|
451
947
|
}
|
|
452
948
|
this.device.setRenderTarget(forwardTarget);
|
|
453
949
|
}
|
|
950
|
+
else if (qrOutput) {
|
|
951
|
+
// §9.1: clear the HDR target to the linear background color (no ACES
|
|
952
|
+
// pre-inversion — OutputPass owns the whole encode).
|
|
953
|
+
this.device.setRenderTarget(ownedTargets[0] ?? null);
|
|
954
|
+
}
|
|
454
955
|
else {
|
|
455
956
|
this.device.setRenderTarget(explicitRenderTarget ?? null);
|
|
456
957
|
}
|
|
457
|
-
this.device.clear(this.clearColor);
|
|
958
|
+
this.device.clear(qrOutput && !postprocess ? this.outputClearColor ?? this.clearColor : this.clearColor);
|
|
458
959
|
if (environmentBackground) {
|
|
459
960
|
this.graph.addPass(new EnvironmentBackgroundPass({
|
|
460
961
|
...environmentBackground,
|
|
461
|
-
outputColorSpace: postprocess ? "linear" : environmentBackground.outputColorSpace,
|
|
962
|
+
outputColorSpace: postprocess || qrOutput ? "linear" : environmentBackground.outputColorSpace,
|
|
462
963
|
inverseViewProjectionMatrix: environmentBackground.inverseViewProjectionMatrix ?? invertMat4(cameraViewProjection ?? identityMat4()),
|
|
463
964
|
shaderLibrary: this.shaderLibrary
|
|
464
965
|
}));
|
|
966
|
+
frameHooks.addPasses(this.graph, "background", items);
|
|
967
|
+
}
|
|
968
|
+
// PRD-03 Phase 4 (flag-on): >5 m of camera translation within one frame
|
|
969
|
+
// is a cut — reprojection would smear everything, so seed fresh history.
|
|
970
|
+
let temporalPrevVp;
|
|
971
|
+
let rasterViewProjection = cameraViewProjection;
|
|
972
|
+
let temporalAutoReset = false;
|
|
973
|
+
if (postprocess?.temporal && (postprocess.motionBlur || postprocess.taa) && cameraPosition && rendererQrFlags(this.device).on("A3D_QR_POST")) {
|
|
974
|
+
const prev = this.lastTemporalCameraPosition;
|
|
975
|
+
if (prev) {
|
|
976
|
+
const dx = cameraPosition[0] - prev[0];
|
|
977
|
+
const dy = cameraPosition[1] - prev[1];
|
|
978
|
+
const dz = cameraPosition[2] - prev[2];
|
|
979
|
+
temporalAutoReset = dx * dx + dy * dy + dz * dz > 25;
|
|
980
|
+
}
|
|
981
|
+
this.lastTemporalCameraPosition = [cameraPosition[0], cameraPosition[1], cameraPosition[2]];
|
|
465
982
|
}
|
|
466
983
|
if (postprocess?.temporal && (postprocess.motionBlur || postprocess.taa)) {
|
|
467
984
|
if (postprocess.execution === "cpu-deterministic" || !this.device.presentLdrPostprocess)
|
|
468
985
|
throw new RenderDeviceError("Renderer temporal effects require native GPU presentation", "TEMPORAL_NATIVE_REQUIRED");
|
|
469
|
-
const temporal = this.temporalHistory.prepare(this.device, this.width, this.height, items, cameraViewProjection, { ...postprocess.temporal, jitter: Boolean(postprocess.taa) });
|
|
986
|
+
const temporal = this.temporalHistory.prepare(this.device, this.width, this.height, items, cameraViewProjection, { ...postprocess.temporal, jitter: Boolean(postprocess.taa), ...(temporalAutoReset ? { reset: true } : {}) });
|
|
987
|
+
temporalPrevVp = temporal.v2?.previous;
|
|
988
|
+
// PRD-03 §8.6 (flag-on): generated programs project through the
|
|
989
|
+
// AuraFrame `u_viewProjection`, not the per-item MVP, so the TAA
|
|
990
|
+
// sub-pixel jitter has to ride the camera matrix too — otherwise the
|
|
991
|
+
// raster never moves and S5 has nothing to resolve.
|
|
992
|
+
if (temporal.v2)
|
|
993
|
+
rasterViewProjection = temporal.v2.jittered;
|
|
470
994
|
items = this.temporalHistory.renderItems;
|
|
471
995
|
postprocess = { ...postprocess, ...(postprocess.motionBlur ? { motionBlur: { ...postprocess.motionBlur, temporal } } : {}), ...(postprocess.taa ? { taa: { ...postprocess.taa, temporal } } : {}) };
|
|
472
996
|
this.device.setRenderTarget(ownedTargets[0]);
|
|
473
997
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
cameraPosition
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
998
|
+
if (qrOutput) {
|
|
999
|
+
// §9.1 v2 frame order: opaque → after-opaque (scene-depth copy,
|
|
1000
|
+
// contributors) → transmission → transmissive → transparent (engine
|
|
1001
|
+
// items + contributor TransparentQueueItems interleaved by sortDepth)
|
|
1002
|
+
// → after-transparent.
|
|
1003
|
+
const hdrTarget = ownedTargets[0] ?? null;
|
|
1004
|
+
const coverage = this.outputOptions.backgroundCoverage === true;
|
|
1005
|
+
const split = splitForwardItems(items, cameraPosition ?? undefined);
|
|
1006
|
+
const shared = {
|
|
1007
|
+
items: split.opaque,
|
|
1008
|
+
lights,
|
|
1009
|
+
environmentLighting,
|
|
1010
|
+
environmentFog,
|
|
1011
|
+
inputColorResource: environmentBackground ? ENVIRONMENT_BACKGROUND_COLOR_RESOURCE : undefined,
|
|
1012
|
+
shadowMap: rendererShadowMap,
|
|
1013
|
+
cameraPosition,
|
|
1014
|
+
cameraViewMatrix: resolvedCamera?.viewMatrix,
|
|
1015
|
+
cameraViewProjectionMatrix: rasterViewProjection,
|
|
1016
|
+
outputColorSpace: "linear",
|
|
1017
|
+
shaderLibrary: this.shaderLibrary,
|
|
1018
|
+
backgroundCoverage: coverage,
|
|
1019
|
+
qualityTier: this.liveQualityTier()?.settings
|
|
1020
|
+
};
|
|
1021
|
+
// The graph enforces unique names + single-producer writes; per-phase
|
|
1022
|
+
// resources chain the order, and `aura.scene.color` is written once —
|
|
1023
|
+
// by the final interleaved transparent pass.
|
|
1024
|
+
this.graph.addPass(new ForwardPass({ ...shared, framePass: { name: "prd01.opaque", writes: ["aura.scene.color.opaque"] } }));
|
|
1025
|
+
if (hdrTarget?.depthTexture) {
|
|
1026
|
+
const depthCopy = this.ensureSceneDepthCopy();
|
|
1027
|
+
frameHooks.setSceneDepthCopy(depthCopy);
|
|
1028
|
+
this.graph.addPass(new SceneDepthCopyPass(hdrTarget, depthCopy));
|
|
1029
|
+
}
|
|
1030
|
+
frameHooks.addPasses(this.graph, "after-opaque", items);
|
|
1031
|
+
frameHooks.addPasses(this.graph, "transmission", items);
|
|
1032
|
+
let lastColorResource = "aura.scene.color.opaque";
|
|
1033
|
+
if (split.transmission.length > 0) {
|
|
1034
|
+
lastColorResource = "aura.scene.color.transmission";
|
|
1035
|
+
this.graph.addPass(new ForwardPass({
|
|
1036
|
+
...shared,
|
|
1037
|
+
items: split.transmission,
|
|
1038
|
+
framePass: { name: "prd01.transmission", reads: ["aura.scene.color.opaque"], writes: [lastColorResource] }
|
|
1039
|
+
}));
|
|
1040
|
+
}
|
|
1041
|
+
frameHooks.addTransparentContributorPasses(this.graph, items);
|
|
1042
|
+
const { ctx: contributorCtx, queues } = frameHooks.transparentQueues(items);
|
|
1043
|
+
this.graph.addPass(new InterleavedTransparentPass({ ...shared, items: [] }, split.transparent, queues, contributorCtx, [lastColorResource]));
|
|
1044
|
+
frameHooks.addPasses(this.graph, "after-transparent", items);
|
|
1045
|
+
}
|
|
1046
|
+
else {
|
|
1047
|
+
this.graph.addPass(new ForwardPass({
|
|
1048
|
+
items,
|
|
1049
|
+
lights,
|
|
1050
|
+
environmentLighting,
|
|
1051
|
+
environmentFog,
|
|
1052
|
+
inputColorResource: environmentBackground ? ENVIRONMENT_BACKGROUND_COLOR_RESOURCE : undefined,
|
|
1053
|
+
shadowMap: rendererShadowMap,
|
|
1054
|
+
cameraPosition,
|
|
1055
|
+
cameraViewMatrix: resolvedCamera?.viewMatrix,
|
|
1056
|
+
cameraViewProjectionMatrix: rasterViewProjection,
|
|
1057
|
+
outputColorSpace: postprocess ? "linear" : "srgb",
|
|
1058
|
+
shaderLibrary: this.shaderLibrary
|
|
1059
|
+
}));
|
|
1060
|
+
frameHooks.addPasses(this.graph, "after-opaque", items);
|
|
1061
|
+
frameHooks.addPasses(this.graph, "transmission", items);
|
|
1062
|
+
frameHooks.addPasses(this.graph, "transparent", items);
|
|
1063
|
+
frameHooks.addPasses(this.graph, "after-transparent", items);
|
|
1064
|
+
}
|
|
1065
|
+
// C-28 (#90): scope the forward-phase CPU submission for frameStats.
|
|
1066
|
+
if (this.frameStatsMonitor) {
|
|
1067
|
+
this.frameStatsMonitor.scope("forward", () => this.graph.execute({ device: this.device, width: this.width, height: this.height }));
|
|
1068
|
+
}
|
|
1069
|
+
else {
|
|
1070
|
+
this.graph.execute({ device: this.device, width: this.width, height: this.height });
|
|
1071
|
+
}
|
|
488
1072
|
if (postprocess) {
|
|
489
1073
|
postprocess = bindRendererSsrProjection(postprocess, cameraViewProjection ?? identityMat4());
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
1074
|
+
const frameCamera = toFrameCamera(resolvedCamera, cameraViewProjection, cameraPosition);
|
|
1075
|
+
postprocess = {
|
|
1076
|
+
...postprocess,
|
|
1077
|
+
cameraFrame: frameCamera && temporalPrevVp ? { ...frameCamera, previousViewProjectionMatrix: temporalPrevVp } : frameCamera,
|
|
1078
|
+
postFrameContext: {
|
|
1079
|
+
source,
|
|
1080
|
+
items,
|
|
1081
|
+
sceneDepth: {
|
|
1082
|
+
texture: ownedTargets[0]?.depthTexture ?? null,
|
|
1083
|
+
available: (ownedTargets[0]?.depthTexture ?? null) !== null,
|
|
1084
|
+
linearize: {
|
|
1085
|
+
near: frameCamera?.near ?? 0.1,
|
|
1086
|
+
far: frameCamera?.far ?? 1000,
|
|
1087
|
+
orthographic: frameCamera?.projection === "orthographic"
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
};
|
|
1092
|
+
// C-28 (#91): "post" scope. FrameStats.scope is synchronous, so on the
|
|
1093
|
+
// async path it times the CPU submission up to the first await.
|
|
1094
|
+
await this.scopePost(async () => {
|
|
1095
|
+
await frameHooks.runPhaseAsync("post-hdr", items, postprocess !== undefined);
|
|
1096
|
+
if (this.disposed || this.device.disposed)
|
|
1097
|
+
return;
|
|
1098
|
+
await this.executePostprocessAsync(postprocess, ownedTargets, explicitRenderTarget);
|
|
1099
|
+
});
|
|
1100
|
+
if (!this.disposed && !this.device.disposed && postprocess.temporal && (postprocess.motionBlur || postprocess.taa))
|
|
1101
|
+
this.commitTemporalHistory(Boolean(postprocess.taa));
|
|
1102
|
+
}
|
|
1103
|
+
else if (qrOutput) {
|
|
1104
|
+
await this.scopePost(() => frameHooks.runPhaseAsync("post-hdr", items, true));
|
|
1105
|
+
if (!this.disposed && !this.device.disposed) {
|
|
1106
|
+
this.executeOutputPass(frameHooks, items, ownedTargets[0] ?? null, explicitRenderTarget);
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
if (!this.disposed && !this.device.disposed) {
|
|
1110
|
+
await frameHooks.runPhaseAsync("after-output", items);
|
|
493
1111
|
}
|
|
494
1112
|
}
|
|
495
1113
|
catch (error) {
|
|
@@ -499,7 +1117,13 @@ export class Renderer {
|
|
|
499
1117
|
throw error;
|
|
500
1118
|
}
|
|
501
1119
|
finally {
|
|
502
|
-
this.device.
|
|
1120
|
+
if (!this.device.disposed) {
|
|
1121
|
+
this.device.endFrame();
|
|
1122
|
+
}
|
|
1123
|
+
if (this.resolutionGovernor && this.frameStatsMonitor) {
|
|
1124
|
+
const frameSample = this.frameStatsMonitor.end();
|
|
1125
|
+
this.resolutionGovernor.sample(frameSample.intervalMs, frameSample.gpuMs);
|
|
1126
|
+
}
|
|
503
1127
|
for (const shadowPass of ownedShadowPasses) {
|
|
504
1128
|
shadowPass.dispose();
|
|
505
1129
|
}
|
|
@@ -520,6 +1144,89 @@ export class Renderer {
|
|
|
520
1144
|
rendererDepthAvailable: Boolean(postprocess && postprocessRequiresDepthTexture(postprocess) && this.device.info.capabilities?.includes("depth-textures"))
|
|
521
1145
|
}));
|
|
522
1146
|
}
|
|
1147
|
+
/**
|
|
1148
|
+
* C-02 (PRD-01 §8.2/§403): warm-then-block. Under `A3D_QR_CORE_GENERATOR`
|
|
1149
|
+
* (default-on under `A3D_QR_CORE`), precompiles the generated programs for
|
|
1150
|
+
* every allow-listed material in the frame — at the current tier and the
|
|
1151
|
+
* next-lower one — before the first draw, so the pass never async-skips in
|
|
1152
|
+
* steady state. Flag-off and non-generated materials are no-ops.
|
|
1153
|
+
*/
|
|
1154
|
+
/**
|
|
1155
|
+
* Shared T0-06 warm input: the exact draw feature records the frame's
|
|
1156
|
+
* generated-program materials need (lights/shadow/environment axes at the
|
|
1157
|
+
* current tier). Returns `materials: []` early when nothing generated.
|
|
1158
|
+
*/
|
|
1159
|
+
collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier) {
|
|
1160
|
+
const ctx = { flags, tier: QUALITY_TIERS[tier] };
|
|
1161
|
+
// T0-05: one record per (material revision, selected feature bits) — the
|
|
1162
|
+
// draw key carries `ShaderFeature.select` bits per item, so the warm list
|
|
1163
|
+
// must too or warmed keys never match draw keys.
|
|
1164
|
+
const records = new Map();
|
|
1165
|
+
const route = { core: qrCoreGeneratorOn(flags), lobes: qrMaterialsLobeProgramsOn(flags) };
|
|
1166
|
+
for (const item of items) {
|
|
1167
|
+
const m = item.material instanceof MaterialInstance ? item.material.baseMaterial : item.material;
|
|
1168
|
+
if (!m || !materialRoutesToGeneratedProgram(m, route, ctx))
|
|
1169
|
+
continue;
|
|
1170
|
+
const mf = m.programFeatures(ctx);
|
|
1171
|
+
const selected = selectShaderFeatureBits({ item, pass: "forward", tier: ctx.tier, flags });
|
|
1172
|
+
// E3 stage-2b: same probe-availability gate ForwardPass applies, so
|
|
1173
|
+
// warmed keys match draw keys for the `prd02.ibl` bit.
|
|
1174
|
+
if (selected[PRD02_IBL_FEATURE] !== undefined && !prd02IblEnvironmentAvailable(environmentLighting, item)) {
|
|
1175
|
+
delete selected[PRD02_IBL_FEATURE];
|
|
1176
|
+
}
|
|
1177
|
+
// #867 (games): same geometry-driven feature mask ForwardPass applies.
|
|
1178
|
+
const attrs = item.geometry.vertexBuffer.format.attributes;
|
|
1179
|
+
const has = (name) => attrs.some((a) => a.semantic === name || a.shaderName === name);
|
|
1180
|
+
const record = featuresForGeometry({ ...mf, features: { ...mf.features, ...selected } }, has);
|
|
1181
|
+
const geometryMask = ["a_uv", "a_uv1", "a_color", "a_joints", "a_weights", "a_joints1", "a_weights1"].map((n) => (has(n) ? 1 : 0)).join("");
|
|
1182
|
+
const key = `${m.shaderKey}:${m.getRevision()}:${geometryMask}:${JSON.stringify(Object.entries(record.features).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))}`;
|
|
1183
|
+
if (!records.has(key))
|
|
1184
|
+
records.set(key, record);
|
|
1185
|
+
}
|
|
1186
|
+
if (records.size === 0)
|
|
1187
|
+
return { materials: [] };
|
|
1188
|
+
const clustered = resolveForwardClusteredLighting(lights, this.width, this.height, cameraViewProjection);
|
|
1189
|
+
const axes = forwardPassFeatureAxes({ lights, shadowMap, environmentLighting, environmentFog }, clustered !== null);
|
|
1190
|
+
clustered?.dispose();
|
|
1191
|
+
return {
|
|
1192
|
+
materials: [...records.values()],
|
|
1193
|
+
lights: [axes.lights],
|
|
1194
|
+
shadows: axes.shadows ? [axes.shadows] : [],
|
|
1195
|
+
environments: [axes.environment]
|
|
1196
|
+
};
|
|
1197
|
+
}
|
|
1198
|
+
async warmGeneratedPrograms(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection) {
|
|
1199
|
+
const flags = rendererQrFlags(this.device);
|
|
1200
|
+
if (!qrGeneratedProgramsOn(flags))
|
|
1201
|
+
return;
|
|
1202
|
+
const tier = this.qualityTierName ?? prd11LiveQualityTier(flags)?.tier ?? "high";
|
|
1203
|
+
const cache = rendererProgramCache(this.device, flags);
|
|
1204
|
+
const input = this.collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier);
|
|
1205
|
+
if (input.materials.length > 0) {
|
|
1206
|
+
const warmup = (this.programWarmup ??= new ProgramWarmup(cache));
|
|
1207
|
+
await warmup.warm(input, tier);
|
|
1208
|
+
}
|
|
1209
|
+
// T0-06: the ready barrier for `programsCompiledSinceReady` — compiles
|
|
1210
|
+
// completing after the first warm count as steady-state leaks.
|
|
1211
|
+
cache.markReady?.();
|
|
1212
|
+
}
|
|
1213
|
+
/**
|
|
1214
|
+
* T0-06: the sync `render` half of warm-then-block. Kicks `acquire` for the
|
|
1215
|
+
* exact draw feature records — async-compile devices start pending entries
|
|
1216
|
+
* (`precompile`/`app.ready` settle them); sync-compile devices compile under
|
|
1217
|
+
* the per-frame bound and converge over the next frames.
|
|
1218
|
+
*/
|
|
1219
|
+
warmGeneratedProgramsSync(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection) {
|
|
1220
|
+
const flags = rendererQrFlags(this.device);
|
|
1221
|
+
if (!qrGeneratedProgramsOn(flags))
|
|
1222
|
+
return;
|
|
1223
|
+
const tier = this.qualityTierName ?? prd11LiveQualityTier(flags)?.tier ?? "high";
|
|
1224
|
+
const cache = rendererProgramCache(this.device, flags);
|
|
1225
|
+
const input = this.collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier);
|
|
1226
|
+
for (const features of collectWarmupFeatures(input, tier))
|
|
1227
|
+
cache.acquire(features);
|
|
1228
|
+
cache.markReady?.();
|
|
1229
|
+
}
|
|
523
1230
|
renderScene(scene, camera) {
|
|
524
1231
|
return this.render(scene, camera);
|
|
525
1232
|
}
|
|
@@ -555,14 +1262,83 @@ export class Renderer {
|
|
|
555
1262
|
this.shadowDepthTarget = null;
|
|
556
1263
|
this.forwardColorTarget?.target.dispose();
|
|
557
1264
|
this.forwardColorTarget = null;
|
|
1265
|
+
this.hdrSceneTarget?.target.dispose();
|
|
1266
|
+
this.hdrSceneTarget = null;
|
|
1267
|
+
this.sceneDepthCopyTarget?.dispose();
|
|
1268
|
+
this.sceneDepthCopyTarget = null;
|
|
558
1269
|
this.unsubscribeTemporalDeviceLoss?.();
|
|
1270
|
+
this.unsubscribeDprWatch?.();
|
|
559
1271
|
this.temporalHistory.dispose();
|
|
560
1272
|
this.device.dispose();
|
|
561
1273
|
this.disposed = true;
|
|
562
1274
|
}
|
|
563
1275
|
/** True for renderer-lifetime targets that must survive end-of-frame disposal. */
|
|
564
1276
|
isReusedTarget(target) {
|
|
565
|
-
return target === this.forwardColorTarget?.target || target === this.shadowDepthTarget;
|
|
1277
|
+
return target === this.forwardColorTarget?.target || target === this.shadowDepthTarget || target === this.hdrSceneTarget?.target || target === this.sceneDepthCopyTarget;
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* C-05 HDR scene target under `A3D_QR_CORE_OUTPUT` — always a sampleable
|
|
1281
|
+
* depth texture (sceneDepth / after-opaque copy), renderScale-sized, MSAA 4x,
|
|
1282
|
+
* plus the BACKGROUND_COVERAGE rgba8 attachment when the option is on.
|
|
1283
|
+
*/
|
|
1284
|
+
ensureHdrSceneTarget(format, coverage) {
|
|
1285
|
+
const scale = Math.min(Math.max(this.renderScale, 0.01), 1);
|
|
1286
|
+
const width = Math.max(1, Math.round(this.width * scale));
|
|
1287
|
+
const height = Math.max(1, Math.round(this.height * scale));
|
|
1288
|
+
// C-36: WebGL2 does not support multisample MRT — coverage forces a
|
|
1289
|
+
// non-MSAA target and is declared via `hdr-msaa-mrt-unsupported`.
|
|
1290
|
+
const sampleCount = coverage ? 1 : 4;
|
|
1291
|
+
const key = `${width}x${height}:${format}:depth-texture:${sampleCount}:${coverage ? "cov" : "std"}`;
|
|
1292
|
+
const cached = this.hdrSceneTarget;
|
|
1293
|
+
if (cached && cached.key === key && !cached.target.disposed)
|
|
1294
|
+
return cached.target;
|
|
1295
|
+
cached?.target.dispose();
|
|
1296
|
+
const target = this.device.createRenderTarget({
|
|
1297
|
+
width,
|
|
1298
|
+
height,
|
|
1299
|
+
label: "renderer-hdr-scene",
|
|
1300
|
+
format,
|
|
1301
|
+
...(coverage ? { colorAttachments: [{ format }, { format: "rgba8" }] } : {}),
|
|
1302
|
+
depth: "texture",
|
|
1303
|
+
sampleCount
|
|
1304
|
+
});
|
|
1305
|
+
this.hdrMsaaMrtDegraded = coverage;
|
|
1306
|
+
this.hdrSceneTarget = { target, key };
|
|
1307
|
+
return target;
|
|
1308
|
+
}
|
|
1309
|
+
ensureSceneDepthCopy() {
|
|
1310
|
+
this.sceneDepthCopyTarget = ensureSceneDepthCopyTarget(this.device, this.sceneDepthCopyTarget, this.width, this.height);
|
|
1311
|
+
return this.sceneDepthCopyTarget;
|
|
1312
|
+
}
|
|
1313
|
+
/**
|
|
1314
|
+
* C-05 OutputPass invocation (§8.4 step "output"): `u_exposure` =
|
|
1315
|
+
* `output.exposure × blackboard["prd03.exposure"]` (upstream defaults to 1
|
|
1316
|
+
* until lane 03 publishes it — Q-03-1).
|
|
1317
|
+
*/
|
|
1318
|
+
executeOutputPass(frameHooks, _items, hdrTarget, explicitRenderTarget) {
|
|
1319
|
+
if (!hdrTarget)
|
|
1320
|
+
return;
|
|
1321
|
+
const o = this.outputOptions;
|
|
1322
|
+
const upstream = frameHooks.blackboardValue(PRD03_EXPOSURE);
|
|
1323
|
+
const appliedExposure = (o.exposure ?? 1) * (typeof upstream === "number" && Number.isFinite(upstream) ? upstream : 1);
|
|
1324
|
+
const format = probeHdrTargetFormat(this.device);
|
|
1325
|
+
const targetFormat = format === "rgba8" ? "rgba8" : "rgba16f";
|
|
1326
|
+
const coverage = o.backgroundCoverage === true;
|
|
1327
|
+
this.device.setRenderTarget(explicitRenderTarget ?? null);
|
|
1328
|
+
rendererOutputPass(this.device).execute(hdrTarget, coverage ? hdrTarget : null, {
|
|
1329
|
+
toneMapping: o.toneMapping ?? DEFAULT_TONE_MAPPING,
|
|
1330
|
+
exposure: appliedExposure,
|
|
1331
|
+
dithering: o.dithering ?? DEFAULT_OUTPUT_DITHERING,
|
|
1332
|
+
backgroundCoverage: coverage,
|
|
1333
|
+
overlay: o.overlay
|
|
1334
|
+
}, explicitRenderTarget ?? "canvas");
|
|
1335
|
+
this.lastAppliedOutput = {
|
|
1336
|
+
toneMapping: o.toneMapping ?? DEFAULT_TONE_MAPPING,
|
|
1337
|
+
exposure: { applied: appliedExposure, source: upstream !== undefined ? "grade" : "output" },
|
|
1338
|
+
dithering: o.dithering ?? DEFAULT_OUTPUT_DITHERING,
|
|
1339
|
+
targetFormat,
|
|
1340
|
+
degraded: targetFormat === "rgba8" ? "rgba8-no-float-target" : this.hdrMsaaMrtDegraded ? "hdr-msaa-mrt-unsupported" : undefined
|
|
1341
|
+
};
|
|
566
1342
|
}
|
|
567
1343
|
/** Allocates the shared forward-color target once per distinct configuration. */
|
|
568
1344
|
ensureForwardColorTarget(format, requiresDepthTexture, sampleCount) {
|
|
@@ -582,21 +1358,9 @@ export class Renderer {
|
|
|
582
1358
|
this.forwardColorTarget = { target, key };
|
|
583
1359
|
return target;
|
|
584
1360
|
}
|
|
585
|
-
/**
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
if (existing && !existing.disposed && existing.width === size && existing.height === size)
|
|
589
|
-
return existing;
|
|
590
|
-
existing?.dispose();
|
|
591
|
-
const target = this.device.createRenderTarget({
|
|
592
|
-
width: size,
|
|
593
|
-
height: size,
|
|
594
|
-
label: "renderer-shadow-depth-color",
|
|
595
|
-
format: "rgba8",
|
|
596
|
-
depth: this.device.info.capabilities?.includes("depth-textures") ? "texture" : true
|
|
597
|
-
});
|
|
598
|
-
this.shadowDepthTarget = target;
|
|
599
|
-
return target;
|
|
1361
|
+
/** PRD 11: this device's app-bound live C-27 tier (A3D_QR_TIERS on), else undefined. */
|
|
1362
|
+
liveQualityTier() {
|
|
1363
|
+
return prd11LiveQualityTier(rendererQrFlags(this.device));
|
|
600
1364
|
}
|
|
601
1365
|
assertAlive() {
|
|
602
1366
|
if (this.disposed || this.device.disposed) {
|
|
@@ -614,584 +1378,13 @@ export class Renderer {
|
|
|
614
1378
|
}
|
|
615
1379
|
}
|
|
616
1380
|
executePostprocess(postprocess, ownedTargets, outputTarget) {
|
|
617
|
-
|
|
618
|
-
let current = forwardTarget;
|
|
619
|
-
if (!current) {
|
|
620
|
-
throw new RenderDeviceError("Renderer postprocess missing forward render target", "POSTPROCESS_TARGET_MISSING");
|
|
621
|
-
}
|
|
622
|
-
const passes = createRendererPostprocessPasses(postprocess);
|
|
623
|
-
if (passes.length === 0) {
|
|
624
|
-
if (outputTarget) {
|
|
625
|
-
this.device.setRenderTarget(current);
|
|
626
|
-
writePostProcessPixels(this.device, current, outputTarget, this.device.readPixels(0, 0, current.width, current.height));
|
|
627
|
-
}
|
|
628
|
-
else {
|
|
629
|
-
this.device.presentRenderTarget?.(current);
|
|
630
|
-
}
|
|
631
|
-
return;
|
|
632
|
-
}
|
|
633
|
-
if (this.executeFusedLdrPostprocess(current, passes, outputTarget, postprocess.execution === "cpu-deterministic"))
|
|
634
|
-
return;
|
|
635
|
-
for (let index = 0; index < passes.length; index += 1) {
|
|
636
|
-
const pass = passes[index];
|
|
637
|
-
const nextPass = passes[index + 1];
|
|
638
|
-
if (pass.name === "bloom" && isHdrRenderTarget(current)) {
|
|
639
|
-
if (nextPass?.name !== "tone-mapping") {
|
|
640
|
-
throw new RenderDeviceError("Renderer HDR bloom requires tone mapping immediately after the float bloom pass.", "HDR_BLOOM_TONEMAPPING_REQUIRED", {
|
|
641
|
-
source: current.label
|
|
642
|
-
});
|
|
643
|
-
}
|
|
644
|
-
const isCombinedLast = index + 1 === passes.length - 1;
|
|
645
|
-
const target = isCombinedLast ? outputTarget : this.device.createRenderTarget({
|
|
646
|
-
width: this.width,
|
|
647
|
-
height: this.height,
|
|
648
|
-
label: "renderer-postprocess-tone-mapping",
|
|
649
|
-
format: "rgba8",
|
|
650
|
-
depth: false
|
|
651
|
-
});
|
|
652
|
-
if (target)
|
|
653
|
-
ownedTargets.push(target);
|
|
654
|
-
this.device.setRenderTarget(current);
|
|
655
|
-
const bloomed = bloomFloatPixels(this.device.readFloatPixels(0, 0, current.width, current.height), current.width, current.height, pass.options);
|
|
656
|
-
const mapped = toneMapFloatPixels(bloomed.pixels, current.width, current.height, {
|
|
657
|
-
outputColorSpace: "srgb",
|
|
658
|
-
...nextPass.options
|
|
659
|
-
});
|
|
660
|
-
writePostProcessPixels(this.device, current, target, mapped.pixels);
|
|
661
|
-
if (target)
|
|
662
|
-
current = target;
|
|
663
|
-
index += 1;
|
|
664
|
-
continue;
|
|
665
|
-
}
|
|
666
|
-
const isLast = index === passes.length - 1;
|
|
667
|
-
const target = isLast ? outputTarget : this.device.createRenderTarget({
|
|
668
|
-
width: this.width,
|
|
669
|
-
height: this.height,
|
|
670
|
-
label: `renderer-postprocess-${pass.name}`,
|
|
671
|
-
format: "rgba8",
|
|
672
|
-
depth: false
|
|
673
|
-
});
|
|
674
|
-
if (target)
|
|
675
|
-
ownedTargets.push(target);
|
|
676
|
-
if (pass.name === "tone-mapping") {
|
|
677
|
-
new ToneMappingPass({
|
|
678
|
-
source: current,
|
|
679
|
-
target,
|
|
680
|
-
outputColorSpace: "srgb",
|
|
681
|
-
...pass.options
|
|
682
|
-
}).execute({ device: this.device, width: this.width, height: this.height });
|
|
683
|
-
}
|
|
684
|
-
else if (pass.name === "bloom") {
|
|
685
|
-
new BloomPass({
|
|
686
|
-
source: current,
|
|
687
|
-
target,
|
|
688
|
-
...pass.options
|
|
689
|
-
}).execute({ device: this.device, width: this.width, height: this.height });
|
|
690
|
-
}
|
|
691
|
-
else if (pass.name === "fxaa") {
|
|
692
|
-
new FXAAPass({
|
|
693
|
-
source: current,
|
|
694
|
-
target,
|
|
695
|
-
...pass.options
|
|
696
|
-
}).execute({ device: this.device, width: this.width, height: this.height });
|
|
697
|
-
}
|
|
698
|
-
else {
|
|
699
|
-
this.executePixelPostprocessPass(pass, current, target, forwardTarget);
|
|
700
|
-
}
|
|
701
|
-
if (target)
|
|
702
|
-
current = target;
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
executeFusedLdrPostprocess(current, passes, outputTarget, forceCpuDeterministic = false) {
|
|
706
|
-
const nativeHdrBloom = isHdrRenderTarget(current) && passes[0]?.name === "bloom" && passes[1]?.name === "tone-mapping";
|
|
707
|
-
if (nativeHdrBloom && (forceCpuDeterministic || !this.device.presentLdrPostprocess))
|
|
708
|
-
return false;
|
|
709
|
-
if (!canFuseLdrPostprocess(current, passes))
|
|
710
|
-
return false;
|
|
711
|
-
if (!forceCpuDeterministic && !this.device.presentLdrPostprocess && passes.some((pass) => pass.name === "depth-of-field" || pass.name === "motion-blur" || pass.name === "ssao" || pass.name === "ssr" || pass.name === "taa"))
|
|
712
|
-
return false;
|
|
713
|
-
// A caller that supplies its own `depth` array for depth-of-field/SSAO/SSR gets a plain
|
|
714
|
-
// depth renderbuffer, because `postprocessRequiresDepthTexture` only requests a
|
|
715
|
-
// sampleable depth texture when the renderer has to generate the depth itself. The
|
|
716
|
-
// backend's fused path samples `depthTextureHandle` regardless and used to throw
|
|
717
|
-
// `WEBGL_LDR_POSTPROCESS_DEPTH_REQUIRED`, failing the whole render rather than falling
|
|
718
|
-
// back. Declining fusion here routes those passes through the per-pass CPU path, which
|
|
719
|
-
// consumes the caller's depth directly and is the behaviour the options already imply.
|
|
720
|
-
if (!forceCpuDeterministic && !current.depthTexture && passes.some((pass) => pass.name === "depth-of-field" || pass.name === "ssao" || pass.name === "ssr"))
|
|
721
|
-
return false;
|
|
722
|
-
if (!forceCpuDeterministic && this.device.presentLdrPostprocess) {
|
|
723
|
-
this.device.presentLdrPostprocess(current, {
|
|
724
|
-
passes: passes.map((pass) => ({
|
|
725
|
-
name: pass.name,
|
|
726
|
-
options: pass.options
|
|
727
|
-
})),
|
|
728
|
-
...(outputTarget ? { outputTarget } : {}),
|
|
729
|
-
toneMappingDefaults: { outputColorSpace: "srgb" }
|
|
730
|
-
});
|
|
731
|
-
return true;
|
|
732
|
-
}
|
|
733
|
-
this.device.setRenderTarget(current);
|
|
734
|
-
const pixels = fusedLdrPostprocessPixels(this.device.readPixels(0, 0, current.width, current.height), current.width, current.height, passes, {
|
|
735
|
-
mutateInput: true,
|
|
736
|
-
scratch: this.fusedLdrPostprocessScratch,
|
|
737
|
-
toneMappingDefaults: { outputColorSpace: "srgb" }
|
|
738
|
-
});
|
|
739
|
-
writePostProcessPixels(this.device, current, outputTarget, pixels);
|
|
740
|
-
return true;
|
|
1381
|
+
return this.host.post.executePostprocess(postprocess, ownedTargets, outputTarget);
|
|
741
1382
|
}
|
|
742
1383
|
async executePostprocessAsync(postprocess, ownedTargets, outputTarget) {
|
|
743
|
-
|
|
744
|
-
let current = forwardTarget;
|
|
745
|
-
if (!current) {
|
|
746
|
-
throw new RenderDeviceError("Renderer postprocess missing forward render target", "POSTPROCESS_TARGET_MISSING");
|
|
747
|
-
}
|
|
748
|
-
const passes = createRendererPostprocessPasses(postprocess);
|
|
749
|
-
if (passes.length === 0) {
|
|
750
|
-
if (outputTarget) {
|
|
751
|
-
this.device.setRenderTarget(current);
|
|
752
|
-
writePostProcessPixels(this.device, current, outputTarget, await this.readRenderTargetPixelsAsync(current));
|
|
753
|
-
}
|
|
754
|
-
else {
|
|
755
|
-
this.device.presentRenderTarget?.(current);
|
|
756
|
-
}
|
|
757
|
-
return;
|
|
758
|
-
}
|
|
759
|
-
if (await this.executeFusedLdrPostprocessAsync(current, passes, outputTarget, postprocess.execution === "cpu-deterministic"))
|
|
760
|
-
return;
|
|
761
|
-
for (let index = 0; index < passes.length; index += 1) {
|
|
762
|
-
const pass = passes[index];
|
|
763
|
-
const nextPass = passes[index + 1];
|
|
764
|
-
if (pass.name === "bloom" && isHdrRenderTarget(current)) {
|
|
765
|
-
if (nextPass?.name !== "tone-mapping") {
|
|
766
|
-
throw new RenderDeviceError("Renderer HDR bloom requires tone mapping immediately after the float bloom pass.", "HDR_BLOOM_TONEMAPPING_REQUIRED", {
|
|
767
|
-
source: current.label
|
|
768
|
-
});
|
|
769
|
-
}
|
|
770
|
-
const isCombinedLast = index + 1 === passes.length - 1;
|
|
771
|
-
const target = isCombinedLast ? outputTarget : this.device.createRenderTarget({
|
|
772
|
-
width: this.width,
|
|
773
|
-
height: this.height,
|
|
774
|
-
label: "renderer-postprocess-tone-mapping",
|
|
775
|
-
format: "rgba8",
|
|
776
|
-
depth: false
|
|
777
|
-
});
|
|
778
|
-
if (target)
|
|
779
|
-
ownedTargets.push(target);
|
|
780
|
-
const bloomed = bloomFloatPixels(await this.readRenderTargetFloatPixelsAsync(current), current.width, current.height, pass.options);
|
|
781
|
-
const mapped = toneMapFloatPixels(bloomed.pixels, current.width, current.height, {
|
|
782
|
-
outputColorSpace: "srgb",
|
|
783
|
-
...nextPass.options
|
|
784
|
-
});
|
|
785
|
-
writePostProcessPixels(this.device, current, target, mapped.pixels);
|
|
786
|
-
if (target)
|
|
787
|
-
current = target;
|
|
788
|
-
index += 1;
|
|
789
|
-
continue;
|
|
790
|
-
}
|
|
791
|
-
const isLast = index === passes.length - 1;
|
|
792
|
-
const target = isLast ? outputTarget : this.device.createRenderTarget({
|
|
793
|
-
width: this.width,
|
|
794
|
-
height: this.height,
|
|
795
|
-
label: `renderer-postprocess-${pass.name}`,
|
|
796
|
-
format: "rgba8",
|
|
797
|
-
depth: false
|
|
798
|
-
});
|
|
799
|
-
if (target)
|
|
800
|
-
ownedTargets.push(target);
|
|
801
|
-
if (pass.name === "tone-mapping") {
|
|
802
|
-
const mapped = isHdrRenderTarget(current)
|
|
803
|
-
? toneMapFloatPixels(await this.readRenderTargetFloatPixelsAsync(current), current.width, current.height, {
|
|
804
|
-
outputColorSpace: "srgb",
|
|
805
|
-
...pass.options
|
|
806
|
-
})
|
|
807
|
-
: toneMapPixels(await this.readRenderTargetPixelsAsync(current), current.width, current.height, {
|
|
808
|
-
outputColorSpace: "srgb",
|
|
809
|
-
...pass.options
|
|
810
|
-
});
|
|
811
|
-
writePostProcessPixels(this.device, current, target, mapped.pixels);
|
|
812
|
-
}
|
|
813
|
-
else if (pass.name === "bloom") {
|
|
814
|
-
const bloomed = bloomPixels(await this.readRenderTargetPixelsAsync(current), current.width, current.height, pass.options);
|
|
815
|
-
writePostProcessPixels(this.device, current, target, bloomed.pixels);
|
|
816
|
-
}
|
|
817
|
-
else if (pass.name === "fxaa") {
|
|
818
|
-
const smoothed = fxaaPixels(await this.readRenderTargetPixelsAsync(current), current.width, current.height, pass.options);
|
|
819
|
-
writePostProcessPixels(this.device, current, target, smoothed.pixels);
|
|
820
|
-
}
|
|
821
|
-
else {
|
|
822
|
-
await this.executePixelPostprocessPassAsync(pass, current, target, forwardTarget);
|
|
823
|
-
}
|
|
824
|
-
if (target)
|
|
825
|
-
current = target;
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
async executeFusedLdrPostprocessAsync(current, passes, outputTarget, forceCpuDeterministic = false) {
|
|
829
|
-
const nativeHdrBloom = isHdrRenderTarget(current) && passes[0]?.name === "bloom" && passes[1]?.name === "tone-mapping";
|
|
830
|
-
if (nativeHdrBloom && (forceCpuDeterministic || !this.device.presentLdrPostprocess))
|
|
831
|
-
return false;
|
|
832
|
-
if (!canFuseLdrPostprocess(current, passes))
|
|
833
|
-
return false;
|
|
834
|
-
if (!forceCpuDeterministic && !this.device.presentLdrPostprocess && passes.some((pass) => pass.name === "depth-of-field" || pass.name === "motion-blur" || pass.name === "ssao" || pass.name === "ssr" || pass.name === "taa"))
|
|
835
|
-
return false;
|
|
836
|
-
// A caller that supplies its own `depth` array for depth-of-field/SSAO/SSR gets a plain
|
|
837
|
-
// depth renderbuffer, because `postprocessRequiresDepthTexture` only requests a
|
|
838
|
-
// sampleable depth texture when the renderer has to generate the depth itself. The
|
|
839
|
-
// backend's fused path samples `depthTextureHandle` regardless and used to throw
|
|
840
|
-
// `WEBGL_LDR_POSTPROCESS_DEPTH_REQUIRED`, failing the whole render rather than falling
|
|
841
|
-
// back. Declining fusion here routes those passes through the per-pass CPU path, which
|
|
842
|
-
// consumes the caller's depth directly and is the behaviour the options already imply.
|
|
843
|
-
if (!forceCpuDeterministic && !current.depthTexture && passes.some((pass) => pass.name === "depth-of-field" || pass.name === "ssao" || pass.name === "ssr"))
|
|
844
|
-
return false;
|
|
845
|
-
if (!forceCpuDeterministic && this.device.presentLdrPostprocess) {
|
|
846
|
-
this.device.presentLdrPostprocess(current, {
|
|
847
|
-
passes: passes.map((pass) => ({
|
|
848
|
-
name: pass.name,
|
|
849
|
-
options: pass.options
|
|
850
|
-
})),
|
|
851
|
-
...(outputTarget ? { outputTarget } : {}),
|
|
852
|
-
toneMappingDefaults: { outputColorSpace: "srgb" }
|
|
853
|
-
});
|
|
854
|
-
return true;
|
|
855
|
-
}
|
|
856
|
-
const pixels = fusedLdrPostprocessPixels(await this.readRenderTargetPixelsAsync(current), current.width, current.height, passes, {
|
|
857
|
-
mutateInput: true,
|
|
858
|
-
scratch: this.fusedLdrPostprocessScratch,
|
|
859
|
-
toneMappingDefaults: { outputColorSpace: "srgb" }
|
|
860
|
-
});
|
|
861
|
-
writePostProcessPixels(this.device, current, outputTarget, pixels);
|
|
862
|
-
return true;
|
|
863
|
-
}
|
|
864
|
-
executePixelPostprocessPass(pass, source, target, forwardTarget) {
|
|
865
|
-
this.device.setRenderTarget(source);
|
|
866
|
-
const input = this.device.readPixels(0, 0, source.width, source.height);
|
|
867
|
-
const rendererDepth = isDepthPostprocessPass(pass.name) && !postprocessPassHasDepth(pass.options)
|
|
868
|
-
? this.readRendererOwnedDepthTexture(forwardTarget)
|
|
869
|
-
: undefined;
|
|
870
|
-
const result = pass.name === "color-grade"
|
|
871
|
-
? colorGradePixels(input, source.width, source.height, pass.options).pixels
|
|
872
|
-
: pass.name === "chromatic-aberration"
|
|
873
|
-
? chromaticAberrationPixels(input, source.width, source.height, pass.options).pixels
|
|
874
|
-
: pass.name === "film-grain"
|
|
875
|
-
? filmGrainPixels(input, source.width, source.height, pass.options).pixels
|
|
876
|
-
: pass.name === "depth-of-field"
|
|
877
|
-
? depthOfFieldPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
878
|
-
: pass.name === "volumetric-light"
|
|
879
|
-
? volumetricLightPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
880
|
-
: pass.name === "motion-blur"
|
|
881
|
-
? motionBlurPixels(input, source.width, source.height, pass.options).pixels
|
|
882
|
-
: pass.name === "contact-shadow"
|
|
883
|
-
? contactShadowPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
884
|
-
: pass.name === "ssao"
|
|
885
|
-
? ssaoPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
886
|
-
: pass.name === "ssr"
|
|
887
|
-
? ssrPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
888
|
-
: pass.name === "taa"
|
|
889
|
-
? taaPixels(input, source.width, source.height, pass.options).pixels
|
|
890
|
-
: pass.name === "outline"
|
|
891
|
-
? outlinePixels(input, source.width, source.height, pass.options).pixels
|
|
892
|
-
: undefined;
|
|
893
|
-
if (!result) {
|
|
894
|
-
throw new RenderDeviceError("Renderer postprocess pass is outside the supported renderer pass catalog", "POSTPROCESS_PASS_UNKNOWN", {
|
|
895
|
-
pass: pass.name
|
|
896
|
-
});
|
|
897
|
-
}
|
|
898
|
-
writePostProcessPixels(this.device, source, target, result);
|
|
899
|
-
}
|
|
900
|
-
async executePixelPostprocessPassAsync(pass, source, target, forwardTarget) {
|
|
901
|
-
const input = await this.readRenderTargetPixelsAsync(source);
|
|
902
|
-
const rendererDepth = isDepthPostprocessPass(pass.name) && !postprocessPassHasDepth(pass.options)
|
|
903
|
-
? this.readRendererOwnedDepthTexture(forwardTarget)
|
|
904
|
-
: undefined;
|
|
905
|
-
const result = pass.name === "color-grade"
|
|
906
|
-
? colorGradePixels(input, source.width, source.height, pass.options).pixels
|
|
907
|
-
: pass.name === "chromatic-aberration"
|
|
908
|
-
? chromaticAberrationPixels(input, source.width, source.height, pass.options).pixels
|
|
909
|
-
: pass.name === "film-grain"
|
|
910
|
-
? filmGrainPixels(input, source.width, source.height, pass.options).pixels
|
|
911
|
-
: pass.name === "depth-of-field"
|
|
912
|
-
? depthOfFieldPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
913
|
-
: pass.name === "volumetric-light"
|
|
914
|
-
? volumetricLightPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
915
|
-
: pass.name === "motion-blur"
|
|
916
|
-
? motionBlurPixels(input, source.width, source.height, pass.options).pixels
|
|
917
|
-
: pass.name === "contact-shadow"
|
|
918
|
-
? contactShadowPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
919
|
-
: pass.name === "ssao"
|
|
920
|
-
? ssaoPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
921
|
-
: pass.name === "ssr"
|
|
922
|
-
? ssrPixels(input, source.width, source.height, withRendererDepth(pass.options, rendererDepth)).pixels
|
|
923
|
-
: pass.name === "taa"
|
|
924
|
-
? taaPixels(input, source.width, source.height, pass.options).pixels
|
|
925
|
-
: pass.name === "outline"
|
|
926
|
-
? outlinePixels(input, source.width, source.height, pass.options).pixels
|
|
927
|
-
: undefined;
|
|
928
|
-
if (!result) {
|
|
929
|
-
throw new RenderDeviceError("Renderer postprocess pass is outside the supported renderer pass catalog", "POSTPROCESS_PASS_UNKNOWN", {
|
|
930
|
-
pass: pass.name
|
|
931
|
-
});
|
|
932
|
-
}
|
|
933
|
-
writePostProcessPixels(this.device, source, target, result);
|
|
934
|
-
}
|
|
935
|
-
async readRenderTargetPixelsAsync(target) {
|
|
936
|
-
this.device.setRenderTarget(target);
|
|
937
|
-
if (this.device.readPixelsAsync && target.colorTexture.format === "rgba8") {
|
|
938
|
-
return this.device.readPixelsAsync(0, 0, target.width, target.height);
|
|
939
|
-
}
|
|
940
|
-
return this.device.readPixels(0, 0, target.width, target.height);
|
|
941
|
-
}
|
|
942
|
-
async readRenderTargetFloatPixelsAsync(target) {
|
|
943
|
-
this.device.setRenderTarget(target);
|
|
944
|
-
if (this.device.readFloatPixelsAsync && isHdrRenderTarget(target)) {
|
|
945
|
-
return this.device.readFloatPixelsAsync(0, 0, target.width, target.height);
|
|
946
|
-
}
|
|
947
|
-
return this.device.readFloatPixels(0, 0, target.width, target.height);
|
|
948
|
-
}
|
|
949
|
-
readRendererOwnedDepthTexture(forwardTarget) {
|
|
950
|
-
if (!forwardTarget.depthTexture) {
|
|
951
|
-
throw new RenderDeviceError("Renderer-owned depth postprocess requires the forward target to expose a depth texture.", "POSTPROCESS_DEPTH_TARGET_MISSING", {
|
|
952
|
-
renderTarget: forwardTarget.label
|
|
953
|
-
});
|
|
954
|
-
}
|
|
955
|
-
if (!this.device.readDepthPixels) {
|
|
956
|
-
throw new RenderDeviceError("Renderer-owned depth postprocess requires backend depth readback.", "DEPTH_READBACK_UNSUPPORTED", {
|
|
957
|
-
backend: this.device.kind
|
|
958
|
-
});
|
|
959
|
-
}
|
|
960
|
-
this.device.setRenderTarget(forwardTarget);
|
|
961
|
-
return createDepthTextureBinding({
|
|
962
|
-
label: forwardTarget.depthTexture.label,
|
|
963
|
-
width: forwardTarget.width,
|
|
964
|
-
height: forwardTarget.height,
|
|
965
|
-
data: this.device.readDepthPixels(0, 0, forwardTarget.width, forwardTarget.height)
|
|
966
|
-
});
|
|
1384
|
+
return this.host.post.executePostprocessAsync(postprocess, ownedTargets, outputTarget);
|
|
967
1385
|
}
|
|
968
1386
|
executeRendererShadowMap(options) {
|
|
969
|
-
|
|
970
|
-
return undefined;
|
|
971
|
-
}
|
|
972
|
-
if (!this.device.info.capabilities?.includes("render-targets")) {
|
|
973
|
-
throw new RenderDeviceError("Renderer-owned shadows require render targets", "SHADOW_RENDER_TARGET_UNSUPPORTED", {
|
|
974
|
-
backend: this.device.kind
|
|
975
|
-
});
|
|
976
|
-
}
|
|
977
|
-
const light = options.shadowOptions.light ?? firstShadowCastingLight(options.source, options.lights);
|
|
978
|
-
if (light instanceof PointLight) {
|
|
979
|
-
return this.executeRendererPointShadowMap({
|
|
980
|
-
shadowOptions: options.shadowOptions,
|
|
981
|
-
items: options.items,
|
|
982
|
-
ownedTargets: options.ownedTargets,
|
|
983
|
-
ownedShadowPasses: options.ownedShadowPasses,
|
|
984
|
-
light
|
|
985
|
-
});
|
|
986
|
-
}
|
|
987
|
-
if (light && !(light instanceof DirectionalLight) && !(light instanceof SpotLight)) {
|
|
988
|
-
throw new RenderDeviceError("Renderer-owned shadow maps require directional, spot, or point lights.", "SHADOW_LIGHT_TYPE_UNSUPPORTED", {
|
|
989
|
-
lightName: light.name,
|
|
990
|
-
lightType: light.constructor.name
|
|
991
|
-
});
|
|
992
|
-
}
|
|
993
|
-
if (light instanceof DirectionalLight
|
|
994
|
-
&& options.camera instanceof PerspectiveCamera
|
|
995
|
-
&& (options.shadowOptions.cascadeCount ?? 1) > 1) {
|
|
996
|
-
return this.executeRendererCascadedShadowMap({
|
|
997
|
-
shadowOptions: options.shadowOptions,
|
|
998
|
-
items: options.items,
|
|
999
|
-
ownedShadowPasses: options.ownedShadowPasses,
|
|
1000
|
-
light,
|
|
1001
|
-
camera: options.camera
|
|
1002
|
-
});
|
|
1003
|
-
}
|
|
1004
|
-
const lightMatrix = options.shadowOptions.lightMatrix
|
|
1005
|
-
? toMat4(options.shadowOptions.lightMatrix, "shadow.lightMatrix")
|
|
1006
|
-
: createRendererOwnedShadowMatrix(light, options.items, firstShadowCastingCollectedLight(options.lights));
|
|
1007
|
-
const shadowMap = new ShadowMap({
|
|
1008
|
-
size: options.shadowOptions.size,
|
|
1009
|
-
bias: options.shadowOptions.bias,
|
|
1010
|
-
filter: options.shadowOptions.filter,
|
|
1011
|
-
pcfRadius: options.shadowOptions.pcfRadius,
|
|
1012
|
-
pcfSamples: options.shadowOptions.pcfSamples,
|
|
1013
|
-
pcfDistribution: options.shadowOptions.pcfDistribution,
|
|
1014
|
-
label: options.shadowOptions.label ?? "renderer-shadow-map"
|
|
1015
|
-
});
|
|
1016
|
-
const shadowPass = new ShadowPass({
|
|
1017
|
-
light,
|
|
1018
|
-
casters: options.items,
|
|
1019
|
-
shadowMap,
|
|
1020
|
-
viewProjectionMatrix: lightMatrix,
|
|
1021
|
-
shaderLibrary: this.shaderLibrary,
|
|
1022
|
-
renderTarget: this.ensureShadowDepthTarget(shadowMap.size)
|
|
1023
|
-
});
|
|
1024
|
-
options.ownedShadowPasses.push(shadowPass);
|
|
1025
|
-
const result = shadowPass.execute({ device: this.device, width: this.width, height: this.height });
|
|
1026
|
-
if (!result.rendered) {
|
|
1027
|
-
if (result.reason === "no-light" || result.reason === "light-disabled" || result.reason === "not-shadow-casting") {
|
|
1028
|
-
throw new RenderDeviceError("Renderer-owned shadows require an enabled shadow-casting light.", "SHADOW_LIGHT_REQUIRED", {
|
|
1029
|
-
reason: result.reason
|
|
1030
|
-
});
|
|
1031
|
-
}
|
|
1032
|
-
return undefined;
|
|
1033
|
-
}
|
|
1034
|
-
return shadowPass.getForwardShadowMap({
|
|
1035
|
-
lightMatrix,
|
|
1036
|
-
strength: options.shadowOptions.strength,
|
|
1037
|
-
slopeBias: options.shadowOptions.slopeBias,
|
|
1038
|
-
texelSize: options.shadowOptions.texelSize,
|
|
1039
|
-
bias: options.shadowOptions.bias,
|
|
1040
|
-
filterKernel: options.shadowOptions.filterKernel
|
|
1041
|
-
}) ?? undefined;
|
|
1042
|
-
}
|
|
1043
|
-
executeRendererCascadedShadowMap(options) {
|
|
1044
|
-
const cascadeCount = options.shadowOptions.cascadeCount ?? 4;
|
|
1045
|
-
if (!Number.isInteger(cascadeCount) || cascadeCount < 2 || cascadeCount > 4) {
|
|
1046
|
-
throw new RenderDeviceError("Renderer cascadeCount must be an integer in [2, 4].", "SHADOW_CASCADE_CONTRACT", { cascadeCount });
|
|
1047
|
-
}
|
|
1048
|
-
options.camera.transform.updateWorld(undefined, true);
|
|
1049
|
-
const position = cameraWorldPosition(options.camera);
|
|
1050
|
-
const world = options.camera.transform.worldMatrix;
|
|
1051
|
-
const target = [
|
|
1052
|
-
position[0] - (world[8] ?? 0),
|
|
1053
|
-
position[1] - (world[9] ?? 0),
|
|
1054
|
-
position[2] - (world[10] ?? 1)
|
|
1055
|
-
];
|
|
1056
|
-
const cascades = new CascadedShadowMaps({
|
|
1057
|
-
cascadeCount,
|
|
1058
|
-
near: options.camera.near,
|
|
1059
|
-
far: options.camera.far,
|
|
1060
|
-
lambda: options.shadowOptions.cascadeLambda ?? 0.6,
|
|
1061
|
-
size: options.shadowOptions.size,
|
|
1062
|
-
bias: options.shadowOptions.bias,
|
|
1063
|
-
filter: options.shadowOptions.filter,
|
|
1064
|
-
pcfRadius: options.shadowOptions.pcfRadius,
|
|
1065
|
-
pcfSamples: options.shadowOptions.pcfSamples,
|
|
1066
|
-
label: options.shadowOptions.label ?? "renderer-csm"
|
|
1067
|
-
});
|
|
1068
|
-
const fits = cascades.computeStableCameraFits({
|
|
1069
|
-
camera: {
|
|
1070
|
-
position,
|
|
1071
|
-
target,
|
|
1072
|
-
fovYRadians: options.camera.fovYRadians,
|
|
1073
|
-
aspect: options.camera.aspect
|
|
1074
|
-
},
|
|
1075
|
-
lightDirection: options.light.getDirection(),
|
|
1076
|
-
casters: [],
|
|
1077
|
-
receivers: [],
|
|
1078
|
-
padding: options.shadowOptions.cascadePadding ?? 0.25,
|
|
1079
|
-
stabilize: options.shadowOptions.stabilize !== false
|
|
1080
|
-
});
|
|
1081
|
-
const lightMatrices = fits.map(shadowCameraFitViewProjectionMatrix);
|
|
1082
|
-
const cascadePass = new CascadedShadowPass({
|
|
1083
|
-
light: options.light,
|
|
1084
|
-
casters: options.items,
|
|
1085
|
-
cascades,
|
|
1086
|
-
viewProjectionMatrices: lightMatrices,
|
|
1087
|
-
shaderLibrary: this.shaderLibrary
|
|
1088
|
-
});
|
|
1089
|
-
const result = cascadePass.execute({ device: this.device, width: this.width, height: this.height });
|
|
1090
|
-
options.ownedShadowPasses.push(cascadePass);
|
|
1091
|
-
if (!result.rendered)
|
|
1092
|
-
return undefined;
|
|
1093
|
-
const maps = cascadePass.getForwardShadowMaps({
|
|
1094
|
-
lightMatrices,
|
|
1095
|
-
strength: options.shadowOptions.strength,
|
|
1096
|
-
slopeBias: options.shadowOptions.slopeBias,
|
|
1097
|
-
texelSize: options.shadowOptions.texelSize,
|
|
1098
|
-
bias: options.shadowOptions.bias,
|
|
1099
|
-
filterKernel: options.shadowOptions.filterKernel
|
|
1100
|
-
});
|
|
1101
|
-
const first = maps[0];
|
|
1102
|
-
if (!first || maps.length !== result.cascades.length)
|
|
1103
|
-
return undefined;
|
|
1104
|
-
return {
|
|
1105
|
-
...first,
|
|
1106
|
-
cascades: result.cascades.map((cascade, index) => ({
|
|
1107
|
-
index: cascade.index,
|
|
1108
|
-
near: cascade.split.near,
|
|
1109
|
-
far: cascade.split.far,
|
|
1110
|
-
shadowMap: maps[index]
|
|
1111
|
-
}))
|
|
1112
|
-
};
|
|
1113
|
-
}
|
|
1114
|
-
executeRendererPointShadowMap(options) {
|
|
1115
|
-
if (!this.device.writeRenderTargetPixels) {
|
|
1116
|
-
throw new RenderDeviceError("Renderer-owned point shadows require render-target pixel upload for the point-light atlas.", "POINT_SHADOW_ATLAS_UPLOAD_UNSUPPORTED", {
|
|
1117
|
-
backend: this.device.kind
|
|
1118
|
-
});
|
|
1119
|
-
}
|
|
1120
|
-
options.light.transform.updateWorld(undefined, true);
|
|
1121
|
-
const size = options.shadowOptions.size ?? 512;
|
|
1122
|
-
const faceMatrices = createPointShadowFaceMatrices(options.light);
|
|
1123
|
-
const faceRects = createPointShadowFaceRects();
|
|
1124
|
-
const shadowMapOptions = {
|
|
1125
|
-
size,
|
|
1126
|
-
bias: options.shadowOptions.bias,
|
|
1127
|
-
filter: options.shadowOptions.filter,
|
|
1128
|
-
pcfRadius: options.shadowOptions.pcfRadius,
|
|
1129
|
-
pcfSamples: options.shadowOptions.pcfSamples,
|
|
1130
|
-
pcfDistribution: options.shadowOptions.pcfDistribution
|
|
1131
|
-
};
|
|
1132
|
-
const atlasPixels = new Uint8Array(size * 3 * size * 2 * 4);
|
|
1133
|
-
for (let face = 0; face < 6; face += 1) {
|
|
1134
|
-
const faceMatrix = faceMatrices.slice(face * 16, face * 16 + 16);
|
|
1135
|
-
const shadowPass = new ShadowPass({
|
|
1136
|
-
light: options.light,
|
|
1137
|
-
casters: options.items,
|
|
1138
|
-
shadowMap: new ShadowMap({ ...shadowMapOptions, label: `${options.shadowOptions.label ?? "renderer-point-shadow"}-face-${face}` }),
|
|
1139
|
-
viewProjectionMatrix: faceMatrix,
|
|
1140
|
-
shaderLibrary: this.shaderLibrary
|
|
1141
|
-
});
|
|
1142
|
-
options.ownedShadowPasses.push(shadowPass);
|
|
1143
|
-
const result = shadowPass.execute({ device: this.device, width: this.width, height: this.height });
|
|
1144
|
-
if (!result.rendered) {
|
|
1145
|
-
return undefined;
|
|
1146
|
-
}
|
|
1147
|
-
const target = shadowPass.getRenderTarget();
|
|
1148
|
-
if (!target) {
|
|
1149
|
-
throw new RenderDeviceError("Renderer-owned point shadow face did not expose a render target.", "POINT_SHADOW_FACE_TARGET_MISSING", { face });
|
|
1150
|
-
}
|
|
1151
|
-
const facePixels = readShadowFacePixels(this.device, target);
|
|
1152
|
-
blitPointShadowFace(atlasPixels, size * 3, size * 2, facePixels, size, faceRects, face);
|
|
1153
|
-
}
|
|
1154
|
-
const atlasTarget = this.device.createRenderTarget({
|
|
1155
|
-
width: size * 3,
|
|
1156
|
-
height: size * 2,
|
|
1157
|
-
label: `${options.shadowOptions.label ?? "renderer-point-shadow"}-atlas`,
|
|
1158
|
-
format: "rgba8",
|
|
1159
|
-
depth: false
|
|
1160
|
-
});
|
|
1161
|
-
options.ownedTargets.push(atlasTarget);
|
|
1162
|
-
this.device.writeRenderTargetPixels(atlasTarget, atlasPixels);
|
|
1163
|
-
const texture = new TextureBinding({
|
|
1164
|
-
name: "u_pointShadowMapTexture",
|
|
1165
|
-
texture: atlasTarget.colorTexture,
|
|
1166
|
-
sampler: new Sampler({ minFilter: "nearest", magFilter: "nearest", addressU: "clamp-to-edge", addressV: "clamp-to-edge" }),
|
|
1167
|
-
required: true
|
|
1168
|
-
});
|
|
1169
|
-
return {
|
|
1170
|
-
texture: new TextureBinding({
|
|
1171
|
-
name: "u_shadowMapTexture",
|
|
1172
|
-
texture: atlasTarget.colorTexture,
|
|
1173
|
-
sampler: new Sampler({ minFilter: "nearest", magFilter: "nearest", addressU: "clamp-to-edge", addressV: "clamp-to-edge" }),
|
|
1174
|
-
required: true
|
|
1175
|
-
}),
|
|
1176
|
-
lightMatrix: identityMat4(),
|
|
1177
|
-
strength: options.shadowOptions.strength,
|
|
1178
|
-
slopeBias: options.shadowOptions.slopeBias,
|
|
1179
|
-
texelSize: options.shadowOptions.texelSize,
|
|
1180
|
-
bias: options.shadowOptions.bias,
|
|
1181
|
-
filterKernel: options.shadowOptions.filterKernel,
|
|
1182
|
-
pointLight: {
|
|
1183
|
-
texture,
|
|
1184
|
-
lightPosition: [options.light.transform.worldMatrix[12], options.light.transform.worldMatrix[13], options.light.transform.worldMatrix[14]],
|
|
1185
|
-
range: options.light.range,
|
|
1186
|
-
faceMatrices,
|
|
1187
|
-
faceRects,
|
|
1188
|
-
strength: options.shadowOptions.strength,
|
|
1189
|
-
slopeBias: options.shadowOptions.slopeBias,
|
|
1190
|
-
texelSize: [1 / Math.max(1, size * 3), 1 / Math.max(1, size * 2)],
|
|
1191
|
-
bias: options.shadowOptions.bias,
|
|
1192
|
-
filterKernel: options.shadowOptions.filterKernel
|
|
1193
|
-
}
|
|
1194
|
-
};
|
|
1387
|
+
return this.host.shadows.executeRendererShadowMap(options);
|
|
1195
1388
|
}
|
|
1196
1389
|
}
|
|
1197
1390
|
export function pickSceneRenderables(source, ray, options = {}) {
|
|
@@ -1352,28 +1545,6 @@ function inferInitialCanvasDimension(canvas, axis) {
|
|
|
1352
1545
|
const displaySize = Math.round(cssSize * dpr);
|
|
1353
1546
|
return Math.max(1, displaySize || (axis === "width" ? canvas.width : canvas.height) || 1);
|
|
1354
1547
|
}
|
|
1355
|
-
function collectEnvironmentLighting(source) {
|
|
1356
|
-
if (source instanceof Scene || isIterable(source))
|
|
1357
|
-
return undefined;
|
|
1358
|
-
if (source.environmentLighting === false)
|
|
1359
|
-
return cloneEnvironmentLighting(DISABLED_RENDERER_ENVIRONMENT_LIGHTING);
|
|
1360
|
-
if (source.environmentLighting)
|
|
1361
|
-
return source.environmentLighting;
|
|
1362
|
-
return cloneEnvironmentLighting(DEFAULT_RENDERER_ENVIRONMENT_LIGHTING);
|
|
1363
|
-
}
|
|
1364
|
-
function collectEnvironmentBackground(source) {
|
|
1365
|
-
if (source instanceof Scene || isIterable(source) || source.environmentBackground === false)
|
|
1366
|
-
return undefined;
|
|
1367
|
-
return source.environmentBackground;
|
|
1368
|
-
}
|
|
1369
|
-
function collectEnvironmentFog(source) {
|
|
1370
|
-
if (source instanceof Scene || isIterable(source))
|
|
1371
|
-
return undefined;
|
|
1372
|
-
return source.environmentFog;
|
|
1373
|
-
}
|
|
1374
|
-
function collectForwardShadowMap(source) {
|
|
1375
|
-
return source instanceof Scene || isIterable(source) ? undefined : source.shadowMap;
|
|
1376
|
-
}
|
|
1377
1548
|
function collectRenderTarget(source) {
|
|
1378
1549
|
return source instanceof Scene || isIterable(source) ? undefined : source.renderTarget;
|
|
1379
1550
|
}
|
|
@@ -1395,206 +1566,6 @@ function validateExplicitRenderTarget(target, width, height) {
|
|
|
1395
1566
|
});
|
|
1396
1567
|
}
|
|
1397
1568
|
}
|
|
1398
|
-
function collectRendererShadowOptions(source) {
|
|
1399
|
-
if (source instanceof Scene || isIterable(source))
|
|
1400
|
-
return undefined;
|
|
1401
|
-
if (source.shadow === true)
|
|
1402
|
-
return {};
|
|
1403
|
-
if (!source.shadow)
|
|
1404
|
-
return undefined;
|
|
1405
|
-
return source.shadow;
|
|
1406
|
-
}
|
|
1407
|
-
function firstShadowCastingLight(source, lights) {
|
|
1408
|
-
const explicit = lights.find((light) => light.castsShadow && light.source.visible)?.source;
|
|
1409
|
-
if (explicit)
|
|
1410
|
-
return explicit;
|
|
1411
|
-
const scene = sceneFromSource(source);
|
|
1412
|
-
return scene?.collectLights().find((light) => light.visible && light.castsShadow) ?? null;
|
|
1413
|
-
}
|
|
1414
|
-
function firstShadowCastingCollectedLight(lights) {
|
|
1415
|
-
return lights.find((light) => light.castsShadow && light.source.visible);
|
|
1416
|
-
}
|
|
1417
|
-
function lightDirectionFromLight(light) {
|
|
1418
|
-
if (!light)
|
|
1419
|
-
return [0, -1, -1];
|
|
1420
|
-
const direction = light instanceof DirectionalLight ? light.getDirection() : undefined;
|
|
1421
|
-
return normalizeVec3([
|
|
1422
|
-
Number(direction?.[0] ?? 0),
|
|
1423
|
-
Number(direction?.[1] ?? -1),
|
|
1424
|
-
Number(direction?.[2] ?? -1)
|
|
1425
|
-
]);
|
|
1426
|
-
}
|
|
1427
|
-
function createRendererOwnedShadowMatrix(light, items, collectedLight) {
|
|
1428
|
-
if (light instanceof SpotLight) {
|
|
1429
|
-
light.transform.updateWorld(undefined, true);
|
|
1430
|
-
const near = 0.01;
|
|
1431
|
-
const far = Math.max(near + 0.01, light.range);
|
|
1432
|
-
const projectionMatrix = perspectiveMat4(light.angle * 2, 1, near, far);
|
|
1433
|
-
return multiplyMat4(projectionMatrix, light.transform.inverseWorldMatrix);
|
|
1434
|
-
}
|
|
1435
|
-
return createDirectionalShadowMatrix(items, collectedLight?.direction ?? lightDirectionFromLight(light));
|
|
1436
|
-
}
|
|
1437
|
-
function createPointShadowFaceMatrices(light) {
|
|
1438
|
-
light.transform.updateWorld(undefined, true);
|
|
1439
|
-
const position = [
|
|
1440
|
-
light.transform.worldMatrix[12],
|
|
1441
|
-
light.transform.worldMatrix[13],
|
|
1442
|
-
light.transform.worldMatrix[14]
|
|
1443
|
-
];
|
|
1444
|
-
const projection = perspectiveMat4(Math.PI / 2, 1, 0.01, Math.max(0.02, light.range));
|
|
1445
|
-
const faces = [
|
|
1446
|
-
{ direction: [1, 0, 0], up: [0, -1, 0] },
|
|
1447
|
-
{ direction: [-1, 0, 0], up: [0, -1, 0] },
|
|
1448
|
-
{ direction: [0, 1, 0], up: [0, 0, 1] },
|
|
1449
|
-
{ direction: [0, -1, 0], up: [0, 0, -1] },
|
|
1450
|
-
{ direction: [0, 0, 1], up: [0, -1, 0] },
|
|
1451
|
-
{ direction: [0, 0, -1], up: [0, -1, 0] }
|
|
1452
|
-
];
|
|
1453
|
-
const matrices = new Float32Array(6 * 16);
|
|
1454
|
-
for (const [index, face] of faces.entries()) {
|
|
1455
|
-
const view = lookAtMatrix(position, addVec3(position, face.direction), face.up);
|
|
1456
|
-
matrices.set(multiplyMat4(projection, view), index * 16);
|
|
1457
|
-
}
|
|
1458
|
-
return matrices;
|
|
1459
|
-
}
|
|
1460
|
-
function createPointShadowFaceRects() {
|
|
1461
|
-
const rects = new Float32Array(6 * 4);
|
|
1462
|
-
for (let face = 0; face < 6; face += 1) {
|
|
1463
|
-
const column = face % 3;
|
|
1464
|
-
const row = Math.floor(face / 3);
|
|
1465
|
-
rects.set([column / 3, row / 2, 1 / 3, 1 / 2], face * 4);
|
|
1466
|
-
}
|
|
1467
|
-
return rects;
|
|
1468
|
-
}
|
|
1469
|
-
function readShadowFacePixels(device, target) {
|
|
1470
|
-
device.setRenderTarget(target);
|
|
1471
|
-
if (target.depthTexture && device.readDepthPixels) {
|
|
1472
|
-
const depth = device.readDepthPixels(0, 0, target.width, target.height);
|
|
1473
|
-
const pixels = new Uint8Array(target.width * target.height * 4);
|
|
1474
|
-
for (let index = 0; index < depth.length; index += 1) {
|
|
1475
|
-
const byte = Math.max(0, Math.min(255, Math.round((depth[index] ?? 1) * 255)));
|
|
1476
|
-
const offset = index * 4;
|
|
1477
|
-
pixels[offset] = byte;
|
|
1478
|
-
pixels[offset + 1] = byte;
|
|
1479
|
-
pixels[offset + 2] = byte;
|
|
1480
|
-
pixels[offset + 3] = 255;
|
|
1481
|
-
}
|
|
1482
|
-
return pixels;
|
|
1483
|
-
}
|
|
1484
|
-
return device.readPixels(0, 0, target.width, target.height);
|
|
1485
|
-
}
|
|
1486
|
-
function blitPointShadowFace(atlasPixels, atlasWidth, atlasHeight, facePixels, faceSize, faceRects, face) {
|
|
1487
|
-
const rectOffset = face * 4;
|
|
1488
|
-
const destX = Math.round((faceRects[rectOffset] ?? 0) * atlasWidth);
|
|
1489
|
-
const destY = Math.round((faceRects[rectOffset + 1] ?? 0) * atlasHeight);
|
|
1490
|
-
for (let row = 0; row < faceSize; row += 1) {
|
|
1491
|
-
const sourceOffset = row * faceSize * 4;
|
|
1492
|
-
const targetOffset = ((destY + row) * atlasWidth + destX) * 4;
|
|
1493
|
-
atlasPixels.set(facePixels.subarray(sourceOffset, sourceOffset + faceSize * 4), targetOffset);
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
function lookAtMatrix(eye, target, up) {
|
|
1497
|
-
const forward = normalizeVec3(subtractVec3(target, eye));
|
|
1498
|
-
const right = normalizeVec3(crossVec3(forward, up));
|
|
1499
|
-
const correctedUp = crossVec3(right, forward);
|
|
1500
|
-
return [
|
|
1501
|
-
right[0], correctedUp[0], -forward[0], 0,
|
|
1502
|
-
right[1], correctedUp[1], -forward[1], 0,
|
|
1503
|
-
right[2], correctedUp[2], -forward[2], 0,
|
|
1504
|
-
-dotVec3(right, eye), -dotVec3(correctedUp, eye), dotVec3(forward, eye), 1
|
|
1505
|
-
];
|
|
1506
|
-
}
|
|
1507
|
-
function createDirectionalShadowMatrix(items, lightDirection) {
|
|
1508
|
-
const bounds = collectShadowCoverageBounds(items);
|
|
1509
|
-
if (!bounds || bounds.isEmpty()) {
|
|
1510
|
-
return identityMat4();
|
|
1511
|
-
}
|
|
1512
|
-
const basis = directionalLightBasis(lightDirection);
|
|
1513
|
-
const points = boundsCorners(bounds).map((point) => projectPointToLightSpace(point, basis));
|
|
1514
|
-
const lightBounds = boundsFromVec3(points);
|
|
1515
|
-
const width = Math.max(0.01, lightBounds.max[0] - lightBounds.min[0]);
|
|
1516
|
-
const height = Math.max(0.01, lightBounds.max[1] - lightBounds.min[1]);
|
|
1517
|
-
const depth = Math.max(0.01, lightBounds.max[2] - lightBounds.min[2]);
|
|
1518
|
-
const padding = Math.max(width, height, depth) * 0.08 + 0.05;
|
|
1519
|
-
const viewMatrix = lightViewMatrix(basis);
|
|
1520
|
-
const projectionMatrix = orthographicMat4(lightBounds.min[0] - padding, lightBounds.max[0] + padding, lightBounds.min[1] - padding, lightBounds.max[1] + padding, lightBounds.min[2] - padding, lightBounds.max[2] + padding);
|
|
1521
|
-
return multiplyMat4(projectionMatrix, viewMatrix);
|
|
1522
|
-
}
|
|
1523
|
-
function directionalLightBasis(lightDirection) {
|
|
1524
|
-
const forward = normalizeVec3(scaleVec3(normalizeVec3(lightDirection), -1));
|
|
1525
|
-
const fallbackUp = Math.abs(forward[1]) > 0.94 ? [0, 0, 1] : [0, 1, 0];
|
|
1526
|
-
const right = normalizeVec3(crossVec3(fallbackUp, forward));
|
|
1527
|
-
const up = normalizeVec3(crossVec3(forward, right));
|
|
1528
|
-
return { right, up, forward };
|
|
1529
|
-
}
|
|
1530
|
-
function lightViewMatrix(basis) {
|
|
1531
|
-
return [
|
|
1532
|
-
basis.right[0], basis.up[0], basis.forward[0], 0,
|
|
1533
|
-
basis.right[1], basis.up[1], basis.forward[1], 0,
|
|
1534
|
-
basis.right[2], basis.up[2], basis.forward[2], 0,
|
|
1535
|
-
0, 0, 0, 1
|
|
1536
|
-
];
|
|
1537
|
-
}
|
|
1538
|
-
function projectPointToLightSpace(point, basis) {
|
|
1539
|
-
return [dotVec3(point, basis.right), dotVec3(point, basis.up), dotVec3(point, basis.forward)];
|
|
1540
|
-
}
|
|
1541
|
-
function boundsCorners(bounds) {
|
|
1542
|
-
return [
|
|
1543
|
-
[bounds.min[0], bounds.min[1], bounds.min[2]],
|
|
1544
|
-
[bounds.max[0], bounds.min[1], bounds.min[2]],
|
|
1545
|
-
[bounds.min[0], bounds.max[1], bounds.min[2]],
|
|
1546
|
-
[bounds.min[0], bounds.min[1], bounds.max[2]],
|
|
1547
|
-
[bounds.max[0], bounds.max[1], bounds.min[2]],
|
|
1548
|
-
[bounds.max[0], bounds.min[1], bounds.max[2]],
|
|
1549
|
-
[bounds.min[0], bounds.max[1], bounds.max[2]],
|
|
1550
|
-
[bounds.max[0], bounds.max[1], bounds.max[2]]
|
|
1551
|
-
];
|
|
1552
|
-
}
|
|
1553
|
-
function boundsFromVec3(points) {
|
|
1554
|
-
const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];
|
|
1555
|
-
const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];
|
|
1556
|
-
for (const point of points) {
|
|
1557
|
-
for (let axis = 0; axis < 3; axis += 1) {
|
|
1558
|
-
min[axis] = Math.min(min[axis], point[axis]);
|
|
1559
|
-
max[axis] = Math.max(max[axis], point[axis]);
|
|
1560
|
-
}
|
|
1561
|
-
}
|
|
1562
|
-
return { min, max };
|
|
1563
|
-
}
|
|
1564
|
-
function normalizeVec3(value) {
|
|
1565
|
-
const length = Math.hypot(value[0], value[1], value[2]);
|
|
1566
|
-
if (!Number.isFinite(length) || length <= 1e-8)
|
|
1567
|
-
return [0, -1 / Math.SQRT2, -1 / Math.SQRT2];
|
|
1568
|
-
return [value[0] / length, value[1] / length, value[2] / length];
|
|
1569
|
-
}
|
|
1570
|
-
function scaleVec3(value, amount) {
|
|
1571
|
-
return [value[0] * amount, value[1] * amount, value[2] * amount];
|
|
1572
|
-
}
|
|
1573
|
-
function addVec3(left, right) {
|
|
1574
|
-
return [left[0] + right[0], left[1] + right[1], left[2] + right[2]];
|
|
1575
|
-
}
|
|
1576
|
-
function subtractVec3(left, right) {
|
|
1577
|
-
return [left[0] - right[0], left[1] - right[1], left[2] - right[2]];
|
|
1578
|
-
}
|
|
1579
|
-
function crossVec3(left, right) {
|
|
1580
|
-
return [
|
|
1581
|
-
left[1] * right[2] - left[2] * right[1],
|
|
1582
|
-
left[2] * right[0] - left[0] * right[2],
|
|
1583
|
-
left[0] * right[1] - left[1] * right[0]
|
|
1584
|
-
];
|
|
1585
|
-
}
|
|
1586
|
-
function dotVec3(left, right) {
|
|
1587
|
-
return left[0] * right[0] + left[1] * right[1] + left[2] * right[2];
|
|
1588
|
-
}
|
|
1589
|
-
function collectPostprocess(source) {
|
|
1590
|
-
if (source instanceof Scene || isIterable(source))
|
|
1591
|
-
return undefined;
|
|
1592
|
-
if (source.postprocess === true)
|
|
1593
|
-
return {};
|
|
1594
|
-
if (!source.postprocess)
|
|
1595
|
-
return undefined;
|
|
1596
|
-
return source.postprocess;
|
|
1597
|
-
}
|
|
1598
1569
|
function normalizeRendererInput(sourceOrInput, camera) {
|
|
1599
1570
|
if (isRendererInput(sourceOrInput)) {
|
|
1600
1571
|
return { source: sourceOrInput.source, camera: camera ?? sourceOrInput.camera };
|
|
@@ -1618,63 +1589,6 @@ function collectCameraPolicy(source) {
|
|
|
1618
1589
|
return "auto-frame";
|
|
1619
1590
|
return "identity";
|
|
1620
1591
|
}
|
|
1621
|
-
function postprocessRequiresDepthTexture(postprocess) {
|
|
1622
|
-
return Boolean((postprocess.volumetricLight && !postprocess.volumetricLight.depth) ||
|
|
1623
|
-
(postprocess.depthOfField && !postprocess.depthOfField.depth) ||
|
|
1624
|
-
(postprocess.contactShadow && !postprocess.contactShadow.depth) ||
|
|
1625
|
-
(postprocess.ssao && !postprocess.ssao.depth) ||
|
|
1626
|
-
(postprocess.ssr && !postprocess.ssr.depth));
|
|
1627
|
-
}
|
|
1628
|
-
function canFuseLdrPostprocess(source, passes) {
|
|
1629
|
-
const sourceIsHdr = isHdrRenderTarget(source);
|
|
1630
|
-
return passes.length > 0
|
|
1631
|
-
&& (!sourceIsHdr || passes[0]?.name === "tone-mapping" || (passes[0]?.name === "bloom" && passes[1]?.name === "tone-mapping"))
|
|
1632
|
-
&& passes.every((pass) => pass.name === "bloom" || pass.name === "tone-mapping" || pass.name === "color-grade" || pass.name === "depth-of-field" || pass.name === "motion-blur" || pass.name === "ssao" || pass.name === "ssr" || pass.name === "taa" || pass.name === "outline" || pass.name === "fxaa")
|
|
1633
|
-
&& passes.every((pass, index) => {
|
|
1634
|
-
const previousRank = index === 0 ? -1 : ldrFusionPassRank(passes[index - 1].name);
|
|
1635
|
-
return ldrFusionPassRank(pass.name) >= previousRank;
|
|
1636
|
-
});
|
|
1637
|
-
}
|
|
1638
|
-
function ldrFusionPassRank(name) {
|
|
1639
|
-
if (name === "bloom")
|
|
1640
|
-
return -1;
|
|
1641
|
-
if (name === "tone-mapping")
|
|
1642
|
-
return 0;
|
|
1643
|
-
if (name === "color-grade")
|
|
1644
|
-
return 1;
|
|
1645
|
-
if (name === "depth-of-field")
|
|
1646
|
-
return 2;
|
|
1647
|
-
if (name === "motion-blur")
|
|
1648
|
-
return 3;
|
|
1649
|
-
if (name === "ssao")
|
|
1650
|
-
return 4;
|
|
1651
|
-
if (name === "ssr")
|
|
1652
|
-
return 5;
|
|
1653
|
-
if (name === "taa")
|
|
1654
|
-
return 6;
|
|
1655
|
-
if (name === "outline")
|
|
1656
|
-
return 7;
|
|
1657
|
-
if (name === "fxaa")
|
|
1658
|
-
return 8;
|
|
1659
|
-
return Number.POSITIVE_INFINITY;
|
|
1660
|
-
}
|
|
1661
|
-
function isDepthPostprocessPass(name) {
|
|
1662
|
-
return name === "volumetric-light" || name === "depth-of-field" || name === "contact-shadow" || name === "ssao" || name === "ssr";
|
|
1663
|
-
}
|
|
1664
|
-
function postprocessPassHasDepth(options) {
|
|
1665
|
-
return typeof options === "object" && options !== null && "depth" in options && Boolean(options.depth);
|
|
1666
|
-
}
|
|
1667
|
-
function withRendererDepth(options, depth) {
|
|
1668
|
-
return depth && !options.depth ? { ...options, depth } : options;
|
|
1669
|
-
}
|
|
1670
|
-
function defaultPostprocessTargetFormat(device, postprocess) {
|
|
1671
|
-
if (postprocess.toneMapping === false)
|
|
1672
|
-
return "rgba8";
|
|
1673
|
-
return device.info.capabilities?.includes("hdr-render-targets") ? "rgba16f" : "rgba8";
|
|
1674
|
-
}
|
|
1675
|
-
function isHdrRenderTarget(target) {
|
|
1676
|
-
return target.colorTexture.format === "rgba16f" || target.colorTexture.format === "rgba32f";
|
|
1677
|
-
}
|
|
1678
1592
|
function collectSourceCameraPosition(source) {
|
|
1679
1593
|
if (source instanceof Scene || isIterable(source))
|
|
1680
1594
|
return undefined;
|
|
@@ -1691,21 +1605,28 @@ function collectSourceCameraPosition(source) {
|
|
|
1691
1605
|
export function collectRenderItems(source, cameraViewProjection, camera) {
|
|
1692
1606
|
return collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera).items;
|
|
1693
1607
|
}
|
|
1694
|
-
function collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera) {
|
|
1608
|
+
function collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera, keepCulledShadowCasters = false) {
|
|
1695
1609
|
const diagnostics = createRenderCollectionDiagnostics();
|
|
1610
|
+
// 02-S5 (A3D_QR_LIGHTING): frustum-culled items that still cast. A caster
|
|
1611
|
+
// outside the view (a pole behind the camera under a low sun) must reach
|
|
1612
|
+
// the shadow pass. Flag-off collects nothing extra.
|
|
1613
|
+
const culledShadowCasters = keepCulledShadowCasters ? [] : undefined;
|
|
1696
1614
|
if (isIterable(source)) {
|
|
1697
1615
|
const items = applyViewProjection([...source], cameraViewProjection);
|
|
1698
1616
|
diagnostics.submittedObjects += items.length;
|
|
1699
1617
|
diagnostics.visibleObjects += items.length;
|
|
1700
|
-
return { items, diagnostics };
|
|
1618
|
+
return { items, diagnostics, culledShadowCasters: culledShadowCasters ?? [] };
|
|
1701
1619
|
}
|
|
1702
1620
|
if (source instanceof Scene) {
|
|
1703
|
-
const items = collectSceneRenderItems(source, {}, cameraViewProjection, camera, diagnostics);
|
|
1704
|
-
return { items, diagnostics };
|
|
1621
|
+
const items = collectSceneRenderItems(source, {}, cameraViewProjection, camera, diagnostics, culledShadowCasters);
|
|
1622
|
+
return { items, diagnostics, culledShadowCasters: culledShadowCasters ?? [], ...(camera ? { cullingFrustum: camera.frustum } : {}) };
|
|
1705
1623
|
}
|
|
1706
1624
|
const items = [];
|
|
1625
|
+
let cullingFrustum;
|
|
1707
1626
|
if (source.scene) {
|
|
1708
|
-
|
|
1627
|
+
if (source.frustumCulling !== false && camera)
|
|
1628
|
+
cullingFrustum = camera.frustum;
|
|
1629
|
+
items.push(...collectSceneRenderItems(source.scene, source, cameraViewProjection, source.frustumCulling === false ? undefined : camera, diagnostics, culledShadowCasters));
|
|
1709
1630
|
}
|
|
1710
1631
|
const explicitItems = [];
|
|
1711
1632
|
if (source.collectRenderItems) {
|
|
@@ -1715,193 +1636,16 @@ function collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera)
|
|
|
1715
1636
|
explicitItems.push(...source.renderItems);
|
|
1716
1637
|
}
|
|
1717
1638
|
if (explicitItems.length > 0) {
|
|
1718
|
-
const
|
|
1719
|
-
|
|
1639
|
+
const explicitFrustum = explicitCullingFrustum(source, cameraViewProjection, camera);
|
|
1640
|
+
cullingFrustum ??= explicitFrustum;
|
|
1641
|
+
const visibleItems = cullExplicitRenderItems(explicitItems, explicitFrustum, diagnostics, culledShadowCasters);
|
|
1720
1642
|
const optimizedItems = applyRendererOwnedStaticBatching(source, applyRendererOwnedStaticMeshConsolidation(source, visibleItems));
|
|
1721
1643
|
const projectedItems = applyViewProjection(optimizedItems, cameraViewProjection);
|
|
1722
1644
|
items.push(...projectedItems);
|
|
1723
1645
|
}
|
|
1724
|
-
return { items, diagnostics };
|
|
1725
|
-
}
|
|
1726
|
-
function explicitCullingFrustum(source, cameraViewProjection, camera) {
|
|
1727
|
-
// Explicit render-item sources were historically never culled, so culling
|
|
1728
|
-
// stays opt-in: only an explicit `frustumCulling: true` turns it on.
|
|
1729
|
-
if (source.frustumCulling !== true)
|
|
1730
|
-
return undefined;
|
|
1731
|
-
if (camera)
|
|
1732
|
-
return camera.frustum;
|
|
1733
|
-
if (!cameraViewProjection)
|
|
1734
|
-
return undefined;
|
|
1735
|
-
return Frustum.fromMatrix(toMathMat4(cameraViewProjection));
|
|
1736
|
-
}
|
|
1737
|
-
function cullExplicitRenderItems(items, frustum, diagnostics) {
|
|
1738
|
-
if (!frustum) {
|
|
1739
|
-
diagnostics.submittedObjects += items.length;
|
|
1740
|
-
diagnostics.visibleObjects += items.length;
|
|
1741
|
-
return items;
|
|
1742
|
-
}
|
|
1743
|
-
const visible = [];
|
|
1744
|
-
for (const item of items) {
|
|
1745
|
-
diagnostics.submittedObjects += 1;
|
|
1746
|
-
if (!isFrustumCullableRenderItem(item)) {
|
|
1747
|
-
diagnostics.visibleObjects += 1;
|
|
1748
|
-
visible.push(item);
|
|
1749
|
-
continue;
|
|
1750
|
-
}
|
|
1751
|
-
diagnostics.frustumTestedObjects += 1;
|
|
1752
|
-
const bounds = explicitRenderItemWorldBounds(item);
|
|
1753
|
-
if (!frustum.intersectsBox(bounds.toMathBox())) {
|
|
1754
|
-
diagnostics.culledObjects += 1;
|
|
1755
|
-
continue;
|
|
1756
|
-
}
|
|
1757
|
-
diagnostics.visibleObjects += 1;
|
|
1758
|
-
visible.push(item);
|
|
1759
|
-
}
|
|
1760
|
-
return visible;
|
|
1761
|
-
}
|
|
1762
|
-
function isFrustumCullableRenderItem(item) {
|
|
1763
|
-
if (item.drawRange !== undefined)
|
|
1764
|
-
return false;
|
|
1765
|
-
if (item.morphTargets !== undefined || item.morphWeights !== undefined)
|
|
1766
|
-
return false;
|
|
1767
|
-
return true;
|
|
1768
|
-
}
|
|
1769
|
-
function explicitRenderItemWorldBounds(item) {
|
|
1770
|
-
const modelMatrix = toMat4(item.modelMatrix ?? identityMat4(), "modelMatrix", item.label);
|
|
1771
|
-
if (item.skinning) {
|
|
1772
|
-
const local = skinnedItemLocalBounds(item.geometry, item.skinning);
|
|
1773
|
-
return boundsFromLocal(local, modelMatrix, item.instanceTransforms);
|
|
1774
|
-
}
|
|
1775
|
-
return boundsFromLocal(item.geometry.bounds, modelMatrix, item.instanceTransforms);
|
|
1776
|
-
}
|
|
1777
|
-
function boundsFromLocal(envelope, modelMatrix, instanceTransforms) {
|
|
1778
|
-
const local = new SceneBounds3([envelope.min[0], envelope.min[1], envelope.min[2]], [envelope.max[0], envelope.max[1], envelope.max[2]]);
|
|
1779
|
-
if (!instanceTransforms || instanceTransforms.length < 16) {
|
|
1780
|
-
return local.transform(modelMatrix);
|
|
1781
|
-
}
|
|
1782
|
-
let bounds = new SceneBounds3();
|
|
1783
|
-
for (let offset = 0; offset + 16 <= instanceTransforms.length; offset += 16) {
|
|
1784
|
-
const instanceMatrix = toMat4(instanceTransforms.slice(offset, offset + 16), "instanceTransforms");
|
|
1785
|
-
bounds = bounds.union(local.transform(multiplyMat4(modelMatrix, instanceMatrix)));
|
|
1786
|
-
}
|
|
1787
|
-
return bounds;
|
|
1646
|
+
return { items, diagnostics, culledShadowCasters: culledShadowCasters ?? [], ...(cullingFrustum ? { cullingFrustum } : {}) };
|
|
1788
1647
|
}
|
|
1789
|
-
|
|
1790
|
-
function skinnedItemLocalBounds(geometry, skinning) {
|
|
1791
|
-
const cached = skinnedCullingBoundsCache.get(geometry);
|
|
1792
|
-
if (cached && float32ArraysEqual(cached.matrices, skinning.matrices)) {
|
|
1793
|
-
return cached.bounds;
|
|
1794
|
-
}
|
|
1795
|
-
const bounds = computeSkinnedGeometryBounds(geometry, skinning);
|
|
1796
|
-
skinnedCullingBoundsCache.set(geometry, { matrices: new Float32Array(skinning.matrices), bounds });
|
|
1797
|
-
return bounds;
|
|
1798
|
-
}
|
|
1799
|
-
function float32ArraysEqual(left, right) {
|
|
1800
|
-
if (left.length !== right.length)
|
|
1801
|
-
return false;
|
|
1802
|
-
for (let index = 0; index < left.length; index += 1) {
|
|
1803
|
-
if (left[index] !== right[index])
|
|
1804
|
-
return false;
|
|
1805
|
-
}
|
|
1806
|
-
return true;
|
|
1807
|
-
}
|
|
1808
|
-
const staticBatchGeometryIds = new WeakMap();
|
|
1809
|
-
const staticBatchMaterialIds = new WeakMap();
|
|
1810
|
-
let nextStaticBatchResourceId = 1;
|
|
1811
|
-
/**
|
|
1812
|
-
* Merges shared-material static geometry, then hands the result to batching.
|
|
1813
|
-
*
|
|
1814
|
-
* Consolidation runs first because it reduces distinct geometries; whatever it leaves unmerged (single
|
|
1815
|
-
* items, oversized meshes, non-indexed topology) can still be instanced by batching afterwards.
|
|
1816
|
-
*/
|
|
1817
|
-
const staticMeshConsolidationCaches = new WeakMap();
|
|
1818
|
-
function applyRendererOwnedStaticMeshConsolidation(source, items) {
|
|
1819
|
-
if (!source.staticMeshConsolidation)
|
|
1820
|
-
return items;
|
|
1821
|
-
const mergeable = [];
|
|
1822
|
-
const passthrough = [];
|
|
1823
|
-
for (const item of items) {
|
|
1824
|
-
// The same eligibility rule as batching: anything skinned, morphed, instanced, or draw-ranged is
|
|
1825
|
-
// not static geometry and must not have a transform baked into it.
|
|
1826
|
-
if (isStaticBatchCandidate(item)) {
|
|
1827
|
-
mergeable.push({
|
|
1828
|
-
geometry: item.geometry,
|
|
1829
|
-
material: item.material,
|
|
1830
|
-
modelMatrix: item.modelMatrix ?? identityMat4(),
|
|
1831
|
-
...(item.label ? { label: item.label } : {})
|
|
1832
|
-
});
|
|
1833
|
-
}
|
|
1834
|
-
else {
|
|
1835
|
-
passthrough.push(item);
|
|
1836
|
-
}
|
|
1837
|
-
}
|
|
1838
|
-
if (mergeable.length === 0)
|
|
1839
|
-
return items;
|
|
1840
|
-
const options = source.staticMeshConsolidation === true ? {} : source.staticMeshConsolidation;
|
|
1841
|
-
// Cached per render source: merging walks every vertex, so repeating it each frame costs far more
|
|
1842
|
-
// than the draw calls it saves.
|
|
1843
|
-
let cache = staticMeshConsolidationCaches.get(source);
|
|
1844
|
-
if (!cache) {
|
|
1845
|
-
cache = createStaticMeshConsolidationCache();
|
|
1846
|
-
staticMeshConsolidationCaches.set(source, cache);
|
|
1847
|
-
}
|
|
1848
|
-
const consolidated = cache.consolidate(mergeable, {
|
|
1849
|
-
labelPrefix: "renderer-consolidated-mesh",
|
|
1850
|
-
...options
|
|
1851
|
-
});
|
|
1852
|
-
return [...passthrough, ...consolidated.renderItems];
|
|
1853
|
-
}
|
|
1854
|
-
function applyRendererOwnedStaticBatching(source, items) {
|
|
1855
|
-
if (!source.staticBatching)
|
|
1856
|
-
return items;
|
|
1857
|
-
const batchable = [];
|
|
1858
|
-
const passthrough = [];
|
|
1859
|
-
for (const item of items) {
|
|
1860
|
-
if (isStaticBatchCandidate(item)) {
|
|
1861
|
-
batchable.push({
|
|
1862
|
-
geometry: item.geometry,
|
|
1863
|
-
material: item.material,
|
|
1864
|
-
modelMatrix: item.modelMatrix ?? identityMat4(),
|
|
1865
|
-
batchKey: staticBatchKey(item),
|
|
1866
|
-
label: item.label,
|
|
1867
|
-
castShadow: item.castShadow
|
|
1868
|
-
});
|
|
1869
|
-
}
|
|
1870
|
-
else {
|
|
1871
|
-
passthrough.push(item);
|
|
1872
|
-
}
|
|
1873
|
-
}
|
|
1874
|
-
if (batchable.length === 0)
|
|
1875
|
-
return items;
|
|
1876
|
-
const options = source.staticBatching === true ? {} : source.staticBatching;
|
|
1877
|
-
const batched = batchStaticRenderItems(batchable, {
|
|
1878
|
-
labelPrefix: "renderer-static-batch",
|
|
1879
|
-
...options
|
|
1880
|
-
});
|
|
1881
|
-
return [...passthrough, ...batched.renderItems];
|
|
1882
|
-
}
|
|
1883
|
-
function isStaticBatchCandidate(item) {
|
|
1884
|
-
return item.material !== undefined &&
|
|
1885
|
-
item.drawRange === undefined &&
|
|
1886
|
-
item.skinning === undefined &&
|
|
1887
|
-
item.morphTargets === undefined &&
|
|
1888
|
-
item.morphWeights === undefined &&
|
|
1889
|
-
item.instanceTransforms === undefined &&
|
|
1890
|
-
item.instanceColors === undefined &&
|
|
1891
|
-
item.instanceAttributes === undefined;
|
|
1892
|
-
}
|
|
1893
|
-
function staticBatchKey(item) {
|
|
1894
|
-
return `${resourceId(staticBatchGeometryIds, item.geometry)}:${resourceId(staticBatchMaterialIds, item.material)}:shadow-${item.castShadow !== false ? "on" : "off"}`;
|
|
1895
|
-
}
|
|
1896
|
-
function resourceId(ids, resource) {
|
|
1897
|
-
const existing = ids.get(resource);
|
|
1898
|
-
if (existing !== undefined)
|
|
1899
|
-
return existing;
|
|
1900
|
-
const next = nextStaticBatchResourceId++;
|
|
1901
|
-
ids.set(resource, next);
|
|
1902
|
-
return next;
|
|
1903
|
-
}
|
|
1904
|
-
function collectSceneRenderItems(scene, source, cameraViewProjection, camera, diagnostics) {
|
|
1648
|
+
function collectSceneRenderItems(scene, source, cameraViewProjection, camera, diagnostics, culledShadowCasters) {
|
|
1905
1649
|
scene.updateWorldTransforms();
|
|
1906
1650
|
const renderables = scene.collectRenderables();
|
|
1907
1651
|
if (renderables.length === 0) {
|
|
@@ -1943,14 +1687,14 @@ function collectSceneRenderItems(scene, source, cameraViewProjection, camera, di
|
|
|
1943
1687
|
if (camera)
|
|
1944
1688
|
diagnostics.frustumTestedObjects += 1;
|
|
1945
1689
|
}
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1690
|
+
const culled = camera !== undefined && !camera.frustum.intersectsBox(bounds.toMathBox());
|
|
1691
|
+
if (culled && diagnostics)
|
|
1692
|
+
diagnostics.culledObjects += 1;
|
|
1693
|
+
if (culled && !culledShadowCasters)
|
|
1949
1694
|
continue;
|
|
1950
|
-
|
|
1951
|
-
if (diagnostics)
|
|
1695
|
+
if (!culled && diagnostics)
|
|
1952
1696
|
diagnostics.visibleObjects += 1;
|
|
1953
|
-
items.push({
|
|
1697
|
+
(culled ? culledShadowCasters : items).push({
|
|
1954
1698
|
geometry,
|
|
1955
1699
|
material,
|
|
1956
1700
|
label: node.name,
|
|
@@ -1965,7 +1709,12 @@ function collectSceneRenderItems(scene, source, cameraViewProjection, camera, di
|
|
|
1965
1709
|
}
|
|
1966
1710
|
return items;
|
|
1967
1711
|
}
|
|
1968
|
-
|
|
1712
|
+
/** Travel direction of the first shadow-casting directional light (02-S5). */
|
|
1713
|
+
function shadowSunTravel(lights) {
|
|
1714
|
+
const sun = lights.find((light) => light.kind === "directional" && light.castsShadow);
|
|
1715
|
+
return sun ? [sun.direction[0], sun.direction[1], sun.direction[2]] : undefined;
|
|
1716
|
+
}
|
|
1717
|
+
export function createRenderCollectionDiagnostics() {
|
|
1969
1718
|
return {
|
|
1970
1719
|
submittedObjects: 0,
|
|
1971
1720
|
visibleObjects: 0,
|
|
@@ -1973,29 +1722,6 @@ function createRenderCollectionDiagnostics() {
|
|
|
1973
1722
|
frustumTestedObjects: 0
|
|
1974
1723
|
};
|
|
1975
1724
|
}
|
|
1976
|
-
function createPostprocessDiagnostics(postprocess, ownedTargets, width, height, context = {}) {
|
|
1977
|
-
if (!postprocess)
|
|
1978
|
-
return undefined;
|
|
1979
|
-
const passes = createRendererPostprocessPasses(postprocess);
|
|
1980
|
-
const targetFormat = context.targetFormat ?? postprocess.targetFormat ?? "rgba8";
|
|
1981
|
-
return {
|
|
1982
|
-
postprocessPasses: passes.length,
|
|
1983
|
-
postprocessPassNames: passes.map((pass) => pass.name),
|
|
1984
|
-
postprocessTargetFormat: targetFormat,
|
|
1985
|
-
postprocessRenderTargets: ownedTargets.length,
|
|
1986
|
-
postprocessTextures: ownedTargets.reduce((total, target) => total + 1 + (target.depthTexture ? 1 : 0), 0),
|
|
1987
|
-
postprocessTargetWidth: width,
|
|
1988
|
-
postprocessTargetHeight: height,
|
|
1989
|
-
postprocessPlan: createRendererPostprocessPlanDiagnostics(postprocess, {
|
|
1990
|
-
sourceTargetFormat: targetFormat,
|
|
1991
|
-
targetFormat,
|
|
1992
|
-
nativeLdrPostprocess: context.nativeLdrPostprocess,
|
|
1993
|
-
rendererDepthAvailable: context.rendererDepthAvailable,
|
|
1994
|
-
width,
|
|
1995
|
-
height
|
|
1996
|
-
})
|
|
1997
|
-
};
|
|
1998
|
-
}
|
|
1999
1725
|
const CAPTURE_NON_BLANK_LUMINANCE_THRESHOLD = 1 / 255;
|
|
2000
1726
|
const CAPTURE_UNDEREXPOSED_LUMINANCE_THRESHOLD = 5 / 255;
|
|
2001
1727
|
const CAPTURE_OVEREXPOSED_LUMINANCE_THRESHOLD = 250 / 255;
|
|
@@ -2255,19 +1981,6 @@ function withRendererFrameDiagnostics(diagnostics, collection, postprocess) {
|
|
|
2255
1981
|
...(postprocess ?? {})
|
|
2256
1982
|
};
|
|
2257
1983
|
}
|
|
2258
|
-
function renderableWorldBounds(geometry, modelMatrix, instanceTransforms, morphTargets, morphWeights, skinning) {
|
|
2259
|
-
const envelope = computeSkinnedMorphTargetWeightedBounds(geometry, skinning, morphTargets, morphWeights);
|
|
2260
|
-
const local = new SceneBounds3([envelope.min[0], envelope.min[1], envelope.min[2]], [envelope.max[0], envelope.max[1], envelope.max[2]]);
|
|
2261
|
-
if (!instanceTransforms) {
|
|
2262
|
-
return local.transform(modelMatrix);
|
|
2263
|
-
}
|
|
2264
|
-
let bounds = new SceneBounds3();
|
|
2265
|
-
for (let offset = 0; offset < instanceTransforms.length; offset += 16) {
|
|
2266
|
-
const instanceMatrix = toMat4(instanceTransforms.slice(offset, offset + 16), "instanceTransforms");
|
|
2267
|
-
bounds = bounds.union(local.transform(multiplyMat4(modelMatrix, instanceMatrix)));
|
|
2268
|
-
}
|
|
2269
|
-
return bounds;
|
|
2270
|
-
}
|
|
2271
1984
|
function applyViewProjection(items, cameraViewProjection) {
|
|
2272
1985
|
const hasCameraViewProjection = cameraViewProjection !== undefined;
|
|
2273
1986
|
const viewProjection = cameraViewProjection ?? identityMat4();
|
|
@@ -2306,30 +2019,6 @@ function createAutoFrameCamera(source, items, width, height) {
|
|
|
2306
2019
|
function collectRenderItemBounds(items) {
|
|
2307
2020
|
return collectItemBounds(items, true);
|
|
2308
2021
|
}
|
|
2309
|
-
/**
|
|
2310
|
-
* Bounds over every render item, including those excluded from camera
|
|
2311
|
-
* auto-framing.
|
|
2312
|
-
*
|
|
2313
|
-
* `includeInAutoFrame` answers "should the camera frame this?", which is a
|
|
2314
|
-
* composition choice. It must not decide which geometry a shadow frustum covers:
|
|
2315
|
-
* a large ground plane or backdrop is commonly excluded from auto-framing while
|
|
2316
|
-
* still being the surface that receives shadows. Fitting the light frustum to the
|
|
2317
|
-
* auto-frame subset shrinks it to the caster alone, so the receiver falls outside
|
|
2318
|
-
* the shadow map and no shadow is ever visible.
|
|
2319
|
-
*/
|
|
2320
|
-
function collectShadowCoverageBounds(items) {
|
|
2321
|
-
return collectItemBounds(items, false);
|
|
2322
|
-
}
|
|
2323
|
-
function collectItemBounds(items, respectAutoFrameExclusion) {
|
|
2324
|
-
let bounds;
|
|
2325
|
-
for (const item of items) {
|
|
2326
|
-
if (respectAutoFrameExclusion && item.includeInAutoFrame === false)
|
|
2327
|
-
continue;
|
|
2328
|
-
const itemBounds = renderableWorldBounds(item.geometry, toMat4(item.modelMatrix ?? identityMat4(), "modelMatrix", item.label), item.instanceTransforms, item.morphTargets, item.morphWeights, item.skinning);
|
|
2329
|
-
bounds = bounds ? bounds.union(itemBounds) : itemBounds;
|
|
2330
|
-
}
|
|
2331
|
-
return bounds;
|
|
2332
|
-
}
|
|
2333
2022
|
function collectCameraFrameOptions(source) {
|
|
2334
2023
|
if (source instanceof Scene || isIterable(source) || !source.cameraFrameOptions)
|
|
2335
2024
|
return {};
|
|
@@ -2398,7 +2087,7 @@ function resolveCamera(source, camera, viewport, options = {}) {
|
|
|
2398
2087
|
function hasExplicitAutoFrameCameraPolicy(source) {
|
|
2399
2088
|
return !(source instanceof Scene) && !isIterable(source) && source.cameraPolicy === "auto-frame";
|
|
2400
2089
|
}
|
|
2401
|
-
function cameraWorldPosition(camera) {
|
|
2090
|
+
export function cameraWorldPosition(camera) {
|
|
2402
2091
|
const matrix = camera.transform.worldMatrix;
|
|
2403
2092
|
return [matrix[12] ?? 0, matrix[13] ?? 0, matrix[14] ?? 0];
|
|
2404
2093
|
}
|
|
@@ -2413,9 +2102,6 @@ function maybeCameraResize(camera) {
|
|
|
2413
2102
|
function resolveSceneCamera(source) {
|
|
2414
2103
|
return sceneFromSource(source)?.collectCameras()[0];
|
|
2415
2104
|
}
|
|
2416
|
-
function sceneFromSource(source) {
|
|
2417
|
-
return source instanceof Scene ? source : isIterable(source) ? undefined : source.scene;
|
|
2418
|
-
}
|
|
2419
2105
|
function normalMatrixFromModel(modelMatrix) {
|
|
2420
2106
|
let matrix;
|
|
2421
2107
|
try {
|
|
@@ -2446,17 +2132,6 @@ function transposeMat4(matrix) {
|
|
|
2446
2132
|
matrix[3], matrix[7], matrix[11], matrix[15]
|
|
2447
2133
|
];
|
|
2448
2134
|
}
|
|
2449
|
-
function toMat4(value, field, label) {
|
|
2450
|
-
const values = Array.from(value);
|
|
2451
|
-
if (values.length !== 16 || !values.every(Number.isFinite)) {
|
|
2452
|
-
throw new RenderDeviceError("Renderer matrix inputs must be finite mat4 values", "RENDERER_MATRIX_CONTRACT", {
|
|
2453
|
-
field,
|
|
2454
|
-
label,
|
|
2455
|
-
scalars: values.length
|
|
2456
|
-
});
|
|
2457
|
-
}
|
|
2458
|
-
return values;
|
|
2459
|
-
}
|
|
2460
2135
|
function lookupRenderResource(lookup, key) {
|
|
2461
2136
|
if (isReadonlyMap(lookup)) {
|
|
2462
2137
|
return lookup.get(key);
|
|
@@ -2524,33 +2199,4 @@ function normalizeDefaultLightDirection(direction) {
|
|
|
2524
2199
|
}
|
|
2525
2200
|
return [direction[0] / length, direction[1] / length, direction[2] / length];
|
|
2526
2201
|
}
|
|
2527
|
-
function cloneEnvironmentLighting(environment) {
|
|
2528
|
-
return {
|
|
2529
|
-
color: [...environment.color],
|
|
2530
|
-
intensity: environment.intensity,
|
|
2531
|
-
...(environment.proceduralMap
|
|
2532
|
-
? {
|
|
2533
|
-
proceduralMap: {
|
|
2534
|
-
skyColor: [...environment.proceduralMap.skyColor],
|
|
2535
|
-
horizonColor: [...environment.proceduralMap.horizonColor],
|
|
2536
|
-
groundColor: [...environment.proceduralMap.groundColor],
|
|
2537
|
-
specularColor: [...environment.proceduralMap.specularColor],
|
|
2538
|
-
intensity: environment.proceduralMap.intensity,
|
|
2539
|
-
specularIntensity: environment.proceduralMap.specularIntensity
|
|
2540
|
-
}
|
|
2541
|
-
}
|
|
2542
|
-
: {}),
|
|
2543
|
-
...(environment.environmentMapTexture ? { environmentMapTexture: environment.environmentMapTexture } : {}),
|
|
2544
|
-
...(environment.environmentCubeMapTexture ? { environmentCubeMapTexture: environment.environmentCubeMapTexture } : {}),
|
|
2545
|
-
...(environment.environmentMapIntensity !== undefined ? { environmentMapIntensity: environment.environmentMapIntensity } : {}),
|
|
2546
|
-
...(environment.environmentMapSpecularIntensity !== undefined ? { environmentMapSpecularIntensity: environment.environmentMapSpecularIntensity } : {}),
|
|
2547
|
-
...(environment.environmentMapRotation !== undefined ? { environmentMapRotation: environment.environmentMapRotation } : {}),
|
|
2548
|
-
...(environment.environmentMapMipCount !== undefined ? { environmentMapMipCount: environment.environmentMapMipCount } : {}),
|
|
2549
|
-
...(environment.environmentMapEncoding ? { environmentMapEncoding: environment.environmentMapEncoding } : {}),
|
|
2550
|
-
...(environment.environmentBrdfLutTexture ? { environmentBrdfLutTexture: environment.environmentBrdfLutTexture } : {})
|
|
2551
|
-
};
|
|
2552
|
-
}
|
|
2553
|
-
function isIterable(value) {
|
|
2554
|
-
return typeof value[Symbol.iterator] === "function";
|
|
2555
|
-
}
|
|
2556
2202
|
//# sourceMappingURL=Renderer.js.map
|