@babylonjs/core 8.3.0 → 8.4.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 (331) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +22 -13
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animation.optimizations.d.ts +31 -0
  5. package/Animations/animation.optimizations.js +41 -0
  6. package/Animations/animation.optimizations.js.map +1 -0
  7. package/Animations/index.d.ts +1 -0
  8. package/Animations/index.js +1 -0
  9. package/Animations/index.js.map +1 -1
  10. package/Animations/pathCursor.js +3 -1
  11. package/Animations/pathCursor.js.map +1 -1
  12. package/Animations/runtimeAnimation.d.ts +3 -1
  13. package/Animations/runtimeAnimation.js +127 -116
  14. package/Animations/runtimeAnimation.js.map +1 -1
  15. package/Audio/audioSceneComponent.js +4 -4
  16. package/Audio/audioSceneComponent.js.map +1 -1
  17. package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
  18. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
  20. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  21. package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
  22. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
  24. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  25. package/Bones/skeleton.js +6 -6
  26. package/Bones/skeleton.js.map +1 -1
  27. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  28. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +2 -2
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +6 -2
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +2 -2
  34. package/Cameras/camera.js.map +1 -1
  35. package/Cameras/deviceOrientationCamera.js +3 -2
  36. package/Cameras/deviceOrientationCamera.js.map +1 -1
  37. package/Collisions/gpuPicker.d.ts +1 -0
  38. package/Collisions/gpuPicker.js +9 -0
  39. package/Collisions/gpuPicker.js.map +1 -1
  40. package/Debug/axesViewer.js +3 -2
  41. package/Debug/axesViewer.js.map +1 -1
  42. package/Debug/directionalLightFrustumViewer.js +4 -4
  43. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  44. package/Debug/physicsViewer.js +7 -6
  45. package/Debug/physicsViewer.js.map +1 -1
  46. package/Debug/skeletonViewer.js +4 -4
  47. package/Debug/skeletonViewer.js.map +1 -1
  48. package/Engines/Native/nativeInterfaces.d.ts +6 -7
  49. package/Engines/Native/nativeInterfaces.js.map +1 -1
  50. package/Engines/Processors/shaderCodeNode.js +2 -2
  51. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  52. package/Engines/abstractEngine.d.ts +1 -0
  53. package/Engines/abstractEngine.js +14 -8
  54. package/Engines/abstractEngine.js.map +1 -1
  55. package/Engines/constants.d.ts +27 -5
  56. package/Engines/constants.js +27 -5
  57. package/Engines/constants.js.map +1 -1
  58. package/Engines/engine.js +8 -8
  59. package/Engines/engine.js.map +1 -1
  60. package/Engines/nativeEngine.js +13 -27
  61. package/Engines/nativeEngine.js.map +1 -1
  62. package/Engines/webgpuEngine.js +6 -2
  63. package/Engines/webgpuEngine.js.map +1 -1
  64. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
  65. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  66. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
  67. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  68. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
  69. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  70. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
  71. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
  72. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
  73. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
  74. package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
  75. package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
  76. package/FlowGraph/flowGraphBlock.js +3 -2
  77. package/FlowGraph/flowGraphBlock.js.map +1 -1
  78. package/FlowGraph/flowGraphCoordinator.js +10 -6
  79. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  80. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  81. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  82. package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
  83. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  84. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
  85. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  86. package/Gamepads/gamepadManager.js +2 -2
  87. package/Gamepads/gamepadManager.js.map +1 -1
  88. package/Gizmos/axisDragGizmo.js +3 -2
  89. package/Gizmos/axisDragGizmo.js.map +1 -1
  90. package/Gizmos/axisScaleGizmo.js +6 -4
  91. package/Gizmos/axisScaleGizmo.js.map +1 -1
  92. package/Gizmos/boundingBoxGizmo.js +28 -26
  93. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  94. package/Gizmos/cameraGizmo.js +6 -3
  95. package/Gizmos/cameraGizmo.js.map +1 -1
  96. package/Gizmos/gizmo.js +11 -10
  97. package/Gizmos/gizmo.js.map +1 -1
  98. package/Gizmos/gizmoManager.js +16 -12
  99. package/Gizmos/gizmoManager.js.map +1 -1
  100. package/Gizmos/lightGizmo.js +3 -2
  101. package/Gizmos/lightGizmo.js.map +1 -1
  102. package/Gizmos/planeDragGizmo.js +3 -2
  103. package/Gizmos/planeDragGizmo.js.map +1 -1
  104. package/Gizmos/planeRotationGizmo.js +3 -2
  105. package/Gizmos/planeRotationGizmo.js.map +1 -1
  106. package/Gizmos/positionGizmo.js +41 -28
  107. package/Gizmos/positionGizmo.js.map +1 -1
  108. package/Gizmos/rotationGizmo.js +26 -18
  109. package/Gizmos/rotationGizmo.js.map +1 -1
  110. package/Gizmos/scaleGizmo.js +47 -32
  111. package/Gizmos/scaleGizmo.js.map +1 -1
  112. package/Layers/effectLayerSceneComponent.js +4 -4
  113. package/Layers/effectLayerSceneComponent.js.map +1 -1
  114. package/Layers/layerSceneComponent.js +4 -4
  115. package/Layers/layerSceneComponent.js.map +1 -1
  116. package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
  117. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  118. package/Lights/Shadows/shadowGenerator.js +3 -3
  119. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  120. package/Lights/light.js +4 -4
  121. package/Lights/light.js.map +1 -1
  122. package/Loading/Plugins/babylonFileLoader.js +54 -46
  123. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  124. package/Loading/loadingScreen.js +4 -3
  125. package/Loading/loadingScreen.js.map +1 -1
  126. package/Loading/sceneLoader.js +15 -12
  127. package/Loading/sceneLoader.js.map +1 -1
  128. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
  129. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
  131. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
  133. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/baseMathBlock.js +3 -1
  135. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/customBlock.js +53 -43
  137. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  138. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  139. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  140. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  141. package/Materials/Node/nodeMaterial.d.ts +5 -0
  142. package/Materials/Node/nodeMaterial.js +33 -20
  143. package/Materials/Node/nodeMaterial.js.map +1 -1
  144. package/Materials/Node/nodeMaterialBlock.js +7 -4
  145. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  146. package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
  147. package/Materials/Node/nodeMaterialBuildState.js +72 -7
  148. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  149. package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
  150. package/Materials/Node/nodeMaterialDefault.js +28 -0
  151. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  152. package/Materials/Textures/cubeTexture.js +3 -1
  153. package/Materials/Textures/cubeTexture.js.map +1 -1
  154. package/Materials/Textures/videoTexture.js +5 -4
  155. package/Materials/Textures/videoTexture.js.map +1 -1
  156. package/Materials/materialDefines.js +3 -1
  157. package/Materials/materialDefines.js.map +1 -1
  158. package/Materials/multiMaterial.js +3 -1
  159. package/Materials/multiMaterial.js.map +1 -1
  160. package/Materials/shaderMaterial.js +3 -2
  161. package/Materials/shaderMaterial.js.map +1 -1
  162. package/Meshes/Compression/dracoEncoder.js +2 -2
  163. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  164. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
  165. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  166. package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
  167. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  168. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
  169. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  170. package/Meshes/Node/Blocks/mathBlock.js +3 -1
  171. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  172. package/Meshes/Node/nodeGeometryBlock.js +8 -5
  173. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  174. package/Meshes/abstractMesh.js +2 -2
  175. package/Meshes/abstractMesh.js.map +1 -1
  176. package/Meshes/geodesicMesh.js +2 -2
  177. package/Meshes/geodesicMesh.js.map +1 -1
  178. package/Meshes/mesh.js +6 -6
  179. package/Meshes/mesh.js.map +1 -1
  180. package/Meshes/mesh.vertexData.functions.js +11 -10
  181. package/Meshes/mesh.vertexData.functions.js.map +1 -1
  182. package/Meshes/mesh.vertexData.subdivide.js +10 -10
  183. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  184. package/Meshes/meshSimplification.js +10 -10
  185. package/Meshes/meshSimplification.js.map +1 -1
  186. package/Meshes/meshUtils.js +6 -3
  187. package/Meshes/meshUtils.js.map +1 -1
  188. package/Meshes/polygonMesh.js +10 -10
  189. package/Meshes/polygonMesh.js.map +1 -1
  190. package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
  191. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  192. package/Misc/arrayTools.js +2 -2
  193. package/Misc/arrayTools.js.map +1 -1
  194. package/Misc/asyncLock.js +9 -9
  195. package/Misc/asyncLock.js.map +1 -1
  196. package/Misc/basis.js +4 -2
  197. package/Misc/basis.js.map +1 -1
  198. package/Misc/deepCopier.js +3 -2
  199. package/Misc/deepCopier.js.map +1 -1
  200. package/Misc/deepMerger.js +3 -2
  201. package/Misc/deepMerger.js.map +1 -1
  202. package/Misc/fileTools.js +4 -4
  203. package/Misc/fileTools.js.map +1 -1
  204. package/Misc/greasedLineTools.js +14 -13
  205. package/Misc/greasedLineTools.js.map +1 -1
  206. package/Misc/logger.js +3 -2
  207. package/Misc/logger.js.map +1 -1
  208. package/Misc/observable.extensions.js +4 -4
  209. package/Misc/observable.extensions.js.map +1 -1
  210. package/Misc/sceneSerializer.js +5 -4
  211. package/Misc/sceneSerializer.js.map +1 -1
  212. package/Misc/snapshotRenderingHelper.js +3 -1
  213. package/Misc/snapshotRenderingHelper.js.map +1 -1
  214. package/Misc/tags.js +2 -2
  215. package/Misc/tags.js.map +1 -1
  216. package/Misc/trajectoryClassifier.js +8 -8
  217. package/Misc/trajectoryClassifier.js.map +1 -1
  218. package/Particles/IParticleSystem.d.ts +1 -1
  219. package/Particles/IParticleSystem.js.map +1 -1
  220. package/Particles/baseParticleSystem.d.ts +11 -3
  221. package/Particles/baseParticleSystem.js +37 -3
  222. package/Particles/baseParticleSystem.js.map +1 -1
  223. package/Particles/gpuParticleSystem.js +1 -14
  224. package/Particles/gpuParticleSystem.js.map +1 -1
  225. package/Particles/particle.js +2 -2
  226. package/Particles/particle.js.map +1 -1
  227. package/Particles/particleSystem.js +15 -13
  228. package/Particles/particleSystem.js.map +1 -1
  229. package/Particles/thinParticleSystem.js +3 -16
  230. package/Particles/thinParticleSystem.js.map +1 -1
  231. package/Physics/physicsHelper.js +18 -14
  232. package/Physics/physicsHelper.js.map +1 -1
  233. package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
  234. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  235. package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
  236. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  237. package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
  238. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  239. package/Physics/v1/physicsEngine.js +4 -4
  240. package/Physics/v1/physicsEngine.js.map +1 -1
  241. package/Physics/v1/physicsImpostor.js +10 -21
  242. package/Physics/v1/physicsImpostor.js.map +1 -1
  243. package/Physics/v2/Plugins/havokPlugin.js +12 -10
  244. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  245. package/Physics/v2/ragdoll.js +4 -4
  246. package/Physics/v2/ragdoll.js.map +1 -1
  247. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
  248. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  249. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
  250. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  251. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
  252. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  253. package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
  254. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  255. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
  256. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  257. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
  258. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  259. package/Rendering/iblCdfGenerator.js +4 -4
  260. package/Rendering/iblCdfGenerator.js.map +1 -1
  261. package/Rendering/objectRenderer.js +2 -2
  262. package/Rendering/objectRenderer.js.map +1 -1
  263. package/Rendering/reflectiveShadowMap.js +7 -5
  264. package/Rendering/reflectiveShadowMap.js.map +1 -1
  265. package/Sprites/spriteMap.js +2 -2
  266. package/Sprites/spriteMap.js.map +1 -1
  267. package/XR/features/WebXRAbstractFeature.js +2 -2
  268. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  269. package/XR/features/WebXRAnchorSystem.js +4 -4
  270. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  271. package/XR/features/WebXRBackgroundRemover.js +3 -1
  272. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  273. package/XR/features/WebXRControllerMovement.js +6 -3
  274. package/XR/features/WebXRControllerMovement.js.map +1 -1
  275. package/XR/features/WebXRControllerPhysics.js +12 -7
  276. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  277. package/XR/features/WebXRControllerPointerSelection.js +12 -7
  278. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  279. package/XR/features/WebXRControllerTeleportation.js +11 -7
  280. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  281. package/XR/features/WebXRDepthSensing.js +6 -6
  282. package/XR/features/WebXRDepthSensing.js.map +1 -1
  283. package/XR/features/WebXRHandTracking.js +60 -24
  284. package/XR/features/WebXRHandTracking.js.map +1 -1
  285. package/XR/features/WebXRHitTest.js +4 -4
  286. package/XR/features/WebXRHitTest.js.map +1 -1
  287. package/XR/features/WebXRImageTracking.js +2 -2
  288. package/XR/features/WebXRImageTracking.js.map +1 -1
  289. package/XR/features/WebXRLayers.js +2 -2
  290. package/XR/features/WebXRLayers.js.map +1 -1
  291. package/XR/features/WebXRNearInteraction.js +12 -7
  292. package/XR/features/WebXRNearInteraction.js.map +1 -1
  293. package/XR/features/WebXRRawCameraAccess.js +9 -4
  294. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  295. package/XR/features/WebXRSpaceWarp.js +2 -2
  296. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  297. package/XR/motionController/webXRAbstractMotionController.js +19 -8
  298. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  299. package/XR/motionController/webXRGenericMotionController.js +2 -2
  300. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  301. package/XR/motionController/webXRHTCViveMotionController.js +5 -4
  302. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  303. package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
  304. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  305. package/XR/motionController/webXRMotionControllerManager.js +4 -4
  306. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  307. package/XR/motionController/webXROculusTouchMotionController.js +5 -4
  308. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  309. package/XR/motionController/webXRProfiledMotionController.js +15 -10
  310. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  311. package/XR/webXRCamera.js +3 -2
  312. package/XR/webXRCamera.js.map +1 -1
  313. package/XR/webXREnterExitUI.js +5 -4
  314. package/XR/webXREnterExitUI.js.map +1 -1
  315. package/XR/webXRExperienceHelper.js +2 -2
  316. package/XR/webXRExperienceHelper.js.map +1 -1
  317. package/XR/webXRFeaturesManager.js +10 -7
  318. package/XR/webXRFeaturesManager.js.map +1 -1
  319. package/XR/webXRInput.js +8 -8
  320. package/XR/webXRInput.js.map +1 -1
  321. package/XR/webXRInputSource.js +4 -1
  322. package/XR/webXRInputSource.js.map +1 -1
  323. package/XR/webXRRenderTargetTextureProvider.js +3 -1
  324. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  325. package/assetContainer.js +156 -135
  326. package/assetContainer.js.map +1 -1
  327. package/node.js +2 -2
  328. package/node.js.map +1 -1
  329. package/package.json +1 -1
  330. package/scene.js +18 -11
  331. package/scene.js.map +1 -1
@@ -12,15 +12,16 @@ export function OptimizeIndices(indices) {
12
12
  }
13
13
  // Step 2: Build a graph connecting faces sharing a vertex
14
14
  const vertexToFaceMap = new Map();
15
- faces.forEach((face, faceIndex) => {
16
- face.forEach((vertex) => {
15
+ for (let faceIndex = 0; faceIndex < faces.length; faceIndex++) {
16
+ const face = faces[faceIndex];
17
+ for (const vertex of face) {
17
18
  let face = vertexToFaceMap.get(vertex);
18
19
  if (!face) {
19
20
  vertexToFaceMap.set(vertex, (face = []));
20
21
  }
21
22
  face.push(faceIndex);
22
- });
23
- });
23
+ }
24
+ }
24
25
  // Step 3: Traverse faces using DFS to ensure connected faces are close
25
26
  const visited = new BitArray(faceCount);
26
27
  const sortedFaces = [];
@@ -35,17 +36,17 @@ export function OptimizeIndices(indices) {
35
36
  visited.set(currentFaceIndex, true);
36
37
  sortedFaces.push(faces[currentFaceIndex]);
37
38
  // Push unvisited neighbors (faces sharing a vertex) onto the stack
38
- faces[currentFaceIndex].forEach((vertex) => {
39
+ for (const vertex of faces[currentFaceIndex]) {
39
40
  const neighbors = vertexToFaceMap.get(vertex);
40
41
  if (!neighbors) {
41
42
  return;
42
43
  }
43
- neighbors.forEach((neighborFaceIndex) => {
44
+ for (const neighborFaceIndex of neighbors) {
44
45
  if (!visited.get(neighborFaceIndex)) {
45
46
  stack.push(neighborFaceIndex);
46
47
  }
47
- });
48
- });
48
+ }
49
+ }
49
50
  }
50
51
  };
51
52
  // Start DFS from the first face
@@ -56,10 +57,10 @@ export function OptimizeIndices(indices) {
56
57
  }
57
58
  // Step 4: Flatten the sorted faces back into an array
58
59
  let index = 0;
59
- sortedFaces.forEach((face) => {
60
+ for (const face of sortedFaces) {
60
61
  indices[index++] = face[0];
61
62
  indices[index++] = face[1];
62
63
  indices[index++] = face[2];
63
- });
64
+ }
64
65
  }
65
66
  //# sourceMappingURL=mesh.vertexData.functions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mesh.vertexData.functions.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/mesh.vertexData.functions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IndicesArray } from \"core/types\";\r\nimport { BitArray } from \"core/Misc/bitArray\";\r\n\r\n/**\r\n * Sort (in place) the index array so that faces with common indices are close\r\n * @param indices the array of indices to sort\r\n */\r\nexport function OptimizeIndices(indices: IndicesArray) {\r\n const faces: Array<Array<number>> = [];\r\n const faceCount = indices.length / 3;\r\n\r\n // Step 1: Break the indices array into faces\r\n for (let i = 0; i < faceCount; i++) {\r\n faces.push([indices[i * 3], indices[i * 3 + 1], indices[i * 3 + 2]]);\r\n }\r\n\r\n // Step 2: Build a graph connecting faces sharing a vertex\r\n const vertexToFaceMap = new Map<number, number[]>();\r\n faces.forEach((face, faceIndex) => {\r\n face.forEach((vertex) => {\r\n let face = vertexToFaceMap.get(vertex);\r\n if (!face) {\r\n vertexToFaceMap.set(vertex, (face = []));\r\n }\r\n face.push(faceIndex);\r\n });\r\n });\r\n\r\n // Step 3: Traverse faces using DFS to ensure connected faces are close\r\n const visited = new BitArray(faceCount);\r\n const sortedFaces: Array<number[]> = [];\r\n\r\n // Using a stack and not a recursive version to avoid call stack overflow\r\n const deepFirstSearchStack = (startFaceIndex: number) => {\r\n const stack: Array<number> = [startFaceIndex];\r\n\r\n while (stack.length > 0) {\r\n const currentFaceIndex = stack.pop()!;\r\n\r\n if (visited.get(currentFaceIndex)) {\r\n continue;\r\n }\r\n visited.set(currentFaceIndex, true);\r\n sortedFaces.push(faces[currentFaceIndex]);\r\n\r\n // Push unvisited neighbors (faces sharing a vertex) onto the stack\r\n faces[currentFaceIndex].forEach((vertex) => {\r\n const neighbors = vertexToFaceMap.get(vertex);\r\n\r\n if (!neighbors) {\r\n return;\r\n }\r\n\r\n neighbors.forEach((neighborFaceIndex) => {\r\n if (!visited.get(neighborFaceIndex)) {\r\n stack.push(neighborFaceIndex);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n // Start DFS from the first face\r\n for (let i = 0; i < faceCount; i++) {\r\n if (!visited.get(i)) {\r\n deepFirstSearchStack(i);\r\n }\r\n }\r\n\r\n // Step 4: Flatten the sorted faces back into an array\r\n let index = 0;\r\n sortedFaces.forEach((face) => {\r\n indices[index++] = face[0];\r\n indices[index++] = face[1];\r\n indices[index++] = face[2];\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"mesh.vertexData.functions.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/mesh.vertexData.functions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IndicesArray } from \"core/types\";\r\nimport { BitArray } from \"core/Misc/bitArray\";\r\n\r\n/**\r\n * Sort (in place) the index array so that faces with common indices are close\r\n * @param indices the array of indices to sort\r\n */\r\nexport function OptimizeIndices(indices: IndicesArray) {\r\n const faces: Array<Array<number>> = [];\r\n const faceCount = indices.length / 3;\r\n\r\n // Step 1: Break the indices array into faces\r\n for (let i = 0; i < faceCount; i++) {\r\n faces.push([indices[i * 3], indices[i * 3 + 1], indices[i * 3 + 2]]);\r\n }\r\n\r\n // Step 2: Build a graph connecting faces sharing a vertex\r\n const vertexToFaceMap = new Map<number, number[]>();\r\n for (let faceIndex = 0; faceIndex < faces.length; faceIndex++) {\r\n const face = faces[faceIndex];\r\n for (const vertex of face) {\r\n let face = vertexToFaceMap.get(vertex);\r\n if (!face) {\r\n vertexToFaceMap.set(vertex, (face = []));\r\n }\r\n face.push(faceIndex);\r\n }\r\n }\r\n\r\n // Step 3: Traverse faces using DFS to ensure connected faces are close\r\n const visited = new BitArray(faceCount);\r\n const sortedFaces: Array<number[]> = [];\r\n\r\n // Using a stack and not a recursive version to avoid call stack overflow\r\n const deepFirstSearchStack = (startFaceIndex: number) => {\r\n const stack: Array<number> = [startFaceIndex];\r\n\r\n while (stack.length > 0) {\r\n const currentFaceIndex = stack.pop()!;\r\n\r\n if (visited.get(currentFaceIndex)) {\r\n continue;\r\n }\r\n visited.set(currentFaceIndex, true);\r\n sortedFaces.push(faces[currentFaceIndex]);\r\n\r\n // Push unvisited neighbors (faces sharing a vertex) onto the stack\r\n for (const vertex of faces[currentFaceIndex]) {\r\n const neighbors = vertexToFaceMap.get(vertex);\r\n\r\n if (!neighbors) {\r\n return;\r\n }\r\n\r\n for (const neighborFaceIndex of neighbors) {\r\n if (!visited.get(neighborFaceIndex)) {\r\n stack.push(neighborFaceIndex);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Start DFS from the first face\r\n for (let i = 0; i < faceCount; i++) {\r\n if (!visited.get(i)) {\r\n deepFirstSearchStack(i);\r\n }\r\n }\r\n\r\n // Step 4: Flatten the sorted faces back into an array\r\n let index = 0;\r\n for (const face of sortedFaces) {\r\n indices[index++] = face[0];\r\n indices[index++] = face[1];\r\n indices[index++] = face[2];\r\n }\r\n}\r\n"]}
@@ -279,11 +279,11 @@ function smooth(vertexData, options) {
279
279
  const startWeight = 1.0 - beta * k;
280
280
  readVector(_vertex[v], flattenedAttribute, i + v, 3);
281
281
  _vertex[v].scaleInPlace(startWeight);
282
- positionsArr.forEach((positionIndex) => {
282
+ for (const positionIndex of positionsArr) {
283
283
  readVector(_average, flattenedAttribute, positionIndex, 3);
284
284
  _average.scaleInPlace(beta);
285
285
  _vertex[v].addInPlace(_average);
286
- });
286
+ }
287
287
  }
288
288
  else {
289
289
  // 'positions', 'colors', etc.
@@ -316,10 +316,10 @@ function smooth(vertexData, options) {
316
316
  for (const neighborHash in neighbors) {
317
317
  const neighborIndices = neighbors[neighborHash];
318
318
  _average.set(0, 0, 0);
319
- neighborIndices.forEach((neighborIndex) => {
319
+ for (const neighborIndex of neighborIndices) {
320
320
  readVector(_temp, existingAttribute, neighborIndex, itemSize);
321
321
  _average.addInPlace(_temp);
322
- });
322
+ }
323
323
  _average.scaleInPlace(1 / neighborIndices.length);
324
324
  _average.scaleInPlace(weight);
325
325
  _vertex[v].addInPlace(_average);
@@ -330,11 +330,11 @@ function smooth(vertexData, options) {
330
330
  const beta = 0.125; // 1/8
331
331
  const startWeight = 1.0 - beta * k;
332
332
  _vertex[v].scaleInPlace(startWeight);
333
- opposites.forEach((oppositeIndex) => {
333
+ for (const oppositeIndex of opposites) {
334
334
  readVector(_average, existingAttribute, oppositeIndex, itemSize);
335
335
  _average.scaleInPlace(beta);
336
336
  _vertex[v].addInPlace(_average);
337
- });
337
+ }
338
338
  }
339
339
  }
340
340
  }
@@ -346,18 +346,18 @@ function smooth(vertexData, options) {
346
346
  }
347
347
  // Build new attributes for the smoothed geometry.
348
348
  const smoothData = new VertexData();
349
- attributeList.forEach((attributeName) => {
349
+ for (const attributeName of attributeList) {
350
350
  if (attributeName === "indices") {
351
- return;
351
+ continue;
352
352
  }
353
353
  const existingAttribute = sourceData[attributeName];
354
354
  const flattenedAttribute = flatData[attributeName];
355
355
  if (!existingAttribute || !flattenedAttribute) {
356
- return;
356
+ continue;
357
357
  }
358
358
  const newArray = subdivideAttribute(attributeName, existingAttribute, flattenedAttribute);
359
359
  smoothData[attributeName] = newArray;
360
- });
360
+ }
361
361
  // Rebuild indices sequentially.
362
362
  const newPositions = smoothData.positions;
363
363
  const newIndices = [];
@@ -1 +1 @@
1
- {"version":3,"file":"mesh.vertexData.subdivide.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/mesh.vertexData.subdivide.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { FloatArray } from \"core/types\";\r\n\r\n/**\r\n * Inspired by https://github.com/stevinz/three-subdivide\r\n * Thanks a lot to https://github.com/stevinz\r\n */\r\n\r\n/**\r\n * Interface used to configure the subdivision process\r\n */\r\nexport interface ISubdivideOptions {\r\n /** Apply only flat subdivision - false by default */\r\n flatOnly?: boolean;\r\n /** Split all triangles at edges shared by coplanar triangles - true by default*/\r\n split?: boolean;\r\n /** Should UV values be averaged during subdivision - false by default */\r\n uvSmooth?: boolean;\r\n /** Should edges / breaks in geometry be ignored during subdivision? - false by default */\r\n preserveEdges?: boolean;\r\n /** How much to weigh favoring heavy corners vs favoring Loop's formula - 1 by default*/\r\n weight?: number;\r\n}\r\n\r\nconst _positionShift = Math.pow(10, 4);\r\n\r\n/**\r\n * Rounds a number (simulate integer rounding)\r\n * @internal\r\n */\r\nfunction round(x: number): number {\r\n return (x + (x > 0 ? 0.5 : -0.5)) << 0;\r\n}\r\n\r\n/**\r\n * Generates a hash string from a number\r\n * @internal\r\n */\r\nfunction hashFromNumber(num: number, shift = _positionShift): string {\r\n let roundedNumber = round(num * shift);\r\n if (roundedNumber === 0) {\r\n roundedNumber = 0; // prevent -0\r\n }\r\n return `${roundedNumber}`;\r\n}\r\n\r\n/**\r\n * Generates a hash string from a Vector3\r\n * @internal\r\n */\r\nfunction hashFromVector(v: Vector3, shift = _positionShift): string {\r\n return `${hashFromNumber(v.x, shift)},${hashFromNumber(v.y, shift)},${hashFromNumber(v.z, shift)}`;\r\n}\r\n\r\n/**\r\n * Gathers attribute names from a VertexData object\r\n * @internal\r\n */\r\nfunction gatherAttributes(vertexData: VertexData): string[] {\r\n const desired = [\"positions\", \"normals\", \"uvs\"];\r\n const available = Object.keys(vertexData).filter((k) => Array.isArray((vertexData as any)[k]));\r\n return Array.from(new Set([...desired, ...available]));\r\n}\r\n\r\n/**\r\n * Sets triangle data into an attribute array\r\n * @internal\r\n */\r\nfunction setTriangle(arr: number[], index: number, itemSize: number, vec0: number[], vec1: number[], vec2: number[]): void {\r\n for (let i = 0; i < itemSize; i++) {\r\n arr[index + i] = vec0[i];\r\n arr[index + itemSize + i] = vec1[i];\r\n arr[index + 2 * itemSize + i] = vec2[i];\r\n }\r\n}\r\n\r\n/**\r\n * Converts indexed VertexData to a non-indexed form\r\n * @internal\r\n */\r\nfunction toNonIndexed(vertexData: VertexData): VertexData {\r\n if (!vertexData.indices || vertexData.indices.length === 0) {\r\n return vertexData; // already non-indexed\r\n }\r\n const newPositions: number[] = [];\r\n const newNormals: number[] = [];\r\n const newUVs: number[] = [];\r\n const indices = vertexData.indices;\r\n const pos = vertexData.positions!;\r\n const norm = vertexData.normals;\r\n const uv = vertexData.uvs;\r\n\r\n for (let i = 0; i < indices.length; i++) {\r\n const idx = indices[i];\r\n newPositions.push(pos[3 * idx], pos[3 * idx + 1], pos[3 * idx + 2]);\r\n if (norm) {\r\n newNormals.push(norm[3 * idx], norm[3 * idx + 1], norm[3 * idx + 2]);\r\n }\r\n if (uv) {\r\n newUVs.push(uv[2 * idx], uv[2 * idx + 1]);\r\n }\r\n }\r\n\r\n const newVertexData = new VertexData();\r\n newVertexData.positions = newPositions;\r\n if (newNormals.length) {\r\n newVertexData.normals = newNormals;\r\n }\r\n if (newUVs.length) {\r\n newVertexData.uvs = newUVs;\r\n }\r\n return newVertexData;\r\n}\r\n\r\n/** Helper to read a Vector3 from an attribute array\r\n * @internal\r\n */\r\nfunction readVector(destination: Vector3, attribute: FloatArray, index: number, itemSize: number) {\r\n if (itemSize === 3) {\r\n destination.fromArray(attribute, index * 3);\r\n return;\r\n }\r\n // For uvs (itemSize 2), return a Vector3 with z = 0.\r\n destination.set(attribute[index * 2], attribute[index * 2 + 1], 0);\r\n}\r\n\r\nfunction processFlatAttribute(source: FloatArray, vertexCount: number, output: number[]) {\r\n const v0 = new Vector3();\r\n const v1 = new Vector3();\r\n const v2 = new Vector3();\r\n const m01 = new Vector3();\r\n const m12 = new Vector3();\r\n const m20 = new Vector3();\r\n\r\n for (let i = 0; i < vertexCount; i += 3) {\r\n const j = i * 3;\r\n v0.set(source[j], source[j + 1], source[j + 2]);\r\n v1.set(source[j + 3], source[j + 4], source[j + 5]);\r\n v2.set(source[j + 6], source[j + 7], source[j + 8]);\r\n v0.addToRef(v1, m01);\r\n m01.scaleInPlace(0.5);\r\n v1.addToRef(v2, m12);\r\n m12.scaleInPlace(0.5);\r\n v2.addToRef(v0, m20);\r\n m20.scaleInPlace(0.5);\r\n\r\n // Positions\r\n output.push(v0.x, v0.y, v0.z, m01.x, m01.y, m01.z, m20.x, m20.y, m20.z);\r\n output.push(v1.x, v1.y, v1.z, m12.x, m12.y, m12.z, m01.x, m01.y, m01.z);\r\n output.push(v2.x, v2.y, v2.z, m20.x, m20.y, m20.z, m12.x, m12.y, m12.z);\r\n output.push(m01.x, m01.y, m01.z, m12.x, m12.y, m12.z, m20.x, m20.y, m20.z);\r\n }\r\n}\r\n\r\n/**\r\n * Applies one iteration of flat subdivision (each triangle becomes 4).\r\n * @internal\r\n */\r\nfunction flat(vertexData: VertexData): VertexData {\r\n const data = toNonIndexed(vertexData);\r\n const positions = data.positions!;\r\n const normals = data.normals;\r\n const uvs = data.uvs;\r\n const vertexCount = positions.length / 3;\r\n\r\n const newPositions: number[] = [];\r\n const newNormals: number[] = [];\r\n const newUVs: number[] = [];\r\n processFlatAttribute(positions, vertexCount, newPositions);\r\n\r\n if (normals && normals.length) {\r\n processFlatAttribute(normals, vertexCount, newNormals);\r\n }\r\n\r\n if (uvs && uvs.length) {\r\n for (let i = 0; i < vertexCount; i += 3) {\r\n const j = i * 2;\r\n const uv0 = [uvs[j], uvs[j + 1]];\r\n const uv1 = [uvs[j + 2], uvs[j + 3]];\r\n const uv2 = [uvs[j + 4], uvs[j + 5]];\r\n\r\n const uv01 = [(uv0[0] + uv1[0]) / 2, (uv0[1] + uv1[1]) / 2];\r\n const uv12 = [(uv1[0] + uv2[0]) / 2, (uv1[1] + uv2[1]) / 2];\r\n const uv20 = [(uv2[0] + uv0[0]) / 2, (uv2[1] + uv0[1]) / 2];\r\n\r\n newUVs.push(...uv0, ...uv01, ...uv20);\r\n newUVs.push(...uv1, ...uv12, ...uv01);\r\n newUVs.push(...uv2, ...uv20, ...uv12);\r\n newUVs.push(...uv01, ...uv12, ...uv20);\r\n }\r\n }\r\n\r\n const newVertexCount = newPositions.length / 3;\r\n const newIndices: number[] = [];\r\n for (let i = 0; i < newVertexCount; i++) {\r\n newIndices.push(i);\r\n }\r\n\r\n const newVertexData = new VertexData();\r\n newVertexData.positions = newPositions;\r\n if (newNormals.length) {\r\n newVertexData.normals = newNormals;\r\n }\r\n if (newUVs.length) {\r\n newVertexData.uvs = newUVs;\r\n }\r\n newVertexData.indices = newIndices;\r\n return newVertexData;\r\n}\r\n\r\n/**\r\n * Applies one iteration of smooth subdivision with vertex averaging.\r\n * This function uses the subdivideAttribute routine to adjust vertex data.\r\n * @internal\r\n */\r\nfunction smooth(vertexData: VertexData, options: ISubdivideOptions): VertexData {\r\n // Convert to non-indexed and apply flat subdivision first.\r\n const sourceData = toNonIndexed(vertexData);\r\n const flatData = flat(sourceData);\r\n\r\n const attributeList = gatherAttributes(sourceData);\r\n const origPositions = sourceData.positions!;\r\n const flatPositions = flatData.positions!;\r\n const vertexCount = origPositions.length / 3;\r\n\r\n // Build connectivity maps from the original geometry.\r\n const hashToIndex: { [hash: string]: number[] } = {};\r\n const existingNeighbors: { [hash: string]: { [neighborHash: string]: number[] } } = {};\r\n const flatOpposites: { [hash: string]: number[] } = {};\r\n const existingEdges: { [hash: string]: Set<string> } = {};\r\n\r\n function addNeighbor(posHash: string, neighborHash: string, index: number): void {\r\n if (!existingNeighbors[posHash]) {\r\n existingNeighbors[posHash] = {};\r\n }\r\n if (!existingNeighbors[posHash][neighborHash]) {\r\n existingNeighbors[posHash][neighborHash] = [];\r\n }\r\n existingNeighbors[posHash][neighborHash].push(index);\r\n }\r\n function addOpposite(posHash: string, index: number): void {\r\n if (!flatOpposites[posHash]) {\r\n flatOpposites[posHash] = [];\r\n }\r\n flatOpposites[posHash].push(index);\r\n }\r\n function addEdgePoint(posHash: string, edgeHash: string): void {\r\n if (!existingEdges[posHash]) {\r\n existingEdges[posHash] = new Set<string>();\r\n }\r\n existingEdges[posHash].add(edgeHash);\r\n }\r\n\r\n const temp = new Vector3();\r\n const v0 = new Vector3();\r\n const v1 = new Vector3();\r\n const v2 = new Vector3();\r\n const m01 = new Vector3();\r\n const m12 = new Vector3();\r\n const m20 = new Vector3();\r\n\r\n // Process original positions\r\n for (let i = 0; i < vertexCount; i += 3) {\r\n readVector(v0, origPositions, i, 3);\r\n readVector(v1, origPositions, i + 1, 3);\r\n readVector(v2, origPositions, i + 2, 3);\r\n const h0 = hashFromVector(v0);\r\n const h1 = hashFromVector(v1);\r\n const h2 = hashFromVector(v2);\r\n addNeighbor(h0, h1, i + 1);\r\n addNeighbor(h0, h2, i + 2);\r\n addNeighbor(h1, h0, i);\r\n addNeighbor(h1, h2, i + 2);\r\n addNeighbor(h2, h0, i);\r\n addNeighbor(h2, h1, i + 1);\r\n\r\n // Opposites from flat subdivision: calculate midpoints.\r\n v0.addToRef(v1, m01);\r\n m01.scaleInPlace(0.5);\r\n v1.addToRef(v2, m12);\r\n m12.scaleInPlace(0.5);\r\n v2.addToRef(v0, m20);\r\n m20.scaleInPlace(0.5);\r\n\r\n addOpposite(hashFromVector(m01), i + 2);\r\n addOpposite(hashFromVector(m12), i);\r\n addOpposite(hashFromVector(m20), i + 1);\r\n\r\n // Track edges for preserveEdges.\r\n addEdgePoint(h0, hashFromVector(m01));\r\n addEdgePoint(h0, hashFromVector(m20));\r\n addEdgePoint(h1, hashFromVector(m01));\r\n addEdgePoint(h1, hashFromVector(m12));\r\n addEdgePoint(h2, hashFromVector(m12));\r\n addEdgePoint(h2, hashFromVector(m20));\r\n }\r\n\r\n // Build map from flat positions to indices.\r\n for (let i = 0; i < flatPositions.length / 3; i++) {\r\n readVector(temp, flatPositions, i, 3);\r\n const h = hashFromVector(temp);\r\n if (!hashToIndex[h]) {\r\n hashToIndex[h] = [];\r\n }\r\n hashToIndex[h].push(i);\r\n }\r\n\r\n // Prepare temporary vectors for subdivideAttribute.\r\n const _vertex: Vector3[] = [new Vector3(), new Vector3(), new Vector3()];\r\n const _position: Vector3[] = [new Vector3(), new Vector3(), new Vector3()];\r\n const _average = new Vector3();\r\n const _temp = new Vector3();\r\n\r\n // subdivideAttribute: adjusts vertex attributes using Loop’s averaging rules.\r\n function subdivideAttribute(attributeName: string, existingAttribute: number[], flattenedAttribute: number[]): number[] {\r\n const itemSize = attributeName === \"uvs\" ? 2 : 3;\r\n const flatVertexCount = flatPositions.length / 3;\r\n const floatArray = new Array(flatVertexCount * itemSize);\r\n let index = 0;\r\n for (let i = 0; i < flatVertexCount; i += 3) {\r\n for (let v = 0; v < 3; v++) {\r\n if (attributeName === \"uvs\" && !options.uvSmooth) {\r\n // Simply copy UVs.\r\n readVector(_vertex[v], flattenedAttribute, i + v, 2);\r\n } else if (attributeName === \"normals\") {\r\n readVector(_position[v], flatPositions, i + v, 3);\r\n const positionHash = hashFromVector(_position[v]);\r\n const positionsArr = hashToIndex[positionHash] || [];\r\n const k = positionsArr.length;\r\n const beta = 0.75 / k;\r\n const startWeight = 1.0 - beta * k;\r\n readVector(_vertex[v], flattenedAttribute, i + v, 3);\r\n _vertex[v].scaleInPlace(startWeight);\r\n positionsArr.forEach((positionIndex) => {\r\n readVector(_average, flattenedAttribute, positionIndex, 3);\r\n _average.scaleInPlace(beta);\r\n _vertex[v].addInPlace(_average);\r\n });\r\n } else {\r\n // 'positions', 'colors', etc.\r\n readVector(_vertex[v], flattenedAttribute, i + v, itemSize);\r\n readVector(_position[v], flatPositions, i + v, 3);\r\n const positionHash = hashFromVector(_position[v]);\r\n const neighbors = existingNeighbors[positionHash];\r\n const opposites = flatOpposites[positionHash];\r\n if (neighbors) {\r\n if (options.preserveEdges) {\r\n const edgeSet = existingEdges[positionHash];\r\n let hasPair = true;\r\n edgeSet.forEach((edgeHash) => {\r\n if (flatOpposites[edgeHash] && flatOpposites[edgeHash].length % 2 !== 0) {\r\n hasPair = false;\r\n }\r\n });\r\n if (!hasPair) {\r\n // If edges aren't paired, skip adjustment.\r\n continue;\r\n }\r\n }\r\n const neighborKeys = Object.keys(neighbors);\r\n const k = neighborKeys.length;\r\n const beta = (1 / k) * (5 / 8 - Math.pow(3 / 8 + (1 / 4) * Math.cos((2 * Math.PI) / k), 2));\r\n const heavy = 1 / k / k;\r\n const weight = Scalar.Lerp(heavy, beta, options.weight!);\r\n const startWeight = 1.0 - weight * k;\r\n _vertex[v].scaleInPlace(startWeight);\r\n for (const neighborHash in neighbors) {\r\n const neighborIndices = neighbors[neighborHash];\r\n _average.set(0, 0, 0);\r\n neighborIndices.forEach((neighborIndex) => {\r\n readVector(_temp, existingAttribute, neighborIndex, itemSize);\r\n _average.addInPlace(_temp);\r\n });\r\n _average.scaleInPlace(1 / neighborIndices.length);\r\n _average.scaleInPlace(weight);\r\n _vertex[v].addInPlace(_average);\r\n }\r\n } else if (opposites && opposites.length === 2) {\r\n const k = opposites.length;\r\n const beta = 0.125; // 1/8\r\n const startWeight = 1.0 - beta * k;\r\n _vertex[v].scaleInPlace(startWeight);\r\n opposites.forEach((oppositeIndex) => {\r\n readVector(_average, existingAttribute, oppositeIndex, itemSize);\r\n _average.scaleInPlace(beta);\r\n _vertex[v].addInPlace(_average);\r\n });\r\n }\r\n }\r\n }\r\n // Write out new triangle vertices.\r\n setTriangle(floatArray, index, itemSize, _vertex[0].asArray(), _vertex[1].asArray(), _vertex[2].asArray());\r\n index += itemSize * 3;\r\n }\r\n return floatArray;\r\n }\r\n\r\n // Build new attributes for the smoothed geometry.\r\n const smoothData = new VertexData();\r\n attributeList.forEach((attributeName) => {\r\n if (attributeName === \"indices\") {\r\n return;\r\n }\r\n const existingAttribute = (sourceData as any)[attributeName] as number[];\r\n const flattenedAttribute = (flatData as any)[attributeName] as number[];\r\n if (!existingAttribute || !flattenedAttribute) {\r\n return;\r\n }\r\n const newArray = subdivideAttribute(attributeName, existingAttribute, flattenedAttribute);\r\n (smoothData as any)[attributeName] = newArray;\r\n });\r\n\r\n // Rebuild indices sequentially.\r\n const newPositions = smoothData.positions!;\r\n const newIndices: number[] = [];\r\n for (let i = 0; i < newPositions.length / 3; i++) {\r\n newIndices.push(i);\r\n }\r\n smoothData.indices = newIndices;\r\n return smoothData;\r\n}\r\n\r\n/**\r\n * Subdivide a vertexData using Loop algorithm\r\n * @param vertexData The vertexData to subdivide\r\n * @param level The number of times to subdivide\r\n * @param options The options to use when subdividing\r\n * @returns The subdivided vertexData\r\n */\r\nexport function Subdivide(vertexData: VertexData, level: number, options?: Partial<ISubdivideOptions>): VertexData {\r\n options = {\r\n flatOnly: false,\r\n uvSmooth: false,\r\n preserveEdges: false,\r\n weight: 1,\r\n ...options,\r\n };\r\n\r\n if (!vertexData.positions || vertexData.positions.length === 0 || level <= 0) {\r\n return vertexData;\r\n }\r\n\r\n // Clone the input\r\n let modified = vertexData.clone();\r\n\r\n for (let i = 0; i < level; i++) {\r\n if (options.flatOnly) {\r\n modified = flat(modified);\r\n } else {\r\n modified = smooth(modified, options);\r\n }\r\n }\r\n\r\n return modified;\r\n}\r\n"]}
1
+ {"version":3,"file":"mesh.vertexData.subdivide.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/mesh.vertexData.subdivide.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { FloatArray } from \"core/types\";\r\n\r\n/**\r\n * Inspired by https://github.com/stevinz/three-subdivide\r\n * Thanks a lot to https://github.com/stevinz\r\n */\r\n\r\n/**\r\n * Interface used to configure the subdivision process\r\n */\r\nexport interface ISubdivideOptions {\r\n /** Apply only flat subdivision - false by default */\r\n flatOnly?: boolean;\r\n /** Split all triangles at edges shared by coplanar triangles - true by default*/\r\n split?: boolean;\r\n /** Should UV values be averaged during subdivision - false by default */\r\n uvSmooth?: boolean;\r\n /** Should edges / breaks in geometry be ignored during subdivision? - false by default */\r\n preserveEdges?: boolean;\r\n /** How much to weigh favoring heavy corners vs favoring Loop's formula - 1 by default*/\r\n weight?: number;\r\n}\r\n\r\nconst _positionShift = Math.pow(10, 4);\r\n\r\n/**\r\n * Rounds a number (simulate integer rounding)\r\n * @internal\r\n */\r\nfunction round(x: number): number {\r\n return (x + (x > 0 ? 0.5 : -0.5)) << 0;\r\n}\r\n\r\n/**\r\n * Generates a hash string from a number\r\n * @internal\r\n */\r\nfunction hashFromNumber(num: number, shift = _positionShift): string {\r\n let roundedNumber = round(num * shift);\r\n if (roundedNumber === 0) {\r\n roundedNumber = 0; // prevent -0\r\n }\r\n return `${roundedNumber}`;\r\n}\r\n\r\n/**\r\n * Generates a hash string from a Vector3\r\n * @internal\r\n */\r\nfunction hashFromVector(v: Vector3, shift = _positionShift): string {\r\n return `${hashFromNumber(v.x, shift)},${hashFromNumber(v.y, shift)},${hashFromNumber(v.z, shift)}`;\r\n}\r\n\r\n/**\r\n * Gathers attribute names from a VertexData object\r\n * @internal\r\n */\r\nfunction gatherAttributes(vertexData: VertexData): string[] {\r\n const desired = [\"positions\", \"normals\", \"uvs\"];\r\n const available = Object.keys(vertexData).filter((k) => Array.isArray((vertexData as any)[k]));\r\n return Array.from(new Set([...desired, ...available]));\r\n}\r\n\r\n/**\r\n * Sets triangle data into an attribute array\r\n * @internal\r\n */\r\nfunction setTriangle(arr: number[], index: number, itemSize: number, vec0: number[], vec1: number[], vec2: number[]): void {\r\n for (let i = 0; i < itemSize; i++) {\r\n arr[index + i] = vec0[i];\r\n arr[index + itemSize + i] = vec1[i];\r\n arr[index + 2 * itemSize + i] = vec2[i];\r\n }\r\n}\r\n\r\n/**\r\n * Converts indexed VertexData to a non-indexed form\r\n * @internal\r\n */\r\nfunction toNonIndexed(vertexData: VertexData): VertexData {\r\n if (!vertexData.indices || vertexData.indices.length === 0) {\r\n return vertexData; // already non-indexed\r\n }\r\n const newPositions: number[] = [];\r\n const newNormals: number[] = [];\r\n const newUVs: number[] = [];\r\n const indices = vertexData.indices;\r\n const pos = vertexData.positions!;\r\n const norm = vertexData.normals;\r\n const uv = vertexData.uvs;\r\n\r\n for (let i = 0; i < indices.length; i++) {\r\n const idx = indices[i];\r\n newPositions.push(pos[3 * idx], pos[3 * idx + 1], pos[3 * idx + 2]);\r\n if (norm) {\r\n newNormals.push(norm[3 * idx], norm[3 * idx + 1], norm[3 * idx + 2]);\r\n }\r\n if (uv) {\r\n newUVs.push(uv[2 * idx], uv[2 * idx + 1]);\r\n }\r\n }\r\n\r\n const newVertexData = new VertexData();\r\n newVertexData.positions = newPositions;\r\n if (newNormals.length) {\r\n newVertexData.normals = newNormals;\r\n }\r\n if (newUVs.length) {\r\n newVertexData.uvs = newUVs;\r\n }\r\n return newVertexData;\r\n}\r\n\r\n/** Helper to read a Vector3 from an attribute array\r\n * @internal\r\n */\r\nfunction readVector(destination: Vector3, attribute: FloatArray, index: number, itemSize: number) {\r\n if (itemSize === 3) {\r\n destination.fromArray(attribute, index * 3);\r\n return;\r\n }\r\n // For uvs (itemSize 2), return a Vector3 with z = 0.\r\n destination.set(attribute[index * 2], attribute[index * 2 + 1], 0);\r\n}\r\n\r\nfunction processFlatAttribute(source: FloatArray, vertexCount: number, output: number[]) {\r\n const v0 = new Vector3();\r\n const v1 = new Vector3();\r\n const v2 = new Vector3();\r\n const m01 = new Vector3();\r\n const m12 = new Vector3();\r\n const m20 = new Vector3();\r\n\r\n for (let i = 0; i < vertexCount; i += 3) {\r\n const j = i * 3;\r\n v0.set(source[j], source[j + 1], source[j + 2]);\r\n v1.set(source[j + 3], source[j + 4], source[j + 5]);\r\n v2.set(source[j + 6], source[j + 7], source[j + 8]);\r\n v0.addToRef(v1, m01);\r\n m01.scaleInPlace(0.5);\r\n v1.addToRef(v2, m12);\r\n m12.scaleInPlace(0.5);\r\n v2.addToRef(v0, m20);\r\n m20.scaleInPlace(0.5);\r\n\r\n // Positions\r\n output.push(v0.x, v0.y, v0.z, m01.x, m01.y, m01.z, m20.x, m20.y, m20.z);\r\n output.push(v1.x, v1.y, v1.z, m12.x, m12.y, m12.z, m01.x, m01.y, m01.z);\r\n output.push(v2.x, v2.y, v2.z, m20.x, m20.y, m20.z, m12.x, m12.y, m12.z);\r\n output.push(m01.x, m01.y, m01.z, m12.x, m12.y, m12.z, m20.x, m20.y, m20.z);\r\n }\r\n}\r\n\r\n/**\r\n * Applies one iteration of flat subdivision (each triangle becomes 4).\r\n * @internal\r\n */\r\nfunction flat(vertexData: VertexData): VertexData {\r\n const data = toNonIndexed(vertexData);\r\n const positions = data.positions!;\r\n const normals = data.normals;\r\n const uvs = data.uvs;\r\n const vertexCount = positions.length / 3;\r\n\r\n const newPositions: number[] = [];\r\n const newNormals: number[] = [];\r\n const newUVs: number[] = [];\r\n processFlatAttribute(positions, vertexCount, newPositions);\r\n\r\n if (normals && normals.length) {\r\n processFlatAttribute(normals, vertexCount, newNormals);\r\n }\r\n\r\n if (uvs && uvs.length) {\r\n for (let i = 0; i < vertexCount; i += 3) {\r\n const j = i * 2;\r\n const uv0 = [uvs[j], uvs[j + 1]];\r\n const uv1 = [uvs[j + 2], uvs[j + 3]];\r\n const uv2 = [uvs[j + 4], uvs[j + 5]];\r\n\r\n const uv01 = [(uv0[0] + uv1[0]) / 2, (uv0[1] + uv1[1]) / 2];\r\n const uv12 = [(uv1[0] + uv2[0]) / 2, (uv1[1] + uv2[1]) / 2];\r\n const uv20 = [(uv2[0] + uv0[0]) / 2, (uv2[1] + uv0[1]) / 2];\r\n\r\n newUVs.push(...uv0, ...uv01, ...uv20);\r\n newUVs.push(...uv1, ...uv12, ...uv01);\r\n newUVs.push(...uv2, ...uv20, ...uv12);\r\n newUVs.push(...uv01, ...uv12, ...uv20);\r\n }\r\n }\r\n\r\n const newVertexCount = newPositions.length / 3;\r\n const newIndices: number[] = [];\r\n for (let i = 0; i < newVertexCount; i++) {\r\n newIndices.push(i);\r\n }\r\n\r\n const newVertexData = new VertexData();\r\n newVertexData.positions = newPositions;\r\n if (newNormals.length) {\r\n newVertexData.normals = newNormals;\r\n }\r\n if (newUVs.length) {\r\n newVertexData.uvs = newUVs;\r\n }\r\n newVertexData.indices = newIndices;\r\n return newVertexData;\r\n}\r\n\r\n/**\r\n * Applies one iteration of smooth subdivision with vertex averaging.\r\n * This function uses the subdivideAttribute routine to adjust vertex data.\r\n * @internal\r\n */\r\nfunction smooth(vertexData: VertexData, options: ISubdivideOptions): VertexData {\r\n // Convert to non-indexed and apply flat subdivision first.\r\n const sourceData = toNonIndexed(vertexData);\r\n const flatData = flat(sourceData);\r\n\r\n const attributeList = gatherAttributes(sourceData);\r\n const origPositions = sourceData.positions!;\r\n const flatPositions = flatData.positions!;\r\n const vertexCount = origPositions.length / 3;\r\n\r\n // Build connectivity maps from the original geometry.\r\n const hashToIndex: { [hash: string]: number[] } = {};\r\n const existingNeighbors: { [hash: string]: { [neighborHash: string]: number[] } } = {};\r\n const flatOpposites: { [hash: string]: number[] } = {};\r\n const existingEdges: { [hash: string]: Set<string> } = {};\r\n\r\n function addNeighbor(posHash: string, neighborHash: string, index: number): void {\r\n if (!existingNeighbors[posHash]) {\r\n existingNeighbors[posHash] = {};\r\n }\r\n if (!existingNeighbors[posHash][neighborHash]) {\r\n existingNeighbors[posHash][neighborHash] = [];\r\n }\r\n existingNeighbors[posHash][neighborHash].push(index);\r\n }\r\n function addOpposite(posHash: string, index: number): void {\r\n if (!flatOpposites[posHash]) {\r\n flatOpposites[posHash] = [];\r\n }\r\n flatOpposites[posHash].push(index);\r\n }\r\n function addEdgePoint(posHash: string, edgeHash: string): void {\r\n if (!existingEdges[posHash]) {\r\n existingEdges[posHash] = new Set<string>();\r\n }\r\n existingEdges[posHash].add(edgeHash);\r\n }\r\n\r\n const temp = new Vector3();\r\n const v0 = new Vector3();\r\n const v1 = new Vector3();\r\n const v2 = new Vector3();\r\n const m01 = new Vector3();\r\n const m12 = new Vector3();\r\n const m20 = new Vector3();\r\n\r\n // Process original positions\r\n for (let i = 0; i < vertexCount; i += 3) {\r\n readVector(v0, origPositions, i, 3);\r\n readVector(v1, origPositions, i + 1, 3);\r\n readVector(v2, origPositions, i + 2, 3);\r\n const h0 = hashFromVector(v0);\r\n const h1 = hashFromVector(v1);\r\n const h2 = hashFromVector(v2);\r\n addNeighbor(h0, h1, i + 1);\r\n addNeighbor(h0, h2, i + 2);\r\n addNeighbor(h1, h0, i);\r\n addNeighbor(h1, h2, i + 2);\r\n addNeighbor(h2, h0, i);\r\n addNeighbor(h2, h1, i + 1);\r\n\r\n // Opposites from flat subdivision: calculate midpoints.\r\n v0.addToRef(v1, m01);\r\n m01.scaleInPlace(0.5);\r\n v1.addToRef(v2, m12);\r\n m12.scaleInPlace(0.5);\r\n v2.addToRef(v0, m20);\r\n m20.scaleInPlace(0.5);\r\n\r\n addOpposite(hashFromVector(m01), i + 2);\r\n addOpposite(hashFromVector(m12), i);\r\n addOpposite(hashFromVector(m20), i + 1);\r\n\r\n // Track edges for preserveEdges.\r\n addEdgePoint(h0, hashFromVector(m01));\r\n addEdgePoint(h0, hashFromVector(m20));\r\n addEdgePoint(h1, hashFromVector(m01));\r\n addEdgePoint(h1, hashFromVector(m12));\r\n addEdgePoint(h2, hashFromVector(m12));\r\n addEdgePoint(h2, hashFromVector(m20));\r\n }\r\n\r\n // Build map from flat positions to indices.\r\n for (let i = 0; i < flatPositions.length / 3; i++) {\r\n readVector(temp, flatPositions, i, 3);\r\n const h = hashFromVector(temp);\r\n if (!hashToIndex[h]) {\r\n hashToIndex[h] = [];\r\n }\r\n hashToIndex[h].push(i);\r\n }\r\n\r\n // Prepare temporary vectors for subdivideAttribute.\r\n const _vertex: Vector3[] = [new Vector3(), new Vector3(), new Vector3()];\r\n const _position: Vector3[] = [new Vector3(), new Vector3(), new Vector3()];\r\n const _average = new Vector3();\r\n const _temp = new Vector3();\r\n\r\n // subdivideAttribute: adjusts vertex attributes using Loop’s averaging rules.\r\n function subdivideAttribute(attributeName: string, existingAttribute: number[], flattenedAttribute: number[]): number[] {\r\n const itemSize = attributeName === \"uvs\" ? 2 : 3;\r\n const flatVertexCount = flatPositions.length / 3;\r\n const floatArray = new Array(flatVertexCount * itemSize);\r\n let index = 0;\r\n for (let i = 0; i < flatVertexCount; i += 3) {\r\n for (let v = 0; v < 3; v++) {\r\n if (attributeName === \"uvs\" && !options.uvSmooth) {\r\n // Simply copy UVs.\r\n readVector(_vertex[v], flattenedAttribute, i + v, 2);\r\n } else if (attributeName === \"normals\") {\r\n readVector(_position[v], flatPositions, i + v, 3);\r\n const positionHash = hashFromVector(_position[v]);\r\n const positionsArr = hashToIndex[positionHash] || [];\r\n const k = positionsArr.length;\r\n const beta = 0.75 / k;\r\n const startWeight = 1.0 - beta * k;\r\n readVector(_vertex[v], flattenedAttribute, i + v, 3);\r\n _vertex[v].scaleInPlace(startWeight);\r\n for (const positionIndex of positionsArr) {\r\n readVector(_average, flattenedAttribute, positionIndex, 3);\r\n _average.scaleInPlace(beta);\r\n _vertex[v].addInPlace(_average);\r\n }\r\n } else {\r\n // 'positions', 'colors', etc.\r\n readVector(_vertex[v], flattenedAttribute, i + v, itemSize);\r\n readVector(_position[v], flatPositions, i + v, 3);\r\n const positionHash = hashFromVector(_position[v]);\r\n const neighbors = existingNeighbors[positionHash];\r\n const opposites = flatOpposites[positionHash];\r\n if (neighbors) {\r\n if (options.preserveEdges) {\r\n const edgeSet = existingEdges[positionHash];\r\n let hasPair = true;\r\n edgeSet.forEach((edgeHash) => {\r\n if (flatOpposites[edgeHash] && flatOpposites[edgeHash].length % 2 !== 0) {\r\n hasPair = false;\r\n }\r\n });\r\n if (!hasPair) {\r\n // If edges aren't paired, skip adjustment.\r\n continue;\r\n }\r\n }\r\n const neighborKeys = Object.keys(neighbors);\r\n const k = neighborKeys.length;\r\n const beta = (1 / k) * (5 / 8 - Math.pow(3 / 8 + (1 / 4) * Math.cos((2 * Math.PI) / k), 2));\r\n const heavy = 1 / k / k;\r\n const weight = Scalar.Lerp(heavy, beta, options.weight!);\r\n const startWeight = 1.0 - weight * k;\r\n _vertex[v].scaleInPlace(startWeight);\r\n for (const neighborHash in neighbors) {\r\n const neighborIndices = neighbors[neighborHash];\r\n _average.set(0, 0, 0);\r\n for (const neighborIndex of neighborIndices) {\r\n readVector(_temp, existingAttribute, neighborIndex, itemSize);\r\n _average.addInPlace(_temp);\r\n }\r\n _average.scaleInPlace(1 / neighborIndices.length);\r\n _average.scaleInPlace(weight);\r\n _vertex[v].addInPlace(_average);\r\n }\r\n } else if (opposites && opposites.length === 2) {\r\n const k = opposites.length;\r\n const beta = 0.125; // 1/8\r\n const startWeight = 1.0 - beta * k;\r\n _vertex[v].scaleInPlace(startWeight);\r\n for (const oppositeIndex of opposites) {\r\n readVector(_average, existingAttribute, oppositeIndex, itemSize);\r\n _average.scaleInPlace(beta);\r\n _vertex[v].addInPlace(_average);\r\n }\r\n }\r\n }\r\n }\r\n // Write out new triangle vertices.\r\n setTriangle(floatArray, index, itemSize, _vertex[0].asArray(), _vertex[1].asArray(), _vertex[2].asArray());\r\n index += itemSize * 3;\r\n }\r\n return floatArray;\r\n }\r\n\r\n // Build new attributes for the smoothed geometry.\r\n const smoothData = new VertexData();\r\n for (const attributeName of attributeList) {\r\n if (attributeName === \"indices\") {\r\n continue;\r\n }\r\n const existingAttribute = (sourceData as any)[attributeName] as number[];\r\n const flattenedAttribute = (flatData as any)[attributeName] as number[];\r\n if (!existingAttribute || !flattenedAttribute) {\r\n continue;\r\n }\r\n const newArray = subdivideAttribute(attributeName, existingAttribute, flattenedAttribute);\r\n (smoothData as any)[attributeName] = newArray;\r\n }\r\n\r\n // Rebuild indices sequentially.\r\n const newPositions = smoothData.positions!;\r\n const newIndices: number[] = [];\r\n for (let i = 0; i < newPositions.length / 3; i++) {\r\n newIndices.push(i);\r\n }\r\n smoothData.indices = newIndices;\r\n return smoothData;\r\n}\r\n\r\n/**\r\n * Subdivide a vertexData using Loop algorithm\r\n * @param vertexData The vertexData to subdivide\r\n * @param level The number of times to subdivide\r\n * @param options The options to use when subdividing\r\n * @returns The subdivided vertexData\r\n */\r\nexport function Subdivide(vertexData: VertexData, level: number, options?: Partial<ISubdivideOptions>): VertexData {\r\n options = {\r\n flatOnly: false,\r\n uvSmooth: false,\r\n preserveEdges: false,\r\n weight: 1,\r\n ...options,\r\n };\r\n\r\n if (!vertexData.positions || vertexData.positions.length === 0 || level <= 0) {\r\n return vertexData;\r\n }\r\n\r\n // Clone the input\r\n let modified = vertexData.clone();\r\n\r\n for (let i = 0; i < level; i++) {\r\n if (options.flatOnly) {\r\n modified = flat(modified);\r\n } else {\r\n modified = smooth(modified, options);\r\n }\r\n }\r\n\r\n return modified;\r\n}\r\n"]}
@@ -66,7 +66,7 @@ export class SimplificationQueue {
66
66
  runSimplification(task) {
67
67
  if (task.parallelProcessing) {
68
68
  //parallel simplifier
69
- task.settings.forEach((setting) => {
69
+ for (const setting of task.settings) {
70
70
  const simplifier = this._getSimplifier(task);
71
71
  simplifier.simplify(setting, (newMesh) => {
72
72
  if (setting.distance !== undefined) {
@@ -80,7 +80,7 @@ export class SimplificationQueue {
80
80
  }
81
81
  this.executeNext();
82
82
  });
83
- });
83
+ }
84
84
  }
85
85
  else {
86
86
  //single simplifier.
@@ -290,12 +290,12 @@ export class QuadraticErrorSimplification {
290
290
  continue;
291
291
  }
292
292
  const uniqueArray = [];
293
- delTr.forEach((deletedT) => {
293
+ for (const deletedT of delTr) {
294
294
  if (uniqueArray.indexOf(deletedT) === -1) {
295
295
  deletedT.deletePending = true;
296
296
  uniqueArray.push(deletedT);
297
297
  }
298
- });
298
+ }
299
299
  if (uniqueArray.length % 2 !== 0) {
300
300
  continue;
301
301
  }
@@ -446,7 +446,7 @@ export class QuadraticErrorSimplification {
446
446
  const vertex = this._vertices[i];
447
447
  vertex.id = vertexCount;
448
448
  if (vertex.triangleCount) {
449
- vertex.originalOffsets.forEach((originalOffset) => {
449
+ for (const originalOffset of vertex.originalOffsets) {
450
450
  newPositionData.push(vertex.position.x);
451
451
  newPositionData.push(vertex.position.y);
452
452
  newPositionData.push(vertex.position.z);
@@ -466,7 +466,7 @@ export class QuadraticErrorSimplification {
466
466
  newColorsData.push(colorsData[originalOffset * 4 + 3]);
467
467
  }
468
468
  ++vertexCount;
469
- });
469
+ }
470
470
  }
471
471
  }
472
472
  const startingIndex = this._reconstructedMesh.getTotalIndices();
@@ -477,14 +477,14 @@ export class QuadraticErrorSimplification {
477
477
  const originalIndices = this._mesh.getIndices();
478
478
  for (i = 0; i < newTriangles.length; ++i) {
479
479
  t = newTriangles[i]; //now get the new referencing point for each vertex
480
- [0, 1, 2].forEach((idx) => {
480
+ for (let idx = 0; idx < 3; ++idx) {
481
481
  const id = originalIndices[t.originalOffset + idx];
482
482
  let offset = t._vertices[idx].originalOffsets.indexOf(id);
483
483
  if (offset < 0) {
484
484
  offset = 0;
485
485
  }
486
486
  newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);
487
- });
487
+ }
488
488
  }
489
489
  //overwriting the old vertex buffers and indices.
490
490
  this._reconstructedMesh.setIndices(newIndicesArray);
@@ -502,10 +502,10 @@ export class QuadraticErrorSimplification {
502
502
  const originalSubmesh = this._mesh.subMeshes[submeshIndex];
503
503
  if (submeshIndex > 0) {
504
504
  this._reconstructedMesh.subMeshes = [];
505
- submeshesArray.forEach((submesh) => {
505
+ for (const submesh of submeshesArray) {
506
506
  SubMesh.AddToMesh(submesh.materialIndex, submesh.verticesStart, submesh.verticesCount,
507
507
  /* 0, newPositionData.length/3, */ submesh.indexStart, submesh.indexCount, submesh.getMesh());
508
- });
508
+ }
509
509
  SubMesh.AddToMesh(originalSubmesh.materialIndex, startingVertex, vertexCount,
510
510
  /* 0, newPositionData.length / 3, */ startingIndex, newTriangles.length * 3, this._reconstructedMesh);
511
511
  }