@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,291 +1,291 @@
|
|
|
1
|
-
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { WGSLParser } from "../WGSLParser.js";
|
|
3
|
-
import { WGSLJavaScriptCompiler } from "./WGSLJavaScriptCompiler.js";
|
|
4
|
-
import { WGSLLanguageCore } from "./WGSLLanguageCore.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Emulates a {@link ComputeShader} on the CPU by translating its WGSL source to JavaScript
|
|
8
|
-
* and dispatching threads point-wise.
|
|
9
|
-
*
|
|
10
|
-
* Intended for testing — feed the same shader instance you'd run on a GPU, drive it from a
|
|
11
|
-
* unit test, and inspect the resulting bindings or texture state.
|
|
12
|
-
*
|
|
13
|
-
* Texture bindings expect a {@link CPUBitmapData} (1D / 2D / 3D inferred from
|
|
14
|
-
* the bitmap's `size`). Sampling routes through {@link cpu_texture_sample},
|
|
15
|
-
* which honours the bound sampler's address modes and filter.
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* const shader = ComputeShader.from({...});
|
|
19
|
-
* const emu = await ComputeShaderEmulator.create(shader);
|
|
20
|
-
* emu.bindings = { data: someArray };
|
|
21
|
-
* emu.dispatch([0, 0, 0]); // global_invocation_id = (0,0,0)
|
|
22
|
-
* emu.dispatch([1, 0, 0]); // global_invocation_id = (1,0,0)
|
|
23
|
-
* // ... bindings now contain results
|
|
24
|
-
*/
|
|
25
|
-
export class ComputeShaderEmulator {
|
|
26
|
-
|
|
27
|
-
/** @type {string} */
|
|
28
|
-
#source;
|
|
29
|
-
|
|
30
|
-
/** @type {string} */
|
|
31
|
-
#js_source;
|
|
32
|
-
|
|
33
|
-
/** @type {object} */
|
|
34
|
-
#module;
|
|
35
|
-
|
|
36
|
-
/** @type {object} */
|
|
37
|
-
#workgroup_state;
|
|
38
|
-
|
|
39
|
-
/** @type {object} */
|
|
40
|
-
#language_core;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Bindings currently in effect. Keys match the WGSL variable names declared with
|
|
44
|
-
* `@group(...) @binding(...) var ...: T`.
|
|
45
|
-
* @type {object}
|
|
46
|
-
*/
|
|
47
|
-
bindings = {};
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Construct directly when you already have the WGSL source string.
|
|
51
|
-
*
|
|
52
|
-
* For most use cases prefer {@link create} or {@link fromComputeShader}.
|
|
53
|
-
*
|
|
54
|
-
* @param {object} options
|
|
55
|
-
* @param {object} options.module — the compiled module returned by the JS factory
|
|
56
|
-
* @param {string} options.source — the original WGSL source
|
|
57
|
-
* @param {string} options.jsSource — the generated JS source (kept for debugging)
|
|
58
|
-
* @param {object} options.languageCore — the runtime `wgsl` object
|
|
59
|
-
*/
|
|
60
|
-
constructor({ module, source, jsSource, languageCore }) {
|
|
61
|
-
this.#module = module;
|
|
62
|
-
this.#source = source;
|
|
63
|
-
this.#js_source = jsSource;
|
|
64
|
-
this.#language_core = languageCore;
|
|
65
|
-
// Fragment-stage entries have no var<workgroup>, so the module skips emitting the
|
|
66
|
-
// workgroup-state factory; in that case workgroup_state is a no-op empty object.
|
|
67
|
-
this.#workgroup_state = typeof module.create_workgroup_state === 'function'
|
|
68
|
-
? module.create_workgroup_state()
|
|
69
|
-
: {};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* @returns {string} the WGSL source.
|
|
74
|
-
*/
|
|
75
|
-
get source() {
|
|
76
|
-
return this.#source;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @returns {string} the generated JavaScript source. Useful for debugging.
|
|
81
|
-
*/
|
|
82
|
-
get jsSource() {
|
|
83
|
-
return this.#js_source;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* @returns {object} the language core object passed to the generated JS as `wgsl`.
|
|
88
|
-
*/
|
|
89
|
-
get languageCore() {
|
|
90
|
-
return this.#language_core;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* @returns {string} the name of the entry function (whether @compute or @fragment).
|
|
95
|
-
*/
|
|
96
|
-
get entryName() {
|
|
97
|
-
return this.#module.entry_name;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* @returns {'compute' | 'fragment'} which shader stage the entry function targets.
|
|
102
|
-
*/
|
|
103
|
-
get stage() {
|
|
104
|
-
return this.#module.stage;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* @returns {number[] | undefined} the workgroup size for @compute entries (undefined for @fragment).
|
|
109
|
-
*/
|
|
110
|
-
get workgroup_size() {
|
|
111
|
-
return this.#module.workgroup_size;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* @returns {string[]} the entry function's parameter names, in declaration order.
|
|
116
|
-
*/
|
|
117
|
-
get entryParamNames() {
|
|
118
|
-
return this.#module.param_names;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* @returns {object} the current workgroup state — workgroup-scope variables live here.
|
|
123
|
-
*/
|
|
124
|
-
get workgroup() {
|
|
125
|
-
return this.#workgroup_state;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Reset the workgroup state. Call between simulated workgroups so that `var<workgroup>`
|
|
130
|
-
* variables start fresh. No-op for fragment-stage entries.
|
|
131
|
-
*/
|
|
132
|
-
resetWorkgroup() {
|
|
133
|
-
if (typeof this.#module.create_workgroup_state === 'function') {
|
|
134
|
-
this.#workgroup_state = this.#module.create_workgroup_state();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Dispatch a single thread (point-wise simulation). The arguments are the entry function's
|
|
140
|
-
* parameters, in declaration order — for example a `@builtin(global_invocation_id)` param of
|
|
141
|
-
* type `vec3<u32>` is supplied as a 3-element array.
|
|
142
|
-
*
|
|
143
|
-
* For @compute entries, returns whatever the entry function returns (typically nothing —
|
|
144
|
-
* results land in bindings). For @fragment entries, returns the fragment's output value
|
|
145
|
-
* (typically a vec4 for `@location(0)` or a struct of locations).
|
|
146
|
-
*
|
|
147
|
-
* @param {...*} mainArgs
|
|
148
|
-
* @returns {*}
|
|
149
|
-
*/
|
|
150
|
-
dispatch(...mainArgs) {
|
|
151
|
-
if (this.#module.stage === 'fragment') {
|
|
152
|
-
return this.#module.entry(this.bindings, ...mainArgs);
|
|
153
|
-
}
|
|
154
|
-
return this.#module.entry(this.bindings, this.#workgroup_state, ...mainArgs);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Compile a WGSL source string into an executable emulator. Requires a `@compute` or
|
|
159
|
-
* `@fragment` entry function; for chunks of pure helper code with no entry, use
|
|
160
|
-
* {@link fromCodeChunk}.
|
|
161
|
-
*
|
|
162
|
-
* @param {string} source
|
|
163
|
-
* @param {object} [options]
|
|
164
|
-
* @param {WGSLParser} [options.parser] — share a parser across multiple compiles
|
|
165
|
-
* @param {object} [options.languageCore] — defaults to {@link WGSLLanguageCore}
|
|
166
|
-
* @returns {Promise<ComputeShaderEmulator>}
|
|
167
|
-
*/
|
|
168
|
-
static async fromSource(source, options = {}) {
|
|
169
|
-
const { module, jsSource } = await compileWgslSource(source, options);
|
|
170
|
-
if (typeof module.entry !== 'function') {
|
|
171
|
-
throw new Error('ComputeShaderEmulator.fromSource: WGSL has no @compute or @fragment entry function. Use ComputeShaderEmulator.fromCodeChunk for library-style code.');
|
|
172
|
-
}
|
|
173
|
-
return new ComputeShaderEmulator({
|
|
174
|
-
module,
|
|
175
|
-
source,
|
|
176
|
-
jsSource,
|
|
177
|
-
languageCore: options.languageCore || WGSLLanguageCore,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Build an emulator from an existing {@link ComputeShader} instance.
|
|
183
|
-
*
|
|
184
|
-
* @param {import("../../renderer/shader/ComputeShader.js").ComputeShader} shader
|
|
185
|
-
* @param {object} [options]
|
|
186
|
-
* @param {WGSLParser} [options.parser]
|
|
187
|
-
* @param {object} [options.languageCore]
|
|
188
|
-
* @returns {Promise<ComputeShaderEmulator>}
|
|
189
|
-
*/
|
|
190
|
-
static async fromComputeShader(shader, options = {}) {
|
|
191
|
-
assert.defined(shader, 'shader');
|
|
192
|
-
const source = shader.descriptor.
|
|
193
|
-
return ComputeShaderEmulator.fromSource(source, options);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Build an emulator from an existing {@link ImageShader} instance — a full-screen fragment
|
|
198
|
-
* pass. The vertex stage is intentionally skipped (single-pixel emulation), so callers
|
|
199
|
-
* provide the `@builtin(position)` value (and any other fragment inputs) directly to
|
|
200
|
-
* {@link dispatch}.
|
|
201
|
-
*
|
|
202
|
-
* Derivative builtins (`dpdx`, `dpdy`, `fwidth` and their fine/coarse variants) throw at
|
|
203
|
-
* runtime — their values can't be faked from a single pixel.
|
|
204
|
-
*
|
|
205
|
-
* @example
|
|
206
|
-
* const emu = await ComputeShaderEmulator.fromImageShader(shader);
|
|
207
|
-
* emu.bindings = { input: someCPUBitmapData };
|
|
208
|
-
* const out = emu.dispatch(new Float32Array([100.5, 200.5, 0, 1])); // vec4 frag.position
|
|
209
|
-
* // `out` is the fragment's @location(0) return value (typically a vec4).
|
|
210
|
-
*
|
|
211
|
-
* @param {import("../../renderer/shader/ImageShader.js").ImageShader} shader
|
|
212
|
-
* @param {object} [options]
|
|
213
|
-
* @param {WGSLParser} [options.parser]
|
|
214
|
-
* @param {object} [options.languageCore]
|
|
215
|
-
* @returns {Promise<ComputeShaderEmulator>}
|
|
216
|
-
*/
|
|
217
|
-
static async fromImageShader(shader, options = {}) {
|
|
218
|
-
assert.defined(shader, 'shader');
|
|
219
|
-
const source = shader.descriptor.
|
|
220
|
-
return ComputeShaderEmulator.fromSource(source, options);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Compile a {@link CodeChunk} (or a raw WGSL string) into a "library" object — every
|
|
225
|
-
* top-level WGSL function becomes a method, every `var<private>` becomes a getter/setter
|
|
226
|
-
* property, and every module-scope `const` becomes a read-only getter.
|
|
227
|
-
*
|
|
228
|
-
* No `@compute` entry is required. This is the one-line escape hatch for unit-testing pure
|
|
229
|
-
* helper code (RNGs, hashes, packing, math) without wrapping each chunk in a shader skeleton.
|
|
230
|
-
*
|
|
231
|
-
* @example
|
|
232
|
-
* const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_random);
|
|
233
|
-
* expect(lib.random()).toBeLessThan(1);
|
|
234
|
-
*
|
|
235
|
-
* @param {import("../../renderer/shader/compiler/CodeChunk.js").CodeChunk | string} chunk_or_source
|
|
236
|
-
* @param {object} [options]
|
|
237
|
-
* @param {WGSLParser} [options.parser]
|
|
238
|
-
* @param {object} [options.languageCore]
|
|
239
|
-
* @returns {Promise<object>} the library module
|
|
240
|
-
*/
|
|
241
|
-
static async fromCodeChunk(chunk_or_source, options = {}) {
|
|
242
|
-
assert.defined(chunk_or_source, 'chunk_or_source');
|
|
243
|
-
const source = typeof chunk_or_source === 'string'
|
|
244
|
-
? chunk_or_source
|
|
245
|
-
: chunk_or_source.compile().text;
|
|
246
|
-
const { module } = await compileWgslSource(source, options);
|
|
247
|
-
return module;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Internal helper: parse + compile + evaluate a WGSL source string, returning the factory's
|
|
253
|
-
* resulting module along with the generated JS for diagnostics.
|
|
254
|
-
*
|
|
255
|
-
* @param {string} source
|
|
256
|
-
* @param {object} options
|
|
257
|
-
* @param {WGSLParser} [options.parser]
|
|
258
|
-
* @param {object} [options.languageCore]
|
|
259
|
-
* @returns {Promise<{ module: object, jsSource: string }>}
|
|
260
|
-
*/
|
|
261
|
-
async function compileWgslSource(source, { parser, languageCore = WGSLLanguageCore } = {}) {
|
|
262
|
-
assert.isString(source, 'source');
|
|
263
|
-
|
|
264
|
-
let p = parser;
|
|
265
|
-
if (p === undefined) {
|
|
266
|
-
p = new WGSLParser();
|
|
267
|
-
await p.init();
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const tree = p.parse(source);
|
|
271
|
-
if (tree.rootNode.hasError) {
|
|
272
|
-
throw new Error(`WGSL parse error in source:\n${source}`);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
const compiler = new WGSLJavaScriptCompiler();
|
|
277
|
-
const jsSource = compiler.compile(tree);
|
|
278
|
-
|
|
279
|
-
let factory;
|
|
280
|
-
try {
|
|
281
|
-
// eslint-disable-next-line no-new-func
|
|
282
|
-
factory = (new Function(`return ${jsSource};`))();
|
|
283
|
-
} catch (e) {
|
|
284
|
-
const err = new Error(`failed to evaluate generated JavaScript: ${e.message}\n--- generated JS ---\n${jsSource}`);
|
|
285
|
-
err.cause = e;
|
|
286
|
-
throw err;
|
|
287
|
-
}
|
|
288
|
-
const module = factory(languageCore);
|
|
289
|
-
|
|
290
|
-
return { module, jsSource };
|
|
291
|
-
}
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { WGSLParser } from "../WGSLParser.js";
|
|
3
|
+
import { WGSLJavaScriptCompiler } from "./WGSLJavaScriptCompiler.js";
|
|
4
|
+
import { WGSLLanguageCore } from "./WGSLLanguageCore.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Emulates a {@link ComputeShader} on the CPU by translating its WGSL source to JavaScript
|
|
8
|
+
* and dispatching threads point-wise.
|
|
9
|
+
*
|
|
10
|
+
* Intended for testing — feed the same shader instance you'd run on a GPU, drive it from a
|
|
11
|
+
* unit test, and inspect the resulting bindings or texture state.
|
|
12
|
+
*
|
|
13
|
+
* Texture bindings expect a {@link CPUBitmapData} (1D / 2D / 3D inferred from
|
|
14
|
+
* the bitmap's `size`). Sampling routes through {@link cpu_texture_sample},
|
|
15
|
+
* which honours the bound sampler's address modes and filter.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const shader = ComputeShader.from({...});
|
|
19
|
+
* const emu = await ComputeShaderEmulator.create(shader);
|
|
20
|
+
* emu.bindings = { data: someArray };
|
|
21
|
+
* emu.dispatch([0, 0, 0]); // global_invocation_id = (0,0,0)
|
|
22
|
+
* emu.dispatch([1, 0, 0]); // global_invocation_id = (1,0,0)
|
|
23
|
+
* // ... bindings now contain results
|
|
24
|
+
*/
|
|
25
|
+
export class ComputeShaderEmulator {
|
|
26
|
+
|
|
27
|
+
/** @type {string} */
|
|
28
|
+
#source;
|
|
29
|
+
|
|
30
|
+
/** @type {string} */
|
|
31
|
+
#js_source;
|
|
32
|
+
|
|
33
|
+
/** @type {object} */
|
|
34
|
+
#module;
|
|
35
|
+
|
|
36
|
+
/** @type {object} */
|
|
37
|
+
#workgroup_state;
|
|
38
|
+
|
|
39
|
+
/** @type {object} */
|
|
40
|
+
#language_core;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Bindings currently in effect. Keys match the WGSL variable names declared with
|
|
44
|
+
* `@group(...) @binding(...) var ...: T`.
|
|
45
|
+
* @type {object}
|
|
46
|
+
*/
|
|
47
|
+
bindings = {};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Construct directly when you already have the WGSL source string.
|
|
51
|
+
*
|
|
52
|
+
* For most use cases prefer {@link create} or {@link fromComputeShader}.
|
|
53
|
+
*
|
|
54
|
+
* @param {object} options
|
|
55
|
+
* @param {object} options.module — the compiled module returned by the JS factory
|
|
56
|
+
* @param {string} options.source — the original WGSL source
|
|
57
|
+
* @param {string} options.jsSource — the generated JS source (kept for debugging)
|
|
58
|
+
* @param {object} options.languageCore — the runtime `wgsl` object
|
|
59
|
+
*/
|
|
60
|
+
constructor({ module, source, jsSource, languageCore }) {
|
|
61
|
+
this.#module = module;
|
|
62
|
+
this.#source = source;
|
|
63
|
+
this.#js_source = jsSource;
|
|
64
|
+
this.#language_core = languageCore;
|
|
65
|
+
// Fragment-stage entries have no var<workgroup>, so the module skips emitting the
|
|
66
|
+
// workgroup-state factory; in that case workgroup_state is a no-op empty object.
|
|
67
|
+
this.#workgroup_state = typeof module.create_workgroup_state === 'function'
|
|
68
|
+
? module.create_workgroup_state()
|
|
69
|
+
: {};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @returns {string} the WGSL source.
|
|
74
|
+
*/
|
|
75
|
+
get source() {
|
|
76
|
+
return this.#source;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @returns {string} the generated JavaScript source. Useful for debugging.
|
|
81
|
+
*/
|
|
82
|
+
get jsSource() {
|
|
83
|
+
return this.#js_source;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @returns {object} the language core object passed to the generated JS as `wgsl`.
|
|
88
|
+
*/
|
|
89
|
+
get languageCore() {
|
|
90
|
+
return this.#language_core;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @returns {string} the name of the entry function (whether @compute or @fragment).
|
|
95
|
+
*/
|
|
96
|
+
get entryName() {
|
|
97
|
+
return this.#module.entry_name;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @returns {'compute' | 'fragment'} which shader stage the entry function targets.
|
|
102
|
+
*/
|
|
103
|
+
get stage() {
|
|
104
|
+
return this.#module.stage;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @returns {number[] | undefined} the workgroup size for @compute entries (undefined for @fragment).
|
|
109
|
+
*/
|
|
110
|
+
get workgroup_size() {
|
|
111
|
+
return this.#module.workgroup_size;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @returns {string[]} the entry function's parameter names, in declaration order.
|
|
116
|
+
*/
|
|
117
|
+
get entryParamNames() {
|
|
118
|
+
return this.#module.param_names;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @returns {object} the current workgroup state — workgroup-scope variables live here.
|
|
123
|
+
*/
|
|
124
|
+
get workgroup() {
|
|
125
|
+
return this.#workgroup_state;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Reset the workgroup state. Call between simulated workgroups so that `var<workgroup>`
|
|
130
|
+
* variables start fresh. No-op for fragment-stage entries.
|
|
131
|
+
*/
|
|
132
|
+
resetWorkgroup() {
|
|
133
|
+
if (typeof this.#module.create_workgroup_state === 'function') {
|
|
134
|
+
this.#workgroup_state = this.#module.create_workgroup_state();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Dispatch a single thread (point-wise simulation). The arguments are the entry function's
|
|
140
|
+
* parameters, in declaration order — for example a `@builtin(global_invocation_id)` param of
|
|
141
|
+
* type `vec3<u32>` is supplied as a 3-element array.
|
|
142
|
+
*
|
|
143
|
+
* For @compute entries, returns whatever the entry function returns (typically nothing —
|
|
144
|
+
* results land in bindings). For @fragment entries, returns the fragment's output value
|
|
145
|
+
* (typically a vec4 for `@location(0)` or a struct of locations).
|
|
146
|
+
*
|
|
147
|
+
* @param {...*} mainArgs
|
|
148
|
+
* @returns {*}
|
|
149
|
+
*/
|
|
150
|
+
dispatch(...mainArgs) {
|
|
151
|
+
if (this.#module.stage === 'fragment') {
|
|
152
|
+
return this.#module.entry(this.bindings, ...mainArgs);
|
|
153
|
+
}
|
|
154
|
+
return this.#module.entry(this.bindings, this.#workgroup_state, ...mainArgs);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Compile a WGSL source string into an executable emulator. Requires a `@compute` or
|
|
159
|
+
* `@fragment` entry function; for chunks of pure helper code with no entry, use
|
|
160
|
+
* {@link fromCodeChunk}.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} source
|
|
163
|
+
* @param {object} [options]
|
|
164
|
+
* @param {WGSLParser} [options.parser] — share a parser across multiple compiles
|
|
165
|
+
* @param {object} [options.languageCore] — defaults to {@link WGSLLanguageCore}
|
|
166
|
+
* @returns {Promise<ComputeShaderEmulator>}
|
|
167
|
+
*/
|
|
168
|
+
static async fromSource(source, options = {}) {
|
|
169
|
+
const { module, jsSource } = await compileWgslSource(source, options);
|
|
170
|
+
if (typeof module.entry !== 'function') {
|
|
171
|
+
throw new Error('ComputeShaderEmulator.fromSource: WGSL has no @compute or @fragment entry function. Use ComputeShaderEmulator.fromCodeChunk for library-style code.');
|
|
172
|
+
}
|
|
173
|
+
return new ComputeShaderEmulator({
|
|
174
|
+
module,
|
|
175
|
+
source,
|
|
176
|
+
jsSource,
|
|
177
|
+
languageCore: options.languageCore || WGSLLanguageCore,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Build an emulator from an existing {@link ComputeShader} instance.
|
|
183
|
+
*
|
|
184
|
+
* @param {import("../../renderer/shader/ComputeShader.js").ComputeShader} shader
|
|
185
|
+
* @param {object} [options]
|
|
186
|
+
* @param {WGSLParser} [options.parser]
|
|
187
|
+
* @param {object} [options.languageCore]
|
|
188
|
+
* @returns {Promise<ComputeShaderEmulator>}
|
|
189
|
+
*/
|
|
190
|
+
static async fromComputeShader(shader, options = {}) {
|
|
191
|
+
assert.defined(shader, 'shader');
|
|
192
|
+
const source = shader.descriptor.source;
|
|
193
|
+
return ComputeShaderEmulator.fromSource(source, options);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Build an emulator from an existing {@link ImageShader} instance — a full-screen fragment
|
|
198
|
+
* pass. The vertex stage is intentionally skipped (single-pixel emulation), so callers
|
|
199
|
+
* provide the `@builtin(position)` value (and any other fragment inputs) directly to
|
|
200
|
+
* {@link dispatch}.
|
|
201
|
+
*
|
|
202
|
+
* Derivative builtins (`dpdx`, `dpdy`, `fwidth` and their fine/coarse variants) throw at
|
|
203
|
+
* runtime — their values can't be faked from a single pixel.
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* const emu = await ComputeShaderEmulator.fromImageShader(shader);
|
|
207
|
+
* emu.bindings = { input: someCPUBitmapData };
|
|
208
|
+
* const out = emu.dispatch(new Float32Array([100.5, 200.5, 0, 1])); // vec4 frag.position
|
|
209
|
+
* // `out` is the fragment's @location(0) return value (typically a vec4).
|
|
210
|
+
*
|
|
211
|
+
* @param {import("../../renderer/shader/ImageShader.js").ImageShader} shader
|
|
212
|
+
* @param {object} [options]
|
|
213
|
+
* @param {WGSLParser} [options.parser]
|
|
214
|
+
* @param {object} [options.languageCore]
|
|
215
|
+
* @returns {Promise<ComputeShaderEmulator>}
|
|
216
|
+
*/
|
|
217
|
+
static async fromImageShader(shader, options = {}) {
|
|
218
|
+
assert.defined(shader, 'shader');
|
|
219
|
+
const source = shader.descriptor.source;
|
|
220
|
+
return ComputeShaderEmulator.fromSource(source, options);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Compile a {@link CodeChunk} (or a raw WGSL string) into a "library" object — every
|
|
225
|
+
* top-level WGSL function becomes a method, every `var<private>` becomes a getter/setter
|
|
226
|
+
* property, and every module-scope `const` becomes a read-only getter.
|
|
227
|
+
*
|
|
228
|
+
* No `@compute` entry is required. This is the one-line escape hatch for unit-testing pure
|
|
229
|
+
* helper code (RNGs, hashes, packing, math) without wrapping each chunk in a shader skeleton.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_random);
|
|
233
|
+
* expect(lib.random()).toBeLessThan(1);
|
|
234
|
+
*
|
|
235
|
+
* @param {import("../../renderer/shader/compiler/CodeChunk.js").CodeChunk | string} chunk_or_source
|
|
236
|
+
* @param {object} [options]
|
|
237
|
+
* @param {WGSLParser} [options.parser]
|
|
238
|
+
* @param {object} [options.languageCore]
|
|
239
|
+
* @returns {Promise<object>} the library module
|
|
240
|
+
*/
|
|
241
|
+
static async fromCodeChunk(chunk_or_source, options = {}) {
|
|
242
|
+
assert.defined(chunk_or_source, 'chunk_or_source');
|
|
243
|
+
const source = typeof chunk_or_source === 'string'
|
|
244
|
+
? chunk_or_source
|
|
245
|
+
: chunk_or_source.compile().text;
|
|
246
|
+
const { module } = await compileWgslSource(source, options);
|
|
247
|
+
return module;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Internal helper: parse + compile + evaluate a WGSL source string, returning the factory's
|
|
253
|
+
* resulting module along with the generated JS for diagnostics.
|
|
254
|
+
*
|
|
255
|
+
* @param {string} source
|
|
256
|
+
* @param {object} options
|
|
257
|
+
* @param {WGSLParser} [options.parser]
|
|
258
|
+
* @param {object} [options.languageCore]
|
|
259
|
+
* @returns {Promise<{ module: object, jsSource: string }>}
|
|
260
|
+
*/
|
|
261
|
+
async function compileWgslSource(source, { parser, languageCore = WGSLLanguageCore } = {}) {
|
|
262
|
+
assert.isString(source, 'source');
|
|
263
|
+
|
|
264
|
+
let p = parser;
|
|
265
|
+
if (p === undefined) {
|
|
266
|
+
p = new WGSLParser();
|
|
267
|
+
await p.init();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const tree = p.parse(source);
|
|
271
|
+
if (tree.rootNode.hasError) {
|
|
272
|
+
throw new Error(`WGSL parse error in source:\n${source}`);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
const compiler = new WGSLJavaScriptCompiler();
|
|
277
|
+
const jsSource = compiler.compile(tree);
|
|
278
|
+
|
|
279
|
+
let factory;
|
|
280
|
+
try {
|
|
281
|
+
// eslint-disable-next-line no-new-func
|
|
282
|
+
factory = (new Function(`return ${jsSource};`))();
|
|
283
|
+
} catch (e) {
|
|
284
|
+
const err = new Error(`failed to evaluate generated JavaScript: ${e.message}\n--- generated JS ---\n${jsSource}`);
|
|
285
|
+
err.cause = e;
|
|
286
|
+
throw err;
|
|
287
|
+
}
|
|
288
|
+
const module = factory(languageCore);
|
|
289
|
+
|
|
290
|
+
return { module, jsSource };
|
|
291
|
+
}
|
|
@@ -5,9 +5,9 @@ declare class MinimapView extends View {
|
|
|
5
5
|
* @constructor
|
|
6
6
|
* @param {EntityComponentDataset} entityDataset
|
|
7
7
|
* @param {AssetManager} assetManager
|
|
8
|
-
* @param {GraphicsEngine|
|
|
8
|
+
* @param {GraphicsEngine|GraphicsEngine} graphics what the camera frames trace their ray with
|
|
9
9
|
*/
|
|
10
|
-
constructor(entityDataset: EntityComponentDataset, assetManager: AssetManager, graphics: GraphicsEngine |
|
|
10
|
+
constructor(entityDataset: EntityComponentDataset, assetManager: AssetManager, graphics: GraphicsEngine | GraphicsEngine);
|
|
11
11
|
el: Element;
|
|
12
12
|
/**
|
|
13
13
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Minimap.d.ts","sourceRoot":"","sources":["../../../../src/view/minimap/Minimap.js"],"names":[],"mappings":";AAgBA;IAGI;;;;;;OAMG;IACH,yFAFW,
|
|
1
|
+
{"version":3,"file":"Minimap.d.ts","sourceRoot":"","sources":["../../../../src/view/minimap/Minimap.js"],"names":[],"mappings":";AAgBA;IAGI;;;;;;OAMG;IACH,yFAFW,+BAA6B,EA8IvC;IArJD,YAAkD;IAY9C;;;OAGG;IACH,sCAAkC;IAWpB,OAFJ,SAAS,CAEiC;IAepD,uBAAyB;IAML,eAFV,iBAAiB,EAAE,CAEc;IA+B3C,+BAAyF;IA+BzE,uBAA2C;IAyC/D;;;;;;;OAOG;IACH,cAUC;CAmCJ;iBAlNgB,YAAY;sBAXP,iCAAiC;sBAUjC,0BAA0B;kCAEd,4BAA4B;+BAV/B,oCAAoC;8BAMrC,6CAA6C"}
|