@babylonjs/core 8.3.0 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +22 -13
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animation.optimizations.d.ts +31 -0
  5. package/Animations/animation.optimizations.js +41 -0
  6. package/Animations/animation.optimizations.js.map +1 -0
  7. package/Animations/index.d.ts +1 -0
  8. package/Animations/index.js +1 -0
  9. package/Animations/index.js.map +1 -1
  10. package/Animations/pathCursor.js +3 -1
  11. package/Animations/pathCursor.js.map +1 -1
  12. package/Animations/runtimeAnimation.d.ts +3 -1
  13. package/Animations/runtimeAnimation.js +127 -116
  14. package/Animations/runtimeAnimation.js.map +1 -1
  15. package/Audio/audioSceneComponent.js +4 -4
  16. package/Audio/audioSceneComponent.js.map +1 -1
  17. package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
  18. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
  20. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  21. package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
  22. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
  24. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  25. package/Bones/skeleton.js +6 -6
  26. package/Bones/skeleton.js.map +1 -1
  27. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  28. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +2 -2
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +6 -2
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +2 -2
  34. package/Cameras/camera.js.map +1 -1
  35. package/Cameras/deviceOrientationCamera.js +3 -2
  36. package/Cameras/deviceOrientationCamera.js.map +1 -1
  37. package/Collisions/gpuPicker.d.ts +1 -0
  38. package/Collisions/gpuPicker.js +9 -0
  39. package/Collisions/gpuPicker.js.map +1 -1
  40. package/Debug/axesViewer.js +3 -2
  41. package/Debug/axesViewer.js.map +1 -1
  42. package/Debug/directionalLightFrustumViewer.js +4 -4
  43. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  44. package/Debug/physicsViewer.js +7 -6
  45. package/Debug/physicsViewer.js.map +1 -1
  46. package/Debug/skeletonViewer.js +4 -4
  47. package/Debug/skeletonViewer.js.map +1 -1
  48. package/Engines/Native/nativeInterfaces.d.ts +6 -7
  49. package/Engines/Native/nativeInterfaces.js.map +1 -1
  50. package/Engines/Processors/shaderCodeNode.js +2 -2
  51. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  52. package/Engines/abstractEngine.d.ts +1 -0
  53. package/Engines/abstractEngine.js +14 -8
  54. package/Engines/abstractEngine.js.map +1 -1
  55. package/Engines/constants.d.ts +27 -5
  56. package/Engines/constants.js +27 -5
  57. package/Engines/constants.js.map +1 -1
  58. package/Engines/engine.js +8 -8
  59. package/Engines/engine.js.map +1 -1
  60. package/Engines/nativeEngine.js +13 -27
  61. package/Engines/nativeEngine.js.map +1 -1
  62. package/Engines/webgpuEngine.js +6 -2
  63. package/Engines/webgpuEngine.js.map +1 -1
  64. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
  65. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  66. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
  67. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  68. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
  69. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  70. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
  71. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
  72. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
  73. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
  74. package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
  75. package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
  76. package/FlowGraph/flowGraphBlock.js +3 -2
  77. package/FlowGraph/flowGraphBlock.js.map +1 -1
  78. package/FlowGraph/flowGraphCoordinator.js +10 -6
  79. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  80. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  81. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  82. package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
  83. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  84. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
  85. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  86. package/Gamepads/gamepadManager.js +2 -2
  87. package/Gamepads/gamepadManager.js.map +1 -1
  88. package/Gizmos/axisDragGizmo.js +3 -2
  89. package/Gizmos/axisDragGizmo.js.map +1 -1
  90. package/Gizmos/axisScaleGizmo.js +6 -4
  91. package/Gizmos/axisScaleGizmo.js.map +1 -1
  92. package/Gizmos/boundingBoxGizmo.js +28 -26
  93. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  94. package/Gizmos/cameraGizmo.js +6 -3
  95. package/Gizmos/cameraGizmo.js.map +1 -1
  96. package/Gizmos/gizmo.js +11 -10
  97. package/Gizmos/gizmo.js.map +1 -1
  98. package/Gizmos/gizmoManager.js +16 -12
  99. package/Gizmos/gizmoManager.js.map +1 -1
  100. package/Gizmos/lightGizmo.js +3 -2
  101. package/Gizmos/lightGizmo.js.map +1 -1
  102. package/Gizmos/planeDragGizmo.js +3 -2
  103. package/Gizmos/planeDragGizmo.js.map +1 -1
  104. package/Gizmos/planeRotationGizmo.js +3 -2
  105. package/Gizmos/planeRotationGizmo.js.map +1 -1
  106. package/Gizmos/positionGizmo.js +41 -28
  107. package/Gizmos/positionGizmo.js.map +1 -1
  108. package/Gizmos/rotationGizmo.js +26 -18
  109. package/Gizmos/rotationGizmo.js.map +1 -1
  110. package/Gizmos/scaleGizmo.js +47 -32
  111. package/Gizmos/scaleGizmo.js.map +1 -1
  112. package/Layers/effectLayerSceneComponent.js +4 -4
  113. package/Layers/effectLayerSceneComponent.js.map +1 -1
  114. package/Layers/layerSceneComponent.js +4 -4
  115. package/Layers/layerSceneComponent.js.map +1 -1
  116. package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
  117. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  118. package/Lights/Shadows/shadowGenerator.js +3 -3
  119. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  120. package/Lights/light.js +4 -4
  121. package/Lights/light.js.map +1 -1
  122. package/Loading/Plugins/babylonFileLoader.js +54 -46
  123. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  124. package/Loading/loadingScreen.js +4 -3
  125. package/Loading/loadingScreen.js.map +1 -1
  126. package/Loading/sceneLoader.js +15 -12
  127. package/Loading/sceneLoader.js.map +1 -1
  128. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
  129. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
  131. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
  133. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/baseMathBlock.js +3 -1
  135. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/customBlock.js +53 -43
  137. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  138. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  139. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  140. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  141. package/Materials/Node/nodeMaterial.d.ts +5 -0
  142. package/Materials/Node/nodeMaterial.js +33 -20
  143. package/Materials/Node/nodeMaterial.js.map +1 -1
  144. package/Materials/Node/nodeMaterialBlock.js +7 -4
  145. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  146. package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
  147. package/Materials/Node/nodeMaterialBuildState.js +72 -7
  148. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  149. package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
  150. package/Materials/Node/nodeMaterialDefault.js +28 -0
  151. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  152. package/Materials/Textures/cubeTexture.js +3 -1
  153. package/Materials/Textures/cubeTexture.js.map +1 -1
  154. package/Materials/Textures/videoTexture.js +5 -4
  155. package/Materials/Textures/videoTexture.js.map +1 -1
  156. package/Materials/materialDefines.js +3 -1
  157. package/Materials/materialDefines.js.map +1 -1
  158. package/Materials/multiMaterial.js +3 -1
  159. package/Materials/multiMaterial.js.map +1 -1
  160. package/Materials/shaderMaterial.js +3 -2
  161. package/Materials/shaderMaterial.js.map +1 -1
  162. package/Meshes/Compression/dracoEncoder.js +2 -2
  163. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  164. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
  165. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  166. package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
  167. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  168. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
  169. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  170. package/Meshes/Node/Blocks/mathBlock.js +3 -1
  171. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  172. package/Meshes/Node/nodeGeometryBlock.js +8 -5
  173. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  174. package/Meshes/abstractMesh.js +2 -2
  175. package/Meshes/abstractMesh.js.map +1 -1
  176. package/Meshes/geodesicMesh.js +2 -2
  177. package/Meshes/geodesicMesh.js.map +1 -1
  178. package/Meshes/mesh.js +6 -6
  179. package/Meshes/mesh.js.map +1 -1
  180. package/Meshes/mesh.vertexData.functions.js +11 -10
  181. package/Meshes/mesh.vertexData.functions.js.map +1 -1
  182. package/Meshes/mesh.vertexData.subdivide.js +10 -10
  183. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  184. package/Meshes/meshSimplification.js +10 -10
  185. package/Meshes/meshSimplification.js.map +1 -1
  186. package/Meshes/meshUtils.js +6 -3
  187. package/Meshes/meshUtils.js.map +1 -1
  188. package/Meshes/polygonMesh.js +10 -10
  189. package/Meshes/polygonMesh.js.map +1 -1
  190. package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
  191. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  192. package/Misc/arrayTools.js +2 -2
  193. package/Misc/arrayTools.js.map +1 -1
  194. package/Misc/asyncLock.js +9 -9
  195. package/Misc/asyncLock.js.map +1 -1
  196. package/Misc/basis.js +4 -2
  197. package/Misc/basis.js.map +1 -1
  198. package/Misc/deepCopier.js +3 -2
  199. package/Misc/deepCopier.js.map +1 -1
  200. package/Misc/deepMerger.js +3 -2
  201. package/Misc/deepMerger.js.map +1 -1
  202. package/Misc/fileTools.js +4 -4
  203. package/Misc/fileTools.js.map +1 -1
  204. package/Misc/greasedLineTools.js +14 -13
  205. package/Misc/greasedLineTools.js.map +1 -1
  206. package/Misc/logger.js +3 -2
  207. package/Misc/logger.js.map +1 -1
  208. package/Misc/observable.extensions.js +4 -4
  209. package/Misc/observable.extensions.js.map +1 -1
  210. package/Misc/sceneSerializer.js +5 -4
  211. package/Misc/sceneSerializer.js.map +1 -1
  212. package/Misc/snapshotRenderingHelper.js +3 -1
  213. package/Misc/snapshotRenderingHelper.js.map +1 -1
  214. package/Misc/tags.js +2 -2
  215. package/Misc/tags.js.map +1 -1
  216. package/Misc/trajectoryClassifier.js +8 -8
  217. package/Misc/trajectoryClassifier.js.map +1 -1
  218. package/Particles/IParticleSystem.d.ts +1 -1
  219. package/Particles/IParticleSystem.js.map +1 -1
  220. package/Particles/baseParticleSystem.d.ts +11 -3
  221. package/Particles/baseParticleSystem.js +37 -3
  222. package/Particles/baseParticleSystem.js.map +1 -1
  223. package/Particles/gpuParticleSystem.js +1 -14
  224. package/Particles/gpuParticleSystem.js.map +1 -1
  225. package/Particles/particle.js +2 -2
  226. package/Particles/particle.js.map +1 -1
  227. package/Particles/particleSystem.js +15 -13
  228. package/Particles/particleSystem.js.map +1 -1
  229. package/Particles/thinParticleSystem.js +3 -16
  230. package/Particles/thinParticleSystem.js.map +1 -1
  231. package/Physics/physicsHelper.js +18 -14
  232. package/Physics/physicsHelper.js.map +1 -1
  233. package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
  234. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  235. package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
  236. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  237. package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
  238. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  239. package/Physics/v1/physicsEngine.js +4 -4
  240. package/Physics/v1/physicsEngine.js.map +1 -1
  241. package/Physics/v1/physicsImpostor.js +10 -21
  242. package/Physics/v1/physicsImpostor.js.map +1 -1
  243. package/Physics/v2/Plugins/havokPlugin.js +12 -10
  244. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  245. package/Physics/v2/ragdoll.js +4 -4
  246. package/Physics/v2/ragdoll.js.map +1 -1
  247. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
  248. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  249. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
  250. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  251. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
  252. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  253. package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
  254. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  255. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
  256. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  257. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
  258. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  259. package/Rendering/iblCdfGenerator.js +4 -4
  260. package/Rendering/iblCdfGenerator.js.map +1 -1
  261. package/Rendering/objectRenderer.js +2 -2
  262. package/Rendering/objectRenderer.js.map +1 -1
  263. package/Rendering/reflectiveShadowMap.js +7 -5
  264. package/Rendering/reflectiveShadowMap.js.map +1 -1
  265. package/Sprites/spriteMap.js +2 -2
  266. package/Sprites/spriteMap.js.map +1 -1
  267. package/XR/features/WebXRAbstractFeature.js +2 -2
  268. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  269. package/XR/features/WebXRAnchorSystem.js +4 -4
  270. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  271. package/XR/features/WebXRBackgroundRemover.js +3 -1
  272. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  273. package/XR/features/WebXRControllerMovement.js +6 -3
  274. package/XR/features/WebXRControllerMovement.js.map +1 -1
  275. package/XR/features/WebXRControllerPhysics.js +12 -7
  276. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  277. package/XR/features/WebXRControllerPointerSelection.js +12 -7
  278. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  279. package/XR/features/WebXRControllerTeleportation.js +11 -7
  280. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  281. package/XR/features/WebXRDepthSensing.js +6 -6
  282. package/XR/features/WebXRDepthSensing.js.map +1 -1
  283. package/XR/features/WebXRHandTracking.js +60 -24
  284. package/XR/features/WebXRHandTracking.js.map +1 -1
  285. package/XR/features/WebXRHitTest.js +4 -4
  286. package/XR/features/WebXRHitTest.js.map +1 -1
  287. package/XR/features/WebXRImageTracking.js +2 -2
  288. package/XR/features/WebXRImageTracking.js.map +1 -1
  289. package/XR/features/WebXRLayers.js +2 -2
  290. package/XR/features/WebXRLayers.js.map +1 -1
  291. package/XR/features/WebXRNearInteraction.js +12 -7
  292. package/XR/features/WebXRNearInteraction.js.map +1 -1
  293. package/XR/features/WebXRRawCameraAccess.js +9 -4
  294. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  295. package/XR/features/WebXRSpaceWarp.js +2 -2
  296. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  297. package/XR/motionController/webXRAbstractMotionController.js +19 -8
  298. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  299. package/XR/motionController/webXRGenericMotionController.js +2 -2
  300. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  301. package/XR/motionController/webXRHTCViveMotionController.js +5 -4
  302. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  303. package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
  304. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  305. package/XR/motionController/webXRMotionControllerManager.js +4 -4
  306. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  307. package/XR/motionController/webXROculusTouchMotionController.js +5 -4
  308. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  309. package/XR/motionController/webXRProfiledMotionController.js +15 -10
  310. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  311. package/XR/webXRCamera.js +3 -2
  312. package/XR/webXRCamera.js.map +1 -1
  313. package/XR/webXREnterExitUI.js +5 -4
  314. package/XR/webXREnterExitUI.js.map +1 -1
  315. package/XR/webXRExperienceHelper.js +2 -2
  316. package/XR/webXRExperienceHelper.js.map +1 -1
  317. package/XR/webXRFeaturesManager.js +10 -7
  318. package/XR/webXRFeaturesManager.js.map +1 -1
  319. package/XR/webXRInput.js +8 -8
  320. package/XR/webXRInput.js.map +1 -1
  321. package/XR/webXRInputSource.js +4 -1
  322. package/XR/webXRInputSource.js.map +1 -1
  323. package/XR/webXRRenderTargetTextureProvider.js +3 -1
  324. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  325. package/assetContainer.js +156 -135
  326. package/assetContainer.js.map +1 -1
  327. package/node.js +2 -2
  328. package/node.js.map +1 -1
  329. package/package.json +1 -1
  330. package/scene.js +18 -11
  331. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"greasedLineTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/greasedLineTools.ts"],"names":[],"mappings":"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","sourcesContent":["import { Curve3 } from \"../Maths/math.path\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { TmpVectors, Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { IFontData } from \"../Meshes/Builders/textBuilder\";\r\nimport { CreateTextShapePaths } from \"../Meshes/Builders/textBuilder\";\r\nimport type { FloatArray, IndicesArray } from \"../types\";\r\nimport type { GreasedLinePoints, GreasedLinePointsOptions } from \"../Meshes/GreasedLine/greasedLineBaseMesh\";\r\nimport type { Color3 } from \"../Maths/math.color\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { GreasedLineMaterialDefaults } from \"../Materials/GreasedLine/greasedLineMaterialDefaults\";\r\n\r\n/**\r\n * Tool functions for GreasedLine\r\n */\r\nexport class GreasedLineTools {\r\n /**\r\n * Converts GreasedLinePoints to number[][]\r\n * @param points GreasedLinePoints\r\n * @param options GreasedLineToolsConvertPointsOptions\r\n * @returns number[][] with x, y, z coordinates of the points, like [[x, y, z, x, y, z, ...], [x, y, z, ...]]\r\n */\r\n public static ConvertPoints(points: GreasedLinePoints, options?: GreasedLinePointsOptions): number[][] {\r\n if (points.length && Array.isArray(points) && typeof points[0] === \"number\") {\r\n return [<number[]>points];\r\n } else if (points.length && Array.isArray(points[0]) && typeof points[0][0] === \"number\") {\r\n return <number[][]>points;\r\n } else if (points.length && !Array.isArray(points[0]) && points[0] instanceof Vector3) {\r\n const positions: number[] = [];\r\n for (let j = 0; j < points.length; j++) {\r\n const p = points[j] as Vector3;\r\n positions.push(p.x, p.y, p.z);\r\n }\r\n return [positions];\r\n } else if (points.length > 0 && Array.isArray(points[0]) && points[0].length > 0 && points[0][0] instanceof Vector3) {\r\n const positions: number[][] = [];\r\n const vectorPoints = points as Vector3[][];\r\n vectorPoints.forEach((p) => {\r\n positions.push(p.flatMap((p2) => [p2.x, p2.y, p2.z]));\r\n });\r\n return positions;\r\n } else if (points instanceof Float32Array) {\r\n if (options?.floatArrayStride) {\r\n const positions: number[][] = [];\r\n const stride = options.floatArrayStride * 3;\r\n for (let i = 0; i < points.length; i += stride) {\r\n const linePoints = new Array(stride); // Pre-allocate memory for the line\r\n for (let j = 0; j < stride; j++) {\r\n linePoints[j] = points[i + j];\r\n }\r\n positions.push(linePoints);\r\n }\r\n return positions;\r\n } else {\r\n return [Array.from(points)];\r\n }\r\n } else if (points.length && points[0] instanceof Float32Array) {\r\n const positions: number[][] = [];\r\n points.forEach((p) => {\r\n positions.push(Array.from(p as Float32Array));\r\n });\r\n\r\n return positions;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Omit zero length lines predicate for the MeshesToLines function\r\n * @param p1 point1 position of the face\r\n * @param p2 point2 position of the face\r\n * @param p3 point3 position of the face\r\n * @returns original points or null if any edge length is zero\r\n */\r\n public static OmitZeroLengthPredicate(p1: Vector3, p2: Vector3, p3: Vector3) {\r\n const fileredPoints = [];\r\n // edge1\r\n if (p2.subtract(p1).lengthSquared() > 0) {\r\n fileredPoints.push([p1, p2]);\r\n }\r\n // edge2\r\n if (p3.subtract(p2).lengthSquared() > 0) {\r\n fileredPoints.push([p2, p3]);\r\n }\r\n // edge3\r\n if (p1.subtract(p3).lengthSquared() > 0) {\r\n fileredPoints.push([p3, p1]);\r\n }\r\n return fileredPoints.length === 0 ? null : fileredPoints;\r\n }\r\n\r\n /**\r\n * Omit duplicate lines predicate for the MeshesToLines function\r\n * @param p1 point1 position of the face\r\n * @param p2 point2 position of the face\r\n * @param p3 point3 position of the face\r\n * @param points array of points to search in\r\n * @returns original points or null if any edge length is zero\r\n */\r\n public static OmitDuplicatesPredicate(p1: Vector3, p2: Vector3, p3: Vector3, points: Vector3[][]) {\r\n const fileredPoints = [];\r\n // edge1\r\n if (!GreasedLineTools._SearchInPoints(p1, p2, points)) {\r\n fileredPoints.push([p1, p2]);\r\n }\r\n // edge2\r\n if (!GreasedLineTools._SearchInPoints(p2, p3, points)) {\r\n fileredPoints.push([p2, p3]);\r\n }\r\n // edge3\r\n if (!GreasedLineTools._SearchInPoints(p3, p1, points)) {\r\n fileredPoints.push([p3, p1]);\r\n }\r\n return fileredPoints.length === 0 ? null : fileredPoints;\r\n }\r\n\r\n private static _SearchInPoints(p1: Vector3, p2: Vector3, points: Vector3[][]) {\r\n for (const ps of points) {\r\n for (let i = 0; i < ps.length; i++) {\r\n if (ps[i]?.equals(p1)) {\r\n // find the first point\r\n // if it has a sibling of p2 the line already exists\r\n if (ps[i + 1]?.equals(p2) || ps[i - 1]?.equals(p2)) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets mesh triangles as line positions\r\n * @param meshes array of meshes\r\n * @param predicate predicate function which decides whether to include the mesh triangle/face in the ouput\r\n * @returns array of arrays of points\r\n */\r\n public static MeshesToLines(\r\n meshes: AbstractMesh[],\r\n predicate?: (\r\n p1: Vector3,\r\n p2: Vector3,\r\n p3: Vector3,\r\n points: Vector3[][],\r\n indiceIndex: number,\r\n vertexIndex: number,\r\n mesh: AbstractMesh,\r\n meshIndex: number,\r\n vertices: FloatArray,\r\n indices: IndicesArray\r\n ) => Vector3[][]\r\n ) {\r\n const points: Vector3[][] = [];\r\n\r\n meshes.forEach((m, meshIndex) => {\r\n const vertices = m.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = m.getIndices();\r\n if (vertices && indices) {\r\n for (let i = 0, ii = 0; i < indices.length; i++) {\r\n const vi1 = indices[ii++] * 3;\r\n const vi2 = indices[ii++] * 3;\r\n const vi3 = indices[ii++] * 3;\r\n\r\n const p1 = new Vector3(vertices[vi1], vertices[vi1 + 1], vertices[vi1 + 2]);\r\n const p2 = new Vector3(vertices[vi2], vertices[vi2 + 1], vertices[vi2 + 2]);\r\n const p3 = new Vector3(vertices[vi3], vertices[vi3 + 1], vertices[vi3 + 2]);\r\n\r\n if (predicate) {\r\n const pointsFromPredicate = predicate(p1, p2, p3, points, i, vi1, m, meshIndex, vertices, indices);\r\n if (pointsFromPredicate) {\r\n for (const p of pointsFromPredicate) {\r\n points.push(p);\r\n }\r\n }\r\n } else {\r\n points.push([p1, p2], [p2, p3], [p3, p1]);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return points;\r\n }\r\n\r\n /**\r\n * Converts number coordinates to Vector3s\r\n * @param points number array of x, y, z, x, y z, ... coordinates\r\n * @returns Vector3 array\r\n */\r\n public static ToVector3Array(points: number[] | number[][]) {\r\n if (Array.isArray(points[0])) {\r\n const array: Vector3[][] = [];\r\n const inputArray = points as number[][];\r\n for (const subInputArray of inputArray) {\r\n const subArray: Vector3[] = [];\r\n for (let i = 0; i < subInputArray.length; i += 3) {\r\n subArray.push(new Vector3(subInputArray[i], subInputArray[i + 1], subInputArray[i + 2]));\r\n }\r\n array.push(subArray);\r\n }\r\n return array;\r\n }\r\n\r\n const inputArray = points as number[];\r\n const array: Vector3[] = [];\r\n for (let i = 0; i < inputArray.length; i += 3) {\r\n array.push(new Vector3(inputArray[i], inputArray[i + 1], inputArray[i + 2]));\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * Gets a number array from a Vector3 array.\r\n * You can you for example to convert your Vector3[] offsets to the required number[] for the offsets option.\r\n * @param points Vector3 array\r\n * @returns an array of x, y, z coordinates as numbers [x, y, z, x, y, z, x, y, z, ....]\r\n */\r\n public static ToNumberArray(points: Vector3[]) {\r\n return points.flatMap((v) => [v.x, v.y, v.z]);\r\n }\r\n\r\n /**\r\n * Calculates the sum of points of every line and the number of points in each line.\r\n * This function is useful when you are drawing multiple lines in one mesh and you want\r\n * to know the counts. For example for creating an offsets table.\r\n * @param points point array\r\n * @returns points count info\r\n */\r\n public static GetPointsCountInfo(points: number[][]): { total: number; counts: number[] } {\r\n const counts = new Array(points.length);\r\n let total = 0;\r\n for (let n = points.length; n--; ) {\r\n counts[n] = points[n].length / 3;\r\n total += counts[n];\r\n }\r\n return { total, counts };\r\n }\r\n\r\n /**\r\n * Gets the length of the line counting all it's segments length\r\n * @param data array of line points\r\n * @returns length of the line\r\n */\r\n public static GetLineLength(data: Vector3[] | number[]): number {\r\n if (data.length === 0) {\r\n return 0;\r\n }\r\n\r\n let points: Vector3[];\r\n if (typeof data[0] === \"number\") {\r\n points = GreasedLineTools.ToVector3Array(<number[]>data) as Vector3[];\r\n } else {\r\n points = data as Vector3[];\r\n }\r\n\r\n const tmp = TmpVectors.Vector3[0];\r\n let length = 0;\r\n for (let index = 0; index < points.length - 1; index++) {\r\n const point1 = points[index];\r\n const point2 = points[index + 1];\r\n length += point2.subtractToRef(point1, tmp).length();\r\n }\r\n return length;\r\n }\r\n\r\n /**\r\n * Gets the the length from the beginning to each point of the line as array.\r\n * @param data array of line points\r\n * @returns length array of the line\r\n */\r\n public static GetLineLengthArray(data: number[]): Float32Array {\r\n const out = new Float32Array(data.length / 3);\r\n let length = 0;\r\n for (let index = 0, pointsLength = data.length / 3 - 1; index < pointsLength; index++) {\r\n let x = data[index * 3 + 0];\r\n let y = data[index * 3 + 1];\r\n let z = data[index * 3 + 2];\r\n x -= data[index * 3 + 3];\r\n y -= data[index * 3 + 4];\r\n z -= data[index * 3 + 5];\r\n const currentLength = Math.sqrt(x * x + y * y + z * z);\r\n length += currentLength;\r\n out[index + 1] = length;\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Divides a segment into smaller segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param point1 first point of the line\r\n * @param point2 second point of the line\r\n * @param segmentCount number of segments we want to have in the divided line\r\n * @returns\r\n */\r\n public static SegmentizeSegmentByCount(point1: Vector3, point2: Vector3, segmentCount: number): Vector3[] {\r\n const dividedLinePoints: Vector3[] = [];\r\n const diff = point2.subtract(point1);\r\n const divisor = TmpVectors.Vector3[0];\r\n divisor.setAll(segmentCount);\r\n const segmentVector = TmpVectors.Vector3[1];\r\n diff.divideToRef(divisor, segmentVector);\r\n\r\n let nextPoint = point1.clone();\r\n dividedLinePoints.push(nextPoint);\r\n for (let index = 0; index < segmentCount; index++) {\r\n nextPoint = nextPoint.clone();\r\n dividedLinePoints.push(nextPoint.addInPlace(segmentVector));\r\n }\r\n\r\n return dividedLinePoints;\r\n }\r\n\r\n /**\r\n * Divides a line into segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param what line points\r\n * @param segmentLength length of each segment of the resulting line (distance between two line points)\r\n * @returns line point\r\n */\r\n public static SegmentizeLineBySegmentLength(what: Vector3[] | number[] | { point1: Vector3; point2: Vector3; length: number }[], segmentLength: number): Vector3[] {\r\n const subLines =\r\n what[0] instanceof Vector3\r\n ? GreasedLineTools.GetLineSegments(what as Vector3[])\r\n : typeof what[0] === \"number\"\r\n ? GreasedLineTools.GetLineSegments(GreasedLineTools.ToVector3Array(what as number[]) as Vector3[])\r\n : (what as { point1: Vector3; point2: Vector3; length: number }[]);\r\n const points: Vector3[] = [];\r\n subLines.forEach((s) => {\r\n if (s.length > segmentLength) {\r\n const segments = GreasedLineTools.SegmentizeSegmentByCount(s.point1, s.point2, Math.ceil(s.length / segmentLength));\r\n segments.forEach((seg) => {\r\n points.push(seg);\r\n });\r\n } else {\r\n points.push(s.point1);\r\n points.push(s.point2);\r\n }\r\n });\r\n return points;\r\n }\r\n\r\n /**\r\n * Divides a line into segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param what line points\r\n * @param segmentCount number of segments\r\n * @returns line point\r\n */\r\n public static SegmentizeLineBySegmentCount(what: Vector3[] | number[], segmentCount: number): Vector3[] {\r\n const points = <Vector3[]>(typeof what[0] === \"number\" ? GreasedLineTools.ToVector3Array(<number[]>what) : what);\r\n const segmentLength = GreasedLineTools.GetLineLength(points) / segmentCount;\r\n return GreasedLineTools.SegmentizeLineBySegmentLength(points, segmentLength);\r\n }\r\n /**\r\n * Gets line segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param points line points\r\n * @returns segments information of the line segment including starting point, ending point and the distance between them\r\n */\r\n public static GetLineSegments(points: Vector3[]): { point1: Vector3; point2: Vector3; length: number }[] {\r\n const segments = [];\r\n for (let index = 0; index < points.length - 1; index++) {\r\n const point1 = points[index];\r\n const point2 = points[index + 1];\r\n const length = point2.subtract(point1).length();\r\n segments.push({ point1, point2, length });\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n /**\r\n * Gets the minimum and the maximum length of a line segment in the line.\r\n * A segment is a part of the line between it's two points.\r\n * @param points line points\r\n * @returns\r\n */\r\n public static GetMinMaxSegmentLength(points: Vector3[]): { min: number; max: number } {\r\n const subLines = GreasedLineTools.GetLineSegments(points);\r\n const sorted = subLines.sort((s) => s.length);\r\n return {\r\n min: sorted[0].length,\r\n max: sorted[sorted.length - 1].length,\r\n };\r\n }\r\n\r\n /**\r\n * Finds the last visible position in world space of the line according to the visibility parameter\r\n * @param lineSegments segments of the line\r\n * @param lineLength total length of the line\r\n * @param visbility normalized value of visibility\r\n * @param localSpace if true the result will be in local space (default is false)\r\n * @returns world space coordinate of the last visible piece of the line\r\n */\r\n public static GetPositionOnLineByVisibility(lineSegments: { point1: Vector3; point2: Vector3; length: number }[], lineLength: number, visbility: number, localSpace = false) {\r\n const lengthVisibilityRatio = lineLength * visbility;\r\n let sumSegmentLengths = 0;\r\n let segmentIndex = 0;\r\n\r\n const lineSegmentsLength = lineSegments.length;\r\n for (let i = 0; i < lineSegmentsLength; i++) {\r\n if (lengthVisibilityRatio <= sumSegmentLengths + lineSegments[i].length) {\r\n segmentIndex = i;\r\n break;\r\n }\r\n sumSegmentLengths += lineSegments[i].length;\r\n }\r\n\r\n const s = (lengthVisibilityRatio - sumSegmentLengths) / lineSegments[segmentIndex].length;\r\n\r\n lineSegments[segmentIndex].point2.subtractToRef(lineSegments[segmentIndex].point1, TmpVectors.Vector3[0]);\r\n TmpVectors.Vector3[1] = TmpVectors.Vector3[0].multiplyByFloats(s, s, s);\r\n if (!localSpace) {\r\n TmpVectors.Vector3[1].addInPlace(lineSegments[segmentIndex].point1);\r\n }\r\n\r\n return TmpVectors.Vector3[1].clone();\r\n }\r\n\r\n /**\r\n * Creates lines in a shape of circle/arc.\r\n * A segment is a part of the line between it's two points.\r\n * @param radiusX radiusX of the circle\r\n * @param segments number of segments in the circle\r\n * @param z z coordinate of the points. Defaults to 0.\r\n * @param radiusY radiusY of the circle - you can draw an oval if using different values\r\n * @param segmentAngle angle offset of the segments. Defaults to Math.PI * 2 / segments. Change this value to draw a part of the circle.\r\n * @returns line points\r\n */\r\n public static GetCircleLinePoints(radiusX: number, segments: number, z = 0, radiusY = radiusX, segmentAngle = (Math.PI * 2) / segments) {\r\n const points: Vector3[] = [];\r\n for (let i = 0; i <= segments; i++) {\r\n points.push(new Vector3(Math.cos(i * segmentAngle) * radiusX, Math.sin(i * segmentAngle) * radiusY, z));\r\n }\r\n return points;\r\n }\r\n\r\n /**\r\n * Gets line points in a shape of a bezier curve\r\n * @param p0 bezier point0\r\n * @param p1 bezier point1\r\n * @param p2 bezier point2\r\n * @param segments number of segments in the curve\r\n * @returns\r\n */\r\n public static GetBezierLinePoints(p0: Vector3, p1: Vector3, p2: Vector3, segments: number) {\r\n return Curve3.CreateQuadraticBezier(p0, p1, p2, segments)\r\n .getPoints()\r\n .flatMap((v) => [v.x, v.y, v.z]);\r\n }\r\n\r\n /**\r\n *\r\n * @param position position of the arrow cap (mainly you want to create a triangle, set widthUp and widthDown to the same value and omit widthStartUp and widthStartDown)\r\n * @param direction direction which the arrow points to\r\n * @param length length (size) of the arrow cap itself\r\n * @param widthUp the arrow width above the line\r\n * @param widthDown the arrow width belove the line\r\n * @param widthStartUp the arrow width at the start of the arrow above the line. In most scenarios this is 0.\r\n * @param widthStartDown the arrow width at the start of the arrow below the line. In most scenarios this is 0.\r\n * @returns\r\n */\r\n public static GetArrowCap(position: Vector3, direction: Vector3, length: number, widthUp: number, widthDown: number, widthStartUp = 0, widthStartDown = 0) {\r\n const points = [position.clone(), position.add(direction.multiplyByFloats(length, length, length))];\r\n const widths = [widthUp, widthDown, widthStartUp, widthStartDown];\r\n\r\n return {\r\n points,\r\n widths,\r\n };\r\n }\r\n\r\n /**\r\n * Gets 3D positions of points from a text and font\r\n * @param text Text\r\n * @param size Size of the font\r\n * @param resolution Resolution of the font\r\n * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)\r\n * @param z z coordinate\r\n * @param includeInner include the inner parts of the font in the result. Default true. If false, only the outlines will be returned.\r\n * @returns number[][] of 3D positions\r\n */\r\n public static GetPointsFromText(text: string, size: number, resolution: number, fontData: IFontData, z = 0, includeInner = true) {\r\n const allPoints = [];\r\n const shapePaths = CreateTextShapePaths(text, size, resolution, fontData);\r\n\r\n for (const sp of shapePaths) {\r\n for (const p of sp.paths) {\r\n const points = [];\r\n const points2d = p.getPoints();\r\n for (const p2d of points2d) {\r\n points.push(p2d.x, p2d.y, z);\r\n }\r\n allPoints.push(points);\r\n }\r\n\r\n if (includeInner) {\r\n for (const h of sp.holes) {\r\n const holes = [];\r\n const points2d = h.getPoints();\r\n for (const p2d of points2d) {\r\n holes.push(p2d.x, p2d.y, z);\r\n }\r\n allPoints.push(holes);\r\n }\r\n }\r\n }\r\n\r\n return allPoints;\r\n }\r\n\r\n /**\r\n * Converts an array of Color3 to Uint8Array\r\n * @param colors Arrray of Color3\r\n * @returns Uin8Array of colors [r, g, b, a, r, g, b, a, ...]\r\n */\r\n public static Color3toRGBAUint8(colors: Color3[]): Uint8Array {\r\n const colorTable: Uint8Array = new Uint8Array(colors.length * 4);\r\n for (let i = 0, j = 0; i < colors.length; i++) {\r\n colorTable[j++] = colors[i].r * 255;\r\n colorTable[j++] = colors[i].g * 255;\r\n colorTable[j++] = colors[i].b * 255;\r\n colorTable[j++] = 255;\r\n }\r\n\r\n return colorTable;\r\n }\r\n\r\n /**\r\n * Creates a RawTexture from an RGBA color array and sets it on the plugin material instance.\r\n * @param name name of the texture\r\n * @param colors Uint8Array of colors\r\n * @param colorsSampling sampling mode of the created texture\r\n * @param scene Scene\r\n * @returns the colors texture\r\n */\r\n public static CreateColorsTexture(name: string, colors: Color3[], colorsSampling: number, scene: Scene) {\r\n const maxTextureSize = scene.getEngine().getCaps().maxTextureSize ?? 1;\r\n const width = colors.length > maxTextureSize ? maxTextureSize : colors.length;\r\n const height = Math.ceil(colors.length / maxTextureSize);\r\n if (height > 1) {\r\n colors = [...colors, ...Array(width * height - colors.length).fill(colors[0])];\r\n }\r\n const colorsArray = GreasedLineTools.Color3toRGBAUint8(colors);\r\n const colorsTexture = new RawTexture(colorsArray, width, height, Engine.TEXTUREFORMAT_RGBA, scene, false, true, colorsSampling);\r\n colorsTexture.name = name;\r\n return colorsTexture;\r\n }\r\n\r\n /**\r\n * A minimum size texture for the colors sampler2D when there is no colors texture defined yet.\r\n * For fast switching using the useColors property without the need to use defines.\r\n * @param scene Scene\r\n * @returns empty colors texture\r\n */\r\n public static PrepareEmptyColorsTexture(scene: Scene) {\r\n if (!GreasedLineMaterialDefaults.EmptyColorsTexture) {\r\n const colorsArray = new Uint8Array(4);\r\n GreasedLineMaterialDefaults.EmptyColorsTexture = new RawTexture(colorsArray, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false, false, RawTexture.NEAREST_NEAREST);\r\n GreasedLineMaterialDefaults.EmptyColorsTexture.name = \"grlEmptyColorsTexture\";\r\n }\r\n\r\n return GreasedLineMaterialDefaults.EmptyColorsTexture;\r\n }\r\n\r\n /**\r\n * Diposes the shared empty colors texture\r\n */\r\n public static DisposeEmptyColorsTexture() {\r\n GreasedLineMaterialDefaults.EmptyColorsTexture?.dispose();\r\n GreasedLineMaterialDefaults.EmptyColorsTexture = null;\r\n }\r\n\r\n /**\r\n * Converts boolean to number.\r\n * @param bool the bool value\r\n * @returns 1 if true, 0 if false.\r\n */\r\n public static BooleanToNumber(bool?: boolean) {\r\n return bool ? 1 : 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"greasedLineTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/greasedLineTools.ts"],"names":[],"mappings":"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","sourcesContent":["import { Curve3 } from \"../Maths/math.path\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { TmpVectors, Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { IFontData } from \"../Meshes/Builders/textBuilder\";\r\nimport { CreateTextShapePaths } from \"../Meshes/Builders/textBuilder\";\r\nimport type { FloatArray, IndicesArray } from \"../types\";\r\nimport type { GreasedLinePoints, GreasedLinePointsOptions } from \"../Meshes/GreasedLine/greasedLineBaseMesh\";\r\nimport type { Color3 } from \"../Maths/math.color\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { GreasedLineMaterialDefaults } from \"../Materials/GreasedLine/greasedLineMaterialDefaults\";\r\n\r\n/**\r\n * Tool functions for GreasedLine\r\n */\r\nexport class GreasedLineTools {\r\n /**\r\n * Converts GreasedLinePoints to number[][]\r\n * @param points GreasedLinePoints\r\n * @param options GreasedLineToolsConvertPointsOptions\r\n * @returns number[][] with x, y, z coordinates of the points, like [[x, y, z, x, y, z, ...], [x, y, z, ...]]\r\n */\r\n public static ConvertPoints(points: GreasedLinePoints, options?: GreasedLinePointsOptions): number[][] {\r\n if (points.length && Array.isArray(points) && typeof points[0] === \"number\") {\r\n return [<number[]>points];\r\n } else if (points.length && Array.isArray(points[0]) && typeof points[0][0] === \"number\") {\r\n return <number[][]>points;\r\n } else if (points.length && !Array.isArray(points[0]) && points[0] instanceof Vector3) {\r\n const positions: number[] = [];\r\n for (let j = 0; j < points.length; j++) {\r\n const p = points[j] as Vector3;\r\n positions.push(p.x, p.y, p.z);\r\n }\r\n return [positions];\r\n } else if (points.length > 0 && Array.isArray(points[0]) && points[0].length > 0 && points[0][0] instanceof Vector3) {\r\n const positions: number[][] = [];\r\n const vectorPoints = points as Vector3[][];\r\n for (const p of vectorPoints) {\r\n positions.push(p.flatMap((p2) => [p2.x, p2.y, p2.z]));\r\n }\r\n return positions;\r\n } else if (points instanceof Float32Array) {\r\n if (options?.floatArrayStride) {\r\n const positions: number[][] = [];\r\n const stride = options.floatArrayStride * 3;\r\n for (let i = 0; i < points.length; i += stride) {\r\n const linePoints = new Array(stride); // Pre-allocate memory for the line\r\n for (let j = 0; j < stride; j++) {\r\n linePoints[j] = points[i + j];\r\n }\r\n positions.push(linePoints);\r\n }\r\n return positions;\r\n } else {\r\n return [Array.from(points)];\r\n }\r\n } else if (points.length && points[0] instanceof Float32Array) {\r\n const positions: number[][] = [];\r\n for (const p of points) {\r\n positions.push(Array.from(p as Float32Array));\r\n }\r\n\r\n return positions;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Omit zero length lines predicate for the MeshesToLines function\r\n * @param p1 point1 position of the face\r\n * @param p2 point2 position of the face\r\n * @param p3 point3 position of the face\r\n * @returns original points or null if any edge length is zero\r\n */\r\n public static OmitZeroLengthPredicate(p1: Vector3, p2: Vector3, p3: Vector3) {\r\n const fileredPoints = [];\r\n // edge1\r\n if (p2.subtract(p1).lengthSquared() > 0) {\r\n fileredPoints.push([p1, p2]);\r\n }\r\n // edge2\r\n if (p3.subtract(p2).lengthSquared() > 0) {\r\n fileredPoints.push([p2, p3]);\r\n }\r\n // edge3\r\n if (p1.subtract(p3).lengthSquared() > 0) {\r\n fileredPoints.push([p3, p1]);\r\n }\r\n return fileredPoints.length === 0 ? null : fileredPoints;\r\n }\r\n\r\n /**\r\n * Omit duplicate lines predicate for the MeshesToLines function\r\n * @param p1 point1 position of the face\r\n * @param p2 point2 position of the face\r\n * @param p3 point3 position of the face\r\n * @param points array of points to search in\r\n * @returns original points or null if any edge length is zero\r\n */\r\n public static OmitDuplicatesPredicate(p1: Vector3, p2: Vector3, p3: Vector3, points: Vector3[][]) {\r\n const fileredPoints = [];\r\n // edge1\r\n if (!GreasedLineTools._SearchInPoints(p1, p2, points)) {\r\n fileredPoints.push([p1, p2]);\r\n }\r\n // edge2\r\n if (!GreasedLineTools._SearchInPoints(p2, p3, points)) {\r\n fileredPoints.push([p2, p3]);\r\n }\r\n // edge3\r\n if (!GreasedLineTools._SearchInPoints(p3, p1, points)) {\r\n fileredPoints.push([p3, p1]);\r\n }\r\n return fileredPoints.length === 0 ? null : fileredPoints;\r\n }\r\n\r\n private static _SearchInPoints(p1: Vector3, p2: Vector3, points: Vector3[][]) {\r\n for (const ps of points) {\r\n for (let i = 0; i < ps.length; i++) {\r\n if (ps[i]?.equals(p1)) {\r\n // find the first point\r\n // if it has a sibling of p2 the line already exists\r\n if (ps[i + 1]?.equals(p2) || ps[i - 1]?.equals(p2)) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets mesh triangles as line positions\r\n * @param meshes array of meshes\r\n * @param predicate predicate function which decides whether to include the mesh triangle/face in the ouput\r\n * @returns array of arrays of points\r\n */\r\n public static MeshesToLines(\r\n meshes: AbstractMesh[],\r\n predicate?: (\r\n p1: Vector3,\r\n p2: Vector3,\r\n p3: Vector3,\r\n points: Vector3[][],\r\n indiceIndex: number,\r\n vertexIndex: number,\r\n mesh: AbstractMesh,\r\n meshIndex: number,\r\n vertices: FloatArray,\r\n indices: IndicesArray\r\n ) => Vector3[][]\r\n ) {\r\n const points: Vector3[][] = [];\r\n\r\n for (let meshIndex = 0; meshIndex < meshes.length; meshIndex++) {\r\n const mesh = meshes[meshIndex];\r\n const vertices = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = mesh.getIndices();\r\n if (vertices && indices) {\r\n for (let i = 0, ii = 0; i < indices.length; i++) {\r\n const vi1 = indices[ii++] * 3;\r\n const vi2 = indices[ii++] * 3;\r\n const vi3 = indices[ii++] * 3;\r\n\r\n const p1 = new Vector3(vertices[vi1], vertices[vi1 + 1], vertices[vi1 + 2]);\r\n const p2 = new Vector3(vertices[vi2], vertices[vi2 + 1], vertices[vi2 + 2]);\r\n const p3 = new Vector3(vertices[vi3], vertices[vi3 + 1], vertices[vi3 + 2]);\r\n\r\n if (predicate) {\r\n const pointsFromPredicate = predicate(p1, p2, p3, points, i, vi1, mesh, meshIndex, vertices, indices);\r\n if (pointsFromPredicate) {\r\n for (const p of pointsFromPredicate) {\r\n points.push(p);\r\n }\r\n }\r\n } else {\r\n points.push([p1, p2], [p2, p3], [p3, p1]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return points;\r\n }\r\n\r\n /**\r\n * Converts number coordinates to Vector3s\r\n * @param points number array of x, y, z, x, y z, ... coordinates\r\n * @returns Vector3 array\r\n */\r\n public static ToVector3Array(points: number[] | number[][]) {\r\n if (Array.isArray(points[0])) {\r\n const array: Vector3[][] = [];\r\n const inputArray = points as number[][];\r\n for (const subInputArray of inputArray) {\r\n const subArray: Vector3[] = [];\r\n for (let i = 0; i < subInputArray.length; i += 3) {\r\n subArray.push(new Vector3(subInputArray[i], subInputArray[i + 1], subInputArray[i + 2]));\r\n }\r\n array.push(subArray);\r\n }\r\n return array;\r\n }\r\n\r\n const inputArray = points as number[];\r\n const array: Vector3[] = [];\r\n for (let i = 0; i < inputArray.length; i += 3) {\r\n array.push(new Vector3(inputArray[i], inputArray[i + 1], inputArray[i + 2]));\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * Gets a number array from a Vector3 array.\r\n * You can you for example to convert your Vector3[] offsets to the required number[] for the offsets option.\r\n * @param points Vector3 array\r\n * @returns an array of x, y, z coordinates as numbers [x, y, z, x, y, z, x, y, z, ....]\r\n */\r\n public static ToNumberArray(points: Vector3[]) {\r\n return points.flatMap((v) => [v.x, v.y, v.z]);\r\n }\r\n\r\n /**\r\n * Calculates the sum of points of every line and the number of points in each line.\r\n * This function is useful when you are drawing multiple lines in one mesh and you want\r\n * to know the counts. For example for creating an offsets table.\r\n * @param points point array\r\n * @returns points count info\r\n */\r\n public static GetPointsCountInfo(points: number[][]): { total: number; counts: number[] } {\r\n const counts = new Array(points.length);\r\n let total = 0;\r\n for (let n = points.length; n--; ) {\r\n counts[n] = points[n].length / 3;\r\n total += counts[n];\r\n }\r\n return { total, counts };\r\n }\r\n\r\n /**\r\n * Gets the length of the line counting all it's segments length\r\n * @param data array of line points\r\n * @returns length of the line\r\n */\r\n public static GetLineLength(data: Vector3[] | number[]): number {\r\n if (data.length === 0) {\r\n return 0;\r\n }\r\n\r\n let points: Vector3[];\r\n if (typeof data[0] === \"number\") {\r\n points = GreasedLineTools.ToVector3Array(<number[]>data) as Vector3[];\r\n } else {\r\n points = data as Vector3[];\r\n }\r\n\r\n const tmp = TmpVectors.Vector3[0];\r\n let length = 0;\r\n for (let index = 0; index < points.length - 1; index++) {\r\n const point1 = points[index];\r\n const point2 = points[index + 1];\r\n length += point2.subtractToRef(point1, tmp).length();\r\n }\r\n return length;\r\n }\r\n\r\n /**\r\n * Gets the the length from the beginning to each point of the line as array.\r\n * @param data array of line points\r\n * @returns length array of the line\r\n */\r\n public static GetLineLengthArray(data: number[]): Float32Array {\r\n const out = new Float32Array(data.length / 3);\r\n let length = 0;\r\n for (let index = 0, pointsLength = data.length / 3 - 1; index < pointsLength; index++) {\r\n let x = data[index * 3 + 0];\r\n let y = data[index * 3 + 1];\r\n let z = data[index * 3 + 2];\r\n x -= data[index * 3 + 3];\r\n y -= data[index * 3 + 4];\r\n z -= data[index * 3 + 5];\r\n const currentLength = Math.sqrt(x * x + y * y + z * z);\r\n length += currentLength;\r\n out[index + 1] = length;\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Divides a segment into smaller segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param point1 first point of the line\r\n * @param point2 second point of the line\r\n * @param segmentCount number of segments we want to have in the divided line\r\n * @returns\r\n */\r\n public static SegmentizeSegmentByCount(point1: Vector3, point2: Vector3, segmentCount: number): Vector3[] {\r\n const dividedLinePoints: Vector3[] = [];\r\n const diff = point2.subtract(point1);\r\n const divisor = TmpVectors.Vector3[0];\r\n divisor.setAll(segmentCount);\r\n const segmentVector = TmpVectors.Vector3[1];\r\n diff.divideToRef(divisor, segmentVector);\r\n\r\n let nextPoint = point1.clone();\r\n dividedLinePoints.push(nextPoint);\r\n for (let index = 0; index < segmentCount; index++) {\r\n nextPoint = nextPoint.clone();\r\n dividedLinePoints.push(nextPoint.addInPlace(segmentVector));\r\n }\r\n\r\n return dividedLinePoints;\r\n }\r\n\r\n /**\r\n * Divides a line into segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param what line points\r\n * @param segmentLength length of each segment of the resulting line (distance between two line points)\r\n * @returns line point\r\n */\r\n public static SegmentizeLineBySegmentLength(what: Vector3[] | number[] | { point1: Vector3; point2: Vector3; length: number }[], segmentLength: number): Vector3[] {\r\n const subLines =\r\n what[0] instanceof Vector3\r\n ? GreasedLineTools.GetLineSegments(what as Vector3[])\r\n : typeof what[0] === \"number\"\r\n ? GreasedLineTools.GetLineSegments(GreasedLineTools.ToVector3Array(what as number[]) as Vector3[])\r\n : (what as { point1: Vector3; point2: Vector3; length: number }[]);\r\n const points: Vector3[] = [];\r\n for (const s of subLines) {\r\n if (s.length > segmentLength) {\r\n const segments = GreasedLineTools.SegmentizeSegmentByCount(s.point1, s.point2, Math.ceil(s.length / segmentLength));\r\n for (const seg of segments) {\r\n points.push(seg);\r\n }\r\n } else {\r\n points.push(s.point1);\r\n points.push(s.point2);\r\n }\r\n }\r\n return points;\r\n }\r\n\r\n /**\r\n * Divides a line into segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param what line points\r\n * @param segmentCount number of segments\r\n * @returns line point\r\n */\r\n public static SegmentizeLineBySegmentCount(what: Vector3[] | number[], segmentCount: number): Vector3[] {\r\n const points = <Vector3[]>(typeof what[0] === \"number\" ? GreasedLineTools.ToVector3Array(<number[]>what) : what);\r\n const segmentLength = GreasedLineTools.GetLineLength(points) / segmentCount;\r\n return GreasedLineTools.SegmentizeLineBySegmentLength(points, segmentLength);\r\n }\r\n /**\r\n * Gets line segments.\r\n * A segment is a part of the line between it's two points.\r\n * @param points line points\r\n * @returns segments information of the line segment including starting point, ending point and the distance between them\r\n */\r\n public static GetLineSegments(points: Vector3[]): { point1: Vector3; point2: Vector3; length: number }[] {\r\n const segments = [];\r\n for (let index = 0; index < points.length - 1; index++) {\r\n const point1 = points[index];\r\n const point2 = points[index + 1];\r\n const length = point2.subtract(point1).length();\r\n segments.push({ point1, point2, length });\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n /**\r\n * Gets the minimum and the maximum length of a line segment in the line.\r\n * A segment is a part of the line between it's two points.\r\n * @param points line points\r\n * @returns\r\n */\r\n public static GetMinMaxSegmentLength(points: Vector3[]): { min: number; max: number } {\r\n const subLines = GreasedLineTools.GetLineSegments(points);\r\n const sorted = subLines.sort((s) => s.length);\r\n return {\r\n min: sorted[0].length,\r\n max: sorted[sorted.length - 1].length,\r\n };\r\n }\r\n\r\n /**\r\n * Finds the last visible position in world space of the line according to the visibility parameter\r\n * @param lineSegments segments of the line\r\n * @param lineLength total length of the line\r\n * @param visbility normalized value of visibility\r\n * @param localSpace if true the result will be in local space (default is false)\r\n * @returns world space coordinate of the last visible piece of the line\r\n */\r\n public static GetPositionOnLineByVisibility(lineSegments: { point1: Vector3; point2: Vector3; length: number }[], lineLength: number, visbility: number, localSpace = false) {\r\n const lengthVisibilityRatio = lineLength * visbility;\r\n let sumSegmentLengths = 0;\r\n let segmentIndex = 0;\r\n\r\n const lineSegmentsLength = lineSegments.length;\r\n for (let i = 0; i < lineSegmentsLength; i++) {\r\n if (lengthVisibilityRatio <= sumSegmentLengths + lineSegments[i].length) {\r\n segmentIndex = i;\r\n break;\r\n }\r\n sumSegmentLengths += lineSegments[i].length;\r\n }\r\n\r\n const s = (lengthVisibilityRatio - sumSegmentLengths) / lineSegments[segmentIndex].length;\r\n\r\n lineSegments[segmentIndex].point2.subtractToRef(lineSegments[segmentIndex].point1, TmpVectors.Vector3[0]);\r\n TmpVectors.Vector3[1] = TmpVectors.Vector3[0].multiplyByFloats(s, s, s);\r\n if (!localSpace) {\r\n TmpVectors.Vector3[1].addInPlace(lineSegments[segmentIndex].point1);\r\n }\r\n\r\n return TmpVectors.Vector3[1].clone();\r\n }\r\n\r\n /**\r\n * Creates lines in a shape of circle/arc.\r\n * A segment is a part of the line between it's two points.\r\n * @param radiusX radiusX of the circle\r\n * @param segments number of segments in the circle\r\n * @param z z coordinate of the points. Defaults to 0.\r\n * @param radiusY radiusY of the circle - you can draw an oval if using different values\r\n * @param segmentAngle angle offset of the segments. Defaults to Math.PI * 2 / segments. Change this value to draw a part of the circle.\r\n * @returns line points\r\n */\r\n public static GetCircleLinePoints(radiusX: number, segments: number, z = 0, radiusY = radiusX, segmentAngle = (Math.PI * 2) / segments) {\r\n const points: Vector3[] = [];\r\n for (let i = 0; i <= segments; i++) {\r\n points.push(new Vector3(Math.cos(i * segmentAngle) * radiusX, Math.sin(i * segmentAngle) * radiusY, z));\r\n }\r\n return points;\r\n }\r\n\r\n /**\r\n * Gets line points in a shape of a bezier curve\r\n * @param p0 bezier point0\r\n * @param p1 bezier point1\r\n * @param p2 bezier point2\r\n * @param segments number of segments in the curve\r\n * @returns\r\n */\r\n public static GetBezierLinePoints(p0: Vector3, p1: Vector3, p2: Vector3, segments: number) {\r\n return Curve3.CreateQuadraticBezier(p0, p1, p2, segments)\r\n .getPoints()\r\n .flatMap((v) => [v.x, v.y, v.z]);\r\n }\r\n\r\n /**\r\n *\r\n * @param position position of the arrow cap (mainly you want to create a triangle, set widthUp and widthDown to the same value and omit widthStartUp and widthStartDown)\r\n * @param direction direction which the arrow points to\r\n * @param length length (size) of the arrow cap itself\r\n * @param widthUp the arrow width above the line\r\n * @param widthDown the arrow width belove the line\r\n * @param widthStartUp the arrow width at the start of the arrow above the line. In most scenarios this is 0.\r\n * @param widthStartDown the arrow width at the start of the arrow below the line. In most scenarios this is 0.\r\n * @returns\r\n */\r\n public static GetArrowCap(position: Vector3, direction: Vector3, length: number, widthUp: number, widthDown: number, widthStartUp = 0, widthStartDown = 0) {\r\n const points = [position.clone(), position.add(direction.multiplyByFloats(length, length, length))];\r\n const widths = [widthUp, widthDown, widthStartUp, widthStartDown];\r\n\r\n return {\r\n points,\r\n widths,\r\n };\r\n }\r\n\r\n /**\r\n * Gets 3D positions of points from a text and font\r\n * @param text Text\r\n * @param size Size of the font\r\n * @param resolution Resolution of the font\r\n * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)\r\n * @param z z coordinate\r\n * @param includeInner include the inner parts of the font in the result. Default true. If false, only the outlines will be returned.\r\n * @returns number[][] of 3D positions\r\n */\r\n public static GetPointsFromText(text: string, size: number, resolution: number, fontData: IFontData, z = 0, includeInner = true) {\r\n const allPoints = [];\r\n const shapePaths = CreateTextShapePaths(text, size, resolution, fontData);\r\n\r\n for (const sp of shapePaths) {\r\n for (const p of sp.paths) {\r\n const points = [];\r\n const points2d = p.getPoints();\r\n for (const p2d of points2d) {\r\n points.push(p2d.x, p2d.y, z);\r\n }\r\n allPoints.push(points);\r\n }\r\n\r\n if (includeInner) {\r\n for (const h of sp.holes) {\r\n const holes = [];\r\n const points2d = h.getPoints();\r\n for (const p2d of points2d) {\r\n holes.push(p2d.x, p2d.y, z);\r\n }\r\n allPoints.push(holes);\r\n }\r\n }\r\n }\r\n\r\n return allPoints;\r\n }\r\n\r\n /**\r\n * Converts an array of Color3 to Uint8Array\r\n * @param colors Arrray of Color3\r\n * @returns Uin8Array of colors [r, g, b, a, r, g, b, a, ...]\r\n */\r\n public static Color3toRGBAUint8(colors: Color3[]): Uint8Array {\r\n const colorTable: Uint8Array = new Uint8Array(colors.length * 4);\r\n for (let i = 0, j = 0; i < colors.length; i++) {\r\n colorTable[j++] = colors[i].r * 255;\r\n colorTable[j++] = colors[i].g * 255;\r\n colorTable[j++] = colors[i].b * 255;\r\n colorTable[j++] = 255;\r\n }\r\n\r\n return colorTable;\r\n }\r\n\r\n /**\r\n * Creates a RawTexture from an RGBA color array and sets it on the plugin material instance.\r\n * @param name name of the texture\r\n * @param colors Uint8Array of colors\r\n * @param colorsSampling sampling mode of the created texture\r\n * @param scene Scene\r\n * @returns the colors texture\r\n */\r\n public static CreateColorsTexture(name: string, colors: Color3[], colorsSampling: number, scene: Scene) {\r\n const maxTextureSize = scene.getEngine().getCaps().maxTextureSize ?? 1;\r\n const width = colors.length > maxTextureSize ? maxTextureSize : colors.length;\r\n const height = Math.ceil(colors.length / maxTextureSize);\r\n if (height > 1) {\r\n colors = [...colors, ...Array(width * height - colors.length).fill(colors[0])];\r\n }\r\n const colorsArray = GreasedLineTools.Color3toRGBAUint8(colors);\r\n const colorsTexture = new RawTexture(colorsArray, width, height, Engine.TEXTUREFORMAT_RGBA, scene, false, true, colorsSampling);\r\n colorsTexture.name = name;\r\n return colorsTexture;\r\n }\r\n\r\n /**\r\n * A minimum size texture for the colors sampler2D when there is no colors texture defined yet.\r\n * For fast switching using the useColors property without the need to use defines.\r\n * @param scene Scene\r\n * @returns empty colors texture\r\n */\r\n public static PrepareEmptyColorsTexture(scene: Scene) {\r\n if (!GreasedLineMaterialDefaults.EmptyColorsTexture) {\r\n const colorsArray = new Uint8Array(4);\r\n GreasedLineMaterialDefaults.EmptyColorsTexture = new RawTexture(colorsArray, 1, 1, Engine.TEXTUREFORMAT_RGBA, scene, false, false, RawTexture.NEAREST_NEAREST);\r\n GreasedLineMaterialDefaults.EmptyColorsTexture.name = \"grlEmptyColorsTexture\";\r\n }\r\n\r\n return GreasedLineMaterialDefaults.EmptyColorsTexture;\r\n }\r\n\r\n /**\r\n * Diposes the shared empty colors texture\r\n */\r\n public static DisposeEmptyColorsTexture() {\r\n GreasedLineMaterialDefaults.EmptyColorsTexture?.dispose();\r\n GreasedLineMaterialDefaults.EmptyColorsTexture = null;\r\n }\r\n\r\n /**\r\n * Converts boolean to number.\r\n * @param bool the bool value\r\n * @returns 1 if true, 0 if false.\r\n */\r\n public static BooleanToNumber(bool?: boolean) {\r\n return bool ? 1 : 0;\r\n }\r\n}\r\n"]}
package/Misc/logger.js CHANGED
@@ -76,12 +76,13 @@ export class Logger {
76
76
  Logger.Log = Logger._LogDisabled;
77
77
  Logger.Warn = Logger._LogDisabled;
78
78
  Logger.Error = Logger._LogDisabled;
79
- [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel].forEach((l) => {
79
+ const levels = [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel];
80
+ for (const l of levels) {
80
81
  if ((level & l) === l) {
81
82
  const type = this._Levels[l];
82
83
  Logger[type.name] = Logger._LogEnabled.bind(Logger, l);
83
84
  }
84
- });
85
+ }
85
86
  }
86
87
  }
87
88
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\r\n/**\r\n * Logger used throughout the application to allow configuration of\r\n * the log level required for the messages.\r\n */\r\nexport class Logger {\r\n /**\r\n * No log\r\n */\r\n public static readonly NoneLogLevel = 0;\r\n /**\r\n * Only message logs\r\n */\r\n public static readonly MessageLogLevel = 1;\r\n /**\r\n * Only warning logs\r\n */\r\n public static readonly WarningLogLevel = 2;\r\n /**\r\n * Only error logs\r\n */\r\n public static readonly ErrorLogLevel = 4;\r\n /**\r\n * All logs\r\n */\r\n public static readonly AllLogLevel = 7;\r\n\r\n /**\r\n * Message to display when a message has been logged too many times\r\n */\r\n public static MessageLimitReached = \"Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.\";\r\n\r\n private static _LogCache = \"\";\r\n private static _LogLimitOutputs: { [message: string]: { limit: number; current: number } } = {};\r\n // levels according to the (binary) numbering.\r\n private static _Levels = [\r\n {},\r\n { color: \"white\", logFunc: console.log, name: \"Log\" },\r\n { color: \"orange\", logFunc: console.warn, name: \"Warn\" },\r\n {},\r\n { color: \"red\", logFunc: console.error, name: \"Error\" },\r\n ];\r\n\r\n /**\r\n * Gets a value indicating the number of loading errors\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static errorsCount = 0;\r\n\r\n /**\r\n * Callback called when a new log is added\r\n */\r\n public static OnNewCacheEntry: (entry: string) => void;\r\n\r\n private static _CheckLimit(message: string, limit: number): boolean {\r\n let entry = Logger._LogLimitOutputs[message];\r\n if (!entry) {\r\n entry = { limit, current: 1 };\r\n Logger._LogLimitOutputs[message] = entry;\r\n } else {\r\n entry.current++;\r\n }\r\n return entry.current <= entry.limit;\r\n }\r\n\r\n private static _GenerateLimitMessage(message: string, level: number = 1): void {\r\n const entry = Logger._LogLimitOutputs[message];\r\n if (!entry || !Logger.MessageLimitReached) {\r\n return;\r\n }\r\n const type = this._Levels[level];\r\n if (entry.current === entry.limit) {\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"](Logger.MessageLimitReached.replace(/%LIMIT%/g, \"\" + entry.limit).replace(/%TYPE%/g, type.name ?? \"\"));\r\n }\r\n }\r\n\r\n private static _AddLogEntry(entry: string) {\r\n Logger._LogCache = entry + Logger._LogCache;\r\n\r\n if (Logger.OnNewCacheEntry) {\r\n Logger.OnNewCacheEntry(entry);\r\n }\r\n }\r\n\r\n private static _FormatMessage(message: string): string {\r\n const padStr = (i: number) => (i < 10 ? \"0\" + i : \"\" + i);\r\n\r\n const date = new Date();\r\n return \"[\" + padStr(date.getHours()) + \":\" + padStr(date.getMinutes()) + \":\" + padStr(date.getSeconds()) + \"]: \" + message;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _LogDisabled(message: string | any[], limit?: number): void {\r\n // nothing to do\r\n }\r\n private static _LogEnabled(level: number = 1, message: string | any[], limit?: number): void {\r\n // take first message if array\r\n const msg = Array.isArray(message) ? message[0] : message;\r\n if (limit !== undefined && !Logger._CheckLimit(msg, limit)) {\r\n return;\r\n }\r\n\r\n const formattedMessage = Logger._FormatMessage(msg);\r\n const type = this._Levels[level];\r\n const optionals = Array.isArray(message) ? message.slice(1) : [];\r\n type.logFunc && type.logFunc(\"BJS - \" + formattedMessage, ...optionals);\r\n\r\n const entry = `<div style='color:${type.color}'>${formattedMessage}</div><br>`;\r\n Logger._AddLogEntry(entry);\r\n Logger._GenerateLimitMessage(msg, level);\r\n }\r\n\r\n /**\r\n * Log a message to the console\r\n */\r\n public static Log: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel);\r\n\r\n /**\r\n * Write a warning message to the console\r\n */\r\n public static Warn: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel);\r\n\r\n /**\r\n * Write an error message to the console\r\n */\r\n public static Error: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel);\r\n\r\n /**\r\n * Gets current log cache (list of logs)\r\n */\r\n public static get LogCache(): string {\r\n return Logger._LogCache;\r\n }\r\n\r\n /**\r\n * Clears the log cache\r\n */\r\n public static ClearLogCache(): void {\r\n Logger._LogCache = \"\";\r\n Logger._LogLimitOutputs = {};\r\n Logger.errorsCount = 0;\r\n }\r\n\r\n /**\r\n * Sets the current log level. This property is a bit field, allowing you to combine different levels (MessageLogLevel / WarningLogLevel / ErrorLogLevel).\r\n * Use NoneLogLevel to disable logging and AllLogLevel for a quick way to enable all levels.\r\n */\r\n public static set LogLevels(level: number) {\r\n Logger.Log = Logger._LogDisabled;\r\n Logger.Warn = Logger._LogDisabled;\r\n Logger.Error = Logger._LogDisabled;\r\n [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel].forEach((l) => {\r\n if ((level & l) === l) {\r\n const type = this._Levels[l];\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"] = Logger._LogEnabled.bind(Logger, l);\r\n }\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\r\n/**\r\n * Logger used throughout the application to allow configuration of\r\n * the log level required for the messages.\r\n */\r\nexport class Logger {\r\n /**\r\n * No log\r\n */\r\n public static readonly NoneLogLevel = 0;\r\n /**\r\n * Only message logs\r\n */\r\n public static readonly MessageLogLevel = 1;\r\n /**\r\n * Only warning logs\r\n */\r\n public static readonly WarningLogLevel = 2;\r\n /**\r\n * Only error logs\r\n */\r\n public static readonly ErrorLogLevel = 4;\r\n /**\r\n * All logs\r\n */\r\n public static readonly AllLogLevel = 7;\r\n\r\n /**\r\n * Message to display when a message has been logged too many times\r\n */\r\n public static MessageLimitReached = \"Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.\";\r\n\r\n private static _LogCache = \"\";\r\n private static _LogLimitOutputs: { [message: string]: { limit: number; current: number } } = {};\r\n // levels according to the (binary) numbering.\r\n private static _Levels = [\r\n {},\r\n { color: \"white\", logFunc: console.log, name: \"Log\" },\r\n { color: \"orange\", logFunc: console.warn, name: \"Warn\" },\r\n {},\r\n { color: \"red\", logFunc: console.error, name: \"Error\" },\r\n ];\r\n\r\n /**\r\n * Gets a value indicating the number of loading errors\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static errorsCount = 0;\r\n\r\n /**\r\n * Callback called when a new log is added\r\n */\r\n public static OnNewCacheEntry: (entry: string) => void;\r\n\r\n private static _CheckLimit(message: string, limit: number): boolean {\r\n let entry = Logger._LogLimitOutputs[message];\r\n if (!entry) {\r\n entry = { limit, current: 1 };\r\n Logger._LogLimitOutputs[message] = entry;\r\n } else {\r\n entry.current++;\r\n }\r\n return entry.current <= entry.limit;\r\n }\r\n\r\n private static _GenerateLimitMessage(message: string, level: number = 1): void {\r\n const entry = Logger._LogLimitOutputs[message];\r\n if (!entry || !Logger.MessageLimitReached) {\r\n return;\r\n }\r\n const type = this._Levels[level];\r\n if (entry.current === entry.limit) {\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"](Logger.MessageLimitReached.replace(/%LIMIT%/g, \"\" + entry.limit).replace(/%TYPE%/g, type.name ?? \"\"));\r\n }\r\n }\r\n\r\n private static _AddLogEntry(entry: string) {\r\n Logger._LogCache = entry + Logger._LogCache;\r\n\r\n if (Logger.OnNewCacheEntry) {\r\n Logger.OnNewCacheEntry(entry);\r\n }\r\n }\r\n\r\n private static _FormatMessage(message: string): string {\r\n const padStr = (i: number) => (i < 10 ? \"0\" + i : \"\" + i);\r\n\r\n const date = new Date();\r\n return \"[\" + padStr(date.getHours()) + \":\" + padStr(date.getMinutes()) + \":\" + padStr(date.getSeconds()) + \"]: \" + message;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _LogDisabled(message: string | any[], limit?: number): void {\r\n // nothing to do\r\n }\r\n private static _LogEnabled(level: number = 1, message: string | any[], limit?: number): void {\r\n // take first message if array\r\n const msg = Array.isArray(message) ? message[0] : message;\r\n if (limit !== undefined && !Logger._CheckLimit(msg, limit)) {\r\n return;\r\n }\r\n\r\n const formattedMessage = Logger._FormatMessage(msg);\r\n const type = this._Levels[level];\r\n const optionals = Array.isArray(message) ? message.slice(1) : [];\r\n type.logFunc && type.logFunc(\"BJS - \" + formattedMessage, ...optionals);\r\n\r\n const entry = `<div style='color:${type.color}'>${formattedMessage}</div><br>`;\r\n Logger._AddLogEntry(entry);\r\n Logger._GenerateLimitMessage(msg, level);\r\n }\r\n\r\n /**\r\n * Log a message to the console\r\n */\r\n public static Log: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel);\r\n\r\n /**\r\n * Write a warning message to the console\r\n */\r\n public static Warn: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel);\r\n\r\n /**\r\n * Write an error message to the console\r\n */\r\n public static Error: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel);\r\n\r\n /**\r\n * Gets current log cache (list of logs)\r\n */\r\n public static get LogCache(): string {\r\n return Logger._LogCache;\r\n }\r\n\r\n /**\r\n * Clears the log cache\r\n */\r\n public static ClearLogCache(): void {\r\n Logger._LogCache = \"\";\r\n Logger._LogLimitOutputs = {};\r\n Logger.errorsCount = 0;\r\n }\r\n\r\n /**\r\n * Sets the current log level. This property is a bit field, allowing you to combine different levels (MessageLogLevel / WarningLogLevel / ErrorLogLevel).\r\n * Use NoneLogLevel to disable logging and AllLogLevel for a quick way to enable all levels.\r\n */\r\n public static set LogLevels(level: number) {\r\n Logger.Log = Logger._LogDisabled;\r\n Logger.Warn = Logger._LogDisabled;\r\n Logger.Error = Logger._LogDisabled;\r\n const levels = [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel];\r\n for (const l of levels) {\r\n if ((level & l) === l) {\r\n const type = this._Levels[l];\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"] = Logger._LogEnabled.bind(Logger, l);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -50,12 +50,12 @@ Observable.prototype.notifyObserversWithPromise = async function (eventData, mas
50
50
  state.skipNextObservers = false;
51
51
  state.userInfo = userInfo;
52
52
  // execute one callback after another (not using Promise.all, the order is important)
53
- this.observers.forEach((obs) => {
53
+ for (const obs of this.observers) {
54
54
  if (state.skipNextObservers) {
55
- return;
55
+ continue;
56
56
  }
57
57
  if (obs._willBeUnregistered) {
58
- return;
58
+ continue;
59
59
  }
60
60
  if (obs.mask & mask) {
61
61
  if (obs.scope) {
@@ -74,7 +74,7 @@ Observable.prototype.notifyObserversWithPromise = async function (eventData, mas
74
74
  this._deferUnregister(obs);
75
75
  }
76
76
  }
77
- });
77
+ }
78
78
  // return the eventData
79
79
  await p;
80
80
  return eventData;
@@ -1 +1 @@
1
- {"version":3,"file":"observable.extensions.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/observable.extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Observer, EventState } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\n\r\n/**\r\n * Represent a list of observers registered to multiple Observables object.\r\n */\r\nexport class MultiObserver<T> {\r\n private _observers: Nullable<Observer<T>[]>;\r\n private _observables: Nullable<Observable<T>[]>;\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._observers && this._observables) {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n this._observables[index].remove(this._observers[index]);\r\n }\r\n }\r\n\r\n this._observers = null;\r\n this._observables = null;\r\n }\r\n\r\n /**\r\n * Raise a callback when one of the observable will notify\r\n * @param observables defines a list of observables to watch\r\n * @param callback defines the callback to call on notification\r\n * @param mask defines the mask used to filter notifications\r\n * @param scope defines the current scope used to restore the JS context\r\n * @returns the new MultiObserver\r\n */\r\n public static Watch<T>(observables: Observable<T>[], callback: (eventData: T, eventState: EventState) => void, mask: number = -1, scope: any = null): MultiObserver<T> {\r\n const result = new MultiObserver<T>();\r\n\r\n result._observers = new Array<Observer<T>>();\r\n result._observables = observables;\r\n\r\n for (const observable of observables) {\r\n const observer = observable.add(callback, mask, false, scope);\r\n if (observer) {\r\n result._observers.push(observer);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\ndeclare module \"./observable\" {\r\n export interface Observable<T> {\r\n /**\r\n * Calling this will execute each callback, expecting it to be a promise or return a value.\r\n * If at any point in the chain one function fails, the promise will fail and the execution will not continue.\r\n * This is useful when a chain of events (sometimes async events) is needed to initialize a certain object\r\n * and it is crucial that all callbacks will be executed.\r\n * The order of the callbacks is kept, callbacks are not executed parallel.\r\n *\r\n * @param eventData The data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n * @param target defines the callback target (see EventState)\r\n * @param currentTarget defines he current object in the bubbling phase\r\n * @param userInfo defines any user info to send to observers\r\n * @returns {Promise<T>} will return a Promise than resolves when all callbacks executed successfully.\r\n */\r\n notifyObserversWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any, userInfo?: any): Promise<T>;\r\n }\r\n}\r\n\r\nObservable.prototype.notifyObserversWithPromise = async function <T>(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): Promise<T> {\r\n // create an empty promise\r\n let p: Promise<any> = Promise.resolve(eventData);\r\n\r\n // no observers? return this promise.\r\n if (!this.observers.length) {\r\n return p;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.userInfo = userInfo;\r\n\r\n // execute one callback after another (not using Promise.all, the order is important)\r\n this.observers.forEach((obs) => {\r\n if (state.skipNextObservers) {\r\n return;\r\n }\r\n if (obs._willBeUnregistered) {\r\n return;\r\n }\r\n if (obs.mask & mask) {\r\n if (obs.scope) {\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback.apply(obs.scope, [eventData, state]);\r\n });\r\n } else {\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback(eventData, state);\r\n });\r\n }\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n }\r\n });\r\n\r\n // return the eventData\r\n await p;\r\n return eventData;\r\n};\r\n"]}
1
+ {"version":3,"file":"observable.extensions.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/observable.extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { Observer, EventState } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\n\r\n/**\r\n * Represent a list of observers registered to multiple Observables object.\r\n */\r\nexport class MultiObserver<T> {\r\n private _observers: Nullable<Observer<T>[]>;\r\n private _observables: Nullable<Observable<T>[]>;\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._observers && this._observables) {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n this._observables[index].remove(this._observers[index]);\r\n }\r\n }\r\n\r\n this._observers = null;\r\n this._observables = null;\r\n }\r\n\r\n /**\r\n * Raise a callback when one of the observable will notify\r\n * @param observables defines a list of observables to watch\r\n * @param callback defines the callback to call on notification\r\n * @param mask defines the mask used to filter notifications\r\n * @param scope defines the current scope used to restore the JS context\r\n * @returns the new MultiObserver\r\n */\r\n public static Watch<T>(observables: Observable<T>[], callback: (eventData: T, eventState: EventState) => void, mask: number = -1, scope: any = null): MultiObserver<T> {\r\n const result = new MultiObserver<T>();\r\n\r\n result._observers = new Array<Observer<T>>();\r\n result._observables = observables;\r\n\r\n for (const observable of observables) {\r\n const observer = observable.add(callback, mask, false, scope);\r\n if (observer) {\r\n result._observers.push(observer);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\ndeclare module \"./observable\" {\r\n export interface Observable<T> {\r\n /**\r\n * Calling this will execute each callback, expecting it to be a promise or return a value.\r\n * If at any point in the chain one function fails, the promise will fail and the execution will not continue.\r\n * This is useful when a chain of events (sometimes async events) is needed to initialize a certain object\r\n * and it is crucial that all callbacks will be executed.\r\n * The order of the callbacks is kept, callbacks are not executed parallel.\r\n *\r\n * @param eventData The data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n * @param target defines the callback target (see EventState)\r\n * @param currentTarget defines he current object in the bubbling phase\r\n * @param userInfo defines any user info to send to observers\r\n * @returns {Promise<T>} will return a Promise than resolves when all callbacks executed successfully.\r\n */\r\n notifyObserversWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any, userInfo?: any): Promise<T>;\r\n }\r\n}\r\n\r\nObservable.prototype.notifyObserversWithPromise = async function <T>(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): Promise<T> {\r\n // create an empty promise\r\n let p: Promise<any> = Promise.resolve(eventData);\r\n\r\n // no observers? return this promise.\r\n if (!this.observers.length) {\r\n return p;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.userInfo = userInfo;\r\n\r\n // execute one callback after another (not using Promise.all, the order is important)\r\n for (const obs of this.observers) {\r\n if (state.skipNextObservers) {\r\n continue;\r\n }\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n if (obs.mask & mask) {\r\n if (obs.scope) {\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback.apply(obs.scope, [eventData, state]);\r\n });\r\n } else {\r\n p = p.then((lastReturnedValue) => {\r\n state.lastReturnValue = lastReturnedValue;\r\n return obs.callback(eventData, state);\r\n });\r\n }\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n }\r\n }\r\n\r\n // return the eventData\r\n await p;\r\n return eventData;\r\n};\r\n"]}
@@ -367,11 +367,12 @@ export class SceneSerializer {
367
367
  //deliberate for loop! not for each, appended should be processed as well.
368
368
  for (let i = 0; i < toSerialize.length; ++i) {
369
369
  if (withChildren) {
370
- toSerialize[i].getDescendants().forEach((node) => {
370
+ const descendants = toSerialize[i].getDescendants();
371
+ for (const node of descendants) {
371
372
  if (toSerialize.indexOf(node) < 0 && !node.doNotSerialize) {
372
373
  toSerialize.push(node);
373
374
  }
374
- });
375
+ }
375
376
  }
376
377
  //make sure the array doesn't contain the object already
377
378
  if (withParents && toSerialize[i].parent && toSerialize.indexOf(toSerialize[i].parent) < 0 && !toSerialize[i].parent.doNotSerialize) {
@@ -379,9 +380,9 @@ export class SceneSerializer {
379
380
  }
380
381
  }
381
382
  }
382
- toSerialize.forEach((mesh) => {
383
+ for (const mesh of toSerialize) {
383
384
  FinalizeSingleNode(mesh, serializationObject);
384
- });
385
+ }
385
386
  return serializationObject;
386
387
  }
387
388
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sceneSerializer.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/sceneSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Geometry } from \"../Meshes/geometry\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport { SerializationHelper } from \"./decorators.serialization\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { CubeTexture } from \"../Materials/Textures/cubeTexture\";\r\nimport type { Node } from \"../node\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nlet serializedGeometries: Geometry[] = [];\r\nconst SerializeGeometry = (geometry: Geometry, serializationGeometries: any): any => {\r\n if (geometry.doNotSerialize) {\r\n return;\r\n }\r\n\r\n serializationGeometries.vertexData.push(geometry.serializeVerticeData());\r\n\r\n (<any>serializedGeometries)[geometry.id] = true;\r\n};\r\n\r\nconst SerializeMesh = (mesh: Mesh, serializationScene: any): any => {\r\n const serializationObject: any = {};\r\n\r\n // Geometry\r\n const geometry = mesh._geometry;\r\n if (geometry) {\r\n if (!mesh.getScene().getGeometryById(geometry.id)) {\r\n // Geometry was in the memory but not added to the scene, nevertheless it's better to serialize to be able to reload the mesh with its geometry\r\n SerializeGeometry(geometry, serializationScene.geometries);\r\n }\r\n }\r\n\r\n // Custom\r\n if (mesh.serialize) {\r\n mesh.serialize(serializationObject);\r\n }\r\n\r\n return serializationObject;\r\n};\r\n\r\nconst FinalizeSingleNode = (node: Node, serializationObject: any) => {\r\n if ((node as Mesh)._isMesh) {\r\n const mesh = node as Mesh;\r\n //only works if the mesh is already loaded\r\n if (mesh.delayLoadState === Constants.DELAYLOADSTATE_LOADED || mesh.delayLoadState === Constants.DELAYLOADSTATE_NONE) {\r\n const serializeMaterial = (material: Material) => {\r\n serializationObject.materials = serializationObject.materials || [];\r\n if (mesh.material && !serializationObject.materials.some((mat: Material) => mat.id === (<Material>mesh.material).id)) {\r\n serializationObject.materials.push(material.serialize());\r\n }\r\n };\r\n\r\n //serialize material\r\n if (mesh.material && !mesh.material.doNotSerialize) {\r\n if (mesh.material instanceof MultiMaterial) {\r\n serializationObject.multiMaterials = serializationObject.multiMaterials || [];\r\n if (!serializationObject.multiMaterials.some((mat: Material) => mat.id === (<Material>mesh.material).id)) {\r\n serializationObject.multiMaterials.push(mesh.material.serialize());\r\n for (const submaterial of mesh.material.subMaterials) {\r\n if (submaterial) {\r\n serializeMaterial(submaterial);\r\n }\r\n }\r\n }\r\n } else {\r\n serializeMaterial(mesh.material);\r\n }\r\n } else if (!mesh.material) {\r\n serializeMaterial(mesh.getScene().defaultMaterial);\r\n }\r\n\r\n //serialize geometry\r\n const geometry = mesh._geometry;\r\n if (geometry) {\r\n if (!serializationObject.geometries) {\r\n serializationObject.geometries = {};\r\n\r\n serializationObject.geometries.boxes = [];\r\n serializationObject.geometries.spheres = [];\r\n serializationObject.geometries.cylinders = [];\r\n serializationObject.geometries.toruses = [];\r\n serializationObject.geometries.grounds = [];\r\n serializationObject.geometries.planes = [];\r\n serializationObject.geometries.torusKnots = [];\r\n serializationObject.geometries.vertexData = [];\r\n }\r\n\r\n SerializeGeometry(geometry, serializationObject.geometries);\r\n }\r\n // Skeletons\r\n if (mesh.skeleton && !mesh.skeleton.doNotSerialize) {\r\n serializationObject.skeletons = serializationObject.skeletons || [];\r\n serializationObject.skeletons.push(mesh.skeleton.serialize());\r\n }\r\n\r\n //serialize the actual mesh\r\n serializationObject.meshes = serializationObject.meshes || [];\r\n serializationObject.meshes.push(SerializeMesh(mesh, serializationObject));\r\n }\r\n } else if (node.getClassName() === \"TransformNode\") {\r\n const transformNode = node as TransformNode;\r\n serializationObject.transformNodes.push(transformNode.serialize());\r\n } else if (node.getClassName().indexOf(\"Camera\") !== -1) {\r\n const camera = node as Camera;\r\n serializationObject.cameras.push(camera.serialize());\r\n } else if (node.getClassName().indexOf(\"Light\") !== -1) {\r\n const light = node as Light;\r\n serializationObject.lights.push(light.serialize());\r\n }\r\n};\r\n\r\n/**\r\n * Class used to serialize a scene into a string\r\n */\r\nexport class SceneSerializer {\r\n /**\r\n * Clear cache used by a previous serialization\r\n */\r\n public static ClearCache(): void {\r\n serializedGeometries = [];\r\n }\r\n\r\n /**\r\n * Serialize a scene into a JSON compatible object\r\n * Note that if the current engine does not support synchronous texture reading (like WebGPU), you should use SerializeAsync instead\r\n * as else you may not retrieve the proper base64 encoded texture data (when using the Texture.ForceSerializeBuffers flag)\r\n * @param scene defines the scene to serialize\r\n * @returns a JSON compatible object\r\n */\r\n public static Serialize(scene: Scene): any {\r\n return SceneSerializer._Serialize(scene);\r\n }\r\n\r\n private static _Serialize(scene: Scene, checkSyncReadSupported = true): any {\r\n const serializationObject: any = {};\r\n\r\n if (checkSyncReadSupported && !scene.getEngine()._features.supportSyncTextureRead && Texture.ForceSerializeBuffers) {\r\n Logger.Warn(\"The serialization object may not contain the proper base64 encoded texture data! You should use the SerializeAsync method instead.\");\r\n }\r\n\r\n SceneSerializer.ClearCache();\r\n\r\n // Scene\r\n serializationObject.useDelayedTextureLoading = scene.useDelayedTextureLoading;\r\n serializationObject.autoClear = scene.autoClear;\r\n serializationObject.clearColor = scene.clearColor.asArray();\r\n serializationObject.ambientColor = scene.ambientColor.asArray();\r\n serializationObject.gravity = scene.gravity.asArray();\r\n serializationObject.collisionsEnabled = scene.collisionsEnabled;\r\n serializationObject.useRightHandedSystem = scene.useRightHandedSystem;\r\n\r\n // Fog\r\n if (scene.fogMode !== undefined && scene.fogMode !== null) {\r\n serializationObject.fogMode = scene.fogMode;\r\n }\r\n if (scene.fogColor !== undefined && scene.fogColor !== null) {\r\n serializationObject.fogColor = scene.fogColor.asArray();\r\n }\r\n if (scene.fogStart !== undefined && scene.fogStart !== null) {\r\n serializationObject.fogStart = scene.fogStart;\r\n }\r\n if (scene.fogEnd !== undefined && scene.fogEnd !== null) {\r\n serializationObject.fogEnd = scene.fogEnd;\r\n }\r\n if (scene.fogDensity !== undefined && scene.fogDensity !== null) {\r\n serializationObject.fogDensity = scene.fogDensity;\r\n }\r\n\r\n //Physics\r\n if (scene.isPhysicsEnabled && scene.isPhysicsEnabled()) {\r\n const physicEngine = scene.getPhysicsEngine();\r\n\r\n if (physicEngine) {\r\n serializationObject.physicsEnabled = true;\r\n serializationObject.physicsGravity = physicEngine.gravity.asArray();\r\n serializationObject.physicsEngine = physicEngine.getPhysicsPluginName();\r\n }\r\n }\r\n\r\n // Metadata\r\n if (scene.metadata) {\r\n serializationObject.metadata = scene.metadata;\r\n }\r\n\r\n // Morph targets\r\n serializationObject.morphTargetManagers = [];\r\n for (const abstractMesh of scene.meshes) {\r\n const manager = (<Mesh>abstractMesh).morphTargetManager;\r\n\r\n if (manager) {\r\n serializationObject.morphTargetManagers.push(manager.serialize());\r\n }\r\n }\r\n\r\n // Lights\r\n serializationObject.lights = [];\r\n let index: number;\r\n let light: Light;\r\n for (index = 0; index < scene.lights.length; index++) {\r\n light = scene.lights[index];\r\n\r\n if (!light.doNotSerialize) {\r\n serializationObject.lights.push(light.serialize());\r\n }\r\n }\r\n\r\n // Cameras\r\n serializationObject.cameras = [];\r\n for (index = 0; index < scene.cameras.length; index++) {\r\n const camera = scene.cameras[index];\r\n\r\n if (!camera.doNotSerialize) {\r\n serializationObject.cameras.push(camera.serialize());\r\n }\r\n }\r\n\r\n if (scene.activeCamera) {\r\n serializationObject.activeCameraID = scene.activeCamera.id;\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(scene, serializationObject);\r\n\r\n // Animation Groups\r\n if (scene.animationGroups && scene.animationGroups.length > 0) {\r\n serializationObject.animationGroups = [];\r\n for (let animationGroupIndex = 0; animationGroupIndex < scene.animationGroups.length; animationGroupIndex++) {\r\n const animationGroup = scene.animationGroups[animationGroupIndex];\r\n\r\n serializationObject.animationGroups.push(animationGroup.serialize());\r\n }\r\n }\r\n\r\n // Reflection probes\r\n if (scene.reflectionProbes && scene.reflectionProbes.length > 0) {\r\n serializationObject.reflectionProbes = [];\r\n\r\n for (index = 0; index < scene.reflectionProbes.length; index++) {\r\n const reflectionProbe = scene.reflectionProbes[index];\r\n serializationObject.reflectionProbes.push(reflectionProbe.serialize());\r\n }\r\n }\r\n\r\n // Materials\r\n serializationObject.materials = [];\r\n serializationObject.multiMaterials = [];\r\n let material: Material;\r\n for (index = 0; index < scene.materials.length; index++) {\r\n material = scene.materials[index];\r\n if (!material.doNotSerialize) {\r\n serializationObject.materials.push(material.serialize());\r\n }\r\n }\r\n\r\n // MultiMaterials\r\n serializationObject.multiMaterials = [];\r\n for (index = 0; index < scene.multiMaterials.length; index++) {\r\n const multiMaterial = scene.multiMaterials[index];\r\n serializationObject.multiMaterials.push(multiMaterial.serialize());\r\n }\r\n\r\n // Environment texture\r\n if (scene.environmentTexture) {\r\n if ((scene.environmentTexture as CubeTexture)._files) {\r\n serializationObject.environmentTexture = scene.environmentTexture.serialize();\r\n } else {\r\n serializationObject.environmentTexture = scene.environmentTexture.name;\r\n serializationObject.environmentTextureRotationY = (scene.environmentTexture as CubeTexture).rotationY;\r\n }\r\n }\r\n\r\n // Environment Intensity\r\n serializationObject.environmentIntensity = scene.environmentIntensity;\r\n\r\n // IBL Intensity\r\n serializationObject.iblIntensity = scene.iblIntensity;\r\n\r\n // Skeletons\r\n serializationObject.skeletons = [];\r\n for (index = 0; index < scene.skeletons.length; index++) {\r\n const skeleton = scene.skeletons[index];\r\n if (!skeleton.doNotSerialize) {\r\n serializationObject.skeletons.push(skeleton.serialize());\r\n }\r\n }\r\n\r\n // Transform nodes\r\n serializationObject.transformNodes = [];\r\n for (index = 0; index < scene.transformNodes.length; index++) {\r\n if (!scene.transformNodes[index].doNotSerialize) {\r\n serializationObject.transformNodes.push(scene.transformNodes[index].serialize());\r\n }\r\n }\r\n\r\n // Geometries\r\n serializationObject.geometries = {};\r\n\r\n serializationObject.geometries.boxes = [];\r\n serializationObject.geometries.spheres = [];\r\n serializationObject.geometries.cylinders = [];\r\n serializationObject.geometries.toruses = [];\r\n serializationObject.geometries.grounds = [];\r\n serializationObject.geometries.planes = [];\r\n serializationObject.geometries.torusKnots = [];\r\n serializationObject.geometries.vertexData = [];\r\n\r\n serializedGeometries = [];\r\n const geometries = scene.getGeometries();\r\n for (index = 0; index < geometries.length; index++) {\r\n const geometry = geometries[index];\r\n\r\n if (geometry.isReady()) {\r\n SerializeGeometry(geometry, serializationObject.geometries);\r\n }\r\n }\r\n\r\n // Meshes\r\n serializationObject.meshes = [];\r\n for (index = 0; index < scene.meshes.length; index++) {\r\n const abstractMesh = scene.meshes[index];\r\n\r\n if (abstractMesh instanceof Mesh) {\r\n const mesh = abstractMesh;\r\n if (!mesh.doNotSerialize) {\r\n if (mesh.delayLoadState === Constants.DELAYLOADSTATE_LOADED || mesh.delayLoadState === Constants.DELAYLOADSTATE_NONE) {\r\n serializationObject.meshes.push(SerializeMesh(mesh, serializationObject));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Particles Systems\r\n serializationObject.particleSystems = [];\r\n for (index = 0; index < scene.particleSystems.length; index++) {\r\n serializationObject.particleSystems.push(scene.particleSystems[index].serialize(false));\r\n }\r\n\r\n // Post processes\r\n serializationObject.postProcesses = [];\r\n for (index = 0; index < scene.postProcesses.length; index++) {\r\n serializationObject.postProcesses.push(scene.postProcesses[index].serialize());\r\n }\r\n\r\n // Action Manager\r\n if (scene.actionManager) {\r\n serializationObject.actions = scene.actionManager.serialize(\"scene\");\r\n }\r\n\r\n // Components\r\n for (const component of scene._serializableComponents) {\r\n component.serialize(serializationObject);\r\n }\r\n\r\n // Sprites\r\n if (scene.spriteManagers) {\r\n serializationObject.spriteManagers = [];\r\n for (index = 0; index < scene.spriteManagers.length; index++) {\r\n serializationObject.spriteManagers.push(scene.spriteManagers[index].serialize(true));\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Serialize a scene into a JSON compatible object\r\n * @param scene defines the scene to serialize\r\n * @returns a JSON promise compatible object\r\n */\r\n public static SerializeAsync(scene: Scene): Promise<any> {\r\n const serializationObject = SceneSerializer._Serialize(scene, false);\r\n\r\n const promises: Array<Promise<any>> = [];\r\n\r\n this._CollectPromises(serializationObject, promises);\r\n\r\n return Promise.all(promises).then(() => serializationObject);\r\n }\r\n\r\n private static _CollectPromises(obj: any, promises: Array<Promise<any>>): void {\r\n if (Array.isArray(obj)) {\r\n for (let i = 0; i < obj.length; ++i) {\r\n const o = obj[i];\r\n if (o instanceof Promise) {\r\n promises.push(o.then((res: any) => (obj[i] = res)));\r\n } else if (o instanceof Object || Array.isArray(o)) {\r\n this._CollectPromises(o, promises);\r\n }\r\n }\r\n } else if (obj instanceof Object) {\r\n for (const name in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, name)) {\r\n const o = obj[name];\r\n if (o instanceof Promise) {\r\n promises.push(o.then((res: any) => (obj[name] = res)));\r\n } else if (o instanceof Object || Array.isArray(o)) {\r\n this._CollectPromises(o, promises);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serialize a mesh into a JSON compatible object\r\n * @param toSerialize defines the mesh to serialize\r\n * @param withParents defines if parents must be serialized as well\r\n * @param withChildren defines if children must be serialized as well\r\n * @returns a JSON compatible object\r\n */\r\n public static SerializeMesh(toSerialize: any /* Mesh || Mesh[] */, withParents: boolean = false, withChildren: boolean = false): any {\r\n const serializationObject: any = {};\r\n serializationObject.meshes = [];\r\n serializationObject.transformNodes = [];\r\n serializationObject.cameras = [];\r\n serializationObject.lights = [];\r\n\r\n SceneSerializer.ClearCache();\r\n\r\n toSerialize = toSerialize instanceof Array ? toSerialize : [toSerialize];\r\n\r\n if (withParents || withChildren) {\r\n //deliberate for loop! not for each, appended should be processed as well.\r\n for (let i = 0; i < toSerialize.length; ++i) {\r\n if (withChildren) {\r\n toSerialize[i].getDescendants().forEach((node: Node) => {\r\n if (toSerialize.indexOf(node) < 0 && !node.doNotSerialize) {\r\n toSerialize.push(node);\r\n }\r\n });\r\n }\r\n //make sure the array doesn't contain the object already\r\n if (withParents && toSerialize[i].parent && toSerialize.indexOf(toSerialize[i].parent) < 0 && !toSerialize[i].parent.doNotSerialize) {\r\n toSerialize.push(toSerialize[i].parent);\r\n }\r\n }\r\n }\r\n\r\n toSerialize.forEach((mesh: Node) => {\r\n FinalizeSingleNode(mesh, serializationObject);\r\n });\r\n\r\n return serializationObject;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"sceneSerializer.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/sceneSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Geometry } from \"../Meshes/geometry\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport { SerializationHelper } from \"./decorators.serialization\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { CubeTexture } from \"../Materials/Textures/cubeTexture\";\r\nimport type { Node } from \"../node\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nlet serializedGeometries: Geometry[] = [];\r\nconst SerializeGeometry = (geometry: Geometry, serializationGeometries: any): any => {\r\n if (geometry.doNotSerialize) {\r\n return;\r\n }\r\n\r\n serializationGeometries.vertexData.push(geometry.serializeVerticeData());\r\n\r\n (<any>serializedGeometries)[geometry.id] = true;\r\n};\r\n\r\nconst SerializeMesh = (mesh: Mesh, serializationScene: any): any => {\r\n const serializationObject: any = {};\r\n\r\n // Geometry\r\n const geometry = mesh._geometry;\r\n if (geometry) {\r\n if (!mesh.getScene().getGeometryById(geometry.id)) {\r\n // Geometry was in the memory but not added to the scene, nevertheless it's better to serialize to be able to reload the mesh with its geometry\r\n SerializeGeometry(geometry, serializationScene.geometries);\r\n }\r\n }\r\n\r\n // Custom\r\n if (mesh.serialize) {\r\n mesh.serialize(serializationObject);\r\n }\r\n\r\n return serializationObject;\r\n};\r\n\r\nconst FinalizeSingleNode = (node: Node, serializationObject: any) => {\r\n if ((node as Mesh)._isMesh) {\r\n const mesh = node as Mesh;\r\n //only works if the mesh is already loaded\r\n if (mesh.delayLoadState === Constants.DELAYLOADSTATE_LOADED || mesh.delayLoadState === Constants.DELAYLOADSTATE_NONE) {\r\n const serializeMaterial = (material: Material) => {\r\n serializationObject.materials = serializationObject.materials || [];\r\n if (mesh.material && !serializationObject.materials.some((mat: Material) => mat.id === (<Material>mesh.material).id)) {\r\n serializationObject.materials.push(material.serialize());\r\n }\r\n };\r\n\r\n //serialize material\r\n if (mesh.material && !mesh.material.doNotSerialize) {\r\n if (mesh.material instanceof MultiMaterial) {\r\n serializationObject.multiMaterials = serializationObject.multiMaterials || [];\r\n if (!serializationObject.multiMaterials.some((mat: Material) => mat.id === (<Material>mesh.material).id)) {\r\n serializationObject.multiMaterials.push(mesh.material.serialize());\r\n for (const submaterial of mesh.material.subMaterials) {\r\n if (submaterial) {\r\n serializeMaterial(submaterial);\r\n }\r\n }\r\n }\r\n } else {\r\n serializeMaterial(mesh.material);\r\n }\r\n } else if (!mesh.material) {\r\n serializeMaterial(mesh.getScene().defaultMaterial);\r\n }\r\n\r\n //serialize geometry\r\n const geometry = mesh._geometry;\r\n if (geometry) {\r\n if (!serializationObject.geometries) {\r\n serializationObject.geometries = {};\r\n\r\n serializationObject.geometries.boxes = [];\r\n serializationObject.geometries.spheres = [];\r\n serializationObject.geometries.cylinders = [];\r\n serializationObject.geometries.toruses = [];\r\n serializationObject.geometries.grounds = [];\r\n serializationObject.geometries.planes = [];\r\n serializationObject.geometries.torusKnots = [];\r\n serializationObject.geometries.vertexData = [];\r\n }\r\n\r\n SerializeGeometry(geometry, serializationObject.geometries);\r\n }\r\n // Skeletons\r\n if (mesh.skeleton && !mesh.skeleton.doNotSerialize) {\r\n serializationObject.skeletons = serializationObject.skeletons || [];\r\n serializationObject.skeletons.push(mesh.skeleton.serialize());\r\n }\r\n\r\n //serialize the actual mesh\r\n serializationObject.meshes = serializationObject.meshes || [];\r\n serializationObject.meshes.push(SerializeMesh(mesh, serializationObject));\r\n }\r\n } else if (node.getClassName() === \"TransformNode\") {\r\n const transformNode = node as TransformNode;\r\n serializationObject.transformNodes.push(transformNode.serialize());\r\n } else if (node.getClassName().indexOf(\"Camera\") !== -1) {\r\n const camera = node as Camera;\r\n serializationObject.cameras.push(camera.serialize());\r\n } else if (node.getClassName().indexOf(\"Light\") !== -1) {\r\n const light = node as Light;\r\n serializationObject.lights.push(light.serialize());\r\n }\r\n};\r\n\r\n/**\r\n * Class used to serialize a scene into a string\r\n */\r\nexport class SceneSerializer {\r\n /**\r\n * Clear cache used by a previous serialization\r\n */\r\n public static ClearCache(): void {\r\n serializedGeometries = [];\r\n }\r\n\r\n /**\r\n * Serialize a scene into a JSON compatible object\r\n * Note that if the current engine does not support synchronous texture reading (like WebGPU), you should use SerializeAsync instead\r\n * as else you may not retrieve the proper base64 encoded texture data (when using the Texture.ForceSerializeBuffers flag)\r\n * @param scene defines the scene to serialize\r\n * @returns a JSON compatible object\r\n */\r\n public static Serialize(scene: Scene): any {\r\n return SceneSerializer._Serialize(scene);\r\n }\r\n\r\n private static _Serialize(scene: Scene, checkSyncReadSupported = true): any {\r\n const serializationObject: any = {};\r\n\r\n if (checkSyncReadSupported && !scene.getEngine()._features.supportSyncTextureRead && Texture.ForceSerializeBuffers) {\r\n Logger.Warn(\"The serialization object may not contain the proper base64 encoded texture data! You should use the SerializeAsync method instead.\");\r\n }\r\n\r\n SceneSerializer.ClearCache();\r\n\r\n // Scene\r\n serializationObject.useDelayedTextureLoading = scene.useDelayedTextureLoading;\r\n serializationObject.autoClear = scene.autoClear;\r\n serializationObject.clearColor = scene.clearColor.asArray();\r\n serializationObject.ambientColor = scene.ambientColor.asArray();\r\n serializationObject.gravity = scene.gravity.asArray();\r\n serializationObject.collisionsEnabled = scene.collisionsEnabled;\r\n serializationObject.useRightHandedSystem = scene.useRightHandedSystem;\r\n\r\n // Fog\r\n if (scene.fogMode !== undefined && scene.fogMode !== null) {\r\n serializationObject.fogMode = scene.fogMode;\r\n }\r\n if (scene.fogColor !== undefined && scene.fogColor !== null) {\r\n serializationObject.fogColor = scene.fogColor.asArray();\r\n }\r\n if (scene.fogStart !== undefined && scene.fogStart !== null) {\r\n serializationObject.fogStart = scene.fogStart;\r\n }\r\n if (scene.fogEnd !== undefined && scene.fogEnd !== null) {\r\n serializationObject.fogEnd = scene.fogEnd;\r\n }\r\n if (scene.fogDensity !== undefined && scene.fogDensity !== null) {\r\n serializationObject.fogDensity = scene.fogDensity;\r\n }\r\n\r\n //Physics\r\n if (scene.isPhysicsEnabled && scene.isPhysicsEnabled()) {\r\n const physicEngine = scene.getPhysicsEngine();\r\n\r\n if (physicEngine) {\r\n serializationObject.physicsEnabled = true;\r\n serializationObject.physicsGravity = physicEngine.gravity.asArray();\r\n serializationObject.physicsEngine = physicEngine.getPhysicsPluginName();\r\n }\r\n }\r\n\r\n // Metadata\r\n if (scene.metadata) {\r\n serializationObject.metadata = scene.metadata;\r\n }\r\n\r\n // Morph targets\r\n serializationObject.morphTargetManagers = [];\r\n for (const abstractMesh of scene.meshes) {\r\n const manager = (<Mesh>abstractMesh).morphTargetManager;\r\n\r\n if (manager) {\r\n serializationObject.morphTargetManagers.push(manager.serialize());\r\n }\r\n }\r\n\r\n // Lights\r\n serializationObject.lights = [];\r\n let index: number;\r\n let light: Light;\r\n for (index = 0; index < scene.lights.length; index++) {\r\n light = scene.lights[index];\r\n\r\n if (!light.doNotSerialize) {\r\n serializationObject.lights.push(light.serialize());\r\n }\r\n }\r\n\r\n // Cameras\r\n serializationObject.cameras = [];\r\n for (index = 0; index < scene.cameras.length; index++) {\r\n const camera = scene.cameras[index];\r\n\r\n if (!camera.doNotSerialize) {\r\n serializationObject.cameras.push(camera.serialize());\r\n }\r\n }\r\n\r\n if (scene.activeCamera) {\r\n serializationObject.activeCameraID = scene.activeCamera.id;\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(scene, serializationObject);\r\n\r\n // Animation Groups\r\n if (scene.animationGroups && scene.animationGroups.length > 0) {\r\n serializationObject.animationGroups = [];\r\n for (let animationGroupIndex = 0; animationGroupIndex < scene.animationGroups.length; animationGroupIndex++) {\r\n const animationGroup = scene.animationGroups[animationGroupIndex];\r\n\r\n serializationObject.animationGroups.push(animationGroup.serialize());\r\n }\r\n }\r\n\r\n // Reflection probes\r\n if (scene.reflectionProbes && scene.reflectionProbes.length > 0) {\r\n serializationObject.reflectionProbes = [];\r\n\r\n for (index = 0; index < scene.reflectionProbes.length; index++) {\r\n const reflectionProbe = scene.reflectionProbes[index];\r\n serializationObject.reflectionProbes.push(reflectionProbe.serialize());\r\n }\r\n }\r\n\r\n // Materials\r\n serializationObject.materials = [];\r\n serializationObject.multiMaterials = [];\r\n let material: Material;\r\n for (index = 0; index < scene.materials.length; index++) {\r\n material = scene.materials[index];\r\n if (!material.doNotSerialize) {\r\n serializationObject.materials.push(material.serialize());\r\n }\r\n }\r\n\r\n // MultiMaterials\r\n serializationObject.multiMaterials = [];\r\n for (index = 0; index < scene.multiMaterials.length; index++) {\r\n const multiMaterial = scene.multiMaterials[index];\r\n serializationObject.multiMaterials.push(multiMaterial.serialize());\r\n }\r\n\r\n // Environment texture\r\n if (scene.environmentTexture) {\r\n if ((scene.environmentTexture as CubeTexture)._files) {\r\n serializationObject.environmentTexture = scene.environmentTexture.serialize();\r\n } else {\r\n serializationObject.environmentTexture = scene.environmentTexture.name;\r\n serializationObject.environmentTextureRotationY = (scene.environmentTexture as CubeTexture).rotationY;\r\n }\r\n }\r\n\r\n // Environment Intensity\r\n serializationObject.environmentIntensity = scene.environmentIntensity;\r\n\r\n // IBL Intensity\r\n serializationObject.iblIntensity = scene.iblIntensity;\r\n\r\n // Skeletons\r\n serializationObject.skeletons = [];\r\n for (index = 0; index < scene.skeletons.length; index++) {\r\n const skeleton = scene.skeletons[index];\r\n if (!skeleton.doNotSerialize) {\r\n serializationObject.skeletons.push(skeleton.serialize());\r\n }\r\n }\r\n\r\n // Transform nodes\r\n serializationObject.transformNodes = [];\r\n for (index = 0; index < scene.transformNodes.length; index++) {\r\n if (!scene.transformNodes[index].doNotSerialize) {\r\n serializationObject.transformNodes.push(scene.transformNodes[index].serialize());\r\n }\r\n }\r\n\r\n // Geometries\r\n serializationObject.geometries = {};\r\n\r\n serializationObject.geometries.boxes = [];\r\n serializationObject.geometries.spheres = [];\r\n serializationObject.geometries.cylinders = [];\r\n serializationObject.geometries.toruses = [];\r\n serializationObject.geometries.grounds = [];\r\n serializationObject.geometries.planes = [];\r\n serializationObject.geometries.torusKnots = [];\r\n serializationObject.geometries.vertexData = [];\r\n\r\n serializedGeometries = [];\r\n const geometries = scene.getGeometries();\r\n for (index = 0; index < geometries.length; index++) {\r\n const geometry = geometries[index];\r\n\r\n if (geometry.isReady()) {\r\n SerializeGeometry(geometry, serializationObject.geometries);\r\n }\r\n }\r\n\r\n // Meshes\r\n serializationObject.meshes = [];\r\n for (index = 0; index < scene.meshes.length; index++) {\r\n const abstractMesh = scene.meshes[index];\r\n\r\n if (abstractMesh instanceof Mesh) {\r\n const mesh = abstractMesh;\r\n if (!mesh.doNotSerialize) {\r\n if (mesh.delayLoadState === Constants.DELAYLOADSTATE_LOADED || mesh.delayLoadState === Constants.DELAYLOADSTATE_NONE) {\r\n serializationObject.meshes.push(SerializeMesh(mesh, serializationObject));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Particles Systems\r\n serializationObject.particleSystems = [];\r\n for (index = 0; index < scene.particleSystems.length; index++) {\r\n serializationObject.particleSystems.push(scene.particleSystems[index].serialize(false));\r\n }\r\n\r\n // Post processes\r\n serializationObject.postProcesses = [];\r\n for (index = 0; index < scene.postProcesses.length; index++) {\r\n serializationObject.postProcesses.push(scene.postProcesses[index].serialize());\r\n }\r\n\r\n // Action Manager\r\n if (scene.actionManager) {\r\n serializationObject.actions = scene.actionManager.serialize(\"scene\");\r\n }\r\n\r\n // Components\r\n for (const component of scene._serializableComponents) {\r\n component.serialize(serializationObject);\r\n }\r\n\r\n // Sprites\r\n if (scene.spriteManagers) {\r\n serializationObject.spriteManagers = [];\r\n for (index = 0; index < scene.spriteManagers.length; index++) {\r\n serializationObject.spriteManagers.push(scene.spriteManagers[index].serialize(true));\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Serialize a scene into a JSON compatible object\r\n * @param scene defines the scene to serialize\r\n * @returns a JSON promise compatible object\r\n */\r\n public static SerializeAsync(scene: Scene): Promise<any> {\r\n const serializationObject = SceneSerializer._Serialize(scene, false);\r\n\r\n const promises: Array<Promise<any>> = [];\r\n\r\n this._CollectPromises(serializationObject, promises);\r\n\r\n return Promise.all(promises).then(() => serializationObject);\r\n }\r\n\r\n private static _CollectPromises(obj: any, promises: Array<Promise<any>>): void {\r\n if (Array.isArray(obj)) {\r\n for (let i = 0; i < obj.length; ++i) {\r\n const o = obj[i];\r\n if (o instanceof Promise) {\r\n promises.push(o.then((res: any) => (obj[i] = res)));\r\n } else if (o instanceof Object || Array.isArray(o)) {\r\n this._CollectPromises(o, promises);\r\n }\r\n }\r\n } else if (obj instanceof Object) {\r\n for (const name in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, name)) {\r\n const o = obj[name];\r\n if (o instanceof Promise) {\r\n promises.push(o.then((res: any) => (obj[name] = res)));\r\n } else if (o instanceof Object || Array.isArray(o)) {\r\n this._CollectPromises(o, promises);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serialize a mesh into a JSON compatible object\r\n * @param toSerialize defines the mesh to serialize\r\n * @param withParents defines if parents must be serialized as well\r\n * @param withChildren defines if children must be serialized as well\r\n * @returns a JSON compatible object\r\n */\r\n public static SerializeMesh(toSerialize: any /* Mesh || Mesh[] */, withParents: boolean = false, withChildren: boolean = false): any {\r\n const serializationObject: any = {};\r\n serializationObject.meshes = [];\r\n serializationObject.transformNodes = [];\r\n serializationObject.cameras = [];\r\n serializationObject.lights = [];\r\n\r\n SceneSerializer.ClearCache();\r\n\r\n toSerialize = toSerialize instanceof Array ? toSerialize : [toSerialize];\r\n\r\n if (withParents || withChildren) {\r\n //deliberate for loop! not for each, appended should be processed as well.\r\n for (let i = 0; i < toSerialize.length; ++i) {\r\n if (withChildren) {\r\n const descendants = toSerialize[i].getDescendants();\r\n for (const node of descendants) {\r\n if (toSerialize.indexOf(node) < 0 && !node.doNotSerialize) {\r\n toSerialize.push(node);\r\n }\r\n }\r\n }\r\n //make sure the array doesn't contain the object already\r\n if (withParents && toSerialize[i].parent && toSerialize.indexOf(toSerialize[i].parent) < 0 && !toSerialize[i].parent.doNotSerialize) {\r\n toSerialize.push(toSerialize[i].parent);\r\n }\r\n }\r\n }\r\n\r\n for (const mesh of toSerialize) {\r\n FinalizeSingleNode(mesh, serializationObject);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n}\r\n"]}
@@ -47,7 +47,9 @@ export class SnapshotRenderingHelper {
47
47
  return;
48
48
  }
49
49
  // Animate skeletons
50
- scene.skeletons.forEach((skeleton) => skeleton.prepare(true));
50
+ for (const skeleton of scene.skeletons) {
51
+ skeleton.prepare(true);
52
+ }
51
53
  for (const mesh of scene.meshes) {
52
54
  if (mesh.infiniteDistance) {
53
55
  mesh.transferToEffect(mesh.computeWorldMatrix(true));