@woosh/meep-engine 3.11.3 → 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/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/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/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/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
- 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 +4 -7
- 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/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.js +2 -2
- 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.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
- 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/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/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/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 -296
- package/src/shade/renderer/shader/ImageShader.js +217 -217
- 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 +20 -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/volumetrics/GPUViewVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
- 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/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
|
@@ -1,129 +1,128 @@
|
|
|
1
|
-
import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
-
import { WebGPUArray } from "../shader/type/WebGPUArray.js";
|
|
3
|
-
import { MATERIAL_METADATA_STRUCT } from "../material/MATERIAL_METADATA_STRUCT.js";
|
|
4
|
-
import { chunk_write_object_property } from "../object_property/chunk_write_object_property.js";
|
|
5
|
-
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
6
|
-
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
7
|
-
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
8
|
-
import { ANIMATION_DATABASE_SPEC } from "./ANIMATION_DATABASE_SPEC.js";
|
|
9
|
-
import { chunk_animation_track_evaluate } from "./animation_track_evaluate.js";
|
|
10
|
-
|
|
11
|
-
const GROUP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_bound_track_groups');
|
|
12
|
-
const CLIP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_clips');
|
|
13
|
-
const TRACK_TABLE = ANIMATION_DATABASE_SPEC.get('animation_tracks');
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Workgroup size for the apply pass. Exported so dispatchers can pair it
|
|
17
|
-
* with `animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE)` —
|
|
18
|
-
* the page iterator's slot-to-workgroup mapping is computed against this
|
|
19
|
-
* value, so the two must agree.
|
|
20
|
-
*/
|
|
21
|
-
export const WORKGROUP_SIZE = 64;
|
|
22
|
-
|
|
23
|
-
const PG_PREFIX = GROUP_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE);
|
|
24
|
-
|
|
25
|
-
// `materials` and `pose_accumulator` are referenced by name from the
|
|
26
|
-
// property-write chunks rather than passed as pointers — the chunks
|
|
27
|
-
// rely on these bindings being declared in the importing shader.
|
|
28
|
-
//
|
|
29
|
-
// `pose_accumulator` is the per-Node3D contribution scratch (one slot per
|
|
30
|
-
// transforms-table row, `POSE_ACCUMULATOR_STRIDE` u32s each). Apply
|
|
31
|
-
// atomic-adds weighted values into it; the downstream resolve pass
|
|
32
|
-
// drains it into `transforms_table.local_*`.
|
|
33
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
34
|
-
resources.createGroup()
|
|
35
|
-
.addStorageBuffer('animation_database', WebGPUArray.from(u32), false)
|
|
36
|
-
.addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true)
|
|
37
|
-
.addStorageBuffer('materials', WebGPUArray.from(MATERIAL_METADATA_STRUCT), true);
|
|
38
|
-
|
|
39
|
-
// Strict 1:1 page-iterator dispatch: one thread per group-node slot.
|
|
40
|
-
// A page is covered by GROUPS_PER_PAGE workgroups in parallel; setup
|
|
41
|
-
// derives (page_index, page_group) from workgroup_id.x, the in-page
|
|
42
|
-
// slot from page_group + local_id, and lanes past ELEMENTS_PER_PAGE
|
|
43
|
-
// (only possible in the last page_group) are tail-masked.
|
|
44
|
-
const body = CodeChunk.from(
|
|
45
|
-
//language=WGSL
|
|
46
|
-
`
|
|
47
|
-
@compute @workgroup_size(${WORKGROUP_SIZE},1,1)
|
|
48
|
-
fn main(
|
|
49
|
-
@builtin(workgroup_id) wg_id: vec3<u32>,
|
|
50
|
-
@builtin(local_invocation_index) local_id: u32,
|
|
51
|
-
) {
|
|
52
|
-
// page_address is uniform across the workgroup → unallocated-page
|
|
53
|
-
// bail is uniform-control-flow safe.
|
|
54
|
-
if !${PG_PREFIX}_setup(&animation_database, wg_id.x, local_id) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
|
|
59
|
-
|
|
60
|
-
if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
if !${PG_PREFIX}_is_occupied(slot_in_page) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Per-thread group node: load it, resolve the back-referenced clip,
|
|
68
|
-
// and apply every inline binding under that clip's effective time.
|
|
69
|
-
// The chain's next field is for the host (linking new nodes onto
|
|
70
|
-
// existing chains); the apply pass touches only the current node.
|
|
71
|
-
let group = ${PG_PREFIX}_read(&animation_database, slot_in_page);
|
|
72
|
-
let clip = ${CLIP_TABLE.marshalling_method_read}(&animation_database, group.clip);
|
|
73
|
-
|
|
74
|
-
// Playback time 0 sits at clip.time_start on the curves' clock.
|
|
75
|
-
// Curves clamp the result to their own [time_min, time_max], so a
|
|
76
|
-
// track whose authored range falls outside the clip window just
|
|
77
|
-
// holds at its endpoint over the gap.
|
|
78
|
-
let effective_time = clip.time + clip.time_start;
|
|
79
|
-
|
|
80
|
-
// Pre-multiply every contribution by this clip's weight so the
|
|
81
|
-
// accumulator can just add. Translation/scale: scalar*vec3
|
|
82
|
-
// componentwise; rotation: scalar*vec4, which is the standard
|
|
83
|
-
// weighted-quaternion blend term — the resolve pass normalizes
|
|
84
|
-
// the accumulated quat sum back to unit length.
|
|
85
|
-
let weight = clip.playback_weight;
|
|
86
|
-
|
|
87
|
-
for(var i = 0u; i < group.count; i++){
|
|
88
|
-
let binding = group.bindings[i];
|
|
89
|
-
let track = ${TRACK_TABLE.marshalling_method_read}(&animation_database, binding.track);
|
|
90
|
-
|
|
91
|
-
let value = animation_track_evaluate(effective_time, track, &animation_database) * weight;
|
|
92
|
-
|
|
93
|
-
write_object_property(binding.instance, binding.property, track.mask, value);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
`, [
|
|
97
|
-
GROUP_TABLE.chunk_iterate(WORKGROUP_SIZE),
|
|
98
|
-
CLIP_TABLE.chunk_read,
|
|
99
|
-
TRACK_TABLE.chunk_read,
|
|
100
|
-
chunk_animation_track_evaluate,
|
|
101
|
-
chunk_write_object_property,
|
|
102
|
-
]
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Compute shader that walks the `animation_bound_track_groups` table —
|
|
107
|
-
* one thread per group-node slot via the page iterator — evaluating
|
|
108
|
-
* every inline binding under its owning clip's `time + time_start` and
|
|
109
|
-
* atomic-adding the (weight-multiplied) result into the pose
|
|
110
|
-
* accumulator (Node3D properties) or directly into the material
|
|
111
|
-
* metadata table (Material properties).
|
|
112
|
-
*
|
|
113
|
-
* Node3D writes land in `pose_accumulator` rather than directly in
|
|
114
|
-
* `transforms_table.local_*` so multi-clip blending is just additive;
|
|
115
|
-
* `shader_animation_pose_resolve` walks the accumulator next, drains
|
|
116
|
-
* each dirty row into the transforms table, normalizes rotation, and
|
|
117
|
-
* zeros the slot for the next frame.
|
|
118
|
-
*
|
|
119
|
-
* Dispatch via
|
|
120
|
-
* `shader_animation_apply.dispatch({ group_count_x: animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE), ... })` —
|
|
121
|
-
* the iterator covers every allocated page in parallel and skips
|
|
122
|
-
* unallocated/unoccupied slots in-shader.
|
|
123
|
-
*/
|
|
124
|
-
export const shader_animation_apply = ComputeShader.from({
|
|
125
|
-
label: "Animation/Apply",
|
|
126
|
-
body,
|
|
127
|
-
resources,
|
|
128
|
-
|
|
129
|
-
});
|
|
1
|
+
import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { WebGPUArray } from "../shader/type/WebGPUArray.js";
|
|
3
|
+
import { MATERIAL_METADATA_STRUCT } from "../material/MATERIAL_METADATA_STRUCT.js";
|
|
4
|
+
import { chunk_write_object_property } from "../object_property/chunk_write_object_property.js";
|
|
5
|
+
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
6
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
7
|
+
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
8
|
+
import { ANIMATION_DATABASE_SPEC } from "./ANIMATION_DATABASE_SPEC.js";
|
|
9
|
+
import { chunk_animation_track_evaluate } from "./animation_track_evaluate.js";
|
|
10
|
+
|
|
11
|
+
const GROUP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_bound_track_groups');
|
|
12
|
+
const CLIP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_clips');
|
|
13
|
+
const TRACK_TABLE = ANIMATION_DATABASE_SPEC.get('animation_tracks');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Workgroup size for the apply pass. Exported so dispatchers can pair it
|
|
17
|
+
* with `animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE)` —
|
|
18
|
+
* the page iterator's slot-to-workgroup mapping is computed against this
|
|
19
|
+
* value, so the two must agree.
|
|
20
|
+
*/
|
|
21
|
+
export const WORKGROUP_SIZE = 64;
|
|
22
|
+
|
|
23
|
+
const PG_PREFIX = GROUP_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE);
|
|
24
|
+
|
|
25
|
+
// `materials` and `pose_accumulator` are referenced by name from the
|
|
26
|
+
// property-write chunks rather than passed as pointers — the chunks
|
|
27
|
+
// rely on these bindings being declared in the importing shader.
|
|
28
|
+
//
|
|
29
|
+
// `pose_accumulator` is the per-Node3D contribution scratch (one slot per
|
|
30
|
+
// transforms-table row, `POSE_ACCUMULATOR_STRIDE` u32s each). Apply
|
|
31
|
+
// atomic-adds weighted values into it; the downstream resolve pass
|
|
32
|
+
// drains it into `transforms_table.local_*`.
|
|
33
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
34
|
+
resources.createGroup()
|
|
35
|
+
.addStorageBuffer('animation_database', WebGPUArray.from(u32), false)
|
|
36
|
+
.addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true)
|
|
37
|
+
.addStorageBuffer('materials', WebGPUArray.from(MATERIAL_METADATA_STRUCT), true);
|
|
38
|
+
|
|
39
|
+
// Strict 1:1 page-iterator dispatch: one thread per group-node slot.
|
|
40
|
+
// A page is covered by GROUPS_PER_PAGE workgroups in parallel; setup
|
|
41
|
+
// derives (page_index, page_group) from workgroup_id.x, the in-page
|
|
42
|
+
// slot from page_group + local_id, and lanes past ELEMENTS_PER_PAGE
|
|
43
|
+
// (only possible in the last page_group) are tail-masked.
|
|
44
|
+
const body = CodeChunk.from(
|
|
45
|
+
//language=WGSL
|
|
46
|
+
`
|
|
47
|
+
@compute @workgroup_size(${WORKGROUP_SIZE},1,1)
|
|
48
|
+
fn main(
|
|
49
|
+
@builtin(workgroup_id) wg_id: vec3<u32>,
|
|
50
|
+
@builtin(local_invocation_index) local_id: u32,
|
|
51
|
+
) {
|
|
52
|
+
// page_address is uniform across the workgroup → unallocated-page
|
|
53
|
+
// bail is uniform-control-flow safe.
|
|
54
|
+
if !${PG_PREFIX}_setup(&animation_database, wg_id.x, local_id) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
|
|
59
|
+
|
|
60
|
+
if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if !${PG_PREFIX}_is_occupied(slot_in_page) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Per-thread group node: load it, resolve the back-referenced clip,
|
|
68
|
+
// and apply every inline binding under that clip's effective time.
|
|
69
|
+
// The chain's next field is for the host (linking new nodes onto
|
|
70
|
+
// existing chains); the apply pass touches only the current node.
|
|
71
|
+
let group = ${PG_PREFIX}_read(&animation_database, slot_in_page);
|
|
72
|
+
let clip = ${CLIP_TABLE.marshalling_method_read}(&animation_database, group.clip);
|
|
73
|
+
|
|
74
|
+
// Playback time 0 sits at clip.time_start on the curves' clock.
|
|
75
|
+
// Curves clamp the result to their own [time_min, time_max], so a
|
|
76
|
+
// track whose authored range falls outside the clip window just
|
|
77
|
+
// holds at its endpoint over the gap.
|
|
78
|
+
let effective_time = clip.time + clip.time_start;
|
|
79
|
+
|
|
80
|
+
// Pre-multiply every contribution by this clip's weight so the
|
|
81
|
+
// accumulator can just add. Translation/scale: scalar*vec3
|
|
82
|
+
// componentwise; rotation: scalar*vec4, which is the standard
|
|
83
|
+
// weighted-quaternion blend term — the resolve pass normalizes
|
|
84
|
+
// the accumulated quat sum back to unit length.
|
|
85
|
+
let weight = clip.playback_weight;
|
|
86
|
+
|
|
87
|
+
for(var i = 0u; i < group.count; i++){
|
|
88
|
+
let binding = group.bindings[i];
|
|
89
|
+
let track = ${TRACK_TABLE.marshalling_method_read}(&animation_database, binding.track);
|
|
90
|
+
|
|
91
|
+
let value = animation_track_evaluate(effective_time, track, &animation_database) * weight;
|
|
92
|
+
|
|
93
|
+
write_object_property(binding.instance, binding.property, track.mask, value);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
`, [
|
|
97
|
+
GROUP_TABLE.chunk_iterate(WORKGROUP_SIZE),
|
|
98
|
+
CLIP_TABLE.chunk_read,
|
|
99
|
+
TRACK_TABLE.chunk_read,
|
|
100
|
+
chunk_animation_track_evaluate,
|
|
101
|
+
chunk_write_object_property,
|
|
102
|
+
]
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Compute shader that walks the `animation_bound_track_groups` table —
|
|
107
|
+
* one thread per group-node slot via the page iterator — evaluating
|
|
108
|
+
* every inline binding under its owning clip's `time + time_start` and
|
|
109
|
+
* atomic-adding the (weight-multiplied) result into the pose
|
|
110
|
+
* accumulator (Node3D properties) or directly into the material
|
|
111
|
+
* metadata table (Material properties).
|
|
112
|
+
*
|
|
113
|
+
* Node3D writes land in `pose_accumulator` rather than directly in
|
|
114
|
+
* `transforms_table.local_*` so multi-clip blending is just additive;
|
|
115
|
+
* `shader_animation_pose_resolve` walks the accumulator next, drains
|
|
116
|
+
* each dirty row into the transforms table, normalizes rotation, and
|
|
117
|
+
* zeros the slot for the next frame.
|
|
118
|
+
*
|
|
119
|
+
* Dispatch via
|
|
120
|
+
* `shader_animation_apply.dispatch({ group_count_x: animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE), ... })` —
|
|
121
|
+
* the iterator covers every allocated page in parallel and skips
|
|
122
|
+
* unallocated/unoccupied slots in-shader.
|
|
123
|
+
*/
|
|
124
|
+
export const shader_animation_apply = ComputeShader.from({
|
|
125
|
+
label: "Animation/Apply",
|
|
126
|
+
body,
|
|
127
|
+
resources,
|
|
128
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_animation_pose_resolve.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_pose_resolve.js"],"names":[],"mappings":"AAWA;;;GAGG;AACH,gCAAiC;AAyIjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,
|
|
1
|
+
{"version":3,"file":"shader_animation_pose_resolve.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_pose_resolve.js"],"names":[],"mappings":"AAWA;;;GAGG;AACH,gCAAiC;AAyIjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,0DAIG;8BA1K2B,4BAA4B"}
|
|
@@ -1,177 +1,176 @@
|
|
|
1
|
-
import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
-
import { WebGPUArray } from "../shader/type/WebGPUArray.js";
|
|
3
|
-
import { chunk_scene_database_access_rw } from "../scene/chunk_scene_database_access.js";
|
|
4
|
-
import { SCENE_DATABASE_SPEC } from "../scene/SCENE_DATABASE_SPEC.js";
|
|
5
|
-
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
6
|
-
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
7
|
-
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
8
|
-
import { chunk_pose_accumulator } from "./chunk_pose_accumulator.js";
|
|
9
|
-
|
|
10
|
-
const TRANSFORMS_TABLE = SCENE_DATABASE_SPEC.get('transforms');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Workgroup size for the resolve pass. Exported so dispatchers can pair
|
|
14
|
-
* it with `transforms.dispatch_group_count(WORKGROUP_SIZE)`.
|
|
15
|
-
*/
|
|
16
|
-
export const WORKGROUP_SIZE = 64;
|
|
17
|
-
|
|
18
|
-
const PG_PREFIX = TRANSFORMS_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
|
|
19
|
-
|
|
20
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
21
|
-
resources.createGroup()
|
|
22
|
-
.addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
|
|
23
|
-
.addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true);
|
|
24
|
-
|
|
25
|
-
const body = CodeChunk.from(
|
|
26
|
-
//language=WGSL
|
|
27
|
-
`
|
|
28
|
-
@compute @workgroup_size(${WORKGROUP_SIZE},1,1)
|
|
29
|
-
fn main(
|
|
30
|
-
@builtin(workgroup_id) wg_id: vec3<u32>,
|
|
31
|
-
@builtin(local_invocation_index) local_id: u32,
|
|
32
|
-
) {
|
|
33
|
-
if !${PG_PREFIX}_setup(&scene_database, wg_id.x, local_id) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
|
|
38
|
-
|
|
39
|
-
if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if !${PG_PREFIX}_is_occupied(slot_in_page) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Absolute transforms-table row index. The accumulator is laid out
|
|
47
|
-
// one slot per row at the same index, so this is also the
|
|
48
|
-
// accumulator slot.
|
|
49
|
-
let row = ${PG_PREFIX}_slot_to_index(slot_in_page);
|
|
50
|
-
|
|
51
|
-
let slot_base = pose_accumulator_slot_base(row);
|
|
52
|
-
let dirty_word = slot_base + POSE_OFFSET_DIRTY;
|
|
53
|
-
|
|
54
|
-
// Single load of the dirty mask gates the whole resolve. If
|
|
55
|
-
// nothing was contributed to this row this frame, leave local_*
|
|
56
|
-
// alone (and the accumulator slot is already zero because the
|
|
57
|
-
// previous resolve drained it).
|
|
58
|
-
let dirty = atomicLoad(&pose_accumulator[dirty_word]);
|
|
59
|
-
if dirty == 0u {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ── Translation ───────────────────────────────────────────────
|
|
64
|
-
if (dirty & POSE_DIRTY_T_MASK) != 0u {
|
|
65
|
-
let t_base = slot_base + POSE_OFFSET_TRANSLATION;
|
|
66
|
-
// Per-axis: only overwrite the channels that actually had a
|
|
67
|
-
// contribution. Read the current local_translation through
|
|
68
|
-
// the rw helper and patch the dirty channels in-place — the
|
|
69
|
-
// sibling-axis race that the old direct writer already
|
|
70
|
-
// tolerated still applies (two threads writing different
|
|
71
|
-
// axes of the same node), but we now have at most one resolve
|
|
72
|
-
// thread per row, so it never triggers here.
|
|
73
|
-
var t = scene_read_node_rw(&scene_database, row).local_translation;
|
|
74
|
-
if (dirty & POSE_DIRTY_TX) != 0u {
|
|
75
|
-
t.x = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 0u]));
|
|
76
|
-
atomicStore(&pose_accumulator[t_base + 0u], 0u);
|
|
77
|
-
}
|
|
78
|
-
if (dirty & POSE_DIRTY_TY) != 0u {
|
|
79
|
-
t.y = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 1u]));
|
|
80
|
-
atomicStore(&pose_accumulator[t_base + 1u], 0u);
|
|
81
|
-
}
|
|
82
|
-
if (dirty & POSE_DIRTY_TZ) != 0u {
|
|
83
|
-
t.z = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 2u]));
|
|
84
|
-
atomicStore(&pose_accumulator[t_base + 2u], 0u);
|
|
85
|
-
}
|
|
86
|
-
scene_write_node_local_translation(&scene_database, row, t);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ── Rotation ──────────────────────────────────────────────────
|
|
90
|
-
if (dirty & POSE_DIRTY_R) != 0u {
|
|
91
|
-
let r_base = slot_base + POSE_OFFSET_ROTATION;
|
|
92
|
-
let r = vec4<f32>(
|
|
93
|
-
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 0u])),
|
|
94
|
-
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 1u])),
|
|
95
|
-
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 2u])),
|
|
96
|
-
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 3u])),
|
|
97
|
-
);
|
|
98
|
-
atomicStore(&pose_accumulator[r_base + 0u], 0u);
|
|
99
|
-
atomicStore(&pose_accumulator[r_base + 1u], 0u);
|
|
100
|
-
atomicStore(&pose_accumulator[r_base + 2u], 0u);
|
|
101
|
-
atomicStore(&pose_accumulator[r_base + 3u], 0u);
|
|
102
|
-
// A sum of length zero carries no orientation to recover: every
|
|
103
|
-
// clip that writes this rotation is playing at weight zero, and
|
|
104
|
-
// the apply pass contributes to a bound clip whatever its
|
|
105
|
-
// weight. \`normalize\` answers NaN there, and one NaN local
|
|
106
|
-
// rotation reaches every skin matrix naming the joint, so the
|
|
107
|
-
// meshes it drives stop rasterising altogether — a rig loses a
|
|
108
|
-
// limb because a clip nobody is playing happens to be the only
|
|
109
|
-
// one that rotates it. Leaving the row alone is the rest pose,
|
|
110
|
-
// which is the answer the CPU twin gives (\`pose_evaluate_local\`)
|
|
111
|
-
// and the value the row still holds.
|
|
112
|
-
//
|
|
113
|
-
// Otherwise: the weighted-quaternion sum (\`w_i * q_i\`) is the
|
|
114
|
-
// standard nlerp blend numerator; normalise here, once, after
|
|
115
|
-
// every contributor has been folded in. The apply pass
|
|
116
|
-
// canonicalised signs at GLTF load so we don't hit the antipode
|
|
117
|
-
// case for imported clips.
|
|
118
|
-
if length(r) > 0.0 {
|
|
119
|
-
scene_write_node_local_rotation(&scene_database, row, normalize(r));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ── Scale ─────────────────────────────────────────────────────
|
|
124
|
-
if (dirty & POSE_DIRTY_S_MASK) != 0u {
|
|
125
|
-
let s_base = slot_base + POSE_OFFSET_SCALE;
|
|
126
|
-
var s = scene_read_node_rw(&scene_database, row).local_scale;
|
|
127
|
-
if (dirty & POSE_DIRTY_SX) != 0u {
|
|
128
|
-
s.x = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 0u]));
|
|
129
|
-
atomicStore(&pose_accumulator[s_base + 0u], 0u);
|
|
130
|
-
}
|
|
131
|
-
if (dirty & POSE_DIRTY_SY) != 0u {
|
|
132
|
-
s.y = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 1u]));
|
|
133
|
-
atomicStore(&pose_accumulator[s_base + 1u], 0u);
|
|
134
|
-
}
|
|
135
|
-
if (dirty & POSE_DIRTY_SZ) != 0u {
|
|
136
|
-
s.z = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 2u]));
|
|
137
|
-
atomicStore(&pose_accumulator[s_base + 2u], 0u);
|
|
138
|
-
}
|
|
139
|
-
scene_write_node_local_scale(&scene_database, row, s);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Clear the dirty mask itself last, so an interrupted resolve
|
|
143
|
-
// (theoretical — these passes don't yield) would still leave the
|
|
144
|
-
// dirty bits intact to be redone.
|
|
145
|
-
atomicStore(&pose_accumulator[dirty_word], 0u);
|
|
146
|
-
}
|
|
147
|
-
`, [
|
|
148
|
-
TRANSFORMS_TABLE.chunk_iterate(WORKGROUP_SIZE, true),
|
|
149
|
-
chunk_scene_database_access_rw,
|
|
150
|
-
chunk_pose_accumulator,
|
|
151
|
-
]);
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Compute shader that drains the pose accumulator into
|
|
155
|
-
* `transforms_table.local_{translation,rotation,scale}`.
|
|
156
|
-
*
|
|
157
|
-
* Walks the transforms table via the read+write page iterator — one
|
|
158
|
-
* thread per slot. For each occupied row whose accumulator slot has
|
|
159
|
-
* any dirty bits set, reads the contributed components (atomic
|
|
160
|
-
* loads, bitcast back to f32), writes them through the per-field
|
|
161
|
-
* scene helpers, normalises rotation, and zeros the slot for next
|
|
162
|
-
* frame.
|
|
163
|
-
*
|
|
164
|
-
* The accumulator buffer must be sized to at least
|
|
165
|
-
* `transforms.dispatch_page_count * elements_per_page` rows —
|
|
166
|
-
* {@link GPUAnimationManager#ensure_pose_accumulator_capacity}
|
|
167
|
-
* handles that.
|
|
168
|
-
*
|
|
169
|
-
* Dispatch via
|
|
170
|
-
* `shader_animation_pose_resolve.dispatch({ group_count_x: transforms.dispatch_group_count(WORKGROUP_SIZE), ... })`.
|
|
171
|
-
*/
|
|
172
|
-
export const shader_animation_pose_resolve = ComputeShader.from({
|
|
173
|
-
label: "Animation/PoseResolve",
|
|
174
|
-
body,
|
|
175
|
-
resources,
|
|
176
|
-
|
|
177
|
-
});
|
|
1
|
+
import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { WebGPUArray } from "../shader/type/WebGPUArray.js";
|
|
3
|
+
import { chunk_scene_database_access_rw } from "../scene/chunk_scene_database_access.js";
|
|
4
|
+
import { SCENE_DATABASE_SPEC } from "../scene/SCENE_DATABASE_SPEC.js";
|
|
5
|
+
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
6
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
7
|
+
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
8
|
+
import { chunk_pose_accumulator } from "./chunk_pose_accumulator.js";
|
|
9
|
+
|
|
10
|
+
const TRANSFORMS_TABLE = SCENE_DATABASE_SPEC.get('transforms');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Workgroup size for the resolve pass. Exported so dispatchers can pair
|
|
14
|
+
* it with `transforms.dispatch_group_count(WORKGROUP_SIZE)`.
|
|
15
|
+
*/
|
|
16
|
+
export const WORKGROUP_SIZE = 64;
|
|
17
|
+
|
|
18
|
+
const PG_PREFIX = TRANSFORMS_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
|
|
19
|
+
|
|
20
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
21
|
+
resources.createGroup()
|
|
22
|
+
.addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
|
|
23
|
+
.addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true);
|
|
24
|
+
|
|
25
|
+
const body = CodeChunk.from(
|
|
26
|
+
//language=WGSL
|
|
27
|
+
`
|
|
28
|
+
@compute @workgroup_size(${WORKGROUP_SIZE},1,1)
|
|
29
|
+
fn main(
|
|
30
|
+
@builtin(workgroup_id) wg_id: vec3<u32>,
|
|
31
|
+
@builtin(local_invocation_index) local_id: u32,
|
|
32
|
+
) {
|
|
33
|
+
if !${PG_PREFIX}_setup(&scene_database, wg_id.x, local_id) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
|
|
38
|
+
|
|
39
|
+
if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if !${PG_PREFIX}_is_occupied(slot_in_page) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Absolute transforms-table row index. The accumulator is laid out
|
|
47
|
+
// one slot per row at the same index, so this is also the
|
|
48
|
+
// accumulator slot.
|
|
49
|
+
let row = ${PG_PREFIX}_slot_to_index(slot_in_page);
|
|
50
|
+
|
|
51
|
+
let slot_base = pose_accumulator_slot_base(row);
|
|
52
|
+
let dirty_word = slot_base + POSE_OFFSET_DIRTY;
|
|
53
|
+
|
|
54
|
+
// Single load of the dirty mask gates the whole resolve. If
|
|
55
|
+
// nothing was contributed to this row this frame, leave local_*
|
|
56
|
+
// alone (and the accumulator slot is already zero because the
|
|
57
|
+
// previous resolve drained it).
|
|
58
|
+
let dirty = atomicLoad(&pose_accumulator[dirty_word]);
|
|
59
|
+
if dirty == 0u {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ── Translation ───────────────────────────────────────────────
|
|
64
|
+
if (dirty & POSE_DIRTY_T_MASK) != 0u {
|
|
65
|
+
let t_base = slot_base + POSE_OFFSET_TRANSLATION;
|
|
66
|
+
// Per-axis: only overwrite the channels that actually had a
|
|
67
|
+
// contribution. Read the current local_translation through
|
|
68
|
+
// the rw helper and patch the dirty channels in-place — the
|
|
69
|
+
// sibling-axis race that the old direct writer already
|
|
70
|
+
// tolerated still applies (two threads writing different
|
|
71
|
+
// axes of the same node), but we now have at most one resolve
|
|
72
|
+
// thread per row, so it never triggers here.
|
|
73
|
+
var t = scene_read_node_rw(&scene_database, row).local_translation;
|
|
74
|
+
if (dirty & POSE_DIRTY_TX) != 0u {
|
|
75
|
+
t.x = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 0u]));
|
|
76
|
+
atomicStore(&pose_accumulator[t_base + 0u], 0u);
|
|
77
|
+
}
|
|
78
|
+
if (dirty & POSE_DIRTY_TY) != 0u {
|
|
79
|
+
t.y = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 1u]));
|
|
80
|
+
atomicStore(&pose_accumulator[t_base + 1u], 0u);
|
|
81
|
+
}
|
|
82
|
+
if (dirty & POSE_DIRTY_TZ) != 0u {
|
|
83
|
+
t.z = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 2u]));
|
|
84
|
+
atomicStore(&pose_accumulator[t_base + 2u], 0u);
|
|
85
|
+
}
|
|
86
|
+
scene_write_node_local_translation(&scene_database, row, t);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ── Rotation ──────────────────────────────────────────────────
|
|
90
|
+
if (dirty & POSE_DIRTY_R) != 0u {
|
|
91
|
+
let r_base = slot_base + POSE_OFFSET_ROTATION;
|
|
92
|
+
let r = vec4<f32>(
|
|
93
|
+
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 0u])),
|
|
94
|
+
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 1u])),
|
|
95
|
+
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 2u])),
|
|
96
|
+
bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 3u])),
|
|
97
|
+
);
|
|
98
|
+
atomicStore(&pose_accumulator[r_base + 0u], 0u);
|
|
99
|
+
atomicStore(&pose_accumulator[r_base + 1u], 0u);
|
|
100
|
+
atomicStore(&pose_accumulator[r_base + 2u], 0u);
|
|
101
|
+
atomicStore(&pose_accumulator[r_base + 3u], 0u);
|
|
102
|
+
// A sum of length zero carries no orientation to recover: every
|
|
103
|
+
// clip that writes this rotation is playing at weight zero, and
|
|
104
|
+
// the apply pass contributes to a bound clip whatever its
|
|
105
|
+
// weight. \`normalize\` answers NaN there, and one NaN local
|
|
106
|
+
// rotation reaches every skin matrix naming the joint, so the
|
|
107
|
+
// meshes it drives stop rasterising altogether — a rig loses a
|
|
108
|
+
// limb because a clip nobody is playing happens to be the only
|
|
109
|
+
// one that rotates it. Leaving the row alone is the rest pose,
|
|
110
|
+
// which is the answer the CPU twin gives (\`pose_evaluate_local\`)
|
|
111
|
+
// and the value the row still holds.
|
|
112
|
+
//
|
|
113
|
+
// Otherwise: the weighted-quaternion sum (\`w_i * q_i\`) is the
|
|
114
|
+
// standard nlerp blend numerator; normalise here, once, after
|
|
115
|
+
// every contributor has been folded in. The apply pass
|
|
116
|
+
// canonicalised signs at GLTF load so we don't hit the antipode
|
|
117
|
+
// case for imported clips.
|
|
118
|
+
if length(r) > 0.0 {
|
|
119
|
+
scene_write_node_local_rotation(&scene_database, row, normalize(r));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ── Scale ─────────────────────────────────────────────────────
|
|
124
|
+
if (dirty & POSE_DIRTY_S_MASK) != 0u {
|
|
125
|
+
let s_base = slot_base + POSE_OFFSET_SCALE;
|
|
126
|
+
var s = scene_read_node_rw(&scene_database, row).local_scale;
|
|
127
|
+
if (dirty & POSE_DIRTY_SX) != 0u {
|
|
128
|
+
s.x = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 0u]));
|
|
129
|
+
atomicStore(&pose_accumulator[s_base + 0u], 0u);
|
|
130
|
+
}
|
|
131
|
+
if (dirty & POSE_DIRTY_SY) != 0u {
|
|
132
|
+
s.y = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 1u]));
|
|
133
|
+
atomicStore(&pose_accumulator[s_base + 1u], 0u);
|
|
134
|
+
}
|
|
135
|
+
if (dirty & POSE_DIRTY_SZ) != 0u {
|
|
136
|
+
s.z = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 2u]));
|
|
137
|
+
atomicStore(&pose_accumulator[s_base + 2u], 0u);
|
|
138
|
+
}
|
|
139
|
+
scene_write_node_local_scale(&scene_database, row, s);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Clear the dirty mask itself last, so an interrupted resolve
|
|
143
|
+
// (theoretical — these passes don't yield) would still leave the
|
|
144
|
+
// dirty bits intact to be redone.
|
|
145
|
+
atomicStore(&pose_accumulator[dirty_word], 0u);
|
|
146
|
+
}
|
|
147
|
+
`, [
|
|
148
|
+
TRANSFORMS_TABLE.chunk_iterate(WORKGROUP_SIZE, true),
|
|
149
|
+
chunk_scene_database_access_rw,
|
|
150
|
+
chunk_pose_accumulator,
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Compute shader that drains the pose accumulator into
|
|
155
|
+
* `transforms_table.local_{translation,rotation,scale}`.
|
|
156
|
+
*
|
|
157
|
+
* Walks the transforms table via the read+write page iterator — one
|
|
158
|
+
* thread per slot. For each occupied row whose accumulator slot has
|
|
159
|
+
* any dirty bits set, reads the contributed components (atomic
|
|
160
|
+
* loads, bitcast back to f32), writes them through the per-field
|
|
161
|
+
* scene helpers, normalises rotation, and zeros the slot for next
|
|
162
|
+
* frame.
|
|
163
|
+
*
|
|
164
|
+
* The accumulator buffer must be sized to at least
|
|
165
|
+
* `transforms.dispatch_page_count * elements_per_page` rows —
|
|
166
|
+
* {@link GPUAnimationManager#ensure_pose_accumulator_capacity}
|
|
167
|
+
* handles that.
|
|
168
|
+
*
|
|
169
|
+
* Dispatch via
|
|
170
|
+
* `shader_animation_pose_resolve.dispatch({ group_count_x: transforms.dispatch_group_count(WORKGROUP_SIZE), ... })`.
|
|
171
|
+
*/
|
|
172
|
+
export const shader_animation_pose_resolve = ComputeShader.from({
|
|
173
|
+
label: "Animation/PoseResolve",
|
|
174
|
+
body,
|
|
175
|
+
resources,
|
|
176
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_animation_tick.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_tick.js"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,gCAAiC;AAuFjC;;;;;;;;;;;;;;;;GAgBG;AACH,
|
|
1
|
+
{"version":3,"file":"shader_animation_tick.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_tick.js"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,gCAAiC;AAuFjC;;;;;;;;;;;;;;;;GAgBG;AACH,kDAIG;8BAzH2B,4BAA4B"}
|