@woosh/meep-engine 3.11.2 → 3.12.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/README.md +14 -18
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/SelectionVisualizer.js +127 -127
- package/editor/entity_world_bounds.js +27 -27
- package/editor/particles/rebuildParticleEmitter.js +31 -31
- package/editor/process/SymbolicDisplayProcess.js +1 -1
- package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
- package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
- package/editor/prototypeEditorShell.js +156 -156
- package/editor/selection/editor_pick.js +130 -130
- package/editor/selection/screen_rect_frustum.js +119 -119
- package/editor/tools/v2/TransformControls.js +971 -971
- package/package.json +1 -1
- package/src/engine/Engine.d.ts +3 -3
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +726 -726
- package/src/engine/EngineHarness.d.ts +1 -1
- package/src/engine/EngineHarness.js +590 -590
- package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
- package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
- package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
- package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
- package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
- package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
- package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
- package/src/engine/graphics/ecs/water/Water.js +104 -104
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
- package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
- package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
- package/src/engine/graphics3/AnimationSystem.js +352 -0
- package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
- package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem3.js +6 -348
- package/src/engine/graphics3/CameraSystem.d.ts +49 -0
- package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
- package/src/engine/graphics3/CameraSystem.js +170 -0
- package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
- package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/CameraSystem3.js +6 -166
- package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
- package/src/engine/graphics3/DebugDrawSystem.js +205 -0
- package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
- package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
- package/src/engine/graphics3/DecalSystem.d.ts +81 -0
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
- package/src/engine/graphics3/DecalSystem.js +441 -0
- package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
- package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem3.js +6 -437
- package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
- package/src/engine/graphics3/FogOfWarSystem.js +265 -0
- package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
- package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
- package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
- package/src/engine/graphics3/GraphicsEngine.js +790 -0
- package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
- package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine3.js +6 -786
- package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
- package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
- package/src/engine/graphics3/HighlightSystem.js +241 -0
- package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
- package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightSystem3.js +6 -237
- package/src/engine/graphics3/LightSystem.d.ts +40 -0
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
- package/src/engine/graphics3/LightSystem.js +211 -0
- package/src/engine/graphics3/LightSystem3.d.ts +6 -36
- package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem3.js +6 -207
- package/src/engine/graphics3/MeshSystem.d.ts +106 -0
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
- package/src/engine/graphics3/MeshSystem.js +647 -0
- package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
- package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem3.js +6 -642
- package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
- package/src/engine/graphics3/ParticipatingMedia.js +203 -203
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
- package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
- package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
- package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
- package/src/engine/graphics3/PathDisplaySystem.js +309 -0
- package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
- package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
- package/src/engine/graphics3/Pickable.d.ts +1 -1
- package/src/engine/graphics3/Pickable.js +65 -65
- package/src/engine/graphics3/PickingQuery.d.ts +1 -1
- package/src/engine/graphics3/PickingQuery.js +48 -48
- package/src/engine/graphics3/PickingSystem.d.ts +67 -0
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
- package/src/engine/graphics3/PickingSystem.js +273 -0
- package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
- package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem3.js +6 -269
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
- package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
- package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
- package/src/engine/graphics3/TerrainSystem.js +566 -0
- package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
- package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem3.js +6 -562
- package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
- package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
- package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
- package/src/engine/graphics3/Trail3DSystem.js +221 -0
- package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
- package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem3.js +6 -217
- package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
- package/src/engine/graphics3/VolumetricLightMap.js +2 -2
- package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
- package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
- package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
- package/src/engine/graphics3/WaterSystem.d.ts +59 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/WaterSystem.js +293 -0
- package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
- package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem3.js +6 -289
- package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
- package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
- package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
- package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
- package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
- package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
- package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
- package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
- package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
- package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
- package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +994 -940
- package/src/shade/device/immediate_data_supported.d.ts +33 -0
- package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
- package/src/shade/device/immediate_data_supported.js +53 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
- package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
- package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
- package/src/shade/renderer/GraphicsContext.d.ts +9 -2
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +13 -1
- package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
- package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
- package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -84
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
- package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
- package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
- package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +10 -9
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
- package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
- package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
- package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
- package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
- package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
- package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
- package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +57 -57
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
- package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
- package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
- package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
- package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
- package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +350 -292
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +217 -214
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +46 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
- package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
- package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
- package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
- package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
- package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/NOTES.md +238 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +591 -577
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +17 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +20 -2
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
- package/src/shade/renderer/water/shader_water.js +246 -246
- package/src/shade/vitest.setup.mjs +1 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
- package/src/view/minimap/Minimap.d.ts +2 -2
- package/src/view/minimap/Minimap.d.ts.map +1 -1
- package/src/view/minimap/Minimap.js +225 -225
- package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +206 -206
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
|
@@ -1,292 +1,291 @@
|
|
|
1
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
-
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
3
|
-
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
-
import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
5
|
-
import { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
|
|
6
|
-
import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* NSS postprocess pass. Runs at output-resolution (one thread per output
|
|
10
|
-
* pixel). Reads:
|
|
11
|
-
* - the per-render-pixel KPN columns (z=2..5 of the network output 3D
|
|
12
|
-
* texture, in REVERSE order — slot 5 is column 0). Each column has
|
|
13
|
-
* 4 channels = the 4 row weights for that column.
|
|
14
|
-
* - the per-render-pixel ThetaAlpha (z=1): theta in .x (history blend
|
|
15
|
-
* weight, [0, 1]), alpha in .y (accumulation rate, scaled to
|
|
16
|
-
* [0.05, 0.4])
|
|
17
|
-
* - the jittered scene colour at render-res (used for the spatial taps)
|
|
18
|
-
* - the warped history at output-res
|
|
19
|
-
* - the nearest-depth offset from preprocess (used to dilate velocity)
|
|
20
|
-
*
|
|
21
|
-
* Per-output-pixel logic mirrors ARM's reference (UE5.5 NSSPostprocess.usf):
|
|
22
|
-
* 1. Solve which render-res pixel feeds each of the 4x4 KPN taps.
|
|
23
|
-
* 2. Apply the KPN to those taps, normalising by the weight sum.
|
|
24
|
-
* 3. Warp the history (bilinear) using velocity dilated by the nearest
|
|
25
|
-
* depth offset.
|
|
26
|
-
* 4. Blend the KPN colour with warped history using theta.
|
|
27
|
-
* 5. In tonemapped (Karis) space, accumulate the center tap with alpha.
|
|
28
|
-
* 6. Inverse tonemap, divide by EXPOSURE, write.
|
|
29
|
-
*
|
|
30
|
-
* @see ARM reference: UE5.5/Shaders/Private/NSSPostprocess.usf and
|
|
31
|
-
* NSSCommon.ush in github.com/arm/neural-graphics-for-unreal
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
35
|
-
resources.createGroup()
|
|
36
|
-
.addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
|
|
37
|
-
// ── KPN coefficients + ThetaAlpha + FB (network output, 3D, depth=6) ──
|
|
38
|
-
.addTexture("tNetworkOut", "float", "3d")
|
|
39
|
-
// ── render-res inputs ──
|
|
40
|
-
.addTexture("tColour", "float") // jittered scene colour
|
|
41
|
-
.addTexture("tVelocity", "float") // pixel-space motion vectors
|
|
42
|
-
.addTexture("tNearestOffset", "float") // packed (-1, 0, 1)² offset
|
|
43
|
-
// ── output-res input ──
|
|
44
|
-
.addTexture("tHistory", "float") // previous frame upscaled colour
|
|
45
|
-
// ── settings ──
|
|
46
|
-
.addUniform("settings", NSS_SETTINGS_STRUCT)
|
|
47
|
-
// ── outputs ──
|
|
48
|
-
.addStorageTexture("tOutput", "rgba16float", "2d", "write-only")
|
|
49
|
-
;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const body = CodeChunk.from(
|
|
53
|
-
//language=WGSL
|
|
54
|
-
`
|
|
55
|
-
const NSS_EXPOSURE: f32 = 7.38905609893; // e^2, matches ARM's NSSCommon.ush
|
|
56
|
-
|
|
57
|
-
// Karis tonemap (max-of-channels) — matches ARM's NSSCommon.ush.
|
|
58
|
-
fn nss_tonemap(rgb: vec3<f32>) -> vec3<f32> {
|
|
59
|
-
let m = max(max(rgb.r, rgb.g), rgb.b);
|
|
60
|
-
return rgb / (1.0 + m);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Karis inverse — clamp to dodge the inf at m == 1.0.
|
|
64
|
-
fn nss_tonemap_inv(rgb: vec3<f32>) -> vec3<f32> {
|
|
65
|
-
let c = clamp(rgb, vec3<f32>(0.0), vec3<f32>(0.99999));
|
|
66
|
-
let m = max(max(c.r, c.g), c.b);
|
|
67
|
-
return c / (1.0 - m);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
fn nss_warped_history(prev_uv: vec2<f32>) -> vec3<f32> {
|
|
71
|
-
let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
|
|
72
|
-
if (!on_screen) {
|
|
73
|
-
return vec3<f32>(0.0);
|
|
74
|
-
}
|
|
75
|
-
// ARM uses Catmull-Rom by default for the history warp; bilinear is the
|
|
76
|
-
// simpler approximation we keep here. (Catmull-Rom is in their
|
|
77
|
-
// CatmullRomWithDering helper — TODO: port if quality demands it.)
|
|
78
|
-
return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Bilinear-sample a single z-slice of the network output 3D texture at a
|
|
82
|
-
// render-res pixel position. Mirrors ARM's ManualBilinear4 — without this
|
|
83
|
-
// every 2x2 output block in 2x mode would share the same per-render-pixel
|
|
84
|
-
// theta/alpha/KPN values, leaving sharp blocky transitions. We do manual
|
|
85
|
-
// 4-tap bilinear (rather than textureSampleLevel with the linear sampler)
|
|
86
|
-
// so adjacent z layers — which carry semantically different head outputs —
|
|
87
|
-
// don't get filtered together.
|
|
88
|
-
fn nss_sample_layer_bilinear(render_pos: vec2<f32>, render_res_max: vec2<i32>, layer: i32) -> vec4<f32> {
|
|
89
|
-
let pos = render_pos - 0.5;
|
|
90
|
-
let base = floor(pos);
|
|
91
|
-
let frac = pos - base;
|
|
92
|
-
let bi = vec2<i32>(base);
|
|
93
|
-
let lo = vec2<i32>(0, 0);
|
|
94
|
-
let s00 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi, lo, render_res_max), layer), 0);
|
|
95
|
-
let s10 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,0), lo, render_res_max), layer), 0);
|
|
96
|
-
let s01 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(0,1), lo, render_res_max), layer), 0);
|
|
97
|
-
let s11 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,1), lo, render_res_max), layer), 0);
|
|
98
|
-
return mix(mix(s00, s10, frac.x), mix(s01, s11, frac.x), frac.y);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// SolveInputLocation: figure out which render-res pixel maps to a given
|
|
102
|
-
// output-res pixel position, given upscale ratio and jitter. Direct port
|
|
103
|
-
// of ARM's helper (NSSPostprocess.usf:80). Returns -1 when no render-res
|
|
104
|
-
// sample lands at this output position.
|
|
105
|
-
fn nss_solve_input_location(out_idx: i32, upscale: f32, jitter: f32) -> i32 {
|
|
106
|
-
let lower = f32(out_idx) / upscale - (-jitter + 0.5);
|
|
107
|
-
let upper = f32(out_idx + 1) / upscale - (-jitter + 0.5);
|
|
108
|
-
let candidate = i32(floor(upper));
|
|
109
|
-
if (lower < f32(candidate)) {
|
|
110
|
-
return candidate;
|
|
111
|
-
}
|
|
112
|
-
return -1;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
@compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
|
|
116
|
-
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
117
|
-
let out_res_u = settings.output_resolution;
|
|
118
|
-
let render_res_u = settings.render_resolution;
|
|
119
|
-
|
|
120
|
-
if (any(gid.xy >= out_res_u)) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
let out_st = vec2<i32>(gid.xy);
|
|
125
|
-
let render_res = vec2<i32>(render_res_u);
|
|
126
|
-
|
|
127
|
-
let out_res_f = vec2<f32>(out_res_u);
|
|
128
|
-
let render_res_f = vec2<f32>(render_res_u);
|
|
129
|
-
let upscale = out_res_f / render_res_f;
|
|
130
|
-
|
|
131
|
-
// Render-res pixel that hosts this output pixel's nearest network sample.
|
|
132
|
-
// (Used for the per-render-res velocity / nearest-offset taps; the
|
|
133
|
-
// network's per-pixel theta/alpha/KPN outputs are bilinear-sampled at
|
|
134
|
-
// the OUTPUT pixel's render-res position instead — see below.)
|
|
135
|
-
let render_centre = (vec2<f32>(out_st) + 0.5) / upscale;
|
|
136
|
-
let coef_st = vec2<i32>(floor(render_centre));
|
|
137
|
-
let render_res_max = render_res - vec2<i32>(1, 1);
|
|
138
|
-
let coef_st_clamped = clamp(coef_st, vec2<i32>(0, 0), render_res_max);
|
|
139
|
-
|
|
140
|
-
// ── KPN columns ──
|
|
141
|
-
// ARM's quantized model maps OutputIndices.KPNFilterCol0 = 5,
|
|
142
|
-
// KPNFilterCol1 = 4, KPNFilterCol2 = 3, KPNFilterCol3 = 2 (NSS.cpp:243).
|
|
143
|
-
// Each column has 4 channels = the 4 row weights for that column.
|
|
144
|
-
// Bilinear at render_centre (matches ARM's ManualBilinear4) — without
|
|
145
|
-
// this, every 2x2 output block in 2x mode shares one set of weights and
|
|
146
|
-
// we get blocky/jittery transitions across cell boundaries.
|
|
147
|
-
let col0 = nss_sample_layer_bilinear(render_centre, render_res_max, 5);
|
|
148
|
-
let col1 = nss_sample_layer_bilinear(render_centre, render_res_max, 4);
|
|
149
|
-
let col2 = nss_sample_layer_bilinear(render_centre, render_res_max, 3);
|
|
150
|
-
let col3 = nss_sample_layer_bilinear(render_centre, render_res_max, 2);
|
|
151
|
-
// Force tiny positive — ARM does this to dodge 0/0 in the
|
|
152
|
-
// weight-normalisation divide (NSSPostprocess.usf:118).
|
|
153
|
-
let kpn_cols = array<vec4<f32>, 4>(
|
|
154
|
-
max(col0, vec4<f32>(1e-7)),
|
|
155
|
-
max(col1, vec4<f32>(1e-7)),
|
|
156
|
-
max(col2, vec4<f32>(1e-7)),
|
|
157
|
-
max(col3, vec4<f32>(1e-7)),
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
// ── Apply KPN ──
|
|
161
|
-
// Outer loop is column index (matches ARM's "for x in 0..3" - we
|
|
162
|
-
// load the 4 cols above and pick by index here). Inner loop is row
|
|
163
|
-
// index. Each (col, row) tap reads the render-res sample at
|
|
164
|
-
// OutputPixelPos + (col-1, row-1) and accumulates colour * weight,
|
|
165
|
-
// with the centre tap (col=1, row=1) also captured for the
|
|
166
|
-
// alpha-blend stage.
|
|
167
|
-
var filtered_rgb = vec3<f32>(0.0);
|
|
168
|
-
var weight_sum = 0.0;
|
|
169
|
-
var center_tap_rgb = vec3<f32>(0.0);
|
|
170
|
-
var center_tap_present = 0.0;
|
|
171
|
-
for (var x = 0; x < 4; x = x + 1) {
|
|
172
|
-
let col = kpn_cols[x];
|
|
173
|
-
for (var y = 0; y < 4; y = y + 1) {
|
|
174
|
-
let weight = col[y];
|
|
175
|
-
let tap_out = out_st + vec2<i32>(x - 1, y - 1);
|
|
176
|
-
|
|
177
|
-
let in_x = nss_solve_input_location(tap_out.x, upscale.x, settings.jitter.x * settings.jitter_sign.x);
|
|
178
|
-
let in_y = nss_solve_input_location(tap_out.y, upscale.y, settings.jitter.y * settings.jitter_sign.y);
|
|
179
|
-
if (in_x < 0 || in_y < 0) {
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
let sample_st = clamp(vec2<i32>(in_x, in_y), vec2<i32>(0, 0), render_res - vec2<i32>(1, 1));
|
|
184
|
-
let sample_rgb = max(vec3<f32>(0.0), textureLoad(tColour, sample_st, 0).rgb) * NSS_EXPOSURE;
|
|
185
|
-
|
|
186
|
-
filtered_rgb += sample_rgb * weight;
|
|
187
|
-
weight_sum += weight;
|
|
188
|
-
|
|
189
|
-
if (x == 1 && y == 1) {
|
|
190
|
-
center_tap_rgb = sample_rgb;
|
|
191
|
-
center_tap_present = 1.0;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
let kpn_rgb = filtered_rgb / max(weight_sum, 1e-5);
|
|
196
|
-
|
|
197
|
-
// ── Warp history ──
|
|
198
|
-
// Decode the nearest-depth offset to {-1, 0, 1}², use it to dilate
|
|
199
|
-
// the velocity tap to the depth-nearest sample (same trick as
|
|
200
|
-
// preprocess).
|
|
201
|
-
let nearest_packed = textureLoad(tNearestOffset, coef_st_clamped, 0).rg;
|
|
202
|
-
let nearest_offset = vec2<i32>(round(nearest_packed * 2.0 - 1.0));
|
|
203
|
-
|
|
204
|
-
var velocity = textureLoad(tVelocity, coef_st_clamped + nearest_offset, 0).rg;
|
|
205
|
-
// Motion zero-clamp (ARM NSSPostprocess.usf:215). Sub-pixel velocity on
|
|
206
|
-
// near-static frames drifts prev_uv by fractions of a pixel each frame
|
|
207
|
-
// and bilinear-resamples the history at slightly different sub-pixel
|
|
208
|
-
// positions — visible as flicker even when nothing in the scene is
|
|
209
|
-
// moving. ARM's threshold is 0.1 input pixels.
|
|
210
|
-
if (length(velocity) <= 0.1) {
|
|
211
|
-
velocity = vec2<f32>(0.0);
|
|
212
|
-
}
|
|
213
|
-
let velocity_out = velocity / (render_res_f / out_res_f); // render-res pixels → output-res pixels
|
|
214
|
-
|
|
215
|
-
let prev_out_st = vec2<f32>(out_st) + 0.5 - velocity_out;
|
|
216
|
-
let prev_uv = prev_out_st / out_res_f;
|
|
217
|
-
|
|
218
|
-
let history_rgb = nss_warped_history(prev_uv) * NSS_EXPOSURE;
|
|
219
|
-
let on_screen_f = select(0.0, 1.0, all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0)));
|
|
220
|
-
|
|
221
|
-
// ── ThetaAlpha (head slot 1) ──
|
|
222
|
-
// ARM's quantized model maps OutputIndices.ThetaAlpha = 1
|
|
223
|
-
// (NSS.cpp:242). Channel x = theta (history blend weight, [0, 1] from
|
|
224
|
-
// sigmoid LUT), channel y = alpha (raw [0, 1], remapped to
|
|
225
|
-
// [0.05, 0.4] per NSSPostprocess.usf:248).
|
|
226
|
-
// Bilinear at render_centre — same reasoning as the KPN cols above.
|
|
227
|
-
let ta = nss_sample_layer_bilinear(render_centre, render_res_max, 1);
|
|
228
|
-
let theta_network = saturate(ta.x);
|
|
229
|
-
let theta_raw = select(theta_network, saturate(settings.theta_override), settings.theta_override >= 0.0);
|
|
230
|
-
let theta = theta_raw * saturate(settings.history_validity) * on_screen_f;
|
|
231
|
-
let alpha = (0.35 * saturate(ta.y) + 0.05) * settings.alpha_blend_scale;
|
|
232
|
-
|
|
233
|
-
// ── Stage 1: blend KPN with warped history ──
|
|
234
|
-
var blended = mix(kpn_rgb, history_rgb, theta);
|
|
235
|
-
|
|
236
|
-
// ── Stage 2: accumulate centre tap in tonemapped space ──
|
|
237
|
-
blended = mix(
|
|
238
|
-
nss_tonemap(blended),
|
|
239
|
-
nss_tonemap(center_tap_rgb),
|
|
240
|
-
alpha * center_tap_present,
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
var final_rgb = max(vec3<f32>(0.0), nss_tonemap_inv(blended)) / NSS_EXPOSURE;
|
|
244
|
-
|
|
245
|
-
// Debug visualisation. Useful for SEEING per-pixel network output
|
|
246
|
-
// stability: a stable scene should produce a stable, spatially-varying
|
|
247
|
-
// grayscale. Uniform gray = network has lost spatial discrimination
|
|
248
|
-
// (only the bias survives). Flickering = network output itself is the
|
|
249
|
-
// noise source.
|
|
250
|
-
//
|
|
251
|
-
// 1 = theta (slot 1.x sigmoid)
|
|
252
|
-
// 2 = alpha (slot 1.y sigmoid)
|
|
253
|
-
// 3 = KPN col 0 channel 0 (the (col=0, row=0) kernel weight at slot 5.x)
|
|
254
|
-
// 4 = KPN total weight sum (all 16 weights, should be ~1 for a healthy
|
|
255
|
-
// normalised kernel)
|
|
256
|
-
// 5 = FB channel 0 (slot 0.x feedback)
|
|
257
|
-
let dv = settings.debug_view;
|
|
258
|
-
if (dv == 1u) {
|
|
259
|
-
final_rgb = vec3<f32>(theta_network);
|
|
260
|
-
} else if (dv == 2u) {
|
|
261
|
-
final_rgb = vec3<f32>(saturate(ta.y));
|
|
262
|
-
} else if (dv == 3u) {
|
|
263
|
-
final_rgb = vec3<f32>(kpn_cols[0].x);
|
|
264
|
-
} else if (dv == 4u) {
|
|
265
|
-
// Sum the 4 channels of each col, then sum across cols. Visualises
|
|
266
|
-
// how much "weight" the network is allocating in total. ARM's
|
|
267
|
-
// post-norm KPN should sum to ~1; if uniformly mid-grey here too,
|
|
268
|
-
// every head is bias-dominated.
|
|
269
|
-
let sum_c = (kpn_cols[0] + kpn_cols[1] + kpn_cols[2] + kpn_cols[3]);
|
|
270
|
-
let total = sum_c.x + sum_c.y + sum_c.z + sum_c.w;
|
|
271
|
-
final_rgb = vec3<f32>(total * 0.25); // /4 to keep it visually in [0, 1]-ish
|
|
272
|
-
} else if (dv == 5u) {
|
|
273
|
-
let fb = nss_sample_layer_bilinear(render_centre, render_res_max, 0);
|
|
274
|
-
final_rgb = vec3<f32>(fb.x);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Alpha channel of the output stores the effective history weight, so
|
|
278
|
-
// downstream passes (e.g. sharpening, post-filtering) can dampen
|
|
279
|
-
// their effect where temporal accumulation is doing the heavy lifting.
|
|
280
|
-
textureStore(tOutput, out_st, vec4<f32>(final_rgb, theta));
|
|
281
|
-
}
|
|
282
|
-
`, [
|
|
283
|
-
NSS_SETTINGS_STRUCT.declaration_chunk,
|
|
284
|
-
]
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
export const shader_nss_postprocess = ComputeShader.from({
|
|
288
|
-
label: "NSS / postprocess",
|
|
289
|
-
body,
|
|
290
|
-
resources,
|
|
291
|
-
|
|
292
|
-
});
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
3
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
+
import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
5
|
+
import { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
|
|
6
|
+
import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* NSS postprocess pass. Runs at output-resolution (one thread per output
|
|
10
|
+
* pixel). Reads:
|
|
11
|
+
* - the per-render-pixel KPN columns (z=2..5 of the network output 3D
|
|
12
|
+
* texture, in REVERSE order — slot 5 is column 0). Each column has
|
|
13
|
+
* 4 channels = the 4 row weights for that column.
|
|
14
|
+
* - the per-render-pixel ThetaAlpha (z=1): theta in .x (history blend
|
|
15
|
+
* weight, [0, 1]), alpha in .y (accumulation rate, scaled to
|
|
16
|
+
* [0.05, 0.4])
|
|
17
|
+
* - the jittered scene colour at render-res (used for the spatial taps)
|
|
18
|
+
* - the warped history at output-res
|
|
19
|
+
* - the nearest-depth offset from preprocess (used to dilate velocity)
|
|
20
|
+
*
|
|
21
|
+
* Per-output-pixel logic mirrors ARM's reference (UE5.5 NSSPostprocess.usf):
|
|
22
|
+
* 1. Solve which render-res pixel feeds each of the 4x4 KPN taps.
|
|
23
|
+
* 2. Apply the KPN to those taps, normalising by the weight sum.
|
|
24
|
+
* 3. Warp the history (bilinear) using velocity dilated by the nearest
|
|
25
|
+
* depth offset.
|
|
26
|
+
* 4. Blend the KPN colour with warped history using theta.
|
|
27
|
+
* 5. In tonemapped (Karis) space, accumulate the center tap with alpha.
|
|
28
|
+
* 6. Inverse tonemap, divide by EXPOSURE, write.
|
|
29
|
+
*
|
|
30
|
+
* @see ARM reference: UE5.5/Shaders/Private/NSSPostprocess.usf and
|
|
31
|
+
* NSSCommon.ush in github.com/arm/neural-graphics-for-unreal
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
35
|
+
resources.createGroup()
|
|
36
|
+
.addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
|
|
37
|
+
// ── KPN coefficients + ThetaAlpha + FB (network output, 3D, depth=6) ──
|
|
38
|
+
.addTexture("tNetworkOut", "float", "3d")
|
|
39
|
+
// ── render-res inputs ──
|
|
40
|
+
.addTexture("tColour", "float") // jittered scene colour
|
|
41
|
+
.addTexture("tVelocity", "float") // pixel-space motion vectors
|
|
42
|
+
.addTexture("tNearestOffset", "float") // packed (-1, 0, 1)² offset
|
|
43
|
+
// ── output-res input ──
|
|
44
|
+
.addTexture("tHistory", "float") // previous frame upscaled colour
|
|
45
|
+
// ── settings ──
|
|
46
|
+
.addUniform("settings", NSS_SETTINGS_STRUCT)
|
|
47
|
+
// ── outputs ──
|
|
48
|
+
.addStorageTexture("tOutput", "rgba16float", "2d", "write-only")
|
|
49
|
+
;
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
const body = CodeChunk.from(
|
|
53
|
+
//language=WGSL
|
|
54
|
+
`
|
|
55
|
+
const NSS_EXPOSURE: f32 = 7.38905609893; // e^2, matches ARM's NSSCommon.ush
|
|
56
|
+
|
|
57
|
+
// Karis tonemap (max-of-channels) — matches ARM's NSSCommon.ush.
|
|
58
|
+
fn nss_tonemap(rgb: vec3<f32>) -> vec3<f32> {
|
|
59
|
+
let m = max(max(rgb.r, rgb.g), rgb.b);
|
|
60
|
+
return rgb / (1.0 + m);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Karis inverse — clamp to dodge the inf at m == 1.0.
|
|
64
|
+
fn nss_tonemap_inv(rgb: vec3<f32>) -> vec3<f32> {
|
|
65
|
+
let c = clamp(rgb, vec3<f32>(0.0), vec3<f32>(0.99999));
|
|
66
|
+
let m = max(max(c.r, c.g), c.b);
|
|
67
|
+
return c / (1.0 - m);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
fn nss_warped_history(prev_uv: vec2<f32>) -> vec3<f32> {
|
|
71
|
+
let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
|
|
72
|
+
if (!on_screen) {
|
|
73
|
+
return vec3<f32>(0.0);
|
|
74
|
+
}
|
|
75
|
+
// ARM uses Catmull-Rom by default for the history warp; bilinear is the
|
|
76
|
+
// simpler approximation we keep here. (Catmull-Rom is in their
|
|
77
|
+
// CatmullRomWithDering helper — TODO: port if quality demands it.)
|
|
78
|
+
return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Bilinear-sample a single z-slice of the network output 3D texture at a
|
|
82
|
+
// render-res pixel position. Mirrors ARM's ManualBilinear4 — without this
|
|
83
|
+
// every 2x2 output block in 2x mode would share the same per-render-pixel
|
|
84
|
+
// theta/alpha/KPN values, leaving sharp blocky transitions. We do manual
|
|
85
|
+
// 4-tap bilinear (rather than textureSampleLevel with the linear sampler)
|
|
86
|
+
// so adjacent z layers — which carry semantically different head outputs —
|
|
87
|
+
// don't get filtered together.
|
|
88
|
+
fn nss_sample_layer_bilinear(render_pos: vec2<f32>, render_res_max: vec2<i32>, layer: i32) -> vec4<f32> {
|
|
89
|
+
let pos = render_pos - 0.5;
|
|
90
|
+
let base = floor(pos);
|
|
91
|
+
let frac = pos - base;
|
|
92
|
+
let bi = vec2<i32>(base);
|
|
93
|
+
let lo = vec2<i32>(0, 0);
|
|
94
|
+
let s00 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi, lo, render_res_max), layer), 0);
|
|
95
|
+
let s10 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,0), lo, render_res_max), layer), 0);
|
|
96
|
+
let s01 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(0,1), lo, render_res_max), layer), 0);
|
|
97
|
+
let s11 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,1), lo, render_res_max), layer), 0);
|
|
98
|
+
return mix(mix(s00, s10, frac.x), mix(s01, s11, frac.x), frac.y);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// SolveInputLocation: figure out which render-res pixel maps to a given
|
|
102
|
+
// output-res pixel position, given upscale ratio and jitter. Direct port
|
|
103
|
+
// of ARM's helper (NSSPostprocess.usf:80). Returns -1 when no render-res
|
|
104
|
+
// sample lands at this output position.
|
|
105
|
+
fn nss_solve_input_location(out_idx: i32, upscale: f32, jitter: f32) -> i32 {
|
|
106
|
+
let lower = f32(out_idx) / upscale - (-jitter + 0.5);
|
|
107
|
+
let upper = f32(out_idx + 1) / upscale - (-jitter + 0.5);
|
|
108
|
+
let candidate = i32(floor(upper));
|
|
109
|
+
if (lower < f32(candidate)) {
|
|
110
|
+
return candidate;
|
|
111
|
+
}
|
|
112
|
+
return -1;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
|
|
116
|
+
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
117
|
+
let out_res_u = settings.output_resolution;
|
|
118
|
+
let render_res_u = settings.render_resolution;
|
|
119
|
+
|
|
120
|
+
if (any(gid.xy >= out_res_u)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let out_st = vec2<i32>(gid.xy);
|
|
125
|
+
let render_res = vec2<i32>(render_res_u);
|
|
126
|
+
|
|
127
|
+
let out_res_f = vec2<f32>(out_res_u);
|
|
128
|
+
let render_res_f = vec2<f32>(render_res_u);
|
|
129
|
+
let upscale = out_res_f / render_res_f;
|
|
130
|
+
|
|
131
|
+
// Render-res pixel that hosts this output pixel's nearest network sample.
|
|
132
|
+
// (Used for the per-render-res velocity / nearest-offset taps; the
|
|
133
|
+
// network's per-pixel theta/alpha/KPN outputs are bilinear-sampled at
|
|
134
|
+
// the OUTPUT pixel's render-res position instead — see below.)
|
|
135
|
+
let render_centre = (vec2<f32>(out_st) + 0.5) / upscale;
|
|
136
|
+
let coef_st = vec2<i32>(floor(render_centre));
|
|
137
|
+
let render_res_max = render_res - vec2<i32>(1, 1);
|
|
138
|
+
let coef_st_clamped = clamp(coef_st, vec2<i32>(0, 0), render_res_max);
|
|
139
|
+
|
|
140
|
+
// ── KPN columns ──
|
|
141
|
+
// ARM's quantized model maps OutputIndices.KPNFilterCol0 = 5,
|
|
142
|
+
// KPNFilterCol1 = 4, KPNFilterCol2 = 3, KPNFilterCol3 = 2 (NSS.cpp:243).
|
|
143
|
+
// Each column has 4 channels = the 4 row weights for that column.
|
|
144
|
+
// Bilinear at render_centre (matches ARM's ManualBilinear4) — without
|
|
145
|
+
// this, every 2x2 output block in 2x mode shares one set of weights and
|
|
146
|
+
// we get blocky/jittery transitions across cell boundaries.
|
|
147
|
+
let col0 = nss_sample_layer_bilinear(render_centre, render_res_max, 5);
|
|
148
|
+
let col1 = nss_sample_layer_bilinear(render_centre, render_res_max, 4);
|
|
149
|
+
let col2 = nss_sample_layer_bilinear(render_centre, render_res_max, 3);
|
|
150
|
+
let col3 = nss_sample_layer_bilinear(render_centre, render_res_max, 2);
|
|
151
|
+
// Force tiny positive — ARM does this to dodge 0/0 in the
|
|
152
|
+
// weight-normalisation divide (NSSPostprocess.usf:118).
|
|
153
|
+
let kpn_cols = array<vec4<f32>, 4>(
|
|
154
|
+
max(col0, vec4<f32>(1e-7)),
|
|
155
|
+
max(col1, vec4<f32>(1e-7)),
|
|
156
|
+
max(col2, vec4<f32>(1e-7)),
|
|
157
|
+
max(col3, vec4<f32>(1e-7)),
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
// ── Apply KPN ──
|
|
161
|
+
// Outer loop is column index (matches ARM's "for x in 0..3" - we
|
|
162
|
+
// load the 4 cols above and pick by index here). Inner loop is row
|
|
163
|
+
// index. Each (col, row) tap reads the render-res sample at
|
|
164
|
+
// OutputPixelPos + (col-1, row-1) and accumulates colour * weight,
|
|
165
|
+
// with the centre tap (col=1, row=1) also captured for the
|
|
166
|
+
// alpha-blend stage.
|
|
167
|
+
var filtered_rgb = vec3<f32>(0.0);
|
|
168
|
+
var weight_sum = 0.0;
|
|
169
|
+
var center_tap_rgb = vec3<f32>(0.0);
|
|
170
|
+
var center_tap_present = 0.0;
|
|
171
|
+
for (var x = 0; x < 4; x = x + 1) {
|
|
172
|
+
let col = kpn_cols[x];
|
|
173
|
+
for (var y = 0; y < 4; y = y + 1) {
|
|
174
|
+
let weight = col[y];
|
|
175
|
+
let tap_out = out_st + vec2<i32>(x - 1, y - 1);
|
|
176
|
+
|
|
177
|
+
let in_x = nss_solve_input_location(tap_out.x, upscale.x, settings.jitter.x * settings.jitter_sign.x);
|
|
178
|
+
let in_y = nss_solve_input_location(tap_out.y, upscale.y, settings.jitter.y * settings.jitter_sign.y);
|
|
179
|
+
if (in_x < 0 || in_y < 0) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
let sample_st = clamp(vec2<i32>(in_x, in_y), vec2<i32>(0, 0), render_res - vec2<i32>(1, 1));
|
|
184
|
+
let sample_rgb = max(vec3<f32>(0.0), textureLoad(tColour, sample_st, 0).rgb) * NSS_EXPOSURE;
|
|
185
|
+
|
|
186
|
+
filtered_rgb += sample_rgb * weight;
|
|
187
|
+
weight_sum += weight;
|
|
188
|
+
|
|
189
|
+
if (x == 1 && y == 1) {
|
|
190
|
+
center_tap_rgb = sample_rgb;
|
|
191
|
+
center_tap_present = 1.0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
let kpn_rgb = filtered_rgb / max(weight_sum, 1e-5);
|
|
196
|
+
|
|
197
|
+
// ── Warp history ──
|
|
198
|
+
// Decode the nearest-depth offset to {-1, 0, 1}², use it to dilate
|
|
199
|
+
// the velocity tap to the depth-nearest sample (same trick as
|
|
200
|
+
// preprocess).
|
|
201
|
+
let nearest_packed = textureLoad(tNearestOffset, coef_st_clamped, 0).rg;
|
|
202
|
+
let nearest_offset = vec2<i32>(round(nearest_packed * 2.0 - 1.0));
|
|
203
|
+
|
|
204
|
+
var velocity = textureLoad(tVelocity, coef_st_clamped + nearest_offset, 0).rg;
|
|
205
|
+
// Motion zero-clamp (ARM NSSPostprocess.usf:215). Sub-pixel velocity on
|
|
206
|
+
// near-static frames drifts prev_uv by fractions of a pixel each frame
|
|
207
|
+
// and bilinear-resamples the history at slightly different sub-pixel
|
|
208
|
+
// positions — visible as flicker even when nothing in the scene is
|
|
209
|
+
// moving. ARM's threshold is 0.1 input pixels.
|
|
210
|
+
if (length(velocity) <= 0.1) {
|
|
211
|
+
velocity = vec2<f32>(0.0);
|
|
212
|
+
}
|
|
213
|
+
let velocity_out = velocity / (render_res_f / out_res_f); // render-res pixels → output-res pixels
|
|
214
|
+
|
|
215
|
+
let prev_out_st = vec2<f32>(out_st) + 0.5 - velocity_out;
|
|
216
|
+
let prev_uv = prev_out_st / out_res_f;
|
|
217
|
+
|
|
218
|
+
let history_rgb = nss_warped_history(prev_uv) * NSS_EXPOSURE;
|
|
219
|
+
let on_screen_f = select(0.0, 1.0, all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0)));
|
|
220
|
+
|
|
221
|
+
// ── ThetaAlpha (head slot 1) ──
|
|
222
|
+
// ARM's quantized model maps OutputIndices.ThetaAlpha = 1
|
|
223
|
+
// (NSS.cpp:242). Channel x = theta (history blend weight, [0, 1] from
|
|
224
|
+
// sigmoid LUT), channel y = alpha (raw [0, 1], remapped to
|
|
225
|
+
// [0.05, 0.4] per NSSPostprocess.usf:248).
|
|
226
|
+
// Bilinear at render_centre — same reasoning as the KPN cols above.
|
|
227
|
+
let ta = nss_sample_layer_bilinear(render_centre, render_res_max, 1);
|
|
228
|
+
let theta_network = saturate(ta.x);
|
|
229
|
+
let theta_raw = select(theta_network, saturate(settings.theta_override), settings.theta_override >= 0.0);
|
|
230
|
+
let theta = theta_raw * saturate(settings.history_validity) * on_screen_f;
|
|
231
|
+
let alpha = (0.35 * saturate(ta.y) + 0.05) * settings.alpha_blend_scale;
|
|
232
|
+
|
|
233
|
+
// ── Stage 1: blend KPN with warped history ──
|
|
234
|
+
var blended = mix(kpn_rgb, history_rgb, theta);
|
|
235
|
+
|
|
236
|
+
// ── Stage 2: accumulate centre tap in tonemapped space ──
|
|
237
|
+
blended = mix(
|
|
238
|
+
nss_tonemap(blended),
|
|
239
|
+
nss_tonemap(center_tap_rgb),
|
|
240
|
+
alpha * center_tap_present,
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
var final_rgb = max(vec3<f32>(0.0), nss_tonemap_inv(blended)) / NSS_EXPOSURE;
|
|
244
|
+
|
|
245
|
+
// Debug visualisation. Useful for SEEING per-pixel network output
|
|
246
|
+
// stability: a stable scene should produce a stable, spatially-varying
|
|
247
|
+
// grayscale. Uniform gray = network has lost spatial discrimination
|
|
248
|
+
// (only the bias survives). Flickering = network output itself is the
|
|
249
|
+
// noise source.
|
|
250
|
+
//
|
|
251
|
+
// 1 = theta (slot 1.x sigmoid)
|
|
252
|
+
// 2 = alpha (slot 1.y sigmoid)
|
|
253
|
+
// 3 = KPN col 0 channel 0 (the (col=0, row=0) kernel weight at slot 5.x)
|
|
254
|
+
// 4 = KPN total weight sum (all 16 weights, should be ~1 for a healthy
|
|
255
|
+
// normalised kernel)
|
|
256
|
+
// 5 = FB channel 0 (slot 0.x feedback)
|
|
257
|
+
let dv = settings.debug_view;
|
|
258
|
+
if (dv == 1u) {
|
|
259
|
+
final_rgb = vec3<f32>(theta_network);
|
|
260
|
+
} else if (dv == 2u) {
|
|
261
|
+
final_rgb = vec3<f32>(saturate(ta.y));
|
|
262
|
+
} else if (dv == 3u) {
|
|
263
|
+
final_rgb = vec3<f32>(kpn_cols[0].x);
|
|
264
|
+
} else if (dv == 4u) {
|
|
265
|
+
// Sum the 4 channels of each col, then sum across cols. Visualises
|
|
266
|
+
// how much "weight" the network is allocating in total. ARM's
|
|
267
|
+
// post-norm KPN should sum to ~1; if uniformly mid-grey here too,
|
|
268
|
+
// every head is bias-dominated.
|
|
269
|
+
let sum_c = (kpn_cols[0] + kpn_cols[1] + kpn_cols[2] + kpn_cols[3]);
|
|
270
|
+
let total = sum_c.x + sum_c.y + sum_c.z + sum_c.w;
|
|
271
|
+
final_rgb = vec3<f32>(total * 0.25); // /4 to keep it visually in [0, 1]-ish
|
|
272
|
+
} else if (dv == 5u) {
|
|
273
|
+
let fb = nss_sample_layer_bilinear(render_centre, render_res_max, 0);
|
|
274
|
+
final_rgb = vec3<f32>(fb.x);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Alpha channel of the output stores the effective history weight, so
|
|
278
|
+
// downstream passes (e.g. sharpening, post-filtering) can dampen
|
|
279
|
+
// their effect where temporal accumulation is doing the heavy lifting.
|
|
280
|
+
textureStore(tOutput, out_st, vec4<f32>(final_rgb, theta));
|
|
281
|
+
}
|
|
282
|
+
`, [
|
|
283
|
+
NSS_SETTINGS_STRUCT.declaration_chunk,
|
|
284
|
+
]
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
export const shader_nss_postprocess = ComputeShader.from({
|
|
288
|
+
label: "NSS / postprocess",
|
|
289
|
+
body,
|
|
290
|
+
resources,
|
|
291
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_nss_preprocess.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/nss/shader_nss_preprocess.js"],"names":[],"mappings":"AAiOA,
|
|
1
|
+
{"version":3,"file":"shader_nss_preprocess.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/nss/shader_nss_preprocess.js"],"names":[],"mappings":"AAiOA,kDAIG;8BApO2B,+BAA+B"}
|