@babylonjs/core 7.9.0 → 7.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/Behaviors/Cameras/framingBehavior.d.ts +1 -1
  2. package/Behaviors/Cameras/framingBehavior.js +1 -1
  3. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  4. package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +5 -5
  5. package/Behaviors/Meshes/baseSixDofDragBehavior.js +4 -4
  6. package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
  7. package/Collisions/gpuPicker.d.ts +38 -0
  8. package/Collisions/gpuPicker.js +256 -0
  9. package/Collisions/gpuPicker.js.map +1 -0
  10. package/Collisions/index.d.ts +1 -0
  11. package/Collisions/index.js +1 -0
  12. package/Collisions/index.js.map +1 -1
  13. package/Debug/physicsViewer.d.ts +4 -2
  14. package/Debug/physicsViewer.js +16 -4
  15. package/Debug/physicsViewer.js.map +1 -1
  16. package/Engines/Extensions/engine.views.d.ts +1 -0
  17. package/Engines/Extensions/engine.views.js +3 -0
  18. package/Engines/Extensions/engine.views.js.map +1 -0
  19. package/Engines/abstractEngine.js +2 -2
  20. package/Engines/abstractEngine.js.map +1 -1
  21. package/Engines/thinEngine.js +8 -7
  22. package/Engines/thinEngine.js.map +1 -1
  23. package/Gizmos/boundingBoxGizmo.d.ts +6 -5
  24. package/Gizmos/boundingBoxGizmo.js +5 -5
  25. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  26. package/Gizmos/lightGizmo.js +1 -2
  27. package/Gizmos/lightGizmo.js.map +1 -1
  28. package/Helpers/environmentHelper.js +2 -0
  29. package/Helpers/environmentHelper.js.map +1 -1
  30. package/Materials/Node/nodeMaterial.d.ts +2 -2
  31. package/Materials/Node/nodeMaterial.js +4 -4
  32. package/Materials/Node/nodeMaterial.js.map +1 -1
  33. package/Materials/material.d.ts +1 -1
  34. package/Materials/material.js.map +1 -1
  35. package/Materials/pushMaterial.d.ts +1 -1
  36. package/Materials/pushMaterial.js.map +1 -1
  37. package/Materials/shaderMaterial.d.ts +6 -1
  38. package/Materials/shaderMaterial.js +8 -1
  39. package/Materials/shaderMaterial.js.map +1 -1
  40. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +0 -2
  41. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  42. package/Meshes/Node/Blocks/mergeGeometryBlock.js +15 -11
  43. package/Meshes/Node/Blocks/mergeGeometryBlock.js.map +1 -1
  44. package/Meshes/abstractMesh.d.ts +6 -16
  45. package/Meshes/abstractMesh.js +5 -21
  46. package/Meshes/abstractMesh.js.map +1 -1
  47. package/Meshes/mesh.vertexData.js +19 -1
  48. package/Meshes/mesh.vertexData.js.map +1 -1
  49. package/Meshes/transformNode.d.ts +14 -0
  50. package/Meshes/transformNode.js +20 -0
  51. package/Meshes/transformNode.js.map +1 -1
  52. package/Particles/EmitterTypes/coneParticleEmitter.d.ts +60 -0
  53. package/Particles/EmitterTypes/coneParticleEmitter.js +88 -0
  54. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  55. package/Particles/IParticleSystem.d.ts +2 -1
  56. package/Particles/IParticleSystem.js.map +1 -1
  57. package/Particles/baseParticleSystem.d.ts +2 -1
  58. package/Particles/baseParticleSystem.js +3 -0
  59. package/Particles/baseParticleSystem.js.map +1 -1
  60. package/Particles/gpuParticleSystem.d.ts +2 -1
  61. package/Particles/gpuParticleSystem.js +6 -1
  62. package/Particles/gpuParticleSystem.js.map +1 -1
  63. package/Particles/particleSystem.d.ts +2 -1
  64. package/Particles/particleSystem.functions.d.ts +2 -1
  65. package/Particles/particleSystem.functions.js +4 -1
  66. package/Particles/particleSystem.functions.js.map +1 -1
  67. package/Particles/particleSystem.js +10 -2
  68. package/Particles/particleSystem.js.map +1 -1
  69. package/Physics/v2/IPhysicsEnginePlugin.d.ts +3 -0
  70. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  71. package/Physics/v2/Plugins/havokPlugin.d.ts +14 -0
  72. package/Physics/v2/Plugins/havokPlugin.js +42 -18
  73. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  74. package/Physics/v2/physicsEngine.d.ts +14 -0
  75. package/Physics/v2/physicsEngine.js +20 -0
  76. package/Physics/v2/physicsEngine.js.map +1 -1
  77. package/Rendering/edgesRenderer.js +2 -1
  78. package/Rendering/edgesRenderer.js.map +1 -1
  79. package/Shaders/ShadersInclude/lineUboDeclaration.d.ts +7 -0
  80. package/Shaders/ShadersInclude/lineUboDeclaration.js +14 -0
  81. package/Shaders/ShadersInclude/lineUboDeclaration.js.map +1 -0
  82. package/Shaders/ShadersInclude/lineVertexDeclaration.d.ts +5 -0
  83. package/Shaders/ShadersInclude/lineVertexDeclaration.js +11 -0
  84. package/Shaders/ShadersInclude/lineVertexDeclaration.js.map +1 -0
  85. package/Shaders/gpuUpdateParticles.vertex.js +12 -2
  86. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  87. package/Shaders/line.vertex.d.ts +2 -0
  88. package/Shaders/line.vertex.js +5 -2
  89. package/Shaders/line.vertex.js.map +1 -1
  90. package/ShadersWGSL/gpuUpdateParticles.compute.js +11 -1
  91. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  92. package/XR/features/WebXRControllerMovement.d.ts +14 -1
  93. package/XR/features/WebXRControllerMovement.js +21 -3
  94. package/XR/features/WebXRControllerMovement.js.map +1 -1
  95. package/XR/webXRInputSource.d.ts +1 -1
  96. package/XR/webXRInputSource.js +3 -3
  97. package/XR/webXRInputSource.js.map +1 -1
  98. package/package.json +1 -1
@@ -0,0 +1,256 @@
1
+
2
+ import { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture.js";
3
+ import { ShaderMaterial } from "../Materials/shaderMaterial.js";
4
+ import { Color3, Color4 } from "../Maths/math.color.js";
5
+ import { VertexBuffer } from "../Meshes/buffer.js";
6
+ /**
7
+ * Class used to perform a picking operation using GPU
8
+ * Please note that GPUPIcker cannot pick instances, only meshes
9
+ */
10
+ export class GPUPicker {
11
+ constructor() {
12
+ this._pickingTexure = null;
13
+ this._idMap = {};
14
+ this._idColors = [];
15
+ this._cachedMaterials = [];
16
+ this._meshRenderingCount = 0;
17
+ this._userDefinedList = false;
18
+ }
19
+ _createRenderTarget(scene, width, height) {
20
+ this._pickingTexure = new RenderTargetTexture("pickingTexure", { width: width, height: height }, scene, false, undefined, 0, false, 1);
21
+ }
22
+ _createColorMaterial(scene) {
23
+ if (this._renderMaterial) {
24
+ this._renderMaterial.dispose();
25
+ }
26
+ const defines = [];
27
+ const options = {
28
+ attributes: [VertexBuffer.PositionKind],
29
+ uniforms: ["world", "viewProjection", "color"],
30
+ needAlphaBlending: false,
31
+ defines: defines,
32
+ useClipPlane: null,
33
+ };
34
+ this._renderMaterial = new ShaderMaterial("colorShader", scene, "color", options, false);
35
+ const callback = (mesh) => {
36
+ if (!mesh) {
37
+ return;
38
+ }
39
+ const effect = this._renderMaterial.getEffect();
40
+ if (!mesh.hasInstances && !mesh.isAnInstance) {
41
+ effect.setColor4("color", this._idColors[mesh.uniqueId], 1);
42
+ }
43
+ this._meshRenderingCount++;
44
+ };
45
+ this._renderMaterial.customBindingObservable.add(callback);
46
+ }
47
+ /**
48
+ * Set the list of meshes to pick from
49
+ * @param list defines the list of meshes to pick from
50
+ */
51
+ setPickingList(list) {
52
+ if (!list) {
53
+ if (this._userDefinedList) {
54
+ for (let index = 0; index < this._pickableMeshes.length; index++) {
55
+ const mesh = this._pickableMeshes[index];
56
+ if (mesh.hasInstances) {
57
+ mesh.removeVerticesData(VertexBuffer.ColorKind);
58
+ }
59
+ }
60
+ }
61
+ this._userDefinedList = false;
62
+ this._pickableMeshes = [];
63
+ this._idMap = {};
64
+ this._idColors = [];
65
+ return;
66
+ }
67
+ this._userDefinedList = true;
68
+ this._pickableMeshes = list;
69
+ // We will affect colors and create vertex color buffers
70
+ let id = 1;
71
+ for (let index = 0; index < this._pickableMeshes.length; index++) {
72
+ const mesh = this._pickableMeshes[index];
73
+ mesh.useVertexColors = false;
74
+ if (mesh.isAnInstance) {
75
+ continue; // This will be handled by the source mesh
76
+ }
77
+ const r = (id & 0xff0000) >> 16;
78
+ const g = (id & 0x00ff00) >> 8;
79
+ const b = (id & 0x0000ff) >> 0;
80
+ this._idMap[`${r}_${g}_${b}`] = index;
81
+ id++;
82
+ if (mesh.hasInstances) {
83
+ const instances = mesh.instances;
84
+ const colorData = new Float32Array(4 * (instances.length + 1));
85
+ const engine = mesh.getEngine();
86
+ colorData[0] = r / 255.0;
87
+ colorData[1] = g / 255.0;
88
+ colorData[2] = b / 255.0;
89
+ colorData[3] = 1.0;
90
+ for (let i = 0; i < instances.length; i++) {
91
+ const instance = instances[i];
92
+ const r = (id & 0xff0000) >> 16;
93
+ const g = (id & 0x00ff00) >> 8;
94
+ const b = (id & 0x0000ff) >> 0;
95
+ this._idMap[`${r}_${g}_${b}`] = this._pickableMeshes.indexOf(instance);
96
+ colorData[(i + 1) * 4] = r / 255.0;
97
+ colorData[(i + 1) * 4 + 1] = g / 255.0;
98
+ colorData[(i + 1) * 4 + 2] = b / 255.0;
99
+ colorData[(i + 1) * 4 + 3] = 1.0;
100
+ id++;
101
+ }
102
+ const buffer = new VertexBuffer(engine, colorData, VertexBuffer.ColorKind, false, false, 4, true);
103
+ mesh.setVerticesBuffer(buffer, true);
104
+ }
105
+ else {
106
+ this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Execute a picking operation
112
+ * @param x defines the X coordinates where to run the pick
113
+ * @param y defines the Y coordinates where to run the pick
114
+ * @param scene defines the scene to pick from
115
+ * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive
116
+ * @returns A promise with the picking results
117
+ */
118
+ pickAsync(x, y, scene, disposeWhenDone = true) {
119
+ const engine = scene.getEngine();
120
+ const rttSizeW = engine.getRenderWidth();
121
+ const rttSizeH = engine.getRenderHeight();
122
+ if (!this._readbuffer) {
123
+ this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU
124
+ }
125
+ this._meshRenderingCount = 0;
126
+ // Ensure ints
127
+ x = x >> 0;
128
+ y = y >> 0;
129
+ if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {
130
+ return Promise.resolve(null);
131
+ }
132
+ // Invert Y
133
+ y = rttSizeH - y;
134
+ if (!this._pickingTexure) {
135
+ this._createRenderTarget(scene, rttSizeW, rttSizeH);
136
+ }
137
+ else {
138
+ const size = this._pickingTexure.getSize();
139
+ if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {
140
+ this._pickingTexure.dispose();
141
+ this._createRenderTarget(scene, rttSizeW, rttSizeH);
142
+ }
143
+ }
144
+ if (!this._cachedScene || this._cachedScene !== scene) {
145
+ this._createColorMaterial(scene);
146
+ }
147
+ this._cachedScene = scene;
148
+ scene.customRenderTargets.push(this._pickingTexure);
149
+ this._pickingTexure.renderList = [];
150
+ this._pickingTexure.clearColor = new Color4(0, 0, 0, 0);
151
+ // We need to give every mesh an unique color (when there is no picking list)
152
+ this._pickingTexure.onBeforeRender = () => {
153
+ if (!this._userDefinedList) {
154
+ this._pickableMeshes = scene.meshes.filter((m) => m.geometry && m.isPickable && m.onBeforeRenderObservable);
155
+ }
156
+ for (let index = 0; index < this._pickableMeshes.length; index++) {
157
+ const mesh = this._pickableMeshes[index];
158
+ if (!mesh.isAnInstance) {
159
+ this._cachedMaterials[index] = mesh.material;
160
+ if (!this._userDefinedList) {
161
+ // We need to define the color for each mesh as it was not previously defined
162
+ const id = index + 1;
163
+ const r = (id & 0xff0000) >> 16;
164
+ const g = (id & 0x00ff00) >> 8;
165
+ const b = (id & 0x0000ff) >> 0;
166
+ this._idMap[`${r}_${g}_${b}`] = index;
167
+ this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);
168
+ }
169
+ else {
170
+ mesh.useVertexColors = true; // In that case we will be using vertex colors and not an uniform to support instances
171
+ }
172
+ mesh.material = this._renderMaterial;
173
+ }
174
+ this._pickingTexure?.renderList?.push(mesh);
175
+ }
176
+ // Enable scissor
177
+ if (engine.enableScissor) {
178
+ engine.enableScissor(x, y, 1, 1);
179
+ }
180
+ };
181
+ return new Promise((resolve, reject) => {
182
+ this._pickingTexure.onAfterRender = async () => {
183
+ // Disable scissor
184
+ if (engine.disableScissor) {
185
+ engine.disableScissor();
186
+ }
187
+ if (!this._pickingTexure) {
188
+ reject();
189
+ }
190
+ let pickedMesh = null;
191
+ const wasSuccessfull = this._meshRenderingCount > 0;
192
+ // Restore materials
193
+ for (let index = 0; index < this._pickableMeshes.length; index++) {
194
+ const mesh = this._pickableMeshes[index];
195
+ if (!mesh.isAnInstance) {
196
+ mesh.material = this._cachedMaterials[index];
197
+ if (this._userDefinedList) {
198
+ mesh.useVertexColors = false;
199
+ }
200
+ }
201
+ }
202
+ if (wasSuccessfull) {
203
+ // Remove from the active RTTs
204
+ const index = scene.customRenderTargets.indexOf(this._pickingTexure);
205
+ if (index > -1) {
206
+ scene.customRenderTargets.splice(index, 1);
207
+ }
208
+ // Do the actual picking
209
+ if (await this._readTexturePixelsAsync(x, y)) {
210
+ const colorId = `${this._readbuffer[0]}_${this._readbuffer[1]}_${this._readbuffer[2]}`;
211
+ pickedMesh = this._pickableMeshes[this._idMap[colorId]];
212
+ }
213
+ }
214
+ // Clean-up
215
+ if (!this._userDefinedList) {
216
+ this._idMap = {};
217
+ this._idColors = [];
218
+ this._pickableMeshes = [];
219
+ }
220
+ this._pickingTexure.renderList = [];
221
+ if (!wasSuccessfull) {
222
+ this._meshRenderingCount = 0;
223
+ return; // We need to wait for the shaders to be ready
224
+ }
225
+ else {
226
+ if (disposeWhenDone) {
227
+ this.dispose();
228
+ }
229
+ resolve(pickedMesh);
230
+ }
231
+ };
232
+ });
233
+ }
234
+ async _readTexturePixelsAsync(x, y) {
235
+ if (!this._cachedScene || !this._pickingTexure?._texture) {
236
+ return false;
237
+ }
238
+ const engine = this._cachedScene.getEngine();
239
+ await engine._readTexturePixels(this._pickingTexure._texture, 1, 1, -1, 0, this._readbuffer, true, true, x, y);
240
+ return true;
241
+ }
242
+ /** Release the resources */
243
+ dispose() {
244
+ if (this._userDefinedList) {
245
+ this.setPickingList(null);
246
+ }
247
+ this._pickableMeshes = [];
248
+ this._cachedScene = null;
249
+ // Cleaning up
250
+ this._pickingTexure?.dispose();
251
+ this._pickingTexure = null;
252
+ this._renderMaterial?.dispose();
253
+ this._renderMaterial = null;
254
+ }
255
+ }
256
+ //# sourceMappingURL=gpuPicker.js.map
@@ -0,0 +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 { 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 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 _pickingTexure: Nullable<RenderTargetTexture> = null;\r\n private _idMap: { [key: string]: number } = {};\r\n private _idColors: Array<Color3> = [];\r\n private _cachedMaterials: Array<Nullable<Material>> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _renderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private _userDefinedList = false;\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n this._pickingTexure = 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 _createColorMaterial(scene: Scene) {\r\n if (this._renderMaterial) {\r\n this._renderMaterial.dispose();\r\n }\r\n\r\n const defines: string[] = [];\r\n const options = {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\", \"color\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n };\r\n\r\n this._renderMaterial = new ShaderMaterial(\"colorShader\", scene, \"color\", options, false);\r\n\r\n const callback = (mesh: AbstractMesh | undefined) => {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const effect = this._renderMaterial!.getEffect();\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance) {\r\n effect.setColor4(\"color\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n };\r\n\r\n this._renderMaterial.customBindingObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh>>) {\r\n if (!list) {\r\n if (this._userDefinedList) {\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(VertexBuffer.ColorKind);\r\n }\r\n }\r\n }\r\n this._userDefinedList = false;\r\n this._pickableMeshes = [];\r\n this._idMap = {};\r\n this._idColors = [];\r\n return;\r\n }\r\n this._userDefinedList = true;\r\n this._pickableMeshes = list;\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 mesh.useVertexColors = false;\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 this._idMap[`${r}_${g}_${b}`] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = new Float32Array(4 * (instances.length + 1));\r\n const engine = mesh.getEngine();\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 < instances.length; i++) {\r\n const instance = instances[i];\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n this._idMap[`${r}_${g}_${b}`] = this._pickableMeshes.indexOf(instance);\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 const buffer = new VertexBuffer(engine, colorData, VertexBuffer.ColorKind, 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 * 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 scene defines the scene to pick from\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive\r\n * @returns A promise with the picking results\r\n */\r\n public pickAsync(x: number, y: number, scene: Scene, disposeWhenDone = true): Promise<Nullable<AbstractMesh>> {\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\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 this._meshRenderingCount = 0;\r\n // Ensure ints\r\n x = x >> 0;\r\n y = 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 // Invert Y\r\n y = rttSizeH - y;\r\n\r\n if (!this._pickingTexure) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexure.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {\r\n this._pickingTexure.dispose();\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n }\r\n }\r\n\r\n if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._createColorMaterial(scene);\r\n }\r\n\r\n this._cachedScene = scene;\r\n scene.customRenderTargets.push(this._pickingTexure!);\r\n this._pickingTexure!.renderList = [];\r\n this._pickingTexure!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n // We need to give every mesh an unique color (when there is no picking list)\r\n this._pickingTexure!.onBeforeRender = () => {\r\n if (!this._userDefinedList) {\r\n this._pickableMeshes = scene.meshes.filter((m) => (m as Mesh).geometry && m.isPickable && (m as Mesh).onBeforeRenderObservable) as Mesh[];\r\n }\r\n\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n if (!mesh.isAnInstance) {\r\n this._cachedMaterials[index] = mesh.material;\r\n if (!this._userDefinedList) {\r\n // We need to define the color for each mesh as it was not previously defined\r\n const id = index + 1;\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n this._idMap[`${r}_${g}_${b}`] = index;\r\n\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n } else {\r\n mesh.useVertexColors = true; // In that case we will be using vertex colors and not an uniform to support instances\r\n }\r\n mesh.material = this._renderMaterial;\r\n }\r\n this._pickingTexure?.renderList?.push(mesh);\r\n }\r\n\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._pickingTexure!.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._pickingTexure) {\r\n reject();\r\n }\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n // Restore materials\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n if (!mesh.isAnInstance) {\r\n mesh.material = this._cachedMaterials[index];\r\n\r\n if (this._userDefinedList) {\r\n mesh.useVertexColors = false;\r\n }\r\n }\r\n }\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._pickingTexure!);\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 colorId = `${this._readbuffer[0]}_${this._readbuffer[1]}_${this._readbuffer[2]}`;\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n\r\n // Clean-up\r\n if (!this._userDefinedList) {\r\n this._idMap = {};\r\n this._idColors = [];\r\n\r\n this._pickableMeshes = [];\r\n }\r\n this._pickingTexure!.renderList = [];\r\n\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 resolve(pickedMesh);\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._pickingTexure?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexure._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 if (this._userDefinedList) {\r\n this.setPickingList(null);\r\n }\r\n this._pickableMeshes = [];\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexure?.dispose();\r\n this._pickingTexure = null;\r\n this._renderMaterial?.dispose();\r\n this._renderMaterial = null;\r\n }\r\n}\r\n"]}
@@ -3,3 +3,4 @@ export * from "./collisionCoordinator";
3
3
  export * from "./pickingInfo";
4
4
  export * from "./intersectionInfo";
5
5
  export * from "./meshCollisionData";
6
+ export * from "./gpuPicker";
@@ -3,4 +3,5 @@ export * from "./collisionCoordinator.js";
3
3
  export * from "./pickingInfo.js";
4
4
  export * from "./intersectionInfo.js";
5
5
  export * from "./meshCollisionData.js";
6
+ export * from "./gpuPicker.js";
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC","sourcesContent":["export * from \"./collider\";\r\nexport * from \"./collisionCoordinator\";\r\nexport * from \"./pickingInfo\";\r\nexport * from \"./intersectionInfo\";\r\nexport * from \"./meshCollisionData\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./collider\";\r\nexport * from \"./collisionCoordinator\";\r\nexport * from \"./pickingInfo\";\r\nexport * from \"./intersectionInfo\";\r\nexport * from \"./meshCollisionData\";\r\nexport * from \"./gpuPicker\";\r\n"]}
@@ -133,18 +133,20 @@ export declare class PhysicsViewer {
133
133
  /**
134
134
  * Hides a body from the physics engine.
135
135
  * @param body - The body to hide.
136
+ * @returns true if body actually removed
136
137
  *
137
138
  * This function is useful for hiding a body from the physics engine.
138
139
  * It removes the body from the utility layer scene and disposes the mesh associated with it.
139
140
  * It also unregisters the render function if the number of bodies is 0.
140
141
  * This is useful for hiding a body from the physics engine without deleting it.
141
142
  */
142
- hideBody(body: Nullable<PhysicsBody>): void;
143
+ hideBody(body: Nullable<PhysicsBody>): boolean;
143
144
  /**
144
145
  * Hides a body's inertia from the viewer utility layer
145
146
  * @param body the body to hide
147
+ * @returns true if inertia actually removed
146
148
  */
147
- hideInertia(body: Nullable<PhysicsBody>): void;
149
+ hideInertia(body: Nullable<PhysicsBody>): boolean;
148
150
  /**
149
151
  * Hide a physics constraint from the viewer utility layer
150
152
  * @param constraint the constraint to hide
@@ -115,21 +115,29 @@ export class PhysicsViewer {
115
115
  */
116
116
  _updateDebugMeshesV2() {
117
117
  const plugin = this._physicsEnginePlugin;
118
- for (let i = 0; i < this._numBodies; i++) {
118
+ for (let i = 0; i < this._numBodies;) {
119
119
  const body = this._bodies[i];
120
+ if (body && body.isDisposed && this.hideBody(body)) {
121
+ continue;
122
+ }
120
123
  const transform = this._bodyMeshes[i];
121
124
  if (body && transform) {
122
125
  plugin.syncTransform(body, transform);
123
126
  }
127
+ i++;
124
128
  }
125
129
  }
126
130
  _updateInertiaMeshes() {
127
- for (let i = 0; i < this._numInertiaBodies; i++) {
131
+ for (let i = 0; i < this._numInertiaBodies;) {
128
132
  const body = this._inertiaBodies[i];
133
+ if (body && body.isDisposed && this.hideInertia(body)) {
134
+ continue;
135
+ }
129
136
  const mesh = this._inertiaMeshes[i];
130
137
  if (body && mesh) {
131
138
  this._updateDebugInertia(body, mesh);
132
139
  }
140
+ i++;
133
141
  }
134
142
  }
135
143
  _updateDebugInertia(body, inertiaMesh) {
@@ -376,6 +384,7 @@ export class PhysicsViewer {
376
384
  /**
377
385
  * Hides a body from the physics engine.
378
386
  * @param body - The body to hide.
387
+ * @returns true if body actually removed
379
388
  *
380
389
  * This function is useful for hiding a body from the physics engine.
381
390
  * It removes the body from the utility layer scene and disposes the mesh associated with it.
@@ -384,7 +393,7 @@ export class PhysicsViewer {
384
393
  */
385
394
  hideBody(body) {
386
395
  if (!body || !this._scene || !this._utilityLayer) {
387
- return;
396
+ return false;
388
397
  }
389
398
  let removed = false;
390
399
  const utilityLayerScene = this._utilityLayer.utilityLayerScene;
@@ -414,14 +423,16 @@ export class PhysicsViewer {
414
423
  if (removed && this._numBodies === 0) {
415
424
  this._scene.unregisterBeforeRender(this._renderFunction);
416
425
  }
426
+ return removed;
417
427
  }
418
428
  /**
419
429
  * Hides a body's inertia from the viewer utility layer
420
430
  * @param body the body to hide
431
+ * @returns true if inertia actually removed
421
432
  */
422
433
  hideInertia(body) {
423
434
  if (!body || !this._scene || !this._utilityLayer) {
424
- return;
435
+ return false;
425
436
  }
426
437
  let removed = false;
427
438
  const utilityLayerScene = this._utilityLayer.utilityLayerScene;
@@ -443,6 +454,7 @@ export class PhysicsViewer {
443
454
  if (removed && this._numInertiaBodies === 0) {
444
455
  this._scene.unregisterBeforeRender(this._inertiaRenderFunction);
445
456
  }
457
+ return removed;
446
458
  }
447
459
  /**
448
460
  * Hide a physics constraint from the viewer utility layer