@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,249 +1,249 @@
|
|
|
1
|
-
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
2
|
-
import {
|
|
3
|
-
BLAS_VISIBILITY_SETTINGS_STRUCT,
|
|
4
|
-
shader_blas_audit_visibility
|
|
5
|
-
} from "./shader_blas_audit_visibility.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Can the traversal reach every triangle in the tree?
|
|
9
|
-
*
|
|
10
|
-
* The last unexercised link. Everything about the tree itself checks out — leaf boxes contain the
|
|
11
|
-
* triangles the intersector fetches, internal nodes are their children's union, the root matches an
|
|
12
|
-
* independently computed box, the instance's world AABB contains the geometry, and the stack does
|
|
13
|
-
* not overflow. None of that runs `ray_query_blas_nearest`, and that function is what the picture
|
|
14
|
-
* is made of.
|
|
15
|
-
*
|
|
16
|
-
* So: one ray per triangle, from the camera to that triangle's own centroid. The centroid is inside
|
|
17
|
-
* the triangle, so the ray intersects it, so a hit is guaranteed — this triangle, or whatever
|
|
18
|
-
* occludes it. A miss cannot happen geometrically. Every miss is the traversal declining to enter a
|
|
19
|
-
* box the ray is inside.
|
|
20
|
-
*
|
|
21
|
-
* Run it from a view that the picture disagrees at and from one it agrees at; the difference
|
|
22
|
-
* between the two counts is the fault, expressed as triangles rather than pixels.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @param {GPUDevice} device
|
|
27
|
-
* @param {GPUBuffer} buffer
|
|
28
|
-
* @param {number} size
|
|
29
|
-
* @returns {Promise<ArrayBuffer>}
|
|
30
|
-
*/
|
|
31
|
-
async function read_back(device, buffer, size) {
|
|
32
|
-
const staging = device.createBuffer({
|
|
33
|
-
label: 'reachability/readback',
|
|
34
|
-
size,
|
|
35
|
-
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const encoder = device.createCommandEncoder({ label: 'reachability/readback' });
|
|
39
|
-
|
|
40
|
-
encoder.copyBufferToBuffer(buffer, 0, staging, 0, size);
|
|
41
|
-
|
|
42
|
-
device.queue.submit([encoder.finish()]);
|
|
43
|
-
|
|
44
|
-
await staging.mapAsync(GPUMapMode.READ);
|
|
45
|
-
|
|
46
|
-
const copy = staging.getMappedRange().slice(0);
|
|
47
|
-
|
|
48
|
-
staging.unmap();
|
|
49
|
-
staging.destroy();
|
|
50
|
-
|
|
51
|
-
return copy;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Apply the inverse of a mesh's transform to a world point — the same trip `chunk_ray_query_nearest`
|
|
56
|
-
* makes to put a ray into geometry space.
|
|
57
|
-
*
|
|
58
|
-
* Done on the host with a full inverse rather than by transposing a rotation, because the transform
|
|
59
|
-
* carries the asset's centimetre scale and a shortcut that assumes orthonormality would silently be
|
|
60
|
-
* a hundred times wrong here.
|
|
61
|
-
*
|
|
62
|
-
* @param {ArrayLike<number>} m column-major 4x4
|
|
63
|
-
* @param {number[]} point
|
|
64
|
-
* @returns {number[]}
|
|
65
|
-
*/
|
|
66
|
-
function inverse_transform_point(m, point) {
|
|
67
|
-
const a = [
|
|
68
|
-
[m[0], m[4], m[8], m[12]],
|
|
69
|
-
[m[1], m[5], m[9], m[13]],
|
|
70
|
-
[m[2], m[6], m[10], m[14]],
|
|
71
|
-
[m[3], m[7], m[11], m[15]],
|
|
72
|
-
];
|
|
73
|
-
|
|
74
|
-
const b = [point[0], point[1], point[2], 1];
|
|
75
|
-
|
|
76
|
-
// Gaussian elimination on the 4x4 — small, and clearer than an inlined cofactor expansion
|
|
77
|
-
for (let column = 0; column < 4; column++) {
|
|
78
|
-
let pivot = column;
|
|
79
|
-
|
|
80
|
-
for (let row = column + 1; row < 4; row++) {
|
|
81
|
-
if (Math.abs(a[row][column]) > Math.abs(a[pivot][column])) {
|
|
82
|
-
pivot = row;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
[a[column], a[pivot]] = [a[pivot], a[column]];
|
|
87
|
-
[b[column], b[pivot]] = [b[pivot], b[column]];
|
|
88
|
-
|
|
89
|
-
const divisor = a[column][column];
|
|
90
|
-
|
|
91
|
-
for (let k = column; k < 4; k++) {
|
|
92
|
-
a[column][k] /= divisor;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
b[column] /= divisor;
|
|
96
|
-
|
|
97
|
-
for (let row = 0; row < 4; row++) {
|
|
98
|
-
if (row === column) {
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const factor = a[row][column];
|
|
103
|
-
|
|
104
|
-
for (let k = column; k < 4; k++) {
|
|
105
|
-
a[row][k] -= factor * a[column][k];
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
b[row] -= factor * b[column];
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const w = b[3] === 0 ? 1 : b[3];
|
|
113
|
-
|
|
114
|
-
return [b[0] / w, b[1] / w, b[2] / w];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* @param {object} options
|
|
119
|
-
* @param {Renderer} options.renderer
|
|
120
|
-
* @param {PerspectiveCamera} options.camera whose position the rays start from
|
|
121
|
-
* @param {Mesh} options.mesh the instance whose transform puts the camera into geometry space
|
|
122
|
-
* @param {object} options.target refit target of the tree to audit
|
|
123
|
-
* @param {number} options.geometry_index
|
|
124
|
-
* @returns {Promise<object>}
|
|
125
|
-
*/
|
|
126
|
-
export async function verify_traversal_reachability({
|
|
127
|
-
renderer,
|
|
128
|
-
camera,
|
|
129
|
-
mesh,
|
|
130
|
-
target,
|
|
131
|
-
geometry_index,
|
|
132
|
-
}) {
|
|
133
|
-
const graphics = renderer.graphics;
|
|
134
|
-
const device = graphics.device;
|
|
135
|
-
|
|
136
|
-
const geometries = graphics.geometries;
|
|
137
|
-
const blas = geometries.blas;
|
|
138
|
-
const meshlets = geometries.meshlets;
|
|
139
|
-
|
|
140
|
-
const { leaf_count, node_word_offset, leaf_nodes_offset } = target;
|
|
141
|
-
|
|
142
|
-
const origin = inverse_transform_point(
|
|
143
|
-
mesh.transform_global.matrix,
|
|
144
|
-
[...camera.transform.position]
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
const t_bytes = leaf_count * Float32Array.BYTES_PER_ELEMENT;
|
|
148
|
-
|
|
149
|
-
const out_t = device.createBuffer({
|
|
150
|
-
label: 'reachability/t',
|
|
151
|
-
size: t_bytes,
|
|
152
|
-
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
const out_triangle = device.createBuffer({
|
|
156
|
-
label: 'reachability/triangle',
|
|
157
|
-
size: t_bytes,
|
|
158
|
-
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
const out_expected_t = device.createBuffer({
|
|
162
|
-
label: 'reachability/expected t',
|
|
163
|
-
size: t_bytes,
|
|
164
|
-
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
const cmd = ShadeGPUCommandContext.create(graphics, 'audit/reachability');
|
|
168
|
-
|
|
169
|
-
shader_blas_audit_visibility.
|
|
170
|
-
encoder: cmd,
|
|
171
|
-
|
|
172
|
-
bindings: {
|
|
173
|
-
settings: cmd.allocateTransientValueBuffer(BLAS_VISIBILITY_SETTINGS_STRUCT, {
|
|
174
|
-
origin,
|
|
175
|
-
leaf_count,
|
|
176
|
-
node_word_offset,
|
|
177
|
-
leaf_nodes_offset,
|
|
178
|
-
geometry_index,
|
|
179
|
-
tmax: 1e12,
|
|
180
|
-
}),
|
|
181
|
-
leaf_nodes: blas.buffer_leaf_nodes,
|
|
182
|
-
blas_lookup: blas.buffer_metadata,
|
|
183
|
-
blas_data: blas.buffer_data,
|
|
184
|
-
geometries: geometries.buffer_metadata,
|
|
185
|
-
meshlet_metadata: meshlets.buffer_metadata,
|
|
186
|
-
meshlet_data: meshlets.buffer_data,
|
|
187
|
-
nodes: blas.buffer_data,
|
|
188
|
-
out_t,
|
|
189
|
-
out_triangle,
|
|
190
|
-
out_expected_t,
|
|
191
|
-
},
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
cmd.finish();
|
|
195
|
-
|
|
196
|
-
await device.queue.onSubmittedWorkDone();
|
|
197
|
-
|
|
198
|
-
const t = new Float32Array(await read_back(device, out_t, t_bytes));
|
|
199
|
-
const expected = new Float32Array(await read_back(device, out_expected_t, t_bytes));
|
|
200
|
-
|
|
201
|
-
out_t.destroy();
|
|
202
|
-
out_triangle.destroy();
|
|
203
|
-
out_expected_t.destroy();
|
|
204
|
-
|
|
205
|
-
let missed = 0;
|
|
206
|
-
let overshot = 0;
|
|
207
|
-
let worst_overshoot = 0;
|
|
208
|
-
|
|
209
|
-
for (let i = 0; i < leaf_count; i++) {
|
|
210
|
-
if (!(t[i] >= 0)) {
|
|
211
|
-
missed += 1;
|
|
212
|
-
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// 1e-3 of the aimed distance, which is far above float error on these magnitudes and far
|
|
217
|
-
// below the gap between one surface and the next
|
|
218
|
-
const overshoot = (t[i] - expected[i]) / Math.max(1e-9, expected[i]);
|
|
219
|
-
|
|
220
|
-
if (overshoot > 1e-3) {
|
|
221
|
-
overshot += 1;
|
|
222
|
-
|
|
223
|
-
worst_overshoot = Math.max(worst_overshoot, overshoot);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const lost = missed + overshot;
|
|
228
|
-
|
|
229
|
-
const result = {
|
|
230
|
-
leaf_count,
|
|
231
|
-
missed,
|
|
232
|
-
overshot,
|
|
233
|
-
worst_overshoot: +worst_overshoot.toFixed(4),
|
|
234
|
-
lost,
|
|
235
|
-
lost_pct: +(lost / leaf_count * 100).toFixed(3),
|
|
236
|
-
origin: origin.map(v => +v.toFixed(3)),
|
|
237
|
-
verdict: lost === 0
|
|
238
|
-
? `pass — the traversal returns a surface at or before every one of ${leaf_count} `
|
|
239
|
-
+ `triangles it was aimed at`
|
|
240
|
-
: `FAIL — ${lost} of ${leaf_count} (${(lost / leaf_count * 100).toFixed(2)}%) rays aimed `
|
|
241
|
-
+ `at a triangle came back with nothing (${missed}) or with something behind it `
|
|
242
|
-
+ `(${overshot}). Neither is geometrically possible, so the traversal is walking past `
|
|
243
|
-
+ `surfaces it was pointed at — which is the hole in the traced image.`,
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
console.log(result.verdict, result);
|
|
247
|
-
|
|
248
|
-
return result;
|
|
249
|
-
}
|
|
1
|
+
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
2
|
+
import {
|
|
3
|
+
BLAS_VISIBILITY_SETTINGS_STRUCT,
|
|
4
|
+
shader_blas_audit_visibility
|
|
5
|
+
} from "./shader_blas_audit_visibility.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Can the traversal reach every triangle in the tree?
|
|
9
|
+
*
|
|
10
|
+
* The last unexercised link. Everything about the tree itself checks out — leaf boxes contain the
|
|
11
|
+
* triangles the intersector fetches, internal nodes are their children's union, the root matches an
|
|
12
|
+
* independently computed box, the instance's world AABB contains the geometry, and the stack does
|
|
13
|
+
* not overflow. None of that runs `ray_query_blas_nearest`, and that function is what the picture
|
|
14
|
+
* is made of.
|
|
15
|
+
*
|
|
16
|
+
* So: one ray per triangle, from the camera to that triangle's own centroid. The centroid is inside
|
|
17
|
+
* the triangle, so the ray intersects it, so a hit is guaranteed — this triangle, or whatever
|
|
18
|
+
* occludes it. A miss cannot happen geometrically. Every miss is the traversal declining to enter a
|
|
19
|
+
* box the ray is inside.
|
|
20
|
+
*
|
|
21
|
+
* Run it from a view that the picture disagrees at and from one it agrees at; the difference
|
|
22
|
+
* between the two counts is the fault, expressed as triangles rather than pixels.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param {GPUDevice} device
|
|
27
|
+
* @param {GPUBuffer} buffer
|
|
28
|
+
* @param {number} size
|
|
29
|
+
* @returns {Promise<ArrayBuffer>}
|
|
30
|
+
*/
|
|
31
|
+
async function read_back(device, buffer, size) {
|
|
32
|
+
const staging = device.createBuffer({
|
|
33
|
+
label: 'reachability/readback',
|
|
34
|
+
size,
|
|
35
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const encoder = device.createCommandEncoder({ label: 'reachability/readback' });
|
|
39
|
+
|
|
40
|
+
encoder.copyBufferToBuffer(buffer, 0, staging, 0, size);
|
|
41
|
+
|
|
42
|
+
device.queue.submit([encoder.finish()]);
|
|
43
|
+
|
|
44
|
+
await staging.mapAsync(GPUMapMode.READ);
|
|
45
|
+
|
|
46
|
+
const copy = staging.getMappedRange().slice(0);
|
|
47
|
+
|
|
48
|
+
staging.unmap();
|
|
49
|
+
staging.destroy();
|
|
50
|
+
|
|
51
|
+
return copy;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Apply the inverse of a mesh's transform to a world point — the same trip `chunk_ray_query_nearest`
|
|
56
|
+
* makes to put a ray into geometry space.
|
|
57
|
+
*
|
|
58
|
+
* Done on the host with a full inverse rather than by transposing a rotation, because the transform
|
|
59
|
+
* carries the asset's centimetre scale and a shortcut that assumes orthonormality would silently be
|
|
60
|
+
* a hundred times wrong here.
|
|
61
|
+
*
|
|
62
|
+
* @param {ArrayLike<number>} m column-major 4x4
|
|
63
|
+
* @param {number[]} point
|
|
64
|
+
* @returns {number[]}
|
|
65
|
+
*/
|
|
66
|
+
function inverse_transform_point(m, point) {
|
|
67
|
+
const a = [
|
|
68
|
+
[m[0], m[4], m[8], m[12]],
|
|
69
|
+
[m[1], m[5], m[9], m[13]],
|
|
70
|
+
[m[2], m[6], m[10], m[14]],
|
|
71
|
+
[m[3], m[7], m[11], m[15]],
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
const b = [point[0], point[1], point[2], 1];
|
|
75
|
+
|
|
76
|
+
// Gaussian elimination on the 4x4 — small, and clearer than an inlined cofactor expansion
|
|
77
|
+
for (let column = 0; column < 4; column++) {
|
|
78
|
+
let pivot = column;
|
|
79
|
+
|
|
80
|
+
for (let row = column + 1; row < 4; row++) {
|
|
81
|
+
if (Math.abs(a[row][column]) > Math.abs(a[pivot][column])) {
|
|
82
|
+
pivot = row;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[a[column], a[pivot]] = [a[pivot], a[column]];
|
|
87
|
+
[b[column], b[pivot]] = [b[pivot], b[column]];
|
|
88
|
+
|
|
89
|
+
const divisor = a[column][column];
|
|
90
|
+
|
|
91
|
+
for (let k = column; k < 4; k++) {
|
|
92
|
+
a[column][k] /= divisor;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
b[column] /= divisor;
|
|
96
|
+
|
|
97
|
+
for (let row = 0; row < 4; row++) {
|
|
98
|
+
if (row === column) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const factor = a[row][column];
|
|
103
|
+
|
|
104
|
+
for (let k = column; k < 4; k++) {
|
|
105
|
+
a[row][k] -= factor * a[column][k];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
b[row] -= factor * b[column];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const w = b[3] === 0 ? 1 : b[3];
|
|
113
|
+
|
|
114
|
+
return [b[0] / w, b[1] / w, b[2] / w];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @param {object} options
|
|
119
|
+
* @param {Renderer} options.renderer
|
|
120
|
+
* @param {PerspectiveCamera} options.camera whose position the rays start from
|
|
121
|
+
* @param {Mesh} options.mesh the instance whose transform puts the camera into geometry space
|
|
122
|
+
* @param {object} options.target refit target of the tree to audit
|
|
123
|
+
* @param {number} options.geometry_index
|
|
124
|
+
* @returns {Promise<object>}
|
|
125
|
+
*/
|
|
126
|
+
export async function verify_traversal_reachability({
|
|
127
|
+
renderer,
|
|
128
|
+
camera,
|
|
129
|
+
mesh,
|
|
130
|
+
target,
|
|
131
|
+
geometry_index,
|
|
132
|
+
}) {
|
|
133
|
+
const graphics = renderer.graphics;
|
|
134
|
+
const device = graphics.device;
|
|
135
|
+
|
|
136
|
+
const geometries = graphics.geometries;
|
|
137
|
+
const blas = geometries.blas;
|
|
138
|
+
const meshlets = geometries.meshlets;
|
|
139
|
+
|
|
140
|
+
const { leaf_count, node_word_offset, leaf_nodes_offset } = target;
|
|
141
|
+
|
|
142
|
+
const origin = inverse_transform_point(
|
|
143
|
+
mesh.transform_global.matrix,
|
|
144
|
+
[...camera.transform.position]
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const t_bytes = leaf_count * Float32Array.BYTES_PER_ELEMENT;
|
|
148
|
+
|
|
149
|
+
const out_t = device.createBuffer({
|
|
150
|
+
label: 'reachability/t',
|
|
151
|
+
size: t_bytes,
|
|
152
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const out_triangle = device.createBuffer({
|
|
156
|
+
label: 'reachability/triangle',
|
|
157
|
+
size: t_bytes,
|
|
158
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const out_expected_t = device.createBuffer({
|
|
162
|
+
label: 'reachability/expected t',
|
|
163
|
+
size: t_bytes,
|
|
164
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
const cmd = ShadeGPUCommandContext.create(graphics, 'audit/reachability');
|
|
168
|
+
|
|
169
|
+
shader_blas_audit_visibility.dispatchThreads({
|
|
170
|
+
encoder: cmd,
|
|
171
|
+
thread_count_x: leaf_count,
|
|
172
|
+
bindings: {
|
|
173
|
+
settings: cmd.allocateTransientValueBuffer(BLAS_VISIBILITY_SETTINGS_STRUCT, {
|
|
174
|
+
origin,
|
|
175
|
+
leaf_count,
|
|
176
|
+
node_word_offset,
|
|
177
|
+
leaf_nodes_offset,
|
|
178
|
+
geometry_index,
|
|
179
|
+
tmax: 1e12,
|
|
180
|
+
}),
|
|
181
|
+
leaf_nodes: blas.buffer_leaf_nodes,
|
|
182
|
+
blas_lookup: blas.buffer_metadata,
|
|
183
|
+
blas_data: blas.buffer_data,
|
|
184
|
+
geometries: geometries.buffer_metadata,
|
|
185
|
+
meshlet_metadata: meshlets.buffer_metadata,
|
|
186
|
+
meshlet_data: meshlets.buffer_data,
|
|
187
|
+
nodes: blas.buffer_data,
|
|
188
|
+
out_t,
|
|
189
|
+
out_triangle,
|
|
190
|
+
out_expected_t,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
cmd.finish();
|
|
195
|
+
|
|
196
|
+
await device.queue.onSubmittedWorkDone();
|
|
197
|
+
|
|
198
|
+
const t = new Float32Array(await read_back(device, out_t, t_bytes));
|
|
199
|
+
const expected = new Float32Array(await read_back(device, out_expected_t, t_bytes));
|
|
200
|
+
|
|
201
|
+
out_t.destroy();
|
|
202
|
+
out_triangle.destroy();
|
|
203
|
+
out_expected_t.destroy();
|
|
204
|
+
|
|
205
|
+
let missed = 0;
|
|
206
|
+
let overshot = 0;
|
|
207
|
+
let worst_overshoot = 0;
|
|
208
|
+
|
|
209
|
+
for (let i = 0; i < leaf_count; i++) {
|
|
210
|
+
if (!(t[i] >= 0)) {
|
|
211
|
+
missed += 1;
|
|
212
|
+
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// 1e-3 of the aimed distance, which is far above float error on these magnitudes and far
|
|
217
|
+
// below the gap between one surface and the next
|
|
218
|
+
const overshoot = (t[i] - expected[i]) / Math.max(1e-9, expected[i]);
|
|
219
|
+
|
|
220
|
+
if (overshoot > 1e-3) {
|
|
221
|
+
overshot += 1;
|
|
222
|
+
|
|
223
|
+
worst_overshoot = Math.max(worst_overshoot, overshoot);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const lost = missed + overshot;
|
|
228
|
+
|
|
229
|
+
const result = {
|
|
230
|
+
leaf_count,
|
|
231
|
+
missed,
|
|
232
|
+
overshot,
|
|
233
|
+
worst_overshoot: +worst_overshoot.toFixed(4),
|
|
234
|
+
lost,
|
|
235
|
+
lost_pct: +(lost / leaf_count * 100).toFixed(3),
|
|
236
|
+
origin: origin.map(v => +v.toFixed(3)),
|
|
237
|
+
verdict: lost === 0
|
|
238
|
+
? `pass — the traversal returns a surface at or before every one of ${leaf_count} `
|
|
239
|
+
+ `triangles it was aimed at`
|
|
240
|
+
: `FAIL — ${lost} of ${leaf_count} (${(lost / leaf_count * 100).toFixed(2)}%) rays aimed `
|
|
241
|
+
+ `at a triangle came back with nothing (${missed}) or with something behind it `
|
|
242
|
+
+ `(${overshot}). Neither is geometrically possible, so the traversal is walking past `
|
|
243
|
+
+ `surfaces it was pointed at — which is the hole in the traced image.`,
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
console.log(result.verdict, result);
|
|
247
|
+
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
@@ -23,7 +23,7 @@ export class StaticGraphicsEngineAssets {
|
|
|
23
23
|
// Spatio-Temporal Blue Noise (NVIDIA 2020-ish)
|
|
24
24
|
|
|
25
25
|
// vendored alongside the engine rather than at the repo root, so `src/shade` stays one
|
|
26
|
-
// directory that can be diffed against upstream (
|
|
26
|
+
// directory that can be diffed against upstream (../../../SHADE_ORIGIN.md)
|
|
27
27
|
const asset_url = (name) => new URL(`../assets/textures/${name}`, import.meta.url).href;
|
|
28
28
|
|
|
29
29
|
const [
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* Gameplay poses — a socket, an effect anchor, the muzzle a projectile leaves from — are a **pure
|
|
6
6
|
* function of (clip set, time, weights)**, evaluated on demand at query time. They are never read
|
|
7
7
|
* back from the GPU: readback is asynchronous and a frame late, which would make a projectile's
|
|
8
|
-
* origin depend on frame pacing and poison determinism and replay
|
|
8
|
+
* origin depend on frame pacing and poison determinism and replay — no GPU readback on a
|
|
9
|
+
* gameplay-affecting path.
|
|
9
10
|
*/
|
|
10
11
|
export class PosePlayback {
|
|
11
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PosePlayback.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/pose/PosePlayback.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"PosePlayback.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/pose/PosePlayback.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH;IAwBI;;;;;OAKG;IACH,4CAJW,MAAM,UACN,MAAM,GACJ,YAAY,CAcxB;IAzCD;;OAEG;IACH,yBAAY;IAEZ;;;;OAIG;IACH,MAFU,MAAM,CAEP;IAET;;;;;;;;OAQG;IACH,QAFU,MAAM,CAEL;CAqBd"}
|
|
@@ -7,7 +7,8 @@ import { assert } from "../../../../core/assert.js";
|
|
|
7
7
|
* Gameplay poses — a socket, an effect anchor, the muzzle a projectile leaves from — are a **pure
|
|
8
8
|
* function of (clip set, time, weights)**, evaluated on demand at query time. They are never read
|
|
9
9
|
* back from the GPU: readback is asynchronous and a frame late, which would make a projectile's
|
|
10
|
-
* origin depend on frame pacing and poison determinism and replay
|
|
10
|
+
* origin depend on frame pacing and poison determinism and replay — no GPU readback on a
|
|
11
|
+
* gameplay-affecting path.
|
|
11
12
|
*/
|
|
12
13
|
export class PosePlayback {
|
|
13
14
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_animation_apply.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_apply.js"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,gCAAiC;AAoFjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,
|
|
1
|
+
{"version":3,"file":"shader_animation_apply.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_apply.js"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,gCAAiC;AAoFjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,mDAIG;8BA1H2B,4BAA4B"}
|