@onerjs/core 8.48.3 → 8.48.5

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 (118) hide show
  1. package/Cameras/Inputs/geospatialCameraPointersInput.js +10 -8
  2. package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
  3. package/Cameras/geospatialCameraMovement.js +2 -2
  4. package/Cameras/geospatialCameraMovement.js.map +1 -1
  5. package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.d.ts +105 -0
  6. package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js +318 -0
  7. package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js.map +1 -0
  8. package/FrameGraph/Node/Blocks/index.d.ts +1 -0
  9. package/FrameGraph/Node/Blocks/index.js +1 -0
  10. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  11. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +34 -0
  12. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +144 -0
  13. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -0
  14. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.d.ts +26 -0
  15. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js +82 -0
  16. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js.map +1 -0
  17. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.d.ts +61 -0
  18. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js +207 -0
  19. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js.map +1 -0
  20. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.d.ts +104 -0
  21. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js +218 -0
  22. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js.map +1 -0
  23. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.d.ts +217 -0
  24. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js +640 -0
  25. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js.map +1 -0
  26. package/FrameGraph/frameGraph.js +1 -0
  27. package/FrameGraph/frameGraph.js.map +1 -1
  28. package/FrameGraph/index.d.ts +1 -0
  29. package/FrameGraph/index.js +1 -0
  30. package/FrameGraph/index.js.map +1 -1
  31. package/Materials/PBR/openpbrMaterial.d.ts +13 -2
  32. package/Materials/PBR/openpbrMaterial.js +47 -16
  33. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  34. package/Materials/PBR/pbrBRDFConfiguration.js +1 -1
  35. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  36. package/Materials/Textures/Filtering/hdrFiltering.js +6 -0
  37. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  38. package/Materials/Textures/envCubeTexture.js +13 -13
  39. package/Materials/Textures/envCubeTexture.js.map +1 -1
  40. package/Materials/materialHelper.functions.js +1 -1
  41. package/Materials/materialHelper.functions.js.map +1 -1
  42. package/Meshes/instancedMesh.js +44 -42
  43. package/Meshes/instancedMesh.js.map +1 -1
  44. package/Misc/textureTools.d.ts +3 -1
  45. package/Misc/textureTools.js +74 -13
  46. package/Misc/textureTools.js.map +1 -1
  47. package/Particles/baseParticleSystem.d.ts +33 -1
  48. package/Particles/baseParticleSystem.js +65 -0
  49. package/Particles/baseParticleSystem.js.map +1 -1
  50. package/Particles/computeShaderParticleSystem.js +6 -0
  51. package/Particles/computeShaderParticleSystem.js.map +1 -1
  52. package/Particles/gpuParticleSystem.d.ts +24 -6
  53. package/Particles/gpuParticleSystem.js +85 -36
  54. package/Particles/gpuParticleSystem.js.map +1 -1
  55. package/Particles/particleSystem.d.ts +0 -7
  56. package/Particles/particleSystem.js +3 -15
  57. package/Particles/particleSystem.js.map +1 -1
  58. package/Particles/thinParticleSystem.d.ts +1 -3
  59. package/Particles/thinParticleSystem.js +1 -27
  60. package/Particles/thinParticleSystem.js.map +1 -1
  61. package/Particles/webgl2ParticleSystem.js +7 -0
  62. package/Particles/webgl2ParticleSystem.js.map +1 -1
  63. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +1 -1
  64. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  65. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +3 -1
  66. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +11 -1
  67. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  68. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +0 -19
  69. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +21 -65
  70. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  71. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +15 -52
  72. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +129 -220
  73. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  74. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -0
  75. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  76. package/Rendering/geometryBufferRenderer.d.ts +14 -5
  77. package/Rendering/geometryBufferRenderer.js +6 -2
  78. package/Rendering/geometryBufferRenderer.js.map +1 -1
  79. package/Rendering/geometryBufferRendererSceneComponent.d.ts +4 -6
  80. package/Rendering/geometryBufferRendererSceneComponent.js.map +1 -1
  81. package/Rendering/iblCdfGenerator.d.ts +10 -0
  82. package/Rendering/iblCdfGenerator.js +52 -17
  83. package/Rendering/iblCdfGenerator.js.map +1 -1
  84. package/Rendering/index.d.ts +0 -6
  85. package/Rendering/index.js +0 -6
  86. package/Rendering/index.js.map +1 -1
  87. package/Shaders/ShadersInclude/openpbrDirectLighting.js +6 -1
  88. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  89. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
  90. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  91. package/Shaders/gpuUpdateParticles.vertex.js +12 -6
  92. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  93. package/Shaders/iblShadowVoxelTracing.fragment.js +5 -1
  94. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  95. package/Shaders/iblVoxelGrid.fragment.d.ts +1 -0
  96. package/Shaders/iblVoxelGrid.fragment.js +33 -5
  97. package/Shaders/iblVoxelGrid.fragment.js.map +1 -1
  98. package/Shaders/lod3D.fragment.d.ts +5 -0
  99. package/Shaders/lod3D.fragment.js +13 -0
  100. package/Shaders/lod3D.fragment.js.map +1 -0
  101. package/Shaders/openpbr.fragment.js +5 -0
  102. package/Shaders/openpbr.fragment.js.map +1 -1
  103. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +6 -1
  104. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  105. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
  106. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  107. package/ShadersWGSL/gpuUpdateParticles.compute.js +14 -7
  108. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  109. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +5 -1
  110. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  111. package/ShadersWGSL/iblVoxelGrid.fragment.js +1 -1
  112. package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
  113. package/ShadersWGSL/lod3D.fragment.d.ts +5 -0
  114. package/ShadersWGSL/lod3D.fragment.js +13 -0
  115. package/ShadersWGSL/lod3D.fragment.js.map +1 -0
  116. package/ShadersWGSL/openpbr.fragment.js +5 -0
  117. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  118. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"computeShaderParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/computeShaderParticleSystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAO3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,iCAAiC,EAAE,MAAM,gDAAgD,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,2CAA2C,CAAC;AAEnD,gBAAgB;AAChB,MAAM,OAAO,2BAA2B;IAWpC,gBAAgB;IAChB,YAAY,MAAyB,EAAE,MAAoB;QAPnD,yBAAoB,GAAoB,EAAE,CAAC;QAC3C,yBAAoB,GAA2C,EAAE,CAAC;QAE1E,gBAAgB;QACA,sBAAiB,GAAG,IAAI,CAAC;QAIrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACT,WAAW;QACd,IAAI,CAAC,oBAAoB,GAAG,SAAgB,CAAC;QAC7C,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB;IACT,qBAAqB;QACxB,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;IACvC,CAAC;IAED,gBAAgB;IACT,mBAAmB;QACtB,OAAO,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC;IACzD,CAAC;IAED,gBAAgB;IACT,kBAAkB,CAAC,OAAe;QACrC,MAAM,eAAe,GAA0B;YAC3C,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YAChC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACrC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACtC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACvC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;SAC3C,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACrC,eAAe,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC;YAC7C,eAAe,CAAC,6BAA6B,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;YACzC,eAAe,CAAC,yBAAyB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;YAC9C,eAAe,CAAC,8BAA8B,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACrC,eAAe,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5B,eAAe,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,IAAI,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExJ,IAAI,CAAC,uBAAuB,EAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,uBAAuB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gCAAgC,CAAC,CAAC;QAEvH,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;YACvC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;YAC9C,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;YACvC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEnF,OAAO,IAAI,iCAAiC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAED,gBAAgB;IACT,mBAAmB,CAAC,YAAoB,EAAE,mBAAoD;QACjG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB;IACT,oBAAoB,CAAC,IAAc;QACtC,MAAM,MAAM,GAAG,IAAI,aAAa,CAC5B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,GAAG,CAAC,EACf,SAAS,CAAC,6BAA6B,GAAG,SAAS,CAAC,0BAA0B,EAC9E,mCAAmC,CACtC,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED,gBAAgB;IACT,eAAe,CAAC,KAAa,EAAE,MAAc,EAAE,WAAiC;QACnF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED,gBAAgB;IACT,uBAAuB,KAAU,CAAC;IAEzC,gBAAgB;IACT,oBAAoB,CAAC,KAAa,EAAE,YAAoB,EAAE,kBAA0B;QACvF,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;QAEtC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC1F,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACrC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACpG,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC;YAC7C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,6BAA6B,EAAE,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACpH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;YACzC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC5G,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;YAC9C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,8BAA8B,EAAE,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACtH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACrC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACpG,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,gBAAgB;IACT,cAAc;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,uBAAuB,EAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,uBAAwB,GAAG,IAAI,CAAC;QAErC,IAAI,CAAC,oBAAqB,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,gBAAgB;IACT,oBAAoB;QACvB,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,CAAC;CACJ;AAED,aAAa,CAAC,qCAAqC,EAAE,2BAA2B,CAAC,CAAC","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, type VertexBuffer } from \"../Buffers/buffer\";\r\nimport { type GPUParticleSystem } from \"./gpuParticleSystem\";\r\n\r\nimport { type DataArray, type 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"]}
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, type VertexBuffer } from \"../Buffers/buffer\";\r\nimport { type GPUParticleSystem } from \"./gpuParticleSystem\";\r\n\r\nimport { type DataArray, type 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.attractors.length > 0) {\r\n this._simParamsComputeShader.addUniform(\"attractorCount\", 1);\r\n for (let i = 0; i < this._parent.maxAttractors; i++) {\r\n this._simParamsComputeShader.addUniform(\"attractorPositionAndStrength[\" + i + \"]\", 4);\r\n }\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"]}
@@ -6,6 +6,7 @@ import { Color4 } from "../Maths/math.color.js";
6
6
  import { VertexBuffer } from "../Buffers/buffer.js";
7
7
  import { type IParticleSystem } from "./IParticleSystem.js";
8
8
  import { BaseParticleSystem } from "./baseParticleSystem.js";
9
+ import { Attractor } from "./attractor.js";
9
10
  import { BoxParticleEmitter } from "../Particles/EmitterTypes/boxParticleEmitter.js";
10
11
  import { type IDisposable, Scene } from "../scene.js";
11
12
  import { type Effect } from "../Materials/effect.js";
@@ -129,6 +130,18 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
129
130
  isLocal: boolean;
130
131
  /** Indicates that the particle system is GPU based */
131
132
  readonly isGPU = true;
133
+ /** Attractors */
134
+ /**
135
+ * Maximum number of attractors for this GPU particle system instance.
136
+ * Determined at construction time via the `maxAttractors` option (default 8).
137
+ * Limited by the fixed-size uniform arrays in the update shaders.
138
+ */
139
+ readonly maxAttractors: number;
140
+ /**
141
+ * Add an attractor to the particle system. Attractors are used to change the direction of the particles in the system.
142
+ * @param attractor - The attractor to add to the particle system
143
+ */
144
+ addAttractor(attractor: Attractor): void;
132
145
  /** Gets or sets a matrix to use to compute projection */
133
146
  defaultProjectionMatrix: Matrix;
134
147
  /**
@@ -321,14 +334,14 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
321
334
  _limitVelocityGradientsTexture: RawTexture;
322
335
  /** @internal */
323
336
  _dragGradientsTexture: RawTexture;
324
- private _addFactorGradient;
325
337
  /**
326
338
  * Adds a new size gradient
327
339
  * @param gradient defines the gradient to use (between 0 and 1)
328
340
  * @param factor defines the size factor to affect to the specified gradient
341
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
329
342
  * @returns the current particle system
330
343
  */
331
- addSizeGradient(gradient: number, factor: number): GPUParticleSystem;
344
+ addSizeGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
332
345
  /**
333
346
  * Remove a specific size gradient
334
347
  * @param gradient defines the gradient to remove
@@ -340,9 +353,10 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
340
353
  * Adds a new angular speed gradient
341
354
  * @param gradient defines the gradient to use (between 0 and 1)
342
355
  * @param factor defines the angular speed to affect to the specified gradient
356
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
343
357
  * @returns the current particle system
344
358
  */
345
- addAngularSpeedGradient(gradient: number, factor: number): GPUParticleSystem;
359
+ addAngularSpeedGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
346
360
  /**
347
361
  * Remove a specific angular speed gradient
348
362
  * @param gradient defines the gradient to remove
@@ -353,9 +367,10 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
353
367
  * Adds a new velocity gradient
354
368
  * @param gradient defines the gradient to use (between 0 and 1)
355
369
  * @param factor defines the velocity to affect to the specified gradient
370
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
356
371
  * @returns the current particle system
357
372
  */
358
- addVelocityGradient(gradient: number, factor: number): GPUParticleSystem;
373
+ addVelocityGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
359
374
  /**
360
375
  * Remove a specific velocity gradient
361
376
  * @param gradient defines the gradient to remove
@@ -366,9 +381,10 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
366
381
  * Adds a new limit velocity gradient
367
382
  * @param gradient defines the gradient to use (between 0 and 1)
368
383
  * @param factor defines the limit velocity value to affect to the specified gradient
384
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
369
385
  * @returns the current particle system
370
386
  */
371
- addLimitVelocityGradient(gradient: number, factor: number): GPUParticleSystem;
387
+ addLimitVelocityGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
372
388
  /**
373
389
  * Remove a specific limit velocity gradient
374
390
  * @param gradient defines the gradient to remove
@@ -379,9 +395,10 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
379
395
  * Adds a new drag gradient
380
396
  * @param gradient defines the gradient to use (between 0 and 1)
381
397
  * @param factor defines the drag value to affect to the specified gradient
398
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
382
399
  * @returns the current particle system
383
400
  */
384
- addDragGradient(gradient: number, factor: number): GPUParticleSystem;
401
+ addDragGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
385
402
  /**
386
403
  * Remove a specific drag gradient
387
404
  * @param gradient defines the gradient to remove
@@ -473,6 +490,7 @@ export declare class GPUParticleSystem extends BaseParticleSystem implements IDi
473
490
  capacity: number;
474
491
  randomTextureSize: number;
475
492
  emitRateControl: boolean;
493
+ maxAttractors: number;
476
494
  }>, sceneOrEngine: Scene | AbstractEngine, customEffect?: Nullable<Effect>, isAnimationSheetEnabled?: boolean);
477
495
  protected _reset(): void;
478
496
  private _createVertexBuffers;
@@ -1,4 +1,4 @@
1
- import { FactorGradient, ColorGradient, GradientHelper } from "../Misc/gradients.js";
1
+ import { ColorGradient, GradientHelper } from "../Misc/gradients.js";
2
2
  import { Observable } from "../Misc/observable.js";
3
3
  import { Vector3, Matrix, TmpVectors } from "../Maths/math.vector.js";
4
4
  import { Color4, TmpColors } from "../Maths/math.color.js";
@@ -6,6 +6,8 @@ import { Lerp } from "../Maths/math.scalar.functions.js";
6
6
  import { VertexBuffer, Buffer } from "../Buffers/buffer.js";
7
7
  import { BaseParticleSystem } from "./baseParticleSystem.js";
8
8
  import { ParticleSystem } from "./particleSystem.js";
9
+ import { Attractor } from "./attractor.js";
10
+ import { Logger } from "../Misc/logger.js";
9
11
  import { BoxParticleEmitter } from "../Particles/EmitterTypes/boxParticleEmitter.js";
10
12
  import { Scene } from "../scene.js";
11
13
  import { ImageProcessingConfiguration } from "../Materials/imageProcessingConfiguration.js";
@@ -79,6 +81,17 @@ export class GPUParticleSystem extends BaseParticleSystem {
79
81
  set activeParticleCount(value) {
80
82
  this.maxActiveParticleCount = value;
81
83
  }
84
+ /**
85
+ * Add an attractor to the particle system. Attractors are used to change the direction of the particles in the system.
86
+ * @param attractor - The attractor to add to the particle system
87
+ */
88
+ addAttractor(attractor) {
89
+ if (this._attractors.length >= this.maxAttractors) {
90
+ Logger.Warn(`GPU particle system supports a maximum of ${this.maxAttractors} attractors. Ignoring additional attractor.`);
91
+ return;
92
+ }
93
+ super.addAttractor(attractor);
94
+ }
82
95
  /**
83
96
  * Creates a Point Emitter for the particle system (emits directly from the emitter position)
84
97
  * @param direction1 Particles are emitted between the direction1 and direction2 from within the box
@@ -430,23 +443,19 @@ export class GPUParticleSystem extends BaseParticleSystem {
430
443
  drawWrapper.drawContext?.reset();
431
444
  }
432
445
  }
433
- _addFactorGradient(factorGradients, gradient, factor) {
434
- const valueGradient = new FactorGradient(gradient, factor);
435
- factorGradients.push(valueGradient);
436
- this._releaseBuffers();
437
- }
438
446
  /**
439
447
  * Adds a new size gradient
440
448
  * @param gradient defines the gradient to use (between 0 and 1)
441
449
  * @param factor defines the size factor to affect to the specified gradient
450
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
442
451
  * @returns the current particle system
443
452
  */
444
- addSizeGradient(gradient, factor) {
453
+ addSizeGradient(gradient, factor, factor2) {
445
454
  if (!this._sizeGradients) {
446
455
  this._sizeGradients = [];
447
456
  }
448
- this._addFactorGradient(this._sizeGradients, gradient, factor);
449
- this._refreshFactorGradient(this._sizeGradients, "_sizeGradientsTexture", true);
457
+ this._addFactorGradient(this._sizeGradients, gradient, factor, factor2);
458
+ this._refreshFactorGradient(this._sizeGradients, "_sizeGradientsTexture");
450
459
  this._releaseBuffers();
451
460
  return this;
452
461
  }
@@ -460,21 +469,10 @@ export class GPUParticleSystem extends BaseParticleSystem {
460
469
  this._sizeGradientsTexture = null;
461
470
  return this;
462
471
  }
463
- _refreshFactorGradient(factorGradients, textureName, reorder = false) {
472
+ _refreshFactorGradient(factorGradients, textureName) {
464
473
  if (!factorGradients) {
465
474
  return;
466
475
  }
467
- if (reorder) {
468
- factorGradients.sort((a, b) => {
469
- if (a.gradient < b.gradient) {
470
- return -1;
471
- }
472
- else if (a.gradient > b.gradient) {
473
- return 1;
474
- }
475
- return 0;
476
- });
477
- }
478
476
  const that = this;
479
477
  if (that[textureName]) {
480
478
  that[textureName].dispose();
@@ -485,14 +483,15 @@ export class GPUParticleSystem extends BaseParticleSystem {
485
483
  * Adds a new angular speed gradient
486
484
  * @param gradient defines the gradient to use (between 0 and 1)
487
485
  * @param factor defines the angular speed to affect to the specified gradient
486
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
488
487
  * @returns the current particle system
489
488
  */
490
- addAngularSpeedGradient(gradient, factor) {
489
+ addAngularSpeedGradient(gradient, factor, factor2) {
491
490
  if (!this._angularSpeedGradients) {
492
491
  this._angularSpeedGradients = [];
493
492
  }
494
- this._addFactorGradient(this._angularSpeedGradients, gradient, factor);
495
- this._refreshFactorGradient(this._angularSpeedGradients, "_angularSpeedGradientsTexture", true);
493
+ this._addFactorGradient(this._angularSpeedGradients, gradient, factor, factor2);
494
+ this._refreshFactorGradient(this._angularSpeedGradients, "_angularSpeedGradientsTexture");
496
495
  this._releaseBuffers();
497
496
  return this;
498
497
  }
@@ -510,14 +509,15 @@ export class GPUParticleSystem extends BaseParticleSystem {
510
509
  * Adds a new velocity gradient
511
510
  * @param gradient defines the gradient to use (between 0 and 1)
512
511
  * @param factor defines the velocity to affect to the specified gradient
512
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
513
513
  * @returns the current particle system
514
514
  */
515
- addVelocityGradient(gradient, factor) {
515
+ addVelocityGradient(gradient, factor, factor2) {
516
516
  if (!this._velocityGradients) {
517
517
  this._velocityGradients = [];
518
518
  }
519
- this._addFactorGradient(this._velocityGradients, gradient, factor);
520
- this._refreshFactorGradient(this._velocityGradients, "_velocityGradientsTexture", true);
519
+ this._addFactorGradient(this._velocityGradients, gradient, factor, factor2);
520
+ this._refreshFactorGradient(this._velocityGradients, "_velocityGradientsTexture");
521
521
  this._releaseBuffers();
522
522
  return this;
523
523
  }
@@ -535,14 +535,15 @@ export class GPUParticleSystem extends BaseParticleSystem {
535
535
  * Adds a new limit velocity gradient
536
536
  * @param gradient defines the gradient to use (between 0 and 1)
537
537
  * @param factor defines the limit velocity value to affect to the specified gradient
538
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
538
539
  * @returns the current particle system
539
540
  */
540
- addLimitVelocityGradient(gradient, factor) {
541
+ addLimitVelocityGradient(gradient, factor, factor2) {
541
542
  if (!this._limitVelocityGradients) {
542
543
  this._limitVelocityGradients = [];
543
544
  }
544
- this._addFactorGradient(this._limitVelocityGradients, gradient, factor);
545
- this._refreshFactorGradient(this._limitVelocityGradients, "_limitVelocityGradientsTexture", true);
545
+ this._addFactorGradient(this._limitVelocityGradients, gradient, factor, factor2);
546
+ this._refreshFactorGradient(this._limitVelocityGradients, "_limitVelocityGradientsTexture");
546
547
  this._releaseBuffers();
547
548
  return this;
548
549
  }
@@ -560,14 +561,15 @@ export class GPUParticleSystem extends BaseParticleSystem {
560
561
  * Adds a new drag gradient
561
562
  * @param gradient defines the gradient to use (between 0 and 1)
562
563
  * @param factor defines the drag value to affect to the specified gradient
564
+ * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
563
565
  * @returns the current particle system
564
566
  */
565
- addDragGradient(gradient, factor) {
567
+ addDragGradient(gradient, factor, factor2) {
566
568
  if (!this._dragGradients) {
567
569
  this._dragGradients = [];
568
570
  }
569
- this._addFactorGradient(this._dragGradients, gradient, factor);
570
- this._refreshFactorGradient(this._dragGradients, "_dragGradientsTexture", true);
571
+ this._addFactorGradient(this._dragGradients, gradient, factor, factor2);
572
+ this._refreshFactorGradient(this._dragGradients, "_dragGradientsTexture");
571
573
  this._releaseBuffers();
572
574
  return this;
573
575
  }
@@ -817,6 +819,7 @@ export class GPUParticleSystem extends BaseParticleSystem {
817
819
  this._currentActiveCount = 0;
818
820
  this._isAnimationSheetEnabled = isAnimationSheetEnabled;
819
821
  this._emitRateControl = !!options.emitRateControl;
822
+ this.maxAttractors = options.maxAttractors ?? 8;
820
823
  this.particleEmitterType = new BoxParticleEmitter();
821
824
  // Random data
822
825
  const maxTextureSize = Math.min(this._engine.getCaps().maxTextureSize, fullOptions.randomTextureSize);
@@ -1123,6 +1126,10 @@ export class GPUParticleSystem extends BaseParticleSystem {
1123
1126
  if (this.isLocal) {
1124
1127
  defines += "\n#define LOCAL";
1125
1128
  }
1129
+ if (this._attractors.length > 0) {
1130
+ defines += "\n#define ATTRACTORS";
1131
+ defines += "\n#define MAX_ATTRACTORS " + this.maxAttractors;
1132
+ }
1126
1133
  if (this._emitRateControl) {
1127
1134
  defines += "\n#define EMITRATECTRL";
1128
1135
  }
@@ -1288,14 +1295,17 @@ export class GPUParticleSystem extends BaseParticleSystem {
1288
1295
  if (!factorGradients || !factorGradients.length || texture) {
1289
1296
  return;
1290
1297
  }
1291
- const data = new Float32Array(this._rawTextureWidth);
1298
+ const data = new Float32Array(this._rawTextureWidth * 2);
1292
1299
  for (let x = 0; x < this._rawTextureWidth; x++) {
1293
1300
  const ratio = x / this._rawTextureWidth;
1294
1301
  GradientHelper.GetCurrentGradient(ratio, factorGradients, (currentGradient, nextGradient, scale) => {
1295
- data[x] = Lerp(currentGradient.factor1, nextGradient.factor1, scale);
1302
+ const cg = currentGradient;
1303
+ const ng = nextGradient;
1304
+ data[x * 2] = Lerp(cg.factor1, ng.factor1, scale);
1305
+ data[x * 2 + 1] = Lerp(cg.factor2 ?? cg.factor1, ng.factor2 ?? ng.factor1, scale);
1296
1306
  });
1297
1307
  }
1298
- this[textureName] = RawTexture.CreateRTexture(data, this._rawTextureWidth, 1, this._scene || this._engine, false, false, 1);
1308
+ this[textureName] = new RawTexture(data, this._rawTextureWidth, 1, 7, this._scene || this._engine, false, false, 1, 1);
1299
1309
  this[textureName].name = textureName.substring(1);
1300
1310
  }
1301
1311
  _createSizeGradientTexture() {
@@ -1460,6 +1470,27 @@ export class GPUParticleSystem extends BaseParticleSystem {
1460
1470
  if (!this.isLocal) {
1461
1471
  this._updateBuffer.setMatrix("emitterWM", emitterWM);
1462
1472
  }
1473
+ if (this._attractors.length > 0) {
1474
+ this._updateBuffer.setInt("attractorCount", this._attractors.length);
1475
+ // Compute inverse world matrix once for all attractors when in local space
1476
+ let invWorld;
1477
+ if (this.isLocal) {
1478
+ invWorld = TmpVectors.Matrix[1];
1479
+ emitterWM.invertToRef(invWorld);
1480
+ }
1481
+ for (let i = 0; i < this._attractors.length; i++) {
1482
+ const attractor = this._attractors[i];
1483
+ const name = "attractorPositionAndStrength[" + i + "]";
1484
+ if (invWorld) {
1485
+ const localPos = TmpVectors.Vector3[0];
1486
+ Vector3.TransformCoordinatesToRef(attractor.position, invWorld, localPos);
1487
+ this._updateBuffer.setFloat4(name, localPos.x, localPos.y, localPos.z, attractor.strength);
1488
+ }
1489
+ else {
1490
+ this._updateBuffer.setFloat4(name, attractor.position.x, attractor.position.y, attractor.position.z, attractor.strength);
1491
+ }
1492
+ }
1493
+ }
1463
1494
  this._platform.updateParticleBuffer(this._targetIndex, this._targetBuffer, this._currentActiveCount);
1464
1495
  // Switch VAOs
1465
1496
  this._targetIndex++;
@@ -1750,12 +1781,20 @@ export class GPUParticleSystem extends BaseParticleSystem {
1750
1781
  serializationObject.activeParticleCount = this.activeParticleCount;
1751
1782
  serializationObject.randomTextureSize = this._randomTextureSize;
1752
1783
  serializationObject.emitRateControl = this._emitRateControl;
1784
+ serializationObject.maxAttractors = this.maxAttractors;
1753
1785
  serializationObject.customShader = this.customShader;
1754
1786
  serializationObject.preventAutoStart = this.preventAutoStart;
1755
1787
  serializationObject.worldOffset = this.worldOffset.asArray();
1756
1788
  if (this.metadata) {
1757
1789
  serializationObject.metadata = this.metadata;
1758
1790
  }
1791
+ // Attractors
1792
+ if (this._attractors.length > 0) {
1793
+ serializationObject.attractors = [];
1794
+ for (const attractor of this._attractors) {
1795
+ serializationObject.attractors.push(attractor.serialize());
1796
+ }
1797
+ }
1759
1798
  return serializationObject;
1760
1799
  }
1761
1800
  /**
@@ -1782,6 +1821,7 @@ export class GPUParticleSystem extends BaseParticleSystem {
1782
1821
  capacity: capacity || parsedParticleSystem.capacity,
1783
1822
  randomTextureSize: parsedParticleSystem.randomTextureSize,
1784
1823
  emitRateControl: parsedParticleSystem.emitRateControl,
1824
+ maxAttractors: parsedParticleSystem.maxAttractors,
1785
1825
  }, sceneOrEngine, null, parsedParticleSystem.isAnimationSheetEnabled);
1786
1826
  particleSystem._rootUrl = rootUrl;
1787
1827
  if (parsedParticleSystem.customShader && engine.createEffectForParticles) {
@@ -1808,6 +1848,15 @@ export class GPUParticleSystem extends BaseParticleSystem {
1808
1848
  if (parsedParticleSystem.metadata) {
1809
1849
  particleSystem.metadata = parsedParticleSystem.metadata;
1810
1850
  }
1851
+ // Attractors
1852
+ if (parsedParticleSystem.attractors) {
1853
+ for (const attractorData of parsedParticleSystem.attractors) {
1854
+ const attractor = new Attractor();
1855
+ attractor.position = Vector3.FromArray(attractorData.position);
1856
+ attractor.strength = attractorData.strength;
1857
+ particleSystem.addAttractor(attractor);
1858
+ }
1859
+ }
1811
1860
  if (!doNotStart && !particleSystem.preventAutoStart) {
1812
1861
  particleSystem.start();
1813
1862
  }