@aura3d/rendering 3.0.1 → 4.0.0
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 +889 -1254
- 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 +153 -207
- package/dist/WebGL2Device.d.ts.map +1 -1
- package/dist/WebGL2Device.js +822 -3706
- 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/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 +119 -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/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 +2020 -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 +741 -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 +113 -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 +2477 -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 +303 -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/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({
|
|
549
|
+
shadowOptions,
|
|
550
|
+
source,
|
|
551
|
+
items: shadowCasterItems,
|
|
552
|
+
lights,
|
|
553
|
+
ownedTargets,
|
|
554
|
+
ownedShadowPasses,
|
|
555
|
+
camera: resolvedCamera?.camera,
|
|
556
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
557
|
+
})) ?? explicitShadowMap ?? this.executeRendererShadowMap({
|
|
256
558
|
shadowOptions,
|
|
257
559
|
source,
|
|
258
|
-
items:
|
|
560
|
+
items: shadowCasterItems,
|
|
259
561
|
lights,
|
|
260
562
|
ownedTargets,
|
|
261
563
|
ownedShadowPasses,
|
|
262
|
-
camera: resolvedCamera?.camera
|
|
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,26 @@ 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);
|
|
371
805
|
const sourceCameraPosition = collectSourceCameraPosition(source);
|
|
372
806
|
const explicitRenderTarget = collectRenderTarget(source);
|
|
373
807
|
validateExplicitRenderTarget(explicitRenderTarget, this.width, this.height);
|
|
374
808
|
let cameraPosition = sourceCameraPosition ?? resolvedCamera?.cameraPosition;
|
|
809
|
+
// C-05/T0-07: decide the frame's output route before the hooks exist, so
|
|
810
|
+
// contributors see the same v2/legacy resource names the graph writes.
|
|
811
|
+
const route = resolveCoreOutputPostRoute(qrCoreOutputOn(rendererQrFlags(this.device)), collectPostprocess(source));
|
|
812
|
+
const frameHooks = createRendererFrameHooks({
|
|
813
|
+
device: this.device,
|
|
814
|
+
width: this.width,
|
|
815
|
+
height: this.height,
|
|
816
|
+
source,
|
|
817
|
+
camera: toFrameCamera(resolvedCamera, cameraViewProjection, cameraPosition),
|
|
818
|
+
// PRD 11: the app's live C-27 tier (A3D_QR_TIERS); undefined → high.
|
|
819
|
+
tier: this.liveQualityTier()?.settings,
|
|
820
|
+
...(route.skipped ? { flags: withCoreOutputOff(rendererQrFlags(this.device)) } : {})
|
|
821
|
+
});
|
|
375
822
|
if (!resolvedCamera && cameraPolicy === "auto-frame") {
|
|
376
823
|
const autoFrame = createAutoFrameCamera(source, items, this.width, this.height);
|
|
377
824
|
if (autoFrame) {
|
|
@@ -381,11 +828,24 @@ export class Renderer {
|
|
|
381
828
|
}
|
|
382
829
|
}
|
|
383
830
|
let postprocess = collectPostprocess(source);
|
|
384
|
-
if (!postprocess?.temporal || (!postprocess.motionBlur && !postprocess.taa))
|
|
831
|
+
if (!postprocess?.temporal || (!postprocess.motionBlur && !postprocess.taa)) {
|
|
385
832
|
this.temporalHistory.reset();
|
|
833
|
+
this.lastTemporalCameraPosition = undefined;
|
|
834
|
+
}
|
|
386
835
|
const ownedTargets = [];
|
|
387
836
|
const ownedShadowPasses = [];
|
|
388
837
|
this.graph.clear();
|
|
838
|
+
// C-05 (§8.4): under A3D_QR_CORE_OUTPUT encode happens once, in OutputPass.
|
|
839
|
+
// A configured legacy post chain still encodes itself (lane 03 migrates it
|
|
840
|
+
// into post-hdr contributors, Q-03-2/Q-03-3), so the frame takes the legacy
|
|
841
|
+
// chain and bypasses OutputPass: encode stays single, and the authored
|
|
842
|
+
// effects (bloom) are kept instead of dropped. The bypass is reported.
|
|
843
|
+
const qrOutput = route.qrOutput;
|
|
844
|
+
// §6.2.7: lane passes encode in-shader only on the legacy LDR path.
|
|
845
|
+
frameHooks.setOutputColorSpace(postprocess || qrOutput ? "linear" : "srgb");
|
|
846
|
+
this.lastPostSkipped = route.skipped;
|
|
847
|
+
if (route.skipped)
|
|
848
|
+
this.warnPostLegacyRoute(route.skipped);
|
|
389
849
|
let postprocessTargetFormat;
|
|
390
850
|
if (postprocess) {
|
|
391
851
|
const format = postprocess.targetFormat ?? defaultPostprocessTargetFormat(this.device, postprocess);
|
|
@@ -423,19 +883,52 @@ export class Renderer {
|
|
|
423
883
|
const forwardTarget = this.ensureForwardColorTarget(format, requiresDepthTexture, sampleCount);
|
|
424
884
|
ownedTargets.push(forwardTarget);
|
|
425
885
|
this.device.setRenderTarget(forwardTarget);
|
|
886
|
+
frameHooks.setForwardTarget(forwardTarget);
|
|
887
|
+
}
|
|
888
|
+
else if (qrOutput) {
|
|
889
|
+
// C-05: the v2 scene always renders into the HDR target — also on the
|
|
890
|
+
// no-effects route (§8.4: encode once, in OutputPass). The governor's
|
|
891
|
+
// renderScale applies to this target only; OutputPass upsamples.
|
|
892
|
+
const probed = probeHdrTargetFormat(this.device);
|
|
893
|
+
const format = probed === "rgba8" ? "rgba8" : "rgba16f";
|
|
894
|
+
const hdrTarget = this.ensureHdrSceneTarget(format, this.outputOptions.backgroundCoverage === true);
|
|
895
|
+
ownedTargets.push(hdrTarget);
|
|
896
|
+
this.device.setRenderTarget(hdrTarget);
|
|
897
|
+
frameHooks.setForwardTarget(hdrTarget);
|
|
426
898
|
}
|
|
427
899
|
this.device.beginFrame(this.width, this.height);
|
|
428
900
|
try {
|
|
429
901
|
this.lastShadowEvidence = null;
|
|
430
|
-
|
|
902
|
+
items = frameHooks.collect(items);
|
|
903
|
+
// C-28 (#90): scope the shadow-phase CPU submission for frameStats.
|
|
904
|
+
// 02-S5: under A3D_QR_LIGHTING casters come from the pre-cull set
|
|
905
|
+
// (frustum-culled casters rejoin); flag-off keeps the visible items only.
|
|
906
|
+
const shadowCasterItems = rendererQrFlags().on("A3D_QR_LIGHTING")
|
|
907
|
+
? [
|
|
908
|
+
...items,
|
|
909
|
+
...culledCastersReachingView(collectedItems.culledShadowCasters, items, collectedItems.cullingFrustum, shadowSunTravel(lights))
|
|
910
|
+
].filter((item) => item.castShadow !== false)
|
|
911
|
+
: items.filter((item) => item.castShadow !== false);
|
|
912
|
+
const rendererShadowMap = this.frameStatsMonitor?.scope("shadow", () => explicitShadowMap ?? this.executeRendererShadowMap({
|
|
913
|
+
shadowOptions,
|
|
914
|
+
source,
|
|
915
|
+
items: shadowCasterItems,
|
|
916
|
+
lights,
|
|
917
|
+
ownedTargets,
|
|
918
|
+
ownedShadowPasses,
|
|
919
|
+
camera: resolvedCamera?.camera,
|
|
920
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
921
|
+
})) ?? explicitShadowMap ?? this.executeRendererShadowMap({
|
|
431
922
|
shadowOptions,
|
|
432
923
|
source,
|
|
433
|
-
items:
|
|
924
|
+
items: shadowCasterItems,
|
|
434
925
|
lights,
|
|
435
926
|
ownedTargets,
|
|
436
927
|
ownedShadowPasses,
|
|
437
|
-
camera: resolvedCamera?.camera
|
|
928
|
+
camera: resolvedCamera?.camera,
|
|
929
|
+
frameCamera: shadowFrameCamera(cameraViewProjection, cameraPosition)
|
|
438
930
|
});
|
|
931
|
+
frameHooks.addPasses(this.graph, "shadows", items);
|
|
439
932
|
this.lastShadowEvidence = rendererShadowMap ? {
|
|
440
933
|
lightMatrix: Array.from(rendererShadowMap.lightMatrix),
|
|
441
934
|
cascades: rendererShadowMap.cascades?.map(c => ({ index: c.index, near: c.near, far: c.far, lightMatrix: Array.from(c.shadowMap.lightMatrix) })) ?? [],
|
|
@@ -451,46 +944,162 @@ export class Renderer {
|
|
|
451
944
|
}
|
|
452
945
|
this.device.setRenderTarget(forwardTarget);
|
|
453
946
|
}
|
|
947
|
+
else if (qrOutput) {
|
|
948
|
+
// §9.1: clear the HDR target to the linear background color (no ACES
|
|
949
|
+
// pre-inversion — OutputPass owns the whole encode).
|
|
950
|
+
this.device.setRenderTarget(ownedTargets[0] ?? null);
|
|
951
|
+
}
|
|
454
952
|
else {
|
|
455
953
|
this.device.setRenderTarget(explicitRenderTarget ?? null);
|
|
456
954
|
}
|
|
457
|
-
this.device.clear(this.clearColor);
|
|
955
|
+
this.device.clear(qrOutput && !postprocess ? this.outputClearColor ?? this.clearColor : this.clearColor);
|
|
458
956
|
if (environmentBackground) {
|
|
459
957
|
this.graph.addPass(new EnvironmentBackgroundPass({
|
|
460
958
|
...environmentBackground,
|
|
461
|
-
outputColorSpace: postprocess ? "linear" : environmentBackground.outputColorSpace,
|
|
959
|
+
outputColorSpace: postprocess || qrOutput ? "linear" : environmentBackground.outputColorSpace,
|
|
462
960
|
inverseViewProjectionMatrix: environmentBackground.inverseViewProjectionMatrix ?? invertMat4(cameraViewProjection ?? identityMat4()),
|
|
463
961
|
shaderLibrary: this.shaderLibrary
|
|
464
962
|
}));
|
|
963
|
+
frameHooks.addPasses(this.graph, "background", items);
|
|
964
|
+
}
|
|
965
|
+
// PRD-03 Phase 4 (flag-on): >5 m of camera translation within one frame
|
|
966
|
+
// is a cut — reprojection would smear everything, so seed fresh history.
|
|
967
|
+
let temporalPrevVp;
|
|
968
|
+
let rasterViewProjection = cameraViewProjection;
|
|
969
|
+
let temporalAutoReset = false;
|
|
970
|
+
if (postprocess?.temporal && (postprocess.motionBlur || postprocess.taa) && cameraPosition && rendererQrFlags(this.device).on("A3D_QR_POST")) {
|
|
971
|
+
const prev = this.lastTemporalCameraPosition;
|
|
972
|
+
if (prev) {
|
|
973
|
+
const dx = cameraPosition[0] - prev[0];
|
|
974
|
+
const dy = cameraPosition[1] - prev[1];
|
|
975
|
+
const dz = cameraPosition[2] - prev[2];
|
|
976
|
+
temporalAutoReset = dx * dx + dy * dy + dz * dz > 25;
|
|
977
|
+
}
|
|
978
|
+
this.lastTemporalCameraPosition = [cameraPosition[0], cameraPosition[1], cameraPosition[2]];
|
|
465
979
|
}
|
|
466
980
|
if (postprocess?.temporal && (postprocess.motionBlur || postprocess.taa)) {
|
|
467
981
|
if (postprocess.execution === "cpu-deterministic" || !this.device.presentLdrPostprocess)
|
|
468
982
|
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) });
|
|
983
|
+
const temporal = this.temporalHistory.prepare(this.device, this.width, this.height, items, cameraViewProjection, { ...postprocess.temporal, jitter: Boolean(postprocess.taa), ...(temporalAutoReset ? { reset: true } : {}) });
|
|
984
|
+
temporalPrevVp = temporal.v2?.previous;
|
|
985
|
+
// PRD-03 §8.6 (flag-on): generated programs project through the
|
|
986
|
+
// AuraFrame `u_viewProjection`, not the per-item MVP, so the TAA
|
|
987
|
+
// sub-pixel jitter has to ride the camera matrix too — otherwise the
|
|
988
|
+
// raster never moves and S5 has nothing to resolve.
|
|
989
|
+
if (temporal.v2)
|
|
990
|
+
rasterViewProjection = temporal.v2.jittered;
|
|
470
991
|
items = this.temporalHistory.renderItems;
|
|
471
992
|
postprocess = { ...postprocess, ...(postprocess.motionBlur ? { motionBlur: { ...postprocess.motionBlur, temporal } } : {}), ...(postprocess.taa ? { taa: { ...postprocess.taa, temporal } } : {}) };
|
|
472
993
|
this.device.setRenderTarget(ownedTargets[0]);
|
|
473
994
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
cameraPosition
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
995
|
+
if (qrOutput) {
|
|
996
|
+
// §9.1 v2 frame order: opaque → after-opaque (scene-depth copy,
|
|
997
|
+
// contributors) → transmission → transmissive → transparent (engine
|
|
998
|
+
// items + contributor TransparentQueueItems interleaved by sortDepth)
|
|
999
|
+
// → after-transparent.
|
|
1000
|
+
const hdrTarget = ownedTargets[0] ?? null;
|
|
1001
|
+
const coverage = this.outputOptions.backgroundCoverage === true;
|
|
1002
|
+
const split = splitForwardItems(items, cameraPosition ?? undefined);
|
|
1003
|
+
const shared = {
|
|
1004
|
+
items: split.opaque,
|
|
1005
|
+
lights,
|
|
1006
|
+
environmentLighting,
|
|
1007
|
+
environmentFog,
|
|
1008
|
+
inputColorResource: environmentBackground ? ENVIRONMENT_BACKGROUND_COLOR_RESOURCE : undefined,
|
|
1009
|
+
shadowMap: rendererShadowMap,
|
|
1010
|
+
cameraPosition,
|
|
1011
|
+
cameraViewMatrix: resolvedCamera?.viewMatrix,
|
|
1012
|
+
cameraViewProjectionMatrix: rasterViewProjection,
|
|
1013
|
+
outputColorSpace: "linear",
|
|
1014
|
+
shaderLibrary: this.shaderLibrary,
|
|
1015
|
+
backgroundCoverage: coverage,
|
|
1016
|
+
qualityTier: this.liveQualityTier()?.settings
|
|
1017
|
+
};
|
|
1018
|
+
// The graph enforces unique names + single-producer writes; per-phase
|
|
1019
|
+
// resources chain the order, and `aura.scene.color` is written once —
|
|
1020
|
+
// by the final interleaved transparent pass.
|
|
1021
|
+
this.graph.addPass(new ForwardPass({ ...shared, framePass: { name: "prd01.opaque", writes: ["aura.scene.color.opaque"] } }));
|
|
1022
|
+
if (hdrTarget?.depthTexture) {
|
|
1023
|
+
const depthCopy = this.ensureSceneDepthCopy();
|
|
1024
|
+
frameHooks.setSceneDepthCopy(depthCopy);
|
|
1025
|
+
this.graph.addPass(new SceneDepthCopyPass(hdrTarget, depthCopy));
|
|
1026
|
+
}
|
|
1027
|
+
frameHooks.addPasses(this.graph, "after-opaque", items);
|
|
1028
|
+
frameHooks.addPasses(this.graph, "transmission", items);
|
|
1029
|
+
let lastColorResource = "aura.scene.color.opaque";
|
|
1030
|
+
if (split.transmission.length > 0) {
|
|
1031
|
+
lastColorResource = "aura.scene.color.transmission";
|
|
1032
|
+
this.graph.addPass(new ForwardPass({
|
|
1033
|
+
...shared,
|
|
1034
|
+
items: split.transmission,
|
|
1035
|
+
framePass: { name: "prd01.transmission", reads: ["aura.scene.color.opaque"], writes: [lastColorResource] }
|
|
1036
|
+
}));
|
|
1037
|
+
}
|
|
1038
|
+
frameHooks.addTransparentContributorPasses(this.graph, items);
|
|
1039
|
+
const { ctx: contributorCtx, queues } = frameHooks.transparentQueues(items);
|
|
1040
|
+
this.graph.addPass(new InterleavedTransparentPass({ ...shared, items: [] }, split.transparent, queues, contributorCtx, [lastColorResource]));
|
|
1041
|
+
frameHooks.addPasses(this.graph, "after-transparent", items);
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
this.graph.addPass(new ForwardPass({
|
|
1045
|
+
items,
|
|
1046
|
+
lights,
|
|
1047
|
+
environmentLighting,
|
|
1048
|
+
environmentFog,
|
|
1049
|
+
inputColorResource: environmentBackground ? ENVIRONMENT_BACKGROUND_COLOR_RESOURCE : undefined,
|
|
1050
|
+
shadowMap: rendererShadowMap,
|
|
1051
|
+
cameraPosition,
|
|
1052
|
+
cameraViewMatrix: resolvedCamera?.viewMatrix,
|
|
1053
|
+
cameraViewProjectionMatrix: rasterViewProjection,
|
|
1054
|
+
outputColorSpace: postprocess ? "linear" : "srgb",
|
|
1055
|
+
shaderLibrary: this.shaderLibrary
|
|
1056
|
+
}));
|
|
1057
|
+
frameHooks.addPasses(this.graph, "after-opaque", items);
|
|
1058
|
+
frameHooks.addPasses(this.graph, "transmission", items);
|
|
1059
|
+
frameHooks.addPasses(this.graph, "transparent", items);
|
|
1060
|
+
frameHooks.addPasses(this.graph, "after-transparent", items);
|
|
1061
|
+
}
|
|
1062
|
+
// C-28 (#90): scope the forward-phase CPU submission for frameStats.
|
|
1063
|
+
if (this.frameStatsMonitor) {
|
|
1064
|
+
this.frameStatsMonitor.scope("forward", () => this.graph.execute({ device: this.device, width: this.width, height: this.height }));
|
|
1065
|
+
}
|
|
1066
|
+
else {
|
|
1067
|
+
this.graph.execute({ device: this.device, width: this.width, height: this.height });
|
|
1068
|
+
}
|
|
488
1069
|
if (postprocess) {
|
|
489
1070
|
postprocess = bindRendererSsrProjection(postprocess, cameraViewProjection ?? identityMat4());
|
|
490
|
-
|
|
1071
|
+
const frameCamera = toFrameCamera(resolvedCamera, cameraViewProjection, cameraPosition);
|
|
1072
|
+
postprocess = {
|
|
1073
|
+
...postprocess,
|
|
1074
|
+
cameraFrame: frameCamera && temporalPrevVp ? { ...frameCamera, previousViewProjectionMatrix: temporalPrevVp } : frameCamera,
|
|
1075
|
+
postFrameContext: {
|
|
1076
|
+
source,
|
|
1077
|
+
items,
|
|
1078
|
+
sceneDepth: {
|
|
1079
|
+
texture: ownedTargets[0]?.depthTexture ?? null,
|
|
1080
|
+
available: (ownedTargets[0]?.depthTexture ?? null) !== null,
|
|
1081
|
+
linearize: {
|
|
1082
|
+
near: frameCamera?.near ?? 0.1,
|
|
1083
|
+
far: frameCamera?.far ?? 1000,
|
|
1084
|
+
orthographic: frameCamera?.projection === "orthographic"
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
};
|
|
1089
|
+
// C-28 (#91): "post" scope. FrameStats.scope is synchronous, so on the
|
|
1090
|
+
// async path it times the CPU submission up to the first await.
|
|
1091
|
+
await this.scopePost(async () => {
|
|
1092
|
+
await frameHooks.runPhaseAsync("post-hdr", items, postprocess !== undefined);
|
|
1093
|
+
await this.executePostprocessAsync(postprocess, ownedTargets, explicitRenderTarget);
|
|
1094
|
+
});
|
|
491
1095
|
if (postprocess.temporal && (postprocess.motionBlur || postprocess.taa))
|
|
492
|
-
this.
|
|
1096
|
+
this.commitTemporalHistory(Boolean(postprocess.taa));
|
|
1097
|
+
}
|
|
1098
|
+
else if (qrOutput) {
|
|
1099
|
+
await this.scopePost(() => frameHooks.runPhaseAsync("post-hdr", items, true));
|
|
1100
|
+
this.executeOutputPass(frameHooks, items, ownedTargets[0] ?? null, explicitRenderTarget);
|
|
493
1101
|
}
|
|
1102
|
+
await frameHooks.runPhaseAsync("after-output", items);
|
|
494
1103
|
}
|
|
495
1104
|
catch (error) {
|
|
496
1105
|
this.lastShadowEvidence = null;
|
|
@@ -500,6 +1109,10 @@ export class Renderer {
|
|
|
500
1109
|
}
|
|
501
1110
|
finally {
|
|
502
1111
|
this.device.endFrame();
|
|
1112
|
+
if (this.resolutionGovernor && this.frameStatsMonitor) {
|
|
1113
|
+
const frameSample = this.frameStatsMonitor.end();
|
|
1114
|
+
this.resolutionGovernor.sample(frameSample.intervalMs, frameSample.gpuMs);
|
|
1115
|
+
}
|
|
503
1116
|
for (const shadowPass of ownedShadowPasses) {
|
|
504
1117
|
shadowPass.dispose();
|
|
505
1118
|
}
|
|
@@ -520,6 +1133,89 @@ export class Renderer {
|
|
|
520
1133
|
rendererDepthAvailable: Boolean(postprocess && postprocessRequiresDepthTexture(postprocess) && this.device.info.capabilities?.includes("depth-textures"))
|
|
521
1134
|
}));
|
|
522
1135
|
}
|
|
1136
|
+
/**
|
|
1137
|
+
* C-02 (PRD-01 §8.2/§403): warm-then-block. Under `A3D_QR_CORE_GENERATOR`
|
|
1138
|
+
* (default-on under `A3D_QR_CORE`), precompiles the generated programs for
|
|
1139
|
+
* every allow-listed material in the frame — at the current tier and the
|
|
1140
|
+
* next-lower one — before the first draw, so the pass never async-skips in
|
|
1141
|
+
* steady state. Flag-off and non-generated materials are no-ops.
|
|
1142
|
+
*/
|
|
1143
|
+
/**
|
|
1144
|
+
* Shared T0-06 warm input: the exact draw feature records the frame's
|
|
1145
|
+
* generated-program materials need (lights/shadow/environment axes at the
|
|
1146
|
+
* current tier). Returns `materials: []` early when nothing generated.
|
|
1147
|
+
*/
|
|
1148
|
+
collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier) {
|
|
1149
|
+
const ctx = { flags, tier: QUALITY_TIERS[tier] };
|
|
1150
|
+
// T0-05: one record per (material revision, selected feature bits) — the
|
|
1151
|
+
// draw key carries `ShaderFeature.select` bits per item, so the warm list
|
|
1152
|
+
// must too or warmed keys never match draw keys.
|
|
1153
|
+
const records = new Map();
|
|
1154
|
+
const route = { core: qrCoreGeneratorOn(flags), lobes: qrMaterialsLobeProgramsOn(flags) };
|
|
1155
|
+
for (const item of items) {
|
|
1156
|
+
const m = item.material instanceof MaterialInstance ? item.material.baseMaterial : item.material;
|
|
1157
|
+
if (!m || !materialRoutesToGeneratedProgram(m, route, ctx))
|
|
1158
|
+
continue;
|
|
1159
|
+
const mf = m.programFeatures(ctx);
|
|
1160
|
+
const selected = selectShaderFeatureBits({ item, pass: "forward", tier: ctx.tier, flags });
|
|
1161
|
+
// E3 stage-2b: same probe-availability gate ForwardPass applies, so
|
|
1162
|
+
// warmed keys match draw keys for the `prd02.ibl` bit.
|
|
1163
|
+
if (selected[PRD02_IBL_FEATURE] !== undefined && !prd02IblEnvironmentAvailable(environmentLighting, item)) {
|
|
1164
|
+
delete selected[PRD02_IBL_FEATURE];
|
|
1165
|
+
}
|
|
1166
|
+
// #867 (games): same geometry-driven feature mask ForwardPass applies.
|
|
1167
|
+
const attrs = item.geometry.vertexBuffer.format.attributes;
|
|
1168
|
+
const has = (name) => attrs.some((a) => a.semantic === name || a.shaderName === name);
|
|
1169
|
+
const record = featuresForGeometry({ ...mf, features: { ...mf.features, ...selected } }, has);
|
|
1170
|
+
const geometryMask = ["a_uv", "a_uv1", "a_color", "a_joints", "a_weights", "a_joints1", "a_weights1"].map((n) => (has(n) ? 1 : 0)).join("");
|
|
1171
|
+
const key = `${m.shaderKey}:${m.getRevision()}:${geometryMask}:${JSON.stringify(Object.entries(record.features).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))}`;
|
|
1172
|
+
if (!records.has(key))
|
|
1173
|
+
records.set(key, record);
|
|
1174
|
+
}
|
|
1175
|
+
if (records.size === 0)
|
|
1176
|
+
return { materials: [] };
|
|
1177
|
+
const clustered = resolveForwardClusteredLighting(lights, this.width, this.height, cameraViewProjection);
|
|
1178
|
+
const axes = forwardPassFeatureAxes({ lights, shadowMap, environmentLighting, environmentFog }, clustered !== null);
|
|
1179
|
+
clustered?.dispose();
|
|
1180
|
+
return {
|
|
1181
|
+
materials: [...records.values()],
|
|
1182
|
+
lights: [axes.lights],
|
|
1183
|
+
shadows: axes.shadows ? [axes.shadows] : [],
|
|
1184
|
+
environments: [axes.environment]
|
|
1185
|
+
};
|
|
1186
|
+
}
|
|
1187
|
+
async warmGeneratedPrograms(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection) {
|
|
1188
|
+
const flags = rendererQrFlags(this.device);
|
|
1189
|
+
if (!qrGeneratedProgramsOn(flags))
|
|
1190
|
+
return;
|
|
1191
|
+
const tier = this.qualityTierName ?? prd11LiveQualityTier(flags)?.tier ?? "high";
|
|
1192
|
+
const cache = rendererProgramCache(this.device, flags);
|
|
1193
|
+
const input = this.collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier);
|
|
1194
|
+
if (input.materials.length > 0) {
|
|
1195
|
+
const warmup = (this.programWarmup ??= new ProgramWarmup(cache));
|
|
1196
|
+
await warmup.warm(input, tier);
|
|
1197
|
+
}
|
|
1198
|
+
// T0-06: the ready barrier for `programsCompiledSinceReady` — compiles
|
|
1199
|
+
// completing after the first warm count as steady-state leaks.
|
|
1200
|
+
cache.markReady?.();
|
|
1201
|
+
}
|
|
1202
|
+
/**
|
|
1203
|
+
* T0-06: the sync `render` half of warm-then-block. Kicks `acquire` for the
|
|
1204
|
+
* exact draw feature records — async-compile devices start pending entries
|
|
1205
|
+
* (`precompile`/`app.ready` settle them); sync-compile devices compile under
|
|
1206
|
+
* the per-frame bound and converge over the next frames.
|
|
1207
|
+
*/
|
|
1208
|
+
warmGeneratedProgramsSync(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection) {
|
|
1209
|
+
const flags = rendererQrFlags(this.device);
|
|
1210
|
+
if (!qrGeneratedProgramsOn(flags))
|
|
1211
|
+
return;
|
|
1212
|
+
const tier = this.qualityTierName ?? prd11LiveQualityTier(flags)?.tier ?? "high";
|
|
1213
|
+
const cache = rendererProgramCache(this.device, flags);
|
|
1214
|
+
const input = this.collectWarmupInput(items, lights, environmentLighting, environmentFog, shadowMap, cameraViewProjection, flags, tier);
|
|
1215
|
+
for (const features of collectWarmupFeatures(input, tier))
|
|
1216
|
+
cache.acquire(features);
|
|
1217
|
+
cache.markReady?.();
|
|
1218
|
+
}
|
|
523
1219
|
renderScene(scene, camera) {
|
|
524
1220
|
return this.render(scene, camera);
|
|
525
1221
|
}
|
|
@@ -555,14 +1251,83 @@ export class Renderer {
|
|
|
555
1251
|
this.shadowDepthTarget = null;
|
|
556
1252
|
this.forwardColorTarget?.target.dispose();
|
|
557
1253
|
this.forwardColorTarget = null;
|
|
1254
|
+
this.hdrSceneTarget?.target.dispose();
|
|
1255
|
+
this.hdrSceneTarget = null;
|
|
1256
|
+
this.sceneDepthCopyTarget?.dispose();
|
|
1257
|
+
this.sceneDepthCopyTarget = null;
|
|
558
1258
|
this.unsubscribeTemporalDeviceLoss?.();
|
|
1259
|
+
this.unsubscribeDprWatch?.();
|
|
559
1260
|
this.temporalHistory.dispose();
|
|
560
1261
|
this.device.dispose();
|
|
561
1262
|
this.disposed = true;
|
|
562
1263
|
}
|
|
563
1264
|
/** True for renderer-lifetime targets that must survive end-of-frame disposal. */
|
|
564
1265
|
isReusedTarget(target) {
|
|
565
|
-
return target === this.forwardColorTarget?.target || target === this.shadowDepthTarget;
|
|
1266
|
+
return target === this.forwardColorTarget?.target || target === this.shadowDepthTarget || target === this.hdrSceneTarget?.target || target === this.sceneDepthCopyTarget;
|
|
1267
|
+
}
|
|
1268
|
+
/**
|
|
1269
|
+
* C-05 HDR scene target under `A3D_QR_CORE_OUTPUT` — always a sampleable
|
|
1270
|
+
* depth texture (sceneDepth / after-opaque copy), renderScale-sized, MSAA 4x,
|
|
1271
|
+
* plus the BACKGROUND_COVERAGE rgba8 attachment when the option is on.
|
|
1272
|
+
*/
|
|
1273
|
+
ensureHdrSceneTarget(format, coverage) {
|
|
1274
|
+
const scale = Math.min(Math.max(this.renderScale, 0.01), 1);
|
|
1275
|
+
const width = Math.max(1, Math.round(this.width * scale));
|
|
1276
|
+
const height = Math.max(1, Math.round(this.height * scale));
|
|
1277
|
+
// C-36: WebGL2 does not support multisample MRT — coverage forces a
|
|
1278
|
+
// non-MSAA target and is declared via `hdr-msaa-mrt-unsupported`.
|
|
1279
|
+
const sampleCount = coverage ? 1 : 4;
|
|
1280
|
+
const key = `${width}x${height}:${format}:depth-texture:${sampleCount}:${coverage ? "cov" : "std"}`;
|
|
1281
|
+
const cached = this.hdrSceneTarget;
|
|
1282
|
+
if (cached && cached.key === key && !cached.target.disposed)
|
|
1283
|
+
return cached.target;
|
|
1284
|
+
cached?.target.dispose();
|
|
1285
|
+
const target = this.device.createRenderTarget({
|
|
1286
|
+
width,
|
|
1287
|
+
height,
|
|
1288
|
+
label: "renderer-hdr-scene",
|
|
1289
|
+
format,
|
|
1290
|
+
...(coverage ? { colorAttachments: [{ format }, { format: "rgba8" }] } : {}),
|
|
1291
|
+
depth: "texture",
|
|
1292
|
+
sampleCount
|
|
1293
|
+
});
|
|
1294
|
+
this.hdrMsaaMrtDegraded = coverage;
|
|
1295
|
+
this.hdrSceneTarget = { target, key };
|
|
1296
|
+
return target;
|
|
1297
|
+
}
|
|
1298
|
+
ensureSceneDepthCopy() {
|
|
1299
|
+
this.sceneDepthCopyTarget = ensureSceneDepthCopyTarget(this.device, this.sceneDepthCopyTarget, this.width, this.height);
|
|
1300
|
+
return this.sceneDepthCopyTarget;
|
|
1301
|
+
}
|
|
1302
|
+
/**
|
|
1303
|
+
* C-05 OutputPass invocation (§8.4 step "output"): `u_exposure` =
|
|
1304
|
+
* `output.exposure × blackboard["prd03.exposure"]` (upstream defaults to 1
|
|
1305
|
+
* until lane 03 publishes it — Q-03-1).
|
|
1306
|
+
*/
|
|
1307
|
+
executeOutputPass(frameHooks, _items, hdrTarget, explicitRenderTarget) {
|
|
1308
|
+
if (!hdrTarget)
|
|
1309
|
+
return;
|
|
1310
|
+
const o = this.outputOptions;
|
|
1311
|
+
const upstream = frameHooks.blackboardValue(PRD03_EXPOSURE);
|
|
1312
|
+
const appliedExposure = (o.exposure ?? 1) * (typeof upstream === "number" && Number.isFinite(upstream) ? upstream : 1);
|
|
1313
|
+
const format = probeHdrTargetFormat(this.device);
|
|
1314
|
+
const targetFormat = format === "rgba8" ? "rgba8" : "rgba16f";
|
|
1315
|
+
const coverage = o.backgroundCoverage === true;
|
|
1316
|
+
this.device.setRenderTarget(explicitRenderTarget ?? null);
|
|
1317
|
+
rendererOutputPass(this.device).execute(hdrTarget, coverage ? hdrTarget : null, {
|
|
1318
|
+
toneMapping: o.toneMapping ?? DEFAULT_TONE_MAPPING,
|
|
1319
|
+
exposure: appliedExposure,
|
|
1320
|
+
dithering: o.dithering ?? DEFAULT_OUTPUT_DITHERING,
|
|
1321
|
+
backgroundCoverage: coverage,
|
|
1322
|
+
overlay: o.overlay
|
|
1323
|
+
}, explicitRenderTarget ?? "canvas");
|
|
1324
|
+
this.lastAppliedOutput = {
|
|
1325
|
+
toneMapping: o.toneMapping ?? DEFAULT_TONE_MAPPING,
|
|
1326
|
+
exposure: { applied: appliedExposure, source: upstream !== undefined ? "grade" : "output" },
|
|
1327
|
+
dithering: o.dithering ?? DEFAULT_OUTPUT_DITHERING,
|
|
1328
|
+
targetFormat,
|
|
1329
|
+
degraded: targetFormat === "rgba8" ? "rgba8-no-float-target" : this.hdrMsaaMrtDegraded ? "hdr-msaa-mrt-unsupported" : undefined
|
|
1330
|
+
};
|
|
566
1331
|
}
|
|
567
1332
|
/** Allocates the shared forward-color target once per distinct configuration. */
|
|
568
1333
|
ensureForwardColorTarget(format, requiresDepthTexture, sampleCount) {
|
|
@@ -582,21 +1347,9 @@ export class Renderer {
|
|
|
582
1347
|
this.forwardColorTarget = { target, key };
|
|
583
1348
|
return target;
|
|
584
1349
|
}
|
|
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;
|
|
1350
|
+
/** PRD 11: this device's app-bound live C-27 tier (A3D_QR_TIERS on), else undefined. */
|
|
1351
|
+
liveQualityTier() {
|
|
1352
|
+
return prd11LiveQualityTier(rendererQrFlags(this.device));
|
|
600
1353
|
}
|
|
601
1354
|
assertAlive() {
|
|
602
1355
|
if (this.disposed || this.device.disposed) {
|
|
@@ -614,584 +1367,13 @@ export class Renderer {
|
|
|
614
1367
|
}
|
|
615
1368
|
}
|
|
616
1369
|
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;
|
|
1370
|
+
return this.host.post.executePostprocess(postprocess, ownedTargets, outputTarget);
|
|
741
1371
|
}
|
|
742
1372
|
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
|
-
});
|
|
1373
|
+
return this.host.post.executePostprocessAsync(postprocess, ownedTargets, outputTarget);
|
|
967
1374
|
}
|
|
968
1375
|
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
|
-
};
|
|
1376
|
+
return this.host.shadows.executeRendererShadowMap(options);
|
|
1195
1377
|
}
|
|
1196
1378
|
}
|
|
1197
1379
|
export function pickSceneRenderables(source, ray, options = {}) {
|
|
@@ -1352,28 +1534,6 @@ function inferInitialCanvasDimension(canvas, axis) {
|
|
|
1352
1534
|
const displaySize = Math.round(cssSize * dpr);
|
|
1353
1535
|
return Math.max(1, displaySize || (axis === "width" ? canvas.width : canvas.height) || 1);
|
|
1354
1536
|
}
|
|
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
1537
|
function collectRenderTarget(source) {
|
|
1378
1538
|
return source instanceof Scene || isIterable(source) ? undefined : source.renderTarget;
|
|
1379
1539
|
}
|
|
@@ -1395,206 +1555,6 @@ function validateExplicitRenderTarget(target, width, height) {
|
|
|
1395
1555
|
});
|
|
1396
1556
|
}
|
|
1397
1557
|
}
|
|
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
1558
|
function normalizeRendererInput(sourceOrInput, camera) {
|
|
1599
1559
|
if (isRendererInput(sourceOrInput)) {
|
|
1600
1560
|
return { source: sourceOrInput.source, camera: camera ?? sourceOrInput.camera };
|
|
@@ -1618,63 +1578,6 @@ function collectCameraPolicy(source) {
|
|
|
1618
1578
|
return "auto-frame";
|
|
1619
1579
|
return "identity";
|
|
1620
1580
|
}
|
|
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
1581
|
function collectSourceCameraPosition(source) {
|
|
1679
1582
|
if (source instanceof Scene || isIterable(source))
|
|
1680
1583
|
return undefined;
|
|
@@ -1691,21 +1594,28 @@ function collectSourceCameraPosition(source) {
|
|
|
1691
1594
|
export function collectRenderItems(source, cameraViewProjection, camera) {
|
|
1692
1595
|
return collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera).items;
|
|
1693
1596
|
}
|
|
1694
|
-
function collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera) {
|
|
1597
|
+
function collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera, keepCulledShadowCasters = false) {
|
|
1695
1598
|
const diagnostics = createRenderCollectionDiagnostics();
|
|
1599
|
+
// 02-S5 (A3D_QR_LIGHTING): frustum-culled items that still cast. A caster
|
|
1600
|
+
// outside the view (a pole behind the camera under a low sun) must reach
|
|
1601
|
+
// the shadow pass. Flag-off collects nothing extra.
|
|
1602
|
+
const culledShadowCasters = keepCulledShadowCasters ? [] : undefined;
|
|
1696
1603
|
if (isIterable(source)) {
|
|
1697
1604
|
const items = applyViewProjection([...source], cameraViewProjection);
|
|
1698
1605
|
diagnostics.submittedObjects += items.length;
|
|
1699
1606
|
diagnostics.visibleObjects += items.length;
|
|
1700
|
-
return { items, diagnostics };
|
|
1607
|
+
return { items, diagnostics, culledShadowCasters: culledShadowCasters ?? [] };
|
|
1701
1608
|
}
|
|
1702
1609
|
if (source instanceof Scene) {
|
|
1703
|
-
const items = collectSceneRenderItems(source, {}, cameraViewProjection, camera, diagnostics);
|
|
1704
|
-
return { items, diagnostics };
|
|
1610
|
+
const items = collectSceneRenderItems(source, {}, cameraViewProjection, camera, diagnostics, culledShadowCasters);
|
|
1611
|
+
return { items, diagnostics, culledShadowCasters: culledShadowCasters ?? [], ...(camera ? { cullingFrustum: camera.frustum } : {}) };
|
|
1705
1612
|
}
|
|
1706
1613
|
const items = [];
|
|
1614
|
+
let cullingFrustum;
|
|
1707
1615
|
if (source.scene) {
|
|
1708
|
-
|
|
1616
|
+
if (source.frustumCulling !== false && camera)
|
|
1617
|
+
cullingFrustum = camera.frustum;
|
|
1618
|
+
items.push(...collectSceneRenderItems(source.scene, source, cameraViewProjection, source.frustumCulling === false ? undefined : camera, diagnostics, culledShadowCasters));
|
|
1709
1619
|
}
|
|
1710
1620
|
const explicitItems = [];
|
|
1711
1621
|
if (source.collectRenderItems) {
|
|
@@ -1715,193 +1625,16 @@ function collectRenderItemsWithDiagnostics(source, cameraViewProjection, camera)
|
|
|
1715
1625
|
explicitItems.push(...source.renderItems);
|
|
1716
1626
|
}
|
|
1717
1627
|
if (explicitItems.length > 0) {
|
|
1718
|
-
const
|
|
1719
|
-
|
|
1628
|
+
const explicitFrustum = explicitCullingFrustum(source, cameraViewProjection, camera);
|
|
1629
|
+
cullingFrustum ??= explicitFrustum;
|
|
1630
|
+
const visibleItems = cullExplicitRenderItems(explicitItems, explicitFrustum, diagnostics, culledShadowCasters);
|
|
1720
1631
|
const optimizedItems = applyRendererOwnedStaticBatching(source, applyRendererOwnedStaticMeshConsolidation(source, visibleItems));
|
|
1721
1632
|
const projectedItems = applyViewProjection(optimizedItems, cameraViewProjection);
|
|
1722
1633
|
items.push(...projectedItems);
|
|
1723
1634
|
}
|
|
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;
|
|
1788
|
-
}
|
|
1789
|
-
const skinnedCullingBoundsCache = new WeakMap();
|
|
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;
|
|
1635
|
+
return { items, diagnostics, culledShadowCasters: culledShadowCasters ?? [], ...(cullingFrustum ? { cullingFrustum } : {}) };
|
|
1798
1636
|
}
|
|
1799
|
-
function
|
|
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) {
|
|
1637
|
+
function collectSceneRenderItems(scene, source, cameraViewProjection, camera, diagnostics, culledShadowCasters) {
|
|
1905
1638
|
scene.updateWorldTransforms();
|
|
1906
1639
|
const renderables = scene.collectRenderables();
|
|
1907
1640
|
if (renderables.length === 0) {
|
|
@@ -1943,14 +1676,14 @@ function collectSceneRenderItems(scene, source, cameraViewProjection, camera, di
|
|
|
1943
1676
|
if (camera)
|
|
1944
1677
|
diagnostics.frustumTestedObjects += 1;
|
|
1945
1678
|
}
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1679
|
+
const culled = camera !== undefined && !camera.frustum.intersectsBox(bounds.toMathBox());
|
|
1680
|
+
if (culled && diagnostics)
|
|
1681
|
+
diagnostics.culledObjects += 1;
|
|
1682
|
+
if (culled && !culledShadowCasters)
|
|
1949
1683
|
continue;
|
|
1950
|
-
|
|
1951
|
-
if (diagnostics)
|
|
1684
|
+
if (!culled && diagnostics)
|
|
1952
1685
|
diagnostics.visibleObjects += 1;
|
|
1953
|
-
items.push({
|
|
1686
|
+
(culled ? culledShadowCasters : items).push({
|
|
1954
1687
|
geometry,
|
|
1955
1688
|
material,
|
|
1956
1689
|
label: node.name,
|
|
@@ -1965,7 +1698,12 @@ function collectSceneRenderItems(scene, source, cameraViewProjection, camera, di
|
|
|
1965
1698
|
}
|
|
1966
1699
|
return items;
|
|
1967
1700
|
}
|
|
1968
|
-
|
|
1701
|
+
/** Travel direction of the first shadow-casting directional light (02-S5). */
|
|
1702
|
+
function shadowSunTravel(lights) {
|
|
1703
|
+
const sun = lights.find((light) => light.kind === "directional" && light.castsShadow);
|
|
1704
|
+
return sun ? [sun.direction[0], sun.direction[1], sun.direction[2]] : undefined;
|
|
1705
|
+
}
|
|
1706
|
+
export function createRenderCollectionDiagnostics() {
|
|
1969
1707
|
return {
|
|
1970
1708
|
submittedObjects: 0,
|
|
1971
1709
|
visibleObjects: 0,
|
|
@@ -1973,29 +1711,6 @@ function createRenderCollectionDiagnostics() {
|
|
|
1973
1711
|
frustumTestedObjects: 0
|
|
1974
1712
|
};
|
|
1975
1713
|
}
|
|
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
1714
|
const CAPTURE_NON_BLANK_LUMINANCE_THRESHOLD = 1 / 255;
|
|
2000
1715
|
const CAPTURE_UNDEREXPOSED_LUMINANCE_THRESHOLD = 5 / 255;
|
|
2001
1716
|
const CAPTURE_OVEREXPOSED_LUMINANCE_THRESHOLD = 250 / 255;
|
|
@@ -2255,19 +1970,6 @@ function withRendererFrameDiagnostics(diagnostics, collection, postprocess) {
|
|
|
2255
1970
|
...(postprocess ?? {})
|
|
2256
1971
|
};
|
|
2257
1972
|
}
|
|
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
1973
|
function applyViewProjection(items, cameraViewProjection) {
|
|
2272
1974
|
const hasCameraViewProjection = cameraViewProjection !== undefined;
|
|
2273
1975
|
const viewProjection = cameraViewProjection ?? identityMat4();
|
|
@@ -2306,30 +2008,6 @@ function createAutoFrameCamera(source, items, width, height) {
|
|
|
2306
2008
|
function collectRenderItemBounds(items) {
|
|
2307
2009
|
return collectItemBounds(items, true);
|
|
2308
2010
|
}
|
|
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
2011
|
function collectCameraFrameOptions(source) {
|
|
2334
2012
|
if (source instanceof Scene || isIterable(source) || !source.cameraFrameOptions)
|
|
2335
2013
|
return {};
|
|
@@ -2398,7 +2076,7 @@ function resolveCamera(source, camera, viewport, options = {}) {
|
|
|
2398
2076
|
function hasExplicitAutoFrameCameraPolicy(source) {
|
|
2399
2077
|
return !(source instanceof Scene) && !isIterable(source) && source.cameraPolicy === "auto-frame";
|
|
2400
2078
|
}
|
|
2401
|
-
function cameraWorldPosition(camera) {
|
|
2079
|
+
export function cameraWorldPosition(camera) {
|
|
2402
2080
|
const matrix = camera.transform.worldMatrix;
|
|
2403
2081
|
return [matrix[12] ?? 0, matrix[13] ?? 0, matrix[14] ?? 0];
|
|
2404
2082
|
}
|
|
@@ -2413,9 +2091,6 @@ function maybeCameraResize(camera) {
|
|
|
2413
2091
|
function resolveSceneCamera(source) {
|
|
2414
2092
|
return sceneFromSource(source)?.collectCameras()[0];
|
|
2415
2093
|
}
|
|
2416
|
-
function sceneFromSource(source) {
|
|
2417
|
-
return source instanceof Scene ? source : isIterable(source) ? undefined : source.scene;
|
|
2418
|
-
}
|
|
2419
2094
|
function normalMatrixFromModel(modelMatrix) {
|
|
2420
2095
|
let matrix;
|
|
2421
2096
|
try {
|
|
@@ -2446,17 +2121,6 @@ function transposeMat4(matrix) {
|
|
|
2446
2121
|
matrix[3], matrix[7], matrix[11], matrix[15]
|
|
2447
2122
|
];
|
|
2448
2123
|
}
|
|
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
2124
|
function lookupRenderResource(lookup, key) {
|
|
2461
2125
|
if (isReadonlyMap(lookup)) {
|
|
2462
2126
|
return lookup.get(key);
|
|
@@ -2524,33 +2188,4 @@ function normalizeDefaultLightDirection(direction) {
|
|
|
2524
2188
|
}
|
|
2525
2189
|
return [direction[0] / length, direction[1] / length, direction[2] / length];
|
|
2526
2190
|
}
|
|
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
2191
|
//# sourceMappingURL=Renderer.js.map
|