@woosh/meep-engine 3.1.0 → 3.3.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 (1869) hide show
  1. package/LICENSE +188 -188
  2. package/README.md +152 -152
  3. package/editor/Editor.js +598 -598
  4. package/editor/EditorCameraNavigation.js +205 -205
  5. package/editor/EditorKeyMap.js +182 -182
  6. package/editor/SelectionVisualizer.js +127 -127
  7. package/editor/actions/concrete/ActionInvalidateSampler.js +27 -27
  8. package/editor/actions/concrete/PatchTerrainHeightAction.js +85 -85
  9. package/editor/camera/camera_framing.js +104 -104
  10. package/editor/clipboard.js +184 -184
  11. package/editor/ecs/component/editors/ObservedIntegerEditor.js +22 -22
  12. package/editor/ecs/component/editors/ObservedStringEditor.js +34 -34
  13. package/editor/ecs/component/editors/common/two_way_sync.js +50 -50
  14. package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +19 -19
  15. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +35 -35
  16. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -17
  17. package/editor/ecs/component/editors/ecs/SGMeshEditor.js +24 -24
  18. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.js +33 -33
  19. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +45 -45
  20. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.js +19 -19
  21. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +72 -72
  22. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.js +30 -30
  23. package/editor/ecs/component/editors/shade/ShadeImageEditor.js +70 -70
  24. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.js +34 -34
  25. package/editor/ecs/component/editors/shade/ShadeTextureEditor.js +46 -46
  26. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.js +24 -24
  27. package/editor/ecs/component/prototypeObjectEditor.js +265 -265
  28. package/editor/ecs/component/registerBasicTypeEditors.js +100 -100
  29. package/editor/ecs/component/registerEngineComponentEditors.js +95 -95
  30. package/editor/entity_world_bounds.js +27 -27
  31. package/editor/particles/lut_ops.js +148 -148
  32. package/editor/particles/particleEditEvents.js +12 -12
  33. package/editor/particles/rebuildParticleEmitter.js +31 -31
  34. package/editor/persistence/EditorLayoutStore.js +71 -71
  35. package/editor/persistence/SceneMetadata.js +52 -52
  36. package/editor/persistence/SceneSlotManager.js +144 -144
  37. package/editor/persistence/buildNewSceneDataset.js +67 -67
  38. package/editor/persistence/files.js +68 -68
  39. package/editor/persistence/scene_import.js +143 -143
  40. package/editor/persistence/scene_serialization.js +79 -79
  41. package/editor/persistence/string_buffer_codec.js +41 -41
  42. package/editor/process/GridDisplayProcess.js +125 -125
  43. package/editor/process/SymbolicDisplayProcess.js +106 -108
  44. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  45. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  46. package/editor/process/symbolic/PathSymbolicDisplay.js +118 -118
  47. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.js +79 -79
  48. package/editor/process/symbolic/SoundEmitterSymbolicDisplay.js +57 -57
  49. package/editor/process/symbolic/SymbolicDisplay.js +62 -62
  50. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.js +85 -85
  51. package/editor/process/symbolic/gizmo_draw_wire_circle.js +53 -53
  52. package/editor/prototypeEditorShell.js +156 -156
  53. package/editor/selection/editor_pick.js +130 -130
  54. package/editor/selection/screen_rect_frustum.js +119 -119
  55. package/editor/style/controls.scss +168 -168
  56. package/editor/style/inspector.scss +223 -223
  57. package/editor/templates/entity_templates.js +167 -167
  58. package/editor/tools/GridPaintTool.js +273 -273
  59. package/editor/tools/SelectionTool.js +307 -307
  60. package/editor/tools/TransformToolV2.js +378 -378
  61. package/editor/tools/engine/ToolEngine.js +188 -188
  62. package/editor/tools/paint/TerrainTexturePaintTool.js +250 -250
  63. package/editor/tools/v2/BlenderCameraOrientationGizmo.js +501 -501
  64. package/editor/tools/v2/TransformControls.js +971 -971
  65. package/editor/tools/v2/handle/gizmo_drag_plane.js +141 -141
  66. package/editor/tools/v2/handle/gizmo_draw.js +399 -399
  67. package/editor/tools/v2/handle/gizmo_handles.js +364 -364
  68. package/editor/tools/v2/handle/gizmo_ray_shapes.js +239 -239
  69. package/editor/view/ecs/HierarchicalEntityListView.js +339 -339
  70. package/editor/view/ecs/components/DatGuiController.js +2 -2
  71. package/editor/view/ecs/components/common/AutoCanvasView.js +100 -100
  72. package/editor/view/ecs/components/common/TextController.js +59 -59
  73. package/editor/view/library/MeshLibraryView.js +175 -175
  74. package/editor/view/library/mesh_library_drag.js +63 -63
  75. package/editor/view/library/model_thumbnail_source.js +86 -86
  76. package/editor/view/makeEntityDecorators.js +125 -125
  77. package/editor/view/node-graph/NodeGraphSelection.js +89 -89
  78. package/editor/view/node-graph/NodeView.js +211 -211
  79. package/editor/view/node-graph/actions/ConnectionDeleteAction.js +36 -36
  80. package/editor/view/node-graph/actions/NodesMoveAction.js +41 -41
  81. package/editor/view/node-graph/connection_wire_geometry.js +107 -107
  82. package/editor/view/particles/ColorLutGradientView.js +291 -291
  83. package/editor/view/particles/ScalarLutCurveView.js +279 -279
  84. package/editor/view/prepareMeshLibrary.js +188 -188
  85. package/editor/view/shell/SceneTreePanelView.js +119 -119
  86. package/editor/view/v2/SplitView.js +2 -2
  87. package/package.json +94 -94
  88. package/samples/generation/generators/interactive/mir_generator_place_buff_objects.js +362 -362
  89. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +738 -738
  90. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +79 -79
  91. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +93 -93
  92. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +80 -80
  93. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +164 -164
  94. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +69 -69
  95. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +102 -102
  96. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +129 -129
  97. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +72 -72
  98. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +74 -74
  99. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +169 -169
  100. package/src/DUPLICATION_AUDIT_2026_08_07.md +254 -254
  101. package/src/DUPLICATION_AUDIT_REMEDIATION.md +250 -250
  102. package/src/REVIEW_2026_08_06/adv-core.md +511 -511
  103. package/src/REVIEW_2026_08_06/adv-gfx.md +480 -480
  104. package/src/REVIEW_2026_08_06/adv-view.md +446 -446
  105. package/src/REVIEW_2026_08_06/api-core.md +296 -296
  106. package/src/REVIEW_2026_08_06/api-engine.md +195 -195
  107. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +507 -507
  108. package/src/REVIEW_2026_08_06/core-binary.md +348 -348
  109. package/src/REVIEW_2026_08_06/core-collection.md +376 -376
  110. package/src/REVIEW_2026_08_06/core-math.md +221 -221
  111. package/src/REVIEW_2026_08_06/core-process.md +266 -266
  112. package/src/REVIEW_2026_08_06/core-science.md +223 -223
  113. package/src/REVIEW_2026_08_06/engine-ai-nav.md +279 -279
  114. package/src/REVIEW_2026_08_06/engine-animation.md +167 -167
  115. package/src/REVIEW_2026_08_06/engine-asset.md +166 -166
  116. package/src/REVIEW_2026_08_06/engine-ecs.md +920 -920
  117. package/src/REVIEW_2026_08_06/engine-input.md +197 -197
  118. package/src/REVIEW_2026_08_06/engine-misc.md +248 -248
  119. package/src/REVIEW_2026_08_06/engine-terrain.md +52 -52
  120. package/src/REVIEW_2026_08_06/generation.md +176 -176
  121. package/src/REVIEW_2026_08_06/geom-2d.md +434 -434
  122. package/src/REVIEW_2026_08_06/geom-3d.md +117 -117
  123. package/src/REVIEW_2026_08_06/gfx-gi.md +143 -143
  124. package/src/REVIEW_2026_08_06/gfx-render.md +740 -740
  125. package/src/REVIEW_2026_08_06/gfx-texture.md +690 -690
  126. package/src/REVIEW_2026_08_06/prior-criticals.md +49 -49
  127. package/src/REVIEW_2026_08_06/prior-highs.md +138 -138
  128. package/src/REVIEW_2026_08_06/test-gaps.md +364 -364
  129. package/src/REVIEW_2026_08_06/view.md +667 -667
  130. package/src/REVIEW_2026_08_06.md +610 -610
  131. package/src/avif/codec/dec/avif_dec.cpp +233 -233
  132. package/src/avif/codec/dec/avif_dec.js +16 -16
  133. package/src/avif/encoder_worker.js +5 -18
  134. package/src/core/binary/BitImage2.js +246 -246
  135. package/src/core/binary/align_32.js +21 -21
  136. package/src/core/binary/data_view/DataType2DataViewReaders.js +23 -23
  137. package/src/core/binary/data_view/DataType2DataViewWriters.js +25 -25
  138. package/src/core/binary/hash/XXH128Hash.js +55 -55
  139. package/src/core/binary/hash/XXH3_SECRET.js +25 -25
  140. package/src/core/binary/hash/xxh3_128.js +341 -341
  141. package/src/core/binary/hash/xxh3_64.js +241 -241
  142. package/src/core/binary/hash/xxh3_common.js +476 -476
  143. package/src/core/binary/lz4/LZ4_MAX_INPUT_SIZE.js +9 -9
  144. package/src/core/binary/lz4/lz4_compress_block.js +385 -385
  145. package/src/core/binary/lz4/lz4_compress_bound.js +25 -25
  146. package/src/core/binary/lz4/lz4_decompress_block.js +139 -139
  147. package/src/core/binary/lz4/lz4_decompress_bound.js +30 -30
  148. package/src/core/binary/meshopt/MESHOPT_GROUP_SIZE.js +18 -18
  149. package/src/core/binary/meshopt/MeshoptCompressionFilter.js +30 -30
  150. package/src/core/binary/meshopt/MeshoptCompressionMode.js +21 -21
  151. package/src/core/binary/meshopt/__meshopt_test_streams.js +237 -237
  152. package/src/core/binary/meshopt/meshopt_decode.js +73 -73
  153. package/src/core/binary/meshopt/meshopt_decode_byte_group.js +67 -67
  154. package/src/core/binary/meshopt/meshopt_decode_data_block.js +59 -59
  155. package/src/core/binary/meshopt/meshopt_decode_filter_color.js +69 -69
  156. package/src/core/binary/meshopt/meshopt_decode_filter_exponential.js +43 -43
  157. package/src/core/binary/meshopt/meshopt_decode_filter_octahedral.js +60 -60
  158. package/src/core/binary/meshopt/meshopt_decode_filter_quaternion.js +71 -71
  159. package/src/core/binary/meshopt/meshopt_decode_index_buffer.js +294 -294
  160. package/src/core/binary/meshopt/meshopt_decode_index_sequence.js +115 -115
  161. package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.js +381 -381
  162. package/src/core/binary/meshopt/meshopt_read_uint_var.js +59 -59
  163. package/src/core/binary/reinterpret_float32_as_uint32.js +13 -13
  164. package/src/core/binary/reinterpret_uint32_as_float32.js +14 -14
  165. package/src/core/binary/type/DataType2TypedArrayConstructorMapping.js +35 -35
  166. package/src/core/bvh2/bvh3/ebvh_geometry_query_any_triangle_ray.js +149 -149
  167. package/src/core/bvh2/bvh3/ebvh_sort_for_traversal_depth_first.js +96 -96
  168. package/src/core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.js +101 -101
  169. package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +77 -77
  170. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +90 -90
  171. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray_segment.js +94 -94
  172. package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +86 -86
  173. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_capsule.js +101 -101
  174. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_sphere.js +92 -92
  175. package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray.js +96 -96
  176. package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray_segment.js +100 -100
  177. package/src/core/bvh2/visual/BVHGeometry.js +131 -131
  178. package/src/core/bvh8/BVH8.js +436 -436
  179. package/src/core/bvh8/aabb3_round_to_float32.js +22 -22
  180. package/src/core/bvh8/build/BVH8Converter.js +588 -588
  181. package/src/core/bvh8/build/TriangleCluster.js +122 -122
  182. package/src/core/bvh8/build/aabb3_compute_merge_cost.js +28 -28
  183. package/src/core/bvh8/build/aabb3_from_triangle_by_index.js +17 -17
  184. package/src/core/bvh8/build/bvh8_build_for_geometry.js +303 -303
  185. package/src/core/bvh8/build/bvh8_from_proxy.js +256 -256
  186. package/src/core/bvh8/build/byte.js +9 -9
  187. package/src/core/bvh8/build/encode_bounds_e.js +11 -11
  188. package/src/core/bvh8/bvh8_convert_to_dot.js +132 -132
  189. package/src/core/bvh8/bvh8_count_primitives.js +98 -98
  190. package/src/core/bvh8/bvh8_geometry_validate.js +138 -138
  191. package/src/core/bvh8/bvh8_geometry_validate_indirect.js +166 -166
  192. package/src/core/bvh8/bvh8_get_node_bounds.js +34 -34
  193. package/src/core/bvh8/bvh8_get_node_child_bounds.js +52 -52
  194. package/src/core/bvh8/bvh8_node_child_surface_area.js +18 -18
  195. package/src/core/bvh8/bvh8_node_count_triangles.js +27 -27
  196. package/src/core/bvh8/bvh8_quality.js +72 -72
  197. package/src/core/bvh8/bvh8_validate_structure.js +87 -87
  198. package/src/core/clipboard/obtainClipBoard.js +29 -29
  199. package/src/core/clipboard/safeClipboardReadText.js +55 -55
  200. package/src/core/clipboard/safeClipboardWriteText.js +23 -23
  201. package/src/core/collection/array/typed/typed_array_value_denormalize.js +52 -52
  202. package/src/core/collection/array/typed/typed_array_value_normalize.js +51 -51
  203. package/src/core/collection/union-find/union_find.js +79 -79
  204. package/src/core/color/PQ/PQ_constants.d.ts +43 -0
  205. package/src/core/color/PQ/PQ_constants.d.ts.map +1 -0
  206. package/src/core/color/PQ/PQ_constants.js +50 -0
  207. package/src/core/color/PQ/PQ_to_linear.d.ts +24 -0
  208. package/src/core/color/PQ/PQ_to_linear.d.ts.map +1 -0
  209. package/src/core/color/PQ/PQ_to_linear.js +35 -0
  210. package/src/core/color/PQ/linear_to_PQ.d.ts +27 -0
  211. package/src/core/color/PQ/linear_to_PQ.d.ts.map +1 -0
  212. package/src/core/color/PQ/linear_to_PQ.js +32 -0
  213. package/src/core/color/YCoCg/rgb_to_ycocg.js +20 -20
  214. package/src/core/color/YCoCg/ycocg_to_rgb.js +17 -17
  215. package/src/core/color/colormap/MAGMA_LUT.js +26 -26
  216. package/src/core/color/illuminant/D65_TRISTIMULUS_XYZ.js +19 -19
  217. package/src/core/color/lab/lab_apply_hunt_adjustment.js +27 -27
  218. package/src/core/color/lab/lab_distance_hyab.js +23 -23
  219. package/src/core/color/lab/xyz_to_lab.js +62 -62
  220. package/src/core/color/operations/color_darken.js +24 -24
  221. package/src/core/color/operations/color_desaturate.js +24 -24
  222. package/src/core/color/operations/color_lighten.js +24 -24
  223. package/src/core/color/operations/color_saturate.js +24 -24
  224. package/src/core/color/operations/color_scale_okhsv_channel.js +45 -45
  225. package/src/core/color/tonemap/tonemap_aces.js +41 -41
  226. package/src/core/color/ycxcz/xyz_to_ycxcz.js +28 -28
  227. package/src/core/color/ycxcz/ycxcz_to_xyz.js +19 -19
  228. package/src/core/dom/isImageBitmap.js +12 -12
  229. package/src/core/function/frameThrottle.js +23 -23
  230. package/src/core/geom/2d/aabb/aabb2_array_combine.js +7 -7
  231. package/src/core/geom/2d/aabb/aabb2_compute_area.js +7 -7
  232. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.js +7 -7
  233. package/src/core/geom/2d/aabb/aabb2_compute_overlap.js +7 -7
  234. package/src/core/geom/2d/aabb/aabb2_from_v2_array.js +7 -7
  235. package/src/core/geom/2d/aabb/aabb2_intersects_point.js +7 -7
  236. package/src/core/geom/2d/aabb/aabb2_overlap_exists.js +7 -7
  237. package/src/core/geom/2d/circle/circle_compute_circle_intersection.js +7 -7
  238. package/src/core/geom/2d/circle/circle_compute_circle_penetration.js +7 -7
  239. package/src/core/geom/2d/circle/circle_intersects_point.js +7 -7
  240. package/src/core/geom/2d/compute_polygon_area_2d.js +7 -7
  241. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +7 -7
  242. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +7 -7
  243. package/src/core/geom/2d/convex-hull/orientation3_array.js +7 -7
  244. package/src/core/geom/2d/intersect_ray_2d.js +7 -7
  245. package/src/core/geom/2d/line/line2_distance_to_point_sqr.js +7 -7
  246. package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.js +44 -44
  247. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +7 -7
  248. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.js +7 -7
  249. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js +7 -7
  250. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js +7 -7
  251. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.js +7 -7
  252. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.js +7 -7
  253. package/src/core/geom/2d/line/segment2_intersects_segment2_2d.js +25 -25
  254. package/src/core/geom/2d/line/segment2_segment_compute_intersection_array_2d.js +46 -46
  255. package/src/core/geom/2d/line/segment2_segment_intersection_fractions.js +52 -52
  256. package/src/core/geom/2d/oriented-box/min_area_rect_2d.js +69 -69
  257. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +433 -433
  258. package/src/core/geom/2d/polygon/polygon2_clip_axis_halfplane.js +51 -51
  259. package/src/core/geom/2d/polygon/polygon2_clip_halfplane.js +50 -50
  260. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.js +84 -84
  261. package/src/core/geom/2d/polygon/polygon2_signed_area.js +52 -52
  262. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +86 -86
  263. package/src/core/geom/2d/polygon/polygon2_triangulate.js +1280 -1280
  264. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.js +77 -77
  265. package/src/core/geom/2d/quad-tree/qt_collect_by_circle.js +39 -39
  266. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.js +101 -101
  267. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +7 -7
  268. package/src/core/geom/2d/rectangle_to_aabb.js +7 -7
  269. package/src/core/geom/2d/spline_bezier2_2d.js +7 -7
  270. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +99 -99
  271. package/src/core/geom/2d/triangle/tri2_signed_area.js +35 -35
  272. package/src/core/geom/2d/triangle2d_compute_area.js +7 -7
  273. package/src/core/geom/2d/triangle2d_contains_point.js +7 -7
  274. package/src/core/geom/2d/triangle2d_get_barycentric.js +7 -7
  275. package/src/core/geom/2d/v2_morton_encode.js +23 -23
  276. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.js +7 -7
  277. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.js +7 -7
  278. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +5 -5
  279. package/src/core/geom/3d/aabb/aabb3_closest_point_on_surface.js +57 -57
  280. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.js +7 -7
  281. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.js +7 -7
  282. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.js +7 -7
  283. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.js +7 -7
  284. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +7 -7
  285. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +7 -7
  286. package/src/core/geom/3d/aabb/aabb3_from_threejs_geometry.js +7 -7
  287. package/src/core/geom/3d/aabb/aabb3_from_triangle_group.js +46 -46
  288. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.js +7 -7
  289. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.js +7 -7
  290. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +7 -7
  291. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.js +7 -7
  292. package/src/core/geom/3d/aabb/aabb3_ray_segment_entry_distance.js +95 -95
  293. package/src/core/geom/3d/aabb/aabb3_raycast.js +7 -7
  294. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +93 -93
  295. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.js +82 -82
  296. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +7 -7
  297. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +7 -7
  298. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +486 -486
  299. package/src/core/geom/3d/atlas/BFF_PLAN.md +174 -174
  300. package/src/core/geom/3d/atlas/Chart.js +77 -77
  301. package/src/core/geom/3d/atlas/REVIEW_02.md +392 -392
  302. package/src/core/geom/3d/atlas/atlas_bench_lib.js +315 -315
  303. package/src/core/geom/3d/atlas/atlas_chart_type.js +16 -16
  304. package/src/core/geom/3d/atlas/atlas_compute_charts.js +188 -188
  305. package/src/core/geom/3d/atlas/atlas_extract_chart.js +107 -107
  306. package/src/core/geom/3d/atlas/atlas_generate.js +50 -50
  307. package/src/core/geom/3d/atlas/atlas_test_fixtures.js +266 -266
  308. package/src/core/geom/3d/atlas/atlas_write_chart_uvs.js +36 -36
  309. package/src/core/geom/3d/atlas/data/atlas_build_edge_dihedrals.js +62 -62
  310. package/src/core/geom/3d/atlas/data/atlas_build_edge_lengths.js +33 -33
  311. package/src/core/geom/3d/atlas/data/atlas_build_face_areas.js +50 -50
  312. package/src/core/geom/3d/atlas/io/atlas_mesh_weld_colocals.js +39 -39
  313. package/src/core/geom/3d/atlas/io/bt_loop_uv.js +35 -35
  314. package/src/core/geom/3d/atlas/pack/ChartPlacement.js +46 -46
  315. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +269 -269
  316. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +209 -209
  317. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_ortho.js +38 -38
  318. package/src/core/geom/3d/atlas/param/atlas_chart_stretch_metric.js +86 -86
  319. package/src/core/geom/3d/atlas/param/atlas_piecewise_resegment.js +183 -183
  320. package/src/core/geom/3d/atlas/param/fit_plane_basis.js +66 -66
  321. package/src/core/geom/3d/atlas/segment/RegionGraph.js +40 -40
  322. package/src/core/geom/3d/atlas/segment/atlas_build_region_graph.js +136 -136
  323. package/src/core/geom/3d/atlas/segment/atlas_chart_roundness_delta.js +30 -30
  324. package/src/core/geom/3d/atlas/segment/atlas_compute_planar_regions.js +77 -77
  325. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +116 -116
  326. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.js +271 -271
  327. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.js +191 -191
  328. package/src/core/geom/3d/box/box3_projected_half_extent.js +35 -35
  329. package/src/core/geom/3d/capsule/capsule_intersects_aabb3_closed.js +67 -67
  330. package/src/core/geom/3d/capsule/capsule_intersects_aabb3_iterative.js +137 -137
  331. package/src/core/geom/3d/compute_circle_bounding_box.js +7 -7
  332. package/src/core/geom/3d/cone/computeConeBoundingBox.js +7 -7
  333. package/src/core/geom/3d/cone/computeConePlaneSide.js +7 -7
  334. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +7 -7
  335. package/src/core/geom/3d/cylinder/cylinder3_raycast.d.ts +38 -0
  336. package/src/core/geom/3d/cylinder/cylinder3_raycast.d.ts.map +1 -0
  337. package/src/core/geom/3d/cylinder/cylinder3_raycast.js +105 -0
  338. package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.js +18 -18
  339. package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.js +24 -24
  340. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.js +7 -7
  341. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +7 -7
  342. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +117 -117
  343. package/src/core/geom/3d/frustum/frustum_matrix4_project.js +7 -7
  344. package/src/core/geom/3d/frustum/hexahedron_from_aabb.js +7 -7
  345. package/src/core/geom/3d/frustum/read_frustum_corner.js +17 -17
  346. package/src/core/geom/3d/frustum/read_three_planes_to_array.js +7 -7
  347. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.js +7 -7
  348. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +146 -146
  349. package/src/core/geom/3d/gjk/gjk.js +430 -430
  350. package/src/core/geom/3d/gjk/gjk_epa_penetration.js +520 -520
  351. package/src/core/geom/3d/gjk/minkowski_support.js +71 -71
  352. package/src/core/geom/3d/gjk/mpr.js +368 -368
  353. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +7 -7
  354. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +7 -7
  355. package/src/core/geom/3d/line/line3_compute_point_segment_point_distance_unfolded.js +64 -64
  356. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +153 -153
  357. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js +7 -7
  358. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js +7 -7
  359. package/src/core/geom/3d/line/line3_compute_segment_segment_closest_points.js +88 -88
  360. package/src/core/geom/3d/line/line3_segment_segment_closest_point_pair.js +71 -71
  361. package/src/core/geom/3d/line/segment3_point_distance_to_segments.js +25 -25
  362. package/src/core/geom/3d/mat4/allocate_m4.js +7 -7
  363. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.js +7 -7
  364. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.js +7 -7
  365. package/src/core/geom/3d/mat4/compose_matrix4_array.js +7 -7
  366. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +7 -7
  367. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +7 -7
  368. package/src/core/geom/3d/mat4/m4_compose.js +22 -22
  369. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.js +7 -7
  370. package/src/core/geom/3d/mat4/m4_decompose.js +64 -64
  371. package/src/core/geom/3d/mat4/m4_decompose_array.js +157 -157
  372. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.js +32 -32
  373. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.js +67 -67
  374. package/src/core/geom/3d/mat4/m4_linear_matrix3.js +29 -29
  375. package/src/core/geom/3d/mat4/m4_look_at.js +96 -96
  376. package/src/core/geom/3d/mat4/m4_make_rotation_x.js +47 -47
  377. package/src/core/geom/3d/mat4/m4_make_rotation_y.js +47 -47
  378. package/src/core/geom/3d/mat4/m4_make_rotation_z.js +47 -47
  379. package/src/core/geom/3d/mat4/m4_normal_matrix3.js +39 -39
  380. package/src/core/geom/3d/mat4/m4_perspective.js +66 -66
  381. package/src/core/geom/3d/mat4/m4_transpose.js +48 -48
  382. package/src/core/geom/3d/morton/mortonEncode_LUT.js +7 -7
  383. package/src/core/geom/3d/morton/mortonEncode_magicbits.js +7 -7
  384. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.js +5 -5
  385. package/src/core/geom/3d/normal/hemioct/encode_unit_to_hemioct.js +28 -28
  386. package/src/core/geom/3d/normal/lambert_azimuth/decode_azimuth_to_unit.js +30 -30
  387. package/src/core/geom/3d/normal/lambert_azimuth/encode_unit_to_azimuth.js +19 -19
  388. package/src/core/geom/3d/normal/spherical/decode_spheremap_to_unit.js +38 -38
  389. package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.js +30 -30
  390. package/src/core/geom/3d/plane/is_point_within_planes.js +7 -7
  391. package/src/core/geom/3d/plane/orient3d_fast_point.js +47 -47
  392. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +7 -7
  393. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +7 -7
  394. package/src/core/geom/3d/plane/plane3_intersect_plane.js +7 -7
  395. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js +7 -7
  396. package/src/core/geom/3d/point/point3_raycast.d.ts +33 -0
  397. package/src/core/geom/3d/point/point3_raycast.d.ts.map +1 -0
  398. package/src/core/geom/3d/point/point3_raycast.js +47 -0
  399. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +60 -60
  400. package/src/core/geom/3d/polygon/polygon3_triangulate.js +94 -94
  401. package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.d.ts +40 -0
  402. package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.d.ts.map +1 -0
  403. package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.js +94 -0
  404. package/src/core/geom/3d/quadric/QUADRIC3_SIZE.js +14 -14
  405. package/src/core/geom/3d/quadric/Quadric3.js +282 -282
  406. package/src/core/geom/3d/quadric/quadric3_add.js +33 -33
  407. package/src/core/geom/3d/quadric/quadric3_clear.js +25 -25
  408. package/src/core/geom/3d/quadric/quadric3_copy.js +27 -27
  409. package/src/core/geom/3d/quadric/quadric3_distance.js +36 -36
  410. package/src/core/geom/3d/quadric/quadric3_evaluate.js +25 -25
  411. package/src/core/geom/3d/quadric/quadric3_optimize.js +45 -45
  412. package/src/core/geom/3d/quadric/quadric3_scale.js +32 -32
  413. package/src/core/geom/3d/quadric/quadric3_set_from_plane_through_point.js +30 -30
  414. package/src/core/geom/3d/quadric/quadric3_set_from_vector4.js +35 -35
  415. package/src/core/geom/3d/quadric/quadric3_sub.js +36 -36
  416. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3.js +28 -28
  417. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.js +56 -56
  418. package/src/core/geom/3d/quadric/quadric3_to_vector3.js +19 -19
  419. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.js +7 -7
  420. package/src/core/geom/3d/quaternion/quat3_integrate.js +62 -62
  421. package/src/core/geom/3d/quaternion/quat3_multiply.js +31 -31
  422. package/src/core/geom/3d/quaternion/quat3_nlerp.js +72 -72
  423. package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +69 -69
  424. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.js +7 -7
  425. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +7 -7
  426. package/src/core/geom/3d/ray/ray3_array_compose.js +7 -7
  427. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.js +7 -7
  428. package/src/core/geom/3d/ray/ray3_distance_to_point.js +7 -7
  429. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.js +7 -7
  430. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts +17 -0
  431. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  432. package/src/core/geom/3d/shape/ConvexHullShape3D.js +43 -0
  433. package/src/core/geom/3d/shape/CylinderShape3D.d.ts +1 -0
  434. package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
  435. package/src/core/geom/3d/shape/CylinderShape3D.js +21 -0
  436. package/src/core/geom/3d/shape/PointShape3D.d.ts +7 -0
  437. package/src/core/geom/3d/shape/PointShape3D.d.ts.map +1 -1
  438. package/src/core/geom/3d/shape/PointShape3D.js +88 -63
  439. package/src/core/geom/3d/shape/PosedShape3D.d.ts +6 -0
  440. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  441. package/src/core/geom/3d/shape/PosedShape3D.js +27 -0
  442. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +10 -0
  443. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  444. package/src/core/geom/3d/shape/TransformedShape3D.js +13 -0
  445. package/src/core/geom/3d/shape/Triangle3D.d.ts +1 -0
  446. package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -1
  447. package/src/core/geom/3d/shape/Triangle3D.js +26 -0
  448. package/src/core/geom/3d/shape/UnionShape3D.d.ts +6 -0
  449. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  450. package/src/core/geom/3d/shape/UnionShape3D.js +7 -0
  451. package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -45
  452. package/src/core/geom/3d/shape/UnitSphereShape3D.js +44 -44
  453. package/src/core/geom/3d/shape/shape3_mesh_from_geometry.js +64 -64
  454. package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +7 -7
  455. package/src/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +51 -51
  456. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +7 -7
  457. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.js +7 -7
  458. package/src/core/geom/3d/sphere/harmonics/sh3_convolve_with_zh.js +53 -53
  459. package/src/core/geom/3d/sphere/harmonics/sh3_ggx_zh.js +30 -30
  460. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.js +7 -7
  461. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.js +7 -7
  462. package/src/core/geom/3d/sphere/sphere_array_intersects_point.js +7 -7
  463. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.js +7 -7
  464. package/src/core/geom/3d/sphere/sphere_intersects_point.js +7 -7
  465. package/src/core/geom/3d/sphere/sphere_matrix4_transform.js +5 -5
  466. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +7 -7
  467. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js +7 -7
  468. package/src/core/geom/3d/sphere/spherical_from_cartesian.js +7 -7
  469. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +174 -174
  470. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +7 -7
  471. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.js +7 -7
  472. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.js +7 -7
  473. package/src/core/geom/3d/tetrahedra/graphics/build_tetrahedral_mesh_geometry.js +39 -39
  474. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.js +48 -48
  475. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +173 -173
  476. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.js +22 -22
  477. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -146
  478. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -232
  479. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -255
  480. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +387 -387
  481. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +140 -140
  482. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +7 -7
  483. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +97 -97
  484. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -66
  485. package/src/core/geom/3d/tetrahedra/triangle/triangle_decode_depth.js +59 -59
  486. package/src/core/geom/3d/tetrahedra/triangle/triangle_rasterized_depth_sample_index.js +54 -54
  487. package/src/core/geom/3d/tetrahedra/validate_neighbour.js +70 -70
  488. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +314 -314
  489. package/src/core/geom/3d/topology/struct/binary/BinaryDataLayer.js +364 -364
  490. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +567 -567
  491. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +1085 -1085
  492. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +73 -73
  493. package/src/core/geom/3d/topology/struct/binary/io/bt_loop_kill.js +35 -35
  494. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_append.js +119 -119
  495. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +84 -84
  496. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +172 -172
  497. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +56 -56
  498. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js +7 -7
  499. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +227 -227
  500. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +161 -161
  501. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_island_erode.js +490 -490
  502. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +120 -120
  503. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js +120 -120
  504. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_collapse.js +52 -52
  505. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +115 -115
  506. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_flip.js +142 -142
  507. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -21
  508. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +92 -92
  509. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_split.js +179 -179
  510. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_swap_vertex_slots.js +28 -28
  511. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_kill_only_edge.js +8 -8
  512. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js +83 -83
  513. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +89 -89
  514. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_kill.js +25 -25
  515. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +127 -127
  516. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.js +268 -268
  517. package/src/core/geom/3d/topology/struct/binary/io/face/bt_kill_only_face.js +8 -8
  518. package/src/core/geom/3d/topology/struct/binary/io/face/bt_mesh_kill_degenerate_faces.js +72 -72
  519. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.js +7 -7
  520. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.js +7 -7
  521. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js +48 -48
  522. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.js +256 -256
  523. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_vertex_merge_distance.js +77 -77
  524. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.js +7 -7
  525. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.js +7 -7
  526. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +148 -148
  527. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_kill_only.js +7 -7
  528. package/src/core/geom/3d/topology/struct/binary/query/bt_collect_boundary_segments.js +29 -29
  529. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_breaks_link_condition.js +107 -107
  530. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_flip_is_legal.js +41 -41
  531. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_flip_would_fold.js +120 -120
  532. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -42
  533. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_is_boundary.js +20 -20
  534. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_other_face.d.ts +32 -0
  535. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_other_face.d.ts.map +1 -0
  536. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_other_face.js +59 -0
  537. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_read_diamond.js +96 -96
  538. package/src/core/geom/3d/topology/struct/binary/query/bt_face_compute_newell_normal.js +72 -72
  539. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.js +7 -7
  540. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces.js +39 -39
  541. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.js +93 -93
  542. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.js +7 -7
  543. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_shared_loop.js +48 -48
  544. package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.js +45 -45
  545. package/src/core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js +66 -66
  546. package/src/core/geom/3d/topology/struct/binary/query/bt_face_third_vertex.d.ts +26 -0
  547. package/src/core/geom/3d/topology/struct/binary/query/bt_face_third_vertex.d.ts.map +1 -0
  548. package/src/core/geom/3d/topology/struct/binary/query/bt_face_third_vertex.js +55 -0
  549. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.js +7 -7
  550. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.js +44 -44
  551. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js +32 -32
  552. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_compute_face_islands.js +53 -53
  553. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +703 -703
  554. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +181 -181
  555. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +133 -133
  556. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +82 -82
  557. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js +599 -599
  558. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -108
  559. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +7 -7
  560. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +7 -7
  561. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +7 -7
  562. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +7 -7
  563. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +7 -7
  564. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js +7 -7
  565. package/src/core/geom/3d/triangle/compute_triangle_area_3d.js +7 -7
  566. package/src/core/geom/3d/triangle/compute_triangle_normal.js +7 -7
  567. package/src/core/geom/3d/triangle/rayTriangleIntersection.js +7 -7
  568. package/src/core/geom/3d/triangle/tri3_closest_point.js +65 -65
  569. package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.js +171 -171
  570. package/src/core/geom/3d/triangle/tri3_flatten_isometric.js +79 -79
  571. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +160 -160
  572. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.js +96 -96
  573. package/src/core/geom/3d/triangle/tri3_raycast.d.ts +42 -0
  574. package/src/core/geom/3d/triangle/tri3_raycast.d.ts.map +1 -0
  575. package/src/core/geom/3d/triangle/tri3_raycast.js +94 -0
  576. package/src/core/geom/3d/triangle/triangle3_incenter.js +7 -7
  577. package/src/core/geom/3d/triangle/triangle_compute_plane_side.js +7 -7
  578. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.js +7 -7
  579. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.js +7 -7
  580. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +7 -7
  581. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +7 -7
  582. package/src/core/geom/3d/util/make_justified_point_grid.js +7 -7
  583. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +381 -381
  584. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +684 -684
  585. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +554 -554
  586. package/src/core/geom/mat3/m3_cm_from_translation.js +7 -7
  587. package/src/core/geom/mat3/m3_cm_invert.js +7 -7
  588. package/src/core/geom/mat3/m3_make_rotation.js +5 -5
  589. package/src/core/geom/mat3/m3_make_rotation_TBN.js +31 -31
  590. package/src/core/geom/mat3/m3_multiply_vec3.js +7 -7
  591. package/src/core/geom/packing/computeBoundingSphereOfSpheres.js +7 -7
  592. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.js +7 -7
  593. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.js +7 -7
  594. package/src/core/geom/packing/max-rect/cutArea.js +7 -7
  595. package/src/core/geom/packing/max-rect/findBestContainer.js +7 -7
  596. package/src/core/geom/packing/max-rect/packMaxRectangles.js +7 -7
  597. package/src/core/geom/packing/max-rect/packOneBox.js +7 -7
  598. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +7 -7
  599. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.js +7 -7
  600. package/src/core/geom/random/randomPointInBox.js +7 -7
  601. package/src/core/geom/random/randomPointInCircle.js +7 -7
  602. package/src/core/geom/random/randomPointInPoint.js +7 -7
  603. package/src/core/geom/random/randomPointInSphere.js +7 -7
  604. package/src/core/geom/random/randomPointOnBox.js +7 -7
  605. package/src/core/geom/random/randomPointOnSphere.js +7 -7
  606. package/src/core/geom/random/random_orthonormal_basis.js +31 -31
  607. package/src/core/geom/vec/vector_axpy.js +15 -15
  608. package/src/core/geom/vec/vector_axpy_offset.js +20 -20
  609. package/src/core/geom/vec/vector_copy.js +7 -7
  610. package/src/core/geom/vec/vector_dot_offset.js +25 -25
  611. package/src/core/geom/vec/vector_scale_array.js +7 -7
  612. package/src/core/geom/vec2/v2_rotate.js +21 -21
  613. package/src/core/geom/vec2/v2_rotate_cos_sin.js +21 -21
  614. package/src/core/geom/vec3/v3_angle_atan2_between.js +7 -7
  615. package/src/core/geom/vec3/v3_angle_between.js +7 -7
  616. package/src/core/geom/vec3/v3_angle_cos_between.js +7 -7
  617. package/src/core/geom/vec3/v3_array_add_in_place.js +7 -7
  618. package/src/core/geom/vec3/v3_array_centroid.js +7 -7
  619. package/src/core/geom/vec3/v3_array_copy.js +7 -7
  620. package/src/core/geom/vec3/v3_array_displace_in_direction.js +7 -7
  621. package/src/core/geom/vec3/v3_array_equals.js +7 -7
  622. package/src/core/geom/vec3/v3_array_immediate_add.js +7 -7
  623. package/src/core/geom/vec3/v3_array_matrix4_rotate.js +7 -7
  624. package/src/core/geom/vec3/v3_array_normalize.js +7 -7
  625. package/src/core/geom/vec3/v3_array_scale.js +7 -7
  626. package/src/core/geom/vec3/v3_compute_interior_angle.js +7 -7
  627. package/src/core/geom/vec3/v3_cotangent.js +33 -33
  628. package/src/core/geom/vec3/v3_dot_array_array.js +7 -7
  629. package/src/core/geom/vec3/v3_matrix3_multiply.js +30 -30
  630. package/src/core/geom/vec3/v3_matrix3_rotate.js +49 -49
  631. package/src/core/geom/vec3/v3_matrix4_rotate.js +7 -7
  632. package/src/core/geom/vec3/v3_multiply.js +23 -23
  633. package/src/core/geom/vec3/v3_multiply_scalar.js +7 -7
  634. package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.js +49 -49
  635. package/src/core/geom/vec3/v3_quat3_apply.js +7 -7
  636. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +7 -7
  637. package/src/core/geom/vec3/v3_quaternion_apply.js +39 -39
  638. package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +41 -41
  639. package/src/core/geom/vec3/v3_reflect.js +24 -24
  640. package/src/core/geom/vec3/v3_scale_array.js +18 -18
  641. package/src/core/geom/vec3/v3_triple_cross.js +45 -45
  642. package/src/core/geom/vec3/v3_triple_cross_product.js +7 -7
  643. package/src/core/geom/vec3/v3_uniform_sample_cone.js +21 -21
  644. package/src/core/geom/vec4/v4_multiply_mat4.js +7 -7
  645. package/src/core/graph/csr/csr_graph_build_distance_field.js +112 -112
  646. package/src/core/graph/csr/csr_graph_find_edge.js +25 -25
  647. package/src/core/graph/csr/csr_graph_find_shortest_path.js +105 -105
  648. package/src/core/graph/csr/csr_graph_from_undirected_edge_list.js +94 -94
  649. package/src/core/graph/graph_k_means_cluster.js +250 -250
  650. package/src/core/graph/layout/CircleLayout.js +1 -1
  651. package/src/core/graph/layout/box/BoxLayouter.js +1 -1
  652. package/src/core/graph/layout/graph_peel_topological_layer.js +45 -45
  653. package/src/core/graph/metis/BinaryTopologyFaceGraph.js +49 -49
  654. package/src/core/graph/metis/bt_mesh_build_face_graph.js +111 -111
  655. package/src/core/graph/metis/cluster_mesh_metis.js +137 -137
  656. package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -100
  657. package/src/core/graph/metis/native/bisection/compute_2way_params.js +86 -86
  658. package/src/core/graph/metis/native/bisection/fm_2way.js +297 -297
  659. package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -137
  660. package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -119
  661. package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -94
  662. package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -158
  663. package/src/core/graph/metis/native/coarsen/match_shem.js +175 -175
  664. package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -122
  665. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -170
  666. package/src/core/graph/metis/native/metis_partition_kway.js +126 -126
  667. package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -53
  668. package/src/core/graph/metis/native/refine/fm_kway.js +487 -487
  669. package/src/core/graph/metis/native/refine/project_kway.js +43 -43
  670. package/src/core/graph/metis/native/refine/refine_kway.js +43 -43
  671. package/src/core/lang/reactive/pegjs/parser.js +3458 -3458
  672. package/src/core/math/complex/complex_horner_eval.js +31 -31
  673. package/src/core/math/computeWholeDivisorLow.js +33 -33
  674. package/src/core/math/f32_next_down.js +24 -24
  675. package/src/core/math/f32_next_up.js +27 -27
  676. package/src/core/math/hash/hash_mix2.js +22 -22
  677. package/src/core/math/hash/hash_mix3.js +19 -19
  678. package/src/core/math/linalg/cg/cg_solve.js +106 -106
  679. package/src/core/math/linalg/cg/cg_solve_normal_equations.js +59 -59
  680. package/src/core/math/linalg/cubic_residual_times_derivative_accumulate.js +43 -43
  681. package/src/core/math/linalg/eigen/matrix_householder_in_place.js +122 -122
  682. package/src/core/math/linalg/eigen/matrix_qr_in_place.js +190 -190
  683. package/src/core/math/linalg/eigen/matrix_symmetric_3x3_eigen.js +117 -117
  684. package/src/core/math/linalg/givens/givens_apply_rows.js +28 -28
  685. package/src/core/math/linalg/givens/givens_apply_rows_offset.js +30 -30
  686. package/src/core/math/linalg/givens/givens_rotation_coefficients.js +39 -39
  687. package/src/core/math/linalg/lu_factor_linear_system.js +108 -108
  688. package/src/core/math/linalg/lu_solve_linear_system.js +53 -53
  689. package/src/core/math/linalg/polynomial_add_into.js +29 -29
  690. package/src/core/math/linalg/polynomial_complex_roots_aberth_ehrlich.js +159 -159
  691. package/src/core/math/linalg/polynomial_cubic_derivative_eval.js +16 -16
  692. package/src/core/math/linalg/polynomial_cubic_horner_eval.js +19 -19
  693. package/src/core/math/linalg/polynomial_cubic_second_derivative_eval.js +14 -14
  694. package/src/core/math/linalg/polynomial_multiply.js +41 -41
  695. package/src/core/math/linalg/polynomial_real_roots_in_interval.js +211 -211
  696. package/src/core/math/linalg/polynomial_root_bound_cauchy.js +30 -30
  697. package/src/core/math/linalg/polynomial_scale_into.js +17 -17
  698. package/src/core/math/linalg/polynomial_sub_into.js +29 -29
  699. package/src/core/math/linalg/solve_linear_system_GEPP_2x2.js +96 -96
  700. package/src/core/math/linalg/sor_optimal_omega.js +42 -42
  701. package/src/core/math/linalg/sparse/SparseMatrixCSR.js +88 -88
  702. package/src/core/math/linalg/sparse/spm_matvec.js +22 -22
  703. package/src/core/math/linalg/sparse/spm_matvec_transpose.js +29 -29
  704. package/src/core/math/lookup/LUT_HEATMAP.js +30 -30
  705. package/src/core/math/lookup/ParameterLookupTable.js +495 -495
  706. package/src/core/math/lookup/ParameterLookupTableFlags.js +6 -6
  707. package/src/core/math/noise/curl_noise_3d.js +18 -18
  708. package/src/core/math/physics/brdf/cone_cosine_from_roughness.js +28 -28
  709. package/src/core/math/physics/brdf/reflection_sample_weight.js +48 -48
  710. package/src/core/math/physics/kinematics/computeInterceptPoint.js +79 -79
  711. package/src/core/math/random/randomSeed.js +16 -16
  712. package/src/core/math/random/random_pick_weighted_index.js +26 -26
  713. package/src/core/math/round_half_away_from_zero.js +13 -13
  714. package/src/core/math/spline/spline3_hermite_apply_transform.js +107 -107
  715. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_1d.js +125 -125
  716. package/src/core/math/spline/spline3_hermite_intersects_spline3_hermite.js +50 -50
  717. package/src/core/math/spline/spline3_hermite_reverse.js +49 -49
  718. package/src/core/math/spline/spline3_hermite_to_monomial.js +37 -37
  719. package/src/core/math/statistics/hammersley_sequence.js +53 -53
  720. package/src/core/model/reactive/model/util/createRandomReactiveExpression.js +185 -185
  721. package/src/core/path/convertPathToURL.js +107 -107
  722. package/src/core/process/delay.js +16 -16
  723. package/src/core/science/units/MEASUREMENT_UNITS_SCIENTIFIC.js +87 -87
  724. package/src/core/science/units/MEASUREMENT_UNITS_SI.js +17 -17
  725. package/src/core/science/units/NamedUnit.js +48 -48
  726. package/src/core/science/units/UNIT_DIMENSION_MAPPING.js +29 -29
  727. package/src/core/science/units/UnitDimension.js +28 -28
  728. package/src/core/science/units/format_quantity.js +74 -74
  729. package/src/core/science/units/magnitude_prefix.js +127 -127
  730. package/src/core/science/units/si/AMPERE.js +13 -13
  731. package/src/core/science/units/si/CANDELA.js +13 -13
  732. package/src/core/science/units/si/DIMENSIONLESS.js +14 -14
  733. package/src/core/science/units/si/KELVIN.js +13 -13
  734. package/src/core/science/units/si/KILOGRAM.js +13 -13
  735. package/src/core/science/units/si/METER.js +13 -13
  736. package/src/core/science/units/si/MOLE.js +13 -13
  737. package/src/core/science/units/si/SECOND.js +13 -13
  738. package/src/core/science/units/si/derived/BECQUEREL.js +16 -16
  739. package/src/core/science/units/si/derived/COULOMB.js +13 -13
  740. package/src/core/science/units/si/derived/FARAD.js +13 -13
  741. package/src/core/science/units/si/derived/GRAY.js +16 -16
  742. package/src/core/science/units/si/derived/HENRY.js +13 -13
  743. package/src/core/science/units/si/derived/HERTZ.js +16 -16
  744. package/src/core/science/units/si/derived/JOULE.js +13 -13
  745. package/src/core/science/units/si/derived/KATAL.js +13 -13
  746. package/src/core/science/units/si/derived/LUMEN.js +14 -14
  747. package/src/core/science/units/si/derived/LUX.js +13 -13
  748. package/src/core/science/units/si/derived/NEWTON.js +13 -13
  749. package/src/core/science/units/si/derived/OHM.js +13 -13
  750. package/src/core/science/units/si/derived/PASCAL.js +13 -13
  751. package/src/core/science/units/si/derived/SIEMENS.js +13 -13
  752. package/src/core/science/units/si/derived/SIEVERT.js +16 -16
  753. package/src/core/science/units/si/derived/TESLA.js +13 -13
  754. package/src/core/science/units/si/derived/VOLT.js +13 -13
  755. package/src/core/science/units/si/derived/WATT.js +13 -13
  756. package/src/core/science/units/si/derived/WEBER.js +13 -13
  757. package/src/core/science/units/unit_matrix_to_string.js +403 -403
  758. package/src/engine/Engine.js +726 -726
  759. package/src/engine/EngineHarness.js +590 -590
  760. package/src/engine/REVIEW_2026_07_03.md +211 -211
  761. package/src/engine/animation/AnimatedActions.js +81 -81
  762. package/src/engine/animation/AnimationUtils.js +252 -252
  763. package/src/engine/animation/async/TimeSeries.js +300 -300
  764. package/src/engine/animation/curve/animation_curve_binary_codec.js +60 -60
  765. package/src/engine/animation/curve/draw/canvas_point_to_curve.js +22 -22
  766. package/src/engine/animation/curve/draw/curve_point_to_canvas.js +38 -38
  767. package/src/engine/animation/curve/draw/position_canvas_to_curve.js +22 -22
  768. package/src/engine/animation/curve/draw/position_curve_to_canvas.js +22 -22
  769. package/src/engine/asset/GameAssetType.d.ts +0 -1
  770. package/src/engine/asset/GameAssetType.js +0 -1
  771. package/src/engine/asset/load_model_scene_bundle.js +27 -27
  772. package/src/engine/asset/loaders/font/FontAsset.js +21 -21
  773. package/src/engine/asset/loaders/font/FontAssetLoader.js +20 -20
  774. package/src/engine/asset/loaders/gltf_test_fixtures.js +358 -358
  775. package/src/engine/asset/loaders/image/ImageBitmapAssetLoader.js +52 -52
  776. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +94 -94
  777. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.js +59 -59
  778. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +55 -55
  779. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.js +74 -74
  780. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +34 -34
  781. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +46 -46
  782. package/src/engine/control/first-person/DESIGN.md +640 -640
  783. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -563
  784. package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -134
  785. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2045 -2045
  786. package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -30
  787. package/src/engine/control/first-person/math/Spring.js +71 -71
  788. package/src/engine/control/first-person/math/computeJumpFromApex.js +23 -23
  789. package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -41
  790. package/src/engine/control/first-person/math/computeMassRatios.js +44 -44
  791. package/src/engine/control/first-person/math/criticallyDampedSpring.js +34 -34
  792. package/src/engine/control/first-person/math/dampedSpringStep.js +72 -72
  793. package/src/engine/control/first-person/math/jumpDynamics.js +108 -108
  794. package/src/engine/control/first-person/math/stepTowards.js +20 -20
  795. package/src/engine/control/first-person/pose/FirstPersonPose.js +137 -137
  796. package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -27
  797. package/src/engine/control/first-person/test/buildTestPlayer.js +36 -36
  798. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +531 -531
  799. package/src/engine/ecs/EntityManager.d.ts +7 -3
  800. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  801. package/src/engine/ecs/EntityManager.js +10 -5
  802. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  803. package/src/engine/ecs/async/SystemWorkerHost.js +329 -329
  804. package/src/engine/ecs/async/SystemWorkerLoopback.js +143 -143
  805. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +246 -246
  806. package/src/engine/ecs/async/WorkerSystem.js +702 -702
  807. package/src/engine/ecs/async/WorkerSystemProtocol.js +150 -150
  808. package/src/engine/ecs/fow/FogOfWar.js +707 -707
  809. package/src/engine/ecs/fow/FogOfWarEdgeMode.js +40 -40
  810. package/src/engine/ecs/fow/fog_of_war_mask_world_bounds.js +24 -24
  811. package/src/engine/ecs/fow/fog_of_war_uv_transform.js +30 -30
  812. package/src/engine/ecs/gui/hud/testHudEdgeStick.js +132 -134
  813. package/src/engine/ecs/hierarchy/EntityChildIndex.js +140 -140
  814. package/src/engine/ecs/ik/IKProblem.js +42 -42
  815. package/src/engine/ecs/ik/InverseKinematicsSystem.js +193 -193
  816. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +134 -134
  817. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +97 -97
  818. package/src/engine/ecs/ik/ik_bone_chain.js +85 -85
  819. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +119 -119
  820. package/src/engine/ecs/parent/EntityNode.d.ts +1 -1
  821. package/src/engine/ecs/parent/EntityNode.js +2 -2
  822. package/src/engine/ecs/parent/ParentEntitySystem.js +255 -255
  823. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  824. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  825. package/src/engine/ecs/speaker/VoiceSystem.js +13 -7
  826. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +269 -269
  827. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +315 -315
  828. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectSerializer.js +331 -331
  829. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +199 -199
  830. package/src/engine/ecs/storage/binary/object-v2/ObjectBinaryFormat.js +57 -57
  831. package/src/engine/ecs/storage/binary/object-v2/ObjectSerializationAdapter.js +56 -56
  832. package/src/engine/ecs/storage/binary/object-v2/README.md +110 -110
  833. package/src/engine/ecs/storage/binary/object-v2/objectStringCodec.js +48 -48
  834. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +44 -44
  835. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  836. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +5 -1
  837. package/src/engine/ecs/terrain/TerrainClouds.js +97 -97
  838. package/src/engine/ecs/terrain/ecs/StubTerrainBuildWorker.js +65 -65
  839. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +4 -0
  840. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  841. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  842. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +209 -209
  843. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +316 -316
  844. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +416 -416
  845. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +525 -525
  846. package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +302 -302
  847. package/src/engine/ecs/terrain/tiles/TerrainTile.js +561 -561
  848. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +896 -896
  849. package/src/engine/ecs/terrain/tiles/tile_geometry_to_meshlets.js +36 -36
  850. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  851. package/src/engine/ecs/transform/Transform64.js +814 -814
  852. package/src/engine/ecs/transform/t64_copy_from_transform.js +35 -35
  853. package/src/engine/ecs/transform/t64_equals_transform.js +55 -55
  854. package/src/engine/ecs/transform/t64_look_rotation.js +36 -36
  855. package/src/engine/ecs/transform/t64_transform_direction.js +25 -25
  856. package/src/engine/ecs/transform/transform_copy_from_t64.js +28 -28
  857. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +345 -345
  858. package/src/engine/ecs/transform-attachment/transform_attachment_find_descendant_by_name.js +65 -65
  859. package/src/engine/ecs/transform-attachment/transform_attachment_parent_of.js +24 -24
  860. package/src/engine/ecs/util/hideEntityGracefully.js +208 -208
  861. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +446 -446
  862. package/src/engine/graphics/FULL_SCREEN_QUAD_VERTEX_SHADER.js +14 -14
  863. package/src/engine/graphics/FrameThrottle.js +2 -2
  864. package/src/engine/graphics/ecs/animation/animator/graph/AnimationState.js +207 -207
  865. package/src/engine/graphics/ecs/animation/animator/graph/AnimationTransition.js +151 -151
  866. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +22 -22
  867. package/src/engine/graphics/ecs/camera/Camera.js +165 -165
  868. package/src/engine/graphics/ecs/camera/camera_active_frustum.js +25 -25
  869. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  870. package/src/engine/graphics/ecs/camera/camera_traverse_active.js +18 -18
  871. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +170 -170
  872. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.js +68 -68
  873. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +296 -296
  874. package/src/engine/graphics/ecs/decal/v2/Decal.js +220 -220
  875. package/src/engine/graphics/ecs/decal/v2/DecalSerializationAdapter.js +56 -56
  876. package/src/engine/graphics/ecs/decal/v2/DecalSerializationUpgrader_0_1.js +38 -38
  877. package/src/engine/graphics/ecs/light/shadow/compute_view_frustum_aabb_in_space.js +62 -62
  878. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.js +77 -77
  879. package/src/engine/graphics/ecs/make_bvh_depth_range_computer.js +33 -33
  880. package/src/engine/graphics/ecs/mesh-v2/DeferredBoundsQueue.js +88 -88
  881. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  882. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.js +303 -303
  883. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshSystem.d.ts +1 -1
  884. package/src/engine/graphics/ecs/mesh-v2/aggregate/serialization/SGMeshSerializationAdapter.js +39 -39
  885. package/src/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.js +36 -36
  886. package/src/engine/graphics/ecs/path/tube/build/GeometryStream.js +94 -94
  887. package/src/engine/graphics/ecs/path/tube/build/build_stream_catmullrom.js +310 -310
  888. package/src/engine/graphics/ecs/path/tube/build/build_stream_linear.js +73 -73
  889. package/src/engine/graphics/ecs/path/tube/build/computeFrenetFrames.js +199 -199
  890. package/src/engine/graphics/ecs/path/tube/build/makeTubeStream.js +217 -217
  891. package/src/engine/graphics/ecs/path/tube/build/make_cap.js +340 -340
  892. package/src/engine/graphics/ecs/path/tube/build/make_ring_faces.js +40 -40
  893. package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +153 -153
  894. package/src/engine/graphics/ecs/render_layers_compute_depth_range.js +64 -64
  895. package/src/engine/graphics/ecs/trail3d/Trail3D.js +483 -483
  896. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +26 -26
  897. package/src/engine/graphics/ecs/trail3d/advance_trail.js +42 -42
  898. package/src/engine/graphics/ecs/trail3d/make_gradient_stroke.js +58 -58
  899. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +90 -90
  900. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +75 -75
  901. package/src/engine/graphics/ecs/trail3d/trail_head_position.js +19 -19
  902. package/src/engine/graphics/ecs/water/Water.js +104 -104
  903. package/src/engine/graphics/geometry/AttributeData.js +84 -84
  904. package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.js +49 -49
  905. package/src/engine/graphics/geometry/buffered/query/GeometrySpatialQueryAccelerator.js +288 -288
  906. package/src/engine/graphics/geometry/buffered/query/nearest_point_on_triangle_record.js +87 -87
  907. package/src/engine/graphics/geometry/buffered/read_triangle_vertices.js +102 -102
  908. package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_buffered_geometry.js +52 -52
  909. package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_indexed_geometry.js +20 -20
  910. package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_unindexed_geometry.js +19 -19
  911. package/src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.js +135 -135
  912. package/src/engine/graphics/impostors/voxel/README.md +149 -149
  913. package/src/engine/graphics/impostors/voxel/VoxelImpostorDescription.js +141 -141
  914. package/src/engine/graphics/particles/node-based/codegen/glsl/getTypeByteSize.js +20 -20
  915. package/src/engine/graphics/particles/node-based/nodes/FloatConstant.d.ts +2 -0
  916. package/src/engine/graphics/particles/node-based/nodes/FloatConstant.d.ts.map +1 -1
  917. package/src/engine/graphics/particles/node-based/nodes/ReadFloatUniform.d.ts +2 -0
  918. package/src/engine/graphics/particles/node-based/nodes/ReadFloatUniform.d.ts.map +1 -1
  919. package/src/engine/graphics/particles/node-based/nodes/ReadVelocity.d.ts +2 -0
  920. package/src/engine/graphics/particles/node-based/nodes/ReadVelocity.d.ts.map +1 -1
  921. package/src/engine/graphics/particles/node-based/nodes/ShaderNode.d.ts +1 -2
  922. package/src/engine/graphics/particles/node-based/nodes/ShaderNode.d.ts.map +1 -1
  923. package/src/engine/graphics/particles/node-based/nodes/Vector3Constant.d.ts +2 -0
  924. package/src/engine/graphics/particles/node-based/nodes/Vector3Constant.d.ts.map +1 -1
  925. package/src/engine/graphics/particles/node-based/nodes/Vector3Merge.d.ts +2 -0
  926. package/src/engine/graphics/particles/node-based/nodes/Vector3Merge.d.ts.map +1 -1
  927. package/src/engine/graphics/particles/node-based/nodes/Vector3Split.d.ts +2 -0
  928. package/src/engine/graphics/particles/node-based/nodes/Vector3Split.d.ts.map +1 -1
  929. package/src/engine/graphics/particles/node-based/nodes/WriteVelocity.d.ts +2 -0
  930. package/src/engine/graphics/particles/node-based/nodes/WriteVelocity.d.ts.map +1 -1
  931. package/src/engine/graphics/particles/node-based/nodes/attribute/ReadVector3Attribute.d.ts +2 -0
  932. package/src/engine/graphics/particles/node-based/nodes/attribute/ReadVector3Attribute.d.ts.map +1 -1
  933. package/src/engine/graphics/particles/node-based/nodes/attribute/WriteVector3Attribute.d.ts +2 -0
  934. package/src/engine/graphics/particles/node-based/nodes/attribute/WriteVector3Attribute.d.ts.map +1 -1
  935. package/src/engine/graphics/particles/node-based/nodes/math/AddFloatNode.d.ts +2 -0
  936. package/src/engine/graphics/particles/node-based/nodes/math/AddFloatNode.d.ts.map +1 -1
  937. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Add.d.ts +2 -0
  938. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Add.d.ts.map +1 -1
  939. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Divide.d.ts +2 -0
  940. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Divide.d.ts.map +1 -1
  941. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Multiply.d.ts +2 -0
  942. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Multiply.d.ts.map +1 -1
  943. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Subtract.d.ts +2 -0
  944. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Subtract.d.ts.map +1 -1
  945. package/src/engine/graphics/particles/node-based/nodes/noise/CurlNoiseNode.d.ts +2 -0
  946. package/src/engine/graphics/particles/node-based/nodes/noise/CurlNoiseNode.d.ts.map +1 -1
  947. package/src/engine/graphics/particles/node-based/nodes/particle_data_type_component_count.js +45 -45
  948. package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +229 -229
  949. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +2 -10
  950. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  951. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1149 -1149
  952. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +472 -472
  953. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -2
  954. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -2
  955. package/src/engine/graphics/particles/particular/engine/parameter/ParameterSet.d.ts.map +1 -1
  956. package/src/engine/graphics/particles/particular/engine/parameter/ParameterSet.js +3 -5
  957. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +135 -135
  958. package/src/engine/graphics/particles/particular/engine/utils/distribute_points_on_indexed_triangles.js +168 -168
  959. package/src/engine/graphics/render/forward_plus/plugin/forwardPlusMaterialMarker.js +18 -18
  960. package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -2
  961. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +219 -219
  962. package/src/engine/graphics/render/frame_graph/FrameGraph.js +900 -900
  963. package/src/engine/graphics/render/frame_graph/FrameGraphScope.js +72 -72
  964. package/src/engine/graphics/render/frame_graph/FrameGraphState.js +39 -39
  965. package/src/engine/graphics/render/frame_graph/ResourceEntry.js +96 -96
  966. package/src/engine/graphics/render/gizmo/GizmoShapeBuffer.js +105 -105
  967. package/src/engine/graphics/render/gizmo/GizmoShapeRenderingInterface.js +162 -162
  968. package/src/engine/graphics/render/layers/RenderLayer.js +95 -95
  969. package/src/engine/graphics/sh3/build_injected_shader.js +56 -56
  970. package/src/engine/graphics/sh3/grid_dilate_average.js +175 -175
  971. package/src/engine/graphics/sh3/path_tracer/BufferedGeometryBVH.js +506 -506
  972. package/src/engine/graphics/sh3/path_tracer/PathTracedMesh.js +161 -161
  973. package/src/engine/graphics/sh3/path_tracer/PathTracedRenderer.js +205 -205
  974. package/src/engine/graphics/sh3/path_tracer/PathTracedScene.js +698 -698
  975. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +490 -490
  976. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -2
  977. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.js +45 -45
  978. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +73 -73
  979. package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +32 -32
  980. package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.js +28 -28
  981. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +142 -142
  982. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.js +70 -70
  983. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +388 -388
  984. package/src/engine/graphics/shaders/chunks/glsl_octahedral_impostor.js +277 -277
  985. package/src/engine/graphics/shaders/chunks/glsl_voxel_impostor_splat.js +57 -57
  986. package/src/engine/graphics/shadows/vsm.glsl.js +43 -43
  987. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -81
  988. package/src/engine/graphics/texture/EnvironmentTextureProjection.js +15 -15
  989. package/src/engine/graphics/texture/channel_count_to_format_prefix.js +26 -26
  990. package/src/engine/graphics/texture/isImageBitmap.js +2 -2
  991. package/src/engine/graphics/texture/reflection/convolve_equirectangular_reflection.js +189 -189
  992. package/src/engine/graphics/texture/reflection/equirectangular_reflection_roughness.js +51 -51
  993. package/src/engine/graphics/texture/sampler/HarmonicDiffusionGrid.js +145 -145
  994. package/src/engine/graphics/texture/sampler/Sampler2DArray.js +172 -172
  995. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +466 -466
  996. package/src/engine/graphics/texture/sampler/compare/flip/FlipParameters.js +18 -18
  997. package/src/engine/graphics/texture/sampler/compare/flip/FlipPooling.js +33 -33
  998. package/src/engine/graphics/texture/sampler/compare/flip/flip_build_feature_kernel.js +147 -147
  999. package/src/engine/graphics/texture/sampler/compare/flip/flip_build_spatial_kernel.js +177 -177
  1000. package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_color_difference.js +104 -104
  1001. package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_feature_difference.js +76 -76
  1002. package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_pixels_per_degree.js +34 -34
  1003. package/src/engine/graphics/texture/sampler/compare/flip/flip_constants.js +77 -77
  1004. package/src/engine/graphics/texture/sampler/compare/flip/flip_filter_feature.js +48 -48
  1005. package/src/engine/graphics/texture/sampler/compare/flip/flip_filter_spatial.js +86 -86
  1006. package/src/engine/graphics/texture/sampler/compare/flip/flip_pool.js +71 -71
  1007. package/src/engine/graphics/texture/sampler/compare/flip/flip_srgb_to_ycxcz.js +55 -55
  1008. package/src/engine/graphics/texture/sampler/compare/flip/sampler2d_flip_ldr.js +80 -80
  1009. package/src/engine/graphics/texture/sampler/filter/SeparableKernel.js +82 -82
  1010. package/src/engine/graphics/texture/sampler/filter/sampler2d_convolve_separable.js +122 -122
  1011. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.js +148 -148
  1012. package/src/engine/graphics/texture/sampler/sampler2d_channel_apply_lut.js +82 -82
  1013. package/src/engine/graphics/texture/sampler/sampler2d_combine.js +67 -67
  1014. package/src/engine/graphics/texture/sampler/sampler2d_linear_f16_to_srgb_u8.js +54 -54
  1015. package/src/engine/graphics/texture/sampler/sampler2d_sample_equirectangular_direction.js +63 -63
  1016. package/src/engine/graphics/texture/sampler/sampler2d_srgb_to_linear.js +33 -33
  1017. package/src/engine/graphics/texture/sampler/sampler2d_srgb_u8_to_linear_f16.js +68 -68
  1018. package/src/engine/graphics/texture/shade_image_preview.js +103 -103
  1019. package/src/engine/graphics/trail/TrailSpawnMode.js +20 -20
  1020. package/src/engine/graphics/trail/tube/TubeX.js +573 -573
  1021. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +58 -58
  1022. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +34 -34
  1023. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +69 -69
  1024. package/src/engine/graphics/trail/tube/tube_frame.js +83 -83
  1025. package/src/engine/graphics3/AnimationGraphSystem3.js +329 -329
  1026. package/src/engine/graphics3/AnimationSystem3.js +352 -352
  1027. package/src/engine/graphics3/CameraSystem3.js +170 -170
  1028. package/src/engine/graphics3/DecalSystem3.js +441 -441
  1029. package/src/engine/graphics3/FogOfWarSystem3.js +265 -265
  1030. package/src/engine/graphics3/GraphicsEngine3.js +776 -776
  1031. package/src/engine/graphics3/HighlightSystem3.js +241 -241
  1032. package/src/engine/graphics3/LightSystem3.js +211 -211
  1033. package/src/engine/graphics3/MeshSystem3.js +646 -646
  1034. package/src/engine/graphics3/ParticleEmitterSystem3.js +289 -289
  1035. package/src/engine/graphics3/PathDisplaySystem3.js +309 -309
  1036. package/src/engine/graphics3/PickingQuery.js +48 -48
  1037. package/src/engine/graphics3/PickingResult.js +47 -47
  1038. package/src/engine/graphics3/PickingSystem3.js +273 -273
  1039. package/src/engine/graphics3/ShadeCameraAdapter.js +55 -55
  1040. package/src/engine/graphics3/ShadedGeometrySystem3.js +169 -169
  1041. package/src/engine/graphics3/TerrainSystem3.js +566 -566
  1042. package/src/engine/graphics3/TooltipComponentSystem3.js +328 -328
  1043. package/src/engine/graphics3/Trail3DSystem3.js +221 -221
  1044. package/src/engine/graphics3/VolumetricLightMap.d.ts +90 -0
  1045. package/src/engine/graphics3/VolumetricLightMap.d.ts.map +1 -0
  1046. package/src/engine/graphics3/VolumetricLightMap.js +160 -0
  1047. package/src/engine/graphics3/VolumetricLightMapSerializationAdapter.d.ts +32 -0
  1048. package/src/engine/graphics3/VolumetricLightMapSerializationAdapter.d.ts.map +1 -0
  1049. package/src/engine/graphics3/VolumetricLightMapSerializationAdapter.js +67 -0
  1050. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +98 -0
  1051. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -0
  1052. package/src/engine/graphics3/VolumetricLightMapSystem3.js +261 -0
  1053. package/src/engine/graphics3/WaterSystem3.js +293 -293
  1054. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  1055. package/src/engine/graphics3/animation/wrap_clip_time.js +23 -23
  1056. package/src/engine/graphics3/animation/write_graph_playback.js +48 -48
  1057. package/src/engine/graphics3/camera_sync_from_transform.js +29 -29
  1058. package/src/engine/graphics3/debug/gizmo_view_from_camera.js +48 -48
  1059. package/src/engine/graphics3/decal/DECAL_CLUSTER.js +61 -61
  1060. package/src/engine/graphics3/decal/DECAL_GPU_RECORD.js +117 -117
  1061. package/src/engine/graphics3/decal/DecalAtlas.js +194 -194
  1062. package/src/engine/graphics3/decal/DecalAtlasFill.js +32 -32
  1063. package/src/engine/graphics3/decal/GPUDecalRenderer.js +360 -360
  1064. package/src/engine/graphics3/decal/chunk_decal_intersects_frustum.js +59 -59
  1065. package/src/engine/graphics3/decal/chunk_decal_sampling_info.js +57 -57
  1066. package/src/engine/graphics3/decal/chunk_decal_surface_frame.js +54 -54
  1067. package/src/engine/graphics3/decal/decal_atlas_border.js +69 -69
  1068. package/src/engine/graphics3/decal/decal_gpu_records.js +120 -120
  1069. package/src/engine/graphics3/decal/decal_material_samplers.js +109 -109
  1070. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +212 -212
  1071. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +207 -207
  1072. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +108 -108
  1073. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +151 -151
  1074. package/src/engine/graphics3/highlight/HIGHLIGHT_OUTLINE.js +23 -23
  1075. package/src/engine/graphics3/highlight/chunk_highlight_lookup.js +53 -53
  1076. package/src/engine/graphics3/highlight/pack_highlight_color.js +44 -44
  1077. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  1078. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  1079. package/src/engine/graphics3/load_cube_environment.js +68 -68
  1080. package/src/engine/graphics3/make_default_environment.js +107 -107
  1081. package/src/engine/graphics3/particles/particle_gpu_records.js +221 -221
  1082. package/src/engine/graphics3/path/build_tube_path_streams.js +98 -98
  1083. package/src/engine/graphics3/path/tube_stream_write_geometry.js +90 -90
  1084. package/src/engine/graphics3/preview/ModelPreviewFraming.js +35 -35
  1085. package/src/engine/graphics3/preview/make_model_preview_scene.js +154 -154
  1086. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  1087. package/src/engine/graphics3/preview/model_preview_framing.js +70 -70
  1088. package/src/engine/graphics3/shade_bundle_bounds.js +55 -55
  1089. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  1090. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  1091. package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.js +481 -481
  1092. package/src/engine/graphics3/terrain/chunk_terrain_grid_overlay.js +61 -61
  1093. package/src/engine/graphics3/terrain/chunk_terrain_splat_mix.js +66 -66
  1094. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +53 -53
  1095. package/src/engine/graphics3/terrain/shader_terrain_splat.js +215 -215
  1096. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +158 -158
  1097. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +717 -717
  1098. package/src/engine/input/analog/apply_radial_dead_zone.js +38 -38
  1099. package/src/engine/input/devices/GamepadDevice.js +466 -466
  1100. package/src/engine/input/devices/ManualInputDevice.js +152 -152
  1101. package/src/engine/input/devices/PointerCoordinates.js +26 -26
  1102. package/src/engine/input/devices/events/GamepadEvents.js +10 -10
  1103. package/src/engine/input/devices/gamepad/GamepadAxes.js +19 -19
  1104. package/src/engine/input/devices/gamepad/GamepadButtons.js +29 -29
  1105. package/src/engine/input/devices/gamepad/GamepadCoordinates.js +17 -17
  1106. package/src/engine/input/devices/gamepad/GamepadDeviceLayout.js +323 -323
  1107. package/src/engine/input/devices/gamepad/GamepadHandle.js +286 -286
  1108. package/src/engine/input/devices/gamepad/GamepadLayout.js +160 -160
  1109. package/src/engine/input/devices/gamepad/GamepadStandardMapping.js +31 -31
  1110. package/src/engine/input/devices/gamepad/GamepadStick.js +169 -169
  1111. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +119 -119
  1112. package/src/engine/input/devices/gamepad/GamepadStickCalibrator.js +250 -250
  1113. package/src/engine/input/devices/gamepad/gamepad_layout_database.js +144 -144
  1114. package/src/engine/input/devices/gamepad/gamepad_read_hat_axis.js +61 -61
  1115. package/src/engine/input/devices/gamepad/gamepad_write_dpad_vector.js +30 -30
  1116. package/src/engine/input/devices/gamepad/prototypeGamepadTester.js +2124 -2124
  1117. package/src/engine/input/devices/mouse/MouseButtons.js +22 -22
  1118. package/src/engine/input/ecs/components/Input.js +118 -118
  1119. package/src/engine/input/ecs/components/InputController.js +78 -78
  1120. package/src/engine/input/ecs/ism/ISM_DESIGN.md +1523 -1523
  1121. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +627 -627
  1122. package/src/engine/input/ecs/ism/InputActionEvent.js +40 -40
  1123. package/src/engine/input/ecs/ism/InputBinding.js +71 -71
  1124. package/src/engine/input/ecs/ism/InputCoordinateKind.js +25 -25
  1125. package/src/engine/input/ecs/ism/InputCoordinateSource.js +86 -86
  1126. package/src/engine/input/ecs/ism/InputDirection.js +33 -33
  1127. package/src/engine/input/ecs/ism/InputMapProgram.js +236 -236
  1128. package/src/engine/input/ecs/ism/InputMapSystem.js +976 -976
  1129. package/src/engine/input/ecs/ism/InputOcclusion.js +31 -31
  1130. package/src/engine/input/ecs/ism/InputSource.js +67 -67
  1131. package/src/engine/input/ecs/ism/InputSourceTable.js +107 -107
  1132. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannel.js +93 -93
  1133. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannelType.js +11 -11
  1134. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +153 -153
  1135. package/src/engine/input/ecs/ism/coordinate/InputCoordinateSwitches.js +160 -160
  1136. package/src/engine/input/ecs/ism/device/GAMEPAD_INPUT_DEVICE_ID.js +9 -9
  1137. package/src/engine/input/ecs/ism/device/GamepadInputDeviceAdapter.js +88 -88
  1138. package/src/engine/input/ecs/ism/device/InputDeviceAdapter.js +72 -72
  1139. package/src/engine/input/ecs/ism/device/KEYBOARD_INPUT_DEVICE_ID.js +9 -9
  1140. package/src/engine/input/ecs/ism/device/KeyboardInputDeviceAdapter.js +63 -63
  1141. package/src/engine/input/ecs/ism/device/ManualInputDeviceAdapter.js +55 -55
  1142. package/src/engine/input/ecs/ism/device/POINTER_INPUT_DEVICE_ID.js +9 -9
  1143. package/src/engine/input/ecs/ism/device/PointerInputDeviceAdapter.js +160 -160
  1144. package/src/engine/input/ecs/ism/map/InputBinding.js +88 -88
  1145. package/src/engine/input/ecs/ism/map/InputCoordinateBinding.js +102 -102
  1146. package/src/engine/input/ecs/ism/map/InputLayer.js +220 -220
  1147. package/src/engine/input/ecs/ism/map/InputMap.js +331 -331
  1148. package/src/engine/input/ecs/ism/prototypeInputMap.js +309 -309
  1149. package/src/engine/input/ecs/ism/trigger/InputTrigger.js +148 -148
  1150. package/src/engine/input/ecs/ism/trigger/InputTriggerChord.js +173 -173
  1151. package/src/engine/input/ecs/ism/trigger/InputTriggerGamepadButton.js +37 -37
  1152. package/src/engine/input/ecs/ism/trigger/InputTriggerHold.js +176 -176
  1153. package/src/engine/input/ecs/ism/trigger/InputTriggerKey.js +39 -39
  1154. package/src/engine/input/ecs/ism/trigger/InputTriggerMouseButton.js +38 -38
  1155. package/src/engine/input/ecs/ism/trigger/InputTriggerRelease.js +120 -120
  1156. package/src/engine/input/ecs/ism/trigger/InputTriggerSequence.js +315 -315
  1157. package/src/engine/input/ecs/ism/trigger/InputTriggerSwitch.js +105 -105
  1158. package/src/engine/input/ecs/ism/trigger/InputTriggerType.js +17 -17
  1159. package/src/engine/input/ecs/systems/InputControllerSystem.js +253 -253
  1160. package/src/engine/input/ecs/systems/InputSystem.js +162 -162
  1161. package/src/engine/intelligence/behavior/primitive/FailingBehaviorSerializationAdapter.js +25 -25
  1162. package/src/engine/intelligence/behavior/primitive/SucceedingBehaviorSerializationAdapter.js +26 -26
  1163. package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.js +55 -55
  1164. package/src/engine/interpolation/BinaryInterpolationAdapter.js +56 -56
  1165. package/src/engine/interpolation/Interpoland.js +49 -49
  1166. package/src/engine/interpolation/Interpolated.js +149 -149
  1167. package/src/engine/interpolation/PoseInterpolationAdapter.js +61 -61
  1168. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +57 -57
  1169. package/src/engine/interpolation/pose_interpoland.js +27 -27
  1170. package/src/engine/navigation/ecs/path_following/PathFollower.js +222 -222
  1171. package/src/engine/navigation/mesh/NavigationMesh.js +145 -145
  1172. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +661 -0
  1173. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +229 -229
  1174. package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.d.ts.map +1 -1
  1175. package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.js +628 -520
  1176. package/src/engine/network/CONGESTION_CONTROL.md +87 -87
  1177. package/src/engine/network/README.md +52 -52
  1178. package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +43 -43
  1179. package/src/engine/network/adapters/TransformInterpolationAdapter.js +84 -84
  1180. package/src/engine/network/adapters/TransformReplicationAdapter.js +87 -87
  1181. package/src/engine/network/adapters/Vector3InterpolationAdapter.js +46 -46
  1182. package/src/engine/network/convertPathToURL.js +2 -2
  1183. package/src/engine/network/core/MalformedPacketError.js +26 -26
  1184. package/src/engine/network/core/quantize/quantize_float.js +73 -73
  1185. package/src/engine/network/core/quantize/quantize_position.js +65 -65
  1186. package/src/engine/network/core/sequence/ack_bitfield.js +77 -77
  1187. package/src/engine/network/core/sequence/seq16.js +69 -69
  1188. package/src/engine/network/core/sequence/seq32.js +73 -73
  1189. package/src/engine/network/ecs/NetworkSystem.js +84 -84
  1190. package/src/engine/network/ecs/components/NetworkIdentity.js +73 -73
  1191. package/src/engine/network/ecs/owner_authorization.js +55 -55
  1192. package/src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.js +64 -64
  1193. package/src/engine/network/replication/ScopeFilter.js +71 -71
  1194. package/src/engine/network/sim/ActionLog.js +152 -152
  1195. package/src/engine/network/sim/SimAction.js +273 -273
  1196. package/src/engine/network/sim/Snapshotter.js +222 -222
  1197. package/src/engine/network/state/FrameBufferRing.js +168 -168
  1198. package/src/engine/network/state/InputRing.js +134 -134
  1199. package/src/engine/network/state/PriorityAccumulator.js +180 -180
  1200. package/src/engine/network/time/TimeDilation.js +62 -62
  1201. package/src/engine/network/transport/Channel.js +336 -336
  1202. package/src/engine/network/transport/Transport.js +203 -203
  1203. package/src/engine/network/transport/adapters/NodeUDPTransport.js +186 -186
  1204. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +105 -105
  1205. package/src/engine/network/transport/fragments/fragment_send.js +147 -147
  1206. package/src/engine/network/transport/fragments/packet_size.js +101 -101
  1207. package/src/engine/network/xhr.js +23 -23
  1208. package/src/engine/physics/BULLET_REVIEW.md +945 -945
  1209. package/src/engine/physics/CANNON_REVIEW.md +1300 -1300
  1210. package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -208
  1211. package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -364
  1212. package/src/engine/physics/INTEPOLATION_SYSTEM_PLAN.md +287 -287
  1213. package/src/engine/physics/JOLT_REVIEW.md +913 -913
  1214. package/src/engine/physics/PLAN.md +1120 -1094
  1215. package/src/engine/physics/RAPIER_REVIEW.md +934 -934
  1216. package/src/engine/physics/REVIEW_001_ACTION_PLAN.md +642 -642
  1217. package/src/engine/physics/REVIEW_002.md +151 -151
  1218. package/src/engine/physics/REVIEW_003.md +166 -166
  1219. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +97 -97
  1220. package/src/engine/physics/constraint/DofMode.js +35 -35
  1221. package/src/engine/physics/constraint/solve_constraints.js +1 -1
  1222. package/src/engine/physics/contact/combine_material.js +35 -35
  1223. package/src/engine/physics/ecs/BodyKind.js +29 -29
  1224. package/src/engine/physics/ecs/Collider.js +177 -177
  1225. package/src/engine/physics/ecs/ColliderFlags.js +15 -15
  1226. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -37
  1227. package/src/engine/physics/ecs/Joint.js +475 -475
  1228. package/src/engine/physics/ecs/JointSerializationAdapter.js +72 -72
  1229. package/src/engine/physics/ecs/PhysicsSystem.d.ts +3 -0
  1230. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  1231. package/src/engine/physics/ecs/PhysicsSystem.js +7 -2
  1232. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -37
  1233. package/src/engine/physics/ecs/SleepState.js +12 -12
  1234. package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -76
  1235. package/src/engine/physics/fluid/FluidField.js +867 -867
  1236. package/src/engine/physics/fluid/FluidSimulator.js +832 -832
  1237. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +243 -243
  1238. package/src/engine/physics/fluid/SliceVisualiser.js +190 -190
  1239. package/src/engine/physics/fluid/ecs/FluidComponent.js +239 -239
  1240. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -89
  1241. package/src/engine/physics/fluid/ecs/FluidObstacle.js +97 -97
  1242. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  1243. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +348 -348
  1244. package/src/engine/physics/fluid/ecs/FluidSystem.js +142 -142
  1245. package/src/engine/physics/fluid/ecs/FluidWorkerCore.js +123 -123
  1246. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +395 -395
  1247. package/src/engine/physics/fluid/ecs/fluid.worker.js +12 -12
  1248. package/src/engine/physics/fluid/ecs/fluid_build_world_to_grid.js +32 -32
  1249. package/src/engine/physics/fluid/ecs/fluid_gather_visible_effectors.js +47 -47
  1250. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +85 -85
  1251. package/src/engine/physics/fluid/ecs/fluid_sync_effectors_from_transform.js +16 -16
  1252. package/src/engine/physics/fluid/ecs/fluid_worker_protocol.js +111 -111
  1253. package/src/engine/physics/fluid/ecs/makeFluidWorker.js +18 -18
  1254. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -81
  1255. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +202 -202
  1256. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +257 -257
  1257. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +405 -405
  1258. package/src/engine/physics/fluid/prototype.js +126 -126
  1259. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +143 -143
  1260. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +162 -162
  1261. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +107 -107
  1262. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -131
  1263. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +90 -90
  1264. package/src/engine/physics/fluid/solver/v3_grid_limit8_at_indices.js +38 -38
  1265. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -77
  1266. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -113
  1267. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +92 -92
  1268. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -107
  1269. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +135 -135
  1270. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +511 -511
  1271. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -108
  1272. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +317 -317
  1273. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +236 -236
  1274. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +217 -217
  1275. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.js +174 -174
  1276. package/src/engine/physics/fluid/solver/v3_mac_clip_trace.js +95 -95
  1277. package/src/engine/physics/fluid/solver/v3_mac_compute_divergence.js +77 -77
  1278. package/src/engine/physics/fluid/solver/v3_mac_compute_face_solid.js +131 -131
  1279. package/src/engine/physics/fluid/solver/v3_mac_subtract_pressure_gradient.js +104 -104
  1280. package/src/engine/physics/inertia/world_inverse_inertia.js +160 -160
  1281. package/src/engine/physics/integration/integrate_position.js +97 -97
  1282. package/src/engine/physics/narrowphase/box_box_manifold.js +681 -681
  1283. package/src/engine/physics/narrowphase/box_triangle_contact.js +906 -906
  1284. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +395 -395
  1285. package/src/engine/physics/narrowphase/compute_penetration.js +369 -369
  1286. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +55 -55
  1287. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +37 -37
  1288. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
  1289. package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1738
  1290. package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -74
  1291. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +12 -11
  1292. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  1293. package/src/engine/physics/narrowphase/refine_ray_hit.js +228 -36
  1294. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +52 -52
  1295. package/src/engine/physics/narrowphase/sphere_triangle_contact.js +138 -138
  1296. package/src/engine/physics/persistence/solver_caches.js +309 -309
  1297. package/src/engine/physics/queries/overlap_shape.js +187 -187
  1298. package/src/engine/physics/queries/raycast.d.ts +7 -4
  1299. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  1300. package/src/engine/physics/queries/raycast.js +11 -5
  1301. package/src/engine/physics/queries/shape_cast.js +417 -417
  1302. package/src/engine/physics/solver/apply_impulse_to_body.js +86 -86
  1303. package/src/engine/physics/solver/friction_cone.js +37 -37
  1304. package/src/engine/physics/solver/solve_contacts.js +1 -1
  1305. package/src/engine/platform/WebEnginePlatform.d.ts.map +1 -1
  1306. package/src/engine/platform/WebEnginePlatform.js +1 -2
  1307. package/src/engine/scene/SerializedScene.d.ts +2 -2
  1308. package/src/engine/scene/SerializedScene.d.ts.map +1 -1
  1309. package/src/engine/scene/transitionToScene.js +121 -121
  1310. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  1311. package/src/engine/simulation/Ticker.js +33 -0
  1312. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +345 -345
  1313. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -140
  1314. package/src/engine/sound/simulation/AcousticSimulator.js +646 -646
  1315. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +432 -432
  1316. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +250 -250
  1317. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +322 -322
  1318. package/src/engine/sound/simulation/README.md +277 -277
  1319. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +261 -261
  1320. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +121 -121
  1321. package/src/engine/sound/simulation/configureAcousticSimulation.js +48 -48
  1322. package/src/engine/sound/simulation/core/AcousticMedium.js +113 -113
  1323. package/src/engine/sound/simulation/core/AcousticMediumSerializationAdapter.js +27 -27
  1324. package/src/engine/sound/simulation/core/AcousticOccluderIndex.js +312 -312
  1325. package/src/engine/sound/simulation/core/AcousticRegionIndex.js +159 -159
  1326. package/src/engine/sound/simulation/core/AcousticSolution.js +90 -90
  1327. package/src/engine/sound/simulation/core/AcousticSourceState.js +109 -109
  1328. package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +73 -73
  1329. package/src/engine/sound/simulation/core/OcclusionSolver.js +112 -112
  1330. package/src/engine/sound/simulation/core/RayHit.js +50 -50
  1331. package/src/engine/sound/simulation/core/VolumeField.js +149 -149
  1332. package/src/engine/sound/simulation/definition/AcousticDirectivity.js +114 -114
  1333. package/src/engine/sound/simulation/definition/AcousticDirectivitySerializationAdapter.js +30 -30
  1334. package/src/engine/sound/simulation/definition/AcousticMaterial.js +122 -122
  1335. package/src/engine/sound/simulation/definition/AcousticMaterialSerializationAdapter.js +32 -32
  1336. package/src/engine/sound/simulation/ecs/AcousticBody.js +48 -48
  1337. package/src/engine/sound/simulation/ecs/AcousticBodySerializationAdapter.js +34 -34
  1338. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +64 -64
  1339. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +75 -75
  1340. package/src/engine/sound/simulation/ecs/AcousticVolume.js +74 -74
  1341. package/src/engine/sound/simulation/ecs/AcousticVolumeSerializationAdapter.js +37 -37
  1342. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +66 -66
  1343. package/src/engine/sound/simulation/probe/AcousticProbeField.js +578 -578
  1344. package/src/engine/sound/simulation/probe/AcousticProbeFieldSerializationAdapter.js +60 -60
  1345. package/src/engine/sound/simulation/probe/ProbeFieldPathingSolution.js +64 -64
  1346. package/src/engine/sound/simulation/probe/ProbeVisibilityRecheck.js +132 -132
  1347. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.js +103 -103
  1348. package/src/engine/sound/simulation/probe/acoustic_trace_energy.js +136 -136
  1349. package/src/engine/sound/simulation/probe/bakeProbeField.js +169 -169
  1350. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +110 -110
  1351. package/src/engine/sound/simulation/probe/bakeReverbBands.js +110 -110
  1352. package/src/engine/sound/simulation/probe/bakeVisibility.js +148 -148
  1353. package/src/engine/sound/simulation/probe/echogram_band_rt60.js +83 -83
  1354. package/src/engine/sound/simulation/probe/probe_delaunay_edges.js +215 -215
  1355. package/src/engine/sound/simulation/probe/probe_densify_portals.js +140 -140
  1356. package/src/engine/sound/simulation/probe/probe_detect_portals.js +196 -196
  1357. package/src/engine/sound/simulation/probe/probe_edge_key.js +38 -38
  1358. package/src/engine/sound/simulation/probe/probe_edge_visible.js +41 -41
  1359. package/src/engine/sound/simulation/probe/probe_place_sdf_cover.js +82 -82
  1360. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +181 -181
  1361. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +171 -171
  1362. package/src/engine/sound/simulation/probe/probe_visibility_augment.js +146 -146
  1363. package/src/engine/sound/simulation/probe/probe_visibility_bridge_components.js +167 -167
  1364. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +354 -354
  1365. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +231 -231
  1366. package/src/engine/sound/simulation/render/foaReverbImpulseResponse.js +105 -105
  1367. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +66 -66
  1368. package/src/engine/sound/simulation/render/reverb_band_tails.js +93 -93
  1369. package/src/engine/sound/simulation/serialization/populateAcousticSerializationRegistry.js +25 -25
  1370. package/src/engine/sound/sopra/README.md +643 -643
  1371. package/src/engine/sound/sopra/SopraEngine.js +432 -432
  1372. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -71
  1373. package/src/engine/sound/sopra/asset/BufferProvider.js +29 -29
  1374. package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -58
  1375. package/src/engine/sound/sopra/definition/BusDefinition.js +142 -142
  1376. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -54
  1377. package/src/engine/sound/sopra/definition/DuckingRule.js +106 -106
  1378. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -31
  1379. package/src/engine/sound/sopra/definition/EventDescription.js +262 -262
  1380. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +55 -55
  1381. package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -83
  1382. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -39
  1383. package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -117
  1384. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -31
  1385. package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -18
  1386. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -109
  1387. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +185 -185
  1388. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +59 -59
  1389. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +128 -128
  1390. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +226 -226
  1391. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -54
  1392. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -191
  1393. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -39
  1394. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +79 -79
  1395. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -42
  1396. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -77
  1397. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -27
  1398. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +5 -0
  1399. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  1400. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +125 -125
  1401. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -41
  1402. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -24
  1403. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -120
  1404. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -31
  1405. package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -128
  1406. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -29
  1407. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +113 -113
  1408. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -25
  1409. package/src/engine/sound/sopra/runtime/BusGraph.js +231 -231
  1410. package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -98
  1411. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -68
  1412. package/src/engine/sound/sopra/runtime/Voice.js +145 -145
  1413. package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -136
  1414. package/src/engine/sound/sopra/runtime/VoicePool.js +17 -17
  1415. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -42
  1416. package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -99
  1417. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -49
  1418. package/src/engine/sound/sopra/util/MockAudioContext.js +224 -224
  1419. package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -60
  1420. package/src/engine/ui/DraggableAspect.js +115 -115
  1421. package/src/engine/ui/apply_pointer_tilt_3d.js +50 -50
  1422. package/src/generation/COORDINATES.md +54 -54
  1423. package/src/generation/GridGenerationResource.js +24 -24
  1424. package/src/generation/GridTaskGroup.js +214 -214
  1425. package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -628
  1426. package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -79
  1427. package/src/generation/automata/CellularAutomata.js +22 -22
  1428. package/src/generation/compute_writes_union.js +25 -25
  1429. package/src/generation/filtering/CellFilter.js +117 -117
  1430. package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -37
  1431. package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -43
  1432. package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -29
  1433. package/src/generation/filtering/numeric/process/computeCellFilterSobel.js +36 -36
  1434. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -42
  1435. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +18 -18
  1436. package/src/generation/filtering/numeric/util/write_cell_filter_to_sampler2d.js +47 -47
  1437. package/src/generation/filtering/util/cell_filter_weights_pick.js +54 -54
  1438. package/src/generation/grid/GridData.js +233 -233
  1439. package/src/generation/grid/coords/grid_to_texel.js +10 -10
  1440. package/src/generation/grid/coords/texel_to_grid.js +10 -10
  1441. package/src/generation/grid/generation/GridTaskApplyActionToCells.js +90 -90
  1442. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +388 -388
  1443. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +127 -127
  1444. package/src/generation/grid/generation/GridTaskSequence.js +58 -58
  1445. package/src/generation/grid/generation/NoopGridTaskGenerator.js +12 -12
  1446. package/src/generation/grid/generation/discrete/GridTaskActionRuleSet.js +48 -48
  1447. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +146 -146
  1448. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +540 -540
  1449. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +222 -222
  1450. package/src/generation/grid/generation/grid/GridTaskAddNodesFixed.js +44 -44
  1451. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +614 -614
  1452. package/src/generation/markers/GridCellActionPlaceMarker.js +244 -244
  1453. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +86 -86
  1454. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +266 -266
  1455. package/src/generation/markers/emitter/MarkerNodeEmitterGridCellAction.js +49 -49
  1456. package/src/generation/placement/GridCellActionTransformNearbyMarkers.js +120 -120
  1457. package/src/generation/placement/action/GridCellAction.js +45 -45
  1458. package/src/generation/placement/action/GridCellActionPlaceTags.js +140 -140
  1459. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +89 -89
  1460. package/src/generation/placement/action/random/CellActionSelectRandom.js +69 -69
  1461. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +91 -91
  1462. package/src/generation/placement/action/util/GridCellActionSequence.js +61 -61
  1463. package/src/generation/placement/action/util/GridCellDisplacedAction.js +61 -61
  1464. package/src/generation/rules/cell/CellMatcherRemovalPreservesConnectivity.js +183 -183
  1465. package/src/generation/theme/ThemeEngine.js +666 -666
  1466. package/src/shade/RENDERER_CONTRACT.md +568 -568
  1467. package/src/shade/descriptor/texture/format/gpu_texture_format_info.js +267 -267
  1468. package/src/shade/device/ShadeDeviceFailure.js +104 -104
  1469. package/src/shade/device/ShadeDeviceFailureReason.js +41 -41
  1470. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +255 -255
  1471. package/src/shade/device/mock/REVIEW_2026_08_22.md +527 -527
  1472. package/src/shade/device/mock/SoftwareGPUBindGroup.js +23 -23
  1473. package/src/shade/device/mock/SoftwareGPUBindGroupLayout.js +22 -22
  1474. package/src/shade/device/mock/SoftwareGPUError.js +63 -63
  1475. package/src/shade/device/mock/SoftwareGPUPipeline.js +75 -75
  1476. package/src/shade/device/mock/SoftwareGPUQuerySet.js +113 -113
  1477. package/src/shade/device/mock/SoftwareGPUSampler.js +30 -30
  1478. package/src/shade/device/mock/SoftwareGPUShaderModule.js +32 -32
  1479. package/src/shade/device/mock/SoftwareGPUTextureView.js +22 -22
  1480. package/src/shade/device/mock/SoftwareGPUUncapturedErrorEvent.js +23 -23
  1481. package/src/shade/device/mock/normalize_dynamic_offsets.js +26 -26
  1482. package/src/shade/device/mock/texture_copy.js +287 -287
  1483. package/src/shade/device/timing/GPUTimer.js +285 -285
  1484. package/src/shade/device/timing/GPUTimerArray.js +205 -205
  1485. package/src/shade/playground/add_random_lights.js +49 -49
  1486. package/src/shade/playground/add_random_meshes.js +83 -83
  1487. package/src/shade/playground/animation_prototype.js +508 -508
  1488. package/src/shade/playground/animation_prototype_skinning.js +647 -647
  1489. package/src/shade/playground/animation_prototype_stress.js +765 -765
  1490. package/src/shade/playground/enable_picker.js +59 -59
  1491. package/src/shade/playground/gltf_skinned_prototype.js +560 -560
  1492. package/src/shade/playground/gltf_skinned_stress_prototype.js +387 -387
  1493. package/src/shade/playground/gltf_viewer.js +282 -282
  1494. package/src/shade/playground/load_default_environment.js +19 -19
  1495. package/src/shade/playground/main.js +2727 -2727
  1496. package/src/shade/playground/make_animated_instances.js +117 -117
  1497. package/src/shade/playground/prototype_virtual_texture.js +274 -274
  1498. package/src/shade/playground/prototype_volumetrics_01.js +206 -206
  1499. package/src/shade/playground/sample.js +234 -234
  1500. package/src/shade/playground/sample_load_gltf.js +102 -102
  1501. package/src/shade/playground/spread_node3d_grid.js +19 -19
  1502. package/src/shade/renderer/Renderer.js +2436 -2436
  1503. package/src/shade/renderer/ShadeIndirectLightingMode.js +14 -14
  1504. package/src/shade/renderer/animation/ShadeAnimationChannel.js +414 -414
  1505. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +531 -531
  1506. package/src/shade/renderer/animation/pose/PosePlayback.js +55 -55
  1507. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +179 -179
  1508. package/src/shade/renderer/animation/pose/pose_evaluate_world.js +76 -76
  1509. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +1024 -1024
  1510. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +79 -79
  1511. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +56 -56
  1512. package/src/shade/renderer/binding/BindGroupManager.js +282 -282
  1513. package/src/shade/renderer/binding/adapt_cache_capacity.js +25 -25
  1514. package/src/shade/renderer/buffer/GPUBufferAllocator.js +116 -116
  1515. package/src/shade/renderer/buffer/buffer_pool_ops.js +123 -123
  1516. package/src/shade/renderer/buffer/table/GPU_DATABASE_PAGE_SIZE.js +9 -9
  1517. package/src/shade/renderer/buffer/table/GPU_DATABASE_UPLOAD_BUFFER_LIMIT.js +8 -8
  1518. package/src/shade/renderer/buffer/table/PageBufferPool.js +71 -71
  1519. package/src/shade/renderer/buffer/table/PageSlotAllocator.js +95 -95
  1520. package/src/shade/renderer/camera/Camera.js +281 -281
  1521. package/src/shade/renderer/camera/GPUCameraContext.js +233 -233
  1522. package/src/shade/renderer/camera/orbital/README.md +84 -84
  1523. package/src/shade/renderer/deferred/shader_composite_volumetrics.js +75 -75
  1524. package/src/shade/renderer/dynamic/DYNAMIC_MESH_VERTEX.js +25 -25
  1525. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +342 -342
  1526. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  1527. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +170 -170
  1528. package/src/shade/renderer/extension/FrameContext.js +263 -263
  1529. package/src/shade/renderer/extension/FramePhase.js +104 -104
  1530. package/src/shade/renderer/extension/FrameRecord.js +126 -126
  1531. package/src/shade/renderer/extension/GBufferTextures.js +83 -83
  1532. package/src/shade/renderer/extension/PresentTarget.js +34 -34
  1533. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  1534. package/src/shade/renderer/extension/RenderExtension.js +69 -69
  1535. package/src/shade/renderer/extension/RenderExtensionRegistry.js +319 -319
  1536. package/src/shade/renderer/extension/SceneColor.js +40 -40
  1537. package/src/shade/renderer/extension/ViewTextures.js +78 -78
  1538. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +182 -182
  1539. package/src/shade/renderer/geometry/Geometry.js +608 -608
  1540. package/src/shade/renderer/geometry/geometry_build_from_meshlet_geometry.js +342 -342
  1541. package/src/shade/renderer/geometry/meshlet_geometry_transfer.js +41 -41
  1542. package/src/shade/renderer/geometry/primitives/make_box_geometry.js +153 -153
  1543. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +240 -240
  1544. package/src/shade/renderer/geometry/primitives/make_plane_geometry.js +145 -145
  1545. package/src/shade/renderer/geometry/primitives/make_polyhedron_geometry.js +327 -327
  1546. package/src/shade/renderer/geometry/primitives/make_torus_geometry.js +107 -107
  1547. package/src/shade/renderer/geometry/primitives/make_torus_knot_geometry.js +165 -165
  1548. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +607 -607
  1549. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +66 -66
  1550. package/src/shade/renderer/geometry/virtual/build/VGeoBuildResult.js +32 -32
  1551. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.js +103 -103
  1552. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.js +25 -25
  1553. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.js +33 -33
  1554. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.js +62 -62
  1555. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.js +49 -49
  1556. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.js +20 -20
  1557. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.js +214 -214
  1558. package/src/shade/renderer/geometry/virtual/build/gltf/GltfByteSource.js +122 -122
  1559. package/src/shade/renderer/geometry/virtual/build/gltf/GltfCollectReport.js +29 -29
  1560. package/src/shade/renderer/geometry/virtual/build/gltf/GltfDocument.js +210 -210
  1561. package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometry.js +48 -48
  1562. package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometryInstance.js +25 -25
  1563. package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometrySelection.js +28 -28
  1564. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +296 -296
  1565. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +166 -166
  1566. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_read_geometry.js +199 -199
  1567. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +173 -173
  1568. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.js +28 -28
  1569. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +200 -200
  1570. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.js +1786 -1786
  1571. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.js +157 -157
  1572. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.js +26 -26
  1573. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.js +75 -75
  1574. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.js +143 -143
  1575. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.js +44 -44
  1576. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.js +41 -41
  1577. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.js +71 -71
  1578. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.js +123 -123
  1579. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.js +26 -26
  1580. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.js +112 -112
  1581. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.js +56 -56
  1582. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.js +70 -70
  1583. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.js +187 -187
  1584. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.js +207 -207
  1585. package/src/shade/renderer/geometry/virtual/format/VGEO_DEFECT.js +18 -18
  1586. package/src/shade/renderer/geometry/virtual/format/VGeoDefect.js +38 -38
  1587. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +64 -64
  1588. package/src/shade/renderer/geometry/virtual/format/attribute/VGEO_ATTRIBUTE.js +13 -13
  1589. package/src/shade/renderer/geometry/virtual/format/attribute/VGEO_ATTRIBUTES.js +50 -50
  1590. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attribute_allocate.js +28 -28
  1591. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attribute_mask.js +23 -23
  1592. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +31 -31
  1593. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.js +32 -32
  1594. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +46 -46
  1595. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +19 -19
  1596. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.js +27 -27
  1597. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_asset_id_preimage.js +62 -62
  1598. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
  1599. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
  1600. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
  1601. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
  1602. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +20 -20
  1603. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_RECORD_SIZE.js +5 -5
  1604. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CHILD_REF.js +5 -5
  1605. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js +5 -5
  1606. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js +5 -5
  1607. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_NO_CHILD.js +5 -5
  1608. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_NO_GROUP.js +5 -5
  1609. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_SAME_PAGE.js +6 -6
  1610. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +81 -81
  1611. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryGroup.js +37 -37
  1612. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryPageNode.js +55 -55
  1613. package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_BLOCK_RECORDS.js +5 -5
  1614. package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_FLAG_ROOT_PAGE.js +5 -5
  1615. package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_RECORD_SIZE.js +5 -5
  1616. package/src/shade/renderer/geometry/virtual/format/directory/vgeo_directory_block_count.js +12 -12
  1617. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CHILD_OFFSET.js +11 -11
  1618. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CHILD_TABLE_ENTRY_SIZE.js +5 -5
  1619. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +11 -11
  1620. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_RAW.js +5 -5
  1621. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_ALIGNMENT.js +5 -5
  1622. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_HEADER_SIZE.js +5 -5
  1623. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_OFFSET.js +13 -13
  1624. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_PAGE_MAGIC.js +5 -5
  1625. package/src/shade/renderer/geometry/virtual/format/frame/VGeoFrameBlob.js +21 -21
  1626. package/src/shade/renderer/geometry/virtual/format/frame/VGeoFrameExtent.js +59 -59
  1627. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +27 -27
  1628. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +84 -84
  1629. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +56 -56
  1630. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +35 -35
  1631. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_scan_frames.js +74 -74
  1632. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +6 -6
  1633. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HASH_ALGO_XXH3.js +5 -5
  1634. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +31 -31
  1635. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_SIZE.js +5 -5
  1636. package/src/shade/renderer/geometry/virtual/format/header/VGEO_LEVEL_OFFSET.js +20 -20
  1637. package/src/shade/renderer/geometry/virtual/format/header/VGEO_LEVEL_RECORD_SIZE.js +9 -9
  1638. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAGIC.js +5 -5
  1639. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +5 -5
  1640. package/src/shade/renderer/geometry/virtual/format/header/VGEO_PAYLOAD_ENCODING_SHADE_MESHLET_V1.js +5 -5
  1641. package/src/shade/renderer/geometry/virtual/format/header/VGeoLevelRecord.js +41 -41
  1642. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_RECORD_SIZE.js +5 -5
  1643. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_GROUP_CLUSTER_COUNT.js +6 -6
  1644. package/src/shade/renderer/geometry/virtual/format/page/VGEO_METRIC_OFFSET.js +21 -21
  1645. package/src/shade/renderer/geometry/virtual/format/page/VGEO_METRIC_SIZE.js +5 -5
  1646. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_FANOUT.js +9 -9
  1647. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_FLAG_LEAF.js +5 -5
  1648. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_OFFSET.js +10 -10
  1649. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_RECORD_SIZE.js +5 -5
  1650. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_HEADER_SIZE.js +5 -5
  1651. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -16
  1652. package/src/shade/renderer/geometry/virtual/format/payload/VGEO_ENCODING_FLAGS_MASK.js +6 -6
  1653. package/src/shade/renderer/geometry/virtual/format/payload/VGeoEncodedPayload.js +18 -18
  1654. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +200 -200
  1655. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_payload_attribute_offset.js +39 -39
  1656. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_payload_size.js +20 -20
  1657. package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +2063 -2063
  1658. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +1622 -1622
  1659. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +485 -485
  1660. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_empty_gpu_structure.d.ts +23 -0
  1661. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_empty_gpu_structure.d.ts.map +1 -0
  1662. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_empty_gpu_structure.js +34 -0
  1663. package/src/shade/renderer/gpu_primitive/sort/ffx/graph_radix_sort.js +115 -115
  1664. package/src/shade/renderer/gpu_primitive/sort/one_sweep/verify_radix_sort_one_sweep.js +110 -110
  1665. package/src/shade/renderer/light/environment/octahedral_resample_kernel.js +50 -50
  1666. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +30 -30
  1667. package/src/shade/renderer/light/environment/resample_cube_to_octahedral.js +157 -157
  1668. package/src/shade/renderer/light/make_sunlight.js +35 -35
  1669. package/src/shade/renderer/light/model/io/light_record_point.js +39 -39
  1670. package/src/shade/renderer/loader/gltf/GLTF_PRIMITIVE_MODE.js +23 -23
  1671. package/src/shade/renderer/loader/gltf/MESHOPT_COMPRESSION_PLAN.md +793 -793
  1672. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtension.js +54 -54
  1673. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.js +109 -109
  1674. package/src/shade/renderer/loader/gltf/ext/gltf_apply_buffer_view_extensions.js +69 -69
  1675. package/src/shade/renderer/loader/gltf/ext/gltf_buffer_view_extensions.js +22 -22
  1676. package/src/shade/renderer/loader/gltf/ext/gltf_geometry_extensions.js +39 -39
  1677. package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.js +301 -301
  1678. package/src/shade/renderer/loader/gltf/gltf_component_type.js +223 -223
  1679. package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.js +137 -137
  1680. package/src/shade/renderer/loader/gltf/gltf_parse_container.js +241 -241
  1681. package/src/shade/renderer/loader/gltf/gltf_read_accessor.js +294 -294
  1682. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.js +49 -49
  1683. package/src/shade/renderer/loader/gltf/load_gltf.js +1253 -1253
  1684. package/src/shade/renderer/loader/gltf/tiny-gltf.js +646 -646
  1685. package/src/shade/renderer/loader/usd/UsdError.js +33 -33
  1686. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +69 -69
  1687. package/src/shade/renderer/loader/usd/load_usd.js +226 -226
  1688. package/src/shade/renderer/loader/usd/parse_usda.js +931 -931
  1689. package/src/shade/renderer/loader/usd/unpack_usdz.js +106 -106
  1690. package/src/shade/renderer/loader/usd/usd_build_scene.js +658 -658
  1691. package/src/shade/renderer/loader/usd/usd_compose_transform.js +258 -258
  1692. package/src/shade/renderer/loader/usd/usd_decode_image.js +384 -384
  1693. package/src/shade/renderer/loader/usd/usd_lz4.js +182 -182
  1694. package/src/shade/renderer/loader/usd/usd_triangulate.js +159 -159
  1695. package/src/shade/renderer/material/ShadeMaterial.d.ts +2 -2
  1696. package/src/shade/renderer/material/ShadeMaterial.js +2 -2
  1697. package/src/shade/renderer/material/standard/fragment_gbuffer.js +334 -334
  1698. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  1699. package/src/shade/renderer/material/standard/material_gbuffer_vertex.js +45 -45
  1700. package/src/shade/renderer/material/standard_material_to_struct.js +23 -23
  1701. package/src/shade/renderer/particles/prototypeParticleSystem.js +450 -450
  1702. package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +52 -52
  1703. package/src/shade/renderer/pool/TransientResourcePool.js +392 -392
  1704. package/src/shade/renderer/postprocess/bloom/bloom_chain_resolution.js +29 -29
  1705. package/src/shade/renderer/postprocess/bloom/graph_bloom_downsample.js +109 -109
  1706. package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +155 -155
  1707. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +114 -114
  1708. package/src/shade/renderer/postprocess/dof/DOF_AUTOFOCUS_PARAMS_STRUCT.js +25 -25
  1709. package/src/shade/renderer/postprocess/dof/DOF_FOCUS_STATE_STRUCT.js +23 -23
  1710. package/src/shade/renderer/postprocess/dof/DOF_PRESETS.js +27 -27
  1711. package/src/shade/renderer/postprocess/dof/chunk_dof_coc_band_diameter.js +41 -41
  1712. package/src/shade/renderer/postprocess/dof/chunk_dof_coc_band_radius.js +32 -32
  1713. package/src/shade/renderer/postprocess/dof/chunk_dof_coc_coefficient.js +26 -26
  1714. package/src/shade/renderer/postprocess/dof/compute_dof_autofocus_params.js +64 -64
  1715. package/src/shade/renderer/postprocess/dof/compute_dof_uniform.js +54 -54
  1716. package/src/shade/renderer/postprocess/dof/gather/DOF2_CONFIG.js +91 -91
  1717. package/src/shade/renderer/postprocess/dof/gather/DOF2_PRESETS.js +9 -9
  1718. package/src/shade/renderer/postprocess/dof/gather/DOF2_SETTINGS_STRUCT.js +66 -66
  1719. package/src/shade/renderer/postprocess/dof/gather/DOF2_TEXTURE_FORMAT.js +22 -22
  1720. package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +292 -292
  1721. package/src/shade/renderer/postprocess/dof/gather/chunk_dof2_coc_to_near_far.js +25 -25
  1722. package/src/shade/renderer/postprocess/dof/gather/chunk_dof2_gather_weight.js +30 -30
  1723. package/src/shade/renderer/postprocess/dof/gather/compute_dof2_uniform.js +54 -54
  1724. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +194 -194
  1725. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_fill.js +68 -68
  1726. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +140 -140
  1727. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +142 -142
  1728. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +99 -99
  1729. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +102 -102
  1730. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_tile_dilate.js +75 -75
  1731. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_tile_max.js +73 -73
  1732. package/src/shade/renderer/postprocess/dof/raymarch/DOF_SETTINGS_STRUCT.js +49 -49
  1733. package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +298 -298
  1734. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +244 -244
  1735. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +91 -91
  1736. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_firefly_cleanup.js +61 -61
  1737. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +90 -90
  1738. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +267 -267
  1739. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +271 -271
  1740. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_tile_dilate.js +70 -70
  1741. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_tile_max.js +72 -72
  1742. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +99 -99
  1743. package/src/shade/renderer/postprocess/gtao/generate_magic_square_noise.js +51 -51
  1744. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +56 -56
  1745. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +78 -78
  1746. package/src/shade/renderer/postprocess/upscale-dither/UpscaleDither.js +95 -95
  1747. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +204 -204
  1748. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +58 -58
  1749. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +230 -230
  1750. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +278 -278
  1751. package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.js +26 -26
  1752. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  1753. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +235 -235
  1754. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +208 -208
  1755. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +206 -206
  1756. package/src/shade/renderer/scene/DynamicMesh.js +70 -70
  1757. package/src/shade/renderer/scene/DynamicMeshBatch.js +90 -90
  1758. package/src/shade/renderer/scene/GPUSceneContext.js +901 -901
  1759. package/src/shade/renderer/scene/SceneNodeBinding.js +56 -56
  1760. package/src/shade/renderer/scene/SkinnedMesh.js +55 -55
  1761. package/src/shade/renderer/scene/TransformAuthority.js +33 -33
  1762. package/src/shade/renderer/scene/optimization/deduplicate_geometries.js +38 -38
  1763. package/src/shade/renderer/scene/optimization/deduplicate_images.js +93 -93
  1764. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
  1765. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +12 -3
  1766. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +127 -127
  1767. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +492 -492
  1768. package/src/shade/renderer/scene/optimization/geometry/internal/match_validate_topology.js +3 -3
  1769. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_window.js +3 -3
  1770. package/src/shade/renderer/scene/optimization/optimize_texture_set.js +81 -81
  1771. package/src/shade/renderer/scene/optimization/source_to_sampler2d.js +21 -21
  1772. package/src/shade/renderer/scene/serialization/STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.js +12 -12
  1773. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  1774. package/src/shade/renderer/scene/serialization/deserialize_scene.js +0 -2
  1775. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_transform_point.js +26 -26
  1776. package/src/shade/renderer/shader/chunk/noise/chunk_interleaved_gradient_noise.js +20 -20
  1777. package/src/shade/renderer/shader/chunk/spherical_harmonics/dering/chunk_sh2_dering_optimize_positive.js +61 -61
  1778. package/src/shade/renderer/shader/chunk/texture/chunk_texture_filter_fxaa_lite.js +225 -225
  1779. package/src/shade/renderer/shader/chunk/texture/dither/chunk_dither_color_8bit_gradient_noise.js +25 -25
  1780. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +384 -384
  1781. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +105 -105
  1782. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +63 -63
  1783. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +89 -89
  1784. package/src/shade/renderer/shadow/map/shadowmap_update_score.js +232 -232
  1785. package/src/shade/renderer/texture/GPUTextureAllocator.js +85 -85
  1786. package/src/shade/renderer/texture/texture_pool_ops.js +171 -171
  1787. package/src/shade/renderer/texture/virtual/PageTableQuadAllocator.js +253 -253
  1788. package/src/shade/renderer/texture/virtual/README.md +276 -276
  1789. package/src/shade/renderer/texture/virtual/VTPageTable.js +330 -330
  1790. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +349 -349
  1791. package/src/shade/renderer/texture/virtual/VT_CONSTANTS.js +154 -154
  1792. package/src/shade/renderer/texture/virtual/VT_STACK_INFO_STRUCT.js +20 -20
  1793. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +1276 -1276
  1794. package/src/shade/renderer/texture/virtual/VirtualTextureStack.js +106 -106
  1795. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +150 -150
  1796. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +232 -232
  1797. package/src/shade/renderer/texture/virtual/chunk_vt_request_key.js +28 -28
  1798. package/src/shade/renderer/texture/virtual/source/VTSourceImage.js +207 -207
  1799. package/src/shade/renderer/texture/virtual/source/VTSourceProcedural.js +135 -135
  1800. package/src/shade/renderer/texture/virtual/source/VTSourceTiled.js +132 -132
  1801. package/src/shade/renderer/water/GPUWaterRenderer.js +167 -167
  1802. package/src/shade/renderer/water/shader_water.js +246 -246
  1803. package/src/shade/renderer/water/water_height_texture_from_sampler.js +56 -56
  1804. package/src/shade/vitest.setup.mjs +89 -89
  1805. package/src/shade/wgsl/validate_wgsl_source.js +316 -316
  1806. package/src/view/controller/controls/NumericIntervalControl.js +90 -90
  1807. package/src/view/controller/controls/Vector2Control.js +83 -83
  1808. package/src/view/controller/controls/Vector3Control.js +90 -90
  1809. package/src/view/elements/Group.js +56 -56
  1810. package/src/view/elements/drawCheckers.js +33 -33
  1811. package/src/view/elements/windrose/WindRoseDiagram.js +369 -369
  1812. package/src/view/graphics/WebGLContextFailureView.js +76 -76
  1813. package/src/view/layout/DockPanel.js +51 -51
  1814. package/src/view/layout/SplitView.js +365 -365
  1815. package/src/view/layout/show_popup_menu.js +81 -81
  1816. package/src/view/minimap/MinimapCanvasView.js +411 -411
  1817. package/src/view/minimap/MinimapImageCache.js +88 -88
  1818. package/src/view/minimap/MinimapMarkerCollection.d.ts +0 -1
  1819. package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
  1820. package/src/view/minimap/MinimapMarkerCollection.js +180 -180
  1821. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  1822. package/src/view/minimap/minimap_focus_area.js +97 -97
  1823. package/editor/process/symbolic/SocketsSymbolicDisplay.js +0 -192
  1824. package/src/core/geom/3d/topology/struct/binary/io/moved_tests.txt +0 -37
  1825. package/src/engine/ecs/attachment/Attachment.d.ts +0 -40
  1826. package/src/engine/ecs/attachment/Attachment.d.ts.map +0 -1
  1827. package/src/engine/ecs/attachment/Attachment.js +0 -57
  1828. package/src/engine/ecs/attachment/AttachmentBinding.d.ts +0 -28
  1829. package/src/engine/ecs/attachment/AttachmentBinding.d.ts.map +0 -1
  1830. package/src/engine/ecs/attachment/AttachmentBinding.js +0 -41
  1831. package/src/engine/ecs/attachment/AttachmentSystem.d.ts +0 -61
  1832. package/src/engine/ecs/attachment/AttachmentSystem.d.ts.map +0 -1
  1833. package/src/engine/ecs/attachment/AttachmentSystem.js +0 -307
  1834. package/src/engine/ecs/attachment/BoneAttachmentBinding.d.ts +0 -27
  1835. package/src/engine/ecs/attachment/BoneAttachmentBinding.d.ts.map +0 -1
  1836. package/src/engine/ecs/attachment/BoneAttachmentBinding.js +0 -69
  1837. package/src/engine/ecs/attachment/TransformAttachmentBinding.d.ts +0 -4
  1838. package/src/engine/ecs/attachment/TransformAttachmentBinding.d.ts.map +0 -1
  1839. package/src/engine/ecs/attachment/TransformAttachmentBinding.js +0 -51
  1840. package/src/engine/ecs/sockets/AttachmentSocket.d.ts +0 -32
  1841. package/src/engine/ecs/sockets/AttachmentSocket.d.ts.map +0 -1
  1842. package/src/engine/ecs/sockets/AttachmentSocket.js +0 -60
  1843. package/src/engine/ecs/sockets/AttachmentSocketType.d.ts +0 -6
  1844. package/src/engine/ecs/sockets/AttachmentSocketType.d.ts.map +0 -1
  1845. package/src/engine/ecs/sockets/AttachmentSocketType.js +0 -8
  1846. package/src/engine/ecs/sockets/AttachmentSockets.d.ts +0 -57
  1847. package/src/engine/ecs/sockets/AttachmentSockets.d.ts.map +0 -1
  1848. package/src/engine/ecs/sockets/AttachmentSockets.js +0 -130
  1849. package/src/engine/ecs/sockets/BoneAttachmentSocket.d.ts +0 -29
  1850. package/src/engine/ecs/sockets/BoneAttachmentSocket.d.ts.map +0 -1
  1851. package/src/engine/ecs/sockets/BoneAttachmentSocket.js +0 -56
  1852. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts +0 -6
  1853. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts.map +0 -1
  1854. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +0 -19
  1855. package/src/shade/renderer/animation/_dump_resolve.d.mts +0 -2
  1856. package/src/shade/renderer/animation/_dump_resolve.d.mts.map +0 -1
  1857. package/src/shade/renderer/animation/_dump_resolve.mjs +0 -5
  1858. package/src/shade/renderer/scene/optimization/geometry/internal/bt_face_loop_helpers.d.ts +0 -32
  1859. package/src/shade/renderer/scene/optimization/geometry/internal/bt_face_loop_helpers.d.ts.map +0 -1
  1860. package/src/shade/renderer/scene/optimization/geometry/internal/bt_face_loop_helpers.js +0 -77
  1861. package/src/shade/renderer/scene/optimization/geometry/internal/bt_find_edge_between.d.ts +0 -12
  1862. package/src/shade/renderer/scene/optimization/geometry/internal/bt_find_edge_between.d.ts.map +0 -1
  1863. package/src/shade/renderer/scene/optimization/geometry/internal/bt_find_edge_between.js +0 -35
  1864. package/src/shade/renderer/scene/serialization/linear_to_pq.d.ts +0 -2
  1865. package/src/shade/renderer/scene/serialization/linear_to_pq.d.ts.map +0 -1
  1866. package/src/shade/renderer/scene/serialization/linear_to_pq.js +0 -14
  1867. package/src/shade/renderer/scene/serialization/pq_to_linear.d.ts +0 -9
  1868. package/src/shade/renderer/scene/serialization/pq_to_linear.d.ts.map +0 -1
  1869. package/src/shade/renderer/scene/serialization/pq_to_linear.js +0 -30
@@ -1,684 +1,684 @@
1
- # GEOMETRY_REVIEW_002 — naming convention & rename plan
2
-
3
- `app/src/mir-engine/meep/src/core/geom`
4
-
5
- > Companion to **GEOMETRY_REVIEW_002_API_ISSUES.md**. This document proposes a single naming
6
- > convention for the whole geometry package, catalogues the overarching mismatches it resolves,
7
- > records the choices that need a human decision, and gives the full old→new rename table that
8
- > drives the refactor.
9
-
10
- ## Why
11
-
12
- The package mixes (at least) three naming worlds: a dominant **type-prefix snake** style
13
- (`v3_`, `aabb3_`, `m4_`, `plane3_`, `quat3_`, `tm_`, `bt_`), a **verbose snake** style
14
- (`compute_triangle_area_3d`, `line_segment_compute_line_segment_intersection_array_2d`), and a
15
- **legacy camelCase** style (`computeConeBoundingBox`, `serializeAABB3`, `randomPointInBox`,
16
- `simplifyTopoMesh`). The user's flagship pair captures it: `line2_distance_to_point_sqr` and
17
- `line_segment_compute_line_segment_intersection_array_2d` both operate on 2D segments yet share
18
- no convention — and the first even lies (it clamps `t∈[0,1]`, so it is a *segment* distance, not
19
- a *line* distance).
20
-
21
- ## Migration strategy (deprecated shims)
22
-
23
- Rename/move to the new name, then **leave a shim file at the old path** that re-exports the new
24
- symbol under the old name with an `@deprecated` JSDoc — matching the house style already used in
25
- e.g. `3d/shape/UnitCubeShape3D.js`. `meep` is a library: unreferenced exports are public
26
- surface, so we alias rather than delete. Shim shape:
27
-
28
- ```js
29
- // 2d/line/line2_distance_to_point_sqr.js (shim)
30
- import { line2_compute_segment_point_distance_sqr } from "./line2_compute_segment_point_distance_sqr.js";
31
-
32
- /**
33
- * @deprecated Renamed to {@link line2_compute_segment_point_distance_sqr}. This function
34
- * measures distance to a SEGMENT (it clamps t to [0,1]), not an infinite line.
35
- */
36
- export const line2_distance_to_point_sqr = line2_compute_segment_point_distance_sqr;
37
- ```
38
-
39
- Each shim is one-line + JSDoc; the move + shim is mechanical and reversible. Renames that **also**
40
- fix a correctness bug or change a signature (see the API-issues doc) must land the behavior fix
41
- and the shim together, and the shim must preserve the **old** signature where it differs.
42
-
43
- ---
44
-
45
- ## Status — applied vs deferred
46
-
47
- **Applied this session (~175 renames, every old name kept as an `@deprecated` re-export shim; `core/geom`
48
- test suite green — 302 suites / 1780 tests, including new regression specs):**
49
-
50
- - The **134 clean 1:1 renames** — the bulk: dimension tokens (`triangle2d_*`/`compute_*_3d` → `tri2_`/`tri3_`),
51
- the `_array` overload split, `nearest`→`closest`, camelCase islands (`mat4`, `morton`, the triangle ray island),
52
- redundant-token de-stutter, predicate/producer fixes, and the flagship `line2_distance_to_point_sqr` →
53
- `line2_compute_segment_point_distance_sqr` and `line_segment_…_array_2d` → `segment2_segment_compute_intersection_array_2d`.
54
- - **34 family renames** — `random/`, `packing/max-rect/` (+`cost/`), `tm_vert*`/`tm_kill_only_*`, `bt_vert*`,
55
- `computeTopoMesh*`, frustum `*_matrix4_project` → `frustum3_*`, `bt_face_get_{attached,neighbour}_faces`,
56
- the `compute_tetrahedron_*` mesh-form dedup, `aabb3_project_to_2d`→`aabb3_projected_area`, `aabb3_raycast`→`aabb3_raycast_hit_point`, etc.
57
- - **~8 manual** — same-file export renames (`aabb_build_frustum`→`aabb3_build_frustum`, `sphere_matrix4_project`→
58
- `sphere_matrix4_transform`, `bt_mesh_face_poke`→`bt_face_poke`), file-only renames (`m3_make_rotation.js`→
59
- `m3_make_rotation_TBN.js`, `encode_unit3_hemioct.js`→`encode_unit_to_hemioct.js`), exporting the two dead
60
- bug-functions (`compare_edges`, `aabb3_score_boxes_SAH_delta`), `aabb2_validate_packing`, and `fill_in_a_cavity`→`tetrahedral_mesh_fill_cavity`.
61
- - **8 multi-export file splits** (breaking changes, no shims — all importers were inside geom and were
62
- rewritten): `lamber_azimuth/transform.js` → `lambert_azimuth/{encode_unit_to_azimuth,decode_azimuth_to_unit}.js`
63
- (folder typo fixed); `spherical/sphere_map_transform.js` → `{encode_unit_to_spheremap,decode_spheremap_to_unit}.js`
64
- (dead decode now exported); `build_face_graph_from_mesh.js` (split out `graph_create_off_mesh_links`);
65
- `validate_tetrahedral_mesh.js` → 3 files; `bt_mesh_build_boundary_euclidean_distance_field.js` → 3 files
66
- (the generic point-distance helper moved to `3d/line/segment3_point_distance_to_segments.js`);
67
- `triangle_encode_rasterized_depth.js` → `{triangle_rasterized_depth_sample_index,triangle_decode_depth}.js`;
68
- `collapseEdge.js` → `{collapse_edge,partial_edge_collapse}.js`;
69
- `build_vertex_quadratics.js` → 4 files (`quadratics`→`quadrics`, shared border-penalty helper promoted).
70
- - The **6 correctness bugs + 2 latent traps** fixed at root with regression tests (see API_ISSUES §0).
71
-
72
- **Deferred (with reason):**
73
-
74
- - **Class methods/fields (~18)** — per decision, the OO value-type classes (`Vector*`, `Quaternion`, `AABB2/3`,
75
- `Rectangle`, `ConicRay`, `StaticR2Tree`, `ConvexHullShape3D`, and the `TopoMesh.setFacedUnindexed` typo) keep
76
- camelCase. Not renamed.
77
- - **Signature/param-only entries (~10)** — where the name is unchanged and only the signature needs work
78
- (`quat3_integrate`/`gjk_epa_penetration`/`ray3_compose_array` add `out_offset`, `aabb3_expand_array` /
79
- `polygon2_clip_axis_halfplane` output-first, `m3_determinant` array form, `vector_*_offset` param casing,
80
- `v3_rigid_align_*`/`aabb3_transform_oriented_inverse` arg order). These are API-shape fixes tracked in
81
- **GEOMETRY_REVIEW_002_API_ISSUES.md**, not renames.
82
- - **Pipeline consolidations (design, not mechanical)** — `simplifyTopoMesh`/`simplifyTopoMesh2` →
83
- `_quadric`/`_decimate` (consolidate duplicate entry points), `qt_match_data_by_circle` → merge into
84
- `qt_collect_by_circle` with an optional predicate. (These three files — plus
85
- `decimate_edge_collapse_snap.js` — remain multi-export on purpose: they are the duplicate
86
- decimation pipeline slated for consolidation, so splitting them piecemeal would be undone.)
87
- - **Debug-only** — `3d/tetrahedra/delaunay/debug/validate_cavity_boundary.js` (2 exports) left as-is.
88
- - **Windows case-only (cosmetic)** — `aabb3_score_boxes_SAH`→`sah`, `aabb3_*_mapping`→`AABB3_*_MAPPING`
89
- constUpper. Need a git case-rename two-step on a case-insensitive filesystem; low value.
90
- - **Dead file** — `compute_legendre_polynomial.js` (0 bytes, exports nothing) — delete or implement.
91
-
92
- ---
93
-
94
- ## Part A — Proposed convention
95
-
96
- ### A1. Type+dimension token and placement
97
-
98
- **Rule.** Use a single scheme for ALL free functions: <typetoken><verb_or_noun>_<qualifier>, where the type token is a glued lowercase abbreviation with the dimension digit glued directly to the type letter(s) and a trailing underscore: v2_ v3_ v4_ m2_ m3_ m4_ aabb2_ aabb3_ quat3_ line2_ line3_ ray3_ box3_ tri2_ tri3_ sphere_ circle_ capsule_ cone_ plane3_ frustum3_ tm_ bt_ sh3_/sh_ shape3_. The digit always means SPATIAL DIMENSION (or, for quat3_, the dimension of the rotated space), never 'number of operands' nor 'squared' nor a version. NEVER use a spelled-out _3d / _2d suffix on a typed primitive (so compute_triangle_area_3d -> tri3_area, triangle2d_* -> tri2_*). The glued-digit prefix WINS over the suffix form everywhere.
99
-
100
- *Why:* The glued-digit prefix (v3_, aabb3_, quat3_) is already the overwhelming majority across vec3/, mat*/, 3d/aabb/, 3d/quaternion/, 3d/topology/struct/binary/ and is what callers grep for. A single placement rule lets a reader predict the name and the arg-count from the token. Mixing _3d-suffix, prefix-digit, and bare tokens (the triangle/polygon mess) is the single largest source of unpredictability.
101
-
102
- - Good: `v3_distance_sqr`, `aabb3_intersects_ray`, `tri3_compute_area`, `line2_compute_segment_point_distance_sqr`, `quat3_multiply`
103
- - Current violators: `compute_triangle_area_3d`, `triangle2d_compute_area`, `orientation3_array (3=points not dim)`, `StaticR2Tree (R2 not 2)`, `spline_bezier2_2d (double dim token)`
104
-
105
- ### A2. How non-vec primitives (triangle/line/ray/segment/box/sphere) carry dimension
106
-
107
- **Rule.** Every geometric primitive gets the same glued-digit prefix as vectors: tri2_/tri3_, line2_/line3_, ray2_/ray3_, box3_, plane3_, frustum3_, circle_ (2d-only, digit omitted because the type is inherently planar), sphere_/capsule_/cone_ (3d-only, digit omitted because inherently volumetric). When a primitive is mathematically tied to one dimension (circle=2d, sphere=3d), omit the digit; when it exists in both (triangle, line, ray, aabb), the digit is mandatory. A SEGMENT is named with the token 'segment' inside the line family, never as a bare 'line'.
108
-
109
- *Why:* Resolves the flagship 'line vs segment' lie and the triangle2d_/triangle3_/triangle_/compute_*_3d sprawl. Tying inherently-mono-dimensional types (circle/sphere) to a digitless token avoids meaningless tokens like circle2_ while keeping triangle/line/ray unambiguous.
110
-
111
- - Good: `tri3_compute_signed_volume`, `line3_compute_segment_point_distance_sqr`, `sphere_intersects_ray`, `circle_area`
112
- - Current violators: `line2_distance_to_point_sqr (actually a segment)`, `triangle_compute_signed_volume (no dim digit, is 3d)`, `orientation3_array`
113
-
114
- ### A3. Verb prefix: compute_ vs bare noun vs bare verb
115
-
116
- **Rule.** PRODUCERS that derive a value/geometry use compute_ ONLY when the work is non-trivial computation that isn't already obvious from the noun; pure 'getter-like' derived quantities (area, length, centroid, surface_area, distance) use a BARE NOUN with no compute_. Rule of thumb: a scalar metric named by its physical quantity drops compute_ (v3_length, aabb3_surface_area, tri3_area, circle_area); an operation that builds a structured result or runs an algorithm keeps compute_ (aabb3_compute_from_triangle, quat3_compute_swing_twist, tri3_compute_barycentric). Apply uniformly within a family: do not have aabb2_compute_area next to aabb2_distance_to_point. PREDICATES never take a verb prefix.
117
-
118
- *Why:* The catalogs show compute_ applied arbitrarily (aabb2_compute_area vs aabb2_distance_to_point; m4_compute_normal_matrix3 vs m4_rotation_translation; box3_projected_half_extent vs aabb3_compute_projected_area). A 'metric=bare noun, algorithm/builder=compute_' rule is teachable and collapses the variance.
119
-
120
- - Good: `aabb3_surface_area`, `v3_length`, `tri3_compute_barycentric`, `aabb3_compute_from_triangle`
121
- - Current violators: `aabb2_compute_area`, `aabb3_compute_surface_area`, `m4_compute_normal_matrix3 (inconsistent with m4_rotation_translation)`, `triangle2d_get_barycentric (uses get_)`
122
-
123
- ### A4. Predicate vs producer naming (bool vs geometry vs bare verb)
124
-
125
- **Rule.** THREE distinct shapes, three distinct name forms. (1) BOOLEAN predicate -> present-tense verb phrase: X_intersects_Y, X_contains_Y, X_is_<property>; returns a plain boolean, no output arg. Standardize box-vs-box overlap on intersects (aabb2_intersects_aabb2), NOT overlap_exists / compute_overlap. (2) GEOMETRY producer (writes a point/region/normal) -> X_compute_<thing>_intersection or X_<noun> writing into a leading (result, result_offset); may return a boolean 'did it exist' flag in addition to writing. (3) The BARE verb 'intersect' is BANNED as a public name (ambiguous between predicate and producer). Functions that return a 3-state / degree / classification are NOT predicates: name them X_classify_<thing> or X_<thing>_side / X_<thing>_containment, never intersects_*_degree.
126
-
127
- *Why:* Directly resolves the prompt's mandate. The catalogs show overlap_exists vs intersects_circle vs compute_overlap all meaning boolean overlap; and intersects_frustum_degree / aabb3_array_intersects_frustum_degree lying about returning a bool. A reader must be able to infer return shape from the verb.
128
-
129
- - Good: `aabb2_intersects_aabb2`, `sphere_contains_point`, `aabb3_classify_against_frustum`, `plane3_compute_3_plane_intersection`, `tm_edge_is_boundary`
130
- - Current violators: `aabb2_overlap_exists`, `aabb2_compute_overlap`, `aabb3_intersects_frustum_degree`, `sphere_intersects_point (is containment)`, `circle_intersects_point`
131
-
132
- ### A5. nearest vs closest
133
-
134
- **Rule.** Pick CLOSEST everywhere; 'nearest' is banned as a public token. closest_point, closest_point_on_surface, line3_closest_points_segment_segment, aabb3_closest_point_on_surface, qt_query_closest_to_point. Rename every *nearest* symbol.
135
-
136
- *Why:* The repo already uses 'closest' in its load-bearing physics seam (closestHit/anyHit, gjk closest-feature) per project memory, and 50 files use nearest vs 30 closest — but the keystone API is 'closest', so converging on closest aligns the geom library with the physics/raycast contract it feeds. One word, package-wide.
137
-
138
- - Good: `aabb3_closest_point_on_surface`, `tri3_closest_point_barycentric`, `qt_query_closest_to_point`
139
- - Current violators: `aabb3_nearest_point_on_surface`, `AABB2.computeNearestPointToPoint`, `line3_compute_nearest_point_to_point`, `frustum3_computeNearestPointToPoint`, `tetrahedral_mesh_find_tets... (n/a)`
140
-
141
- ### A6. _sqr placement
142
-
143
- **Rule.** _sqr is always the FINAL token of the name, after the full quantity-and-operands phrase: <prefix>_distance_sqr, <prefix>_distance_sqr_to_point, <prefix>_length_sqr, <prefix>_signed_distance_sqr_to_point. Never bury it mid-name as Sqr-before-To (distanceSqrTo) and never spell it 'Squared'/'2'. On class methods follow the same trailing rule: lengthSqr, distanceSqrTo is acceptable only because 'To<operand>' is the operand phrase; prefer distance_to_point_sqr style on free functions. The squared variant is the primitive; the non-sqr wrapper calls it and sqrt's.
144
-
145
- *Why:* The package already trends to trailing _sqr on free functions (v3_length_sqr, v3_distance_sqr, aabb2_signed_distance_sqr_to_point). The drift is in class methods (lengthSq/distanceToSquared) and the 'dist2_array'/'2'=squared abuse in convex-hull. One trailing-token rule removes the 'is the companion called _sqr or Squared or 2' guessing.
146
-
147
- - Good: `v3_distance_sqr`, `aabb2_signed_distance_sqr_to_point`, `bt_vertex_distance_to_vertex_sqr`
148
- - Current violators: `Vector3.distanceToSquared`, `Vector3.lengthSq`, `convex-hull dist2_array`
149
-
150
- ### A7. Abbreviation policy for type tokens
151
-
152
- **Rule.** KEEP the established short type prefixes: v2_ v3_ v4_ m2_ m3_ m4_ aabb2_ aabb3_ quat3_ (these are universal, grep-stable, and documented). KEEP domain-mesh prefixes tm_ (TopoMesh ops) and bt_ (binary-topology ops) — they are large, internally-consistent families and renaming them would churn hundreds of call sites for no clarity gain; document them once at the module level. REPLACE qt_ -> keep (quad-tree is a coherent family) but FIX its verbs (see clusters). REPLACE shg_ -> keep (spatial-hash-grid family is consistent) and document. ELIMINATE the 'three'-as-count-or-vendor ambiguity, 'vert' abbreviation, and the m4-vs-mat3 param abbreviation drift. Spell out 'vertex' (not vert/verts), 'matrix' params as m2/m3/m4 (not mat3).
153
-
154
- *Why:* tm_/bt_/qt_/shg_ are not noise: each is a well-populated, internally-consistent namespace and meep is a library where churning public surface is costly (project memory: 'meep is a library'). The real abbreviation harm is the inconsistent ones (vert/verts/vertex; mat3 vs m4; aabb vs aabb2 in rectangle_to_aabb).
155
-
156
- - Good: `v3_dot`, `aabb3_intersects_ray`, `tm_edge_kill`, `bt_edge_collapse`, `shg_query_elements_circle`
157
- - Current violators: `tm_vert_kill (abbrev)`, `bt_merge_verts_by_distance`, `v3_matrix3_rotate param 'mat3'`, `rectangle_to_aabb (drops the 2)`
158
-
159
- ### A8. camelCase -> snake_case migration
160
-
161
- **Rule.** All FREE FUNCTIONS are snake_case with the type prefix. Migrate every camelCase free-function island: 3d/random/* (randomPointInBox -> random_point_in_box ... but see open question on the 'In/On' token), packing/max-rect/* (packMaxRectangles -> pack_max_rectangles, costByRemainingArea -> cost_by_remaining_area), 3d/mat4/eulerAnglesFromMatrix -> m4_euler_angles, the morton camelHybrid (mortonEncode_magicbits -> v3_morton_encode_magicbits), the topology camelCase layer (simplifyTopoMesh, computeTopoMeshBoundingSphere, collapseEdge), the cone camel island (computeConePlaneSide -> cone_compute_plane_side), the camelCase triangle ray island (computeTriangleRayIntersection* -> tri3_ray_intersection*), the harmonics sh3 serializers stay snake. CLASSES remain PascalCase with camelCase methods IF they are engine-facing OO types (Vector3, Quaternion, AABB3, TetrahedralMesh) — that is the deliberate OO layer; but NEW data-structure classes should use snake_case methods to match the free-function layer (BVH2D, SpatialHashGrid already do). Do not mix casings WITHIN one class (fix StaticR2Tree, Cavity).
162
-
163
- *Why:* snake_case is the package norm for the perf/free-function layer; camelCase survives only as legacy islands and the deliberate OO vector/matrix/quaternion classes. The line is 'free functions + new struct methods = snake; established mutable OO value types = camelCase methods'. Mixed-casing within a single class is never acceptable.
164
-
165
- - Good: `random_point_in_box`, `m4_euler_angles`, `cone_compute_plane_side`, `Vector3.lengthSqr (OO method, camel ok)`
166
- - Current violators: `randomPointInBox`, `eulerAnglesFromMatrix`, `computeConePlaneSide`, `StaticR2Tree (mixed setBuffer + sort_morton)`, `simplifyTopoMesh`
167
-
168
- ### A9. Vendor token (three vs threejs vs geometry)
169
-
170
- **Rule.** Use the single vendor token 'three' (not 'threejs') wherever a three.js type genuinely crosses a boundary, and CONFINE it to clearly adapter-named functions/modules (project memory: confine vendor imports to boundaries). Prefer the neutral token 'geometry' / 'buffer_geometry' when the function consumes an indexed/unindexed triangle buffer rather than a literal THREE type. Do NOT embed 'three' to disambiguate from the literal count three — rename plane3_three_compute_* to plane3_compute_3_plane_intersection_from_planes (object adapter) so 'three' never collides with '3'.
171
-
172
- *Why:* Catalogs show three/threejs/geometry used interchangeably (aabb3_from_threejs_geometry vs three_buffer_geometry_to_topo_mesh) and 'three' colliding with the count-3 in plane3_three_*. One spelling + boundary-confinement matches the existing project rule.
173
-
174
- - Good: `aabb3_from_three_geometry`, `three_buffer_geometry_to_topo_mesh`, `shape_mesh_from_geometry`
175
- - Current violators: `aabb3_from_threejs_geometry`, `plane3_three_compute_convex_3_plane_intersection`, `Vector4.threeApplyMatrix4`
176
-
177
- ### A10. Disambiguating the overloaded _array suffix
178
-
179
- **Rule.** _array is RESERVED for exactly one meaning: 'this operand (the typed-array-of-scalars it qualifies) is accessed at a caller-supplied (buffer, offset)'. Apply consistently as a SUFFIX on the operand it describes, with the operand-type token preceding it (v3_*_array means the v3 operands are at offsets). FORBIDDEN alternate meanings: (a) 'returns a freshly allocated array' — name those *_to_new_array or just let them return and document the allocation, never bare _array; (b) 'array of MANY vectors / a batch' — use an explicit count param and a _batch or _v3_buffer token, e.g. aabb3_from_v3_buffer; (c) 'a packed single primitive [cx,cy,cz,r]' for sphere_array_* — rename to sphere_packed_* . The DOUBLE _array_array is banned: a single _array already implies offset operands (v3_dot_array, not v3_dot_array_array). PREFER suffix placement (v3_normalize_array) over prefix (v3_array_normalize) uniformly.
180
-
181
- *Why:* The prompt's mandate. _array carries 3-4 contradictory meanings across vec3/, aabb/, line/, mat4/. Pinning it to 'offset-addressed operand' (the dominant intent) and giving the other meanings their own tokens removes the ambiguity that makes the flagship name unreadable.
182
-
183
- - Good: `v3_dot_array`, `v3_normalize_array`, `aabb3_from_v3_buffer`, `sphere_packed_intersects_point`
184
- - Current violators: `v3_dot_array_array`, `v3_array_normalize (prefix)`, `line_segment_compute_line_segment_intersection_vectors_array_2d (allocates)`, `aabb3_array_compute_from_sphere (prefix)`, `sphere_array_intersects_point (packed)`
185
-
186
- ### A11. Eliminating redundant token repetition
187
-
188
- **Rule.** A token that is already implied by the type prefix must not be repeated. circle_compute_circle_intersection -> circle_compute_intersection; sphere_projected_sphere_radius_sqr -> sphere_projected_radius_sqr; plane3_compute_plane_intersection -> plane3_compute_intersection; line_segment_compute_line_segment_intersection_* -> segment_segment_intersection_* (the operands are two segments; say segment once per operand role, not 'line_segment' twice). For class methods, the class IS the type token: Vector3.projectOntoVector3 -> projectOnto, computeNearestPointToPoint -> compute_closest_point (no PointToPoint doubling), tetrahedral_mesh_tet_get_neighbours -> tetrahedral_mesh_get_neighbours.
189
-
190
- *Why:* The flagship #2 (line_segment...line_segment) and many siblings stutter the type. Removing the repetition shortens names and is mechanically checkable (token appears twice).
191
-
192
- - Good: `segment_segment_intersection_2d`, `circle_compute_intersection`, `plane3_compute_intersection`, `Vector3.projectOnto`
193
- - Current violators: `line_segment_compute_line_segment_intersection_array_2d`, `circle_compute_circle_intersection`, `sphere_projected_sphere_radius_sqr`, `Vector3.projectOntoVector3`
194
-
195
- ### A12. Output-argument placement and the (out, out_offset) pair
196
-
197
- **Rule.** For free functions that WRITE into a caller buffer: the output is ALWAYS the first parameter, immediately followed by its offset: (out, out_offset, ...inputs). Every such writer takes an out_offset even if it currently hardcodes 0. The output param is named 'result' for geometry/value writers and 'out' is also acceptable but pick ONE per family — standardize on 'result'/'result_offset'. Reducers (return a scalar) take NO output arg. Serializers/(de)serializers are the documented exception: (buffer, target) with buffer first. Batch/source-then-dest helpers that genuinely have one input and one output may use (output, output_offset, input, input_offset). The Vector3-object sink form (result.set(...)) is allowed only as a thin, separately-named wrapper (suffix _v3), never mixed into the flat-array family.
198
-
199
- *Why:* Output-first is already the strong majority and is the one thing most areas get right; the violations (mat4 apply_* output-3rd, aabb3_expand_array output-2nd, flip_23/flip_32 output-last, distance-field builders mesh-second) are the exceptions. Mandating out_offset everywhere kills the 'this sibling can't write at an offset' trap (ray3_array_compose, aabb3_nearest_point_on_surface, quat3_integrate, aabb2_from_v2_array).
200
-
201
- - Good: `v3_cross(result, result_offset, ...)`, `aabb3_array_set(result, result_offset, ...)`, `quat3_multiply(out, out_offset, ...)`
202
- - Current violators: `aabb3_expand_array(input, output, distance)`, `tetrahedral_mesh_flip_23(mesh,t1,t2,out)`, `quat3_createFromAxisAngle(axis,angle,result)`, `bt_mesh_build_boundary_distance_field(map, mesh, ...)`, `read_three_planes_to_array(planes, array)`
203
-
204
- ### A13. Parameter naming uniformity
205
-
206
- **Rule.** The same role uses the same name across all siblings. Output buffer + offset: result, result_offset (not out/output/destination/target/r/data/array). Source buffer + offset: input, input_offset (not source/data/in). Element count: count (not n/length/dimensions/dimension_count — pick 'count' for item count, 'dimension_count' only when it literally means components-per-item). Queried point: point_x/point_y/point_z (not px/py/pz or ref_x or r_x). Plane 4th component: plane_constant (not w/dist/plane_offset/constant). Mesh handle: mesh (not tet_mesh/tetrahedra/data). Vertex: vertex / vertex_id (not v/vert/verts). Tet id: tet_id. Scalar multiplier sits immediately before its vector operand (BLAS axpy order).
207
-
208
- *Why:* Every catalog flagged 3-5 spellings for the identical concept. A fixed vocabulary is the cheapest, highest-leverage consistency win and is enforceable by lint.
209
-
210
- - Good: `(result, result_offset, input, input_offset, count)`, `point_x, point_y, point_z`, `plane_constant`
211
- - Current violators: `vector_copy 'length' vs vector_dot 'n' vs vector_scale_array 'dimensions'`, `aabb2 px/py vs point_x/point_y`, `plane 'w'/'dist'/'plane_offset'/'constant'`
212
-
213
- ### A14. One export per file, file name matches export
214
-
215
- **Rule.** Each file exports exactly one public symbol whose name equals the filename (the established meep convention). Fix every filename/export mismatch (aabb3_build_frustum.js -> aabb_build_frustum, sphere_matrix4_transform.js -> sphere_matrix4_project, bt_face_poke.js -> bt_mesh_face_poke, m3_make_rotation.js -> m3_make_rotation_TBN, aabb3_compute_projected_area.js -> aabb3_project_to_2d). Split multi-export files (validate_tetrahedral_mesh.js, bt_mesh_build_boundary_euclidean_distance_field.js, build_face_graph_from_mesh.js, decimate_edge_collapse_snap.js, the lambert_azimuth/transform.js, triangle_encode_rasterized_depth.js). An export that is declared but never exported (aabb3_score_boxes_SAH_delta, decode_spheremap_to_unit, compareEdges, aabb2_validate_packing's 'validate') is a bug: either export it (it is public surface in a library) or delete if truly dead.
216
-
217
- *Why:* Discoverability-by-filename is a core meep convention; mismatches and multi-export files break grep-by-path and hide public surface. Library semantics (per memory) mean unexported-but-intended symbols are bugs to fix, not delete.
218
-
219
- - Good: `v3_cross.js exports v3_cross`
220
- - Current violators: `aabb3_build_frustum.js exports aabb_build_frustum`, `aabb3_score_boxes_SAH_delta.js exports nothing`, `compute_legendre_polynomial.js (0 bytes)`
221
-
222
- ### A15. Casing of constants and acronyms
223
-
224
- **Rule.** Module-level frozen sentinels/identities are constUpper (M4_IDENTITY, NULL_POINTER, INVALID_NEIGHBOUR). Exported lookup tables that are conceptually constant data use constUpper too (AABB3_CORNER_EDGE_MAPPING). Embedded acronyms inside a snake_case function name are lowercased (aabb3_score_boxes_sah, not _SAH). Sentinel names for the same concept are unified across structures (one of NULL_POINTER) rather than NULL_NODE / NULL_POINTER / QT_NULL_POINTER.
225
-
226
- *Why:* Mixed-case SAH inside snake names and three different null-sentinel names are gratuitous variance; constUpper for true constants is already established (M2_IDENTITY, M4_IDENTITY).
227
-
228
- - Good: `M4_IDENTITY`, `aabb3_score_boxes_sah`, `NULL_POINTER`
229
- - Current violators: `aabb3_score_boxes_SAH`, `aabb3_corner_edge_mapping (lowercase data table)`, `NULL_NODE vs QT_NULL_POINTER`
230
-
231
- ---
232
-
233
- ## Part B — Overarching inconsistency clusters
234
-
235
- The convention mismatches across the package, by theme.
236
-
237
- ### B1. array-token-overload — *major*
238
-
239
- The _array token carries 3-4 contradictory meanings (offset-addressed single operand as prefix vs suffix; returns-a-new-array; batch-of-many-vectors; packed single primitive) plus a double _array_array. Reserve _array=offset-addressed operand (suffix), and give the other meanings distinct tokens (_to_new_array, _buffer/_batch, _packed).
240
-
241
- Examples: `v3_array_normalize vs v3_negate_array vs v3_dot_array_array` · `line_segment_compute_line_segment_intersection_vectors_array_2d (allocates)` · `aabb3_array_compute_from_sphere (prefix) vs aabb3_expand_array (suffix=offset-0)` · `sphere_array_intersects_point (packed) vs sphere_radius_sqr_from_v3_array_transformed (batch)`
242
-
243
- ### B2. dimension-token-placement — *major*
244
-
245
- Dimension is encoded five ways: glued prefix-digit (v3_/aabb3_), glued suffix (triangle2d_), verb-first _3d suffix (compute_triangle_area_3d), bare/no-digit-though-3d (triangle_compute_signed_volume), and digit-means-not-dimension (orientation3_array=3 points, StaticR2Tree=R2). Converge on glued prefix-digit; digit always = spatial dimension; omit digit only for inherently-mono-dimensional types (circle/sphere/capsule/cone).
246
-
247
- Examples: `triangle2d_compute_area / tri3 / triangle_compute_signed_volume / compute_triangle_area_3d` · `orientation3_array` · `spline_bezier2_2d` · `StaticR2Tree`
248
-
249
- ### B3. misleading-name-lies-about-behavior — *major*
250
-
251
- Names that contradict behavior: segment functions named 'line'; transform functions named 'project'; predicates named 'intersects' that return a degree/number; 'create' that doesn't allocate; 'nearest' surface helpers that are containment; serializer 'quantize' comment on a dequantizer; quadric tensors named 'quadratics'.
252
-
253
- Examples: `line2_distance_to_point_sqr (segment)` · `sphere_matrix4_project (transforms)` · `aabb3_intersects_frustum_degree (returns 0/1/2)` · `quat3_createFromAxisAngle (no alloc)` · `sphere_intersects_point / circle_intersects_point (containment)` · `compute_*_vertex_quadratics (Quadric3)`
254
-
255
- ### B4. redundant-token-repetition — *major*
256
-
257
- The type token is stuttered: line_segment...line_segment, circle_compute_circle_*, sphere_projected_sphere_*, plane3_compute_plane_*, NearestPointToPoint, projectOntoVector3, tetrahedral_mesh_tet_get_*.
258
-
259
- Examples: `line_segment_compute_line_segment_intersection_array_2d` · `circle_compute_circle_intersection` · `sphere_projected_sphere_radius_sqr` · `Vector3.projectOntoVector3`
260
-
261
- ### B5. camelCase-legacy-islands — *major*
262
-
263
- Whole folders/files in camelCase against the snake_case norm: random/, packing/max-rect/, the topology camelCase layer, cone camel island, the camelCase triangle ray island, mat4 eulerAnglesFromMatrix, morton camel-hybrid. Migrate free functions to snake_case; keep deliberate OO value-type classes (Vector*/Quaternion/AABB3) camelCase-methoded but never mix casings within one class.
264
-
265
- Examples: `randomPointInBox` · `packMaxRectangles` · `simplifyTopoMesh` · `computeConePlaneSide` · `computeTriangleRayIntersection` · `eulerAnglesFromMatrix` · `StaticR2Tree (mixed within class)`
266
-
267
- ### B6. predicate-vs-producer-vs-degree — *major*
268
-
269
- Boolean overlap tests have three names (intersects_/overlap_exists/compute_overlap); degree/classification functions wear the boolean 'intersects' prefix; bare verb 'intersect' is ambiguous. Standardize: intersects_/contains_/is_=bool, compute_*_intersection=geometry, classify_/_side=multi-state.
270
-
271
- Examples: `aabb2_overlap_exists vs aabb2_intersects_circle vs aabb2_compute_overlap` · `aabb3_intersects_frustum_degree` · `aabb3_array_intersects_frustum_degree` · `Rectangle.intersects vs Rectangle.overlaps`
272
-
273
- ### B7. output-arg-placement-and-missing-offset — *major*
274
-
275
- Output buffer position flips (first/second/third/last) and many writers hardcode offset 0 with no out_offset param, breaking the pack-into-shared-buffer use case. Mandate (result, result_offset, ...) first, always with an offset.
276
-
277
- Examples: `aabb3_expand_array (output 2nd)` · `tetrahedral_mesh_flip_23/_32 (output last)` · `quat3_integrate (no offset)` · `ray3_array_compose (no offset)` · `aabb2_from_v2_array (hardcoded 0)` · `ray3_shift_origin_along_direction (offset-0 bug)`
278
-
279
- ### B8. param-name-vocabulary-drift — *major*
280
-
281
- Identical roles get many names: count=n/length/dimensions/dimension_count; output=out/output/result/target/data/r/destination; queried point=px/ref_x/r_x/point_x; plane 4th=w/dist/plane_offset/constant; mesh=mesh/tet_mesh/tetrahedra/data; vertex=v/vert/verts/vertex; tet id has 5 spellings.
282
-
283
- Examples: `vector_copy length / vector_dot n / vector_scale_array dimensions` · `aabb2 px/py vs signed point_x/point_y` · `plane3 w/dist/plane_offset/constant` · `tet_index/tet/tet_id/tetrahedron_index/containing_tetra`
284
-
285
- ### B9. filename-export-mismatch-and-multi-export — *major*
286
-
287
- Files whose single export name differs from the filename, files exporting 3-4 symbols, and declared-but-never-exported functions (dead public surface or latent bugs).
288
-
289
- Examples: `aabb3_build_frustum.js->aabb_build_frustum` · `sphere_matrix4_transform.js->sphere_matrix4_project` · `bt_face_poke.js->bt_mesh_face_poke` · `aabb3_score_boxes_SAH_delta (no export)` · `compute_legendre_polynomial.js (0 bytes)` · `validate_tetrahedral_mesh.js (3 exports)`
290
-
291
- ### B10. correctness-bugs-surfaced-by-audit — *major*
292
-
293
- Genuine defects found while auditing names — must be fixed at root, not renamed around: y/x mix-ups, dead early returns, signed-distance-as-bool, unexported functions, offset-0 hardcoding bugs.
294
-
295
- Examples: `circle_intersects_point v2_distance(cx,cx,...)` · `circle_compute_circle_penetration dy=by-ax` · `aabb3_transformed_compute_plane_side signed-dist-as-bool` · `ray3_shift_origin_along_direction offset-0` · `aabb3_score_boxes_SAH_delta half-vs-full-area 2x` · `compareEdges compares v0 twice`
296
-
297
- > Note: a cataloguer also flagged a "dead `return indices_0`" in `triangle_encode_rasterized_depth`; on verification that claim was **false** (all three index branches are reachable) and has been dropped. The file still warrants the *naming* fix below (the export returns a vertex index, not encoded depth) and the multi-export split.
298
-
299
- ### B11. nearest-vs-closest-synonym — *minor*
300
-
301
- 'nearest' and 'closest' used interchangeably for the same closest-point/feature concept across line/ray/aabb/frustum/triangle/quad-tree. Converge on 'closest' to match the physics closestHit seam.
302
-
303
- Examples: `aabb3_nearest_point_on_surface vs line3_closest_points_segment_segment` · `frustum3_computeNearestPointToPoint` · `computeTriangleClosestPointToPointBarycentric` · `qt_query_data_nearest_to_point`
304
-
305
- ### B12. sqr-placement-and-companion-coverage — *minor*
306
-
307
- _sqr buried mid-name on class methods (distanceToSquared/lengthSq) vs trailing on free functions; '2'-means-squared abuse; asymmetric sqr/non-sqr companion coverage. Trailing _sqr everywhere; the squared form is the primitive.
308
-
309
- Examples: `Vector3.distanceToSquared / lengthSq` · `convex-hull dist2_array` · `aabb3_signed_distance_sqr_to_point (no sqrt companion) vs aabb3_signed_distance_to_aabb3 (no sqr)`
310
-
311
- ### B13. verb-prefix-inconsistency — *minor*
312
-
313
- compute_ / build_ / make_ / from_ / get_ applied arbitrarily to producers; bare-noun metrics sometimes carry compute_, sometimes not; m3 from_translation vs m4 make_translation.
314
-
315
- Examples: `aabb2_compute_area vs aabb2_distance_to_point` · `m3_cm_from_translation vs m4_make_translation` · `tetrahedral_mesh_build_* vs _compute_* vs _find_*` · `triangle2d_get_barycentric (get_)`
316
-
317
- ### B14. out-param-and-return-shape-divergence — *minor*
318
-
319
- Sibling writers disagree on return shape (void vs return-out vs bool) and on Vector3-object-sink vs flat-array-sink; degree/scalar/bool returns hide behind shared prefixes; some methods return this, siblings return undefined.
320
-
321
- Examples: `m2_add void vs m2_transpose returns out vs m4_invert returns bool` · `Vector4.multiplyVector3 returns undefined` · `plane3 Vector3-sink vs flat-array-sink` · `qt_collect_* (count) vs qt_query_data_nearest (single datum)`
322
-
323
- ### B15. vendor-token-three-vs-threejs-vs-geometry — *minor*
324
-
325
- three.js token spelled three/threejs/geometry and embedded where it collides with the literal count three; some vendor imports not confined to adapter boundaries.
326
-
327
- Examples: `aabb3_from_threejs_geometry vs three_buffer_geometry_to_topo_mesh` · `plane3_three_compute_convex_3_plane_intersection` · `Vector4.threeApplyMatrix4`
328
-
329
- ### B16. abbreviation-vert-and-matrix-param — *minor*
330
-
331
- vertex abbreviated vert/verts/vertex; matrix params m4 vs mat3; quat vs qt vs Quaternion; immediate/in_place opaque tokens for add accumulate.
332
-
333
- Examples: `tm_vert_kill vs tm_vertex_compute_normal` · `bt_merge_verts_by_distance` · `v3_matrix3_rotate param mat3 vs m4` · `v3_array_immediate_add vs v3_array_add_in_place`
334
-
335
- ---
336
-
337
- ## Part C — Open questions (need a decision before mass-rename)
338
-
339
- Each of these is a genuine fork with churn implications; the rename table assumes the
340
- *recommended* option but they are called out so the direction can be confirmed.
341
-
342
- ### C1. Should geometric primitives use a glued prefix-digit token (tri3_, line3_, box3_, plane3_) or keep some types digitless because they read fine without it (e.g. should the existing aabb3_/quat3_ digit style be forced onto sphere_/capsule_/cone_/circle_)?
343
-
344
- - A: glued prefix-digit on EVERYTHING, even inherently-mono-dimensional types (circle2_, sphere3_, capsule3_)
345
- - B: prefix-digit only for types that exist in multiple dimensions (triangle, line, ray, aabb, box, plane); digitless for inherently-mono-dimensional types (circle, sphere, capsule, cone)
346
-
347
- **Recommendation:** B. circle2_/sphere3_ add a meaningless token (a circle is always 2d, a sphere always 3d), and sphere_/capsule_/cone_ are already established digitless. Reserve the digit to disambiguate genuinely multi-dimensional families.
348
-
349
- ### C2. How aggressively should the camelCase OO value-type classes (Vector2/3/4, Quaternion, AABB2/3, Matrix wrappers) be migrated? Their METHODS are camelCase while the entire free-function layer is snake_case.
350
-
351
- - A: Leave class methods camelCase forever (deliberate OO layer; matches three.js muscle memory and is huge call-site churn)
352
- - B: Migrate class methods to snake_case to match the free-function layer (one casing package-wide)
353
- - C: Freeze existing classes as camelCase but mandate snake_case methods on all NEW structure classes (BVH2D/SpatialHashGrid already do this)
354
-
355
- **Recommendation:** C. Full migration (B) is enormous churn on the most-referenced types for little gain and fights three.js familiarity; A leaves the rule unstated. C draws a clear, low-churn line: established mutable value types stay camelCase, new struct classes are snake_case — and bans within-class mixing (StaticR2Tree, Cavity).
356
-
357
- ### C3. random/ samplers encode surface-vs-volume as an In/On preposition (randomPointInBox vs randomPointOnBox). Under snake_case, do we keep in/on or switch to explicit volume/surface tokens?
358
-
359
- - A: random_point_in_box / random_point_on_box (keep In/On preposition)
360
- - B: random_point_in_volume_box / random_point_on_surface_box (explicit)
361
- - C: box_sample_random_in_volume / box_sample_random_on_surface (type-first, mirrors AbstractShape3D.sample_random_point_in_volume)
362
-
363
- **Recommendation:** C for long-term consistency with the shape API (which already says sample_random_point_in_volume), but it is the highest-churn option and arguably over-engineered for a tiny self-contained folder; if churn is a concern, A is an acceptable minimal fix (snake the names, keep In/On). Flagging because the tradeoff is real.
364
-
365
- ### C4. Output-argument convention for WRITERS: standardize on output-FIRST (result, result_offset, ...) everywhere, or keep the serializer/source-then-dest exceptions documented?
366
-
367
- - A: output-first universally; serializers are a single documented exception (buffer, target)
368
- - B: output-first for value/geometry writers, but allow (output, output_offset, input, input_offset) for pure transform/batch helpers and (dst, src) for copy-likes
369
-
370
- **Recommendation:** A with the serializer carve-out. Output-first is already the dominant, teachable rule; the (input,...,output) and output-last violations are pure inconsistency, not principled. Keep the serializer (buffer-first) exception because the buffer genuinely is both the medium and conventionally leads.
371
-
372
- ### C5. Should the large domain-mesh prefixes tm_ (TopoMesh) and bt_ (binary topology) be spelled out or kept abbreviated, given the package otherwise spells out tokens (triangle->tri only as a proposal)?
373
-
374
- - A: Keep tm_/bt_ abbreviated (large internally-consistent families; meep is a library so renaming churns hundreds of call sites)
375
- - B: Spell out to topo_mesh_ / binary_topo_ for self-documentation
376
-
377
- **Recommendation:** A. These are coherent, heavily-used namespaces; per the 'meep is a library' rule, churning public surface for marginal readability is not worth it. Document the prefixes once at module level instead. (Contrast: 'vert' abbreviation IS worth fixing because it's applied inconsistently.)
378
-
379
- ### C6. For the bounding-volume-of-N family, which canonical shape: <type>_compute_bounding_box / <type>_compute_bounding_of_N_<types>, or compute_bounding_<type>_of_N_<types>?
380
-
381
- - A: type-token-first: sphere_compute_bounding_of_2_spheres, cone_compute_bounding_of_2_cones, circle3_compute_bounding_box
382
- - B: verb-first: compute_bounding_sphere_of_2_spheres, compute_bounding_box (current mixed state, mostly verb-first)
383
-
384
- **Recommendation:** A (type-token-first) to match the package-wide prefix rule and make these greppable alongside the rest of each type's family. This contradicts the current verb-first majority in this corner, so it is a genuine choice with churn cost — flagging rather than silently picking.
385
-
386
- ---
387
-
388
- ## Part D — Rename table
389
-
390
- 208 symbols violate the convention. Grouped by cluster; `[move]` marks a file relocation.
391
-
392
- ### dimension-token-placement (30)
393
-
394
- | old | → new | file | why |
395
- |-----|-------|------|-----|
396
- | `compose_matrix4_array` | `m4_compose` | [3d/mat4/compose_matrix4_array.js](3d/mat4/compose_matrix4_array.js) <br>*[move → 3d/mat4/m4_compose.js]* | Normalize to m4_ prefix; drop redundant _array (a mat4 is always an array here). |
397
- | `decompose_matrix_4_array` | `m4_decompose` | [3d/mat4/decompose_matrix_4_array.js](3d/mat4/decompose_matrix_4_array.js) <br>*[move → 3d/mat4/m4_decompose.js]* | Normalize to m4_ prefix; mirror m4_compose stem; also stop calling private __setFromRotationMatrix (promote a public quat3_from_matrix3). |
398
- | `allocate_m4` | `m4_allocate` | [3d/mat4/allocate_m4.js](3d/mat4/allocate_m4.js) <br>*[move → 3d/mat4/m4_allocate.js]* | Type token must lead; matches v3_allocate. |
399
- | `rectangle_to_aabb` | `aabb2_from_rectangle` | [2d/rectangle_to_aabb.js](2d/rectangle_to_aabb.js) <br>*[move → 2d/aabb/aabb2_from_rectangle.js]* | Use the aabb2_ type prefix (mirrors aabb2_from_v2_buffer); produced type is AABB2 not 'aabb'; document the negative-size clamp. |
400
- | `aabb3_estimate_projected_area2` | `aabb3_estimate_projected_area` | [3d/aabb/aabb3_estimate_projected_area2.js](3d/aabb/aabb3_estimate_projected_area2.js) <br>*[move → 3d/aabb/aabb3_estimate_projected_area.js]* | Trailing '2' is a meaningless version suffix (no base name exists). |
401
- | `compute_aabb_from_points` | `aabb_nd_from_points` | [3d/aabb/compute_aabb_from_points.js](3d/aabb/compute_aabb_from_points.js) <br>*[move → 3d/aabb/aabb_nd_from_points.js]* | n-dimensional (controlled by d) — use aabb_nd_ token; type token must lead. |
402
- | `compute_triangle_group_aabb3` | `aabb3_from_triangle_group` | [3d/aabb/compute_triangle_group_aabb3.js](3d/aabb/compute_triangle_group_aabb3.js) <br>*[move → 3d/aabb/aabb3_from_triangle_group.js]* | aabb3 token must be a PREFIX not suffix; rename output/output_offset params to result/result_offset. |
403
- | `compute_bounding_sphere_of_2_spheres` | `sphere_compute_bounding_of_2_spheres` | [3d/sphere/compute_bounding_sphere_of_2_spheres.js](3d/sphere/compute_bounding_sphere_of_2_spheres.js) <br>*[move → 3d/sphere/sphere_compute_bounding_of_2_spheres.js]* | Type token must lead; unify with the bounding-volume naming rule; also use closed-form (drop per-call Miniball alloc). |
404
- | `compute_circle_bounding_box` | `circle3_compute_bounding_box` | [3d/compute_circle_bounding_box.js](3d/compute_circle_bounding_box.js) <br>*[move → 3d/circle3_compute_bounding_box.js]* | Operates in 3d (takes a normal) but name reads 2d; add dimension token. |
405
- | `compute_bounding_cone_of_2_cones` | `cone_compute_bounding_of_2_cones` | [3d/cone/compute_bounding_cone_of_2_cones.js](3d/cone/compute_bounding_cone_of_2_cones.js) <br>*[move → 3d/cone/cone_compute_bounding_of_2_cones.js]* | Type token leads; mirror sphere bounding naming. |
406
- | `spherical_from_cartesian` | `sphere_spherical_from_cartesian` | [3d/sphere/spherical_from_cartesian.js](3d/sphere/spherical_from_cartesian.js) <br>*[move → 3d/sphere/sphere_spherical_from_cartesian.js]* | Add sphere_ family prefix for discoverability (optional but consistent). |
407
- | `triangle2d_compute_area` | `tri2_signed_area` | [2d/triangle2d_compute_area.js](2d/triangle2d_compute_area.js) <br>*[move → 2d/triangle/tri2_signed_area.js]* | Glued-prefix-digit token tri2_; returns SIGNED area (encode sign); drop compute_ (bare metric). |
408
- | `triangle2d_get_barycentric` | `tri2_compute_barycentric` | [2d/triangle2d_get_barycentric.js](2d/triangle2d_get_barycentric.js) <br>*[move → 2d/triangle/tri2_compute_barycentric.js]* | tri2_ token; 'get_'->'compute_' (it solves); emit canonical [u,v,w] order. |
409
- | `triangle2d_contains_point` | `tri2_contains_point` | [2d/triangle2d_contains_point.js](2d/triangle2d_contains_point.js) <br>*[move → 2d/triangle/tri2_contains_point.js]* | tri2_ token; fix [u,v,w] read order to match producer. |
410
- | `compute_polygon_area_2d` | `polygon2_signed_area` | [2d/compute_polygon_area_2d.js](2d/compute_polygon_area_2d.js) <br>*[move → 2d/polygon/polygon2_signed_area.js]* | Glued prefix-digit polygon2_; drop compute_/2d suffix; signed. |
411
- | `fixed_convex_hull_humus` | `convex_hull_fixed_count_2d_bruteforce` | [2d/convex-hull/fixed_convex_hull_humus.js](2d/convex-hull/fixed_convex_hull_humus.js) <br>*[move → 2d/convex-hull/convex_hull_fixed_count_2d_bruteforce.js]* | Add dimension token; remove proper-noun 'humus'; describe behavior. |
412
- | `fixed_convex_hull_relaxation` | `convex_hull_fixed_count_2d_relaxation` | [2d/convex-hull/fixed_convex_hull_relaxation.js](2d/convex-hull/fixed_convex_hull_relaxation.js) <br>*[move → 2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js]* | Add dimension token; fix JSDoc Float64/Float32 mismatch. |
413
- | `triangle_compute_signed_volume` | `tri3_compute_signed_volume` | [3d/triangle/triangle_compute_signed_volume.js](3d/triangle/triangle_compute_signed_volume.js) <br>*[move → 3d/triangle/tri3_compute_signed_volume.js]* | Bare 'triangle_' (no digit, is 3d) -> tri3_ prefix. |
414
- | `triangle_mesh_compute_signed_volume` | `tri3_mesh_compute_signed_volume` | [3d/triangle/triangle_mesh_compute_signed_volume.js](3d/triangle/triangle_mesh_compute_signed_volume.js) <br>*[move → 3d/triangle/tri3_mesh_compute_signed_volume.js]* | tri3_ token for the 3d triangle family. |
415
- | `compute_triangle_area_3d` | `tri3_area` | [3d/triangle/compute_triangle_area_3d.js](3d/triangle/compute_triangle_area_3d.js) <br>*[move → 3d/triangle/tri3_area.js]* | _3d suffix -> tri3_ prefix; bare-metric drops compute_; document UNSIGNED. |
416
- | `compute_triangle_normal` | `tri3_compute_normal_v3_objects` | [3d/triangle/compute_triangle_normal.js](3d/triangle/compute_triangle_normal.js) <br>*[move → 3d/triangle/tri3_compute_normal_v3_objects.js]* | Object-arg wrapper over v3_compute_triangle_normal; tri3_ prefix; add result_offset. |
417
- | `v3_compute_triangle_normal` | `tri3_compute_normal` | [3d/triangle/v3_compute_triangle_normal.js](3d/triangle/v3_compute_triangle_normal.js) <br>*[move → 3d/triangle/tri3_compute_normal.js]* | Canonical scalar core; move to tri3_ family (it produces a triangle normal, not a generic v3 op). |
418
- | `aabb3_compute_from_triangle` | `aabb3_compute_from_triangle` | [3d/triangle/aabb3_compute_from_triangle.js](3d/triangle/aabb3_compute_from_triangle.js) <br>*[move → 3d/triangle/aabb3_compute_from_triangle.js]* | Conforms; listed as exemplar of indexed-vertex calling convention. |
419
- | `triangle_intersects_clipping_volume` | `tri3_intersects_clipping_volume` | [3d/triangle/triangle_intersects_clipping_volume.js](3d/triangle/triangle_intersects_clipping_volume.js) <br>*[move → 3d/triangle/tri3_intersects_clipping_volume.js]* | tri3_ prefix. |
420
- | `triangle_compute_plane_side` | `tri3_compute_plane_side` | [3d/triangle/triangle_compute_plane_side.js](3d/triangle/triangle_compute_plane_side.js) <br>*[move → 3d/triangle/tri3_compute_plane_side.js]* | tri3_ prefix; fix 'ave' typo. |
421
- | `triangle3_incenter` | `tri3_incenter` | [3d/triangle/triangle3_incenter.js](3d/triangle/triangle3_incenter.js) <br>*[move → 3d/triangle/tri3_incenter.js]* | Standardize the spelled-out 'triangle3' -> tri3_ token used across the family. |
422
- | `shape_mesh_from_geometry` | `shape3_mesh_from_geometry` | [3d/shape/shape_mesh_from_geometry.js](3d/shape/shape_mesh_from_geometry.js) <br>*[move → 3d/shape/shape3_mesh_from_geometry.js]* | Optional dimension token for the shape family; keep 'geometry' (neutral, indexed-buffer). |
423
- | `shape3d_voxelize_to_grid` | `shape3_voxelize_to_grid` | [3d/shape/util/shape3d_voxelize_to_grid.js](3d/shape/util/shape3d_voxelize_to_grid.js) <br>*[move → 3d/shape/util/shape3_voxelize_to_grid.js]* | Use tri3_/aabb3_-style glued-prefix-digit token shape3_ (not shape3d_). |
424
- | `spline_bezier2_2d` | `spline2_quadratic_bezier` | [2d/spline_bezier2_2d.js](2d/spline_bezier2_2d.js) <br>*[move → 2d/spline2_quadratic_bezier.js]* | Double dimension token (bezier2 + _2d) and clashing order with spline2_bezier; use spline2_ prefix + spell quadratic. |
425
- | `normalize_angle_rad` | `normalize_angle_rad` | [normalize_angle_rad.js](normalize_angle_rad.js) <br>*[move → 1d/normalize_angle_rad.js]* | Name OK; relocate from geom root into a 1d/ (or math) subfolder for discoverability — the _rad unit token is fine. |
426
-
427
- ### misleading-name-lies-about-behavior (26)
428
-
429
- | old | → new | file | why |
430
- |-----|-------|------|-----|
431
- | `line2_distance_to_point_sqr` | `line2_compute_segment_point_distance_sqr` | [2d/line/line2_distance_to_point_sqr.js](2d/line/line2_distance_to_point_sqr.js) <br>*[move → 2d/line/line2_compute_segment_point_distance_sqr.js]* | FLAGSHIP: clamp01 proves it measures distance to a SEGMENT, not an infinite line. Mirror the correctly-named 3d sibling line3_compute_segment_point_distance_sqr. |
432
- | `line_segment_intersection_fraction_2d` | `line2_segment_intersection_fraction_2d` | [2d/line/line_segment_intersection_fraction_2d.js](2d/line/line_segment_intersection_fraction_2d.js) <br>*[move → 2d/line/line2_segment_intersection_fraction_2d.js]* | First operand is an unbounded line, second a segment; encode both honestly (line2 + segment). |
433
- | `line3_compute_nearest_point_to_point` | `line3_compute_segment_closest_point` | [3d/line/line3_compute_nearest_point_to_point.js](3d/line/line3_compute_nearest_point_to_point.js) <br>*[move → 3d/line/line3_compute_segment_closest_point.js]* | Delegates to the SEGMENT variant (clamp01) so 'line' lies; 'nearest'->'closest'; drop PointToPoint stutter. |
434
- | `ray3_distance_to_point` | `ray3_compute_point_projection_t` | [3d/ray/ray3_distance_to_point.js](3d/ray/ray3_distance_to_point.js) <br>*[move → 3d/ray/ray3_compute_point_projection_t.js]* | Returns the projection parameter t (signed distance ALONG the ray), not perpendicular distance — name lies. |
435
- | `ConicRay.angle (field)` | `ConicRay.halfAngle` | [ConicRay.js](ConicRay.js) <br>*[move → ConicRay.js]* | Field stores a half-angle; bare 'angle' under-specifies. |
436
- | `v3_angle_atan2_between` | `v3_angle_stable` | [vec3/v3_angle_atan2_between.js](vec3/v3_angle_atan2_between.js) <br>*[move → vec3/v3_angle_stable.js]* | atan2 leaks implementation into the name; expose public meaning (numerically stable angle). |
437
- | `v3_matrix4_rotate` | `v3_matrix4_rotate_unit` | [vec3/v3_matrix4_rotate.js](vec3/v3_matrix4_rotate.js) <br>*[move → vec3/v3_matrix4_rotate_unit.js]* | Always renormalizes output; name should signal unit-length result. |
438
- | `Vector4.add3` | `Vector4.add` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | add3 confusingly reads as '3d add'; it is the element-wise add. Match Vector2/Vector3 add. |
439
- | `m3_multiply_vec3` | `m3_scale_columns_by_vec3` | [mat3/m3_multiply_vec3.js](mat3/m3_multiply_vec3.js) <br>*[move → mat3/m3_scale_columns_by_vec3.js]* | Name LIES: it is not a matrix*vector product (would yield a vec3); it column-scales and writes a 3x3. |
440
- | `m3_cm_invert` | `m3_invert` | [mat3/m3_cm_invert.js](mat3/m3_cm_invert.js) <br>*[move → mat3/m3_invert.js]* | Inversion is layout-agnostic; cm_ tag implies a non-existent rm_ counterpart. |
441
- | `aabb2_intersects_point` | `aabb2_contains_point` | [2d/aabb/aabb2_intersects_point.js](2d/aabb/aabb2_intersects_point.js) <br>*[move → 2d/aabb/aabb2_contains_point.js]* | It is a containment test, not surface intersection; reconcile with AABB2.containsPoint and delegate. |
442
- | `aabb3_project_to_2d (file aabb3_compute_projected_area.js)` | `aabb3_projected_area` | [3d/aabb/aabb3_compute_projected_area.js](3d/aabb/aabb3_compute_projected_area.js) <br>*[move → 3d/aabb/aabb3_projected_area.js]* | Name LIES (returns a scalar AREA, not a 2D box) AND mismatches filename; bare-metric drops compute_. |
443
- | `aabb3_combined_surface_area` | `aabb3_union_half_surface_area` | [3d/aabb/aabb3_combined_surface_area.js](3d/aabb/aabb3_combined_surface_area.js) <br>*[move → 3d/aabb/aabb3_union_half_surface_area.js]* | Returns HALF surface area of the union (off by 2x vs full); name must say half. |
444
- | `aabb3_box_surface_area_2` | `aabb3_half_surface_area` | [3d/aabb/aabb3_box_surface_area_2.js](3d/aabb/aabb3_box_surface_area_2.js) <br>*[move → 3d/aabb/aabb3_half_surface_area.js]* | Returns HALF area; '_2' is a meaningless disambiguator (no _1). |
445
- | `Quaternion.__setFromEuler` | `(remove; typed per-order methods)` | [Quaternion.js](Quaternion.js) <br>*[move → Quaternion.js]* | String-order dispatcher violates typed-over-magic; also fix 'bust be' typo. Keep typed fromEulerAngles<ORDER>. |
446
- | `Quaternion.process` | `Quaternion.watch` | [Quaternion.js](Quaternion.js) <br>*[move → Quaternion.js]* | Opaque name for 'invoke + subscribe onChanged'. |
447
- | `sphere_matrix4_project (file sphere_matrix4_transform.js)` | `sphere_matrix4_transform` | [3d/sphere/sphere_matrix4_transform.js](3d/sphere/sphere_matrix4_transform.js) <br>*[move → 3d/sphere/sphere_matrix4_transform.js]* | Export name LIES ('project' but it transforms) AND mismatches filename; transform is correct. |
448
- | `sphere_intersects_point` | `sphere_contains_point` | [3d/sphere/sphere_intersects_point.js](3d/sphere/sphere_intersects_point.js) <br>*[move → 3d/sphere/sphere_contains_point.js]* | Tests point-inside (containment), not surface intersection. |
449
- | `orientation3_array` | `orient2d_indexed` | [2d/convex-hull/orientation3_array.js](2d/convex-hull/orientation3_array.js) <br>*[move → 2d/convex-hull/orient2d_indexed.js]* | 'orientation3' LIES about dimension (it is 2D; 3=points). Use orient2d + _indexed for index-into-flat-array inputs. |
450
- | `plane3_compute_convex_3_plane_intersection` | `plane3_compute_3_plane_intersection` | [3d/plane/plane3_compute_convex_3_plane_intersection.js](3d/plane/plane3_compute_convex_3_plane_intersection.js) <br>*[move → 3d/plane/plane3_compute_3_plane_intersection.js]* | 'convex' lies (only non-degeneracy required). |
451
- | `bt_mesh_compute_vertex_quadratics` | `bt_mesh_compute_vertex_quadrics` | [3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js](3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js) <br>*[move → 3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js]* | Returns Quadric3 (quadric error metric), not quadratics; align with class name Quadric3. |
452
- | `bt_face_get_attached_faces / bt_face_get_neighbour_faces` | `bt_face_get_vertex_adjacent_faces / bt_face_get_edge_adjacent_faces` | [3d/topology/struct/binary/query/bt_face_get_attached_faces.js](3d/topology/struct/binary/query/bt_face_get_attached_faces.js) <br>*[move → 3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.js]* | attached(vertex-adj) vs neighbour(edge-adj) distinction must be in the name, not an easily-swapped noun. |
453
- | `computeTopoMeshBoundiningBox` | `compute_topo_mesh_bounding_box` | [3d/topology/bounds/computeTopoMeshBoundiningBox.js](3d/topology/bounds/computeTopoMeshBoundiningBox.js) <br>*[move → 3d/topology/bounds/compute_topo_mesh_bounding_box.js]* | FIX typo 'Boundining'; camelCase->snake (topology compute layer). |
454
- | `build_vertex_quadratics / deep_copy_vertex_quadratics / compute_edge_collapse_cost_quadratic` | `build_vertex_quadrics / deep_copy_vertex_quadrics / compute_edge_collapse_cost_quadric` | [3d/topology/simplify/quadratic/(various)](3d/topology/simplify/quadratic/(various)) <br>*[move → 3d/topology/simplify/quadric/(various)]* | Pervasive 'quadratics' misnomer for Quadric3; unify on 'quadric'. |
455
- | `compute_tetrahedron_volume / compute_tetrahedron_quality` | `tetrahedral_mesh_compute_tet_volume / tetrahedral_mesh_compute_tet_quality` | [3d/tetrahedra/compute_tetrahedron_volume.js](3d/tetrahedra/compute_tetrahedron_volume.js) <br>*[move → 3d/tetrahedra/tetrahedral_mesh_compute_tet_volume.js]* | Resolve the compute_tetrahedron_X (mesh) vs tetrahedron_compute_X (indexed) token-order collision: mesh-forms join the tetrahedral_mesh_ family; indexed primitives keep tetrahedron_compute_*. Also compute_tetrahedron_volume returns SIGNED — say so. |
456
- | `TopoMesh.setFacedUnindexed` | `TopoMesh.setFacesUnindexed` | [3d/topology/struct/TopoMesh.js](3d/topology/struct/TopoMesh.js) <br>*[move → 3d/topology/struct/TopoMesh.js]* | Typo 'Faced'->'Faces'. |
457
-
458
- ### camelCase-legacy-islands (21)
459
-
460
- | old | → new | file | why |
461
- |-----|-------|------|-----|
462
- | `eulerAnglesFromMatrix` | `m4_euler_angles` | [3d/mat4/eulerAnglesFromMatrix.js](3d/mat4/eulerAnglesFromMatrix.js) <br>*[move → 3d/mat4/m4_euler_angles.js]* | camelCase island -> snake m4_ prefix. |
463
- | `quat3_createFromAxisAngle` | `quat3_from_axis_angle` | [3d/quaternion/quat3_createFromAxisAngle.js](3d/quaternion/quat3_createFromAxisAngle.js) <br>*[move → 3d/quaternion/quat3_from_axis_angle.js]* | camelCase-in-snake hybrid + 'create' lies (no alloc); move output to first (out,out_offset), take scalar axis. |
464
- | `computeBoundingSphereOfSpheres` | `sphere_compute_bounding_of_spheres` | [packing/computeBoundingSphereOfSpheres.js](packing/computeBoundingSphereOfSpheres.js) <br>*[move → packing/sphere_compute_bounding_of_spheres.js]* | camelCase island -> snake; align with the of_2_spheres sibling; fix sqr_distance_to_center mislabel (holds linear distance). |
465
- | `computeConePlaneSide` | `cone_compute_plane_side` | [3d/cone/computeConePlaneSide.js](3d/cone/computeConePlaneSide.js) <br>*[move → 3d/cone/cone_compute_plane_side.js]* | camelCase island -> snake cone_ prefix; fix mixed plane_normal_x/originX param casing. |
466
- | `computeConeBoundingBox` | `cone_compute_bounding_box` | [3d/cone/computeConeBoundingBox.js](3d/cone/computeConeBoundingBox.js) <br>*[move → 3d/cone/cone_compute_bounding_box.js]* | camelCase island -> snake; align token order with circle3_compute_bounding_box. |
467
- | `computeTriangleRayIntersection` | `tri3_ray_intersection` | [3d/triangle/computeTriangleRayIntersection.js](3d/triangle/computeTriangleRayIntersection.js) <br>*[move → 3d/triangle/tri3_ray_intersection.js]* | camelCase island -> snake tri3_; fix finate/triange typos. |
468
- | `computeTriangleRayIntersectionBarycentric` | `tri3_ray_intersection_barycentric` | [3d/triangle/computeTriangleRayIntersectionBarycentric.js](3d/triangle/computeTriangleRayIntersectionBarycentric.js) <br>*[move → 3d/triangle/tri3_ray_intersection_barycentric.js]* | camelCase->snake tri3_; fix [t,u,v] doc/impl mismatch. |
469
- | `computeTriangleRayIntersectionBarycentricEdge` | `tri3_ray_intersection_barycentric_edge` | [3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js](3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js) <br>*[move → 3d/triangle/tri3_ray_intersection_barycentric_edge.js]* | camelCase->snake tri3_. |
470
- | `rayTriangleIntersection` | `tri3_ray_intersection_v3_objects` | [3d/triangle/rayTriangleIntersection.js](3d/triangle/rayTriangleIntersection.js) <br>*[move → 3d/triangle/tri3_ray_intersection_v3_objects.js]* | camelCase + reversed word order; snake tri3_; mark the Vector3-object wrapper. |
471
- | `computeTriangleClosestPointToPointBarycentric` | `tri3_closest_point_barycentric` | [3d/triangle/computeTriangleClosestPointToPointBarycentric.js](3d/triangle/computeTriangleClosestPointToPointBarycentric.js) <br>*[move → 3d/triangle/tri3_closest_point_barycentric.js]* | camelCase->snake tri3_; drop PointToPoint stutter; keep 'closest'. |
472
- | `frustum3_computeNearestPointToPoint` | `frustum3_compute_closest_point` | [3d/frustum/frustum3_computeNearestPointToPoint.js](3d/frustum/frustum3_computeNearestPointToPoint.js) <br>*[move → 3d/frustum/frustum3_compute_closest_point.js]* | Only camelCase export here -> snake; nearest->closest; drop PointToPoint; FIX inverted boolean return semantics. |
473
- | `mortonEncode_LUT` | `v3_morton_encode_lut` | [3d/morton/mortonEncode_LUT.js](3d/morton/mortonEncode_LUT.js) <br>*[move → 3d/morton/v3_morton_encode_lut.js]* | camelHybrid -> snake v3_ prefix. |
474
- | `mortonEncode_magicbits` | `v3_morton_encode_magicbits` | [3d/morton/mortonEncode_magicbits.js](3d/morton/mortonEncode_magicbits.js) <br>*[move → 3d/morton/v3_morton_encode_magicbits.js]* | camelHybrid -> snake v3_ prefix; v3_morton_encode default-alias becomes a thin re-export. |
475
- | `randomPointInBox` | `random_point_in_box` | [random/randomPointInBox.js](random/randomPointInBox.js) <br>*[move → random/random_point_in_box.js]* | camelCase folder -> snake. (See open question on In/On token.) |
476
- | `randomPointOnBox` | `random_point_on_box` | [random/randomPointOnBox.js](random/randomPointOnBox.js) <br>*[move → random/random_point_on_box.js]* | camelCase -> snake. |
477
- | `randomPointInSphere / OnSphere / InCircle / InPoint` | `random_point_in_sphere (etc.)` | [random/randomPointInSphere.js](random/randomPointInSphere.js) <br>*[move → random/random_point_in_sphere.js]* | camelCase -> snake across the random/ family; rename destination_offset->result_offset in random_point_in_point. |
478
- | `packMaxRectangles / packOneBox / findBestContainer / cutArea / removeRedundantBoxes / costBy*` | `pack_max_rectangles / pack_one_box / find_best_container / cut_area / remove_redundant_boxes / cost_by_*` | [packing/max-rect/packMaxRectangles.js](packing/max-rect/packMaxRectangles.js) <br>*[move → packing/max-rect/pack_max_rectangles.js]* | Entire camelCase folder -> snake. |
479
- | `computeTopoMeshBoundingSphere / computeTopoMeshVertexDuplicates / computeTriangleClusterNormalBoundingCone` | `compute_topo_mesh_bounding_sphere / compute_topo_mesh_vertex_duplicates / compute_triangle_cluster_normal_bounding_cone` | [3d/topology/bounds/computeTopoMeshBoundingSphere.js](3d/topology/bounds/computeTopoMeshBoundingSphere.js) <br>*[move → 3d/topology/bounds/compute_topo_mesh_bounding_sphere.js]* | camelCase topology layer -> snake. |
480
- | `simplifyTopoMesh / simplifyTopoMesh2` | `simplify_topo_mesh_quadric / simplify_topo_mesh_decimate` | [3d/topology/simplify/simplifyTopoMesh.js](3d/topology/simplify/simplifyTopoMesh.js) <br>*[move → 3d/topology/simplify/simplify_topo_mesh_quadric.js]* | camelCase->snake; numeric '2' suffix carries no semantics — name by algorithm; consolidate duplicate entry points. |
481
- | `computeEdgeCollapseCost / collapseEdge / partialEdgeCollapse / EdgeCollapseCandidate` | `compute_edge_collapse_cost / collapse_edge / partial_edge_collapse / EdgeCollapseCandidate(class kept)` | [3d/topology/simplify/(various)](3d/topology/simplify/(various)) <br>*[move → 3d/topology/simplify/(various)]* | camelCase free fns -> snake; reconcile the duplicate cost functions (camel vs snake) into one. |
482
- | `StaticR2Tree (mixed casing methods)` | `StaticRTree2D (snake_case methods)` | [2d/r-tree/StaticR2Tree.js](2d/r-tree/StaticR2Tree.js) <br>*[move → 2d/r-tree/StaticRTree2D.js]* | 'R2'->'2D' dimension token; unify mixed camel/snake methods onto snake (matches BVH2D/SpatialHashGrid). |
483
-
484
- ### redundant-token-repetition (17)
485
-
486
- | old | → new | file | why |
487
- |-----|-------|------|-----|
488
- | `line_segment_compute_line_segment_intersection_array_2d` | `segment2_segment_compute_intersection_array_2d` | [2d/line/line_segment_compute_line_segment_intersection_array_2d.js](2d/line/line_segment_compute_line_segment_intersection_array_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_array_2d.js]* | FLAGSHIP: 'line_segment' stuttered twice + verbose. One segment token per operand role; _array kept (it is the offset-addressed flat-array writer, the correct meaning). |
489
- | `line_segment_compute_line_segment_intersection_2d` | `segment2_segment_compute_intersection_v2_2d` | [2d/line/line_segment_compute_line_segment_intersection_2d.js](2d/line/line_segment_compute_line_segment_intersection_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_v2_2d.js]* | Vector2-sink wrapper; de-stutter and mark the v2-object sink with _v2; move output to first (result,...) per convention. |
490
- | `line_segment_compute_line_segment_intersection_vectors_2d` | `segment2_segment_compute_intersection_v2_objects_2d` | [2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js](2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_v2_objects_2d.js]* | De-stutter; clarify it takes Vector2 objects for both operands. |
491
- | `v3_triple_cross_product` | `v3_triple_cross` | [vec3/v3_triple_cross_product.js](vec3/v3_triple_cross_product.js) <br>*[move → vec3/v3_triple_cross.js]* | Drop _product to match v3_cross / v3_cross_array. |
492
- | `v3_angle_between` | `v3_angle` | [vec3/v3_angle_between.js](vec3/v3_angle_between.js) <br>*[move → vec3/v3_angle.js]* | Drop redundant infix 'between' (two operands implied). |
493
- | `v3_angle_cos_between` | `v3_cos_angle` | [vec3/v3_angle_cos_between.js](vec3/v3_angle_cos_between.js) <br>*[move → vec3/v3_cos_angle.js]* | Drop 'between'; lead with the returned quantity (cos). |
494
- | `Vector3.projectOntoVector3` | `Vector3.projectOnto` | [Vector3.js](Vector3.js) <br>*[move → Vector3.js]* | Redundant Vector3 token (class is the type). |
495
- | `aabb2_array_combine` | `aabb2_union_array` | [2d/aabb/aabb2_array_combine.js](2d/aabb/aabb2_array_combine.js) <br>*[move → 2d/aabb/aabb2_union_array.js]* | Box-union has 3 names (combine/expandToFit/resizeToFit); standardize on union; suffix _array (offset operands). |
496
- | `AABB2.overlapExists / expandToFit` | `AABB2.intersects / union` | [2d/aabb/AABB2.js](2d/aabb/AABB2.js) <br>*[move → 2d/aabb/AABB2.js]* | Align class with free-fn intersects + union vocabulary. |
497
- | `aabb3_near_distance_to_intersection_ray_segment` | `aabb3_ray_segment_entry_distance` | [3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js](3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js) <br>*[move → 3d/aabb/aabb3_ray_segment_entry_distance.js]* | 'near_distance_to_intersection' verbose/redundant; entry distance IS the intersection distance. |
498
- | `sphere_projected_sphere_radius_sqr` | `sphere_projected_radius_sqr` | [3d/sphere/sphere_projected_sphere_radius_sqr.js](3d/sphere/sphere_projected_sphere_radius_sqr.js) <br>*[move → 3d/sphere/sphere_projected_radius_sqr.js]* | Redundant 'sphere' repeated; also unify param order with sphere_project (sphere,matrix,focal_length). |
499
- | `circle_compute_circle_intersection` | `circle_compute_intersection` | [2d/circle/circle_compute_circle_intersection.js](2d/circle/circle_compute_circle_intersection.js) <br>*[move → 2d/circle/circle_compute_intersection.js]* | Redundant circle repetition. |
500
- | `plane3_compute_plane_intersection` | `plane3_compute_intersection_objects` | [3d/plane/plane3_compute_plane_intersection.js](3d/plane/plane3_compute_plane_intersection.js) <br>*[move → 3d/plane/plane3_compute_intersection_objects.js]* | Redundant 'plane' repetition; mark as the object-adapter (TODO says consolidate with plane3_intersect_plane); stop calling private __setFromRotationMatrix. |
501
- | `hexahedron_from_aabb` | `frustum3_from_aabb` | [3d/frustum/hexahedron_from_aabb.js](3d/frustum/hexahedron_from_aabb.js) <br>*[move → 3d/frustum/frustum3_from_aabb.js]* | Same 6-plane layout as frustum family; unify the noun to frustum (drop hexahedron). |
502
- | `frustum_matrix4_project / clipping_volume_matrix4_project` | `frustum3_matrix4_project / frustum3_matrix4_project_n` | [3d/frustum/frustum_matrix4_project.js](3d/frustum/frustum_matrix4_project.js) <br>*[move → 3d/frustum/frustum3_matrix4_project.js]* | Add dimension digit; unify noun (clipping_volume = n-plane frustum); standardize matrix-last param order. |
503
- | `bt_faces_shared_loop` | `bt_face_get_shared_loop` | [3d/topology/struct/binary/query/bt_faces_shared_loop.js](3d/topology/struct/binary/query/bt_faces_shared_loop.js) <br>*[move → 3d/topology/struct/binary/query/bt_face_get_shared_loop.js]* | Singularize face token + match bt_face_get_* query family. |
504
- | `tetrahedral_mesh_tet_get_neighbours` | `tetrahedral_mesh_get_neighbours` | [3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js](3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js) <br>*[move → 3d/tetrahedra/tetrahedral_mesh_get_neighbours.js]* | Redundant tet token (tetrahedral_mesh already implies tet); also move (out,out_offset) to front. |
505
-
506
- ### array-token-overload (16)
507
-
508
- | old | → new | file | why |
509
- |-----|-------|------|-----|
510
- | `line_segment_compute_line_segment_intersection_vectors_array_2d` | `segment2_segment_compute_intersection_to_new_array_2d` | [2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js](2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_to_new_array_2d.js]* | This one ALLOCATES and returns a new array — _array previously lied. Use _to_new_array to signal allocation, removing the contradictory _array meaning. |
511
- | `v3_array_normalize` | `v3_normalize_array` | [vec3/v3_array_normalize.js](vec3/v3_array_normalize.js) <br>*[move → vec3/v3_normalize_array.js]* | Standardize _array as SUFFIX (offset operand) everywhere. |
512
- | `v3_array_scale` | `v3_scale_array` | [vec3/v3_array_scale.js](vec3/v3_array_scale.js) <br>*[move → vec3/v3_scale_array.js]* | Suffix _array; also unify scale verb (drop multiply_scalar split). |
513
- | `v3_array_copy` | `v3_copy_array` | [vec3/v3_array_copy.js](vec3/v3_array_copy.js) <br>*[move → vec3/v3_copy_array.js]* | Suffix _array; rename params target/source -> result/input. |
514
- | `v3_array_centroid` | `v3_centroid_v3_buffer` | [vec3/v3_array_centroid.js](vec3/v3_array_centroid.js) <br>*[move → vec3/v3_centroid_v3_buffer.js]* | Here _array meant a BATCH of many vectors (loops count*3), a different meaning — use _v3_buffer; also return void to match siblings. |
515
- | `v3_array_matrix4_rotate` | `v3_matrix4_rotate_array` | [vec3/v3_array_matrix4_rotate.js](vec3/v3_array_matrix4_rotate.js) <br>*[move → vec3/v3_matrix4_rotate_array.js]* | Suffix _array; align with v3_matrix4_multiply (which reads at offset without the token). |
516
- | `v3_array_equals` | `v3_equals_array` | [vec3/v3_array_equals.js](vec3/v3_array_equals.js) <br>*[move → vec3/v3_equals_array.js]* | Suffix _array (offset operands). |
517
- | `v3_array_displace_in_direction` | `v3_displace_in_direction_to_array` | [vec3/v3_array_displace_in_direction.js](vec3/v3_array_displace_in_direction.js) <br>*[move → vec3/v3_displace_in_direction_to_array.js]* | Inputs are SCALARS, only output is an array; the prefix array_ lied. _to_array marks the array output. |
518
- | `v3_cross_array` | `v3_cross_array` | [vec3/v3_cross_array.js](vec3/v3_cross_array.js) <br>*[move → vec3/v3_cross_array.js]* | Already conforms (suffix _array, both operands at offsets) — kept; listed only as the canonical exemplar siblings should match. |
519
- | `v3_dot_array_array` | `v3_dot_array` | [vec3/v3_dot_array_array.js](vec3/v3_dot_array_array.js) <br>*[move → vec3/v3_dot_array.js]* | Double _array_array banned; a single _array already implies both operands at offsets (matches v3_cross_array). |
520
- | `v3_negate_array` | `v3_negate_array` | [vec3/v3_negate_array.js](vec3/v3_negate_array.js) <br>*[move → vec3/v3_negate_array.js]* | Already conforms (suffix _array). Listed as exemplar; no change. |
521
- | `vector_scale_array` | `vector_scale_offset` | [vec/vector_scale_array.js](vec/vector_scale_array.js) <br>*[move → vec/vector_scale_offset.js]* | _array lies (it is the offset-taking scale primitive, no array-of-vectors); rename count param dimensions->n. |
522
- | `sphere_array_intersects_point` | `sphere_packed_contains_point` | [3d/sphere/sphere_array_intersects_point.js](3d/sphere/sphere_array_intersects_point.js) <br>*[move → 3d/sphere/sphere_packed_contains_point.js]* | _array meant packed single sphere [cx,cy,cz,r] (not offset operand); containment fix too. |
523
- | `sphere_array_intersects_ray` | `sphere_packed_intersects_ray` | [3d/sphere/sphere_array_intersects_ray.js](3d/sphere/sphere_array_intersects_ray.js) <br>*[move → 3d/sphere/sphere_packed_intersects_ray.js]* | _array=packed sphere; use _packed token. |
524
- | `sphere_radius_sqr_from_v3_array_transformed` | `sphere_radius_sqr_from_v3_buffer_transformed` | [3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js](3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js) <br>*[move → 3d/sphere/sphere_radius_sqr_from_v3_buffer_transformed.js]* | _array here = batch of vec3 points; use _v3_buffer; fix JSDoc typos bonding/foe. |
525
- | `removeRedundantBoxesArray` | `remove_redundant_boxes_from_array` | [packing/max-rect/removeRedundantBoxesArray.js](packing/max-rect/removeRedundantBoxesArray.js) <br>*[move → packing/max-rect/remove_redundant_boxes_from_array.js]* | camelCase->snake; '_Array' overload meant 'plain Array container' -> spell it _from_array. |
526
-
527
- ### verb-prefix-inconsistency (14)
528
-
529
- | old | → new | file | why |
530
- |-----|-------|------|-----|
531
- | `line3_closest_points_segment_segment` | `line3_compute_segment_segment_closest_points` | [3d/line/line3_closest_points_segment_segment.js](3d/line/line3_closest_points_segment_segment.js) <br>*[move → 3d/line/line3_compute_segment_segment_closest_points.js]* | Add compute_ verb to match line3_compute_* siblings; add result_offset; reorder operand tokens. |
532
- | `v3_multiply_scalar` | `v3_scale` | [vec3/v3_multiply_scalar.js](vec3/v3_multiply_scalar.js) <br>*[move → vec3/v3_scale.js]* | Two verbs (multiply_scalar vs array_scale) for one op; standardize on scale (scalar-in) + v3_scale_array (offset-in). |
533
- | `v3_compute_interior_angle` | `v3_interior_angle` | [vec3/v3_compute_interior_angle.js](vec3/v3_compute_interior_angle.js) <br>*[move → vec3/v3_interior_angle.js]* | Lone compute_ user and lone object-arg taker; drop compute_ (bare metric) and take scalar triples. |
534
- | `m3_cm_from_translation` | `m3_cm_make_translation` | [mat3/m3_cm_from_translation.js](mat3/m3_cm_from_translation.js) <br>*[move → mat3/m3_cm_make_translation.js]* | Standardize translation-matrix builder verb on make_ (matches m4_make_translation). |
535
- | `m4_compute_normal_matrix3` | `m4_normal_matrix3` | [3d/mat4/m4_compute_normal_matrix3.js](3d/mat4/m4_compute_normal_matrix3.js) <br>*[move → 3d/mat4/m4_normal_matrix3.js]* | Bare-metric: drop compute_ to match m4_rotation_translation etc. |
536
- | `aabb2_compute_area` | `aabb2_area` | [2d/aabb/aabb2_compute_area.js](2d/aabb/aabb2_compute_area.js) <br>*[move → 2d/aabb/aabb2_area.js]* | Bare-metric: drop compute_ (consistent with aabb2_distance_to_point). |
537
- | `aabb2_compute_center_from_multiple` | `aabb2_center_from_aabb2_buffer` | [2d/aabb/aabb2_compute_center_from_multiple.js](2d/aabb/aabb2_compute_center_from_multiple.js) <br>*[move → 2d/aabb/aabb2_center_from_aabb2_buffer.js]* | Drop compute_; clarify input is a batch; add result out-param to stop per-call allocation. |
538
- | `aabb3_compute_surface_area` | `aabb3_surface_area` | [3d/aabb/aabb3_compute_surface_area.js](3d/aabb/aabb3_compute_surface_area.js) <br>*[move → 3d/aabb/aabb3_surface_area.js]* | Bare-metric drops compute_. |
539
- | `aabb3_compute_half_surface_area` | `aabb3_half_surface_area_extents` | [3d/aabb/aabb3_compute_half_surface_area.js](3d/aabb/aabb3_compute_half_surface_area.js) <br>*[move → 3d/aabb/aabb3_half_surface_area_extents.js]* | Bare-metric drops compute_; note collision with the renamed single-box helper — keep the extents-primitive distinct (scalar x0..z1 in). |
540
- | `Quaternion.setFromRotationMatrix` | `Quaternion.fromRotationMatrix` | [Quaternion.js](Quaternion.js) <br>*[move → Quaternion.js]* | Match the from* converter family (drop set prefix). |
541
- | `is_point_within_planes` | `plane3_contains_point_within_set` | [3d/plane/is_point_within_planes.js](3d/plane/is_point_within_planes.js) <br>*[move → 3d/plane/plane3_contains_point_within_set.js]* | Add plane3_ prefix; remove contradictory @private on an export. |
542
- | `fill_in_a_cavity` | `tetrahedral_mesh_fill_cavity` | [3d/topology/delaunay/fill_in_a_cavity.js](3d/topology/delaunay/fill_in_a_cavity.js) <br>*[move → 3d/topology/delaunay/tetrahedral_mesh_fill_cavity.js]* | Prose-style name with articles; use domain-token verb_noun. |
543
- | `qt_match_data_by_circle` | `qt_collect_by_circle (merge w/ optional predicate)` | [2d/quad-tree/qt_match_data_by_circle.js](2d/quad-tree/qt_match_data_by_circle.js) <br>*[move → 2d/quad-tree/qt_collect_by_circle.js]* | match_=collect_+predicate; collapse the three-verb sprawl (collect_/match_/query_data_) onto one collect_ verb. |
544
- | `make_justified_point_grid` | `aabb3_emit_point_grid` | [3d/util/make_justified_point_grid.js](3d/util/make_justified_point_grid.js) <br>*[move → 3d/util/aabb3_emit_point_grid.js]* | 'make_' verb is a lone outlier; it iterates over an AABB3 emitting points via callback — encode the type and the emit semantics. |
545
-
546
- ### output-arg-placement-and-missing-offset (14)
547
-
548
- | old | → new | file | why |
549
- |-----|-------|------|-----|
550
- | `ray3_array_compose` | `ray3_compose_array` | [3d/ray/ray3_array_compose.js](3d/ray/ray3_array_compose.js) <br>*[move → 3d/ray/ray3_compose_array.js]* | Suffix _array (offset convention); ADD missing output_offset param to match ray3 array family. |
551
- | `v3_rigid_align_paired_unit_vectors (out_quaternion last)` | `v3_rigid_align_paired_unit_vectors` | [vec3/v3_rigid_align_paired_unit_vectors.js](vec3/v3_rigid_align_paired_unit_vectors.js) <br>*[move → vec3/v3_rigid_align_paired_unit_vectors.js]* | Name acceptable; move out_quaternion to FIRST param to match output-first rule. |
552
- | `apply_mat4_transform_to_v3_array` | `m4_transform_v3_buffer` | [3d/mat4/apply_mat4_transform_to_v3_array.js](3d/mat4/apply_mat4_transform_to_v3_array.js) <br>*[move → 3d/mat4/m4_transform_v3_buffer.js]* | m4_ prefix; _v3_buffer = batch of vectors (distinct from offset-operand _array); move output to first. |
553
- | `apply_mat4_transform_to_direction_v3_array` | `m4_transform_direction_v3_buffer` | [3d/mat4/apply_mat4_transform_to_direction_v3_array.js](3d/mat4/apply_mat4_transform_to_direction_v3_array.js) <br>*[move → 3d/mat4/m4_transform_direction_v3_buffer.js]* | Same as above; 'direction' kept (normalizes result). |
554
- | `aabb2_from_v2_array` | `aabb2_from_v2_buffer` | [2d/aabb/aabb2_from_v2_array.js](2d/aabb/aabb2_from_v2_array.js) <br>*[move → 2d/aabb/aabb2_from_v2_buffer.js]* | Input is a batch of points (not offset operand); ADD missing result_offset (currently hardcodes 0). |
555
- | `aabb3_expand_array` | `aabb3_expand_array` | [3d/aabb/aabb3_expand_array.js](3d/aabb/aabb3_expand_array.js) <br>*[move → 3d/aabb/aabb3_expand_array.js]* | Name OK; FIX output-arg placement (output is 2nd) to output-first; rename param distance->margin. |
556
- | `quat3_integrate (param result_q, no offset)` | `quat3_integrate` | [3d/quaternion/quat3_integrate.js](3d/quaternion/quat3_integrate.js) <br>*[move → 3d/quaternion/quat3_integrate.js]* | Name OK; rename result_q->out and ADD out_offset to match quat3 family. |
557
- | `polygon2_clip_axis_halfplane` | `polygon2_clip_axis_halfplane` | [2d/polygon/polygon2_clip_axis_halfplane.js](2d/polygon/polygon2_clip_axis_halfplane.js) <br>*[move → 2d/polygon/polygon2_clip_axis_halfplane.js]* | Name OK; FIX output-arg (points_out is 3rd) to output-first and add output_offset. |
558
- | `slice_frustum_linear_to_points` | `frustum3_slice_linear_to_points` | [3d/frustum/slice_frustum_linear_to_points.js](3d/frustum/slice_frustum_linear_to_points.js) <br>*[move → 3d/frustum/frustum3_slice_linear_to_points.js]* | Verb-first -> noun-first frustum3_ family; FIX output-last to output-first. |
559
- | `read_three_planes_to_array` | `frustum3_planes_to_flat_from_three` | [3d/frustum/read_three_planes_to_array.js](3d/frustum/read_three_planes_to_array.js) <br>*[move → 3d/frustum/frustum3_planes_to_flat_from_three.js]* | Output-last -> output-first; vendor token to adapter suffix; _array ambiguous (it is to-flat). |
560
- | `octahedral_uv_to_direction / octahedral_direction_to_uv` | `octahedral_uv_to_direction / octahedral_direction_to_uv` | [3d/octahedra/octahedral_uv_to_direction.js](3d/octahedra/octahedral_uv_to_direction.js) <br>*[move → 3d/octahedra/octahedral_uv_to_direction.js]* | Names OK; align equirectangular_* to THIS output-first (out,out_offset,in,in_offset) shape (the equirect functions are the ones to change). |
561
- | `equirectangular_uv_to_direction / equirectangular_direction_to_uv` | `equirectangular_uv_to_direction / equirectangular_direction_to_uv` | [3d/equirectangular/equirectangular_uv_to_direction.js](3d/equirectangular/equirectangular_uv_to_direction.js) <br>*[move → 3d/equirectangular/equirectangular_uv_to_direction.js]* | Names OK; FIX output placement to output-first to match octahedral_* siblings. |
562
- | `gjk_epa_penetration (out, no offset)` | `gjk_epa_penetration` | [3d/gjk/gjk_epa_penetration.js](3d/gjk/gjk_epa_penetration.js) <br>*[move → 3d/gjk/gjk_epa_penetration.js]* | Name OK; add out_offset to match mpr/minkowski_support; reconcile MTV encoding with mpr. |
563
- | `bvh2d_query_all_data_by_circle` | `bvh2d_query_all_data_by_circle` | [2d/bvh/bvh2d_query_all_data_by_circle.js](2d/bvh/bvh2d_query_all_data_by_circle.js) <br>*[move → 2d/bvh/bvh2d_query_all_data_by_circle.js]* | Name OK; reorder params to (result, result_offset, bvh, root, ...) to match shg_/qt_ query convention. |
564
-
565
- ### abbreviation-vert-and-matrix-param (14)
566
-
567
- | old | → new | file | why |
568
- |-----|-------|------|-----|
569
- | `v3_array_immediate_add` | `v3_add_array` | [vec3/v3_array_immediate_add.js](vec3/v3_array_immediate_add.js) <br>*[move → vec3/v3_add_array.js]* | 'immediate' is opaque; this is array(offset)+=array(offset). Mirror dot/cross array convention. |
570
- | `v3_array_add_in_place` | `v3_add` | [vec3/v3_array_add_in_place.js](vec3/v3_array_add_in_place.js) <br>*[move → vec3/v3_add.js]* | 'in_place' redundant (every writer mutates); this is the scalar-source add primitive. |
571
- | `v3_quat3_apply` | `v3_quaternion_apply` | [vec3/v3_quat3_apply.js](vec3/v3_quat3_apply.js) <br>*[move → vec3/v3_quaternion_apply.js]* | quat3 token misleads (3 reads as quat dim); use full 'quaternion' to match Quaternion class. |
572
- | `v3_quat3_apply_inverse` | `v3_quaternion_apply_inverse` | [vec3/v3_quat3_apply_inverse.js](vec3/v3_quat3_apply_inverse.js) <br>*[move → vec3/v3_quaternion_apply_inverse.js]* | Same quat3 token fix. |
573
- | `v3_matrix3_rotate (param mat3)` | `v3_matrix3_rotate` | [vec3/v3_matrix3_rotate.js](vec3/v3_matrix3_rotate.js) <br>*[move → vec3/v3_matrix3_rotate.js]* | Function name OK; rename matrix param mat3 -> m3 to match m4 convention. |
574
- | `v4_multiply_mat4` | `v4_matrix4_multiply` | [vec4/v4_multiply_mat4.js](vec4/v4_multiply_mat4.js) <br>*[move → vec4/v4_matrix4_multiply.js]* | Align matrix token with v3_matrix4_multiply (m4 family) and reorder to noun-first. |
575
- | `aabb3_intersects_line_segment (camelCase params)` | `aabb3_intersects_segment3` | [3d/aabb/aabb3_intersects_line_segment.js](3d/aabb/aabb3_intersects_line_segment.js) <br>*[move → 3d/aabb/aabb3_intersects_segment3.js]* | Two endpoints => segment; rename startX/endX -> start_x/end_x (snake). |
576
- | `quat_encode_to_uint32` | `quat3_encode_to_uint32` | [3d/quaternion/quat_encode_to_uint32.js](3d/quaternion/quat_encode_to_uint32.js) <br>*[move → 3d/quaternion/quat3_encode_to_uint32.js]* | Unify type token on quat3_ (the family majority). |
577
- | `quat_decode_from_uint32` | `quat3_decode_from_uint32` | [3d/quaternion/quat_decode_from_uint32.js](3d/quaternion/quat_decode_from_uint32.js) <br>*[move → 3d/quaternion/quat3_decode_from_uint32.js]* | Unify token quat3_; rename output/output_offset -> out/out_offset. |
578
- | `sh3_rotate_bl` | `sh3_rotate` | [3d/sphere/harmonics/sh3_rotate_bl.js](3d/sphere/harmonics/sh3_rotate_bl.js) <br>*[move → 3d/sphere/harmonics/sh3_rotate.js]* | '_bl' (BakerLab) provenance token is opaque public surface; add (array,offset) params for parity. |
579
- | `sh_compute_K` | `sh_normalization_factor` | [3d/sphere/harmonics/sh_compute_K.js](3d/sphere/harmonics/sh_compute_K.js) <br>*[move → 3d/sphere/harmonics/sh_normalization_factor.js]* | Capital K reads like a constant; verb+single-letter inconsistent with sh_index. |
580
- | `tm_vert_kill / tm_kill_only_vert / tm_vert_splice / tm_vert_fuse_duplicate_edges` | `tm_vertex_kill / tm_vertex_kill_only / tm_vertex_splice / tm_vertex_fuse_duplicate_edges` | [3d/topology/(various)](3d/topology/(various)) <br>*[move → 3d/topology/(various)]* | Standardize vertex token to 'vertex'; element-first kill order (tm_vertex_kill_only) matches tm_vertex_kill. |
581
- | `tm_kill_only_edge / tm_kill_only_face` | `tm_edge_kill_only / tm_face_kill_only` | [3d/topology/io/(various)](3d/topology/io/(various)) <br>*[move → 3d/topology/io/(various)]* | Element-first to match tm_edge_kill / tm_face_kill (verb-then-element was inverted). |
582
- | `bt_vert_kill / bt_vert_fuse_duplicate_edges / bt_kill_only_vert / bt_merge_verts_by_distance` | `bt_vertex_kill / bt_vertex_fuse_duplicate_edges / bt_vertex_kill_only / bt_merge_vertices_by_distance` | [3d/topology/struct/binary/io/vertex/(various)](3d/topology/struct/binary/io/vertex/(various)) <br>*[move → 3d/topology/struct/binary/io/vertex/(various)]* | Unify vertex token to 'vertex' (matches BinaryTopology vertex_* accessors); element-first kill order. |
583
-
584
- ### predicate-vs-producer-vs-degree (10)
585
-
586
- | old | → new | file | why |
587
- |-----|-------|------|-----|
588
- | `line_segment_line_segment_intersection_exists_2d` | `segment2_intersects_segment2_2d` | [2d/line/line_segment_line_segment_intersection_exists_2d.js](2d/line/line_segment_line_segment_intersection_exists_2d.js) <br>*[move → 2d/line/segment2_intersects_segment2_2d.js]* | Boolean predicate -> intersects form; drop doubled token and _exists. |
589
- | `intersect_ray_2d` | `ray2_ray2_compute_intersection_array_2d` | [2d/intersect_ray_2d.js](2d/intersect_ray_2d.js) <br>*[move → 2d/line/ray2_ray2_compute_intersection_array_2d.js]* | Verb-first name breaks noun/type-first rule; bare verb 'intersect' banned; move under 2d/line/; fix JSDoc 'coplanar' (a 3D term). |
590
- | `aabb2_overlap_exists` | `aabb2_intersects_aabb2` | [2d/aabb/aabb2_overlap_exists.js](2d/aabb/aabb2_overlap_exists.js) <br>*[move → 2d/aabb/aabb2_intersects_aabb2.js]* | Standardize boolean box-box test on intersects_<other>. |
591
- | `aabb2_compute_overlap` | `aabb2_compute_intersection` | [2d/aabb/aabb2_compute_overlap.js](2d/aabb/aabb2_compute_overlap.js) <br>*[move → 2d/aabb/aabb2_compute_intersection.js]* | It writes the overlap REGION (geometry producer) -> compute_*_intersection form; reserve overlap/intersects for the bool. |
592
- | `Rectangle.intersects / Rectangle.overlaps` | `Rectangle.intersects (one method, documented closed-interval)` | [2d/Rectangle.js](2d/Rectangle.js) <br>*[move → 2d/Rectangle.js]* | Two methods read as synonyms but differ in boundary semantics; collapse to one with documented semantics (delegate to aabb2_intersects_aabb2). |
593
- | `aabb3_intersects_frustum_degree` | `aabb3_classify_against_frustum` | [3d/aabb/aabb3_intersects_frustum_degree.js](3d/aabb/aabb3_intersects_frustum_degree.js) <br>*[move → 3d/aabb/aabb3_classify_against_frustum.js]* | Returns a 3-state degree, not a bool; intersects_ prefix lies about return shape. |
594
- | `aabb3_array_intersects_frustum_degree` | `aabb3_classify_against_frustum_array` | [3d/aabb/aabb3_array_intersects_frustum_degree.js](3d/aabb/aabb3_array_intersects_frustum_degree.js) <br>*[move → 3d/aabb/aabb3_classify_against_frustum_array.js]* | Same degree-not-bool fix; suffix _array (offset aabb). |
595
- | `aabb3_detailed_volume_intersection` | `aabb3_compute_clipping_volume_intersection` | [3d/aabb/aabb3_detailed_volume_intersection.js](3d/aabb/aabb3_detailed_volume_intersection.js) <br>*[move → 3d/aabb/aabb3_compute_clipping_volume_intersection.js]* | Producer named with bare noun 'intersection' among intersects predicates; also FIX JSDoc param order (plane_mask/planes swapped). |
596
- | `plane3_intersect_plane` | `plane3_compute_intersection` | [3d/plane/plane3_intersect_plane.js](3d/plane/plane3_intersect_plane.js) <br>*[move → 3d/plane/plane3_compute_intersection.js]* | Bare verb 'intersect' banned; this is the canonical scalar producer. |
597
- | `bt_query_edge_is_boundary` | `bt_edge_is_boundary` | [3d/topology/struct/binary/query/bt_query_edge_is_boundary.js](3d/topology/struct/binary/query/bt_query_edge_is_boundary.js) <br>*[move → 3d/topology/struct/binary/query/bt_edge_is_boundary.js]* | Lone bt_query_ prefix; sibling predicates (bt_edge_has_vertex, bt_face_is_degenerate) omit it. |
598
-
599
- ### filename-export-mismatch-and-multi-export (10)
600
-
601
- | old | → new | file | why |
602
- |-----|-------|------|-----|
603
- | `m3_make_rotation_TBN (file m3_make_rotation.js)` | `m3_make_rotation_TBN` | [mat3/m3_make_rotation.js](mat3/m3_make_rotation.js) <br>*[move → mat3/m3_make_rotation_TBN.js]* | Rename FILE to match export (one-file-one-export convention). |
604
- | `aabb_build_frustum (file aabb3_build_frustum.js)` | `aabb3_build_frustum` | [3d/aabb/aabb3_build_frustum.js](3d/aabb/aabb3_build_frustum.js) <br>*[move → 3d/aabb/aabb3_build_frustum.js]* | Export missing the dimension digit; align with filename and aabb3_ family. |
605
- | `aabb3_score_boxes_SAH_delta (not exported)` | `aabb3_score_boxes_sah_delta (ADD export)` | [3d/aabb/aabb3_score_boxes_SAH_delta.js](3d/aabb/aabb3_score_boxes_SAH_delta.js) <br>*[move → 3d/aabb/aabb3_score_boxes_sah_delta.js]* | Declared but never exported (dead public surface); export it and reconcile half-vs-full-area math. |
606
- | `compute_legendre_polynomial (0-byte file)` | `(delete or implement as sh_legendre_polynomial)` | [3d/sphere/harmonics/compute_legendre_polynomial.js](3d/sphere/harmonics/compute_legendre_polynomial.js) <br>*[move → 3d/sphere/harmonics/sh_legendre_polynomial.js]* | Empty/dead file exporting nothing; third naming style. Delete or implement under sh_ band-generic prefix. |
607
- | `validate (file aabb2_validate_packing.js, not exported)` | `aabb2_validate_packing (ADD export)` | [packing/max-rect/aabb2_validate_packing.js](packing/max-rect/aabb2_validate_packing.js) <br>*[move → packing/max-rect/aabb2_validate_packing.js]* | File promises a public aabb2_ validator; inner fn is unnamed-by-convention and unexported. |
608
- | `encode_unit_to_hemioct (file encode_unit3_hemioct.js)` | `encode_unit_to_hemioct` | [3d/normal/hemioct/encode_unit3_hemioct.js](3d/normal/hemioct/encode_unit3_hemioct.js) <br>*[move → 3d/normal/hemioct/encode_unit_to_hemioct.js]* | Rename FILE to match export (one-file-one-export). |
609
- | `encode_unit_to_azimuth / decode_azimuth_to_unit (folder lamber_azimuth, file transform.js)` | `encode_unit_to_azimuth / decode_azimuth_to_unit` | [3d/normal/lamber_azimuth/transform.js](3d/normal/lamber_azimuth/transform.js) <br>*[move → 3d/normal/lambert_azimuth/encode_unit_to_azimuth.js]* | Fix folder typo lamber->lambert; split the 2-export transform.js into per-export files. |
610
- | `encode_unit_to_spheremap (file sphere_map_transform.js) + dead decode_spheremap_to_unit` | `encode_unit_to_spheremap / decode_spheremap_to_unit (ADD export, split files)` | [3d/normal/spherical/sphere_map_transform.js](3d/normal/spherical/sphere_map_transform.js) <br>*[move → 3d/normal/spherical/encode_unit_to_spheremap.js]* | File name mismatch; the decode companion is declared but NOT exported (asymmetric public surface) — export it. |
611
- | `bt_mesh_face_poke (file bt_face_poke.js)` | `bt_face_poke` | [3d/topology/struct/binary/io/face/bt_face_poke.js](3d/topology/struct/binary/io/face/bt_face_poke.js) <br>*[move → 3d/topology/struct/binary/io/face/bt_face_poke.js]* | Wrong object token (single-face op, not bt_mesh_) AND export mismatches filename. |
612
- | `bt_collect_boundary_segments / bt_point_distance_to_segments (in euclidean field file)` | `bt_collect_boundary_segments / segment3_point_distance_to_segments (split files)` | [3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js](3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js) <br>*[move → 3d/topology/struct/binary/query/bt_collect_boundary_segments.js]* | Multi-export file; the point-distance helper has no mesh handle and belongs in the segment/line geometry module, not bt_. |
613
-
614
- ### correctness-bugs-surfaced-by-audit (8)
615
-
616
- | old | → new | file | why |
617
- |-----|-------|------|-----|
618
- | `ray3_shift_origin_along_direction` | `ray3_shift_origin_along_direction_array` | [3d/ray/ray3_shift_origin_along_direction.js](3d/ray/ray3_shift_origin_along_direction.js) <br>*[move → 3d/ray/ray3_shift_origin_along_direction_array.js]* | FIX BUG: origin written at hardcoded offset 0 while direction at output_offset+3; honor output_offset throughout. Suffix _array for offset convention. |
619
- | `Vector4.multiplyVector3` | `Vector4.multiply` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | Match Vector2/Vector3 multiply; also FIX missing 'return this' (breaks fluent contract). |
620
- | `aabb3_transformed_compute_plane_side (plane_offset, box-first)` | `aabb3_transformed_compute_plane_side` | [3d/aabb/aabb3_transformed_compute_plane_side.js](3d/aabb/aabb3_transformed_compute_plane_side.js) <br>*[move → 3d/aabb/aabb3_transformed_compute_plane_side.js]* | FIX BUG (signed distance used as truthy bool) + rename plane_offset->plane_constant + make plane-first to match aabb3_compute_plane_side. |
621
- | `circle_intersects_point` | `circle_contains_point` | [2d/circle/circle_intersects_point.js](2d/circle/circle_intersects_point.js) <br>*[move → 2d/circle/circle_contains_point.js]* | Containment, not intersection; ALSO FIX BUG v2_distance(cx,cx,...) ignoring cy. |
622
- | `circle_compute_circle_penetration` | `circle_compute_penetration` | [2d/circle/circle_compute_circle_penetration.js](2d/circle/circle_compute_circle_penetration.js) <br>*[move → 2d/circle/circle_compute_penetration.js]* | Redundant circle repetition; ALSO FIX BUG dy = by - ax (should be by - ay). |
623
- | `TransformedShape3D.isTransformedShape3D (on constructor)` | `TransformedShape3D.prototype.isTransformedShape3D` | [3d/shape/TransformedShape3D.js](3d/shape/TransformedShape3D.js) <br>*[move → 3d/shape/TransformedShape3D.js]* | Marker must be on the prototype like every sibling so instance-side dispatch works. |
624
- | `triangle_encode_rasterized_depth + triangle_decode_depth (2 exports)` | `triangle_rasterized_depth_sample_index + tri_decode_rasterized_depth (split)` | [3d/tetrahedra/triangle/triangle_encode_rasterized_depth.js](3d/tetrahedra/triangle/triangle_encode_rasterized_depth.js) <br>*[move → 3d/tetrahedra/triangle/triangle_rasterized_depth_sample_index.js]* | 'encode' is misleading (returns a vertex index, not encoded depth); split the mismatched 2nd export (`triangle_decode_depth`) into its own file. (No correctness bug — the "dead return" claim was verified false.) |
625
- | `compareEdges (not exported, v0 compared twice)` | `compare_edges (ADD export, FIX v1 bug)` | [3d/topology/compareEdges.js](3d/topology/compareEdges.js) <br>*[move → 3d/topology/compare_edges.js]* | Dead (unexported) AND buggy (compares a.v0,b.v0 twice, never v1); export and fix. |
626
-
627
- ### param-name-vocabulary-drift (7)
628
-
629
- | old | → new | file | why |
630
- |-----|-------|------|-----|
631
- | `vector_copy` | `vector_copy_offset` | [vec/vector_copy.js](vec/vector_copy.js) <br>*[move → vec/vector_copy_offset.js]* | Takes offsets but carried no _offset; align with vector_dot_offset family; rename param length->n. |
632
- | `vector_dot_offset (params aOff/bOff)` | `vector_dot_offset` | [vec/vector_dot_offset.js](vec/vector_dot_offset.js) <br>*[move → vec/vector_dot_offset.js]* | Name OK; rename camelCase offsets aOff/bOff -> a_offset/b_offset (codebase is snake_case). |
633
- | `vector_axpy_offset (params yOff/xOff)` | `vector_axpy_offset` | [vec/vector_axpy_offset.js](vec/vector_axpy_offset.js) <br>*[move → vec/vector_axpy_offset.js]* | Name OK; rename yOff/xOff -> y_offset/x_offset. |
634
- | `m3_determinant (9 scalars)` | `m3_determinant` | [mat3/m3_determinant.js](mat3/m3_determinant.js) <br>*[move → mat3/m3_determinant.js]* | Name OK; change signature to take a 9-element array to match m2_determinant and the rest of mat3 (calling-convention consistency). |
635
- | `aabb3_transform_oriented_inverse (out/world_aabb/pos_/rot_)` | `aabb3_transform_oriented_inverse` | [3d/aabb/aabb3_transform_oriented_inverse.js](3d/aabb/aabb3_transform_oriented_inverse.js) <br>*[move → 3d/aabb/aabb3_transform_oriented_inverse.js]* | Name OK; align with forward twin: same input form (scalars), result/result_offset names, qx..qw. |
636
- | `convex_hull_monotone_2d` | `convex_hull_monotone_2d` | [2d/convex-hull/convex_hull_monotone_2d.js](2d/convex-hull/convex_hull_monotone_2d.js) <br>*[move → 2d/convex-hull/convex_hull_monotone_2d.js]* | Name OK; rename param input/points -> points uniformly across hull siblings. |
637
- | `uv_map_square_to_circle (params x,y)` | `uv_map_square_to_circle` | [2d/uv_map_square_to_circle.js](2d/uv_map_square_to_circle.js) <br>*[move → 2d/uv_map_square_to_circle.js]* | Name OK; rename input params x,y -> u,v to match the inverse uv_map_circle_to_square. |
638
-
639
- ### nearest-vs-closest-synonym (6)
640
-
641
- | old | → new | file | why |
642
- |-----|-------|------|-----|
643
- | `line3_compute_segment_nearest_point_to_point_t` | `line3_compute_segment_closest_point_t` | [3d/line/line3_compute_segment_nearest_point_to_point_t.js](3d/line/line3_compute_segment_nearest_point_to_point_t.js) <br>*[move → 3d/line/line3_compute_segment_closest_point_t.js]* | nearest->closest; drop to_point stutter; keep _t (returns parameter). |
644
- | `line3_compute_segment_nearest_point_to_aabb3_t` | `line3_compute_segment_closest_point_to_aabb3_t` | [3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js](3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js) <br>*[move → 3d/line/line3_compute_segment_closest_point_to_aabb3_t.js]* | nearest->closest for consistency. |
645
- | `ray3_compute_nearest_point_to_point` | `ray3_compute_closest_point` | [3d/ray/ray3_compute_nearest_point_to_point.js](3d/ray/ray3_compute_nearest_point_to_point.js) <br>*[move → 3d/ray/ray3_compute_closest_point.js]* | nearest->closest; drop PointToPoint stutter; provide flat-array+offset sink (v3-object only as wrapper). |
646
- | `AABB2.computeNearestPointToPoint` | `AABB2.computeClosestPoint` | [2d/aabb/AABB2.js](2d/aabb/AABB2.js) <br>*[move → 2d/aabb/AABB2.js]* | nearest->closest; drop PointToPoint stutter. |
647
- | `aabb3_nearest_point_on_surface` | `aabb3_closest_point_on_surface` | [3d/aabb/aabb3_nearest_point_on_surface.js](3d/aabb/aabb3_nearest_point_on_surface.js) <br>*[move → 3d/aabb/aabb3_closest_point_on_surface.js]* | nearest->closest; add result_offset; rename r_x/r_y/r_z -> point_x/point_y/point_z. |
648
- | `qt_query_data_nearest_to_point` | `qt_query_closest_to_point` | [2d/quad-tree/qt_query_data_nearest_to_point.js](2d/quad-tree/qt_query_data_nearest_to_point.js) <br>*[move → 2d/quad-tree/qt_query_closest_to_point.js]* | nearest->closest; drop redundant 'data'. |
649
-
650
- ### out-param-and-return-shape-divergence (5)
651
-
652
- | old | → new | file | why |
653
- |-----|-------|------|-----|
654
- | `Vector4.readFromArray / writeToArray / setFromArray` | `Vector4.fromArray / toArray` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | Standardize on fromArray/toArray like Vector2/Vector3; remove setFromArray duplicate and the define-then-clobber toArray trap. |
655
- | `m4_multiply_alphatensor` | `m4_multiply_alphatensor (@deprecated)` | [3d/mat4/m4_multiply_alphatensor.js](3d/mat4/m4_multiply_alphatensor.js) <br>*[move → 3d/mat4/m4_multiply_alphatensor.js]* | Strictly slower duplicate of m4_multiply; mark experimental/deprecated and fix JSDoc params (a_in/b_in). |
656
- | `box3_raycast vs aabb3_raycast` | `aabb3_raycast_hit_point` | [3d/aabb/aabb3_raycast.js](3d/aabb/aabb3_raycast.js) <br>*[move → 3d/aabb/aabb3_raycast_hit_point.js]* | Disambiguate the legacy bool+position+quantized-normal variant from the canonical distance+exact-normal box3_raycast; encode the contract in the name. |
657
- | `sphere_raycast` | `sphere_raycast` | [3d/sphere/sphere_raycast.js](3d/sphere/sphere_raycast.js) <br>*[move → 3d/sphere/sphere_raycast.js]* | Keep 'raycast' as the documented distance+normal producer family (box3_raycast/capsule_raycast share it); no rename, listed to lock the family — but document it is the producer counterpart of sphere_intersects_ray. |
658
- | `ConvexHullShape3D.recompute` | `ConvexHullShape3D.recompute_cached` | [3d/shape/ConvexHullShape3D.js](3d/shape/ConvexHullShape3D.js) <br>*[move → 3d/shape/ConvexHullShape3D.js]* | Match MeshShape3D.recompute_cached for the same derived-state refresh role. |
659
-
660
- ### sqr-placement-and-companion-coverage (4)
661
-
662
- | old | → new | file | why |
663
- |-----|-------|------|-----|
664
- | `Vector3.lengthSq` | `Vector3.lengthSqr` | [Vector3.js](Vector3.js) <br>*[move → Vector3.js]* | Trailing-_sqr spelling; drop the lengthSq alias. |
665
- | `Vector3.distanceToSquared` | `Vector3.distanceSqrTo` | [Vector3.js](Vector3.js) <br>*[move → Vector3.js]* | Standardize on _sqr token (distanceSqrTo); drop distanceToSquared alias. |
666
- | `aabb3_signed_distance_sqr_to_point` | `aabb3_signed_distance_sqr_to_point` | [3d/aabb/aabb3_signed_distance_sqr_to_point.js](3d/aabb/aabb3_signed_distance_sqr_to_point.js) <br>*[move → 3d/aabb/aabb3_signed_distance_sqr_to_point.js]* | Conforms (trailing _sqr); listed as exemplar — add missing aabb3_signed_distance_to_point companion. |
667
- | `convex_hull_jarvis_2d` | `convex_hull_jarvis_2d` | [2d/convex-hull/convex_hull_jarvis_2d.js](2d/convex-hull/convex_hull_jarvis_2d.js) <br>*[move → 2d/convex-hull/convex_hull_jarvis_2d.js]* | Name OK; rename private dist2_array -> dist_sqr_indexed (2 means squared, banned). |
668
-
669
- ### vendor-token-three-vs-threejs-vs-geometry (4)
670
-
671
- | old | → new | file | why |
672
- |-----|-------|------|-----|
673
- | `Vector4.threeApplyMatrix4` | `(remove / @deprecated)` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | Vendor-coupled (three.js Matrix4); applyMatrix4 already takes a flat array. Confine vendor types to boundaries. |
674
- | `aabb3_from_threejs_geometry` | `aabb3_from_three_geometry` | [3d/aabb/aabb3_from_threejs_geometry.js](3d/aabb/aabb3_from_threejs_geometry.js) <br>*[move → 3d/aabb/aabb3_from_three_geometry.js]* | Single vendor token 'three'. |
675
- | `computeTriangleRayIntersectionBarycentricGeometry` | `tri3_ray_intersection_indexed` | [3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js](3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js) <br>*[move → 3d/triangle/tri3_ray_intersection_indexed.js]* | camelCase->snake; 'Geometry' vendor token -> 'indexed' (it takes indices+positions). |
676
- | `plane3_three_compute_convex_3_plane_intersection` | `plane3_compute_3_plane_intersection_from_three` | [3d/plane/plane3_three_compute_convex_3_plane_intersection.js](3d/plane/plane3_three_compute_convex_3_plane_intersection.js) <br>*[move → 3d/plane/plane3_compute_3_plane_intersection_from_three.js]* | Move vendor token to a clear adapter suffix so 'three' doesn't collide with the count 3; drop 'convex'. |
677
-
678
- ### casing-of-constants-and-acronyms (2)
679
-
680
- | old | → new | file | why |
681
- |-----|-------|------|-----|
682
- | `aabb3_score_boxes_SAH` | `aabb3_score_boxes_sah` | [3d/aabb/aabb3_score_boxes_SAH.js](3d/aabb/aabb3_score_boxes_SAH.js) <br>*[move → 3d/aabb/aabb3_score_boxes_sah.js]* | Lowercase the embedded acronym to match snake convention; switch to inline export function. |
683
- | `aabb3_corner_edge_mapping / aabb3_edge_corner_mapping / aabb3_edge_plane_mapping` | `AABB3_CORNER_EDGE_MAPPING (etc.)` | [3d/aabb/aabb3_corner_edge_mapping.js](3d/aabb/aabb3_corner_edge_mapping.js) <br>*[move → 3d/aabb/AABB3_CORNER_EDGE_MAPPING.js]* | Constant lookup tables -> constUpper, matching M4_IDENTITY. |
684
-
1
+ # GEOMETRY_REVIEW_002 — naming convention & rename plan
2
+
3
+ `app/src/mir-engine/meep/src/core/geom`
4
+
5
+ > Companion to **GEOMETRY_REVIEW_002_API_ISSUES.md**. This document proposes a single naming
6
+ > convention for the whole geometry package, catalogues the overarching mismatches it resolves,
7
+ > records the choices that need a human decision, and gives the full old→new rename table that
8
+ > drives the refactor.
9
+
10
+ ## Why
11
+
12
+ The package mixes (at least) three naming worlds: a dominant **type-prefix snake** style
13
+ (`v3_`, `aabb3_`, `m4_`, `plane3_`, `quat3_`, `tm_`, `bt_`), a **verbose snake** style
14
+ (`compute_triangle_area_3d`, `line_segment_compute_line_segment_intersection_array_2d`), and a
15
+ **legacy camelCase** style (`computeConeBoundingBox`, `serializeAABB3`, `randomPointInBox`,
16
+ `simplifyTopoMesh`). The user's flagship pair captures it: `line2_distance_to_point_sqr` and
17
+ `line_segment_compute_line_segment_intersection_array_2d` both operate on 2D segments yet share
18
+ no convention — and the first even lies (it clamps `t∈[0,1]`, so it is a *segment* distance, not
19
+ a *line* distance).
20
+
21
+ ## Migration strategy (deprecated shims)
22
+
23
+ Rename/move to the new name, then **leave a shim file at the old path** that re-exports the new
24
+ symbol under the old name with an `@deprecated` JSDoc — matching the house style already used in
25
+ e.g. `3d/shape/UnitCubeShape3D.js`. `meep` is a library: unreferenced exports are public
26
+ surface, so we alias rather than delete. Shim shape:
27
+
28
+ ```js
29
+ // 2d/line/line2_distance_to_point_sqr.js (shim)
30
+ import { line2_compute_segment_point_distance_sqr } from "./line2_compute_segment_point_distance_sqr.js";
31
+
32
+ /**
33
+ * @deprecated Renamed to {@link line2_compute_segment_point_distance_sqr}. This function
34
+ * measures distance to a SEGMENT (it clamps t to [0,1]), not an infinite line.
35
+ */
36
+ export const line2_distance_to_point_sqr = line2_compute_segment_point_distance_sqr;
37
+ ```
38
+
39
+ Each shim is one-line + JSDoc; the move + shim is mechanical and reversible. Renames that **also**
40
+ fix a correctness bug or change a signature (see the API-issues doc) must land the behavior fix
41
+ and the shim together, and the shim must preserve the **old** signature where it differs.
42
+
43
+ ---
44
+
45
+ ## Status — applied vs deferred
46
+
47
+ **Applied this session (~175 renames, every old name kept as an `@deprecated` re-export shim; `core/geom`
48
+ test suite green — 302 suites / 1780 tests, including new regression specs):**
49
+
50
+ - The **134 clean 1:1 renames** — the bulk: dimension tokens (`triangle2d_*`/`compute_*_3d` → `tri2_`/`tri3_`),
51
+ the `_array` overload split, `nearest`→`closest`, camelCase islands (`mat4`, `morton`, the triangle ray island),
52
+ redundant-token de-stutter, predicate/producer fixes, and the flagship `line2_distance_to_point_sqr` →
53
+ `line2_compute_segment_point_distance_sqr` and `line_segment_…_array_2d` → `segment2_segment_compute_intersection_array_2d`.
54
+ - **34 family renames** — `random/`, `packing/max-rect/` (+`cost/`), `tm_vert*`/`tm_kill_only_*`, `bt_vert*`,
55
+ `computeTopoMesh*`, frustum `*_matrix4_project` → `frustum3_*`, `bt_face_get_{attached,neighbour}_faces`,
56
+ the `compute_tetrahedron_*` mesh-form dedup, `aabb3_project_to_2d`→`aabb3_projected_area`, `aabb3_raycast`→`aabb3_raycast_hit_point`, etc.
57
+ - **~8 manual** — same-file export renames (`aabb_build_frustum`→`aabb3_build_frustum`, `sphere_matrix4_project`→
58
+ `sphere_matrix4_transform`, `bt_mesh_face_poke`→`bt_face_poke`), file-only renames (`m3_make_rotation.js`→
59
+ `m3_make_rotation_TBN.js`, `encode_unit3_hemioct.js`→`encode_unit_to_hemioct.js`), exporting the two dead
60
+ bug-functions (`compare_edges`, `aabb3_score_boxes_SAH_delta`), `aabb2_validate_packing`, and `fill_in_a_cavity`→`tetrahedral_mesh_fill_cavity`.
61
+ - **8 multi-export file splits** (breaking changes, no shims — all importers were inside geom and were
62
+ rewritten): `lamber_azimuth/transform.js` → `lambert_azimuth/{encode_unit_to_azimuth,decode_azimuth_to_unit}.js`
63
+ (folder typo fixed); `spherical/sphere_map_transform.js` → `{encode_unit_to_spheremap,decode_spheremap_to_unit}.js`
64
+ (dead decode now exported); `build_face_graph_from_mesh.js` (split out `graph_create_off_mesh_links`);
65
+ `validate_tetrahedral_mesh.js` → 3 files; `bt_mesh_build_boundary_euclidean_distance_field.js` → 3 files
66
+ (the generic point-distance helper moved to `3d/line/segment3_point_distance_to_segments.js`);
67
+ `triangle_encode_rasterized_depth.js` → `{triangle_rasterized_depth_sample_index,triangle_decode_depth}.js`;
68
+ `collapseEdge.js` → `{collapse_edge,partial_edge_collapse}.js`;
69
+ `build_vertex_quadratics.js` → 4 files (`quadratics`→`quadrics`, shared border-penalty helper promoted).
70
+ - The **6 correctness bugs + 2 latent traps** fixed at root with regression tests (see API_ISSUES §0).
71
+
72
+ **Deferred (with reason):**
73
+
74
+ - **Class methods/fields (~18)** — per decision, the OO value-type classes (`Vector*`, `Quaternion`, `AABB2/3`,
75
+ `Rectangle`, `ConicRay`, `StaticR2Tree`, `ConvexHullShape3D`, and the `TopoMesh.setFacedUnindexed` typo) keep
76
+ camelCase. Not renamed.
77
+ - **Signature/param-only entries (~10)** — where the name is unchanged and only the signature needs work
78
+ (`quat3_integrate`/`gjk_epa_penetration`/`ray3_compose_array` add `out_offset`, `aabb3_expand_array` /
79
+ `polygon2_clip_axis_halfplane` output-first, `m3_determinant` array form, `vector_*_offset` param casing,
80
+ `v3_rigid_align_*`/`aabb3_transform_oriented_inverse` arg order). These are API-shape fixes tracked in
81
+ **GEOMETRY_REVIEW_002_API_ISSUES.md**, not renames.
82
+ - **Pipeline consolidations (design, not mechanical)** — `simplifyTopoMesh`/`simplifyTopoMesh2` →
83
+ `_quadric`/`_decimate` (consolidate duplicate entry points), `qt_match_data_by_circle` → merge into
84
+ `qt_collect_by_circle` with an optional predicate. (These three files — plus
85
+ `decimate_edge_collapse_snap.js` — remain multi-export on purpose: they are the duplicate
86
+ decimation pipeline slated for consolidation, so splitting them piecemeal would be undone.)
87
+ - **Debug-only** — `3d/tetrahedra/delaunay/debug/validate_cavity_boundary.js` (2 exports) left as-is.
88
+ - **Windows case-only (cosmetic)** — `aabb3_score_boxes_SAH`→`sah`, `aabb3_*_mapping`→`AABB3_*_MAPPING`
89
+ constUpper. Need a git case-rename two-step on a case-insensitive filesystem; low value.
90
+ - **Dead file** — `compute_legendre_polynomial.js` (0 bytes, exports nothing) — delete or implement.
91
+
92
+ ---
93
+
94
+ ## Part A — Proposed convention
95
+
96
+ ### A1. Type+dimension token and placement
97
+
98
+ **Rule.** Use a single scheme for ALL free functions: <typetoken><verb_or_noun>_<qualifier>, where the type token is a glued lowercase abbreviation with the dimension digit glued directly to the type letter(s) and a trailing underscore: v2_ v3_ v4_ m2_ m3_ m4_ aabb2_ aabb3_ quat3_ line2_ line3_ ray3_ box3_ tri2_ tri3_ sphere_ circle_ capsule_ cone_ plane3_ frustum3_ tm_ bt_ sh3_/sh_ shape3_. The digit always means SPATIAL DIMENSION (or, for quat3_, the dimension of the rotated space), never 'number of operands' nor 'squared' nor a version. NEVER use a spelled-out _3d / _2d suffix on a typed primitive (so compute_triangle_area_3d -> tri3_area, triangle2d_* -> tri2_*). The glued-digit prefix WINS over the suffix form everywhere.
99
+
100
+ *Why:* The glued-digit prefix (v3_, aabb3_, quat3_) is already the overwhelming majority across vec3/, mat*/, 3d/aabb/, 3d/quaternion/, 3d/topology/struct/binary/ and is what callers grep for. A single placement rule lets a reader predict the name and the arg-count from the token. Mixing _3d-suffix, prefix-digit, and bare tokens (the triangle/polygon mess) is the single largest source of unpredictability.
101
+
102
+ - Good: `v3_distance_sqr`, `aabb3_intersects_ray`, `tri3_compute_area`, `line2_compute_segment_point_distance_sqr`, `quat3_multiply`
103
+ - Current violators: `compute_triangle_area_3d`, `triangle2d_compute_area`, `orientation3_array (3=points not dim)`, `StaticR2Tree (R2 not 2)`, `spline_bezier2_2d (double dim token)`
104
+
105
+ ### A2. How non-vec primitives (triangle/line/ray/segment/box/sphere) carry dimension
106
+
107
+ **Rule.** Every geometric primitive gets the same glued-digit prefix as vectors: tri2_/tri3_, line2_/line3_, ray2_/ray3_, box3_, plane3_, frustum3_, circle_ (2d-only, digit omitted because the type is inherently planar), sphere_/capsule_/cone_ (3d-only, digit omitted because inherently volumetric). When a primitive is mathematically tied to one dimension (circle=2d, sphere=3d), omit the digit; when it exists in both (triangle, line, ray, aabb), the digit is mandatory. A SEGMENT is named with the token 'segment' inside the line family, never as a bare 'line'.
108
+
109
+ *Why:* Resolves the flagship 'line vs segment' lie and the triangle2d_/triangle3_/triangle_/compute_*_3d sprawl. Tying inherently-mono-dimensional types (circle/sphere) to a digitless token avoids meaningless tokens like circle2_ while keeping triangle/line/ray unambiguous.
110
+
111
+ - Good: `tri3_compute_signed_volume`, `line3_compute_segment_point_distance_sqr`, `sphere_intersects_ray`, `circle_area`
112
+ - Current violators: `line2_distance_to_point_sqr (actually a segment)`, `triangle_compute_signed_volume (no dim digit, is 3d)`, `orientation3_array`
113
+
114
+ ### A3. Verb prefix: compute_ vs bare noun vs bare verb
115
+
116
+ **Rule.** PRODUCERS that derive a value/geometry use compute_ ONLY when the work is non-trivial computation that isn't already obvious from the noun; pure 'getter-like' derived quantities (area, length, centroid, surface_area, distance) use a BARE NOUN with no compute_. Rule of thumb: a scalar metric named by its physical quantity drops compute_ (v3_length, aabb3_surface_area, tri3_area, circle_area); an operation that builds a structured result or runs an algorithm keeps compute_ (aabb3_compute_from_triangle, quat3_compute_swing_twist, tri3_compute_barycentric). Apply uniformly within a family: do not have aabb2_compute_area next to aabb2_distance_to_point. PREDICATES never take a verb prefix.
117
+
118
+ *Why:* The catalogs show compute_ applied arbitrarily (aabb2_compute_area vs aabb2_distance_to_point; m4_compute_normal_matrix3 vs m4_rotation_translation; box3_projected_half_extent vs aabb3_compute_projected_area). A 'metric=bare noun, algorithm/builder=compute_' rule is teachable and collapses the variance.
119
+
120
+ - Good: `aabb3_surface_area`, `v3_length`, `tri3_compute_barycentric`, `aabb3_compute_from_triangle`
121
+ - Current violators: `aabb2_compute_area`, `aabb3_compute_surface_area`, `m4_compute_normal_matrix3 (inconsistent with m4_rotation_translation)`, `triangle2d_get_barycentric (uses get_)`
122
+
123
+ ### A4. Predicate vs producer naming (bool vs geometry vs bare verb)
124
+
125
+ **Rule.** THREE distinct shapes, three distinct name forms. (1) BOOLEAN predicate -> present-tense verb phrase: X_intersects_Y, X_contains_Y, X_is_<property>; returns a plain boolean, no output arg. Standardize box-vs-box overlap on intersects (aabb2_intersects_aabb2), NOT overlap_exists / compute_overlap. (2) GEOMETRY producer (writes a point/region/normal) -> X_compute_<thing>_intersection or X_<noun> writing into a leading (result, result_offset); may return a boolean 'did it exist' flag in addition to writing. (3) The BARE verb 'intersect' is BANNED as a public name (ambiguous between predicate and producer). Functions that return a 3-state / degree / classification are NOT predicates: name them X_classify_<thing> or X_<thing>_side / X_<thing>_containment, never intersects_*_degree.
126
+
127
+ *Why:* Directly resolves the prompt's mandate. The catalogs show overlap_exists vs intersects_circle vs compute_overlap all meaning boolean overlap; and intersects_frustum_degree / aabb3_array_intersects_frustum_degree lying about returning a bool. A reader must be able to infer return shape from the verb.
128
+
129
+ - Good: `aabb2_intersects_aabb2`, `sphere_contains_point`, `aabb3_classify_against_frustum`, `plane3_compute_3_plane_intersection`, `tm_edge_is_boundary`
130
+ - Current violators: `aabb2_overlap_exists`, `aabb2_compute_overlap`, `aabb3_intersects_frustum_degree`, `sphere_intersects_point (is containment)`, `circle_intersects_point`
131
+
132
+ ### A5. nearest vs closest
133
+
134
+ **Rule.** Pick CLOSEST everywhere; 'nearest' is banned as a public token. closest_point, closest_point_on_surface, line3_closest_points_segment_segment, aabb3_closest_point_on_surface, qt_query_closest_to_point. Rename every *nearest* symbol.
135
+
136
+ *Why:* The repo already uses 'closest' in its load-bearing physics seam (closestHit/anyHit, gjk closest-feature) per project memory, and 50 files use nearest vs 30 closest — but the keystone API is 'closest', so converging on closest aligns the geom library with the physics/raycast contract it feeds. One word, package-wide.
137
+
138
+ - Good: `aabb3_closest_point_on_surface`, `tri3_closest_point_barycentric`, `qt_query_closest_to_point`
139
+ - Current violators: `aabb3_nearest_point_on_surface`, `AABB2.computeNearestPointToPoint`, `line3_compute_nearest_point_to_point`, `frustum3_computeNearestPointToPoint`, `tetrahedral_mesh_find_tets... (n/a)`
140
+
141
+ ### A6. _sqr placement
142
+
143
+ **Rule.** _sqr is always the FINAL token of the name, after the full quantity-and-operands phrase: <prefix>_distance_sqr, <prefix>_distance_sqr_to_point, <prefix>_length_sqr, <prefix>_signed_distance_sqr_to_point. Never bury it mid-name as Sqr-before-To (distanceSqrTo) and never spell it 'Squared'/'2'. On class methods follow the same trailing rule: lengthSqr, distanceSqrTo is acceptable only because 'To<operand>' is the operand phrase; prefer distance_to_point_sqr style on free functions. The squared variant is the primitive; the non-sqr wrapper calls it and sqrt's.
144
+
145
+ *Why:* The package already trends to trailing _sqr on free functions (v3_length_sqr, v3_distance_sqr, aabb2_signed_distance_sqr_to_point). The drift is in class methods (lengthSq/distanceToSquared) and the 'dist2_array'/'2'=squared abuse in convex-hull. One trailing-token rule removes the 'is the companion called _sqr or Squared or 2' guessing.
146
+
147
+ - Good: `v3_distance_sqr`, `aabb2_signed_distance_sqr_to_point`, `bt_vertex_distance_to_vertex_sqr`
148
+ - Current violators: `Vector3.distanceToSquared`, `Vector3.lengthSq`, `convex-hull dist2_array`
149
+
150
+ ### A7. Abbreviation policy for type tokens
151
+
152
+ **Rule.** KEEP the established short type prefixes: v2_ v3_ v4_ m2_ m3_ m4_ aabb2_ aabb3_ quat3_ (these are universal, grep-stable, and documented). KEEP domain-mesh prefixes tm_ (TopoMesh ops) and bt_ (binary-topology ops) — they are large, internally-consistent families and renaming them would churn hundreds of call sites for no clarity gain; document them once at the module level. REPLACE qt_ -> keep (quad-tree is a coherent family) but FIX its verbs (see clusters). REPLACE shg_ -> keep (spatial-hash-grid family is consistent) and document. ELIMINATE the 'three'-as-count-or-vendor ambiguity, 'vert' abbreviation, and the m4-vs-mat3 param abbreviation drift. Spell out 'vertex' (not vert/verts), 'matrix' params as m2/m3/m4 (not mat3).
153
+
154
+ *Why:* tm_/bt_/qt_/shg_ are not noise: each is a well-populated, internally-consistent namespace and meep is a library where churning public surface is costly (project memory: 'meep is a library'). The real abbreviation harm is the inconsistent ones (vert/verts/vertex; mat3 vs m4; aabb vs aabb2 in rectangle_to_aabb).
155
+
156
+ - Good: `v3_dot`, `aabb3_intersects_ray`, `tm_edge_kill`, `bt_edge_collapse`, `shg_query_elements_circle`
157
+ - Current violators: `tm_vert_kill (abbrev)`, `bt_merge_verts_by_distance`, `v3_matrix3_rotate param 'mat3'`, `rectangle_to_aabb (drops the 2)`
158
+
159
+ ### A8. camelCase -> snake_case migration
160
+
161
+ **Rule.** All FREE FUNCTIONS are snake_case with the type prefix. Migrate every camelCase free-function island: 3d/random/* (randomPointInBox -> random_point_in_box ... but see open question on the 'In/On' token), packing/max-rect/* (packMaxRectangles -> pack_max_rectangles, costByRemainingArea -> cost_by_remaining_area), 3d/mat4/eulerAnglesFromMatrix -> m4_euler_angles, the morton camelHybrid (mortonEncode_magicbits -> v3_morton_encode_magicbits), the topology camelCase layer (simplifyTopoMesh, computeTopoMeshBoundingSphere, collapseEdge), the cone camel island (computeConePlaneSide -> cone_compute_plane_side), the camelCase triangle ray island (computeTriangleRayIntersection* -> tri3_ray_intersection*), the harmonics sh3 serializers stay snake. CLASSES remain PascalCase with camelCase methods IF they are engine-facing OO types (Vector3, Quaternion, AABB3, TetrahedralMesh) — that is the deliberate OO layer; but NEW data-structure classes should use snake_case methods to match the free-function layer (BVH2D, SpatialHashGrid already do). Do not mix casings WITHIN one class (fix StaticR2Tree, Cavity).
162
+
163
+ *Why:* snake_case is the package norm for the perf/free-function layer; camelCase survives only as legacy islands and the deliberate OO vector/matrix/quaternion classes. The line is 'free functions + new struct methods = snake; established mutable OO value types = camelCase methods'. Mixed-casing within a single class is never acceptable.
164
+
165
+ - Good: `random_point_in_box`, `m4_euler_angles`, `cone_compute_plane_side`, `Vector3.lengthSqr (OO method, camel ok)`
166
+ - Current violators: `randomPointInBox`, `eulerAnglesFromMatrix`, `computeConePlaneSide`, `StaticR2Tree (mixed setBuffer + sort_morton)`, `simplifyTopoMesh`
167
+
168
+ ### A9. Vendor token (three vs threejs vs geometry)
169
+
170
+ **Rule.** Use the single vendor token 'three' (not 'threejs') wherever a three.js type genuinely crosses a boundary, and CONFINE it to clearly adapter-named functions/modules (project memory: confine vendor imports to boundaries). Prefer the neutral token 'geometry' / 'buffer_geometry' when the function consumes an indexed/unindexed triangle buffer rather than a literal THREE type. Do NOT embed 'three' to disambiguate from the literal count three — rename plane3_three_compute_* to plane3_compute_3_plane_intersection_from_planes (object adapter) so 'three' never collides with '3'.
171
+
172
+ *Why:* Catalogs show three/threejs/geometry used interchangeably (aabb3_from_threejs_geometry vs three_buffer_geometry_to_topo_mesh) and 'three' colliding with the count-3 in plane3_three_*. One spelling + boundary-confinement matches the existing project rule.
173
+
174
+ - Good: `aabb3_from_three_geometry`, `three_buffer_geometry_to_topo_mesh`, `shape_mesh_from_geometry`
175
+ - Current violators: `aabb3_from_threejs_geometry`, `plane3_three_compute_convex_3_plane_intersection`, `Vector4.threeApplyMatrix4`
176
+
177
+ ### A10. Disambiguating the overloaded _array suffix
178
+
179
+ **Rule.** _array is RESERVED for exactly one meaning: 'this operand (the typed-array-of-scalars it qualifies) is accessed at a caller-supplied (buffer, offset)'. Apply consistently as a SUFFIX on the operand it describes, with the operand-type token preceding it (v3_*_array means the v3 operands are at offsets). FORBIDDEN alternate meanings: (a) 'returns a freshly allocated array' — name those *_to_new_array or just let them return and document the allocation, never bare _array; (b) 'array of MANY vectors / a batch' — use an explicit count param and a _batch or _v3_buffer token, e.g. aabb3_from_v3_buffer; (c) 'a packed single primitive [cx,cy,cz,r]' for sphere_array_* — rename to sphere_packed_* . The DOUBLE _array_array is banned: a single _array already implies offset operands (v3_dot_array, not v3_dot_array_array). PREFER suffix placement (v3_normalize_array) over prefix (v3_array_normalize) uniformly.
180
+
181
+ *Why:* The prompt's mandate. _array carries 3-4 contradictory meanings across vec3/, aabb/, line/, mat4/. Pinning it to 'offset-addressed operand' (the dominant intent) and giving the other meanings their own tokens removes the ambiguity that makes the flagship name unreadable.
182
+
183
+ - Good: `v3_dot_array`, `v3_normalize_array`, `aabb3_from_v3_buffer`, `sphere_packed_intersects_point`
184
+ - Current violators: `v3_dot_array_array`, `v3_array_normalize (prefix)`, `line_segment_compute_line_segment_intersection_vectors_array_2d (allocates)`, `aabb3_array_compute_from_sphere (prefix)`, `sphere_array_intersects_point (packed)`
185
+
186
+ ### A11. Eliminating redundant token repetition
187
+
188
+ **Rule.** A token that is already implied by the type prefix must not be repeated. circle_compute_circle_intersection -> circle_compute_intersection; sphere_projected_sphere_radius_sqr -> sphere_projected_radius_sqr; plane3_compute_plane_intersection -> plane3_compute_intersection; line_segment_compute_line_segment_intersection_* -> segment_segment_intersection_* (the operands are two segments; say segment once per operand role, not 'line_segment' twice). For class methods, the class IS the type token: Vector3.projectOntoVector3 -> projectOnto, computeNearestPointToPoint -> compute_closest_point (no PointToPoint doubling), tetrahedral_mesh_tet_get_neighbours -> tetrahedral_mesh_get_neighbours.
189
+
190
+ *Why:* The flagship #2 (line_segment...line_segment) and many siblings stutter the type. Removing the repetition shortens names and is mechanically checkable (token appears twice).
191
+
192
+ - Good: `segment_segment_intersection_2d`, `circle_compute_intersection`, `plane3_compute_intersection`, `Vector3.projectOnto`
193
+ - Current violators: `line_segment_compute_line_segment_intersection_array_2d`, `circle_compute_circle_intersection`, `sphere_projected_sphere_radius_sqr`, `Vector3.projectOntoVector3`
194
+
195
+ ### A12. Output-argument placement and the (out, out_offset) pair
196
+
197
+ **Rule.** For free functions that WRITE into a caller buffer: the output is ALWAYS the first parameter, immediately followed by its offset: (out, out_offset, ...inputs). Every such writer takes an out_offset even if it currently hardcodes 0. The output param is named 'result' for geometry/value writers and 'out' is also acceptable but pick ONE per family — standardize on 'result'/'result_offset'. Reducers (return a scalar) take NO output arg. Serializers/(de)serializers are the documented exception: (buffer, target) with buffer first. Batch/source-then-dest helpers that genuinely have one input and one output may use (output, output_offset, input, input_offset). The Vector3-object sink form (result.set(...)) is allowed only as a thin, separately-named wrapper (suffix _v3), never mixed into the flat-array family.
198
+
199
+ *Why:* Output-first is already the strong majority and is the one thing most areas get right; the violations (mat4 apply_* output-3rd, aabb3_expand_array output-2nd, flip_23/flip_32 output-last, distance-field builders mesh-second) are the exceptions. Mandating out_offset everywhere kills the 'this sibling can't write at an offset' trap (ray3_array_compose, aabb3_nearest_point_on_surface, quat3_integrate, aabb2_from_v2_array).
200
+
201
+ - Good: `v3_cross(result, result_offset, ...)`, `aabb3_array_set(result, result_offset, ...)`, `quat3_multiply(out, out_offset, ...)`
202
+ - Current violators: `aabb3_expand_array(input, output, distance)`, `tetrahedral_mesh_flip_23(mesh,t1,t2,out)`, `quat3_createFromAxisAngle(axis,angle,result)`, `bt_mesh_build_boundary_distance_field(map, mesh, ...)`, `read_three_planes_to_array(planes, array)`
203
+
204
+ ### A13. Parameter naming uniformity
205
+
206
+ **Rule.** The same role uses the same name across all siblings. Output buffer + offset: result, result_offset (not out/output/destination/target/r/data/array). Source buffer + offset: input, input_offset (not source/data/in). Element count: count (not n/length/dimensions/dimension_count — pick 'count' for item count, 'dimension_count' only when it literally means components-per-item). Queried point: point_x/point_y/point_z (not px/py/pz or ref_x or r_x). Plane 4th component: plane_constant (not w/dist/plane_offset/constant). Mesh handle: mesh (not tet_mesh/tetrahedra/data). Vertex: vertex / vertex_id (not v/vert/verts). Tet id: tet_id. Scalar multiplier sits immediately before its vector operand (BLAS axpy order).
207
+
208
+ *Why:* Every catalog flagged 3-5 spellings for the identical concept. A fixed vocabulary is the cheapest, highest-leverage consistency win and is enforceable by lint.
209
+
210
+ - Good: `(result, result_offset, input, input_offset, count)`, `point_x, point_y, point_z`, `plane_constant`
211
+ - Current violators: `vector_copy 'length' vs vector_dot 'n' vs vector_scale_array 'dimensions'`, `aabb2 px/py vs point_x/point_y`, `plane 'w'/'dist'/'plane_offset'/'constant'`
212
+
213
+ ### A14. One export per file, file name matches export
214
+
215
+ **Rule.** Each file exports exactly one public symbol whose name equals the filename (the established meep convention). Fix every filename/export mismatch (aabb3_build_frustum.js -> aabb_build_frustum, sphere_matrix4_transform.js -> sphere_matrix4_project, bt_face_poke.js -> bt_mesh_face_poke, m3_make_rotation.js -> m3_make_rotation_TBN, aabb3_compute_projected_area.js -> aabb3_project_to_2d). Split multi-export files (validate_tetrahedral_mesh.js, bt_mesh_build_boundary_euclidean_distance_field.js, build_face_graph_from_mesh.js, decimate_edge_collapse_snap.js, the lambert_azimuth/transform.js, triangle_encode_rasterized_depth.js). An export that is declared but never exported (aabb3_score_boxes_SAH_delta, decode_spheremap_to_unit, compareEdges, aabb2_validate_packing's 'validate') is a bug: either export it (it is public surface in a library) or delete if truly dead.
216
+
217
+ *Why:* Discoverability-by-filename is a core meep convention; mismatches and multi-export files break grep-by-path and hide public surface. Library semantics (per memory) mean unexported-but-intended symbols are bugs to fix, not delete.
218
+
219
+ - Good: `v3_cross.js exports v3_cross`
220
+ - Current violators: `aabb3_build_frustum.js exports aabb_build_frustum`, `aabb3_score_boxes_SAH_delta.js exports nothing`, `compute_legendre_polynomial.js (0 bytes)`
221
+
222
+ ### A15. Casing of constants and acronyms
223
+
224
+ **Rule.** Module-level frozen sentinels/identities are constUpper (M4_IDENTITY, NULL_POINTER, INVALID_NEIGHBOUR). Exported lookup tables that are conceptually constant data use constUpper too (AABB3_CORNER_EDGE_MAPPING). Embedded acronyms inside a snake_case function name are lowercased (aabb3_score_boxes_sah, not _SAH). Sentinel names for the same concept are unified across structures (one of NULL_POINTER) rather than NULL_NODE / NULL_POINTER / QT_NULL_POINTER.
225
+
226
+ *Why:* Mixed-case SAH inside snake names and three different null-sentinel names are gratuitous variance; constUpper for true constants is already established (M2_IDENTITY, M4_IDENTITY).
227
+
228
+ - Good: `M4_IDENTITY`, `aabb3_score_boxes_sah`, `NULL_POINTER`
229
+ - Current violators: `aabb3_score_boxes_SAH`, `aabb3_corner_edge_mapping (lowercase data table)`, `NULL_NODE vs QT_NULL_POINTER`
230
+
231
+ ---
232
+
233
+ ## Part B — Overarching inconsistency clusters
234
+
235
+ The convention mismatches across the package, by theme.
236
+
237
+ ### B1. array-token-overload — *major*
238
+
239
+ The _array token carries 3-4 contradictory meanings (offset-addressed single operand as prefix vs suffix; returns-a-new-array; batch-of-many-vectors; packed single primitive) plus a double _array_array. Reserve _array=offset-addressed operand (suffix), and give the other meanings distinct tokens (_to_new_array, _buffer/_batch, _packed).
240
+
241
+ Examples: `v3_array_normalize vs v3_negate_array vs v3_dot_array_array` · `line_segment_compute_line_segment_intersection_vectors_array_2d (allocates)` · `aabb3_array_compute_from_sphere (prefix) vs aabb3_expand_array (suffix=offset-0)` · `sphere_array_intersects_point (packed) vs sphere_radius_sqr_from_v3_array_transformed (batch)`
242
+
243
+ ### B2. dimension-token-placement — *major*
244
+
245
+ Dimension is encoded five ways: glued prefix-digit (v3_/aabb3_), glued suffix (triangle2d_), verb-first _3d suffix (compute_triangle_area_3d), bare/no-digit-though-3d (triangle_compute_signed_volume), and digit-means-not-dimension (orientation3_array=3 points, StaticR2Tree=R2). Converge on glued prefix-digit; digit always = spatial dimension; omit digit only for inherently-mono-dimensional types (circle/sphere/capsule/cone).
246
+
247
+ Examples: `triangle2d_compute_area / tri3 / triangle_compute_signed_volume / compute_triangle_area_3d` · `orientation3_array` · `spline_bezier2_2d` · `StaticR2Tree`
248
+
249
+ ### B3. misleading-name-lies-about-behavior — *major*
250
+
251
+ Names that contradict behavior: segment functions named 'line'; transform functions named 'project'; predicates named 'intersects' that return a degree/number; 'create' that doesn't allocate; 'nearest' surface helpers that are containment; serializer 'quantize' comment on a dequantizer; quadric tensors named 'quadratics'.
252
+
253
+ Examples: `line2_distance_to_point_sqr (segment)` · `sphere_matrix4_project (transforms)` · `aabb3_intersects_frustum_degree (returns 0/1/2)` · `quat3_createFromAxisAngle (no alloc)` · `sphere_intersects_point / circle_intersects_point (containment)` · `compute_*_vertex_quadratics (Quadric3)`
254
+
255
+ ### B4. redundant-token-repetition — *major*
256
+
257
+ The type token is stuttered: line_segment...line_segment, circle_compute_circle_*, sphere_projected_sphere_*, plane3_compute_plane_*, NearestPointToPoint, projectOntoVector3, tetrahedral_mesh_tet_get_*.
258
+
259
+ Examples: `line_segment_compute_line_segment_intersection_array_2d` · `circle_compute_circle_intersection` · `sphere_projected_sphere_radius_sqr` · `Vector3.projectOntoVector3`
260
+
261
+ ### B5. camelCase-legacy-islands — *major*
262
+
263
+ Whole folders/files in camelCase against the snake_case norm: random/, packing/max-rect/, the topology camelCase layer, cone camel island, the camelCase triangle ray island, mat4 eulerAnglesFromMatrix, morton camel-hybrid. Migrate free functions to snake_case; keep deliberate OO value-type classes (Vector*/Quaternion/AABB3) camelCase-methoded but never mix casings within one class.
264
+
265
+ Examples: `randomPointInBox` · `packMaxRectangles` · `simplifyTopoMesh` · `computeConePlaneSide` · `computeTriangleRayIntersection` · `eulerAnglesFromMatrix` · `StaticR2Tree (mixed within class)`
266
+
267
+ ### B6. predicate-vs-producer-vs-degree — *major*
268
+
269
+ Boolean overlap tests have three names (intersects_/overlap_exists/compute_overlap); degree/classification functions wear the boolean 'intersects' prefix; bare verb 'intersect' is ambiguous. Standardize: intersects_/contains_/is_=bool, compute_*_intersection=geometry, classify_/_side=multi-state.
270
+
271
+ Examples: `aabb2_overlap_exists vs aabb2_intersects_circle vs aabb2_compute_overlap` · `aabb3_intersects_frustum_degree` · `aabb3_array_intersects_frustum_degree` · `Rectangle.intersects vs Rectangle.overlaps`
272
+
273
+ ### B7. output-arg-placement-and-missing-offset — *major*
274
+
275
+ Output buffer position flips (first/second/third/last) and many writers hardcode offset 0 with no out_offset param, breaking the pack-into-shared-buffer use case. Mandate (result, result_offset, ...) first, always with an offset.
276
+
277
+ Examples: `aabb3_expand_array (output 2nd)` · `tetrahedral_mesh_flip_23/_32 (output last)` · `quat3_integrate (no offset)` · `ray3_array_compose (no offset)` · `aabb2_from_v2_array (hardcoded 0)` · `ray3_shift_origin_along_direction (offset-0 bug)`
278
+
279
+ ### B8. param-name-vocabulary-drift — *major*
280
+
281
+ Identical roles get many names: count=n/length/dimensions/dimension_count; output=out/output/result/target/data/r/destination; queried point=px/ref_x/r_x/point_x; plane 4th=w/dist/plane_offset/constant; mesh=mesh/tet_mesh/tetrahedra/data; vertex=v/vert/verts/vertex; tet id has 5 spellings.
282
+
283
+ Examples: `vector_copy length / vector_dot n / vector_scale_array dimensions` · `aabb2 px/py vs signed point_x/point_y` · `plane3 w/dist/plane_offset/constant` · `tet_index/tet/tet_id/tetrahedron_index/containing_tetra`
284
+
285
+ ### B9. filename-export-mismatch-and-multi-export — *major*
286
+
287
+ Files whose single export name differs from the filename, files exporting 3-4 symbols, and declared-but-never-exported functions (dead public surface or latent bugs).
288
+
289
+ Examples: `aabb3_build_frustum.js->aabb_build_frustum` · `sphere_matrix4_transform.js->sphere_matrix4_project` · `bt_face_poke.js->bt_mesh_face_poke` · `aabb3_score_boxes_SAH_delta (no export)` · `compute_legendre_polynomial.js (0 bytes)` · `validate_tetrahedral_mesh.js (3 exports)`
290
+
291
+ ### B10. correctness-bugs-surfaced-by-audit — *major*
292
+
293
+ Genuine defects found while auditing names — must be fixed at root, not renamed around: y/x mix-ups, dead early returns, signed-distance-as-bool, unexported functions, offset-0 hardcoding bugs.
294
+
295
+ Examples: `circle_intersects_point v2_distance(cx,cx,...)` · `circle_compute_circle_penetration dy=by-ax` · `aabb3_transformed_compute_plane_side signed-dist-as-bool` · `ray3_shift_origin_along_direction offset-0` · `aabb3_score_boxes_SAH_delta half-vs-full-area 2x` · `compareEdges compares v0 twice`
296
+
297
+ > Note: a cataloguer also flagged a "dead `return indices_0`" in `triangle_encode_rasterized_depth`; on verification that claim was **false** (all three index branches are reachable) and has been dropped. The file still warrants the *naming* fix below (the export returns a vertex index, not encoded depth) and the multi-export split.
298
+
299
+ ### B11. nearest-vs-closest-synonym — *minor*
300
+
301
+ 'nearest' and 'closest' used interchangeably for the same closest-point/feature concept across line/ray/aabb/frustum/triangle/quad-tree. Converge on 'closest' to match the physics closestHit seam.
302
+
303
+ Examples: `aabb3_nearest_point_on_surface vs line3_closest_points_segment_segment` · `frustum3_computeNearestPointToPoint` · `computeTriangleClosestPointToPointBarycentric` · `qt_query_data_nearest_to_point`
304
+
305
+ ### B12. sqr-placement-and-companion-coverage — *minor*
306
+
307
+ _sqr buried mid-name on class methods (distanceToSquared/lengthSq) vs trailing on free functions; '2'-means-squared abuse; asymmetric sqr/non-sqr companion coverage. Trailing _sqr everywhere; the squared form is the primitive.
308
+
309
+ Examples: `Vector3.distanceToSquared / lengthSq` · `convex-hull dist2_array` · `aabb3_signed_distance_sqr_to_point (no sqrt companion) vs aabb3_signed_distance_to_aabb3 (no sqr)`
310
+
311
+ ### B13. verb-prefix-inconsistency — *minor*
312
+
313
+ compute_ / build_ / make_ / from_ / get_ applied arbitrarily to producers; bare-noun metrics sometimes carry compute_, sometimes not; m3 from_translation vs m4 make_translation.
314
+
315
+ Examples: `aabb2_compute_area vs aabb2_distance_to_point` · `m3_cm_from_translation vs m4_make_translation` · `tetrahedral_mesh_build_* vs _compute_* vs _find_*` · `triangle2d_get_barycentric (get_)`
316
+
317
+ ### B14. out-param-and-return-shape-divergence — *minor*
318
+
319
+ Sibling writers disagree on return shape (void vs return-out vs bool) and on Vector3-object-sink vs flat-array-sink; degree/scalar/bool returns hide behind shared prefixes; some methods return this, siblings return undefined.
320
+
321
+ Examples: `m2_add void vs m2_transpose returns out vs m4_invert returns bool` · `Vector4.multiplyVector3 returns undefined` · `plane3 Vector3-sink vs flat-array-sink` · `qt_collect_* (count) vs qt_query_data_nearest (single datum)`
322
+
323
+ ### B15. vendor-token-three-vs-threejs-vs-geometry — *minor*
324
+
325
+ three.js token spelled three/threejs/geometry and embedded where it collides with the literal count three; some vendor imports not confined to adapter boundaries.
326
+
327
+ Examples: `aabb3_from_threejs_geometry vs three_buffer_geometry_to_topo_mesh` · `plane3_three_compute_convex_3_plane_intersection` · `Vector4.threeApplyMatrix4`
328
+
329
+ ### B16. abbreviation-vert-and-matrix-param — *minor*
330
+
331
+ vertex abbreviated vert/verts/vertex; matrix params m4 vs mat3; quat vs qt vs Quaternion; immediate/in_place opaque tokens for add accumulate.
332
+
333
+ Examples: `tm_vert_kill vs tm_vertex_compute_normal` · `bt_merge_verts_by_distance` · `v3_matrix3_rotate param mat3 vs m4` · `v3_array_immediate_add vs v3_array_add_in_place`
334
+
335
+ ---
336
+
337
+ ## Part C — Open questions (need a decision before mass-rename)
338
+
339
+ Each of these is a genuine fork with churn implications; the rename table assumes the
340
+ *recommended* option but they are called out so the direction can be confirmed.
341
+
342
+ ### C1. Should geometric primitives use a glued prefix-digit token (tri3_, line3_, box3_, plane3_) or keep some types digitless because they read fine without it (e.g. should the existing aabb3_/quat3_ digit style be forced onto sphere_/capsule_/cone_/circle_)?
343
+
344
+ - A: glued prefix-digit on EVERYTHING, even inherently-mono-dimensional types (circle2_, sphere3_, capsule3_)
345
+ - B: prefix-digit only for types that exist in multiple dimensions (triangle, line, ray, aabb, box, plane); digitless for inherently-mono-dimensional types (circle, sphere, capsule, cone)
346
+
347
+ **Recommendation:** B. circle2_/sphere3_ add a meaningless token (a circle is always 2d, a sphere always 3d), and sphere_/capsule_/cone_ are already established digitless. Reserve the digit to disambiguate genuinely multi-dimensional families.
348
+
349
+ ### C2. How aggressively should the camelCase OO value-type classes (Vector2/3/4, Quaternion, AABB2/3, Matrix wrappers) be migrated? Their METHODS are camelCase while the entire free-function layer is snake_case.
350
+
351
+ - A: Leave class methods camelCase forever (deliberate OO layer; matches three.js muscle memory and is huge call-site churn)
352
+ - B: Migrate class methods to snake_case to match the free-function layer (one casing package-wide)
353
+ - C: Freeze existing classes as camelCase but mandate snake_case methods on all NEW structure classes (BVH2D/SpatialHashGrid already do this)
354
+
355
+ **Recommendation:** C. Full migration (B) is enormous churn on the most-referenced types for little gain and fights three.js familiarity; A leaves the rule unstated. C draws a clear, low-churn line: established mutable value types stay camelCase, new struct classes are snake_case — and bans within-class mixing (StaticR2Tree, Cavity).
356
+
357
+ ### C3. random/ samplers encode surface-vs-volume as an In/On preposition (randomPointInBox vs randomPointOnBox). Under snake_case, do we keep in/on or switch to explicit volume/surface tokens?
358
+
359
+ - A: random_point_in_box / random_point_on_box (keep In/On preposition)
360
+ - B: random_point_in_volume_box / random_point_on_surface_box (explicit)
361
+ - C: box_sample_random_in_volume / box_sample_random_on_surface (type-first, mirrors AbstractShape3D.sample_random_point_in_volume)
362
+
363
+ **Recommendation:** C for long-term consistency with the shape API (which already says sample_random_point_in_volume), but it is the highest-churn option and arguably over-engineered for a tiny self-contained folder; if churn is a concern, A is an acceptable minimal fix (snake the names, keep In/On). Flagging because the tradeoff is real.
364
+
365
+ ### C4. Output-argument convention for WRITERS: standardize on output-FIRST (result, result_offset, ...) everywhere, or keep the serializer/source-then-dest exceptions documented?
366
+
367
+ - A: output-first universally; serializers are a single documented exception (buffer, target)
368
+ - B: output-first for value/geometry writers, but allow (output, output_offset, input, input_offset) for pure transform/batch helpers and (dst, src) for copy-likes
369
+
370
+ **Recommendation:** A with the serializer carve-out. Output-first is already the dominant, teachable rule; the (input,...,output) and output-last violations are pure inconsistency, not principled. Keep the serializer (buffer-first) exception because the buffer genuinely is both the medium and conventionally leads.
371
+
372
+ ### C5. Should the large domain-mesh prefixes tm_ (TopoMesh) and bt_ (binary topology) be spelled out or kept abbreviated, given the package otherwise spells out tokens (triangle->tri only as a proposal)?
373
+
374
+ - A: Keep tm_/bt_ abbreviated (large internally-consistent families; meep is a library so renaming churns hundreds of call sites)
375
+ - B: Spell out to topo_mesh_ / binary_topo_ for self-documentation
376
+
377
+ **Recommendation:** A. These are coherent, heavily-used namespaces; per the 'meep is a library' rule, churning public surface for marginal readability is not worth it. Document the prefixes once at module level instead. (Contrast: 'vert' abbreviation IS worth fixing because it's applied inconsistently.)
378
+
379
+ ### C6. For the bounding-volume-of-N family, which canonical shape: <type>_compute_bounding_box / <type>_compute_bounding_of_N_<types>, or compute_bounding_<type>_of_N_<types>?
380
+
381
+ - A: type-token-first: sphere_compute_bounding_of_2_spheres, cone_compute_bounding_of_2_cones, circle3_compute_bounding_box
382
+ - B: verb-first: compute_bounding_sphere_of_2_spheres, compute_bounding_box (current mixed state, mostly verb-first)
383
+
384
+ **Recommendation:** A (type-token-first) to match the package-wide prefix rule and make these greppable alongside the rest of each type's family. This contradicts the current verb-first majority in this corner, so it is a genuine choice with churn cost — flagging rather than silently picking.
385
+
386
+ ---
387
+
388
+ ## Part D — Rename table
389
+
390
+ 208 symbols violate the convention. Grouped by cluster; `[move]` marks a file relocation.
391
+
392
+ ### dimension-token-placement (30)
393
+
394
+ | old | → new | file | why |
395
+ |-----|-------|------|-----|
396
+ | `compose_matrix4_array` | `m4_compose` | [3d/mat4/compose_matrix4_array.js](3d/mat4/compose_matrix4_array.js) <br>*[move → 3d/mat4/m4_compose.js]* | Normalize to m4_ prefix; drop redundant _array (a mat4 is always an array here). |
397
+ | `decompose_matrix_4_array` | `m4_decompose` | [3d/mat4/decompose_matrix_4_array.js](3d/mat4/decompose_matrix_4_array.js) <br>*[move → 3d/mat4/m4_decompose.js]* | Normalize to m4_ prefix; mirror m4_compose stem; also stop calling private __setFromRotationMatrix (promote a public quat3_from_matrix3). |
398
+ | `allocate_m4` | `m4_allocate` | [3d/mat4/allocate_m4.js](3d/mat4/allocate_m4.js) <br>*[move → 3d/mat4/m4_allocate.js]* | Type token must lead; matches v3_allocate. |
399
+ | `rectangle_to_aabb` | `aabb2_from_rectangle` | [2d/rectangle_to_aabb.js](2d/rectangle_to_aabb.js) <br>*[move → 2d/aabb/aabb2_from_rectangle.js]* | Use the aabb2_ type prefix (mirrors aabb2_from_v2_buffer); produced type is AABB2 not 'aabb'; document the negative-size clamp. |
400
+ | `aabb3_estimate_projected_area2` | `aabb3_estimate_projected_area` | [3d/aabb/aabb3_estimate_projected_area2.js](3d/aabb/aabb3_estimate_projected_area2.js) <br>*[move → 3d/aabb/aabb3_estimate_projected_area.js]* | Trailing '2' is a meaningless version suffix (no base name exists). |
401
+ | `compute_aabb_from_points` | `aabb_nd_from_points` | [3d/aabb/compute_aabb_from_points.js](3d/aabb/compute_aabb_from_points.js) <br>*[move → 3d/aabb/aabb_nd_from_points.js]* | n-dimensional (controlled by d) — use aabb_nd_ token; type token must lead. |
402
+ | `compute_triangle_group_aabb3` | `aabb3_from_triangle_group` | [3d/aabb/compute_triangle_group_aabb3.js](3d/aabb/compute_triangle_group_aabb3.js) <br>*[move → 3d/aabb/aabb3_from_triangle_group.js]* | aabb3 token must be a PREFIX not suffix; rename output/output_offset params to result/result_offset. |
403
+ | `compute_bounding_sphere_of_2_spheres` | `sphere_compute_bounding_of_2_spheres` | [3d/sphere/compute_bounding_sphere_of_2_spheres.js](3d/sphere/compute_bounding_sphere_of_2_spheres.js) <br>*[move → 3d/sphere/sphere_compute_bounding_of_2_spheres.js]* | Type token must lead; unify with the bounding-volume naming rule; also use closed-form (drop per-call Miniball alloc). |
404
+ | `compute_circle_bounding_box` | `circle3_compute_bounding_box` | [3d/compute_circle_bounding_box.js](3d/compute_circle_bounding_box.js) <br>*[move → 3d/circle3_compute_bounding_box.js]* | Operates in 3d (takes a normal) but name reads 2d; add dimension token. |
405
+ | `compute_bounding_cone_of_2_cones` | `cone_compute_bounding_of_2_cones` | [3d/cone/compute_bounding_cone_of_2_cones.js](3d/cone/compute_bounding_cone_of_2_cones.js) <br>*[move → 3d/cone/cone_compute_bounding_of_2_cones.js]* | Type token leads; mirror sphere bounding naming. |
406
+ | `spherical_from_cartesian` | `sphere_spherical_from_cartesian` | [3d/sphere/spherical_from_cartesian.js](3d/sphere/spherical_from_cartesian.js) <br>*[move → 3d/sphere/sphere_spherical_from_cartesian.js]* | Add sphere_ family prefix for discoverability (optional but consistent). |
407
+ | `triangle2d_compute_area` | `tri2_signed_area` | [2d/triangle2d_compute_area.js](2d/triangle2d_compute_area.js) <br>*[move → 2d/triangle/tri2_signed_area.js]* | Glued-prefix-digit token tri2_; returns SIGNED area (encode sign); drop compute_ (bare metric). |
408
+ | `triangle2d_get_barycentric` | `tri2_compute_barycentric` | [2d/triangle2d_get_barycentric.js](2d/triangle2d_get_barycentric.js) <br>*[move → 2d/triangle/tri2_compute_barycentric.js]* | tri2_ token; 'get_'->'compute_' (it solves); emit canonical [u,v,w] order. |
409
+ | `triangle2d_contains_point` | `tri2_contains_point` | [2d/triangle2d_contains_point.js](2d/triangle2d_contains_point.js) <br>*[move → 2d/triangle/tri2_contains_point.js]* | tri2_ token; fix [u,v,w] read order to match producer. |
410
+ | `compute_polygon_area_2d` | `polygon2_signed_area` | [2d/compute_polygon_area_2d.js](2d/compute_polygon_area_2d.js) <br>*[move → 2d/polygon/polygon2_signed_area.js]* | Glued prefix-digit polygon2_; drop compute_/2d suffix; signed. |
411
+ | `fixed_convex_hull_humus` | `convex_hull_fixed_count_2d_bruteforce` | [2d/convex-hull/fixed_convex_hull_humus.js](2d/convex-hull/fixed_convex_hull_humus.js) <br>*[move → 2d/convex-hull/convex_hull_fixed_count_2d_bruteforce.js]* | Add dimension token; remove proper-noun 'humus'; describe behavior. |
412
+ | `fixed_convex_hull_relaxation` | `convex_hull_fixed_count_2d_relaxation` | [2d/convex-hull/fixed_convex_hull_relaxation.js](2d/convex-hull/fixed_convex_hull_relaxation.js) <br>*[move → 2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js]* | Add dimension token; fix JSDoc Float64/Float32 mismatch. |
413
+ | `triangle_compute_signed_volume` | `tri3_compute_signed_volume` | [3d/triangle/triangle_compute_signed_volume.js](3d/triangle/triangle_compute_signed_volume.js) <br>*[move → 3d/triangle/tri3_compute_signed_volume.js]* | Bare 'triangle_' (no digit, is 3d) -> tri3_ prefix. |
414
+ | `triangle_mesh_compute_signed_volume` | `tri3_mesh_compute_signed_volume` | [3d/triangle/triangle_mesh_compute_signed_volume.js](3d/triangle/triangle_mesh_compute_signed_volume.js) <br>*[move → 3d/triangle/tri3_mesh_compute_signed_volume.js]* | tri3_ token for the 3d triangle family. |
415
+ | `compute_triangle_area_3d` | `tri3_area` | [3d/triangle/compute_triangle_area_3d.js](3d/triangle/compute_triangle_area_3d.js) <br>*[move → 3d/triangle/tri3_area.js]* | _3d suffix -> tri3_ prefix; bare-metric drops compute_; document UNSIGNED. |
416
+ | `compute_triangle_normal` | `tri3_compute_normal_v3_objects` | [3d/triangle/compute_triangle_normal.js](3d/triangle/compute_triangle_normal.js) <br>*[move → 3d/triangle/tri3_compute_normal_v3_objects.js]* | Object-arg wrapper over v3_compute_triangle_normal; tri3_ prefix; add result_offset. |
417
+ | `v3_compute_triangle_normal` | `tri3_compute_normal` | [3d/triangle/v3_compute_triangle_normal.js](3d/triangle/v3_compute_triangle_normal.js) <br>*[move → 3d/triangle/tri3_compute_normal.js]* | Canonical scalar core; move to tri3_ family (it produces a triangle normal, not a generic v3 op). |
418
+ | `aabb3_compute_from_triangle` | `aabb3_compute_from_triangle` | [3d/triangle/aabb3_compute_from_triangle.js](3d/triangle/aabb3_compute_from_triangle.js) <br>*[move → 3d/triangle/aabb3_compute_from_triangle.js]* | Conforms; listed as exemplar of indexed-vertex calling convention. |
419
+ | `triangle_intersects_clipping_volume` | `tri3_intersects_clipping_volume` | [3d/triangle/triangle_intersects_clipping_volume.js](3d/triangle/triangle_intersects_clipping_volume.js) <br>*[move → 3d/triangle/tri3_intersects_clipping_volume.js]* | tri3_ prefix. |
420
+ | `triangle_compute_plane_side` | `tri3_compute_plane_side` | [3d/triangle/triangle_compute_plane_side.js](3d/triangle/triangle_compute_plane_side.js) <br>*[move → 3d/triangle/tri3_compute_plane_side.js]* | tri3_ prefix; fix 'ave' typo. |
421
+ | `triangle3_incenter` | `tri3_incenter` | [3d/triangle/triangle3_incenter.js](3d/triangle/triangle3_incenter.js) <br>*[move → 3d/triangle/tri3_incenter.js]* | Standardize the spelled-out 'triangle3' -> tri3_ token used across the family. |
422
+ | `shape_mesh_from_geometry` | `shape3_mesh_from_geometry` | [3d/shape/shape_mesh_from_geometry.js](3d/shape/shape_mesh_from_geometry.js) <br>*[move → 3d/shape/shape3_mesh_from_geometry.js]* | Optional dimension token for the shape family; keep 'geometry' (neutral, indexed-buffer). |
423
+ | `shape3d_voxelize_to_grid` | `shape3_voxelize_to_grid` | [3d/shape/util/shape3d_voxelize_to_grid.js](3d/shape/util/shape3d_voxelize_to_grid.js) <br>*[move → 3d/shape/util/shape3_voxelize_to_grid.js]* | Use tri3_/aabb3_-style glued-prefix-digit token shape3_ (not shape3d_). |
424
+ | `spline_bezier2_2d` | `spline2_quadratic_bezier` | [2d/spline_bezier2_2d.js](2d/spline_bezier2_2d.js) <br>*[move → 2d/spline2_quadratic_bezier.js]* | Double dimension token (bezier2 + _2d) and clashing order with spline2_bezier; use spline2_ prefix + spell quadratic. |
425
+ | `normalize_angle_rad` | `normalize_angle_rad` | [normalize_angle_rad.js](normalize_angle_rad.js) <br>*[move → 1d/normalize_angle_rad.js]* | Name OK; relocate from geom root into a 1d/ (or math) subfolder for discoverability — the _rad unit token is fine. |
426
+
427
+ ### misleading-name-lies-about-behavior (26)
428
+
429
+ | old | → new | file | why |
430
+ |-----|-------|------|-----|
431
+ | `line2_distance_to_point_sqr` | `line2_compute_segment_point_distance_sqr` | [2d/line/line2_distance_to_point_sqr.js](2d/line/line2_distance_to_point_sqr.js) <br>*[move → 2d/line/line2_compute_segment_point_distance_sqr.js]* | FLAGSHIP: clamp01 proves it measures distance to a SEGMENT, not an infinite line. Mirror the correctly-named 3d sibling line3_compute_segment_point_distance_sqr. |
432
+ | `line_segment_intersection_fraction_2d` | `line2_segment_intersection_fraction_2d` | [2d/line/line_segment_intersection_fraction_2d.js](2d/line/line_segment_intersection_fraction_2d.js) <br>*[move → 2d/line/line2_segment_intersection_fraction_2d.js]* | First operand is an unbounded line, second a segment; encode both honestly (line2 + segment). |
433
+ | `line3_compute_nearest_point_to_point` | `line3_compute_segment_closest_point` | [3d/line/line3_compute_nearest_point_to_point.js](3d/line/line3_compute_nearest_point_to_point.js) <br>*[move → 3d/line/line3_compute_segment_closest_point.js]* | Delegates to the SEGMENT variant (clamp01) so 'line' lies; 'nearest'->'closest'; drop PointToPoint stutter. |
434
+ | `ray3_distance_to_point` | `ray3_compute_point_projection_t` | [3d/ray/ray3_distance_to_point.js](3d/ray/ray3_distance_to_point.js) <br>*[move → 3d/ray/ray3_compute_point_projection_t.js]* | Returns the projection parameter t (signed distance ALONG the ray), not perpendicular distance — name lies. |
435
+ | `ConicRay.angle (field)` | `ConicRay.halfAngle` | [ConicRay.js](ConicRay.js) <br>*[move → ConicRay.js]* | Field stores a half-angle; bare 'angle' under-specifies. |
436
+ | `v3_angle_atan2_between` | `v3_angle_stable` | [vec3/v3_angle_atan2_between.js](vec3/v3_angle_atan2_between.js) <br>*[move → vec3/v3_angle_stable.js]* | atan2 leaks implementation into the name; expose public meaning (numerically stable angle). |
437
+ | `v3_matrix4_rotate` | `v3_matrix4_rotate_unit` | [vec3/v3_matrix4_rotate.js](vec3/v3_matrix4_rotate.js) <br>*[move → vec3/v3_matrix4_rotate_unit.js]* | Always renormalizes output; name should signal unit-length result. |
438
+ | `Vector4.add3` | `Vector4.add` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | add3 confusingly reads as '3d add'; it is the element-wise add. Match Vector2/Vector3 add. |
439
+ | `m3_multiply_vec3` | `m3_scale_columns_by_vec3` | [mat3/m3_multiply_vec3.js](mat3/m3_multiply_vec3.js) <br>*[move → mat3/m3_scale_columns_by_vec3.js]* | Name LIES: it is not a matrix*vector product (would yield a vec3); it column-scales and writes a 3x3. |
440
+ | `m3_cm_invert` | `m3_invert` | [mat3/m3_cm_invert.js](mat3/m3_cm_invert.js) <br>*[move → mat3/m3_invert.js]* | Inversion is layout-agnostic; cm_ tag implies a non-existent rm_ counterpart. |
441
+ | `aabb2_intersects_point` | `aabb2_contains_point` | [2d/aabb/aabb2_intersects_point.js](2d/aabb/aabb2_intersects_point.js) <br>*[move → 2d/aabb/aabb2_contains_point.js]* | It is a containment test, not surface intersection; reconcile with AABB2.containsPoint and delegate. |
442
+ | `aabb3_project_to_2d (file aabb3_compute_projected_area.js)` | `aabb3_projected_area` | [3d/aabb/aabb3_compute_projected_area.js](3d/aabb/aabb3_compute_projected_area.js) <br>*[move → 3d/aabb/aabb3_projected_area.js]* | Name LIES (returns a scalar AREA, not a 2D box) AND mismatches filename; bare-metric drops compute_. |
443
+ | `aabb3_combined_surface_area` | `aabb3_union_half_surface_area` | [3d/aabb/aabb3_combined_surface_area.js](3d/aabb/aabb3_combined_surface_area.js) <br>*[move → 3d/aabb/aabb3_union_half_surface_area.js]* | Returns HALF surface area of the union (off by 2x vs full); name must say half. |
444
+ | `aabb3_box_surface_area_2` | `aabb3_half_surface_area` | [3d/aabb/aabb3_box_surface_area_2.js](3d/aabb/aabb3_box_surface_area_2.js) <br>*[move → 3d/aabb/aabb3_half_surface_area.js]* | Returns HALF area; '_2' is a meaningless disambiguator (no _1). |
445
+ | `Quaternion.__setFromEuler` | `(remove; typed per-order methods)` | [Quaternion.js](Quaternion.js) <br>*[move → Quaternion.js]* | String-order dispatcher violates typed-over-magic; also fix 'bust be' typo. Keep typed fromEulerAngles<ORDER>. |
446
+ | `Quaternion.process` | `Quaternion.watch` | [Quaternion.js](Quaternion.js) <br>*[move → Quaternion.js]* | Opaque name for 'invoke + subscribe onChanged'. |
447
+ | `sphere_matrix4_project (file sphere_matrix4_transform.js)` | `sphere_matrix4_transform` | [3d/sphere/sphere_matrix4_transform.js](3d/sphere/sphere_matrix4_transform.js) <br>*[move → 3d/sphere/sphere_matrix4_transform.js]* | Export name LIES ('project' but it transforms) AND mismatches filename; transform is correct. |
448
+ | `sphere_intersects_point` | `sphere_contains_point` | [3d/sphere/sphere_intersects_point.js](3d/sphere/sphere_intersects_point.js) <br>*[move → 3d/sphere/sphere_contains_point.js]* | Tests point-inside (containment), not surface intersection. |
449
+ | `orientation3_array` | `orient2d_indexed` | [2d/convex-hull/orientation3_array.js](2d/convex-hull/orientation3_array.js) <br>*[move → 2d/convex-hull/orient2d_indexed.js]* | 'orientation3' LIES about dimension (it is 2D; 3=points). Use orient2d + _indexed for index-into-flat-array inputs. |
450
+ | `plane3_compute_convex_3_plane_intersection` | `plane3_compute_3_plane_intersection` | [3d/plane/plane3_compute_convex_3_plane_intersection.js](3d/plane/plane3_compute_convex_3_plane_intersection.js) <br>*[move → 3d/plane/plane3_compute_3_plane_intersection.js]* | 'convex' lies (only non-degeneracy required). |
451
+ | `bt_mesh_compute_vertex_quadratics` | `bt_mesh_compute_vertex_quadrics` | [3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js](3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js) <br>*[move → 3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js]* | Returns Quadric3 (quadric error metric), not quadratics; align with class name Quadric3. |
452
+ | `bt_face_get_attached_faces / bt_face_get_neighbour_faces` | `bt_face_get_vertex_adjacent_faces / bt_face_get_edge_adjacent_faces` | [3d/topology/struct/binary/query/bt_face_get_attached_faces.js](3d/topology/struct/binary/query/bt_face_get_attached_faces.js) <br>*[move → 3d/topology/struct/binary/query/bt_face_get_vertex_adjacent_faces.js]* | attached(vertex-adj) vs neighbour(edge-adj) distinction must be in the name, not an easily-swapped noun. |
453
+ | `computeTopoMeshBoundiningBox` | `compute_topo_mesh_bounding_box` | [3d/topology/bounds/computeTopoMeshBoundiningBox.js](3d/topology/bounds/computeTopoMeshBoundiningBox.js) <br>*[move → 3d/topology/bounds/compute_topo_mesh_bounding_box.js]* | FIX typo 'Boundining'; camelCase->snake (topology compute layer). |
454
+ | `build_vertex_quadratics / deep_copy_vertex_quadratics / compute_edge_collapse_cost_quadratic` | `build_vertex_quadrics / deep_copy_vertex_quadrics / compute_edge_collapse_cost_quadric` | [3d/topology/simplify/quadratic/(various)](3d/topology/simplify/quadratic/(various)) <br>*[move → 3d/topology/simplify/quadric/(various)]* | Pervasive 'quadratics' misnomer for Quadric3; unify on 'quadric'. |
455
+ | `compute_tetrahedron_volume / compute_tetrahedron_quality` | `tetrahedral_mesh_compute_tet_volume / tetrahedral_mesh_compute_tet_quality` | [3d/tetrahedra/compute_tetrahedron_volume.js](3d/tetrahedra/compute_tetrahedron_volume.js) <br>*[move → 3d/tetrahedra/tetrahedral_mesh_compute_tet_volume.js]* | Resolve the compute_tetrahedron_X (mesh) vs tetrahedron_compute_X (indexed) token-order collision: mesh-forms join the tetrahedral_mesh_ family; indexed primitives keep tetrahedron_compute_*. Also compute_tetrahedron_volume returns SIGNED — say so. |
456
+ | `TopoMesh.setFacedUnindexed` | `TopoMesh.setFacesUnindexed` | [3d/topology/struct/TopoMesh.js](3d/topology/struct/TopoMesh.js) <br>*[move → 3d/topology/struct/TopoMesh.js]* | Typo 'Faced'->'Faces'. |
457
+
458
+ ### camelCase-legacy-islands (21)
459
+
460
+ | old | → new | file | why |
461
+ |-----|-------|------|-----|
462
+ | `eulerAnglesFromMatrix` | `m4_euler_angles` | [3d/mat4/eulerAnglesFromMatrix.js](3d/mat4/eulerAnglesFromMatrix.js) <br>*[move → 3d/mat4/m4_euler_angles.js]* | camelCase island -> snake m4_ prefix. |
463
+ | `quat3_createFromAxisAngle` | `quat3_from_axis_angle` | [3d/quaternion/quat3_createFromAxisAngle.js](3d/quaternion/quat3_createFromAxisAngle.js) <br>*[move → 3d/quaternion/quat3_from_axis_angle.js]* | camelCase-in-snake hybrid + 'create' lies (no alloc); move output to first (out,out_offset), take scalar axis. |
464
+ | `computeBoundingSphereOfSpheres` | `sphere_compute_bounding_of_spheres` | [packing/computeBoundingSphereOfSpheres.js](packing/computeBoundingSphereOfSpheres.js) <br>*[move → packing/sphere_compute_bounding_of_spheres.js]* | camelCase island -> snake; align with the of_2_spheres sibling; fix sqr_distance_to_center mislabel (holds linear distance). |
465
+ | `computeConePlaneSide` | `cone_compute_plane_side` | [3d/cone/computeConePlaneSide.js](3d/cone/computeConePlaneSide.js) <br>*[move → 3d/cone/cone_compute_plane_side.js]* | camelCase island -> snake cone_ prefix; fix mixed plane_normal_x/originX param casing. |
466
+ | `computeConeBoundingBox` | `cone_compute_bounding_box` | [3d/cone/computeConeBoundingBox.js](3d/cone/computeConeBoundingBox.js) <br>*[move → 3d/cone/cone_compute_bounding_box.js]* | camelCase island -> snake; align token order with circle3_compute_bounding_box. |
467
+ | `computeTriangleRayIntersection` | `tri3_ray_intersection` | [3d/triangle/computeTriangleRayIntersection.js](3d/triangle/computeTriangleRayIntersection.js) <br>*[move → 3d/triangle/tri3_ray_intersection.js]* | camelCase island -> snake tri3_; fix finate/triange typos. |
468
+ | `computeTriangleRayIntersectionBarycentric` | `tri3_ray_intersection_barycentric` | [3d/triangle/computeTriangleRayIntersectionBarycentric.js](3d/triangle/computeTriangleRayIntersectionBarycentric.js) <br>*[move → 3d/triangle/tri3_ray_intersection_barycentric.js]* | camelCase->snake tri3_; fix [t,u,v] doc/impl mismatch. |
469
+ | `computeTriangleRayIntersectionBarycentricEdge` | `tri3_ray_intersection_barycentric_edge` | [3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js](3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js) <br>*[move → 3d/triangle/tri3_ray_intersection_barycentric_edge.js]* | camelCase->snake tri3_. |
470
+ | `rayTriangleIntersection` | `tri3_ray_intersection_v3_objects` | [3d/triangle/rayTriangleIntersection.js](3d/triangle/rayTriangleIntersection.js) <br>*[move → 3d/triangle/tri3_ray_intersection_v3_objects.js]* | camelCase + reversed word order; snake tri3_; mark the Vector3-object wrapper. |
471
+ | `computeTriangleClosestPointToPointBarycentric` | `tri3_closest_point_barycentric` | [3d/triangle/computeTriangleClosestPointToPointBarycentric.js](3d/triangle/computeTriangleClosestPointToPointBarycentric.js) <br>*[move → 3d/triangle/tri3_closest_point_barycentric.js]* | camelCase->snake tri3_; drop PointToPoint stutter; keep 'closest'. |
472
+ | `frustum3_computeNearestPointToPoint` | `frustum3_compute_closest_point` | [3d/frustum/frustum3_computeNearestPointToPoint.js](3d/frustum/frustum3_computeNearestPointToPoint.js) <br>*[move → 3d/frustum/frustum3_compute_closest_point.js]* | Only camelCase export here -> snake; nearest->closest; drop PointToPoint; FIX inverted boolean return semantics. |
473
+ | `mortonEncode_LUT` | `v3_morton_encode_lut` | [3d/morton/mortonEncode_LUT.js](3d/morton/mortonEncode_LUT.js) <br>*[move → 3d/morton/v3_morton_encode_lut.js]* | camelHybrid -> snake v3_ prefix. |
474
+ | `mortonEncode_magicbits` | `v3_morton_encode_magicbits` | [3d/morton/mortonEncode_magicbits.js](3d/morton/mortonEncode_magicbits.js) <br>*[move → 3d/morton/v3_morton_encode_magicbits.js]* | camelHybrid -> snake v3_ prefix; v3_morton_encode default-alias becomes a thin re-export. |
475
+ | `randomPointInBox` | `random_point_in_box` | [random/randomPointInBox.js](random/randomPointInBox.js) <br>*[move → random/random_point_in_box.js]* | camelCase folder -> snake. (See open question on In/On token.) |
476
+ | `randomPointOnBox` | `random_point_on_box` | [random/randomPointOnBox.js](random/randomPointOnBox.js) <br>*[move → random/random_point_on_box.js]* | camelCase -> snake. |
477
+ | `randomPointInSphere / OnSphere / InCircle / InPoint` | `random_point_in_sphere (etc.)` | [random/randomPointInSphere.js](random/randomPointInSphere.js) <br>*[move → random/random_point_in_sphere.js]* | camelCase -> snake across the random/ family; rename destination_offset->result_offset in random_point_in_point. |
478
+ | `packMaxRectangles / packOneBox / findBestContainer / cutArea / removeRedundantBoxes / costBy*` | `pack_max_rectangles / pack_one_box / find_best_container / cut_area / remove_redundant_boxes / cost_by_*` | [packing/max-rect/packMaxRectangles.js](packing/max-rect/packMaxRectangles.js) <br>*[move → packing/max-rect/pack_max_rectangles.js]* | Entire camelCase folder -> snake. |
479
+ | `computeTopoMeshBoundingSphere / computeTopoMeshVertexDuplicates / computeTriangleClusterNormalBoundingCone` | `compute_topo_mesh_bounding_sphere / compute_topo_mesh_vertex_duplicates / compute_triangle_cluster_normal_bounding_cone` | [3d/topology/bounds/computeTopoMeshBoundingSphere.js](3d/topology/bounds/computeTopoMeshBoundingSphere.js) <br>*[move → 3d/topology/bounds/compute_topo_mesh_bounding_sphere.js]* | camelCase topology layer -> snake. |
480
+ | `simplifyTopoMesh / simplifyTopoMesh2` | `simplify_topo_mesh_quadric / simplify_topo_mesh_decimate` | [3d/topology/simplify/simplifyTopoMesh.js](3d/topology/simplify/simplifyTopoMesh.js) <br>*[move → 3d/topology/simplify/simplify_topo_mesh_quadric.js]* | camelCase->snake; numeric '2' suffix carries no semantics — name by algorithm; consolidate duplicate entry points. |
481
+ | `computeEdgeCollapseCost / collapseEdge / partialEdgeCollapse / EdgeCollapseCandidate` | `compute_edge_collapse_cost / collapse_edge / partial_edge_collapse / EdgeCollapseCandidate(class kept)` | [3d/topology/simplify/(various)](3d/topology/simplify/(various)) <br>*[move → 3d/topology/simplify/(various)]* | camelCase free fns -> snake; reconcile the duplicate cost functions (camel vs snake) into one. |
482
+ | `StaticR2Tree (mixed casing methods)` | `StaticRTree2D (snake_case methods)` | [2d/r-tree/StaticR2Tree.js](2d/r-tree/StaticR2Tree.js) <br>*[move → 2d/r-tree/StaticRTree2D.js]* | 'R2'->'2D' dimension token; unify mixed camel/snake methods onto snake (matches BVH2D/SpatialHashGrid). |
483
+
484
+ ### redundant-token-repetition (17)
485
+
486
+ | old | → new | file | why |
487
+ |-----|-------|------|-----|
488
+ | `line_segment_compute_line_segment_intersection_array_2d` | `segment2_segment_compute_intersection_array_2d` | [2d/line/line_segment_compute_line_segment_intersection_array_2d.js](2d/line/line_segment_compute_line_segment_intersection_array_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_array_2d.js]* | FLAGSHIP: 'line_segment' stuttered twice + verbose. One segment token per operand role; _array kept (it is the offset-addressed flat-array writer, the correct meaning). |
489
+ | `line_segment_compute_line_segment_intersection_2d` | `segment2_segment_compute_intersection_v2_2d` | [2d/line/line_segment_compute_line_segment_intersection_2d.js](2d/line/line_segment_compute_line_segment_intersection_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_v2_2d.js]* | Vector2-sink wrapper; de-stutter and mark the v2-object sink with _v2; move output to first (result,...) per convention. |
490
+ | `line_segment_compute_line_segment_intersection_vectors_2d` | `segment2_segment_compute_intersection_v2_objects_2d` | [2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js](2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_v2_objects_2d.js]* | De-stutter; clarify it takes Vector2 objects for both operands. |
491
+ | `v3_triple_cross_product` | `v3_triple_cross` | [vec3/v3_triple_cross_product.js](vec3/v3_triple_cross_product.js) <br>*[move → vec3/v3_triple_cross.js]* | Drop _product to match v3_cross / v3_cross_array. |
492
+ | `v3_angle_between` | `v3_angle` | [vec3/v3_angle_between.js](vec3/v3_angle_between.js) <br>*[move → vec3/v3_angle.js]* | Drop redundant infix 'between' (two operands implied). |
493
+ | `v3_angle_cos_between` | `v3_cos_angle` | [vec3/v3_angle_cos_between.js](vec3/v3_angle_cos_between.js) <br>*[move → vec3/v3_cos_angle.js]* | Drop 'between'; lead with the returned quantity (cos). |
494
+ | `Vector3.projectOntoVector3` | `Vector3.projectOnto` | [Vector3.js](Vector3.js) <br>*[move → Vector3.js]* | Redundant Vector3 token (class is the type). |
495
+ | `aabb2_array_combine` | `aabb2_union_array` | [2d/aabb/aabb2_array_combine.js](2d/aabb/aabb2_array_combine.js) <br>*[move → 2d/aabb/aabb2_union_array.js]* | Box-union has 3 names (combine/expandToFit/resizeToFit); standardize on union; suffix _array (offset operands). |
496
+ | `AABB2.overlapExists / expandToFit` | `AABB2.intersects / union` | [2d/aabb/AABB2.js](2d/aabb/AABB2.js) <br>*[move → 2d/aabb/AABB2.js]* | Align class with free-fn intersects + union vocabulary. |
497
+ | `aabb3_near_distance_to_intersection_ray_segment` | `aabb3_ray_segment_entry_distance` | [3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js](3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js) <br>*[move → 3d/aabb/aabb3_ray_segment_entry_distance.js]* | 'near_distance_to_intersection' verbose/redundant; entry distance IS the intersection distance. |
498
+ | `sphere_projected_sphere_radius_sqr` | `sphere_projected_radius_sqr` | [3d/sphere/sphere_projected_sphere_radius_sqr.js](3d/sphere/sphere_projected_sphere_radius_sqr.js) <br>*[move → 3d/sphere/sphere_projected_radius_sqr.js]* | Redundant 'sphere' repeated; also unify param order with sphere_project (sphere,matrix,focal_length). |
499
+ | `circle_compute_circle_intersection` | `circle_compute_intersection` | [2d/circle/circle_compute_circle_intersection.js](2d/circle/circle_compute_circle_intersection.js) <br>*[move → 2d/circle/circle_compute_intersection.js]* | Redundant circle repetition. |
500
+ | `plane3_compute_plane_intersection` | `plane3_compute_intersection_objects` | [3d/plane/plane3_compute_plane_intersection.js](3d/plane/plane3_compute_plane_intersection.js) <br>*[move → 3d/plane/plane3_compute_intersection_objects.js]* | Redundant 'plane' repetition; mark as the object-adapter (TODO says consolidate with plane3_intersect_plane); stop calling private __setFromRotationMatrix. |
501
+ | `hexahedron_from_aabb` | `frustum3_from_aabb` | [3d/frustum/hexahedron_from_aabb.js](3d/frustum/hexahedron_from_aabb.js) <br>*[move → 3d/frustum/frustum3_from_aabb.js]* | Same 6-plane layout as frustum family; unify the noun to frustum (drop hexahedron). |
502
+ | `frustum_matrix4_project / clipping_volume_matrix4_project` | `frustum3_matrix4_project / frustum3_matrix4_project_n` | [3d/frustum/frustum_matrix4_project.js](3d/frustum/frustum_matrix4_project.js) <br>*[move → 3d/frustum/frustum3_matrix4_project.js]* | Add dimension digit; unify noun (clipping_volume = n-plane frustum); standardize matrix-last param order. |
503
+ | `bt_faces_shared_loop` | `bt_face_get_shared_loop` | [3d/topology/struct/binary/query/bt_faces_shared_loop.js](3d/topology/struct/binary/query/bt_faces_shared_loop.js) <br>*[move → 3d/topology/struct/binary/query/bt_face_get_shared_loop.js]* | Singularize face token + match bt_face_get_* query family. |
504
+ | `tetrahedral_mesh_tet_get_neighbours` | `tetrahedral_mesh_get_neighbours` | [3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js](3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js) <br>*[move → 3d/tetrahedra/tetrahedral_mesh_get_neighbours.js]* | Redundant tet token (tetrahedral_mesh already implies tet); also move (out,out_offset) to front. |
505
+
506
+ ### array-token-overload (16)
507
+
508
+ | old | → new | file | why |
509
+ |-----|-------|------|-----|
510
+ | `line_segment_compute_line_segment_intersection_vectors_array_2d` | `segment2_segment_compute_intersection_to_new_array_2d` | [2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js](2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js) <br>*[move → 2d/line/segment2_segment_compute_intersection_to_new_array_2d.js]* | This one ALLOCATES and returns a new array — _array previously lied. Use _to_new_array to signal allocation, removing the contradictory _array meaning. |
511
+ | `v3_array_normalize` | `v3_normalize_array` | [vec3/v3_array_normalize.js](vec3/v3_array_normalize.js) <br>*[move → vec3/v3_normalize_array.js]* | Standardize _array as SUFFIX (offset operand) everywhere. |
512
+ | `v3_array_scale` | `v3_scale_array` | [vec3/v3_array_scale.js](vec3/v3_array_scale.js) <br>*[move → vec3/v3_scale_array.js]* | Suffix _array; also unify scale verb (drop multiply_scalar split). |
513
+ | `v3_array_copy` | `v3_copy_array` | [vec3/v3_array_copy.js](vec3/v3_array_copy.js) <br>*[move → vec3/v3_copy_array.js]* | Suffix _array; rename params target/source -> result/input. |
514
+ | `v3_array_centroid` | `v3_centroid_v3_buffer` | [vec3/v3_array_centroid.js](vec3/v3_array_centroid.js) <br>*[move → vec3/v3_centroid_v3_buffer.js]* | Here _array meant a BATCH of many vectors (loops count*3), a different meaning — use _v3_buffer; also return void to match siblings. |
515
+ | `v3_array_matrix4_rotate` | `v3_matrix4_rotate_array` | [vec3/v3_array_matrix4_rotate.js](vec3/v3_array_matrix4_rotate.js) <br>*[move → vec3/v3_matrix4_rotate_array.js]* | Suffix _array; align with v3_matrix4_multiply (which reads at offset without the token). |
516
+ | `v3_array_equals` | `v3_equals_array` | [vec3/v3_array_equals.js](vec3/v3_array_equals.js) <br>*[move → vec3/v3_equals_array.js]* | Suffix _array (offset operands). |
517
+ | `v3_array_displace_in_direction` | `v3_displace_in_direction_to_array` | [vec3/v3_array_displace_in_direction.js](vec3/v3_array_displace_in_direction.js) <br>*[move → vec3/v3_displace_in_direction_to_array.js]* | Inputs are SCALARS, only output is an array; the prefix array_ lied. _to_array marks the array output. |
518
+ | `v3_cross_array` | `v3_cross_array` | [vec3/v3_cross_array.js](vec3/v3_cross_array.js) <br>*[move → vec3/v3_cross_array.js]* | Already conforms (suffix _array, both operands at offsets) — kept; listed only as the canonical exemplar siblings should match. |
519
+ | `v3_dot_array_array` | `v3_dot_array` | [vec3/v3_dot_array_array.js](vec3/v3_dot_array_array.js) <br>*[move → vec3/v3_dot_array.js]* | Double _array_array banned; a single _array already implies both operands at offsets (matches v3_cross_array). |
520
+ | `v3_negate_array` | `v3_negate_array` | [vec3/v3_negate_array.js](vec3/v3_negate_array.js) <br>*[move → vec3/v3_negate_array.js]* | Already conforms (suffix _array). Listed as exemplar; no change. |
521
+ | `vector_scale_array` | `vector_scale_offset` | [vec/vector_scale_array.js](vec/vector_scale_array.js) <br>*[move → vec/vector_scale_offset.js]* | _array lies (it is the offset-taking scale primitive, no array-of-vectors); rename count param dimensions->n. |
522
+ | `sphere_array_intersects_point` | `sphere_packed_contains_point` | [3d/sphere/sphere_array_intersects_point.js](3d/sphere/sphere_array_intersects_point.js) <br>*[move → 3d/sphere/sphere_packed_contains_point.js]* | _array meant packed single sphere [cx,cy,cz,r] (not offset operand); containment fix too. |
523
+ | `sphere_array_intersects_ray` | `sphere_packed_intersects_ray` | [3d/sphere/sphere_array_intersects_ray.js](3d/sphere/sphere_array_intersects_ray.js) <br>*[move → 3d/sphere/sphere_packed_intersects_ray.js]* | _array=packed sphere; use _packed token. |
524
+ | `sphere_radius_sqr_from_v3_array_transformed` | `sphere_radius_sqr_from_v3_buffer_transformed` | [3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js](3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js) <br>*[move → 3d/sphere/sphere_radius_sqr_from_v3_buffer_transformed.js]* | _array here = batch of vec3 points; use _v3_buffer; fix JSDoc typos bonding/foe. |
525
+ | `removeRedundantBoxesArray` | `remove_redundant_boxes_from_array` | [packing/max-rect/removeRedundantBoxesArray.js](packing/max-rect/removeRedundantBoxesArray.js) <br>*[move → packing/max-rect/remove_redundant_boxes_from_array.js]* | camelCase->snake; '_Array' overload meant 'plain Array container' -> spell it _from_array. |
526
+
527
+ ### verb-prefix-inconsistency (14)
528
+
529
+ | old | → new | file | why |
530
+ |-----|-------|------|-----|
531
+ | `line3_closest_points_segment_segment` | `line3_compute_segment_segment_closest_points` | [3d/line/line3_closest_points_segment_segment.js](3d/line/line3_closest_points_segment_segment.js) <br>*[move → 3d/line/line3_compute_segment_segment_closest_points.js]* | Add compute_ verb to match line3_compute_* siblings; add result_offset; reorder operand tokens. |
532
+ | `v3_multiply_scalar` | `v3_scale` | [vec3/v3_multiply_scalar.js](vec3/v3_multiply_scalar.js) <br>*[move → vec3/v3_scale.js]* | Two verbs (multiply_scalar vs array_scale) for one op; standardize on scale (scalar-in) + v3_scale_array (offset-in). |
533
+ | `v3_compute_interior_angle` | `v3_interior_angle` | [vec3/v3_compute_interior_angle.js](vec3/v3_compute_interior_angle.js) <br>*[move → vec3/v3_interior_angle.js]* | Lone compute_ user and lone object-arg taker; drop compute_ (bare metric) and take scalar triples. |
534
+ | `m3_cm_from_translation` | `m3_cm_make_translation` | [mat3/m3_cm_from_translation.js](mat3/m3_cm_from_translation.js) <br>*[move → mat3/m3_cm_make_translation.js]* | Standardize translation-matrix builder verb on make_ (matches m4_make_translation). |
535
+ | `m4_compute_normal_matrix3` | `m4_normal_matrix3` | [3d/mat4/m4_compute_normal_matrix3.js](3d/mat4/m4_compute_normal_matrix3.js) <br>*[move → 3d/mat4/m4_normal_matrix3.js]* | Bare-metric: drop compute_ to match m4_rotation_translation etc. |
536
+ | `aabb2_compute_area` | `aabb2_area` | [2d/aabb/aabb2_compute_area.js](2d/aabb/aabb2_compute_area.js) <br>*[move → 2d/aabb/aabb2_area.js]* | Bare-metric: drop compute_ (consistent with aabb2_distance_to_point). |
537
+ | `aabb2_compute_center_from_multiple` | `aabb2_center_from_aabb2_buffer` | [2d/aabb/aabb2_compute_center_from_multiple.js](2d/aabb/aabb2_compute_center_from_multiple.js) <br>*[move → 2d/aabb/aabb2_center_from_aabb2_buffer.js]* | Drop compute_; clarify input is a batch; add result out-param to stop per-call allocation. |
538
+ | `aabb3_compute_surface_area` | `aabb3_surface_area` | [3d/aabb/aabb3_compute_surface_area.js](3d/aabb/aabb3_compute_surface_area.js) <br>*[move → 3d/aabb/aabb3_surface_area.js]* | Bare-metric drops compute_. |
539
+ | `aabb3_compute_half_surface_area` | `aabb3_half_surface_area_extents` | [3d/aabb/aabb3_compute_half_surface_area.js](3d/aabb/aabb3_compute_half_surface_area.js) <br>*[move → 3d/aabb/aabb3_half_surface_area_extents.js]* | Bare-metric drops compute_; note collision with the renamed single-box helper — keep the extents-primitive distinct (scalar x0..z1 in). |
540
+ | `Quaternion.setFromRotationMatrix` | `Quaternion.fromRotationMatrix` | [Quaternion.js](Quaternion.js) <br>*[move → Quaternion.js]* | Match the from* converter family (drop set prefix). |
541
+ | `is_point_within_planes` | `plane3_contains_point_within_set` | [3d/plane/is_point_within_planes.js](3d/plane/is_point_within_planes.js) <br>*[move → 3d/plane/plane3_contains_point_within_set.js]* | Add plane3_ prefix; remove contradictory @private on an export. |
542
+ | `fill_in_a_cavity` | `tetrahedral_mesh_fill_cavity` | [3d/topology/delaunay/fill_in_a_cavity.js](3d/topology/delaunay/fill_in_a_cavity.js) <br>*[move → 3d/topology/delaunay/tetrahedral_mesh_fill_cavity.js]* | Prose-style name with articles; use domain-token verb_noun. |
543
+ | `qt_match_data_by_circle` | `qt_collect_by_circle (merge w/ optional predicate)` | [2d/quad-tree/qt_match_data_by_circle.js](2d/quad-tree/qt_match_data_by_circle.js) <br>*[move → 2d/quad-tree/qt_collect_by_circle.js]* | match_=collect_+predicate; collapse the three-verb sprawl (collect_/match_/query_data_) onto one collect_ verb. |
544
+ | `make_justified_point_grid` | `aabb3_emit_point_grid` | [3d/util/make_justified_point_grid.js](3d/util/make_justified_point_grid.js) <br>*[move → 3d/util/aabb3_emit_point_grid.js]* | 'make_' verb is a lone outlier; it iterates over an AABB3 emitting points via callback — encode the type and the emit semantics. |
545
+
546
+ ### output-arg-placement-and-missing-offset (14)
547
+
548
+ | old | → new | file | why |
549
+ |-----|-------|------|-----|
550
+ | `ray3_array_compose` | `ray3_compose_array` | [3d/ray/ray3_array_compose.js](3d/ray/ray3_array_compose.js) <br>*[move → 3d/ray/ray3_compose_array.js]* | Suffix _array (offset convention); ADD missing output_offset param to match ray3 array family. |
551
+ | `v3_rigid_align_paired_unit_vectors (out_quaternion last)` | `v3_rigid_align_paired_unit_vectors` | [vec3/v3_rigid_align_paired_unit_vectors.js](vec3/v3_rigid_align_paired_unit_vectors.js) <br>*[move → vec3/v3_rigid_align_paired_unit_vectors.js]* | Name acceptable; move out_quaternion to FIRST param to match output-first rule. |
552
+ | `apply_mat4_transform_to_v3_array` | `m4_transform_v3_buffer` | [3d/mat4/apply_mat4_transform_to_v3_array.js](3d/mat4/apply_mat4_transform_to_v3_array.js) <br>*[move → 3d/mat4/m4_transform_v3_buffer.js]* | m4_ prefix; _v3_buffer = batch of vectors (distinct from offset-operand _array); move output to first. |
553
+ | `apply_mat4_transform_to_direction_v3_array` | `m4_transform_direction_v3_buffer` | [3d/mat4/apply_mat4_transform_to_direction_v3_array.js](3d/mat4/apply_mat4_transform_to_direction_v3_array.js) <br>*[move → 3d/mat4/m4_transform_direction_v3_buffer.js]* | Same as above; 'direction' kept (normalizes result). |
554
+ | `aabb2_from_v2_array` | `aabb2_from_v2_buffer` | [2d/aabb/aabb2_from_v2_array.js](2d/aabb/aabb2_from_v2_array.js) <br>*[move → 2d/aabb/aabb2_from_v2_buffer.js]* | Input is a batch of points (not offset operand); ADD missing result_offset (currently hardcodes 0). |
555
+ | `aabb3_expand_array` | `aabb3_expand_array` | [3d/aabb/aabb3_expand_array.js](3d/aabb/aabb3_expand_array.js) <br>*[move → 3d/aabb/aabb3_expand_array.js]* | Name OK; FIX output-arg placement (output is 2nd) to output-first; rename param distance->margin. |
556
+ | `quat3_integrate (param result_q, no offset)` | `quat3_integrate` | [3d/quaternion/quat3_integrate.js](3d/quaternion/quat3_integrate.js) <br>*[move → 3d/quaternion/quat3_integrate.js]* | Name OK; rename result_q->out and ADD out_offset to match quat3 family. |
557
+ | `polygon2_clip_axis_halfplane` | `polygon2_clip_axis_halfplane` | [2d/polygon/polygon2_clip_axis_halfplane.js](2d/polygon/polygon2_clip_axis_halfplane.js) <br>*[move → 2d/polygon/polygon2_clip_axis_halfplane.js]* | Name OK; FIX output-arg (points_out is 3rd) to output-first and add output_offset. |
558
+ | `slice_frustum_linear_to_points` | `frustum3_slice_linear_to_points` | [3d/frustum/slice_frustum_linear_to_points.js](3d/frustum/slice_frustum_linear_to_points.js) <br>*[move → 3d/frustum/frustum3_slice_linear_to_points.js]* | Verb-first -> noun-first frustum3_ family; FIX output-last to output-first. |
559
+ | `read_three_planes_to_array` | `frustum3_planes_to_flat_from_three` | [3d/frustum/read_three_planes_to_array.js](3d/frustum/read_three_planes_to_array.js) <br>*[move → 3d/frustum/frustum3_planes_to_flat_from_three.js]* | Output-last -> output-first; vendor token to adapter suffix; _array ambiguous (it is to-flat). |
560
+ | `octahedral_uv_to_direction / octahedral_direction_to_uv` | `octahedral_uv_to_direction / octahedral_direction_to_uv` | [3d/octahedra/octahedral_uv_to_direction.js](3d/octahedra/octahedral_uv_to_direction.js) <br>*[move → 3d/octahedra/octahedral_uv_to_direction.js]* | Names OK; align equirectangular_* to THIS output-first (out,out_offset,in,in_offset) shape (the equirect functions are the ones to change). |
561
+ | `equirectangular_uv_to_direction / equirectangular_direction_to_uv` | `equirectangular_uv_to_direction / equirectangular_direction_to_uv` | [3d/equirectangular/equirectangular_uv_to_direction.js](3d/equirectangular/equirectangular_uv_to_direction.js) <br>*[move → 3d/equirectangular/equirectangular_uv_to_direction.js]* | Names OK; FIX output placement to output-first to match octahedral_* siblings. |
562
+ | `gjk_epa_penetration (out, no offset)` | `gjk_epa_penetration` | [3d/gjk/gjk_epa_penetration.js](3d/gjk/gjk_epa_penetration.js) <br>*[move → 3d/gjk/gjk_epa_penetration.js]* | Name OK; add out_offset to match mpr/minkowski_support; reconcile MTV encoding with mpr. |
563
+ | `bvh2d_query_all_data_by_circle` | `bvh2d_query_all_data_by_circle` | [2d/bvh/bvh2d_query_all_data_by_circle.js](2d/bvh/bvh2d_query_all_data_by_circle.js) <br>*[move → 2d/bvh/bvh2d_query_all_data_by_circle.js]* | Name OK; reorder params to (result, result_offset, bvh, root, ...) to match shg_/qt_ query convention. |
564
+
565
+ ### abbreviation-vert-and-matrix-param (14)
566
+
567
+ | old | → new | file | why |
568
+ |-----|-------|------|-----|
569
+ | `v3_array_immediate_add` | `v3_add_array` | [vec3/v3_array_immediate_add.js](vec3/v3_array_immediate_add.js) <br>*[move → vec3/v3_add_array.js]* | 'immediate' is opaque; this is array(offset)+=array(offset). Mirror dot/cross array convention. |
570
+ | `v3_array_add_in_place` | `v3_add` | [vec3/v3_array_add_in_place.js](vec3/v3_array_add_in_place.js) <br>*[move → vec3/v3_add.js]* | 'in_place' redundant (every writer mutates); this is the scalar-source add primitive. |
571
+ | `v3_quat3_apply` | `v3_quaternion_apply` | [vec3/v3_quat3_apply.js](vec3/v3_quat3_apply.js) <br>*[move → vec3/v3_quaternion_apply.js]* | quat3 token misleads (3 reads as quat dim); use full 'quaternion' to match Quaternion class. |
572
+ | `v3_quat3_apply_inverse` | `v3_quaternion_apply_inverse` | [vec3/v3_quat3_apply_inverse.js](vec3/v3_quat3_apply_inverse.js) <br>*[move → vec3/v3_quaternion_apply_inverse.js]* | Same quat3 token fix. |
573
+ | `v3_matrix3_rotate (param mat3)` | `v3_matrix3_rotate` | [vec3/v3_matrix3_rotate.js](vec3/v3_matrix3_rotate.js) <br>*[move → vec3/v3_matrix3_rotate.js]* | Function name OK; rename matrix param mat3 -> m3 to match m4 convention. |
574
+ | `v4_multiply_mat4` | `v4_matrix4_multiply` | [vec4/v4_multiply_mat4.js](vec4/v4_multiply_mat4.js) <br>*[move → vec4/v4_matrix4_multiply.js]* | Align matrix token with v3_matrix4_multiply (m4 family) and reorder to noun-first. |
575
+ | `aabb3_intersects_line_segment (camelCase params)` | `aabb3_intersects_segment3` | [3d/aabb/aabb3_intersects_line_segment.js](3d/aabb/aabb3_intersects_line_segment.js) <br>*[move → 3d/aabb/aabb3_intersects_segment3.js]* | Two endpoints => segment; rename startX/endX -> start_x/end_x (snake). |
576
+ | `quat_encode_to_uint32` | `quat3_encode_to_uint32` | [3d/quaternion/quat_encode_to_uint32.js](3d/quaternion/quat_encode_to_uint32.js) <br>*[move → 3d/quaternion/quat3_encode_to_uint32.js]* | Unify type token on quat3_ (the family majority). |
577
+ | `quat_decode_from_uint32` | `quat3_decode_from_uint32` | [3d/quaternion/quat_decode_from_uint32.js](3d/quaternion/quat_decode_from_uint32.js) <br>*[move → 3d/quaternion/quat3_decode_from_uint32.js]* | Unify token quat3_; rename output/output_offset -> out/out_offset. |
578
+ | `sh3_rotate_bl` | `sh3_rotate` | [3d/sphere/harmonics/sh3_rotate_bl.js](3d/sphere/harmonics/sh3_rotate_bl.js) <br>*[move → 3d/sphere/harmonics/sh3_rotate.js]* | '_bl' (BakerLab) provenance token is opaque public surface; add (array,offset) params for parity. |
579
+ | `sh_compute_K` | `sh_normalization_factor` | [3d/sphere/harmonics/sh_compute_K.js](3d/sphere/harmonics/sh_compute_K.js) <br>*[move → 3d/sphere/harmonics/sh_normalization_factor.js]* | Capital K reads like a constant; verb+single-letter inconsistent with sh_index. |
580
+ | `tm_vert_kill / tm_kill_only_vert / tm_vert_splice / tm_vert_fuse_duplicate_edges` | `tm_vertex_kill / tm_vertex_kill_only / tm_vertex_splice / tm_vertex_fuse_duplicate_edges` | [3d/topology/(various)](3d/topology/(various)) <br>*[move → 3d/topology/(various)]* | Standardize vertex token to 'vertex'; element-first kill order (tm_vertex_kill_only) matches tm_vertex_kill. |
581
+ | `tm_kill_only_edge / tm_kill_only_face` | `tm_edge_kill_only / tm_face_kill_only` | [3d/topology/io/(various)](3d/topology/io/(various)) <br>*[move → 3d/topology/io/(various)]* | Element-first to match tm_edge_kill / tm_face_kill (verb-then-element was inverted). |
582
+ | `bt_vert_kill / bt_vert_fuse_duplicate_edges / bt_kill_only_vert / bt_merge_verts_by_distance` | `bt_vertex_kill / bt_vertex_fuse_duplicate_edges / bt_vertex_kill_only / bt_merge_vertices_by_distance` | [3d/topology/struct/binary/io/vertex/(various)](3d/topology/struct/binary/io/vertex/(various)) <br>*[move → 3d/topology/struct/binary/io/vertex/(various)]* | Unify vertex token to 'vertex' (matches BinaryTopology vertex_* accessors); element-first kill order. |
583
+
584
+ ### predicate-vs-producer-vs-degree (10)
585
+
586
+ | old | → new | file | why |
587
+ |-----|-------|------|-----|
588
+ | `line_segment_line_segment_intersection_exists_2d` | `segment2_intersects_segment2_2d` | [2d/line/line_segment_line_segment_intersection_exists_2d.js](2d/line/line_segment_line_segment_intersection_exists_2d.js) <br>*[move → 2d/line/segment2_intersects_segment2_2d.js]* | Boolean predicate -> intersects form; drop doubled token and _exists. |
589
+ | `intersect_ray_2d` | `ray2_ray2_compute_intersection_array_2d` | [2d/intersect_ray_2d.js](2d/intersect_ray_2d.js) <br>*[move → 2d/line/ray2_ray2_compute_intersection_array_2d.js]* | Verb-first name breaks noun/type-first rule; bare verb 'intersect' banned; move under 2d/line/; fix JSDoc 'coplanar' (a 3D term). |
590
+ | `aabb2_overlap_exists` | `aabb2_intersects_aabb2` | [2d/aabb/aabb2_overlap_exists.js](2d/aabb/aabb2_overlap_exists.js) <br>*[move → 2d/aabb/aabb2_intersects_aabb2.js]* | Standardize boolean box-box test on intersects_<other>. |
591
+ | `aabb2_compute_overlap` | `aabb2_compute_intersection` | [2d/aabb/aabb2_compute_overlap.js](2d/aabb/aabb2_compute_overlap.js) <br>*[move → 2d/aabb/aabb2_compute_intersection.js]* | It writes the overlap REGION (geometry producer) -> compute_*_intersection form; reserve overlap/intersects for the bool. |
592
+ | `Rectangle.intersects / Rectangle.overlaps` | `Rectangle.intersects (one method, documented closed-interval)` | [2d/Rectangle.js](2d/Rectangle.js) <br>*[move → 2d/Rectangle.js]* | Two methods read as synonyms but differ in boundary semantics; collapse to one with documented semantics (delegate to aabb2_intersects_aabb2). |
593
+ | `aabb3_intersects_frustum_degree` | `aabb3_classify_against_frustum` | [3d/aabb/aabb3_intersects_frustum_degree.js](3d/aabb/aabb3_intersects_frustum_degree.js) <br>*[move → 3d/aabb/aabb3_classify_against_frustum.js]* | Returns a 3-state degree, not a bool; intersects_ prefix lies about return shape. |
594
+ | `aabb3_array_intersects_frustum_degree` | `aabb3_classify_against_frustum_array` | [3d/aabb/aabb3_array_intersects_frustum_degree.js](3d/aabb/aabb3_array_intersects_frustum_degree.js) <br>*[move → 3d/aabb/aabb3_classify_against_frustum_array.js]* | Same degree-not-bool fix; suffix _array (offset aabb). |
595
+ | `aabb3_detailed_volume_intersection` | `aabb3_compute_clipping_volume_intersection` | [3d/aabb/aabb3_detailed_volume_intersection.js](3d/aabb/aabb3_detailed_volume_intersection.js) <br>*[move → 3d/aabb/aabb3_compute_clipping_volume_intersection.js]* | Producer named with bare noun 'intersection' among intersects predicates; also FIX JSDoc param order (plane_mask/planes swapped). |
596
+ | `plane3_intersect_plane` | `plane3_compute_intersection` | [3d/plane/plane3_intersect_plane.js](3d/plane/plane3_intersect_plane.js) <br>*[move → 3d/plane/plane3_compute_intersection.js]* | Bare verb 'intersect' banned; this is the canonical scalar producer. |
597
+ | `bt_query_edge_is_boundary` | `bt_edge_is_boundary` | [3d/topology/struct/binary/query/bt_query_edge_is_boundary.js](3d/topology/struct/binary/query/bt_query_edge_is_boundary.js) <br>*[move → 3d/topology/struct/binary/query/bt_edge_is_boundary.js]* | Lone bt_query_ prefix; sibling predicates (bt_edge_has_vertex, bt_face_is_degenerate) omit it. |
598
+
599
+ ### filename-export-mismatch-and-multi-export (10)
600
+
601
+ | old | → new | file | why |
602
+ |-----|-------|------|-----|
603
+ | `m3_make_rotation_TBN (file m3_make_rotation.js)` | `m3_make_rotation_TBN` | [mat3/m3_make_rotation.js](mat3/m3_make_rotation.js) <br>*[move → mat3/m3_make_rotation_TBN.js]* | Rename FILE to match export (one-file-one-export convention). |
604
+ | `aabb_build_frustum (file aabb3_build_frustum.js)` | `aabb3_build_frustum` | [3d/aabb/aabb3_build_frustum.js](3d/aabb/aabb3_build_frustum.js) <br>*[move → 3d/aabb/aabb3_build_frustum.js]* | Export missing the dimension digit; align with filename and aabb3_ family. |
605
+ | `aabb3_score_boxes_SAH_delta (not exported)` | `aabb3_score_boxes_sah_delta (ADD export)` | [3d/aabb/aabb3_score_boxes_SAH_delta.js](3d/aabb/aabb3_score_boxes_SAH_delta.js) <br>*[move → 3d/aabb/aabb3_score_boxes_sah_delta.js]* | Declared but never exported (dead public surface); export it and reconcile half-vs-full-area math. |
606
+ | `compute_legendre_polynomial (0-byte file)` | `(delete or implement as sh_legendre_polynomial)` | [3d/sphere/harmonics/compute_legendre_polynomial.js](3d/sphere/harmonics/compute_legendre_polynomial.js) <br>*[move → 3d/sphere/harmonics/sh_legendre_polynomial.js]* | Empty/dead file exporting nothing; third naming style. Delete or implement under sh_ band-generic prefix. |
607
+ | `validate (file aabb2_validate_packing.js, not exported)` | `aabb2_validate_packing (ADD export)` | [packing/max-rect/aabb2_validate_packing.js](packing/max-rect/aabb2_validate_packing.js) <br>*[move → packing/max-rect/aabb2_validate_packing.js]* | File promises a public aabb2_ validator; inner fn is unnamed-by-convention and unexported. |
608
+ | `encode_unit_to_hemioct (file encode_unit3_hemioct.js)` | `encode_unit_to_hemioct` | [3d/normal/hemioct/encode_unit3_hemioct.js](3d/normal/hemioct/encode_unit3_hemioct.js) <br>*[move → 3d/normal/hemioct/encode_unit_to_hemioct.js]* | Rename FILE to match export (one-file-one-export). |
609
+ | `encode_unit_to_azimuth / decode_azimuth_to_unit (folder lamber_azimuth, file transform.js)` | `encode_unit_to_azimuth / decode_azimuth_to_unit` | [3d/normal/lamber_azimuth/transform.js](3d/normal/lamber_azimuth/transform.js) <br>*[move → 3d/normal/lambert_azimuth/encode_unit_to_azimuth.js]* | Fix folder typo lamber->lambert; split the 2-export transform.js into per-export files. |
610
+ | `encode_unit_to_spheremap (file sphere_map_transform.js) + dead decode_spheremap_to_unit` | `encode_unit_to_spheremap / decode_spheremap_to_unit (ADD export, split files)` | [3d/normal/spherical/sphere_map_transform.js](3d/normal/spherical/sphere_map_transform.js) <br>*[move → 3d/normal/spherical/encode_unit_to_spheremap.js]* | File name mismatch; the decode companion is declared but NOT exported (asymmetric public surface) — export it. |
611
+ | `bt_mesh_face_poke (file bt_face_poke.js)` | `bt_face_poke` | [3d/topology/struct/binary/io/face/bt_face_poke.js](3d/topology/struct/binary/io/face/bt_face_poke.js) <br>*[move → 3d/topology/struct/binary/io/face/bt_face_poke.js]* | Wrong object token (single-face op, not bt_mesh_) AND export mismatches filename. |
612
+ | `bt_collect_boundary_segments / bt_point_distance_to_segments (in euclidean field file)` | `bt_collect_boundary_segments / segment3_point_distance_to_segments (split files)` | [3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js](3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js) <br>*[move → 3d/topology/struct/binary/query/bt_collect_boundary_segments.js]* | Multi-export file; the point-distance helper has no mesh handle and belongs in the segment/line geometry module, not bt_. |
613
+
614
+ ### correctness-bugs-surfaced-by-audit (8)
615
+
616
+ | old | → new | file | why |
617
+ |-----|-------|------|-----|
618
+ | `ray3_shift_origin_along_direction` | `ray3_shift_origin_along_direction_array` | [3d/ray/ray3_shift_origin_along_direction.js](3d/ray/ray3_shift_origin_along_direction.js) <br>*[move → 3d/ray/ray3_shift_origin_along_direction_array.js]* | FIX BUG: origin written at hardcoded offset 0 while direction at output_offset+3; honor output_offset throughout. Suffix _array for offset convention. |
619
+ | `Vector4.multiplyVector3` | `Vector4.multiply` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | Match Vector2/Vector3 multiply; also FIX missing 'return this' (breaks fluent contract). |
620
+ | `aabb3_transformed_compute_plane_side (plane_offset, box-first)` | `aabb3_transformed_compute_plane_side` | [3d/aabb/aabb3_transformed_compute_plane_side.js](3d/aabb/aabb3_transformed_compute_plane_side.js) <br>*[move → 3d/aabb/aabb3_transformed_compute_plane_side.js]* | FIX BUG (signed distance used as truthy bool) + rename plane_offset->plane_constant + make plane-first to match aabb3_compute_plane_side. |
621
+ | `circle_intersects_point` | `circle_contains_point` | [2d/circle/circle_intersects_point.js](2d/circle/circle_intersects_point.js) <br>*[move → 2d/circle/circle_contains_point.js]* | Containment, not intersection; ALSO FIX BUG v2_distance(cx,cx,...) ignoring cy. |
622
+ | `circle_compute_circle_penetration` | `circle_compute_penetration` | [2d/circle/circle_compute_circle_penetration.js](2d/circle/circle_compute_circle_penetration.js) <br>*[move → 2d/circle/circle_compute_penetration.js]* | Redundant circle repetition; ALSO FIX BUG dy = by - ax (should be by - ay). |
623
+ | `TransformedShape3D.isTransformedShape3D (on constructor)` | `TransformedShape3D.prototype.isTransformedShape3D` | [3d/shape/TransformedShape3D.js](3d/shape/TransformedShape3D.js) <br>*[move → 3d/shape/TransformedShape3D.js]* | Marker must be on the prototype like every sibling so instance-side dispatch works. |
624
+ | `triangle_encode_rasterized_depth + triangle_decode_depth (2 exports)` | `triangle_rasterized_depth_sample_index + tri_decode_rasterized_depth (split)` | [3d/tetrahedra/triangle/triangle_encode_rasterized_depth.js](3d/tetrahedra/triangle/triangle_encode_rasterized_depth.js) <br>*[move → 3d/tetrahedra/triangle/triangle_rasterized_depth_sample_index.js]* | 'encode' is misleading (returns a vertex index, not encoded depth); split the mismatched 2nd export (`triangle_decode_depth`) into its own file. (No correctness bug — the "dead return" claim was verified false.) |
625
+ | `compareEdges (not exported, v0 compared twice)` | `compare_edges (ADD export, FIX v1 bug)` | [3d/topology/compareEdges.js](3d/topology/compareEdges.js) <br>*[move → 3d/topology/compare_edges.js]* | Dead (unexported) AND buggy (compares a.v0,b.v0 twice, never v1); export and fix. |
626
+
627
+ ### param-name-vocabulary-drift (7)
628
+
629
+ | old | → new | file | why |
630
+ |-----|-------|------|-----|
631
+ | `vector_copy` | `vector_copy_offset` | [vec/vector_copy.js](vec/vector_copy.js) <br>*[move → vec/vector_copy_offset.js]* | Takes offsets but carried no _offset; align with vector_dot_offset family; rename param length->n. |
632
+ | `vector_dot_offset (params aOff/bOff)` | `vector_dot_offset` | [vec/vector_dot_offset.js](vec/vector_dot_offset.js) <br>*[move → vec/vector_dot_offset.js]* | Name OK; rename camelCase offsets aOff/bOff -> a_offset/b_offset (codebase is snake_case). |
633
+ | `vector_axpy_offset (params yOff/xOff)` | `vector_axpy_offset` | [vec/vector_axpy_offset.js](vec/vector_axpy_offset.js) <br>*[move → vec/vector_axpy_offset.js]* | Name OK; rename yOff/xOff -> y_offset/x_offset. |
634
+ | `m3_determinant (9 scalars)` | `m3_determinant` | [mat3/m3_determinant.js](mat3/m3_determinant.js) <br>*[move → mat3/m3_determinant.js]* | Name OK; change signature to take a 9-element array to match m2_determinant and the rest of mat3 (calling-convention consistency). |
635
+ | `aabb3_transform_oriented_inverse (out/world_aabb/pos_/rot_)` | `aabb3_transform_oriented_inverse` | [3d/aabb/aabb3_transform_oriented_inverse.js](3d/aabb/aabb3_transform_oriented_inverse.js) <br>*[move → 3d/aabb/aabb3_transform_oriented_inverse.js]* | Name OK; align with forward twin: same input form (scalars), result/result_offset names, qx..qw. |
636
+ | `convex_hull_monotone_2d` | `convex_hull_monotone_2d` | [2d/convex-hull/convex_hull_monotone_2d.js](2d/convex-hull/convex_hull_monotone_2d.js) <br>*[move → 2d/convex-hull/convex_hull_monotone_2d.js]* | Name OK; rename param input/points -> points uniformly across hull siblings. |
637
+ | `uv_map_square_to_circle (params x,y)` | `uv_map_square_to_circle` | [2d/uv_map_square_to_circle.js](2d/uv_map_square_to_circle.js) <br>*[move → 2d/uv_map_square_to_circle.js]* | Name OK; rename input params x,y -> u,v to match the inverse uv_map_circle_to_square. |
638
+
639
+ ### nearest-vs-closest-synonym (6)
640
+
641
+ | old | → new | file | why |
642
+ |-----|-------|------|-----|
643
+ | `line3_compute_segment_nearest_point_to_point_t` | `line3_compute_segment_closest_point_t` | [3d/line/line3_compute_segment_nearest_point_to_point_t.js](3d/line/line3_compute_segment_nearest_point_to_point_t.js) <br>*[move → 3d/line/line3_compute_segment_closest_point_t.js]* | nearest->closest; drop to_point stutter; keep _t (returns parameter). |
644
+ | `line3_compute_segment_nearest_point_to_aabb3_t` | `line3_compute_segment_closest_point_to_aabb3_t` | [3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js](3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js) <br>*[move → 3d/line/line3_compute_segment_closest_point_to_aabb3_t.js]* | nearest->closest for consistency. |
645
+ | `ray3_compute_nearest_point_to_point` | `ray3_compute_closest_point` | [3d/ray/ray3_compute_nearest_point_to_point.js](3d/ray/ray3_compute_nearest_point_to_point.js) <br>*[move → 3d/ray/ray3_compute_closest_point.js]* | nearest->closest; drop PointToPoint stutter; provide flat-array+offset sink (v3-object only as wrapper). |
646
+ | `AABB2.computeNearestPointToPoint` | `AABB2.computeClosestPoint` | [2d/aabb/AABB2.js](2d/aabb/AABB2.js) <br>*[move → 2d/aabb/AABB2.js]* | nearest->closest; drop PointToPoint stutter. |
647
+ | `aabb3_nearest_point_on_surface` | `aabb3_closest_point_on_surface` | [3d/aabb/aabb3_nearest_point_on_surface.js](3d/aabb/aabb3_nearest_point_on_surface.js) <br>*[move → 3d/aabb/aabb3_closest_point_on_surface.js]* | nearest->closest; add result_offset; rename r_x/r_y/r_z -> point_x/point_y/point_z. |
648
+ | `qt_query_data_nearest_to_point` | `qt_query_closest_to_point` | [2d/quad-tree/qt_query_data_nearest_to_point.js](2d/quad-tree/qt_query_data_nearest_to_point.js) <br>*[move → 2d/quad-tree/qt_query_closest_to_point.js]* | nearest->closest; drop redundant 'data'. |
649
+
650
+ ### out-param-and-return-shape-divergence (5)
651
+
652
+ | old | → new | file | why |
653
+ |-----|-------|------|-----|
654
+ | `Vector4.readFromArray / writeToArray / setFromArray` | `Vector4.fromArray / toArray` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | Standardize on fromArray/toArray like Vector2/Vector3; remove setFromArray duplicate and the define-then-clobber toArray trap. |
655
+ | `m4_multiply_alphatensor` | `m4_multiply_alphatensor (@deprecated)` | [3d/mat4/m4_multiply_alphatensor.js](3d/mat4/m4_multiply_alphatensor.js) <br>*[move → 3d/mat4/m4_multiply_alphatensor.js]* | Strictly slower duplicate of m4_multiply; mark experimental/deprecated and fix JSDoc params (a_in/b_in). |
656
+ | `box3_raycast vs aabb3_raycast` | `aabb3_raycast_hit_point` | [3d/aabb/aabb3_raycast.js](3d/aabb/aabb3_raycast.js) <br>*[move → 3d/aabb/aabb3_raycast_hit_point.js]* | Disambiguate the legacy bool+position+quantized-normal variant from the canonical distance+exact-normal box3_raycast; encode the contract in the name. |
657
+ | `sphere_raycast` | `sphere_raycast` | [3d/sphere/sphere_raycast.js](3d/sphere/sphere_raycast.js) <br>*[move → 3d/sphere/sphere_raycast.js]* | Keep 'raycast' as the documented distance+normal producer family (box3_raycast/capsule_raycast share it); no rename, listed to lock the family — but document it is the producer counterpart of sphere_intersects_ray. |
658
+ | `ConvexHullShape3D.recompute` | `ConvexHullShape3D.recompute_cached` | [3d/shape/ConvexHullShape3D.js](3d/shape/ConvexHullShape3D.js) <br>*[move → 3d/shape/ConvexHullShape3D.js]* | Match MeshShape3D.recompute_cached for the same derived-state refresh role. |
659
+
660
+ ### sqr-placement-and-companion-coverage (4)
661
+
662
+ | old | → new | file | why |
663
+ |-----|-------|------|-----|
664
+ | `Vector3.lengthSq` | `Vector3.lengthSqr` | [Vector3.js](Vector3.js) <br>*[move → Vector3.js]* | Trailing-_sqr spelling; drop the lengthSq alias. |
665
+ | `Vector3.distanceToSquared` | `Vector3.distanceSqrTo` | [Vector3.js](Vector3.js) <br>*[move → Vector3.js]* | Standardize on _sqr token (distanceSqrTo); drop distanceToSquared alias. |
666
+ | `aabb3_signed_distance_sqr_to_point` | `aabb3_signed_distance_sqr_to_point` | [3d/aabb/aabb3_signed_distance_sqr_to_point.js](3d/aabb/aabb3_signed_distance_sqr_to_point.js) <br>*[move → 3d/aabb/aabb3_signed_distance_sqr_to_point.js]* | Conforms (trailing _sqr); listed as exemplar — add missing aabb3_signed_distance_to_point companion. |
667
+ | `convex_hull_jarvis_2d` | `convex_hull_jarvis_2d` | [2d/convex-hull/convex_hull_jarvis_2d.js](2d/convex-hull/convex_hull_jarvis_2d.js) <br>*[move → 2d/convex-hull/convex_hull_jarvis_2d.js]* | Name OK; rename private dist2_array -> dist_sqr_indexed (2 means squared, banned). |
668
+
669
+ ### vendor-token-three-vs-threejs-vs-geometry (4)
670
+
671
+ | old | → new | file | why |
672
+ |-----|-------|------|-----|
673
+ | `Vector4.threeApplyMatrix4` | `(remove / @deprecated)` | [Vector4.js](Vector4.js) <br>*[move → Vector4.js]* | Vendor-coupled (three.js Matrix4); applyMatrix4 already takes a flat array. Confine vendor types to boundaries. |
674
+ | `aabb3_from_threejs_geometry` | `aabb3_from_three_geometry` | [3d/aabb/aabb3_from_threejs_geometry.js](3d/aabb/aabb3_from_threejs_geometry.js) <br>*[move → 3d/aabb/aabb3_from_three_geometry.js]* | Single vendor token 'three'. |
675
+ | `computeTriangleRayIntersectionBarycentricGeometry` | `tri3_ray_intersection_indexed` | [3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js](3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js) <br>*[move → 3d/triangle/tri3_ray_intersection_indexed.js]* | camelCase->snake; 'Geometry' vendor token -> 'indexed' (it takes indices+positions). |
676
+ | `plane3_three_compute_convex_3_plane_intersection` | `plane3_compute_3_plane_intersection_from_three` | [3d/plane/plane3_three_compute_convex_3_plane_intersection.js](3d/plane/plane3_three_compute_convex_3_plane_intersection.js) <br>*[move → 3d/plane/plane3_compute_3_plane_intersection_from_three.js]* | Move vendor token to a clear adapter suffix so 'three' doesn't collide with the count 3; drop 'convex'. |
677
+
678
+ ### casing-of-constants-and-acronyms (2)
679
+
680
+ | old | → new | file | why |
681
+ |-----|-------|------|-----|
682
+ | `aabb3_score_boxes_SAH` | `aabb3_score_boxes_sah` | [3d/aabb/aabb3_score_boxes_SAH.js](3d/aabb/aabb3_score_boxes_SAH.js) <br>*[move → 3d/aabb/aabb3_score_boxes_sah.js]* | Lowercase the embedded acronym to match snake convention; switch to inline export function. |
683
+ | `aabb3_corner_edge_mapping / aabb3_edge_corner_mapping / aabb3_edge_plane_mapping` | `AABB3_CORNER_EDGE_MAPPING (etc.)` | [3d/aabb/aabb3_corner_edge_mapping.js](3d/aabb/aabb3_corner_edge_mapping.js) <br>*[move → 3d/aabb/AABB3_CORNER_EDGE_MAPPING.js]* | Constant lookup tables -> constUpper, matching M4_IDENTITY. |
684
+