@babylonjs/core 6.45.0 → 6.46.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 (235) hide show
  1. package/Animations/animation.js +1 -1
  2. package/Animations/animation.js.map +1 -1
  3. package/BakedVertexAnimation/bakedVertexAnimationManager.js +2 -1
  4. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
  5. package/Bones/skeleton.js +2 -2
  6. package/Bones/skeleton.js.map +1 -1
  7. package/Cameras/camera.d.ts +3 -3
  8. package/Cameras/camera.js +2 -1
  9. package/Cameras/camera.js.map +1 -1
  10. package/Cameras/cameraInputsManager.js +1 -1
  11. package/Cameras/cameraInputsManager.js.map +1 -1
  12. package/Cameras/targetCamera.js +4 -0
  13. package/Cameras/targetCamera.js.map +1 -1
  14. package/Compute/computeShader.d.ts +4 -2
  15. package/Compute/computeShader.js +7 -3
  16. package/Compute/computeShader.js.map +1 -1
  17. package/Debug/directionalLightFrustumViewer.js +6 -6
  18. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  19. package/Engines/Extensions/engine.computeShader.d.ts +2 -1
  20. package/Engines/Extensions/engine.computeShader.js +1 -0
  21. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  22. package/Engines/Extensions/engine.rawTexture.js +3 -3
  23. package/Engines/Extensions/engine.rawTexture.js.map +1 -1
  24. package/Engines/Native/nativePipelineContext.js +1 -1
  25. package/Engines/Native/nativePipelineContext.js.map +1 -1
  26. package/Engines/WebGL/webGLPipelineContext.js +1 -1
  27. package/Engines/WebGL/webGLPipelineContext.js.map +1 -1
  28. package/Engines/WebGPU/webgpuComputeContext.js +7 -3
  29. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  30. package/Engines/engine.d.ts +1 -1
  31. package/Engines/thinEngine.js +2 -2
  32. package/Engines/thinEngine.js.map +1 -1
  33. package/Engines/webgpuEngine.js +2 -15
  34. package/Engines/webgpuEngine.js.map +1 -1
  35. package/Layers/glowLayer.js +2 -1
  36. package/Layers/glowLayer.js.map +1 -1
  37. package/Layers/highlightLayer.js +2 -1
  38. package/Layers/highlightLayer.js.map +1 -1
  39. package/Lights/light.js +2 -1
  40. package/Lights/light.js.map +1 -1
  41. package/Loading/Plugins/babylonFileLoader.js +9 -0
  42. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  43. package/Loading/sceneLoader.d.ts +6 -1
  44. package/Loading/sceneLoader.js +6 -5
  45. package/Loading/sceneLoader.js.map +1 -1
  46. package/Materials/Background/backgroundMaterial.js +2 -1
  47. package/Materials/Background/backgroundMaterial.js.map +1 -1
  48. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +1 -1
  49. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  50. package/Materials/Node/nodeMaterial.d.ts +2 -1
  51. package/Materials/Node/nodeMaterial.js +5 -1
  52. package/Materials/Node/nodeMaterial.js.map +1 -1
  53. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -1
  54. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  55. package/Materials/PBR/pbrMaterial.js +2 -1
  56. package/Materials/PBR/pbrMaterial.js.map +1 -1
  57. package/Materials/PBR/pbrMetallicRoughnessMaterial.js +2 -1
  58. package/Materials/PBR/pbrMetallicRoughnessMaterial.js.map +1 -1
  59. package/Materials/PBR/pbrSpecularGlossinessMaterial.js +2 -1
  60. package/Materials/PBR/pbrSpecularGlossinessMaterial.js.map +1 -1
  61. package/Materials/Textures/baseTexture.js +2 -1
  62. package/Materials/Textures/baseTexture.js.map +1 -1
  63. package/Materials/Textures/cubeTexture.js +2 -1
  64. package/Materials/Textures/cubeTexture.js.map +1 -1
  65. package/Materials/Textures/rawCubeTexture.js +1 -1
  66. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  67. package/Materials/Textures/texture.js +2 -1
  68. package/Materials/Textures/texture.js.map +1 -1
  69. package/Materials/colorCurves.d.ts +1 -1
  70. package/Materials/colorCurves.functions.d.ts +5 -0
  71. package/Materials/colorCurves.functions.js +8 -0
  72. package/Materials/colorCurves.functions.js.map +1 -0
  73. package/Materials/colorCurves.js +8 -8
  74. package/Materials/colorCurves.js.map +1 -1
  75. package/Materials/fresnelParameters.js +1 -1
  76. package/Materials/fresnelParameters.js.map +1 -1
  77. package/Materials/imageProcessingConfiguration.d.ts +3 -48
  78. package/Materials/imageProcessingConfiguration.defines.d.ts +46 -0
  79. package/Materials/imageProcessingConfiguration.defines.js +27 -0
  80. package/Materials/imageProcessingConfiguration.defines.js.map +1 -0
  81. package/Materials/imageProcessingConfiguration.functions.d.ts +13 -0
  82. package/Materials/imageProcessingConfiguration.functions.js +41 -0
  83. package/Materials/imageProcessingConfiguration.functions.js.map +1 -0
  84. package/Materials/imageProcessingConfiguration.js +18 -69
  85. package/Materials/imageProcessingConfiguration.js.map +1 -1
  86. package/Materials/material.js +2 -1
  87. package/Materials/material.js.map +1 -1
  88. package/Materials/materialHelper.d.ts +33 -33
  89. package/Materials/materialHelper.js +244 -286
  90. package/Materials/materialHelper.js.map +1 -1
  91. package/Materials/materialPluginBase.js +2 -1
  92. package/Materials/materialPluginBase.js.map +1 -1
  93. package/Materials/materialStencilState.js +2 -1
  94. package/Materials/materialStencilState.js.map +1 -1
  95. package/Materials/shaderMaterial.js +1 -1
  96. package/Materials/shaderMaterial.js.map +1 -1
  97. package/Materials/standardMaterial.d.ts +1 -1
  98. package/Materials/standardMaterial.js +2 -1
  99. package/Materials/standardMaterial.js.map +1 -1
  100. package/Materials/uniformBuffer.js +2 -2
  101. package/Materials/uniformBuffer.js.map +1 -1
  102. package/Maths/math.color.d.ts +392 -66
  103. package/Maths/math.color.js +541 -65
  104. package/Maths/math.color.js.map +1 -1
  105. package/Maths/math.like.d.ts +17 -28
  106. package/Maths/math.like.js.map +1 -1
  107. package/Maths/math.plane.d.ts +2 -1
  108. package/Maths/math.plane.js.map +1 -1
  109. package/Maths/math.polar.d.ts +1 -1
  110. package/Maths/math.polar.js.map +1 -1
  111. package/Maths/math.scalar.d.ts +6 -6
  112. package/Maths/math.scalar.functions.d.ts +51 -0
  113. package/Maths/math.scalar.functions.js +80 -0
  114. package/Maths/math.scalar.functions.js.map +1 -0
  115. package/Maths/math.scalar.js +48 -73
  116. package/Maths/math.scalar.js.map +1 -1
  117. package/Maths/math.vector.d.ts +571 -72
  118. package/Maths/math.vector.js +917 -119
  119. package/Maths/math.vector.js.map +1 -1
  120. package/Maths/math.viewport.d.ts +2 -1
  121. package/Maths/math.viewport.js.map +1 -1
  122. package/Maths/tensor.d.ts +411 -0
  123. package/Maths/tensor.js +3 -0
  124. package/Maths/tensor.js.map +1 -0
  125. package/Meshes/Node/Blocks/Set/setColorsBlock.js +20 -4
  126. package/Meshes/Node/Blocks/Set/setColorsBlock.js.map +1 -1
  127. package/Meshes/Node/nodeGeometry.js +2 -1
  128. package/Meshes/Node/nodeGeometry.js.map +1 -1
  129. package/Meshes/mesh.js +2 -2
  130. package/Meshes/mesh.js.map +1 -1
  131. package/Meshes/mesh.vertexData.d.ts +4 -0
  132. package/Meshes/mesh.vertexData.js +10 -0
  133. package/Meshes/mesh.vertexData.js.map +1 -1
  134. package/Meshes/transformNode.js +2 -1
  135. package/Meshes/transformNode.js.map +1 -1
  136. package/Misc/arrayTools.d.ts +2 -19
  137. package/Misc/arrayTools.js.map +1 -1
  138. package/Misc/decorators.d.ts +0 -80
  139. package/Misc/decorators.functions.d.ts +7 -0
  140. package/Misc/decorators.functions.js +52 -0
  141. package/Misc/decorators.functions.js.map +1 -0
  142. package/Misc/decorators.js +2 -318
  143. package/Misc/decorators.js.map +1 -1
  144. package/Misc/decorators.serialization.d.ts +81 -0
  145. package/Misc/decorators.serialization.js +269 -0
  146. package/Misc/decorators.serialization.js.map +1 -0
  147. package/Misc/index.d.ts +1 -0
  148. package/Misc/index.js +1 -0
  149. package/Misc/index.js.map +1 -1
  150. package/Misc/sceneRecorder.js +1 -1
  151. package/Misc/sceneRecorder.js.map +1 -1
  152. package/Misc/sceneSerializer.js +8 -1
  153. package/Misc/sceneSerializer.js.map +1 -1
  154. package/Misc/tools.functions.d.ts +14 -0
  155. package/Misc/tools.functions.js +23 -0
  156. package/Misc/tools.functions.js.map +1 -0
  157. package/Misc/tools.js +5 -6
  158. package/Misc/tools.js.map +1 -1
  159. package/Morph/morphTarget.js +2 -1
  160. package/Morph/morphTarget.js.map +1 -1
  161. package/Particles/EmitterTypes/boxParticleEmitter.js +8 -8
  162. package/Particles/EmitterTypes/boxParticleEmitter.js.map +1 -1
  163. package/Particles/baseParticleSystem.d.ts +8 -11
  164. package/Particles/baseParticleSystem.js +9 -40
  165. package/Particles/baseParticleSystem.js.map +1 -1
  166. package/Particles/gpuParticleSystem.d.ts +71 -1
  167. package/Particles/gpuParticleSystem.js +102 -1
  168. package/Particles/gpuParticleSystem.js.map +1 -1
  169. package/Particles/particle.d.ts +3 -3
  170. package/Particles/particle.js +3 -3
  171. package/Particles/particle.js.map +1 -1
  172. package/Particles/particleSystem.d.ts +81 -455
  173. package/Particles/particleSystem.functions.d.ts +61 -0
  174. package/Particles/particleSystem.functions.js +79 -0
  175. package/Particles/particleSystem.functions.js.map +1 -0
  176. package/Particles/particleSystem.js +390 -1984
  177. package/Particles/particleSystem.js.map +1 -1
  178. package/Particles/thinParticleSystem.d.ts +485 -0
  179. package/Particles/thinParticleSystem.js +1768 -0
  180. package/Particles/thinParticleSystem.js.map +1 -0
  181. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +2 -1
  182. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  183. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +2 -1
  184. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  185. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +2 -1
  186. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  187. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +2 -1
  188. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  189. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +2 -1
  190. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  191. package/PostProcesses/blackAndWhitePostProcess.js +2 -1
  192. package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
  193. package/PostProcesses/blurPostProcess.js +2 -1
  194. package/PostProcesses/blurPostProcess.js.map +1 -1
  195. package/PostProcesses/chromaticAberrationPostProcess.js +2 -1
  196. package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
  197. package/PostProcesses/colorCorrectionPostProcess.js +2 -1
  198. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  199. package/PostProcesses/convolutionPostProcess.js +2 -1
  200. package/PostProcesses/convolutionPostProcess.js.map +1 -1
  201. package/PostProcesses/displayPassPostProcess.js +1 -1
  202. package/PostProcesses/displayPassPostProcess.js.map +1 -1
  203. package/PostProcesses/filterPostProcess.js +2 -1
  204. package/PostProcesses/filterPostProcess.js.map +1 -1
  205. package/PostProcesses/fxaaPostProcess.js +1 -1
  206. package/PostProcesses/fxaaPostProcess.js.map +1 -1
  207. package/PostProcesses/grainPostProcess.js +2 -1
  208. package/PostProcesses/grainPostProcess.js.map +1 -1
  209. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  210. package/PostProcesses/motionBlurPostProcess.js +2 -1
  211. package/PostProcesses/motionBlurPostProcess.js.map +1 -1
  212. package/PostProcesses/passPostProcess.js +1 -1
  213. package/PostProcesses/passPostProcess.js.map +1 -1
  214. package/PostProcesses/postProcess.js +2 -1
  215. package/PostProcesses/postProcess.js.map +1 -1
  216. package/PostProcesses/refractionPostProcess.js +2 -1
  217. package/PostProcesses/refractionPostProcess.js.map +1 -1
  218. package/PostProcesses/screenSpaceCurvaturePostProcess.js +2 -1
  219. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  220. package/PostProcesses/screenSpaceReflectionPostProcess.js +2 -1
  221. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  222. package/PostProcesses/sharpenPostProcess.js +2 -1
  223. package/PostProcesses/sharpenPostProcess.js.map +1 -1
  224. package/Probes/reflectionProbe.js +2 -1
  225. package/Probes/reflectionProbe.js.map +1 -1
  226. package/Sprites/spriteManager.d.ts +4 -0
  227. package/Sprites/spriteManager.js.map +1 -1
  228. package/XR/features/WebXRControllerTeleportation.d.ts +9 -0
  229. package/XR/features/WebXRControllerTeleportation.js +75 -31
  230. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  231. package/node.js +2 -1
  232. package/node.js.map +1 -1
  233. package/package.json +1 -1
  234. package/types.d.ts +105 -0
  235. package/types.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"targetCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/targetCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsVector3, serializeAsMeshReference } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Camera } from \"./camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3, Vector2, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n/**\r\n * A target camera takes a mesh or position as a target and continues to look at it while it moves.\r\n * This is the base of the follow, arc rotate cameras and Free camera\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n */\r\nexport class TargetCamera extends Camera {\r\n private static _RigCamTransformMatrix = new Matrix();\r\n private static _TargetTransformMatrix = new Matrix();\r\n private static _TargetFocalPoint = new Vector3();\r\n\r\n private _tmpUpVector = Vector3.Zero();\r\n private _tmpTargetVector = Vector3.Zero();\r\n\r\n /**\r\n * Define the current direction the camera is moving to\r\n */\r\n public cameraDirection = new Vector3(0, 0, 0);\r\n /**\r\n * Define the current rotation the camera is rotating to\r\n */\r\n public cameraRotation = new Vector2(0, 0);\r\n\r\n /** Gets or sets a boolean indicating that the scaling of the parent hierarchy will not be taken in account by the camera */\r\n public ignoreParentScaling = false;\r\n\r\n /**\r\n * When set, the up vector of the camera will be updated by the rotation of the camera\r\n */\r\n public updateUpVectorFromRotation = false;\r\n private _tmpQuaternion = new Quaternion();\r\n\r\n /**\r\n * Define the current rotation of the camera\r\n */\r\n @serializeAsVector3()\r\n public rotation = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Define the current rotation of the camera as a quaternion to prevent Gimbal lock\r\n */\r\n public rotationQuaternion: Quaternion;\r\n\r\n /**\r\n * Define the current speed of the camera\r\n */\r\n @serialize()\r\n public speed = 2.0;\r\n\r\n /**\r\n * Add constraint to the camera to prevent it to move freely in all directions and\r\n * around all axis.\r\n */\r\n public noRotationConstraint = false;\r\n\r\n /**\r\n * Reverses mouselook direction to 'natural' panning as opposed to traditional direct\r\n * panning\r\n */\r\n public invertRotation = false;\r\n\r\n /**\r\n * Speed multiplier for inverse camera panning\r\n */\r\n public inverseRotationSpeed = 0.2;\r\n\r\n /**\r\n * Define the current target of the camera as an object or a position.\r\n * Please note that locking a target will disable panning.\r\n */\r\n @serializeAsMeshReference(\"lockedTargetId\")\r\n public lockedTarget: any = null;\r\n\r\n /** @internal */\r\n public _currentTarget = Vector3.Zero();\r\n /** @internal */\r\n public _initialFocalDistance = 1;\r\n /** @internal */\r\n public _viewMatrix = Matrix.Zero();\r\n /** @internal */\r\n public _camMatrix = Matrix.Zero();\r\n /** @internal */\r\n public _cameraTransformMatrix = Matrix.Zero();\r\n /** @internal */\r\n public _cameraRotationMatrix = Matrix.Zero();\r\n\r\n /** @internal */\r\n public _referencePoint = new Vector3(0, 0, 1);\r\n /** @internal */\r\n public _transformedReferencePoint = Vector3.Zero();\r\n\r\n protected _deferredPositionUpdate = new Vector3();\r\n protected _deferredRotationQuaternionUpdate = new Quaternion();\r\n protected _deferredRotationUpdate = new Vector3();\r\n protected _deferredUpdated = false;\r\n protected _deferOnly: boolean = false;\r\n\r\n /** @internal */\r\n public _reset: () => void;\r\n\r\n private _defaultUp = Vector3.Up();\r\n\r\n /**\r\n * Instantiates a target camera that takes a mesh or position as a target and continues to look at it while it moves.\r\n * This is the base of the follow, arc rotate cameras and Free camera\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n * @param name Defines the name of the camera in the scene\r\n * @param position Defines the start position of the camera in the scene\r\n * @param scene Defines the scene the camera belongs to\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, position, scene, setActiveOnSceneIfNoneActive);\r\n }\r\n\r\n /**\r\n * Gets the position in front of the camera at a given distance.\r\n * @param distance The distance from the camera we want the position to be\r\n * @returns the position\r\n */\r\n public getFrontPosition(distance: number): Vector3 {\r\n this.getWorldMatrix();\r\n const direction = this.getTarget().subtract(this.position);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n return this.globalPosition.add(direction);\r\n }\r\n\r\n /** @internal */\r\n public _getLockedTargetPosition(): Nullable<Vector3> {\r\n if (!this.lockedTarget) {\r\n return null;\r\n }\r\n\r\n if (this.lockedTarget.absolutePosition) {\r\n const lockedTarget = this.lockedTarget as AbstractMesh;\r\n const m = lockedTarget.computeWorldMatrix();\r\n // in some cases the absolute position resets externally, but doesn't update since the matrix is cached.\r\n m.getTranslationToRef(lockedTarget.absolutePosition);\r\n }\r\n\r\n return this.lockedTarget.absolutePosition || this.lockedTarget;\r\n }\r\n\r\n private _storedPosition: Vector3;\r\n private _storedRotation: Vector3;\r\n private _storedRotationQuaternion: Quaternion;\r\n\r\n /**\r\n * Store current camera state of the camera (fov, position, rotation, etc..)\r\n * @returns the camera\r\n */\r\n public storeState(): Camera {\r\n this._storedPosition = this.position.clone();\r\n this._storedRotation = this.rotation.clone();\r\n if (this.rotationQuaternion) {\r\n this._storedRotationQuaternion = this.rotationQuaternion.clone();\r\n }\r\n\r\n return super.storeState();\r\n }\r\n\r\n /**\r\n * Restored camera state. You must call storeState() first\r\n * @returns whether it was successful or not\r\n * @internal\r\n */\r\n public _restoreStateValues(): boolean {\r\n if (!super._restoreStateValues()) {\r\n return false;\r\n }\r\n\r\n this.position = this._storedPosition.clone();\r\n this.rotation = this._storedRotation.clone();\r\n\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion = this._storedRotationQuaternion.clone();\r\n }\r\n\r\n this.cameraDirection.copyFromFloats(0, 0, 0);\r\n this.cameraRotation.copyFromFloats(0, 0);\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _initCache() {\r\n super._initCache();\r\n this._cache.lockedTarget = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.rotation = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.rotationQuaternion = new Quaternion(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateCache(ignoreParentClass?: boolean): void {\r\n if (!ignoreParentClass) {\r\n super._updateCache();\r\n }\r\n\r\n const lockedTargetPosition = this._getLockedTargetPosition();\r\n if (!lockedTargetPosition) {\r\n this._cache.lockedTarget = null;\r\n } else {\r\n if (!this._cache.lockedTarget) {\r\n this._cache.lockedTarget = lockedTargetPosition.clone();\r\n } else {\r\n this._cache.lockedTarget.copyFrom(lockedTargetPosition);\r\n }\r\n }\r\n\r\n this._cache.rotation.copyFrom(this.rotation);\r\n if (this.rotationQuaternion) {\r\n this._cache.rotationQuaternion.copyFrom(this.rotationQuaternion);\r\n }\r\n }\r\n\r\n // Synchronized\r\n /** @internal */\r\n public _isSynchronizedViewMatrix(): boolean {\r\n if (!super._isSynchronizedViewMatrix()) {\r\n return false;\r\n }\r\n\r\n const lockedTargetPosition = this._getLockedTargetPosition();\r\n\r\n return (\r\n (this._cache.lockedTarget ? this._cache.lockedTarget.equals(lockedTargetPosition) : !lockedTargetPosition) &&\r\n (this.rotationQuaternion ? this.rotationQuaternion.equals(this._cache.rotationQuaternion) : this._cache.rotation.equals(this.rotation))\r\n );\r\n }\r\n\r\n // Methods\r\n /** @internal */\r\n public _computeLocalCameraSpeed(): number {\r\n const engine = this.getEngine();\r\n return this.speed * Math.sqrt(engine.getDeltaTime() / (engine.getFps() * 100.0));\r\n }\r\n\r\n // Target\r\n\r\n /**\r\n * Defines the target the camera should look at.\r\n * @param target Defines the new target as a Vector\r\n */\r\n public setTarget(target: Vector3): void {\r\n this.upVector.normalize();\r\n\r\n this._initialFocalDistance = target.subtract(this.position).length();\r\n\r\n if (this.position.z === target.z) {\r\n this.position.z += Epsilon;\r\n }\r\n\r\n this._referencePoint.normalize().scaleInPlace(this._initialFocalDistance);\r\n\r\n Matrix.LookAtLHToRef(this.position, target, this._defaultUp, this._camMatrix);\r\n this._camMatrix.invert();\r\n\r\n this.rotation.x = Math.atan(this._camMatrix.m[6] / this._camMatrix.m[10]);\r\n\r\n const vDir = target.subtract(this.position);\r\n\r\n if (vDir.x >= 0.0) {\r\n this.rotation.y = -Math.atan(vDir.z / vDir.x) + Math.PI / 2.0;\r\n } else {\r\n this.rotation.y = -Math.atan(vDir.z / vDir.x) - Math.PI / 2.0;\r\n }\r\n\r\n this.rotation.z = 0;\r\n\r\n if (isNaN(this.rotation.x)) {\r\n this.rotation.x = 0;\r\n }\r\n\r\n if (isNaN(this.rotation.y)) {\r\n this.rotation.y = 0;\r\n }\r\n\r\n if (isNaN(this.rotation.z)) {\r\n this.rotation.z = 0;\r\n }\r\n\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this.rotationQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Defines the target point of the camera.\r\n * The camera looks towards it form the radius distance.\r\n */\r\n public get target(): Vector3 {\r\n return this.getTarget();\r\n }\r\n public set target(value: Vector3) {\r\n this.setTarget(value);\r\n }\r\n\r\n /**\r\n * Return the current target position of the camera. This value is expressed in local space.\r\n * @returns the target position\r\n */\r\n public getTarget(): Vector3 {\r\n return this._currentTarget;\r\n }\r\n\r\n /** @internal */\r\n public _decideIfNeedsToMove(): boolean {\r\n return Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\r\n }\r\n\r\n /** @internal */\r\n public _updatePosition(): void {\r\n if (this.parent) {\r\n this.parent.getWorldMatrix().invertToRef(TmpVectors.Matrix[0]);\r\n Vector3.TransformNormalToRef(this.cameraDirection, TmpVectors.Matrix[0], TmpVectors.Vector3[0]);\r\n this._deferredPositionUpdate.addInPlace(TmpVectors.Vector3[0]);\r\n if (!this._deferOnly) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n return;\r\n }\r\n this._deferredPositionUpdate.addInPlace(this.cameraDirection);\r\n if (!this._deferOnly) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _checkInputs(): void {\r\n const directionMultiplier = this.invertRotation ? -this.inverseRotationSpeed : 1.0;\r\n const needToMove = this._decideIfNeedsToMove();\r\n const needToRotate = this.cameraRotation.x || this.cameraRotation.y;\r\n\r\n this._deferredUpdated = false;\r\n this._deferredRotationUpdate.copyFrom(this.rotation);\r\n this._deferredPositionUpdate.copyFrom(this.position);\r\n if (this.rotationQuaternion) {\r\n this._deferredRotationQuaternionUpdate.copyFrom(this.rotationQuaternion);\r\n }\r\n\r\n // Move\r\n if (needToMove) {\r\n this._updatePosition();\r\n }\r\n\r\n // Rotate\r\n if (needToRotate) {\r\n //rotate, if quaternion is set and rotation was used\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion.toEulerAnglesToRef(this._deferredRotationUpdate);\r\n }\r\n\r\n this._deferredRotationUpdate.x += this.cameraRotation.x * directionMultiplier;\r\n this._deferredRotationUpdate.y += this.cameraRotation.y * directionMultiplier;\r\n\r\n // Apply constraints\r\n if (!this.noRotationConstraint) {\r\n const limit = 1.570796;\r\n\r\n if (this._deferredRotationUpdate.x > limit) {\r\n this._deferredRotationUpdate.x = limit;\r\n }\r\n if (this._deferredRotationUpdate.x < -limit) {\r\n this._deferredRotationUpdate.x = -limit;\r\n }\r\n }\r\n\r\n if (!this._deferOnly) {\r\n this.rotation.copyFrom(this._deferredRotationUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n\r\n //rotate, if quaternion is set and rotation was used\r\n if (this.rotationQuaternion) {\r\n const len = this._deferredRotationUpdate.lengthSquared();\r\n if (len) {\r\n Quaternion.RotationYawPitchRollToRef(\r\n this._deferredRotationUpdate.y,\r\n this._deferredRotationUpdate.x,\r\n this._deferredRotationUpdate.z,\r\n this._deferredRotationQuaternionUpdate\r\n );\r\n if (!this._deferOnly) {\r\n this.rotationQuaternion.copyFrom(this._deferredRotationQuaternionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Inertia\r\n if (needToMove) {\r\n if (Math.abs(this.cameraDirection.x) < this.speed * Epsilon) {\r\n this.cameraDirection.x = 0;\r\n }\r\n\r\n if (Math.abs(this.cameraDirection.y) < this.speed * Epsilon) {\r\n this.cameraDirection.y = 0;\r\n }\r\n\r\n if (Math.abs(this.cameraDirection.z) < this.speed * Epsilon) {\r\n this.cameraDirection.z = 0;\r\n }\r\n\r\n this.cameraDirection.scaleInPlace(this.inertia);\r\n }\r\n if (needToRotate) {\r\n if (Math.abs(this.cameraRotation.x) < this.speed * Epsilon) {\r\n this.cameraRotation.x = 0;\r\n }\r\n\r\n if (Math.abs(this.cameraRotation.y) < this.speed * Epsilon) {\r\n this.cameraRotation.y = 0;\r\n }\r\n this.cameraRotation.scaleInPlace(this.inertia);\r\n }\r\n\r\n super._checkInputs();\r\n }\r\n\r\n protected _updateCameraRotationMatrix() {\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion.toRotationMatrix(this._cameraRotationMatrix);\r\n } else {\r\n Matrix.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this._cameraRotationMatrix);\r\n }\r\n }\r\n\r\n /**\r\n * Update the up vector to apply the rotation of the camera (So if you changed the camera rotation.z this will let you update the up vector as well)\r\n * @returns the current camera\r\n */\r\n private _rotateUpVectorWithCameraRotationMatrix(): TargetCamera {\r\n Vector3.TransformNormalToRef(this._defaultUp, this._cameraRotationMatrix, this.upVector);\r\n return this;\r\n }\r\n\r\n private _cachedRotationZ = 0;\r\n private _cachedQuaternionRotationZ = 0;\r\n /** @internal */\r\n public _getViewMatrix(): Matrix {\r\n if (this.lockedTarget) {\r\n this.setTarget(this._getLockedTargetPosition()!);\r\n }\r\n\r\n // Compute\r\n this._updateCameraRotationMatrix();\r\n\r\n // Apply the changed rotation to the upVector\r\n if (this.rotationQuaternion && this._cachedQuaternionRotationZ != this.rotationQuaternion.z) {\r\n this._rotateUpVectorWithCameraRotationMatrix();\r\n this._cachedQuaternionRotationZ = this.rotationQuaternion.z;\r\n } else if (this._cachedRotationZ !== this.rotation.z) {\r\n this._rotateUpVectorWithCameraRotationMatrix();\r\n this._cachedRotationZ = this.rotation.z;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(this._referencePoint, this._cameraRotationMatrix, this._transformedReferencePoint);\r\n\r\n // Computing target and final matrix\r\n this.position.addToRef(this._transformedReferencePoint, this._currentTarget);\r\n if (this.updateUpVectorFromRotation) {\r\n if (this.rotationQuaternion) {\r\n Axis.Y.rotateByQuaternionToRef(this.rotationQuaternion, this.upVector);\r\n } else {\r\n Quaternion.FromEulerVectorToRef(this.rotation, this._tmpQuaternion);\r\n Axis.Y.rotateByQuaternionToRef(this._tmpQuaternion, this.upVector);\r\n }\r\n }\r\n this._computeViewMatrix(this.position, this._currentTarget, this.upVector);\r\n return this._viewMatrix;\r\n }\r\n\r\n protected _computeViewMatrix(position: Vector3, target: Vector3, up: Vector3): void {\r\n if (this.ignoreParentScaling) {\r\n if (this.parent) {\r\n const parentWorldMatrix = this.parent.getWorldMatrix();\r\n Vector3.TransformCoordinatesToRef(position, parentWorldMatrix, this._globalPosition);\r\n Vector3.TransformCoordinatesToRef(target, parentWorldMatrix, this._tmpTargetVector);\r\n Vector3.TransformNormalToRef(up, parentWorldMatrix, this._tmpUpVector);\r\n this._markSyncedWithParent();\r\n } else {\r\n this._globalPosition.copyFrom(position);\r\n this._tmpTargetVector.copyFrom(target);\r\n this._tmpUpVector.copyFrom(up);\r\n }\r\n\r\n if (this.getScene().useRightHandedSystem) {\r\n Matrix.LookAtRHToRef(this._globalPosition, this._tmpTargetVector, this._tmpUpVector, this._viewMatrix);\r\n } else {\r\n Matrix.LookAtLHToRef(this._globalPosition, this._tmpTargetVector, this._tmpUpVector, this._viewMatrix);\r\n }\r\n return;\r\n }\r\n\r\n if (this.getScene().useRightHandedSystem) {\r\n Matrix.LookAtRHToRef(position, target, up, this._viewMatrix);\r\n } else {\r\n Matrix.LookAtLHToRef(position, target, up, this._viewMatrix);\r\n }\r\n\r\n if (this.parent) {\r\n const parentWorldMatrix = this.parent.getWorldMatrix();\r\n this._viewMatrix.invert();\r\n this._viewMatrix.multiplyToRef(parentWorldMatrix, this._viewMatrix);\r\n this._viewMatrix.getTranslationToRef(this._globalPosition);\r\n this._viewMatrix.invert();\r\n this._markSyncedWithParent();\r\n } else {\r\n this._globalPosition.copyFrom(position);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createRigCamera(name: string, cameraIndex: number): Nullable<Camera> {\r\n if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n const rigCamera = new TargetCamera(name, this.position.clone(), this.getScene());\r\n rigCamera.isRigCamera = true;\r\n rigCamera.rigParent = this;\r\n if (this.cameraRigMode === Camera.RIG_MODE_VR) {\r\n if (!this.rotationQuaternion) {\r\n this.rotationQuaternion = new Quaternion();\r\n }\r\n rigCamera._cameraRigParams = {};\r\n rigCamera.rotationQuaternion = new Quaternion();\r\n }\r\n\r\n rigCamera.mode = this.mode;\r\n rigCamera.orthoLeft = this.orthoLeft;\r\n rigCamera.orthoRight = this.orthoRight;\r\n rigCamera.orthoTop = this.orthoTop;\r\n rigCamera.orthoBottom = this.orthoBottom;\r\n\r\n return rigCamera;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateRigCameras() {\r\n const camLeft = <TargetCamera>this._rigCameras[0];\r\n const camRight = <TargetCamera>this._rigCameras[1];\r\n\r\n this.computeWorldMatrix();\r\n\r\n switch (this.cameraRigMode) {\r\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\r\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\r\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED: {\r\n //provisionnaly using _cameraRigParams.stereoHalfAngle instead of calculations based on _cameraRigParams.interaxialDistance:\r\n const leftSign = this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED ? 1 : -1;\r\n const rightSign = this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED ? -1 : 1;\r\n this._getRigCamPositionAndTarget(this._cameraRigParams.stereoHalfAngle * leftSign, camLeft);\r\n this._getRigCamPositionAndTarget(this._cameraRigParams.stereoHalfAngle * rightSign, camRight);\r\n break;\r\n }\r\n case Camera.RIG_MODE_VR:\r\n if (camLeft.rotationQuaternion) {\r\n camLeft.rotationQuaternion.copyFrom(this.rotationQuaternion);\r\n camRight.rotationQuaternion.copyFrom(this.rotationQuaternion);\r\n } else {\r\n camLeft.rotation.copyFrom(this.rotation);\r\n camRight.rotation.copyFrom(this.rotation);\r\n }\r\n camLeft.position.copyFrom(this.position);\r\n camRight.position.copyFrom(this.position);\r\n\r\n break;\r\n }\r\n super._updateRigCameras();\r\n }\r\n\r\n private _getRigCamPositionAndTarget(halfSpace: number, rigCamera: TargetCamera) {\r\n const target = this.getTarget();\r\n target.subtractToRef(this.position, TargetCamera._TargetFocalPoint);\r\n\r\n TargetCamera._TargetFocalPoint.normalize().scaleInPlace(this._initialFocalDistance);\r\n const newFocalTarget = TargetCamera._TargetFocalPoint.addInPlace(this.position);\r\n\r\n Matrix.TranslationToRef(-newFocalTarget.x, -newFocalTarget.y, -newFocalTarget.z, TargetCamera._TargetTransformMatrix);\r\n TargetCamera._TargetTransformMatrix.multiplyToRef(Matrix.RotationAxis(rigCamera.upVector, halfSpace), TargetCamera._RigCamTransformMatrix);\r\n Matrix.TranslationToRef(newFocalTarget.x, newFocalTarget.y, newFocalTarget.z, TargetCamera._TargetTransformMatrix);\r\n\r\n TargetCamera._RigCamTransformMatrix.multiplyToRef(TargetCamera._TargetTransformMatrix, TargetCamera._RigCamTransformMatrix);\r\n\r\n Vector3.TransformCoordinatesToRef(this.position, TargetCamera._RigCamTransformMatrix, rigCamera.position);\r\n rigCamera.setTarget(newFocalTarget);\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"TargetCamera\";\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"targetCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/targetCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { serialize, serializeAsVector3, serializeAsMeshReference } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Camera } from \"./camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3, Vector2, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Node } from \"../node\";\r\n\r\nNode.AddNodeConstructor(\"TargetCamera\", (name, scene) => {\r\n return () => new TargetCamera(name, Vector3.Zero(), scene);\r\n});\r\n\r\n/**\r\n * A target camera takes a mesh or position as a target and continues to look at it while it moves.\r\n * This is the base of the follow, arc rotate cameras and Free camera\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n */\r\nexport class TargetCamera extends Camera {\r\n private static _RigCamTransformMatrix = new Matrix();\r\n private static _TargetTransformMatrix = new Matrix();\r\n private static _TargetFocalPoint = new Vector3();\r\n\r\n private _tmpUpVector = Vector3.Zero();\r\n private _tmpTargetVector = Vector3.Zero();\r\n\r\n /**\r\n * Define the current direction the camera is moving to\r\n */\r\n public cameraDirection = new Vector3(0, 0, 0);\r\n /**\r\n * Define the current rotation the camera is rotating to\r\n */\r\n public cameraRotation = new Vector2(0, 0);\r\n\r\n /** Gets or sets a boolean indicating that the scaling of the parent hierarchy will not be taken in account by the camera */\r\n public ignoreParentScaling = false;\r\n\r\n /**\r\n * When set, the up vector of the camera will be updated by the rotation of the camera\r\n */\r\n public updateUpVectorFromRotation = false;\r\n private _tmpQuaternion = new Quaternion();\r\n\r\n /**\r\n * Define the current rotation of the camera\r\n */\r\n @serializeAsVector3()\r\n public rotation = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Define the current rotation of the camera as a quaternion to prevent Gimbal lock\r\n */\r\n public rotationQuaternion: Quaternion;\r\n\r\n /**\r\n * Define the current speed of the camera\r\n */\r\n @serialize()\r\n public speed = 2.0;\r\n\r\n /**\r\n * Add constraint to the camera to prevent it to move freely in all directions and\r\n * around all axis.\r\n */\r\n public noRotationConstraint = false;\r\n\r\n /**\r\n * Reverses mouselook direction to 'natural' panning as opposed to traditional direct\r\n * panning\r\n */\r\n public invertRotation = false;\r\n\r\n /**\r\n * Speed multiplier for inverse camera panning\r\n */\r\n public inverseRotationSpeed = 0.2;\r\n\r\n /**\r\n * Define the current target of the camera as an object or a position.\r\n * Please note that locking a target will disable panning.\r\n */\r\n @serializeAsMeshReference(\"lockedTargetId\")\r\n public lockedTarget: any = null;\r\n\r\n /** @internal */\r\n public _currentTarget = Vector3.Zero();\r\n /** @internal */\r\n public _initialFocalDistance = 1;\r\n /** @internal */\r\n public _viewMatrix = Matrix.Zero();\r\n /** @internal */\r\n public _camMatrix = Matrix.Zero();\r\n /** @internal */\r\n public _cameraTransformMatrix = Matrix.Zero();\r\n /** @internal */\r\n public _cameraRotationMatrix = Matrix.Zero();\r\n\r\n /** @internal */\r\n public _referencePoint = new Vector3(0, 0, 1);\r\n /** @internal */\r\n public _transformedReferencePoint = Vector3.Zero();\r\n\r\n protected _deferredPositionUpdate = new Vector3();\r\n protected _deferredRotationQuaternionUpdate = new Quaternion();\r\n protected _deferredRotationUpdate = new Vector3();\r\n protected _deferredUpdated = false;\r\n protected _deferOnly: boolean = false;\r\n\r\n /** @internal */\r\n public _reset: () => void;\r\n\r\n private _defaultUp = Vector3.Up();\r\n\r\n /**\r\n * Instantiates a target camera that takes a mesh or position as a target and continues to look at it while it moves.\r\n * This is the base of the follow, arc rotate cameras and Free camera\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n * @param name Defines the name of the camera in the scene\r\n * @param position Defines the start position of the camera in the scene\r\n * @param scene Defines the scene the camera belongs to\r\n * @param setActiveOnSceneIfNoneActive Defines whether the camera should be marked as active if not other active cameras have been defined\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, position, scene, setActiveOnSceneIfNoneActive);\r\n }\r\n\r\n /**\r\n * Gets the position in front of the camera at a given distance.\r\n * @param distance The distance from the camera we want the position to be\r\n * @returns the position\r\n */\r\n public getFrontPosition(distance: number): Vector3 {\r\n this.getWorldMatrix();\r\n const direction = this.getTarget().subtract(this.position);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n return this.globalPosition.add(direction);\r\n }\r\n\r\n /** @internal */\r\n public _getLockedTargetPosition(): Nullable<Vector3> {\r\n if (!this.lockedTarget) {\r\n return null;\r\n }\r\n\r\n if (this.lockedTarget.absolutePosition) {\r\n const lockedTarget = this.lockedTarget as AbstractMesh;\r\n const m = lockedTarget.computeWorldMatrix();\r\n // in some cases the absolute position resets externally, but doesn't update since the matrix is cached.\r\n m.getTranslationToRef(lockedTarget.absolutePosition);\r\n }\r\n\r\n return this.lockedTarget.absolutePosition || this.lockedTarget;\r\n }\r\n\r\n private _storedPosition: Vector3;\r\n private _storedRotation: Vector3;\r\n private _storedRotationQuaternion: Quaternion;\r\n\r\n /**\r\n * Store current camera state of the camera (fov, position, rotation, etc..)\r\n * @returns the camera\r\n */\r\n public storeState(): Camera {\r\n this._storedPosition = this.position.clone();\r\n this._storedRotation = this.rotation.clone();\r\n if (this.rotationQuaternion) {\r\n this._storedRotationQuaternion = this.rotationQuaternion.clone();\r\n }\r\n\r\n return super.storeState();\r\n }\r\n\r\n /**\r\n * Restored camera state. You must call storeState() first\r\n * @returns whether it was successful or not\r\n * @internal\r\n */\r\n public _restoreStateValues(): boolean {\r\n if (!super._restoreStateValues()) {\r\n return false;\r\n }\r\n\r\n this.position = this._storedPosition.clone();\r\n this.rotation = this._storedRotation.clone();\r\n\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion = this._storedRotationQuaternion.clone();\r\n }\r\n\r\n this.cameraDirection.copyFromFloats(0, 0, 0);\r\n this.cameraRotation.copyFromFloats(0, 0);\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _initCache() {\r\n super._initCache();\r\n this._cache.lockedTarget = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.rotation = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.rotationQuaternion = new Quaternion(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateCache(ignoreParentClass?: boolean): void {\r\n if (!ignoreParentClass) {\r\n super._updateCache();\r\n }\r\n\r\n const lockedTargetPosition = this._getLockedTargetPosition();\r\n if (!lockedTargetPosition) {\r\n this._cache.lockedTarget = null;\r\n } else {\r\n if (!this._cache.lockedTarget) {\r\n this._cache.lockedTarget = lockedTargetPosition.clone();\r\n } else {\r\n this._cache.lockedTarget.copyFrom(lockedTargetPosition);\r\n }\r\n }\r\n\r\n this._cache.rotation.copyFrom(this.rotation);\r\n if (this.rotationQuaternion) {\r\n this._cache.rotationQuaternion.copyFrom(this.rotationQuaternion);\r\n }\r\n }\r\n\r\n // Synchronized\r\n /** @internal */\r\n public _isSynchronizedViewMatrix(): boolean {\r\n if (!super._isSynchronizedViewMatrix()) {\r\n return false;\r\n }\r\n\r\n const lockedTargetPosition = this._getLockedTargetPosition();\r\n\r\n return (\r\n (this._cache.lockedTarget ? this._cache.lockedTarget.equals(lockedTargetPosition) : !lockedTargetPosition) &&\r\n (this.rotationQuaternion ? this.rotationQuaternion.equals(this._cache.rotationQuaternion) : this._cache.rotation.equals(this.rotation))\r\n );\r\n }\r\n\r\n // Methods\r\n /** @internal */\r\n public _computeLocalCameraSpeed(): number {\r\n const engine = this.getEngine();\r\n return this.speed * Math.sqrt(engine.getDeltaTime() / (engine.getFps() * 100.0));\r\n }\r\n\r\n // Target\r\n\r\n /**\r\n * Defines the target the camera should look at.\r\n * @param target Defines the new target as a Vector\r\n */\r\n public setTarget(target: Vector3): void {\r\n this.upVector.normalize();\r\n\r\n this._initialFocalDistance = target.subtract(this.position).length();\r\n\r\n if (this.position.z === target.z) {\r\n this.position.z += Epsilon;\r\n }\r\n\r\n this._referencePoint.normalize().scaleInPlace(this._initialFocalDistance);\r\n\r\n Matrix.LookAtLHToRef(this.position, target, this._defaultUp, this._camMatrix);\r\n this._camMatrix.invert();\r\n\r\n this.rotation.x = Math.atan(this._camMatrix.m[6] / this._camMatrix.m[10]);\r\n\r\n const vDir = target.subtract(this.position);\r\n\r\n if (vDir.x >= 0.0) {\r\n this.rotation.y = -Math.atan(vDir.z / vDir.x) + Math.PI / 2.0;\r\n } else {\r\n this.rotation.y = -Math.atan(vDir.z / vDir.x) - Math.PI / 2.0;\r\n }\r\n\r\n this.rotation.z = 0;\r\n\r\n if (isNaN(this.rotation.x)) {\r\n this.rotation.x = 0;\r\n }\r\n\r\n if (isNaN(this.rotation.y)) {\r\n this.rotation.y = 0;\r\n }\r\n\r\n if (isNaN(this.rotation.z)) {\r\n this.rotation.z = 0;\r\n }\r\n\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this.rotationQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Defines the target point of the camera.\r\n * The camera looks towards it form the radius distance.\r\n */\r\n public get target(): Vector3 {\r\n return this.getTarget();\r\n }\r\n public set target(value: Vector3) {\r\n this.setTarget(value);\r\n }\r\n\r\n /**\r\n * Return the current target position of the camera. This value is expressed in local space.\r\n * @returns the target position\r\n */\r\n public getTarget(): Vector3 {\r\n return this._currentTarget;\r\n }\r\n\r\n /** @internal */\r\n public _decideIfNeedsToMove(): boolean {\r\n return Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0;\r\n }\r\n\r\n /** @internal */\r\n public _updatePosition(): void {\r\n if (this.parent) {\r\n this.parent.getWorldMatrix().invertToRef(TmpVectors.Matrix[0]);\r\n Vector3.TransformNormalToRef(this.cameraDirection, TmpVectors.Matrix[0], TmpVectors.Vector3[0]);\r\n this._deferredPositionUpdate.addInPlace(TmpVectors.Vector3[0]);\r\n if (!this._deferOnly) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n return;\r\n }\r\n this._deferredPositionUpdate.addInPlace(this.cameraDirection);\r\n if (!this._deferOnly) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _checkInputs(): void {\r\n const directionMultiplier = this.invertRotation ? -this.inverseRotationSpeed : 1.0;\r\n const needToMove = this._decideIfNeedsToMove();\r\n const needToRotate = this.cameraRotation.x || this.cameraRotation.y;\r\n\r\n this._deferredUpdated = false;\r\n this._deferredRotationUpdate.copyFrom(this.rotation);\r\n this._deferredPositionUpdate.copyFrom(this.position);\r\n if (this.rotationQuaternion) {\r\n this._deferredRotationQuaternionUpdate.copyFrom(this.rotationQuaternion);\r\n }\r\n\r\n // Move\r\n if (needToMove) {\r\n this._updatePosition();\r\n }\r\n\r\n // Rotate\r\n if (needToRotate) {\r\n //rotate, if quaternion is set and rotation was used\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion.toEulerAnglesToRef(this._deferredRotationUpdate);\r\n }\r\n\r\n this._deferredRotationUpdate.x += this.cameraRotation.x * directionMultiplier;\r\n this._deferredRotationUpdate.y += this.cameraRotation.y * directionMultiplier;\r\n\r\n // Apply constraints\r\n if (!this.noRotationConstraint) {\r\n const limit = 1.570796;\r\n\r\n if (this._deferredRotationUpdate.x > limit) {\r\n this._deferredRotationUpdate.x = limit;\r\n }\r\n if (this._deferredRotationUpdate.x < -limit) {\r\n this._deferredRotationUpdate.x = -limit;\r\n }\r\n }\r\n\r\n if (!this._deferOnly) {\r\n this.rotation.copyFrom(this._deferredRotationUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n\r\n //rotate, if quaternion is set and rotation was used\r\n if (this.rotationQuaternion) {\r\n const len = this._deferredRotationUpdate.lengthSquared();\r\n if (len) {\r\n Quaternion.RotationYawPitchRollToRef(\r\n this._deferredRotationUpdate.y,\r\n this._deferredRotationUpdate.x,\r\n this._deferredRotationUpdate.z,\r\n this._deferredRotationQuaternionUpdate\r\n );\r\n if (!this._deferOnly) {\r\n this.rotationQuaternion.copyFrom(this._deferredRotationQuaternionUpdate);\r\n } else {\r\n this._deferredUpdated = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Inertia\r\n if (needToMove) {\r\n if (Math.abs(this.cameraDirection.x) < this.speed * Epsilon) {\r\n this.cameraDirection.x = 0;\r\n }\r\n\r\n if (Math.abs(this.cameraDirection.y) < this.speed * Epsilon) {\r\n this.cameraDirection.y = 0;\r\n }\r\n\r\n if (Math.abs(this.cameraDirection.z) < this.speed * Epsilon) {\r\n this.cameraDirection.z = 0;\r\n }\r\n\r\n this.cameraDirection.scaleInPlace(this.inertia);\r\n }\r\n if (needToRotate) {\r\n if (Math.abs(this.cameraRotation.x) < this.speed * Epsilon) {\r\n this.cameraRotation.x = 0;\r\n }\r\n\r\n if (Math.abs(this.cameraRotation.y) < this.speed * Epsilon) {\r\n this.cameraRotation.y = 0;\r\n }\r\n this.cameraRotation.scaleInPlace(this.inertia);\r\n }\r\n\r\n super._checkInputs();\r\n }\r\n\r\n protected _updateCameraRotationMatrix() {\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion.toRotationMatrix(this._cameraRotationMatrix);\r\n } else {\r\n Matrix.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this._cameraRotationMatrix);\r\n }\r\n }\r\n\r\n /**\r\n * Update the up vector to apply the rotation of the camera (So if you changed the camera rotation.z this will let you update the up vector as well)\r\n * @returns the current camera\r\n */\r\n private _rotateUpVectorWithCameraRotationMatrix(): TargetCamera {\r\n Vector3.TransformNormalToRef(this._defaultUp, this._cameraRotationMatrix, this.upVector);\r\n return this;\r\n }\r\n\r\n private _cachedRotationZ = 0;\r\n private _cachedQuaternionRotationZ = 0;\r\n /** @internal */\r\n public _getViewMatrix(): Matrix {\r\n if (this.lockedTarget) {\r\n this.setTarget(this._getLockedTargetPosition()!);\r\n }\r\n\r\n // Compute\r\n this._updateCameraRotationMatrix();\r\n\r\n // Apply the changed rotation to the upVector\r\n if (this.rotationQuaternion && this._cachedQuaternionRotationZ != this.rotationQuaternion.z) {\r\n this._rotateUpVectorWithCameraRotationMatrix();\r\n this._cachedQuaternionRotationZ = this.rotationQuaternion.z;\r\n } else if (this._cachedRotationZ !== this.rotation.z) {\r\n this._rotateUpVectorWithCameraRotationMatrix();\r\n this._cachedRotationZ = this.rotation.z;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(this._referencePoint, this._cameraRotationMatrix, this._transformedReferencePoint);\r\n\r\n // Computing target and final matrix\r\n this.position.addToRef(this._transformedReferencePoint, this._currentTarget);\r\n if (this.updateUpVectorFromRotation) {\r\n if (this.rotationQuaternion) {\r\n Axis.Y.rotateByQuaternionToRef(this.rotationQuaternion, this.upVector);\r\n } else {\r\n Quaternion.FromEulerVectorToRef(this.rotation, this._tmpQuaternion);\r\n Axis.Y.rotateByQuaternionToRef(this._tmpQuaternion, this.upVector);\r\n }\r\n }\r\n this._computeViewMatrix(this.position, this._currentTarget, this.upVector);\r\n return this._viewMatrix;\r\n }\r\n\r\n protected _computeViewMatrix(position: Vector3, target: Vector3, up: Vector3): void {\r\n if (this.ignoreParentScaling) {\r\n if (this.parent) {\r\n const parentWorldMatrix = this.parent.getWorldMatrix();\r\n Vector3.TransformCoordinatesToRef(position, parentWorldMatrix, this._globalPosition);\r\n Vector3.TransformCoordinatesToRef(target, parentWorldMatrix, this._tmpTargetVector);\r\n Vector3.TransformNormalToRef(up, parentWorldMatrix, this._tmpUpVector);\r\n this._markSyncedWithParent();\r\n } else {\r\n this._globalPosition.copyFrom(position);\r\n this._tmpTargetVector.copyFrom(target);\r\n this._tmpUpVector.copyFrom(up);\r\n }\r\n\r\n if (this.getScene().useRightHandedSystem) {\r\n Matrix.LookAtRHToRef(this._globalPosition, this._tmpTargetVector, this._tmpUpVector, this._viewMatrix);\r\n } else {\r\n Matrix.LookAtLHToRef(this._globalPosition, this._tmpTargetVector, this._tmpUpVector, this._viewMatrix);\r\n }\r\n return;\r\n }\r\n\r\n if (this.getScene().useRightHandedSystem) {\r\n Matrix.LookAtRHToRef(position, target, up, this._viewMatrix);\r\n } else {\r\n Matrix.LookAtLHToRef(position, target, up, this._viewMatrix);\r\n }\r\n\r\n if (this.parent) {\r\n const parentWorldMatrix = this.parent.getWorldMatrix();\r\n this._viewMatrix.invert();\r\n this._viewMatrix.multiplyToRef(parentWorldMatrix, this._viewMatrix);\r\n this._viewMatrix.getTranslationToRef(this._globalPosition);\r\n this._viewMatrix.invert();\r\n this._markSyncedWithParent();\r\n } else {\r\n this._globalPosition.copyFrom(position);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createRigCamera(name: string, cameraIndex: number): Nullable<Camera> {\r\n if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n const rigCamera = new TargetCamera(name, this.position.clone(), this.getScene());\r\n rigCamera.isRigCamera = true;\r\n rigCamera.rigParent = this;\r\n if (this.cameraRigMode === Camera.RIG_MODE_VR) {\r\n if (!this.rotationQuaternion) {\r\n this.rotationQuaternion = new Quaternion();\r\n }\r\n rigCamera._cameraRigParams = {};\r\n rigCamera.rotationQuaternion = new Quaternion();\r\n }\r\n\r\n rigCamera.mode = this.mode;\r\n rigCamera.orthoLeft = this.orthoLeft;\r\n rigCamera.orthoRight = this.orthoRight;\r\n rigCamera.orthoTop = this.orthoTop;\r\n rigCamera.orthoBottom = this.orthoBottom;\r\n\r\n return rigCamera;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateRigCameras() {\r\n const camLeft = <TargetCamera>this._rigCameras[0];\r\n const camRight = <TargetCamera>this._rigCameras[1];\r\n\r\n this.computeWorldMatrix();\r\n\r\n switch (this.cameraRigMode) {\r\n case Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:\r\n case Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:\r\n case Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:\r\n case Camera.RIG_MODE_STEREOSCOPIC_INTERLACED: {\r\n //provisionnaly using _cameraRigParams.stereoHalfAngle instead of calculations based on _cameraRigParams.interaxialDistance:\r\n const leftSign = this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED ? 1 : -1;\r\n const rightSign = this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED ? -1 : 1;\r\n this._getRigCamPositionAndTarget(this._cameraRigParams.stereoHalfAngle * leftSign, camLeft);\r\n this._getRigCamPositionAndTarget(this._cameraRigParams.stereoHalfAngle * rightSign, camRight);\r\n break;\r\n }\r\n case Camera.RIG_MODE_VR:\r\n if (camLeft.rotationQuaternion) {\r\n camLeft.rotationQuaternion.copyFrom(this.rotationQuaternion);\r\n camRight.rotationQuaternion.copyFrom(this.rotationQuaternion);\r\n } else {\r\n camLeft.rotation.copyFrom(this.rotation);\r\n camRight.rotation.copyFrom(this.rotation);\r\n }\r\n camLeft.position.copyFrom(this.position);\r\n camRight.position.copyFrom(this.position);\r\n\r\n break;\r\n }\r\n super._updateRigCameras();\r\n }\r\n\r\n private _getRigCamPositionAndTarget(halfSpace: number, rigCamera: TargetCamera) {\r\n const target = this.getTarget();\r\n target.subtractToRef(this.position, TargetCamera._TargetFocalPoint);\r\n\r\n TargetCamera._TargetFocalPoint.normalize().scaleInPlace(this._initialFocalDistance);\r\n const newFocalTarget = TargetCamera._TargetFocalPoint.addInPlace(this.position);\r\n\r\n Matrix.TranslationToRef(-newFocalTarget.x, -newFocalTarget.y, -newFocalTarget.z, TargetCamera._TargetTransformMatrix);\r\n TargetCamera._TargetTransformMatrix.multiplyToRef(Matrix.RotationAxis(rigCamera.upVector, halfSpace), TargetCamera._RigCamTransformMatrix);\r\n Matrix.TranslationToRef(newFocalTarget.x, newFocalTarget.y, newFocalTarget.z, TargetCamera._TargetTransformMatrix);\r\n\r\n TargetCamera._RigCamTransformMatrix.multiplyToRef(TargetCamera._TargetTransformMatrix, TargetCamera._RigCamTransformMatrix);\r\n\r\n Vector3.TransformCoordinatesToRef(this.position, TargetCamera._RigCamTransformMatrix, rigCamera.position);\r\n rigCamera.setTarget(newFocalTarget);\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"TargetCamera\";\r\n }\r\n}\r\n"]}
@@ -6,6 +6,7 @@ import type { ComputeBindingMapping } from "../Engines/Extensions/engine.compute
6
6
  import type { BaseTexture } from "../Materials/Textures/baseTexture";
7
7
  import type { StorageBuffer } from "../Buffers/storageBuffer";
8
8
  import { TextureSampler } from "../Materials/Textures/textureSampler";
9
+ import type { DataBuffer } from "../Buffers/dataBuffer.js";
9
10
  import type { ExternalTexture } from "../Materials/Textures/externalTexture.js";
10
11
  import type { VideoTexture } from "../Materials/Textures/videoTexture.js";
11
12
  import { WebGPUPerfCounter } from "../Engines/WebGPU/webgpuPerfCounter.js";
@@ -129,13 +130,13 @@ export declare class ComputeShader {
129
130
  * @param name Binding name of the buffer
130
131
  * @param buffer Buffer to bind
131
132
  */
132
- setUniformBuffer(name: string, buffer: UniformBuffer): void;
133
+ setUniformBuffer(name: string, buffer: UniformBuffer | DataBuffer): void;
133
134
  /**
134
135
  * Binds a storage buffer to the shader
135
136
  * @param name Binding name of the buffer
136
137
  * @param buffer Buffer to bind
137
138
  */
138
- setStorageBuffer(name: string, buffer: StorageBuffer): void;
139
+ setStorageBuffer(name: string, buffer: StorageBuffer | DataBuffer): void;
139
140
  /**
140
141
  * Binds a texture sampler to the shader
141
142
  * @param name Binding name of the sampler
@@ -177,4 +178,5 @@ export declare class ComputeShader {
177
178
  * @returns a new compute shader
178
179
  */
179
180
  static Parse(source: any, scene: Scene, rootUrl: string): ComputeShader;
181
+ protected static _BufferIsDataBuffer(buffer: UniformBuffer | StorageBuffer | DataBuffer): buffer is DataBuffer;
180
182
  }
@@ -1,5 +1,6 @@
1
1
  import { __decorate } from "../tslib.es6.js";
2
- import { SerializationHelper, serialize } from "../Misc/decorators.js";
2
+ import { serialize } from "../Misc/decorators.js";
3
+ import { SerializationHelper } from "../Misc/decorators.serialization.js";
3
4
  import { RegisterClass } from "../Misc/typeStore.js";
4
5
  import { ComputeBindingType } from "../Engines/Extensions/engine.computeShader.js";
5
6
  import { Texture } from "../Materials/Textures/texture.js";
@@ -146,7 +147,7 @@ export class ComputeShader {
146
147
  const current = this._bindings[name];
147
148
  this._contextIsDirty || (this._contextIsDirty = !current || current.object !== buffer);
148
149
  this._bindings[name] = {
149
- type: ComputeBindingType.UniformBuffer,
150
+ type: ComputeShader._BufferIsDataBuffer(buffer) ? ComputeBindingType.DataBuffer : ComputeBindingType.UniformBuffer,
150
151
  object: buffer,
151
152
  indexInGroupEntries: current?.indexInGroupEntries,
152
153
  };
@@ -160,7 +161,7 @@ export class ComputeShader {
160
161
  const current = this._bindings[name];
161
162
  this._contextIsDirty || (this._contextIsDirty = !current || current.object !== buffer);
162
163
  this._bindings[name] = {
163
- type: ComputeBindingType.StorageBuffer,
164
+ type: ComputeShader._BufferIsDataBuffer(buffer) ? ComputeBindingType.DataBuffer : ComputeBindingType.StorageBuffer,
164
165
  object: buffer,
165
166
  indexInGroupEntries: current?.indexInGroupEntries,
166
167
  };
@@ -359,6 +360,9 @@ export class ComputeShader {
359
360
  }
360
361
  return compute;
361
362
  }
363
+ static _BufferIsDataBuffer(buffer) {
364
+ return buffer.underlyingResource !== undefined;
365
+ }
362
366
  }
363
367
  __decorate([
364
368
  serialize()
@@ -1 +1 @@
1
- {"version":3,"file":"computeShader.js","sourceRoot":"","sources":["../../../../dev/core/src/Compute/computeShader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { WebGPUEngine } from \"../Engines/webgpuEngine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport { SerializationHelper, serialize } from \"../Misc/decorators\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { ComputeEffect, IComputeEffectCreationOptions } from \"./computeEffect\";\r\nimport type { ComputeBindingMapping } from \"../Engines/Extensions/engine.computeShader\";\r\nimport { ComputeBindingType } from \"../Engines/Extensions/engine.computeShader\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { UniqueIdGenerator } from \"../Misc/uniqueIdGenerator\";\r\nimport type { IComputeContext } from \"./IComputeContext\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { TextureSampler } from \"../Materials/Textures/textureSampler\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport type { ExternalTexture } from \"core/Materials/Textures/externalTexture\";\r\nimport type { VideoTexture } from \"core/Materials/Textures/videoTexture\";\r\nimport { WebGPUPerfCounter } from \"core/Engines/WebGPU/webgpuPerfCounter\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\n\r\n/**\r\n * Defines the options associated with the creation of a compute shader.\r\n */\r\nexport interface IComputeShaderOptions {\r\n /**\r\n * list of bindings mapping (key is property name, value is binding location)\r\n * Must be provided because browsers don't support reflection for wgsl shaders yet (so there's no way to query the binding/group from a variable name)\r\n * TODO: remove this when browsers support reflection for wgsl shaders\r\n */\r\n bindingsMapping: ComputeBindingMapping;\r\n\r\n /**\r\n * The list of defines used in the shader\r\n */\r\n defines?: string[];\r\n\r\n /**\r\n * The name of the entry point in the shader source (default: \"main\")\r\n */\r\n entryPoint?: string;\r\n\r\n /**\r\n * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<(code: string) => string>;\r\n}\r\n\r\ntype ComputeBindingListInternal = { [key: string]: { type: ComputeBindingType; object: any; indexInGroupEntries?: number; buffer?: Nullable<DataBuffer> } };\r\n\r\n/**\r\n * The ComputeShader object lets you execute a compute shader on your GPU (if supported by the engine)\r\n */\r\nexport class ComputeShader {\r\n private _engine: ThinEngine;\r\n private _shaderPath: any;\r\n private _options: IComputeShaderOptions;\r\n private _effect: ComputeEffect;\r\n private _cachedDefines: string;\r\n private _bindings: ComputeBindingListInternal = {};\r\n private _samplers: { [key: string]: TextureSampler } = {};\r\n private _context: IComputeContext;\r\n private _contextIsDirty = false;\r\n\r\n /**\r\n * Gets the unique id of the compute shader\r\n */\r\n public readonly uniqueId: number;\r\n\r\n /**\r\n * The name of the shader\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * The options used to create the shader\r\n */\r\n public get options() {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * The shaderPath used to create the shader\r\n */\r\n public get shaderPath() {\r\n return this._shaderPath;\r\n }\r\n\r\n /**\r\n * When set to true, dispatch won't call isReady anymore and won't check if the underlying GPU resources should be (re)created because of a change in the inputs (texture, uniform buffer, etc.)\r\n * If you know that your inputs did not change since last time dispatch was called and that isReady() returns true, set this flag to true to improve performance\r\n */\r\n @serialize()\r\n public fastMode = false;\r\n\r\n /**\r\n * Callback triggered when the shader is compiled\r\n */\r\n public onCompiled: Nullable<(effect: ComputeEffect) => void> = null;\r\n\r\n /**\r\n * Callback triggered when an error occurs\r\n */\r\n public onError: Nullable<(effect: ComputeEffect, errors: string) => void> = null;\r\n\r\n /**\r\n * Gets the GPU time spent running the compute shader for the last frame rendered (in nanoseconds).\r\n * You have to enable the \"timestamp-query\" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.\r\n */\r\n public readonly gpuTimeInFrame?: WebGPUPerfCounter;\r\n\r\n /**\r\n * Instantiates a new compute shader.\r\n * @param name Defines the name of the compute shader in the scene\r\n * @param engine Defines the engine the compute shader belongs to\r\n * @param shaderPath Defines the route to the shader code in one of three ways:\r\n * * object: \\{ compute: \"custom\" \\}, used with ShaderStore.ShadersStoreWGSL[\"customComputeShader\"]\r\n * * object: \\{ computeElement: \"HTMLElementId\" \\}, used with shader code in script tags\r\n * * object: \\{ computeSource: \"compute shader code string\" \\}, where the string contains the shader code\r\n * * string: try first to find the code in ShaderStore.ShadersStoreWGSL[shaderPath + \"ComputeShader\"]. If not, assumes it is a file with name shaderPath.compute.fx in index.html folder.\r\n * @param options Define the options used to create the shader\r\n */\r\n constructor(name: string, engine: ThinEngine, shaderPath: any, options: Partial<IComputeShaderOptions> = {}) {\r\n this.name = name;\r\n this._engine = engine;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n if ((engine as WebGPUEngine).enableGPUTimingMeasurements) {\r\n this.gpuTimeInFrame = new WebGPUPerfCounter();\r\n }\r\n\r\n if (!this._engine.getCaps().supportComputeShaders) {\r\n Logger.Error(\"This engine does not support compute shaders!\");\r\n return;\r\n }\r\n if (!options.bindingsMapping) {\r\n Logger.Error(\"You must provide the binding mappings as browsers don't support reflection for wgsl shaders yet!\");\r\n return;\r\n }\r\n\r\n this._context = engine.createComputeContext()!;\r\n this._shaderPath = shaderPath;\r\n this._options = {\r\n bindingsMapping: {},\r\n defines: [],\r\n ...options,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"ComputeShader\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ComputeShader\";\r\n }\r\n\r\n /**\r\n * Binds a texture to the shader\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n * @param bindSampler Bind the sampler corresponding to the texture (default: true). The sampler will be bound just before the binding index of the texture\r\n */\r\n public setTexture(name: string, texture: BaseTexture, bindSampler = true): void {\r\n const current = this._bindings[name];\r\n\r\n this._bindings[name] = {\r\n type: bindSampler ? ComputeBindingType.Texture : ComputeBindingType.TextureWithoutSampler,\r\n object: texture,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n\r\n this._contextIsDirty ||= !current || current.object !== texture || current.type !== this._bindings[name].type;\r\n }\r\n\r\n /**\r\n * Binds a storage texture to the shader\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n */\r\n public setStorageTexture(name: string, texture: BaseTexture): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== texture;\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.StorageTexture,\r\n object: texture,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds an external texture to the shader\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n */\r\n public setExternalTexture(name: string, texture: ExternalTexture): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== texture;\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.ExternalTexture,\r\n object: texture,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds a video texture to the shader (by binding the external texture attached to this video)\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n * @returns true if the video texture was successfully bound, else false. false will be returned if the current engine does not support external textures\r\n */\r\n public setVideoTexture(name: string, texture: VideoTexture) {\r\n if (texture.externalTexture) {\r\n this.setExternalTexture(name, texture.externalTexture);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Binds a uniform buffer to the shader\r\n * @param name Binding name of the buffer\r\n * @param buffer Buffer to bind\r\n */\r\n public setUniformBuffer(name: string, buffer: UniformBuffer): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== buffer;\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.UniformBuffer,\r\n object: buffer,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds a storage buffer to the shader\r\n * @param name Binding name of the buffer\r\n * @param buffer Buffer to bind\r\n */\r\n public setStorageBuffer(name: string, buffer: StorageBuffer): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== buffer;\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.StorageBuffer,\r\n object: buffer,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds a texture sampler to the shader\r\n * @param name Binding name of the sampler\r\n * @param sampler Sampler to bind\r\n */\r\n public setTextureSampler(name: string, sampler: TextureSampler): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || !sampler.compareSampler(current.object);\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.Sampler,\r\n object: sampler,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Specifies that the compute shader is ready to be executed (the compute effect and all the resources are ready)\r\n * @returns true if the compute shader is ready to be executed\r\n */\r\n public isReady(): boolean {\r\n let effect = this._effect;\r\n\r\n for (const key in this._bindings) {\r\n const binding = this._bindings[key],\r\n type = binding.type,\r\n object = binding.object;\r\n\r\n switch (type) {\r\n case ComputeBindingType.Texture:\r\n case ComputeBindingType.TextureWithoutSampler:\r\n case ComputeBindingType.StorageTexture: {\r\n const texture = object as BaseTexture;\r\n if (!texture.isReady()) {\r\n return false;\r\n }\r\n break;\r\n }\r\n case ComputeBindingType.ExternalTexture: {\r\n const texture = object as ExternalTexture;\r\n if (!texture.isReady()) {\r\n return false;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const defines = [];\r\n\r\n const shaderName = this._shaderPath;\r\n\r\n if (this._options.defines) {\r\n for (let index = 0; index < this._options.defines.length; index++) {\r\n defines.push(this._options.defines[index]);\r\n }\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n\r\n if (this._cachedDefines !== join) {\r\n this._cachedDefines = join;\r\n\r\n effect = this._engine.createComputeEffect(shaderName, <IComputeEffectCreationOptions>{\r\n defines: join,\r\n entryPoint: this._options.entryPoint,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n });\r\n\r\n this._effect = effect;\r\n }\r\n\r\n if (!effect.isReady()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispatches (executes) the compute shader\r\n * @param x Number of workgroups to execute on the X dimension\r\n * @param y Number of workgroups to execute on the Y dimension (default: 1)\r\n * @param z Number of workgroups to execute on the Z dimension (default: 1)\r\n * @returns True if the dispatch could be done, else false (meaning either the compute effect or at least one of the bound resources was not ready)\r\n */\r\n public dispatch(x: number, y?: number, z?: number): boolean {\r\n if (!this.fastMode) {\r\n if (!this.isReady()) {\r\n return false;\r\n }\r\n\r\n // If the sampling parameters of a texture bound to the shader have changed, we must clear the compute context so that it is recreated with the updated values\r\n // Also, if the actual (gpu) buffer used by a uniform buffer has changed, we must clear the compute context so that it is recreated with the updated value\r\n for (const key in this._bindings) {\r\n const binding = this._bindings[key];\r\n\r\n if (!this._options.bindingsMapping[key]) {\r\n throw new Error(\"ComputeShader ('\" + this.name + \"'): No binding mapping has been provided for the property '\" + key + \"'\");\r\n }\r\n\r\n switch (binding.type) {\r\n case ComputeBindingType.Texture: {\r\n const sampler = this._samplers[key];\r\n const texture = binding.object as BaseTexture;\r\n\r\n if (!sampler || !texture._texture || !sampler.compareSampler(texture._texture)) {\r\n this._samplers[key] = new TextureSampler().setParameters(\r\n texture.wrapU,\r\n texture.wrapV,\r\n texture.wrapR,\r\n texture.anisotropicFilteringLevel,\r\n texture._texture!.samplingMode,\r\n texture._texture?._comparisonFunction\r\n );\r\n this._contextIsDirty = true;\r\n }\r\n break;\r\n }\r\n case ComputeBindingType.ExternalTexture: {\r\n // we must recreate the bind groups each time if there's an external texture, because device.importExternalTexture must be called each frame\r\n this._contextIsDirty = true;\r\n break;\r\n }\r\n case ComputeBindingType.UniformBuffer: {\r\n const ubo = binding.object as UniformBuffer;\r\n if (ubo.getBuffer() !== binding.buffer) {\r\n binding.buffer = ubo.getBuffer();\r\n this._contextIsDirty = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._contextIsDirty) {\r\n this._contextIsDirty = false;\r\n this._context.clear();\r\n }\r\n }\r\n\r\n this._engine.computeDispatch(this._effect, this._context, this._bindings, x, y, z, this._options.bindingsMapping, this.gpuTimeInFrame);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Waits for the compute shader to be ready and executes it\r\n * @param x Number of workgroups to execute on the X dimension\r\n * @param y Number of workgroups to execute on the Y dimension (default: 1)\r\n * @param z Number of workgroups to execute on the Z dimension (default: 1)\r\n * @param delay Delay between the retries while the shader is not ready (in milliseconds - 10 by default)\r\n * @returns A promise that is resolved once the shader has been sent to the GPU. Note that it does not mean that the shader execution itself is finished!\r\n */\r\n public dispatchWhenReady(x: number, y?: number, z?: number, delay = 10): Promise<void> {\r\n return new Promise((resolve) => {\r\n const check = () => {\r\n if (!this.dispatch(x, y, z)) {\r\n setTimeout(check, delay);\r\n } else {\r\n resolve();\r\n }\r\n };\r\n\r\n check();\r\n });\r\n }\r\n\r\n /**\r\n * Serializes this compute shader in a JSON representation\r\n * @returns the serialized compute shader object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n serializationObject.options = this._options;\r\n serializationObject.shaderPath = this._shaderPath;\r\n serializationObject.bindings = {};\r\n serializationObject.textures = {};\r\n\r\n for (const key in this._bindings) {\r\n const binding = this._bindings[key];\r\n const object = binding.object;\r\n\r\n switch (binding.type) {\r\n case ComputeBindingType.Texture:\r\n case ComputeBindingType.TextureWithoutSampler:\r\n case ComputeBindingType.StorageTexture: {\r\n const serializedData = (object as BaseTexture).serialize();\r\n if (serializedData) {\r\n serializationObject.textures[key] = serializedData;\r\n serializationObject.bindings[key] = {\r\n type: binding.type,\r\n };\r\n }\r\n break;\r\n }\r\n\r\n case ComputeBindingType.UniformBuffer: {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a compute shader from parsed compute shader data\r\n * @param source defines the JSON representation of the compute shader\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new compute shader\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): ComputeShader {\r\n const compute = SerializationHelper.Parse(\r\n () => new ComputeShader(source.name, scene.getEngine() as WebGPUEngine, source.shaderPath, source.options),\r\n source,\r\n scene,\r\n rootUrl\r\n );\r\n\r\n for (const key in source.textures) {\r\n const binding = source.bindings[key];\r\n const texture = <Texture>Texture.Parse(source.textures[key], scene, rootUrl);\r\n\r\n if (binding.type === ComputeBindingType.Texture) {\r\n compute.setTexture(key, texture);\r\n } else if (binding.type === ComputeBindingType.TextureWithoutSampler) {\r\n compute.setTexture(key, texture, false);\r\n } else {\r\n compute.setStorageTexture(key, texture);\r\n }\r\n }\r\n\r\n return compute;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ComputeShader\", ComputeShader);\r\n"]}
1
+ {"version":3,"file":"computeShader.js","sourceRoot":"","sources":["../../../../dev/core/src/Compute/computeShader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { WebGPUEngine } from \"../Engines/webgpuEngine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport { serialize } from \"../Misc/decorators\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { ComputeEffect, IComputeEffectCreationOptions } from \"./computeEffect\";\r\nimport type { ComputeBindingMapping } from \"../Engines/Extensions/engine.computeShader\";\r\nimport { ComputeBindingType } from \"../Engines/Extensions/engine.computeShader\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { UniqueIdGenerator } from \"../Misc/uniqueIdGenerator\";\r\nimport type { IComputeContext } from \"./IComputeContext\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { TextureSampler } from \"../Materials/Textures/textureSampler\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport type { ExternalTexture } from \"core/Materials/Textures/externalTexture\";\r\nimport type { VideoTexture } from \"core/Materials/Textures/videoTexture\";\r\nimport { WebGPUPerfCounter } from \"core/Engines/WebGPU/webgpuPerfCounter\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\n\r\n/**\r\n * Defines the options associated with the creation of a compute shader.\r\n */\r\nexport interface IComputeShaderOptions {\r\n /**\r\n * list of bindings mapping (key is property name, value is binding location)\r\n * Must be provided because browsers don't support reflection for wgsl shaders yet (so there's no way to query the binding/group from a variable name)\r\n * TODO: remove this when browsers support reflection for wgsl shaders\r\n */\r\n bindingsMapping: ComputeBindingMapping;\r\n\r\n /**\r\n * The list of defines used in the shader\r\n */\r\n defines?: string[];\r\n\r\n /**\r\n * The name of the entry point in the shader source (default: \"main\")\r\n */\r\n entryPoint?: string;\r\n\r\n /**\r\n * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<(code: string) => string>;\r\n}\r\n\r\ntype ComputeBindingListInternal = { [key: string]: { type: ComputeBindingType; object: any; indexInGroupEntries?: number; buffer?: Nullable<DataBuffer> } };\r\n\r\n/**\r\n * The ComputeShader object lets you execute a compute shader on your GPU (if supported by the engine)\r\n */\r\nexport class ComputeShader {\r\n private _engine: ThinEngine;\r\n private _shaderPath: any;\r\n private _options: IComputeShaderOptions;\r\n private _effect: ComputeEffect;\r\n private _cachedDefines: string;\r\n private _bindings: ComputeBindingListInternal = {};\r\n private _samplers: { [key: string]: TextureSampler } = {};\r\n private _context: IComputeContext;\r\n private _contextIsDirty = false;\r\n\r\n /**\r\n * Gets the unique id of the compute shader\r\n */\r\n public readonly uniqueId: number;\r\n\r\n /**\r\n * The name of the shader\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * The options used to create the shader\r\n */\r\n public get options() {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * The shaderPath used to create the shader\r\n */\r\n public get shaderPath() {\r\n return this._shaderPath;\r\n }\r\n\r\n /**\r\n * When set to true, dispatch won't call isReady anymore and won't check if the underlying GPU resources should be (re)created because of a change in the inputs (texture, uniform buffer, etc.)\r\n * If you know that your inputs did not change since last time dispatch was called and that isReady() returns true, set this flag to true to improve performance\r\n */\r\n @serialize()\r\n public fastMode = false;\r\n\r\n /**\r\n * Callback triggered when the shader is compiled\r\n */\r\n public onCompiled: Nullable<(effect: ComputeEffect) => void> = null;\r\n\r\n /**\r\n * Callback triggered when an error occurs\r\n */\r\n public onError: Nullable<(effect: ComputeEffect, errors: string) => void> = null;\r\n\r\n /**\r\n * Gets the GPU time spent running the compute shader for the last frame rendered (in nanoseconds).\r\n * You have to enable the \"timestamp-query\" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.\r\n */\r\n public readonly gpuTimeInFrame?: WebGPUPerfCounter;\r\n\r\n /**\r\n * Instantiates a new compute shader.\r\n * @param name Defines the name of the compute shader in the scene\r\n * @param engine Defines the engine the compute shader belongs to\r\n * @param shaderPath Defines the route to the shader code in one of three ways:\r\n * * object: \\{ compute: \"custom\" \\}, used with ShaderStore.ShadersStoreWGSL[\"customComputeShader\"]\r\n * * object: \\{ computeElement: \"HTMLElementId\" \\}, used with shader code in script tags\r\n * * object: \\{ computeSource: \"compute shader code string\" \\}, where the string contains the shader code\r\n * * string: try first to find the code in ShaderStore.ShadersStoreWGSL[shaderPath + \"ComputeShader\"]. If not, assumes it is a file with name shaderPath.compute.fx in index.html folder.\r\n * @param options Define the options used to create the shader\r\n */\r\n constructor(name: string, engine: ThinEngine, shaderPath: any, options: Partial<IComputeShaderOptions> = {}) {\r\n this.name = name;\r\n this._engine = engine;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n if ((engine as WebGPUEngine).enableGPUTimingMeasurements) {\r\n this.gpuTimeInFrame = new WebGPUPerfCounter();\r\n }\r\n\r\n if (!this._engine.getCaps().supportComputeShaders) {\r\n Logger.Error(\"This engine does not support compute shaders!\");\r\n return;\r\n }\r\n if (!options.bindingsMapping) {\r\n Logger.Error(\"You must provide the binding mappings as browsers don't support reflection for wgsl shaders yet!\");\r\n return;\r\n }\r\n\r\n this._context = engine.createComputeContext()!;\r\n this._shaderPath = shaderPath;\r\n this._options = {\r\n bindingsMapping: {},\r\n defines: [],\r\n ...options,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"ComputeShader\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ComputeShader\";\r\n }\r\n\r\n /**\r\n * Binds a texture to the shader\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n * @param bindSampler Bind the sampler corresponding to the texture (default: true). The sampler will be bound just before the binding index of the texture\r\n */\r\n public setTexture(name: string, texture: BaseTexture, bindSampler = true): void {\r\n const current = this._bindings[name];\r\n\r\n this._bindings[name] = {\r\n type: bindSampler ? ComputeBindingType.Texture : ComputeBindingType.TextureWithoutSampler,\r\n object: texture,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n\r\n this._contextIsDirty ||= !current || current.object !== texture || current.type !== this._bindings[name].type;\r\n }\r\n\r\n /**\r\n * Binds a storage texture to the shader\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n */\r\n public setStorageTexture(name: string, texture: BaseTexture): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== texture;\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.StorageTexture,\r\n object: texture,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds an external texture to the shader\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n */\r\n public setExternalTexture(name: string, texture: ExternalTexture): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== texture;\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.ExternalTexture,\r\n object: texture,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds a video texture to the shader (by binding the external texture attached to this video)\r\n * @param name Binding name of the texture\r\n * @param texture Texture to bind\r\n * @returns true if the video texture was successfully bound, else false. false will be returned if the current engine does not support external textures\r\n */\r\n public setVideoTexture(name: string, texture: VideoTexture) {\r\n if (texture.externalTexture) {\r\n this.setExternalTexture(name, texture.externalTexture);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Binds a uniform buffer to the shader\r\n * @param name Binding name of the buffer\r\n * @param buffer Buffer to bind\r\n */\r\n public setUniformBuffer(name: string, buffer: UniformBuffer | DataBuffer): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== buffer;\r\n\r\n this._bindings[name] = {\r\n type: ComputeShader._BufferIsDataBuffer(buffer) ? ComputeBindingType.DataBuffer : ComputeBindingType.UniformBuffer,\r\n object: buffer,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds a storage buffer to the shader\r\n * @param name Binding name of the buffer\r\n * @param buffer Buffer to bind\r\n */\r\n public setStorageBuffer(name: string, buffer: StorageBuffer | DataBuffer): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || current.object !== buffer;\r\n\r\n this._bindings[name] = {\r\n type: ComputeShader._BufferIsDataBuffer(buffer) ? ComputeBindingType.DataBuffer : ComputeBindingType.StorageBuffer,\r\n object: buffer,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Binds a texture sampler to the shader\r\n * @param name Binding name of the sampler\r\n * @param sampler Sampler to bind\r\n */\r\n public setTextureSampler(name: string, sampler: TextureSampler): void {\r\n const current = this._bindings[name];\r\n\r\n this._contextIsDirty ||= !current || !sampler.compareSampler(current.object);\r\n\r\n this._bindings[name] = {\r\n type: ComputeBindingType.Sampler,\r\n object: sampler,\r\n indexInGroupEntries: current?.indexInGroupEntries,\r\n };\r\n }\r\n\r\n /**\r\n * Specifies that the compute shader is ready to be executed (the compute effect and all the resources are ready)\r\n * @returns true if the compute shader is ready to be executed\r\n */\r\n public isReady(): boolean {\r\n let effect = this._effect;\r\n\r\n for (const key in this._bindings) {\r\n const binding = this._bindings[key],\r\n type = binding.type,\r\n object = binding.object;\r\n\r\n switch (type) {\r\n case ComputeBindingType.Texture:\r\n case ComputeBindingType.TextureWithoutSampler:\r\n case ComputeBindingType.StorageTexture: {\r\n const texture = object as BaseTexture;\r\n if (!texture.isReady()) {\r\n return false;\r\n }\r\n break;\r\n }\r\n case ComputeBindingType.ExternalTexture: {\r\n const texture = object as ExternalTexture;\r\n if (!texture.isReady()) {\r\n return false;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const defines = [];\r\n\r\n const shaderName = this._shaderPath;\r\n\r\n if (this._options.defines) {\r\n for (let index = 0; index < this._options.defines.length; index++) {\r\n defines.push(this._options.defines[index]);\r\n }\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n\r\n if (this._cachedDefines !== join) {\r\n this._cachedDefines = join;\r\n\r\n effect = this._engine.createComputeEffect(shaderName, <IComputeEffectCreationOptions>{\r\n defines: join,\r\n entryPoint: this._options.entryPoint,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n });\r\n\r\n this._effect = effect;\r\n }\r\n\r\n if (!effect.isReady()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispatches (executes) the compute shader\r\n * @param x Number of workgroups to execute on the X dimension\r\n * @param y Number of workgroups to execute on the Y dimension (default: 1)\r\n * @param z Number of workgroups to execute on the Z dimension (default: 1)\r\n * @returns True if the dispatch could be done, else false (meaning either the compute effect or at least one of the bound resources was not ready)\r\n */\r\n public dispatch(x: number, y?: number, z?: number): boolean {\r\n if (!this.fastMode) {\r\n if (!this.isReady()) {\r\n return false;\r\n }\r\n\r\n // If the sampling parameters of a texture bound to the shader have changed, we must clear the compute context so that it is recreated with the updated values\r\n // Also, if the actual (gpu) buffer used by a uniform buffer has changed, we must clear the compute context so that it is recreated with the updated value\r\n for (const key in this._bindings) {\r\n const binding = this._bindings[key];\r\n\r\n if (!this._options.bindingsMapping[key]) {\r\n throw new Error(\"ComputeShader ('\" + this.name + \"'): No binding mapping has been provided for the property '\" + key + \"'\");\r\n }\r\n\r\n switch (binding.type) {\r\n case ComputeBindingType.Texture: {\r\n const sampler = this._samplers[key];\r\n const texture = binding.object as BaseTexture;\r\n\r\n if (!sampler || !texture._texture || !sampler.compareSampler(texture._texture)) {\r\n this._samplers[key] = new TextureSampler().setParameters(\r\n texture.wrapU,\r\n texture.wrapV,\r\n texture.wrapR,\r\n texture.anisotropicFilteringLevel,\r\n texture._texture!.samplingMode,\r\n texture._texture?._comparisonFunction\r\n );\r\n this._contextIsDirty = true;\r\n }\r\n break;\r\n }\r\n case ComputeBindingType.ExternalTexture: {\r\n // we must recreate the bind groups each time if there's an external texture, because device.importExternalTexture must be called each frame\r\n this._contextIsDirty = true;\r\n break;\r\n }\r\n case ComputeBindingType.UniformBuffer: {\r\n const ubo = binding.object as UniformBuffer;\r\n if (ubo.getBuffer() !== binding.buffer) {\r\n binding.buffer = ubo.getBuffer();\r\n this._contextIsDirty = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._contextIsDirty) {\r\n this._contextIsDirty = false;\r\n this._context.clear();\r\n }\r\n }\r\n\r\n this._engine.computeDispatch(this._effect, this._context, this._bindings, x, y, z, this._options.bindingsMapping, this.gpuTimeInFrame);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Waits for the compute shader to be ready and executes it\r\n * @param x Number of workgroups to execute on the X dimension\r\n * @param y Number of workgroups to execute on the Y dimension (default: 1)\r\n * @param z Number of workgroups to execute on the Z dimension (default: 1)\r\n * @param delay Delay between the retries while the shader is not ready (in milliseconds - 10 by default)\r\n * @returns A promise that is resolved once the shader has been sent to the GPU. Note that it does not mean that the shader execution itself is finished!\r\n */\r\n public dispatchWhenReady(x: number, y?: number, z?: number, delay = 10): Promise<void> {\r\n return new Promise((resolve) => {\r\n const check = () => {\r\n if (!this.dispatch(x, y, z)) {\r\n setTimeout(check, delay);\r\n } else {\r\n resolve();\r\n }\r\n };\r\n\r\n check();\r\n });\r\n }\r\n\r\n /**\r\n * Serializes this compute shader in a JSON representation\r\n * @returns the serialized compute shader object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n serializationObject.options = this._options;\r\n serializationObject.shaderPath = this._shaderPath;\r\n serializationObject.bindings = {};\r\n serializationObject.textures = {};\r\n\r\n for (const key in this._bindings) {\r\n const binding = this._bindings[key];\r\n const object = binding.object;\r\n\r\n switch (binding.type) {\r\n case ComputeBindingType.Texture:\r\n case ComputeBindingType.TextureWithoutSampler:\r\n case ComputeBindingType.StorageTexture: {\r\n const serializedData = (object as BaseTexture).serialize();\r\n if (serializedData) {\r\n serializationObject.textures[key] = serializedData;\r\n serializationObject.bindings[key] = {\r\n type: binding.type,\r\n };\r\n }\r\n break;\r\n }\r\n\r\n case ComputeBindingType.UniformBuffer: {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a compute shader from parsed compute shader data\r\n * @param source defines the JSON representation of the compute shader\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new compute shader\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): ComputeShader {\r\n const compute = SerializationHelper.Parse(\r\n () => new ComputeShader(source.name, scene.getEngine() as WebGPUEngine, source.shaderPath, source.options),\r\n source,\r\n scene,\r\n rootUrl\r\n );\r\n\r\n for (const key in source.textures) {\r\n const binding = source.bindings[key];\r\n const texture = <Texture>Texture.Parse(source.textures[key], scene, rootUrl);\r\n\r\n if (binding.type === ComputeBindingType.Texture) {\r\n compute.setTexture(key, texture);\r\n } else if (binding.type === ComputeBindingType.TextureWithoutSampler) {\r\n compute.setTexture(key, texture, false);\r\n } else {\r\n compute.setStorageTexture(key, texture);\r\n }\r\n }\r\n\r\n return compute;\r\n }\r\n\r\n protected static _BufferIsDataBuffer(buffer: UniformBuffer | StorageBuffer | DataBuffer): buffer is DataBuffer {\r\n return (buffer as DataBuffer).underlyingResource !== undefined;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ComputeShader\", ComputeShader);\r\n"]}
@@ -181,27 +181,27 @@ export class DirectionalLightFrustumViewer {
181
181
  _createGeometry() {
182
182
  this._rootNode = new TransformNode("directionalLightHelperRoot_" + this._light.name, this._scene);
183
183
  this._rootNode.parent = this._light.parent;
184
- this._nearLinesPoints = [Vector3.ZeroReadOnly, Vector3.ZeroReadOnly, Vector3.ZeroReadOnly, Vector3.ZeroReadOnly, Vector3.ZeroReadOnly];
184
+ this._nearLinesPoints = [TmpVectors.Vector3[0], TmpVectors.Vector3[1], TmpVectors.Vector3[2], TmpVectors.Vector3[3], TmpVectors.Vector3[4]];
185
185
  const nearLines = CreateLines("nearlines", { updatable: true, points: this._nearLinesPoints }, this._scene);
186
186
  nearLines.parent = this._rootNode;
187
187
  nearLines.alwaysSelectAsActiveMesh = true;
188
- this._farLinesPoints = [Vector3.ZeroReadOnly, Vector3.ZeroReadOnly, Vector3.ZeroReadOnly, Vector3.ZeroReadOnly, Vector3.ZeroReadOnly];
188
+ this._farLinesPoints = [TmpVectors.Vector3[5], TmpVectors.Vector3[6], TmpVectors.Vector3[7], TmpVectors.Vector3[8], TmpVectors.Vector3[9]];
189
189
  const farLines = CreateLines("farlines", { updatable: true, points: this._farLinesPoints }, this._scene);
190
190
  farLines.parent = this._rootNode;
191
191
  farLines.alwaysSelectAsActiveMesh = true;
192
- this._trLinesPoints = [Vector3.ZeroReadOnly, Vector3.ZeroReadOnly];
192
+ this._trLinesPoints = [TmpVectors.Vector3[10], TmpVectors.Vector3[11]];
193
193
  const trLines = CreateLines("trlines", { updatable: true, points: this._trLinesPoints }, this._scene);
194
194
  trLines.parent = this._rootNode;
195
195
  trLines.alwaysSelectAsActiveMesh = true;
196
- this._brLinesPoints = [Vector3.ZeroReadOnly, Vector3.ZeroReadOnly];
196
+ this._brLinesPoints = [TmpVectors.Vector3[12], TmpVectors.Vector3[0]];
197
197
  const brLines = CreateLines("brlines", { updatable: true, points: this._brLinesPoints }, this._scene);
198
198
  brLines.parent = this._rootNode;
199
199
  brLines.alwaysSelectAsActiveMesh = true;
200
- this._tlLinesPoints = [Vector3.ZeroReadOnly, Vector3.ZeroReadOnly];
200
+ this._tlLinesPoints = [TmpVectors.Vector3[1], TmpVectors.Vector3[2]];
201
201
  const tlLines = CreateLines("tllines", { updatable: true, points: this._tlLinesPoints }, this._scene);
202
202
  tlLines.parent = this._rootNode;
203
203
  tlLines.alwaysSelectAsActiveMesh = true;
204
- this._blLinesPoints = [Vector3.ZeroReadOnly, Vector3.ZeroReadOnly];
204
+ this._blLinesPoints = [TmpVectors.Vector3[3], TmpVectors.Vector3[4]];
205
205
  const blLines = CreateLines("bllines", { updatable: true, points: this._blLinesPoints }, this._scene);
206
206
  blLines.parent = this._rootNode;
207
207
  blLines.alwaysSelectAsActiveMesh = true;