@woosh/meep-engine 3.11.2 → 3.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -18
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/SelectionVisualizer.js +127 -127
- package/editor/entity_world_bounds.js +27 -27
- package/editor/particles/rebuildParticleEmitter.js +31 -31
- package/editor/process/SymbolicDisplayProcess.js +1 -1
- package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
- package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
- package/editor/prototypeEditorShell.js +156 -156
- package/editor/selection/editor_pick.js +130 -130
- package/editor/selection/screen_rect_frustum.js +119 -119
- package/editor/tools/v2/TransformControls.js +971 -971
- package/package.json +1 -1
- package/src/engine/Engine.d.ts +3 -3
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +726 -726
- package/src/engine/EngineHarness.d.ts +1 -1
- package/src/engine/EngineHarness.js +590 -590
- package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
- package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
- package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
- package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
- package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
- package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
- package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
- package/src/engine/graphics/ecs/water/Water.js +104 -104
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
- package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
- package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
- package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
- package/src/engine/graphics3/AnimationSystem.js +352 -0
- package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
- package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem3.js +6 -348
- package/src/engine/graphics3/CameraSystem.d.ts +49 -0
- package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
- package/src/engine/graphics3/CameraSystem.js +170 -0
- package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
- package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/CameraSystem3.js +6 -166
- package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
- package/src/engine/graphics3/DebugDrawSystem.js +205 -0
- package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
- package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
- package/src/engine/graphics3/DecalSystem.d.ts +81 -0
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
- package/src/engine/graphics3/DecalSystem.js +441 -0
- package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
- package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem3.js +6 -437
- package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
- package/src/engine/graphics3/FogOfWarSystem.js +265 -0
- package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
- package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
- package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
- package/src/engine/graphics3/GraphicsEngine.js +790 -0
- package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
- package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine3.js +6 -786
- package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
- package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
- package/src/engine/graphics3/HighlightSystem.js +241 -0
- package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
- package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightSystem3.js +6 -237
- package/src/engine/graphics3/LightSystem.d.ts +40 -0
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
- package/src/engine/graphics3/LightSystem.js +211 -0
- package/src/engine/graphics3/LightSystem3.d.ts +6 -36
- package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem3.js +6 -207
- package/src/engine/graphics3/MeshSystem.d.ts +106 -0
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
- package/src/engine/graphics3/MeshSystem.js +647 -0
- package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
- package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem3.js +6 -642
- package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
- package/src/engine/graphics3/ParticipatingMedia.js +203 -203
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
- package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
- package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
- package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
- package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
- package/src/engine/graphics3/PathDisplaySystem.js +309 -0
- package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
- package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
- package/src/engine/graphics3/Pickable.d.ts +1 -1
- package/src/engine/graphics3/Pickable.js +65 -65
- package/src/engine/graphics3/PickingQuery.d.ts +1 -1
- package/src/engine/graphics3/PickingQuery.js +48 -48
- package/src/engine/graphics3/PickingSystem.d.ts +67 -0
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
- package/src/engine/graphics3/PickingSystem.js +273 -0
- package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
- package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem3.js +6 -269
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
- package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
- package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
- package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
- package/src/engine/graphics3/TerrainSystem.js +566 -0
- package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
- package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem3.js +6 -562
- package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
- package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
- package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
- package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
- package/src/engine/graphics3/Trail3DSystem.js +221 -0
- package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
- package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem3.js +6 -217
- package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
- package/src/engine/graphics3/VolumetricLightMap.js +2 -2
- package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
- package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
- package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
- package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
- package/src/engine/graphics3/WaterSystem.d.ts +59 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/WaterSystem.js +293 -0
- package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
- package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem3.js +6 -289
- package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
- package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
- package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
- package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
- package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
- package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
- package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
- package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
- package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
- package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
- package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +994 -940
- package/src/shade/device/immediate_data_supported.d.ts +33 -0
- package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
- package/src/shade/device/immediate_data_supported.js +53 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
- package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
- package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
- package/src/shade/renderer/GraphicsContext.d.ts +9 -2
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +13 -1
- package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
- package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
- package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -84
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
- package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
- package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
- package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +10 -9
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
- package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
- package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
- package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
- package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
- package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
- package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
- package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +57 -57
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
- package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
- package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
- package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
- package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
- package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +350 -292
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +217 -214
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +46 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
- package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
- package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
- package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
- package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
- package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
- package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/NOTES.md +238 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +591 -577
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +17 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +20 -2
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
- package/src/shade/renderer/water/shader_water.js +246 -246
- package/src/shade/vitest.setup.mjs +1 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
- package/src/view/minimap/Minimap.d.ts +2 -2
- package/src/view/minimap/Minimap.d.ts.map +1 -1
- package/src/view/minimap/Minimap.js +225 -225
- package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +206 -206
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether this browser's WGSL implementation has the `immediate` address space.
|
|
3
|
+
*
|
|
4
|
+
* Synchronous and free: `wgslLanguageFeatures` hangs off `navigator.gpu`, so this needs neither an
|
|
5
|
+
* adapter nor a device and can be asked before either exists — including at module scope, where
|
|
6
|
+
* shader descriptors are built.
|
|
7
|
+
*
|
|
8
|
+
* **This is not a device floor.** Shade's floor (see `RENDERER_CONTRACT.md` §2) is fixed and
|
|
9
|
+
* `Renderer.initialize()` does not consult this — a browser without immediates still starts, and
|
|
10
|
+
* still renders, as long as nothing asks it for a shader that uses them. Deciding what to do about
|
|
11
|
+
* a missing capability belongs to whoever wrote the shader: refuse, or reach for a variant that
|
|
12
|
+
* declares the same struct as a uniform. Both are one `if` at the point where the shader is chosen,
|
|
13
|
+
* which is a far smaller thing than a capability branch threaded through codegen and binding.
|
|
14
|
+
*
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
export function immediate_data_supported(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Whether `device` can actually carry `byte_count` bytes of immediate data.
|
|
20
|
+
*
|
|
21
|
+
* Separate from {@link immediate_data_supported} because they answer different questions of
|
|
22
|
+
* different objects: the language extension is a property of the browser's WGSL implementation, the
|
|
23
|
+
* budget is a property of the adapter. A conformant device reports at least 64 bytes whenever the
|
|
24
|
+
* extension is present — `maxImmediateSize` is a `maximum`-class limit defaulting to 64 with no
|
|
25
|
+
* separate compatibility-mode value — so the two agree in practice. Checking anyway costs nothing
|
|
26
|
+
* and turns a device that disagrees into a legible error instead of a shader-creation failure.
|
|
27
|
+
*
|
|
28
|
+
* @param {GPUDevice} device
|
|
29
|
+
* @param {number} [byte_count]
|
|
30
|
+
* @returns {boolean}
|
|
31
|
+
*/
|
|
32
|
+
export function device_supports_immediate_size(device: GPUDevice, byte_count?: number): boolean;
|
|
33
|
+
//# sourceMappingURL=immediate_data_supported.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"immediate_data_supported.d.ts","sourceRoot":"","sources":["../../../../src/shade/device/immediate_data_supported.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,4CAFa,OAAO,CAgBnB;AAED;;;;;;;;;;;;;GAaG;AACH,+EAHW,MAAM,GACJ,OAAO,CAMnB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { IMMEDIATE_ADDRESS_SPACE_EXTENSION } from "../renderer/shader/resource/IMMEDIATE_DATA.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether this browser's WGSL implementation has the `immediate` address space.
|
|
5
|
+
*
|
|
6
|
+
* Synchronous and free: `wgslLanguageFeatures` hangs off `navigator.gpu`, so this needs neither an
|
|
7
|
+
* adapter nor a device and can be asked before either exists — including at module scope, where
|
|
8
|
+
* shader descriptors are built.
|
|
9
|
+
*
|
|
10
|
+
* **This is not a device floor.** Shade's floor (see `RENDERER_CONTRACT.md` §2) is fixed and
|
|
11
|
+
* `Renderer.initialize()` does not consult this — a browser without immediates still starts, and
|
|
12
|
+
* still renders, as long as nothing asks it for a shader that uses them. Deciding what to do about
|
|
13
|
+
* a missing capability belongs to whoever wrote the shader: refuse, or reach for a variant that
|
|
14
|
+
* declares the same struct as a uniform. Both are one `if` at the point where the shader is chosen,
|
|
15
|
+
* which is a far smaller thing than a capability branch threaded through codegen and binding.
|
|
16
|
+
*
|
|
17
|
+
* @returns {boolean}
|
|
18
|
+
*/
|
|
19
|
+
export function immediate_data_supported() {
|
|
20
|
+
const gpu = globalThis.navigator?.gpu;
|
|
21
|
+
|
|
22
|
+
if (gpu === undefined || gpu === null) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const features = gpu.wgslLanguageFeatures;
|
|
27
|
+
|
|
28
|
+
if (features === undefined || features === null) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return features.has(IMMEDIATE_ADDRESS_SPACE_EXTENSION);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Whether `device` can actually carry `byte_count` bytes of immediate data.
|
|
37
|
+
*
|
|
38
|
+
* Separate from {@link immediate_data_supported} because they answer different questions of
|
|
39
|
+
* different objects: the language extension is a property of the browser's WGSL implementation, the
|
|
40
|
+
* budget is a property of the adapter. A conformant device reports at least 64 bytes whenever the
|
|
41
|
+
* extension is present — `maxImmediateSize` is a `maximum`-class limit defaulting to 64 with no
|
|
42
|
+
* separate compatibility-mode value — so the two agree in practice. Checking anyway costs nothing
|
|
43
|
+
* and turns a device that disagrees into a legible error instead of a shader-creation failure.
|
|
44
|
+
*
|
|
45
|
+
* @param {GPUDevice} device
|
|
46
|
+
* @param {number} [byte_count]
|
|
47
|
+
* @returns {boolean}
|
|
48
|
+
*/
|
|
49
|
+
export function device_supports_immediate_size(device, byte_count = 4) {
|
|
50
|
+
const limit = device?.limits?.maxImmediateSize ?? 0;
|
|
51
|
+
|
|
52
|
+
return limit >= byte_count;
|
|
53
|
+
}
|
|
@@ -38,6 +38,24 @@ export class SoftwareGPUCommandEncoder extends SoftwareGPUObjectBase implements
|
|
|
38
38
|
* @returns {void}
|
|
39
39
|
*/
|
|
40
40
|
notify_pass_ended(pass: SoftwareGPUComputePassEncoder | SoftwareGPURenderPassEncoder): void;
|
|
41
|
+
/**
|
|
42
|
+
* The device this encoder was created by. Passes read its limits — `maxImmediateSize` is the
|
|
43
|
+
* only one so far — and have no other route to it.
|
|
44
|
+
*
|
|
45
|
+
* @returns {SoftwareGPUDevice}
|
|
46
|
+
*/
|
|
47
|
+
get device(): SoftwareGPUDevice;
|
|
48
|
+
/**
|
|
49
|
+
* Called by a pass this encoder opened, when that pass encodes something WebGPU refuses.
|
|
50
|
+
*
|
|
51
|
+
* A pass has nowhere of its own to put a validation error: WebGPU invalidates the *encoder* and
|
|
52
|
+
* reports from `finish()`, so a pass-level failure has to travel up here rather than being
|
|
53
|
+
* raised where it happened. See {@link #validation_error} for why the deferral matters.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} message
|
|
56
|
+
* @returns {void}
|
|
57
|
+
*/
|
|
58
|
+
notify_pass_validation_error(message: string): void;
|
|
41
59
|
/**
|
|
42
60
|
* Begin a compute pass. The pass **records** and executes nothing — see
|
|
43
61
|
* {@link SoftwareGPUComputePassEncoder}. Every pass begun on this encoder stays on
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoftwareGPUCommandEncoder.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUCommandEncoder.js"],"names":[],"mappings":"AA2DA;;;;GAIG;AACH,gFAFgB,iBAAiB;IA+D7B;;;;OAIG;IACH,iFAIC;IAzDD;;;;OAIG;IACH,gBAFU,6BAA6B,EAAE,CAErB;IAEpB;;;;OAIG;IACH,eAFU,4BAA4B,EAAE,CAErB;IAEnB;;;;;;OAMG;IACH,QAFU,CAAC,6BAA6B,GAAC,4BAA4B,CAAC,EAAE,CAE5D;IA0EZ,mCAiBC;IAkBD;;;;;OAKG;IACH,wBAHW,6BAA6B,GAAC,4BAA4B,GACxD,IAAI,CAMhB;IAED;;;;;;;OAOG;IACH,+EAeC;IAED;;;;;;;OAOG;IACH,4EAaC;IAED;;;;;;;;OAQG;IACH,oHAFa,IAAI,CAsBhB;IAED;;;;;OAKG;IACH,kHAFa,IAAI,CAsBhB;IAED;;;;;OAKG;IACH,kHAFa,IAAI,CAsBhB;IAED;;;;;;;;;OASG;IACH,2DANW,MAAM,cACN,MAAM,qDAEN,MAAM,GACJ,IAAI,CAuBhB;IAwCD;;;;OAIG;IACH,sBAFW,MAAM,QAIhB;IAED,sBAEC;IAED;;OAEG;IACH,yBAFW,MAAM,QAIhB;IAyED;;;;;;;;OAQG;IACH,4DANW,MAAM,qDAEN,MAAM,QACN,MAAM,GACJ,IAAI,CA+BhB;IAED;;;;;;;OAOG;IACH,gDAJW,MAAM,SACN,MAAM,GACJ,IAAI,CA4BhB;IAGL;;;OAGG;IACH,sCAFU,OAAO,CAE8C;;CAN9D;
|
|
1
|
+
{"version":3,"file":"SoftwareGPUCommandEncoder.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUCommandEncoder.js"],"names":[],"mappings":"AA2DA;;;;GAIG;AACH,gFAFgB,iBAAiB;IA+D7B;;;;OAIG;IACH,iFAIC;IAzDD;;;;OAIG;IACH,gBAFU,6BAA6B,EAAE,CAErB;IAEpB;;;;OAIG;IACH,eAFU,4BAA4B,EAAE,CAErB;IAEnB;;;;;;OAMG;IACH,QAFU,CAAC,6BAA6B,GAAC,4BAA4B,CAAC,EAAE,CAE5D;IA0EZ,mCAiBC;IAkBD;;;;;OAKG;IACH,wBAHW,6BAA6B,GAAC,4BAA4B,GACxD,IAAI,CAMhB;IAED;;;;;OAKG;IACH,gCAEC;IAED;;;;;;;;;OASG;IACH,sCAHW,MAAM,GACJ,IAAI,CAIhB;IAED;;;;;;;OAOG;IACH,+EAeC;IAED;;;;;;;OAOG;IACH,4EAaC;IAED;;;;;;;;OAQG;IACH,oHAFa,IAAI,CAsBhB;IAED;;;;;OAKG;IACH,kHAFa,IAAI,CAsBhB;IAED;;;;;OAKG;IACH,kHAFa,IAAI,CAsBhB;IAED;;;;;;;;;OASG;IACH,2DANW,MAAM,cACN,MAAM,qDAEN,MAAM,GACJ,IAAI,CAuBhB;IAwCD;;;;OAIG;IACH,sBAFW,MAAM,QAIhB;IAED,sBAEC;IAED;;OAEG;IACH,yBAFW,MAAM,QAIhB;IAyED;;;;;;;;OAQG;IACH,4DANW,MAAM,qDAEN,MAAM,QACN,MAAM,GACJ,IAAI,CA+BhB;IAED;;;;;;;OAOG;IACH,gDAJW,MAAM,SACN,MAAM,GACJ,IAAI,CA4BhB;IAGL;;;OAGG;IACH,sCAFU,OAAO,CAE8C;;CAN9D;sCAnmBqC,4BAA4B;8CAFpB,oCAAoC;6CAGrC,mCAAmC;yCAJvC,+BAA+B"}
|
|
@@ -217,6 +217,30 @@ export class SoftwareGPUCommandEncoder extends SoftwareGPUObjectBase {
|
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
/**
|
|
221
|
+
* The device this encoder was created by. Passes read its limits — `maxImmediateSize` is the
|
|
222
|
+
* only one so far — and have no other route to it.
|
|
223
|
+
*
|
|
224
|
+
* @returns {SoftwareGPUDevice}
|
|
225
|
+
*/
|
|
226
|
+
get device() {
|
|
227
|
+
return this.#device;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Called by a pass this encoder opened, when that pass encodes something WebGPU refuses.
|
|
232
|
+
*
|
|
233
|
+
* A pass has nowhere of its own to put a validation error: WebGPU invalidates the *encoder* and
|
|
234
|
+
* reports from `finish()`, so a pass-level failure has to travel up here rather than being
|
|
235
|
+
* raised where it happened. See {@link #validation_error} for why the deferral matters.
|
|
236
|
+
*
|
|
237
|
+
* @param {string} message
|
|
238
|
+
* @returns {void}
|
|
239
|
+
*/
|
|
240
|
+
notify_pass_validation_error(message) {
|
|
241
|
+
this.#invalidate(message);
|
|
242
|
+
}
|
|
243
|
+
|
|
220
244
|
/**
|
|
221
245
|
* Begin a compute pass. The pass **records** and executes nothing — see
|
|
222
246
|
* {@link SoftwareGPUComputePassEncoder}. Every pass begun on this encoder stays on
|
|
@@ -57,6 +57,13 @@ export class SoftwareGPUComputePassEncoder extends SoftwareGPUObjectBase impleme
|
|
|
57
57
|
* @param {number} [dynamic_offsets_length]
|
|
58
58
|
*/
|
|
59
59
|
setBindGroup(index: number, bind_group: GPUBindGroup, dynamic_offsets?: number[] | Uint32Array, dynamic_offsets_start?: number, dynamic_offsets_length?: number): void;
|
|
60
|
+
/**
|
|
61
|
+
* @param {number} range_offset byte offset into the immediate data range
|
|
62
|
+
* @param {ArrayBuffer|ArrayBufferView} data
|
|
63
|
+
* @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
|
|
64
|
+
* @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
|
|
65
|
+
*/
|
|
66
|
+
setImmediates(range_offset: number, data: ArrayBuffer | ArrayBufferView, data_offset?: number, data_size?: number): void;
|
|
60
67
|
/**
|
|
61
68
|
* @param {number} x
|
|
62
69
|
* @param {number} [y]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoftwareGPUComputePassEncoder.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUComputePassEncoder.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SoftwareGPUComputePassEncoder.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUComputePassEncoder.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AACH,oFAFgB,qBAAqB;IA6DjC;;;OAGG;IACH,uFAQC;IAtED;;;;OAIG;IACH,YAFU;QAAC,QAAQ,EAAE,qBAAmB,IAAI,CAAC;QAAC,WAAW,EAAE,cAAc,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAC,EAAE,CAEjI;IAEhB;;;;;OAKG;IACH,qCAAW;IAoCX;;;;OAIG;IACH,uBAEC;IAsBD;;OAEG;IACH,gDAIC;IAED;;;;;;;;;OASG;IACH,oBANW,MAAM,8CAEN,MAAM,EAAE,GAAC,WAAW,0BACpB,MAAM,2BACN,MAAM,QAWhB;IAED;;;;;OAKG;IACH,4BALW,MAAM,QACN,WAAW,GAAC,eAAe,gBAC3B,MAAM,cACN,MAAM,QAUhB;IAkCD;;;;OAIG;IACH,sBAJW,MAAM,MACN,MAAM,MACN,MAAM,QAWhB;IAED;;;OAGG;IACH,wEAFW,MAAM,QAahB;IAED;;OAEG;IACH,sBAFW,MAAM,QAIhB;IAED,sBAEC;IAED;;OAEG;IACH,yBAFW,MAAM,QAIhB;IAED,YAQC;IAGL;;;OAGG;IACH,0CAFU,OAAO,CAEsD;;CANtE;sCA1OqC,4BAA4B"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { normalize_dynamic_offsets } from "./normalize_dynamic_offsets.js";
|
|
2
|
+
import { pipeline_immediate_size } from "./pipeline_immediate_size.js";
|
|
3
|
+
import { SoftwareGPUImmediateData } from "./SoftwareGPUImmediateData.js";
|
|
2
4
|
import { SoftwareGPUObjectBase } from "./SoftwareGPUObjectBase.js";
|
|
3
5
|
import { write_pass_timestamp } from "./write_pass_timestamp.js";
|
|
4
6
|
|
|
@@ -56,6 +58,14 @@ export class SoftwareGPUComputePassEncoder extends SoftwareGPUObjectBase {
|
|
|
56
58
|
*/
|
|
57
59
|
#dynamic_offsets = [];
|
|
58
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Immediate data for this pass. Per-encoder state in WebGPU, and a new pass starts over — which
|
|
63
|
+
* is why it is constructed here rather than carried in from the command encoder.
|
|
64
|
+
*
|
|
65
|
+
* @type {SoftwareGPUImmediateData}
|
|
66
|
+
*/
|
|
67
|
+
#immediates;
|
|
68
|
+
|
|
59
69
|
#ended = false;
|
|
60
70
|
|
|
61
71
|
/**
|
|
@@ -76,6 +86,7 @@ export class SoftwareGPUComputePassEncoder extends SoftwareGPUObjectBase {
|
|
|
76
86
|
|
|
77
87
|
this.#encoder = encoder;
|
|
78
88
|
this.descriptor = descriptor;
|
|
89
|
+
this.#immediates = new SoftwareGPUImmediateData(encoder.device.limits.maxImmediateSize);
|
|
79
90
|
|
|
80
91
|
write_pass_timestamp(descriptor, 'beginningOfPassWriteIndex');
|
|
81
92
|
}
|
|
@@ -116,19 +127,54 @@ export class SoftwareGPUComputePassEncoder extends SoftwareGPUObjectBase {
|
|
|
116
127
|
);
|
|
117
128
|
}
|
|
118
129
|
|
|
130
|
+
/**
|
|
131
|
+
* @param {number} range_offset byte offset into the immediate data range
|
|
132
|
+
* @param {ArrayBuffer|ArrayBufferView} data
|
|
133
|
+
* @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
|
|
134
|
+
* @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
|
|
135
|
+
*/
|
|
136
|
+
setImmediates(range_offset, data, data_offset = 0, data_size) {
|
|
137
|
+
this.#assert_encoding();
|
|
138
|
+
|
|
139
|
+
const message = this.#immediates.write(range_offset, data, data_offset, data_size);
|
|
140
|
+
|
|
141
|
+
if (message !== null) {
|
|
142
|
+
this.#encoder.notify_pass_validation_error(message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
119
146
|
/**
|
|
120
147
|
* The bind group state a dispatch would run under, copied so later `setBindGroup` calls do not
|
|
121
148
|
* rewrite an already-recorded dispatch.
|
|
122
149
|
*
|
|
123
|
-
* @returns {{bind_groups: GPUBindGroup[], dynamic_offsets: number[][]}}
|
|
150
|
+
* @returns {{bind_groups: GPUBindGroup[], dynamic_offsets: number[][], immediates: {bytes: Uint8Array, slots_set: boolean[]}}}
|
|
124
151
|
*/
|
|
125
152
|
#snapshot_bindings() {
|
|
126
153
|
return {
|
|
127
154
|
bind_groups: this.#bind_groups.slice(),
|
|
128
155
|
dynamic_offsets: this.#dynamic_offsets.map(offsets => offsets === undefined ? [] : offsets.slice()),
|
|
156
|
+
immediates: this.#immediates.snapshot(),
|
|
129
157
|
};
|
|
130
158
|
}
|
|
131
159
|
|
|
160
|
+
/**
|
|
161
|
+
* WebGPU's *Validate immediate data*: every slot the pipeline's immediate range covers must have
|
|
162
|
+
* been written before a command reads it. The bytes default to zero but the slots do not default
|
|
163
|
+
* to set, so a forgotten `setImmediates` is a refused draw on a real device rather than a shader
|
|
164
|
+
* quietly reading zeroes. Catching it here is the whole reason the slot bookkeeping exists.
|
|
165
|
+
*
|
|
166
|
+
* @returns {void}
|
|
167
|
+
*/
|
|
168
|
+
#validate_immediates() {
|
|
169
|
+
const size = pipeline_immediate_size(this.#pipeline);
|
|
170
|
+
|
|
171
|
+
if (size > 0 && !this.#immediates.isRangeSet(0, size)) {
|
|
172
|
+
this.#encoder.notify_pass_validation_error(
|
|
173
|
+
`dispatch: pipeline declares ${size} bytes of immediate data, and not all of it was set by setImmediates`
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
132
178
|
/**
|
|
133
179
|
* @param {number} x
|
|
134
180
|
* @param {number} [y]
|
|
@@ -136,6 +182,7 @@ export class SoftwareGPUComputePassEncoder extends SoftwareGPUObjectBase {
|
|
|
136
182
|
*/
|
|
137
183
|
dispatchWorkgroups(x, y = 1, z = 1) {
|
|
138
184
|
this.#assert_encoding();
|
|
185
|
+
this.#validate_immediates();
|
|
139
186
|
|
|
140
187
|
this.dispatches.push({
|
|
141
188
|
pipeline: this.#pipeline,
|
|
@@ -150,6 +197,7 @@ export class SoftwareGPUComputePassEncoder extends SoftwareGPUObjectBase {
|
|
|
150
197
|
*/
|
|
151
198
|
dispatchWorkgroupsIndirect(indirect_buffer, indirect_offset) {
|
|
152
199
|
this.#assert_encoding();
|
|
200
|
+
this.#validate_immediates();
|
|
153
201
|
|
|
154
202
|
// The group counts live in a buffer a shader wrote, which nothing here executed — recording
|
|
155
203
|
// a count read out of it would be fiction, so the entry says what it is.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoftwareGPUDevice.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUDevice.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SoftwareGPUDevice.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUDevice.js"],"names":[],"mappings":"AA+OA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wEAFgB,SAAS;IAkCrB;;;;;;;;;;OAUG;IACH;QAT+B,KAAK,GAAzB,MAAM;QACwB,gBAAgB,GAA9C,gBAAgB;QAGyB,cAAc,GAAvD,2BAA2B;OAyBrC;IAzDD;;;;;OAKG;IACH,qCAEC;IAOD;;;;;;OAMG;IACH,iCAEC;IAmCD;;OAEG;IACH,kCAEC;IAID;;OAEG;IACH,sBAEC;IAaD;;;;;;;;OAQG;IACH,iEAUC;IAwBD;;;;;OAKG;IACH,uCAEC;IAID;;;;OAIG;IACH,2BAEC;IAED;;;;;;;OAOG;IACH,gBAcC;IAID;;;;;;;;;OASG;IACH,uBALW,MAAM,YACN,kCAAkC,YAClC,OAAO,GAAC,uBAAuB,GAC7B,IAAI,CAIhB;IAED;;;;;OAKG;IACH,0BALW,MAAM,YACN,kCAAkC,YAClC,OAAO,GAAC,oBAAoB,GAC1B,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAHW,KAAK,GACH,OAAO,CAInB;IASD;;;;;;;OAOG;IACH,wCAFa,IAAI,CAUhB;IAED;;;;;;;;;OASG;IACH,iBAHa,QAAQ,mBAAiB,IAAI,CAAC,CAc1C;IAED;;;;;;;;;;;;;;OAcG;IACH,yCAFa,IAAI,CA4BhB;IAED;;;;;;;;;OASG;IACH,yDAcC;IAmHD;;;;;;OAMG;IACH,4DAcC;IAED;;;;;;OAMG;IACH,6DAEC;IAED;;;OAGG;IACH,oFAEC;IAED;;;OAGG;IACH,kEAEC;IAED;;;OAGG;IACH,iFAcC;IAED;;;;;;;OAOG;IACH,2EAEC;IAED;;;;;;OAMG;IACH,iFAEC;IAED;;;;;OAKG;IACH,oFAEC;IAUD;;;;;OAKG;IACH,kBAFa,MAAM,CAMlB;IAED;;;OAGG;IACH,+DAQC;IA4BD;;;OAGG;IACH,kFAEC;IAGL;;;OAGG;IACH,8BAFU,OAAO,CAE8B;;CAN9C;;;;;;;;;;;;WAnoBa,mBAAiB,IAAI;;sCA9OG,4BAA4B;kCAHhC,wBAAwB;mCASvB,yBAAyB"}
|
|
@@ -64,7 +64,13 @@ const DEFAULT_LIMITS = {
|
|
|
64
64
|
maxStorageBuffersInFragmentStage: 8,
|
|
65
65
|
maxStorageTexturesInVertexStage: 4,
|
|
66
66
|
maxStorageTexturesInFragmentStage: 4,
|
|
67
|
-
|
|
67
|
+
// The spec's default for this `maximum`-class limit, with no separate compatibility-mode value —
|
|
68
|
+
// so every conformant adapter reports at least this, and a device that exposes the
|
|
69
|
+
// `immediate_address_space` WGSL extension always has the budget to go with it. Unlike its
|
|
70
|
+
// neighbours above, this one is NOT a reading taken from a Dawn device: the `webgpu` package the
|
|
71
|
+
// comment above cites is not actually a dependency of this repo (it appears in `package.json`
|
|
72
|
+
// only as a keyword), so it could not be re-read. It is the spec value, deliberately.
|
|
73
|
+
maxImmediateSize: 64,
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
/**
|
|
@@ -764,7 +770,19 @@ export class SoftwareGPUDevice extends SoftwareGPUObjectBase {
|
|
|
764
770
|
* @returns {GPUPipelineLayout}
|
|
765
771
|
*/
|
|
766
772
|
createPipelineLayout(descriptor) {
|
|
767
|
-
|
|
773
|
+
const immediate_size = descriptor.immediateSize ?? 0;
|
|
774
|
+
|
|
775
|
+
if (immediate_size > this.#limits.maxImmediateSize) {
|
|
776
|
+
this.generate_error(new SoftwareGPUValidationError(
|
|
777
|
+
`createPipelineLayout: immediateSize(=${immediate_size}) exceeds maxImmediateSize(=${this.#limits.maxImmediateSize})`
|
|
778
|
+
));
|
|
779
|
+
} else if (immediate_size % 4 !== 0) {
|
|
780
|
+
this.generate_error(new SoftwareGPUValidationError(
|
|
781
|
+
`createPipelineLayout: immediateSize(=${immediate_size}) must be a multiple of 4`
|
|
782
|
+
));
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
return { ...descriptor, immediateSize: immediate_size, isSoftwarePipelineLayout: true };
|
|
768
786
|
}
|
|
769
787
|
|
|
770
788
|
/**
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The immediate-data state a {@link GPUBindingCommandsMixin} carries — WebGPU's
|
|
3
|
+
* `[[immediate_data]]` and `[[immediate_slots_set]]`, which both pass encoders own a copy of.
|
|
4
|
+
*
|
|
5
|
+
* The two slot-tracking rules are the reason this exists rather than a plain `Uint8Array`:
|
|
6
|
+
*
|
|
7
|
+
* 1. The bytes start **zeroed** but every 4-byte slot starts **unset**, and a draw that reads an
|
|
8
|
+
* unset slot is a validation error. A mock that only kept the bytes would hand a shader a
|
|
9
|
+
* plausible zero where a real device refuses the draw — the exact class of bug this folder
|
|
10
|
+
* exists to catch before a browser does.
|
|
11
|
+
* 2. `setImmediates` marks slots, it never clears them. Only a new pass starts over.
|
|
12
|
+
*
|
|
13
|
+
* @see https://www.w3.org/TR/webgpu/#dom-gpubindingcommandsmixin-setimmediates
|
|
14
|
+
*/
|
|
15
|
+
export class SoftwareGPUImmediateData {
|
|
16
|
+
/**
|
|
17
|
+
* @param {number} max_immediate_size the device's `maxImmediateSize` limit, in bytes
|
|
18
|
+
*/
|
|
19
|
+
constructor(max_immediate_size: number);
|
|
20
|
+
/**
|
|
21
|
+
* @returns {number} the `maxImmediateSize` this was built for
|
|
22
|
+
*/
|
|
23
|
+
get capacity(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Record a `setImmediates` call.
|
|
26
|
+
*
|
|
27
|
+
* The content-timeline failures throw an `OperationError`, because that is what WebGPU does at
|
|
28
|
+
* the call site. The device-timeline failures do **not** throw — they return a message, which
|
|
29
|
+
* the pass hands to the encoder to surface from `finish()`, matching how every other encoding
|
|
30
|
+
* validation error in this folder behaves.
|
|
31
|
+
*
|
|
32
|
+
* @param {number} range_offset byte offset into the immediate data range
|
|
33
|
+
* @param {ArrayBuffer|ArrayBufferView} data
|
|
34
|
+
* @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
|
|
35
|
+
* @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
|
|
36
|
+
* @returns {string|null} a validation message, or null when the call was accepted
|
|
37
|
+
* @throws {DOMException} `OperationError`, for the content-timeline failures
|
|
38
|
+
*/
|
|
39
|
+
write(range_offset: number, data: ArrayBuffer | ArrayBufferView, data_offset?: number, data_size?: number): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Whether every slot in `[range_offset, range_offset + size)` has been written.
|
|
42
|
+
*
|
|
43
|
+
* This is the check a draw performs against the pipeline's declared immediate range. It is
|
|
44
|
+
* deliberately slot-granular rather than byte-granular, because WebGPU's `AccessibleSlots`
|
|
45
|
+
* excludes padding: a struct with a hole in it is fully initialised as long as every 4-byte
|
|
46
|
+
* slot it actually reads was touched.
|
|
47
|
+
*
|
|
48
|
+
* @param {number} range_offset
|
|
49
|
+
* @param {number} size in bytes
|
|
50
|
+
* @returns {boolean}
|
|
51
|
+
*/
|
|
52
|
+
isRangeSet(range_offset: number, size: number): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* The state a draw or dispatch would run under, copied so a later `setImmediates` does not
|
|
55
|
+
* rewrite an already-recorded command.
|
|
56
|
+
*
|
|
57
|
+
* @returns {{bytes: Uint8Array, slots_set: boolean[]}}
|
|
58
|
+
*/
|
|
59
|
+
snapshot(): {
|
|
60
|
+
bytes: Uint8Array;
|
|
61
|
+
slots_set: boolean[];
|
|
62
|
+
};
|
|
63
|
+
#private;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=SoftwareGPUImmediateData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftwareGPUImmediateData.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUImmediateData.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH;IAeI;;OAEG;IACH,gCAFW,MAAM,EAKhB;IAED;;OAEG;IACH,uBAEC;IAED;;;;;;;;;;;;;;OAcG;IACH,oBAPW,MAAM,QACN,WAAW,GAAC,eAAe,gBAC3B,MAAM,cACN,MAAM,GACJ,MAAM,GAAC,IAAI,CAgEvB;IAED;;;;;;;;;;;OAWG;IACH,yBAJW,MAAM,QACN,MAAM,GACJ,OAAO,CAanB;IAED;;;;;OAKG;IACH,YAFa;QAAC,KAAK,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,OAAO,EAAE,CAAA;KAAC,CAOrD;;CACJ"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The immediate-data state a {@link GPUBindingCommandsMixin} carries — WebGPU's
|
|
3
|
+
* `[[immediate_data]]` and `[[immediate_slots_set]]`, which both pass encoders own a copy of.
|
|
4
|
+
*
|
|
5
|
+
* The two slot-tracking rules are the reason this exists rather than a plain `Uint8Array`:
|
|
6
|
+
*
|
|
7
|
+
* 1. The bytes start **zeroed** but every 4-byte slot starts **unset**, and a draw that reads an
|
|
8
|
+
* unset slot is a validation error. A mock that only kept the bytes would hand a shader a
|
|
9
|
+
* plausible zero where a real device refuses the draw — the exact class of bug this folder
|
|
10
|
+
* exists to catch before a browser does.
|
|
11
|
+
* 2. `setImmediates` marks slots, it never clears them. Only a new pass starts over.
|
|
12
|
+
*
|
|
13
|
+
* @see https://www.w3.org/TR/webgpu/#dom-gpubindingcommandsmixin-setimmediates
|
|
14
|
+
*/
|
|
15
|
+
export class SoftwareGPUImmediateData {
|
|
16
|
+
/**
|
|
17
|
+
* `[[immediate_data]]` — `maxImmediateSize` bytes, initially zero.
|
|
18
|
+
*
|
|
19
|
+
* @type {Uint8Array}
|
|
20
|
+
*/
|
|
21
|
+
#bytes;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `[[immediate_slots_set]]` — one entry per 4-byte slot, initially false.
|
|
25
|
+
*
|
|
26
|
+
* @type {boolean[]}
|
|
27
|
+
*/
|
|
28
|
+
#slots_set;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param {number} max_immediate_size the device's `maxImmediateSize` limit, in bytes
|
|
32
|
+
*/
|
|
33
|
+
constructor(max_immediate_size) {
|
|
34
|
+
this.#bytes = new Uint8Array(max_immediate_size);
|
|
35
|
+
this.#slots_set = new Array(Math.floor(max_immediate_size / 4)).fill(false);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @returns {number} the `maxImmediateSize` this was built for
|
|
40
|
+
*/
|
|
41
|
+
get capacity() {
|
|
42
|
+
return this.#bytes.byteLength;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Record a `setImmediates` call.
|
|
47
|
+
*
|
|
48
|
+
* The content-timeline failures throw an `OperationError`, because that is what WebGPU does at
|
|
49
|
+
* the call site. The device-timeline failures do **not** throw — they return a message, which
|
|
50
|
+
* the pass hands to the encoder to surface from `finish()`, matching how every other encoding
|
|
51
|
+
* validation error in this folder behaves.
|
|
52
|
+
*
|
|
53
|
+
* @param {number} range_offset byte offset into the immediate data range
|
|
54
|
+
* @param {ArrayBuffer|ArrayBufferView} data
|
|
55
|
+
* @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
|
|
56
|
+
* @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
|
|
57
|
+
* @returns {string|null} a validation message, or null when the call was accepted
|
|
58
|
+
* @throws {DOMException} `OperationError`, for the content-timeline failures
|
|
59
|
+
*/
|
|
60
|
+
write(range_offset, data, data_offset = 0, data_size) {
|
|
61
|
+
const is_typed_array = ArrayBuffer.isView(data) && !(data instanceof DataView);
|
|
62
|
+
|
|
63
|
+
// "If data is an ArrayBuffer or DataView, let the element type be byte."
|
|
64
|
+
const bytes_per_element = is_typed_array ? data.BYTES_PER_ELEMENT : 1;
|
|
65
|
+
|
|
66
|
+
const data_element_count = is_typed_array
|
|
67
|
+
? data.length
|
|
68
|
+
: (data instanceof DataView ? data.byteLength : data.byteLength);
|
|
69
|
+
|
|
70
|
+
const contents_size = data_size === undefined
|
|
71
|
+
? data_element_count - data_offset
|
|
72
|
+
: data_size;
|
|
73
|
+
|
|
74
|
+
const contents_bytes = contents_size * bytes_per_element;
|
|
75
|
+
|
|
76
|
+
if (contents_size < 0) {
|
|
77
|
+
throw new DOMException(
|
|
78
|
+
`setImmediates: contentsSize(=${contents_size}) must be non-negative`,
|
|
79
|
+
'OperationError'
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (data_offset + contents_size > data_element_count) {
|
|
84
|
+
throw new DOMException(
|
|
85
|
+
`setImmediates: dataOffset(=${data_offset}) + contentsSize(=${contents_size}) exceeds data length(=${data_element_count})`,
|
|
86
|
+
'OperationError'
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (contents_bytes % 4 !== 0) {
|
|
91
|
+
throw new DOMException(
|
|
92
|
+
`setImmediates: contents size in bytes(=${contents_bytes}) must be a multiple of 4`,
|
|
93
|
+
'OperationError'
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// device timeline from here — these invalidate rather than throw
|
|
98
|
+
|
|
99
|
+
if (range_offset % 4 !== 0) {
|
|
100
|
+
return `setImmediates: rangeOffset(=${range_offset}) must be a multiple of 4`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (range_offset + contents_bytes > this.#bytes.byteLength) {
|
|
104
|
+
return `setImmediates: rangeOffset(=${range_offset}) + ${contents_bytes} bytes exceeds maxImmediateSize(=${this.#bytes.byteLength})`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const source = data instanceof ArrayBuffer
|
|
108
|
+
? new Uint8Array(data)
|
|
109
|
+
: new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
110
|
+
|
|
111
|
+
const source_byte_offset = data_offset * bytes_per_element;
|
|
112
|
+
|
|
113
|
+
for (let i = 0; i < contents_bytes; i++) {
|
|
114
|
+
const byte_index = range_offset + i;
|
|
115
|
+
|
|
116
|
+
this.#bytes[byte_index] = source[source_byte_offset + i];
|
|
117
|
+
this.#slots_set[byte_index >> 2] = true;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Whether every slot in `[range_offset, range_offset + size)` has been written.
|
|
125
|
+
*
|
|
126
|
+
* This is the check a draw performs against the pipeline's declared immediate range. It is
|
|
127
|
+
* deliberately slot-granular rather than byte-granular, because WebGPU's `AccessibleSlots`
|
|
128
|
+
* excludes padding: a struct with a hole in it is fully initialised as long as every 4-byte
|
|
129
|
+
* slot it actually reads was touched.
|
|
130
|
+
*
|
|
131
|
+
* @param {number} range_offset
|
|
132
|
+
* @param {number} size in bytes
|
|
133
|
+
* @returns {boolean}
|
|
134
|
+
*/
|
|
135
|
+
isRangeSet(range_offset, size) {
|
|
136
|
+
const first = range_offset >> 2;
|
|
137
|
+
const last = (range_offset + size - 1) >> 2;
|
|
138
|
+
|
|
139
|
+
for (let slot = first; slot <= last; slot++) {
|
|
140
|
+
if (this.#slots_set[slot] !== true) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The state a draw or dispatch would run under, copied so a later `setImmediates` does not
|
|
150
|
+
* rewrite an already-recorded command.
|
|
151
|
+
*
|
|
152
|
+
* @returns {{bytes: Uint8Array, slots_set: boolean[]}}
|
|
153
|
+
*/
|
|
154
|
+
snapshot() {
|
|
155
|
+
return {
|
|
156
|
+
bytes: this.#bytes.slice(),
|
|
157
|
+
slots_set: this.#slots_set.slice(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -70,6 +70,13 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase implemen
|
|
|
70
70
|
* @param {number} [dynamic_offsets_length]
|
|
71
71
|
*/
|
|
72
72
|
setBindGroup(index: number, bind_group: GPUBindGroup, dynamic_offsets?: number[] | Uint32Array, dynamic_offsets_start?: number, dynamic_offsets_length?: number): void;
|
|
73
|
+
/**
|
|
74
|
+
* @param {number} range_offset byte offset into the immediate data range
|
|
75
|
+
* @param {ArrayBuffer|ArrayBufferView} data
|
|
76
|
+
* @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
|
|
77
|
+
* @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
|
|
78
|
+
*/
|
|
79
|
+
setImmediates(range_offset: number, data: ArrayBuffer | ArrayBufferView, data_offset?: number, data_size?: number): void;
|
|
73
80
|
/**
|
|
74
81
|
* @param {number} slot
|
|
75
82
|
* @param {GPUBuffer} buffer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoftwareGPURenderPassEncoder.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPURenderPassEncoder.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SoftwareGPURenderPassEncoder.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPURenderPassEncoder.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,mFAFgB,oBAAoB;IAmFhC;;;OAGG;IACH,sFAQC;IA5FD;;;;;;;;;OASG;IACH,OAFU;QAAC,QAAQ,EAAE,oBAAkB,IAAI,CAAC;QAAC,WAAW,EAAE,cAAc,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,GAAC,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAC,EAAE,CAElR;IAEX;;;;;;OAMG;IACH,oCAAW;IAoDX;;;;OAIG;IACH,uBAEC;IAsBD;;OAEG;IACH,+CAIC;IAED;;;;;;;;OAQG;IACH,oBANW,MAAM,8CAEN,MAAM,EAAE,GAAC,WAAW,0BACpB,MAAM,2BACN,MAAM,QAWhB;IAED;;;;;OAKG;IACH,4BALW,MAAM,QACN,WAAW,GAAC,eAAe,gBAC3B,MAAM,cACN,MAAM,QAUhB;IAED;;;;;OAKG;IACH,sBALW,MAAM,8BAEN,MAAM,SACN,MAAM,QAMhB;IAED;;;;;OAKG;IACH,yEAHW,MAAM,SACN,MAAM,QAMhB;IAED;;;;;;;OAOG;IACH,eAPW,MAAM,KACN,MAAM,SACN,MAAM,UACN,MAAM,aACN,MAAM,aACN,MAAM,QAMhB;IAED;;;;;OAKG;IACH,kBALW,MAAM,KACN,MAAM,SACN,MAAM,UACN,MAAM,QAMhB;IAED;;OAEG;IACH,wCAIC;IADG,yBAA2B;IAG/B;;OAEG;IACH,+BAFW,MAAM,QAMhB;IADG,0BAAkC;IAwCtC;;;OAGG;IACH,mBAHW,MAAM,mBACN,MAAM,QAahB;IAED;;;OAGG;IACH,yBAHW,MAAM,mBACN,MAAM,QAahB;IAED;;;OAGG;IACH,0DAFW,MAAM,QAgBhB;IAED;;;OAGG;IACH,iEAFW,MAAM,QAehB;IAED;;OAEG;IACH,sBAFW,MAAM,QAIhB;IAED,sBAEC;IAED;;OAEG;IACH,yBAFW,MAAM,QAIhB;IAED,YAQC;IAGL;;;OAGG;IACH,yCAFU,OAAO,CAEoD;;CANpE;sCAjXqC,4BAA4B"}
|