@woosh/meep-engine 3.64.0 → 3.65.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/CHANGELOG.md +85 -0
- package/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BinaryBuffer.d.ts +5 -0
- package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
- package/src/core/binary/BinaryBuffer.js +39 -5
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts +65 -6
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +451 -101
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +4 -2
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +4 -2
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts +8 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +45 -10
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +237 -119
- package/src/engine/graphics/ecs/grass/GrassSpecies.d.ts +143 -0
- package/src/engine/graphics/ecs/grass/GrassSpecies.d.ts.map +1 -0
- package/src/engine/graphics/ecs/grass/GrassSpecies.js +189 -0
- package/src/engine/graphics/ecs/grass/GrassSurface.d.ts +25 -0
- package/src/engine/graphics/ecs/grass/GrassSurface.d.ts.map +1 -0
- package/src/engine/graphics/ecs/grass/GrassSurface.js +32 -0
- package/src/engine/graphics/ecs/grass/GroundCover.d.ts +68 -0
- package/src/engine/graphics/ecs/grass/GroundCover.d.ts.map +1 -0
- package/src/engine/graphics/ecs/grass/GroundCover.js +85 -0
- package/src/engine/graphics/texture/sampler/exr_to_sampler2d.d.ts +27 -0
- package/src/engine/graphics/texture/sampler/exr_to_sampler2d.d.ts.map +1 -0
- package/src/engine/graphics/texture/sampler/exr_to_sampler2d.js +91 -0
- package/src/engine/graphics/texture/sampler/sampler2d_to_exr.d.ts +23 -0
- package/src/engine/graphics/texture/sampler/sampler2d_to_exr.d.ts.map +1 -0
- package/src/engine/graphics/texture/sampler/sampler2d_to_exr.js +64 -0
- package/src/engine/graphics3/GrassSurfaceSystem.d.ts +153 -0
- package/src/engine/graphics3/GrassSurfaceSystem.d.ts.map +1 -0
- package/src/engine/graphics3/GrassSurfaceSystem.js +1076 -0
- package/src/engine/graphics3/GroundCoverSystem.d.ts +33 -0
- package/src/engine/graphics3/GroundCoverSystem.d.ts.map +1 -0
- package/src/engine/graphics3/GroundCoverSystem.js +58 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +372 -110
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +6 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +9 -2
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +325 -140
- package/src/engine/network/sim/SimActionExecutor.d.ts +4 -1
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +65 -9
- package/src/engine/network/state/PredictionHistory.d.ts.map +1 -1
- package/src/engine/network/state/PredictionHistory.js +6 -1
- package/src/engine/network/time/AdaptiveRenderDelay.d.ts +25 -14
- package/src/engine/network/time/AdaptiveRenderDelay.d.ts.map +1 -1
- package/src/engine/network/time/AdaptiveRenderDelay.js +38 -20
- package/src/engine/network/time/RenderPlayout.d.ts +23 -3
- package/src/engine/network/time/RenderPlayout.d.ts.map +1 -1
- package/src/engine/network/time/RenderPlayout.js +40 -4
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.d.ts +5 -1
- package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.js +27 -1
- package/src/format/image/exr/ExrCompression.d.ts +22 -0
- package/src/format/image/exr/ExrCompression.d.ts.map +1 -0
- package/src/format/image/exr/ExrCompression.js +27 -0
- package/src/format/image/exr/ExrImage.d.ts +32 -0
- package/src/format/image/exr/ExrImage.d.ts.map +1 -0
- package/src/format/image/exr/ExrImage.js +32 -0
- package/src/format/image/exr/ExrPixelType.d.ts +13 -0
- package/src/format/image/exr/ExrPixelType.d.ts.map +1 -0
- package/src/format/image/exr/ExrPixelType.js +18 -0
- package/src/format/image/exr/exr_compare_names.d.ts +16 -0
- package/src/format/image/exr/exr_compare_names.d.ts.map +1 -0
- package/src/format/image/exr/exr_compare_names.js +25 -0
- package/src/format/image/exr/exr_constants.d.ts +49 -0
- package/src/format/image/exr/exr_constants.d.ts.map +1 -0
- package/src/format/image/exr/exr_constants.js +56 -0
- package/src/format/image/exr/exr_read.d.ts +32 -0
- package/src/format/image/exr/exr_read.d.ts.map +1 -0
- package/src/format/image/exr/exr_read.js +531 -0
- package/src/format/image/exr/exr_sample_bits.d.ts +16 -0
- package/src/format/image/exr/exr_sample_bits.d.ts.map +1 -0
- package/src/format/image/exr/exr_sample_bits.js +21 -0
- package/src/format/image/exr/exr_scanlines_per_chunk.d.ts +17 -0
- package/src/format/image/exr/exr_scanlines_per_chunk.d.ts.map +1 -0
- package/src/format/image/exr/exr_scanlines_per_chunk.js +31 -0
- package/src/format/image/exr/exr_write.d.ts +27 -0
- package/src/format/image/exr/exr_write.d.ts.map +1 -0
- package/src/format/image/exr/exr_write.js +378 -0
- package/src/shade/device/shader/ShaderModuleCompiler.d.ts +2 -0
- package/src/shade/device/shader/ShaderModuleCompiler.d.ts.map +1 -1
- package/src/shade/device/shader/ShaderModuleCompiler.js +25 -2
- package/src/shade/playground/grass_surfaces/index.html +75 -0
- package/src/shade/playground/grass_surfaces/main.d.ts +2 -0
- package/src/shade/playground/grass_surfaces/main.d.ts.map +1 -0
- package/src/shade/playground/grass_surfaces/main.js +593 -0
- package/src/shade/playground/grass_surfaces/read_grass_surfaces.d.ts +62 -0
- package/src/shade/playground/grass_surfaces/read_grass_surfaces.d.ts.map +1 -0
- package/src/shade/playground/grass_surfaces/read_grass_surfaces.js +188 -0
- package/src/shade/playground/probe_clipmap/index.html +5 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap/main.js +34 -1
- package/src/shade/playground/probe_clipmap_box/README.md +5 -1
- package/src/shade/playground/probe_clipmap_box/index.html +12 -0
- package/src/shade/playground/probe_clipmap_box/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap_box/main.js +15 -0
- package/src/shade/playground/probe_clipmap_box/scene.d.ts +8 -1
- package/src/shade/playground/probe_clipmap_box/scene.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap_box/scene.js +74 -6
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +47 -43
- package/src/shade/renderer/extension/ViewTextures.d.ts +12 -5
- package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/ViewTextures.js +19 -5
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +3 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +6 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +7 -0
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +10 -0
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +7 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +46 -15
- package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.d.ts +3 -2
- package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.js +3 -2
- package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.d.ts +22 -0
- package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.js +247 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +50 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +101 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +8 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +12 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +35 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_material.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_material.js +6 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/material/GPUBrickMaterial.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/GPUBrickMaterial.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.d.ts +6 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.js +15 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/material/shader_brick_material_gather.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/shader_brick_material_gather.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +19 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +128 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +19 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +27 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts +19 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.js +35 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +3 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +18 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.d.ts +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.js +174 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_material.d.ts +4 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_material.js +10 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.d.ts +31 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.js +54 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +8 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +10 -21
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +7 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +33 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.d.ts +28 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.js +138 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +7 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +28 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +13 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +18 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +18 -18
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +44 -48
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +2 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +5 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +15 -30
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +11 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +29 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.d.ts +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.js +126 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.js +221 -0
- package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.d.ts +40 -0
- package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.js +86 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts +135 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.js +676 -0
- package/src/shade/renderer/grass/blade/GRASS_BLADE.d.ts +145 -0
- package/src/shade/renderer/grass/blade/GRASS_BLADE.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/GRASS_BLADE.js +179 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade.d.ts +63 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade.js +244 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.d.ts +58 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.js +174 -0
- package/src/shade/renderer/grass/blade/grass_blade_id_draw.d.ts +25 -0
- package/src/shade/renderer/grass/blade/grass_blade_id_draw.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/grass_blade_id_draw.js +133 -0
- package/src/shade/renderer/grass/blade/grass_blade_mechanics.d.ts +80 -0
- package/src/shade/renderer/grass/blade/grass_blade_mechanics.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/grass_blade_mechanics.js +92 -0
- package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts +29 -0
- package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/grass_blade_resolve.js +175 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.d.ts +14 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.js +45 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_expand.d.ts +61 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_expand.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_expand.js +340 -0
- package/src/shade/renderer/grass/blade/shader_grass_cell_count.d.ts +46 -0
- package/src/shade/renderer/grass/blade/shader_grass_cell_count.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/shader_grass_cell_count.js +280 -0
- package/src/shade/renderer/grass/population/chunk_grass_population.d.ts +60 -0
- package/src/shade/renderer/grass/population/chunk_grass_population.d.ts.map +1 -0
- package/src/shade/renderer/grass/population/chunk_grass_population.js +171 -0
- package/src/shade/renderer/grass/press/GPUGrassPress.d.ts +99 -0
- package/src/shade/renderer/grass/press/GPUGrassPress.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/GPUGrassPress.js +436 -0
- package/src/shade/renderer/grass/press/GRASS_PRESS.d.ts +179 -0
- package/src/shade/renderer/grass/press/GRASS_PRESS.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/GRASS_PRESS.js +217 -0
- package/src/shade/renderer/grass/press/chunk_grass_press.d.ts +65 -0
- package/src/shade/renderer/grass/press/chunk_grass_press.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/chunk_grass_press.js +296 -0
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +31 -0
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/shader_grass_press_mark.js +169 -0
- package/src/shade/renderer/grass/press/shader_grass_press_stamp.d.ts +27 -0
- package/src/shade/renderer/grass/press/shader_grass_press_stamp.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/shader_grass_press_stamp.js +183 -0
- package/src/shade/renderer/grass/surface/GPUGrassSurfaces.d.ts +193 -0
- package/src/shade/renderer/grass/surface/GPUGrassSurfaces.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/GPUGrassSurfaces.js +1253 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE.d.ts +211 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE.js +241 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.d.ts +82 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.js +111 -0
- package/src/shade/renderer/grass/surface/chunk_grass_column_cross.d.ts +39 -0
- package/src/shade/renderer/grass/surface/chunk_grass_column_cross.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_column_cross.js +85 -0
- package/src/shade/renderer/grass/surface/chunk_grass_directory.d.ts +29 -0
- package/src/shade/renderer/grass/surface/chunk_grass_directory.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_directory.js +112 -0
- package/src/shade/renderer/grass/surface/chunk_grass_slot.d.ts +27 -0
- package/src/shade/renderer/grass/surface/chunk_grass_slot.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_slot.js +50 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.d.ts +21 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.js +41 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_window.d.ts +32 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_window.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_window.js +136 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surfel.d.ts +37 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surfel.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surfel.js +85 -0
- package/src/shade/renderer/grass/surface/chunk_grass_tile.d.ts +25 -0
- package/src/shade/renderer/grass/surface/chunk_grass_tile.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_tile.js +52 -0
- package/src/shade/renderer/grass/surface/shader_grass_directory_fill.d.ts +23 -0
- package/src/shade/renderer/grass/surface/shader_grass_directory_fill.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_directory_fill.js +87 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts +43 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +265 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.d.ts +13 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.js +49 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.d.ts +62 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.js +162 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_retire.d.ts +40 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_retire.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_retire.js +155 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.d.ts +19 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.js +58 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_want.d.ts +30 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_want.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_want.js +251 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.d.ts +21 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.js +75 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +4 -23
- package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.d.ts +12 -0
- package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.js +29 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +22 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +3 -0
- package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.d.ts +27 -0
- package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.js +38 -0
- package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.d.ts +28 -0
- package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.js +58 -0
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +8 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +8 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +21 -3
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +37 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +148 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.js +169 -0
- package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.d.ts +18 -0
- package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.js +28 -0
- package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.d.ts +13 -0
- package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.d.ts.map +1 -0
- package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.js +22 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +4 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +52 -5
- package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +164 -8
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +3 -1
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts.map +1 -1
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +3 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +2 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +18 -13
- package/src/shade/renderer/wind/chunk_wind_field_sample_previous.d.ts +13 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_previous.d.ts.map +1 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_previous.js +23 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +1 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts.map +1 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +6 -1
- package/src/shade/renderer/wind/wind_field_add_resources.d.ts +11 -0
- package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
- package/src/shade/renderer/wind/wind_field_add_resources.js +15 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +2 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { BinaryBuffer } from "../../../core/binary/BinaryBuffer.js";
|
|
2
|
+
import { compress_bytes } from "../../../core/binary/compression/compress_bytes.js";
|
|
3
|
+
import { EndianType } from "../../../core/binary/EndianType.js";
|
|
4
|
+
import { utf8_encode_into } from "../../../core/binary/utf8/utf8_encode_into.js";
|
|
5
|
+
import { utf8_encoded_length } from "../../../core/binary/utf8/utf8_encoded_length.js";
|
|
6
|
+
import {
|
|
7
|
+
EXR_FLAG_LONG_NAMES,
|
|
8
|
+
EXR_LONG_NAME_BYTES,
|
|
9
|
+
EXR_MAGIC,
|
|
10
|
+
EXR_SHORT_NAME_BYTES,
|
|
11
|
+
EXR_VERSION
|
|
12
|
+
} from "./exr_constants.js";
|
|
13
|
+
import { exr_compare_names } from "./exr_compare_names.js";
|
|
14
|
+
import { exr_sample_bits } from "./exr_sample_bits.js";
|
|
15
|
+
import { exr_scanlines_per_chunk } from "./exr_scanlines_per_chunk.js";
|
|
16
|
+
import { ExrCompression } from "./ExrCompression.js";
|
|
17
|
+
import { ExrPixelType } from "./ExrPixelType.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The largest value of the format's signed 32-bit fields: a chunk's size, and the data window's corners.
|
|
21
|
+
*
|
|
22
|
+
* @readonly
|
|
23
|
+
* @type {number}
|
|
24
|
+
*/
|
|
25
|
+
const INT32_MAX = 0x7FFFFFFF;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Write an image as a scanline OpenEXR file.
|
|
29
|
+
*
|
|
30
|
+
* Each channel is written in the pixel type its array holds — a `Float16Array` as HALF, a `Float32Array`
|
|
31
|
+
* as FLOAT, a `Uint32Array` as UINT — and its samples go into the file as the bits they are. The header
|
|
32
|
+
* carries OpenEXR's required attributes and nothing else: both windows at the origin exactly covering the
|
|
33
|
+
* pixels, increasing line order, square pixels and the default screen window.
|
|
34
|
+
*
|
|
35
|
+
* Under {@link ExrCompression.ZIP} and {@link ExrCompression.ZIPS} a chunk that deflate does not make
|
|
36
|
+
* smaller is stored as it is, as OpenEXR's own writer does and every reader expects.
|
|
37
|
+
*
|
|
38
|
+
* The channels' arrays are read chunk by chunk as earlier chunks are compressed, so keep them unchanged
|
|
39
|
+
* until the promise settles.
|
|
40
|
+
*
|
|
41
|
+
* @param {ExrImage} image channels in any order, with distinct names of 1 to 255 bytes in UTF-8
|
|
42
|
+
* @param {ExrCompression} compression {@link ExrCompression.None}, {@link ExrCompression.ZIPS} or
|
|
43
|
+
* {@link ExrCompression.ZIP}
|
|
44
|
+
* @returns {Promise<ArrayBuffer>} the whole file
|
|
45
|
+
* @throws {Error} naming what about the image or the compression method cannot be written
|
|
46
|
+
*
|
|
47
|
+
* @see https://openexr.com/en/latest/OpenEXRFileLayout.html
|
|
48
|
+
* @author Alex Goldring
|
|
49
|
+
* @copyright Company Named Limited (c) 2026
|
|
50
|
+
*/
|
|
51
|
+
export async function exr_write(image, compression) {
|
|
52
|
+
const width = image.width;
|
|
53
|
+
const height = image.height;
|
|
54
|
+
|
|
55
|
+
// the data window's corners are signed 32-bit integers
|
|
56
|
+
if (!Number.isInteger(width) || !Number.isInteger(height) || width < 1 || height < 1
|
|
57
|
+
|| width - 1 > INT32_MAX || height - 1 > INT32_MAX) {
|
|
58
|
+
throw new Error(`EXR: cannot write a ${width}x${height} image; a side is 1 to 2^31 pixels`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const scanlines_per_chunk = exr_scanlines_per_chunk(compression);
|
|
62
|
+
|
|
63
|
+
const channels = sort_channels(image.channels, width * height);
|
|
64
|
+
const channel_count = channels.length;
|
|
65
|
+
|
|
66
|
+
let pixel_bytes = 0;
|
|
67
|
+
let long_names = false;
|
|
68
|
+
|
|
69
|
+
const plane_bits = new Array(channel_count);
|
|
70
|
+
|
|
71
|
+
for (let c = 0; c < channel_count; c++) {
|
|
72
|
+
const channel = channels[c];
|
|
73
|
+
|
|
74
|
+
pixel_bytes += channel.data.BYTES_PER_ELEMENT;
|
|
75
|
+
long_names ||= channel.name_bytes.length > EXR_SHORT_NAME_BYTES;
|
|
76
|
+
|
|
77
|
+
plane_bits[c] = exr_sample_bits(channel.data);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const line_bytes = width * pixel_bytes;
|
|
81
|
+
const chunk_bytes = Math.min(scanlines_per_chunk, height) * line_bytes;
|
|
82
|
+
|
|
83
|
+
if (chunk_bytes > INT32_MAX) {
|
|
84
|
+
throw new Error(`EXR: a chunk of this image would be ${chunk_bytes} bytes, more than a chunk's 32-bit size holds`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const chunk_count = Math.ceil(height / scanlines_per_chunk);
|
|
88
|
+
|
|
89
|
+
const buffer = new BinaryBuffer();
|
|
90
|
+
|
|
91
|
+
// OpenEXR is little-endian throughout
|
|
92
|
+
buffer.endianness = EndianType.LittleEndian;
|
|
93
|
+
|
|
94
|
+
buffer.writeUint32(EXR_MAGIC);
|
|
95
|
+
buffer.writeUint32(long_names ? EXR_VERSION | EXR_FLAG_LONG_NAMES : EXR_VERSION);
|
|
96
|
+
|
|
97
|
+
write_header(buffer, channels, compression, width, height);
|
|
98
|
+
|
|
99
|
+
// No chunk is stored larger than its scanlines, so this bounds the file: the output is allocated
|
|
100
|
+
// once, and uncompressed it is exactly the file.
|
|
101
|
+
buffer.setCapacity(buffer.position + chunk_count * 16 + height * line_bytes);
|
|
102
|
+
|
|
103
|
+
// each entry is known once its chunk has been written; reserve the table and fill it in as they are
|
|
104
|
+
const table_offset = buffer.position;
|
|
105
|
+
|
|
106
|
+
for (let i = 0; i < chunk_count; i++) {
|
|
107
|
+
buffer.writeUint64(0n);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const raw = new BinaryBuffer();
|
|
111
|
+
|
|
112
|
+
raw.endianness = EndianType.LittleEndian;
|
|
113
|
+
raw.setCapacity(chunk_bytes);
|
|
114
|
+
|
|
115
|
+
const prepared = compression === ExrCompression.None ? null : new Uint8Array(chunk_bytes);
|
|
116
|
+
|
|
117
|
+
for (let i = 0; i < chunk_count; i++) {
|
|
118
|
+
const first_line = i * scanlines_per_chunk;
|
|
119
|
+
const line_count = Math.min(scanlines_per_chunk, height - first_line);
|
|
120
|
+
const unpacked_size = line_count * line_bytes;
|
|
121
|
+
|
|
122
|
+
raw.position = 0;
|
|
123
|
+
|
|
124
|
+
write_scanlines(raw, plane_bits, width, first_line, line_count);
|
|
125
|
+
|
|
126
|
+
let payload = raw.raw_bytes;
|
|
127
|
+
let payload_size = unpacked_size;
|
|
128
|
+
|
|
129
|
+
if (prepared !== null) {
|
|
130
|
+
zip_prepare(raw.raw_bytes, prepared, unpacked_size);
|
|
131
|
+
|
|
132
|
+
const compressed = await compress_bytes([prepared.subarray(0, unpacked_size)], "deflate");
|
|
133
|
+
|
|
134
|
+
if (compressed.length < unpacked_size) {
|
|
135
|
+
payload = compressed;
|
|
136
|
+
payload_size = compressed.length;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const offset = buffer.position;
|
|
141
|
+
|
|
142
|
+
buffer.position = table_offset + i * 8;
|
|
143
|
+
buffer.writeUint64(BigInt(offset));
|
|
144
|
+
buffer.position = offset;
|
|
145
|
+
|
|
146
|
+
// the data window starts at the origin, so a chunk's scanline is its first row
|
|
147
|
+
buffer.writeInt32(first_line);
|
|
148
|
+
buffer.writeInt32(payload_size);
|
|
149
|
+
buffer.writeBytes(payload, 0, payload_size);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
buffer.trim();
|
|
153
|
+
|
|
154
|
+
return buffer.data;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Check the channels and sort them by {@link exr_compare_names}, which is the order a file lists them in
|
|
159
|
+
* and lays out their samples in.
|
|
160
|
+
*
|
|
161
|
+
* @param {ExrChannel[]} channels
|
|
162
|
+
* @param {number} sample_count every channel's
|
|
163
|
+
* @returns {{name: string, name_bytes: Uint8Array, data: (Float16Array|Float32Array|Uint32Array), pixel_type: ExrPixelType}[]}
|
|
164
|
+
*/
|
|
165
|
+
function sort_channels(channels, sample_count) {
|
|
166
|
+
const channel_count = channels.length;
|
|
167
|
+
|
|
168
|
+
if (channel_count === 0) {
|
|
169
|
+
throw new Error("EXR: the image has no channels");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const result = new Array(channel_count);
|
|
173
|
+
|
|
174
|
+
for (let c = 0; c < channel_count; c++) {
|
|
175
|
+
const { name, data } = channels[c];
|
|
176
|
+
|
|
177
|
+
if (typeof name !== "string" || name.length === 0 || name.includes("\0")) {
|
|
178
|
+
throw new Error(`EXR: channel name '${name}' is not a non-empty string without a null`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const name_bytes = new Uint8Array(utf8_encoded_length(name));
|
|
182
|
+
|
|
183
|
+
utf8_encode_into(name, name_bytes, 0);
|
|
184
|
+
|
|
185
|
+
if (name_bytes.length > EXR_LONG_NAME_BYTES) {
|
|
186
|
+
throw new Error(`EXR: channel name '${name}' is ${name_bytes.length} bytes in UTF-8, more than ${EXR_LONG_NAME_BYTES}`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
let pixel_type;
|
|
190
|
+
|
|
191
|
+
if (data instanceof Float16Array) {
|
|
192
|
+
pixel_type = ExrPixelType.HALF;
|
|
193
|
+
} else if (data instanceof Float32Array) {
|
|
194
|
+
pixel_type = ExrPixelType.FLOAT;
|
|
195
|
+
} else if (data instanceof Uint32Array) {
|
|
196
|
+
pixel_type = ExrPixelType.UINT;
|
|
197
|
+
} else {
|
|
198
|
+
throw new Error(
|
|
199
|
+
`EXR: channel '${name}' holds ${data?.constructor?.name};`
|
|
200
|
+
+ ` samples are Float16Array (HALF), Float32Array (FLOAT) or Uint32Array (UINT)`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (data.length !== sample_count) {
|
|
205
|
+
throw new Error(`EXR: channel '${name}' holds ${data.length} samples, where the image has ${sample_count}`);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
result[c] = { name, name_bytes, data, pixel_type };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
result.sort((a, b) => exr_compare_names(a.name_bytes, b.name_bytes));
|
|
212
|
+
|
|
213
|
+
for (let c = 1; c < channel_count; c++) {
|
|
214
|
+
if (exr_compare_names(result[c - 1].name_bytes, result[c].name_bytes) === 0) {
|
|
215
|
+
throw new Error(`EXR: there are two channels named '${result[c].name}'`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Write the header: OpenEXR's required attributes, in its order, then the terminator.
|
|
224
|
+
*
|
|
225
|
+
* @param {BinaryBuffer} buffer
|
|
226
|
+
* @param {{name_bytes: Uint8Array, pixel_type: ExrPixelType}[]} channels sorted by name
|
|
227
|
+
* @param {ExrCompression} compression
|
|
228
|
+
* @param {number} width
|
|
229
|
+
* @param {number} height
|
|
230
|
+
*/
|
|
231
|
+
function write_header(buffer, channels, compression, width, height) {
|
|
232
|
+
let channel_list_bytes = 1;
|
|
233
|
+
|
|
234
|
+
for (let c = 0; c < channels.length; c++) {
|
|
235
|
+
// name and terminator; pixel type; pLinear and three reserved bytes; x and y sampling
|
|
236
|
+
channel_list_bytes += channels[c].name_bytes.length + 1 + 4 + 4 + 8;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
write_attribute(buffer, "channels", "chlist", channel_list_bytes);
|
|
240
|
+
|
|
241
|
+
for (let c = 0; c < channels.length; c++) {
|
|
242
|
+
const name_bytes = channels[c].name_bytes;
|
|
243
|
+
|
|
244
|
+
buffer.writeBytes(name_bytes, 0, name_bytes.length);
|
|
245
|
+
buffer.writeUint8(0);
|
|
246
|
+
|
|
247
|
+
buffer.writeInt32(channels[c].pixel_type);
|
|
248
|
+
buffer.writeUint32(0);
|
|
249
|
+
buffer.writeInt32(1);
|
|
250
|
+
buffer.writeInt32(1);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
buffer.writeUint8(0);
|
|
254
|
+
|
|
255
|
+
write_attribute(buffer, "compression", "compression", 1);
|
|
256
|
+
buffer.writeUint8(compression);
|
|
257
|
+
|
|
258
|
+
write_attribute(buffer, "dataWindow", "box2i", 16);
|
|
259
|
+
write_window(buffer, width, height);
|
|
260
|
+
|
|
261
|
+
write_attribute(buffer, "displayWindow", "box2i", 16);
|
|
262
|
+
write_window(buffer, width, height);
|
|
263
|
+
|
|
264
|
+
// increasing Y
|
|
265
|
+
write_attribute(buffer, "lineOrder", "lineOrder", 1);
|
|
266
|
+
buffer.writeUint8(0);
|
|
267
|
+
|
|
268
|
+
write_attribute(buffer, "pixelAspectRatio", "float", 4);
|
|
269
|
+
buffer.writeFloat32(1);
|
|
270
|
+
|
|
271
|
+
write_attribute(buffer, "screenWindowCenter", "v2f", 8);
|
|
272
|
+
buffer.writeFloat32(0);
|
|
273
|
+
buffer.writeFloat32(0);
|
|
274
|
+
|
|
275
|
+
write_attribute(buffer, "screenWindowWidth", "float", 4);
|
|
276
|
+
buffer.writeFloat32(1);
|
|
277
|
+
|
|
278
|
+
buffer.writeUint8(0);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* @param {BinaryBuffer} buffer
|
|
283
|
+
* @param {string} name
|
|
284
|
+
* @param {string} type
|
|
285
|
+
* @param {number} size bytes of the value that follows
|
|
286
|
+
*/
|
|
287
|
+
function write_attribute(buffer, name, type, size) {
|
|
288
|
+
write_name(buffer, name);
|
|
289
|
+
write_name(buffer, type);
|
|
290
|
+
|
|
291
|
+
buffer.writeInt32(size);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @param {BinaryBuffer} buffer
|
|
296
|
+
* @param {string} name ASCII
|
|
297
|
+
*/
|
|
298
|
+
function write_name(buffer, name) {
|
|
299
|
+
buffer.writeASCIIString(name);
|
|
300
|
+
buffer.writeUint8(0);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* A `box2i` from the origin to the last pixel.
|
|
305
|
+
*
|
|
306
|
+
* @param {BinaryBuffer} buffer
|
|
307
|
+
* @param {number} width
|
|
308
|
+
* @param {number} height
|
|
309
|
+
*/
|
|
310
|
+
function write_window(buffer, width, height) {
|
|
311
|
+
buffer.writeInt32(0);
|
|
312
|
+
buffer.writeInt32(0);
|
|
313
|
+
buffer.writeInt32(width - 1);
|
|
314
|
+
buffer.writeInt32(height - 1);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Gather a chunk's scanlines from the channel planes — the inverse of `read_scanlines` in `exr_read`.
|
|
319
|
+
*
|
|
320
|
+
* @param {BinaryBuffer} destination
|
|
321
|
+
* @param {(Uint16Array|Uint32Array)[]} plane_bits in channel list order
|
|
322
|
+
* @param {number} width
|
|
323
|
+
* @param {number} first_line
|
|
324
|
+
* @param {number} line_count
|
|
325
|
+
*/
|
|
326
|
+
function write_scanlines(destination, plane_bits, width, first_line, line_count) {
|
|
327
|
+
const channel_count = plane_bits.length;
|
|
328
|
+
|
|
329
|
+
for (let line = first_line; line < first_line + line_count; line++) {
|
|
330
|
+
const row = line * width;
|
|
331
|
+
|
|
332
|
+
for (let c = 0; c < channel_count; c++) {
|
|
333
|
+
const bits = plane_bits[c];
|
|
334
|
+
|
|
335
|
+
if (bits.BYTES_PER_ELEMENT === 2) {
|
|
336
|
+
destination.writeUint16Array(bits, row, width);
|
|
337
|
+
} else {
|
|
338
|
+
destination.writeUint32Array(bits, row, width);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Transform a chunk the way ZIP compression does before deflating it — the inverse of
|
|
346
|
+
* `zip_reconstruct` in `exr_read`.
|
|
347
|
+
*
|
|
348
|
+
* The bytes at even positions are moved ahead of those at odd ones — for half floats, the low bytes of
|
|
349
|
+
* the samples ahead of their high bytes — and the result is delta-coded byte by byte with a bias of
|
|
350
|
+
* 128, which turns smooth image data into the small, repetitive values deflate codes cheaply.
|
|
351
|
+
*
|
|
352
|
+
* @param {Uint8Array} source the chunk's pixel data
|
|
353
|
+
* @param {Uint8Array} destination
|
|
354
|
+
* @param {number} length bytes, at least one
|
|
355
|
+
*/
|
|
356
|
+
function zip_prepare(source, destination, length) {
|
|
357
|
+
const half = (length + 1) >> 1;
|
|
358
|
+
|
|
359
|
+
let previous = source[0];
|
|
360
|
+
|
|
361
|
+
destination[0] = previous;
|
|
362
|
+
|
|
363
|
+
for (let i = 1; i < half; i++) {
|
|
364
|
+
const value = source[2 * i];
|
|
365
|
+
|
|
366
|
+
destination[i] = value - previous + 128;
|
|
367
|
+
|
|
368
|
+
previous = value;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
for (let i = half; i < length; i++) {
|
|
372
|
+
const value = source[2 * (i - half) + 1];
|
|
373
|
+
|
|
374
|
+
destination[i] = value - previous + 128;
|
|
375
|
+
|
|
376
|
+
previous = value;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
@@ -8,6 +8,8 @@ export class ShaderModuleCompiler {
|
|
|
8
8
|
*/
|
|
9
9
|
constructor(device: GPUDevice);
|
|
10
10
|
/**
|
|
11
|
+
* The module for `descriptor`. Equal descriptors are handed the same module for as long as
|
|
12
|
+
* something holds it; once nothing does, a later call may compile it again and hand out a new one.
|
|
11
13
|
*
|
|
12
14
|
* @param {ShaderModuleDescriptor} descriptor
|
|
13
15
|
* @returns {GPUShaderModule}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderModuleCompiler.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/shader/ShaderModuleCompiler.js"],"names":[],"mappings":"AAGA;;GAEG;AAEH;
|
|
1
|
+
{"version":3,"file":"ShaderModuleCompiler.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/shader/ShaderModuleCompiler.js"],"names":[],"mappings":"AAGA;;GAEG;AAEH;IAmBI;;;OAGG;IACH,+BAEC;IAwCD;;;;;;OAMG;IACH,mBAHW,sBAAsB,mBAsBhC;;CAEJ;qCAhGY,OAAO,qDAAqD,EAAE,sBAAsB"}
|
|
@@ -13,8 +13,14 @@ export class ShaderModuleCompiler {
|
|
|
13
13
|
#device
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
+
* Held weakly. A pipeline keeps the module it was built from alive in the GPU process without our
|
|
17
|
+
* help, while the browser charges every `GPUShaderModule` object the page still references to the
|
|
18
|
+
* JS heap's accounting as external memory, and the garbage a collection is allowed to gather grows
|
|
19
|
+
* with that. So a module is kept only for as long as something holds it: one nobody holds goes at
|
|
20
|
+
* the next major collection, and a later request compiles it again from the descriptor, which this
|
|
21
|
+
* map does keep.
|
|
16
22
|
*
|
|
17
|
-
* @type {HashMap<ShaderModuleDescriptor, GPUShaderModule
|
|
23
|
+
* @type {HashMap<ShaderModuleDescriptor, WeakRef<GPUShaderModule>>}
|
|
18
24
|
*/
|
|
19
25
|
#cache = new HashMap();
|
|
20
26
|
|
|
@@ -65,14 +71,31 @@ export class ShaderModuleCompiler {
|
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
/**
|
|
74
|
+
* The module for `descriptor`. Equal descriptors are handed the same module for as long as
|
|
75
|
+
* something holds it; once nothing does, a later call may compile it again and hand out a new one.
|
|
68
76
|
*
|
|
69
77
|
* @param {ShaderModuleDescriptor} descriptor
|
|
70
78
|
* @returns {GPUShaderModule}
|
|
71
79
|
*/
|
|
72
80
|
obtain(descriptor) {
|
|
81
|
+
const cache = this.#cache;
|
|
73
82
|
|
|
74
|
-
|
|
83
|
+
const held = cache.get(descriptor);
|
|
75
84
|
|
|
85
|
+
if (held !== undefined) {
|
|
86
|
+
const live = held.deref();
|
|
87
|
+
|
|
88
|
+
if (live !== undefined) {
|
|
89
|
+
return live;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const module = this.#compile(descriptor);
|
|
94
|
+
|
|
95
|
+
// an equal descriptor that is already a key keeps its entry, and the dead reference is replaced
|
|
96
|
+
cache.set(descriptor, new WeakRef(module));
|
|
97
|
+
|
|
98
|
+
return module;
|
|
76
99
|
}
|
|
77
100
|
|
|
78
101
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Grass surfaces</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
color-scheme: dark;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
html, body {
|
|
13
|
+
margin: 0;
|
|
14
|
+
height: 100%;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
background: #101215;
|
|
17
|
+
color: #e3e5e8;
|
|
18
|
+
font: 13px/1.4 'Segoe UI', system-ui, sans-serif;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#viewport {
|
|
22
|
+
position: absolute;
|
|
23
|
+
inset: 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
#legend {
|
|
27
|
+
position: absolute;
|
|
28
|
+
left: 12px;
|
|
29
|
+
top: 12px;
|
|
30
|
+
padding: 10px 12px;
|
|
31
|
+
background: rgba(14, 15, 20, 0.78);
|
|
32
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
33
|
+
border-radius: 4px;
|
|
34
|
+
max-width: 360px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#legend h1 {
|
|
38
|
+
font-size: 14px;
|
|
39
|
+
margin: 0 0 6px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#legend p {
|
|
43
|
+
margin: 4px 0;
|
|
44
|
+
color: #a8adb5;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#status {
|
|
48
|
+
font-variant-numeric: tabular-nums;
|
|
49
|
+
color: #e3e5e8;
|
|
50
|
+
white-space: pre;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#message {
|
|
54
|
+
position: absolute;
|
|
55
|
+
inset: 0;
|
|
56
|
+
display: none;
|
|
57
|
+
place-items: center;
|
|
58
|
+
white-space: pre-wrap;
|
|
59
|
+
padding: 24px;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
62
|
+
</head>
|
|
63
|
+
<body tabindex="0">
|
|
64
|
+
<div id="viewport"></div>
|
|
65
|
+
<div id="legend">
|
|
66
|
+
<h1>Grass surfaces</h1>
|
|
67
|
+
<p>A field of two sheets, a boulder sunk into one and a hill over a cave on the other, sampled as one
|
|
68
|
+
surface; and a platform of two sheets and a crate that moves as another.</p>
|
|
69
|
+
<p>A grey slab hangs over the field and is no member of it.</p>
|
|
70
|
+
<p id="status"></p>
|
|
71
|
+
</div>
|
|
72
|
+
<div id="message"></div>
|
|
73
|
+
<script type="module" src="./main.js"></script>
|
|
74
|
+
</body>
|
|
75
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/grass_surfaces/main.js"],"names":[],"mappings":""}
|