@woosh/meep-engine 3.11.3 → 3.13.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/GPUDecalRenderer.js +3 -3
- 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/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
- package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
- 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/highlight/shader_highlight_outline.js +150 -150
- 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/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +2 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
- package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +801 -994
- package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
- package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
- package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
- package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
- package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
- package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
- package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
- package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
- package/src/shade/device/timing/GPUTimerArray.js +261 -289
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
- package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
- package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
- package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
- package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
- package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
- 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 +3 -2
- 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 +3 -2
- 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 +135 -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/Renderer.d.ts +0 -6
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +0 -29
- package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
- 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 +4 -2
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
- 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 +3 -2
- 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 +4 -2
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
- 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 +24 -10
- 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 +3 -2
- 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 +5 -2
- 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/atmosphere/shader_transmittance_lut.js +3 -3
- 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 +16 -22
- package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +11 -5
- 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 +43 -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/deferred/shader_tonemap_HDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
- 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/fow/GPUFogOfWarRenderer.js +3 -3
- package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
- package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
- package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
- 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 +5 -2
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +3 -11
- 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 +6 -4
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
- package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
- 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_lpv_store_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +9 -6
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +10 -10
- 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 +4 -2
- 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 +87 -83
- 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 +4 -2
- package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
- 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 +88 -85
- 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 +194 -192
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
- 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/light/environment/execute_filter_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
- package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
- package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
- package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
- 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/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +5 -3
- package/src/shade/renderer/particles/prototypeParticleSystem.js +5 -7
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +27 -13
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +4 -4
- 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 +18 -7
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +47 -21
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
- package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
- package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
- package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +19 -17
- package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +5 -8
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
- 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 +4 -2
- 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 +4 -2
- package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +3 -2
- 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/depth_max_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
- 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/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
- package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
- package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
- package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
- 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 +339 -341
- 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 +6 -2
- 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 +4 -2
- 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 +5 -2
- 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/graph_rasterize_meshes_transparent_oit.js +722 -722
- 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_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
- package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
- package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
- 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 +5 -3
- 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 +4 -3
- 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 +4 -3
- 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.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +3 -7
- 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 +147 -145
- package/src/shade/renderer/shader/ComputeShader.d.ts +26 -5
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +347 -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/pass/RenderPassDescriptor.d.ts +2 -2
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
- 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/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
- package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
- package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
- package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
- package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +6 -4
- package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +11 -12
- package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
- package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
- 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 +3 -2
- 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 +14 -19
- 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/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +8 -3
- 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/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
- package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
- package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
- package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
- package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
- package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
- 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,790 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import Signal from "../../core/events/signal/Signal.js";
|
|
3
|
-
import Vector1 from "../../core/geom/Vector1.js";
|
|
4
|
-
import { Vector2 } from "../../core/geom/Vector2.js";
|
|
5
|
-
import { max2 } from "../../core/math/max2.js";
|
|
6
|
-
import { TextureDescriptor } from "../../shade/descriptor/texture/TextureDescriptor.js";
|
|
7
|
-
import { PerspectiveCamera } from "../../shade/renderer/camera/PerspectiveCamera.js";
|
|
8
|
-
import { DynamicResolutionScaling } from "../../shade/renderer/DynamicResolutionScaling.js";
|
|
9
|
-
import { Renderer } from "../../shade/renderer/Renderer.js";
|
|
10
|
-
import { Scene } from "../../shade/renderer/scene/Scene.js";
|
|
11
|
-
import { Sampler2D } from "../graphics/texture/sampler/Sampler2D.js";
|
|
12
|
-
import EmptyView from "../../view/elements/EmptyView.js";
|
|
13
|
-
import { make_default_environment } from "./make_default_environment.js";
|
|
14
|
-
import { shade_camera_projection_ray } from "./shade_camera_projection_ray.js";
|
|
15
|
-
import { ShadeCameraAdapter } from "./ShadeCameraAdapter.js";
|
|
1
|
+
import { GraphicsEngine } from "./GraphicsEngine.js";
|
|
16
2
|
|
|
17
3
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* whatever the platform prefers.
|
|
4
|
+
* @deprecated Renamed to {@link GraphicsEngine}. The trailing `3` marked the 2.x → 3.x renderer transition;
|
|
5
|
+
* the 2.x name it disambiguated against is gone, so the suffix no longer distinguishes anything.
|
|
21
6
|
*
|
|
22
|
-
*
|
|
7
|
+
* Kept as a re-export rather than removed: this is a library, and an import path is as much a
|
|
8
|
+
* published interface as a class name.
|
|
23
9
|
*/
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Frames an offscreen picture is drawn before it is read.
|
|
28
|
-
*
|
|
29
|
-
* More than one because the frame is temporal: anti-aliasing, and every effect that reads last
|
|
30
|
-
* frame's depth, need a history to have been written before what they produce is the picture rather
|
|
31
|
-
* than the first draft of it. Small because the history is dropped by the resize that precedes it,
|
|
32
|
-
* so this is how long convergence takes from nothing rather than how long it takes to forget a
|
|
33
|
-
* previous subject.
|
|
34
|
-
*
|
|
35
|
-
* @type {number}
|
|
36
|
-
*/
|
|
37
|
-
const OFFSCREEN_FRAMES = 8;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* The frame rate dynamic resolution scaling holds, in frames per second.
|
|
41
|
-
*
|
|
42
|
-
* Thirty, by the sponsor's decision (D39). It is a **floor**, not a target the game aims to sit at:
|
|
43
|
-
* the controller is silent while frames are cheaper than 33 ms, and everything it does happens on
|
|
44
|
-
* hardware that cannot hold that. Raising it would mean trading resolution away on machines that
|
|
45
|
-
* were coping.
|
|
46
|
-
*
|
|
47
|
-
* @type {number}
|
|
48
|
-
*/
|
|
49
|
-
const TARGET_FRAME_RATE = 30;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* The renderer meep 3 talks to: Shade behind the shape `GraphicsEngine` presented.
|
|
53
|
-
*
|
|
54
|
-
* It implements the **bootstrap seam** and nothing else — `{viewport, domElement, camera,
|
|
55
|
-
* on.{preRender, postRender, contextLost, contextRestored, contextFailed}, needDraw, autoDraw,
|
|
56
|
-
* start(), stop(), render(), updateSize()}` — because that is what `Engine` needs in order to boot,
|
|
57
|
-
* and because the facade is deliberately not allowed to grow past §4.2 (D14).
|
|
58
|
-
*
|
|
59
|
-
* **Three things have been let through since, each by name.** {@link add_extension} /
|
|
60
|
-
* {@link remove_extension} (E9), because an extension has to survive the restart that replaces the
|
|
61
|
-
* renderer holding it, and
|
|
62
|
-
* {@link scene_context} (E13, D29), because the managers a system needs — animation above all —
|
|
63
|
-
* hang off Shade's per-scene GPU state and there is no other door to them. Both take or return
|
|
64
|
-
* something the caller already owns; neither hands out the renderer.
|
|
65
|
-
*
|
|
66
|
-
* {@link renderer} is the third, and much the widest: it hands the renderer straight out, so
|
|
67
|
-
* everything the other two are shaped to avoid is reachable through it. It is an escape hatch for
|
|
68
|
-
* callers that have no other route, not a migration target — the old engine's 44
|
|
69
|
-
* `.renderer`/`getRenderer()` call sites are each still a migration item.
|
|
70
|
-
*
|
|
71
|
-
* What is deliberately absent, and stays absent: `getRenderer()` (the old engine's accessor, and
|
|
72
|
-
* the shape those call sites are being ported off), `layers` (CPU visibility dies with GPU
|
|
73
|
-
* culling), `scene` (entities reach the scene through the mesh system, not through the facade),
|
|
74
|
-
* and the three-shaped material manager.
|
|
75
|
-
*
|
|
76
|
-
* **Lifecycle differs from the old engine on purpose.** `GraphicsEngine` starts inside the `Engine`
|
|
77
|
-
* constructor, which is why stopping an engine used to leave a restarted one with no renderer at
|
|
78
|
-
* all. This one starts from `Engine.start()` and stops symmetrically, so `start → stop → start`
|
|
79
|
-
* returns a working renderer (E1).
|
|
80
|
-
*/
|
|
81
|
-
export class GraphicsEngine3 {
|
|
82
|
-
/**
|
|
83
|
-
* Duck-type the rest of the engine checks instead of `instanceof`, which is the convention
|
|
84
|
-
* the legacy `CameraSystem` already used and `HeadsUpDisplaySystem` was moved onto in Phase 0.
|
|
85
|
-
*
|
|
86
|
-
* @returns {boolean}
|
|
87
|
-
*/
|
|
88
|
-
get isGraphicsEngine() {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Shade's renderer. `null` before a successful {@link start} and again after {@link stop} —
|
|
94
|
-
* the states a caller has to tolerate, which is why {@link render} checks rather than assumes.
|
|
95
|
-
*
|
|
96
|
-
* @type {Renderer|null}
|
|
97
|
-
*/
|
|
98
|
-
#renderer = null;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Danger zone.
|
|
102
|
-
* Be careful with what you do, with great Renderer comes great responsibility.
|
|
103
|
-
* @returns {Renderer|null}
|
|
104
|
-
*/
|
|
105
|
-
get renderer(){
|
|
106
|
-
return this.#renderer;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Trades internal resolution for frame time — see {@link dynamic_resolution}.
|
|
111
|
-
*
|
|
112
|
-
* @type {DynamicResolutionScaling}
|
|
113
|
-
*/
|
|
114
|
-
#dynamic_resolution = new DynamicResolutionScaling();
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* When the previous frame was drawn, in the clock {@link performance} keeps. Seeded by
|
|
118
|
-
* {@link start} so that the first frame after one has a real interval behind it rather than a
|
|
119
|
-
* special case.
|
|
120
|
-
*
|
|
121
|
-
* @type {number}
|
|
122
|
-
*/
|
|
123
|
-
#last_render_timestamp = 0;
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Extensions registered through {@link add_extension}, in the order they were added — which is
|
|
127
|
-
* not the order they record in: that is resolved from their own declarations, per phase, by the
|
|
128
|
-
* registry the renderer holds.
|
|
129
|
-
*
|
|
130
|
-
* The engine holds them rather than the renderer because a renderer is replaced by every
|
|
131
|
-
* restart while the systems that registered are not, and because a system has to be able to
|
|
132
|
-
* register before a device exists.
|
|
133
|
-
*
|
|
134
|
-
* @type {RenderExtension[]}
|
|
135
|
-
*/
|
|
136
|
-
#extensions = [];
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* The scene Shade draws.
|
|
140
|
-
*
|
|
141
|
-
* There is no getter, deliberately. The old engine handed its scene out and the editor wrote
|
|
142
|
-
* into the graph directly — 14 call sites of coupling that §2.1 retires. Content reaches the
|
|
143
|
-
* renderer through the system that owns it, which tells the facade *which* scene to draw and
|
|
144
|
-
* keeps the graph to itself.
|
|
145
|
-
*
|
|
146
|
-
* @type {Scene}
|
|
147
|
-
*/
|
|
148
|
-
#scene = new Scene();
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* @type {HTMLCanvasElement|null}
|
|
152
|
-
*/
|
|
153
|
-
#canvas = null;
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* The camera the frame is drawn from. Owned here rather than handed in, because it is Shade's
|
|
157
|
-
* and a caller building one would have to know that; what drives it is
|
|
158
|
-
* {@link camera_sync_from_transform}, from whatever transform the active camera entity has.
|
|
159
|
-
*
|
|
160
|
-
* @type {PerspectiveCamera}
|
|
161
|
-
*/
|
|
162
|
-
#camera = new PerspectiveCamera();
|
|
163
|
-
|
|
164
|
-
constructor() {
|
|
165
|
-
/**
|
|
166
|
-
* The camera, in the shape the engine's existing consumers read it — `projectionMatrix` and
|
|
167
|
-
* `matrixWorldInverse`, which is what `HeadsUpDisplaySystem` multiplies together. The real
|
|
168
|
-
* Shade camera is on its `camera` property.
|
|
169
|
-
*
|
|
170
|
-
* @type {ShadeCameraAdapter}
|
|
171
|
-
*/
|
|
172
|
-
this.camera = new ShadeCameraAdapter(this.#camera);
|
|
173
|
-
|
|
174
|
-
this.on = {
|
|
175
|
-
/**
|
|
176
|
-
* **The camera-finalized phase.** Camera matrices are final and the frame has not been
|
|
177
|
-
* submitted — which is what §2.1 already defines `preRender` to mean, so the old
|
|
178
|
-
* engine's `visibilityConstructionStarted` / `visibilityConstructionEnded` do not
|
|
179
|
-
* survive as signals of their own. Their subscribers — the legacy camera and light
|
|
180
|
-
* systems, the editor's symbolic display — landed here when their systems were ported.
|
|
181
|
-
*
|
|
182
|
-
* @type {Signal}
|
|
183
|
-
*/
|
|
184
|
-
preRender: new Signal(),
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* The frame has been submitted. Note that submitted is not finished — the GPU is still
|
|
188
|
-
* working when this fires, on this renderer as on the last one.
|
|
189
|
-
*
|
|
190
|
-
* @type {Signal}
|
|
191
|
-
*/
|
|
192
|
-
postRender: new Signal(),
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* The GPU device was lost. Nothing renders after this.
|
|
196
|
-
*
|
|
197
|
-
* @type {Signal}
|
|
198
|
-
*/
|
|
199
|
-
contextLost: new Signal(),
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* **Never fires.** Kept because the contract has it and subscribers expect the shape,
|
|
203
|
-
* but Shade does not recover a lost device (R6): everything the renderer built lived on
|
|
204
|
-
* it, and a message plus a reload is the honest response. A subscriber here is waiting
|
|
205
|
-
* for something that will not happen.
|
|
206
|
-
*
|
|
207
|
-
* @type {Signal<number>}
|
|
208
|
-
*/
|
|
209
|
-
contextRestored: new Signal(),
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* There will be no rendering — no WebGPU, no adapter, or hardware below the floor.
|
|
213
|
-
* Carries a {@link ShadeDeviceFailure}, whose `message` is written to be shown.
|
|
214
|
-
*
|
|
215
|
-
* @type {Signal<ShadeDeviceFailure>}
|
|
216
|
-
*/
|
|
217
|
-
contextFailed: new Signal(),
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* @type {Vector1}
|
|
222
|
-
*/
|
|
223
|
-
this.pixelRatio = new Vector1(1);
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Final render resolution in whole device pixels. Zero until the viewport has a size.
|
|
227
|
-
*
|
|
228
|
-
* @readonly
|
|
229
|
-
* @type {Vector2}
|
|
230
|
-
*/
|
|
231
|
-
this.output_resolution = new Vector2(0, 0);
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* The DOM element the canvas lives in. Created here rather than in {@link start} so that
|
|
235
|
-
* layout can be wired before a device exists — and so a failed start still leaves something
|
|
236
|
-
* to put a message in.
|
|
237
|
-
*
|
|
238
|
-
* @type {EmptyView}
|
|
239
|
-
*/
|
|
240
|
-
this.viewport = new EmptyView();
|
|
241
|
-
this.viewport.size.onChanged.add(this.updateSize, this);
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* @type {HTMLCanvasElement|null}
|
|
245
|
-
*/
|
|
246
|
-
this.domElement = null;
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Whether the next frame has anything new to show. With {@link autoDraw} off, this is what
|
|
250
|
-
* gates rendering at all.
|
|
251
|
-
*
|
|
252
|
-
* @type {boolean}
|
|
253
|
-
*/
|
|
254
|
-
this.needDraw = true;
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Draw every tick regardless of {@link needDraw}. On-demand rendering — menus and the
|
|
258
|
-
* editor that should not burn frames — is turning this off.
|
|
259
|
-
*
|
|
260
|
-
* @type {boolean}
|
|
261
|
-
*/
|
|
262
|
-
this.autoDraw = true;
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* @type {number}
|
|
266
|
-
*/
|
|
267
|
-
this.frameIndex = 0;
|
|
268
|
-
|
|
269
|
-
/*
|
|
270
|
-
Wired here rather than in `start`, because the closures read the field and the field is
|
|
271
|
-
re-assigned on every start: a controller that captured one renderer would keep steering it
|
|
272
|
-
after a context restart replaced it.
|
|
273
|
-
*/
|
|
274
|
-
this.#dynamic_resolution.get_scale = () => this.#renderer.internal_resolution_scale;
|
|
275
|
-
this.#dynamic_resolution.set_scale = v => {
|
|
276
|
-
this.#renderer.internal_resolution_scale = v;
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
/*
|
|
280
|
-
Stated rather than inherited. It happens to equal the controller's own default today, and
|
|
281
|
-
that is not a reason to leave it unsaid: the game's target is the game's decision (D39), and
|
|
282
|
-
a library default is free to move without anybody meaning the game to follow it.
|
|
283
|
-
*/
|
|
284
|
-
this.#dynamic_resolution.target_frame_rate = TARGET_FRAME_RATE;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Trades internal resolution for frame time, and is the only thing in this engine that does.
|
|
289
|
-
*
|
|
290
|
-
* Exposed so that it can be turned off or re-targeted — a measurement that wants a fixed
|
|
291
|
-
* resolution, or a settings screen that offers the choice — and for no other reason: it drives
|
|
292
|
-
* itself from {@link render}, and nothing has to call it.
|
|
293
|
-
*
|
|
294
|
-
* **It targets {@link TARGET_FRAME_RATE}**, which makes it a floor-holder rather than a
|
|
295
|
-
* frame-rate governor: it does nothing at all until a frame costs more than 33 ms, and on
|
|
296
|
-
* hardware that clears the budget it sits at full resolution and never engages.
|
|
297
|
-
*
|
|
298
|
-
* @returns {DynamicResolutionScaling}
|
|
299
|
-
*/
|
|
300
|
-
get dynamic_resolution() {
|
|
301
|
-
return this.#dynamic_resolution;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Draw this scene from now on.
|
|
306
|
-
*
|
|
307
|
-
* The narrowest seam that works: the facade is told what to draw, rather than handing out a
|
|
308
|
-
* graph for anyone to write into. Shade's own `render` takes the scene as an argument, so this
|
|
309
|
-
* matches how the renderer underneath already thinks about it.
|
|
310
|
-
*
|
|
311
|
-
* @param {Scene} scene
|
|
312
|
-
*/
|
|
313
|
-
set_scene(scene) {
|
|
314
|
-
assert.defined(scene, 'scene');
|
|
315
|
-
assert.equal(scene.isScene, true, 'scene.isScene !== true');
|
|
316
|
-
|
|
317
|
-
this.#scene = scene;
|
|
318
|
-
|
|
319
|
-
/*
|
|
320
|
-
Shade lights with indirect by default and a scene without an environment renders unlit, so
|
|
321
|
-
the engine supplies one rather than leaving every caller to. Turning global illumination off
|
|
322
|
-
is the thing that takes a decision, not turning it on.
|
|
323
|
-
|
|
324
|
-
A scene that arrives with an environment keeps it: the scene owns its lighting and this only
|
|
325
|
-
fills in what is missing. Otherwise handing over a scene would silently discard the
|
|
326
|
-
environment it was built with, and the fix would be to call things in a particular order.
|
|
327
|
-
*/
|
|
328
|
-
if (scene.lights.environment === undefined) {
|
|
329
|
-
scene.lights.environment = make_default_environment();
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Set the scene's image-based-lighting source, replacing whatever it was lighting with.
|
|
335
|
-
*
|
|
336
|
-
* No prefiltering happens here, unlike the equivalent on the old engine: Shade convolves the map
|
|
337
|
-
* into its irradiance and roughness mips on the GPU, notices when the texture it was given has
|
|
338
|
-
* been swapped, and redoes that work itself. So this is an assignment and the renderer catches up
|
|
339
|
-
* on the next frame — safe before startup as well as after.
|
|
340
|
-
*
|
|
341
|
-
* The texture must be **octahedral**, which is the projection Shade samples the environment with.
|
|
342
|
-
* `load_environment_map` and `resample_equirectangular_to_octahedral` are the ways in; a cube or
|
|
343
|
-
* equirectangular texture handed over directly would sample as garbage rather than fail.
|
|
344
|
-
*
|
|
345
|
-
* There is deliberately no `set_environment_texture` counterpart. On the old engine that meant
|
|
346
|
-
* "and show it as the skybox too", and Shade has no background of its own to show it on — the
|
|
347
|
-
* visible sky is its own piece of work rather than a second line here.
|
|
348
|
-
*
|
|
349
|
-
* @param {ShadeTexture} texture octahedral-encoded spherical radiance
|
|
350
|
-
*/
|
|
351
|
-
set_environment_map(texture) {
|
|
352
|
-
assert.defined(texture, 'texture');
|
|
353
|
-
assert.equal(texture.isShadeTexture, true, 'texture.isShadeTexture !== true');
|
|
354
|
-
|
|
355
|
-
this.#scene.lights.environment = texture;
|
|
356
|
-
|
|
357
|
-
this.needDraw = true;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Record work into the frame at a named point in it — §4.8's extensibility surface, and the
|
|
362
|
-
* honest replacement for the old engine's `preRender` / `buffersRendered` / `postRender`
|
|
363
|
-
* signals, each of which maps to a phase.
|
|
364
|
-
*
|
|
365
|
-
* The extension is handed a `FrameContext` when its phase comes round and records with the
|
|
366
|
-
* `graph_*` helpers, exactly as the built-in passes do. Resource handles come from the frame's
|
|
367
|
-
* records rather than from a renderer: the frame graph is what knows which resources a pass
|
|
368
|
-
* touched, and work recorded around it cannot be ordered or aliased against the rest of the
|
|
369
|
-
* frame.
|
|
370
|
-
*
|
|
371
|
-
* **Registering does not require a device.** Extensions are held here and applied to the
|
|
372
|
-
* renderer when one exists, and again after a restart — a system registers at startup without
|
|
373
|
-
* knowing where in the lifecycle it is.
|
|
374
|
-
*
|
|
375
|
-
* @param {RenderExtension} extension
|
|
376
|
-
* @returns {RenderExtension} `extension`, for handing back to {@link remove_extension}
|
|
377
|
-
*/
|
|
378
|
-
add_extension(extension) {
|
|
379
|
-
assert.defined(extension, 'extension');
|
|
380
|
-
assert.isFunction(extension.record, 'extension.record');
|
|
381
|
-
|
|
382
|
-
this.#extensions.push(extension);
|
|
383
|
-
|
|
384
|
-
if (this.#renderer !== null) {
|
|
385
|
-
this.#renderer.add_extension(extension);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
return extension;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/**
|
|
392
|
-
* How many extensions are registered against a phase.
|
|
393
|
-
*
|
|
394
|
-
* Read-only, and here because a system that registers one otherwise has no way to say that it
|
|
395
|
-
* did: the extension is private to the system that owns it, and "start → stop → start leaks
|
|
396
|
-
* nothing" is a property a gate has to be able to state. It says how many, not what they are,
|
|
397
|
-
* and hands out nothing.
|
|
398
|
-
*
|
|
399
|
-
* @param {FramePhase} phase
|
|
400
|
-
* @returns {number}
|
|
401
|
-
*/
|
|
402
|
-
extension_count(phase) {
|
|
403
|
-
assert.isNonNegativeInteger(phase, 'phase');
|
|
404
|
-
|
|
405
|
-
let count = 0;
|
|
406
|
-
|
|
407
|
-
for (let i = 0; i < this.#extensions.length; i++) {
|
|
408
|
-
if (this.#extensions[i].phase === phase) {
|
|
409
|
-
count++;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
return count;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
/**
|
|
417
|
-
* Take an extension back out. Identity is the object, so the phase does not have to be
|
|
418
|
-
* repeated.
|
|
419
|
-
*
|
|
420
|
-
* @param {RenderExtension} extension
|
|
421
|
-
* @returns {boolean} whether it was registered
|
|
422
|
-
*/
|
|
423
|
-
remove_extension(extension) {
|
|
424
|
-
const index = this.#extensions.indexOf(extension);
|
|
425
|
-
|
|
426
|
-
if (index === -1) {
|
|
427
|
-
return false;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
this.#extensions.splice(index, 1);
|
|
431
|
-
|
|
432
|
-
if (this.#renderer !== null) {
|
|
433
|
-
this.#renderer.remove_extension(extension);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
return true;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/**
|
|
440
|
-
* Shade's GPU-side state for a scene the caller already owns — and with it the managers that
|
|
441
|
-
* hang off it, of which the animation manager is the one Phase 4 needs.
|
|
442
|
-
*
|
|
443
|
-
* **The one thing D14 lets through, and D29 is why** (E13). The alternative was a system
|
|
444
|
-
* registering a frame pass that draws nothing, purely to be handed `context.view.scene` when
|
|
445
|
-
* its phase came round — which would have made the animation system claim a moment in drawing
|
|
446
|
-
* for work that is not drawing. A named method costs one line of surface and says what it is.
|
|
447
|
-
*
|
|
448
|
-
* **This still hands out no graph.** `scene` is an argument, not a getter: only the system that
|
|
449
|
-
* owns a scene can ask about it, so the coupling §2.1 retires — the facade handing its graph to
|
|
450
|
-
* anyone who asks — is not what this is. What comes back is the renderer's own bookkeeping for
|
|
451
|
-
* that scene, which is Shade's to shape and no one else's.
|
|
452
|
-
*
|
|
453
|
-
* @param {Scene} scene
|
|
454
|
-
* @returns {GPUSceneContext|null} `null` while there is no device — before a successful
|
|
455
|
-
* {@link start} and again after {@link stop}. A restart builds a **new** context, so a caller
|
|
456
|
-
* holding ids the old one issued has to notice the object changed and register again.
|
|
457
|
-
*/
|
|
458
|
-
scene_context(scene) {
|
|
459
|
-
assert.defined(scene, 'scene');
|
|
460
|
-
assert.equal(scene.isScene, true, 'scene.isScene !== true');
|
|
461
|
-
|
|
462
|
-
const renderer = this.#renderer;
|
|
463
|
-
|
|
464
|
-
if (renderer === null) {
|
|
465
|
-
return null;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
return renderer.scenes.obtain(scene);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* Draw a scene of somebody else's into a texture of that size, and hand back its pixels.
|
|
473
|
-
*
|
|
474
|
-
* **Tooling only.** This is a GPU readback and I-4 forbids those on any gameplay-affecting path;
|
|
475
|
-
* what it is here for is pictures of things — an asset library's icons, a thumbnail, a capture.
|
|
476
|
-
*
|
|
477
|
-
* **No renderer and no device leave the facade** (D14). What the caller brings is a scene and a
|
|
478
|
-
* camera, both of which it built; what it gets back is a `Sampler2D`. The frame itself goes
|
|
479
|
-
* through `Renderer.render_to_target` (D50), so the picture is drawn by the renderer that is
|
|
480
|
-
* already running, with the geometry and the textures it already holds resident.
|
|
481
|
-
*
|
|
482
|
-
* **The renderer is resized for the call and put back afterwards.** Everything a frame is built
|
|
483
|
-
* out of is sized from the output resolution, so a 64 x 64 picture means a 64 x 64 frame; the
|
|
484
|
-
* temporal history that costs is dropped either way by the resize.
|
|
485
|
-
*
|
|
486
|
-
* @param {Scene} scene
|
|
487
|
-
* @param {Camera} camera
|
|
488
|
-
* @param {number} width texels
|
|
489
|
-
* @param {number} height texels
|
|
490
|
-
* @returns {Promise<Sampler2D>} RGBA, one byte a channel
|
|
491
|
-
* @throws {Error} when there is no device — before a successful {@link start}, or after
|
|
492
|
-
* {@link stop}
|
|
493
|
-
*/
|
|
494
|
-
async render_to_sampler(scene, camera, width, height) {
|
|
495
|
-
assert.defined(scene, 'scene');
|
|
496
|
-
assert.defined(camera, 'camera');
|
|
497
|
-
assert.isNonNegativeInteger(width, 'width');
|
|
498
|
-
assert.isNonNegativeInteger(height, 'height');
|
|
499
|
-
assert.greaterThan(width, 0, 'width');
|
|
500
|
-
assert.greaterThan(height, 0, 'height');
|
|
501
|
-
|
|
502
|
-
const renderer = this.#renderer;
|
|
503
|
-
|
|
504
|
-
if (renderer === null) {
|
|
505
|
-
throw new Error('cannot render without a device — start() has not run, or stop() has');
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
const target = renderer.graphics.textures.contextFromDescriptor(TextureDescriptor.from({
|
|
509
|
-
label: "GraphicsEngine3/offscreen",
|
|
510
|
-
size: [width, height, 1],
|
|
511
|
-
format: OFFSCREEN_FORMAT,
|
|
512
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT
|
|
513
|
-
| GPUTextureUsage.TEXTURE_BINDING
|
|
514
|
-
| GPUTextureUsage.COPY_SRC
|
|
515
|
-
}));
|
|
516
|
-
|
|
517
|
-
const pixel_ratio = renderer.pixel_ratio;
|
|
518
|
-
const automatic_exposure = renderer.feature_automatic_exposure_enabled;
|
|
519
|
-
|
|
520
|
-
try {
|
|
521
|
-
renderer.pixel_ratio = 1;
|
|
522
|
-
renderer.resize(width, height);
|
|
523
|
-
|
|
524
|
-
/*
|
|
525
|
-
A picture of one object against nothing has no scene to read an exposure off, and an
|
|
526
|
-
adapting one would take the frames it adapts over — so a preview is drawn at the fixed
|
|
527
|
-
exposure instead, which is what a studio light rig is for.
|
|
528
|
-
*/
|
|
529
|
-
renderer.feature_automatic_exposure_enabled = false;
|
|
530
|
-
|
|
531
|
-
for (let i = 0; i < OFFSCREEN_FRAMES; i++) {
|
|
532
|
-
renderer.render_to_target(camera, scene, 1 / 60, target);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
const data = await target.download();
|
|
536
|
-
|
|
537
|
-
return new Sampler2D(data, 4, width, height);
|
|
538
|
-
} finally {
|
|
539
|
-
target.destroy();
|
|
540
|
-
|
|
541
|
-
renderer.feature_automatic_exposure_enabled = automatic_exposure;
|
|
542
|
-
renderer.pixel_ratio = pixel_ratio;
|
|
543
|
-
|
|
544
|
-
this.updateSize();
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* Whether there is a device to render with.
|
|
550
|
-
*
|
|
551
|
-
* @returns {boolean}
|
|
552
|
-
*/
|
|
553
|
-
get is_running() {
|
|
554
|
-
return this.#renderer !== null;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
/**
|
|
558
|
-
* Stand a device up and attach its canvas to the viewport.
|
|
559
|
-
*
|
|
560
|
-
* Asynchronous because acquiring a WebGPU device is — there is no synchronous form of it — and
|
|
561
|
-
* because failing to get one is a normal outcome that has to be reported rather than thrown
|
|
562
|
-
* into a constructor. A failure raises `on.contextFailed` with a message written for a person
|
|
563
|
-
* and rethrows, so a caller that wants to handle it can and one that does not still fails
|
|
564
|
-
* loudly.
|
|
565
|
-
*
|
|
566
|
-
* @returns {Promise<void>}
|
|
567
|
-
*/
|
|
568
|
-
async start() {
|
|
569
|
-
if (this.#renderer !== null) {
|
|
570
|
-
// already running; starting twice is a caller error rather than a no-op worth hiding
|
|
571
|
-
throw new Error('GraphicsEngine3 is already started');
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
const canvas = document.createElement("canvas");
|
|
575
|
-
|
|
576
|
-
canvas.classList.add("graphics-engine-render-canvas");
|
|
577
|
-
|
|
578
|
-
const style = canvas.style;
|
|
579
|
-
|
|
580
|
-
style.userSelect = style.webkitUserSelect = style.mozUserSelect = "none";
|
|
581
|
-
// see https://www.w3.org/TR/pointerevents/#the-touch-action-css-property
|
|
582
|
-
style.touchAction = "none";
|
|
583
|
-
|
|
584
|
-
this.#canvas = canvas;
|
|
585
|
-
|
|
586
|
-
const renderer = new Renderer();
|
|
587
|
-
|
|
588
|
-
try {
|
|
589
|
-
await renderer.initialize({ context: canvas.getContext('webgpu') });
|
|
590
|
-
} catch (failure) {
|
|
591
|
-
this.#canvas = null;
|
|
592
|
-
|
|
593
|
-
this.on.contextFailed.send1(failure);
|
|
594
|
-
|
|
595
|
-
throw failure;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
renderer.onDeviceFailure.add(this.#handle_device_failure, this);
|
|
599
|
-
|
|
600
|
-
// Extensions outlive the device: they are registered against the engine, not against a
|
|
601
|
-
// renderer that a restart replaces. This is what makes a system able to register once, at
|
|
602
|
-
// startup, without knowing whether a device exists yet.
|
|
603
|
-
for (let i = 0; i < this.#extensions.length; i++) {
|
|
604
|
-
renderer.add_extension(this.#extensions[i]);
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
this.#renderer = renderer;
|
|
608
|
-
this.domElement = canvas;
|
|
609
|
-
|
|
610
|
-
// Re-point the viewport, and the page with it. This is the wrinkle E1 named: `start` builds
|
|
611
|
-
// a *new* canvas, so a restart would otherwise leave the dead one mounted and the live one
|
|
612
|
-
// detached. `View.el` is read unguarded all over the view layer, so it is replaced rather
|
|
613
|
-
// than cleared — it always holds an element.
|
|
614
|
-
const previous = this.viewport.el;
|
|
615
|
-
|
|
616
|
-
this.viewport.el = canvas;
|
|
617
|
-
|
|
618
|
-
if (previous != null && previous.parentNode !== null) {
|
|
619
|
-
previous.parentNode.replaceChild(canvas, previous);
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
this.updateSize();
|
|
623
|
-
|
|
624
|
-
// so the first frame's interval is a real one rather than the whole of the boot
|
|
625
|
-
this.#last_render_timestamp = performance.now();
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
/**
|
|
629
|
-
* Tear the device down and let go of the canvas.
|
|
630
|
-
*
|
|
631
|
-
* Symmetric with {@link start}, and that symmetry is the point: the old engine started in a
|
|
632
|
-
* constructor and could not be restarted.
|
|
633
|
-
*/
|
|
634
|
-
stop() {
|
|
635
|
-
const renderer = this.#renderer;
|
|
636
|
-
|
|
637
|
-
if (renderer === null) {
|
|
638
|
-
// never started, or stopped twice — nothing to undo
|
|
639
|
-
return;
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
renderer.onDeviceFailure.remove(this.#handle_device_failure, this);
|
|
643
|
-
renderer.destroy();
|
|
644
|
-
|
|
645
|
-
this.#renderer = null;
|
|
646
|
-
this.#canvas = null;
|
|
647
|
-
this.domElement = null;
|
|
648
|
-
|
|
649
|
-
// `viewport.el` is deliberately left pointing at the spent canvas rather than cleared: the
|
|
650
|
-
// view layer reads it without checking, and the next `start` swaps it for a live one.
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
/**
|
|
654
|
-
* @param {ShadeDeviceFailure} failure
|
|
655
|
-
*/
|
|
656
|
-
#handle_device_failure(failure) {
|
|
657
|
-
this.on.contextLost.dispatch(failure);
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
/**
|
|
661
|
-
* A pointer position in viewport pixels, as a clip-space point.
|
|
662
|
-
*
|
|
663
|
-
* Unchanged from the old engine, down to writing into a caller's vector: it is arithmetic on the
|
|
664
|
-
* viewport size and has nothing to do with which renderer is underneath.
|
|
665
|
-
*
|
|
666
|
-
* @param {Vector2|Vector3} input viewport pixels, origin top-left
|
|
667
|
-
* @param {Vector2|Vector3} result written with −1…1, +Y up
|
|
668
|
-
*/
|
|
669
|
-
normalizeViewportPoint(input, result) {
|
|
670
|
-
const size = this.viewport.size;
|
|
671
|
-
|
|
672
|
-
// shifted by half a pixel, so the value names the centre of the pixel rather than its corner
|
|
673
|
-
result.x = ((input.x + 0.5) / size.x) * 2 - 1;
|
|
674
|
-
result.y = -((input.y + 0.5) / size.y) * 2 + 1;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
/**
|
|
678
|
-
* A ray from the eye through a point on the viewport, in world space.
|
|
679
|
-
*
|
|
680
|
-
* Same name, same arguments, same meaning as on the old engine — and the same expectation that
|
|
681
|
-
* `x` and `y` are **clip-space**, which {@link normalizeViewportPoint} is what produces. What is
|
|
682
|
-
* behind it is Shade's camera rather than three's; see {@link shade_camera_projection_ray}.
|
|
683
|
-
*
|
|
684
|
-
* This is the only picking primitive the game actually needs. Every gameplay pick is a terrain
|
|
685
|
-
* raycast — an exact query against the terrain's own representation, which no part of the renderer
|
|
686
|
-
* is involved in — so a working ray is the whole of the renderer's contribution to it.
|
|
687
|
-
*
|
|
688
|
-
* @param {number} x clip space, −1…1
|
|
689
|
-
* @param {number} y clip space, −1…1, +Y up
|
|
690
|
-
* @param {Vector3} source written with the ray's origin
|
|
691
|
-
* @param {Vector3} direction written with a unit direction
|
|
692
|
-
*/
|
|
693
|
-
viewportProjectionRay(x, y, source, direction) {
|
|
694
|
-
shade_camera_projection_ray(this.#camera, x, y, source, direction);
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
/**
|
|
698
|
-
* Size the drawing buffer to the viewport.
|
|
699
|
-
*
|
|
700
|
-
* Shade's `resize` takes a **CSS** size and applies the device pixel ratio itself, which is the
|
|
701
|
-
* opposite of what the old engine's renderer wanted — so what it is given here is the viewport
|
|
702
|
-
* size scaled by the engine's own `pixelRatio` and nothing more. `output_resolution` is then
|
|
703
|
-
* the device-pixel figure, for everything that has to land on the same texel grid.
|
|
704
|
-
*/
|
|
705
|
-
updateSize() {
|
|
706
|
-
const size = this.viewport.size;
|
|
707
|
-
const pixel_ratio = this.pixelRatio.getValue();
|
|
708
|
-
|
|
709
|
-
const css_width = max2(0, size.x * pixel_ratio);
|
|
710
|
-
const css_height = max2(0, size.y * pixel_ratio);
|
|
711
|
-
|
|
712
|
-
const renderer = this.#renderer;
|
|
713
|
-
|
|
714
|
-
if (renderer !== null) {
|
|
715
|
-
renderer.resize(css_width, css_height);
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
if (this.domElement !== null) {
|
|
719
|
-
this.domElement.style.width = size.x + "px";
|
|
720
|
-
this.domElement.style.height = size.y + "px";
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
const device_pixel_ratio = window.devicePixelRatio;
|
|
724
|
-
|
|
725
|
-
// clamped to 1 for the same reason the old engine clamped it: a collapsed viewport still
|
|
726
|
-
// allocates attachments, and a zero-sized one is not a legal target
|
|
727
|
-
this.output_resolution.set(
|
|
728
|
-
max2(1, Math.floor(css_width * device_pixel_ratio)),
|
|
729
|
-
max2(1, Math.floor(css_height * device_pixel_ratio))
|
|
730
|
-
);
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
/**
|
|
734
|
-
* Draw a frame, if there is anything to draw it with.
|
|
735
|
-
*
|
|
736
|
-
* @param {number} [time_delta_seconds]
|
|
737
|
-
* @returns {boolean} whether a frame was submitted
|
|
738
|
-
*/
|
|
739
|
-
render(time_delta_seconds = 1 / 60) {
|
|
740
|
-
const renderer = this.#renderer;
|
|
741
|
-
|
|
742
|
-
if (renderer === null) {
|
|
743
|
-
return false;
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
const viewport_size = this.viewport.size;
|
|
747
|
-
|
|
748
|
-
if (viewport_size.x <= 0 || viewport_size.y <= 0) {
|
|
749
|
-
/*
|
|
750
|
-
There is no surface to draw into. Every boot passes through this — the renderer starts
|
|
751
|
-
before the game view is laid out — and so does any collapsed or unmounted view.
|
|
752
|
-
Drawing anyway is worse than drawing nothing: `output_resolution` and the renderer's
|
|
753
|
-
own resolutions both floor at one texel, and a one-texel target is a size the frame's
|
|
754
|
-
mip chains cannot be built from, so what a frame produces here is a run of invalid
|
|
755
|
-
textures rather than a picture. `needDraw` is left set, so the next frame retries.
|
|
756
|
-
*/
|
|
757
|
-
return false;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
/*
|
|
761
|
-
The **refresh** interval, measured here rather than taken from `time_delta_seconds`. What
|
|
762
|
-
the controller steers by has to be how long a frame actually took, wall clock, including
|
|
763
|
-
everything outside this call; the argument is the simulation's delta, which is clamped and
|
|
764
|
-
is not the same quantity. Measuring between calls is also what makes this correct for any
|
|
765
|
-
driver — the engine's animation frame, or a probe calling `render` directly.
|
|
766
|
-
*/
|
|
767
|
-
const now = performance.now();
|
|
768
|
-
|
|
769
|
-
this.#dynamic_resolution.notify_frame((now - this.#last_render_timestamp) / 1000);
|
|
770
|
-
|
|
771
|
-
this.#last_render_timestamp = now;
|
|
772
|
-
|
|
773
|
-
// Aspect follows the surface being drawn to, so it is refreshed here rather than left to
|
|
774
|
-
// whoever last resized: a camera describing a viewport that has since changed shape is the
|
|
775
|
-
// classic source of a stretched frame.
|
|
776
|
-
this.#camera.aspect = renderer.aspect_ratio;
|
|
777
|
-
this.#camera.update();
|
|
778
|
-
|
|
779
|
-
this.on.preRender.dispatch();
|
|
780
|
-
|
|
781
|
-
const submitted = renderer.render(this.#camera, this.#scene, time_delta_seconds);
|
|
782
|
-
|
|
783
|
-
this.frameIndex++;
|
|
784
|
-
this.needDraw = false;
|
|
785
|
-
|
|
786
|
-
this.on.postRender.dispatch();
|
|
787
|
-
|
|
788
|
-
return submitted;
|
|
789
|
-
}
|
|
790
|
-
}
|
|
10
|
+
export const GraphicsEngine3 = GraphicsEngine;
|