@woosh/meep-engine 2.37.18 → 2.38.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 (289) hide show
  1. package/core/assert.js +1 -1
  2. package/core/binary/float2uint8.js +8 -0
  3. package/core/binary/uint82float.js +8 -0
  4. package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +6 -4
  5. package/core/collection/array/array_get_index_in_range.js +16 -0
  6. package/core/collection/array/typed/isTypedArray.js +20 -0
  7. package/core/collection/array/typedArrayToDataType.js +1 -0
  8. package/{engine/navigation/grid → core/collection/heap}/BinaryHeap.js +6 -1
  9. package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.js +3 -2
  10. package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.spec.js +3 -3
  11. package/core/collection/heap/Uin32Heap.spec.js +59 -0
  12. package/core/collection/heap/Uint32Heap.js +385 -0
  13. package/core/collection/list/List.d.ts +1 -1
  14. package/core/collection/table/RowFirstTable.js +34 -0
  15. package/core/collection/table/RowFirstTable.spec.js +59 -1
  16. package/core/color/Color.js +83 -1
  17. package/core/color/YCbCr_to_rgb_uint24.js +3 -4
  18. package/core/color/hsv2rgb.js +4 -3
  19. package/core/color/linear_to_sRGB.js +4 -5
  20. package/core/color/rgb2hex.js +1 -1
  21. package/core/color/rgb2uint24.js +6 -4
  22. package/core/color/rgb_to_YCbCr_uint24.js +11 -13
  23. package/core/events/signal/Signal.d.ts +11 -9
  24. package/core/events/signal/Signal.spec.js +16 -0
  25. package/core/geom/2d/quad-tree/qt_collect_by_circle.js +67 -0
  26. package/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js +9 -6
  27. package/core/geom/3d/topology/expandConnectivityByLocality.js +5 -5
  28. package/core/geom/3d/topology/query/query_edge_is_boundary.js +7 -0
  29. package/core/geom/3d/topology/query/query_edge_is_manifold.js +13 -0
  30. package/core/geom/3d/topology/query/query_edge_is_manifold_or_boundary.js +11 -0
  31. package/core/geom/3d/topology/query/query_edge_is_wire.js +13 -0
  32. package/core/geom/3d/topology/query/query_edge_other_vertex.js +20 -0
  33. package/core/geom/3d/topology/query/query_edge_share_vert.js +9 -0
  34. package/core/geom/3d/topology/query/query_face_get_other_edges.js +39 -0
  35. package/core/geom/3d/topology/query/query_face_next_vertex.js +19 -0
  36. package/core/geom/3d/topology/query/query_face_prev_vertex.js +18 -0
  37. package/core/geom/3d/topology/query/query_vertex_in_edge.js +14 -0
  38. package/core/geom/3d/topology/query/query_vertex_pair_share_face.js +24 -0
  39. package/core/geom/3d/topology/query/query_vertices_in_edge.js +19 -0
  40. package/core/geom/3d/topology/simplify/collapseEdge.spec.js +3 -5
  41. package/core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js +8 -10
  42. package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +12 -2
  43. package/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +277 -0
  44. package/core/geom/3d/topology/simplify/edge_collapse_quadratic.js +126 -0
  45. package/core/geom/3d/topology/simplify/prototypeMeshSimplification.js +502 -0
  46. package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +37 -5
  47. package/core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js +86 -1
  48. package/core/geom/3d/topology/simplify/simplifyTopoMesh.js +4 -4
  49. package/core/geom/3d/topology/simplify/simplifyTopoMesh2.js +119 -0
  50. package/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +81 -0
  51. package/core/geom/3d/topology/{TopoEdge.js → struct/TopoEdge.js} +47 -20
  52. package/core/geom/3d/topology/{TopoEdge.spec.js → struct/TopoEdge.spec.js} +0 -0
  53. package/core/geom/3d/topology/{TopoMesh.js → struct/TopoMesh.js} +20 -41
  54. package/core/geom/3d/topology/{TopoTriangle.js → struct/TopoTriangle.js} +15 -25
  55. package/core/geom/3d/topology/{TopoVertex.js → struct/TopoVertex.js} +21 -4
  56. package/core/geom/3d/topology/{TopoVertex.spec.js → struct/TopoVertex.spec.js} +0 -0
  57. package/core/geom/3d/topology/tm_edge_kill.js +24 -0
  58. package/core/geom/3d/topology/tm_edge_splice.js +42 -0
  59. package/core/geom/3d/topology/tm_face_area.js +18 -0
  60. package/core/geom/3d/topology/tm_face_kill.js +12 -0
  61. package/core/geom/3d/topology/tm_face_normal.js +14 -0
  62. package/core/geom/3d/topology/tm_kill_only_edge.js +35 -0
  63. package/core/geom/3d/topology/tm_kill_only_face.js +12 -0
  64. package/core/geom/3d/topology/tm_kill_only_vert.js +14 -0
  65. package/core/geom/3d/topology/tm_vert_kill.js +19 -0
  66. package/core/geom/3d/topology/tm_vert_splice.js +64 -0
  67. package/core/geom/3d/topology/tm_vertex_compute_normal.js +42 -0
  68. package/core/geom/3d/topology/topoMeshToBufferGeometry.js +18 -4
  69. package/core/geom/3d/topology/weld_duplicate_vertices.js +63 -0
  70. package/core/geom/Quaternion.d.ts +21 -1
  71. package/core/geom/Quaternion.js +279 -200
  72. package/core/geom/Quaternion.spec.js +71 -2
  73. package/core/geom/Vector2.js +3 -3
  74. package/core/geom/Vector3.d.ts +2 -0
  75. package/core/geom/Vector3.js +31 -7
  76. package/core/geom/Vector3.schema.json +16 -0
  77. package/core/geom/Vector4.js +16 -0
  78. package/core/geom/packing/MaxRectangles.js +1 -1
  79. package/core/graph/cluster_mesh_metis.js +16 -0
  80. package/core/graph/coarsen_graph.js +1 -1
  81. package/core/graph/graph_k_means_cluster.js +1 -1
  82. package/core/json/JsonUtils.js +2 -20
  83. package/core/math/bell_membership_function.js +19 -0
  84. package/core/math/exp2.js +8 -0
  85. package/core/math/interval/NumericInterval.js +17 -0
  86. package/core/math/physics/brdf/brdf_burley.js +25 -0
  87. package/core/math/physics/bsdf/bsdf_schlick.js +22 -0
  88. package/core/math/physics/irradiance/interpolate_irradiance_linear.js +18 -0
  89. package/{engine/sound/ecs/emitter/attenuate/attenuateSoundLogarithmic.js → core/math/physics/irradiance/interpolate_irradiance_lograrithmic.js} +2 -2
  90. package/{engine/sound/ecs/emitter/attenuate/attenuateSoundSmith.js → core/math/physics/irradiance/interpolate_irradiance_smith.js} +1 -1
  91. package/core/math/random/seededRandom.js +2 -31
  92. package/core/math/random/seededRandom_Mulberry32.js +31 -0
  93. package/core/math/random/seededRandom_sine.js +33 -0
  94. package/core/model/ObservedEnum.js +8 -0
  95. package/editor/Editor.js +97 -1
  96. package/editor/actions/concrete/ModifyPatchSampler2DAction.js +118 -0
  97. package/editor/actions/concrete/ModifyPatchSampler2DAction.spec.js +30 -0
  98. package/editor/actions/concrete/PatchTerrainHeightAction.js +13 -105
  99. package/editor/ecs/component/FieldDescriptor.js +34 -0
  100. package/editor/ecs/component/FieldValueAdapter.js +20 -0
  101. package/editor/ecs/component/TypeEditor.js +33 -0
  102. package/editor/ecs/component/TypeSchema.d.ts +38 -0
  103. package/editor/ecs/component/createFieldEditor.js +90 -0
  104. package/editor/ecs/component/createObjectEditor.js +266 -60
  105. package/editor/ecs/component/editors/ColorEditor.js +39 -0
  106. package/editor/ecs/component/editors/HTMLElementEditor.js +17 -0
  107. package/editor/ecs/component/editors/ImagePathEditor.js +50 -0
  108. package/editor/ecs/component/editors/NumericIntervalEditor.js +86 -0
  109. package/editor/ecs/component/editors/ObservedBooleanEditor.js +13 -0
  110. package/editor/ecs/component/editors/ObservedEnumEditor.js +32 -0
  111. package/editor/ecs/component/editors/ObservedIntegerEditor.js +43 -0
  112. package/editor/ecs/component/editors/ObservedStringEditor.js +51 -0
  113. package/editor/ecs/component/editors/Sampler2DEditor.js +107 -0
  114. package/editor/ecs/component/editors/collection/ListEditor.js +83 -0
  115. package/editor/ecs/component/editors/common/BitFlagsEditor.js +80 -0
  116. package/editor/ecs/component/editors/common/EnumEditor.js +41 -0
  117. package/editor/ecs/component/editors/common/makeV3_editor.js +85 -0
  118. package/editor/ecs/component/editors/common/noEditor.js +9 -0
  119. package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +17 -0
  120. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.js +16 -0
  121. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +44 -0
  122. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -0
  123. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.js +58 -0
  124. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.js +54 -0
  125. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.js +21 -0
  126. package/editor/ecs/component/editors/ecs/Trail2DEditor.js +33 -0
  127. package/editor/ecs/component/editors/ecs/TransformEditor.js +23 -0
  128. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.js +21 -0
  129. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +89 -0
  130. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.js +18 -0
  131. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.js +22 -0
  132. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.js +20 -0
  133. package/editor/ecs/component/editors/geom/QuaternionEditor.js +56 -0
  134. package/editor/ecs/component/editors/geom/Vector1Editor.js +57 -0
  135. package/editor/ecs/component/editors/geom/Vector2Editor.js +11 -0
  136. package/editor/ecs/component/editors/geom/Vector3Editor.js +13 -0
  137. package/editor/ecs/component/editors/geom/Vector4Editor.js +12 -0
  138. package/editor/ecs/component/editors/primitive/ArrayEditor.js +46 -0
  139. package/editor/ecs/component/editors/primitive/BooleanEditor.js +27 -0
  140. package/editor/ecs/component/editors/primitive/FunctionEditor.js +29 -0
  141. package/editor/ecs/component/editors/primitive/NumberEditor.js +60 -0
  142. package/editor/ecs/component/editors/primitive/ObjectEditor.js +12 -0
  143. package/editor/ecs/component/editors/primitive/StringEditor.js +31 -0
  144. package/editor/ecs/component/editors/three/BufferGeometryEditor.js +28 -0
  145. package/editor/ecs/component/editors/three/MaterialEditor.js +27 -0
  146. package/editor/ecs/component/editors/three/MeshEditor.js +35 -0
  147. package/editor/ecs/component/editors/three/TextureEditor.js +32 -0
  148. package/editor/ecs/component/findNearestRegisteredType.js +59 -0
  149. package/editor/ecs/component/prototypeObjectEditor.js +379 -0
  150. package/editor/tools/SelectionTool.js +1 -1
  151. package/editor/tools/paint/TerrainHeightPaintTool.js +88 -68
  152. package/editor/tools/paint/TerrainPaintTool.js +2 -1
  153. package/editor/tools/paint/TerrainTexturePaintTool.js +8 -73
  154. package/editor/view/EditorView.js +1 -1
  155. package/editor/view/ecs/ComponentControlView.js +2 -30
  156. package/editor/view/ecs/EntityEditor.js +61 -139
  157. package/editor/view/ecs/components/GridObstacleController.js +4 -4
  158. package/editor/view/ecs/components/TerrainController.js +1 -1
  159. package/editor/view/ecs/components/common/NumberController.js +19 -7
  160. package/editor/view/node-graph/NodeGraphView.js +2 -2
  161. package/editor/view/node-graph/NodeView.js +7 -9
  162. package/engine/animation/keyed2/AnimationTrack.js +1 -1
  163. package/engine/asset/AssetManager.d.ts +1 -1
  164. package/engine/asset/AssetManager.js +390 -388
  165. package/engine/asset/loaders/gltf/extensions/MSFT_texture_dds.js +14 -2
  166. package/engine/ecs/components/TagEditor.js +15 -0
  167. package/engine/ecs/fow/FogOfWarEditor.js +13 -0
  168. package/engine/ecs/parent/ParentEntitySystem.js +57 -0
  169. package/engine/ecs/terrain/ecs/OffsetScaleTransform2D.d.ts +6 -0
  170. package/engine/ecs/terrain/ecs/Terrain.js +44 -43
  171. package/engine/ecs/terrain/ecs/TerrainSystem.js +2 -2
  172. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +1 -1
  173. package/engine/ecs/terrain/ecs/splat/SplatMapping.js +26 -28
  174. package/engine/ecs/terrain/overlay/TerrainOverlay.js +71 -66
  175. package/engine/ecs/terrain/tiles/TerrainTileManager.js +23 -0
  176. package/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +1 -1
  177. package/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.js +13 -7
  178. package/engine/ecs/terrain/util/tensionOptimizeUV.js +1 -1
  179. package/engine/ecs/transform/Transform.d.ts +2 -0
  180. package/engine/ecs/transform/Transform.editor.schema.json +16 -0
  181. package/engine/ecs/transform/Transform.js +3 -0
  182. package/engine/graphics/ecs/highlight/HighlightEditor.js +17 -0
  183. package/engine/graphics/ecs/light/Light.js +0 -47
  184. package/engine/graphics/ecs/light/LightSerializationAdapter.js +50 -0
  185. package/engine/graphics/ecs/mesh/MeshEditor.js +28 -0
  186. package/engine/graphics/ecs/mesh-v2/DrawMode.js +2 -1
  187. package/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
  188. package/engine/graphics/ecs/mesh-v2/build_three_object.js +3 -1
  189. package/engine/graphics/ecs/mesh-v2/sg_compute_hierarchy_bounding_box_by_parent_entity.js +31 -0
  190. package/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.d.ts +4 -0
  191. package/engine/graphics/ecs/sprite/Sprite.js +11 -0
  192. package/engine/graphics/ecs/sprite/SpriteSystemPE.js +133 -0
  193. package/engine/graphics/ecs/sprite/prototypeSpriteSystem.js +1570 -0
  194. package/engine/graphics/micron/build/PatchRepresentation.js +7 -3
  195. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +18 -8
  196. package/engine/graphics/micron/build/clustering/build_clustering_2.js +1 -1
  197. package/engine/graphics/micron/build/clustering/build_leaf_patches.js +2 -2
  198. package/engine/graphics/micron/build/clustering/build_leaf_patches_metis.js +1 -1
  199. package/engine/graphics/micron/build/hierarchy/buildAbstractPatchHierarchy.js +21 -3
  200. package/engine/graphics/micron/build/hierarchy/merge_patches.js +96 -43
  201. package/engine/graphics/micron/build/hierarchy/qvdr_build_simplified_clusters.js +11 -5
  202. package/engine/graphics/micron/format/VirtualGeometry.js +46 -3
  203. package/engine/graphics/micron/format/micron_build_proxy_geometry.js +4 -2
  204. package/engine/graphics/micron/prototypeVirtualGeometry.js +47 -10
  205. package/engine/graphics/micron/render/instanced/shader/shader_rewrite_standard.js +17 -17
  206. package/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +15 -3
  207. package/engine/graphics/micron/simplifyGeometry.js +1 -1
  208. package/engine/graphics/particles/particular/engine/ParticularEngine.js +5 -0
  209. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +17 -9
  210. package/engine/graphics/particles/particular/engine/renderers/ParticleRenderer.js +12 -10
  211. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +7 -2
  212. package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticlePool.js +27 -0
  213. package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticleRenderer.js +80 -0
  214. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +16 -4
  215. package/engine/graphics/shaders/TerrainShader.js +8 -8
  216. package/engine/graphics/texture/atlas/TextureAtlasDebugger.js +2 -1
  217. package/engine/graphics/texture/sampler/Sampler2D.js +206 -201
  218. package/engine/graphics/texture/sampler/Sampler2D.spec.js +34 -35
  219. package/engine/graphics/texture/sampler/bicubic.js +59 -0
  220. package/engine/graphics/texture/sampler/downsampleSample2D.spec.js +2 -2
  221. package/engine/graphics/texture/sampler/genericResampleSampler2D.js +0 -2
  222. package/engine/graphics/texture/sampler/prototypeSamplerFiltering.js +146 -0
  223. package/engine/graphics/texture/sampler/{downsampleSampler2D.js → sampler2D_scale_down_linear.js} +8 -4
  224. package/engine/graphics/texture/sampler/sampler2_d_scale_down_lanczos.js +140 -0
  225. package/engine/graphics/texture/sampler/scaleSampler2D.js +3 -3
  226. package/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js +1 -1
  227. package/engine/graphics/util/ScaleObject3ToBox.js +14 -1
  228. package/engine/graphics/util/makeMeshPreviewScene.js +2 -1
  229. package/engine/grid/components/GridObstacle.js +0 -44
  230. package/engine/grid/components/GridObstacleSerializationAdapter.js +46 -0
  231. package/engine/input/devices/PointerDevice.d.ts +1 -1
  232. package/engine/input/devices/PointerDevice.js +17 -2
  233. package/engine/input/ecs/util/TerrainCameraTargetSampler.js +2 -2
  234. package/engine/navigation/ecs/components/Path.d.ts +2 -0
  235. package/engine/navigation/ecs/components/Path.js +6 -1
  236. package/engine/navigation/ecs/components/computeNonuniformCatmullRomSplineSample.js +117 -0
  237. package/engine/navigation/grid/AStar.js +1 -1
  238. package/engine/navigation/grid/GridField.js +3 -2
  239. package/engine/platform/GetURLHash.js +27 -0
  240. package/engine/platform/WebEnginePlatform.js +1 -22
  241. package/engine/sound/ecs/emitter/SoundEmitter.js +10 -6
  242. package/engine/ui/DraggableAspect.js +2 -2
  243. package/generation/GridGenerator.js +7 -6
  244. package/generation/example/SampleGenerator0.js +39 -35
  245. package/generation/example/filters/SampleGroundMoistureFilter.js +58 -17
  246. package/generation/example/generators/interactive/mir_generator_place_buff_objects.js +7 -6
  247. package/generation/example/generators/mir_generator_place_bases.js +7 -3
  248. package/generation/example/generators/mir_generator_place_road_decorators.js +3 -3
  249. package/generation/example/generators/mir_generator_place_starting_point.js +3 -2
  250. package/generation/example/themes/SampleTheme0.js +11 -7
  251. package/generation/filtering/numeric/CellFilterLiteralFloat.js +5 -0
  252. package/generation/filtering/numeric/complex/CellFilterDilate.js +36 -0
  253. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +15 -5
  254. package/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +53 -1
  255. package/generation/filtering/numeric/math/CellFilterMax2.js +3 -0
  256. package/generation/filtering/numeric/math/CellFilterMembershipGeneralizedBell.js +55 -0
  257. package/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +42 -0
  258. package/generation/filtering/numeric/sampling/CellFilterSampleLayerCubic.js +36 -0
  259. package/generation/filtering/numeric/sampling/CellFilterSampleLayerLinear.js +41 -0
  260. package/generation/grid/GridData.d.ts +5 -1
  261. package/generation/grid/GridData.js +35 -36
  262. package/generation/grid/MarkerMatchCounter.js +5 -3
  263. package/generation/grid/generation/discrete/GridTaskConnectRooms.js +1 -1
  264. package/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +1 -1
  265. package/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +1 -1
  266. package/generation/grid/generation/road/GridTaskGenerateRoads.js +1 -1
  267. package/generation/markers/GridActionRuleSet.js +15 -32
  268. package/generation/markers/GridCellActionPlaceMarker.js +12 -8
  269. package/generation/markers/debug/visualizeMarkers.js +56 -36
  270. package/generation/markers/emitter/MarkerNodeEmitterFromAction.js +8 -8
  271. package/generation/markers/prototypeGridCellActionPlaceMarker.js +209 -0
  272. package/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +1 -5
  273. package/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.spec.js +2 -2
  274. package/generation/placement/GridCellPlacementRule.js +31 -25
  275. package/generation/theme/ThemeEngine.js +1 -1
  276. package/package.json +1 -1
  277. package/samples/terrain/from_image.js +7 -3
  278. package/samples/terrain/main.js +1 -1
  279. package/view/View.js +23 -1
  280. package/view/common/LabelView.js +1 -1
  281. package/view/compose3x3transform.js +32 -8
  282. package/view/controller/dat/DatGuiUtils.js +1 -1
  283. package/view/elements/DropDownSelectionView.js +11 -3
  284. package/view/elements/image/ImageView.js +3 -1
  285. package/core/model/ObservedReal.js +0 -55
  286. package/editor/ecs/component/ObjectEditor.js +0 -0
  287. package/engine/graphics/particles/particular/engine/renderers/SoftBillboardParticleRenderer.js +0 -7
  288. package/engine/sound/ecs/emitter/attenuate/attenuateSoundLinear.js +0 -11
  289. package/generation/filtering/numeric/CellFilterReadGridLayer.js +0 -73
@@ -0,0 +1,502 @@
1
+ import {
2
+ AmbientLight,
3
+ CanvasTexture,
4
+ CubeTextureLoader,
5
+ DirectionalLight,
6
+ FrontSide,
7
+ Group,
8
+ Mesh,
9
+ MeshBasicMaterial,
10
+ MeshStandardMaterial,
11
+ PerspectiveCamera,
12
+ PlaneBufferGeometry,
13
+ PointLight,
14
+ RepeatWrapping,
15
+ Scene,
16
+ SphereBufferGeometry,
17
+ SphereGeometry,
18
+ sRGBEncoding,
19
+ TextureLoader,
20
+ VSMShadowMap,
21
+ WebGLRenderer
22
+ } from "three";
23
+ import { mergeVertices } from "three/examples/jsm/utils/BufferGeometryUtils.js";
24
+ import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
25
+ import Stats from "three/examples/jsm/libs/stats.module.js";
26
+ import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js";
27
+ import { topoMeshToBufferGeometry } from "../topoMeshToBufferGeometry.js";
28
+ import { TopoMesh } from "../struct/TopoMesh.js";
29
+ import {
30
+ deinterleaveBufferGeometry
31
+ } from "../../../../../engine/graphics/geometry/buffered/deinterleaveBufferGeometry.js";
32
+ import Vector3 from "../../../Vector3.js";
33
+ import { simplifyTopoMesh2 } from "./simplifyTopoMesh2.js";
34
+ import { scaleGeometryToBox } from "../../../../../engine/graphics/geometry/scaleGeometryToBox.js";
35
+ import { computeTopoMeshBoundiningBox } from "../bounds/computeTopoMeshBoundiningBox.js";
36
+ import { AABB3 } from "../../../../bvh2/aabb3/AABB3.js";
37
+ import { Color } from "../../../../color/Color.js";
38
+ import { clamp } from "../../../../math/clamp.js";
39
+
40
+
41
+ /**
42
+ *
43
+ * @param {string} text
44
+ * @returns {CanvasTexture}
45
+ */
46
+ function makeTextLabelTexture(text) {
47
+ const canvas = document.createElement('canvas');
48
+ canvas.width = 64;
49
+ canvas.height = 64;
50
+
51
+ const ctx = canvas.getContext('2d');
52
+ ctx.font = '42px Tahoma';
53
+ ctx.fillStyle = 'transparent';
54
+ ctx.fillRect(0, 0, 64, 64);
55
+ ctx.strokeStyle = `white`;
56
+ ctx.fillStyle = 'black';
57
+
58
+ const label_x = 34 - text.length * 12;
59
+ const label_y = 48;
60
+
61
+ ctx.strokeText(text, label_x, label_y);
62
+ ctx.fillText(text, label_x, label_y);
63
+
64
+ return new CanvasTexture(canvas);
65
+ }
66
+
67
+ /**
68
+ *
69
+ * @param {string|number} text
70
+ * @param {number} scale
71
+ * @param {boolean} depth_test
72
+ * @returns {THREE.Object3D}
73
+ */
74
+ function makeTextLabelMesh({ text, scale = 1, depth_test = false }) {
75
+ const g_text = new PlaneBufferGeometry(1, 1);
76
+
77
+ const mesh = new Mesh(g_text, new MeshBasicMaterial({
78
+ map: makeTextLabelTexture(text.toString()),
79
+ transparent: true,
80
+ depthTest: depth_test
81
+ }));
82
+
83
+ mesh.scale.setScalar(scale);
84
+
85
+ return mesh;
86
+ }
87
+
88
+ const background = new TextureLoader().load('data/textures/utility/checkers_white_grey_256x256.png');
89
+ background.repeat.set(50, 30);
90
+ background.wrapS = RepeatWrapping;
91
+ background.wrapT = RepeatWrapping;
92
+
93
+ let container, stats;
94
+
95
+ let camera, scene, renderer;
96
+ let directionalLight;
97
+ let pointLight;
98
+
99
+ let windowHalfX = window.innerWidth / 2;
100
+ let windowHalfY = window.innerHeight / 2;
101
+
102
+ function init() {
103
+
104
+ container = document.createElement("div");
105
+ document.body.appendChild(container);
106
+
107
+ document.body.style.margin = 0;
108
+
109
+ camera = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000000);
110
+ camera.position.z = 4000;
111
+
112
+ //
113
+
114
+
115
+ scene = new Scene();
116
+
117
+ window.scene = scene;
118
+
119
+ // LIGHTS
120
+
121
+ const ambient = new AmbientLight(0xffffff, 0.2);
122
+ scene.add(ambient);
123
+
124
+ pointLight = new PointLight(0x6666ff, 0.5);
125
+ pointLight.position.y = 1000;
126
+ scene.add(pointLight);
127
+
128
+ // light representation
129
+
130
+ const sphere = new SphereGeometry(100, 16, 8);
131
+
132
+ const mesh = new Mesh(sphere, new MeshBasicMaterial({ color: 0xffffff }));
133
+ mesh.scale.set(0.5, 0.5, 0.5);
134
+ pointLight.add(mesh);
135
+
136
+ // add directional light
137
+ directionalLight = new DirectionalLight(0xFFAAAA, 0.8);
138
+ directionalLight.position.set(-500, 1000, 300);
139
+ directionalLight.castShadow = true;
140
+ const shadow_camera = directionalLight.shadow.camera;
141
+ // small bias to prevent shadow acne
142
+ directionalLight.shadow.bias = -0.0001;
143
+ // directionalLight.shadow.mapSize.set(4096, 4096);
144
+ directionalLight.shadow.mapSize.set(1024, 1024);
145
+ directionalLight.shadow.autoUpdate = true;
146
+
147
+ window.light = directionalLight;
148
+ // directionalLight.shadow.autoUpdate = true;
149
+
150
+ shadow_camera.near = 0.1;
151
+ shadow_camera.far = 2000;
152
+
153
+ const shadow_camera_size = 15;
154
+
155
+ shadow_camera.left = -shadow_camera_size / 2;
156
+ shadow_camera.right = shadow_camera_size / 2;
157
+
158
+ shadow_camera.bottom = -shadow_camera_size / 2;
159
+ shadow_camera.top = shadow_camera_size / 2;
160
+
161
+ shadow_camera.updateProjectionMatrix();
162
+
163
+
164
+ scene.add(directionalLight);
165
+ // material samples
166
+
167
+ const cubeMaterial1 = new MeshStandardMaterial({
168
+ wireframe: false,
169
+ side: FrontSide,
170
+ color: 0xffffff
171
+ });
172
+
173
+ //
174
+
175
+ renderer = new WebGLRenderer({
176
+ antialias: true,
177
+ preserveDrawingBuffer: true,
178
+ stencil: false
179
+ });
180
+
181
+ renderer.shadowMap.enabled = true;
182
+ renderer.shadowMap.type = VSMShadowMap;
183
+ // renderer.shadowMap.type = BasicShadowMap;
184
+ renderer.sortObjects = false;
185
+
186
+ renderer.setPixelRatio(window.devicePixelRatio);
187
+ renderer.setSize(window.innerWidth, window.innerHeight);
188
+ container.appendChild(renderer.domElement);
189
+
190
+ stats = new Stats();
191
+ container.appendChild(stats.dom);
192
+
193
+
194
+ window.addEventListener("resize", onWindowResize);
195
+
196
+ // envmap
197
+ const genCubeUrls = function (prefix, postfix) {
198
+
199
+ return [
200
+ prefix + "posx" + postfix, prefix + "negx" + postfix,
201
+ prefix + "posy" + postfix, prefix + "negy" + postfix,
202
+ prefix + "posz" + postfix, prefix + "negz" + postfix
203
+ ];
204
+
205
+ };
206
+
207
+ const urls = genCubeUrls("data/textures/cubemaps/hip_miramar/32/", ".png");
208
+
209
+ new CubeTextureLoader().load(urls, function (cubeTexture) {
210
+
211
+ cubeTexture.encoding = sRGBEncoding;
212
+
213
+ // scene.background = new Color(0.1, 0.1, 0.1);
214
+ // scene.background = new ThreeColor(1, 0.3, 0.3);
215
+ // scene.background = new Color(0.3, 1, 0.3);
216
+
217
+ scene.background = background;
218
+ scene.environment = cubeTexture;
219
+
220
+
221
+ // const lightProbe = new LightProbe();
222
+ //
223
+ // lightProbe.copy(LightProbeGenerator.fromCubeTexture(cubeTexture));
224
+ // lightProbe.intensity = 1.2;
225
+
226
+ // scene.add(lightProbe);
227
+ });
228
+
229
+ onWindowResize();
230
+
231
+ /**
232
+ *
233
+ * @param {THREE.BufferGeometry} geometry
234
+ * @param {string|number} [color]
235
+ * @param {boolean} wireframe
236
+ * @returns {Group}
237
+ */
238
+ function build_preview_object({
239
+ geometry,
240
+ color = 0xFFFFFF,
241
+ wireframe = true
242
+ }) {
243
+
244
+ const source = new Group();
245
+
246
+ const source_solid = new Mesh(geometry, new MeshStandardMaterial({ color: color }));
247
+ source.add(source_solid);
248
+
249
+ if (wireframe) {
250
+ const c = new Color();
251
+ c.parse(color);
252
+
253
+ const hsv = c.getHSV();
254
+ hsv.v = clamp(hsv.v - 0.3, 0.2, 0.8);
255
+ hsv.s = clamp(hsv.s - 0.2, 0, 1);
256
+ hsv.h = (hsv.h + 0.333) % 1;
257
+
258
+ c.setHSV(hsv.h, hsv.s, hsv.v);
259
+
260
+ const source_wire = new Mesh(geometry, new MeshStandardMaterial({
261
+ color: c.toUint(),
262
+ wireframe: true,
263
+ depthTest: true,
264
+ polygonOffset: true,
265
+ polygonOffsetFactor: 1
266
+ }));
267
+ source.add(source_wire);
268
+ }
269
+
270
+
271
+ return source;
272
+ }
273
+
274
+
275
+ /**
276
+ *
277
+ * @param {number} steps
278
+ * @param {THREE.BufferGeometry} geo
279
+ * @param {Vector3} offset
280
+ * @param {Vector3} spacing
281
+ * @param {boolean} label_vertices
282
+ * @param {boolean} label_steps
283
+ */
284
+ function breakdown_simplification({
285
+ steps,
286
+ geo,
287
+ offset,
288
+ spacing,
289
+ label_vertices = true,
290
+ label_steps = true
291
+ }) {
292
+
293
+ const topology = new TopoMesh();
294
+ const faces_array = geo.getIndex().array;
295
+ topology.build(geo.getAttribute('position').array, faces_array);
296
+
297
+ for (let i = 0; i < steps; i++) {
298
+ if (i === 11) debugger;
299
+ simplifyTopoMesh2(topology, 1);
300
+
301
+ const simplified_bg = topoMeshToBufferGeometry(topology);
302
+ simplified_bg.computeVertexNormals();
303
+
304
+ const proxy = build_preview_object({ geometry: simplified_bg, color: 'rgb(255,90,90)' });
305
+
306
+ if (label_steps) {
307
+ const label_step = makeTextLabelMesh({ text: i, scale: 500 });
308
+
309
+ label_step.position.y += 700;
310
+
311
+ proxy.add(label_step);
312
+ }
313
+
314
+ if (label_vertices) {
315
+ topology.vertices.forEach(v => {
316
+ const l = makeTextLabelMesh({ text: v.index, scale: 70 });
317
+
318
+ l.position.set(v.x, v.y, v.z + 0.1);
319
+
320
+ proxy.add(l);
321
+ });
322
+ }
323
+
324
+ proxy.position.x = offset.x + spacing.x * i;
325
+ proxy.position.y = offset.y + spacing.y * i;
326
+ proxy.position.z = offset.z + spacing.z * i;
327
+
328
+ scene.add(proxy);
329
+ }
330
+ }
331
+
332
+ /**
333
+ *
334
+ * @param {THREE.BufferGeometry} input_geometry
335
+ * @param {number} [percent]
336
+ * @returns {Group}
337
+ */
338
+ function simplify_percent(input_geometry, percent = 0.5) {
339
+
340
+ const geo = mergeVertices(input_geometry);
341
+
342
+ const mesh = new TopoMesh();
343
+ const faces_array = geo.getIndex().array;
344
+ const position_attribute = geo.getAttribute('position');
345
+ const position_array = position_attribute.array;
346
+
347
+ console.time('topo build');
348
+ mesh.build(position_array, faces_array);
349
+ console.timeEnd('topo build');
350
+
351
+ console.log(`source topo: ${mesh}`);
352
+
353
+ const initial_face_count = mesh.getFaces().size;
354
+
355
+ const numFacesToRemove = Math.floor(initial_face_count * (1 - percent));
356
+ // const numFacesToRemove = Math.floor(faces_array.length / 3) - 12;
357
+
358
+ const mesh_bounds = new AABB3();
359
+ computeTopoMeshBoundiningBox(mesh_bounds, mesh)
360
+
361
+
362
+ // const weld_removed_vertex_count = weld_duplicate_vertices(mesh, mesh_bounds);
363
+ // console.warn(`Vertices removed via weld: ${weld_removed_vertex_count} (=${Math.round(weld_removed_vertex_count * 10000 / position_attribute.count) / 100}%)`);
364
+
365
+ console.time('simplification');
366
+ // console.profile('simplification');
367
+
368
+
369
+ // expandConnectivityByLocality(mesh, mesh_bounds);
370
+ simplifyTopoMesh2(mesh, numFacesToRemove);
371
+ // console.profileEnd('simplification');
372
+ console.timeEnd('simplification');
373
+
374
+ console.time('topo -> buffer geo');
375
+ const simplified_bg = topoMeshToBufferGeometry(mesh);
376
+ console.timeEnd('topo -> buffer geo');
377
+
378
+ simplified_bg.computeVertexNormals();
379
+
380
+ const proxy = build_preview_object({ geometry: simplified_bg, color: 0xFF0000, wireframe: true });
381
+
382
+
383
+ console.log(`Simplified to ${mesh.getFaces().size} (=${Math.floor(mesh.getFaces().size * 10000 / initial_face_count) / 100})%`)
384
+
385
+ return proxy;
386
+ }
387
+
388
+ function process_geo(geometry, percent = 0.05) {
389
+ const source_geometry = deinterleaveBufferGeometry(geometry);
390
+ source_geometry.computeVertexNormals();
391
+
392
+ source_geometry.computeBoundingBox();
393
+
394
+ //
395
+ const scale = new Vector3();
396
+ scaleGeometryToBox(source_geometry, new Vector3(700, 700, 700), scale);
397
+
398
+ const source = build_preview_object({ geometry: source_geometry, color: 0xFFFFFF, wireframe: true });
399
+ source.scale.copy(scale);
400
+
401
+ const SPACING = 1000;
402
+
403
+ // breakdown_simplification({
404
+ // steps: 20,
405
+ // geo: source_geometry,
406
+ // offset: new Vector3(-SPACING * 0.5, 0, 0),
407
+ // spacing: new Vector3(-SPACING, 0, 0),
408
+ // label_vertices: true
409
+ // });
410
+ //
411
+ const proxy = simplify_percent(source_geometry, percent);
412
+ proxy.scale.copy(scale);
413
+ scene.add(proxy);
414
+ proxy.position.x -= SPACING * 0.5;
415
+
416
+ source.position.x += SPACING * 0.5;
417
+
418
+ scene.add(source);
419
+ }
420
+
421
+ function make_lucy() {
422
+ load_ply("data/models/stanford/Lucy100k.ply");
423
+ }
424
+
425
+ function make_bunny() {
426
+ load_ply("data/models/stanford/bun_zipper.ply");
427
+ }
428
+
429
+ function make_car() {
430
+ load_ply("data/models/stanford/big_porsche.ply");
431
+ }
432
+
433
+ function make_dragon_1m() {
434
+ load_ply("data/models/stanford/dragon_recon/dragon_vrip.ply");
435
+ }
436
+
437
+ function load_ply(url) {
438
+
439
+ new PLYLoader().load(url, async geometry => {
440
+ process_geo(geometry);
441
+ });
442
+ }
443
+
444
+ function make_square() {
445
+ process_geo(new PlaneBufferGeometry(700, 700, 40, 40));
446
+ }
447
+
448
+ function make_sphere() {
449
+ process_geo(new SphereBufferGeometry(350, 20, 20), 0.5);
450
+ }
451
+
452
+ // make_square();
453
+ // make_sphere();
454
+ // make_lucy();
455
+ // make_car();
456
+ // make_dragon_1m();
457
+ // make_bunny();
458
+ load_ply("moicon/isiflow_Oct_15_21/0/floor_01.ply");
459
+ }
460
+
461
+
462
+ function onWindowResize() {
463
+
464
+ const w = window.innerWidth;
465
+ const h = window.innerHeight;
466
+
467
+ windowHalfX = w / 2;
468
+ windowHalfY = h / 2;
469
+
470
+ camera.aspect = w / h;
471
+ camera.updateProjectionMatrix();
472
+
473
+ renderer.setSize(w, h);
474
+
475
+ background.repeat.set(w / 20, h / 20);
476
+ }
477
+
478
+ function animate() {
479
+ requestAnimationFrame(animate);
480
+
481
+ render();
482
+ stats.update();
483
+ }
484
+
485
+ function render() {
486
+ if (orbitControls !== undefined) {
487
+ orbitControls.update();
488
+ }
489
+
490
+ const timer = -0.0002 * Date.now();
491
+
492
+ pointLight.position.x = 10000 * Math.cos(timer);
493
+ pointLight.position.z = 10000 * Math.sin(timer);
494
+
495
+ renderer.render(scene, camera);
496
+ }
497
+
498
+
499
+ init();
500
+ const orbitControls = new OrbitControls(camera, container);
501
+ animate();
502
+
@@ -2,7 +2,14 @@ import { v3_dot } from "../../../../v3_dot.js";
2
2
  import { fabsf } from "../../../../../math/fabsf.js";
3
3
  import { EPSILON } from "../../../../../math/MathUtils.js";
4
4
  import { vec3 } from "gl-matrix";
5
+ import { compute_triangle_normal } from "../../struct/TopoTriangle.js";
5
6
 
7
+ const scratch_v3 = new Float32Array(3);
8
+
9
+ /**
10
+ * Quadric Error Metric
11
+ * Triangular 4x4 matrix, see https://en.wikipedia.org/wiki/Triangular_matrix
12
+ */
6
13
  export class Quadratic3 {
7
14
  constructor() {
8
15
  // Row 0
@@ -120,15 +127,16 @@ export class Quadratic3 {
120
127
  * @param {TopoTriangle} face
121
128
  */
122
129
  setFromFace(face) {
130
+ const v0 = face.vertices[0];
131
+
123
132
  // compute triangle's plane
124
- const face_normal = face.normal;
133
+ compute_triangle_normal(scratch_v3, v0, face.vertices[1], face.vertices[2]);
125
134
 
126
135
  // compute plane offset
127
- const v0 = face.vertices[0];
128
136
 
129
- const normal_x = face_normal[0];
130
- const normal_y = face_normal[1];
131
- const normal_z = face_normal[2];
137
+ const normal_x = scratch_v3[0];
138
+ const normal_y = scratch_v3[1];
139
+ const normal_z = scratch_v3[2];
132
140
 
133
141
  const plane_constant = -v3_dot(
134
142
  normal_x, normal_y, normal_z,
@@ -207,6 +215,30 @@ export class Quadratic3 {
207
215
  this.d2 += Q.d2;
208
216
  }
209
217
 
218
+ /**
219
+ *
220
+ * @param {number} v
221
+ */
222
+ multiplyScalar(v) {
223
+ // R0
224
+ this.a2 *= v;
225
+ this.ab *= v;
226
+ this.ac *= v;
227
+ this.ad *= v;
228
+
229
+ // R1
230
+ this.b2 *= v;
231
+ this.bc *= v;
232
+ this.bd *= v;
233
+
234
+ // R2
235
+ this.c2 *= v;
236
+ this.cd *= v;
237
+
238
+ // R3
239
+ this.d2 *= v;
240
+ }
241
+
210
242
  /**
211
243
  *
212
244
  * @returns {Quadratic3}
@@ -1,4 +1,9 @@
1
1
  import { Quadratic3 } from "./Quadratic3.js";
2
+ import { tm_face_area } from "../../tm_face_area.js";
3
+ import { assert } from "../../../../../assert.js";
4
+ import { tm_face_normal } from "../../tm_face_normal.js";
5
+ import { vec3 } from "gl-matrix";
6
+ import { query_edge_is_boundary } from "../../query/query_edge_is_boundary.js";
2
7
 
3
8
  /**
4
9
  *
@@ -21,12 +26,78 @@ export function deep_copy_vertex_quadratics(destination, source, mesh) {
21
26
  }
22
27
  }
23
28
 
29
+
30
+ /**
31
+ * @see "Boundary and Texture Preserving Mesh Simplification Algorithm for Virtual Reality" by Kanchan Bahirat et.al. University of Texas/Dallas
32
+ * @param {TopoEdge} edge
33
+ * @param {number} weight
34
+ * @param {Map<number, Quadratic3>} vertex_quadratics
35
+ */
36
+ function apply_border_penalty_to_vertex_quadrics(edge, weight, vertex_quadratics) {
37
+ const v0 = edge.v0;
38
+ const v1 = edge.v1;
39
+
40
+ const edge_vector = [];
41
+ vec3.sub(edge_vector, v0, v1);
42
+
43
+ // Edge must have exactly 1 triangle attached
44
+ const edge_faces = edge.faces;
45
+
46
+ assert.equal(edge_faces.length, 1, 'must have exactly 1 face');
47
+
48
+ const tri = edge_faces[0];
49
+
50
+ const normal = [];
51
+ tm_face_normal(normal, tri);
52
+
53
+ const abc = [];
54
+
55
+ vec3.cross(abc, edge_vector, normal);
56
+ vec3.normalize(abc, abc);
57
+
58
+ const d = -vec3.dot(abc, v0);
59
+
60
+ const constraint = new Quadratic3();
61
+ constraint.setFromVector4(abc[0], abc[1], abc[2], d);
62
+ constraint.multiplyScalar(vec3.length(edge_vector) * weight);
63
+ // constraint.multiplyScalar(weight);
64
+
65
+ // apply constraint
66
+ const v0_quadratic = vertex_quadratics.get(v0.index);
67
+ const v1_quadratic = vertex_quadratics.get(v1.index);
68
+
69
+ v0_quadratic.add(constraint);
70
+ v1_quadratic.add(constraint);
71
+ }
72
+
73
+ /**
74
+ *
75
+ * @param {TopoMesh} mesh
76
+ * @param {TopoEdge[]} border_set
77
+ * @param {Map<number, Quadratic3>} vertex_quadratics
78
+ * @param {number} [weight]
79
+ */
80
+ export function apply_border_penalties_to_vertex_quadrics(mesh, border_set, vertex_quadratics, weight = 10) {
81
+ const edge_count = border_set.length;
82
+ for (let i = 0; i < edge_count; i++) {
83
+ const edge = border_set[i];
84
+ apply_border_penalty_to_vertex_quadrics(edge, weight, vertex_quadratics);
85
+ }
86
+ }
87
+
24
88
  /**
25
89
  *
26
90
  * @param {TopoMesh} mesh
27
91
  * @param {Map<number, Quadratic3>} quadratics VertexID -> Quadratic map
92
+ * @param {boolean} [use_triangle_area]
93
+ * @param {boolean} [use_border_constraints]
28
94
  */
29
- export function build_vertex_quadratics(mesh, quadratics) {
95
+ export function build_vertex_quadratics({
96
+ mesh,
97
+ quadratics,
98
+ use_triangle_area = false,
99
+ use_border_constraints = true
100
+ }) {
30
101
  // initialize vertex quadratics
31
102
  const mesh_vertices = mesh.vertices;
32
103
  const mesh_vertex_count = mesh_vertices.length;
@@ -51,6 +122,12 @@ export function build_vertex_quadratics(mesh, quadratics) {
51
122
 
52
123
  q.setFromFace(face);
53
124
 
125
+ if (use_triangle_area) {
126
+ const triangle_area = tm_face_area(face);
127
+
128
+ q.multiplyScalar(triangle_area);
129
+ }
130
+
54
131
  const face_vertices = face.vertices;
55
132
  const face_vertex_count = face_vertices.length;
56
133
 
@@ -63,4 +140,12 @@ export function build_vertex_quadratics(mesh, quadratics) {
63
140
  face_vertex_quadratic.add(q);
64
141
  }
65
142
  }
143
+
144
+ if (use_border_constraints) {
145
+ for (let edge of mesh.getEdges()) {
146
+ if (query_edge_is_boundary(edge)) {
147
+ apply_border_penalty_to_vertex_quadrics(edge, 10, quadratics);
148
+ }
149
+ }
150
+ }
66
151
  }
@@ -1,11 +1,11 @@
1
- import FastBinaryHeap from "../../../../../engine/navigation/grid/FastBinaryHeap.js";
1
+ import FastBinaryHeap from "../../../../collection/heap/FastBinaryHeap.js";
2
2
  import { array_copy_unique } from "../../../../collection/array/array_copy_unique.js";
3
3
  import { EdgeCollapseCandidate } from "./EdgeCollapseCandidate.js";
4
4
  import { build_vertex_quadratics } from "./quadratic/build_vertex_quadratics.js";
5
5
  import { collapse_degenerate_edge } from "./collapse_degenerate_edge.js";
6
6
  import { collapse_all_degenerate_edges } from "./collapse_all_degenerate_edges.js";
7
7
  import { build_edge_collapse_candidates } from "./build_edge_collapse_candidates.js";
8
- import { update_topo_face_normals } from "../update_topo_face_normals.js";
8
+
9
9
 
10
10
  const scratch_array_1 = [];
11
11
  const scratch_array_2 = [];
@@ -212,7 +212,7 @@ export function simplifyTopoMesh(mesh, num_faces_to_remove, restricted_vertices
212
212
 
213
213
  if (num_faces_to_remove <= 0 || face_count <= 0) {
214
214
  // we're already at the target
215
- return ;
215
+ return;
216
216
  }
217
217
 
218
218
 
@@ -234,7 +234,7 @@ export function simplifyTopoMesh(mesh, num_faces_to_remove, restricted_vertices
234
234
  */
235
235
  const vertex_quadratics = new Map();
236
236
 
237
- build_vertex_quadratics(mesh, vertex_quadratics);
237
+ build_vertex_quadratics({ mesh: mesh, quadratics: vertex_quadratics });
238
238
 
239
239
  // compute collapse cost of each vertex/edge pair
240
240
  build_edge_collapse_candidates(