@babylonjs/core 7.12.0 → 7.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/Animations/animation.js +1 -2
  2. package/Animations/animation.js.map +1 -1
  3. package/Animations/animationGroupMask.d.ts +1 -1
  4. package/Animations/animationGroupMask.js +2 -2
  5. package/Animations/animationGroupMask.js.map +1 -1
  6. package/Animations/animationKey.d.ts +1 -1
  7. package/Animations/animationKey.js.map +1 -1
  8. package/Behaviors/Meshes/handConstraintBehavior.d.ts +3 -3
  9. package/Behaviors/Meshes/handConstraintBehavior.js +16 -17
  10. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  11. package/Behaviors/Meshes/sixDofDragBehavior.js +2 -3
  12. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  13. package/Bones/bone.js +31 -32
  14. package/Bones/bone.js.map +1 -1
  15. package/Bones/boneIKController.js +5 -6
  16. package/Bones/boneIKController.js.map +1 -1
  17. package/Bones/boneLookController.js +13 -13
  18. package/Bones/boneLookController.js.map +1 -1
  19. package/Cameras/Inputs/freeCameraMouseWheelInput.js +5 -6
  20. package/Cameras/Inputs/freeCameraMouseWheelInput.js.map +1 -1
  21. package/Cameras/Inputs/freeCameraVirtualJoystickInput.js +5 -5
  22. package/Cameras/Inputs/freeCameraVirtualJoystickInput.js.map +1 -1
  23. package/Cameras/VR/vrExperienceHelper.js +8 -10
  24. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  25. package/Compute/computeEffect.js +2 -3
  26. package/Compute/computeEffect.js.map +1 -1
  27. package/Compute/computeShader.js +19 -20
  28. package/Compute/computeShader.js.map +1 -1
  29. package/Culling/Helper/IBoundingInfoHelperPlatform.d.ts +4 -0
  30. package/Culling/Helper/IBoundingInfoHelperPlatform.js.map +1 -1
  31. package/Culling/Helper/boundingInfoHelper.d.ts +26 -4
  32. package/Culling/Helper/boundingInfoHelper.js +41 -10
  33. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  34. package/Culling/Helper/computeShaderBoundingHelper.d.ts +12 -3
  35. package/Culling/Helper/computeShaderBoundingHelper.js +164 -76
  36. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  37. package/Culling/Helper/transformFeedbackBoundingHelper.d.ts +11 -0
  38. package/Culling/Helper/transformFeedbackBoundingHelper.js +46 -14
  39. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  40. package/Debug/debugLayer.d.ts +1 -1
  41. package/Debug/debugLayer.js.map +1 -1
  42. package/Decorators/nodeDecorator.d.ts +1 -1
  43. package/Decorators/nodeDecorator.js +1 -1
  44. package/Decorators/nodeDecorator.js.map +1 -1
  45. package/DeviceInput/InputDevices/deviceEnums.d.ts +5 -5
  46. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  47. package/DeviceInput/eventFactory.js +3 -3
  48. package/DeviceInput/eventFactory.js.map +1 -1
  49. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +2 -2
  50. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  51. package/Engines/Extensions/engine.computeShader.d.ts +1 -1
  52. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  53. package/Engines/Extensions/engine.cubeTexture.js +2 -2
  54. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  55. package/Engines/Extensions/engine.dynamicTexture.js +2 -2
  56. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  57. package/Engines/Extensions/engine.multiRender.js +3 -3
  58. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  59. package/Engines/Extensions/engine.multiview.js +2 -2
  60. package/Engines/Extensions/engine.multiview.js.map +1 -1
  61. package/Engines/Extensions/engine.prefilteredCubeTexture.js +3 -3
  62. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  63. package/Engines/Extensions/engine.rawTexture.js +4 -4
  64. package/Engines/Extensions/engine.rawTexture.js.map +1 -1
  65. package/Engines/Extensions/engine.renderTarget.js +3 -3
  66. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  67. package/Engines/Extensions/engine.renderTargetCube.js +2 -2
  68. package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
  69. package/Engines/Native/nativeShaderProcessors.js +1 -2
  70. package/Engines/Native/nativeShaderProcessors.js.map +1 -1
  71. package/Engines/Processors/shaderProcessor.js +2 -3
  72. package/Engines/Processors/shaderProcessor.js.map +1 -1
  73. package/Engines/WebGL/webGL2ShaderProcessors.js +1 -2
  74. package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
  75. package/Engines/WebGL/webGLShaderProcessors.js +1 -2
  76. package/Engines/WebGL/webGLShaderProcessors.js.map +1 -1
  77. package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -2
  78. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  79. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +2 -2
  80. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  81. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +2 -2
  82. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  83. package/Engines/WebGPU/Extensions/engine.multiRender.js +2 -2
  84. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  85. package/Engines/WebGPU/Extensions/engine.rawTexture.js +5 -5
  86. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  87. package/Engines/WebGPU/Extensions/engine.renderTarget.js +3 -3
  88. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  89. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js +2 -2
  90. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  91. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  92. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  93. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +81 -82
  94. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  95. package/Engines/WebGPU/webgpuCacheSampler.js +60 -64
  96. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  97. package/Engines/WebGPU/webgpuClearQuad.js +1 -2
  98. package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
  99. package/Engines/WebGPU/webgpuComputeContext.js +13 -15
  100. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  101. package/Engines/WebGPU/webgpuConstants.d.ts +39 -39
  102. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  103. package/Engines/WebGPU/webgpuHardwareTexture.js +6 -8
  104. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  105. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -2
  106. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  107. package/Engines/WebGPU/webgpuQuerySet.js +3 -3
  108. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  109. package/Engines/WebGPU/webgpuShaderProcessor.js +15 -19
  110. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  111. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +8 -10
  112. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  113. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +26 -28
  114. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  115. package/Engines/WebGPU/webgpuTextureHelper.js +413 -416
  116. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  117. package/Engines/WebGPU/webgpuTextureManager.js +50 -51
  118. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  119. package/Engines/WebGPU/webgpuTimestampQuery.js +1 -2
  120. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  121. package/Engines/abstractEngine.js +4 -4
  122. package/Engines/abstractEngine.js.map +1 -1
  123. package/Engines/engine.js +2 -2
  124. package/Engines/engine.js.map +1 -1
  125. package/Engines/nativeEngine.js +9 -9
  126. package/Engines/nativeEngine.js.map +1 -1
  127. package/Engines/nullEngine.js +5 -5
  128. package/Engines/nullEngine.js.map +1 -1
  129. package/Engines/renderTargetWrapper.js +1 -2
  130. package/Engines/renderTargetWrapper.js.map +1 -1
  131. package/Engines/shaderStore.js +6 -7
  132. package/Engines/shaderStore.js.map +1 -1
  133. package/Engines/thinEngine.js +4 -5
  134. package/Engines/thinEngine.js.map +1 -1
  135. package/Engines/webgpuEngine.d.ts +11 -0
  136. package/Engines/webgpuEngine.js +91 -72
  137. package/Engines/webgpuEngine.js.map +1 -1
  138. package/Events/deviceInputEvents.d.ts +1 -1
  139. package/Events/deviceInputEvents.js.map +1 -1
  140. package/FlowGraph/flowGraph.d.ts +1 -1
  141. package/FlowGraph/flowGraph.js +5 -5
  142. package/FlowGraph/flowGraph.js.map +1 -1
  143. package/FlowGraph/flowGraphBlock.js +2 -3
  144. package/FlowGraph/flowGraphBlock.js.map +1 -1
  145. package/FlowGraph/flowGraphConnection.d.ts +1 -1
  146. package/FlowGraph/flowGraphConnection.js.map +1 -1
  147. package/FlowGraph/flowGraphDataConnection.js +3 -3
  148. package/FlowGraph/flowGraphDataConnection.js.map +1 -1
  149. package/FlowGraph/flowGraphExecutionBlock.js +2 -3
  150. package/FlowGraph/flowGraphExecutionBlock.js.map +1 -1
  151. package/FlowGraph/flowGraphSignalConnection.js +3 -3
  152. package/FlowGraph/flowGraphSignalConnection.js.map +1 -1
  153. package/Gamepads/dualShockGamepad.d.ts +2 -2
  154. package/Gamepads/dualShockGamepad.js +14 -14
  155. package/Gamepads/dualShockGamepad.js.map +1 -1
  156. package/Gamepads/xboxGamepad.d.ts +2 -2
  157. package/Gamepads/xboxGamepad.js +14 -14
  158. package/Gamepads/xboxGamepad.js.map +1 -1
  159. package/Gizmos/gizmo.d.ts +2 -2
  160. package/Gizmos/gizmo.js +4 -4
  161. package/Gizmos/gizmo.js.map +1 -1
  162. package/Gizmos/gizmoManager.js +2 -2
  163. package/Gizmos/gizmoManager.js.map +1 -1
  164. package/Gizmos/scaleGizmo.js +3 -3
  165. package/Gizmos/scaleGizmo.js.map +1 -1
  166. package/Loading/sceneLoader.d.ts +1 -1
  167. package/Loading/sceneLoader.js +6 -6
  168. package/Loading/sceneLoader.js.map +1 -1
  169. package/Materials/GreasedLine/greasedLineMaterialInterfaces.d.ts +3 -3
  170. package/Materials/GreasedLine/greasedLineMaterialInterfaces.js.map +1 -1
  171. package/Materials/GreasedLine/greasedLinePluginMaterial.js +10 -11
  172. package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
  173. package/Materials/GreasedLine/greasedLineSimpleMaterial.js +8 -9
  174. package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
  175. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +3 -4
  176. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  177. package/Materials/Node/Blocks/Dual/fogBlock.js +2 -3
  178. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  179. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -2
  180. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  181. package/Materials/Node/Blocks/Dual/lightBlock.js +5 -6
  182. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  183. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +4 -5
  184. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  185. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +7 -8
  186. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  187. package/Materials/Node/Blocks/Dual/textureBlock.js +4 -6
  188. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  189. package/Materials/Node/Blocks/Fragment/TBNBlock.js +2 -4
  190. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  191. package/Materials/Node/Blocks/Fragment/derivativeBlock.js +1 -2
  192. package/Materials/Node/Blocks/Fragment/derivativeBlock.js.map +1 -1
  193. package/Materials/Node/Blocks/Fragment/fragCoordBlock.js +1 -2
  194. package/Materials/Node/Blocks/Fragment/fragCoordBlock.js.map +1 -1
  195. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +1 -2
  196. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
  197. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +5 -6
  198. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  199. package/Materials/Node/Blocks/Fragment/frontFacingBlock.js +1 -2
  200. package/Materials/Node/Blocks/Fragment/frontFacingBlock.js.map +1 -1
  201. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +5 -6
  202. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  203. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +3 -4
  204. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  205. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +7 -9
  206. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  207. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js +1 -2
  208. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
  209. package/Materials/Node/Blocks/Input/inputBlock.js +19 -21
  210. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  211. package/Materials/Node/Blocks/Input/prePassTextureBlock.js +3 -4
  212. package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
  213. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +2 -3
  214. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  215. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +4 -5
  216. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  217. package/Materials/Node/Blocks/PBR/iridescenceBlock.js +1 -2
  218. package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
  219. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +28 -29
  220. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  221. package/Materials/Node/Blocks/PBR/reflectionBlock.js +4 -5
  222. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  223. package/Materials/Node/Blocks/PBR/refractionBlock.js +5 -6
  224. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  225. package/Materials/Node/Blocks/PBR/sheenBlock.js +4 -5
  226. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  227. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +2 -3
  228. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  229. package/Materials/Node/Blocks/Vertex/instancesBlock.js +1 -2
  230. package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
  231. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +1 -2
  232. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  233. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +1 -2
  234. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  235. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +1 -2
  236. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  237. package/Materials/Node/Blocks/arcTan2Block.js +1 -2
  238. package/Materials/Node/Blocks/arcTan2Block.js.map +1 -1
  239. package/Materials/Node/Blocks/biPlanarBlock.js +3 -4
  240. package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
  241. package/Materials/Node/Blocks/clampBlock.js +4 -5
  242. package/Materials/Node/Blocks/clampBlock.js.map +1 -1
  243. package/Materials/Node/Blocks/cloudBlock.js +3 -4
  244. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  245. package/Materials/Node/Blocks/curveBlock.js +1 -2
  246. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  247. package/Materials/Node/Blocks/customBlock.js +1 -2
  248. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  249. package/Materials/Node/Blocks/matrixBuilderBlock.js +1 -2
  250. package/Materials/Node/Blocks/matrixBuilderBlock.js.map +1 -1
  251. package/Materials/Node/Blocks/meshAttributeExistsBlock.d.ts +1 -1
  252. package/Materials/Node/Blocks/meshAttributeExistsBlock.js +35 -35
  253. package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
  254. package/Materials/Node/Blocks/modBlock.js +1 -2
  255. package/Materials/Node/Blocks/modBlock.js.map +1 -1
  256. package/Materials/Node/Blocks/remapBlock.js +3 -3
  257. package/Materials/Node/Blocks/remapBlock.js.map +1 -1
  258. package/Materials/Node/Blocks/simplexPerlin3DBlock.js +1 -2
  259. package/Materials/Node/Blocks/simplexPerlin3DBlock.js.map +1 -1
  260. package/Materials/Node/Blocks/transformBlock.js +1 -2
  261. package/Materials/Node/Blocks/transformBlock.js.map +1 -1
  262. package/Materials/Node/Blocks/triPlanarBlock.js +10 -12
  263. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  264. package/Materials/Node/Blocks/voronoiNoiseBlock.js +3 -4
  265. package/Materials/Node/Blocks/voronoiNoiseBlock.js.map +1 -1
  266. package/Materials/Node/Blocks/waveBlock.d.ts +1 -1
  267. package/Materials/Node/Blocks/waveBlock.js +4 -4
  268. package/Materials/Node/Blocks/waveBlock.js.map +1 -1
  269. package/Materials/Node/Blocks/worleyNoise3DBlock.js +3 -4
  270. package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
  271. package/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.d.ts +1 -1
  272. package/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.js.map +1 -1
  273. package/Materials/Node/nodeMaterial.js +3 -4
  274. package/Materials/Node/nodeMaterial.js.map +1 -1
  275. package/Materials/Node/nodeMaterialBlock.js +5 -6
  276. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  277. package/Materials/Node/nodeMaterialBlockConnectionPoint.d.ts +2 -2
  278. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +10 -10
  279. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  280. package/Materials/Node/nodeMaterialBuildState.js +18 -19
  281. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  282. package/Materials/Node/nodeMaterialConnectionPointCustomObject.js +3 -3
  283. package/Materials/Node/nodeMaterialConnectionPointCustomObject.js.map +1 -1
  284. package/Materials/PBR/pbrBaseMaterial.js +3 -4
  285. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  286. package/Materials/Textures/internalTexture.d.ts +1 -1
  287. package/Materials/Textures/internalTexture.js +13 -13
  288. package/Materials/Textures/internalTexture.js.map +1 -1
  289. package/Materials/Textures/ktx2decoderTypes.d.ts +1 -1
  290. package/Materials/Textures/ktx2decoderTypes.js.map +1 -1
  291. package/Materials/Textures/rawCubeTexture.js +1 -2
  292. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  293. package/Materials/effect.functions.js +2 -3
  294. package/Materials/effect.functions.js.map +1 -1
  295. package/Materials/effect.js +3 -4
  296. package/Materials/effect.js.map +1 -1
  297. package/Materials/effect.webgl.functions.js +1 -2
  298. package/Materials/effect.webgl.functions.js.map +1 -1
  299. package/Materials/material.js +7 -9
  300. package/Materials/material.js.map +1 -1
  301. package/Materials/materialPluginEvent.d.ts +1 -1
  302. package/Materials/materialPluginEvent.js.map +1 -1
  303. package/Materials/materialPluginManager.js +9 -11
  304. package/Materials/materialPluginManager.js.map +1 -1
  305. package/Materials/meshDebugPluginMaterial.d.ts +1 -1
  306. package/Materials/meshDebugPluginMaterial.js +2 -2
  307. package/Materials/meshDebugPluginMaterial.js.map +1 -1
  308. package/Materials/shaderLanguage.d.ts +1 -1
  309. package/Materials/shaderLanguage.js.map +1 -1
  310. package/Materials/shadowDepthWrapper.js +1 -2
  311. package/Materials/shadowDepthWrapper.js.map +1 -1
  312. package/Materials/standardMaterial.js +2 -3
  313. package/Materials/standardMaterial.js.map +1 -1
  314. package/Maths/math.axis.d.ts +2 -2
  315. package/Maths/math.axis.js.map +1 -1
  316. package/Maths/math.path.d.ts +1 -1
  317. package/Maths/math.path.js +3 -3
  318. package/Maths/math.path.js.map +1 -1
  319. package/Meshes/Builders/greasedLineBuilder.d.ts +2 -2
  320. package/Meshes/Builders/greasedLineBuilder.js +21 -23
  321. package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
  322. package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +3 -3
  323. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  324. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +14 -14
  325. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  326. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.js +2 -2
  327. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.js.map +1 -1
  328. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +2 -2
  329. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  330. package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js +3 -3
  331. package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js.map +1 -1
  332. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +3 -3
  333. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  334. package/Meshes/Node/Blocks/Set/setColorsBlock.js +2 -2
  335. package/Meshes/Node/Blocks/Set/setColorsBlock.js.map +1 -1
  336. package/Meshes/Node/Blocks/Set/setMaterialIDBlock.js +2 -2
  337. package/Meshes/Node/Blocks/Set/setMaterialIDBlock.js.map +1 -1
  338. package/Meshes/Node/Blocks/Set/setNormalsBlock.js +2 -2
  339. package/Meshes/Node/Blocks/Set/setNormalsBlock.js.map +1 -1
  340. package/Meshes/Node/Blocks/Set/setPositionsBlock.js +2 -2
  341. package/Meshes/Node/Blocks/Set/setPositionsBlock.js.map +1 -1
  342. package/Meshes/Node/Blocks/Set/setTangentsBlock.js +2 -2
  343. package/Meshes/Node/Blocks/Set/setTangentsBlock.js.map +1 -1
  344. package/Meshes/Node/Blocks/Set/setUVsBlock.js +3 -3
  345. package/Meshes/Node/Blocks/Set/setUVsBlock.js.map +1 -1
  346. package/Meshes/Node/Blocks/Sources/boxBlock.js +2 -2
  347. package/Meshes/Node/Blocks/Sources/boxBlock.js.map +1 -1
  348. package/Meshes/Node/Blocks/Sources/capsuleBlock.js +2 -2
  349. package/Meshes/Node/Blocks/Sources/capsuleBlock.js.map +1 -1
  350. package/Meshes/Node/Blocks/Sources/cylinderBlock.js +2 -2
  351. package/Meshes/Node/Blocks/Sources/cylinderBlock.js.map +1 -1
  352. package/Meshes/Node/Blocks/Sources/discBlock.js +2 -2
  353. package/Meshes/Node/Blocks/Sources/discBlock.js.map +1 -1
  354. package/Meshes/Node/Blocks/Sources/gridBlock.js +2 -2
  355. package/Meshes/Node/Blocks/Sources/gridBlock.js.map +1 -1
  356. package/Meshes/Node/Blocks/Sources/icoSphereBlock.js +2 -2
  357. package/Meshes/Node/Blocks/Sources/icoSphereBlock.js.map +1 -1
  358. package/Meshes/Node/Blocks/Sources/meshBlock.js +2 -2
  359. package/Meshes/Node/Blocks/Sources/meshBlock.js.map +1 -1
  360. package/Meshes/Node/Blocks/Sources/planeBlock.js +2 -2
  361. package/Meshes/Node/Blocks/Sources/planeBlock.js.map +1 -1
  362. package/Meshes/Node/Blocks/Sources/sphereBlock.js +2 -2
  363. package/Meshes/Node/Blocks/Sources/sphereBlock.js.map +1 -1
  364. package/Meshes/Node/Blocks/Sources/torusBlock.js +2 -2
  365. package/Meshes/Node/Blocks/Sources/torusBlock.js.map +1 -1
  366. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +2 -2
  367. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -1
  368. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js +2 -2
  369. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js.map +1 -1
  370. package/Meshes/Node/Blocks/booleanGeometryBlock.js +3 -3
  371. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  372. package/Meshes/Node/Blocks/conditionBlock.js +2 -2
  373. package/Meshes/Node/Blocks/conditionBlock.js.map +1 -1
  374. package/Meshes/Node/Blocks/geometryClampBlock.js +3 -3
  375. package/Meshes/Node/Blocks/geometryClampBlock.js.map +1 -1
  376. package/Meshes/Node/Blocks/geometryCollectionBlock.js +2 -2
  377. package/Meshes/Node/Blocks/geometryCollectionBlock.js.map +1 -1
  378. package/Meshes/Node/Blocks/geometryCurveBlock.js +2 -2
  379. package/Meshes/Node/Blocks/geometryCurveBlock.js.map +1 -1
  380. package/Meshes/Node/Blocks/geometryOptimizeBlock.js +3 -3
  381. package/Meshes/Node/Blocks/geometryOptimizeBlock.js.map +1 -1
  382. package/Meshes/Node/Blocks/geometryTransformBlock.js +2 -2
  383. package/Meshes/Node/Blocks/geometryTransformBlock.js.map +1 -1
  384. package/Meshes/Node/Blocks/geometryTrigonometryBlock.js +2 -2
  385. package/Meshes/Node/Blocks/geometryTrigonometryBlock.js.map +1 -1
  386. package/Meshes/Node/Blocks/mappingBlock.js +2 -2
  387. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  388. package/Meshes/Node/Blocks/mathBlock.js +2 -2
  389. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  390. package/Meshes/Node/Blocks/mergeGeometryBlock.js +2 -2
  391. package/Meshes/Node/Blocks/mergeGeometryBlock.js.map +1 -1
  392. package/Meshes/Node/Blocks/randomBlock.js +2 -2
  393. package/Meshes/Node/Blocks/randomBlock.js.map +1 -1
  394. package/Meshes/Node/nodeGeometryBlock.js +3 -3
  395. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  396. package/Meshes/Node/nodeGeometryBlockConnectionPoint.d.ts +2 -2
  397. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +7 -7
  398. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
  399. package/Meshes/abstractMesh.js +2 -3
  400. package/Meshes/abstractMesh.js.map +1 -1
  401. package/Meshes/mesh.js +1 -2
  402. package/Meshes/mesh.js.map +1 -1
  403. package/Meshes/meshSimplification.d.ts +1 -1
  404. package/Meshes/meshSimplification.js +1 -1
  405. package/Meshes/meshSimplification.js.map +1 -1
  406. package/Meshes/meshSimplificationSceneComponent.js +2 -2
  407. package/Meshes/meshSimplificationSceneComponent.js.map +1 -1
  408. package/Meshes/transformNode.js +7 -8
  409. package/Meshes/transformNode.js.map +1 -1
  410. package/Misc/assetsManager.d.ts +1 -1
  411. package/Misc/assetsManager.js +9 -9
  412. package/Misc/assetsManager.js.map +1 -1
  413. package/Misc/basis.js +2 -2
  414. package/Misc/basis.js.map +1 -1
  415. package/Misc/copyTextureToTexture.d.ts +1 -1
  416. package/Misc/copyTextureToTexture.js +1 -1
  417. package/Misc/copyTextureToTexture.js.map +1 -1
  418. package/Misc/environmentTextureTools.js +3 -3
  419. package/Misc/environmentTextureTools.js.map +1 -1
  420. package/Misc/iInspectable.d.ts +1 -1
  421. package/Misc/iInspectable.js.map +1 -1
  422. package/Misc/khronosTextureContainer2.js +2 -2
  423. package/Misc/khronosTextureContainer2.js.map +1 -1
  424. package/Misc/timer.d.ts +1 -1
  425. package/Misc/timer.js +5 -5
  426. package/Misc/timer.js.map +1 -1
  427. package/Misc/virtualJoystick.d.ts +1 -1
  428. package/Misc/virtualJoystick.js +16 -16
  429. package/Misc/virtualJoystick.js.map +1 -1
  430. package/Particles/particleSystem.js +3 -3
  431. package/Particles/particleSystem.js.map +1 -1
  432. package/Particles/particleSystemComponent.js +1 -2
  433. package/Particles/particleSystemComponent.js.map +1 -1
  434. package/Particles/pointsCloudSystem.d.ts +1 -1
  435. package/Particles/pointsCloudSystem.js +14 -14
  436. package/Particles/pointsCloudSystem.js.map +1 -1
  437. package/Particles/subEmitter.d.ts +1 -1
  438. package/Particles/subEmitter.js +1 -1
  439. package/Particles/subEmitter.js.map +1 -1
  440. package/Physics/physicsHelper.d.ts +2 -2
  441. package/Physics/physicsHelper.js +6 -7
  442. package/Physics/physicsHelper.js.map +1 -1
  443. package/Physics/v1/physicsImpostor.js +4 -5
  444. package/Physics/v1/physicsImpostor.js.map +1 -1
  445. package/Physics/v2/IPhysicsEnginePlugin.d.ts +16 -8
  446. package/Physics/v2/IPhysicsEnginePlugin.js +9 -0
  447. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  448. package/Physics/v2/Plugins/havokPlugin.js +96 -79
  449. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  450. package/Physics/v2/physicsAggregate.js +8 -9
  451. package/Physics/v2/physicsAggregate.js.map +1 -1
  452. package/Physics/v2/physicsBody.d.ts +14 -2
  453. package/Physics/v2/physicsBody.js +30 -11
  454. package/Physics/v2/physicsBody.js.map +1 -1
  455. package/Physics/v2/physicsConstraint.js +8 -9
  456. package/Physics/v2/physicsConstraint.js.map +1 -1
  457. package/Physics/v2/physicsMaterial.d.ts +1 -1
  458. package/Physics/v2/physicsMaterial.js.map +1 -1
  459. package/Physics/v2/physicsShape.js +9 -10
  460. package/Physics/v2/physicsShape.js.map +1 -1
  461. package/Physics/v2/ragdoll.js +11 -12
  462. package/Physics/v2/ragdoll.js.map +1 -1
  463. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +2 -2
  464. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  465. package/PostProcesses/depthOfFieldEffect.d.ts +1 -1
  466. package/PostProcesses/depthOfFieldEffect.js +3 -3
  467. package/PostProcesses/depthOfFieldEffect.js.map +1 -1
  468. package/PostProcesses/postProcess.js +2 -3
  469. package/PostProcesses/postProcess.js.map +1 -1
  470. package/PostProcesses/tonemapPostProcess.d.ts +1 -1
  471. package/PostProcesses/tonemapPostProcess.js +4 -4
  472. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  473. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +1 -1
  474. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +10 -10
  475. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  476. package/Shaders/spriteMap.fragment.js +3 -2
  477. package/Shaders/spriteMap.fragment.js.map +1 -1
  478. package/ShadersWGSL/boundingInfo.compute.js +8 -8
  479. package/ShadersWGSL/boundingInfo.compute.js.map +1 -1
  480. package/XR/features/WebXRDepthSensing.js +2 -2
  481. package/XR/features/WebXRDepthSensing.js.map +1 -1
  482. package/XR/features/WebXRHandTracking.d.ts +2 -2
  483. package/XR/features/WebXRHandTracking.js +76 -76
  484. package/XR/features/WebXRHandTracking.js.map +1 -1
  485. package/XR/features/WebXRLightEstimation.js +2 -2
  486. package/XR/features/WebXRLightEstimation.js.map +1 -1
  487. package/XR/features/WebXRNearInteraction.d.ts +1 -1
  488. package/XR/features/WebXRNearInteraction.js +5 -5
  489. package/XR/features/WebXRNearInteraction.js.map +1 -1
  490. package/XR/features/WebXRRawCameraAccess.js +2 -2
  491. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  492. package/XR/motionController/webXRProfiledMotionController.js +2 -2
  493. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  494. package/XR/webXRCamera.js +3 -4
  495. package/XR/webXRCamera.js.map +1 -1
  496. package/XR/webXREnterExitUI.js +3 -4
  497. package/XR/webXREnterExitUI.js.map +1 -1
  498. package/XR/webXRExperienceHelper.js +12 -13
  499. package/XR/webXRExperienceHelper.js.map +1 -1
  500. package/XR/webXRManagedOutputCanvas.d.ts +1 -1
  501. package/XR/webXRManagedOutputCanvas.js +15 -6
  502. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  503. package/XR/webXRRenderTargetTextureProvider.js +2 -2
  504. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  505. package/XR/webXRTypes.d.ts +2 -2
  506. package/XR/webXRTypes.js.map +1 -1
  507. package/package.json +1 -1
  508. package/scene.d.ts +1 -1
  509. package/scene.js +4 -4
  510. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"boundingInfoHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/boundingInfoHelper.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,kBAAkB;IAI3B;;;OAGG;IACH,YAAmB,MAAsB;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,YAAY,CAAC,MAAqC;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACjB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;gBAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;gBAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACzE;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,yBAAyB,EAAE;gBACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBACjE,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAqB,CAAC,CAAC;aAC3F;iBAAM;gBACH,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;aAC1F;SACJ;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ","sourcesContent":["import type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { ThinEngine } from \"core/Engines\";\r\n\r\n/**\r\n * Utility class to help with bounding info management\r\n * #BCNJD4#41 =\\> does not use the BoundingInfoHelper class, performs calculations on the CPU\r\n * #BCNJD4#37 =\\> same as #41 but use the BoundingInfoHelper class\r\n * #BCNJD4#40 =\\> example with bones and morphs (webGL2)\r\n * #BCNJD4#42 =\\> example with bones and morphs (webGPU)\r\n * #HPV2TZ#475 =\\> only morph (webGL2)\r\n * #HPV2TZ#476 =\\> only morph (webGPU)\r\n * #B8B8Z2#8 =\\> Large scale test (webGL2)\r\n * #B8B8Z2#9 =\\> Large scale test (webGPU)\r\n */\r\nexport class BoundingInfoHelper {\r\n private _platform: IBoundingInfoHelperPlatform;\r\n private _engine: AbstractEngine;\r\n\r\n /**\r\n * Creates a new BoundingInfoHelper\r\n * @param engine defines the engine to use\r\n */\r\n public constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n /**\r\n * Compute the bounding info of a mesh / array of meshes using shaders\r\n * @param target defines the mesh(es) to update\r\n * @returns a promise that resolves when the bounding info is/are computed\r\n */\r\n public async computeAsync(target: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n if (!this._platform) {\r\n if (this._engine.getCaps().supportComputeShaders) {\r\n const module = await import(\"./computeShaderBoundingHelper\");\r\n this._platform = new module.ComputeShaderBoundingHelper(this._engine);\r\n } else if (this._engine.getCaps().supportTransformFeedbacks) {\r\n const module = await import(\"./transformFeedbackBoundingHelper\");\r\n this._platform = new module.TransformFeedbackBoundingHelper(this._engine as ThinEngine);\r\n } else {\r\n throw new Error(\"Your engine does not support Compute Shaders or Transform Feedbacks\");\r\n }\r\n }\r\n\r\n return this._platform.processAsync(target);\r\n }\r\n\r\n /**\r\n * Dispose and release associated resources\r\n */\r\n public dispose(): void {\r\n this._platform.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"boundingInfoHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/boundingInfoHelper.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,kBAAkB;IAI3B;;;OAGG;IACH,YAAmB,MAAsB;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACjB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;gBAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;gBAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACzE;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,yBAAyB,EAAE;gBACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBACjE,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAqB,CAAC,CAAC;aAC3F;iBAAM;gBACH,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;aAC1F;SACJ;IACL,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,YAAY,CAAC,MAAqC;QAC3D,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,oBAAoB,CAAC,MAAqC;QACnE,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,sBAAsB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,4BAA4B,EAAE,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ","sourcesContent":["import type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { ThinEngine } from \"core/Engines\";\r\n\r\n/**\r\n * Utility class to help with bounding info management\r\n * Warning: using the BoundingInfoHelper class may be slower than executing calculations on the CPU!\r\n * This will happen if there are a lot of meshes / few vertices (like with the BrainStem model)\r\n * The BoundingInfoHelper will perform better if there are few meshes / a lot of vertices\r\n * #BCNJD4#56 =\\> does not use the BoundingInfoHelper class, performs calculations on the CPU\r\n * #BCNJD4#55 =\\> same as #56 but use the BoundingInfoHelper class\r\n * #BCNJD4#40 =\\> example with bones and morphs (webGL2)\r\n * #BCNJD4#42 =\\> example with bones and morphs (webGPU)\r\n * #HPV2TZ#475 =\\> only morph (webGL2)\r\n * #HPV2TZ#476 =\\> only morph (webGPU)\r\n * #B8B8Z2#51 =\\> Large scale test (CPU) =\\> for each mesh, this test calculates a bounding box which is the union of the bounding boxes of all the frames in a given animation\r\n * #B8B8Z2#49 =\\> Large scale test (webGL2)\r\n * #B8B8Z2#50 =\\> Large scale test (webGPU)\r\n */\r\nexport class BoundingInfoHelper {\r\n private _platform: IBoundingInfoHelperPlatform;\r\n private _engine: AbstractEngine;\r\n\r\n /**\r\n * Creates a new BoundingInfoHelper\r\n * @param engine defines the engine to use\r\n */\r\n public constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n private async _initializePlatform() {\r\n if (!this._platform) {\r\n if (this._engine.getCaps().supportComputeShaders) {\r\n const module = await import(\"./computeShaderBoundingHelper\");\r\n this._platform = new module.ComputeShaderBoundingHelper(this._engine);\r\n } else if (this._engine.getCaps().supportTransformFeedbacks) {\r\n const module = await import(\"./transformFeedbackBoundingHelper\");\r\n this._platform = new module.TransformFeedbackBoundingHelper(this._engine as ThinEngine);\r\n } else {\r\n throw new Error(\"Your engine does not support Compute Shaders or Transform Feedbacks\");\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Compute the bounding info of a mesh / array of meshes using shaders\r\n * @param target defines the mesh(es) to update\r\n * @returns a promise that resolves when the bounding info is/are computed\r\n */\r\n public async computeAsync(target: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n await this._initializePlatform();\r\n return this._platform.processAsync(target);\r\n }\r\n\r\n /**\r\n * Register a mesh / array of meshes to be processed per batch\r\n * This method must be called before calling batchProcess (which can be called several times) and batchFetchResultsAsync\r\n * @param target defines the mesh(es) to be processed per batch\r\n * @returns a promise that resolves when the initialization is done\r\n */\r\n public async batchInitializeAsync(target: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n await this._initializePlatform();\r\n return this._platform.registerMeshListAsync(target);\r\n }\r\n\r\n /**\r\n * Processes meshes registered with batchRegisterAsync\r\n * If called multiple times, the second, third, etc calls will perform a union of the bounding boxes calculated in the previous calls\r\n */\r\n public batchProcess(): void {\r\n this._platform.processMeshList();\r\n }\r\n\r\n /**\r\n * Update the bounding info of the meshes registered with batchRegisterAsync, after batchProcess has been called once or several times\r\n * @returns a promise that resolves when the bounding info is/are computed\r\n */\r\n public async batchFetchResultsAsync(): Promise<void> {\r\n return this._platform.fetchResultsForMeshListAsync();\r\n }\r\n\r\n /**\r\n * Dispose and release associated resources\r\n */\r\n public dispose(): void {\r\n this._platform.dispose();\r\n }\r\n}\r\n"]}
@@ -5,7 +5,7 @@ import "../../ShadersWGSL/boundingInfo.compute";
5
5
  /** @internal */
6
6
  export declare class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {
7
7
  private _engine;
8
- private _computeShaders;
8
+ private _computeShadersCache;
9
9
  private _positionBuffers;
10
10
  private _indexBuffers;
11
11
  private _weightBuffers;
@@ -13,10 +13,12 @@ export declare class ComputeShaderBoundingHelper implements IBoundingInfoHelperP
13
13
  private _weightExtraBuffers;
14
14
  private _morphTargetInfluenceBuffers;
15
15
  private _morphTargetTextureIndexBuffers;
16
- private _resultData;
17
- private _resultBuffer;
18
16
  private _ubos;
19
17
  private _uboIndex;
18
+ private _processedMeshes;
19
+ private _computeShaders;
20
+ private _uniqueComputeShaders;
21
+ private _resultBuffers;
20
22
  /**
21
23
  * Creates a new ComputeShaderBoundingHelper
22
24
  * @param engine defines the engine to use
@@ -28,7 +30,14 @@ export declare class ComputeShaderBoundingHelper implements IBoundingInfoHelperP
28
30
  private _prepareStorage;
29
31
  /** @internal */
30
32
  processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void>;
33
+ /** @internal */
34
+ registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void>;
35
+ /** @internal */
36
+ processMeshList(): void;
37
+ /** @internal */
38
+ fetchResultsForMeshListAsync(): Promise<void>;
31
39
  private _disposeCache;
40
+ private _disposeForMeshList;
32
41
  /** @internal */
33
42
  dispose(): void;
34
43
  }
@@ -11,7 +11,7 @@ export class ComputeShaderBoundingHelper {
11
11
  * @param engine defines the engine to use
12
12
  */
13
13
  constructor(engine) {
14
- this._computeShaders = {};
14
+ this._computeShadersCache = {};
15
15
  this._positionBuffers = {};
16
16
  this._indexBuffers = {};
17
17
  this._weightBuffers = {};
@@ -21,40 +21,50 @@ export class ComputeShaderBoundingHelper {
21
21
  this._morphTargetTextureIndexBuffers = {};
22
22
  this._ubos = [];
23
23
  this._uboIndex = 0;
24
+ this._processedMeshes = [];
25
+ this._computeShaders = [];
26
+ this._uniqueComputeShaders = new Set();
27
+ this._resultBuffers = [];
24
28
  this._engine = engine;
25
29
  }
26
- _getComputeShader(defines) {
30
+ _getComputeShader(defines, hasBones, hasMorphs) {
27
31
  let computeShader;
28
32
  const join = defines.join("\n");
29
- if (!this._computeShaders[join]) {
30
- computeShader = new ComputeShader("boundingInfoCompute", this._engine, "boundingInfo", {
31
- bindingsMapping: {
32
- positionBuffer: { group: 0, binding: 0 },
33
- resultBuffer: { group: 0, binding: 1 },
34
- boneSampler: { group: 0, binding: 2 },
35
- indexBuffer: { group: 0, binding: 3 },
36
- weightBuffer: { group: 0, binding: 4 },
37
- indexExtraBuffer: { group: 0, binding: 5 },
38
- weightExtraBuffer: { group: 0, binding: 6 },
39
- settings: { group: 0, binding: 7 },
40
- morphTargets: { group: 0, binding: 8 },
41
- morphTargetInfluences: { group: 0, binding: 9 },
42
- morphTargetTextureIndices: { group: 0, binding: 10 },
43
- },
33
+ if (!this._computeShadersCache[join]) {
34
+ const bindingsMapping = {
35
+ positionBuffer: { group: 0, binding: 0 },
36
+ resultBuffer: { group: 0, binding: 1 },
37
+ settings: { group: 0, binding: 7 },
38
+ };
39
+ if (hasBones) {
40
+ bindingsMapping.boneSampler = { group: 0, binding: 2 };
41
+ bindingsMapping.indexBuffer = { group: 0, binding: 3 };
42
+ bindingsMapping.weightBuffer = { group: 0, binding: 4 };
43
+ bindingsMapping.indexExtraBuffer = { group: 0, binding: 5 };
44
+ bindingsMapping.weightExtraBuffer = { group: 0, binding: 6 };
45
+ }
46
+ if (hasMorphs) {
47
+ bindingsMapping.morphTargets = { group: 0, binding: 8 };
48
+ bindingsMapping.morphTargetInfluences = { group: 0, binding: 9 };
49
+ bindingsMapping.morphTargetTextureIndices = { group: 0, binding: 10 };
50
+ }
51
+ computeShader = new ComputeShader(`boundingInfoCompute${hasBones ? "_bones" : ""}${hasMorphs ? "_morphs" : ""}`, this._engine, "boundingInfo", {
52
+ bindingsMapping,
44
53
  defines: defines,
45
54
  });
46
- this._computeShaders[join] = computeShader;
55
+ this._computeShadersCache[join] = computeShader;
47
56
  }
48
57
  else {
49
- computeShader = this._computeShaders[join];
58
+ computeShader = this._computeShadersCache[join];
50
59
  }
51
60
  return computeShader;
52
61
  }
53
62
  _getUBO() {
54
63
  if (this._uboIndex >= this._ubos.length) {
55
64
  const ubo = new UniformBuffer(this._engine);
56
- ubo.addUniform("indexResult", 4);
57
65
  ubo.addFloat3("morphTargetTextureInfo", 0, 0, 0);
66
+ ubo.addUniform("morphTargetCount", 1);
67
+ ubo.addUniform("indexResult", 1);
58
68
  this._ubos.push(ubo);
59
69
  }
60
70
  return this._ubos[this._uboIndex++];
@@ -86,27 +96,83 @@ export class ComputeShaderBoundingHelper {
86
96
  computeShader.setStorageBuffer(name, buffer);
87
97
  }
88
98
  /** @internal */
89
- processAsync(meshes) {
99
+ async processAsync(meshes) {
100
+ await this.registerMeshListAsync(meshes);
101
+ this.processMeshList();
102
+ await this.fetchResultsForMeshListAsync();
103
+ }
104
+ /** @internal */
105
+ registerMeshListAsync(meshes) {
106
+ this._disposeForMeshList();
90
107
  if (!Array.isArray(meshes)) {
91
108
  meshes = [meshes];
92
109
  }
93
- this._uboIndex = 0;
94
- // Results
95
- const resultDataSize = 8 * meshes.length;
96
- let resultData;
97
- let resultBuffer;
98
- if (!this._resultData || this._resultData.length !== resultDataSize) {
99
- this._resultBuffer?.dispose();
100
- resultData = new Float32Array(resultDataSize);
101
- resultBuffer = new StorageBuffer(this._engine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);
102
- this._resultData = resultData;
103
- this._resultBuffer = resultBuffer;
110
+ let maxNumInfluencers = 0;
111
+ for (let i = 0; i < meshes.length; i++) {
112
+ const mesh = meshes[i];
113
+ const vertexCount = mesh.getTotalVertices();
114
+ if (vertexCount === 0 || !mesh.getVertexBuffer || !mesh.getVertexBuffer(VertexBuffer.PositionKind)) {
115
+ continue;
116
+ }
117
+ this._processedMeshes.push(mesh);
118
+ const manager = mesh.morphTargetManager;
119
+ if (manager) {
120
+ maxNumInfluencers = Math.max(maxNumInfluencers, manager.numTargets);
121
+ }
104
122
  }
105
- else {
106
- resultData = this._resultData;
107
- resultBuffer = this._resultBuffer;
123
+ for (let i = 0; i < this._processedMeshes.length; i++) {
124
+ const mesh = this._processedMeshes[i];
125
+ let defines = [""];
126
+ let hasBones = false;
127
+ if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {
128
+ defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
129
+ hasBones = true;
130
+ }
131
+ const computeShaderWithoutMorph = this._getComputeShader(defines, hasBones, false);
132
+ this._uniqueComputeShaders.add(computeShaderWithoutMorph);
133
+ const manager = mesh.morphTargetManager;
134
+ if (manager) {
135
+ defines = defines.slice();
136
+ defines.push("#define MORPHTARGETS");
137
+ defines.push("#define NUM_MORPH_INFLUENCERS " + maxNumInfluencers);
138
+ const computeShaderWithMorph = this._getComputeShader(defines, hasBones, true);
139
+ this._uniqueComputeShaders.add(computeShaderWithMorph);
140
+ this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithMorph]);
141
+ }
142
+ else {
143
+ this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithoutMorph]);
144
+ }
145
+ // Pre-build the ubos, as they won't change if there's no morph targets
146
+ const ubo = this._getUBO();
147
+ ubo.updateUInt("indexResult", i);
148
+ ubo.update();
108
149
  }
109
- for (let i = 0; i < meshes.length; i++) {
150
+ return new Promise((resolve) => {
151
+ const check = () => {
152
+ const iterator = this._uniqueComputeShaders.keys();
153
+ for (let key = iterator.next(); key.done !== true; key = iterator.next()) {
154
+ const computeShader = key.value;
155
+ if (!computeShader.isReady()) {
156
+ setTimeout(check, 10);
157
+ return;
158
+ }
159
+ }
160
+ resolve();
161
+ };
162
+ check();
163
+ });
164
+ }
165
+ /** @internal */
166
+ processMeshList() {
167
+ if (this._processedMeshes.length === 0) {
168
+ return;
169
+ }
170
+ this._uboIndex = 0;
171
+ const resultDataSize = 8 * this._processedMeshes.length;
172
+ const resultData = new Float32Array(resultDataSize);
173
+ const resultBuffer = new StorageBuffer(this._engine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);
174
+ this._resultBuffers.push(resultBuffer);
175
+ for (let i = 0; i < this._processedMeshes.length; i++) {
110
176
  resultData[i * 8 + 0] = Number.POSITIVE_INFINITY;
111
177
  resultData[i * 8 + 1] = Number.POSITIVE_INFINITY;
112
178
  resultData[i * 8 + 2] = Number.POSITIVE_INFINITY;
@@ -115,29 +181,14 @@ export class ComputeShaderBoundingHelper {
115
181
  resultData[i * 8 + 5] = Number.NEGATIVE_INFINITY;
116
182
  }
117
183
  resultBuffer.update(resultData);
118
- const promises = [];
119
- const processedMeshes = [];
120
- for (let i = 0; i < meshes.length; i++) {
121
- const mesh = meshes[i];
184
+ for (let i = 0; i < this._processedMeshes.length; i++) {
185
+ const mesh = this._processedMeshes[i];
122
186
  const vertexCount = mesh.getTotalVertices();
123
- const defines = [""];
124
- if (vertexCount === 0 || !mesh.getVertexBuffer || !mesh.getVertexBuffer(VertexBuffer.PositionKind)) {
125
- continue;
126
- }
127
- processedMeshes.push(mesh);
128
- if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {
129
- defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
130
- }
187
+ const [computeShaderWithoutMorph, computeShaderWithMorph] = this._computeShaders[i];
131
188
  const manager = mesh.morphTargetManager;
132
- if (manager && manager.numInfluencers > 0) {
133
- defines.push("MORPHTARGETS");
134
- defines.push("#define NUM_MORPH_INFLUENCERS " + manager.numInfluencers);
135
- }
136
- const computeShader = this._getComputeShader(defines);
189
+ const hasMorphs = manager && manager.numInfluencers > 0;
190
+ const computeShader = hasMorphs ? computeShaderWithMorph : computeShaderWithoutMorph;
137
191
  this._extractDataAndLink(computeShader, mesh, VertexBuffer.PositionKind, 3, "positionBuffer", this._positionBuffers);
138
- // UBO
139
- const ubo = this._getUBO();
140
- ubo.updateUInt("indexResult", processedMeshes.length - 1);
141
192
  // Bones
142
193
  if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton && mesh.skeleton.useTextureToStoreBoneMatrices) {
143
194
  this._extractDataAndLink(computeShader, mesh, VertexBuffer.MatricesIndicesKind, 4, "indexBuffer", this._indexBuffers);
@@ -149,32 +200,62 @@ export class ComputeShaderBoundingHelper {
149
200
  this._extractDataAndLink(computeShader, mesh, VertexBuffer.MatricesWeightsExtraKind, 4, "weightExtraBuffer", this._weightExtraBuffers);
150
201
  }
151
202
  }
203
+ const ubo = this._getUBO();
152
204
  // Morphs
153
- if (manager && manager.numInfluencers > 0) {
205
+ if (hasMorphs) {
154
206
  const morphTargets = manager._targetStoreTexture;
155
207
  computeShader.setTexture("morphTargets", morphTargets, false);
156
208
  this._prepareStorage(computeShader, "morphTargetInfluences", mesh.uniqueId, this._morphTargetInfluenceBuffers, manager.numInfluencers, manager.influences);
157
209
  this._prepareStorage(computeShader, "morphTargetTextureIndices", mesh.uniqueId, this._morphTargetTextureIndexBuffers, manager.numInfluencers, manager._morphTargetTextureIndices);
158
210
  ubo.updateFloat3("morphTargetTextureInfo", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);
211
+ ubo.updateInt("morphTargetCount", manager.numInfluencers);
212
+ ubo.update();
159
213
  }
160
- ubo.update();
161
214
  computeShader.setStorageBuffer("resultBuffer", resultBuffer);
162
215
  computeShader.setUniformBuffer("settings", ubo);
163
216
  // Dispatch
164
- promises.push(computeShader.dispatchWhenReady(Math.ceil(vertexCount / 64)));
165
- }
166
- if (promises.length === 0) {
167
- return Promise.resolve();
168
- }
169
- return Promise.all(promises).then(() => {
170
- return resultBuffer.read(undefined, undefined, resultData, true).then(() => {
171
- for (let i = 0; i < processedMeshes.length; i++) {
172
- const mesh = processedMeshes[i];
173
- mesh._refreshBoundingInfoDirect({
174
- minimum: Vector3.FromArray(resultData, i * 8),
175
- maximum: Vector3.FromArray(resultData, i * 8 + 3),
176
- });
217
+ computeShader.dispatch(Math.ceil(vertexCount / 256));
218
+ this._engine.flushFramebuffer();
219
+ }
220
+ }
221
+ /** @internal */
222
+ fetchResultsForMeshListAsync() {
223
+ return new Promise((resolve) => {
224
+ const buffers = [];
225
+ let size = 0;
226
+ for (let i = 0; i < this._resultBuffers.length; i++) {
227
+ const buffer = this._resultBuffers[i].getBuffer();
228
+ buffers.push(buffer);
229
+ size += buffer.capacity;
230
+ }
231
+ const resultData = new Float32Array(size / Float32Array.BYTES_PER_ELEMENT);
232
+ const minimum = Vector3.Zero();
233
+ const maximum = Vector3.Zero();
234
+ const minmax = { minimum, maximum };
235
+ this._engine.readFromMultipleStorageBuffers(buffers, 0, undefined, resultData, true).then(() => {
236
+ let resultDataOffset = 0;
237
+ for (let j = 0; j < this._resultBuffers.length; j++) {
238
+ for (let i = 0; i < this._processedMeshes.length; i++) {
239
+ const mesh = this._processedMeshes[i];
240
+ Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8, minimum);
241
+ Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8 + 3, maximum);
242
+ if (j > 0) {
243
+ minimum.minimizeInPlace(mesh.getBoundingInfo().minimum);
244
+ maximum.maximizeInPlace(mesh.getBoundingInfo().maximum);
245
+ }
246
+ mesh._refreshBoundingInfoDirect(minmax);
247
+ if (i === 0) {
248
+ //console.log("Q", j, minimum + "", maximum + "");
249
+ }
250
+ }
251
+ resultDataOffset += 8 * this._processedMeshes.length;
177
252
  }
253
+ for (const resultBuffer of this._resultBuffers) {
254
+ resultBuffer.dispose();
255
+ }
256
+ this._resultBuffers = [];
257
+ this._uboIndex = 0;
258
+ resolve();
178
259
  });
179
260
  });
180
261
  }
@@ -183,6 +264,15 @@ export class ComputeShaderBoundingHelper {
183
264
  storageUnit[key].dispose();
184
265
  }
185
266
  }
267
+ _disposeForMeshList() {
268
+ for (const resultBuffer of this._resultBuffers) {
269
+ resultBuffer.dispose();
270
+ }
271
+ this._resultBuffers = [];
272
+ this._processedMeshes = [];
273
+ this._computeShaders = [];
274
+ this._uniqueComputeShaders = new Set();
275
+ }
186
276
  /** @internal */
187
277
  dispose() {
188
278
  this._disposeCache(this._positionBuffers);
@@ -195,15 +285,13 @@ export class ComputeShaderBoundingHelper {
195
285
  this._morphTargetInfluenceBuffers = {};
196
286
  this._disposeCache(this._morphTargetTextureIndexBuffers);
197
287
  this._morphTargetTextureIndexBuffers = {};
198
- this._resultBuffer.dispose();
199
- this._resultBuffer = undefined;
200
- this._resultData = undefined;
201
288
  for (const ubo of this._ubos) {
202
289
  ubo.dispose();
203
290
  }
204
291
  this._ubos = [];
205
- this._computeShaders = {};
206
- this._engine = null;
292
+ this._computeShadersCache = {};
293
+ this._engine = undefined;
294
+ this._disposeForMeshList();
207
295
  }
208
296
  }
209
297
  //# sourceMappingURL=computeShaderBoundingHelper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"computeShaderBoundingHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { ComputeShader } from \"core/Compute/computeShader\";\r\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\n\r\nimport \"../../ShadersWGSL/boundingInfo.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {\r\n private _engine: Nullable<AbstractEngine>;\r\n private _computeShaders: { [key: string]: ComputeShader } = {};\r\n private _positionBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetInfluenceBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetTextureIndexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _resultData: Float32Array;\r\n private _resultBuffer: StorageBuffer;\r\n private _ubos: UniformBuffer[] = [];\r\n private _uboIndex: number = 0;\r\n\r\n /**\r\n * Creates a new ComputeShaderBoundingHelper\r\n * @param engine defines the engine to use\r\n */\r\n constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n private _getComputeShader(defines: string[]) {\r\n let computeShader: ComputeShader;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (!this._computeShaders[join]) {\r\n computeShader = new ComputeShader(\"boundingInfoCompute\", this._engine!, \"boundingInfo\", {\r\n bindingsMapping: {\r\n positionBuffer: { group: 0, binding: 0 },\r\n resultBuffer: { group: 0, binding: 1 },\r\n boneSampler: { group: 0, binding: 2 },\r\n indexBuffer: { group: 0, binding: 3 },\r\n weightBuffer: { group: 0, binding: 4 },\r\n indexExtraBuffer: { group: 0, binding: 5 },\r\n weightExtraBuffer: { group: 0, binding: 6 },\r\n settings: { group: 0, binding: 7 },\r\n morphTargets: { group: 0, binding: 8 },\r\n morphTargetInfluences: { group: 0, binding: 9 },\r\n morphTargetTextureIndices: { group: 0, binding: 10 },\r\n },\r\n defines: defines,\r\n });\r\n this._computeShaders[join] = computeShader;\r\n } else {\r\n computeShader = this._computeShaders[join];\r\n }\r\n\r\n return computeShader;\r\n }\r\n\r\n private _getUBO() {\r\n if (this._uboIndex >= this._ubos.length) {\r\n const ubo = new UniformBuffer(this._engine!);\r\n ubo.addUniform(\"indexResult\", 4);\r\n ubo.addFloat3(\"morphTargetTextureInfo\", 0, 0, 0);\r\n this._ubos.push(ubo);\r\n }\r\n\r\n return this._ubos[this._uboIndex++];\r\n }\r\n\r\n private _extractDataAndLink(computeShader: ComputeShader, mesh: Mesh, kind: string, stride: number, name: string, storageUnit: { [key: number]: StorageBuffer }) {\r\n let buffer: StorageBuffer;\r\n const vertexCount = mesh.getTotalVertices();\r\n if (!storageUnit[mesh.uniqueId]) {\r\n const dataArray = mesh.getVertexBuffer(kind)?.getFloatData(vertexCount);\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * vertexCount * stride);\r\n buffer.update(dataArray!);\r\n\r\n storageUnit[mesh.uniqueId] = buffer;\r\n } else {\r\n buffer = storageUnit[mesh.uniqueId];\r\n }\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n private _prepareStorage(computeShader: ComputeShader, name: string, id: number, storageUnit: { [key: number]: StorageBuffer }, numInfluencers: number, data: Float32Array) {\r\n let buffer: StorageBuffer;\r\n if (!storageUnit[id]) {\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * numInfluencers);\r\n\r\n storageUnit[id] = buffer;\r\n } else {\r\n buffer = storageUnit[id];\r\n }\r\n buffer.update(data);\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n /** @internal */\r\n public processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n if (!Array.isArray(meshes)) {\r\n meshes = [meshes];\r\n }\r\n\r\n this._uboIndex = 0;\r\n\r\n // Results\r\n const resultDataSize = 8 * meshes.length;\r\n let resultData: Float32Array;\r\n let resultBuffer: StorageBuffer;\r\n if (!this._resultData || this._resultData.length !== resultDataSize) {\r\n this._resultBuffer?.dispose();\r\n\r\n resultData = new Float32Array(resultDataSize);\r\n resultBuffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);\r\n\r\n this._resultData = resultData;\r\n this._resultBuffer = resultBuffer;\r\n } else {\r\n resultData = this._resultData;\r\n resultBuffer = this._resultBuffer;\r\n }\r\n\r\n for (let i = 0; i < meshes.length; i++) {\r\n resultData[i * 8 + 0] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 1] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 2] = Number.POSITIVE_INFINITY;\r\n\r\n resultData[i * 8 + 3] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 4] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 5] = Number.NEGATIVE_INFINITY;\r\n }\r\n\r\n resultBuffer.update(resultData);\r\n\r\n const promises: Promise<void>[] = [];\r\n const processedMeshes: AbstractMesh[] = [];\r\n\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n const defines = [\"\"];\r\n\r\n if (vertexCount === 0 || !(mesh as Mesh).getVertexBuffer || !(mesh as Mesh).getVertexBuffer(VertexBuffer.PositionKind)) {\r\n continue;\r\n }\r\n\r\n processedMeshes.push(mesh);\r\n\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n }\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager && manager.numInfluencers > 0) {\r\n defines.push(\"MORPHTARGETS\");\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + manager.numInfluencers);\r\n }\r\n\r\n const computeShader = this._getComputeShader(defines);\r\n\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.PositionKind, 3, \"positionBuffer\", this._positionBuffers);\r\n\r\n // UBO\r\n const ubo = this._getUBO();\r\n ubo.updateUInt(\"indexResult\", processedMeshes.length - 1);\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton && mesh.skeleton.useTextureToStoreBoneMatrices) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesKind, 4, \"indexBuffer\", this._indexBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsKind, 4, \"weightBuffer\", this._weightBuffers);\r\n const boneSampler = mesh.skeleton.getTransformMatrixTexture(mesh);\r\n computeShader.setTexture(\"boneSampler\", boneSampler!, false);\r\n if (mesh.numBoneInfluencers > 4) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesExtraKind, 4, \"indexExtraBuffer\", this._indexExtraBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsExtraKind, 4, \"weightExtraBuffer\", this._weightExtraBuffers);\r\n }\r\n }\r\n\r\n // Morphs\r\n if (manager && manager.numInfluencers > 0) {\r\n const morphTargets = manager._targetStoreTexture;\r\n computeShader.setTexture(\"morphTargets\", morphTargets!, false);\r\n\r\n this._prepareStorage(computeShader, \"morphTargetInfluences\", mesh.uniqueId, this._morphTargetInfluenceBuffers, manager.numInfluencers, manager.influences);\r\n this._prepareStorage(\r\n computeShader,\r\n \"morphTargetTextureIndices\",\r\n mesh.uniqueId,\r\n this._morphTargetTextureIndexBuffers,\r\n manager.numInfluencers,\r\n manager._morphTargetTextureIndices\r\n );\r\n ubo.updateFloat3(\"morphTargetTextureInfo\", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);\r\n }\r\n\r\n ubo.update();\r\n\r\n computeShader.setStorageBuffer(\"resultBuffer\", resultBuffer);\r\n computeShader.setUniformBuffer(\"settings\", ubo);\r\n\r\n // Dispatch\r\n promises.push(computeShader.dispatchWhenReady(Math.ceil(vertexCount / 64)));\r\n }\r\n\r\n if (promises.length === 0) {\r\n return Promise.resolve();\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n return resultBuffer.read(undefined, undefined, resultData, true).then(() => {\r\n for (let i = 0; i < processedMeshes.length; i++) {\r\n const mesh = processedMeshes[i];\r\n mesh._refreshBoundingInfoDirect({\r\n minimum: Vector3.FromArray(resultData, i * 8),\r\n maximum: Vector3.FromArray(resultData, i * 8 + 3),\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n private _disposeCache(storageUnit: { [key: number]: StorageBuffer }) {\r\n for (const key in storageUnit) {\r\n storageUnit[key].dispose();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n this._disposeCache(this._positionBuffers);\r\n this._positionBuffers = {};\r\n this._disposeCache(this._indexBuffers);\r\n this._indexBuffers = {};\r\n this._disposeCache(this._weightBuffers);\r\n this._weightBuffers = {};\r\n this._disposeCache(this._morphTargetInfluenceBuffers);\r\n this._morphTargetInfluenceBuffers = {};\r\n this._disposeCache(this._morphTargetTextureIndexBuffers);\r\n this._morphTargetTextureIndexBuffers = {};\r\n this._resultBuffer.dispose();\r\n this._resultBuffer = undefined!;\r\n this._resultData = undefined!;\r\n for (const ubo of this._ubos) {\r\n ubo.dispose();\r\n }\r\n this._ubos = [];\r\n this._computeShaders = {};\r\n this._engine = null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"computeShaderBoundingHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { ComputeShader } from \"core/Compute/computeShader\";\r\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport type { ComputeBindingMapping } from \"core/Engines/Extensions/engine.computeShader\";\r\n\r\nimport \"../../ShadersWGSL/boundingInfo.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {\r\n private _engine: AbstractEngine;\r\n private _computeShadersCache: { [key: string]: ComputeShader } = {};\r\n private _positionBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetInfluenceBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetTextureIndexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _ubos: UniformBuffer[] = [];\r\n private _uboIndex: number = 0;\r\n private _processedMeshes: AbstractMesh[] = [];\r\n private _computeShaders: ComputeShader[][] = [];\r\n private _uniqueComputeShaders: Set<ComputeShader> = new Set();\r\n private _resultBuffers: StorageBuffer[] = [];\r\n\r\n /**\r\n * Creates a new ComputeShaderBoundingHelper\r\n * @param engine defines the engine to use\r\n */\r\n constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n private _getComputeShader(defines: string[], hasBones: boolean, hasMorphs: boolean) {\r\n let computeShader: ComputeShader;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (!this._computeShadersCache[join]) {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n positionBuffer: { group: 0, binding: 0 },\r\n resultBuffer: { group: 0, binding: 1 },\r\n settings: { group: 0, binding: 7 },\r\n };\r\n\r\n if (hasBones) {\r\n bindingsMapping.boneSampler = { group: 0, binding: 2 };\r\n bindingsMapping.indexBuffer = { group: 0, binding: 3 };\r\n bindingsMapping.weightBuffer = { group: 0, binding: 4 };\r\n bindingsMapping.indexExtraBuffer = { group: 0, binding: 5 };\r\n bindingsMapping.weightExtraBuffer = { group: 0, binding: 6 };\r\n }\r\n if (hasMorphs) {\r\n bindingsMapping.morphTargets = { group: 0, binding: 8 };\r\n bindingsMapping.morphTargetInfluences = { group: 0, binding: 9 };\r\n bindingsMapping.morphTargetTextureIndices = { group: 0, binding: 10 };\r\n }\r\n\r\n computeShader = new ComputeShader(`boundingInfoCompute${hasBones ? \"_bones\" : \"\"}${hasMorphs ? \"_morphs\" : \"\"}`, this._engine, \"boundingInfo\", {\r\n bindingsMapping,\r\n defines: defines,\r\n });\r\n this._computeShadersCache[join] = computeShader;\r\n } else {\r\n computeShader = this._computeShadersCache[join];\r\n }\r\n\r\n return computeShader;\r\n }\r\n\r\n private _getUBO() {\r\n if (this._uboIndex >= this._ubos.length) {\r\n const ubo = new UniformBuffer(this._engine);\r\n ubo.addFloat3(\"morphTargetTextureInfo\", 0, 0, 0);\r\n ubo.addUniform(\"morphTargetCount\", 1);\r\n ubo.addUniform(\"indexResult\", 1);\r\n this._ubos.push(ubo);\r\n }\r\n\r\n return this._ubos[this._uboIndex++];\r\n }\r\n\r\n private _extractDataAndLink(computeShader: ComputeShader, mesh: Mesh, kind: string, stride: number, name: string, storageUnit: { [key: number]: StorageBuffer }) {\r\n let buffer: StorageBuffer;\r\n const vertexCount = mesh.getTotalVertices();\r\n if (!storageUnit[mesh.uniqueId]) {\r\n const dataArray = mesh.getVertexBuffer(kind)?.getFloatData(vertexCount);\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * vertexCount * stride);\r\n buffer.update(dataArray!);\r\n\r\n storageUnit[mesh.uniqueId] = buffer;\r\n } else {\r\n buffer = storageUnit[mesh.uniqueId];\r\n }\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n private _prepareStorage(computeShader: ComputeShader, name: string, id: number, storageUnit: { [key: number]: StorageBuffer }, numInfluencers: number, data: Float32Array) {\r\n let buffer: StorageBuffer;\r\n if (!storageUnit[id]) {\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * numInfluencers);\r\n\r\n storageUnit[id] = buffer;\r\n } else {\r\n buffer = storageUnit[id];\r\n }\r\n buffer.update(data);\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n /** @internal */\r\n public async processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n await this.registerMeshListAsync(meshes);\r\n this.processMeshList();\r\n await this.fetchResultsForMeshListAsync();\r\n }\r\n\r\n /** @internal */\r\n public registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n this._disposeForMeshList();\r\n\r\n if (!Array.isArray(meshes)) {\r\n meshes = [meshes];\r\n }\r\n\r\n let maxNumInfluencers = 0;\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n if (vertexCount === 0 || !(mesh as Mesh).getVertexBuffer || !(mesh as Mesh).getVertexBuffer(VertexBuffer.PositionKind)) {\r\n continue;\r\n }\r\n\r\n this._processedMeshes.push(mesh);\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager) {\r\n maxNumInfluencers = Math.max(maxNumInfluencers, manager.numTargets);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n let defines = [\"\"];\r\n\r\n let hasBones = false;\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n hasBones = true;\r\n }\r\n\r\n const computeShaderWithoutMorph = this._getComputeShader(defines, hasBones, false);\r\n\r\n this._uniqueComputeShaders.add(computeShaderWithoutMorph);\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager) {\r\n defines = defines.slice();\r\n defines.push(\"#define MORPHTARGETS\");\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + maxNumInfluencers);\r\n\r\n const computeShaderWithMorph = this._getComputeShader(defines, hasBones, true);\r\n\r\n this._uniqueComputeShaders.add(computeShaderWithMorph);\r\n this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithMorph]);\r\n } else {\r\n this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithoutMorph]);\r\n }\r\n\r\n // Pre-build the ubos, as they won't change if there's no morph targets\r\n const ubo = this._getUBO();\r\n ubo.updateUInt(\"indexResult\", i);\r\n\r\n ubo.update();\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const check = () => {\r\n const iterator = this._uniqueComputeShaders.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const computeShader = key.value;\r\n if (!computeShader.isReady()) {\r\n setTimeout(check, 10);\r\n return;\r\n }\r\n }\r\n resolve();\r\n };\r\n check();\r\n });\r\n }\r\n\r\n /** @internal */\r\n public processMeshList(): void {\r\n if (this._processedMeshes.length === 0) {\r\n return;\r\n }\r\n\r\n this._uboIndex = 0;\r\n\r\n const resultDataSize = 8 * this._processedMeshes.length;\r\n const resultData = new Float32Array(resultDataSize);\r\n\r\n const resultBuffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);\r\n this._resultBuffers.push(resultBuffer);\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n resultData[i * 8 + 0] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 1] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 2] = Number.POSITIVE_INFINITY;\r\n\r\n resultData[i * 8 + 3] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 4] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 5] = Number.NEGATIVE_INFINITY;\r\n }\r\n\r\n resultBuffer.update(resultData);\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n const [computeShaderWithoutMorph, computeShaderWithMorph] = this._computeShaders[i];\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n const hasMorphs = manager && manager.numInfluencers > 0;\r\n const computeShader = hasMorphs ? computeShaderWithMorph : computeShaderWithoutMorph;\r\n\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.PositionKind, 3, \"positionBuffer\", this._positionBuffers);\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton && mesh.skeleton.useTextureToStoreBoneMatrices) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesKind, 4, \"indexBuffer\", this._indexBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsKind, 4, \"weightBuffer\", this._weightBuffers);\r\n const boneSampler = mesh.skeleton.getTransformMatrixTexture(mesh);\r\n computeShader.setTexture(\"boneSampler\", boneSampler!, false);\r\n if (mesh.numBoneInfluencers > 4) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesExtraKind, 4, \"indexExtraBuffer\", this._indexExtraBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsExtraKind, 4, \"weightExtraBuffer\", this._weightExtraBuffers);\r\n }\r\n }\r\n\r\n const ubo = this._getUBO();\r\n\r\n // Morphs\r\n if (hasMorphs) {\r\n const morphTargets = manager._targetStoreTexture;\r\n computeShader.setTexture(\"morphTargets\", morphTargets!, false);\r\n\r\n this._prepareStorage(computeShader, \"morphTargetInfluences\", mesh.uniqueId, this._morphTargetInfluenceBuffers, manager.numInfluencers, manager.influences);\r\n this._prepareStorage(\r\n computeShader,\r\n \"morphTargetTextureIndices\",\r\n mesh.uniqueId,\r\n this._morphTargetTextureIndexBuffers,\r\n manager.numInfluencers,\r\n manager._morphTargetTextureIndices\r\n );\r\n\r\n ubo.updateFloat3(\"morphTargetTextureInfo\", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);\r\n ubo.updateInt(\"morphTargetCount\", manager.numInfluencers);\r\n ubo.update();\r\n }\r\n\r\n computeShader.setStorageBuffer(\"resultBuffer\", resultBuffer);\r\n\r\n computeShader.setUniformBuffer(\"settings\", ubo);\r\n\r\n // Dispatch\r\n computeShader.dispatch(Math.ceil(vertexCount / 256));\r\n\r\n this._engine.flushFramebuffer();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public fetchResultsForMeshListAsync(): Promise<void> {\r\n return new Promise((resolve) => {\r\n const buffers: DataBuffer[] = [];\r\n let size = 0;\r\n for (let i = 0; i < this._resultBuffers.length; i++) {\r\n const buffer = this._resultBuffers[i].getBuffer();\r\n buffers.push(buffer);\r\n size += buffer.capacity;\r\n }\r\n\r\n const resultData = new Float32Array(size / Float32Array.BYTES_PER_ELEMENT);\r\n\r\n const minimum = Vector3.Zero();\r\n const maximum = Vector3.Zero();\r\n\r\n const minmax = { minimum, maximum };\r\n\r\n (this._engine as WebGPUEngine).readFromMultipleStorageBuffers(buffers, 0, undefined, resultData, true).then(() => {\r\n let resultDataOffset = 0;\r\n for (let j = 0; j < this._resultBuffers.length; j++) {\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n\r\n Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8, minimum);\r\n Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8 + 3, maximum);\r\n\r\n if (j > 0) {\r\n minimum.minimizeInPlace(mesh.getBoundingInfo().minimum);\r\n maximum.maximizeInPlace(mesh.getBoundingInfo().maximum);\r\n }\r\n\r\n mesh._refreshBoundingInfoDirect(minmax);\r\n\r\n if (i === 0) {\r\n //console.log(\"Q\", j, minimum + \"\", maximum + \"\");\r\n }\r\n }\r\n\r\n resultDataOffset += 8 * this._processedMeshes.length;\r\n }\r\n\r\n for (const resultBuffer of this._resultBuffers) {\r\n resultBuffer.dispose();\r\n }\r\n\r\n this._resultBuffers = [];\r\n this._uboIndex = 0;\r\n\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n private _disposeCache(storageUnit: { [key: number]: StorageBuffer }) {\r\n for (const key in storageUnit) {\r\n storageUnit[key].dispose();\r\n }\r\n }\r\n\r\n private _disposeForMeshList() {\r\n for (const resultBuffer of this._resultBuffers) {\r\n resultBuffer.dispose();\r\n }\r\n this._resultBuffers = [];\r\n this._processedMeshes = [];\r\n this._computeShaders = [];\r\n this._uniqueComputeShaders = new Set();\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n this._disposeCache(this._positionBuffers);\r\n this._positionBuffers = {};\r\n this._disposeCache(this._indexBuffers);\r\n this._indexBuffers = {};\r\n this._disposeCache(this._weightBuffers);\r\n this._weightBuffers = {};\r\n this._disposeCache(this._morphTargetInfluenceBuffers);\r\n this._morphTargetInfluenceBuffers = {};\r\n this._disposeCache(this._morphTargetTextureIndexBuffers);\r\n this._morphTargetTextureIndexBuffers = {};\r\n for (const ubo of this._ubos) {\r\n ubo.dispose();\r\n }\r\n this._ubos = [];\r\n this._computeShadersCache = {};\r\n this._engine = undefined!;\r\n this._disposeForMeshList();\r\n }\r\n}\r\n"]}
@@ -5,9 +5,13 @@ import "../../Shaders/gpuTransform.vertex";
5
5
  import "../../Shaders/gpuTransform.fragment";
6
6
  /** @internal */
7
7
  export declare class TransformFeedbackBoundingHelper implements IBoundingInfoHelperPlatform {
8
+ private static _Min;
9
+ private static _Max;
8
10
  private _engine;
9
11
  private _buffers;
10
12
  private _effects;
13
+ private _meshList;
14
+ private _meshListCounter;
11
15
  /**
12
16
  * Creates a new TransformFeedbackBoundingHelper
13
17
  * @param engine defines the engine to use
@@ -15,7 +19,14 @@ export declare class TransformFeedbackBoundingHelper implements IBoundingInfoHel
15
19
  constructor(engine: ThinEngine);
16
20
  /** @internal */
17
21
  processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void>;
22
+ private _processMeshList;
18
23
  private _compute;
19
24
  /** @internal */
25
+ registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void>;
26
+ /** @internal */
27
+ processMeshList(): void;
28
+ /** @internal */
29
+ fetchResultsForMeshListAsync(): Promise<void>;
30
+ /** @internal */
20
31
  dispose(): void;
21
32
  }
@@ -1,6 +1,8 @@
1
1
  import { VertexBuffer, Buffer } from "../../Buffers/buffer.js";
2
2
 
3
3
  import { BindBonesParameters, BindMorphTargetParameters, PrepareAttributesForBakedVertexAnimation } from "../../Materials/materialHelper.functions.js";
4
+ import { extractMinAndMax } from "../../Maths/math.functions.js";
5
+ import { Vector3 } from "../../Maths/math.vector.js";
4
6
  import "../../Shaders/gpuTransform.vertex.js";
5
7
  import "../../Shaders/gpuTransform.fragment.js";
6
8
  /** @internal */
@@ -12,6 +14,7 @@ export class TransformFeedbackBoundingHelper {
12
14
  constructor(engine) {
13
15
  this._buffers = {};
14
16
  this._effects = {};
17
+ this._meshListCounter = 0;
15
18
  this._engine = engine;
16
19
  }
17
20
  /** @internal */
@@ -19,7 +22,13 @@ export class TransformFeedbackBoundingHelper {
19
22
  if (!Array.isArray(meshes)) {
20
23
  meshes = [meshes];
21
24
  }
22
- const promises = [];
25
+ this._meshListCounter = 0;
26
+ this._processMeshList(meshes);
27
+ return Promise.resolve();
28
+ }
29
+ _processMeshList(meshes) {
30
+ const parallelShaderCompile = this._engine.getCaps().parallelShaderCompile;
31
+ this._engine.getCaps().parallelShaderCompile = undefined;
23
32
  for (let i = 0; i < meshes.length; ++i) {
24
33
  const mesh = meshes[i];
25
34
  const vertexCount = mesh.getTotalVertices();
@@ -129,19 +138,9 @@ export class TransformFeedbackBoundingHelper {
129
138
  else {
130
139
  computeEffect = this._effects[join];
131
140
  }
132
- promises.push(new Promise((resolve) => {
133
- if (computeEffect.isReady()) {
134
- this._compute(mesh, computeEffect);
135
- resolve();
136
- return;
137
- }
138
- computeEffect.onCompileObservable.addOnce(() => {
139
- this._compute(mesh, computeEffect);
140
- resolve();
141
- });
142
- }));
141
+ this._compute(mesh, computeEffect);
143
142
  }
144
- return Promise.all(promises).then(() => { });
143
+ this._engine.getCaps().parallelShaderCompile = parallelShaderCompile;
145
144
  }
146
145
  _compute(mesh, effect) {
147
146
  const engine = this._engine;
@@ -182,7 +181,38 @@ export class TransformFeedbackBoundingHelper {
182
181
  engine.readTransformFeedbackBuffer(arrayBuffer);
183
182
  engine.bindTransformFeedbackBuffer(null);
184
183
  // Update mesh
185
- mesh._refreshBoundingInfo(arrayBuffer, null);
184
+ if (this._meshListCounter === 0) {
185
+ mesh._refreshBoundingInfo(arrayBuffer, null);
186
+ }
187
+ else {
188
+ const bb = mesh.getBoundingInfo().boundingBox;
189
+ const extend = extractMinAndMax(arrayBuffer, 0, vertexCount);
190
+ TransformFeedbackBoundingHelper._Min.copyFrom(bb.minimum).minimizeInPlace(extend.minimum);
191
+ TransformFeedbackBoundingHelper._Max.copyFrom(bb.maximum).maximizeInPlace(extend.maximum);
192
+ mesh._refreshBoundingInfoDirect({ minimum: TransformFeedbackBoundingHelper._Min, maximum: TransformFeedbackBoundingHelper._Max });
193
+ }
194
+ }
195
+ /** @internal */
196
+ registerMeshListAsync(meshes) {
197
+ if (!Array.isArray(meshes)) {
198
+ meshes = [meshes];
199
+ }
200
+ this._meshList = meshes;
201
+ this._meshListCounter = 0;
202
+ return Promise.resolve();
203
+ }
204
+ /** @internal */
205
+ processMeshList() {
206
+ if (this._meshList.length === 0) {
207
+ return;
208
+ }
209
+ this._processMeshList(this._meshList);
210
+ this._meshListCounter++;
211
+ }
212
+ /** @internal */
213
+ fetchResultsForMeshListAsync() {
214
+ this._meshListCounter = 0;
215
+ return Promise.resolve();
186
216
  }
187
217
  /** @internal */
188
218
  dispose() {
@@ -194,4 +224,6 @@ export class TransformFeedbackBoundingHelper {
194
224
  this._engine = null;
195
225
  }
196
226
  }
227
+ TransformFeedbackBoundingHelper._Min = new Vector3();
228
+ TransformFeedbackBoundingHelper._Max = new Vector3();
197
229
  //# sourceMappingURL=transformFeedbackBoundingHelper.js.map