@babylonjs/core 6.34.1 → 6.34.3

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 (153) hide show
  1. package/Cameras/Inputs/followCameraMouseWheelInput.js +12 -9
  2. package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
  3. package/Cameras/Inputs/followCameraPointersInput.js +28 -9
  4. package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
  5. package/Cameras/followCameraInputsManager.js +2 -1
  6. package/Cameras/followCameraInputsManager.js.map +1 -1
  7. package/Compute/computeShader.d.ts +8 -2
  8. package/Compute/computeShader.js +5 -1
  9. package/Compute/computeShader.js.map +1 -1
  10. package/Debug/skeletonViewer.js +2 -1
  11. package/Debug/skeletonViewer.js.map +1 -1
  12. package/Engines/Extensions/engine.computeShader.d.ts +3 -1
  13. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  14. package/Engines/Extensions/engine.multiRender.js +3 -2
  15. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  16. package/Engines/Processors/shaderCodeInliner.js +15 -14
  17. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  18. package/Engines/WebGPU/Extensions/engine.computeShader.js +13 -4
  19. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  20. package/Engines/WebGPU/Extensions/engine.multiRender.js +3 -2
  21. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  22. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +8 -1
  23. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  24. package/Engines/WebGPU/webgpuBufferManager.d.ts +3 -1
  25. package/Engines/WebGPU/webgpuBufferManager.js +10 -2
  26. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  27. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  28. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  29. package/Engines/WebGPU/webgpuPerfCounter.d.ts +15 -0
  30. package/Engines/WebGPU/webgpuPerfCounter.js +31 -0
  31. package/Engines/WebGPU/webgpuPerfCounter.js.map +1 -0
  32. package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -1
  33. package/Engines/WebGPU/webgpuQuerySet.js +37 -18
  34. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  35. package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +20 -1
  36. package/Engines/WebGPU/webgpuRenderTargetWrapper.js +18 -1
  37. package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -1
  38. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  39. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  40. package/Engines/WebGPU/webgpuTimestampQuery.d.ts +11 -2
  41. package/Engines/WebGPU/webgpuTimestampQuery.js +45 -7
  42. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  43. package/Engines/WebGPU/webgpuTintWASM.js +3 -2
  44. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  45. package/Engines/engine.d.ts +3 -5
  46. package/Engines/engine.js.map +1 -1
  47. package/Engines/index.d.ts +1 -0
  48. package/Engines/index.js +1 -0
  49. package/Engines/index.js.map +1 -1
  50. package/Engines/nativeEngine.js +4 -2
  51. package/Engines/nativeEngine.js.map +1 -1
  52. package/Engines/thinEngine.js +4 -4
  53. package/Engines/thinEngine.js.map +1 -1
  54. package/Engines/webgpuEngine.d.ts +16 -1
  55. package/Engines/webgpuEngine.js +108 -54
  56. package/Engines/webgpuEngine.js.map +1 -1
  57. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js +2 -1
  58. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js.map +1 -1
  59. package/Gizmos/lightGizmo.js +2 -1
  60. package/Gizmos/lightGizmo.js.map +1 -1
  61. package/Gizmos/rotationGizmo.js +1 -1
  62. package/Gizmos/rotationGizmo.js.map +1 -1
  63. package/Lights/Shadows/cascadedShadowGenerator.js +1 -1
  64. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  65. package/Materials/Node/Blocks/Dual/lightBlock.js +2 -1
  66. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  67. package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js +3 -2
  68. package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js.map +1 -1
  69. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +2 -1
  70. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
  71. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +2 -1
  72. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  73. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +2 -1
  74. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  75. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +3 -2
  76. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  77. package/Materials/Node/Blocks/PBR/reflectionBlock.js +2 -1
  78. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  79. package/Materials/Node/nodeMaterial.js +9 -8
  80. package/Materials/Node/nodeMaterial.js.map +1 -1
  81. package/Materials/Node/nodeMaterialBlock.js +2 -1
  82. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  83. package/Materials/Textures/multiRenderTarget.d.ts +4 -0
  84. package/Materials/Textures/multiRenderTarget.js +1 -0
  85. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  86. package/Materials/Textures/renderTargetTexture.js +1 -2
  87. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  88. package/Materials/uniformBuffer.d.ts +1 -4
  89. package/Materials/uniformBuffer.js +2 -5
  90. package/Materials/uniformBuffer.js.map +1 -1
  91. package/Meshes/Builders/groundBuilder.d.ts +7 -1
  92. package/Meshes/Builders/groundBuilder.js +17 -8
  93. package/Meshes/Builders/groundBuilder.js.map +1 -1
  94. package/Meshes/Compression/dracoCompression.js.map +1 -1
  95. package/Meshes/Node/nodeGeometryBlock.js +2 -1
  96. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  97. package/Meshes/mesh.d.ts +2 -1
  98. package/Meshes/mesh.js +3 -2
  99. package/Meshes/mesh.js.map +1 -1
  100. package/Misc/assetsManager.js +2 -2
  101. package/Misc/assetsManager.js.map +1 -1
  102. package/Misc/dds.js +1 -1
  103. package/Misc/dds.js.map +1 -1
  104. package/Misc/fileTools.js +4 -0
  105. package/Misc/fileTools.js.map +1 -1
  106. package/Misc/logger.d.ts +3 -3
  107. package/Misc/logger.js +8 -4
  108. package/Misc/logger.js.map +1 -1
  109. package/Misc/perfCounter.d.ts +2 -1
  110. package/Misc/perfCounter.js +1 -0
  111. package/Misc/perfCounter.js.map +1 -1
  112. package/Misc/sceneSerializer.js +2 -1
  113. package/Misc/sceneSerializer.js.map +1 -1
  114. package/Misc/tools.d.ts +2 -7
  115. package/Misc/tools.js.map +1 -1
  116. package/Navigation/Plugins/recastJSPlugin.js +3 -3
  117. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  118. package/Particles/computeShaderParticleSystem.js.map +1 -1
  119. package/Physics/v2/Plugins/havokPlugin.js +1 -1
  120. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  121. package/Physics/v2/physicsBody.d.ts +5 -0
  122. package/Physics/v2/physicsBody.js +7 -0
  123. package/Physics/v2/physicsBody.js.map +1 -1
  124. package/Physics/v2/ragdoll.d.ts +5 -10
  125. package/Physics/v2/ragdoll.js +29 -36
  126. package/Physics/v2/ragdoll.js.map +1 -1
  127. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +2 -2
  128. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  129. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +3 -2
  130. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  131. package/PostProcesses/screenSpaceCurvaturePostProcess.js +1 -1
  132. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  133. package/PostProcesses/screenSpaceReflectionPostProcess.js +3 -2
  134. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  135. package/Rendering/GaussianSplatting/gaussianSplatting.js.map +1 -1
  136. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +3 -1
  137. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  138. package/XR/features/WebXRControllerPhysics.js +2 -2
  139. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  140. package/XR/features/WebXRMeshDetector.js +2 -1
  141. package/XR/features/WebXRMeshDetector.js.map +1 -1
  142. package/XR/features/WebXRWalkingLocomotion.js +1 -1
  143. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  144. package/XR/motionController/webXRMotionControllerManager.js +1 -1
  145. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  146. package/XR/webXRExperienceHelper.js +2 -2
  147. package/XR/webXRExperienceHelper.js.map +1 -1
  148. package/assetContainer.js +2 -2
  149. package/assetContainer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/scene.d.ts +2 -4
  152. package/scene.js +2 -1
  153. package/scene.js.map +1 -1
@@ -3,6 +3,7 @@ import { serialize } from "../../Misc/decorators.js";
3
3
  import { CameraInputTypes } from "../../Cameras/cameraInputsManager.js";
4
4
  import { PointerEventTypes } from "../../Events/pointerEvents.js";
5
5
  import { Tools } from "../../Misc/tools.js";
6
+ import { Logger } from "../../Misc/logger.js";
6
7
  /**
7
8
  * Manage the mouse wheel inputs to control a follow camera.
8
9
  * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs
@@ -47,15 +48,17 @@ export class FollowCameraMouseWheelInput {
47
48
  let delta = 0;
48
49
  const wheelDelta = Math.max(-1, Math.min(1, event.deltaY));
49
50
  if (this.wheelDeltaPercentage) {
50
- console.assert(this.axisControlRadius + this.axisControlHeight + this.axisControlRotation <= 1, "wheelDeltaPercentage only usable when mouse wheel " +
51
- "controls ONE axis. " +
52
- "Currently enabled: " +
53
- "axisControlRadius: " +
54
- this.axisControlRadius +
55
- ", axisControlHeightOffset: " +
56
- this.axisControlHeight +
57
- ", axisControlRotationOffset: " +
58
- this.axisControlRotation);
51
+ if (+this.axisControlRadius + +this.axisControlHeight + +this.axisControlRotation) {
52
+ Logger.Warn("wheelDeltaPercentage only usable when mouse wheel " +
53
+ "controls ONE axis. " +
54
+ "Currently enabled: " +
55
+ "axisControlRadius: " +
56
+ this.axisControlRadius +
57
+ ", axisControlHeightOffset: " +
58
+ this.axisControlHeight +
59
+ ", axisControlRotationOffset: " +
60
+ this.axisControlRotation);
61
+ }
59
62
  if (this.axisControlRadius) {
60
63
  delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.radius;
61
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"followCameraMouseWheelInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/followCameraMouseWheelInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { EventState, Observer } from \"../../Misc/observable\";\r\nimport type { FollowCamera } from \"../../Cameras/followCamera\";\r\nimport type { ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport type { IWheelEvent } from \"../../Events/deviceInputEvents\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Manage the mouse wheel inputs to control a follow camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\r\n */\r\nexport class FollowCameraMouseWheelInput implements ICameraInput<FollowCamera> {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public camera: FollowCamera;\r\n\r\n /**\r\n * Moue wheel controls zoom. (Mouse wheel modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisControlRadius: boolean = true;\r\n\r\n /**\r\n * Moue wheel controls height. (Mouse wheel modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisControlHeight: boolean = false;\r\n\r\n /**\r\n * Moue wheel controls angle. (Mouse wheel modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisControlRotation: boolean = false;\r\n\r\n /**\r\n * Gets or Set the mouse wheel precision or how fast is the camera moves in\r\n * relation to mouseWheel events.\r\n */\r\n @serialize()\r\n public wheelPrecision = 3.0;\r\n\r\n /**\r\n * wheelDeltaPercentage will be used instead of wheelPrecision if different from 0.\r\n * It defines the percentage of current camera.radius to use as delta when wheel is used.\r\n */\r\n @serialize()\r\n public wheelDeltaPercentage = 0;\r\n\r\n private _wheel: Nullable<(p: PointerInfo, s: EventState) => void>;\r\n private _observer: Nullable<Observer<PointerInfo>>;\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this._wheel = (p) => {\r\n // sanity check - this should be a PointerWheel event.\r\n if (p.type !== PointerEventTypes.POINTERWHEEL) {\r\n return;\r\n }\r\n const event = <IWheelEvent>p.event;\r\n let delta = 0;\r\n\r\n const wheelDelta = Math.max(-1, Math.min(1, event.deltaY));\r\n if (this.wheelDeltaPercentage) {\r\n console.assert(\r\n <number>(<unknown>this.axisControlRadius) + <number>(<unknown>this.axisControlHeight) + <number>(<unknown>this.axisControlRotation) <= 1,\r\n \"wheelDeltaPercentage only usable when mouse wheel \" +\r\n \"controls ONE axis. \" +\r\n \"Currently enabled: \" +\r\n \"axisControlRadius: \" +\r\n this.axisControlRadius +\r\n \", axisControlHeightOffset: \" +\r\n this.axisControlHeight +\r\n \", axisControlRotationOffset: \" +\r\n this.axisControlRotation\r\n );\r\n\r\n if (this.axisControlRadius) {\r\n delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.radius;\r\n } else if (this.axisControlHeight) {\r\n delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.heightOffset;\r\n } else if (this.axisControlRotation) {\r\n delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.rotationOffset;\r\n }\r\n } else {\r\n delta = wheelDelta * this.wheelPrecision;\r\n }\r\n\r\n if (delta) {\r\n if (this.axisControlRadius) {\r\n this.camera.radius += delta;\r\n } else if (this.axisControlHeight) {\r\n this.camera.heightOffset -= delta;\r\n } else if (this.axisControlRotation) {\r\n this.camera.rotationOffset -= delta;\r\n }\r\n }\r\n\r\n if (event.preventDefault) {\r\n if (!noPreventDefault) {\r\n event.preventDefault();\r\n }\r\n }\r\n };\r\n\r\n this._observer = this.camera.getScene()._inputManager._addCameraPointerObserver(this._wheel, PointerEventTypes.POINTERWHEEL);\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n if (this._observer) {\r\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\r\n this._observer = null;\r\n this._wheel = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ArcRotateCameraMouseWheelInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"mousewheel\";\r\n }\r\n}\r\n\r\n(<any>CameraInputTypes)[\"FollowCameraMouseWheelInput\"] = FollowCameraMouseWheelInput;\r\n"]}
1
+ {"version":3,"file":"followCameraMouseWheelInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/followCameraMouseWheelInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { EventState, Observer } from \"../../Misc/observable\";\r\nimport type { FollowCamera } from \"../../Cameras/followCamera\";\r\nimport type { ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport type { IWheelEvent } from \"../../Events/deviceInputEvents\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Manage the mouse wheel inputs to control a follow camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\r\n */\r\nexport class FollowCameraMouseWheelInput implements ICameraInput<FollowCamera> {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public camera: FollowCamera;\r\n\r\n /**\r\n * Moue wheel controls zoom. (Mouse wheel modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisControlRadius: boolean = true;\r\n\r\n /**\r\n * Moue wheel controls height. (Mouse wheel modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisControlHeight: boolean = false;\r\n\r\n /**\r\n * Moue wheel controls angle. (Mouse wheel modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisControlRotation: boolean = false;\r\n\r\n /**\r\n * Gets or Set the mouse wheel precision or how fast is the camera moves in\r\n * relation to mouseWheel events.\r\n */\r\n @serialize()\r\n public wheelPrecision = 3.0;\r\n\r\n /**\r\n * wheelDeltaPercentage will be used instead of wheelPrecision if different from 0.\r\n * It defines the percentage of current camera.radius to use as delta when wheel is used.\r\n */\r\n @serialize()\r\n public wheelDeltaPercentage = 0;\r\n\r\n private _wheel: Nullable<(p: PointerInfo, s: EventState) => void>;\r\n private _observer: Nullable<Observer<PointerInfo>>;\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n this._wheel = (p) => {\r\n // sanity check - this should be a PointerWheel event.\r\n if (p.type !== PointerEventTypes.POINTERWHEEL) {\r\n return;\r\n }\r\n const event = <IWheelEvent>p.event;\r\n let delta = 0;\r\n\r\n const wheelDelta = Math.max(-1, Math.min(1, event.deltaY));\r\n if (this.wheelDeltaPercentage) {\r\n if (+this.axisControlRadius + +this.axisControlHeight + +this.axisControlRotation) {\r\n Logger.Warn(\r\n \"wheelDeltaPercentage only usable when mouse wheel \" +\r\n \"controls ONE axis. \" +\r\n \"Currently enabled: \" +\r\n \"axisControlRadius: \" +\r\n this.axisControlRadius +\r\n \", axisControlHeightOffset: \" +\r\n this.axisControlHeight +\r\n \", axisControlRotationOffset: \" +\r\n this.axisControlRotation\r\n );\r\n }\r\n\r\n if (this.axisControlRadius) {\r\n delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.radius;\r\n } else if (this.axisControlHeight) {\r\n delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.heightOffset;\r\n } else if (this.axisControlRotation) {\r\n delta = wheelDelta * 0.01 * this.wheelDeltaPercentage * this.camera.rotationOffset;\r\n }\r\n } else {\r\n delta = wheelDelta * this.wheelPrecision;\r\n }\r\n\r\n if (delta) {\r\n if (this.axisControlRadius) {\r\n this.camera.radius += delta;\r\n } else if (this.axisControlHeight) {\r\n this.camera.heightOffset -= delta;\r\n } else if (this.axisControlRotation) {\r\n this.camera.rotationOffset -= delta;\r\n }\r\n }\r\n\r\n if (event.preventDefault) {\r\n if (!noPreventDefault) {\r\n event.preventDefault();\r\n }\r\n }\r\n };\r\n\r\n this._observer = this.camera.getScene()._inputManager._addCameraPointerObserver(this._wheel, PointerEventTypes.POINTERWHEEL);\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n if (this._observer) {\r\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\r\n this._observer = null;\r\n this._wheel = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ArcRotateCameraMouseWheelInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"mousewheel\";\r\n }\r\n}\r\n\r\n(<any>CameraInputTypes)[\"FollowCameraMouseWheelInput\"] = FollowCameraMouseWheelInput;\r\n"]}
@@ -2,6 +2,7 @@ import { __decorate } from "../../tslib.es6.js";
2
2
  import { serialize } from "../../Misc/decorators.js";
3
3
  import { CameraInputTypes } from "../../Cameras/cameraInputsManager.js";
4
4
  import { BaseCameraPointersInput } from "../../Cameras/Inputs/BaseCameraPointersInput.js";
5
+ import { Logger } from "../../Misc/logger.js";
5
6
  /**
6
7
  * Manage the pointers inputs to control an follow camera.
7
8
  * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs
@@ -145,15 +146,33 @@ export class FollowCameraPointersInput extends BaseCameraPointersInput {
145
146
  return;
146
147
  }
147
148
  const warn = "It probably only makes sense to control ONE camera " + "property with each pointer axis. Set 'warningEnable = false' " + "if you are sure. Currently enabled: ";
148
- console.assert(this.axisXControlRotation + this.axisXControlHeight + this.axisXControlRadius <= 1, warn + "axisXControlRotation: " + this.axisXControlRotation + ", axisXControlHeight: " + this.axisXControlHeight + ", axisXControlRadius: " + this.axisXControlRadius);
149
- console.assert(this.axisYControlRotation + this.axisYControlHeight + this.axisYControlRadius <= 1, warn + "axisYControlRotation: " + this.axisYControlRotation + ", axisYControlHeight: " + this.axisYControlHeight + ", axisYControlRadius: " + this.axisYControlRadius);
150
- console.assert(this.axisPinchControlRotation + this.axisPinchControlHeight + this.axisPinchControlRadius <= 1, warn +
151
- "axisPinchControlRotation: " +
152
- this.axisPinchControlRotation +
153
- ", axisPinchControlHeight: " +
154
- this.axisPinchControlHeight +
155
- ", axisPinchControlRadius: " +
156
- this.axisPinchControlRadius);
149
+ if (+this.axisXControlRotation + +this.axisXControlHeight + +this.axisXControlRadius <= 1) {
150
+ Logger.Warn(warn +
151
+ "axisXControlRotation: " +
152
+ this.axisXControlRotation +
153
+ ", axisXControlHeight: " +
154
+ this.axisXControlHeight +
155
+ ", axisXControlRadius: " +
156
+ this.axisXControlRadius);
157
+ }
158
+ if (+this.axisYControlRotation + +this.axisYControlHeight + +this.axisYControlRadius <= 1) {
159
+ Logger.Warn(warn +
160
+ "axisYControlRotation: " +
161
+ this.axisYControlRotation +
162
+ ", axisYControlHeight: " +
163
+ this.axisYControlHeight +
164
+ ", axisYControlRadius: " +
165
+ this.axisYControlRadius);
166
+ }
167
+ if (+this.axisPinchControlRotation + +this.axisPinchControlHeight + +this.axisPinchControlRadius <= 1) {
168
+ Logger.Warn(warn +
169
+ "axisPinchControlRotation: " +
170
+ this.axisPinchControlRotation +
171
+ ", axisPinchControlHeight: " +
172
+ this.axisPinchControlHeight +
173
+ ", axisPinchControlRadius: " +
174
+ this.axisPinchControlRadius);
175
+ }
157
176
  }
158
177
  }
159
178
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"followCameraPointersInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/followCameraPointersInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { FollowCamera } from \"../../Cameras/followCamera\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport { BaseCameraPointersInput } from \"../../Cameras/Inputs/BaseCameraPointersInput\";\r\nimport type { PointerTouch } from \"../../Events/pointerEvents\";\r\n\r\n/**\r\n * Manage the pointers inputs to control an follow camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\r\n */\r\nexport class FollowCameraPointersInput extends BaseCameraPointersInput {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public camera: FollowCamera;\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"FollowCameraPointersInput\";\r\n }\r\n\r\n /**\r\n * Defines the pointer angular sensibility along the X axis or how fast is\r\n * the camera rotating.\r\n * A negative number will reverse the axis direction.\r\n */\r\n @serialize()\r\n public angularSensibilityX = 1;\r\n\r\n /**\r\n * Defines the pointer angular sensibility along the Y axis or how fast is\r\n * the camera rotating.\r\n * A negative number will reverse the axis direction.\r\n */\r\n @serialize()\r\n public angularSensibilityY = 1;\r\n\r\n /**\r\n * Defines the pointer pinch precision or how fast is the camera zooming.\r\n * A negative number will reverse the axis direction.\r\n */\r\n @serialize()\r\n public pinchPrecision = 10000.0;\r\n\r\n /**\r\n * pinchDeltaPercentage will be used instead of pinchPrecision if different\r\n * from 0.\r\n * It defines the percentage of current camera.radius to use as delta when\r\n * pinch zoom is used.\r\n */\r\n @serialize()\r\n public pinchDeltaPercentage = 0;\r\n\r\n /**\r\n * Pointer X axis controls zoom. (X axis modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisXControlRadius: boolean = false;\r\n\r\n /**\r\n * Pointer X axis controls height. (X axis modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisXControlHeight: boolean = false;\r\n\r\n /**\r\n * Pointer X axis controls angle. (X axis modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisXControlRotation: boolean = true;\r\n\r\n /**\r\n * Pointer Y axis controls zoom. (Y axis modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisYControlRadius: boolean = false;\r\n\r\n /**\r\n * Pointer Y axis controls height. (Y axis modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisYControlHeight: boolean = true;\r\n\r\n /**\r\n * Pointer Y axis controls angle. (Y axis modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisYControlRotation: boolean = false;\r\n\r\n /**\r\n * Pinch controls zoom. (Pinch modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisPinchControlRadius: boolean = true;\r\n\r\n /**\r\n * Pinch controls height. (Pinch modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisPinchControlHeight: boolean = false;\r\n\r\n /**\r\n * Pinch controls angle. (Pinch modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisPinchControlRotation: boolean = false;\r\n\r\n /**\r\n * Log error messages if basic misconfiguration has occurred.\r\n */\r\n public warningEnable: boolean = true;\r\n\r\n public onTouch(pointA: Nullable<PointerTouch>, offsetX: number, offsetY: number): void {\r\n this._warning();\r\n\r\n if (this.axisXControlRotation) {\r\n this.camera.rotationOffset += offsetX / this.angularSensibilityX;\r\n } else if (this.axisYControlRotation) {\r\n this.camera.rotationOffset += offsetY / this.angularSensibilityX;\r\n }\r\n\r\n if (this.axisXControlHeight) {\r\n this.camera.heightOffset += offsetX / this.angularSensibilityY;\r\n } else if (this.axisYControlHeight) {\r\n this.camera.heightOffset += offsetY / this.angularSensibilityY;\r\n }\r\n\r\n if (this.axisXControlRadius) {\r\n this.camera.radius -= offsetX / this.angularSensibilityY;\r\n } else if (this.axisYControlRadius) {\r\n this.camera.radius -= offsetY / this.angularSensibilityY;\r\n }\r\n }\r\n\r\n public onMultiTouch(\r\n pointA: Nullable<PointerTouch>,\r\n pointB: Nullable<PointerTouch>,\r\n previousPinchSquaredDistance: number,\r\n pinchSquaredDistance: number,\r\n previousMultiTouchPanPosition: Nullable<PointerTouch>,\r\n multiTouchPanPosition: Nullable<PointerTouch>\r\n ): void {\r\n if (previousPinchSquaredDistance === 0 && previousMultiTouchPanPosition === null) {\r\n // First time this method is called for new pinch.\r\n // Next time this is called there will be a\r\n // previousPinchSquaredDistance and pinchSquaredDistance to compare.\r\n return;\r\n }\r\n if (pinchSquaredDistance === 0 && multiTouchPanPosition === null) {\r\n // Last time this method is called at the end of a pinch.\r\n return;\r\n }\r\n let pinchDelta = (pinchSquaredDistance - previousPinchSquaredDistance) / ((this.pinchPrecision * (this.angularSensibilityX + this.angularSensibilityY)) / 2);\r\n\r\n if (this.pinchDeltaPercentage) {\r\n pinchDelta *= 0.01 * this.pinchDeltaPercentage;\r\n if (this.axisPinchControlRotation) {\r\n this.camera.rotationOffset += pinchDelta * this.camera.rotationOffset;\r\n }\r\n if (this.axisPinchControlHeight) {\r\n this.camera.heightOffset += pinchDelta * this.camera.heightOffset;\r\n }\r\n if (this.axisPinchControlRadius) {\r\n this.camera.radius -= pinchDelta * this.camera.radius;\r\n }\r\n } else {\r\n if (this.axisPinchControlRotation) {\r\n this.camera.rotationOffset += pinchDelta;\r\n }\r\n\r\n if (this.axisPinchControlHeight) {\r\n this.camera.heightOffset += pinchDelta;\r\n }\r\n\r\n if (this.axisPinchControlRadius) {\r\n this.camera.radius -= pinchDelta;\r\n }\r\n }\r\n }\r\n\r\n /* Check for obvious misconfiguration. */\r\n private _warningCounter: number = 0;\r\n private _warning(): void {\r\n if (!this.warningEnable || this._warningCounter++ % 100 !== 0) {\r\n return;\r\n }\r\n const warn =\r\n \"It probably only makes sense to control ONE camera \" + \"property with each pointer axis. Set 'warningEnable = false' \" + \"if you are sure. Currently enabled: \";\r\n\r\n console.assert(\r\n <number>(<unknown>this.axisXControlRotation) + <number>(<unknown>this.axisXControlHeight) + <number>(<unknown>this.axisXControlRadius) <= 1,\r\n warn + \"axisXControlRotation: \" + this.axisXControlRotation + \", axisXControlHeight: \" + this.axisXControlHeight + \", axisXControlRadius: \" + this.axisXControlRadius\r\n );\r\n console.assert(\r\n <number>(<unknown>this.axisYControlRotation) + <number>(<unknown>this.axisYControlHeight) + <number>(<unknown>this.axisYControlRadius) <= 1,\r\n warn + \"axisYControlRotation: \" + this.axisYControlRotation + \", axisYControlHeight: \" + this.axisYControlHeight + \", axisYControlRadius: \" + this.axisYControlRadius\r\n );\r\n console.assert(\r\n <number>(<unknown>this.axisPinchControlRotation) + <number>(<unknown>this.axisPinchControlHeight) + <number>(<unknown>this.axisPinchControlRadius) <= 1,\r\n warn +\r\n \"axisPinchControlRotation: \" +\r\n this.axisPinchControlRotation +\r\n \", axisPinchControlHeight: \" +\r\n this.axisPinchControlHeight +\r\n \", axisPinchControlRadius: \" +\r\n this.axisPinchControlRadius\r\n );\r\n }\r\n}\r\n(<any>CameraInputTypes)[\"FollowCameraPointersInput\"] = FollowCameraPointersInput;\r\n"]}
1
+ {"version":3,"file":"followCameraPointersInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/followCameraPointersInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { FollowCamera } from \"../../Cameras/followCamera\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport { BaseCameraPointersInput } from \"../../Cameras/Inputs/BaseCameraPointersInput\";\r\nimport type { PointerTouch } from \"../../Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Manage the pointers inputs to control an follow camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\r\n */\r\nexport class FollowCameraPointersInput extends BaseCameraPointersInput {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public camera: FollowCamera;\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"FollowCameraPointersInput\";\r\n }\r\n\r\n /**\r\n * Defines the pointer angular sensibility along the X axis or how fast is\r\n * the camera rotating.\r\n * A negative number will reverse the axis direction.\r\n */\r\n @serialize()\r\n public angularSensibilityX = 1;\r\n\r\n /**\r\n * Defines the pointer angular sensibility along the Y axis or how fast is\r\n * the camera rotating.\r\n * A negative number will reverse the axis direction.\r\n */\r\n @serialize()\r\n public angularSensibilityY = 1;\r\n\r\n /**\r\n * Defines the pointer pinch precision or how fast is the camera zooming.\r\n * A negative number will reverse the axis direction.\r\n */\r\n @serialize()\r\n public pinchPrecision = 10000.0;\r\n\r\n /**\r\n * pinchDeltaPercentage will be used instead of pinchPrecision if different\r\n * from 0.\r\n * It defines the percentage of current camera.radius to use as delta when\r\n * pinch zoom is used.\r\n */\r\n @serialize()\r\n public pinchDeltaPercentage = 0;\r\n\r\n /**\r\n * Pointer X axis controls zoom. (X axis modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisXControlRadius: boolean = false;\r\n\r\n /**\r\n * Pointer X axis controls height. (X axis modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisXControlHeight: boolean = false;\r\n\r\n /**\r\n * Pointer X axis controls angle. (X axis modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisXControlRotation: boolean = true;\r\n\r\n /**\r\n * Pointer Y axis controls zoom. (Y axis modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisYControlRadius: boolean = false;\r\n\r\n /**\r\n * Pointer Y axis controls height. (Y axis modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisYControlHeight: boolean = true;\r\n\r\n /**\r\n * Pointer Y axis controls angle. (Y axis modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisYControlRotation: boolean = false;\r\n\r\n /**\r\n * Pinch controls zoom. (Pinch modifies camera.radius value.)\r\n */\r\n @serialize()\r\n public axisPinchControlRadius: boolean = true;\r\n\r\n /**\r\n * Pinch controls height. (Pinch modifies camera.heightOffset value.)\r\n */\r\n @serialize()\r\n public axisPinchControlHeight: boolean = false;\r\n\r\n /**\r\n * Pinch controls angle. (Pinch modifies camera.rotationOffset value.)\r\n */\r\n @serialize()\r\n public axisPinchControlRotation: boolean = false;\r\n\r\n /**\r\n * Log error messages if basic misconfiguration has occurred.\r\n */\r\n public warningEnable: boolean = true;\r\n\r\n public onTouch(pointA: Nullable<PointerTouch>, offsetX: number, offsetY: number): void {\r\n this._warning();\r\n\r\n if (this.axisXControlRotation) {\r\n this.camera.rotationOffset += offsetX / this.angularSensibilityX;\r\n } else if (this.axisYControlRotation) {\r\n this.camera.rotationOffset += offsetY / this.angularSensibilityX;\r\n }\r\n\r\n if (this.axisXControlHeight) {\r\n this.camera.heightOffset += offsetX / this.angularSensibilityY;\r\n } else if (this.axisYControlHeight) {\r\n this.camera.heightOffset += offsetY / this.angularSensibilityY;\r\n }\r\n\r\n if (this.axisXControlRadius) {\r\n this.camera.radius -= offsetX / this.angularSensibilityY;\r\n } else if (this.axisYControlRadius) {\r\n this.camera.radius -= offsetY / this.angularSensibilityY;\r\n }\r\n }\r\n\r\n public onMultiTouch(\r\n pointA: Nullable<PointerTouch>,\r\n pointB: Nullable<PointerTouch>,\r\n previousPinchSquaredDistance: number,\r\n pinchSquaredDistance: number,\r\n previousMultiTouchPanPosition: Nullable<PointerTouch>,\r\n multiTouchPanPosition: Nullable<PointerTouch>\r\n ): void {\r\n if (previousPinchSquaredDistance === 0 && previousMultiTouchPanPosition === null) {\r\n // First time this method is called for new pinch.\r\n // Next time this is called there will be a\r\n // previousPinchSquaredDistance and pinchSquaredDistance to compare.\r\n return;\r\n }\r\n if (pinchSquaredDistance === 0 && multiTouchPanPosition === null) {\r\n // Last time this method is called at the end of a pinch.\r\n return;\r\n }\r\n let pinchDelta = (pinchSquaredDistance - previousPinchSquaredDistance) / ((this.pinchPrecision * (this.angularSensibilityX + this.angularSensibilityY)) / 2);\r\n\r\n if (this.pinchDeltaPercentage) {\r\n pinchDelta *= 0.01 * this.pinchDeltaPercentage;\r\n if (this.axisPinchControlRotation) {\r\n this.camera.rotationOffset += pinchDelta * this.camera.rotationOffset;\r\n }\r\n if (this.axisPinchControlHeight) {\r\n this.camera.heightOffset += pinchDelta * this.camera.heightOffset;\r\n }\r\n if (this.axisPinchControlRadius) {\r\n this.camera.radius -= pinchDelta * this.camera.radius;\r\n }\r\n } else {\r\n if (this.axisPinchControlRotation) {\r\n this.camera.rotationOffset += pinchDelta;\r\n }\r\n\r\n if (this.axisPinchControlHeight) {\r\n this.camera.heightOffset += pinchDelta;\r\n }\r\n\r\n if (this.axisPinchControlRadius) {\r\n this.camera.radius -= pinchDelta;\r\n }\r\n }\r\n }\r\n\r\n /* Check for obvious misconfiguration. */\r\n private _warningCounter: number = 0;\r\n private _warning(): void {\r\n if (!this.warningEnable || this._warningCounter++ % 100 !== 0) {\r\n return;\r\n }\r\n const warn =\r\n \"It probably only makes sense to control ONE camera \" + \"property with each pointer axis. Set 'warningEnable = false' \" + \"if you are sure. Currently enabled: \";\r\n\r\n if (+this.axisXControlRotation + +this.axisXControlHeight + +this.axisXControlRadius <= 1) {\r\n Logger.Warn(\r\n warn +\r\n \"axisXControlRotation: \" +\r\n this.axisXControlRotation +\r\n \", axisXControlHeight: \" +\r\n this.axisXControlHeight +\r\n \", axisXControlRadius: \" +\r\n this.axisXControlRadius\r\n );\r\n }\r\n if (+this.axisYControlRotation + +this.axisYControlHeight + +this.axisYControlRadius <= 1) {\r\n Logger.Warn(\r\n warn +\r\n \"axisYControlRotation: \" +\r\n this.axisYControlRotation +\r\n \", axisYControlHeight: \" +\r\n this.axisYControlHeight +\r\n \", axisYControlRadius: \" +\r\n this.axisYControlRadius\r\n );\r\n }\r\n if (+this.axisPinchControlRotation + +this.axisPinchControlHeight + +this.axisPinchControlRadius <= 1) {\r\n Logger.Warn(\r\n warn +\r\n \"axisPinchControlRotation: \" +\r\n this.axisPinchControlRotation +\r\n \", axisPinchControlHeight: \" +\r\n this.axisPinchControlHeight +\r\n \", axisPinchControlRadius: \" +\r\n this.axisPinchControlRadius\r\n );\r\n }\r\n }\r\n}\r\n(<any>CameraInputTypes)[\"FollowCameraPointersInput\"] = FollowCameraPointersInput;\r\n"]}
@@ -1,3 +1,4 @@
1
+ import { Logger } from "../Misc/logger.js";
1
2
  import { CameraInputsManager } from "./cameraInputsManager.js";
2
3
  import { FollowCameraKeyboardMoveInput } from "./Inputs/followCameraKeyboardMoveInput.js";
3
4
  import { FollowCameraMouseWheelInput } from "./Inputs/followCameraMouseWheelInput.js";
@@ -44,7 +45,7 @@ export class FollowCameraInputsManager extends CameraInputsManager {
44
45
  * @returns the current input manager
45
46
  */
46
47
  addVRDeviceOrientation() {
47
- console.warn("DeviceOrientation support not yet implemented for FollowCamera.");
48
+ Logger.Warn("DeviceOrientation support not yet implemented for FollowCamera.");
48
49
  return this;
49
50
  }
50
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"followCameraInputsManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/followCameraInputsManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAiC;IAC5E;;;OAGG;IACH,YAAY,MAAoB;QAC5B,KAAK,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,IAAI,CAAC,GAAG,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,IAAI,CAAC,GAAG,CAAC,IAAI,2BAA2B,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,IAAI,CAAC,GAAG,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,sBAAsB;QACzB,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { CameraInputsManager } from \"./cameraInputsManager\";\r\nimport type { FollowCamera } from \"./followCamera\";\r\nimport { FollowCameraKeyboardMoveInput } from \"./Inputs/followCameraKeyboardMoveInput\";\r\nimport { FollowCameraMouseWheelInput } from \"./Inputs/followCameraMouseWheelInput\";\r\nimport { FollowCameraPointersInput } from \"./Inputs/followCameraPointersInput\";\r\n\r\n/**\r\n * Default Inputs manager for the FollowCamera.\r\n * It groups all the default supported inputs for ease of use.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\r\n */\r\nexport class FollowCameraInputsManager extends CameraInputsManager<FollowCamera> {\r\n /**\r\n * Instantiates a new FollowCameraInputsManager.\r\n * @param camera Defines the camera the inputs belong to\r\n */\r\n constructor(camera: FollowCamera) {\r\n super(camera);\r\n }\r\n\r\n /**\r\n * Add keyboard input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addKeyboard(): FollowCameraInputsManager {\r\n this.add(new FollowCameraKeyboardMoveInput());\r\n return this;\r\n }\r\n\r\n /**\r\n * Add mouse wheel input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addMouseWheel(): FollowCameraInputsManager {\r\n this.add(new FollowCameraMouseWheelInput());\r\n return this;\r\n }\r\n\r\n /**\r\n * Add pointers input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addPointers(): FollowCameraInputsManager {\r\n this.add(new FollowCameraPointersInput());\r\n return this;\r\n }\r\n\r\n /**\r\n * Add orientation input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addVRDeviceOrientation(): FollowCameraInputsManager {\r\n console.warn(\"DeviceOrientation support not yet implemented for FollowCamera.\");\r\n return this;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"followCameraInputsManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Cameras/followCameraInputsManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,0BAAyB;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAiC;IAC5E;;;OAGG;IACH,YAAY,MAAoB;QAC5B,KAAK,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,IAAI,CAAC,GAAG,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,IAAI,CAAC,GAAG,CAAC,IAAI,2BAA2B,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,IAAI,CAAC,GAAG,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,sBAAsB;QACzB,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { Logger } from \"core/Misc/logger\";\r\nimport { CameraInputsManager } from \"./cameraInputsManager\";\r\nimport type { FollowCamera } from \"./followCamera\";\r\nimport { FollowCameraKeyboardMoveInput } from \"./Inputs/followCameraKeyboardMoveInput\";\r\nimport { FollowCameraMouseWheelInput } from \"./Inputs/followCameraMouseWheelInput\";\r\nimport { FollowCameraPointersInput } from \"./Inputs/followCameraPointersInput\";\r\n\r\n/**\r\n * Default Inputs manager for the FollowCamera.\r\n * It groups all the default supported inputs for ease of use.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs\r\n */\r\nexport class FollowCameraInputsManager extends CameraInputsManager<FollowCamera> {\r\n /**\r\n * Instantiates a new FollowCameraInputsManager.\r\n * @param camera Defines the camera the inputs belong to\r\n */\r\n constructor(camera: FollowCamera) {\r\n super(camera);\r\n }\r\n\r\n /**\r\n * Add keyboard input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addKeyboard(): FollowCameraInputsManager {\r\n this.add(new FollowCameraKeyboardMoveInput());\r\n return this;\r\n }\r\n\r\n /**\r\n * Add mouse wheel input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addMouseWheel(): FollowCameraInputsManager {\r\n this.add(new FollowCameraMouseWheelInput());\r\n return this;\r\n }\r\n\r\n /**\r\n * Add pointers input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addPointers(): FollowCameraInputsManager {\r\n this.add(new FollowCameraPointersInput());\r\n return this;\r\n }\r\n\r\n /**\r\n * Add orientation input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n public addVRDeviceOrientation(): FollowCameraInputsManager {\r\n Logger.Warn(\"DeviceOrientation support not yet implemented for FollowCamera.\");\r\n return this;\r\n }\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { UniformBuffer } from "../Materials/uniformBuffer";
2
- import type { ThinEngine } from "../Engines/thinEngine";
2
+ import type { WebGPUEngine } from "../Engines/webgpuEngine";
3
3
  import type { Scene } from "../scene";
4
4
  import type { Nullable } from "../types";
5
5
  import type { ComputeEffect } from "./computeEffect";
@@ -9,6 +9,7 @@ import type { StorageBuffer } from "../Buffers/storageBuffer";
9
9
  import { TextureSampler } from "../Materials/Textures/textureSampler";
10
10
  import type { ExternalTexture } from "../Materials/Textures/externalTexture.js";
11
11
  import type { VideoTexture } from "../Materials/Textures/videoTexture.js";
12
+ import { WebGPUPerfCounter } from "../Engines/WebGPU/webgpuPerfCounter.js";
12
13
  /**
13
14
  * Defines the options associated with the creation of a compute shader.
14
15
  */
@@ -74,6 +75,11 @@ export declare class ComputeShader {
74
75
  * Callback triggered when an error occurs
75
76
  */
76
77
  onError: Nullable<(effect: ComputeEffect, errors: string) => void>;
78
+ /**
79
+ * Gets the GPU time spent running the compute shader for the last frame rendered (in nanoseconds).
80
+ * You have to enable the "timestamp-query" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.
81
+ */
82
+ readonly gpuTimeInFrame?: WebGPUPerfCounter;
77
83
  /**
78
84
  * Instantiates a new compute shader.
79
85
  * @param name Defines the name of the compute shader in the scene
@@ -85,7 +91,7 @@ export declare class ComputeShader {
85
91
  * * 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.
86
92
  * @param options Define the options used to create the shader
87
93
  */
88
- constructor(name: string, engine: ThinEngine, shaderPath: any, options?: Partial<IComputeShaderOptions>);
94
+ constructor(name: string, engine: WebGPUEngine, shaderPath: any, options?: Partial<IComputeShaderOptions>);
89
95
  /**
90
96
  * Gets the current class name of the material e.g. "ComputeShader"
91
97
  * Mainly use in serialization.
@@ -6,6 +6,7 @@ import { Texture } from "../Materials/Textures/texture.js";
6
6
  import { UniqueIdGenerator } from "../Misc/uniqueIdGenerator.js";
7
7
  import { Logger } from "../Misc/logger.js";
8
8
  import { TextureSampler } from "../Materials/Textures/textureSampler.js";
9
+ import { WebGPUPerfCounter } from "../Engines/WebGPU/webgpuPerfCounter.js";
9
10
  /**
10
11
  * The ComputeShader object lets you execute a compute shader on your GPU (if supported by the engine)
11
12
  */
@@ -53,6 +54,9 @@ export class ComputeShader {
53
54
  this.name = name;
54
55
  this._engine = engine;
55
56
  this.uniqueId = UniqueIdGenerator.UniqueId;
57
+ if (engine.enableGPUTimingMeasurements) {
58
+ this.gpuTimeInFrame = new WebGPUPerfCounter();
59
+ }
56
60
  if (!this._engine.getCaps().supportComputeShaders) {
57
61
  Logger.Error("This engine does not support compute shaders!");
58
62
  return;
@@ -271,7 +275,7 @@ export class ComputeShader {
271
275
  this._context.clear();
272
276
  }
273
277
  }
274
- this._engine.computeDispatch(this._effect, this._context, this._bindings, x, y, z, this._options.bindingsMapping);
278
+ this._engine.computeDispatch(this._effect, this._context, this._bindings, x, y, z, this._options.bindingsMapping, this.gpuTimeInFrame);
275
279
  return true;
276
280
  }
277
281
  /**
@@ -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 { ThinEngine } from \"../Engines/thinEngine\";\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\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 * 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\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);\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(() => new ComputeShader(source.name, scene.getEngine(), source.shaderPath, source.options), source, scene, rootUrl);\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 { 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\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: WebGPUEngine;\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: WebGPUEngine, 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.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"]}
@@ -11,6 +11,7 @@ import { Effect } from "../Materials/effect.js";
11
11
  import { CreateSphere } from "../Meshes/Builders/sphereBuilder.js";
12
12
  import { ExtrudeShapeCustom } from "../Meshes/Builders/shapeBuilder.js";
13
13
  import { TransformNode } from "../Meshes/transformNode.js";
14
+ import { Logger } from "../Misc/logger.js";
14
15
  /**
15
16
  * Class used to render a debug view of a given skeleton
16
17
  * @see http://www.babylonjs-playground.com/#1BZJVJ#8
@@ -680,7 +681,7 @@ export class SkeletonViewer {
680
681
  this.ready = true;
681
682
  }
682
683
  catch (err) {
683
- console.error(err);
684
+ Logger.Error(err);
684
685
  this._revert(animationState);
685
686
  this.dispose();
686
687
  }