@babylonjs/core 7.21.1 → 7.21.2

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 (133) hide show
  1. package/Buffers/buffer.nonFloatVertexBuffers.js +2 -1
  2. package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
  3. package/Collisions/gpuPicker.d.ts +0 -3
  4. package/Collisions/gpuPicker.js +113 -123
  5. package/Collisions/gpuPicker.js.map +1 -1
  6. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +0 -1
  7. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +0 -1
  8. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  9. package/Engines/abstractEngine.d.ts +2 -1
  10. package/Engines/abstractEngine.js +2 -2
  11. package/Engines/abstractEngine.js.map +1 -1
  12. package/Engines/thinEngine.d.ts +2 -1
  13. package/Engines/thinEngine.js +3 -2
  14. package/Engines/thinEngine.js.map +1 -1
  15. package/Engines/webgpuEngine.d.ts +2 -1
  16. package/Engines/webgpuEngine.js +3 -2
  17. package/Engines/webgpuEngine.js.map +1 -1
  18. package/Layers/effectLayer.d.ts +1 -1
  19. package/Layers/effectLayer.js +18 -16
  20. package/Layers/effectLayer.js.map +1 -1
  21. package/Layers/glowLayer.d.ts +1 -1
  22. package/Layers/glowLayer.js +3 -5
  23. package/Layers/glowLayer.js.map +1 -1
  24. package/Layers/highlightLayer.d.ts +1 -1
  25. package/Layers/highlightLayer.js +7 -9
  26. package/Layers/highlightLayer.js.map +1 -1
  27. package/Layers/layer.d.ts +0 -1
  28. package/Layers/layer.js +15 -17
  29. package/Layers/layer.js.map +1 -1
  30. package/Materials/Background/backgroundMaterial.d.ts +0 -1
  31. package/Materials/Background/backgroundMaterial.js +20 -20
  32. package/Materials/Background/backgroundMaterial.js.map +1 -1
  33. package/Materials/PBR/pbrBaseMaterial.d.ts +0 -1
  34. package/Materials/PBR/pbrBaseMaterial.js +34 -39
  35. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  36. package/Materials/effect.d.ts +7 -2
  37. package/Materials/effect.js +7 -3
  38. package/Materials/effect.js.map +1 -1
  39. package/Materials/shaderMaterial.d.ts +4 -0
  40. package/Materials/shaderMaterial.js +1 -0
  41. package/Materials/shaderMaterial.js.map +1 -1
  42. package/Materials/standardMaterial.d.ts +0 -1
  43. package/Materials/standardMaterial.js +20 -20
  44. package/Materials/standardMaterial.js.map +1 -1
  45. package/Meshes/linesMesh.d.ts +0 -2
  46. package/Meshes/linesMesh.js +16 -20
  47. package/Meshes/linesMesh.js.map +1 -1
  48. package/Particles/particleSystemComponent.d.ts +0 -1
  49. package/Particles/particleSystemComponent.js +8 -2
  50. package/Particles/particleSystemComponent.js.map +1 -1
  51. package/Particles/thinParticleSystem.js.map +1 -1
  52. package/PostProcesses/anaglyphPostProcess.d.ts +1 -2
  53. package/PostProcesses/anaglyphPostProcess.js +4 -5
  54. package/PostProcesses/anaglyphPostProcess.js.map +1 -1
  55. package/PostProcesses/blackAndWhitePostProcess.d.ts +1 -1
  56. package/PostProcesses/blackAndWhitePostProcess.js +4 -4
  57. package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
  58. package/PostProcesses/bloomMergePostProcess.d.ts +1 -1
  59. package/PostProcesses/bloomMergePostProcess.js +4 -4
  60. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  61. package/PostProcesses/blurPostProcess.d.ts +1 -3
  62. package/PostProcesses/blurPostProcess.js +4 -6
  63. package/PostProcesses/blurPostProcess.js.map +1 -1
  64. package/PostProcesses/chromaticAberrationPostProcess.d.ts +1 -1
  65. package/PostProcesses/chromaticAberrationPostProcess.js +4 -4
  66. package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
  67. package/PostProcesses/circleOfConfusionPostProcess.d.ts +1 -1
  68. package/PostProcesses/circleOfConfusionPostProcess.js +4 -4
  69. package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
  70. package/PostProcesses/colorCorrectionPostProcess.d.ts +1 -1
  71. package/PostProcesses/colorCorrectionPostProcess.js +4 -4
  72. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  73. package/PostProcesses/convolutionPostProcess.d.ts +1 -1
  74. package/PostProcesses/convolutionPostProcess.js +4 -4
  75. package/PostProcesses/convolutionPostProcess.js.map +1 -1
  76. package/PostProcesses/depthOfFieldMergePostProcess.d.ts +1 -1
  77. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -4
  78. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  79. package/PostProcesses/displayPassPostProcess.d.ts +1 -1
  80. package/PostProcesses/displayPassPostProcess.js +10 -1
  81. package/PostProcesses/displayPassPostProcess.js.map +1 -1
  82. package/PostProcesses/extractHighlightsPostProcess.d.ts +1 -1
  83. package/PostProcesses/extractHighlightsPostProcess.js +4 -4
  84. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  85. package/PostProcesses/filterPostProcess.d.ts +1 -1
  86. package/PostProcesses/filterPostProcess.js +10 -1
  87. package/PostProcesses/filterPostProcess.js.map +1 -1
  88. package/PostProcesses/fxaaPostProcess.d.ts +1 -1
  89. package/PostProcesses/fxaaPostProcess.js +4 -4
  90. package/PostProcesses/fxaaPostProcess.js.map +1 -1
  91. package/PostProcesses/grainPostProcess.d.ts +1 -2
  92. package/PostProcesses/grainPostProcess.js +4 -5
  93. package/PostProcesses/grainPostProcess.js.map +1 -1
  94. package/PostProcesses/highlightsPostProcess.d.ts +1 -1
  95. package/PostProcesses/highlightsPostProcess.js +10 -1
  96. package/PostProcesses/highlightsPostProcess.js.map +1 -1
  97. package/PostProcesses/imageProcessingPostProcess.d.ts +1 -1
  98. package/PostProcesses/imageProcessingPostProcess.js +4 -4
  99. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  100. package/PostProcesses/index.d.ts +8 -0
  101. package/PostProcesses/index.js +12 -0
  102. package/PostProcesses/index.js.map +1 -1
  103. package/PostProcesses/motionBlurPostProcess.d.ts +1 -1
  104. package/PostProcesses/motionBlurPostProcess.js +4 -4
  105. package/PostProcesses/motionBlurPostProcess.js.map +1 -1
  106. package/PostProcesses/passPostProcess.d.ts +2 -2
  107. package/PostProcesses/passPostProcess.js +8 -8
  108. package/PostProcesses/passPostProcess.js.map +1 -1
  109. package/PostProcesses/postProcess.d.ts +5 -4
  110. package/PostProcesses/postProcess.js +14 -27
  111. package/PostProcesses/postProcess.js.map +1 -1
  112. package/PostProcesses/sharpenPostProcess.d.ts +1 -1
  113. package/PostProcesses/sharpenPostProcess.js +4 -4
  114. package/PostProcesses/sharpenPostProcess.js.map +1 -1
  115. package/PostProcesses/tonemapPostProcess.d.ts +1 -1
  116. package/PostProcesses/tonemapPostProcess.js +10 -1
  117. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  118. package/PostProcesses/vrDistortionCorrectionPostProcess.d.ts +1 -1
  119. package/PostProcesses/vrDistortionCorrectionPostProcess.js +4 -4
  120. package/PostProcesses/vrDistortionCorrectionPostProcess.js.map +1 -1
  121. package/ShadersWGSL/displayPass.fragment.d.ts +5 -0
  122. package/ShadersWGSL/displayPass.fragment.js +12 -0
  123. package/ShadersWGSL/displayPass.fragment.js.map +1 -0
  124. package/ShadersWGSL/filter.fragment.d.ts +5 -0
  125. package/ShadersWGSL/filter.fragment.js +12 -0
  126. package/ShadersWGSL/filter.fragment.js.map +1 -0
  127. package/ShadersWGSL/highlights.fragment.d.ts +5 -0
  128. package/ShadersWGSL/highlights.fragment.js +12 -0
  129. package/ShadersWGSL/highlights.fragment.js.map +1 -0
  130. package/ShadersWGSL/tonemap.fragment.d.ts +5 -0
  131. package/ShadersWGSL/tonemap.fragment.js +29 -0
  132. package/ShadersWGSL/tonemap.fragment.js.map +1 -0
  133. package/package.json +1 -1
@@ -72,9 +72,10 @@ export function checkNonFloatVertexBuffers(vertexBuffers, effect) {
72
72
  }
73
73
  if (shaderProcessingContext) {
74
74
  // We temporarily disable parallel compilation of shaders because we want new shaders to be compiled after the _processShaderCode call, so that they are in effect for the rest of the frame.
75
+ // There is no additional call to async so the _processShaderCodeAsync will execute synchronously.
75
76
  const parallelShaderCompile = engine._caps.parallelShaderCompile;
76
77
  engine._caps.parallelShaderCompile = undefined;
77
- effect._processShaderCode(null, engine._features._checkNonFloatVertexBuffersDontRecreatePipelineContext, shaderProcessingContext);
78
+ effect._processShaderCodeAsync(null, engine._features._checkNonFloatVertexBuffersDontRecreatePipelineContext, shaderProcessingContext);
78
79
  engine._caps.parallelShaderCompile = parallelShaderCompile;
79
80
  }
80
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"buffer.nonFloatVertexBuffers.js","sourceRoot":"","sources":["../../../../dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { ShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { VertexBuffer } from \"../Meshes/buffer\";\r\n\r\nconst vertexBufferKindForNonFloatProcessing: { [kind: string]: boolean } = {\r\n [VertexBuffer.PositionKind]: true,\r\n [VertexBuffer.NormalKind]: true,\r\n [VertexBuffer.TangentKind]: true,\r\n [VertexBuffer.UVKind]: true,\r\n [VertexBuffer.UV2Kind]: true,\r\n [VertexBuffer.UV3Kind]: true,\r\n [VertexBuffer.UV4Kind]: true,\r\n [VertexBuffer.UV5Kind]: true,\r\n [VertexBuffer.UV6Kind]: true,\r\n [VertexBuffer.ColorKind]: true,\r\n [VertexBuffer.ColorInstanceKind]: true,\r\n [VertexBuffer.MatricesIndicesKind]: true,\r\n [VertexBuffer.MatricesWeightsKind]: true,\r\n [VertexBuffer.MatricesIndicesExtraKind]: true,\r\n [VertexBuffer.MatricesWeightsExtraKind]: true,\r\n};\r\n\r\n/**\r\n * Indicates if the type is a signed or unsigned type\r\n * @param type Type to check\r\n * @returns True if it is a signed type\r\n */\r\nfunction isSignedType(type: number): boolean {\r\n switch (type) {\r\n case VertexBuffer.BYTE:\r\n case VertexBuffer.SHORT:\r\n case VertexBuffer.INT:\r\n case VertexBuffer.FLOAT:\r\n return true;\r\n case VertexBuffer.UNSIGNED_BYTE:\r\n case VertexBuffer.UNSIGNED_SHORT:\r\n case VertexBuffer.UNSIGNED_INT:\r\n return false;\r\n default:\r\n throw new Error(`Invalid type '${type}'`);\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether some vertex buffers that should be of type float are of a different type (int, byte...).\r\n * If so, trigger a shader recompilation to give the shader processor the opportunity to update the code accordingly.\r\n * @param vertexBuffers List of vertex buffers to check\r\n * @param effect The effect (shaders) that should be recompiled if needed\r\n */\r\nexport function checkNonFloatVertexBuffers(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, effect: Effect): void {\r\n const engine = effect.getEngine();\r\n const pipelineContext = effect._pipelineContext;\r\n\r\n if (!pipelineContext?.vertexBufferKindToType) {\r\n return;\r\n }\r\n\r\n let shaderProcessingContext: Nullable<ShaderProcessingContext> = null;\r\n\r\n for (const kind in vertexBuffers) {\r\n const currentVertexBuffer = vertexBuffers[kind];\r\n\r\n if (!currentVertexBuffer || !vertexBufferKindForNonFloatProcessing[kind]) {\r\n continue;\r\n }\r\n\r\n const currentVertexBufferType = currentVertexBuffer.normalized ? VertexBuffer.FLOAT : currentVertexBuffer.type;\r\n const vertexBufferType = pipelineContext.vertexBufferKindToType[kind];\r\n\r\n if (\r\n (currentVertexBufferType !== VertexBuffer.FLOAT && vertexBufferType === undefined) ||\r\n (vertexBufferType !== undefined && vertexBufferType !== currentVertexBufferType)\r\n ) {\r\n if (!shaderProcessingContext) {\r\n shaderProcessingContext = engine._getShaderProcessingContext(effect.shaderLanguage, false)!;\r\n }\r\n pipelineContext.vertexBufferKindToType[kind] = currentVertexBufferType;\r\n if (currentVertexBufferType !== VertexBuffer.FLOAT) {\r\n shaderProcessingContext.vertexBufferKindToNumberOfComponents![kind] = VertexBuffer.DeduceStride(kind);\r\n if (isSignedType(currentVertexBufferType)) {\r\n shaderProcessingContext.vertexBufferKindToNumberOfComponents![kind] *= -1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (shaderProcessingContext) {\r\n // We temporarily disable parallel compilation of shaders because we want new shaders to be compiled after the _processShaderCode call, so that they are in effect for the rest of the frame.\r\n const parallelShaderCompile = engine._caps.parallelShaderCompile;\r\n engine._caps.parallelShaderCompile = undefined;\r\n\r\n effect._processShaderCode(null, engine._features._checkNonFloatVertexBuffersDontRecreatePipelineContext, shaderProcessingContext);\r\n\r\n engine._caps.parallelShaderCompile = parallelShaderCompile;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"buffer.nonFloatVertexBuffers.js","sourceRoot":"","sources":["../../../../dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { ShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { VertexBuffer } from \"../Meshes/buffer\";\r\n\r\nconst vertexBufferKindForNonFloatProcessing: { [kind: string]: boolean } = {\r\n [VertexBuffer.PositionKind]: true,\r\n [VertexBuffer.NormalKind]: true,\r\n [VertexBuffer.TangentKind]: true,\r\n [VertexBuffer.UVKind]: true,\r\n [VertexBuffer.UV2Kind]: true,\r\n [VertexBuffer.UV3Kind]: true,\r\n [VertexBuffer.UV4Kind]: true,\r\n [VertexBuffer.UV5Kind]: true,\r\n [VertexBuffer.UV6Kind]: true,\r\n [VertexBuffer.ColorKind]: true,\r\n [VertexBuffer.ColorInstanceKind]: true,\r\n [VertexBuffer.MatricesIndicesKind]: true,\r\n [VertexBuffer.MatricesWeightsKind]: true,\r\n [VertexBuffer.MatricesIndicesExtraKind]: true,\r\n [VertexBuffer.MatricesWeightsExtraKind]: true,\r\n};\r\n\r\n/**\r\n * Indicates if the type is a signed or unsigned type\r\n * @param type Type to check\r\n * @returns True if it is a signed type\r\n */\r\nfunction isSignedType(type: number): boolean {\r\n switch (type) {\r\n case VertexBuffer.BYTE:\r\n case VertexBuffer.SHORT:\r\n case VertexBuffer.INT:\r\n case VertexBuffer.FLOAT:\r\n return true;\r\n case VertexBuffer.UNSIGNED_BYTE:\r\n case VertexBuffer.UNSIGNED_SHORT:\r\n case VertexBuffer.UNSIGNED_INT:\r\n return false;\r\n default:\r\n throw new Error(`Invalid type '${type}'`);\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether some vertex buffers that should be of type float are of a different type (int, byte...).\r\n * If so, trigger a shader recompilation to give the shader processor the opportunity to update the code accordingly.\r\n * @param vertexBuffers List of vertex buffers to check\r\n * @param effect The effect (shaders) that should be recompiled if needed\r\n */\r\nexport function checkNonFloatVertexBuffers(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, effect: Effect): void {\r\n const engine = effect.getEngine();\r\n const pipelineContext = effect._pipelineContext;\r\n\r\n if (!pipelineContext?.vertexBufferKindToType) {\r\n return;\r\n }\r\n\r\n let shaderProcessingContext: Nullable<ShaderProcessingContext> = null;\r\n\r\n for (const kind in vertexBuffers) {\r\n const currentVertexBuffer = vertexBuffers[kind];\r\n\r\n if (!currentVertexBuffer || !vertexBufferKindForNonFloatProcessing[kind]) {\r\n continue;\r\n }\r\n\r\n const currentVertexBufferType = currentVertexBuffer.normalized ? VertexBuffer.FLOAT : currentVertexBuffer.type;\r\n const vertexBufferType = pipelineContext.vertexBufferKindToType[kind];\r\n\r\n if (\r\n (currentVertexBufferType !== VertexBuffer.FLOAT && vertexBufferType === undefined) ||\r\n (vertexBufferType !== undefined && vertexBufferType !== currentVertexBufferType)\r\n ) {\r\n if (!shaderProcessingContext) {\r\n shaderProcessingContext = engine._getShaderProcessingContext(effect.shaderLanguage, false)!;\r\n }\r\n pipelineContext.vertexBufferKindToType[kind] = currentVertexBufferType;\r\n if (currentVertexBufferType !== VertexBuffer.FLOAT) {\r\n shaderProcessingContext.vertexBufferKindToNumberOfComponents![kind] = VertexBuffer.DeduceStride(kind);\r\n if (isSignedType(currentVertexBufferType)) {\r\n shaderProcessingContext.vertexBufferKindToNumberOfComponents![kind] *= -1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (shaderProcessingContext) {\r\n // We temporarily disable parallel compilation of shaders because we want new shaders to be compiled after the _processShaderCode call, so that they are in effect for the rest of the frame.\r\n // There is no additional call to async so the _processShaderCodeAsync will execute synchronously.\r\n const parallelShaderCompile = engine._caps.parallelShaderCompile;\r\n engine._caps.parallelShaderCompile = undefined;\r\n\r\n effect._processShaderCodeAsync(null, engine._features._checkNonFloatVertexBuffersDontRecreatePipelineContext, shaderProcessingContext);\r\n\r\n engine._caps.parallelShaderCompile = parallelShaderCompile;\r\n }\r\n}\r\n"]}
@@ -37,9 +37,6 @@ export declare class GPUPicker {
37
37
  * Gets the shader language used in this generator.
38
38
  */
39
39
  get shaderLanguage(): ShaderLanguage;
40
- private _shadersLoaded;
41
- private _onMaterialReady;
42
- private _initShaderSourceAsync;
43
40
  private _createRenderTarget;
44
41
  private _createColorMaterialAsync;
45
42
  private _materialBindCallback;
@@ -3,7 +3,6 @@ import { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture.j
3
3
  import { ShaderMaterial } from "../Materials/shaderMaterial.js";
4
4
  import { Color3, Color4 } from "../Maths/math.color.js";
5
5
  import { VertexBuffer } from "../Meshes/buffer.js";
6
- import { Observable } from "../Misc/observable.js";
7
6
  /**
8
7
  * Class used to perform a picking operation using GPU
9
8
  * Please note that GPUPIcker cannot pick instances, only meshes
@@ -19,8 +18,6 @@ export class GPUPicker {
19
18
  this._attributeName = "instanceMeshID";
20
19
  /** Shader language used by the generator */
21
20
  this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
22
- this._shadersLoaded = false;
23
- this._onMaterialReady = new Observable(undefined, true);
24
21
  }
25
22
  /**
26
23
  * Gets the shader language used in this generator.
@@ -28,17 +25,6 @@ export class GPUPicker {
28
25
  get shaderLanguage() {
29
26
  return this._shaderLanguage;
30
27
  }
31
- async _initShaderSourceAsync(scene) {
32
- const engine = scene.getEngine();
33
- if (engine.isWebGPU) {
34
- this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
35
- await Promise.all([import("../ShadersWGSL/picking.fragment.js"), import("../ShadersWGSL/picking.vertex.js")]);
36
- }
37
- else {
38
- await Promise.all([import("../Shaders/picking.fragment.js"), import("../Shaders/picking.vertex.js")]);
39
- }
40
- this._shadersLoaded = true;
41
- }
42
28
  _createRenderTarget(scene, width, height) {
43
29
  if (this._pickingTexture) {
44
30
  this._pickingTexture.dispose();
@@ -50,8 +36,9 @@ export class GPUPicker {
50
36
  this._defaultRenderMaterial.dispose();
51
37
  }
52
38
  this._defaultRenderMaterial = null;
53
- if (!this._shadersLoaded) {
54
- await this._initShaderSourceAsync(scene);
39
+ const engine = scene.getEngine();
40
+ if (engine.isWebGPU) {
41
+ this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
55
42
  }
56
43
  const defines = [];
57
44
  const options = {
@@ -60,10 +47,18 @@ export class GPUPicker {
60
47
  needAlphaBlending: false,
61
48
  defines: defines,
62
49
  useClipPlane: null,
50
+ shaderLanguage: this._shaderLanguage,
51
+ extraInitializationsAsync: async () => {
52
+ if (this.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
53
+ await Promise.all([import("../ShadersWGSL/picking.fragment.js"), import("../ShadersWGSL/picking.vertex.js")]);
54
+ }
55
+ else {
56
+ await Promise.all([import("../Shaders/picking.fragment.js"), import("../Shaders/picking.vertex.js")]);
57
+ }
58
+ },
63
59
  };
64
60
  this._defaultRenderMaterial = new ShaderMaterial("pickingShader", scene, "picking", options, false);
65
61
  this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
66
- this._onMaterialReady.notifyObservers(this._defaultRenderMaterial);
67
62
  }
68
63
  _materialBindCallback(mesh) {
69
64
  if (!mesh) {
@@ -166,61 +161,59 @@ export class GPUPicker {
166
161
  this._createColorMaterialAsync(scene);
167
162
  }
168
163
  this._cachedScene = scene;
169
- this._onMaterialReady.addOnce(() => {
170
- for (let i = 0; i < list.length; i++) {
171
- const item = list[i];
172
- if ("mesh" in item) {
173
- this._meshMaterialMap.set(item.mesh, item.material);
174
- list[i] = item.mesh;
175
- }
176
- else {
177
- this._meshMaterialMap.set(item, this._defaultRenderMaterial);
178
- }
164
+ for (let i = 0; i < list.length; i++) {
165
+ const item = list[i];
166
+ if ("mesh" in item) {
167
+ this._meshMaterialMap.set(item.mesh, item.material);
168
+ list[i] = item.mesh;
179
169
  }
180
- this._pickingTexture.renderList = [];
181
- // We will affect colors and create vertex color buffers
182
- let id = 1;
183
- for (let index = 0; index < this._pickableMeshes.length; index++) {
184
- const mesh = this._pickableMeshes[index];
185
- const material = this._meshMaterialMap.get(mesh);
186
- if (material !== this._defaultRenderMaterial) {
187
- material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
188
- }
189
- this._pickingTexture.setMaterialForRendering(mesh, material);
190
- this._pickingTexture.renderList.push(mesh);
191
- if (mesh.isAnInstance) {
192
- continue; // This will be handled by the source mesh
193
- }
194
- const r = (id & 0xff0000) >> 16;
195
- const g = (id & 0x00ff00) >> 8;
196
- const b = (id & 0x0000ff) >> 0;
197
- if (mesh.hasThinInstances) {
198
- const colorData = this._generateThinInstanceColorData(mesh.thinInstanceCount, id, (i, id) => {
199
- this._thinIdMap[id] = { meshId: index, thinId: i };
170
+ else {
171
+ this._meshMaterialMap.set(item, this._defaultRenderMaterial);
172
+ }
173
+ }
174
+ this._pickingTexture.renderList = [];
175
+ // We will affect colors and create vertex color buffers
176
+ let id = 1;
177
+ for (let index = 0; index < this._pickableMeshes.length; index++) {
178
+ const mesh = this._pickableMeshes[index];
179
+ const material = this._meshMaterialMap.get(mesh);
180
+ if (material !== this._defaultRenderMaterial) {
181
+ material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
182
+ }
183
+ this._pickingTexture.setMaterialForRendering(mesh, material);
184
+ this._pickingTexture.renderList.push(mesh);
185
+ if (mesh.isAnInstance) {
186
+ continue; // This will be handled by the source mesh
187
+ }
188
+ const r = (id & 0xff0000) >> 16;
189
+ const g = (id & 0x00ff00) >> 8;
190
+ const b = (id & 0x0000ff) >> 0;
191
+ if (mesh.hasThinInstances) {
192
+ const colorData = this._generateThinInstanceColorData(mesh.thinInstanceCount, id, (i, id) => {
193
+ this._thinIdMap[id] = { meshId: index, thinId: i };
194
+ });
195
+ id += mesh.thinInstanceCount;
196
+ mesh.thinInstanceSetBuffer(this._attributeName, colorData, 4);
197
+ }
198
+ else {
199
+ this._idMap[id] = index;
200
+ id++;
201
+ if (mesh.hasInstances) {
202
+ const instances = mesh.instances;
203
+ const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {
204
+ const instance = instances[i];
205
+ this._idMap[id] = this._pickableMeshes.indexOf(instance);
200
206
  });
201
- id += mesh.thinInstanceCount;
202
- mesh.thinInstanceSetBuffer(this._attributeName, colorData, 4);
207
+ id += instances.length;
208
+ const engine = mesh.getEngine();
209
+ const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);
210
+ mesh.setVerticesBuffer(buffer, true);
203
211
  }
204
212
  else {
205
- this._idMap[id] = index;
206
- id++;
207
- if (mesh.hasInstances) {
208
- const instances = mesh.instances;
209
- const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {
210
- const instance = instances[i];
211
- this._idMap[id] = this._pickableMeshes.indexOf(instance);
212
- });
213
- id += instances.length;
214
- const engine = mesh.getEngine();
215
- const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);
216
- mesh.setVerticesBuffer(buffer, true);
217
- }
218
- else {
219
- this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);
220
- }
213
+ this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);
221
214
  }
222
215
  }
223
- });
216
+ }
224
217
  }
225
218
  /**
226
219
  * Execute a picking operation
@@ -257,71 +250,69 @@ export class GPUPicker {
257
250
  engine.enableScissor(x, y, 1, 1);
258
251
  }
259
252
  };
253
+ scene.customRenderTargets.push(this._pickingTexture);
254
+ // Do we need to rebuild the RTT?
255
+ const size = this._pickingTexture.getSize();
256
+ if (size.width !== rttSizeW || size.height !== rttSizeH) {
257
+ this._createRenderTarget(scene, rttSizeW, rttSizeH);
258
+ this._pickingTexture.renderList = [];
259
+ for (let index = 0; index < this._pickableMeshes.length; index++) {
260
+ const mesh = this._pickableMeshes[index];
261
+ this._pickingTexture.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));
262
+ this._pickingTexture.renderList.push(mesh);
263
+ }
264
+ }
260
265
  return new Promise((resolve, reject) => {
261
- this._onMaterialReady.addOnce(() => {
262
- scene.customRenderTargets.push(this._pickingTexture);
263
- // Do we need to rebuild the RTT?
264
- const size = this._pickingTexture.getSize();
265
- if (size.width !== rttSizeW || size.height !== rttSizeH) {
266
- this._createRenderTarget(scene, rttSizeW, rttSizeH);
267
- this._pickingTexture.renderList = [];
268
- for (let index = 0; index < this._pickableMeshes.length; index++) {
269
- const mesh = this._pickableMeshes[index];
270
- this._pickingTexture.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));
271
- this._pickingTexture.renderList.push(mesh);
272
- }
266
+ this._pickingTexture.onAfterRender = async () => {
267
+ // Disable scissor
268
+ if (engine.disableScissor) {
269
+ engine.disableScissor();
273
270
  }
274
- this._pickingTexture.onAfterRender = async () => {
275
- // Disable scissor
276
- if (engine.disableScissor) {
277
- engine.disableScissor();
278
- }
279
- if (!this._pickingTexture) {
280
- reject();
271
+ if (!this._pickingTexture) {
272
+ reject();
273
+ }
274
+ let pickedMesh = null;
275
+ let thinInstanceIndex = undefined;
276
+ const wasSuccessfull = this._meshRenderingCount > 0;
277
+ if (wasSuccessfull) {
278
+ // Remove from the active RTTs
279
+ const index = scene.customRenderTargets.indexOf(this._pickingTexture);
280
+ if (index > -1) {
281
+ scene.customRenderTargets.splice(index, 1);
281
282
  }
282
- let pickedMesh = null;
283
- let thinInstanceIndex = undefined;
284
- const wasSuccessfull = this._meshRenderingCount > 0;
285
- if (wasSuccessfull) {
286
- // Remove from the active RTTs
287
- const index = scene.customRenderTargets.indexOf(this._pickingTexture);
288
- if (index > -1) {
289
- scene.customRenderTargets.splice(index, 1);
283
+ // Do the actual picking
284
+ if (await this._readTexturePixelsAsync(x, y)) {
285
+ const r = this._readbuffer[0];
286
+ const g = this._readbuffer[1];
287
+ const b = this._readbuffer[2];
288
+ const colorId = (r << 16) + (g << 8) + b;
289
+ // Thin?
290
+ if (this._thinIdMap[colorId]) {
291
+ pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];
292
+ thinInstanceIndex = this._thinIdMap[colorId].thinId;
290
293
  }
291
- // Do the actual picking
292
- if (await this._readTexturePixelsAsync(x, y)) {
293
- const r = this._readbuffer[0];
294
- const g = this._readbuffer[1];
295
- const b = this._readbuffer[2];
296
- const colorId = (r << 16) + (g << 8) + b;
297
- // Thin?
298
- if (this._thinIdMap[colorId]) {
299
- pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];
300
- thinInstanceIndex = this._thinIdMap[colorId].thinId;
301
- }
302
- else {
303
- pickedMesh = this._pickableMeshes[this._idMap[colorId]];
304
- }
294
+ else {
295
+ pickedMesh = this._pickableMeshes[this._idMap[colorId]];
305
296
  }
306
297
  }
307
- // Clean-up
308
- if (!wasSuccessfull) {
309
- this._meshRenderingCount = 0;
310
- return; // We need to wait for the shaders to be ready
298
+ }
299
+ // Clean-up
300
+ if (!wasSuccessfull) {
301
+ this._meshRenderingCount = 0;
302
+ return; // We need to wait for the shaders to be ready
303
+ }
304
+ else {
305
+ if (disposeWhenDone) {
306
+ this.dispose();
307
+ }
308
+ if (pickedMesh) {
309
+ resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });
311
310
  }
312
311
  else {
313
- if (disposeWhenDone) {
314
- this.dispose();
315
- }
316
- if (pickedMesh) {
317
- resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });
318
- }
319
- else {
320
- resolve(null);
321
- }
312
+ resolve(null);
322
313
  }
323
- };
324
- });
314
+ }
315
+ };
325
316
  });
326
317
  }
327
318
  async _readTexturePixelsAsync(x, y) {
@@ -334,7 +325,6 @@ export class GPUPicker {
334
325
  }
335
326
  /** Release the resources */
336
327
  dispose() {
337
- this._onMaterialReady.clear();
338
328
  this.setPickingList(null);
339
329
  this._cachedScene = null;
340
330
  // Cleaning up
@@ -1 +1 @@
1
- {"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Class used to store the result of a GPU picking operation\r\n */\r\nexport interface IGPUPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n mesh: AbstractMesh;\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndex?: number;\r\n}\r\n\r\n/**\r\n * Class used to perform a picking operation using GPU\r\n * Please note that GPUPIcker cannot pick instances, only meshes\r\n */\r\nexport class GPUPicker {\r\n private _pickingTexture: Nullable<RenderTargetTexture> = null;\r\n private _idMap: Array<number> = [];\r\n private _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private _idColors: Array<Color3> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _defaultRenderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _meshMaterialMap: Map<AbstractMesh, ShaderMaterial> = new Map();\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private readonly _attributeName = \"instanceMeshID\";\r\n\r\n /** Shader language used by the generator */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this generator.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _shadersLoaded = false;\r\n private _onMaterialReady = new Observable<Material>(undefined, true);\r\n\r\n private async _initShaderSourceAsync(scene: Scene) {\r\n const engine = scene.getEngine();\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([import(\"../ShadersWGSL/picking.fragment\"), import(\"../ShadersWGSL/picking.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/picking.fragment\"), import(\"../Shaders/picking.vertex\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\r\n }\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n if (this._pickingTexture) {\r\n this._pickingTexture.dispose();\r\n }\r\n this._pickingTexture = new RenderTargetTexture(\r\n \"pickingTexure\",\r\n { width: width, height: height },\r\n scene,\r\n false,\r\n undefined,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Constants.TEXTURE_NEAREST_NEAREST\r\n );\r\n }\r\n\r\n private async _createColorMaterialAsync(scene: Scene) {\r\n if (this._defaultRenderMaterial) {\r\n this._defaultRenderMaterial.dispose();\r\n }\r\n\r\n this._defaultRenderMaterial = null;\r\n\r\n if (!this._shadersLoaded) {\r\n await this._initShaderSourceAsync(scene);\r\n }\r\n\r\n const defines: string[] = [];\r\n const options = {\r\n attributes: [VertexBuffer.PositionKind, this._attributeName, \"bakedVertexAnimationSettingsInstanced\"],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n };\r\n\r\n this._defaultRenderMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n\r\n this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n\r\n this._onMaterialReady.notifyObservers(this._defaultRenderMaterial);\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n const effect = material.getEffect()!;\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {\r\n effect.setColor4(\"meshID\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n private _generateColorData(instanceCount: number, id: number, index: number, r: number, g: number, b: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * (instanceCount + 1));\r\n\r\n colorData[0] = r / 255.0;\r\n colorData[1] = g / 255.0;\r\n colorData[2] = b / 255.0;\r\n colorData[3] = 1.0;\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[(i + 1) * 4] = r / 255.0;\r\n colorData[(i + 1) * 4 + 1] = g / 255.0;\r\n colorData[(i + 1) * 4 + 2] = b / 255.0;\r\n colorData[(i + 1) * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n private _generateThinInstanceColorData(instanceCount: number, id: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * instanceCount);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[i * 4] = r / 255.0;\r\n colorData[i * 4 + 1] = g / 255.0;\r\n colorData[i * 4 + 2] = b / 255.0;\r\n colorData[i * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * Set that value to null to clear the list (and avoid leaks)\r\n * The module will read and delete from the array provided by reference. Disposing the module or setting the value to null will clear the array.\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>>) {\r\n if (this._pickableMeshes) {\r\n // Cleanup\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(this._attributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, null);\r\n }\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.removeCallback(this._materialBindCallback);\r\n }\r\n }\r\n this._pickableMeshes.length = 0;\r\n this._meshMaterialMap.clear();\r\n this._idMap.length = 0;\r\n this._thinIdMap.length = 0;\r\n this._idColors.length = 0;\r\n if (this._pickingTexture) {\r\n this._pickingTexture.renderList = [];\r\n }\r\n }\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n this._pickableMeshes = list as Array<AbstractMesh>;\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n if (!this._pickingTexture) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexture.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n }\r\n }\r\n\r\n if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._createColorMaterialAsync(scene);\r\n }\r\n\r\n this._cachedScene = scene;\r\n\r\n this._onMaterialReady.addOnce(() => {\r\n for (let i = 0; i < list.length; i++) {\r\n const item = list[i];\r\n if (\"mesh\" in item) {\r\n this._meshMaterialMap.set(item.mesh, item.material);\r\n list[i] = item.mesh;\r\n } else {\r\n this._meshMaterialMap.set(item, this._defaultRenderMaterial!);\r\n }\r\n }\r\n\r\n this._pickingTexture!.renderList = [];\r\n\r\n // We will affect colors and create vertex color buffers\r\n let id = 1;\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, material);\r\n this._pickingTexture!.renderList.push(mesh);\r\n\r\n if (mesh.isAnInstance) {\r\n continue; // This will be handled by the source mesh\r\n }\r\n\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n\r\n if (mesh.hasThinInstances) {\r\n const colorData = this._generateThinInstanceColorData((mesh as Mesh).thinInstanceCount, id, (i, id) => {\r\n this._thinIdMap[id] = { meshId: index, thinId: i };\r\n });\r\n id += (mesh as Mesh).thinInstanceCount;\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, colorData, 4);\r\n } else {\r\n this._idMap[id] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\r\n id += instances.length;\r\n const engine = mesh.getEngine();\r\n\r\n const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Execute a picking operation\r\n * @param x defines the X coordinates where to run the pick\r\n * @param y defines the Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results\r\n */\r\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const scene = this._cachedScene!;\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n this._meshRenderingCount = 0;\r\n\r\n // Ensure ints and adapt to screen resolution\r\n x = (devicePixelRatio * x) >> 0;\r\n y = (devicePixelRatio * y) >> 0;\r\n\r\n if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (!this._readbuffer) {\r\n this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU\r\n }\r\n\r\n // Invert Y\r\n y = rttSizeH - y;\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTexture!.onBeforeRender = () => {\r\n // Enable scissor\r\n if ((engine as WebGPUEngine | Engine).enableScissor) {\r\n (engine as WebGPUEngine | Engine).enableScissor(x, y, 1, 1);\r\n }\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n this._onMaterialReady.addOnce(() => {\r\n scene.customRenderTargets.push(this._pickingTexture!);\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n\r\n this._pickingTexture!.renderList = [];\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh)!);\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n this._pickingTexture!.onAfterRender = async () => {\r\n // Disable scissor\r\n if ((engine as WebGPUEngine | Engine).disableScissor) {\r\n (engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n\r\n if (!this._pickingTexture) {\r\n reject();\r\n }\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const r = this._readbuffer[0];\r\n const g = this._readbuffer[1];\r\n const b = this._readbuffer[2];\r\n const colorId = (r << 16) + (g << 8) + b;\r\n\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n }\r\n\r\n // Clean-up\r\n if (!wasSuccessfull) {\r\n this._meshRenderingCount = 0;\r\n return; // We need to wait for the shaders to be ready\r\n } else {\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n if (pickedMesh) {\r\n resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n };\r\n });\r\n });\r\n }\r\n\r\n private async _readTexturePixelsAsync(x: number, y: number) {\r\n if (!this._cachedScene || !this._pickingTexture?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexture._texture, 1, 1, -1, 0, this._readbuffer, true, true, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /** Release the resources */\r\n public dispose() {\r\n this._onMaterialReady.clear();\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexture?.dispose();\r\n this._pickingTexture = null;\r\n this._defaultRenderMaterial?.dispose();\r\n this._defaultRenderMaterial = null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { IShaderMaterialOptions } from \"core/Materials/shaderMaterial\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Class used to store the result of a GPU picking operation\r\n */\r\nexport interface IGPUPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n mesh: AbstractMesh;\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndex?: number;\r\n}\r\n\r\n/**\r\n * Class used to perform a picking operation using GPU\r\n * Please note that GPUPIcker cannot pick instances, only meshes\r\n */\r\nexport class GPUPicker {\r\n private _pickingTexture: Nullable<RenderTargetTexture> = null;\r\n private _idMap: Array<number> = [];\r\n private _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private _idColors: Array<Color3> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _defaultRenderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _meshMaterialMap: Map<AbstractMesh, ShaderMaterial> = new Map();\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private readonly _attributeName = \"instanceMeshID\";\r\n\r\n /** Shader language used by the generator */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this generator.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n if (this._pickingTexture) {\r\n this._pickingTexture.dispose();\r\n }\r\n this._pickingTexture = new RenderTargetTexture(\r\n \"pickingTexure\",\r\n { width: width, height: height },\r\n scene,\r\n false,\r\n undefined,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Constants.TEXTURE_NEAREST_NEAREST\r\n );\r\n }\r\n\r\n private async _createColorMaterialAsync(scene: Scene) {\r\n if (this._defaultRenderMaterial) {\r\n this._defaultRenderMaterial.dispose();\r\n }\r\n\r\n this._defaultRenderMaterial = null;\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n const defines: string[] = [];\r\n const options: Partial<IShaderMaterialOptions> = {\r\n attributes: [VertexBuffer.PositionKind, this._attributeName, \"bakedVertexAnimationSettingsInstanced\"],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/picking.fragment\"), import(\"../ShadersWGSL/picking.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/picking.fragment\"), import(\"../Shaders/picking.vertex\")]);\r\n }\r\n },\r\n };\r\n\r\n this._defaultRenderMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n\r\n this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n const effect = material.getEffect()!;\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {\r\n effect.setColor4(\"meshID\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n private _generateColorData(instanceCount: number, id: number, index: number, r: number, g: number, b: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * (instanceCount + 1));\r\n\r\n colorData[0] = r / 255.0;\r\n colorData[1] = g / 255.0;\r\n colorData[2] = b / 255.0;\r\n colorData[3] = 1.0;\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[(i + 1) * 4] = r / 255.0;\r\n colorData[(i + 1) * 4 + 1] = g / 255.0;\r\n colorData[(i + 1) * 4 + 2] = b / 255.0;\r\n colorData[(i + 1) * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n private _generateThinInstanceColorData(instanceCount: number, id: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * instanceCount);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[i * 4] = r / 255.0;\r\n colorData[i * 4 + 1] = g / 255.0;\r\n colorData[i * 4 + 2] = b / 255.0;\r\n colorData[i * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * Set that value to null to clear the list (and avoid leaks)\r\n * The module will read and delete from the array provided by reference. Disposing the module or setting the value to null will clear the array.\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>>) {\r\n if (this._pickableMeshes) {\r\n // Cleanup\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(this._attributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, null);\r\n }\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.removeCallback(this._materialBindCallback);\r\n }\r\n }\r\n this._pickableMeshes.length = 0;\r\n this._meshMaterialMap.clear();\r\n this._idMap.length = 0;\r\n this._thinIdMap.length = 0;\r\n this._idColors.length = 0;\r\n if (this._pickingTexture) {\r\n this._pickingTexture.renderList = [];\r\n }\r\n }\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n this._pickableMeshes = list as Array<AbstractMesh>;\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n if (!this._pickingTexture) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexture.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n }\r\n }\r\n\r\n if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._createColorMaterialAsync(scene);\r\n }\r\n\r\n this._cachedScene = scene;\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const item = list[i];\r\n if (\"mesh\" in item) {\r\n this._meshMaterialMap.set(item.mesh, item.material);\r\n list[i] = item.mesh;\r\n } else {\r\n this._meshMaterialMap.set(item, this._defaultRenderMaterial!);\r\n }\r\n }\r\n\r\n this._pickingTexture!.renderList = [];\r\n\r\n // We will affect colors and create vertex color buffers\r\n let id = 1;\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, material);\r\n this._pickingTexture!.renderList.push(mesh);\r\n\r\n if (mesh.isAnInstance) {\r\n continue; // This will be handled by the source mesh\r\n }\r\n\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n\r\n if (mesh.hasThinInstances) {\r\n const colorData = this._generateThinInstanceColorData((mesh as Mesh).thinInstanceCount, id, (i, id) => {\r\n this._thinIdMap[id] = { meshId: index, thinId: i };\r\n });\r\n id += (mesh as Mesh).thinInstanceCount;\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, colorData, 4);\r\n } else {\r\n this._idMap[id] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\r\n id += instances.length;\r\n const engine = mesh.getEngine();\r\n\r\n const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute a picking operation\r\n * @param x defines the X coordinates where to run the pick\r\n * @param y defines the Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results\r\n */\r\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const scene = this._cachedScene!;\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n this._meshRenderingCount = 0;\r\n\r\n // Ensure ints and adapt to screen resolution\r\n x = (devicePixelRatio * x) >> 0;\r\n y = (devicePixelRatio * y) >> 0;\r\n\r\n if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (!this._readbuffer) {\r\n this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU\r\n }\r\n\r\n // Invert Y\r\n y = rttSizeH - y;\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTexture!.onBeforeRender = () => {\r\n // Enable scissor\r\n if ((engine as WebGPUEngine | Engine).enableScissor) {\r\n (engine as WebGPUEngine | Engine).enableScissor(x, y, 1, 1);\r\n }\r\n };\r\n\r\n scene.customRenderTargets.push(this._pickingTexture!);\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n\r\n this._pickingTexture!.renderList = [];\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh)!);\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this._pickingTexture!.onAfterRender = async () => {\r\n // Disable scissor\r\n if ((engine as WebGPUEngine | Engine).disableScissor) {\r\n (engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n\r\n if (!this._pickingTexture) {\r\n reject();\r\n }\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const r = this._readbuffer[0];\r\n const g = this._readbuffer[1];\r\n const b = this._readbuffer[2];\r\n const colorId = (r << 16) + (g << 8) + b;\r\n\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n }\r\n\r\n // Clean-up\r\n if (!wasSuccessfull) {\r\n this._meshRenderingCount = 0;\r\n return; // We need to wait for the shaders to be ready\r\n } else {\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n if (pickedMesh) {\r\n resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n private async _readTexturePixelsAsync(x: number, y: number) {\r\n if (!this._cachedScene || !this._pickingTexture?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexture._texture, 1, 1, -1, 0, this._readbuffer, true, true, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /** Release the resources */\r\n public dispose() {\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexture?.dispose();\r\n this._pickingTexture = null;\r\n this._defaultRenderMaterial?.dispose();\r\n this._defaultRenderMaterial = null;\r\n }\r\n}\r\n"]}
@@ -12,7 +12,6 @@ import "../../ShadersWGSL/ShadersInclude/fresnelFunction";
12
12
  import "../../ShadersWGSL/ShadersInclude/meshUboDeclaration";
13
13
  import "../../ShadersWGSL/ShadersInclude/sceneUboDeclaration";
14
14
  import "../../ShadersWGSL/ShadersInclude/decalFragment";
15
- import "../../ShadersWGSL/particles.vertex";
16
15
  /** @internal */
17
16
  export declare class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {
18
17
  protected _attributesInputWGSL: string[];
@@ -12,7 +12,6 @@ import "../../ShadersWGSL/ShadersInclude/fresnelFunction.js";
12
12
  import "../../ShadersWGSL/ShadersInclude/meshUboDeclaration.js";
13
13
  import "../../ShadersWGSL/ShadersInclude/sceneUboDeclaration.js";
14
14
  import "../../ShadersWGSL/ShadersInclude/decalFragment.js";
15
- import "../../ShadersWGSL/particles.vertex.js";
16
15
  const builtInName_frag_depth = "fragmentOutputs.fragDepth";
17
16
  const leftOverVarName = "uniforms";
18
17
  const internalsVarName = "internals";