@woosh/meep-engine 3.28.0 → 3.29.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.
Files changed (482) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/binary/BitSet.d.ts +16 -0
  4. package/src/core/binary/BitSet.d.ts.map +1 -1
  5. package/src/core/binary/BitSet.js +159 -49
  6. package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
  7. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  8. package/src/core/binary/allocator/OffsetAllocator.js +208 -9
  9. package/src/core/binary/compression/compress_bytes.d.ts +20 -0
  10. package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
  11. package/src/core/binary/compression/compress_bytes.js +35 -0
  12. package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
  13. package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
  14. package/src/core/binary/compression/decompress_bytes_into.js +87 -0
  15. package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
  16. package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
  17. package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
  18. package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
  19. package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
  20. package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
  21. package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
  22. package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
  23. package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
  24. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
  25. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
  26. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
  27. package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
  28. package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
  29. package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
  30. package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
  31. package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
  32. package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
  33. package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
  34. package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
  35. package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
  36. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
  37. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
  38. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
  39. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
  40. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
  41. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
  42. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
  43. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
  44. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
  45. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +47 -1
  46. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  47. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +677 -8
  48. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
  49. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
  50. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
  51. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
  52. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
  53. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
  54. package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
  55. package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
  56. package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
  57. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
  58. package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
  59. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
  60. package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
  61. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
  62. package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
  63. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
  64. package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
  65. package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
  66. package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
  67. package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
  68. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
  69. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  70. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
  71. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
  72. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
  74. package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
  75. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  76. package/src/engine/graphics3/DebugDrawSystem.js +206 -203
  77. package/src/engine/graphics3/DecalSystem.d.ts +4 -5
  78. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  79. package/src/engine/graphics3/DecalSystem.js +5 -5
  80. package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
  81. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
  82. package/src/engine/graphics3/FogOfWarSystem.js +8 -12
  83. package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
  84. package/src/shade/RENDERER_CONTRACT.md +12 -7
  85. package/src/shade/playground/caldera/README.md +529 -0
  86. package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
  87. package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
  88. package/src/shade/playground/caldera/caldera_format.js +241 -0
  89. package/src/shade/playground/caldera/index.html +126 -0
  90. package/src/shade/playground/caldera/main.d.ts.map +1 -0
  91. package/src/shade/playground/caldera/main.js +1565 -0
  92. package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
  93. package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
  94. package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
  95. package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
  96. package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
  97. package/src/shade/playground/vgeo_runtime/README.md +5 -3
  98. package/src/shade/playground/vgeo_runtime/main.js +3 -2
  99. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +3 -3
  100. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -1
  101. package/src/shade/playground/vgeo_runtime/sample_asset.js +3 -3
  102. package/src/shade/playground/vgeo_scene/README.md +103 -24
  103. package/src/shade/playground/vgeo_scene/main.js +525 -24
  104. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  105. package/src/shade/renderer/GraphicsContext.js +6 -0
  106. package/src/shade/renderer/Renderer.d.ts +2 -0
  107. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  108. package/src/shade/renderer/Renderer.js +23 -0
  109. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  110. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
  111. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +69 -33
  112. package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
  113. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  114. package/src/shade/renderer/extension/RenderExtension.js +15 -19
  115. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
  116. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  117. package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
  118. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  119. package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
  120. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  121. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
  122. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
  123. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
  124. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  125. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
  126. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
  127. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +155 -64
  128. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +30 -13
  129. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
  130. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
  131. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +57 -7
  132. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  133. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +63 -9
  134. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
  135. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
  136. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
  137. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
  138. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
  139. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
  140. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
  141. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
  142. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
  143. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
  144. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
  145. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
  146. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +19 -6
  147. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -1
  148. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js +20 -7
  149. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
  150. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
  151. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
  152. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
  153. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
  154. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
  155. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
  156. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
  157. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
  158. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
  159. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
  160. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
  161. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +2 -27
  162. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
  163. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +120 -1564
  164. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
  165. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
  166. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
  167. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
  168. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
  169. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
  170. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
  171. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
  172. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
  173. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
  174. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
  175. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
  176. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
  177. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
  178. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
  179. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
  180. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
  182. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
  183. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +45 -0
  185. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -0
  186. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +68 -0
  188. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +12 -7
  189. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js +33 -11
  191. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
  192. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
  194. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
  195. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
  196. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
  197. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
  198. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
  199. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
  200. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +24 -8
  201. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
  202. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +250 -25
  203. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +12 -8
  204. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -1
  205. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +58 -50
  206. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +8 -1
  207. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
  208. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +18 -3
  209. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
  210. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
  211. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
  212. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +23 -5
  213. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -1
  214. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js +28 -21
  215. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.js +1 -1
  216. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +224 -60
  218. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +15 -0
  219. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -1
  220. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +17 -0
  221. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +17 -0
  222. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +19 -0
  224. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +10 -1
  225. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -1
  226. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +103 -9
  227. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +14 -2
  228. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -1
  229. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +38 -14
  230. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
  231. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +28 -5
  233. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
  234. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
  235. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
  236. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
  237. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  238. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
  239. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
  240. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
  241. package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
  242. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
  243. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
  244. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
  245. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
  246. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
  247. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
  248. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
  249. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
  250. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
  251. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
  252. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
  253. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
  254. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
  255. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
  256. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
  257. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  258. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
  259. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
  260. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
  261. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
  262. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
  263. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
  264. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
  265. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
  266. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
  267. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
  268. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
  269. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
  270. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
  271. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  272. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
  273. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
  274. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
  275. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
  276. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
  277. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  278. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
  279. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
  280. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
  281. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
  282. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
  283. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
  284. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
  285. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
  286. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
  287. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
  288. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
  289. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
  290. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
  291. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +4 -2
  292. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +8 -4
  294. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  295. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
  296. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
  297. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
  298. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
  299. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
  300. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  301. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
  302. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
  303. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
  304. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
  305. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
  306. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
  307. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
  308. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
  310. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
  311. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
  312. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
  313. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  314. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +111 -33
  315. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
  316. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  317. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +112 -42
  318. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
  319. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  320. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +51 -21
  321. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
  322. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  323. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
  324. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  325. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +34 -0
  326. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
  327. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +18 -0
  328. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  329. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +47 -19
  330. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
  331. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
  332. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
  333. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
  334. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
  335. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  336. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
  337. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  338. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
  339. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
  340. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
  341. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  342. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
  343. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  344. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
  345. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
  346. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
  347. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
  348. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
  349. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
  350. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
  351. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  352. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  354. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
  355. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  356. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
  357. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  358. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  359. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
  360. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  361. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
  362. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
  363. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
  364. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  365. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
  366. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
  367. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
  368. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  369. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
  370. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  371. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
  372. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  373. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
  374. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
  375. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
  376. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
  377. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
  378. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
  380. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
  382. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
  384. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  385. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
  386. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
  388. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +4 -8
  390. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +5 -8
  392. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
  393. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
  394. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
  395. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
  396. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  397. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
  398. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
  399. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
  400. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
  401. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
  402. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
  403. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
  404. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
  405. package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
  406. package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
  407. package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
  408. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts +0 -18
  409. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
  410. package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
  411. package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
  412. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts +0 -52
  413. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
  414. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
  415. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
  416. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts +0 -32
  417. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
  418. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts +0 -59
  419. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
  420. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts +0 -44
  421. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
  422. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
  423. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
  424. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts +0 -73
  425. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
  426. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +0 -13
  427. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
  428. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts +0 -12
  429. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
  430. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
  431. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
  432. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts +0 -13
  433. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
  434. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts +0 -19
  435. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
  436. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
  437. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
  438. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts +0 -31
  439. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
  440. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts +0 -18
  441. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
  442. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
  443. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
  444. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
  445. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
  446. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts +0 -14
  447. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
  448. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts +0 -11
  449. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
  450. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts +0 -46
  451. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
  452. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +0 -22
  453. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
  454. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts +0 -29
  455. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
  456. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts +0 -9
  457. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
  458. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts +0 -10
  459. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
  460. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts +0 -15
  461. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
  462. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
  463. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
  464. package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
  465. package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
  466. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
  467. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
  468. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
  469. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
  470. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
  471. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
  472. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
  473. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
  474. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
  475. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
  476. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
  477. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
  478. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
  479. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
  480. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
  481. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
  482. /package/src/shade/playground/{vgeo_viewer → caldera}/main.d.ts +0 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The geometry table as column arrays, which is how a page wants it.
3
+ *
4
+ * Half a million objects with six fields each is half a million allocations and a slow walk every
5
+ * time the page asks a question about all of them; six typed arrays over the same bytes are neither.
6
+ * `bounds` stays interleaved because it is always read as a group.
7
+ *
8
+ * @param {ArrayBuffer} bytes the whole of `geometry.table.bin`
9
+ * @returns {{count: number, pack: Uint32Array, offset: Uint32Array, bytes: Uint32Array,
10
+ * triangles: Uint32Array, vertices: Uint32Array, vgeo: Uint32Array,
11
+ * flags: Uint32Array, bounds: Float32Array}}
12
+ */
13
+ export function caldera_read_geometry_table(bytes: ArrayBuffer): {
14
+ count: number;
15
+ pack: Uint32Array;
16
+ offset: Uint32Array;
17
+ bytes: Uint32Array;
18
+ triangles: Uint32Array;
19
+ vertices: Uint32Array;
20
+ vgeo: Uint32Array;
21
+ flags: Uint32Array;
22
+ bounds: Float32Array;
23
+ };
24
+ /**
25
+ * One district's placements: a geometry id and a 4x4 matrix each, as two typed arrays over the
26
+ * file's own bytes.
27
+ *
28
+ * The arrays are **views**, not copies — a district of 363,145 placements is 23 MiB of matrices and
29
+ * there is no reason for it to exist twice. That does mean the caller must keep the buffer alive,
30
+ * which it does by holding these.
31
+ *
32
+ * @param {ArrayBuffer} file
33
+ * @returns {{count: number, geometry: Uint32Array, matrices: Float32Array}}
34
+ */
35
+ export function caldera_read_placements(file: ArrayBuffer): {
36
+ count: number;
37
+ geometry: Uint32Array;
38
+ matrices: Float32Array;
39
+ };
40
+ /**
41
+ * The pack byte ranges that cover a set of geometries, coalesced.
42
+ *
43
+ * A district wants tens of thousands of blobs and a request per blob is tens of thousands of round
44
+ * trips. The blobs are laid down in geometry-id order, so a district's own geometry is very nearly
45
+ * contiguous — the runs below are what turns that layout into a handful of reads. `slack` is what
46
+ * buys the rest: joining two runs across a small hole fetches bytes nobody asked for, and a few
47
+ * kilobytes of those is cheaper than another round trip.
48
+ *
49
+ * Ids repeated in the input are taken once. A caller that has already deduplicated loses nothing by
50
+ * it, and a caller that has not would otherwise get a geometry deserialized twice out of the same
51
+ * bytes.
52
+ *
53
+ * @param {number[]|Uint32Array|Iterable<number>} ids the geometries wanted, in any order
54
+ * @param {{pack: Uint32Array, offset: Uint32Array, bytes: Uint32Array}} table
55
+ * @param {number} [slack] how large a gap may be bridged rather than split, in bytes
56
+ * @param {number} [max_bytes] how large one range may grow — see {@link CALDERA_MAX_RANGE_BYTES}
57
+ * @returns {{pack: number, start: number, end: number, ids: number[]}[]} ranges, `end` exclusive
58
+ */
59
+ export function caldera_coalesce_ranges(ids: number[] | Uint32Array | Iterable<number>, table: {
60
+ pack: Uint32Array;
61
+ offset: Uint32Array;
62
+ bytes: Uint32Array;
63
+ }, slack?: number, max_bytes?: number): {
64
+ pack: number;
65
+ start: number;
66
+ end: number;
67
+ ids: number[];
68
+ }[];
69
+ /**
70
+ * The converted-Caldera set's two binary tables, defined once for the tool that writes them and the
71
+ * page that reads them.
72
+ *
73
+ * A converted scene is three kinds of thing: **packs** holding serialized `MeshletGeometry` blobs,
74
+ * a **geometry table** saying where in them each geometry is, and a **placement file** per district
75
+ * saying which geometry stands where. Only the first is an engine format already
76
+ * ({@link MeshletGeometrySerializationAdapter}); the other two are this module, and they are tables
77
+ * rather than JSON because there are half a million rows of one and nearly four million of the
78
+ * other — `caldera.meep.json` stays a page of text a person can read, and the numbers live here.
79
+ *
80
+ * Both are fixed-stride, so a reader seeks rather than parses, and both are little-endian, which
81
+ * every platform meep runs on is.
82
+ *
83
+ * @author Alex Goldring
84
+ * @copyright Company Named Limited (c) 2026
85
+ */
86
+ /**
87
+ * The 16 bytes every placement file opens with, so a truncated or unrelated file is caught at the
88
+ * first read rather than as an implausible placement count.
89
+ *
90
+ * @type {string}
91
+ */
92
+ export const CALDERA_PLACEMENT_MAGIC: string;
93
+ /**
94
+ * One row of `geometry.table.bin`: where a geometry's blob is, how big the geometry is, and whether
95
+ * a `.vgeo` of it was built as well.
96
+ *
97
+ * The bounds are here rather than only inside the blob because a page decides *whether to fetch* a
98
+ * geometry from them — a district's extent, and which of its placements are worth opening first, are
99
+ * questions about bounds that must be answerable before any pack has been read.
100
+ */
101
+ export const CALDERA_TABLE_ROW: Readonly<{
102
+ SIZE: 56;
103
+ PACK: 0;
104
+ OFFSET: 4;
105
+ BYTES: 8;
106
+ TRIANGLES: 12;
107
+ VERTICES: 16;
108
+ VGEO: 20;
109
+ BOUNDS: 24;
110
+ FLAGS: 48;
111
+ /** What {@link CALDERA_TABLE_ROW.VGEO} holds when no `.vgeo` was built for this geometry. */
112
+ NO_VGEO: 4294967295;
113
+ /**
114
+ * This geometry was baked into a merged asset and has no blob of its own.
115
+ *
116
+ * Its row survives so that every id after it keeps the meaning the extractor gave it — the ids
117
+ * are positional and renumbering them would invalidate every placement file — and `bytes` is
118
+ * zero, so a reader that only checks that already skips it. The flag is what distinguishes
119
+ * "folded into the terrain" from "the builder refused this one", which are the same zero.
120
+ */
121
+ FLAG_MERGED: 1;
122
+ /**
123
+ * @param {Uint8Array|Buffer} table
124
+ * @param {number} id
125
+ * @param {{pack: number, offset: number, bytes: number, triangles: number, vertices: number,
126
+ * vgeo: number, bounds: ArrayLike<number>, flags?: number}} row
127
+ */
128
+ write(table: Uint8Array | Buffer, id: number, row: {
129
+ pack: number;
130
+ offset: number;
131
+ bytes: number;
132
+ triangles: number;
133
+ vertices: number;
134
+ vgeo: number;
135
+ bounds: ArrayLike<number>;
136
+ flags?: number;
137
+ }): void;
138
+ }>;
139
+ /**
140
+ * How large a coalesced range is allowed to grow, in bytes.
141
+ *
142
+ * A range is fetched into one `ArrayBuffer`, so this is a memory bound rather than a network one: a
143
+ * district of a hundred thousand contiguous geometries would otherwise coalesce into a single
144
+ * multi-gigabyte read, and the page would die allocating it rather than anywhere interesting. At
145
+ * 64 MiB a district is a few dozen requests instead of one, which costs nothing against the round
146
+ * trips it already saved, and the reader holds at most one of them per concurrent fetch.
147
+ *
148
+ * @type {number}
149
+ */
150
+ export const CALDERA_MAX_RANGE_BYTES: number;
151
+ //# sourceMappingURL=caldera_format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caldera_format.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/caldera/caldera_format.js"],"names":[],"mappings":"AAsFA;;;;;;;;;;;GAWG;AACH,mDALW,WAAW,GACT;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IACvF,SAAsB,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAC9E,KAAkB,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAC,CAiCtD;AAGD;;;;;;;;;;GAUG;AACH,8CAHW,WAAW,GACT;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAC,CA2B1E;AAiBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,6CANW,MAAM,EAAE,GAAC,WAAW,GAAC,SAAS,MAAM,CAAC,SACrC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAC,UAC5D,MAAM,cACN,MAAM,GACJ;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAC,EAAE,CAsCvE;AAhPD;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;GAKG;AACH,sCAFU,MAAM,CAE6C;AAE7D;;;;;;;GAOG;AACH;;;;;;;;;;IAYI,6FAA6F;;IAG7F;;;;;;;OAOG;;IAGH;;;;;OAKG;iBAJQ,UAAU,SAAO,MACjB,MAAM,OACN;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAC5F,IAAe,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,MAAM,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAC;GAoBrE;AAwFH;;;;;;;;;;GAUG;AACH,sCAFU,MAAM,CAEwC"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * The converted-Caldera set's two binary tables, defined once for the tool that writes them and the
3
+ * page that reads them.
4
+ *
5
+ * A converted scene is three kinds of thing: **packs** holding serialized `MeshletGeometry` blobs,
6
+ * a **geometry table** saying where in them each geometry is, and a **placement file** per district
7
+ * saying which geometry stands where. Only the first is an engine format already
8
+ * ({@link MeshletGeometrySerializationAdapter}); the other two are this module, and they are tables
9
+ * rather than JSON because there are half a million rows of one and nearly four million of the
10
+ * other — `caldera.meep.json` stays a page of text a person can read, and the numbers live here.
11
+ *
12
+ * Both are fixed-stride, so a reader seeks rather than parses, and both are little-endian, which
13
+ * every platform meep runs on is.
14
+ *
15
+ * @author Alex Goldring
16
+ * @copyright Company Named Limited (c) 2026
17
+ */
18
+
19
+ /**
20
+ * The 16 bytes every placement file opens with, so a truncated or unrelated file is caught at the
21
+ * first read rather than as an implausible placement count.
22
+ *
23
+ * @type {string}
24
+ */
25
+ export const CALDERA_PLACEMENT_MAGIC = "CALDERA-RAW-1\0\0\0";
26
+
27
+ /**
28
+ * One row of `geometry.table.bin`: where a geometry's blob is, how big the geometry is, and whether
29
+ * a `.vgeo` of it was built as well.
30
+ *
31
+ * The bounds are here rather than only inside the blob because a page decides *whether to fetch* a
32
+ * geometry from them — a district's extent, and which of its placements are worth opening first, are
33
+ * questions about bounds that must be answerable before any pack has been read.
34
+ */
35
+ export const CALDERA_TABLE_ROW = Object.freeze({
36
+ SIZE: 56,
37
+
38
+ PACK: 0,
39
+ OFFSET: 4,
40
+ BYTES: 8,
41
+ TRIANGLES: 12,
42
+ VERTICES: 16,
43
+ VGEO: 20,
44
+ BOUNDS: 24,
45
+ FLAGS: 48,
46
+
47
+ /** What {@link CALDERA_TABLE_ROW.VGEO} holds when no `.vgeo` was built for this geometry. */
48
+ NO_VGEO: 0xffffffff,
49
+
50
+ /**
51
+ * This geometry was baked into a merged asset and has no blob of its own.
52
+ *
53
+ * Its row survives so that every id after it keeps the meaning the extractor gave it — the ids
54
+ * are positional and renumbering them would invalidate every placement file — and `bytes` is
55
+ * zero, so a reader that only checks that already skips it. The flag is what distinguishes
56
+ * "folded into the terrain" from "the builder refused this one", which are the same zero.
57
+ */
58
+ FLAG_MERGED: 1,
59
+
60
+ /**
61
+ * @param {Uint8Array|Buffer} table
62
+ * @param {number} id
63
+ * @param {{pack: number, offset: number, bytes: number, triangles: number, vertices: number,
64
+ * vgeo: number, bounds: ArrayLike<number>, flags?: number}} row
65
+ */
66
+ write(table, id, row) {
67
+ const base = id * CALDERA_TABLE_ROW.SIZE;
68
+
69
+ const view = new DataView(table.buffer, table.byteOffset + base, CALDERA_TABLE_ROW.SIZE);
70
+
71
+ view.setUint32(CALDERA_TABLE_ROW.PACK, row.pack, true);
72
+ view.setUint32(CALDERA_TABLE_ROW.OFFSET, row.offset, true);
73
+ view.setUint32(CALDERA_TABLE_ROW.BYTES, row.bytes, true);
74
+ view.setUint32(CALDERA_TABLE_ROW.TRIANGLES, row.triangles, true);
75
+ view.setUint32(CALDERA_TABLE_ROW.VERTICES, row.vertices, true);
76
+ view.setUint32(CALDERA_TABLE_ROW.VGEO, row.vgeo, true);
77
+
78
+ for (let i = 0; i < 6; i++) {
79
+ view.setFloat32(CALDERA_TABLE_ROW.BOUNDS + i * 4, row.bounds[i], true);
80
+ }
81
+
82
+ view.setUint32(CALDERA_TABLE_ROW.FLAGS, row.flags ?? 0, true);
83
+ },
84
+ });
85
+
86
+
87
+ /**
88
+ * The geometry table as column arrays, which is how a page wants it.
89
+ *
90
+ * Half a million objects with six fields each is half a million allocations and a slow walk every
91
+ * time the page asks a question about all of them; six typed arrays over the same bytes are neither.
92
+ * `bounds` stays interleaved because it is always read as a group.
93
+ *
94
+ * @param {ArrayBuffer} bytes the whole of `geometry.table.bin`
95
+ * @returns {{count: number, pack: Uint32Array, offset: Uint32Array, bytes: Uint32Array,
96
+ * triangles: Uint32Array, vertices: Uint32Array, vgeo: Uint32Array,
97
+ * flags: Uint32Array, bounds: Float32Array}}
98
+ */
99
+ export function caldera_read_geometry_table(bytes) {
100
+ const count = Math.floor(bytes.byteLength / CALDERA_TABLE_ROW.SIZE);
101
+
102
+ const view = new DataView(bytes);
103
+
104
+ const pack = new Uint32Array(count);
105
+ const offset = new Uint32Array(count);
106
+ const size = new Uint32Array(count);
107
+ const triangles = new Uint32Array(count);
108
+ const vertices = new Uint32Array(count);
109
+ const vgeo = new Uint32Array(count);
110
+ const flags = new Uint32Array(count);
111
+ const bounds = new Float32Array(count * 6);
112
+
113
+ for (let id = 0; id < count; id++) {
114
+ const base = id * CALDERA_TABLE_ROW.SIZE;
115
+
116
+ pack[id] = view.getUint32(base + CALDERA_TABLE_ROW.PACK, true);
117
+ offset[id] = view.getUint32(base + CALDERA_TABLE_ROW.OFFSET, true);
118
+ size[id] = view.getUint32(base + CALDERA_TABLE_ROW.BYTES, true);
119
+ triangles[id] = view.getUint32(base + CALDERA_TABLE_ROW.TRIANGLES, true);
120
+ vertices[id] = view.getUint32(base + CALDERA_TABLE_ROW.VERTICES, true);
121
+ vgeo[id] = view.getUint32(base + CALDERA_TABLE_ROW.VGEO, true);
122
+ flags[id] = view.getUint32(base + CALDERA_TABLE_ROW.FLAGS, true);
123
+
124
+ for (let i = 0; i < 6; i++) {
125
+ bounds[id * 6 + i] = view.getFloat32(base + CALDERA_TABLE_ROW.BOUNDS + i * 4, true);
126
+ }
127
+ }
128
+
129
+ return { count, pack, offset, bytes: size, triangles, vertices, vgeo, flags, bounds };
130
+ }
131
+
132
+
133
+ /**
134
+ * One district's placements: a geometry id and a 4x4 matrix each, as two typed arrays over the
135
+ * file's own bytes.
136
+ *
137
+ * The arrays are **views**, not copies — a district of 363,145 placements is 23 MiB of matrices and
138
+ * there is no reason for it to exist twice. That does mean the caller must keep the buffer alive,
139
+ * which it does by holding these.
140
+ *
141
+ * @param {ArrayBuffer} file
142
+ * @returns {{count: number, geometry: Uint32Array, matrices: Float32Array}}
143
+ */
144
+ export function caldera_read_placements(file) {
145
+ const header = new Uint8Array(file, 0, CALDERA_PLACEMENT_MAGIC.length);
146
+
147
+ for (let i = 0; i < CALDERA_PLACEMENT_MAGIC.length; i++) {
148
+ if (header[i] !== CALDERA_PLACEMENT_MAGIC.charCodeAt(i)) {
149
+ throw new Error('not a caldera placement file — the magic does not match');
150
+ }
151
+ }
152
+
153
+ const count = new DataView(file).getUint32(CALDERA_PLACEMENT_MAGIC.length, true);
154
+
155
+ const ids_at = CALDERA_PLACEMENT_MAGIC.length + 8;
156
+ const matrices_at = ids_at + count * 4;
157
+
158
+ if (matrices_at + count * 64 > file.byteLength) {
159
+ throw new Error(
160
+ `placement file names ${count} placements but holds ${file.byteLength} bytes`
161
+ );
162
+ }
163
+
164
+ return {
165
+ count,
166
+ geometry: new Uint32Array(file, ids_at, count),
167
+ matrices: new Float32Array(file, matrices_at, count * 16),
168
+ };
169
+ }
170
+
171
+
172
+ /**
173
+ * How large a coalesced range is allowed to grow, in bytes.
174
+ *
175
+ * A range is fetched into one `ArrayBuffer`, so this is a memory bound rather than a network one: a
176
+ * district of a hundred thousand contiguous geometries would otherwise coalesce into a single
177
+ * multi-gigabyte read, and the page would die allocating it rather than anywhere interesting. At
178
+ * 64 MiB a district is a few dozen requests instead of one, which costs nothing against the round
179
+ * trips it already saved, and the reader holds at most one of them per concurrent fetch.
180
+ *
181
+ * @type {number}
182
+ */
183
+ export const CALDERA_MAX_RANGE_BYTES = 64 * 1024 * 1024;
184
+
185
+
186
+ /**
187
+ * The pack byte ranges that cover a set of geometries, coalesced.
188
+ *
189
+ * A district wants tens of thousands of blobs and a request per blob is tens of thousands of round
190
+ * trips. The blobs are laid down in geometry-id order, so a district's own geometry is very nearly
191
+ * contiguous — the runs below are what turns that layout into a handful of reads. `slack` is what
192
+ * buys the rest: joining two runs across a small hole fetches bytes nobody asked for, and a few
193
+ * kilobytes of those is cheaper than another round trip.
194
+ *
195
+ * Ids repeated in the input are taken once. A caller that has already deduplicated loses nothing by
196
+ * it, and a caller that has not would otherwise get a geometry deserialized twice out of the same
197
+ * bytes.
198
+ *
199
+ * @param {number[]|Uint32Array|Iterable<number>} ids the geometries wanted, in any order
200
+ * @param {{pack: Uint32Array, offset: Uint32Array, bytes: Uint32Array}} table
201
+ * @param {number} [slack] how large a gap may be bridged rather than split, in bytes
202
+ * @param {number} [max_bytes] how large one range may grow — see {@link CALDERA_MAX_RANGE_BYTES}
203
+ * @returns {{pack: number, start: number, end: number, ids: number[]}[]} ranges, `end` exclusive
204
+ */
205
+ export function caldera_coalesce_ranges(
206
+ ids, table, slack = 64 * 1024, max_bytes = CALDERA_MAX_RANGE_BYTES
207
+ ) {
208
+ const wanted = Array.from(new Set(ids)).filter(id => table.bytes[id] > 0);
209
+
210
+ wanted.sort((a, b) => (
211
+ table.pack[a] - table.pack[b] || table.offset[a] - table.offset[b]
212
+ ));
213
+
214
+ const ranges = [];
215
+
216
+ let current = null;
217
+
218
+ for (const id of wanted) {
219
+ const pack = table.pack[id];
220
+ const start = table.offset[id];
221
+ const end = start + table.bytes[id];
222
+
223
+ const joins = current !== null
224
+ && current.pack === pack
225
+ && start - current.end <= slack
226
+ && Math.max(current.end, end) - current.start <= max_bytes;
227
+
228
+ if (joins) {
229
+ current.end = Math.max(current.end, end);
230
+ current.ids.push(id);
231
+
232
+ continue;
233
+ }
234
+
235
+ current = { pack, start, end, ids: [id] };
236
+
237
+ ranges.push(current);
238
+ }
239
+
240
+ return ranges;
241
+ }
@@ -0,0 +1,126 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>meep — Caldera</title>
6
+
7
+ <link rel="icon" href="data:,">
8
+
9
+ <style>
10
+ :root { color-scheme: dark; }
11
+
12
+ html, body { height: 100%; margin: 0; overflow: hidden; background: #06090d; }
13
+
14
+ /* Placed, not sized — `Renderer` writes an inline `style.width`/`style.height` every time
15
+ it configures the context, and an inline style beats a rule in here. `main.js` measures
16
+ the document for the same reason. */
17
+ #view { position: absolute; top: 0; left: 0; display: block; }
18
+
19
+ #panel {
20
+ position: absolute; top: 0; right: 0; width: 350px; max-height: 100vh; overflow-y: auto;
21
+ z-index: 10; padding: 12px 14px; box-sizing: border-box;
22
+ font: 12px/1.45 ui-monospace, "Cascadia Mono", Consolas, monospace;
23
+ color: #dfe6ee; background: rgba(10, 14, 20, 0.9);
24
+ border-left: 1px solid #2b3947;
25
+ }
26
+
27
+ #panel h1 { margin: 0 0 8px; font-size: 13px; letter-spacing: 0.06em; color: #ffc46b; }
28
+
29
+ #panel h2 {
30
+ margin: 14px 0 6px; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase;
31
+ color: #6b7c8d; border-bottom: 1px solid #24313d; padding-bottom: 3px;
32
+ }
33
+
34
+ #panel .row { display: flex; justify-content: space-between; gap: 8px; }
35
+
36
+ #panel .row span:last-child {
37
+ color: #f2f6fa; text-align: right;
38
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
39
+ }
40
+
41
+ #panel .row span:first-child { flex: none; }
42
+ #panel .muted { color: #6b7c8d; }
43
+ #panel .bad { color: #ff8a7a; }
44
+ #panel .good { color: #8fe388; }
45
+ #panel .warn { color: #ffc46b; }
46
+ #panel input[type=range] { width: 100%; }
47
+ #panel label { display: block; margin: 6px 0 2px; }
48
+
49
+ #status { white-space: pre-wrap; overflow-wrap: anywhere; }
50
+ #status.error { color: #ff8a7a; }
51
+
52
+ /* A converted map arrives district by district and the picture fills in as it does, so a
53
+ bar is the honest shape for it: the page is worth looking at long before it is finished. */
54
+ #progress {
55
+ margin: 8px 0 2px; height: 4px; background: #1b2530; border-radius: 2px;
56
+ overflow: hidden;
57
+ }
58
+
59
+ #progress > div { height: 100%; width: 0; background: #ffc46b; transition: width 0.2s; }
60
+
61
+ #districts {
62
+ max-height: 190px; overflow-y: auto; margin-top: 4px;
63
+ border: 1px solid #24313d; border-radius: 2px; padding: 4px 6px;
64
+ }
65
+
66
+ #districts .row span:first-child { overflow: hidden; text-overflow: ellipsis; }
67
+ #districts .row.pending span:last-child { color: #6b7c8d; }
68
+ #districts .row.loading span:last-child { color: #ffc46b; }
69
+ #districts .row.done span:last-child { color: #8fe388; }
70
+
71
+ #hint {
72
+ position: absolute; left: 12px; bottom: 10px; z-index: 10;
73
+ font: 11px/1.5 ui-monospace, Consolas, monospace; color: #62727f;
74
+ background: rgba(10, 14, 20, 0.6); padding: 5px 9px; border-radius: 3px;
75
+ }
76
+ </style>
77
+ </head>
78
+ <body tabindex="0">
79
+
80
+ <canvas id="view"></canvas>
81
+
82
+ <div id="hint">drag to orbit &middot; wheel to dolly &middot; P profiles a frame</div>
83
+
84
+ <div id="panel">
85
+ <h1>CALDERA</h1>
86
+
87
+ <div id="status">starting…</div>
88
+ <div id="progress"><div></div></div>
89
+
90
+ <h2>scene</h2>
91
+ <div class="row"><span>districts</span><span id="s-districts">—</span></div>
92
+ <div class="row"><span>placements</span><span id="s-placements">—</span></div>
93
+ <div class="row"><span>geometries</span><span id="s-geometries">—</span></div>
94
+ <div class="row"><span>source triangles</span><span id="s-source">—</span></div>
95
+ <div class="row"><span>instanced triangles</span><span id="s-instanced">—</span></div>
96
+ <div class="row"><span>fetched</span><span id="s-fetched">—</span></div>
97
+ <div class="row"><span>open</span><span id="s-open">—</span></div>
98
+
99
+ <h2>frame</h2>
100
+ <div class="row"><span>frame</span><span id="f-frame">—</span></div>
101
+ <div class="row"><span>cpu</span><span id="f-cpu">—</span></div>
102
+ <div class="row"><span>resolution</span><span id="f-resolution">—</span></div>
103
+ <div class="row"><span>mesh collection</span><span id="f-meshes">—</span></div>
104
+ <div class="row"><span>meshlet collection</span><span id="f-meshlets">—</span></div>
105
+ <div class="row"><span>dropped (vg only)</span><span id="f-dropped">—</span></div>
106
+
107
+ <h2>virtual geometry</h2>
108
+ <div class="row"><span>containers</span><span id="v-containers">—</span></div>
109
+ <div class="row"><span>instances</span><span id="v-instances">—</span></div>
110
+ <div class="row"><span>clusters drawn</span><span id="v-drawn">—</span></div>
111
+ <div class="row"><span>pages resident</span><span id="v-pages">—</span></div>
112
+ <div class="row"><span>refused / clamped</span><span id="v-refused">—</span></div>
113
+
114
+ <label for="tau">error threshold <span id="tau-value" class="muted">1.00</span> px</label>
115
+ <input id="tau" type="range" min="0.25" max="16" step="0.25" value="1">
116
+
117
+ <h2>districts</h2>
118
+ <div id="districts"></div>
119
+
120
+ <div id="profile-status" class="muted" style="margin-top: 10px"></div>
121
+ </div>
122
+
123
+ <script type="module" src="./main.js"></script>
124
+
125
+ </body>
126
+ </html>
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/caldera/main.js"],"names":[],"mappings":""}