@onerjs/core 8.42.7 → 8.42.8

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 (305) hide show
  1. package/Animations/animatable.core.js +1 -1
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animatorAvatar.js +2 -2
  4. package/Animations/animatorAvatar.js.map +1 -1
  5. package/Animations/runtimeAnimation.js +1 -1
  6. package/Animations/runtimeAnimation.js.map +1 -1
  7. package/Audio/audioSceneComponent.js +1 -2
  8. package/Audio/audioSceneComponent.js.map +1 -1
  9. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +3 -3
  10. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
  11. package/AudioV2/webAudio/webAudioEngine.js +1 -1
  12. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  13. package/Behaviors/Meshes/followBehavior.js +1 -1
  14. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  15. package/Behaviors/Meshes/pointerDragBehavior.js +1 -1
  16. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  17. package/Bones/boneLookController.js +1 -1
  18. package/Bones/boneLookController.js.map +1 -1
  19. package/Buffers/buffer.js +1 -1
  20. package/Buffers/buffer.js.map +1 -1
  21. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  22. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  23. package/Cameras/camera.js +2 -2
  24. package/Cameras/camera.js.map +1 -1
  25. package/Engines/AbstractEngine/abstractEngine.renderPass.js +1 -0
  26. package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -1
  27. package/Engines/Extensions/engine.query.js +1 -1
  28. package/Engines/Extensions/engine.query.js.map +1 -1
  29. package/Engines/Processors/shaderProcessor.js +2 -3
  30. package/Engines/Processors/shaderProcessor.js.map +1 -1
  31. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  32. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  33. package/Engines/WebGPU/Extensions/engine.debugging.d.ts +87 -0
  34. package/Engines/WebGPU/Extensions/engine.debugging.js +123 -31
  35. package/Engines/WebGPU/Extensions/engine.debugging.js.map +1 -1
  36. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  37. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  38. package/Engines/WebGPU/webgpuShaderProcessor.js +1 -1
  39. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  40. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +1 -1
  41. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  42. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
  43. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  44. package/Engines/WebGPU/webgpuTextureManager.js +10 -5
  45. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  46. package/Engines/abstractEngine.js +2 -2
  47. package/Engines/abstractEngine.js.map +1 -1
  48. package/Engines/engine.common.js +2 -2
  49. package/Engines/engine.common.js.map +1 -1
  50. package/Engines/engine.js +0 -1
  51. package/Engines/engine.js.map +1 -1
  52. package/Engines/thinEngine.functions.js +1 -1
  53. package/Engines/thinEngine.functions.js.map +1 -1
  54. package/Engines/thinEngine.js +4 -5
  55. package/Engines/thinEngine.js.map +1 -1
  56. package/Engines/thinNativeEngine.js +2 -5
  57. package/Engines/thinNativeEngine.js.map +1 -1
  58. package/Engines/thinWebGPUEngine.d.ts +6 -4
  59. package/Engines/thinWebGPUEngine.js +49 -25
  60. package/Engines/thinWebGPUEngine.js.map +1 -1
  61. package/Engines/webgpuEngine.d.ts +2 -1
  62. package/Engines/webgpuEngine.js +18 -16
  63. package/Engines/webgpuEngine.js.map +1 -1
  64. package/FlowGraph/flowGraph.d.ts +1 -0
  65. package/FlowGraph/flowGraph.js.map +1 -1
  66. package/FlowGraph/flowGraphBlock.d.ts +1 -0
  67. package/FlowGraph/flowGraphBlock.js.map +1 -1
  68. package/FlowGraph/flowGraphContext.d.ts +1 -0
  69. package/FlowGraph/flowGraphContext.js.map +1 -1
  70. package/FlowGraph/flowGraphCoordinator.d.ts +1 -0
  71. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  72. package/FrameGraph/Node/nodeRenderGraph.d.ts +12 -1
  73. package/FrameGraph/Node/nodeRenderGraph.js +36 -2
  74. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  75. package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -1
  76. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  77. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
  78. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
  79. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
  80. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
  81. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
  82. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +14 -0
  83. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
  84. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +2 -2
  85. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +20 -14
  86. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  87. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +3 -2
  88. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +38 -14
  89. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  90. package/Layers/glowLayer.js +1 -1
  91. package/Layers/glowLayer.js.map +1 -1
  92. package/Layers/highlightLayer.js +1 -1
  93. package/Layers/highlightLayer.js.map +1 -1
  94. package/Lights/Shadows/cascadedShadowGenerator.js +0 -1
  95. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  96. package/Lights/Shadows/shadowGenerator.d.ts +28 -1
  97. package/Lights/Shadows/shadowGenerator.js +77 -11
  98. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  99. package/Lights/lightingVolume.d.ts +1 -0
  100. package/Lights/lightingVolume.js +10 -2
  101. package/Lights/lightingVolume.js.map +1 -1
  102. package/Loading/sceneLoader.js +1 -1
  103. package/Loading/sceneLoader.js.map +1 -1
  104. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -1
  105. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  106. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -1
  107. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  108. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -2
  109. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  110. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  111. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  112. package/Materials/Node/Blocks/curveBlock.js +2 -3
  113. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  114. package/Materials/Node/nodeMaterial.js +1 -2
  115. package/Materials/Node/nodeMaterial.js.map +1 -1
  116. package/Materials/PBR/openpbrMaterial.js +3 -5
  117. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  118. package/Materials/PBR/pbrBaseMaterial.js +2 -3
  119. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  120. package/Materials/Textures/Procedurals/proceduralTexture.js +0 -1
  121. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  122. package/Materials/Textures/cubeTexture.js +1 -1
  123. package/Materials/Textures/cubeTexture.js.map +1 -1
  124. package/Materials/Textures/htmlElementTexture.js +2 -2
  125. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  126. package/Materials/Textures/multiRenderTarget.js +1 -1
  127. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  128. package/Materials/Textures/renderTargetTexture.js +13 -2
  129. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  130. package/Materials/effect.js +2 -1
  131. package/Materials/effect.js.map +1 -1
  132. package/Materials/materialHelper.functions.js +1 -1
  133. package/Materials/materialHelper.functions.js.map +1 -1
  134. package/Materials/multiMaterial.js +1 -1
  135. package/Materials/multiMaterial.js.map +1 -1
  136. package/Materials/standardMaterial.js +1 -2
  137. package/Materials/standardMaterial.js.map +1 -1
  138. package/Maths/math.geospatial.d.ts +17 -2
  139. package/Maths/math.geospatial.functions.d.ts +16 -2
  140. package/Maths/math.geospatial.functions.js +37 -4
  141. package/Maths/math.geospatial.functions.js.map +1 -1
  142. package/Maths/math.geospatial.js.map +1 -1
  143. package/Maths/math.path.js +1 -1
  144. package/Maths/math.path.js.map +1 -1
  145. package/Maths/math.scalar.functions.js +3 -3
  146. package/Maths/math.scalar.functions.js.map +1 -1
  147. package/Maths/math.vector.js +1 -1
  148. package/Maths/math.vector.js.map +1 -1
  149. package/Meshes/Builders/boxBuilder.js +1 -2
  150. package/Meshes/Builders/boxBuilder.js.map +1 -1
  151. package/Meshes/Builders/cylinderBuilder.js +2 -2
  152. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  153. package/Meshes/Builders/decalBuilder.js +1 -2
  154. package/Meshes/Builders/decalBuilder.js.map +1 -1
  155. package/Meshes/Builders/latheBuilder.js +2 -2
  156. package/Meshes/Builders/latheBuilder.js.map +1 -1
  157. package/Meshes/Builders/linesBuilder.js +11 -15
  158. package/Meshes/Builders/linesBuilder.js.map +1 -1
  159. package/Meshes/Builders/polygonBuilder.js +6 -6
  160. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  161. package/Meshes/Builders/polyhedronBuilder.js +2 -2
  162. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  163. package/Meshes/Builders/ribbonBuilder.js +6 -6
  164. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  165. package/Meshes/Builders/shapeBuilder.js +2 -3
  166. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  167. package/Meshes/Builders/tiledBoxBuilder.js +1 -1
  168. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  169. package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
  170. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  171. package/Meshes/GreasedLine/greasedLineMesh.js +1 -2
  172. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  173. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +1 -1
  174. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  175. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -1
  176. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  177. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +1 -1
  178. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  179. package/Meshes/Node/Blocks/mappingBlock.js +1 -1
  180. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  181. package/Meshes/abstractMesh.d.ts +4 -0
  182. package/Meshes/abstractMesh.js +14 -10
  183. package/Meshes/abstractMesh.js.map +1 -1
  184. package/Meshes/csg.js +1 -1
  185. package/Meshes/csg.js.map +1 -1
  186. package/Meshes/csg2.js +1 -1
  187. package/Meshes/csg2.js.map +1 -1
  188. package/Meshes/geodesicMesh.js +11 -13
  189. package/Meshes/geodesicMesh.js.map +1 -1
  190. package/Meshes/geometry.js +2 -2
  191. package/Meshes/geometry.js.map +1 -1
  192. package/Meshes/groundMesh.js +7 -7
  193. package/Meshes/groundMesh.js.map +1 -1
  194. package/Meshes/mesh.d.ts +2 -0
  195. package/Meshes/mesh.js +21 -7
  196. package/Meshes/mesh.js.map +1 -1
  197. package/Meshes/mesh.vertexData.js +22 -22
  198. package/Meshes/mesh.vertexData.js.map +1 -1
  199. package/Meshes/meshSimplification.js +1 -1
  200. package/Meshes/meshSimplification.js.map +1 -1
  201. package/Meshes/polygonMesh.js +1 -1
  202. package/Meshes/polygonMesh.js.map +1 -1
  203. package/Meshes/trailMesh.js +1 -1
  204. package/Meshes/trailMesh.js.map +1 -1
  205. package/Misc/HighDynamicRange/hdr.js +4 -6
  206. package/Misc/HighDynamicRange/hdr.js.map +1 -1
  207. package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
  208. package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
  209. package/Misc/basisWorker.js +1 -1
  210. package/Misc/basisWorker.js.map +1 -1
  211. package/Misc/environmentTextureTools.js +1 -1
  212. package/Misc/environmentTextureTools.js.map +1 -1
  213. package/Misc/meshExploder.js +1 -2
  214. package/Misc/meshExploder.js.map +1 -1
  215. package/Misc/tga.js +2 -2
  216. package/Misc/tga.js.map +1 -1
  217. package/Misc/timer.js +4 -2
  218. package/Misc/timer.js.map +1 -1
  219. package/Misc/tools.d.ts +7 -0
  220. package/Misc/tools.js +20 -6
  221. package/Misc/tools.js.map +1 -1
  222. package/Morph/morphTargetManager.js +1 -1
  223. package/Morph/morphTargetManager.js.map +1 -1
  224. package/Particles/Node/Blocks/Update/updateNoiseBlock.js +1 -1
  225. package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
  226. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +11 -1
  227. package/Particles/Node/Blocks/particleSourceTextureBlock.js +25 -11
  228. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  229. package/Particles/Node/nodeParticleSystemSet.helper.js +3 -3
  230. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  231. package/Particles/Node/nodeParticleSystemSet.js +1 -1
  232. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  233. package/Particles/computeShaderParticleSystem.js +2 -0
  234. package/Particles/computeShaderParticleSystem.js.map +1 -1
  235. package/Particles/gpuParticleSystem.d.ts +14 -0
  236. package/Particles/gpuParticleSystem.js +94 -12
  237. package/Particles/gpuParticleSystem.js.map +1 -1
  238. package/Particles/particleSystem.js +4 -1
  239. package/Particles/particleSystem.js.map +1 -1
  240. package/Particles/pointsCloudSystem.js +46 -47
  241. package/Particles/pointsCloudSystem.js.map +1 -1
  242. package/Particles/solidParticleSystem.js +5 -6
  243. package/Particles/solidParticleSystem.js.map +1 -1
  244. package/Particles/thinParticleSystem.js +3 -4
  245. package/Particles/thinParticleSystem.js.map +1 -1
  246. package/Particles/webgl2ParticleSystem.js +2 -1
  247. package/Particles/webgl2ParticleSystem.js.map +1 -1
  248. package/Physics/v1/Plugins/ammoJSPlugin.js +0 -8
  249. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  250. package/Physics/v2/characterController.js +4 -8
  251. package/Physics/v2/characterController.js.map +1 -1
  252. package/Physics/v2/ragdoll.js +1 -2
  253. package/Physics/v2/ragdoll.js.map +1 -1
  254. package/PostProcesses/postProcess.js +3 -3
  255. package/PostProcesses/postProcess.js.map +1 -1
  256. package/PostProcesses/thinDepthOfFieldEffect.js +2 -2
  257. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  258. package/Probes/reflectionProbe.js +0 -1
  259. package/Probes/reflectionProbe.js.map +1 -1
  260. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +0 -5
  261. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  262. package/Rendering/depthRenderer.js +0 -11
  263. package/Rendering/depthRenderer.js.map +1 -1
  264. package/Rendering/depthRendererSceneComponent.js +1 -1
  265. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  266. package/Rendering/geometryBufferRenderer.js +0 -1
  267. package/Rendering/geometryBufferRenderer.js.map +1 -1
  268. package/Rendering/objectRenderer.js +7 -5
  269. package/Rendering/objectRenderer.js.map +1 -1
  270. package/Rendering/thinDepthPeelingRenderer.js +1 -1
  271. package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
  272. package/Rendering/utilityLayerRenderer.js +1 -1
  273. package/Rendering/utilityLayerRenderer.js.map +1 -1
  274. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +18 -8
  275. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  276. package/Shaders/gpuRenderParticles.vertex.js +4 -0
  277. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  278. package/Shaders/gpuUpdateParticles.vertex.js +15 -3
  279. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  280. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js +18 -7
  281. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  282. package/ShadersWGSL/gpuUpdateParticles.compute.js +16 -1
  283. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  284. package/Sprites/spriteManager.js +4 -4
  285. package/Sprites/spriteManager.js.map +1 -1
  286. package/XR/features/WebXRAnchorSystem.js +2 -2
  287. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  288. package/XR/features/WebXRHandTracking.js +1 -1
  289. package/XR/features/WebXRHandTracking.js.map +1 -1
  290. package/XR/features/WebXRNearInteraction.js +1 -1
  291. package/XR/features/WebXRNearInteraction.js.map +1 -1
  292. package/XR/motionController/webXRMicrosoftMixedRealityController.js +1 -1
  293. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  294. package/XR/motionController/webXROculusTouchMotionController.js +1 -1
  295. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  296. package/XR/webXRFeaturesManager.js +1 -1
  297. package/XR/webXRFeaturesManager.js.map +1 -1
  298. package/assetContainer.js +1 -1
  299. package/assetContainer.js.map +1 -1
  300. package/package.json +1 -1
  301. package/scene.d.ts +16 -0
  302. package/scene.js +28 -0
  303. package/scene.js.map +1 -1
  304. package/sceneComponent.js +1 -1
  305. package/sceneComponent.js.map +1 -1
@@ -673,7 +673,7 @@ export class QuadraticErrorSimplification {
673
673
  _calculateError(vertex1, vertex2, pointResult) {
674
674
  const q = vertex1.q.add(vertex2.q);
675
675
  const border = vertex1.isBorder && vertex2.isBorder;
676
- let error = 0;
676
+ let error;
677
677
  const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);
678
678
  if (qDet !== 0 && !border) {
679
679
  if (!pointResult) {
@@ -1 +1 @@
1
- {"version":3,"file":"meshSimplification.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshSimplification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAoClD;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAC/B;;;;;OAKG;IACH;IACI,uBAAuB;IAChB,OAAe;IACtB,0DAA0D;IACnD,QAAgB;IACvB,8BAA8B;IACvB,YAAsB;QAJtB,YAAO,GAAP,OAAO,CAAQ;QAEf,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,iBAAY,GAAZ,YAAY,CAAU;IAC9B,CAAC;CACP;AA4BD;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAQ5B;;OAEG;IACH;QACI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,IAAyB;QACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,WAAW;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,IAAyB;QAC9C,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,qBAAqB;YACrB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC7C,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;oBACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,CAAC;oBACD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzB,yBAAyB;oBACzB,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;wBAC9F,qCAAqC;wBACrC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC3B,CAAC;oBACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,oBAAoB;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAE7C,MAAM,aAAa,GAAG,CAAC,OAAgC,EAAE,QAAoB,EAAE,EAAE;gBAC7E,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;oBACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,CAAC;oBACD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzB,4BAA4B;oBAC5B,QAAQ,EAAE,CAAC;gBACf,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;YAEF,SAAS,CAAC,GAAG,CACT,IAAI,CAAC,QAAQ,CAAC,MAAM,EACpB,CAAC,IAAe,EAAE,EAAE;gBAChB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE;oBAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC,EACD,GAAG,EAAE;gBACD,4CAA4C;gBAC5C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC3B,CAAC;gBACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,IAAyB;QAC5C,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9B,0CAAkC;YAClC;gBACI,OAAO,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAkB,kBAGjB;AAHD,WAAkB,kBAAkB;IAChC,iCAAiC;IACjC,qEAAS,CAAA;AACb,CAAC,EAHiB,kBAAkB,KAAlB,kBAAkB,QAGnC;AAED,MAAM,kBAAkB;IAiBpB,YAAmB,SAAkC;QAAlC,cAAS,GAAT,SAAS,CAAyB;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;CACJ;AAED,MAAM,gBAAgB;IAclB,YACW,QAAiB,EACjB,EAAU;QADV,aAAQ,GAAR,QAAQ,CAAS;QACjB,OAAE,GAAF,EAAE,CAAQ;QAEjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED,gBAAgB;IACT,cAAc,CAAC,WAAoB;QACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;CACJ;AAED,MAAM,eAAe;IAIjB,YAAY,IAAoB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW;QAC1H,MAAM,GAAG,GACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,gBAAgB;IACT,UAAU,CAAC,MAAuB;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,eAAe,CAAC,IAAmB;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,GAAG,CAAC,MAAuB;QAC9B,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QAC7D,OAAO,IAAI,eAAe,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,gDAAgD;IACzC,MAAM,CAAC,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACpE,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,CAAC;CACJ;AAED,MAAM,SAAS;IACX,YACW,QAAgB,EAChB,UAAkB;QADlB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAQ;IAC1B,CAAC;CACP;AAED;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IAmBrC;;;OAGG;IACH,YAAoB,KAAW;QAAX,UAAK,GAAL,KAAK,CAAM;QAhB/B,iDAAiD;QAC1C,mBAAc,GAAG,IAAI,CAAC;QAgBzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,QAAiC,EAAE,eAA+C;QAC9F,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,6DAA6D;QAC7D,SAAS,CAAC,GAAG,CACT,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAC3B,CAAC,IAAe,EAAE,EAAE;YAChB,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,KAAK,EACV,GAAG,EAAE;gBACD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;oBAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC,EACD,QAAQ,CAAC,YAAY,CACxB,CAAC;QACN,CAAC,EACD,GAAG,EAAE;YACD,UAAU,CAAC,GAAG,EAAE;gBACZ,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7C,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CACJ,CAAC;IACN,CAAC;IAEO,cAAc,CAAC,QAAiC,EAAE,YAAoB,EAAE,eAA2B;QACvG,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAE7C,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAE,QAAoB,EAAE,EAAE;YAClE,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC;gBACtC,CAAC;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvC,CAAC;gBAED,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE7E,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE;oBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAChC,IAAI,CAAC,CAAC,EAAE,CAAC;wBACL,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACnD,OAAO;oBACX,CAAC;oBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAmB,EAAE,CAAC;4BACpC,MAAM,QAAQ,GAAmB,EAAE,CAAC;4BAEpC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;4BAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;4BAEpC,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;gCAC7B,SAAS;4BACb,CAAC;4BAED,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;4BACzB,0BAA0B;4BAC1B,2BAA2B;4BAC3B,sCAAsC;4BAEtC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BAEhC,MAAM,KAAK,GAAyB,EAAE,CAAC;4BAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gCAC9C,SAAS;4BACb,CAAC;4BACD,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gCAC9C,SAAS;4BACb,CAAC;4BAED,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC3D,SAAS;4BACb,CAAC;4BAED,MAAM,WAAW,GAAyB,EAAE,CAAC;4BAC7C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gCAC3B,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oCACvC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;oCAC9B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gCAC/B,CAAC;4BACL,CAAC;4BAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gCAC/B,SAAS;4BACb,CAAC;4BAED,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;4BAEtB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;4BAErB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;4BAEvC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;4BAC7E,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;4BAE7E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;4BAEhD,IAAI,MAAM,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;gCAC7B,IAAI,MAAM,EAAE,CAAC;oCACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wCAC9B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oCAC1E,CAAC;gCACL,CAAC;4BACL,CAAC;iCAAM,CAAC;gCACJ,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC;4BAC9B,CAAC;4BAED,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC;4BAC1B,MAAM;wBACV,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC;gBACF,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE;oBACtG,OAAO,aAAa,GAAG,gBAAgB,IAAI,WAAW,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACP,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CAAC;QAEF,SAAS,CAAC,GAAG,CACT,IAAI,CAAC,oBAAoB,EACzB,CAAC,IAAe,EAAE,EAAE;YAChB,IAAI,aAAa,GAAG,gBAAgB,IAAI,WAAW,EAAE,CAAC;gBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACJ,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;oBAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,EACD,GAAG,EAAE;YACD,UAAU,CAAC,GAAG,EAAE;gBACZ,mCAAmC;gBACnC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBACpC,eAAe,EAAE,CAAC;YACtB,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CACJ,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,YAAoB,EAAE,QAAkB,EAAE,YAAsB;QAClF,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEnD,MAAM,cAAc,GAAG,CAAC,gBAAyB,EAAE,EAAE;YACjD,IAAI,YAAY,EAAE,CAAC;gBACf,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;oBAChD,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;wBAC1E,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAC9B,CAAC;gBACL,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAkB,EAAE,CAAC;QAE3C,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,OAAO;YACX,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACjG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,8CAA8C;QAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,SAAS,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE;YACvF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE;gBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;gBACvB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAqB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1F,MAAM,EAAE,GAAqB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1F,MAAM,EAAE,GAAqB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1F,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtD,QAAQ,CAAC,cAAc,GAAG,GAAG,CAAC;gBAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC,CAAC;YACF,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,EAAE;gBACtF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,QAAkB;QAC5B,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC3J,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3J,CAAC;QACL,CAAC,CAAC;QACF,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,EAAE;YACxF,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE;gBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChF,CAAC;gBACD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC;YACF,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,EAAE;gBACxF,QAAQ,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QACzC,MAAM,YAAY,GAA8B,EAAE,CAAC;QACnD,IAAI,CAAS,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAqB,CAAC;QAC1B,IAAI,CAAS,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9B,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACrB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;gBACrC,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,MAAM,eAAe,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7G,MAAM,aAAa,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACzG,MAAM,UAAU,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,MAAM,aAAa,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAExG,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEtE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC;YACxB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAClD,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACxC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACxC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAExC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;wBAClC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBACD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;wBACpB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;wBAClC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBACD,EAAE,WAAW,CAAC;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;QAElE,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;QACzD,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,EAAE,CAAC;QAEvC,MAAM,eAAe,GAAuB,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK;QACvF,MAAM,eAAe,GAAiB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9D,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,mDAAmD;YACxE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;gBACnD,IAAI,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1D,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACb,MAAM,GAAG,CAAC,CAAC;gBACf,CAAC;gBACD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QAED,iDAAiD;QAEjD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACpF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACnF,CAAC;QAED,gBAAgB;QAChB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,EAAE,CAAC;YACvC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACnC,OAAO,CAAC,SAAS,CACb,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa;gBACrB,kCAAkC,CAAC,OAAO,CAAC,UAAU,EACrD,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,OAAO,EAAE,CACpB,CAAC;YACN,CAAC;YACD,OAAO,CAAC,SAAS,CACb,eAAe,CAAC,aAAa,EAC7B,cAAc,EACd,WAAW;YACX,oCAAoC,CAAC,aAAa,EAClD,YAAY,CAAC,MAAM,GAAG,CAAC,EACvB,IAAI,CAAC,kBAAkB,CAC1B,CAAC;QACN,CAAC;IACL,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAC3E,CAAC;IAEO,UAAU,CAAC,OAAyB,EAAE,OAAyB,EAAE,KAAc,EAAE,YAA4B,EAAE,KAAgC;QACnJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAClF,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACZ,SAAS;YACb,CAAC;YAED,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE/D,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEpC,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;gBACnC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACd,SAAS;YACb,CAAC;YAED,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;YACjD,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACxB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,gBAAgB,CAAC,UAA4B,EAAE,MAAwB,EAAE,YAA4B,EAAE,gBAAwB;QACnI,IAAI,UAAU,GAAG,gBAAgB,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACZ,SAAS;YACb,CAAC;YACD,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;gBACrC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;gBACjB,UAAU,EAAE,CAAC;gBACb,SAAS;YACb,CAAC;YACD,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;YACvC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,eAAe;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,MAAM,GAAG,GAAkB,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAS,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACnF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;oBACZ,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAClC,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;wBACzB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;4BACrB,MAAM;wBACV,CAAC;wBACD,EAAE,GAAG,CAAC;oBACV,CAAC;oBACD,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;wBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACJ,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClB,CAAC;gBACL,CAAC;YACL,CAAC;YAED,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;gBAC5C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,kBAA2B,KAAK;QAChD,IAAI,CAAS,CAAC;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,MAAM,kBAAkB,GAA8B,EAAE,CAAC;YACzD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;oBAC9B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;YACL,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAqB,CAAC;QAC1B,IAAI,CAAS,CAAC;QACd,IAAI,CAAmB,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;QACL,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC;YACzC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,aAAa,GAAqB,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACnB,aAAa,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvE,CAAC,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC;QAEjC,IAAI,eAAe,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,CAAkB,EAAE,KAAc;QACnD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB,OAAO,CACH,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACZ,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,OAAyB,EAAE,OAAyB,EAAE,WAAqB;QAC/F,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;QACpD,IAAI,KAAK,GAAW,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9C,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/E,4FAA4F;YAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACnB,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ","sourcesContent":["import type { IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AsyncLoop } from \"../Misc/tools\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\n/**\r\n * A simplifier interface for future simplification implementations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplifier {\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n * @param errorCallback in case of an error, this callback will be called. optional.\r\n */\r\n simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;\r\n}\r\n\r\n/**\r\n * Expected simplification settings.\r\n * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplificationSettings {\r\n /**\r\n * Gets or sets the expected quality\r\n */\r\n quality: number;\r\n /**\r\n * Gets or sets the distance when this optimized version should be used\r\n */\r\n distance: number;\r\n /**\r\n * Gets an already optimized mesh\r\n */\r\n optimizeMesh?: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Class used to specify simplification options\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationSettings implements ISimplificationSettings {\r\n /**\r\n * Creates a SimplificationSettings\r\n * @param quality expected quality\r\n * @param distance distance when this optimized version should be used\r\n * @param optimizeMesh already optimized mesh\r\n */\r\n constructor(\r\n /** expected quality */\r\n public quality: number,\r\n /** distance when this optimized version should be used */\r\n public distance: number,\r\n /** already optimized mesh */\r\n public optimizeMesh?: boolean\r\n ) {}\r\n}\r\n\r\n/**\r\n * Interface used to define a simplification task\r\n */\r\nexport interface ISimplificationTask {\r\n /**\r\n * Array of settings\r\n */\r\n settings: Array<ISimplificationSettings>;\r\n /**\r\n * Simplification type\r\n */\r\n simplificationType: SimplificationType;\r\n /**\r\n * Mesh to simplify\r\n */\r\n mesh: Mesh;\r\n /**\r\n * Callback called on success\r\n */\r\n successCallback?: () => void;\r\n /**\r\n * Defines if parallel processing can be used\r\n */\r\n parallelProcessing: boolean;\r\n}\r\n\r\n/**\r\n * Queue used to order the simplification tasks\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationQueue {\r\n private _simplificationArray: Array<ISimplificationTask>;\r\n\r\n /**\r\n * Gets a boolean indicating that the process is still running\r\n */\r\n public running: boolean;\r\n\r\n /**\r\n * Creates a new queue\r\n */\r\n constructor() {\r\n this.running = false;\r\n this._simplificationArray = [];\r\n }\r\n\r\n /**\r\n * Adds a new simplification task\r\n * @param task defines a task to add\r\n */\r\n public addTask(task: ISimplificationTask) {\r\n this._simplificationArray.push(task);\r\n }\r\n\r\n /**\r\n * Execute next task\r\n */\r\n public executeNext() {\r\n const task = this._simplificationArray.pop();\r\n if (task) {\r\n this.running = true;\r\n this.runSimplification(task);\r\n } else {\r\n this.running = false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute a simplification task\r\n * @param task defines the task to run\r\n */\r\n public runSimplification(task: ISimplificationTask) {\r\n if (task.parallelProcessing) {\r\n //parallel simplifier\r\n for (const setting of task.settings) {\r\n const simplifier = this._getSimplifier(task);\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //check if it is the last\r\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\r\n //all done, run the success callback.\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n });\r\n }\r\n } else {\r\n //single simplifier.\r\n const simplifier = this._getSimplifier(task);\r\n\r\n const runDecimation = (setting: ISimplificationSettings, callback: () => void) => {\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //run the next quality level\r\n callback();\r\n });\r\n };\r\n\r\n AsyncLoop.Run(\r\n task.settings.length,\r\n (loop: AsyncLoop) => {\r\n runDecimation(task.settings[loop.index], () => {\r\n loop.executeNext();\r\n });\r\n },\r\n () => {\r\n //execution ended, run the success callback.\r\n if (task.successCallback) {\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n }\r\n );\r\n }\r\n }\r\n\r\n private _getSimplifier(task: ISimplificationTask): ISimplifier {\r\n switch (task.simplificationType) {\r\n case SimplificationType.QUADRATIC:\r\n default:\r\n return new QuadraticErrorSimplification(task.mesh);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The implemented types of simplification\r\n * At the moment only Quadratic Error Decimation is implemented\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport const enum SimplificationType {\r\n /** Quadratic error decimation */\r\n QUADRATIC,\r\n}\r\n\r\nclass DecimationTriangle {\r\n /** @internal */\r\n public normal: Vector3;\r\n /** @internal */\r\n public error: Array<number>;\r\n /** @internal */\r\n public deleted: boolean;\r\n /** @internal */\r\n public isDirty: boolean;\r\n /** @internal */\r\n public borderFactor: number;\r\n /** @internal */\r\n public deletePending: boolean;\r\n\r\n /** @internal */\r\n public originalOffset: number;\r\n\r\n constructor(public _vertices: Array<DecimationVertex>) {\r\n this.error = new Array<number>(4);\r\n this.deleted = false;\r\n this.isDirty = false;\r\n this.deletePending = false;\r\n this.borderFactor = 0;\r\n }\r\n}\r\n\r\nclass DecimationVertex {\r\n /** @internal */\r\n public q: QuadraticMatrix;\r\n /** @internal */\r\n public isBorder: boolean;\r\n\r\n /** @internal */\r\n public triangleStart: number;\r\n /** @internal */\r\n public triangleCount: number;\r\n\r\n /** @internal */\r\n public originalOffsets: Array<number>;\r\n\r\n constructor(\r\n public position: Vector3,\r\n public id: number\r\n ) {\r\n this.isBorder = true;\r\n this.q = new QuadraticMatrix();\r\n this.triangleCount = 0;\r\n this.triangleStart = 0;\r\n this.originalOffsets = [];\r\n }\r\n\r\n /** @internal */\r\n public updatePosition(newPosition: Vector3) {\r\n this.position.copyFrom(newPosition);\r\n }\r\n}\r\n\r\nclass QuadraticMatrix {\r\n /** @internal */\r\n public data: Array<number>;\r\n\r\n constructor(data?: Array<number>) {\r\n this.data = new Array(10);\r\n for (let i = 0; i < 10; ++i) {\r\n if (data && data[i]) {\r\n this.data[i] = data[i];\r\n } else {\r\n this.data[i] = 0;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public det(a11: number, a12: number, a13: number, a21: number, a22: number, a23: number, a31: number, a32: number, a33: number): number {\r\n const det =\r\n this.data[a11] * this.data[a22] * this.data[a33] +\r\n this.data[a13] * this.data[a21] * this.data[a32] +\r\n this.data[a12] * this.data[a23] * this.data[a31] -\r\n this.data[a13] * this.data[a22] * this.data[a31] -\r\n this.data[a11] * this.data[a23] * this.data[a32] -\r\n this.data[a12] * this.data[a21] * this.data[a33];\r\n return det;\r\n }\r\n\r\n /** @internal */\r\n public addInPlace(matrix: QuadraticMatrix) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += matrix.data[i];\r\n }\r\n }\r\n\r\n /** @internal */\r\n public addArrayInPlace(data: Array<number>) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += data[i];\r\n }\r\n }\r\n\r\n /** @internal */\r\n public add(matrix: QuadraticMatrix): QuadraticMatrix {\r\n const m = new QuadraticMatrix();\r\n for (let i = 0; i < 10; ++i) {\r\n m.data[i] = this.data[i] + matrix.data[i];\r\n }\r\n return m;\r\n }\r\n\r\n /** @internal */\r\n public static FromData(a: number, b: number, c: number, d: number): QuadraticMatrix {\r\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\r\n }\r\n\r\n //returning an array to avoid garbage collection\r\n public static DataFromNumbers(a: number, b: number, c: number, d: number) {\r\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\r\n }\r\n}\r\n\r\nclass Reference {\r\n constructor(\r\n public vertexId: number,\r\n public triangleId: number\r\n ) {}\r\n}\r\n\r\n/**\r\n * An implementation of the Quadratic Error simplification algorithm.\r\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\r\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class QuadraticErrorSimplification implements ISimplifier {\r\n private _triangles: Array<DecimationTriangle>;\r\n private _vertices: Array<DecimationVertex>;\r\n private _references: Array<Reference>;\r\n\r\n private _reconstructedMesh: Mesh;\r\n\r\n /** Gets or sets the number pf sync iterations */\r\n public syncIterations = 5000;\r\n\r\n /** Gets or sets the aggressiveness of the simplifier */\r\n public aggressiveness: number;\r\n\r\n /** Gets or sets the number of allowed iterations for decimation */\r\n public decimationIterations: number;\r\n\r\n /** Gets or sets the espilon to use for bounding box computation */\r\n public boundingBoxEpsilon: number;\r\n\r\n /**\r\n * Creates a new QuadraticErrorSimplification\r\n * @param _mesh defines the target mesh\r\n */\r\n constructor(private _mesh: Mesh) {\r\n this.aggressiveness = 7;\r\n this.decimationIterations = 100;\r\n this.boundingBoxEpsilon = Epsilon;\r\n }\r\n\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n */\r\n public simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void) {\r\n this._initDecimatedMesh();\r\n //iterating through the submeshes array, one after the other.\r\n AsyncLoop.Run(\r\n this._mesh.subMeshes.length,\r\n (loop: AsyncLoop) => {\r\n this._initWithMesh(\r\n loop.index,\r\n () => {\r\n this._runDecimation(settings, loop.index, () => {\r\n loop.executeNext();\r\n });\r\n },\r\n settings.optimizeMesh\r\n );\r\n },\r\n () => {\r\n setTimeout(() => {\r\n successCallback(this._reconstructedMesh);\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _runDecimation(settings: ISimplificationSettings, submeshIndex: number, successCallback: () => void) {\r\n const targetCount = ~~(this._triangles.length * settings.quality);\r\n let deletedTriangles = 0;\r\n\r\n const triangleCount = this._triangles.length;\r\n\r\n const iterationFunction = (iteration: number, callback: () => void) => {\r\n setTimeout(() => {\r\n if (iteration % 5 === 0) {\r\n this._updateMesh(iteration === 0);\r\n }\r\n\r\n for (let i = 0; i < this._triangles.length; ++i) {\r\n this._triangles[i].isDirty = false;\r\n }\r\n\r\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\r\n\r\n const trianglesIterator = (i: number) => {\r\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\r\n const t = this._triangles[tIdx];\r\n if (!t) {\r\n return;\r\n }\r\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\r\n return;\r\n }\r\n for (let j = 0; j < 3; ++j) {\r\n if (t.error[j] < threshold) {\r\n const deleted0: Array<boolean> = [];\r\n const deleted1: Array<boolean> = [];\r\n\r\n const v0 = t._vertices[j];\r\n const v1 = t._vertices[(j + 1) % 3];\r\n\r\n if (v0.isBorder || v1.isBorder) {\r\n continue;\r\n }\r\n\r\n const p = Vector3.Zero();\r\n // var n = Vector3.Zero();\r\n // var uv = Vector2.Zero();\r\n // var color = new Color4(0, 0, 0, 1);\r\n\r\n this._calculateError(v0, v1, p);\r\n\r\n const delTr: DecimationTriangle[] = [];\r\n\r\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\r\n continue;\r\n }\r\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\r\n continue;\r\n }\r\n\r\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\r\n continue;\r\n }\r\n\r\n const uniqueArray: DecimationTriangle[] = [];\r\n for (const deletedT of delTr) {\r\n if (uniqueArray.indexOf(deletedT) === -1) {\r\n deletedT.deletePending = true;\r\n uniqueArray.push(deletedT);\r\n }\r\n }\r\n\r\n if (uniqueArray.length % 2 !== 0) {\r\n continue;\r\n }\r\n\r\n v0.q = v1.q.add(v0.q);\r\n\r\n v0.updatePosition(p);\r\n\r\n const tStart = this._references.length;\r\n\r\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\r\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\r\n\r\n const tCount = this._references.length - tStart;\r\n\r\n if (tCount <= v0.triangleCount) {\r\n if (tCount) {\r\n for (let c = 0; c < tCount; c++) {\r\n this._references[v0.triangleStart + c] = this._references[tStart + c];\r\n }\r\n }\r\n } else {\r\n v0.triangleStart = tStart;\r\n }\r\n\r\n v0.triangleCount = tCount;\r\n break;\r\n }\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\r\n return triangleCount - deletedTriangles <= targetCount;\r\n });\r\n }, 0);\r\n };\r\n\r\n AsyncLoop.Run(\r\n this.decimationIterations,\r\n (loop: AsyncLoop) => {\r\n if (triangleCount - deletedTriangles <= targetCount) {\r\n loop.breakLoop();\r\n } else {\r\n iterationFunction(loop.index, () => {\r\n loop.executeNext();\r\n });\r\n }\r\n },\r\n () => {\r\n setTimeout(() => {\r\n //reconstruct this part of the mesh\r\n this._reconstructMesh(submeshIndex);\r\n successCallback();\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _initWithMesh(submeshIndex: number, callback: Function, optimizeMesh?: boolean) {\r\n this._vertices = [];\r\n this._triangles = [];\r\n\r\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const indices = this._mesh.getIndices();\r\n const submesh = this._mesh.subMeshes[submeshIndex];\r\n\r\n const findInVertices = (positionToSearch: Vector3) => {\r\n if (optimizeMesh) {\r\n for (let ii = 0; ii < this._vertices.length; ++ii) {\r\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\r\n return this._vertices[ii];\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const vertexReferences: Array<number> = [];\r\n\r\n const vertexInit = (i: number) => {\r\n if (!positionData) {\r\n return;\r\n }\r\n\r\n const offset = i + submesh.verticesStart;\r\n const position = Vector3.FromArray(positionData, offset * 3);\r\n\r\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\r\n vertex.originalOffsets.push(offset);\r\n if (vertex.id === this._vertices.length) {\r\n this._vertices.push(vertex);\r\n }\r\n vertexReferences.push(vertex.id);\r\n };\r\n //var totalVertices = mesh.getTotalVertices();\r\n const totalVertices = submesh.verticesCount;\r\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\r\n const indicesInit = (i: number) => {\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const offset = submesh.indexStart / 3 + i;\r\n const pos = offset * 3;\r\n const i0 = indices[pos + 0];\r\n const i1 = indices[pos + 1];\r\n const i2 = indices[pos + 2];\r\n const v0: DecimationVertex = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\r\n const v1: DecimationVertex = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\r\n const v2: DecimationVertex = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\r\n const triangle = new DecimationTriangle([v0, v1, v2]);\r\n triangle.originalOffset = pos;\r\n this._triangles.push(triangle);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\r\n this._init(callback);\r\n });\r\n });\r\n }\r\n\r\n private _init(callback: Function) {\r\n const triangleInit1 = (i: number) => {\r\n const t = this._triangles[i];\r\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\r\n for (let j = 0; j < 3; j++) {\r\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\r\n const triangleInit2 = (i: number) => {\r\n const t = this._triangles[i];\r\n for (let j = 0; j < 3; ++j) {\r\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\r\n }\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\r\n callback();\r\n });\r\n });\r\n }\r\n\r\n private _reconstructMesh(submeshIndex: number) {\r\n const newTriangles: Array<DecimationTriangle> = [];\r\n let i: number;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n t._vertices[j].triangleCount = 1;\r\n }\r\n newTriangles.push(t);\r\n }\r\n }\r\n\r\n const newPositionData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\r\n const newNormalData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\r\n const newUVsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\r\n const newColorsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\r\n\r\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\r\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n let vertexCount = 0;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n const vertex = this._vertices[i];\r\n vertex.id = vertexCount;\r\n if (vertex.triangleCount) {\r\n for (const originalOffset of vertex.originalOffsets) {\r\n newPositionData.push(vertex.position.x);\r\n newPositionData.push(vertex.position.y);\r\n newPositionData.push(vertex.position.z);\r\n\r\n if (normalData && normalData.length) {\r\n newNormalData.push(normalData[originalOffset * 3]);\r\n newNormalData.push(normalData[originalOffset * 3 + 1]);\r\n newNormalData.push(normalData[originalOffset * 3 + 2]);\r\n }\r\n if (uvs && uvs.length) {\r\n newUVsData.push(uvs[originalOffset * 2]);\r\n newUVsData.push(uvs[originalOffset * 2 + 1]);\r\n }\r\n if (colorsData && colorsData.length) {\r\n newColorsData.push(colorsData[originalOffset * 4]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\r\n }\r\n ++vertexCount;\r\n }\r\n }\r\n }\r\n\r\n const startingIndex = this._reconstructedMesh.getTotalIndices();\r\n const startingVertex = this._reconstructedMesh.getTotalVertices();\r\n\r\n const submeshesArray = this._reconstructedMesh.subMeshes;\r\n this._reconstructedMesh.subMeshes = [];\r\n\r\n const newIndicesArray: number[] = <number[]>this._reconstructedMesh.getIndices(); //[];\r\n const originalIndices = <IndicesArray>this._mesh.getIndices();\r\n for (i = 0; i < newTriangles.length; ++i) {\r\n t = newTriangles[i]; //now get the new referencing point for each vertex\r\n for (let idx = 0; idx < 3; ++idx) {\r\n const id = originalIndices[t.originalOffset + idx];\r\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\r\n if (offset < 0) {\r\n offset = 0;\r\n }\r\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\r\n }\r\n }\r\n\r\n //overwriting the old vertex buffers and indices.\r\n\r\n this._reconstructedMesh.setIndices(newIndicesArray);\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\r\n if (newNormalData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\r\n }\r\n if (newUVsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\r\n }\r\n if (newColorsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\r\n }\r\n\r\n //create submesh\r\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\r\n if (submeshIndex > 0) {\r\n this._reconstructedMesh.subMeshes = [];\r\n for (const submesh of submeshesArray) {\r\n SubMesh.AddToMesh(\r\n submesh.materialIndex,\r\n submesh.verticesStart,\r\n submesh.verticesCount,\r\n /* 0, newPositionData.length/3, */ submesh.indexStart,\r\n submesh.indexCount,\r\n submesh.getMesh()\r\n );\r\n }\r\n SubMesh.AddToMesh(\r\n originalSubmesh.materialIndex,\r\n startingVertex,\r\n vertexCount,\r\n /* 0, newPositionData.length / 3, */ startingIndex,\r\n newTriangles.length * 3,\r\n this._reconstructedMesh\r\n );\r\n }\r\n }\r\n\r\n private _initDecimatedMesh() {\r\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\r\n this._reconstructedMesh.material = this._mesh.material;\r\n this._reconstructedMesh.parent = this._mesh.parent;\r\n this._reconstructedMesh.isVisible = false;\r\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\r\n }\r\n\r\n private _isFlipped(vertex1: DecimationVertex, vertex2: DecimationVertex, point: Vector3, deletedArray: Array<boolean>, delTr: Array<DecimationTriangle>): boolean {\r\n for (let i = 0; i < vertex1.triangleCount; ++i) {\r\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n\r\n const s = this._references[vertex1.triangleStart + i].vertexId;\r\n\r\n const v1 = t._vertices[(s + 1) % 3];\r\n const v2 = t._vertices[(s + 2) % 3];\r\n\r\n if (v1 === vertex2 || v2 === vertex2) {\r\n deletedArray[i] = true;\r\n delTr.push(t);\r\n continue;\r\n }\r\n\r\n let d1 = v1.position.subtract(point);\r\n d1 = d1.normalize();\r\n let d2 = v2.position.subtract(point);\r\n d2 = d2.normalize();\r\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\r\n return true;\r\n }\r\n const normal = Vector3.Cross(d1, d2).normalize();\r\n deletedArray[i] = false;\r\n if (Vector3.Dot(normal, t.normal) < 0.2) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateTriangles(origVertex: DecimationVertex, vertex: DecimationVertex, deletedArray: Array<boolean>, deletedTriangles: number): number {\r\n let newDeleted = deletedTriangles;\r\n for (let i = 0; i < vertex.triangleCount; ++i) {\r\n const ref = this._references[vertex.triangleStart + i];\r\n const t = this._triangles[ref.triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n if (deletedArray[i] && t.deletePending) {\r\n t.deleted = true;\r\n newDeleted++;\r\n continue;\r\n }\r\n t._vertices[ref.vertexId] = origVertex;\r\n t.isDirty = true;\r\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\r\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\r\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n this._references.push(ref);\r\n }\r\n return newDeleted;\r\n }\r\n\r\n private _identifyBorder() {\r\n for (let i = 0; i < this._vertices.length; ++i) {\r\n const vCount: Array<number> = [];\r\n const vId: Array<number> = [];\r\n const v = this._vertices[i];\r\n let j: number;\r\n for (j = 0; j < v.triangleCount; ++j) {\r\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\r\n for (let ii = 0; ii < 3; ii++) {\r\n let ofs = 0;\r\n const vv = triangle._vertices[ii];\r\n while (ofs < vCount.length) {\r\n if (vId[ofs] === vv.id) {\r\n break;\r\n }\r\n ++ofs;\r\n }\r\n if (ofs === vCount.length) {\r\n vCount.push(1);\r\n vId.push(vv.id);\r\n } else {\r\n vCount[ofs]++;\r\n }\r\n }\r\n }\r\n\r\n for (j = 0; j < vCount.length; ++j) {\r\n if (vCount[j] === 1) {\r\n this._vertices[vId[j]].isBorder = true;\r\n } else {\r\n this._vertices[vId[j]].isBorder = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateMesh(identifyBorders: boolean = false) {\r\n let i: number;\r\n if (!identifyBorders) {\r\n const newTrianglesVector: Array<DecimationTriangle> = [];\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n newTrianglesVector.push(this._triangles[i]);\r\n }\r\n }\r\n this._triangles = newTrianglesVector;\r\n }\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n this._vertices[i].triangleStart = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n let v: DecimationVertex;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n v.triangleCount++;\r\n }\r\n }\r\n\r\n let tStart = 0;\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleStart = tStart;\r\n tStart += this._vertices[i].triangleCount;\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n\r\n const newReferences: Array<Reference> = new Array(this._triangles.length * 3);\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\r\n v.triangleCount++;\r\n }\r\n }\r\n this._references = newReferences;\r\n\r\n if (identifyBorders) {\r\n this._identifyBorder();\r\n }\r\n }\r\n\r\n private _vertexError(q: QuadraticMatrix, point: Vector3): number {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return (\r\n q.data[0] * x * x +\r\n 2 * q.data[1] * x * y +\r\n 2 * q.data[2] * x * z +\r\n 2 * q.data[3] * x +\r\n q.data[4] * y * y +\r\n 2 * q.data[5] * y * z +\r\n 2 * q.data[6] * y +\r\n q.data[7] * z * z +\r\n 2 * q.data[8] * z +\r\n q.data[9]\r\n );\r\n }\r\n\r\n private _calculateError(vertex1: DecimationVertex, vertex2: DecimationVertex, pointResult?: Vector3): number {\r\n const q = vertex1.q.add(vertex2.q);\r\n const border = vertex1.isBorder && vertex2.isBorder;\r\n let error: number = 0;\r\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\r\n\r\n if (qDet !== 0 && !border) {\r\n if (!pointResult) {\r\n pointResult = Vector3.Zero();\r\n }\r\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\r\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\r\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\r\n error = this._vertexError(q, pointResult);\r\n } else {\r\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\r\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\r\n const error1 = this._vertexError(q, vertex1.position);\r\n const error2 = this._vertexError(q, vertex2.position);\r\n const error3 = this._vertexError(q, p3);\r\n error = Math.min(error1, error2, error3);\r\n if (error === error1) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex1.position);\r\n }\r\n } else if (error === error2) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex2.position);\r\n }\r\n } else {\r\n if (pointResult) {\r\n pointResult.copyFrom(p3);\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"meshSimplification.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshSimplification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAoClD;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAC/B;;;;;OAKG;IACH;IACI,uBAAuB;IAChB,OAAe;IACtB,0DAA0D;IACnD,QAAgB;IACvB,8BAA8B;IACvB,YAAsB;QAJtB,YAAO,GAAP,OAAO,CAAQ;QAEf,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,iBAAY,GAAZ,YAAY,CAAU;IAC9B,CAAC;CACP;AA4BD;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAQ5B;;OAEG;IACH;QACI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,IAAyB;QACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,WAAW;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,IAAyB;QAC9C,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,qBAAqB;YACrB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC7C,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;oBACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,CAAC;oBACD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzB,yBAAyB;oBACzB,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;wBAC9F,qCAAqC;wBACrC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC3B,CAAC;oBACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,oBAAoB;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAE7C,MAAM,aAAa,GAAG,CAAC,OAAgC,EAAE,QAAoB,EAAE,EAAE;gBAC7E,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;oBACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,CAAC;oBACD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzB,4BAA4B;oBAC5B,QAAQ,EAAE,CAAC;gBACf,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;YAEF,SAAS,CAAC,GAAG,CACT,IAAI,CAAC,QAAQ,CAAC,MAAM,EACpB,CAAC,IAAe,EAAE,EAAE;gBAChB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE;oBAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC,EACD,GAAG,EAAE;gBACD,4CAA4C;gBAC5C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC3B,CAAC;gBACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,IAAyB;QAC5C,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9B,0CAAkC;YAClC;gBACI,OAAO,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAkB,kBAGjB;AAHD,WAAkB,kBAAkB;IAChC,iCAAiC;IACjC,qEAAS,CAAA;AACb,CAAC,EAHiB,kBAAkB,KAAlB,kBAAkB,QAGnC;AAED,MAAM,kBAAkB;IAiBpB,YAAmB,SAAkC;QAAlC,cAAS,GAAT,SAAS,CAAyB;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;CACJ;AAED,MAAM,gBAAgB;IAclB,YACW,QAAiB,EACjB,EAAU;QADV,aAAQ,GAAR,QAAQ,CAAS;QACjB,OAAE,GAAF,EAAE,CAAQ;QAEjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED,gBAAgB;IACT,cAAc,CAAC,WAAoB;QACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;CACJ;AAED,MAAM,eAAe;IAIjB,YAAY,IAAoB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW;QAC1H,MAAM,GAAG,GACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,gBAAgB;IACT,UAAU,CAAC,MAAuB;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,eAAe,CAAC,IAAmB;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,GAAG,CAAC,MAAuB;QAC9B,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QAC7D,OAAO,IAAI,eAAe,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,gDAAgD;IACzC,MAAM,CAAC,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACpE,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,CAAC;CACJ;AAED,MAAM,SAAS;IACX,YACW,QAAgB,EAChB,UAAkB;QADlB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAQ;IAC1B,CAAC;CACP;AAED;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IAmBrC;;;OAGG;IACH,YAAoB,KAAW;QAAX,UAAK,GAAL,KAAK,CAAM;QAhB/B,iDAAiD;QAC1C,mBAAc,GAAG,IAAI,CAAC;QAgBzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,QAAiC,EAAE,eAA+C;QAC9F,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,6DAA6D;QAC7D,SAAS,CAAC,GAAG,CACT,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAC3B,CAAC,IAAe,EAAE,EAAE;YAChB,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,KAAK,EACV,GAAG,EAAE;gBACD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;oBAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC,EACD,QAAQ,CAAC,YAAY,CACxB,CAAC;QACN,CAAC,EACD,GAAG,EAAE;YACD,UAAU,CAAC,GAAG,EAAE;gBACZ,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7C,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CACJ,CAAC;IACN,CAAC;IAEO,cAAc,CAAC,QAAiC,EAAE,YAAoB,EAAE,eAA2B;QACvG,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAE7C,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAE,QAAoB,EAAE,EAAE;YAClE,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC;gBACtC,CAAC;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvC,CAAC;gBAED,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE7E,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE;oBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAChC,IAAI,CAAC,CAAC,EAAE,CAAC;wBACL,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACnD,OAAO;oBACX,CAAC;oBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAmB,EAAE,CAAC;4BACpC,MAAM,QAAQ,GAAmB,EAAE,CAAC;4BAEpC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;4BAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;4BAEpC,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;gCAC7B,SAAS;4BACb,CAAC;4BAED,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;4BACzB,0BAA0B;4BAC1B,2BAA2B;4BAC3B,sCAAsC;4BAEtC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BAEhC,MAAM,KAAK,GAAyB,EAAE,CAAC;4BAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gCAC9C,SAAS;4BACb,CAAC;4BACD,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gCAC9C,SAAS;4BACb,CAAC;4BAED,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC3D,SAAS;4BACb,CAAC;4BAED,MAAM,WAAW,GAAyB,EAAE,CAAC;4BAC7C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gCAC3B,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oCACvC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;oCAC9B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gCAC/B,CAAC;4BACL,CAAC;4BAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gCAC/B,SAAS;4BACb,CAAC;4BAED,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;4BAEtB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;4BAErB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;4BAEvC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;4BAC7E,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;4BAE7E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;4BAEhD,IAAI,MAAM,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;gCAC7B,IAAI,MAAM,EAAE,CAAC;oCACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wCAC9B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oCAC1E,CAAC;gCACL,CAAC;4BACL,CAAC;iCAAM,CAAC;gCACJ,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC;4BAC9B,CAAC;4BAED,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC;4BAC1B,MAAM;wBACV,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC;gBACF,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE;oBACtG,OAAO,aAAa,GAAG,gBAAgB,IAAI,WAAW,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACP,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CAAC;QAEF,SAAS,CAAC,GAAG,CACT,IAAI,CAAC,oBAAoB,EACzB,CAAC,IAAe,EAAE,EAAE;YAChB,IAAI,aAAa,GAAG,gBAAgB,IAAI,WAAW,EAAE,CAAC;gBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACJ,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;oBAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,EACD,GAAG,EAAE;YACD,UAAU,CAAC,GAAG,EAAE;gBACZ,mCAAmC;gBACnC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBACpC,eAAe,EAAE,CAAC;YACtB,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CACJ,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,YAAoB,EAAE,QAAkB,EAAE,YAAsB;QAClF,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEnD,MAAM,cAAc,GAAG,CAAC,gBAAyB,EAAE,EAAE;YACjD,IAAI,YAAY,EAAE,CAAC;gBACf,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;oBAChD,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;wBAC1E,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAC9B,CAAC;gBACL,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAkB,EAAE,CAAC;QAE3C,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,OAAO;YACX,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACjG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,8CAA8C;QAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,SAAS,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE;YACvF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE;gBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;gBACvB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAqB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1F,MAAM,EAAE,GAAqB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1F,MAAM,EAAE,GAAqB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1F,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtD,QAAQ,CAAC,cAAc,GAAG,GAAG,CAAC;gBAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC,CAAC;YACF,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,EAAE;gBACtF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,QAAkB;QAC5B,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC3J,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3J,CAAC;QACL,CAAC,CAAC;QACF,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,EAAE;YACxF,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE;gBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChF,CAAC;gBACD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC;YACF,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,EAAE;gBACxF,QAAQ,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QACzC,MAAM,YAAY,GAA8B,EAAE,CAAC;QACnD,IAAI,CAAS,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAqB,CAAC;QAC1B,IAAI,CAAS,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9B,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACrB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;gBACrC,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,MAAM,eAAe,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7G,MAAM,aAAa,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACzG,MAAM,UAAU,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,MAAM,aAAa,GAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAExG,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEtE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC;YACxB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAClD,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACxC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACxC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAExC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;wBAClC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBACD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;wBACpB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;wBAClC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvD,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBACD,EAAE,WAAW,CAAC;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;QAElE,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;QACzD,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,EAAE,CAAC;QAEvC,MAAM,eAAe,GAAuB,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK;QACvF,MAAM,eAAe,GAAiB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9D,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,mDAAmD;YACxE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;gBACnD,IAAI,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1D,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACb,MAAM,GAAG,CAAC,CAAC;gBACf,CAAC;gBACD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QAED,iDAAiD;QAEjD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACpF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACnF,CAAC;QAED,gBAAgB;QAChB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,EAAE,CAAC;YACvC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACnC,OAAO,CAAC,SAAS,CACb,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa;gBACrB,kCAAkC,CAAC,OAAO,CAAC,UAAU,EACrD,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,OAAO,EAAE,CACpB,CAAC;YACN,CAAC;YACD,OAAO,CAAC,SAAS,CACb,eAAe,CAAC,aAAa,EAC7B,cAAc,EACd,WAAW;YACX,oCAAoC,CAAC,aAAa,EAClD,YAAY,CAAC,MAAM,GAAG,CAAC,EACvB,IAAI,CAAC,kBAAkB,CAC1B,CAAC;QACN,CAAC;IACL,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAC3E,CAAC;IAEO,UAAU,CAAC,OAAyB,EAAE,OAAyB,EAAE,KAAc,EAAE,YAA4B,EAAE,KAAgC;QACnJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAClF,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACZ,SAAS;YACb,CAAC;YAED,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE/D,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEpC,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;gBACnC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACd,SAAS;YACb,CAAC;YAED,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;YACjD,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACxB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,gBAAgB,CAAC,UAA4B,EAAE,MAAwB,EAAE,YAA4B,EAAE,gBAAwB;QACnI,IAAI,UAAU,GAAG,gBAAgB,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACZ,SAAS;YACb,CAAC;YACD,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;gBACrC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;gBACjB,UAAU,EAAE,CAAC;gBACb,SAAS;YACb,CAAC;YACD,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;YACvC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,eAAe;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,MAAM,GAAG,GAAkB,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAS,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACnF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;oBACZ,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAClC,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;wBACzB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;4BACrB,MAAM;wBACV,CAAC;wBACD,EAAE,GAAG,CAAC;oBACV,CAAC;oBACD,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;wBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACJ,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClB,CAAC;gBACL,CAAC;YACL,CAAC;YAED,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;gBAC5C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,kBAA2B,KAAK;QAChD,IAAI,CAAS,CAAC;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,MAAM,kBAAkB,GAA8B,EAAE,CAAC;YACzD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;oBAC9B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;YACL,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAqB,CAAC;QAC1B,IAAI,CAAS,CAAC;QACd,IAAI,CAAmB,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;QACL,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC;YACzC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,aAAa,GAAqB,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACnB,aAAa,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvE,CAAC,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC;QAEjC,IAAI,eAAe,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,CAAkB,EAAE,KAAc;QACnD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB,OAAO,CACH,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACZ,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,OAAyB,EAAE,OAAyB,EAAE,WAAqB;QAC/F,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;QACpD,IAAI,KAAa,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9C,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/E,4FAA4F;YAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACnB,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ","sourcesContent":["import type { IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { AsyncLoop } from \"../Misc/tools\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\n/**\r\n * A simplifier interface for future simplification implementations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplifier {\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n * @param errorCallback in case of an error, this callback will be called. optional.\r\n */\r\n simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;\r\n}\r\n\r\n/**\r\n * Expected simplification settings.\r\n * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport interface ISimplificationSettings {\r\n /**\r\n * Gets or sets the expected quality\r\n */\r\n quality: number;\r\n /**\r\n * Gets or sets the distance when this optimized version should be used\r\n */\r\n distance: number;\r\n /**\r\n * Gets an already optimized mesh\r\n */\r\n optimizeMesh?: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Class used to specify simplification options\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationSettings implements ISimplificationSettings {\r\n /**\r\n * Creates a SimplificationSettings\r\n * @param quality expected quality\r\n * @param distance distance when this optimized version should be used\r\n * @param optimizeMesh already optimized mesh\r\n */\r\n constructor(\r\n /** expected quality */\r\n public quality: number,\r\n /** distance when this optimized version should be used */\r\n public distance: number,\r\n /** already optimized mesh */\r\n public optimizeMesh?: boolean\r\n ) {}\r\n}\r\n\r\n/**\r\n * Interface used to define a simplification task\r\n */\r\nexport interface ISimplificationTask {\r\n /**\r\n * Array of settings\r\n */\r\n settings: Array<ISimplificationSettings>;\r\n /**\r\n * Simplification type\r\n */\r\n simplificationType: SimplificationType;\r\n /**\r\n * Mesh to simplify\r\n */\r\n mesh: Mesh;\r\n /**\r\n * Callback called on success\r\n */\r\n successCallback?: () => void;\r\n /**\r\n * Defines if parallel processing can be used\r\n */\r\n parallelProcessing: boolean;\r\n}\r\n\r\n/**\r\n * Queue used to order the simplification tasks\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class SimplificationQueue {\r\n private _simplificationArray: Array<ISimplificationTask>;\r\n\r\n /**\r\n * Gets a boolean indicating that the process is still running\r\n */\r\n public running: boolean;\r\n\r\n /**\r\n * Creates a new queue\r\n */\r\n constructor() {\r\n this.running = false;\r\n this._simplificationArray = [];\r\n }\r\n\r\n /**\r\n * Adds a new simplification task\r\n * @param task defines a task to add\r\n */\r\n public addTask(task: ISimplificationTask) {\r\n this._simplificationArray.push(task);\r\n }\r\n\r\n /**\r\n * Execute next task\r\n */\r\n public executeNext() {\r\n const task = this._simplificationArray.pop();\r\n if (task) {\r\n this.running = true;\r\n this.runSimplification(task);\r\n } else {\r\n this.running = false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute a simplification task\r\n * @param task defines the task to run\r\n */\r\n public runSimplification(task: ISimplificationTask) {\r\n if (task.parallelProcessing) {\r\n //parallel simplifier\r\n for (const setting of task.settings) {\r\n const simplifier = this._getSimplifier(task);\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //check if it is the last\r\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\r\n //all done, run the success callback.\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n });\r\n }\r\n } else {\r\n //single simplifier.\r\n const simplifier = this._getSimplifier(task);\r\n\r\n const runDecimation = (setting: ISimplificationSettings, callback: () => void) => {\r\n simplifier.simplify(setting, (newMesh) => {\r\n if (setting.distance !== undefined) {\r\n task.mesh.addLODLevel(setting.distance, newMesh);\r\n }\r\n newMesh.isVisible = true;\r\n //run the next quality level\r\n callback();\r\n });\r\n };\r\n\r\n AsyncLoop.Run(\r\n task.settings.length,\r\n (loop: AsyncLoop) => {\r\n runDecimation(task.settings[loop.index], () => {\r\n loop.executeNext();\r\n });\r\n },\r\n () => {\r\n //execution ended, run the success callback.\r\n if (task.successCallback) {\r\n task.successCallback();\r\n }\r\n this.executeNext();\r\n }\r\n );\r\n }\r\n }\r\n\r\n private _getSimplifier(task: ISimplificationTask): ISimplifier {\r\n switch (task.simplificationType) {\r\n case SimplificationType.QUADRATIC:\r\n default:\r\n return new QuadraticErrorSimplification(task.mesh);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The implemented types of simplification\r\n * At the moment only Quadratic Error Decimation is implemented\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport const enum SimplificationType {\r\n /** Quadratic error decimation */\r\n QUADRATIC,\r\n}\r\n\r\nclass DecimationTriangle {\r\n /** @internal */\r\n public normal: Vector3;\r\n /** @internal */\r\n public error: Array<number>;\r\n /** @internal */\r\n public deleted: boolean;\r\n /** @internal */\r\n public isDirty: boolean;\r\n /** @internal */\r\n public borderFactor: number;\r\n /** @internal */\r\n public deletePending: boolean;\r\n\r\n /** @internal */\r\n public originalOffset: number;\r\n\r\n constructor(public _vertices: Array<DecimationVertex>) {\r\n this.error = new Array<number>(4);\r\n this.deleted = false;\r\n this.isDirty = false;\r\n this.deletePending = false;\r\n this.borderFactor = 0;\r\n }\r\n}\r\n\r\nclass DecimationVertex {\r\n /** @internal */\r\n public q: QuadraticMatrix;\r\n /** @internal */\r\n public isBorder: boolean;\r\n\r\n /** @internal */\r\n public triangleStart: number;\r\n /** @internal */\r\n public triangleCount: number;\r\n\r\n /** @internal */\r\n public originalOffsets: Array<number>;\r\n\r\n constructor(\r\n public position: Vector3,\r\n public id: number\r\n ) {\r\n this.isBorder = true;\r\n this.q = new QuadraticMatrix();\r\n this.triangleCount = 0;\r\n this.triangleStart = 0;\r\n this.originalOffsets = [];\r\n }\r\n\r\n /** @internal */\r\n public updatePosition(newPosition: Vector3) {\r\n this.position.copyFrom(newPosition);\r\n }\r\n}\r\n\r\nclass QuadraticMatrix {\r\n /** @internal */\r\n public data: Array<number>;\r\n\r\n constructor(data?: Array<number>) {\r\n this.data = new Array(10);\r\n for (let i = 0; i < 10; ++i) {\r\n if (data && data[i]) {\r\n this.data[i] = data[i];\r\n } else {\r\n this.data[i] = 0;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public det(a11: number, a12: number, a13: number, a21: number, a22: number, a23: number, a31: number, a32: number, a33: number): number {\r\n const det =\r\n this.data[a11] * this.data[a22] * this.data[a33] +\r\n this.data[a13] * this.data[a21] * this.data[a32] +\r\n this.data[a12] * this.data[a23] * this.data[a31] -\r\n this.data[a13] * this.data[a22] * this.data[a31] -\r\n this.data[a11] * this.data[a23] * this.data[a32] -\r\n this.data[a12] * this.data[a21] * this.data[a33];\r\n return det;\r\n }\r\n\r\n /** @internal */\r\n public addInPlace(matrix: QuadraticMatrix) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += matrix.data[i];\r\n }\r\n }\r\n\r\n /** @internal */\r\n public addArrayInPlace(data: Array<number>) {\r\n for (let i = 0; i < 10; ++i) {\r\n this.data[i] += data[i];\r\n }\r\n }\r\n\r\n /** @internal */\r\n public add(matrix: QuadraticMatrix): QuadraticMatrix {\r\n const m = new QuadraticMatrix();\r\n for (let i = 0; i < 10; ++i) {\r\n m.data[i] = this.data[i] + matrix.data[i];\r\n }\r\n return m;\r\n }\r\n\r\n /** @internal */\r\n public static FromData(a: number, b: number, c: number, d: number): QuadraticMatrix {\r\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\r\n }\r\n\r\n //returning an array to avoid garbage collection\r\n public static DataFromNumbers(a: number, b: number, c: number, d: number) {\r\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\r\n }\r\n}\r\n\r\nclass Reference {\r\n constructor(\r\n public vertexId: number,\r\n public triangleId: number\r\n ) {}\r\n}\r\n\r\n/**\r\n * An implementation of the Quadratic Error simplification algorithm.\r\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\r\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\r\n */\r\nexport class QuadraticErrorSimplification implements ISimplifier {\r\n private _triangles: Array<DecimationTriangle>;\r\n private _vertices: Array<DecimationVertex>;\r\n private _references: Array<Reference>;\r\n\r\n private _reconstructedMesh: Mesh;\r\n\r\n /** Gets or sets the number pf sync iterations */\r\n public syncIterations = 5000;\r\n\r\n /** Gets or sets the aggressiveness of the simplifier */\r\n public aggressiveness: number;\r\n\r\n /** Gets or sets the number of allowed iterations for decimation */\r\n public decimationIterations: number;\r\n\r\n /** Gets or sets the espilon to use for bounding box computation */\r\n public boundingBoxEpsilon: number;\r\n\r\n /**\r\n * Creates a new QuadraticErrorSimplification\r\n * @param _mesh defines the target mesh\r\n */\r\n constructor(private _mesh: Mesh) {\r\n this.aggressiveness = 7;\r\n this.decimationIterations = 100;\r\n this.boundingBoxEpsilon = Epsilon;\r\n }\r\n\r\n /**\r\n * Simplification of a given mesh according to the given settings.\r\n * Since this requires computation, it is assumed that the function runs async.\r\n * @param settings The settings of the simplification, including quality and distance\r\n * @param successCallback A callback that will be called after the mesh was simplified.\r\n */\r\n public simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void) {\r\n this._initDecimatedMesh();\r\n //iterating through the submeshes array, one after the other.\r\n AsyncLoop.Run(\r\n this._mesh.subMeshes.length,\r\n (loop: AsyncLoop) => {\r\n this._initWithMesh(\r\n loop.index,\r\n () => {\r\n this._runDecimation(settings, loop.index, () => {\r\n loop.executeNext();\r\n });\r\n },\r\n settings.optimizeMesh\r\n );\r\n },\r\n () => {\r\n setTimeout(() => {\r\n successCallback(this._reconstructedMesh);\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _runDecimation(settings: ISimplificationSettings, submeshIndex: number, successCallback: () => void) {\r\n const targetCount = ~~(this._triangles.length * settings.quality);\r\n let deletedTriangles = 0;\r\n\r\n const triangleCount = this._triangles.length;\r\n\r\n const iterationFunction = (iteration: number, callback: () => void) => {\r\n setTimeout(() => {\r\n if (iteration % 5 === 0) {\r\n this._updateMesh(iteration === 0);\r\n }\r\n\r\n for (let i = 0; i < this._triangles.length; ++i) {\r\n this._triangles[i].isDirty = false;\r\n }\r\n\r\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\r\n\r\n const trianglesIterator = (i: number) => {\r\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\r\n const t = this._triangles[tIdx];\r\n if (!t) {\r\n return;\r\n }\r\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\r\n return;\r\n }\r\n for (let j = 0; j < 3; ++j) {\r\n if (t.error[j] < threshold) {\r\n const deleted0: Array<boolean> = [];\r\n const deleted1: Array<boolean> = [];\r\n\r\n const v0 = t._vertices[j];\r\n const v1 = t._vertices[(j + 1) % 3];\r\n\r\n if (v0.isBorder || v1.isBorder) {\r\n continue;\r\n }\r\n\r\n const p = Vector3.Zero();\r\n // var n = Vector3.Zero();\r\n // var uv = Vector2.Zero();\r\n // var color = new Color4(0, 0, 0, 1);\r\n\r\n this._calculateError(v0, v1, p);\r\n\r\n const delTr: DecimationTriangle[] = [];\r\n\r\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\r\n continue;\r\n }\r\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\r\n continue;\r\n }\r\n\r\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\r\n continue;\r\n }\r\n\r\n const uniqueArray: DecimationTriangle[] = [];\r\n for (const deletedT of delTr) {\r\n if (uniqueArray.indexOf(deletedT) === -1) {\r\n deletedT.deletePending = true;\r\n uniqueArray.push(deletedT);\r\n }\r\n }\r\n\r\n if (uniqueArray.length % 2 !== 0) {\r\n continue;\r\n }\r\n\r\n v0.q = v1.q.add(v0.q);\r\n\r\n v0.updatePosition(p);\r\n\r\n const tStart = this._references.length;\r\n\r\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\r\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\r\n\r\n const tCount = this._references.length - tStart;\r\n\r\n if (tCount <= v0.triangleCount) {\r\n if (tCount) {\r\n for (let c = 0; c < tCount; c++) {\r\n this._references[v0.triangleStart + c] = this._references[tStart + c];\r\n }\r\n }\r\n } else {\r\n v0.triangleStart = tStart;\r\n }\r\n\r\n v0.triangleCount = tCount;\r\n break;\r\n }\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\r\n return triangleCount - deletedTriangles <= targetCount;\r\n });\r\n }, 0);\r\n };\r\n\r\n AsyncLoop.Run(\r\n this.decimationIterations,\r\n (loop: AsyncLoop) => {\r\n if (triangleCount - deletedTriangles <= targetCount) {\r\n loop.breakLoop();\r\n } else {\r\n iterationFunction(loop.index, () => {\r\n loop.executeNext();\r\n });\r\n }\r\n },\r\n () => {\r\n setTimeout(() => {\r\n //reconstruct this part of the mesh\r\n this._reconstructMesh(submeshIndex);\r\n successCallback();\r\n }, 0);\r\n }\r\n );\r\n }\r\n\r\n private _initWithMesh(submeshIndex: number, callback: Function, optimizeMesh?: boolean) {\r\n this._vertices = [];\r\n this._triangles = [];\r\n\r\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const indices = this._mesh.getIndices();\r\n const submesh = this._mesh.subMeshes[submeshIndex];\r\n\r\n const findInVertices = (positionToSearch: Vector3) => {\r\n if (optimizeMesh) {\r\n for (let ii = 0; ii < this._vertices.length; ++ii) {\r\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\r\n return this._vertices[ii];\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const vertexReferences: Array<number> = [];\r\n\r\n const vertexInit = (i: number) => {\r\n if (!positionData) {\r\n return;\r\n }\r\n\r\n const offset = i + submesh.verticesStart;\r\n const position = Vector3.FromArray(positionData, offset * 3);\r\n\r\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\r\n vertex.originalOffsets.push(offset);\r\n if (vertex.id === this._vertices.length) {\r\n this._vertices.push(vertex);\r\n }\r\n vertexReferences.push(vertex.id);\r\n };\r\n //var totalVertices = mesh.getTotalVertices();\r\n const totalVertices = submesh.verticesCount;\r\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\r\n const indicesInit = (i: number) => {\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const offset = submesh.indexStart / 3 + i;\r\n const pos = offset * 3;\r\n const i0 = indices[pos + 0];\r\n const i1 = indices[pos + 1];\r\n const i2 = indices[pos + 2];\r\n const v0: DecimationVertex = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\r\n const v1: DecimationVertex = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\r\n const v2: DecimationVertex = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\r\n const triangle = new DecimationTriangle([v0, v1, v2]);\r\n triangle.originalOffset = pos;\r\n this._triangles.push(triangle);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\r\n this._init(callback);\r\n });\r\n });\r\n }\r\n\r\n private _init(callback: Function) {\r\n const triangleInit1 = (i: number) => {\r\n const t = this._triangles[i];\r\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\r\n for (let j = 0; j < 3; j++) {\r\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\r\n }\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\r\n const triangleInit2 = (i: number) => {\r\n const t = this._triangles[i];\r\n for (let j = 0; j < 3; ++j) {\r\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\r\n }\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n };\r\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\r\n callback();\r\n });\r\n });\r\n }\r\n\r\n private _reconstructMesh(submeshIndex: number) {\r\n const newTriangles: Array<DecimationTriangle> = [];\r\n let i: number;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n t._vertices[j].triangleCount = 1;\r\n }\r\n newTriangles.push(t);\r\n }\r\n }\r\n\r\n const newPositionData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\r\n const newNormalData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\r\n const newUVsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\r\n const newColorsData = <number[]>(this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\r\n\r\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\r\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n let vertexCount = 0;\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n const vertex = this._vertices[i];\r\n vertex.id = vertexCount;\r\n if (vertex.triangleCount) {\r\n for (const originalOffset of vertex.originalOffsets) {\r\n newPositionData.push(vertex.position.x);\r\n newPositionData.push(vertex.position.y);\r\n newPositionData.push(vertex.position.z);\r\n\r\n if (normalData && normalData.length) {\r\n newNormalData.push(normalData[originalOffset * 3]);\r\n newNormalData.push(normalData[originalOffset * 3 + 1]);\r\n newNormalData.push(normalData[originalOffset * 3 + 2]);\r\n }\r\n if (uvs && uvs.length) {\r\n newUVsData.push(uvs[originalOffset * 2]);\r\n newUVsData.push(uvs[originalOffset * 2 + 1]);\r\n }\r\n if (colorsData && colorsData.length) {\r\n newColorsData.push(colorsData[originalOffset * 4]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\r\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\r\n }\r\n ++vertexCount;\r\n }\r\n }\r\n }\r\n\r\n const startingIndex = this._reconstructedMesh.getTotalIndices();\r\n const startingVertex = this._reconstructedMesh.getTotalVertices();\r\n\r\n const submeshesArray = this._reconstructedMesh.subMeshes;\r\n this._reconstructedMesh.subMeshes = [];\r\n\r\n const newIndicesArray: number[] = <number[]>this._reconstructedMesh.getIndices(); //[];\r\n const originalIndices = <IndicesArray>this._mesh.getIndices();\r\n for (i = 0; i < newTriangles.length; ++i) {\r\n t = newTriangles[i]; //now get the new referencing point for each vertex\r\n for (let idx = 0; idx < 3; ++idx) {\r\n const id = originalIndices[t.originalOffset + idx];\r\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\r\n if (offset < 0) {\r\n offset = 0;\r\n }\r\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\r\n }\r\n }\r\n\r\n //overwriting the old vertex buffers and indices.\r\n\r\n this._reconstructedMesh.setIndices(newIndicesArray);\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\r\n if (newNormalData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\r\n }\r\n if (newUVsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\r\n }\r\n if (newColorsData.length > 0) {\r\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\r\n }\r\n\r\n //create submesh\r\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\r\n if (submeshIndex > 0) {\r\n this._reconstructedMesh.subMeshes = [];\r\n for (const submesh of submeshesArray) {\r\n SubMesh.AddToMesh(\r\n submesh.materialIndex,\r\n submesh.verticesStart,\r\n submesh.verticesCount,\r\n /* 0, newPositionData.length/3, */ submesh.indexStart,\r\n submesh.indexCount,\r\n submesh.getMesh()\r\n );\r\n }\r\n SubMesh.AddToMesh(\r\n originalSubmesh.materialIndex,\r\n startingVertex,\r\n vertexCount,\r\n /* 0, newPositionData.length / 3, */ startingIndex,\r\n newTriangles.length * 3,\r\n this._reconstructedMesh\r\n );\r\n }\r\n }\r\n\r\n private _initDecimatedMesh() {\r\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\r\n this._reconstructedMesh.material = this._mesh.material;\r\n this._reconstructedMesh.parent = this._mesh.parent;\r\n this._reconstructedMesh.isVisible = false;\r\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\r\n }\r\n\r\n private _isFlipped(vertex1: DecimationVertex, vertex2: DecimationVertex, point: Vector3, deletedArray: Array<boolean>, delTr: Array<DecimationTriangle>): boolean {\r\n for (let i = 0; i < vertex1.triangleCount; ++i) {\r\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n\r\n const s = this._references[vertex1.triangleStart + i].vertexId;\r\n\r\n const v1 = t._vertices[(s + 1) % 3];\r\n const v2 = t._vertices[(s + 2) % 3];\r\n\r\n if (v1 === vertex2 || v2 === vertex2) {\r\n deletedArray[i] = true;\r\n delTr.push(t);\r\n continue;\r\n }\r\n\r\n let d1 = v1.position.subtract(point);\r\n d1 = d1.normalize();\r\n let d2 = v2.position.subtract(point);\r\n d2 = d2.normalize();\r\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\r\n return true;\r\n }\r\n const normal = Vector3.Cross(d1, d2).normalize();\r\n deletedArray[i] = false;\r\n if (Vector3.Dot(normal, t.normal) < 0.2) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateTriangles(origVertex: DecimationVertex, vertex: DecimationVertex, deletedArray: Array<boolean>, deletedTriangles: number): number {\r\n let newDeleted = deletedTriangles;\r\n for (let i = 0; i < vertex.triangleCount; ++i) {\r\n const ref = this._references[vertex.triangleStart + i];\r\n const t = this._triangles[ref.triangleId];\r\n if (t.deleted) {\r\n continue;\r\n }\r\n if (deletedArray[i] && t.deletePending) {\r\n t.deleted = true;\r\n newDeleted++;\r\n continue;\r\n }\r\n t._vertices[ref.vertexId] = origVertex;\r\n t.isDirty = true;\r\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\r\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\r\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\r\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\r\n this._references.push(ref);\r\n }\r\n return newDeleted;\r\n }\r\n\r\n private _identifyBorder() {\r\n for (let i = 0; i < this._vertices.length; ++i) {\r\n const vCount: Array<number> = [];\r\n const vId: Array<number> = [];\r\n const v = this._vertices[i];\r\n let j: number;\r\n for (j = 0; j < v.triangleCount; ++j) {\r\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\r\n for (let ii = 0; ii < 3; ii++) {\r\n let ofs = 0;\r\n const vv = triangle._vertices[ii];\r\n while (ofs < vCount.length) {\r\n if (vId[ofs] === vv.id) {\r\n break;\r\n }\r\n ++ofs;\r\n }\r\n if (ofs === vCount.length) {\r\n vCount.push(1);\r\n vId.push(vv.id);\r\n } else {\r\n vCount[ofs]++;\r\n }\r\n }\r\n }\r\n\r\n for (j = 0; j < vCount.length; ++j) {\r\n if (vCount[j] === 1) {\r\n this._vertices[vId[j]].isBorder = true;\r\n } else {\r\n this._vertices[vId[j]].isBorder = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateMesh(identifyBorders: boolean = false) {\r\n let i: number;\r\n if (!identifyBorders) {\r\n const newTrianglesVector: Array<DecimationTriangle> = [];\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n if (!this._triangles[i].deleted) {\r\n newTrianglesVector.push(this._triangles[i]);\r\n }\r\n }\r\n this._triangles = newTrianglesVector;\r\n }\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleCount = 0;\r\n this._vertices[i].triangleStart = 0;\r\n }\r\n let t: DecimationTriangle;\r\n let j: number;\r\n let v: DecimationVertex;\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n v.triangleCount++;\r\n }\r\n }\r\n\r\n let tStart = 0;\r\n\r\n for (i = 0; i < this._vertices.length; ++i) {\r\n this._vertices[i].triangleStart = tStart;\r\n tStart += this._vertices[i].triangleCount;\r\n this._vertices[i].triangleCount = 0;\r\n }\r\n\r\n const newReferences: Array<Reference> = new Array(this._triangles.length * 3);\r\n for (i = 0; i < this._triangles.length; ++i) {\r\n t = this._triangles[i];\r\n for (j = 0; j < 3; ++j) {\r\n v = t._vertices[j];\r\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\r\n v.triangleCount++;\r\n }\r\n }\r\n this._references = newReferences;\r\n\r\n if (identifyBorders) {\r\n this._identifyBorder();\r\n }\r\n }\r\n\r\n private _vertexError(q: QuadraticMatrix, point: Vector3): number {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return (\r\n q.data[0] * x * x +\r\n 2 * q.data[1] * x * y +\r\n 2 * q.data[2] * x * z +\r\n 2 * q.data[3] * x +\r\n q.data[4] * y * y +\r\n 2 * q.data[5] * y * z +\r\n 2 * q.data[6] * y +\r\n q.data[7] * z * z +\r\n 2 * q.data[8] * z +\r\n q.data[9]\r\n );\r\n }\r\n\r\n private _calculateError(vertex1: DecimationVertex, vertex2: DecimationVertex, pointResult?: Vector3): number {\r\n const q = vertex1.q.add(vertex2.q);\r\n const border = vertex1.isBorder && vertex2.isBorder;\r\n let error: number;\r\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\r\n\r\n if (qDet !== 0 && !border) {\r\n if (!pointResult) {\r\n pointResult = Vector3.Zero();\r\n }\r\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\r\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\r\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\r\n error = this._vertexError(q, pointResult);\r\n } else {\r\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\r\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\r\n const error1 = this._vertexError(q, vertex1.position);\r\n const error2 = this._vertexError(q, vertex2.position);\r\n const error3 = this._vertexError(q, p3);\r\n error = Math.min(error1, error2, error3);\r\n if (error === error1) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex1.position);\r\n }\r\n } else if (error === error2) {\r\n if (pointResult) {\r\n pointResult.copyFrom(vertex2.position);\r\n }\r\n } else {\r\n if (pointResult) {\r\n pointResult.copyFrom(p3);\r\n }\r\n }\r\n }\r\n return error;\r\n }\r\n}\r\n"]}
@@ -280,7 +280,7 @@ export class PolygonMeshBuilder {
280
280
  }
281
281
  const vcNorm = vc.normalizeToNew();
282
282
  let vpNorm = vp.normalizeToNew();
283
- let vnNorm = vn.normalizeToNew();
283
+ let vnNorm;
284
284
  const dotp = Vector3.Dot(vpNorm, vcNorm);
285
285
  if (dotp > smoothingThreshold) {
286
286
  if (dotp < Epsilon - 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"polygonMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/polygonMesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAIrD;;GAEG;AACH,MAAM,cAAe,SAAQ,OAAO;IAChC,gBAAgB;IAChB,YACI,QAAiB;IACjB,2BAA2B;IACpB,KAAa;QAEpB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAFvB,UAAK,GAAL,KAAK,CAAQ;IAGxB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,aAAa;IAAnB;QACI,gBAAgB;QAChB,aAAQ,GAAG,EAAsB,CAAC;IA0CtC,CAAC;IAxCG,gBAAgB;IAChB,GAAG,CAAC,cAA8B;QAC9B,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,gBAAgB;IAChB,aAAa;QACT,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI;YACJ,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,CAAC;YAED,IAAI;YACJ,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;QAED,OAAO;YACH,GAAG,EAAE,IAAI;YACT,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACtB,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;SAC1B,CAAC;IACN,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,OAAO;IAChB;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY;QACnE,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAChH,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,CAAC,MAAc,EAAE,KAAa,CAAC,EAAE,KAAa,CAAC,EAAE,gBAAwB,EAAE;QACpF,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC;QAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACvF,KAAK,IAAI,SAAS,CAAC;QACvB,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa;QACtB,MAAM,MAAM,GAAG,KAAK;aACf,KAAK,CAAC,aAAa,CAAC;aACpB,GAAG,CAAC,UAAU,CAAC;aACf,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,IAAI,CAAS,CAAC;QACd,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,CAAS,EAAE,CAAS;QAClC,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAWnB,YAAY,CAAC,MAAiB;QAClC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAOD;;;;;;OAMG;IACH,YAAY,IAAY,EAAE,QAAiC,EAAE,KAAa,EAAE,eAAe,GAAG,MAAM;QA5B5F,YAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9B,mBAAc,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,WAAM,GAAG,IAAI,KAAK,EAAiB,CAAC;QAKpC,aAAQ,GAAa,IAAI,KAAK,EAAU,CAAC;QACzC,YAAO,GAAa,IAAI,KAAK,EAAU,CAAC;QAqB5C,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,WAAW,CAAC,gBAAgB,CAAC;QAEpD,IAAI,MAAiB,CAAC;QACtB,IAAI,QAAQ,YAAY,KAAK,EAAE,CAAC;YAC5B,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,MAAM,GAAc,QAAQ,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAe;QACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;QACvC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAExB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAqB,KAAK,EAAE,QAAgB,CAAC,EAAE,qBAA6B,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QAEnE,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAY,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7F,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAY,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,EAAY,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACjF,MAAM,CAAC,UAAU,CAAW,UAAU,CAAC,OAAO,CAAC,CAAC;QAEhD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,QAAgB,CAAC,EAAE,qBAA6B,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACZ,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,4BAA4B;YAEzE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACpC,+BAA+B;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChG,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAE1B,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC;YACtC,CAAC;YAED,eAAe;YACf,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;YAE/G,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;YACnG,CAAC;QACL,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAEjB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;;;;;;OAWG;IACK,QAAQ,CAAC,SAAgB,EAAE,OAAc,EAAE,GAAU,EAAE,OAAc,EAAE,MAAW,EAAE,MAAqB,EAAE,KAAa,EAAE,IAAa,EAAE,kBAA0B;QACvK,IAAI,UAAU,GAAW,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,IAAI,OAAO,GAAW,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,GAAmB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAmB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE7E,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAEnC,MAAM,EAAE,GAAmB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtG,MAAM,EAAE,GAAmB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE7E,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAErD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;YACnC,IAAI,MAAM,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;YACjC,IAAI,MAAM,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;YAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,IAAI,GAAG,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACvF,CAAC;qBAAM,CAAC;oBACJ,uCAAuC;oBACvC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;gBACpC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,MAAM,CAAC;YACpB,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,IAAI,GAAG,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;oBACrB,eAAe;oBACf,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACvF,CAAC;qBAAM,CAAC;oBACJ,uCAAuC;oBACvC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;gBACpC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,MAAM,CAAC;YACpB,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,OAAO,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAEpC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAE7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAE7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,UAAU,IAAI,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;CACJ","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Path2 } from \"../Maths/math.path\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let earcut: any;\r\n/**\r\n * Vector2 wth index property\r\n */\r\nclass IndexedVector2 extends Vector2 {\r\n /** @internal */\r\n constructor(\r\n original: Vector2,\r\n /** Index of the vector2 */\r\n public index: number\r\n ) {\r\n super(original.x, original.y);\r\n }\r\n}\r\n\r\n/**\r\n * Defines points to create a polygon\r\n */\r\nclass PolygonPoints {\r\n /** @internal */\r\n elements = [] as IndexedVector2[];\r\n\r\n /** @internal */\r\n add(originalPoints: Array<Vector2>): Array<IndexedVector2> {\r\n const result: IndexedVector2[] = [];\r\n for (const point of originalPoints) {\r\n const newPoint = new IndexedVector2(point, this.elements.length);\r\n result.push(newPoint);\r\n this.elements.push(newPoint);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** @internal */\r\n computeBounds(): { min: Vector2; max: Vector2; width: number; height: number } {\r\n const lmin = new Vector2(this.elements[0].x, this.elements[0].y);\r\n const lmax = new Vector2(this.elements[0].x, this.elements[0].y);\r\n\r\n for (const point of this.elements) {\r\n // x\r\n if (point.x < lmin.x) {\r\n lmin.x = point.x;\r\n } else if (point.x > lmax.x) {\r\n lmax.x = point.x;\r\n }\r\n\r\n // y\r\n if (point.y < lmin.y) {\r\n lmin.y = point.y;\r\n } else if (point.y > lmax.y) {\r\n lmax.y = point.y;\r\n }\r\n }\r\n\r\n return {\r\n min: lmin,\r\n max: lmax,\r\n width: lmax.x - lmin.x,\r\n height: lmax.y - lmin.y,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Polygon\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon\r\n */\r\nexport class Polygon {\r\n /**\r\n * Creates a rectangle\r\n * @param xmin bottom X coord\r\n * @param ymin bottom Y coord\r\n * @param xmax top X coord\r\n * @param ymax top Y coord\r\n * @returns points that make the resulting rectangle\r\n */\r\n static Rectangle(xmin: number, ymin: number, xmax: number, ymax: number): Vector2[] {\r\n return [new Vector2(xmin, ymin), new Vector2(xmax, ymin), new Vector2(xmax, ymax), new Vector2(xmin, ymax)];\r\n }\r\n\r\n /**\r\n * Creates a circle\r\n * @param radius radius of circle\r\n * @param cx scale in x\r\n * @param cy scale in y\r\n * @param numberOfSides number of sides that make up the circle\r\n * @returns points that make the resulting circle\r\n */\r\n static Circle(radius: number, cx: number = 0, cy: number = 0, numberOfSides: number = 32): Vector2[] {\r\n const result: Vector2[] = [];\r\n\r\n let angle = 0;\r\n const increment = (Math.PI * 2) / numberOfSides;\r\n\r\n for (let i = 0; i < numberOfSides; i++) {\r\n result.push(new Vector2(cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius));\r\n angle -= increment;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a polygon from input string\r\n * @param input Input polygon data\r\n * @returns the parsed points\r\n */\r\n static Parse(input: string): Vector2[] {\r\n const floats = input\r\n .split(/[^-+eE.\\d]+/)\r\n .map(parseFloat)\r\n .filter((val) => !isNaN(val));\r\n let i: number;\r\n const result = [];\r\n for (i = 0; i < (floats.length & 0x7ffffffe); i += 2) {\r\n result.push(new Vector2(floats[i], floats[i + 1]));\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Starts building a polygon from x and y coordinates\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @returns the started path2\r\n */\r\n static StartingAt(x: number, y: number): Path2 {\r\n return Path2.StartingAt(x, y);\r\n }\r\n}\r\n\r\n/**\r\n * Builds a polygon\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/polyMeshBuilder\r\n */\r\nexport class PolygonMeshBuilder {\r\n private _points = new PolygonPoints();\r\n private _outlinepoints = new PolygonPoints();\r\n private _holes = new Array<PolygonPoints>();\r\n\r\n private _name: string;\r\n private _scene: Nullable<Scene>;\r\n\r\n private _epoints: number[] = new Array<number>();\r\n private _eholes: number[] = new Array<number>();\r\n\r\n private _addToepoint(points: Vector2[]) {\r\n for (const p of points) {\r\n this._epoints.push(p.x, p.y);\r\n }\r\n }\r\n\r\n /**\r\n * Babylon reference to the earcut plugin.\r\n */\r\n public bjsEarcut: any;\r\n\r\n /**\r\n * Creates a PolygonMeshBuilder\r\n * @param name name of the builder\r\n * @param contours Path of the polygon\r\n * @param scene scene to add to when creating the mesh\r\n * @param earcutInjection can be used to inject your own earcut reference\r\n */\r\n constructor(name: string, contours: Path2 | Vector2[] | any, scene?: Scene, earcutInjection = earcut) {\r\n this.bjsEarcut = earcutInjection;\r\n this._name = name;\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n\r\n let points: Vector2[];\r\n if (contours instanceof Path2) {\r\n points = contours.getPoints();\r\n } else {\r\n points = <Vector2[]>contours;\r\n }\r\n\r\n this._addToepoint(points);\r\n\r\n this._points.add(points);\r\n this._outlinepoints.add(points);\r\n\r\n if (typeof this.bjsEarcut === \"undefined\") {\r\n Logger.Warn(\"Earcut was not found, the polygon will not be built.\");\r\n }\r\n }\r\n\r\n /**\r\n * Adds a hole within the polygon\r\n * @param hole Array of points defining the hole\r\n * @returns this\r\n */\r\n addHole(hole: Vector2[]): PolygonMeshBuilder {\r\n this._points.add(hole);\r\n const holepoints = new PolygonPoints();\r\n holepoints.add(hole);\r\n this._holes.push(holepoints);\r\n\r\n this._eholes.push(this._epoints.length / 2);\r\n this._addToepoint(hole);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates the polygon\r\n * @param updatable If the mesh should be updatable\r\n * @param depth The depth of the mesh created\r\n * @param smoothingThreshold Dot product threshold for smoothed normals\r\n * @returns the created mesh\r\n */\r\n build(updatable: boolean = false, depth: number = 0, smoothingThreshold: number = 2): Mesh {\r\n const result = new Mesh(this._name, this._scene);\r\n\r\n const vertexData = this.buildVertexData(depth, smoothingThreshold);\r\n\r\n result.setVerticesData(VertexBuffer.PositionKind, <number[]>vertexData.positions, updatable);\r\n result.setVerticesData(VertexBuffer.NormalKind, <number[]>vertexData.normals, updatable);\r\n result.setVerticesData(VertexBuffer.UVKind, <number[]>vertexData.uvs, updatable);\r\n result.setIndices(<number[]>vertexData.indices);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates the polygon\r\n * @param depth The depth of the mesh created\r\n * @param smoothingThreshold Dot product threshold for smoothed normals\r\n * @returns the created VertexData\r\n */\r\n buildVertexData(depth: number = 0, smoothingThreshold: number = 2): VertexData {\r\n const result = new VertexData();\r\n\r\n const normals: number[] = [];\r\n const positions: number[] = [];\r\n const uvs: number[] = [];\r\n\r\n const bounds = this._points.computeBounds();\r\n for (const p of this._points.elements) {\r\n normals.push(0, 1.0, 0);\r\n positions.push(p.x, 0, p.y);\r\n uvs.push((p.x - bounds.min.x) / bounds.width, (p.y - bounds.min.y) / bounds.height);\r\n }\r\n\r\n const indices: number[] = [];\r\n\r\n const res = this.bjsEarcut(this._epoints, this._eholes, 2);\r\n\r\n for (let i = 0; i < res.length; i++) {\r\n indices.push(res[i]);\r\n }\r\n\r\n if (depth > 0) {\r\n const positionscount = positions.length / 3; //get the current pointcount\r\n\r\n for (const p of this._points.elements) {\r\n //add the elements at the depth\r\n normals.push(0, -1.0, 0);\r\n positions.push(p.x, -depth, p.y);\r\n uvs.push(1 - (p.x - bounds.min.x) / bounds.width, 1 - (p.y - bounds.min.y) / bounds.height);\r\n }\r\n\r\n const totalCount = indices.length;\r\n for (let i = 0; i < totalCount; i += 3) {\r\n const i0 = indices[i + 0];\r\n const i1 = indices[i + 1];\r\n const i2 = indices[i + 2];\r\n\r\n indices.push(i2 + positionscount);\r\n indices.push(i1 + positionscount);\r\n indices.push(i0 + positionscount);\r\n }\r\n\r\n //Add the sides\r\n this._addSide(positions, normals, uvs, indices, bounds, this._outlinepoints, depth, false, smoothingThreshold);\r\n\r\n for (const hole of this._holes) {\r\n this._addSide(positions, normals, uvs, indices, bounds, hole, depth, true, smoothingThreshold);\r\n }\r\n }\r\n\r\n result.indices = indices;\r\n result.positions = positions;\r\n result.normals = normals;\r\n result.uvs = uvs;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a side to the polygon\r\n * @param positions points that make the polygon\r\n * @param normals normals of the polygon\r\n * @param uvs uvs of the polygon\r\n * @param indices indices of the polygon\r\n * @param bounds bounds of the polygon\r\n * @param points points of the polygon\r\n * @param depth depth of the polygon\r\n * @param flip flip of the polygon\r\n * @param smoothingThreshold\r\n */\r\n private _addSide(positions: any[], normals: any[], uvs: any[], indices: any[], bounds: any, points: PolygonPoints, depth: number, flip: boolean, smoothingThreshold: number) {\r\n let startIndex: number = positions.length / 3;\r\n let ulength: number = 0;\r\n for (let i: number = 0; i < points.elements.length; i++) {\r\n const p: IndexedVector2 = points.elements[i];\r\n const p1: IndexedVector2 = points.elements[(i + 1) % points.elements.length];\r\n\r\n positions.push(p.x, 0, p.y);\r\n positions.push(p.x, -depth, p.y);\r\n positions.push(p1.x, 0, p1.y);\r\n positions.push(p1.x, -depth, p1.y);\r\n\r\n const p0: IndexedVector2 = points.elements[(i + points.elements.length - 1) % points.elements.length];\r\n const p2: IndexedVector2 = points.elements[(i + 2) % points.elements.length];\r\n\r\n let vc = new Vector3(-(p1.y - p.y), 0, p1.x - p.x);\r\n let vp = new Vector3(-(p.y - p0.y), 0, p.x - p0.x);\r\n let vn = new Vector3(-(p2.y - p1.y), 0, p2.x - p1.x);\r\n\r\n if (!flip) {\r\n vc = vc.scale(-1);\r\n vp = vp.scale(-1);\r\n vn = vn.scale(-1);\r\n }\r\n\r\n const vcNorm = vc.normalizeToNew();\r\n let vpNorm = vp.normalizeToNew();\r\n let vnNorm = vn.normalizeToNew();\r\n\r\n const dotp = Vector3.Dot(vpNorm, vcNorm);\r\n if (dotp > smoothingThreshold) {\r\n if (dotp < Epsilon - 1) {\r\n vpNorm = new Vector3(p.x, 0, p.y).subtract(new Vector3(p1.x, 0, p1.y)).normalize();\r\n } else {\r\n // cheap average weighed by side length\r\n vpNorm = vp.add(vc).normalize();\r\n }\r\n } else {\r\n vpNorm = vcNorm;\r\n }\r\n\r\n const dotn = Vector3.Dot(vn, vc);\r\n if (dotn > smoothingThreshold) {\r\n if (dotn < Epsilon - 1) {\r\n // back to back\r\n vnNorm = new Vector3(p1.x, 0, p1.y).subtract(new Vector3(p.x, 0, p.y)).normalize();\r\n } else {\r\n // cheap average weighed by side length\r\n vnNorm = vn.add(vc).normalize();\r\n }\r\n } else {\r\n vnNorm = vcNorm;\r\n }\r\n\r\n uvs.push(ulength / bounds.width, 0);\r\n uvs.push(ulength / bounds.width, 1);\r\n ulength += vc.length();\r\n uvs.push(ulength / bounds.width, 0);\r\n uvs.push(ulength / bounds.width, 1);\r\n\r\n normals.push(vpNorm.x, vpNorm.y, vpNorm.z);\r\n normals.push(vpNorm.x, vpNorm.y, vpNorm.z);\r\n normals.push(vnNorm.x, vnNorm.y, vnNorm.z);\r\n normals.push(vnNorm.x, vnNorm.y, vnNorm.z);\r\n\r\n if (!flip) {\r\n indices.push(startIndex);\r\n indices.push(startIndex + 1);\r\n indices.push(startIndex + 2);\r\n\r\n indices.push(startIndex + 1);\r\n indices.push(startIndex + 3);\r\n indices.push(startIndex + 2);\r\n } else {\r\n indices.push(startIndex);\r\n indices.push(startIndex + 2);\r\n indices.push(startIndex + 1);\r\n\r\n indices.push(startIndex + 1);\r\n indices.push(startIndex + 2);\r\n indices.push(startIndex + 3);\r\n }\r\n startIndex += 4;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"polygonMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/polygonMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Path2 } from \"../Maths/math.path\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let earcut: any;\r\n/**\r\n * Vector2 wth index property\r\n */\r\nclass IndexedVector2 extends Vector2 {\r\n /** @internal */\r\n constructor(\r\n original: Vector2,\r\n /** Index of the vector2 */\r\n public index: number\r\n ) {\r\n super(original.x, original.y);\r\n }\r\n}\r\n\r\n/**\r\n * Defines points to create a polygon\r\n */\r\nclass PolygonPoints {\r\n /** @internal */\r\n elements = [] as IndexedVector2[];\r\n\r\n /** @internal */\r\n add(originalPoints: Array<Vector2>): Array<IndexedVector2> {\r\n const result: IndexedVector2[] = [];\r\n for (const point of originalPoints) {\r\n const newPoint = new IndexedVector2(point, this.elements.length);\r\n result.push(newPoint);\r\n this.elements.push(newPoint);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** @internal */\r\n computeBounds(): { min: Vector2; max: Vector2; width: number; height: number } {\r\n const lmin = new Vector2(this.elements[0].x, this.elements[0].y);\r\n const lmax = new Vector2(this.elements[0].x, this.elements[0].y);\r\n\r\n for (const point of this.elements) {\r\n // x\r\n if (point.x < lmin.x) {\r\n lmin.x = point.x;\r\n } else if (point.x > lmax.x) {\r\n lmax.x = point.x;\r\n }\r\n\r\n // y\r\n if (point.y < lmin.y) {\r\n lmin.y = point.y;\r\n } else if (point.y > lmax.y) {\r\n lmax.y = point.y;\r\n }\r\n }\r\n\r\n return {\r\n min: lmin,\r\n max: lmax,\r\n width: lmax.x - lmin.x,\r\n height: lmax.y - lmin.y,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Polygon\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon\r\n */\r\nexport class Polygon {\r\n /**\r\n * Creates a rectangle\r\n * @param xmin bottom X coord\r\n * @param ymin bottom Y coord\r\n * @param xmax top X coord\r\n * @param ymax top Y coord\r\n * @returns points that make the resulting rectangle\r\n */\r\n static Rectangle(xmin: number, ymin: number, xmax: number, ymax: number): Vector2[] {\r\n return [new Vector2(xmin, ymin), new Vector2(xmax, ymin), new Vector2(xmax, ymax), new Vector2(xmin, ymax)];\r\n }\r\n\r\n /**\r\n * Creates a circle\r\n * @param radius radius of circle\r\n * @param cx scale in x\r\n * @param cy scale in y\r\n * @param numberOfSides number of sides that make up the circle\r\n * @returns points that make the resulting circle\r\n */\r\n static Circle(radius: number, cx: number = 0, cy: number = 0, numberOfSides: number = 32): Vector2[] {\r\n const result: Vector2[] = [];\r\n\r\n let angle = 0;\r\n const increment = (Math.PI * 2) / numberOfSides;\r\n\r\n for (let i = 0; i < numberOfSides; i++) {\r\n result.push(new Vector2(cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius));\r\n angle -= increment;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a polygon from input string\r\n * @param input Input polygon data\r\n * @returns the parsed points\r\n */\r\n static Parse(input: string): Vector2[] {\r\n const floats = input\r\n .split(/[^-+eE.\\d]+/)\r\n .map(parseFloat)\r\n .filter((val) => !isNaN(val));\r\n let i: number;\r\n const result = [];\r\n for (i = 0; i < (floats.length & 0x7ffffffe); i += 2) {\r\n result.push(new Vector2(floats[i], floats[i + 1]));\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Starts building a polygon from x and y coordinates\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @returns the started path2\r\n */\r\n static StartingAt(x: number, y: number): Path2 {\r\n return Path2.StartingAt(x, y);\r\n }\r\n}\r\n\r\n/**\r\n * Builds a polygon\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/polyMeshBuilder\r\n */\r\nexport class PolygonMeshBuilder {\r\n private _points = new PolygonPoints();\r\n private _outlinepoints = new PolygonPoints();\r\n private _holes = new Array<PolygonPoints>();\r\n\r\n private _name: string;\r\n private _scene: Nullable<Scene>;\r\n\r\n private _epoints: number[] = new Array<number>();\r\n private _eholes: number[] = new Array<number>();\r\n\r\n private _addToepoint(points: Vector2[]) {\r\n for (const p of points) {\r\n this._epoints.push(p.x, p.y);\r\n }\r\n }\r\n\r\n /**\r\n * Babylon reference to the earcut plugin.\r\n */\r\n public bjsEarcut: any;\r\n\r\n /**\r\n * Creates a PolygonMeshBuilder\r\n * @param name name of the builder\r\n * @param contours Path of the polygon\r\n * @param scene scene to add to when creating the mesh\r\n * @param earcutInjection can be used to inject your own earcut reference\r\n */\r\n constructor(name: string, contours: Path2 | Vector2[] | any, scene?: Scene, earcutInjection = earcut) {\r\n this.bjsEarcut = earcutInjection;\r\n this._name = name;\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n\r\n let points: Vector2[];\r\n if (contours instanceof Path2) {\r\n points = contours.getPoints();\r\n } else {\r\n points = <Vector2[]>contours;\r\n }\r\n\r\n this._addToepoint(points);\r\n\r\n this._points.add(points);\r\n this._outlinepoints.add(points);\r\n\r\n if (typeof this.bjsEarcut === \"undefined\") {\r\n Logger.Warn(\"Earcut was not found, the polygon will not be built.\");\r\n }\r\n }\r\n\r\n /**\r\n * Adds a hole within the polygon\r\n * @param hole Array of points defining the hole\r\n * @returns this\r\n */\r\n addHole(hole: Vector2[]): PolygonMeshBuilder {\r\n this._points.add(hole);\r\n const holepoints = new PolygonPoints();\r\n holepoints.add(hole);\r\n this._holes.push(holepoints);\r\n\r\n this._eholes.push(this._epoints.length / 2);\r\n this._addToepoint(hole);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates the polygon\r\n * @param updatable If the mesh should be updatable\r\n * @param depth The depth of the mesh created\r\n * @param smoothingThreshold Dot product threshold for smoothed normals\r\n * @returns the created mesh\r\n */\r\n build(updatable: boolean = false, depth: number = 0, smoothingThreshold: number = 2): Mesh {\r\n const result = new Mesh(this._name, this._scene);\r\n\r\n const vertexData = this.buildVertexData(depth, smoothingThreshold);\r\n\r\n result.setVerticesData(VertexBuffer.PositionKind, <number[]>vertexData.positions, updatable);\r\n result.setVerticesData(VertexBuffer.NormalKind, <number[]>vertexData.normals, updatable);\r\n result.setVerticesData(VertexBuffer.UVKind, <number[]>vertexData.uvs, updatable);\r\n result.setIndices(<number[]>vertexData.indices);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates the polygon\r\n * @param depth The depth of the mesh created\r\n * @param smoothingThreshold Dot product threshold for smoothed normals\r\n * @returns the created VertexData\r\n */\r\n buildVertexData(depth: number = 0, smoothingThreshold: number = 2): VertexData {\r\n const result = new VertexData();\r\n\r\n const normals: number[] = [];\r\n const positions: number[] = [];\r\n const uvs: number[] = [];\r\n\r\n const bounds = this._points.computeBounds();\r\n for (const p of this._points.elements) {\r\n normals.push(0, 1.0, 0);\r\n positions.push(p.x, 0, p.y);\r\n uvs.push((p.x - bounds.min.x) / bounds.width, (p.y - bounds.min.y) / bounds.height);\r\n }\r\n\r\n const indices: number[] = [];\r\n\r\n const res = this.bjsEarcut(this._epoints, this._eholes, 2);\r\n\r\n for (let i = 0; i < res.length; i++) {\r\n indices.push(res[i]);\r\n }\r\n\r\n if (depth > 0) {\r\n const positionscount = positions.length / 3; //get the current pointcount\r\n\r\n for (const p of this._points.elements) {\r\n //add the elements at the depth\r\n normals.push(0, -1.0, 0);\r\n positions.push(p.x, -depth, p.y);\r\n uvs.push(1 - (p.x - bounds.min.x) / bounds.width, 1 - (p.y - bounds.min.y) / bounds.height);\r\n }\r\n\r\n const totalCount = indices.length;\r\n for (let i = 0; i < totalCount; i += 3) {\r\n const i0 = indices[i + 0];\r\n const i1 = indices[i + 1];\r\n const i2 = indices[i + 2];\r\n\r\n indices.push(i2 + positionscount);\r\n indices.push(i1 + positionscount);\r\n indices.push(i0 + positionscount);\r\n }\r\n\r\n //Add the sides\r\n this._addSide(positions, normals, uvs, indices, bounds, this._outlinepoints, depth, false, smoothingThreshold);\r\n\r\n for (const hole of this._holes) {\r\n this._addSide(positions, normals, uvs, indices, bounds, hole, depth, true, smoothingThreshold);\r\n }\r\n }\r\n\r\n result.indices = indices;\r\n result.positions = positions;\r\n result.normals = normals;\r\n result.uvs = uvs;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a side to the polygon\r\n * @param positions points that make the polygon\r\n * @param normals normals of the polygon\r\n * @param uvs uvs of the polygon\r\n * @param indices indices of the polygon\r\n * @param bounds bounds of the polygon\r\n * @param points points of the polygon\r\n * @param depth depth of the polygon\r\n * @param flip flip of the polygon\r\n * @param smoothingThreshold\r\n */\r\n private _addSide(positions: any[], normals: any[], uvs: any[], indices: any[], bounds: any, points: PolygonPoints, depth: number, flip: boolean, smoothingThreshold: number) {\r\n let startIndex: number = positions.length / 3;\r\n let ulength: number = 0;\r\n for (let i: number = 0; i < points.elements.length; i++) {\r\n const p: IndexedVector2 = points.elements[i];\r\n const p1: IndexedVector2 = points.elements[(i + 1) % points.elements.length];\r\n\r\n positions.push(p.x, 0, p.y);\r\n positions.push(p.x, -depth, p.y);\r\n positions.push(p1.x, 0, p1.y);\r\n positions.push(p1.x, -depth, p1.y);\r\n\r\n const p0: IndexedVector2 = points.elements[(i + points.elements.length - 1) % points.elements.length];\r\n const p2: IndexedVector2 = points.elements[(i + 2) % points.elements.length];\r\n\r\n let vc = new Vector3(-(p1.y - p.y), 0, p1.x - p.x);\r\n let vp = new Vector3(-(p.y - p0.y), 0, p.x - p0.x);\r\n let vn = new Vector3(-(p2.y - p1.y), 0, p2.x - p1.x);\r\n\r\n if (!flip) {\r\n vc = vc.scale(-1);\r\n vp = vp.scale(-1);\r\n vn = vn.scale(-1);\r\n }\r\n\r\n const vcNorm = vc.normalizeToNew();\r\n let vpNorm = vp.normalizeToNew();\r\n let vnNorm: Vector3;\r\n\r\n const dotp = Vector3.Dot(vpNorm, vcNorm);\r\n if (dotp > smoothingThreshold) {\r\n if (dotp < Epsilon - 1) {\r\n vpNorm = new Vector3(p.x, 0, p.y).subtract(new Vector3(p1.x, 0, p1.y)).normalize();\r\n } else {\r\n // cheap average weighed by side length\r\n vpNorm = vp.add(vc).normalize();\r\n }\r\n } else {\r\n vpNorm = vcNorm;\r\n }\r\n\r\n const dotn = Vector3.Dot(vn, vc);\r\n if (dotn > smoothingThreshold) {\r\n if (dotn < Epsilon - 1) {\r\n // back to back\r\n vnNorm = new Vector3(p1.x, 0, p1.y).subtract(new Vector3(p.x, 0, p.y)).normalize();\r\n } else {\r\n // cheap average weighed by side length\r\n vnNorm = vn.add(vc).normalize();\r\n }\r\n } else {\r\n vnNorm = vcNorm;\r\n }\r\n\r\n uvs.push(ulength / bounds.width, 0);\r\n uvs.push(ulength / bounds.width, 1);\r\n ulength += vc.length();\r\n uvs.push(ulength / bounds.width, 0);\r\n uvs.push(ulength / bounds.width, 1);\r\n\r\n normals.push(vpNorm.x, vpNorm.y, vpNorm.z);\r\n normals.push(vpNorm.x, vpNorm.y, vpNorm.z);\r\n normals.push(vnNorm.x, vnNorm.y, vnNorm.z);\r\n normals.push(vnNorm.x, vnNorm.y, vnNorm.z);\r\n\r\n if (!flip) {\r\n indices.push(startIndex);\r\n indices.push(startIndex + 1);\r\n indices.push(startIndex + 2);\r\n\r\n indices.push(startIndex + 1);\r\n indices.push(startIndex + 3);\r\n indices.push(startIndex + 2);\r\n } else {\r\n indices.push(startIndex);\r\n indices.push(startIndex + 2);\r\n indices.push(startIndex + 1);\r\n\r\n indices.push(startIndex + 1);\r\n indices.push(startIndex + 2);\r\n indices.push(startIndex + 3);\r\n }\r\n startIndex += 4;\r\n }\r\n }\r\n}\r\n"]}
@@ -53,7 +53,7 @@ export class TrailMesh extends Mesh {
53
53
  const normals = [];
54
54
  const indices = [];
55
55
  const uvs = [];
56
- let meshCenter = Vector3.Zero();
56
+ let meshCenter;
57
57
  if (this._generator instanceof AbstractMesh && this._generator.hasBoundingInfo) {
58
58
  meshCenter = this._generator.getBoundingInfo().boundingBox.centerWorld;
59
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"trailMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/trailMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { Lerp } from \"../Maths/math.scalar.functions\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\nMesh._TrailMeshParser = (parsedMesh: any, scene: Scene) => {\r\n return TrailMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Options to be used when creating a trail mesh\r\n */\r\nexport interface ITrailMeshOptions {\r\n /**\r\n * diameter of trailing mesh (default: 1)\r\n */\r\n diameter?: number;\r\n /**\r\n * length of trailing mesh (default: 60)\r\n */\r\n length?: number;\r\n /**\r\n * segments of trailing mesh (default: length)\r\n */\r\n segments?: number;\r\n /**\r\n * sections of trailing mesh (default: 4)\r\n */\r\n sections?: number;\r\n /**\r\n * tapers the trailing mesh (default: false)\r\n */\r\n doNotTaper?: boolean;\r\n /**\r\n * automatically start trailing mesh. (default: true)\r\n */\r\n autoStart?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to create a trail following a mesh\r\n */\r\nexport class TrailMesh extends Mesh {\r\n /**\r\n * The diameter of the trail, i.e. the width of the ribbon.\r\n */\r\n public diameter: number;\r\n\r\n private _generator: TransformNode;\r\n private _autoStart: boolean;\r\n private _running: boolean;\r\n private _doNotTaper: boolean;\r\n private _length: number;\r\n private _segments: number;\r\n private _sectionPolygonPointsCount: number = 4;\r\n private _sectionVectors: Array<Vector3>;\r\n private _sectionNormalVectors: Array<Vector3>;\r\n private _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n\r\n /**\r\n * Constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param diameter Diameter of trailing mesh. Default is 1.\r\n * @param length Length of trailing mesh. Default is 60.\r\n * @param autoStart Automatically start trailing mesh. Default true.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameter?: number, length?: number, autoStart?: boolean);\r\n\r\n /**\r\n * Constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param options defines the options used to create the mesh.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, options?: ITrailMeshOptions);\r\n\r\n /** @internal */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameterOrOptions?: number | ITrailMeshOptions, length: number = 60, autoStart: boolean = true) {\r\n super(name, scene);\r\n\r\n this._running = false;\r\n this._generator = generator;\r\n\r\n if (typeof diameterOrOptions === \"object\" && diameterOrOptions !== null) {\r\n this.diameter = diameterOrOptions.diameter || 1;\r\n this._length = diameterOrOptions.length || 60;\r\n this._segments = diameterOrOptions.segments ? (diameterOrOptions.segments > this._length ? this._length : diameterOrOptions.segments) : this._length;\r\n this._sectionPolygonPointsCount = diameterOrOptions.sections || 4;\r\n this._doNotTaper = diameterOrOptions.doNotTaper ?? false;\r\n this._autoStart = diameterOrOptions.autoStart ?? true;\r\n } else {\r\n this.diameter = diameterOrOptions || 1;\r\n this._length = length;\r\n this._segments = this._length;\r\n this._doNotTaper = false;\r\n this._autoStart = autoStart;\r\n }\r\n\r\n this._sectionVectors = [];\r\n this._sectionNormalVectors = [];\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n this._sectionVectors[i] = Vector3.Zero();\r\n this._sectionNormalVectors[i] = Vector3.Zero();\r\n }\r\n this._createMesh();\r\n }\r\n\r\n /**\r\n * \"TrailMesh\"\r\n * @returns \"TrailMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"TrailMesh\";\r\n }\r\n\r\n private _createMesh(): void {\r\n const data: VertexData = new VertexData();\r\n const positions: Array<number> = [];\r\n const normals: Array<number> = [];\r\n const indices: Array<number> = [];\r\n const uvs: Array<number> = [];\r\n let meshCenter = Vector3.Zero();\r\n if (this._generator instanceof AbstractMesh && this._generator.hasBoundingInfo) {\r\n meshCenter = this._generator.getBoundingInfo().boundingBox.centerWorld;\r\n } else {\r\n meshCenter = this._generator.absolutePosition;\r\n }\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(i / this._sectionPolygonPointsCount, 0);\r\n }\r\n for (let i: number = 1; i <= this._segments; i++) {\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n const angle = j !== this._sectionPolygonPointsCount ? j * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(j / this._sectionPolygonPointsCount, i / this._segments);\r\n }\r\n const l: number = positions.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount, l + j + this._sectionPolygonPointsCount + 1);\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount + 1, l + j + 1);\r\n }\r\n }\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n data.positions = positions;\r\n data.normals = normals;\r\n data.indices = indices;\r\n data.uvs = uvs;\r\n data.applyToMesh(this, true);\r\n if (this._autoStart) {\r\n this.start();\r\n }\r\n }\r\n\r\n private _updateSectionVectors(): void {\r\n const wm = this._generator.getWorldMatrix();\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n this._sectionVectors[i].copyFromFloats(Math.cos(angle) * this.diameter, Math.sin(angle) * this.diameter, 0);\r\n this._sectionNormalVectors[i].copyFromFloats(Math.cos(angle), Math.sin(angle), 0);\r\n Vector3.TransformCoordinatesToRef(this._sectionVectors[i], wm, this._sectionVectors[i]);\r\n Vector3.TransformNormalToRef(this._sectionNormalVectors[i], wm, this._sectionNormalVectors[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Start trailing mesh.\r\n */\r\n public start(): void {\r\n if (!this._running) {\r\n this._running = true;\r\n this._beforeRenderObserver = this.getScene().onBeforeRenderObservable.add(() => {\r\n this.update();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Stop trailing mesh.\r\n */\r\n public stop(): void {\r\n if (this._beforeRenderObserver && this._running) {\r\n this._running = false;\r\n this.getScene().onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n\r\n /**\r\n * Update trailing mesh geometry.\r\n */\r\n public update(): void {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const index = 3 * (this._sectionPolygonPointsCount + 1);\r\n if (positions && normals) {\r\n if (this._doNotTaper) {\r\n for (let i: number = index; i < positions.length; i++) {\r\n positions[i - index] = Lerp(positions[i - index], positions[i], this._segments / this._length);\r\n }\r\n } else {\r\n for (let i: number = index; i < positions.length; i++) {\r\n positions[i - index] = Lerp(positions[i - index], positions[i], this._segments / this._length) - (normals[i] / this._length) * this.diameter;\r\n }\r\n }\r\n for (let i: number = index; i < normals.length; i++) {\r\n normals[i - index] = Lerp(normals[i - index], normals[i], this._segments / this._length);\r\n }\r\n this._updateSectionVectors();\r\n const l: number = positions.length - 3 * (this._sectionPolygonPointsCount + 1);\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n positions[l + 3 * i] = this._sectionVectors[i].x;\r\n positions[l + 3 * i + 1] = this._sectionVectors[i].y;\r\n positions[l + 3 * i + 2] = this._sectionVectors[i].z;\r\n normals[l + 3 * i] = this._sectionNormalVectors[i].x;\r\n normals[l + 3 * i + 1] = this._sectionNormalVectors[i].y;\r\n normals[l + 3 * i + 2] = this._sectionNormalVectors[i].z;\r\n }\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, true, false);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, true, false);\r\n }\r\n }\r\n\r\n /**\r\n * Reset trailing mesh geometry.\r\n */\r\n public reset(): void {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n if (positions && normals) {\r\n this._updateSectionVectors();\r\n for (let i: number = 0; i <= this._segments; i++) {\r\n const l: number = 3 * i * (this._sectionPolygonPointsCount + 1);\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n positions[l + 3 * j] = this._sectionVectors[j].x;\r\n positions[l + 3 * j + 1] = this._sectionVectors[j].y;\r\n positions[l + 3 * j + 2] = this._sectionVectors[j].z;\r\n normals[l + 3 * j] = this._sectionNormalVectors[j].x;\r\n normals[l + 3 * j + 1] = this._sectionNormalVectors[j].y;\r\n normals[l + 3 * j + 2] = this._sectionNormalVectors[j].z;\r\n }\r\n }\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, true, false);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, true, false);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new TrailMesh object.\r\n * @param name is a string, the name given to the new mesh\r\n * @param newGenerator use new generator object for cloned trail mesh\r\n * @returns a new mesh\r\n */\r\n public override clone(name: string = \"\", newGenerator: TransformNode): TrailMesh {\r\n const options = {\r\n diameter: this.diameter,\r\n length: this._length,\r\n segments: this._segments,\r\n sections: this._sectionPolygonPointsCount,\r\n doNotTaper: this._doNotTaper,\r\n autoStart: this._autoStart,\r\n };\r\n return new TrailMesh(name, newGenerator ?? this._generator, this.getScene(), options);\r\n }\r\n\r\n /**\r\n * Serializes this trail mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n\r\n serializationObject.generatorId = this._generator.id;\r\n }\r\n\r\n /**\r\n * Parses a serialized trail mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the trail mesh in\r\n * @returns the created trail mesh\r\n */\r\n public static override Parse(parsedMesh: any, scene: Scene): TrailMesh {\r\n const generator = scene.getLastMeshById(parsedMesh.generatorId) ?? scene.getLastTransformNodeById(parsedMesh.generatorId);\r\n\r\n if (!generator) {\r\n throw new Error(\"TrailMesh: generator not found with ID \" + parsedMesh.generatorId);\r\n }\r\n\r\n const options = {\r\n diameter: parsedMesh.diameter ?? parsedMesh._diameter,\r\n length: parsedMesh._length,\r\n segments: parsedMesh._segments,\r\n sections: parsedMesh._sectionPolygonPointsCount,\r\n doNotTaper: parsedMesh._doNotTaper,\r\n autoStart: parsedMesh._autoStart,\r\n };\r\n return new TrailMesh(parsedMesh.name, generator, scene, options);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"trailMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/trailMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { Lerp } from \"../Maths/math.scalar.functions\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\nMesh._TrailMeshParser = (parsedMesh: any, scene: Scene) => {\r\n return TrailMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Options to be used when creating a trail mesh\r\n */\r\nexport interface ITrailMeshOptions {\r\n /**\r\n * diameter of trailing mesh (default: 1)\r\n */\r\n diameter?: number;\r\n /**\r\n * length of trailing mesh (default: 60)\r\n */\r\n length?: number;\r\n /**\r\n * segments of trailing mesh (default: length)\r\n */\r\n segments?: number;\r\n /**\r\n * sections of trailing mesh (default: 4)\r\n */\r\n sections?: number;\r\n /**\r\n * tapers the trailing mesh (default: false)\r\n */\r\n doNotTaper?: boolean;\r\n /**\r\n * automatically start trailing mesh. (default: true)\r\n */\r\n autoStart?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to create a trail following a mesh\r\n */\r\nexport class TrailMesh extends Mesh {\r\n /**\r\n * The diameter of the trail, i.e. the width of the ribbon.\r\n */\r\n public diameter: number;\r\n\r\n private _generator: TransformNode;\r\n private _autoStart: boolean;\r\n private _running: boolean;\r\n private _doNotTaper: boolean;\r\n private _length: number;\r\n private _segments: number;\r\n private _sectionPolygonPointsCount: number = 4;\r\n private _sectionVectors: Array<Vector3>;\r\n private _sectionNormalVectors: Array<Vector3>;\r\n private _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n\r\n /**\r\n * Constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param diameter Diameter of trailing mesh. Default is 1.\r\n * @param length Length of trailing mesh. Default is 60.\r\n * @param autoStart Automatically start trailing mesh. Default true.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameter?: number, length?: number, autoStart?: boolean);\r\n\r\n /**\r\n * Constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param options defines the options used to create the mesh.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, options?: ITrailMeshOptions);\r\n\r\n /** @internal */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameterOrOptions?: number | ITrailMeshOptions, length: number = 60, autoStart: boolean = true) {\r\n super(name, scene);\r\n\r\n this._running = false;\r\n this._generator = generator;\r\n\r\n if (typeof diameterOrOptions === \"object\" && diameterOrOptions !== null) {\r\n this.diameter = diameterOrOptions.diameter || 1;\r\n this._length = diameterOrOptions.length || 60;\r\n this._segments = diameterOrOptions.segments ? (diameterOrOptions.segments > this._length ? this._length : diameterOrOptions.segments) : this._length;\r\n this._sectionPolygonPointsCount = diameterOrOptions.sections || 4;\r\n this._doNotTaper = diameterOrOptions.doNotTaper ?? false;\r\n this._autoStart = diameterOrOptions.autoStart ?? true;\r\n } else {\r\n this.diameter = diameterOrOptions || 1;\r\n this._length = length;\r\n this._segments = this._length;\r\n this._doNotTaper = false;\r\n this._autoStart = autoStart;\r\n }\r\n\r\n this._sectionVectors = [];\r\n this._sectionNormalVectors = [];\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n this._sectionVectors[i] = Vector3.Zero();\r\n this._sectionNormalVectors[i] = Vector3.Zero();\r\n }\r\n this._createMesh();\r\n }\r\n\r\n /**\r\n * \"TrailMesh\"\r\n * @returns \"TrailMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"TrailMesh\";\r\n }\r\n\r\n private _createMesh(): void {\r\n const data: VertexData = new VertexData();\r\n const positions: Array<number> = [];\r\n const normals: Array<number> = [];\r\n const indices: Array<number> = [];\r\n const uvs: Array<number> = [];\r\n let meshCenter: Vector3;\r\n if (this._generator instanceof AbstractMesh && this._generator.hasBoundingInfo) {\r\n meshCenter = this._generator.getBoundingInfo().boundingBox.centerWorld;\r\n } else {\r\n meshCenter = this._generator.absolutePosition;\r\n }\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(i / this._sectionPolygonPointsCount, 0);\r\n }\r\n for (let i: number = 1; i <= this._segments; i++) {\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n const angle = j !== this._sectionPolygonPointsCount ? j * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(j / this._sectionPolygonPointsCount, i / this._segments);\r\n }\r\n const l: number = positions.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount, l + j + this._sectionPolygonPointsCount + 1);\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount + 1, l + j + 1);\r\n }\r\n }\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n data.positions = positions;\r\n data.normals = normals;\r\n data.indices = indices;\r\n data.uvs = uvs;\r\n data.applyToMesh(this, true);\r\n if (this._autoStart) {\r\n this.start();\r\n }\r\n }\r\n\r\n private _updateSectionVectors(): void {\r\n const wm = this._generator.getWorldMatrix();\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n this._sectionVectors[i].copyFromFloats(Math.cos(angle) * this.diameter, Math.sin(angle) * this.diameter, 0);\r\n this._sectionNormalVectors[i].copyFromFloats(Math.cos(angle), Math.sin(angle), 0);\r\n Vector3.TransformCoordinatesToRef(this._sectionVectors[i], wm, this._sectionVectors[i]);\r\n Vector3.TransformNormalToRef(this._sectionNormalVectors[i], wm, this._sectionNormalVectors[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Start trailing mesh.\r\n */\r\n public start(): void {\r\n if (!this._running) {\r\n this._running = true;\r\n this._beforeRenderObserver = this.getScene().onBeforeRenderObservable.add(() => {\r\n this.update();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Stop trailing mesh.\r\n */\r\n public stop(): void {\r\n if (this._beforeRenderObserver && this._running) {\r\n this._running = false;\r\n this.getScene().onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n\r\n /**\r\n * Update trailing mesh geometry.\r\n */\r\n public update(): void {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const index = 3 * (this._sectionPolygonPointsCount + 1);\r\n if (positions && normals) {\r\n if (this._doNotTaper) {\r\n for (let i: number = index; i < positions.length; i++) {\r\n positions[i - index] = Lerp(positions[i - index], positions[i], this._segments / this._length);\r\n }\r\n } else {\r\n for (let i: number = index; i < positions.length; i++) {\r\n positions[i - index] = Lerp(positions[i - index], positions[i], this._segments / this._length) - (normals[i] / this._length) * this.diameter;\r\n }\r\n }\r\n for (let i: number = index; i < normals.length; i++) {\r\n normals[i - index] = Lerp(normals[i - index], normals[i], this._segments / this._length);\r\n }\r\n this._updateSectionVectors();\r\n const l: number = positions.length - 3 * (this._sectionPolygonPointsCount + 1);\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n positions[l + 3 * i] = this._sectionVectors[i].x;\r\n positions[l + 3 * i + 1] = this._sectionVectors[i].y;\r\n positions[l + 3 * i + 2] = this._sectionVectors[i].z;\r\n normals[l + 3 * i] = this._sectionNormalVectors[i].x;\r\n normals[l + 3 * i + 1] = this._sectionNormalVectors[i].y;\r\n normals[l + 3 * i + 2] = this._sectionNormalVectors[i].z;\r\n }\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, true, false);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, true, false);\r\n }\r\n }\r\n\r\n /**\r\n * Reset trailing mesh geometry.\r\n */\r\n public reset(): void {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n if (positions && normals) {\r\n this._updateSectionVectors();\r\n for (let i: number = 0; i <= this._segments; i++) {\r\n const l: number = 3 * i * (this._sectionPolygonPointsCount + 1);\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n positions[l + 3 * j] = this._sectionVectors[j].x;\r\n positions[l + 3 * j + 1] = this._sectionVectors[j].y;\r\n positions[l + 3 * j + 2] = this._sectionVectors[j].z;\r\n normals[l + 3 * j] = this._sectionNormalVectors[j].x;\r\n normals[l + 3 * j + 1] = this._sectionNormalVectors[j].y;\r\n normals[l + 3 * j + 2] = this._sectionNormalVectors[j].z;\r\n }\r\n }\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, true, false);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, true, false);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new TrailMesh object.\r\n * @param name is a string, the name given to the new mesh\r\n * @param newGenerator use new generator object for cloned trail mesh\r\n * @returns a new mesh\r\n */\r\n public override clone(name: string = \"\", newGenerator: TransformNode): TrailMesh {\r\n const options = {\r\n diameter: this.diameter,\r\n length: this._length,\r\n segments: this._segments,\r\n sections: this._sectionPolygonPointsCount,\r\n doNotTaper: this._doNotTaper,\r\n autoStart: this._autoStart,\r\n };\r\n return new TrailMesh(name, newGenerator ?? this._generator, this.getScene(), options);\r\n }\r\n\r\n /**\r\n * Serializes this trail mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n\r\n serializationObject.generatorId = this._generator.id;\r\n }\r\n\r\n /**\r\n * Parses a serialized trail mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the trail mesh in\r\n * @returns the created trail mesh\r\n */\r\n public static override Parse(parsedMesh: any, scene: Scene): TrailMesh {\r\n const generator = scene.getLastMeshById(parsedMesh.generatorId) ?? scene.getLastTransformNodeById(parsedMesh.generatorId);\r\n\r\n if (!generator) {\r\n throw new Error(\"TrailMesh: generator not found with ID \" + parsedMesh.generatorId);\r\n }\r\n\r\n const options = {\r\n diameter: parsedMesh.diameter ?? parsedMesh._diameter,\r\n length: parsedMesh._length,\r\n segments: parsedMesh._segments,\r\n sections: parsedMesh._sectionPolygonPointsCount,\r\n doNotTaper: parsedMesh._doNotTaper,\r\n autoStart: parsedMesh._autoStart,\r\n };\r\n return new TrailMesh(parsedMesh.name, generator, scene, options);\r\n }\r\n}\r\n"]}