@onerjs/core 8.42.6 → 8.42.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/Animations/animatable.core.js +1 -1
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animatorAvatar.d.ts +5 -2
  4. package/Animations/animatorAvatar.js +42 -29
  5. package/Animations/animatorAvatar.js.map +1 -1
  6. package/Animations/runtimeAnimation.js +1 -1
  7. package/Animations/runtimeAnimation.js.map +1 -1
  8. package/Audio/audioSceneComponent.js +1 -2
  9. package/Audio/audioSceneComponent.js.map +1 -1
  10. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +3 -3
  11. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
  12. package/AudioV2/webAudio/webAudioEngine.js +1 -1
  13. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  14. package/Behaviors/Meshes/followBehavior.js +1 -1
  15. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  16. package/Behaviors/Meshes/pointerDragBehavior.js +1 -1
  17. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  18. package/Bones/boneLookController.js +1 -1
  19. package/Bones/boneLookController.js.map +1 -1
  20. package/Buffers/buffer.js +1 -1
  21. package/Buffers/buffer.js.map +1 -1
  22. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  23. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  24. package/Cameras/Inputs/geospatialCameraMouseWheelInput.d.ts +1 -2
  25. package/Cameras/Inputs/geospatialCameraMouseWheelInput.js +1 -2
  26. package/Cameras/Inputs/geospatialCameraMouseWheelInput.js.map +1 -1
  27. package/Cameras/Inputs/geospatialCameraPointersInput.d.ts +0 -4
  28. package/Cameras/Inputs/geospatialCameraPointersInput.js +1 -5
  29. package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
  30. package/Cameras/camera.js +2 -2
  31. package/Cameras/camera.js.map +1 -1
  32. package/Cameras/cameraMovement.d.ts +1 -4
  33. package/Cameras/cameraMovement.js +1 -4
  34. package/Cameras/cameraMovement.js.map +1 -1
  35. package/Cameras/geospatialCamera.d.ts +22 -4
  36. package/Cameras/geospatialCamera.js +27 -9
  37. package/Cameras/geospatialCamera.js.map +1 -1
  38. package/Cameras/geospatialCameraMovement.d.ts +3 -3
  39. package/Cameras/geospatialCameraMovement.js +18 -18
  40. package/Cameras/geospatialCameraMovement.js.map +1 -1
  41. package/Engines/AbstractEngine/abstractEngine.renderPass.js +1 -0
  42. package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -1
  43. package/Engines/Extensions/engine.query.js +1 -1
  44. package/Engines/Extensions/engine.query.js.map +1 -1
  45. package/Engines/Processors/shaderProcessor.js +2 -3
  46. package/Engines/Processors/shaderProcessor.js.map +1 -1
  47. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  48. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  49. package/Engines/WebGPU/Extensions/engine.debugging.d.ts +87 -0
  50. package/Engines/WebGPU/Extensions/engine.debugging.js +135 -21
  51. package/Engines/WebGPU/Extensions/engine.debugging.js.map +1 -1
  52. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  53. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  54. package/Engines/WebGPU/webgpuShaderProcessor.js +1 -1
  55. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  56. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +1 -1
  57. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  58. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
  59. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  60. package/Engines/WebGPU/webgpuTextureManager.js +10 -5
  61. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  62. package/Engines/abstractEngine.js +2 -2
  63. package/Engines/abstractEngine.js.map +1 -1
  64. package/Engines/engine.common.js +2 -2
  65. package/Engines/engine.common.js.map +1 -1
  66. package/Engines/engine.js +0 -1
  67. package/Engines/engine.js.map +1 -1
  68. package/Engines/engineFeatures.d.ts +0 -2
  69. package/Engines/engineFeatures.js.map +1 -1
  70. package/Engines/nullEngine.js +0 -1
  71. package/Engines/nullEngine.js.map +1 -1
  72. package/Engines/thinEngine.functions.js +1 -1
  73. package/Engines/thinEngine.functions.js.map +1 -1
  74. package/Engines/thinEngine.js +4 -6
  75. package/Engines/thinEngine.js.map +1 -1
  76. package/Engines/thinNativeEngine.js +2 -6
  77. package/Engines/thinNativeEngine.js.map +1 -1
  78. package/Engines/thinWebGPUEngine.d.ts +11 -4
  79. package/Engines/thinWebGPUEngine.js +58 -34
  80. package/Engines/thinWebGPUEngine.js.map +1 -1
  81. package/Engines/webgpuEngine.d.ts +3 -1
  82. package/Engines/webgpuEngine.js +30 -169
  83. package/Engines/webgpuEngine.js.map +1 -1
  84. package/FlowGraph/flowGraph.d.ts +1 -0
  85. package/FlowGraph/flowGraph.js.map +1 -1
  86. package/FlowGraph/flowGraphBlock.d.ts +1 -0
  87. package/FlowGraph/flowGraphBlock.js.map +1 -1
  88. package/FlowGraph/flowGraphContext.d.ts +1 -0
  89. package/FlowGraph/flowGraphContext.js.map +1 -1
  90. package/FlowGraph/flowGraphCoordinator.d.ts +1 -0
  91. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  92. package/FrameGraph/Node/nodeRenderGraph.d.ts +12 -1
  93. package/FrameGraph/Node/nodeRenderGraph.js +36 -2
  94. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  95. package/FrameGraph/Passes/renderPass.js +0 -3
  96. package/FrameGraph/Passes/renderPass.js.map +1 -1
  97. package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -1
  98. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  99. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
  100. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
  101. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
  102. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
  103. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
  104. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +14 -0
  105. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
  106. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +2 -2
  107. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +20 -14
  108. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  109. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +2 -3
  110. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +5 -29
  111. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  112. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +3 -2
  113. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +38 -14
  114. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  115. package/FrameGraph/frameGraph.js +3 -0
  116. package/FrameGraph/frameGraph.js.map +1 -1
  117. package/FrameGraph/frameGraphContext.js +1 -1
  118. package/FrameGraph/frameGraphContext.js.map +1 -1
  119. package/FrameGraph/frameGraphTask.d.ts +0 -2
  120. package/FrameGraph/frameGraphTask.js +15 -17
  121. package/FrameGraph/frameGraphTask.js.map +1 -1
  122. package/FrameGraph/frameGraphTextureManager.js +1 -1
  123. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  124. package/Gizmos/axisScaleGizmo.js +2 -2
  125. package/Gizmos/axisScaleGizmo.js.map +1 -1
  126. package/Gizmos/cameraGizmo.d.ts +1 -1
  127. package/Gizmos/cameraGizmo.js +1 -1
  128. package/Gizmos/cameraGizmo.js.map +1 -1
  129. package/Gizmos/gizmo.d.ts +4 -4
  130. package/Gizmos/gizmo.js +5 -5
  131. package/Gizmos/gizmo.js.map +1 -1
  132. package/Gizmos/gizmoManager.d.ts +2 -2
  133. package/Gizmos/gizmoManager.js +1 -1
  134. package/Gizmos/gizmoManager.js.map +1 -1
  135. package/Gizmos/planeRotationGizmo.d.ts +2 -2
  136. package/Gizmos/planeRotationGizmo.js +2 -3
  137. package/Gizmos/planeRotationGizmo.js.map +1 -1
  138. package/Gizmos/positionGizmo.d.ts +1 -1
  139. package/Gizmos/positionGizmo.js +2 -2
  140. package/Gizmos/positionGizmo.js.map +1 -1
  141. package/Gizmos/rotationGizmo.d.ts +1 -1
  142. package/Gizmos/rotationGizmo.js +3 -3
  143. package/Gizmos/rotationGizmo.js.map +1 -1
  144. package/Gizmos/scaleGizmo.d.ts +1 -1
  145. package/Gizmos/scaleGizmo.js +1 -1
  146. package/Gizmos/scaleGizmo.js.map +1 -1
  147. package/Layers/glowLayer.js +1 -1
  148. package/Layers/glowLayer.js.map +1 -1
  149. package/Layers/highlightLayer.js +1 -1
  150. package/Layers/highlightLayer.js.map +1 -1
  151. package/Lights/Shadows/cascadedShadowGenerator.js +0 -1
  152. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  153. package/Lights/Shadows/shadowGenerator.d.ts +28 -1
  154. package/Lights/Shadows/shadowGenerator.js +77 -11
  155. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  156. package/Lights/lightingVolume.d.ts +1 -0
  157. package/Lights/lightingVolume.js +10 -2
  158. package/Lights/lightingVolume.js.map +1 -1
  159. package/Loading/Plugins/babylonFileLoader.js +44 -14
  160. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  161. package/Loading/sceneLoader.js +1 -1
  162. package/Loading/sceneLoader.js.map +1 -1
  163. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.d.ts +12 -3
  164. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js +33 -8
  165. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js.map +1 -1
  166. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -1
  167. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  168. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -1
  169. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  170. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -2
  171. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  172. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  173. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  174. package/Materials/Node/Blocks/curveBlock.js +2 -3
  175. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  176. package/Materials/Node/nodeMaterial.js +1 -2
  177. package/Materials/Node/nodeMaterial.js.map +1 -1
  178. package/Materials/PBR/openpbrMaterial.js +3 -5
  179. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  180. package/Materials/PBR/pbrBaseMaterial.js +2 -3
  181. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  182. package/Materials/Textures/Procedurals/proceduralTexture.js +0 -1
  183. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  184. package/Materials/Textures/cubeTexture.js +1 -1
  185. package/Materials/Textures/cubeTexture.js.map +1 -1
  186. package/Materials/Textures/htmlElementTexture.js +2 -2
  187. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  188. package/Materials/Textures/multiRenderTarget.js +1 -1
  189. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  190. package/Materials/Textures/renderTargetTexture.js +13 -2
  191. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  192. package/Materials/effect.js +2 -1
  193. package/Materials/effect.js.map +1 -1
  194. package/Materials/materialHelper.functions.js +1 -1
  195. package/Materials/materialHelper.functions.js.map +1 -1
  196. package/Materials/multiMaterial.js +1 -1
  197. package/Materials/multiMaterial.js.map +1 -1
  198. package/Materials/standardMaterial.js +1 -2
  199. package/Materials/standardMaterial.js.map +1 -1
  200. package/Materials/uniformBuffer.d.ts +0 -4
  201. package/Materials/uniformBuffer.js +0 -8
  202. package/Materials/uniformBuffer.js.map +1 -1
  203. package/Maths/index.d.ts +2 -0
  204. package/Maths/index.js +2 -0
  205. package/Maths/index.js.map +1 -1
  206. package/Maths/math.geospatial.d.ts +27 -0
  207. package/Maths/math.geospatial.functions.d.ts +33 -0
  208. package/Maths/math.geospatial.functions.js +60 -0
  209. package/Maths/math.geospatial.functions.js.map +1 -0
  210. package/Maths/math.geospatial.js +2 -0
  211. package/Maths/math.geospatial.js.map +1 -0
  212. package/Maths/math.path.js +1 -1
  213. package/Maths/math.path.js.map +1 -1
  214. package/Maths/math.scalar.functions.js +3 -3
  215. package/Maths/math.scalar.functions.js.map +1 -1
  216. package/Maths/math.vector.js +1 -1
  217. package/Maths/math.vector.js.map +1 -1
  218. package/Meshes/Builders/boxBuilder.js +1 -2
  219. package/Meshes/Builders/boxBuilder.js.map +1 -1
  220. package/Meshes/Builders/cylinderBuilder.js +2 -2
  221. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  222. package/Meshes/Builders/decalBuilder.js +1 -2
  223. package/Meshes/Builders/decalBuilder.js.map +1 -1
  224. package/Meshes/Builders/latheBuilder.js +2 -2
  225. package/Meshes/Builders/latheBuilder.js.map +1 -1
  226. package/Meshes/Builders/linesBuilder.js +11 -15
  227. package/Meshes/Builders/linesBuilder.js.map +1 -1
  228. package/Meshes/Builders/polygonBuilder.js +6 -6
  229. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  230. package/Meshes/Builders/polyhedronBuilder.js +2 -2
  231. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  232. package/Meshes/Builders/ribbonBuilder.js +6 -6
  233. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  234. package/Meshes/Builders/shapeBuilder.js +2 -3
  235. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  236. package/Meshes/Builders/tiledBoxBuilder.js +1 -1
  237. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  238. package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
  239. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  240. package/Meshes/GreasedLine/greasedLineMesh.js +1 -2
  241. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  242. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +1 -1
  243. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  244. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -1
  245. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  246. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +1 -1
  247. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  248. package/Meshes/Node/Blocks/mappingBlock.js +1 -1
  249. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  250. package/Meshes/abstractMesh.d.ts +4 -0
  251. package/Meshes/abstractMesh.js +14 -10
  252. package/Meshes/abstractMesh.js.map +1 -1
  253. package/Meshes/csg.js +1 -1
  254. package/Meshes/csg.js.map +1 -1
  255. package/Meshes/csg2.js +1 -1
  256. package/Meshes/csg2.js.map +1 -1
  257. package/Meshes/geodesicMesh.js +11 -13
  258. package/Meshes/geodesicMesh.js.map +1 -1
  259. package/Meshes/geometry.js +2 -2
  260. package/Meshes/geometry.js.map +1 -1
  261. package/Meshes/groundMesh.js +7 -7
  262. package/Meshes/groundMesh.js.map +1 -1
  263. package/Meshes/mesh.d.ts +2 -0
  264. package/Meshes/mesh.js +22 -8
  265. package/Meshes/mesh.js.map +1 -1
  266. package/Meshes/mesh.vertexData.js +22 -22
  267. package/Meshes/mesh.vertexData.js.map +1 -1
  268. package/Meshes/meshSimplification.js +1 -1
  269. package/Meshes/meshSimplification.js.map +1 -1
  270. package/Meshes/polygonMesh.js +1 -1
  271. package/Meshes/polygonMesh.js.map +1 -1
  272. package/Meshes/trailMesh.js +1 -1
  273. package/Meshes/trailMesh.js.map +1 -1
  274. package/Misc/HighDynamicRange/hdr.js +4 -6
  275. package/Misc/HighDynamicRange/hdr.js.map +1 -1
  276. package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
  277. package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
  278. package/Misc/basisWorker.js +1 -1
  279. package/Misc/basisWorker.js.map +1 -1
  280. package/Misc/environmentTextureTools.js +1 -1
  281. package/Misc/environmentTextureTools.js.map +1 -1
  282. package/Misc/meshExploder.js +1 -2
  283. package/Misc/meshExploder.js.map +1 -1
  284. package/Misc/tga.js +2 -2
  285. package/Misc/tga.js.map +1 -1
  286. package/Misc/timer.js +4 -2
  287. package/Misc/timer.js.map +1 -1
  288. package/Misc/tools.d.ts +7 -0
  289. package/Misc/tools.js +20 -6
  290. package/Misc/tools.js.map +1 -1
  291. package/Morph/morphTargetManager.js +1 -1
  292. package/Morph/morphTargetManager.js.map +1 -1
  293. package/Navigation/INavigationEngine.d.ts +2 -2
  294. package/Navigation/INavigationEngine.js.map +1 -1
  295. package/Navigation/Plugins/recastJSPlugin.d.ts +2 -2
  296. package/Navigation/Plugins/recastJSPlugin.js +14 -5
  297. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  298. package/Particles/Node/Blocks/Update/updateNoiseBlock.js +1 -1
  299. package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
  300. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +11 -1
  301. package/Particles/Node/Blocks/particleSourceTextureBlock.js +25 -11
  302. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  303. package/Particles/Node/nodeParticleSystemSet.helper.js +3 -3
  304. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  305. package/Particles/Node/nodeParticleSystemSet.js +1 -1
  306. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  307. package/Particles/computeShaderParticleSystem.js +2 -0
  308. package/Particles/computeShaderParticleSystem.js.map +1 -1
  309. package/Particles/gpuParticleSystem.d.ts +14 -0
  310. package/Particles/gpuParticleSystem.js +94 -12
  311. package/Particles/gpuParticleSystem.js.map +1 -1
  312. package/Particles/particleSystem.js +4 -1
  313. package/Particles/particleSystem.js.map +1 -1
  314. package/Particles/pointsCloudSystem.js +46 -47
  315. package/Particles/pointsCloudSystem.js.map +1 -1
  316. package/Particles/solidParticleSystem.js +5 -6
  317. package/Particles/solidParticleSystem.js.map +1 -1
  318. package/Particles/thinParticleSystem.js +3 -4
  319. package/Particles/thinParticleSystem.js.map +1 -1
  320. package/Particles/webgl2ParticleSystem.js +2 -1
  321. package/Particles/webgl2ParticleSystem.js.map +1 -1
  322. package/Physics/castingResult.d.ts +4 -1
  323. package/Physics/castingResult.js +1 -1
  324. package/Physics/castingResult.js.map +1 -1
  325. package/Physics/joinedPhysicsEngineComponent.js +1 -1
  326. package/Physics/joinedPhysicsEngineComponent.js.map +1 -1
  327. package/Physics/physicsHelper.d.ts +8 -8
  328. package/Physics/physicsHelper.js +7 -7
  329. package/Physics/physicsHelper.js.map +1 -1
  330. package/Physics/shapeCastResult.d.ts +4 -0
  331. package/Physics/shapeCastResult.js +7 -0
  332. package/Physics/shapeCastResult.js.map +1 -1
  333. package/Physics/v1/Plugins/ammoJSPlugin.js +0 -8
  334. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  335. package/Physics/v2/IPhysicsEnginePlugin.d.ts +51 -4
  336. package/Physics/v2/IPhysicsEnginePlugin.js +12 -12
  337. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  338. package/Physics/v2/characterController.js +4 -8
  339. package/Physics/v2/characterController.js.map +1 -1
  340. package/Physics/v2/physicsBody.js.map +1 -1
  341. package/Physics/v2/physicsConstraint.d.ts +1 -1
  342. package/Physics/v2/physicsConstraint.js +1 -1
  343. package/Physics/v2/physicsConstraint.js.map +1 -1
  344. package/Physics/v2/physicsEngine.d.ts +0 -5
  345. package/Physics/v2/physicsEngine.js +0 -5
  346. package/Physics/v2/physicsEngine.js.map +1 -1
  347. package/Physics/v2/physicsEngineComponent.d.ts +1 -1
  348. package/Physics/v2/physicsEngineComponent.js.map +1 -1
  349. package/Physics/v2/physicsMaterial.d.ts +6 -0
  350. package/Physics/v2/physicsMaterial.js +2 -2
  351. package/Physics/v2/physicsMaterial.js.map +1 -1
  352. package/Physics/v2/ragdoll.js +1 -2
  353. package/Physics/v2/ragdoll.js.map +1 -1
  354. package/PostProcesses/postProcess.js +3 -3
  355. package/PostProcesses/postProcess.js.map +1 -1
  356. package/PostProcesses/thinDepthOfFieldEffect.js +2 -2
  357. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  358. package/Probes/reflectionProbe.js +0 -1
  359. package/Probes/reflectionProbe.js.map +1 -1
  360. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +0 -5
  361. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  362. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +4 -1
  363. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  364. package/Rendering/depthRenderer.js +0 -11
  365. package/Rendering/depthRenderer.js.map +1 -1
  366. package/Rendering/depthRendererSceneComponent.js +1 -1
  367. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  368. package/Rendering/edgesRenderer.js +1 -0
  369. package/Rendering/edgesRenderer.js.map +1 -1
  370. package/Rendering/geometryBufferRenderer.js +0 -1
  371. package/Rendering/geometryBufferRenderer.js.map +1 -1
  372. package/Rendering/objectRenderer.js +15 -9
  373. package/Rendering/objectRenderer.js.map +1 -1
  374. package/Rendering/renderingGroup.d.ts +1 -1
  375. package/Rendering/renderingGroup.js +1 -1
  376. package/Rendering/renderingGroup.js.map +1 -1
  377. package/Rendering/renderingManager.d.ts +1 -1
  378. package/Rendering/renderingManager.js.map +1 -1
  379. package/Rendering/thinDepthPeelingRenderer.js +1 -1
  380. package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
  381. package/Rendering/utilityLayerRenderer.js +1 -1
  382. package/Rendering/utilityLayerRenderer.js.map +1 -1
  383. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +18 -8
  384. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  385. package/Shaders/gpuRenderParticles.vertex.js +4 -0
  386. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  387. package/Shaders/gpuUpdateParticles.vertex.js +15 -3
  388. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  389. package/Shaders/iblVoxelGrid.fragment.js +4 -1
  390. package/Shaders/iblVoxelGrid.fragment.js.map +1 -1
  391. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js +18 -7
  392. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  393. package/ShadersWGSL/background.vertex.js +8 -8
  394. package/ShadersWGSL/background.vertex.js.map +1 -1
  395. package/ShadersWGSL/boundingBoxRenderer.vertex.js +2 -2
  396. package/ShadersWGSL/boundingBoxRenderer.vertex.js.map +1 -1
  397. package/ShadersWGSL/clearQuad.vertex.js +1 -1
  398. package/ShadersWGSL/clearQuad.vertex.js.map +1 -1
  399. package/ShadersWGSL/color.vertex.js +1 -1
  400. package/ShadersWGSL/color.vertex.js.map +1 -1
  401. package/ShadersWGSL/depth.vertex.js +3 -3
  402. package/ShadersWGSL/depth.vertex.js.map +1 -1
  403. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +2 -2
  404. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  405. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +2 -2
  406. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  407. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +2 -2
  408. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  409. package/ShadersWGSL/fxaa.vertex.js +1 -1
  410. package/ShadersWGSL/fxaa.vertex.js.map +1 -1
  411. package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
  412. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  413. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +3 -3
  414. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  415. package/ShadersWGSL/geometry.vertex.js +4 -4
  416. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  417. package/ShadersWGSL/glowMapGeneration.vertex.js +4 -4
  418. package/ShadersWGSL/glowMapGeneration.vertex.js.map +1 -1
  419. package/ShadersWGSL/glowMapMerge.vertex.js +1 -1
  420. package/ShadersWGSL/glowMapMerge.vertex.js.map +1 -1
  421. package/ShadersWGSL/gpuUpdateParticles.compute.js +16 -1
  422. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  423. package/ShadersWGSL/greasedLine.vertex.js +10 -4
  424. package/ShadersWGSL/greasedLine.vertex.js.map +1 -1
  425. package/ShadersWGSL/hdrFiltering.vertex.js +1 -1
  426. package/ShadersWGSL/hdrFiltering.vertex.js.map +1 -1
  427. package/ShadersWGSL/hdrIrradianceFiltering.vertex.js +1 -1
  428. package/ShadersWGSL/hdrIrradianceFiltering.vertex.js.map +1 -1
  429. package/ShadersWGSL/iblVoxelGrid.vertex.js +2 -2
  430. package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -1
  431. package/ShadersWGSL/iblVoxelSlabDebug.vertex.js +1 -1
  432. package/ShadersWGSL/iblVoxelSlabDebug.vertex.js.map +1 -1
  433. package/ShadersWGSL/kernelBlur.vertex.js +2 -2
  434. package/ShadersWGSL/kernelBlur.vertex.js.map +1 -1
  435. package/ShadersWGSL/layer.vertex.js +1 -1
  436. package/ShadersWGSL/layer.vertex.js.map +1 -1
  437. package/ShadersWGSL/lensFlare.vertex.js +1 -1
  438. package/ShadersWGSL/lensFlare.vertex.js.map +1 -1
  439. package/ShadersWGSL/line.vertex.js +2 -2
  440. package/ShadersWGSL/line.vertex.js.map +1 -1
  441. package/ShadersWGSL/meshUVSpaceRenderer.vertex.js +2 -2
  442. package/ShadersWGSL/meshUVSpaceRenderer.vertex.js.map +1 -1
  443. package/ShadersWGSL/meshUVSpaceRendererFinaliser.vertex.js +1 -1
  444. package/ShadersWGSL/meshUVSpaceRendererFinaliser.vertex.js.map +1 -1
  445. package/ShadersWGSL/meshUVSpaceRendererMasker.vertex.js +1 -1
  446. package/ShadersWGSL/meshUVSpaceRendererMasker.vertex.js.map +1 -1
  447. package/ShadersWGSL/particles.vertex.js +9 -9
  448. package/ShadersWGSL/particles.vertex.js.map +1 -1
  449. package/ShadersWGSL/picking.vertex.js +2 -2
  450. package/ShadersWGSL/picking.vertex.js.map +1 -1
  451. package/ShadersWGSL/procedural.vertex.js +1 -1
  452. package/ShadersWGSL/procedural.vertex.js.map +1 -1
  453. package/ShadersWGSL/shadowMap.vertex.js +4 -4
  454. package/ShadersWGSL/shadowMap.vertex.js.map +1 -1
  455. package/ShadersWGSL/sprites.vertex.js +3 -3
  456. package/ShadersWGSL/sprites.vertex.js.map +1 -1
  457. package/Sprites/spriteManager.js +4 -4
  458. package/Sprites/spriteManager.js.map +1 -1
  459. package/XR/features/WebXRAnchorSystem.js +2 -2
  460. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  461. package/XR/features/WebXRControllerPhysics.js +0 -2
  462. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  463. package/XR/features/WebXRHandTracking.js +4 -7
  464. package/XR/features/WebXRHandTracking.js.map +1 -1
  465. package/XR/features/WebXRNearInteraction.js +1 -1
  466. package/XR/features/WebXRNearInteraction.js.map +1 -1
  467. package/XR/motionController/webXRMicrosoftMixedRealityController.js +1 -1
  468. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  469. package/XR/motionController/webXROculusTouchMotionController.js +1 -1
  470. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  471. package/XR/webXRFeaturesManager.js +1 -1
  472. package/XR/webXRFeaturesManager.js.map +1 -1
  473. package/assetContainer.js +1 -1
  474. package/assetContainer.js.map +1 -1
  475. package/package.json +1 -1
  476. package/scene.d.ts +16 -0
  477. package/scene.js +30 -1
  478. package/scene.js.map +1 -1
  479. package/sceneComponent.js +1 -1
  480. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nodeParticleSystemSet.js","sourceRoot":"","sources":["../../../../../dev/core/src/Particles/Node/nodeParticleSystemSet.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize } from \"core/Misc/decorators\";\r\nimport { ParticleSystemSet } from \"../particleSystemSet\";\r\nimport { SystemBlock } from \"./Blocks/systemBlock\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { NodeParticleBuildState } from \"./nodeParticleBuildState\";\r\nimport type { NodeParticleBlock } from \"./nodeParticleBlock\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { GetClass } from \"core/Misc/typeStore\";\r\nimport { WebRequest } from \"core/Misc/webRequest\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { ParticleInputBlock } from \"./Blocks/particleInputBlock\";\r\nimport { ParticleTextureSourceBlock } from \"./Blocks/particleSourceTextureBlock\";\r\nimport { NodeParticleContextualSources } from \"./Enums/nodeParticleContextualSources\";\r\nimport { UpdatePositionBlock } from \"./Blocks/Update/updatePositionBlock\";\r\nimport { ParticleMathBlock, ParticleMathBlockOperations } from \"./Blocks/particleMathBlock\";\r\nimport type { ParticleTeleportOutBlock } from \"./Blocks/Teleport/particleTeleportOutBlock\";\r\nimport type { ParticleTeleportInBlock } from \"./Blocks/Teleport/particleTeleportInBlock\";\r\nimport { BoxShapeBlock } from \"./Blocks/Emitters/boxShapeBlock\";\r\nimport { CreateParticleBlock } from \"./Blocks/Emitters/createParticleBlock\";\r\nimport type { Color4 } from \"core/Maths/math.color\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n// declare NODEPARTICLEEDITOR namespace for compilation issue\r\ndeclare let NODEPARTICLEEDITOR: any;\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Interface used to configure the node particle editor\r\n */\r\nexport interface INodeParticleEditorOptions {\r\n /** Define the URL to load node editor script from */\r\n editorURL?: string;\r\n /** Additional configuration for the NPE */\r\n nodeEditorConfig?: {\r\n backgroundColor?: Color4;\r\n /** If true, the node particle system set will be disposed when the editor is closed (default: true) */\r\n disposeOnClose?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Defines a set of particle systems defined as a node graph.\r\n * NPE: #K6F1ZB#1\r\n * PG: #ZT509U#1\r\n */\r\nexport class NodeParticleSystemSet {\r\n private _systemBlocks: SystemBlock[] = [];\r\n private _buildId: number = 0;\r\n\r\n /** Define the Url to load node editor script */\r\n public static EditorURL = `${Tools._DefaultCdnUrl}/v${AbstractEngine.Version}/nodeParticleEditor/babylon.nodeParticleEditor.js`;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /**\r\n * Snippet ID if the material was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * Gets an array of blocks that needs to be serialized even if they are not yet connected\r\n */\r\n public attachedBlocks: NodeParticleBlock[] = [];\r\n\r\n /**\r\n * Gets or sets data used by visual editor\r\n * @see https://npe.babylonjs.com\r\n */\r\n public editorData: any = null;\r\n\r\n /**\r\n * Observable raised when the particle set is built\r\n */\r\n public onBuildObservable = new Observable<NodeParticleSystemSet>();\r\n\r\n /**\r\n * The name of the set\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * A free comment about the set\r\n */\r\n @serialize(\"comment\")\r\n public comment: string;\r\n\r\n /**\r\n * Gets the system blocks\r\n */\r\n public get systemBlocks(): SystemBlock[] {\r\n return this._systemBlocks;\r\n }\r\n\r\n /**\r\n * Gets the list of input blocks attached to this material\r\n * @returns an array of InputBlocks\r\n */\r\n public get inputBlocks() {\r\n const blocks: ParticleInputBlock[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput) {\r\n blocks.push(block as ParticleInputBlock);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Get a block by its name\r\n * @param name defines the name of the block to retrieve\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByName(name: string) {\r\n let result = null;\r\n for (const block of this.attachedBlocks) {\r\n if (block.name === name) {\r\n if (!result) {\r\n result = block;\r\n } else {\r\n Tools.Warn(\"More than one block was found with the name `\" + name + \"`\");\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByPredicate(predicate: (block: NodeParticleBlock) => boolean) {\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n return block;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get an input block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required input block or null if not found\r\n */\r\n public getInputBlockByPredicate(predicate: (block: ParticleInputBlock) => boolean): Nullable<ParticleInputBlock> {\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput && predicate(block as ParticleInputBlock)) {\r\n return block as ParticleInputBlock;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n /**\r\n * Creates a new set\r\n * @param name defines the name of the set\r\n */\r\n public constructor(name: string) {\r\n this.name = name;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the node particle set e.g. \"NodeParticleSystemSet\"\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeParticleSystemSet\";\r\n }\r\n\r\n private _initializeBlock(node: NodeParticleBlock, autoConfigure = true) {\r\n if (this.attachedBlocks.indexOf(node) === -1) {\r\n this.attachedBlocks.push(node);\r\n }\r\n\r\n for (const input of node.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._initializeBlock(block, autoConfigure);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private BJSNODEPARTICLEEDITOR = this._getGlobalNodeParticleEditor();\r\n\r\n /** Get the editor from bundle or global\r\n * @returns the global NPE\r\n */\r\n private _getGlobalNodeParticleEditor(): any {\r\n // UMD Global name detection from Webpack Bundle UMD Name.\r\n if (typeof NODEPARTICLEEDITOR !== \"undefined\") {\r\n return NODEPARTICLEEDITOR;\r\n }\r\n\r\n // In case of module let's check the global emitted from the editor entry point.\r\n if (typeof BABYLON !== \"undefined\" && typeof BABYLON.NodeParticleEditor !== \"undefined\") {\r\n return BABYLON;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /** Creates the node editor window.\r\n * @param additionalConfig Define the configuration of the editor\r\n */\r\n private _createNodeParticleEditor(additionalConfig?: any) {\r\n const nodeEditorConfig: any = {\r\n nodeParticleSet: this,\r\n ...additionalConfig,\r\n };\r\n this.BJSNODEPARTICLEEDITOR.NodeParticleEditor.Show(nodeEditorConfig);\r\n }\r\n\r\n /**\r\n * Launch the node particle editor\r\n * @param config Define the configuration of the editor\r\n * @returns a promise fulfilled when the node editor is visible\r\n */\r\n public async editAsync(config?: INodeParticleEditorOptions): Promise<void> {\r\n return await new Promise((resolve) => {\r\n this.BJSNODEPARTICLEEDITOR = this.BJSNODEPARTICLEEDITOR || this._getGlobalNodeParticleEditor();\r\n if (typeof this.BJSNODEPARTICLEEDITOR == \"undefined\") {\r\n const editorUrl = config && config.editorURL ? config.editorURL : NodeParticleSystemSet.EditorURL;\r\n\r\n // Load editor and add it to the DOM\r\n Tools.LoadBabylonScript(editorUrl, () => {\r\n this.BJSNODEPARTICLEEDITOR = this.BJSNODEPARTICLEEDITOR || this._getGlobalNodeParticleEditor();\r\n this._createNodeParticleEditor(config?.nodeEditorConfig);\r\n resolve();\r\n });\r\n } else {\r\n // Otherwise creates the editor\r\n this._createNodeParticleEditor(config?.nodeEditorConfig);\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Builds the particle system set from the defined blocks.\r\n * @param scene defines the hosting scene\r\n * @param verbose defines whether to log detailed information during the build process (false by default)\r\n * @returns a promise that resolves to the built particle system set\r\n */\r\n public async buildAsync(scene: Scene, verbose = false): Promise<ParticleSystemSet> {\r\n return await new Promise<ParticleSystemSet>((resolve) => {\r\n const output = new ParticleSystemSet();\r\n\r\n // Initialize all blocks\r\n for (const block of this._systemBlocks) {\r\n this._initializeBlock(block);\r\n }\r\n\r\n // Build the blocks\r\n for (const block of this.systemBlocks) {\r\n const state = new NodeParticleBuildState();\r\n state.buildId = this._buildId++;\r\n state.scene = scene;\r\n state.verbose = verbose;\r\n\r\n const system = block.createSystem(state);\r\n system._source = this;\r\n system._blockReference = block._internalId;\r\n\r\n // Errors\r\n state.emitErrors();\r\n\r\n output.systems.push(system);\r\n }\r\n\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n resolve(output);\r\n });\r\n }\r\n\r\n /**\r\n * Clear the current node particle set\r\n */\r\n public clear() {\r\n this.attachedBlocks.length = 0;\r\n this._systemBlocks.length = 0;\r\n }\r\n\r\n /**\r\n * Clear the current set and restore it to a default state\r\n */\r\n public setToDefault() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n // Main system\r\n const system = new SystemBlock(\"Particle system\");\r\n\r\n // Update position\r\n const updatePositionBlock = new UpdatePositionBlock(\"Update position\");\r\n updatePositionBlock.output.connectTo(system.particle);\r\n\r\n // Contextual inputs\r\n const positionBlock = new ParticleInputBlock(\"Position\");\r\n positionBlock.contextualValue = NodeParticleContextualSources.Position;\r\n const directionBlock = new ParticleInputBlock(\"Scaled direction\");\r\n directionBlock.contextualValue = NodeParticleContextualSources.ScaledDirection;\r\n\r\n // Add\r\n const addBlock = new ParticleMathBlock(\"Add\");\r\n addBlock.operation = ParticleMathBlockOperations.Add;\r\n positionBlock.output.connectTo(addBlock.left);\r\n directionBlock.output.connectTo(addBlock.right);\r\n addBlock.output.connectTo(updatePositionBlock.position);\r\n\r\n // Create particle\r\n const createParticleBlock = new CreateParticleBlock(\"Create particle\");\r\n\r\n // Shape\r\n const emitterShape = new BoxShapeBlock(\"Box shape\");\r\n createParticleBlock.particle.connectTo(emitterShape.particle);\r\n emitterShape.output.connectTo(updatePositionBlock.particle);\r\n\r\n // Texture\r\n const textureBlock = new ParticleTextureSourceBlock(\"Texture\");\r\n textureBlock.texture.connectTo(system.texture);\r\n textureBlock.url = Tools.GetAssetUrl(\"https://assets.babylonjs.com/core/textures/flare.png\");\r\n\r\n this._systemBlocks.push(system);\r\n }\r\n\r\n /**\r\n * Remove a block from the current system set\r\n * @param block defines the block to remove\r\n */\r\n public removeBlock(block: NodeParticleBlock) {\r\n const attachedBlockIndex = this.attachedBlocks.indexOf(block);\r\n if (attachedBlockIndex > -1) {\r\n this.attachedBlocks.splice(attachedBlockIndex, 1);\r\n }\r\n\r\n if (block.isSystem) {\r\n const index = this._systemBlocks.indexOf(block as SystemBlock);\r\n if (index > -1) {\r\n this._systemBlocks.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the particle set\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n */\r\n public parseSerializedObject(source: any, merge = false) {\r\n if (!merge) {\r\n this.clear();\r\n }\r\n\r\n const map: { [key: number]: NodeParticleBlock } = {};\r\n\r\n // Create blocks\r\n for (const parsedBlock of source.blocks) {\r\n const blockType = GetClass(parsedBlock.customType);\r\n if (blockType) {\r\n const block: NodeParticleBlock = new blockType();\r\n block._deserialize(parsedBlock);\r\n map[parsedBlock.id] = block;\r\n\r\n this.attachedBlocks.push(block);\r\n\r\n if (block.isSystem) {\r\n this._systemBlocks.push(block as SystemBlock);\r\n }\r\n }\r\n }\r\n\r\n // Reconnect teleportation\r\n for (const block of this.attachedBlocks) {\r\n if (block.isTeleportOut) {\r\n const teleportOut = block as ParticleTeleportOutBlock;\r\n const id = teleportOut._tempEntryPointUniqueId;\r\n if (id) {\r\n const source = map[id] as ParticleTeleportInBlock;\r\n if (source) {\r\n source.attachToEndpoint(teleportOut);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Connections - Starts with input blocks only (except if in \"merge\" mode where we scan all blocks)\r\n for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) {\r\n const parsedBlock = source.blocks[blockIndex];\r\n const block = map[parsedBlock.id];\r\n\r\n if (!block) {\r\n continue;\r\n }\r\n\r\n if (block.inputs.length && parsedBlock.inputs.some((i: any) => i.targetConnectionName) && !merge) {\r\n continue;\r\n }\r\n this._restoreConnections(block, source, map);\r\n }\r\n\r\n // UI related info\r\n if (source.locations || (source.editorData && source.editorData.locations)) {\r\n const locations: {\r\n blockId: number;\r\n x: number;\r\n y: number;\r\n isCollapsed: boolean;\r\n }[] = source.locations || source.editorData.locations;\r\n\r\n for (const location of locations) {\r\n if (map[location.blockId]) {\r\n location.blockId = map[location.blockId].uniqueId;\r\n }\r\n }\r\n\r\n if (merge && this.editorData && this.editorData.locations) {\r\n locations.concat(this.editorData.locations);\r\n }\r\n\r\n if (source.locations) {\r\n this.editorData = {\r\n locations: locations,\r\n };\r\n } else {\r\n this.editorData = source.editorData;\r\n this.editorData.locations = locations;\r\n }\r\n\r\n const blockMap: { [key: number]: number } = {};\r\n\r\n for (const key in map) {\r\n blockMap[key] = map[key].uniqueId;\r\n }\r\n\r\n this.editorData.map = blockMap;\r\n }\r\n\r\n this.comment = source.comment;\r\n }\r\n\r\n private _restoreConnections(block: NodeParticleBlock, source: any, map: { [key: number]: NodeParticleBlock }) {\r\n for (const outputPoint of block.outputs) {\r\n for (const candidate of source.blocks) {\r\n const target = map[candidate.id];\r\n\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n for (const input of candidate.inputs) {\r\n if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) {\r\n const inputPoint = target.getInputByName(input.inputName);\r\n if (!inputPoint || inputPoint.isConnected) {\r\n continue;\r\n }\r\n\r\n outputPoint.connectTo(inputPoint, true);\r\n this._restoreConnections(target, source, map);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this node particle set in a JSON representation\r\n * @param selectedBlocks defines the list of blocks to save (if null the whole node particle set will be saved)\r\n * @returns the serialized particle system set object\r\n */\r\n public serialize(selectedBlocks?: NodeParticleBlock[]): any {\r\n const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this);\r\n serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); // Copy\r\n\r\n let blocks: NodeParticleBlock[] = [];\r\n\r\n if (selectedBlocks) {\r\n blocks = selectedBlocks;\r\n } else {\r\n serializationObject.customType = \"BABYLON.NodeParticleSystemSet\";\r\n }\r\n\r\n // Blocks\r\n serializationObject.blocks = [];\r\n\r\n for (const block of blocks) {\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n\r\n if (!selectedBlocks) {\r\n for (const block of this.attachedBlocks) {\r\n if (blocks.indexOf(block) !== -1) {\r\n continue;\r\n }\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current particle system set.\r\n * @param name defines the name to use for the new particle system set\r\n * @returns the cloned particle system set\r\n */\r\n public clone(name: string): NodeParticleSystemSet {\r\n const serializationObject = this.serialize();\r\n\r\n const clone = SerializationHelper.Clone(() => new NodeParticleSystemSet(name), this);\r\n clone.name = name;\r\n clone.snippetId = this.snippetId;\r\n\r\n clone.parseSerializedObject(serializationObject);\r\n clone._buildId = this._buildId;\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Disposes the resources\r\n */\r\n public dispose(): void {\r\n for (const block of this.attachedBlocks) {\r\n block.dispose();\r\n }\r\n\r\n this.attachedBlocks.length = 0;\r\n this.onBuildObservable.clear();\r\n }\r\n\r\n /**\r\n * Creates a new node particle set set to default basic configuration\r\n * @param name defines the name of the particle set\r\n * @returns a new NodeParticleSystemSet\r\n */\r\n public static CreateDefault(name: string) {\r\n const nodeParticleSet = new NodeParticleSystemSet(name);\r\n\r\n nodeParticleSet.setToDefault();\r\n\r\n return nodeParticleSet;\r\n }\r\n\r\n /**\r\n * Creates a node particle set from parsed data\r\n * @param source defines the JSON representation of the particle set\r\n * @returns a new node particle set\r\n */\r\n public static Parse(source: any): NodeParticleSystemSet {\r\n const nodeParticleSet = SerializationHelper.Parse(() => new NodeParticleSystemSet(source.name), source, null);\r\n\r\n nodeParticleSet.parseSerializedObject(source);\r\n\r\n return nodeParticleSet;\r\n }\r\n\r\n /**\r\n * Creates a node particle set from a snippet saved in a remote file\r\n * @param name defines the name of the node particle set to create\r\n * @param url defines the url to load from\r\n * @param nodeParticleSet defines a node particle set to update (instead of creating a new one)\r\n * @returns a promise that will resolve to the new node particle set\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public static ParseFromFileAsync(name: string, url: string, nodeParticleSet?: NodeParticleSystemSet): Promise<NodeParticleSystemSet> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n if (!nodeParticleSet) {\r\n nodeParticleSet = SerializationHelper.Parse(() => new NodeParticleSystemSet(name), serializationObject, null);\r\n }\r\n\r\n nodeParticleSet.parseSerializedObject(serializationObject);\r\n\r\n resolve(nodeParticleSet);\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load the node particle system set\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a node particle set from a snippet saved by the node particle editor\r\n * @param snippetId defines the snippet to load\r\n * @param nodeParticleSet defines a node particle set to update (instead of creating a new one)\r\n * @returns a promise that will resolve to the new node particle set\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public static ParseFromSnippetAsync(snippetId: string, nodeParticleSet?: NodeParticleSystemSet): Promise<NodeParticleSystemSet> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(NodeParticleSystemSet.CreateDefault(\"blank\"));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.nodeParticle);\r\n\r\n if (!nodeParticleSet) {\r\n nodeParticleSet = SerializationHelper.Parse(() => new NodeParticleSystemSet(snippetId), serializationObject, null);\r\n }\r\n\r\n nodeParticleSet.parseSerializedObject(serializationObject);\r\n nodeParticleSet.snippetId = snippetId;\r\n\r\n try {\r\n resolve(nodeParticleSet);\r\n } catch (err) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(err);\r\n }\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"nodeParticleSystemSet.js","sourceRoot":"","sources":["../../../../../dev/core/src/Particles/Node/nodeParticleSystemSet.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize } from \"core/Misc/decorators\";\r\nimport { ParticleSystemSet } from \"../particleSystemSet\";\r\nimport { SystemBlock } from \"./Blocks/systemBlock\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { NodeParticleBuildState } from \"./nodeParticleBuildState\";\r\nimport type { NodeParticleBlock } from \"./nodeParticleBlock\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { GetClass } from \"core/Misc/typeStore\";\r\nimport { WebRequest } from \"core/Misc/webRequest\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { ParticleInputBlock } from \"./Blocks/particleInputBlock\";\r\nimport { ParticleTextureSourceBlock } from \"./Blocks/particleSourceTextureBlock\";\r\nimport { NodeParticleContextualSources } from \"./Enums/nodeParticleContextualSources\";\r\nimport { UpdatePositionBlock } from \"./Blocks/Update/updatePositionBlock\";\r\nimport { ParticleMathBlock, ParticleMathBlockOperations } from \"./Blocks/particleMathBlock\";\r\nimport type { ParticleTeleportOutBlock } from \"./Blocks/Teleport/particleTeleportOutBlock\";\r\nimport type { ParticleTeleportInBlock } from \"./Blocks/Teleport/particleTeleportInBlock\";\r\nimport { BoxShapeBlock } from \"./Blocks/Emitters/boxShapeBlock\";\r\nimport { CreateParticleBlock } from \"./Blocks/Emitters/createParticleBlock\";\r\nimport type { Color4 } from \"core/Maths/math.color\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n// declare NODEPARTICLEEDITOR namespace for compilation issue\r\ndeclare let NODEPARTICLEEDITOR: any;\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Interface used to configure the node particle editor\r\n */\r\nexport interface INodeParticleEditorOptions {\r\n /** Define the URL to load node editor script from */\r\n editorURL?: string;\r\n /** Additional configuration for the NPE */\r\n nodeEditorConfig?: {\r\n backgroundColor?: Color4;\r\n /** If true, the node particle system set will be disposed when the editor is closed (default: true) */\r\n disposeOnClose?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Defines a set of particle systems defined as a node graph.\r\n * NPE: #K6F1ZB#1\r\n * PG: #ZT509U#1\r\n */\r\nexport class NodeParticleSystemSet {\r\n private _systemBlocks: SystemBlock[] = [];\r\n private _buildId: number = 0;\r\n\r\n /** Define the Url to load node editor script */\r\n public static EditorURL = `${Tools._DefaultCdnUrl}/v${AbstractEngine.Version}/nodeParticleEditor/babylon.nodeParticleEditor.js`;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /**\r\n * Snippet ID if the material was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * Gets an array of blocks that needs to be serialized even if they are not yet connected\r\n */\r\n public attachedBlocks: NodeParticleBlock[] = [];\r\n\r\n /**\r\n * Gets or sets data used by visual editor\r\n * @see https://npe.babylonjs.com\r\n */\r\n public editorData: any = null;\r\n\r\n /**\r\n * Observable raised when the particle set is built\r\n */\r\n public onBuildObservable = new Observable<NodeParticleSystemSet>();\r\n\r\n /**\r\n * The name of the set\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * A free comment about the set\r\n */\r\n @serialize(\"comment\")\r\n public comment: string;\r\n\r\n /**\r\n * Gets the system blocks\r\n */\r\n public get systemBlocks(): SystemBlock[] {\r\n return this._systemBlocks;\r\n }\r\n\r\n /**\r\n * Gets the list of input blocks attached to this material\r\n * @returns an array of InputBlocks\r\n */\r\n public get inputBlocks() {\r\n const blocks: ParticleInputBlock[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput) {\r\n blocks.push(block as ParticleInputBlock);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Get a block by its name\r\n * @param name defines the name of the block to retrieve\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByName(name: string) {\r\n let result = null;\r\n for (const block of this.attachedBlocks) {\r\n if (block.name === name) {\r\n if (!result) {\r\n result = block;\r\n } else {\r\n Tools.Warn(\"More than one block was found with the name `\" + name + \"`\");\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByPredicate(predicate: (block: NodeParticleBlock) => boolean) {\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n return block;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get an input block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required input block or null if not found\r\n */\r\n public getInputBlockByPredicate(predicate: (block: ParticleInputBlock) => boolean): Nullable<ParticleInputBlock> {\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput && predicate(block as ParticleInputBlock)) {\r\n return block as ParticleInputBlock;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n /**\r\n * Creates a new set\r\n * @param name defines the name of the set\r\n */\r\n public constructor(name: string) {\r\n this.name = name;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the node particle set e.g. \"NodeParticleSystemSet\"\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeParticleSystemSet\";\r\n }\r\n\r\n private _initializeBlock(node: NodeParticleBlock, autoConfigure = true) {\r\n if (this.attachedBlocks.indexOf(node) === -1) {\r\n this.attachedBlocks.push(node);\r\n }\r\n\r\n for (const input of node.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._initializeBlock(block, autoConfigure);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private BJSNODEPARTICLEEDITOR = this._getGlobalNodeParticleEditor();\r\n\r\n /** Get the editor from bundle or global\r\n * @returns the global NPE\r\n */\r\n private _getGlobalNodeParticleEditor(): any {\r\n // UMD Global name detection from Webpack Bundle UMD Name.\r\n if (typeof NODEPARTICLEEDITOR !== \"undefined\") {\r\n return NODEPARTICLEEDITOR;\r\n }\r\n\r\n // In case of module let's check the global emitted from the editor entry point.\r\n if (typeof BABYLON !== \"undefined\" && typeof BABYLON.NodeParticleEditor !== \"undefined\") {\r\n return BABYLON;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /** Creates the node editor window.\r\n * @param additionalConfig Define the configuration of the editor\r\n */\r\n private _createNodeParticleEditor(additionalConfig?: any) {\r\n const nodeEditorConfig: any = {\r\n nodeParticleSet: this,\r\n ...additionalConfig,\r\n };\r\n this.BJSNODEPARTICLEEDITOR.NodeParticleEditor.Show(nodeEditorConfig);\r\n }\r\n\r\n /**\r\n * Launch the node particle editor\r\n * @param config Define the configuration of the editor\r\n * @returns a promise fulfilled when the node editor is visible\r\n */\r\n public async editAsync(config?: INodeParticleEditorOptions): Promise<void> {\r\n return await new Promise((resolve) => {\r\n this.BJSNODEPARTICLEEDITOR = this.BJSNODEPARTICLEEDITOR || this._getGlobalNodeParticleEditor();\r\n if (typeof this.BJSNODEPARTICLEEDITOR == \"undefined\") {\r\n const editorUrl = config && config.editorURL ? config.editorURL : NodeParticleSystemSet.EditorURL;\r\n\r\n // Load editor and add it to the DOM\r\n Tools.LoadBabylonScript(editorUrl, () => {\r\n this.BJSNODEPARTICLEEDITOR = this.BJSNODEPARTICLEEDITOR || this._getGlobalNodeParticleEditor();\r\n this._createNodeParticleEditor(config?.nodeEditorConfig);\r\n resolve();\r\n });\r\n } else {\r\n // Otherwise creates the editor\r\n this._createNodeParticleEditor(config?.nodeEditorConfig);\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Builds the particle system set from the defined blocks.\r\n * @param scene defines the hosting scene\r\n * @param verbose defines whether to log detailed information during the build process (false by default)\r\n * @returns a promise that resolves to the built particle system set\r\n */\r\n public async buildAsync(scene: Scene, verbose = false): Promise<ParticleSystemSet> {\r\n return await new Promise<ParticleSystemSet>((resolve) => {\r\n const output = new ParticleSystemSet();\r\n\r\n // Initialize all blocks\r\n for (const block of this._systemBlocks) {\r\n this._initializeBlock(block);\r\n }\r\n\r\n // Build the blocks\r\n for (const block of this.systemBlocks) {\r\n const state = new NodeParticleBuildState();\r\n state.buildId = this._buildId++;\r\n state.scene = scene;\r\n state.verbose = verbose;\r\n\r\n const system = block.createSystem(state);\r\n system._source = this;\r\n system._blockReference = block._internalId;\r\n\r\n // Errors\r\n state.emitErrors();\r\n\r\n output.systems.push(system);\r\n }\r\n\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n resolve(output);\r\n });\r\n }\r\n\r\n /**\r\n * Clear the current node particle set\r\n */\r\n public clear() {\r\n this.attachedBlocks.length = 0;\r\n this._systemBlocks.length = 0;\r\n }\r\n\r\n /**\r\n * Clear the current set and restore it to a default state\r\n */\r\n public setToDefault() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n // Main system\r\n const system = new SystemBlock(\"Particle system\");\r\n\r\n // Update position\r\n const updatePositionBlock = new UpdatePositionBlock(\"Update position\");\r\n updatePositionBlock.output.connectTo(system.particle);\r\n\r\n // Contextual inputs\r\n const positionBlock = new ParticleInputBlock(\"Position\");\r\n positionBlock.contextualValue = NodeParticleContextualSources.Position;\r\n const directionBlock = new ParticleInputBlock(\"Scaled direction\");\r\n directionBlock.contextualValue = NodeParticleContextualSources.ScaledDirection;\r\n\r\n // Add\r\n const addBlock = new ParticleMathBlock(\"Add\");\r\n addBlock.operation = ParticleMathBlockOperations.Add;\r\n positionBlock.output.connectTo(addBlock.left);\r\n directionBlock.output.connectTo(addBlock.right);\r\n addBlock.output.connectTo(updatePositionBlock.position);\r\n\r\n // Create particle\r\n const createParticleBlock = new CreateParticleBlock(\"Create particle\");\r\n\r\n // Shape\r\n const emitterShape = new BoxShapeBlock(\"Box shape\");\r\n createParticleBlock.particle.connectTo(emitterShape.particle);\r\n emitterShape.output.connectTo(updatePositionBlock.particle);\r\n\r\n // Texture\r\n const textureBlock = new ParticleTextureSourceBlock(\"Texture\");\r\n textureBlock.textureOutput.connectTo(system.texture);\r\n textureBlock.url = Tools.GetAssetUrl(\"https://assets.babylonjs.com/core/textures/flare.png\");\r\n\r\n this._systemBlocks.push(system);\r\n }\r\n\r\n /**\r\n * Remove a block from the current system set\r\n * @param block defines the block to remove\r\n */\r\n public removeBlock(block: NodeParticleBlock) {\r\n const attachedBlockIndex = this.attachedBlocks.indexOf(block);\r\n if (attachedBlockIndex > -1) {\r\n this.attachedBlocks.splice(attachedBlockIndex, 1);\r\n }\r\n\r\n if (block.isSystem) {\r\n const index = this._systemBlocks.indexOf(block as SystemBlock);\r\n if (index > -1) {\r\n this._systemBlocks.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the particle set\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n */\r\n public parseSerializedObject(source: any, merge = false) {\r\n if (!merge) {\r\n this.clear();\r\n }\r\n\r\n const map: { [key: number]: NodeParticleBlock } = {};\r\n\r\n // Create blocks\r\n for (const parsedBlock of source.blocks) {\r\n const blockType = GetClass(parsedBlock.customType);\r\n if (blockType) {\r\n const block: NodeParticleBlock = new blockType();\r\n block._deserialize(parsedBlock);\r\n map[parsedBlock.id] = block;\r\n\r\n this.attachedBlocks.push(block);\r\n\r\n if (block.isSystem) {\r\n this._systemBlocks.push(block as SystemBlock);\r\n }\r\n }\r\n }\r\n\r\n // Reconnect teleportation\r\n for (const block of this.attachedBlocks) {\r\n if (block.isTeleportOut) {\r\n const teleportOut = block as ParticleTeleportOutBlock;\r\n const id = teleportOut._tempEntryPointUniqueId;\r\n if (id) {\r\n const source = map[id] as ParticleTeleportInBlock;\r\n if (source) {\r\n source.attachToEndpoint(teleportOut);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Connections - Starts with input blocks only (except if in \"merge\" mode where we scan all blocks)\r\n for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) {\r\n const parsedBlock = source.blocks[blockIndex];\r\n const block = map[parsedBlock.id];\r\n\r\n if (!block) {\r\n continue;\r\n }\r\n\r\n if (block.inputs.length && parsedBlock.inputs.some((i: any) => i.targetConnectionName) && !merge) {\r\n continue;\r\n }\r\n this._restoreConnections(block, source, map);\r\n }\r\n\r\n // UI related info\r\n if (source.locations || (source.editorData && source.editorData.locations)) {\r\n const locations: {\r\n blockId: number;\r\n x: number;\r\n y: number;\r\n isCollapsed: boolean;\r\n }[] = source.locations || source.editorData.locations;\r\n\r\n for (const location of locations) {\r\n if (map[location.blockId]) {\r\n location.blockId = map[location.blockId].uniqueId;\r\n }\r\n }\r\n\r\n if (merge && this.editorData && this.editorData.locations) {\r\n locations.concat(this.editorData.locations);\r\n }\r\n\r\n if (source.locations) {\r\n this.editorData = {\r\n locations: locations,\r\n };\r\n } else {\r\n this.editorData = source.editorData;\r\n this.editorData.locations = locations;\r\n }\r\n\r\n const blockMap: { [key: number]: number } = {};\r\n\r\n for (const key in map) {\r\n blockMap[key] = map[key].uniqueId;\r\n }\r\n\r\n this.editorData.map = blockMap;\r\n }\r\n\r\n this.comment = source.comment;\r\n }\r\n\r\n private _restoreConnections(block: NodeParticleBlock, source: any, map: { [key: number]: NodeParticleBlock }) {\r\n for (const outputPoint of block.outputs) {\r\n for (const candidate of source.blocks) {\r\n const target = map[candidate.id];\r\n\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n for (const input of candidate.inputs) {\r\n if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) {\r\n const inputPoint = target.getInputByName(input.inputName);\r\n if (!inputPoint || inputPoint.isConnected) {\r\n continue;\r\n }\r\n\r\n outputPoint.connectTo(inputPoint, true);\r\n this._restoreConnections(target, source, map);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this node particle set in a JSON representation\r\n * @param selectedBlocks defines the list of blocks to save (if null the whole node particle set will be saved)\r\n * @returns the serialized particle system set object\r\n */\r\n public serialize(selectedBlocks?: NodeParticleBlock[]): any {\r\n const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this);\r\n serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); // Copy\r\n\r\n let blocks: NodeParticleBlock[] = [];\r\n\r\n if (selectedBlocks) {\r\n blocks = selectedBlocks;\r\n } else {\r\n serializationObject.customType = \"BABYLON.NodeParticleSystemSet\";\r\n }\r\n\r\n // Blocks\r\n serializationObject.blocks = [];\r\n\r\n for (const block of blocks) {\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n\r\n if (!selectedBlocks) {\r\n for (const block of this.attachedBlocks) {\r\n if (blocks.indexOf(block) !== -1) {\r\n continue;\r\n }\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current particle system set.\r\n * @param name defines the name to use for the new particle system set\r\n * @returns the cloned particle system set\r\n */\r\n public clone(name: string): NodeParticleSystemSet {\r\n const serializationObject = this.serialize();\r\n\r\n const clone = SerializationHelper.Clone(() => new NodeParticleSystemSet(name), this);\r\n clone.name = name;\r\n clone.snippetId = this.snippetId;\r\n\r\n clone.parseSerializedObject(serializationObject);\r\n clone._buildId = this._buildId;\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Disposes the resources\r\n */\r\n public dispose(): void {\r\n for (const block of this.attachedBlocks) {\r\n block.dispose();\r\n }\r\n\r\n this.attachedBlocks.length = 0;\r\n this.onBuildObservable.clear();\r\n }\r\n\r\n /**\r\n * Creates a new node particle set set to default basic configuration\r\n * @param name defines the name of the particle set\r\n * @returns a new NodeParticleSystemSet\r\n */\r\n public static CreateDefault(name: string) {\r\n const nodeParticleSet = new NodeParticleSystemSet(name);\r\n\r\n nodeParticleSet.setToDefault();\r\n\r\n return nodeParticleSet;\r\n }\r\n\r\n /**\r\n * Creates a node particle set from parsed data\r\n * @param source defines the JSON representation of the particle set\r\n * @returns a new node particle set\r\n */\r\n public static Parse(source: any): NodeParticleSystemSet {\r\n const nodeParticleSet = SerializationHelper.Parse(() => new NodeParticleSystemSet(source.name), source, null);\r\n\r\n nodeParticleSet.parseSerializedObject(source);\r\n\r\n return nodeParticleSet;\r\n }\r\n\r\n /**\r\n * Creates a node particle set from a snippet saved in a remote file\r\n * @param name defines the name of the node particle set to create\r\n * @param url defines the url to load from\r\n * @param nodeParticleSet defines a node particle set to update (instead of creating a new one)\r\n * @returns a promise that will resolve to the new node particle set\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public static ParseFromFileAsync(name: string, url: string, nodeParticleSet?: NodeParticleSystemSet): Promise<NodeParticleSystemSet> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n if (!nodeParticleSet) {\r\n nodeParticleSet = SerializationHelper.Parse(() => new NodeParticleSystemSet(name), serializationObject, null);\r\n }\r\n\r\n nodeParticleSet.parseSerializedObject(serializationObject);\r\n\r\n resolve(nodeParticleSet);\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load the node particle system set\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a node particle set from a snippet saved by the node particle editor\r\n * @param snippetId defines the snippet to load\r\n * @param nodeParticleSet defines a node particle set to update (instead of creating a new one)\r\n * @returns a promise that will resolve to the new node particle set\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public static ParseFromSnippetAsync(snippetId: string, nodeParticleSet?: NodeParticleSystemSet): Promise<NodeParticleSystemSet> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(NodeParticleSystemSet.CreateDefault(\"blank\"));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.nodeParticle);\r\n\r\n if (!nodeParticleSet) {\r\n nodeParticleSet = SerializationHelper.Parse(() => new NodeParticleSystemSet(snippetId), serializationObject, null);\r\n }\r\n\r\n nodeParticleSet.parseSerializedObject(serializationObject);\r\n nodeParticleSet.snippetId = snippetId;\r\n\r\n try {\r\n resolve(nodeParticleSet);\r\n } catch (err) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(err);\r\n }\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n}\r\n"]}
@@ -69,6 +69,8 @@ export class ComputeShaderParticleSystem {
69
69
  this._simParamsComputeShader.addUniform("randomTextureSize", 1);
70
70
  this._simParamsComputeShader.addUniform("lifeTime", 2);
71
71
  this._simParamsComputeShader.addUniform("emitPower", 2);
72
+ this._simParamsComputeShader.addUniform("emitIndex", 1);
73
+ this._simParamsComputeShader.addUniform("emitCount", 1);
72
74
  if (!this._parent._colorGradientsTexture) {
73
75
  this._simParamsComputeShader.addUniform("color1", 4);
74
76
  this._simParamsComputeShader.addUniform("color2", 4);
@@ -1 +1 @@
1
- {"version":3,"file":"computeShaderParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/computeShaderParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WebGPUEngine } from \"../Engines/webgpuEngine\";\r\nimport { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { ComputeShader } from \"../Compute/computeShader\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { IGPUParticleSystemPlatform } from \"./IGPUParticleSystemPlatform\";\r\nimport type { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { GPUParticleSystem } from \"./gpuParticleSystem\";\r\n\r\nimport type { DataArray, Nullable } from \"../types\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { UniformBufferEffectCommonAccessor } from \"../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { ComputeBindingMapping } from \"../Engines/Extensions/engine.computeShader\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport \"../ShadersWGSL/gpuUpdateParticles.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderParticleSystem implements IGPUParticleSystemPlatform {\r\n private _parent: GPUParticleSystem;\r\n private _engine: WebGPUEngine;\r\n private _updateComputeShader: ComputeShader;\r\n private _simParamsComputeShader: UniformBuffer;\r\n private _bufferComputeShader: StorageBuffer[] = [];\r\n private _renderVertexBuffers: Array<{ [key: string]: VertexBuffer }> = [];\r\n\r\n /** @internal */\r\n public readonly alignDataInBuffer = true;\r\n\r\n /** @internal */\r\n constructor(parent: GPUParticleSystem, engine: WebGPUEngine) {\r\n this._parent = parent;\r\n this._engine = engine;\r\n }\r\n\r\n /** @internal */\r\n public contextLost(): void {\r\n this._updateComputeShader = undefined as any;\r\n this._bufferComputeShader.length = 0;\r\n this._renderVertexBuffers.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public isUpdateBufferCreated(): boolean {\r\n return !!this._updateComputeShader;\r\n }\r\n\r\n /** @internal */\r\n public isUpdateBufferReady(): boolean {\r\n return this._updateComputeShader?.isReady() ?? false;\r\n }\r\n\r\n /** @internal */\r\n public createUpdateBuffer(defines: string): UniformBufferEffectCommonAccessor {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n params: { group: 0, binding: 0 },\r\n particlesIn: { group: 0, binding: 1 },\r\n particlesOut: { group: 0, binding: 2 },\r\n randomTexture: { group: 0, binding: 3 },\r\n randomTexture2: { group: 0, binding: 4 },\r\n };\r\n if (this._parent._sizeGradientsTexture) {\r\n bindingsMapping[\"sizeGradientTexture\"] = { group: 1, binding: 1 };\r\n }\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n bindingsMapping[\"angularSpeedGradientTexture\"] = { group: 1, binding: 3 };\r\n }\r\n if (this._parent._velocityGradientsTexture) {\r\n bindingsMapping[\"velocityGradientTexture\"] = { group: 1, binding: 5 };\r\n }\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n bindingsMapping[\"limitVelocityGradientTexture\"] = { group: 1, binding: 7 };\r\n }\r\n if (this._parent._dragGradientsTexture) {\r\n bindingsMapping[\"dragGradientTexture\"] = { group: 1, binding: 9 };\r\n }\r\n if (this._parent.noiseTexture) {\r\n bindingsMapping[\"noiseTexture\"] = { group: 1, binding: 11 };\r\n }\r\n if (this._parent.flowMap) {\r\n bindingsMapping[\"flowMapTexture\"] = { group: 1, binding: 13 };\r\n }\r\n\r\n this._updateComputeShader = new ComputeShader(\"updateParticles\", this._engine, \"gpuUpdateParticles\", { bindingsMapping, defines: defines.split(\"\\n\") });\r\n\r\n this._simParamsComputeShader?.dispose();\r\n this._simParamsComputeShader = new UniformBuffer(this._engine, undefined, undefined, \"ComputeShaderParticleSystemUBO\");\r\n\r\n this._simParamsComputeShader.addUniform(\"currentCount\", 1);\r\n this._simParamsComputeShader.addUniform(\"timeDelta\", 1);\r\n this._simParamsComputeShader.addUniform(\"stopFactor\", 1);\r\n this._simParamsComputeShader.addUniform(\"randomTextureSize\", 1);\r\n this._simParamsComputeShader.addUniform(\"lifeTime\", 2);\r\n this._simParamsComputeShader.addUniform(\"emitPower\", 2);\r\n if (!this._parent._colorGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"color1\", 4);\r\n this._simParamsComputeShader.addUniform(\"color2\", 4);\r\n }\r\n this._simParamsComputeShader.addUniform(\"sizeRange\", 2);\r\n this._simParamsComputeShader.addUniform(\"scaleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"angleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"gravity\", 3);\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"limitVelocityDamping\", 1);\r\n }\r\n if (this._parent.isAnimationSheetEnabled) {\r\n this._simParamsComputeShader.addUniform(\"cellInfos\", 4);\r\n }\r\n if (this._parent.noiseTexture) {\r\n this._simParamsComputeShader.addUniform(\"noiseStrength\", 3);\r\n }\r\n if (this._parent.flowMap) {\r\n this._simParamsComputeShader.addUniform(\"flowMapProjection\", 16);\r\n this._simParamsComputeShader.addUniform(\"flowMapStrength\", 1);\r\n }\r\n if (!this._parent.isLocal) {\r\n this._simParamsComputeShader.addUniform(\"emitterWM\", 16);\r\n }\r\n if (this._parent.particleEmitterType) {\r\n this._parent.particleEmitterType.buildUniformLayout(this._simParamsComputeShader);\r\n }\r\n\r\n this._updateComputeShader.setUniformBuffer(\"params\", this._simParamsComputeShader);\r\n\r\n return new UniformBufferEffectCommonAccessor(this._simParamsComputeShader);\r\n }\r\n\r\n /** @internal */\r\n public createVertexBuffers(updateBuffer: Buffer, renderVertexBuffers: { [key: string]: VertexBuffer }): void {\r\n this._renderVertexBuffers.push(renderVertexBuffers);\r\n }\r\n\r\n /** @internal */\r\n public createParticleBuffer(data: number[]): DataArray | DataBuffer {\r\n const buffer = new StorageBuffer(\r\n this._engine,\r\n data.length * 4,\r\n Constants.BUFFER_CREATIONFLAG_READWRITE | Constants.BUFFER_CREATIONFLAG_VERTEX,\r\n \"ComputeShaderParticleSystemBuffer\"\r\n );\r\n\r\n buffer.update(data);\r\n this._bufferComputeShader.push(buffer);\r\n\r\n return buffer.getBuffer();\r\n }\r\n\r\n /** @internal */\r\n public bindDrawBuffers(index: number, effect: Effect, indexBuffer: Nullable<DataBuffer>): void {\r\n this._engine.bindBuffers(this._renderVertexBuffers[index], indexBuffer, effect);\r\n }\r\n\r\n /** @internal */\r\n public preUpdateParticleBuffer(): void {}\r\n\r\n /** @internal */\r\n public updateParticleBuffer(index: number, targetBuffer: Buffer, currentActiveCount: number): void {\r\n this._simParamsComputeShader.update();\r\n\r\n this._updateComputeShader.setTexture(\"randomTexture\", this._parent._randomTexture, false);\r\n this._updateComputeShader.setTexture(\"randomTexture2\", this._parent._randomTexture2, false);\r\n if (this._parent._sizeGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"sizeGradientTexture\", this._parent._sizeGradientsTexture);\r\n }\r\n\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"angularSpeedGradientTexture\", this._parent._angularSpeedGradientsTexture);\r\n }\r\n\r\n if (this._parent._velocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"velocityGradientTexture\", this._parent._velocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"limitVelocityGradientTexture\", this._parent._limitVelocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._dragGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"dragGradientTexture\", this._parent._dragGradientsTexture);\r\n }\r\n\r\n if (this._parent.noiseTexture) {\r\n this._updateComputeShader.setTexture(\"noiseTexture\", this._parent.noiseTexture);\r\n }\r\n\r\n if (this._parent.flowMap) {\r\n this._updateComputeShader.setTexture(\"flowMapTexture\", this._parent.flowMap);\r\n }\r\n\r\n this._updateComputeShader.setStorageBuffer(\"particlesIn\", this._bufferComputeShader[index]);\r\n this._updateComputeShader.setStorageBuffer(\"particlesOut\", this._bufferComputeShader[index ^ 1]);\r\n\r\n this._updateComputeShader.dispatch(Math.ceil(currentActiveCount / 64));\r\n }\r\n\r\n /** @internal */\r\n public releaseBuffers(): void {\r\n for (let i = 0; i < this._bufferComputeShader.length; ++i) {\r\n this._bufferComputeShader[i].dispose();\r\n }\r\n\r\n this._bufferComputeShader.length = 0;\r\n\r\n this._simParamsComputeShader?.dispose();\r\n (<any>this._simParamsComputeShader) = null;\r\n\r\n (<any>this._updateComputeShader) = null;\r\n }\r\n\r\n /** @internal */\r\n public releaseVertexBuffers(): void {\r\n this._renderVertexBuffers.length = 0;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ComputeShaderParticleSystem\", ComputeShaderParticleSystem);\r\n"]}
1
+ {"version":3,"file":"computeShaderParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/computeShaderParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WebGPUEngine } from \"../Engines/webgpuEngine\";\r\nimport { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { ComputeShader } from \"../Compute/computeShader\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { IGPUParticleSystemPlatform } from \"./IGPUParticleSystemPlatform\";\r\nimport type { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { GPUParticleSystem } from \"./gpuParticleSystem\";\r\n\r\nimport type { DataArray, Nullable } from \"../types\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { UniformBufferEffectCommonAccessor } from \"../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { ComputeBindingMapping } from \"../Engines/Extensions/engine.computeShader\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport \"../ShadersWGSL/gpuUpdateParticles.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderParticleSystem implements IGPUParticleSystemPlatform {\r\n private _parent: GPUParticleSystem;\r\n private _engine: WebGPUEngine;\r\n private _updateComputeShader: ComputeShader;\r\n private _simParamsComputeShader: UniformBuffer;\r\n private _bufferComputeShader: StorageBuffer[] = [];\r\n private _renderVertexBuffers: Array<{ [key: string]: VertexBuffer }> = [];\r\n\r\n /** @internal */\r\n public readonly alignDataInBuffer = true;\r\n\r\n /** @internal */\r\n constructor(parent: GPUParticleSystem, engine: WebGPUEngine) {\r\n this._parent = parent;\r\n this._engine = engine;\r\n }\r\n\r\n /** @internal */\r\n public contextLost(): void {\r\n this._updateComputeShader = undefined as any;\r\n this._bufferComputeShader.length = 0;\r\n this._renderVertexBuffers.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public isUpdateBufferCreated(): boolean {\r\n return !!this._updateComputeShader;\r\n }\r\n\r\n /** @internal */\r\n public isUpdateBufferReady(): boolean {\r\n return this._updateComputeShader?.isReady() ?? false;\r\n }\r\n\r\n /** @internal */\r\n public createUpdateBuffer(defines: string): UniformBufferEffectCommonAccessor {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n params: { group: 0, binding: 0 },\r\n particlesIn: { group: 0, binding: 1 },\r\n particlesOut: { group: 0, binding: 2 },\r\n randomTexture: { group: 0, binding: 3 },\r\n randomTexture2: { group: 0, binding: 4 },\r\n };\r\n if (this._parent._sizeGradientsTexture) {\r\n bindingsMapping[\"sizeGradientTexture\"] = { group: 1, binding: 1 };\r\n }\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n bindingsMapping[\"angularSpeedGradientTexture\"] = { group: 1, binding: 3 };\r\n }\r\n if (this._parent._velocityGradientsTexture) {\r\n bindingsMapping[\"velocityGradientTexture\"] = { group: 1, binding: 5 };\r\n }\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n bindingsMapping[\"limitVelocityGradientTexture\"] = { group: 1, binding: 7 };\r\n }\r\n if (this._parent._dragGradientsTexture) {\r\n bindingsMapping[\"dragGradientTexture\"] = { group: 1, binding: 9 };\r\n }\r\n if (this._parent.noiseTexture) {\r\n bindingsMapping[\"noiseTexture\"] = { group: 1, binding: 11 };\r\n }\r\n if (this._parent.flowMap) {\r\n bindingsMapping[\"flowMapTexture\"] = { group: 1, binding: 13 };\r\n }\r\n\r\n this._updateComputeShader = new ComputeShader(\"updateParticles\", this._engine, \"gpuUpdateParticles\", { bindingsMapping, defines: defines.split(\"\\n\") });\r\n\r\n this._simParamsComputeShader?.dispose();\r\n this._simParamsComputeShader = new UniformBuffer(this._engine, undefined, undefined, \"ComputeShaderParticleSystemUBO\");\r\n\r\n this._simParamsComputeShader.addUniform(\"currentCount\", 1);\r\n this._simParamsComputeShader.addUniform(\"timeDelta\", 1);\r\n this._simParamsComputeShader.addUniform(\"stopFactor\", 1);\r\n this._simParamsComputeShader.addUniform(\"randomTextureSize\", 1);\r\n this._simParamsComputeShader.addUniform(\"lifeTime\", 2);\r\n this._simParamsComputeShader.addUniform(\"emitPower\", 2);\r\n this._simParamsComputeShader.addUniform(\"emitIndex\", 1);\r\n this._simParamsComputeShader.addUniform(\"emitCount\", 1);\r\n if (!this._parent._colorGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"color1\", 4);\r\n this._simParamsComputeShader.addUniform(\"color2\", 4);\r\n }\r\n this._simParamsComputeShader.addUniform(\"sizeRange\", 2);\r\n this._simParamsComputeShader.addUniform(\"scaleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"angleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"gravity\", 3);\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"limitVelocityDamping\", 1);\r\n }\r\n if (this._parent.isAnimationSheetEnabled) {\r\n this._simParamsComputeShader.addUniform(\"cellInfos\", 4);\r\n }\r\n if (this._parent.noiseTexture) {\r\n this._simParamsComputeShader.addUniform(\"noiseStrength\", 3);\r\n }\r\n if (this._parent.flowMap) {\r\n this._simParamsComputeShader.addUniform(\"flowMapProjection\", 16);\r\n this._simParamsComputeShader.addUniform(\"flowMapStrength\", 1);\r\n }\r\n if (!this._parent.isLocal) {\r\n this._simParamsComputeShader.addUniform(\"emitterWM\", 16);\r\n }\r\n if (this._parent.particleEmitterType) {\r\n this._parent.particleEmitterType.buildUniformLayout(this._simParamsComputeShader);\r\n }\r\n\r\n this._updateComputeShader.setUniformBuffer(\"params\", this._simParamsComputeShader);\r\n\r\n return new UniformBufferEffectCommonAccessor(this._simParamsComputeShader);\r\n }\r\n\r\n /** @internal */\r\n public createVertexBuffers(updateBuffer: Buffer, renderVertexBuffers: { [key: string]: VertexBuffer }): void {\r\n this._renderVertexBuffers.push(renderVertexBuffers);\r\n }\r\n\r\n /** @internal */\r\n public createParticleBuffer(data: number[]): DataArray | DataBuffer {\r\n const buffer = new StorageBuffer(\r\n this._engine,\r\n data.length * 4,\r\n Constants.BUFFER_CREATIONFLAG_READWRITE | Constants.BUFFER_CREATIONFLAG_VERTEX,\r\n \"ComputeShaderParticleSystemBuffer\"\r\n );\r\n\r\n buffer.update(data);\r\n this._bufferComputeShader.push(buffer);\r\n\r\n return buffer.getBuffer();\r\n }\r\n\r\n /** @internal */\r\n public bindDrawBuffers(index: number, effect: Effect, indexBuffer: Nullable<DataBuffer>): void {\r\n this._engine.bindBuffers(this._renderVertexBuffers[index], indexBuffer, effect);\r\n }\r\n\r\n /** @internal */\r\n public preUpdateParticleBuffer(): void {}\r\n\r\n /** @internal */\r\n public updateParticleBuffer(index: number, targetBuffer: Buffer, currentActiveCount: number): void {\r\n this._simParamsComputeShader.update();\r\n\r\n this._updateComputeShader.setTexture(\"randomTexture\", this._parent._randomTexture, false);\r\n this._updateComputeShader.setTexture(\"randomTexture2\", this._parent._randomTexture2, false);\r\n if (this._parent._sizeGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"sizeGradientTexture\", this._parent._sizeGradientsTexture);\r\n }\r\n\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"angularSpeedGradientTexture\", this._parent._angularSpeedGradientsTexture);\r\n }\r\n\r\n if (this._parent._velocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"velocityGradientTexture\", this._parent._velocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"limitVelocityGradientTexture\", this._parent._limitVelocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._dragGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"dragGradientTexture\", this._parent._dragGradientsTexture);\r\n }\r\n\r\n if (this._parent.noiseTexture) {\r\n this._updateComputeShader.setTexture(\"noiseTexture\", this._parent.noiseTexture);\r\n }\r\n\r\n if (this._parent.flowMap) {\r\n this._updateComputeShader.setTexture(\"flowMapTexture\", this._parent.flowMap);\r\n }\r\n\r\n this._updateComputeShader.setStorageBuffer(\"particlesIn\", this._bufferComputeShader[index]);\r\n this._updateComputeShader.setStorageBuffer(\"particlesOut\", this._bufferComputeShader[index ^ 1]);\r\n\r\n this._updateComputeShader.dispatch(Math.ceil(currentActiveCount / 64));\r\n }\r\n\r\n /** @internal */\r\n public releaseBuffers(): void {\r\n for (let i = 0; i < this._bufferComputeShader.length; ++i) {\r\n this._bufferComputeShader[i].dispose();\r\n }\r\n\r\n this._bufferComputeShader.length = 0;\r\n\r\n this._simParamsComputeShader?.dispose();\r\n (<any>this._simParamsComputeShader) = null;\r\n\r\n (<any>this._updateComputeShader) = null;\r\n }\r\n\r\n /** @internal */\r\n public releaseVertexBuffers(): void {\r\n this._renderVertexBuffers.length = 0;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ComputeShaderParticleSystem\", ComputeShaderParticleSystem);\r\n"]}
@@ -38,6 +38,10 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
38
38
  private _maxActiveParticleCount;
39
39
  private _currentActiveCount;
40
40
  private _accumulatedCount;
41
+ private _writePointer;
42
+ private _emitIndex;
43
+ private _emitCount;
44
+ private _emitRateControl;
41
45
  private _updateBuffer;
42
46
  private _buffer0;
43
47
  private _buffer1;
@@ -93,6 +97,15 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
93
97
  * @returns The max number of active particles.
94
98
  */
95
99
  getCapacity(): number;
100
+ /**
101
+ * Gets whether emit rate control is enabled.
102
+ * When true, the GPU particle system limits the number of active particles
103
+ * to approximately emitRate * maxLifeTime (matching CPU particle behavior)
104
+ * and uses a circular buffer to recycle particle slots.
105
+ * When false (default), all dead particles are recycled immediately,
106
+ * which is the legacy GPU particle behavior.
107
+ */
108
+ get emitRateControl(): boolean;
96
109
  /**
97
110
  * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls
98
111
  * to override the particles.
@@ -460,6 +473,7 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
460
473
  constructor(name: string, options: Partial<{
461
474
  capacity: number;
462
475
  randomTextureSize: number;
476
+ emitRateControl: boolean;
463
477
  }>, sceneOrEngine: Scene | AbstractEngine, customEffect?: Nullable<Effect>, isAnimationSheetEnabled?: boolean);
464
478
  protected _reset(): void;
465
479
  private _createVertexBuffers;
@@ -48,6 +48,17 @@ export class GPUParticleSystem extends BaseParticleSystem {
48
48
  getCapacity() {
49
49
  return this._capacity;
50
50
  }
51
+ /**
52
+ * Gets whether emit rate control is enabled.
53
+ * When true, the GPU particle system limits the number of active particles
54
+ * to approximately emitRate * maxLifeTime (matching CPU particle behavior)
55
+ * and uses a circular buffer to recycle particle slots.
56
+ * When false (default), all dead particles are recycled immediately,
57
+ * which is the legacy GPU particle behavior.
58
+ */
59
+ get emitRateControl() {
60
+ return this._emitRateControl;
61
+ }
51
62
  /**
52
63
  * Gets or set the number of active particles
53
64
  * The value cannot be greater than "capacity" (if it is, it will be limited to "capacity").
@@ -285,6 +296,10 @@ export class GPUParticleSystem extends BaseParticleSystem {
285
296
  this._platform.releaseVertexBuffers();
286
297
  this._currentActiveCount = 0;
287
298
  this._targetIndex = 0;
299
+ this._writePointer = 0;
300
+ this._emitIndex = 0;
301
+ this._emitCount = 0;
302
+ this._accumulatedCount = 0;
288
303
  }
289
304
  /**
290
305
  * Returns the string "GPUParticleSystem"
@@ -697,6 +712,9 @@ export class GPUParticleSystem extends BaseParticleSystem {
697
712
  */
698
713
  this.layerMask = 0x0fffffff;
699
714
  this._accumulatedCount = 0;
715
+ this._writePointer = 0;
716
+ this._emitIndex = 0;
717
+ this._emitCount = 0;
700
718
  this._renderVertexBuffers = [];
701
719
  this._targetIndex = 0;
702
720
  this._currentRenderId = -1;
@@ -798,6 +816,7 @@ export class GPUParticleSystem extends BaseParticleSystem {
798
816
  this._maxActiveParticleCount = fullOptions.capacity;
799
817
  this._currentActiveCount = 0;
800
818
  this._isAnimationSheetEnabled = isAnimationSheetEnabled;
819
+ this._emitRateControl = !!options.emitRateControl;
801
820
  this.particleEmitterType = new BoxParticleEmitter();
802
821
  // Random data
803
822
  const maxTextureSize = Math.min(this._engine.getCaps().maxTextureSize, fullOptions.randomTextureSize);
@@ -887,7 +906,6 @@ export class GPUParticleSystem extends BaseParticleSystem {
887
906
  offset += 1;
888
907
  if (this.spriteRandomStartCell) {
889
908
  renderVertexBuffers["cellStartOffset"] = renderBuffer.createVertexBuffer("cellStartOffset", offset, 1, this._attributesStrideSize, true);
890
- offset += 1;
891
909
  }
892
910
  }
893
911
  renderVertexBuffers["offset"] = spriteSource.createVertexBuffer("offset", 0, 2);
@@ -1105,6 +1123,9 @@ export class GPUParticleSystem extends BaseParticleSystem {
1105
1123
  if (this.isLocal) {
1106
1124
  defines += "\n#define LOCAL";
1107
1125
  }
1126
+ if (this._emitRateControl) {
1127
+ defines += "\n#define EMITRATECTRL";
1128
+ }
1108
1129
  if (this._platform.isUpdateBufferCreated() && this._cachedUpdateDefines === defines) {
1109
1130
  return this._platform.isUpdateBufferReady();
1110
1131
  }
@@ -1223,6 +1244,9 @@ export class GPUParticleSystem extends BaseParticleSystem {
1223
1244
  if (this.isAnimationSheetEnabled) {
1224
1245
  defines.push("#define ANIMATESHEET");
1225
1246
  }
1247
+ if (this._emitRateControl) {
1248
+ defines.push("#define EMITRATECTRL");
1249
+ }
1226
1250
  if (fillImageProcessing && this._imageProcessingConfiguration) {
1227
1251
  this._imageProcessingConfiguration.prepareDefines(this._imageProcessingConfigurationDefines);
1228
1252
  defines.push("" + this._imageProcessingConfigurationDefines.toString());
@@ -1403,6 +1427,8 @@ export class GPUParticleSystem extends BaseParticleSystem {
1403
1427
  this._updateBuffer.setFloat("currentCount", this._currentActiveCount);
1404
1428
  this._updateBuffer.setFloat("timeDelta", this._timeDelta);
1405
1429
  this._updateBuffer.setFloat("stopFactor", this._stopped ? 0 : 1);
1430
+ this._updateBuffer.setFloat("emitIndex", this._emitIndex);
1431
+ this._updateBuffer.setFloat("emitCount", this._emitCount);
1406
1432
  this._updateBuffer.setInt("randomTextureSize", this._randomTextureSize);
1407
1433
  this._updateBuffer.setFloat2("lifeTime", this.minLifeTime, this.maxLifeTime);
1408
1434
  this._updateBuffer.setFloat2("emitPower", this.minEmitPower, this.maxEmitPower);
@@ -1478,19 +1504,70 @@ export class GPUParticleSystem extends BaseParticleSystem {
1478
1504
  }
1479
1505
  // Get everything ready to render
1480
1506
  this._initialize();
1481
- if (this.manualEmitCount > -1) {
1482
- this._accumulatedCount += this.manualEmitCount;
1483
- this.manualEmitCount = 0;
1507
+ if (this._emitRateControl) {
1508
+ // Emit-rate-controlled mode: limits active particles to ~emitRate * maxLifeTime,
1509
+ // matching CPU particle behavior with circular buffer recycling.
1510
+ // Accumulate fractional particles over time. Manual emit bypasses the rate.
1511
+ if (this.manualEmitCount > -1) {
1512
+ this._accumulatedCount += this.manualEmitCount;
1513
+ this.manualEmitCount = 0;
1514
+ }
1515
+ else if (!this._stopped) {
1516
+ this._accumulatedCount += this.emitRate * this._timeDelta;
1517
+ }
1518
+ // Convert accumulated fractional count into whole particles to emit this frame.
1519
+ // The fractional remainder carries over to the next frame.
1520
+ let newParticles = 0;
1521
+ if (this._accumulatedCount >= 1) {
1522
+ newParticles = this._accumulatedCount | 0;
1523
+ this._accumulatedCount -= newParticles;
1524
+ }
1525
+ // The maximum number of particles that can be alive at once is bounded by
1526
+ // emitRate * maxLifeTime (e.g. 1000 emit/s * 0.3s = 300 particles).
1527
+ // This matches CPU particle system behavior and avoids filling the entire capacity.
1528
+ // When emitRate is 0 but manualEmitCount is used, the rate-based steady state
1529
+ // would be 0, blocking buffer growth. Use newParticles as a floor so manual
1530
+ // emissions can always allocate slots.
1531
+ const steadyStateCount = Math.min(Math.max(Math.ceil(this.emitRate * this.maxLifeTime), newParticles), this._maxActiveParticleCount);
1532
+ // During ramp-up, grow the active buffer size by adding new slots.
1533
+ // Once _currentActiveCount reaches steadyStateCount, no new slots are added —
1534
+ // existing slots are recycled instead (handled by _emitIndex below).
1535
+ if (this._currentActiveCount < steadyStateCount && newParticles > 0) {
1536
+ const growth = Math.min(newParticles, steadyStateCount - this._currentActiveCount);
1537
+ this._currentActiveCount += growth;
1538
+ }
1539
+ // Tell the update shader which particle slots to (re)initialize this frame.
1540
+ // _emitIndex is where the circular write pointer starts in the buffer,
1541
+ // _emitCount is how many consecutive slots to reinitialize (with wrapping).
1542
+ // The shader checks each particle's index against this range to decide
1543
+ // whether to recycle it (emit branch) or advance its simulation (update branch).
1544
+ if (this._currentActiveCount > 0 && newParticles > 0) {
1545
+ this._emitCount = Math.min(newParticles, this._currentActiveCount);
1546
+ this._emitIndex = this._writePointer % this._currentActiveCount;
1547
+ this._writePointer += this._emitCount;
1548
+ }
1549
+ else {
1550
+ this._emitCount = 0;
1551
+ }
1484
1552
  }
1485
1553
  else {
1486
- this._accumulatedCount += this.emitRate * this._timeDelta;
1487
- }
1488
- if (this._accumulatedCount >= 1) {
1489
- const intPart = this._accumulatedCount | 0;
1490
- this._accumulatedCount -= intPart;
1491
- this._currentActiveCount += intPart;
1554
+ // Legacy mode: dead particles recycle immediately, filling up to capacity.
1555
+ if (this.manualEmitCount > -1) {
1556
+ this._accumulatedCount += this.manualEmitCount;
1557
+ this.manualEmitCount = 0;
1558
+ }
1559
+ else {
1560
+ this._accumulatedCount += this.emitRate * this._timeDelta;
1561
+ }
1562
+ if (this._accumulatedCount >= 1) {
1563
+ const intPart = this._accumulatedCount | 0;
1564
+ this._accumulatedCount -= intPart;
1565
+ this._currentActiveCount += intPart;
1566
+ }
1567
+ this._currentActiveCount = Math.min(this._maxActiveParticleCount, this._currentActiveCount);
1568
+ this._emitIndex = 0;
1569
+ this._emitCount = 0;
1492
1570
  }
1493
- this._currentActiveCount = Math.min(this._maxActiveParticleCount, this._currentActiveCount);
1494
1571
  if (!this._currentActiveCount) {
1495
1572
  return 0;
1496
1573
  }
@@ -1672,6 +1749,7 @@ export class GPUParticleSystem extends BaseParticleSystem {
1672
1749
  ParticleSystem._Serialize(serializationObject, this, serializeTexture);
1673
1750
  serializationObject.activeParticleCount = this.activeParticleCount;
1674
1751
  serializationObject.randomTextureSize = this._randomTextureSize;
1752
+ serializationObject.emitRateControl = this._emitRateControl;
1675
1753
  serializationObject.customShader = this.customShader;
1676
1754
  serializationObject.preventAutoStart = this.preventAutoStart;
1677
1755
  serializationObject.worldOffset = this.worldOffset.asArray();
@@ -1700,7 +1778,11 @@ export class GPUParticleSystem extends BaseParticleSystem {
1700
1778
  scene = sceneOrEngine;
1701
1779
  engine = scene.getEngine();
1702
1780
  }
1703
- const particleSystem = new GPUParticleSystem(name, { capacity: capacity || parsedParticleSystem.capacity, randomTextureSize: parsedParticleSystem.randomTextureSize }, sceneOrEngine, null, parsedParticleSystem.isAnimationSheetEnabled);
1781
+ const particleSystem = new GPUParticleSystem(name, {
1782
+ capacity: capacity || parsedParticleSystem.capacity,
1783
+ randomTextureSize: parsedParticleSystem.randomTextureSize,
1784
+ emitRateControl: parsedParticleSystem.emitRateControl,
1785
+ }, sceneOrEngine, null, parsedParticleSystem.isAnimationSheetEnabled);
1704
1786
  particleSystem._rootUrl = rootUrl;
1705
1787
  if (parsedParticleSystem.customShader && engine.createEffectForParticles) {
1706
1788
  const program = parsedParticleSystem.customShader;