@woosh/meep-engine 3.1.0 → 3.2.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 (1822) 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/core/binary/BitImage2.js +246 -246
  134. package/src/core/binary/align_32.js +21 -21
  135. package/src/core/binary/data_view/DataType2DataViewReaders.js +23 -23
  136. package/src/core/binary/data_view/DataType2DataViewWriters.js +25 -25
  137. package/src/core/binary/hash/XXH128Hash.js +55 -55
  138. package/src/core/binary/hash/XXH3_SECRET.js +25 -25
  139. package/src/core/binary/hash/xxh3_128.js +341 -341
  140. package/src/core/binary/hash/xxh3_64.js +241 -241
  141. package/src/core/binary/hash/xxh3_common.js +476 -476
  142. package/src/core/binary/lz4/LZ4_MAX_INPUT_SIZE.js +9 -9
  143. package/src/core/binary/lz4/lz4_compress_block.js +385 -385
  144. package/src/core/binary/lz4/lz4_compress_bound.js +25 -25
  145. package/src/core/binary/lz4/lz4_decompress_block.js +139 -139
  146. package/src/core/binary/lz4/lz4_decompress_bound.js +30 -30
  147. package/src/core/binary/meshopt/MESHOPT_GROUP_SIZE.js +18 -18
  148. package/src/core/binary/meshopt/MeshoptCompressionFilter.js +30 -30
  149. package/src/core/binary/meshopt/MeshoptCompressionMode.js +21 -21
  150. package/src/core/binary/meshopt/__meshopt_test_streams.js +237 -237
  151. package/src/core/binary/meshopt/meshopt_decode.js +73 -73
  152. package/src/core/binary/meshopt/meshopt_decode_byte_group.js +67 -67
  153. package/src/core/binary/meshopt/meshopt_decode_data_block.js +59 -59
  154. package/src/core/binary/meshopt/meshopt_decode_filter_color.js +69 -69
  155. package/src/core/binary/meshopt/meshopt_decode_filter_exponential.js +43 -43
  156. package/src/core/binary/meshopt/meshopt_decode_filter_octahedral.js +60 -60
  157. package/src/core/binary/meshopt/meshopt_decode_filter_quaternion.js +71 -71
  158. package/src/core/binary/meshopt/meshopt_decode_index_buffer.js +294 -294
  159. package/src/core/binary/meshopt/meshopt_decode_index_sequence.js +115 -115
  160. package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.js +381 -381
  161. package/src/core/binary/meshopt/meshopt_read_uint_var.js +59 -59
  162. package/src/core/binary/reinterpret_float32_as_uint32.js +13 -13
  163. package/src/core/binary/reinterpret_uint32_as_float32.js +14 -14
  164. package/src/core/binary/type/DataType2TypedArrayConstructorMapping.js +35 -35
  165. package/src/core/bvh2/bvh3/ebvh_geometry_query_any_triangle_ray.js +149 -149
  166. package/src/core/bvh2/bvh3/ebvh_sort_for_traversal_depth_first.js +96 -96
  167. package/src/core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.js +101 -101
  168. package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +77 -77
  169. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +90 -90
  170. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray_segment.js +94 -94
  171. package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +86 -86
  172. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_capsule.js +101 -101
  173. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_sphere.js +92 -92
  174. package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray.js +96 -96
  175. package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray_segment.js +100 -100
  176. package/src/core/bvh2/visual/BVHGeometry.js +131 -131
  177. package/src/core/bvh8/BVH8.js +436 -436
  178. package/src/core/bvh8/aabb3_round_to_float32.js +22 -22
  179. package/src/core/bvh8/build/BVH8Converter.js +588 -588
  180. package/src/core/bvh8/build/TriangleCluster.js +122 -122
  181. package/src/core/bvh8/build/aabb3_compute_merge_cost.js +28 -28
  182. package/src/core/bvh8/build/aabb3_from_triangle_by_index.js +17 -17
  183. package/src/core/bvh8/build/bvh8_build_for_geometry.js +303 -303
  184. package/src/core/bvh8/build/bvh8_from_proxy.js +256 -256
  185. package/src/core/bvh8/build/byte.js +9 -9
  186. package/src/core/bvh8/build/encode_bounds_e.js +11 -11
  187. package/src/core/bvh8/bvh8_convert_to_dot.js +132 -132
  188. package/src/core/bvh8/bvh8_count_primitives.js +98 -98
  189. package/src/core/bvh8/bvh8_geometry_validate.js +138 -138
  190. package/src/core/bvh8/bvh8_geometry_validate_indirect.js +166 -166
  191. package/src/core/bvh8/bvh8_get_node_bounds.js +34 -34
  192. package/src/core/bvh8/bvh8_get_node_child_bounds.js +52 -52
  193. package/src/core/bvh8/bvh8_node_child_surface_area.js +18 -18
  194. package/src/core/bvh8/bvh8_node_count_triangles.js +27 -27
  195. package/src/core/bvh8/bvh8_quality.js +72 -72
  196. package/src/core/bvh8/bvh8_validate_structure.js +87 -87
  197. package/src/core/clipboard/obtainClipBoard.js +29 -29
  198. package/src/core/clipboard/safeClipboardReadText.js +55 -55
  199. package/src/core/clipboard/safeClipboardWriteText.js +23 -23
  200. package/src/core/collection/array/typed/typed_array_value_denormalize.js +52 -52
  201. package/src/core/collection/array/typed/typed_array_value_normalize.js +51 -51
  202. package/src/core/collection/union-find/union_find.js +79 -79
  203. package/src/core/color/YCoCg/rgb_to_ycocg.js +20 -20
  204. package/src/core/color/YCoCg/ycocg_to_rgb.js +17 -17
  205. package/src/core/color/colormap/MAGMA_LUT.js +26 -26
  206. package/src/core/color/illuminant/D65_TRISTIMULUS_XYZ.js +19 -19
  207. package/src/core/color/lab/lab_apply_hunt_adjustment.js +27 -27
  208. package/src/core/color/lab/lab_distance_hyab.js +23 -23
  209. package/src/core/color/lab/xyz_to_lab.js +62 -62
  210. package/src/core/color/operations/color_darken.js +24 -24
  211. package/src/core/color/operations/color_desaturate.js +24 -24
  212. package/src/core/color/operations/color_lighten.js +24 -24
  213. package/src/core/color/operations/color_saturate.js +24 -24
  214. package/src/core/color/operations/color_scale_okhsv_channel.js +45 -45
  215. package/src/core/color/tonemap/tonemap_aces.js +41 -41
  216. package/src/core/color/ycxcz/xyz_to_ycxcz.js +28 -28
  217. package/src/core/color/ycxcz/ycxcz_to_xyz.js +19 -19
  218. package/src/core/dom/isImageBitmap.js +12 -12
  219. package/src/core/function/frameThrottle.js +23 -23
  220. package/src/core/geom/2d/aabb/aabb2_array_combine.js +7 -7
  221. package/src/core/geom/2d/aabb/aabb2_compute_area.js +7 -7
  222. package/src/core/geom/2d/aabb/aabb2_compute_center_from_multiple.js +7 -7
  223. package/src/core/geom/2d/aabb/aabb2_compute_overlap.js +7 -7
  224. package/src/core/geom/2d/aabb/aabb2_from_v2_array.js +7 -7
  225. package/src/core/geom/2d/aabb/aabb2_intersects_point.js +7 -7
  226. package/src/core/geom/2d/aabb/aabb2_overlap_exists.js +7 -7
  227. package/src/core/geom/2d/circle/circle_compute_circle_intersection.js +7 -7
  228. package/src/core/geom/2d/circle/circle_compute_circle_penetration.js +7 -7
  229. package/src/core/geom/2d/circle/circle_intersects_point.js +7 -7
  230. package/src/core/geom/2d/compute_polygon_area_2d.js +7 -7
  231. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +7 -7
  232. package/src/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +7 -7
  233. package/src/core/geom/2d/convex-hull/orientation3_array.js +7 -7
  234. package/src/core/geom/2d/intersect_ray_2d.js +7 -7
  235. package/src/core/geom/2d/line/line2_distance_to_point_sqr.js +7 -7
  236. package/src/core/geom/2d/line/line2_segment_intersection_fraction_2d.js +44 -44
  237. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_2d.js +7 -7
  238. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_array_2d.js +7 -7
  239. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_2d.js +7 -7
  240. package/src/core/geom/2d/line/line_segment_compute_line_segment_intersection_vectors_array_2d.js +7 -7
  241. package/src/core/geom/2d/line/line_segment_intersection_fraction_2d.js +7 -7
  242. package/src/core/geom/2d/line/line_segment_line_segment_intersection_exists_2d.js +7 -7
  243. package/src/core/geom/2d/line/segment2_intersects_segment2_2d.js +25 -25
  244. package/src/core/geom/2d/line/segment2_segment_compute_intersection_array_2d.js +46 -46
  245. package/src/core/geom/2d/line/segment2_segment_intersection_fractions.js +52 -52
  246. package/src/core/geom/2d/oriented-box/min_area_rect_2d.js +69 -69
  247. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +433 -433
  248. package/src/core/geom/2d/polygon/polygon2_clip_axis_halfplane.js +51 -51
  249. package/src/core/geom/2d/polygon/polygon2_clip_halfplane.js +50 -50
  250. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.js +84 -84
  251. package/src/core/geom/2d/polygon/polygon2_signed_area.js +52 -52
  252. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +86 -86
  253. package/src/core/geom/2d/polygon/polygon2_triangulate.js +1280 -1280
  254. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.js +77 -77
  255. package/src/core/geom/2d/quad-tree/qt_collect_by_circle.js +39 -39
  256. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.js +101 -101
  257. package/src/core/geom/2d/quad-tree/qt_query_data_nearest_to_point.js +7 -7
  258. package/src/core/geom/2d/rectangle_to_aabb.js +7 -7
  259. package/src/core/geom/2d/spline_bezier2_2d.js +7 -7
  260. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +99 -99
  261. package/src/core/geom/2d/triangle/tri2_signed_area.js +35 -35
  262. package/src/core/geom/2d/triangle2d_compute_area.js +7 -7
  263. package/src/core/geom/2d/triangle2d_contains_point.js +7 -7
  264. package/src/core/geom/2d/triangle2d_get_barycentric.js +7 -7
  265. package/src/core/geom/2d/v2_morton_encode.js +23 -23
  266. package/src/core/geom/3d/aabb/aabb3_array_intersects_frustum_degree.js +7 -7
  267. package/src/core/geom/3d/aabb/aabb3_box_surface_area_2.js +7 -7
  268. package/src/core/geom/3d/aabb/aabb3_build_frustum.js +5 -5
  269. package/src/core/geom/3d/aabb/aabb3_closest_point_on_surface.js +57 -57
  270. package/src/core/geom/3d/aabb/aabb3_combined_surface_area.js +7 -7
  271. package/src/core/geom/3d/aabb/aabb3_compute_half_surface_area.js +7 -7
  272. package/src/core/geom/3d/aabb/aabb3_compute_projected_area.js +7 -7
  273. package/src/core/geom/3d/aabb/aabb3_compute_surface_area.js +7 -7
  274. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +7 -7
  275. package/src/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +7 -7
  276. package/src/core/geom/3d/aabb/aabb3_from_threejs_geometry.js +7 -7
  277. package/src/core/geom/3d/aabb/aabb3_from_triangle_group.js +46 -46
  278. package/src/core/geom/3d/aabb/aabb3_intersects_frustum_degree.js +7 -7
  279. package/src/core/geom/3d/aabb/aabb3_intersects_line_segment.js +7 -7
  280. package/src/core/geom/3d/aabb/aabb3_near_distance_to_intersection_ray_segment.js +7 -7
  281. package/src/core/geom/3d/aabb/aabb3_nearest_point_on_surface.js +7 -7
  282. package/src/core/geom/3d/aabb/aabb3_ray_segment_entry_distance.js +95 -95
  283. package/src/core/geom/3d/aabb/aabb3_raycast.js +7 -7
  284. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +93 -93
  285. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.js +82 -82
  286. package/src/core/geom/3d/aabb/compute_aabb_from_points.js +7 -7
  287. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +7 -7
  288. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +486 -486
  289. package/src/core/geom/3d/atlas/BFF_PLAN.md +174 -174
  290. package/src/core/geom/3d/atlas/Chart.js +77 -77
  291. package/src/core/geom/3d/atlas/REVIEW_02.md +392 -392
  292. package/src/core/geom/3d/atlas/atlas_bench_lib.js +315 -315
  293. package/src/core/geom/3d/atlas/atlas_chart_type.js +16 -16
  294. package/src/core/geom/3d/atlas/atlas_compute_charts.js +188 -188
  295. package/src/core/geom/3d/atlas/atlas_extract_chart.js +107 -107
  296. package/src/core/geom/3d/atlas/atlas_generate.js +50 -50
  297. package/src/core/geom/3d/atlas/atlas_test_fixtures.js +266 -266
  298. package/src/core/geom/3d/atlas/atlas_write_chart_uvs.js +36 -36
  299. package/src/core/geom/3d/atlas/data/atlas_build_edge_dihedrals.js +62 -62
  300. package/src/core/geom/3d/atlas/data/atlas_build_edge_lengths.js +33 -33
  301. package/src/core/geom/3d/atlas/data/atlas_build_face_areas.js +50 -50
  302. package/src/core/geom/3d/atlas/io/atlas_mesh_weld_colocals.js +39 -39
  303. package/src/core/geom/3d/atlas/io/bt_loop_uv.js +35 -35
  304. package/src/core/geom/3d/atlas/pack/ChartPlacement.js +46 -46
  305. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +269 -269
  306. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +209 -209
  307. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_ortho.js +38 -38
  308. package/src/core/geom/3d/atlas/param/atlas_chart_stretch_metric.js +86 -86
  309. package/src/core/geom/3d/atlas/param/atlas_piecewise_resegment.js +183 -183
  310. package/src/core/geom/3d/atlas/param/fit_plane_basis.js +66 -66
  311. package/src/core/geom/3d/atlas/segment/RegionGraph.js +40 -40
  312. package/src/core/geom/3d/atlas/segment/atlas_build_region_graph.js +136 -136
  313. package/src/core/geom/3d/atlas/segment/atlas_chart_roundness_delta.js +30 -30
  314. package/src/core/geom/3d/atlas/segment/atlas_compute_planar_regions.js +77 -77
  315. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +116 -116
  316. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.js +271 -271
  317. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.js +191 -191
  318. package/src/core/geom/3d/box/box3_projected_half_extent.js +35 -35
  319. package/src/core/geom/3d/capsule/capsule_intersects_aabb3_closed.js +67 -67
  320. package/src/core/geom/3d/capsule/capsule_intersects_aabb3_iterative.js +137 -137
  321. package/src/core/geom/3d/compute_circle_bounding_box.js +7 -7
  322. package/src/core/geom/3d/cone/computeConeBoundingBox.js +7 -7
  323. package/src/core/geom/3d/cone/computeConePlaneSide.js +7 -7
  324. package/src/core/geom/3d/cone/compute_bounding_cone_of_2_cones.js +7 -7
  325. package/src/core/geom/3d/cylinder/cylinder3_raycast.d.ts +38 -0
  326. package/src/core/geom/3d/cylinder/cylinder3_raycast.d.ts.map +1 -0
  327. package/src/core/geom/3d/cylinder/cylinder3_raycast.js +105 -0
  328. package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.js +18 -18
  329. package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.js +24 -24
  330. package/src/core/geom/3d/frustum/clipping_volume_matrix4_project.js +7 -7
  331. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +7 -7
  332. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +117 -117
  333. package/src/core/geom/3d/frustum/frustum_matrix4_project.js +7 -7
  334. package/src/core/geom/3d/frustum/hexahedron_from_aabb.js +7 -7
  335. package/src/core/geom/3d/frustum/read_frustum_corner.js +17 -17
  336. package/src/core/geom/3d/frustum/read_three_planes_to_array.js +7 -7
  337. package/src/core/geom/3d/frustum/slice_frustum_linear_to_points.js +7 -7
  338. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +146 -146
  339. package/src/core/geom/3d/gjk/gjk.js +430 -430
  340. package/src/core/geom/3d/gjk/gjk_epa_penetration.js +520 -520
  341. package/src/core/geom/3d/gjk/minkowski_support.js +71 -71
  342. package/src/core/geom/3d/gjk/mpr.js +368 -368
  343. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +7 -7
  344. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +7 -7
  345. package/src/core/geom/3d/line/line3_compute_point_segment_point_distance_unfolded.js +64 -64
  346. package/src/core/geom/3d/line/line3_compute_segment_closest_point_to_aabb3_t.js +153 -153
  347. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_aabb3_t.js +7 -7
  348. package/src/core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js +7 -7
  349. package/src/core/geom/3d/line/line3_compute_segment_segment_closest_points.js +88 -88
  350. package/src/core/geom/3d/line/line3_segment_segment_closest_point_pair.js +71 -71
  351. package/src/core/geom/3d/line/segment3_point_distance_to_segments.js +25 -25
  352. package/src/core/geom/3d/mat4/allocate_m4.js +7 -7
  353. package/src/core/geom/3d/mat4/apply_mat4_transform_to_direction_v3_array.js +7 -7
  354. package/src/core/geom/3d/mat4/apply_mat4_transform_to_v3_array.js +7 -7
  355. package/src/core/geom/3d/mat4/compose_matrix4_array.js +7 -7
  356. package/src/core/geom/3d/mat4/decompose_matrix_4_array.js +7 -7
  357. package/src/core/geom/3d/mat4/eulerAnglesFromMatrix.js +7 -7
  358. package/src/core/geom/3d/mat4/m4_compose.js +22 -22
  359. package/src/core/geom/3d/mat4/m4_compute_normal_matrix3.js +7 -7
  360. package/src/core/geom/3d/mat4/m4_decompose.js +64 -64
  361. package/src/core/geom/3d/mat4/m4_decompose_array.js +157 -157
  362. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.js +32 -32
  363. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.js +67 -67
  364. package/src/core/geom/3d/mat4/m4_linear_matrix3.js +29 -29
  365. package/src/core/geom/3d/mat4/m4_look_at.js +96 -96
  366. package/src/core/geom/3d/mat4/m4_make_rotation_x.js +47 -47
  367. package/src/core/geom/3d/mat4/m4_make_rotation_y.js +47 -47
  368. package/src/core/geom/3d/mat4/m4_make_rotation_z.js +47 -47
  369. package/src/core/geom/3d/mat4/m4_normal_matrix3.js +39 -39
  370. package/src/core/geom/3d/mat4/m4_perspective.js +66 -66
  371. package/src/core/geom/3d/mat4/m4_transpose.js +48 -48
  372. package/src/core/geom/3d/morton/mortonEncode_LUT.js +7 -7
  373. package/src/core/geom/3d/morton/mortonEncode_magicbits.js +7 -7
  374. package/src/core/geom/3d/normal/hemioct/encode_unit3_hemioct.js +5 -5
  375. package/src/core/geom/3d/normal/hemioct/encode_unit_to_hemioct.js +28 -28
  376. package/src/core/geom/3d/normal/lambert_azimuth/decode_azimuth_to_unit.js +30 -30
  377. package/src/core/geom/3d/normal/lambert_azimuth/encode_unit_to_azimuth.js +19 -19
  378. package/src/core/geom/3d/normal/spherical/decode_spheremap_to_unit.js +38 -38
  379. package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.js +30 -30
  380. package/src/core/geom/3d/plane/is_point_within_planes.js +7 -7
  381. package/src/core/geom/3d/plane/orient3d_fast_point.js +47 -47
  382. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +7 -7
  383. package/src/core/geom/3d/plane/plane3_compute_plane_intersection.js +7 -7
  384. package/src/core/geom/3d/plane/plane3_intersect_plane.js +7 -7
  385. package/src/core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js +7 -7
  386. package/src/core/geom/3d/point/point3_raycast.d.ts +33 -0
  387. package/src/core/geom/3d/point/point3_raycast.d.ts.map +1 -0
  388. package/src/core/geom/3d/point/point3_raycast.js +47 -0
  389. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +60 -60
  390. package/src/core/geom/3d/polygon/polygon3_triangulate.js +94 -94
  391. package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.d.ts +40 -0
  392. package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.d.ts.map +1 -0
  393. package/src/core/geom/3d/polyhedron/convex_polyhedron3_raycast.js +94 -0
  394. package/src/core/geom/3d/quadric/QUADRIC3_SIZE.js +14 -14
  395. package/src/core/geom/3d/quadric/Quadric3.js +282 -282
  396. package/src/core/geom/3d/quadric/quadric3_add.js +33 -33
  397. package/src/core/geom/3d/quadric/quadric3_clear.js +25 -25
  398. package/src/core/geom/3d/quadric/quadric3_copy.js +27 -27
  399. package/src/core/geom/3d/quadric/quadric3_distance.js +36 -36
  400. package/src/core/geom/3d/quadric/quadric3_evaluate.js +25 -25
  401. package/src/core/geom/3d/quadric/quadric3_optimize.js +45 -45
  402. package/src/core/geom/3d/quadric/quadric3_scale.js +32 -32
  403. package/src/core/geom/3d/quadric/quadric3_set_from_plane_through_point.js +30 -30
  404. package/src/core/geom/3d/quadric/quadric3_set_from_vector4.js +35 -35
  405. package/src/core/geom/3d/quadric/quadric3_sub.js +36 -36
  406. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3.js +28 -28
  407. package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.js +56 -56
  408. package/src/core/geom/3d/quadric/quadric3_to_vector3.js +19 -19
  409. package/src/core/geom/3d/quaternion/quat3_createFromAxisAngle.js +7 -7
  410. package/src/core/geom/3d/quaternion/quat3_integrate.js +62 -62
  411. package/src/core/geom/3d/quaternion/quat3_multiply.js +31 -31
  412. package/src/core/geom/3d/quaternion/quat3_nlerp.js +72 -72
  413. package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +69 -69
  414. package/src/core/geom/3d/quaternion/quat_decode_from_uint32.js +7 -7
  415. package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +7 -7
  416. package/src/core/geom/3d/ray/ray3_array_compose.js +7 -7
  417. package/src/core/geom/3d/ray/ray3_compute_nearest_point_to_point.js +7 -7
  418. package/src/core/geom/3d/ray/ray3_distance_to_point.js +7 -7
  419. package/src/core/geom/3d/ray/ray3_shift_origin_along_direction.js +7 -7
  420. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts +17 -0
  421. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  422. package/src/core/geom/3d/shape/ConvexHullShape3D.js +43 -0
  423. package/src/core/geom/3d/shape/CylinderShape3D.d.ts +1 -0
  424. package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
  425. package/src/core/geom/3d/shape/CylinderShape3D.js +21 -0
  426. package/src/core/geom/3d/shape/PointShape3D.d.ts +7 -0
  427. package/src/core/geom/3d/shape/PointShape3D.d.ts.map +1 -1
  428. package/src/core/geom/3d/shape/PointShape3D.js +88 -63
  429. package/src/core/geom/3d/shape/PosedShape3D.d.ts +6 -0
  430. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  431. package/src/core/geom/3d/shape/PosedShape3D.js +27 -0
  432. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +10 -0
  433. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  434. package/src/core/geom/3d/shape/TransformedShape3D.js +13 -0
  435. package/src/core/geom/3d/shape/Triangle3D.d.ts +1 -0
  436. package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -1
  437. package/src/core/geom/3d/shape/Triangle3D.js +26 -0
  438. package/src/core/geom/3d/shape/UnionShape3D.d.ts +6 -0
  439. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  440. package/src/core/geom/3d/shape/UnionShape3D.js +7 -0
  441. package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -45
  442. package/src/core/geom/3d/shape/UnitSphereShape3D.js +44 -44
  443. package/src/core/geom/3d/shape/shape3_mesh_from_geometry.js +64 -64
  444. package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +7 -7
  445. package/src/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +51 -51
  446. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +7 -7
  447. package/src/core/geom/3d/sphere/compute_bounding_sphere_of_2_spheres.js +7 -7
  448. package/src/core/geom/3d/sphere/harmonics/sh3_convolve_with_zh.js +53 -53
  449. package/src/core/geom/3d/sphere/harmonics/sh3_ggx_zh.js +30 -30
  450. package/src/core/geom/3d/sphere/harmonics/sh3_rotate_bl.js +7 -7
  451. package/src/core/geom/3d/sphere/harmonics/sh_compute_K.js +7 -7
  452. package/src/core/geom/3d/sphere/sphere_array_intersects_point.js +7 -7
  453. package/src/core/geom/3d/sphere/sphere_array_intersects_ray.js +7 -7
  454. package/src/core/geom/3d/sphere/sphere_intersects_point.js +7 -7
  455. package/src/core/geom/3d/sphere/sphere_matrix4_transform.js +5 -5
  456. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +7 -7
  457. package/src/core/geom/3d/sphere/sphere_radius_sqr_from_v3_array_transformed.js +7 -7
  458. package/src/core/geom/3d/sphere/spherical_from_cartesian.js +7 -7
  459. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +174 -174
  460. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +7 -7
  461. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_volume.js +7 -7
  462. package/src/core/geom/3d/tetrahedra/delaunay/fill_in_a_cavity.js +7 -7
  463. package/src/core/geom/3d/tetrahedra/graphics/build_tetrahedral_mesh_geometry.js +39 -39
  464. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.js +48 -48
  465. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +173 -173
  466. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_compute_tet_quality.js +22 -22
  467. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -146
  468. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -232
  469. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -255
  470. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +387 -387
  471. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +140 -140
  472. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_tet_get_neighbours.js +7 -7
  473. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +97 -97
  474. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -66
  475. package/src/core/geom/3d/tetrahedra/triangle/triangle_decode_depth.js +59 -59
  476. package/src/core/geom/3d/tetrahedra/triangle/triangle_rasterized_depth_sample_index.js +54 -54
  477. package/src/core/geom/3d/tetrahedra/validate_neighbour.js +70 -70
  478. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +314 -314
  479. package/src/core/geom/3d/topology/struct/binary/BinaryDataLayer.js +364 -364
  480. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +567 -567
  481. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +1085 -1085
  482. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +73 -73
  483. package/src/core/geom/3d/topology/struct/binary/io/bt_loop_kill.js +35 -35
  484. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_append.js +119 -119
  485. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +84 -84
  486. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +172 -172
  487. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_face_normals.js +56 -56
  488. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadratics.js +7 -7
  489. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +227 -227
  490. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +161 -161
  491. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_island_erode.js +490 -490
  492. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +120 -120
  493. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js +120 -120
  494. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_collapse.js +52 -52
  495. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +115 -115
  496. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_flip.js +142 -142
  497. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -21
  498. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +92 -92
  499. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_split.js +179 -179
  500. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_swap_vertex_slots.js +28 -28
  501. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_kill_only_edge.js +8 -8
  502. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js +83 -83
  503. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +89 -89
  504. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_kill.js +25 -25
  505. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +127 -127
  506. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.js +268 -268
  507. package/src/core/geom/3d/topology/struct/binary/io/face/bt_kill_only_face.js +8 -8
  508. package/src/core/geom/3d/topology/struct/binary/io/face/bt_mesh_kill_degenerate_faces.js +72 -72
  509. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_kill_only_vert.js +7 -7
  510. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_merge_verts_by_distance.js +7 -7
  511. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js +48 -48
  512. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.js +256 -256
  513. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_vertex_merge_distance.js +77 -77
  514. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_fuse_duplicate_edges.js +7 -7
  515. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vert_kill.js +7 -7
  516. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +148 -148
  517. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_kill_only.js +7 -7
  518. package/src/core/geom/3d/topology/struct/binary/query/bt_collect_boundary_segments.js +29 -29
  519. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_breaks_link_condition.js +107 -107
  520. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_flip_is_legal.js +41 -41
  521. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_flip_would_fold.js +120 -120
  522. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -42
  523. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_is_boundary.js +20 -20
  524. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_read_diamond.js +96 -96
  525. package/src/core/geom/3d/topology/struct/binary/query/bt_face_compute_newell_normal.js +72 -72
  526. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_attached_faces.js +7 -7
  527. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces.js +39 -39
  528. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.js +93 -93
  529. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_neighbour_faces.js +7 -7
  530. package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_shared_loop.js +48 -48
  531. package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.js +45 -45
  532. package/src/core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js +66 -66
  533. package/src/core/geom/3d/topology/struct/binary/query/bt_faces_shared_loop.js +7 -7
  534. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.js +44 -44
  535. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_euclidean_distance_field.js +32 -32
  536. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_compute_face_islands.js +53 -53
  537. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +703 -703
  538. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +181 -181
  539. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_segment_penetrates_surface.js +133 -133
  540. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +82 -82
  541. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js +599 -599
  542. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -108
  543. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +7 -7
  544. package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +7 -7
  545. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +7 -7
  546. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentric.js +7 -7
  547. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +7 -7
  548. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js +7 -7
  549. package/src/core/geom/3d/triangle/compute_triangle_area_3d.js +7 -7
  550. package/src/core/geom/3d/triangle/compute_triangle_normal.js +7 -7
  551. package/src/core/geom/3d/triangle/rayTriangleIntersection.js +7 -7
  552. package/src/core/geom/3d/triangle/tri3_closest_point.js +65 -65
  553. package/src/core/geom/3d/triangle/tri3_closest_point_barycentric.js +171 -171
  554. package/src/core/geom/3d/triangle/tri3_flatten_isometric.js +79 -79
  555. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +160 -160
  556. package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.js +96 -96
  557. package/src/core/geom/3d/triangle/tri3_raycast.d.ts +42 -0
  558. package/src/core/geom/3d/triangle/tri3_raycast.d.ts.map +1 -0
  559. package/src/core/geom/3d/triangle/tri3_raycast.js +94 -0
  560. package/src/core/geom/3d/triangle/triangle3_incenter.js +7 -7
  561. package/src/core/geom/3d/triangle/triangle_compute_plane_side.js +7 -7
  562. package/src/core/geom/3d/triangle/triangle_compute_signed_volume.js +7 -7
  563. package/src/core/geom/3d/triangle/triangle_intersects_clipping_volume.js +7 -7
  564. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +7 -7
  565. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +7 -7
  566. package/src/core/geom/3d/util/make_justified_point_grid.js +7 -7
  567. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +381 -381
  568. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +684 -684
  569. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +554 -554
  570. package/src/core/geom/mat3/m3_cm_from_translation.js +7 -7
  571. package/src/core/geom/mat3/m3_cm_invert.js +7 -7
  572. package/src/core/geom/mat3/m3_make_rotation.js +5 -5
  573. package/src/core/geom/mat3/m3_make_rotation_TBN.js +31 -31
  574. package/src/core/geom/mat3/m3_multiply_vec3.js +7 -7
  575. package/src/core/geom/packing/computeBoundingSphereOfSpheres.js +7 -7
  576. package/src/core/geom/packing/max-rect/cost/costByBestShortSide.js +7 -7
  577. package/src/core/geom/packing/max-rect/cost/costByRemainingArea.js +7 -7
  578. package/src/core/geom/packing/max-rect/cutArea.js +7 -7
  579. package/src/core/geom/packing/max-rect/findBestContainer.js +7 -7
  580. package/src/core/geom/packing/max-rect/packMaxRectangles.js +7 -7
  581. package/src/core/geom/packing/max-rect/packOneBox.js +7 -7
  582. package/src/core/geom/packing/max-rect/removeRedundantBoxes.js +7 -7
  583. package/src/core/geom/packing/max-rect/removeRedundantBoxesArray.js +7 -7
  584. package/src/core/geom/random/randomPointInBox.js +7 -7
  585. package/src/core/geom/random/randomPointInCircle.js +7 -7
  586. package/src/core/geom/random/randomPointInPoint.js +7 -7
  587. package/src/core/geom/random/randomPointInSphere.js +7 -7
  588. package/src/core/geom/random/randomPointOnBox.js +7 -7
  589. package/src/core/geom/random/randomPointOnSphere.js +7 -7
  590. package/src/core/geom/random/random_orthonormal_basis.js +31 -31
  591. package/src/core/geom/vec/vector_axpy.js +15 -15
  592. package/src/core/geom/vec/vector_axpy_offset.js +20 -20
  593. package/src/core/geom/vec/vector_copy.js +7 -7
  594. package/src/core/geom/vec/vector_dot_offset.js +25 -25
  595. package/src/core/geom/vec/vector_scale_array.js +7 -7
  596. package/src/core/geom/vec2/v2_rotate.js +21 -21
  597. package/src/core/geom/vec2/v2_rotate_cos_sin.js +21 -21
  598. package/src/core/geom/vec3/v3_angle_atan2_between.js +7 -7
  599. package/src/core/geom/vec3/v3_angle_between.js +7 -7
  600. package/src/core/geom/vec3/v3_angle_cos_between.js +7 -7
  601. package/src/core/geom/vec3/v3_array_add_in_place.js +7 -7
  602. package/src/core/geom/vec3/v3_array_centroid.js +7 -7
  603. package/src/core/geom/vec3/v3_array_copy.js +7 -7
  604. package/src/core/geom/vec3/v3_array_displace_in_direction.js +7 -7
  605. package/src/core/geom/vec3/v3_array_equals.js +7 -7
  606. package/src/core/geom/vec3/v3_array_immediate_add.js +7 -7
  607. package/src/core/geom/vec3/v3_array_matrix4_rotate.js +7 -7
  608. package/src/core/geom/vec3/v3_array_normalize.js +7 -7
  609. package/src/core/geom/vec3/v3_array_scale.js +7 -7
  610. package/src/core/geom/vec3/v3_compute_interior_angle.js +7 -7
  611. package/src/core/geom/vec3/v3_cotangent.js +33 -33
  612. package/src/core/geom/vec3/v3_dot_array_array.js +7 -7
  613. package/src/core/geom/vec3/v3_matrix3_multiply.js +30 -30
  614. package/src/core/geom/vec3/v3_matrix3_rotate.js +49 -49
  615. package/src/core/geom/vec3/v3_matrix4_rotate.js +7 -7
  616. package/src/core/geom/vec3/v3_multiply.js +23 -23
  617. package/src/core/geom/vec3/v3_multiply_scalar.js +7 -7
  618. package/src/core/geom/vec3/v3_orthonormal_matrix_from_normal.js +49 -49
  619. package/src/core/geom/vec3/v3_quat3_apply.js +7 -7
  620. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +7 -7
  621. package/src/core/geom/vec3/v3_quaternion_apply.js +39 -39
  622. package/src/core/geom/vec3/v3_quaternion_apply_inverse.js +41 -41
  623. package/src/core/geom/vec3/v3_reflect.js +24 -24
  624. package/src/core/geom/vec3/v3_scale_array.js +18 -18
  625. package/src/core/geom/vec3/v3_triple_cross.js +45 -45
  626. package/src/core/geom/vec3/v3_triple_cross_product.js +7 -7
  627. package/src/core/geom/vec3/v3_uniform_sample_cone.js +21 -21
  628. package/src/core/geom/vec4/v4_multiply_mat4.js +7 -7
  629. package/src/core/graph/csr/csr_graph_build_distance_field.js +112 -112
  630. package/src/core/graph/csr/csr_graph_find_edge.js +25 -25
  631. package/src/core/graph/csr/csr_graph_find_shortest_path.js +105 -105
  632. package/src/core/graph/csr/csr_graph_from_undirected_edge_list.js +94 -94
  633. package/src/core/graph/graph_k_means_cluster.js +250 -250
  634. package/src/core/graph/layout/CircleLayout.js +1 -1
  635. package/src/core/graph/layout/box/BoxLayouter.js +1 -1
  636. package/src/core/graph/layout/graph_peel_topological_layer.js +45 -45
  637. package/src/core/graph/metis/BinaryTopologyFaceGraph.js +49 -49
  638. package/src/core/graph/metis/bt_mesh_build_face_graph.js +111 -111
  639. package/src/core/graph/metis/cluster_mesh_metis.js +137 -137
  640. package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -100
  641. package/src/core/graph/metis/native/bisection/compute_2way_params.js +86 -86
  642. package/src/core/graph/metis/native/bisection/fm_2way.js +297 -297
  643. package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -137
  644. package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -119
  645. package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -94
  646. package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -158
  647. package/src/core/graph/metis/native/coarsen/match_shem.js +175 -175
  648. package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -122
  649. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -170
  650. package/src/core/graph/metis/native/metis_partition_kway.js +126 -126
  651. package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -53
  652. package/src/core/graph/metis/native/refine/fm_kway.js +487 -487
  653. package/src/core/graph/metis/native/refine/project_kway.js +43 -43
  654. package/src/core/graph/metis/native/refine/refine_kway.js +43 -43
  655. package/src/core/lang/reactive/pegjs/parser.js +3458 -3458
  656. package/src/core/math/complex/complex_horner_eval.js +31 -31
  657. package/src/core/math/computeWholeDivisorLow.js +33 -33
  658. package/src/core/math/f32_next_down.js +24 -24
  659. package/src/core/math/f32_next_up.js +27 -27
  660. package/src/core/math/hash/hash_mix2.js +22 -22
  661. package/src/core/math/hash/hash_mix3.js +19 -19
  662. package/src/core/math/linalg/cg/cg_solve.js +106 -106
  663. package/src/core/math/linalg/cg/cg_solve_normal_equations.js +59 -59
  664. package/src/core/math/linalg/cubic_residual_times_derivative_accumulate.js +43 -43
  665. package/src/core/math/linalg/eigen/matrix_householder_in_place.js +122 -122
  666. package/src/core/math/linalg/eigen/matrix_qr_in_place.js +190 -190
  667. package/src/core/math/linalg/eigen/matrix_symmetric_3x3_eigen.js +117 -117
  668. package/src/core/math/linalg/givens/givens_apply_rows.js +28 -28
  669. package/src/core/math/linalg/givens/givens_apply_rows_offset.js +30 -30
  670. package/src/core/math/linalg/givens/givens_rotation_coefficients.js +39 -39
  671. package/src/core/math/linalg/lu_factor_linear_system.js +108 -108
  672. package/src/core/math/linalg/lu_solve_linear_system.js +53 -53
  673. package/src/core/math/linalg/polynomial_add_into.js +29 -29
  674. package/src/core/math/linalg/polynomial_complex_roots_aberth_ehrlich.js +159 -159
  675. package/src/core/math/linalg/polynomial_cubic_derivative_eval.js +16 -16
  676. package/src/core/math/linalg/polynomial_cubic_horner_eval.js +19 -19
  677. package/src/core/math/linalg/polynomial_cubic_second_derivative_eval.js +14 -14
  678. package/src/core/math/linalg/polynomial_multiply.js +41 -41
  679. package/src/core/math/linalg/polynomial_real_roots_in_interval.js +211 -211
  680. package/src/core/math/linalg/polynomial_root_bound_cauchy.js +30 -30
  681. package/src/core/math/linalg/polynomial_scale_into.js +17 -17
  682. package/src/core/math/linalg/polynomial_sub_into.js +29 -29
  683. package/src/core/math/linalg/solve_linear_system_GEPP_2x2.js +96 -96
  684. package/src/core/math/linalg/sor_optimal_omega.js +42 -42
  685. package/src/core/math/linalg/sparse/SparseMatrixCSR.js +88 -88
  686. package/src/core/math/linalg/sparse/spm_matvec.js +22 -22
  687. package/src/core/math/linalg/sparse/spm_matvec_transpose.js +29 -29
  688. package/src/core/math/lookup/LUT_HEATMAP.js +30 -30
  689. package/src/core/math/lookup/ParameterLookupTable.js +495 -495
  690. package/src/core/math/lookup/ParameterLookupTableFlags.js +6 -6
  691. package/src/core/math/noise/curl_noise_3d.js +18 -18
  692. package/src/core/math/physics/brdf/cone_cosine_from_roughness.js +28 -28
  693. package/src/core/math/physics/brdf/reflection_sample_weight.js +48 -48
  694. package/src/core/math/physics/kinematics/computeInterceptPoint.js +79 -79
  695. package/src/core/math/random/randomSeed.js +16 -16
  696. package/src/core/math/random/random_pick_weighted_index.js +26 -26
  697. package/src/core/math/round_half_away_from_zero.js +13 -13
  698. package/src/core/math/spline/spline3_hermite_apply_transform.js +107 -107
  699. package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_1d.js +125 -125
  700. package/src/core/math/spline/spline3_hermite_intersects_spline3_hermite.js +50 -50
  701. package/src/core/math/spline/spline3_hermite_reverse.js +49 -49
  702. package/src/core/math/spline/spline3_hermite_to_monomial.js +37 -37
  703. package/src/core/math/statistics/hammersley_sequence.js +53 -53
  704. package/src/core/model/reactive/model/util/createRandomReactiveExpression.js +185 -185
  705. package/src/core/path/convertPathToURL.js +107 -107
  706. package/src/core/process/delay.js +16 -16
  707. package/src/core/science/units/MEASUREMENT_UNITS_SCIENTIFIC.js +87 -87
  708. package/src/core/science/units/MEASUREMENT_UNITS_SI.js +17 -17
  709. package/src/core/science/units/NamedUnit.js +48 -48
  710. package/src/core/science/units/UNIT_DIMENSION_MAPPING.js +29 -29
  711. package/src/core/science/units/UnitDimension.js +28 -28
  712. package/src/core/science/units/format_quantity.js +74 -74
  713. package/src/core/science/units/magnitude_prefix.js +127 -127
  714. package/src/core/science/units/si/AMPERE.js +13 -13
  715. package/src/core/science/units/si/CANDELA.js +13 -13
  716. package/src/core/science/units/si/DIMENSIONLESS.js +14 -14
  717. package/src/core/science/units/si/KELVIN.js +13 -13
  718. package/src/core/science/units/si/KILOGRAM.js +13 -13
  719. package/src/core/science/units/si/METER.js +13 -13
  720. package/src/core/science/units/si/MOLE.js +13 -13
  721. package/src/core/science/units/si/SECOND.js +13 -13
  722. package/src/core/science/units/si/derived/BECQUEREL.js +16 -16
  723. package/src/core/science/units/si/derived/COULOMB.js +13 -13
  724. package/src/core/science/units/si/derived/FARAD.js +13 -13
  725. package/src/core/science/units/si/derived/GRAY.js +16 -16
  726. package/src/core/science/units/si/derived/HENRY.js +13 -13
  727. package/src/core/science/units/si/derived/HERTZ.js +16 -16
  728. package/src/core/science/units/si/derived/JOULE.js +13 -13
  729. package/src/core/science/units/si/derived/KATAL.js +13 -13
  730. package/src/core/science/units/si/derived/LUMEN.js +14 -14
  731. package/src/core/science/units/si/derived/LUX.js +13 -13
  732. package/src/core/science/units/si/derived/NEWTON.js +13 -13
  733. package/src/core/science/units/si/derived/OHM.js +13 -13
  734. package/src/core/science/units/si/derived/PASCAL.js +13 -13
  735. package/src/core/science/units/si/derived/SIEMENS.js +13 -13
  736. package/src/core/science/units/si/derived/SIEVERT.js +16 -16
  737. package/src/core/science/units/si/derived/TESLA.js +13 -13
  738. package/src/core/science/units/si/derived/VOLT.js +13 -13
  739. package/src/core/science/units/si/derived/WATT.js +13 -13
  740. package/src/core/science/units/si/derived/WEBER.js +13 -13
  741. package/src/core/science/units/unit_matrix_to_string.js +403 -403
  742. package/src/engine/Engine.js +726 -726
  743. package/src/engine/EngineHarness.js +590 -590
  744. package/src/engine/REVIEW_2026_07_03.md +211 -211
  745. package/src/engine/animation/AnimatedActions.js +81 -81
  746. package/src/engine/animation/AnimationUtils.js +252 -252
  747. package/src/engine/animation/async/TimeSeries.js +300 -300
  748. package/src/engine/animation/curve/animation_curve_binary_codec.js +60 -60
  749. package/src/engine/animation/curve/draw/canvas_point_to_curve.js +22 -22
  750. package/src/engine/animation/curve/draw/curve_point_to_canvas.js +38 -38
  751. package/src/engine/animation/curve/draw/position_canvas_to_curve.js +22 -22
  752. package/src/engine/animation/curve/draw/position_curve_to_canvas.js +22 -22
  753. package/src/engine/asset/GameAssetType.d.ts +0 -1
  754. package/src/engine/asset/GameAssetType.js +0 -1
  755. package/src/engine/asset/load_model_scene_bundle.js +27 -27
  756. package/src/engine/asset/loaders/font/FontAsset.js +21 -21
  757. package/src/engine/asset/loaders/font/FontAssetLoader.js +20 -20
  758. package/src/engine/asset/loaders/gltf_test_fixtures.js +358 -358
  759. package/src/engine/asset/loaders/image/ImageBitmapAssetLoader.js +52 -52
  760. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +94 -94
  761. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.js +59 -59
  762. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +55 -55
  763. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.js +74 -74
  764. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +34 -34
  765. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +46 -46
  766. package/src/engine/control/first-person/DESIGN.md +640 -640
  767. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -563
  768. package/src/engine/control/first-person/FirstPersonMotionPhase.js +134 -134
  769. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2045 -2045
  770. package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -30
  771. package/src/engine/control/first-person/math/Spring.js +71 -71
  772. package/src/engine/control/first-person/math/computeJumpFromApex.js +23 -23
  773. package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -41
  774. package/src/engine/control/first-person/math/computeMassRatios.js +44 -44
  775. package/src/engine/control/first-person/math/criticallyDampedSpring.js +34 -34
  776. package/src/engine/control/first-person/math/dampedSpringStep.js +72 -72
  777. package/src/engine/control/first-person/math/jumpDynamics.js +108 -108
  778. package/src/engine/control/first-person/math/stepTowards.js +20 -20
  779. package/src/engine/control/first-person/pose/FirstPersonPose.js +137 -137
  780. package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -27
  781. package/src/engine/control/first-person/test/buildTestPlayer.js +36 -36
  782. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +531 -531
  783. package/src/engine/ecs/EntityManager.d.ts +7 -3
  784. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  785. package/src/engine/ecs/EntityManager.js +10 -5
  786. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  787. package/src/engine/ecs/async/SystemWorkerHost.js +329 -329
  788. package/src/engine/ecs/async/SystemWorkerLoopback.js +143 -143
  789. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +246 -246
  790. package/src/engine/ecs/async/WorkerSystem.js +702 -702
  791. package/src/engine/ecs/async/WorkerSystemProtocol.js +150 -150
  792. package/src/engine/ecs/fow/FogOfWar.js +707 -707
  793. package/src/engine/ecs/fow/FogOfWarEdgeMode.js +40 -40
  794. package/src/engine/ecs/fow/fog_of_war_mask_world_bounds.js +24 -24
  795. package/src/engine/ecs/fow/fog_of_war_uv_transform.js +30 -30
  796. package/src/engine/ecs/gui/hud/testHudEdgeStick.js +132 -134
  797. package/src/engine/ecs/hierarchy/EntityChildIndex.js +140 -140
  798. package/src/engine/ecs/ik/IKProblem.js +42 -42
  799. package/src/engine/ecs/ik/InverseKinematicsSystem.js +193 -193
  800. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +134 -134
  801. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +97 -97
  802. package/src/engine/ecs/ik/ik_bone_chain.js +85 -85
  803. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +119 -119
  804. package/src/engine/ecs/parent/EntityNode.d.ts +1 -1
  805. package/src/engine/ecs/parent/EntityNode.js +2 -2
  806. package/src/engine/ecs/parent/ParentEntitySystem.js +255 -255
  807. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  808. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  809. package/src/engine/ecs/speaker/VoiceSystem.js +13 -7
  810. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +269 -269
  811. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +315 -315
  812. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectSerializer.js +331 -331
  813. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +199 -199
  814. package/src/engine/ecs/storage/binary/object-v2/ObjectBinaryFormat.js +57 -57
  815. package/src/engine/ecs/storage/binary/object-v2/ObjectSerializationAdapter.js +56 -56
  816. package/src/engine/ecs/storage/binary/object-v2/README.md +110 -110
  817. package/src/engine/ecs/storage/binary/object-v2/objectStringCodec.js +48 -48
  818. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +44 -44
  819. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +265 -265
  820. package/src/engine/ecs/terrain/TerrainClouds.js +97 -97
  821. package/src/engine/ecs/terrain/ecs/StubTerrainBuildWorker.js +65 -65
  822. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +4 -0
  823. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  824. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  825. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +209 -209
  826. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +316 -316
  827. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +416 -416
  828. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +525 -525
  829. package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +302 -302
  830. package/src/engine/ecs/terrain/tiles/TerrainTile.js +561 -561
  831. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +896 -896
  832. package/src/engine/ecs/terrain/tiles/tile_geometry_to_meshlets.js +36 -36
  833. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  834. package/src/engine/ecs/transform/Transform64.js +814 -814
  835. package/src/engine/ecs/transform/t64_copy_from_transform.js +35 -35
  836. package/src/engine/ecs/transform/t64_equals_transform.js +55 -55
  837. package/src/engine/ecs/transform/t64_look_rotation.js +36 -36
  838. package/src/engine/ecs/transform/t64_transform_direction.js +25 -25
  839. package/src/engine/ecs/transform/transform_copy_from_t64.js +28 -28
  840. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +345 -345
  841. package/src/engine/ecs/transform-attachment/transform_attachment_find_descendant_by_name.js +65 -65
  842. package/src/engine/ecs/transform-attachment/transform_attachment_parent_of.js +24 -24
  843. package/src/engine/ecs/util/hideEntityGracefully.js +208 -208
  844. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +446 -446
  845. package/src/engine/graphics/FULL_SCREEN_QUAD_VERTEX_SHADER.js +14 -14
  846. package/src/engine/graphics/FrameThrottle.js +2 -2
  847. package/src/engine/graphics/ecs/animation/animator/graph/AnimationState.js +207 -207
  848. package/src/engine/graphics/ecs/animation/animator/graph/AnimationTransition.js +151 -151
  849. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +22 -22
  850. package/src/engine/graphics/ecs/camera/Camera.js +165 -165
  851. package/src/engine/graphics/ecs/camera/camera_active_frustum.js +25 -25
  852. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  853. package/src/engine/graphics/ecs/camera/camera_traverse_active.js +18 -18
  854. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +170 -170
  855. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.js +68 -68
  856. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +296 -296
  857. package/src/engine/graphics/ecs/decal/v2/Decal.js +220 -220
  858. package/src/engine/graphics/ecs/decal/v2/DecalSerializationAdapter.js +56 -56
  859. package/src/engine/graphics/ecs/decal/v2/DecalSerializationUpgrader_0_1.js +38 -38
  860. package/src/engine/graphics/ecs/light/shadow/compute_view_frustum_aabb_in_space.js +62 -62
  861. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.js +77 -77
  862. package/src/engine/graphics/ecs/make_bvh_depth_range_computer.js +33 -33
  863. package/src/engine/graphics/ecs/mesh-v2/DeferredBoundsQueue.js +88 -88
  864. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  865. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.js +303 -303
  866. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshSystem.d.ts +1 -1
  867. package/src/engine/graphics/ecs/mesh-v2/aggregate/serialization/SGMeshSerializationAdapter.js +39 -39
  868. package/src/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.js +36 -36
  869. package/src/engine/graphics/ecs/path/tube/build/GeometryStream.js +94 -94
  870. package/src/engine/graphics/ecs/path/tube/build/build_stream_catmullrom.js +310 -310
  871. package/src/engine/graphics/ecs/path/tube/build/build_stream_linear.js +73 -73
  872. package/src/engine/graphics/ecs/path/tube/build/computeFrenetFrames.js +199 -199
  873. package/src/engine/graphics/ecs/path/tube/build/makeTubeStream.js +217 -217
  874. package/src/engine/graphics/ecs/path/tube/build/make_cap.js +340 -340
  875. package/src/engine/graphics/ecs/path/tube/build/make_ring_faces.js +40 -40
  876. package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +153 -153
  877. package/src/engine/graphics/ecs/render_layers_compute_depth_range.js +64 -64
  878. package/src/engine/graphics/ecs/trail3d/Trail3D.js +483 -483
  879. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +26 -26
  880. package/src/engine/graphics/ecs/trail3d/advance_trail.js +42 -42
  881. package/src/engine/graphics/ecs/trail3d/make_gradient_stroke.js +58 -58
  882. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +90 -90
  883. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +75 -75
  884. package/src/engine/graphics/ecs/trail3d/trail_head_position.js +19 -19
  885. package/src/engine/graphics/ecs/water/Water.js +104 -104
  886. package/src/engine/graphics/geometry/AttributeData.js +84 -84
  887. package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.js +49 -49
  888. package/src/engine/graphics/geometry/buffered/query/GeometrySpatialQueryAccelerator.js +288 -288
  889. package/src/engine/graphics/geometry/buffered/query/nearest_point_on_triangle_record.js +87 -87
  890. package/src/engine/graphics/geometry/buffered/read_triangle_vertices.js +102 -102
  891. package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_buffered_geometry.js +52 -52
  892. package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_indexed_geometry.js +20 -20
  893. package/src/engine/graphics/geometry/bvh/buffered/bvh32_from_unindexed_geometry.js +19 -19
  894. package/src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.js +135 -135
  895. package/src/engine/graphics/impostors/voxel/README.md +149 -149
  896. package/src/engine/graphics/impostors/voxel/VoxelImpostorDescription.js +141 -141
  897. package/src/engine/graphics/particles/node-based/codegen/glsl/getTypeByteSize.js +20 -20
  898. package/src/engine/graphics/particles/node-based/nodes/FloatConstant.d.ts +2 -0
  899. package/src/engine/graphics/particles/node-based/nodes/FloatConstant.d.ts.map +1 -1
  900. package/src/engine/graphics/particles/node-based/nodes/ReadFloatUniform.d.ts +2 -0
  901. package/src/engine/graphics/particles/node-based/nodes/ReadFloatUniform.d.ts.map +1 -1
  902. package/src/engine/graphics/particles/node-based/nodes/ReadVelocity.d.ts +2 -0
  903. package/src/engine/graphics/particles/node-based/nodes/ReadVelocity.d.ts.map +1 -1
  904. package/src/engine/graphics/particles/node-based/nodes/ShaderNode.d.ts +1 -2
  905. package/src/engine/graphics/particles/node-based/nodes/ShaderNode.d.ts.map +1 -1
  906. package/src/engine/graphics/particles/node-based/nodes/Vector3Constant.d.ts +2 -0
  907. package/src/engine/graphics/particles/node-based/nodes/Vector3Constant.d.ts.map +1 -1
  908. package/src/engine/graphics/particles/node-based/nodes/Vector3Merge.d.ts +2 -0
  909. package/src/engine/graphics/particles/node-based/nodes/Vector3Merge.d.ts.map +1 -1
  910. package/src/engine/graphics/particles/node-based/nodes/Vector3Split.d.ts +2 -0
  911. package/src/engine/graphics/particles/node-based/nodes/Vector3Split.d.ts.map +1 -1
  912. package/src/engine/graphics/particles/node-based/nodes/WriteVelocity.d.ts +2 -0
  913. package/src/engine/graphics/particles/node-based/nodes/WriteVelocity.d.ts.map +1 -1
  914. package/src/engine/graphics/particles/node-based/nodes/attribute/ReadVector3Attribute.d.ts +2 -0
  915. package/src/engine/graphics/particles/node-based/nodes/attribute/ReadVector3Attribute.d.ts.map +1 -1
  916. package/src/engine/graphics/particles/node-based/nodes/attribute/WriteVector3Attribute.d.ts +2 -0
  917. package/src/engine/graphics/particles/node-based/nodes/attribute/WriteVector3Attribute.d.ts.map +1 -1
  918. package/src/engine/graphics/particles/node-based/nodes/math/AddFloatNode.d.ts +2 -0
  919. package/src/engine/graphics/particles/node-based/nodes/math/AddFloatNode.d.ts.map +1 -1
  920. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Add.d.ts +2 -0
  921. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Add.d.ts.map +1 -1
  922. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Divide.d.ts +2 -0
  923. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Divide.d.ts.map +1 -1
  924. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Multiply.d.ts +2 -0
  925. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Multiply.d.ts.map +1 -1
  926. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Subtract.d.ts +2 -0
  927. package/src/engine/graphics/particles/node-based/nodes/math/Vector3Subtract.d.ts.map +1 -1
  928. package/src/engine/graphics/particles/node-based/nodes/noise/CurlNoiseNode.d.ts +2 -0
  929. package/src/engine/graphics/particles/node-based/nodes/noise/CurlNoiseNode.d.ts.map +1 -1
  930. package/src/engine/graphics/particles/node-based/nodes/particle_data_type_component_count.js +45 -45
  931. package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +229 -229
  932. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +2 -10
  933. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  934. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1149 -1149
  935. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +472 -472
  936. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -2
  937. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -2
  938. package/src/engine/graphics/particles/particular/engine/parameter/ParameterSet.d.ts.map +1 -1
  939. package/src/engine/graphics/particles/particular/engine/parameter/ParameterSet.js +3 -5
  940. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +135 -135
  941. package/src/engine/graphics/particles/particular/engine/utils/distribute_points_on_indexed_triangles.js +168 -168
  942. package/src/engine/graphics/render/forward_plus/plugin/forwardPlusMaterialMarker.js +18 -18
  943. package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -2
  944. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +219 -219
  945. package/src/engine/graphics/render/frame_graph/FrameGraph.js +900 -900
  946. package/src/engine/graphics/render/frame_graph/FrameGraphScope.js +72 -72
  947. package/src/engine/graphics/render/frame_graph/FrameGraphState.js +39 -39
  948. package/src/engine/graphics/render/frame_graph/ResourceEntry.js +96 -96
  949. package/src/engine/graphics/render/gizmo/GizmoShapeBuffer.js +105 -105
  950. package/src/engine/graphics/render/gizmo/GizmoShapeRenderingInterface.js +162 -162
  951. package/src/engine/graphics/render/layers/RenderLayer.js +95 -95
  952. package/src/engine/graphics/sh3/build_injected_shader.js +56 -56
  953. package/src/engine/graphics/sh3/grid_dilate_average.js +175 -175
  954. package/src/engine/graphics/sh3/path_tracer/BufferedGeometryBVH.js +506 -506
  955. package/src/engine/graphics/sh3/path_tracer/PathTracedMesh.js +161 -161
  956. package/src/engine/graphics/sh3/path_tracer/PathTracedRenderer.js +205 -205
  957. package/src/engine/graphics/sh3/path_tracer/PathTracedScene.js +698 -698
  958. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +490 -490
  959. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -2
  960. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.js +45 -45
  961. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +73 -73
  962. package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +32 -32
  963. package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.js +28 -28
  964. package/src/engine/graphics/sh3/path_tracer/texture/sample_material.js +142 -142
  965. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.js +70 -70
  966. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +388 -388
  967. package/src/engine/graphics/shaders/chunks/glsl_octahedral_impostor.js +277 -277
  968. package/src/engine/graphics/shaders/chunks/glsl_voxel_impostor_splat.js +57 -57
  969. package/src/engine/graphics/shadows/vsm.glsl.js +43 -43
  970. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -81
  971. package/src/engine/graphics/texture/EnvironmentTextureProjection.js +15 -15
  972. package/src/engine/graphics/texture/channel_count_to_format_prefix.js +26 -26
  973. package/src/engine/graphics/texture/isImageBitmap.js +2 -2
  974. package/src/engine/graphics/texture/reflection/convolve_equirectangular_reflection.js +189 -189
  975. package/src/engine/graphics/texture/reflection/equirectangular_reflection_roughness.js +51 -51
  976. package/src/engine/graphics/texture/sampler/HarmonicDiffusionGrid.js +145 -145
  977. package/src/engine/graphics/texture/sampler/Sampler2DArray.js +172 -172
  978. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +466 -466
  979. package/src/engine/graphics/texture/sampler/compare/flip/FlipParameters.js +18 -18
  980. package/src/engine/graphics/texture/sampler/compare/flip/FlipPooling.js +33 -33
  981. package/src/engine/graphics/texture/sampler/compare/flip/flip_build_feature_kernel.js +147 -147
  982. package/src/engine/graphics/texture/sampler/compare/flip/flip_build_spatial_kernel.js +177 -177
  983. package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_color_difference.js +104 -104
  984. package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_feature_difference.js +76 -76
  985. package/src/engine/graphics/texture/sampler/compare/flip/flip_compute_pixels_per_degree.js +34 -34
  986. package/src/engine/graphics/texture/sampler/compare/flip/flip_constants.js +77 -77
  987. package/src/engine/graphics/texture/sampler/compare/flip/flip_filter_feature.js +48 -48
  988. package/src/engine/graphics/texture/sampler/compare/flip/flip_filter_spatial.js +86 -86
  989. package/src/engine/graphics/texture/sampler/compare/flip/flip_pool.js +71 -71
  990. package/src/engine/graphics/texture/sampler/compare/flip/flip_srgb_to_ycxcz.js +55 -55
  991. package/src/engine/graphics/texture/sampler/compare/flip/sampler2d_flip_ldr.js +80 -80
  992. package/src/engine/graphics/texture/sampler/filter/SeparableKernel.js +82 -82
  993. package/src/engine/graphics/texture/sampler/filter/sampler2d_convolve_separable.js +122 -122
  994. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.js +148 -148
  995. package/src/engine/graphics/texture/sampler/sampler2d_channel_apply_lut.js +82 -82
  996. package/src/engine/graphics/texture/sampler/sampler2d_combine.js +67 -67
  997. package/src/engine/graphics/texture/sampler/sampler2d_linear_f16_to_srgb_u8.js +54 -54
  998. package/src/engine/graphics/texture/sampler/sampler2d_sample_equirectangular_direction.js +63 -63
  999. package/src/engine/graphics/texture/sampler/sampler2d_srgb_to_linear.js +33 -33
  1000. package/src/engine/graphics/texture/sampler/sampler2d_srgb_u8_to_linear_f16.js +68 -68
  1001. package/src/engine/graphics/texture/shade_image_preview.js +103 -103
  1002. package/src/engine/graphics/trail/TrailSpawnMode.js +20 -20
  1003. package/src/engine/graphics/trail/tube/TubeX.js +573 -573
  1004. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +58 -58
  1005. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +34 -34
  1006. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +69 -69
  1007. package/src/engine/graphics/trail/tube/tube_frame.js +83 -83
  1008. package/src/engine/graphics3/AnimationGraphSystem3.js +329 -329
  1009. package/src/engine/graphics3/AnimationSystem3.js +352 -352
  1010. package/src/engine/graphics3/CameraSystem3.js +170 -170
  1011. package/src/engine/graphics3/DecalSystem3.js +441 -441
  1012. package/src/engine/graphics3/FogOfWarSystem3.js +265 -265
  1013. package/src/engine/graphics3/GraphicsEngine3.js +776 -776
  1014. package/src/engine/graphics3/HighlightSystem3.js +241 -241
  1015. package/src/engine/graphics3/LightSystem3.js +211 -211
  1016. package/src/engine/graphics3/MeshSystem3.js +646 -646
  1017. package/src/engine/graphics3/ParticleEmitterSystem3.js +289 -289
  1018. package/src/engine/graphics3/PathDisplaySystem3.js +309 -309
  1019. package/src/engine/graphics3/PickingQuery.js +48 -48
  1020. package/src/engine/graphics3/PickingResult.js +47 -47
  1021. package/src/engine/graphics3/PickingSystem3.js +273 -273
  1022. package/src/engine/graphics3/ShadeCameraAdapter.js +55 -55
  1023. package/src/engine/graphics3/ShadedGeometrySystem3.js +169 -169
  1024. package/src/engine/graphics3/TerrainSystem3.js +566 -566
  1025. package/src/engine/graphics3/TooltipComponentSystem3.js +328 -328
  1026. package/src/engine/graphics3/Trail3DSystem3.js +221 -221
  1027. package/src/engine/graphics3/WaterSystem3.js +293 -293
  1028. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  1029. package/src/engine/graphics3/animation/wrap_clip_time.js +23 -23
  1030. package/src/engine/graphics3/animation/write_graph_playback.js +48 -48
  1031. package/src/engine/graphics3/camera_sync_from_transform.js +29 -29
  1032. package/src/engine/graphics3/debug/gizmo_view_from_camera.js +48 -48
  1033. package/src/engine/graphics3/decal/DECAL_CLUSTER.js +61 -61
  1034. package/src/engine/graphics3/decal/DECAL_GPU_RECORD.js +117 -117
  1035. package/src/engine/graphics3/decal/DecalAtlas.js +194 -194
  1036. package/src/engine/graphics3/decal/DecalAtlasFill.js +32 -32
  1037. package/src/engine/graphics3/decal/GPUDecalRenderer.js +360 -360
  1038. package/src/engine/graphics3/decal/chunk_decal_intersects_frustum.js +59 -59
  1039. package/src/engine/graphics3/decal/chunk_decal_sampling_info.js +57 -57
  1040. package/src/engine/graphics3/decal/chunk_decal_surface_frame.js +54 -54
  1041. package/src/engine/graphics3/decal/decal_atlas_border.js +69 -69
  1042. package/src/engine/graphics3/decal/decal_gpu_records.js +120 -120
  1043. package/src/engine/graphics3/decal/decal_material_samplers.js +109 -109
  1044. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +212 -212
  1045. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +207 -207
  1046. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +108 -108
  1047. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +151 -151
  1048. package/src/engine/graphics3/highlight/HIGHLIGHT_OUTLINE.js +23 -23
  1049. package/src/engine/graphics3/highlight/chunk_highlight_lookup.js +53 -53
  1050. package/src/engine/graphics3/highlight/pack_highlight_color.js +44 -44
  1051. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  1052. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  1053. package/src/engine/graphics3/load_cube_environment.js +68 -68
  1054. package/src/engine/graphics3/make_default_environment.js +107 -107
  1055. package/src/engine/graphics3/particles/particle_gpu_records.js +221 -221
  1056. package/src/engine/graphics3/path/build_tube_path_streams.js +98 -98
  1057. package/src/engine/graphics3/path/tube_stream_write_geometry.js +90 -90
  1058. package/src/engine/graphics3/preview/ModelPreviewFraming.js +35 -35
  1059. package/src/engine/graphics3/preview/make_model_preview_scene.js +154 -154
  1060. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  1061. package/src/engine/graphics3/preview/model_preview_framing.js +70 -70
  1062. package/src/engine/graphics3/shade_bundle_bounds.js +55 -55
  1063. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  1064. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  1065. package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.js +481 -481
  1066. package/src/engine/graphics3/terrain/chunk_terrain_grid_overlay.js +61 -61
  1067. package/src/engine/graphics3/terrain/chunk_terrain_splat_mix.js +66 -66
  1068. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +53 -53
  1069. package/src/engine/graphics3/terrain/shader_terrain_splat.js +215 -215
  1070. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +158 -158
  1071. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +717 -717
  1072. package/src/engine/input/analog/apply_radial_dead_zone.js +38 -38
  1073. package/src/engine/input/devices/GamepadDevice.js +466 -466
  1074. package/src/engine/input/devices/ManualInputDevice.js +152 -152
  1075. package/src/engine/input/devices/PointerCoordinates.js +26 -26
  1076. package/src/engine/input/devices/events/GamepadEvents.js +10 -10
  1077. package/src/engine/input/devices/gamepad/GamepadAxes.js +19 -19
  1078. package/src/engine/input/devices/gamepad/GamepadButtons.js +29 -29
  1079. package/src/engine/input/devices/gamepad/GamepadCoordinates.js +17 -17
  1080. package/src/engine/input/devices/gamepad/GamepadDeviceLayout.js +323 -323
  1081. package/src/engine/input/devices/gamepad/GamepadHandle.js +286 -286
  1082. package/src/engine/input/devices/gamepad/GamepadLayout.js +160 -160
  1083. package/src/engine/input/devices/gamepad/GamepadStandardMapping.js +31 -31
  1084. package/src/engine/input/devices/gamepad/GamepadStick.js +169 -169
  1085. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +119 -119
  1086. package/src/engine/input/devices/gamepad/GamepadStickCalibrator.js +250 -250
  1087. package/src/engine/input/devices/gamepad/gamepad_layout_database.js +144 -144
  1088. package/src/engine/input/devices/gamepad/gamepad_read_hat_axis.js +61 -61
  1089. package/src/engine/input/devices/gamepad/gamepad_write_dpad_vector.js +30 -30
  1090. package/src/engine/input/devices/gamepad/prototypeGamepadTester.js +2124 -2124
  1091. package/src/engine/input/devices/mouse/MouseButtons.js +22 -22
  1092. package/src/engine/input/ecs/components/Input.js +118 -118
  1093. package/src/engine/input/ecs/components/InputController.js +78 -78
  1094. package/src/engine/input/ecs/ism/ISM_DESIGN.md +1523 -1523
  1095. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +627 -627
  1096. package/src/engine/input/ecs/ism/InputActionEvent.js +40 -40
  1097. package/src/engine/input/ecs/ism/InputBinding.js +71 -71
  1098. package/src/engine/input/ecs/ism/InputCoordinateKind.js +25 -25
  1099. package/src/engine/input/ecs/ism/InputCoordinateSource.js +86 -86
  1100. package/src/engine/input/ecs/ism/InputDirection.js +33 -33
  1101. package/src/engine/input/ecs/ism/InputMapProgram.js +236 -236
  1102. package/src/engine/input/ecs/ism/InputMapSystem.js +976 -976
  1103. package/src/engine/input/ecs/ism/InputOcclusion.js +31 -31
  1104. package/src/engine/input/ecs/ism/InputSource.js +67 -67
  1105. package/src/engine/input/ecs/ism/InputSourceTable.js +107 -107
  1106. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannel.js +93 -93
  1107. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannelType.js +11 -11
  1108. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +153 -153
  1109. package/src/engine/input/ecs/ism/coordinate/InputCoordinateSwitches.js +160 -160
  1110. package/src/engine/input/ecs/ism/device/GAMEPAD_INPUT_DEVICE_ID.js +9 -9
  1111. package/src/engine/input/ecs/ism/device/GamepadInputDeviceAdapter.js +88 -88
  1112. package/src/engine/input/ecs/ism/device/InputDeviceAdapter.js +72 -72
  1113. package/src/engine/input/ecs/ism/device/KEYBOARD_INPUT_DEVICE_ID.js +9 -9
  1114. package/src/engine/input/ecs/ism/device/KeyboardInputDeviceAdapter.js +63 -63
  1115. package/src/engine/input/ecs/ism/device/ManualInputDeviceAdapter.js +55 -55
  1116. package/src/engine/input/ecs/ism/device/POINTER_INPUT_DEVICE_ID.js +9 -9
  1117. package/src/engine/input/ecs/ism/device/PointerInputDeviceAdapter.js +160 -160
  1118. package/src/engine/input/ecs/ism/map/InputBinding.js +88 -88
  1119. package/src/engine/input/ecs/ism/map/InputCoordinateBinding.js +102 -102
  1120. package/src/engine/input/ecs/ism/map/InputLayer.js +220 -220
  1121. package/src/engine/input/ecs/ism/map/InputMap.js +331 -331
  1122. package/src/engine/input/ecs/ism/prototypeInputMap.js +309 -309
  1123. package/src/engine/input/ecs/ism/trigger/InputTrigger.js +148 -148
  1124. package/src/engine/input/ecs/ism/trigger/InputTriggerChord.js +173 -173
  1125. package/src/engine/input/ecs/ism/trigger/InputTriggerGamepadButton.js +37 -37
  1126. package/src/engine/input/ecs/ism/trigger/InputTriggerHold.js +176 -176
  1127. package/src/engine/input/ecs/ism/trigger/InputTriggerKey.js +39 -39
  1128. package/src/engine/input/ecs/ism/trigger/InputTriggerMouseButton.js +38 -38
  1129. package/src/engine/input/ecs/ism/trigger/InputTriggerRelease.js +120 -120
  1130. package/src/engine/input/ecs/ism/trigger/InputTriggerSequence.js +315 -315
  1131. package/src/engine/input/ecs/ism/trigger/InputTriggerSwitch.js +105 -105
  1132. package/src/engine/input/ecs/ism/trigger/InputTriggerType.js +17 -17
  1133. package/src/engine/input/ecs/systems/InputControllerSystem.js +253 -253
  1134. package/src/engine/input/ecs/systems/InputSystem.js +162 -162
  1135. package/src/engine/intelligence/behavior/primitive/FailingBehaviorSerializationAdapter.js +25 -25
  1136. package/src/engine/intelligence/behavior/primitive/SucceedingBehaviorSerializationAdapter.js +26 -26
  1137. package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.js +55 -55
  1138. package/src/engine/interpolation/BinaryInterpolationAdapter.js +56 -56
  1139. package/src/engine/interpolation/Interpoland.js +49 -49
  1140. package/src/engine/interpolation/Interpolated.js +149 -149
  1141. package/src/engine/interpolation/PoseInterpolationAdapter.js +61 -61
  1142. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +57 -57
  1143. package/src/engine/interpolation/pose_interpoland.js +27 -27
  1144. package/src/engine/navigation/ecs/path_following/PathFollower.js +222 -222
  1145. package/src/engine/navigation/mesh/NavigationMesh.js +145 -145
  1146. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +661 -0
  1147. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +229 -229
  1148. package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.d.ts.map +1 -1
  1149. package/src/engine/navigation/mesh/build/clip_soup_against_overhangs.js +628 -520
  1150. package/src/engine/network/CONGESTION_CONTROL.md +87 -87
  1151. package/src/engine/network/README.md +52 -52
  1152. package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +43 -43
  1153. package/src/engine/network/adapters/TransformInterpolationAdapter.js +84 -84
  1154. package/src/engine/network/adapters/TransformReplicationAdapter.js +87 -87
  1155. package/src/engine/network/adapters/Vector3InterpolationAdapter.js +46 -46
  1156. package/src/engine/network/convertPathToURL.js +2 -2
  1157. package/src/engine/network/core/MalformedPacketError.js +26 -26
  1158. package/src/engine/network/core/quantize/quantize_float.js +73 -73
  1159. package/src/engine/network/core/quantize/quantize_position.js +65 -65
  1160. package/src/engine/network/core/sequence/ack_bitfield.js +77 -77
  1161. package/src/engine/network/core/sequence/seq16.js +69 -69
  1162. package/src/engine/network/core/sequence/seq32.js +73 -73
  1163. package/src/engine/network/ecs/NetworkSystem.js +84 -84
  1164. package/src/engine/network/ecs/components/NetworkIdentity.js +73 -73
  1165. package/src/engine/network/ecs/owner_authorization.js +55 -55
  1166. package/src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.js +64 -64
  1167. package/src/engine/network/replication/ScopeFilter.js +71 -71
  1168. package/src/engine/network/sim/ActionLog.js +152 -152
  1169. package/src/engine/network/sim/SimAction.js +273 -273
  1170. package/src/engine/network/sim/Snapshotter.js +222 -222
  1171. package/src/engine/network/state/FrameBufferRing.js +168 -168
  1172. package/src/engine/network/state/InputRing.js +134 -134
  1173. package/src/engine/network/state/PriorityAccumulator.js +180 -180
  1174. package/src/engine/network/time/TimeDilation.js +62 -62
  1175. package/src/engine/network/transport/Channel.js +336 -336
  1176. package/src/engine/network/transport/Transport.js +203 -203
  1177. package/src/engine/network/transport/adapters/NodeUDPTransport.js +186 -186
  1178. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +105 -105
  1179. package/src/engine/network/transport/fragments/fragment_send.js +147 -147
  1180. package/src/engine/network/transport/fragments/packet_size.js +101 -101
  1181. package/src/engine/network/xhr.js +23 -23
  1182. package/src/engine/physics/BULLET_REVIEW.md +945 -945
  1183. package/src/engine/physics/CANNON_REVIEW.md +1300 -1300
  1184. package/src/engine/physics/CONSTRAINT_SOLVER_BENCH_LOG.md +208 -208
  1185. package/src/engine/physics/CONSTRAINT_SOLVER_IMPROVEMENTS_PLAN.md +364 -364
  1186. package/src/engine/physics/INTEPOLATION_SYSTEM_PLAN.md +287 -287
  1187. package/src/engine/physics/JOLT_REVIEW.md +913 -913
  1188. package/src/engine/physics/PLAN.md +1120 -1094
  1189. package/src/engine/physics/RAPIER_REVIEW.md +934 -934
  1190. package/src/engine/physics/REVIEW_001_ACTION_PLAN.md +642 -642
  1191. package/src/engine/physics/REVIEW_002.md +151 -151
  1192. package/src/engine/physics/REVIEW_003.md +166 -166
  1193. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +97 -97
  1194. package/src/engine/physics/constraint/DofMode.js +35 -35
  1195. package/src/engine/physics/constraint/solve_constraints.js +1 -1
  1196. package/src/engine/physics/contact/combine_material.js +35 -35
  1197. package/src/engine/physics/ecs/BodyKind.js +29 -29
  1198. package/src/engine/physics/ecs/Collider.js +177 -177
  1199. package/src/engine/physics/ecs/ColliderFlags.js +15 -15
  1200. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -37
  1201. package/src/engine/physics/ecs/Joint.js +475 -475
  1202. package/src/engine/physics/ecs/JointSerializationAdapter.js +72 -72
  1203. package/src/engine/physics/ecs/PhysicsSystem.d.ts +3 -0
  1204. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  1205. package/src/engine/physics/ecs/PhysicsSystem.js +7 -2
  1206. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -37
  1207. package/src/engine/physics/ecs/SleepState.js +12 -12
  1208. package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -76
  1209. package/src/engine/physics/fluid/FluidField.js +867 -867
  1210. package/src/engine/physics/fluid/FluidSimulator.js +832 -832
  1211. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +243 -243
  1212. package/src/engine/physics/fluid/SliceVisualiser.js +190 -190
  1213. package/src/engine/physics/fluid/ecs/FluidComponent.js +239 -239
  1214. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -89
  1215. package/src/engine/physics/fluid/ecs/FluidObstacle.js +97 -97
  1216. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  1217. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +348 -348
  1218. package/src/engine/physics/fluid/ecs/FluidSystem.js +142 -142
  1219. package/src/engine/physics/fluid/ecs/FluidWorkerCore.js +123 -123
  1220. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +395 -395
  1221. package/src/engine/physics/fluid/ecs/fluid.worker.js +12 -12
  1222. package/src/engine/physics/fluid/ecs/fluid_build_world_to_grid.js +32 -32
  1223. package/src/engine/physics/fluid/ecs/fluid_gather_visible_effectors.js +47 -47
  1224. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +85 -85
  1225. package/src/engine/physics/fluid/ecs/fluid_sync_effectors_from_transform.js +16 -16
  1226. package/src/engine/physics/fluid/ecs/fluid_worker_protocol.js +111 -111
  1227. package/src/engine/physics/fluid/ecs/makeFluidWorker.js +18 -18
  1228. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -81
  1229. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +202 -202
  1230. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +257 -257
  1231. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +405 -405
  1232. package/src/engine/physics/fluid/prototype.js +126 -126
  1233. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +143 -143
  1234. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +162 -162
  1235. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +107 -107
  1236. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -131
  1237. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +90 -90
  1238. package/src/engine/physics/fluid/solver/v3_grid_limit8_at_indices.js +38 -38
  1239. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -77
  1240. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -113
  1241. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +92 -92
  1242. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -107
  1243. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +135 -135
  1244. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +511 -511
  1245. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -108
  1246. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +317 -317
  1247. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +236 -236
  1248. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +217 -217
  1249. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.js +174 -174
  1250. package/src/engine/physics/fluid/solver/v3_mac_clip_trace.js +95 -95
  1251. package/src/engine/physics/fluid/solver/v3_mac_compute_divergence.js +77 -77
  1252. package/src/engine/physics/fluid/solver/v3_mac_compute_face_solid.js +131 -131
  1253. package/src/engine/physics/fluid/solver/v3_mac_subtract_pressure_gradient.js +104 -104
  1254. package/src/engine/physics/inertia/world_inverse_inertia.js +160 -160
  1255. package/src/engine/physics/integration/integrate_position.js +97 -97
  1256. package/src/engine/physics/narrowphase/box_box_manifold.js +681 -681
  1257. package/src/engine/physics/narrowphase/box_triangle_contact.js +906 -906
  1258. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +395 -395
  1259. package/src/engine/physics/narrowphase/compute_penetration.js +369 -369
  1260. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +55 -55
  1261. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +37 -37
  1262. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
  1263. package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1738
  1264. package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -74
  1265. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +12 -11
  1266. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  1267. package/src/engine/physics/narrowphase/refine_ray_hit.js +228 -36
  1268. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +52 -52
  1269. package/src/engine/physics/narrowphase/sphere_triangle_contact.js +138 -138
  1270. package/src/engine/physics/persistence/solver_caches.js +309 -309
  1271. package/src/engine/physics/queries/overlap_shape.js +187 -187
  1272. package/src/engine/physics/queries/raycast.d.ts +7 -4
  1273. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  1274. package/src/engine/physics/queries/raycast.js +11 -5
  1275. package/src/engine/physics/queries/shape_cast.js +417 -417
  1276. package/src/engine/physics/solver/apply_impulse_to_body.js +86 -86
  1277. package/src/engine/physics/solver/friction_cone.js +37 -37
  1278. package/src/engine/physics/solver/solve_contacts.js +1 -1
  1279. package/src/engine/platform/WebEnginePlatform.d.ts.map +1 -1
  1280. package/src/engine/platform/WebEnginePlatform.js +1 -2
  1281. package/src/engine/scene/SerializedScene.d.ts +2 -2
  1282. package/src/engine/scene/SerializedScene.d.ts.map +1 -1
  1283. package/src/engine/scene/transitionToScene.js +121 -121
  1284. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  1285. package/src/engine/simulation/Ticker.js +33 -0
  1286. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +345 -345
  1287. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +140 -140
  1288. package/src/engine/sound/simulation/AcousticSimulator.js +646 -646
  1289. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +432 -432
  1290. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +250 -250
  1291. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +322 -322
  1292. package/src/engine/sound/simulation/README.md +277 -277
  1293. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +261 -261
  1294. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +121 -121
  1295. package/src/engine/sound/simulation/configureAcousticSimulation.js +48 -48
  1296. package/src/engine/sound/simulation/core/AcousticMedium.js +113 -113
  1297. package/src/engine/sound/simulation/core/AcousticMediumSerializationAdapter.js +27 -27
  1298. package/src/engine/sound/simulation/core/AcousticOccluderIndex.js +312 -312
  1299. package/src/engine/sound/simulation/core/AcousticRegionIndex.js +159 -159
  1300. package/src/engine/sound/simulation/core/AcousticSolution.js +90 -90
  1301. package/src/engine/sound/simulation/core/AcousticSourceState.js +109 -109
  1302. package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +73 -73
  1303. package/src/engine/sound/simulation/core/OcclusionSolver.js +112 -112
  1304. package/src/engine/sound/simulation/core/RayHit.js +50 -50
  1305. package/src/engine/sound/simulation/core/VolumeField.js +149 -149
  1306. package/src/engine/sound/simulation/definition/AcousticDirectivity.js +114 -114
  1307. package/src/engine/sound/simulation/definition/AcousticDirectivitySerializationAdapter.js +30 -30
  1308. package/src/engine/sound/simulation/definition/AcousticMaterial.js +122 -122
  1309. package/src/engine/sound/simulation/definition/AcousticMaterialSerializationAdapter.js +32 -32
  1310. package/src/engine/sound/simulation/ecs/AcousticBody.js +48 -48
  1311. package/src/engine/sound/simulation/ecs/AcousticBodySerializationAdapter.js +34 -34
  1312. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +64 -64
  1313. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +75 -75
  1314. package/src/engine/sound/simulation/ecs/AcousticVolume.js +74 -74
  1315. package/src/engine/sound/simulation/ecs/AcousticVolumeSerializationAdapter.js +37 -37
  1316. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +66 -66
  1317. package/src/engine/sound/simulation/probe/AcousticProbeField.js +578 -578
  1318. package/src/engine/sound/simulation/probe/AcousticProbeFieldSerializationAdapter.js +60 -60
  1319. package/src/engine/sound/simulation/probe/ProbeFieldPathingSolution.js +64 -64
  1320. package/src/engine/sound/simulation/probe/ProbeVisibilityRecheck.js +132 -132
  1321. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.js +103 -103
  1322. package/src/engine/sound/simulation/probe/acoustic_trace_energy.js +136 -136
  1323. package/src/engine/sound/simulation/probe/bakeProbeField.js +169 -169
  1324. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +110 -110
  1325. package/src/engine/sound/simulation/probe/bakeReverbBands.js +110 -110
  1326. package/src/engine/sound/simulation/probe/bakeVisibility.js +148 -148
  1327. package/src/engine/sound/simulation/probe/echogram_band_rt60.js +83 -83
  1328. package/src/engine/sound/simulation/probe/probe_delaunay_edges.js +215 -215
  1329. package/src/engine/sound/simulation/probe/probe_densify_portals.js +140 -140
  1330. package/src/engine/sound/simulation/probe/probe_detect_portals.js +196 -196
  1331. package/src/engine/sound/simulation/probe/probe_edge_key.js +38 -38
  1332. package/src/engine/sound/simulation/probe/probe_edge_visible.js +41 -41
  1333. package/src/engine/sound/simulation/probe/probe_place_sdf_cover.js +82 -82
  1334. package/src/engine/sound/simulation/probe/probe_refine_connectivity.js +181 -181
  1335. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +171 -171
  1336. package/src/engine/sound/simulation/probe/probe_visibility_augment.js +146 -146
  1337. package/src/engine/sound/simulation/probe/probe_visibility_bridge_components.js +167 -167
  1338. package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +354 -354
  1339. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +231 -231
  1340. package/src/engine/sound/simulation/render/foaReverbImpulseResponse.js +105 -105
  1341. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +66 -66
  1342. package/src/engine/sound/simulation/render/reverb_band_tails.js +93 -93
  1343. package/src/engine/sound/simulation/serialization/populateAcousticSerializationRegistry.js +25 -25
  1344. package/src/engine/sound/sopra/README.md +643 -643
  1345. package/src/engine/sound/sopra/SopraEngine.js +432 -432
  1346. package/src/engine/sound/sopra/asset/AssetManagerBufferProvider.js +71 -71
  1347. package/src/engine/sound/sopra/asset/BufferProvider.js +29 -29
  1348. package/src/engine/sound/sopra/asset/StubBufferProvider.js +58 -58
  1349. package/src/engine/sound/sopra/definition/BusDefinition.js +142 -142
  1350. package/src/engine/sound/sopra/definition/BusDefinitionSerializationAdapter.js +54 -54
  1351. package/src/engine/sound/sopra/definition/DuckingRule.js +106 -106
  1352. package/src/engine/sound/sopra/definition/DuckingRuleSerializationAdapter.js +31 -31
  1353. package/src/engine/sound/sopra/definition/EventDescription.js +262 -262
  1354. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +55 -55
  1355. package/src/engine/sound/sopra/definition/MixerSnapshot.js +83 -83
  1356. package/src/engine/sound/sopra/definition/MixerSnapshotSerializationAdapter.js +39 -39
  1357. package/src/engine/sound/sopra/definition/ParameterDefinition.js +117 -117
  1358. package/src/engine/sound/sopra/definition/ParameterDefinitionSerializationAdapter.js +31 -31
  1359. package/src/engine/sound/sopra/definition/VoiceStealMode.js +18 -18
  1360. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +109 -109
  1361. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +185 -185
  1362. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +59 -59
  1363. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +128 -128
  1364. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +226 -226
  1365. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClipSerializationAdapter.js +54 -54
  1366. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +191 -191
  1367. package/src/engine/sound/sopra/definition/clip/SampleAudioClipSerializationAdapter.js +39 -39
  1368. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +79 -79
  1369. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClipSerializationAdapter.js +42 -42
  1370. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +77 -77
  1371. package/src/engine/sound/sopra/definition/clip/SilenceAudioClipSerializationAdapter.js +27 -27
  1372. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +5 -0
  1373. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  1374. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +125 -125
  1375. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClipSerializationAdapter.js +41 -41
  1376. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +24 -24
  1377. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +120 -120
  1378. package/src/engine/sound/sopra/definition/effect/CompressorEffectSerializationAdapter.js +31 -31
  1379. package/src/engine/sound/sopra/definition/effect/EqEffect.js +128 -128
  1380. package/src/engine/sound/sopra/definition/effect/EqEffectSerializationAdapter.js +29 -29
  1381. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +113 -113
  1382. package/src/engine/sound/sopra/definition/effect/ReverbEffectSerializationAdapter.js +25 -25
  1383. package/src/engine/sound/sopra/runtime/BusGraph.js +231 -231
  1384. package/src/engine/sound/sopra/runtime/ParameterStore.js +98 -98
  1385. package/src/engine/sound/sopra/runtime/SopraPlaybackContext.js +68 -68
  1386. package/src/engine/sound/sopra/runtime/Voice.js +145 -145
  1387. package/src/engine/sound/sopra/runtime/VoiceManager.js +136 -136
  1388. package/src/engine/sound/sopra/runtime/VoicePool.js +17 -17
  1389. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +42 -42
  1390. package/src/engine/sound/sopra/serialization/sopraJSON.js +99 -99
  1391. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +49 -49
  1392. package/src/engine/sound/sopra/util/MockAudioContext.js +224 -224
  1393. package/src/engine/sound/sopra/util/fadeOutAndStop.js +60 -60
  1394. package/src/engine/ui/DraggableAspect.js +115 -115
  1395. package/src/engine/ui/apply_pointer_tilt_3d.js +50 -50
  1396. package/src/generation/COORDINATES.md +54 -54
  1397. package/src/generation/GridGenerationResource.js +24 -24
  1398. package/src/generation/GridTaskGroup.js +214 -214
  1399. package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -628
  1400. package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -79
  1401. package/src/generation/automata/CellularAutomata.js +22 -22
  1402. package/src/generation/compute_writes_union.js +25 -25
  1403. package/src/generation/filtering/CellFilter.js +117 -117
  1404. package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -37
  1405. package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -43
  1406. package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -29
  1407. package/src/generation/filtering/numeric/process/computeCellFilterSobel.js +36 -36
  1408. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -42
  1409. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +18 -18
  1410. package/src/generation/filtering/numeric/util/write_cell_filter_to_sampler2d.js +47 -47
  1411. package/src/generation/filtering/util/cell_filter_weights_pick.js +54 -54
  1412. package/src/generation/grid/GridData.js +233 -233
  1413. package/src/generation/grid/coords/grid_to_texel.js +10 -10
  1414. package/src/generation/grid/coords/texel_to_grid.js +10 -10
  1415. package/src/generation/grid/generation/GridTaskApplyActionToCells.js +90 -90
  1416. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +388 -388
  1417. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +127 -127
  1418. package/src/generation/grid/generation/GridTaskSequence.js +58 -58
  1419. package/src/generation/grid/generation/NoopGridTaskGenerator.js +12 -12
  1420. package/src/generation/grid/generation/discrete/GridTaskActionRuleSet.js +48 -48
  1421. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +146 -146
  1422. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +540 -540
  1423. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +222 -222
  1424. package/src/generation/grid/generation/grid/GridTaskAddNodesFixed.js +44 -44
  1425. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +614 -614
  1426. package/src/generation/markers/GridCellActionPlaceMarker.js +244 -244
  1427. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +86 -86
  1428. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +266 -266
  1429. package/src/generation/markers/emitter/MarkerNodeEmitterGridCellAction.js +49 -49
  1430. package/src/generation/placement/GridCellActionTransformNearbyMarkers.js +120 -120
  1431. package/src/generation/placement/action/GridCellAction.js +45 -45
  1432. package/src/generation/placement/action/GridCellActionPlaceTags.js +140 -140
  1433. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +89 -89
  1434. package/src/generation/placement/action/random/CellActionSelectRandom.js +69 -69
  1435. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +91 -91
  1436. package/src/generation/placement/action/util/GridCellActionSequence.js +61 -61
  1437. package/src/generation/placement/action/util/GridCellDisplacedAction.js +61 -61
  1438. package/src/generation/rules/cell/CellMatcherRemovalPreservesConnectivity.js +183 -183
  1439. package/src/generation/theme/ThemeEngine.js +666 -666
  1440. package/src/shade/RENDERER_CONTRACT.md +568 -568
  1441. package/src/shade/descriptor/texture/format/gpu_texture_format_info.js +267 -267
  1442. package/src/shade/device/ShadeDeviceFailure.js +104 -104
  1443. package/src/shade/device/ShadeDeviceFailureReason.js +41 -41
  1444. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +255 -255
  1445. package/src/shade/device/mock/REVIEW_2026_08_22.md +527 -527
  1446. package/src/shade/device/mock/SoftwareGPUBindGroup.js +23 -23
  1447. package/src/shade/device/mock/SoftwareGPUBindGroupLayout.js +22 -22
  1448. package/src/shade/device/mock/SoftwareGPUError.js +63 -63
  1449. package/src/shade/device/mock/SoftwareGPUPipeline.js +75 -75
  1450. package/src/shade/device/mock/SoftwareGPUQuerySet.js +113 -113
  1451. package/src/shade/device/mock/SoftwareGPUSampler.js +30 -30
  1452. package/src/shade/device/mock/SoftwareGPUShaderModule.js +32 -32
  1453. package/src/shade/device/mock/SoftwareGPUTextureView.js +22 -22
  1454. package/src/shade/device/mock/SoftwareGPUUncapturedErrorEvent.js +23 -23
  1455. package/src/shade/device/mock/normalize_dynamic_offsets.js +26 -26
  1456. package/src/shade/device/mock/texture_copy.js +287 -287
  1457. package/src/shade/device/timing/GPUTimer.js +285 -285
  1458. package/src/shade/device/timing/GPUTimerArray.js +205 -205
  1459. package/src/shade/playground/add_random_lights.js +49 -49
  1460. package/src/shade/playground/add_random_meshes.js +83 -83
  1461. package/src/shade/playground/animation_prototype.js +508 -508
  1462. package/src/shade/playground/animation_prototype_skinning.js +647 -647
  1463. package/src/shade/playground/animation_prototype_stress.js +765 -765
  1464. package/src/shade/playground/enable_picker.js +59 -59
  1465. package/src/shade/playground/gltf_skinned_prototype.js +560 -560
  1466. package/src/shade/playground/gltf_skinned_stress_prototype.js +387 -387
  1467. package/src/shade/playground/gltf_viewer.js +282 -282
  1468. package/src/shade/playground/load_default_environment.js +19 -19
  1469. package/src/shade/playground/main.js +2727 -2727
  1470. package/src/shade/playground/make_animated_instances.js +117 -117
  1471. package/src/shade/playground/prototype_virtual_texture.js +274 -274
  1472. package/src/shade/playground/prototype_volumetrics_01.js +206 -206
  1473. package/src/shade/playground/sample.js +234 -234
  1474. package/src/shade/playground/sample_load_gltf.js +102 -102
  1475. package/src/shade/playground/spread_node3d_grid.js +19 -19
  1476. package/src/shade/renderer/Renderer.js +2436 -2436
  1477. package/src/shade/renderer/ShadeIndirectLightingMode.js +14 -14
  1478. package/src/shade/renderer/animation/ShadeAnimationChannel.js +414 -414
  1479. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +531 -531
  1480. package/src/shade/renderer/animation/pose/PosePlayback.js +55 -55
  1481. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +179 -179
  1482. package/src/shade/renderer/animation/pose/pose_evaluate_world.js +76 -76
  1483. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +1024 -1024
  1484. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +79 -79
  1485. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +56 -56
  1486. package/src/shade/renderer/binding/BindGroupManager.js +282 -282
  1487. package/src/shade/renderer/binding/adapt_cache_capacity.js +25 -25
  1488. package/src/shade/renderer/buffer/GPUBufferAllocator.js +116 -116
  1489. package/src/shade/renderer/buffer/buffer_pool_ops.js +123 -123
  1490. package/src/shade/renderer/buffer/table/GPU_DATABASE_PAGE_SIZE.js +9 -9
  1491. package/src/shade/renderer/buffer/table/GPU_DATABASE_UPLOAD_BUFFER_LIMIT.js +8 -8
  1492. package/src/shade/renderer/buffer/table/PageBufferPool.js +71 -71
  1493. package/src/shade/renderer/buffer/table/PageSlotAllocator.js +95 -95
  1494. package/src/shade/renderer/camera/Camera.js +281 -281
  1495. package/src/shade/renderer/camera/GPUCameraContext.js +233 -233
  1496. package/src/shade/renderer/camera/orbital/README.md +84 -84
  1497. package/src/shade/renderer/deferred/shader_composite_volumetrics.js +75 -75
  1498. package/src/shade/renderer/dynamic/DYNAMIC_MESH_VERTEX.js +25 -25
  1499. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +342 -342
  1500. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  1501. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +170 -170
  1502. package/src/shade/renderer/extension/FrameContext.js +263 -263
  1503. package/src/shade/renderer/extension/FramePhase.js +104 -104
  1504. package/src/shade/renderer/extension/FrameRecord.js +126 -126
  1505. package/src/shade/renderer/extension/GBufferTextures.js +83 -83
  1506. package/src/shade/renderer/extension/PresentTarget.js +34 -34
  1507. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  1508. package/src/shade/renderer/extension/RenderExtension.js +69 -69
  1509. package/src/shade/renderer/extension/RenderExtensionRegistry.js +319 -319
  1510. package/src/shade/renderer/extension/SceneColor.js +40 -40
  1511. package/src/shade/renderer/extension/ViewTextures.js +78 -78
  1512. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +182 -182
  1513. package/src/shade/renderer/geometry/Geometry.js +608 -608
  1514. package/src/shade/renderer/geometry/geometry_build_from_meshlet_geometry.js +342 -342
  1515. package/src/shade/renderer/geometry/meshlet_geometry_transfer.js +41 -41
  1516. package/src/shade/renderer/geometry/primitives/make_box_geometry.js +153 -153
  1517. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +240 -240
  1518. package/src/shade/renderer/geometry/primitives/make_plane_geometry.js +145 -145
  1519. package/src/shade/renderer/geometry/primitives/make_polyhedron_geometry.js +327 -327
  1520. package/src/shade/renderer/geometry/primitives/make_torus_geometry.js +107 -107
  1521. package/src/shade/renderer/geometry/primitives/make_torus_knot_geometry.js +165 -165
  1522. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +607 -607
  1523. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +66 -66
  1524. package/src/shade/renderer/geometry/virtual/build/VGeoBuildResult.js +32 -32
  1525. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.js +103 -103
  1526. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.js +25 -25
  1527. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.js +33 -33
  1528. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.js +62 -62
  1529. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.js +49 -49
  1530. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.js +20 -20
  1531. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.js +214 -214
  1532. package/src/shade/renderer/geometry/virtual/build/gltf/GltfByteSource.js +122 -122
  1533. package/src/shade/renderer/geometry/virtual/build/gltf/GltfCollectReport.js +29 -29
  1534. package/src/shade/renderer/geometry/virtual/build/gltf/GltfDocument.js +210 -210
  1535. package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometry.js +48 -48
  1536. package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometryInstance.js +25 -25
  1537. package/src/shade/renderer/geometry/virtual/build/gltf/GltfGeometrySelection.js +28 -28
  1538. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +296 -296
  1539. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +166 -166
  1540. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_read_geometry.js +199 -199
  1541. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +173 -173
  1542. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.js +28 -28
  1543. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +200 -200
  1544. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.js +1786 -1786
  1545. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.js +157 -157
  1546. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.js +26 -26
  1547. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.js +75 -75
  1548. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.js +143 -143
  1549. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.js +44 -44
  1550. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.js +41 -41
  1551. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.js +71 -71
  1552. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.js +123 -123
  1553. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.js +26 -26
  1554. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.js +112 -112
  1555. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.js +56 -56
  1556. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.js +70 -70
  1557. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.js +187 -187
  1558. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.js +207 -207
  1559. package/src/shade/renderer/geometry/virtual/format/VGEO_DEFECT.js +18 -18
  1560. package/src/shade/renderer/geometry/virtual/format/VGeoDefect.js +38 -38
  1561. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +64 -64
  1562. package/src/shade/renderer/geometry/virtual/format/attribute/VGEO_ATTRIBUTE.js +13 -13
  1563. package/src/shade/renderer/geometry/virtual/format/attribute/VGEO_ATTRIBUTES.js +50 -50
  1564. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attribute_allocate.js +28 -28
  1565. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attribute_mask.js +23 -23
  1566. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +31 -31
  1567. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.js +32 -32
  1568. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +46 -46
  1569. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +19 -19
  1570. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.js +27 -27
  1571. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_asset_id_preimage.js +62 -62
  1572. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
  1573. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
  1574. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
  1575. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
  1576. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +20 -20
  1577. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_RECORD_SIZE.js +5 -5
  1578. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CHILD_REF.js +5 -5
  1579. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js +5 -5
  1580. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js +5 -5
  1581. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_NO_CHILD.js +5 -5
  1582. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_NO_GROUP.js +5 -5
  1583. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_SAME_PAGE.js +6 -6
  1584. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +81 -81
  1585. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryGroup.js +37 -37
  1586. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryPageNode.js +55 -55
  1587. package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_BLOCK_RECORDS.js +5 -5
  1588. package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_FLAG_ROOT_PAGE.js +5 -5
  1589. package/src/shade/renderer/geometry/virtual/format/directory/VGEO_DIRECTORY_RECORD_SIZE.js +5 -5
  1590. package/src/shade/renderer/geometry/virtual/format/directory/vgeo_directory_block_count.js +12 -12
  1591. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CHILD_OFFSET.js +11 -11
  1592. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CHILD_TABLE_ENTRY_SIZE.js +5 -5
  1593. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +11 -11
  1594. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_RAW.js +5 -5
  1595. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_ALIGNMENT.js +5 -5
  1596. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_HEADER_SIZE.js +5 -5
  1597. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_FRAME_OFFSET.js +13 -13
  1598. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_PAGE_MAGIC.js +5 -5
  1599. package/src/shade/renderer/geometry/virtual/format/frame/VGeoFrameBlob.js +21 -21
  1600. package/src/shade/renderer/geometry/virtual/format/frame/VGeoFrameExtent.js +59 -59
  1601. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +27 -27
  1602. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +84 -84
  1603. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +56 -56
  1604. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +35 -35
  1605. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_scan_frames.js +74 -74
  1606. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +6 -6
  1607. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HASH_ALGO_XXH3.js +5 -5
  1608. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +31 -31
  1609. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_SIZE.js +5 -5
  1610. package/src/shade/renderer/geometry/virtual/format/header/VGEO_LEVEL_OFFSET.js +20 -20
  1611. package/src/shade/renderer/geometry/virtual/format/header/VGEO_LEVEL_RECORD_SIZE.js +9 -9
  1612. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAGIC.js +5 -5
  1613. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +5 -5
  1614. package/src/shade/renderer/geometry/virtual/format/header/VGEO_PAYLOAD_ENCODING_SHADE_MESHLET_V1.js +5 -5
  1615. package/src/shade/renderer/geometry/virtual/format/header/VGeoLevelRecord.js +41 -41
  1616. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_RECORD_SIZE.js +5 -5
  1617. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_GROUP_CLUSTER_COUNT.js +6 -6
  1618. package/src/shade/renderer/geometry/virtual/format/page/VGEO_METRIC_OFFSET.js +21 -21
  1619. package/src/shade/renderer/geometry/virtual/format/page/VGEO_METRIC_SIZE.js +5 -5
  1620. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_FANOUT.js +9 -9
  1621. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_FLAG_LEAF.js +5 -5
  1622. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_OFFSET.js +10 -10
  1623. package/src/shade/renderer/geometry/virtual/format/page/VGEO_NODE_RECORD_SIZE.js +5 -5
  1624. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_HEADER_SIZE.js +5 -5
  1625. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -16
  1626. package/src/shade/renderer/geometry/virtual/format/payload/VGEO_ENCODING_FLAGS_MASK.js +6 -6
  1627. package/src/shade/renderer/geometry/virtual/format/payload/VGeoEncodedPayload.js +18 -18
  1628. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +200 -200
  1629. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_payload_attribute_offset.js +39 -39
  1630. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_payload_size.js +20 -20
  1631. package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +2063 -2063
  1632. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +1622 -1622
  1633. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +485 -485
  1634. package/src/shade/renderer/gpu_primitive/sort/ffx/graph_radix_sort.js +115 -115
  1635. package/src/shade/renderer/gpu_primitive/sort/one_sweep/verify_radix_sort_one_sweep.js +110 -110
  1636. package/src/shade/renderer/light/environment/octahedral_resample_kernel.js +50 -50
  1637. package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +30 -30
  1638. package/src/shade/renderer/light/environment/resample_cube_to_octahedral.js +157 -157
  1639. package/src/shade/renderer/light/make_sunlight.js +35 -35
  1640. package/src/shade/renderer/light/model/io/light_record_point.js +39 -39
  1641. package/src/shade/renderer/loader/gltf/GLTF_PRIMITIVE_MODE.js +23 -23
  1642. package/src/shade/renderer/loader/gltf/MESHOPT_COMPRESSION_PLAN.md +793 -793
  1643. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtension.js +54 -54
  1644. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.js +109 -109
  1645. package/src/shade/renderer/loader/gltf/ext/gltf_apply_buffer_view_extensions.js +69 -69
  1646. package/src/shade/renderer/loader/gltf/ext/gltf_buffer_view_extensions.js +22 -22
  1647. package/src/shade/renderer/loader/gltf/ext/gltf_geometry_extensions.js +39 -39
  1648. package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.js +301 -301
  1649. package/src/shade/renderer/loader/gltf/gltf_component_type.js +223 -223
  1650. package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.js +137 -137
  1651. package/src/shade/renderer/loader/gltf/gltf_parse_container.js +241 -241
  1652. package/src/shade/renderer/loader/gltf/gltf_read_accessor.js +294 -294
  1653. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.js +49 -49
  1654. package/src/shade/renderer/loader/gltf/load_gltf.js +1253 -1253
  1655. package/src/shade/renderer/loader/gltf/tiny-gltf.js +646 -646
  1656. package/src/shade/renderer/loader/usd/UsdError.js +33 -33
  1657. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +69 -69
  1658. package/src/shade/renderer/loader/usd/load_usd.js +226 -226
  1659. package/src/shade/renderer/loader/usd/parse_usda.js +931 -931
  1660. package/src/shade/renderer/loader/usd/unpack_usdz.js +106 -106
  1661. package/src/shade/renderer/loader/usd/usd_build_scene.js +658 -658
  1662. package/src/shade/renderer/loader/usd/usd_compose_transform.js +258 -258
  1663. package/src/shade/renderer/loader/usd/usd_decode_image.js +384 -384
  1664. package/src/shade/renderer/loader/usd/usd_lz4.js +182 -182
  1665. package/src/shade/renderer/loader/usd/usd_triangulate.js +159 -159
  1666. package/src/shade/renderer/material/ShadeMaterial.d.ts +2 -2
  1667. package/src/shade/renderer/material/ShadeMaterial.js +2 -2
  1668. package/src/shade/renderer/material/standard/fragment_gbuffer.js +334 -334
  1669. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  1670. package/src/shade/renderer/material/standard/material_gbuffer_vertex.js +45 -45
  1671. package/src/shade/renderer/material/standard_material_to_struct.js +23 -23
  1672. package/src/shade/renderer/particles/prototypeParticleSystem.js +450 -450
  1673. package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +52 -52
  1674. package/src/shade/renderer/pool/TransientResourcePool.js +392 -392
  1675. package/src/shade/renderer/postprocess/bloom/bloom_chain_resolution.js +29 -29
  1676. package/src/shade/renderer/postprocess/bloom/graph_bloom_downsample.js +109 -109
  1677. package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +155 -155
  1678. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +114 -114
  1679. package/src/shade/renderer/postprocess/dof/DOF_AUTOFOCUS_PARAMS_STRUCT.js +25 -25
  1680. package/src/shade/renderer/postprocess/dof/DOF_FOCUS_STATE_STRUCT.js +23 -23
  1681. package/src/shade/renderer/postprocess/dof/DOF_PRESETS.js +27 -27
  1682. package/src/shade/renderer/postprocess/dof/chunk_dof_coc_band_diameter.js +41 -41
  1683. package/src/shade/renderer/postprocess/dof/chunk_dof_coc_band_radius.js +32 -32
  1684. package/src/shade/renderer/postprocess/dof/chunk_dof_coc_coefficient.js +26 -26
  1685. package/src/shade/renderer/postprocess/dof/compute_dof_autofocus_params.js +64 -64
  1686. package/src/shade/renderer/postprocess/dof/compute_dof_uniform.js +54 -54
  1687. package/src/shade/renderer/postprocess/dof/gather/DOF2_CONFIG.js +91 -91
  1688. package/src/shade/renderer/postprocess/dof/gather/DOF2_PRESETS.js +9 -9
  1689. package/src/shade/renderer/postprocess/dof/gather/DOF2_SETTINGS_STRUCT.js +66 -66
  1690. package/src/shade/renderer/postprocess/dof/gather/DOF2_TEXTURE_FORMAT.js +22 -22
  1691. package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +292 -292
  1692. package/src/shade/renderer/postprocess/dof/gather/chunk_dof2_coc_to_near_far.js +25 -25
  1693. package/src/shade/renderer/postprocess/dof/gather/chunk_dof2_gather_weight.js +30 -30
  1694. package/src/shade/renderer/postprocess/dof/gather/compute_dof2_uniform.js +54 -54
  1695. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +194 -194
  1696. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_fill.js +68 -68
  1697. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +140 -140
  1698. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +142 -142
  1699. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +99 -99
  1700. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +102 -102
  1701. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_tile_dilate.js +75 -75
  1702. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_tile_max.js +73 -73
  1703. package/src/shade/renderer/postprocess/dof/raymarch/DOF_SETTINGS_STRUCT.js +49 -49
  1704. package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +298 -298
  1705. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +244 -244
  1706. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +91 -91
  1707. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_firefly_cleanup.js +61 -61
  1708. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +90 -90
  1709. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +267 -267
  1710. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +271 -271
  1711. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_tile_dilate.js +70 -70
  1712. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_tile_max.js +72 -72
  1713. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +99 -99
  1714. package/src/shade/renderer/postprocess/gtao/generate_magic_square_noise.js +51 -51
  1715. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +56 -56
  1716. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +78 -78
  1717. package/src/shade/renderer/postprocess/upscale-dither/UpscaleDither.js +95 -95
  1718. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +204 -204
  1719. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +58 -58
  1720. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +230 -230
  1721. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +278 -278
  1722. package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.js +26 -26
  1723. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  1724. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +235 -235
  1725. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +208 -208
  1726. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +206 -206
  1727. package/src/shade/renderer/scene/DynamicMesh.js +70 -70
  1728. package/src/shade/renderer/scene/DynamicMeshBatch.js +90 -90
  1729. package/src/shade/renderer/scene/GPUSceneContext.js +901 -901
  1730. package/src/shade/renderer/scene/SceneNodeBinding.js +56 -56
  1731. package/src/shade/renderer/scene/SkinnedMesh.js +55 -55
  1732. package/src/shade/renderer/scene/TransformAuthority.js +33 -33
  1733. package/src/shade/renderer/scene/optimization/deduplicate_geometries.js +38 -38
  1734. package/src/shade/renderer/scene/optimization/deduplicate_images.js +93 -93
  1735. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +127 -127
  1736. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +492 -492
  1737. package/src/shade/renderer/scene/optimization/optimize_texture_set.js +81 -81
  1738. package/src/shade/renderer/scene/optimization/source_to_sampler2d.js +21 -21
  1739. package/src/shade/renderer/scene/serialization/STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.js +12 -12
  1740. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_transform_point.js +26 -26
  1741. package/src/shade/renderer/shader/chunk/noise/chunk_interleaved_gradient_noise.js +20 -20
  1742. package/src/shade/renderer/shader/chunk/spherical_harmonics/dering/chunk_sh2_dering_optimize_positive.js +61 -61
  1743. package/src/shade/renderer/shader/chunk/texture/chunk_texture_filter_fxaa_lite.js +225 -225
  1744. package/src/shade/renderer/shader/chunk/texture/dither/chunk_dither_color_8bit_gradient_noise.js +25 -25
  1745. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +384 -384
  1746. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +105 -105
  1747. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +63 -63
  1748. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +89 -89
  1749. package/src/shade/renderer/shadow/map/shadowmap_update_score.js +232 -232
  1750. package/src/shade/renderer/texture/GPUTextureAllocator.js +85 -85
  1751. package/src/shade/renderer/texture/texture_pool_ops.js +171 -171
  1752. package/src/shade/renderer/texture/virtual/PageTableQuadAllocator.js +253 -253
  1753. package/src/shade/renderer/texture/virtual/README.md +276 -276
  1754. package/src/shade/renderer/texture/virtual/VTPageTable.js +330 -330
  1755. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +349 -349
  1756. package/src/shade/renderer/texture/virtual/VT_CONSTANTS.js +154 -154
  1757. package/src/shade/renderer/texture/virtual/VT_STACK_INFO_STRUCT.js +20 -20
  1758. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +1276 -1276
  1759. package/src/shade/renderer/texture/virtual/VirtualTextureStack.js +106 -106
  1760. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +150 -150
  1761. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +232 -232
  1762. package/src/shade/renderer/texture/virtual/chunk_vt_request_key.js +28 -28
  1763. package/src/shade/renderer/texture/virtual/source/VTSourceImage.js +207 -207
  1764. package/src/shade/renderer/texture/virtual/source/VTSourceProcedural.js +135 -135
  1765. package/src/shade/renderer/texture/virtual/source/VTSourceTiled.js +132 -132
  1766. package/src/shade/renderer/water/GPUWaterRenderer.js +167 -167
  1767. package/src/shade/renderer/water/shader_water.js +246 -246
  1768. package/src/shade/renderer/water/water_height_texture_from_sampler.js +56 -56
  1769. package/src/shade/vitest.setup.mjs +89 -89
  1770. package/src/shade/wgsl/validate_wgsl_source.js +316 -316
  1771. package/src/view/controller/controls/NumericIntervalControl.js +90 -90
  1772. package/src/view/controller/controls/Vector2Control.js +83 -83
  1773. package/src/view/controller/controls/Vector3Control.js +90 -90
  1774. package/src/view/elements/Group.js +56 -56
  1775. package/src/view/elements/drawCheckers.js +33 -33
  1776. package/src/view/elements/windrose/WindRoseDiagram.js +369 -369
  1777. package/src/view/graphics/WebGLContextFailureView.js +76 -76
  1778. package/src/view/layout/DockPanel.js +51 -51
  1779. package/src/view/layout/SplitView.js +365 -365
  1780. package/src/view/layout/show_popup_menu.js +81 -81
  1781. package/src/view/minimap/MinimapCanvasView.js +411 -411
  1782. package/src/view/minimap/MinimapImageCache.js +88 -88
  1783. package/src/view/minimap/MinimapMarkerCollection.d.ts +0 -1
  1784. package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
  1785. package/src/view/minimap/MinimapMarkerCollection.js +180 -180
  1786. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  1787. package/src/view/minimap/minimap_focus_area.js +97 -97
  1788. package/editor/process/symbolic/SocketsSymbolicDisplay.js +0 -192
  1789. package/src/core/geom/3d/topology/struct/binary/io/moved_tests.txt +0 -37
  1790. package/src/engine/ecs/attachment/Attachment.d.ts +0 -40
  1791. package/src/engine/ecs/attachment/Attachment.d.ts.map +0 -1
  1792. package/src/engine/ecs/attachment/Attachment.js +0 -57
  1793. package/src/engine/ecs/attachment/AttachmentBinding.d.ts +0 -28
  1794. package/src/engine/ecs/attachment/AttachmentBinding.d.ts.map +0 -1
  1795. package/src/engine/ecs/attachment/AttachmentBinding.js +0 -41
  1796. package/src/engine/ecs/attachment/AttachmentSystem.d.ts +0 -61
  1797. package/src/engine/ecs/attachment/AttachmentSystem.d.ts.map +0 -1
  1798. package/src/engine/ecs/attachment/AttachmentSystem.js +0 -307
  1799. package/src/engine/ecs/attachment/BoneAttachmentBinding.d.ts +0 -27
  1800. package/src/engine/ecs/attachment/BoneAttachmentBinding.d.ts.map +0 -1
  1801. package/src/engine/ecs/attachment/BoneAttachmentBinding.js +0 -69
  1802. package/src/engine/ecs/attachment/TransformAttachmentBinding.d.ts +0 -4
  1803. package/src/engine/ecs/attachment/TransformAttachmentBinding.d.ts.map +0 -1
  1804. package/src/engine/ecs/attachment/TransformAttachmentBinding.js +0 -51
  1805. package/src/engine/ecs/sockets/AttachmentSocket.d.ts +0 -32
  1806. package/src/engine/ecs/sockets/AttachmentSocket.d.ts.map +0 -1
  1807. package/src/engine/ecs/sockets/AttachmentSocket.js +0 -60
  1808. package/src/engine/ecs/sockets/AttachmentSocketType.d.ts +0 -6
  1809. package/src/engine/ecs/sockets/AttachmentSocketType.d.ts.map +0 -1
  1810. package/src/engine/ecs/sockets/AttachmentSocketType.js +0 -8
  1811. package/src/engine/ecs/sockets/AttachmentSockets.d.ts +0 -57
  1812. package/src/engine/ecs/sockets/AttachmentSockets.d.ts.map +0 -1
  1813. package/src/engine/ecs/sockets/AttachmentSockets.js +0 -130
  1814. package/src/engine/ecs/sockets/BoneAttachmentSocket.d.ts +0 -29
  1815. package/src/engine/ecs/sockets/BoneAttachmentSocket.d.ts.map +0 -1
  1816. package/src/engine/ecs/sockets/BoneAttachmentSocket.js +0 -56
  1817. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts +0 -6
  1818. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts.map +0 -1
  1819. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +0 -19
  1820. package/src/shade/renderer/animation/_dump_resolve.d.mts +0 -2
  1821. package/src/shade/renderer/animation/_dump_resolve.d.mts.map +0 -1
  1822. package/src/shade/renderer/animation/_dump_resolve.mjs +0 -5
@@ -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
+