@babylonjs/core 7.25.0 → 7.25.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.
- package/Audio/weightedsound.js +6 -4
- package/Audio/weightedsound.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +5 -0
- package/Collisions/gpuPicker.js +34 -11
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +3 -3
- package/Engines/constants.js +3 -3
- package/Engines/constants.js.map +1 -1
- package/Engines/thinEngine.js +6 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.d.ts +10 -10
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js +22 -20
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/prePassTextureBlock.d.ts +9 -9
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js +41 -32
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js +0 -5
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +2 -1
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
- package/Materials/Node/Blocks/powBlock.js +1 -1
- package/Materials/Node/Blocks/powBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +2 -2
- package/Materials/Node/nodeMaterial.js +7 -4
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBlockConnectionPoint.js +3 -1
- package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +2 -2
- package/Materials/PBR/pbrBaseMaterial.js +2 -2
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/materialHelper.functions.js +2 -2
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/standardMaterial.d.ts +2 -2
- package/Materials/standardMaterial.js +2 -2
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +6 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +32 -7
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/geometry.d.ts +2 -1
- package/Meshes/geometry.js +3 -2
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/mesh.d.ts +2 -1
- package/Meshes/mesh.js +5 -3
- package/Meshes/mesh.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +2 -2
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +2 -2
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/prePassRenderer.js +5 -4
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockClearcoat.js +0 -5
- package/Shaders/ShadersInclude/pbrBlockClearcoat.js.map +1 -1
- package/Shaders/default.fragment.js +4 -4
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.js +5 -9
- package/Shaders/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockClearcoat.js +0 -5
- package/ShadersWGSL/ShadersInclude/pbrBlockClearcoat.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +4 -4
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +5 -9
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/package.json +1 -1
package/Audio/weightedsound.js
CHANGED
|
@@ -117,9 +117,11 @@ export class WeightedSound {
|
|
|
117
117
|
* Suspend playback
|
|
118
118
|
*/
|
|
119
119
|
pause() {
|
|
120
|
-
this.
|
|
121
|
-
|
|
122
|
-
this.
|
|
120
|
+
if (this.isPlaying) {
|
|
121
|
+
this.isPaused = true;
|
|
122
|
+
if (this._currentIndex !== undefined) {
|
|
123
|
+
this._sounds[this._currentIndex].pause();
|
|
124
|
+
}
|
|
123
125
|
}
|
|
124
126
|
}
|
|
125
127
|
/**
|
|
@@ -148,7 +150,7 @@ export class WeightedSound {
|
|
|
148
150
|
}
|
|
149
151
|
}
|
|
150
152
|
}
|
|
151
|
-
const sound = this._sounds[this._currentIndex];
|
|
153
|
+
const sound = this._sounds[this._currentIndex ?? 0];
|
|
152
154
|
if (sound.isReady()) {
|
|
153
155
|
sound.play(0, this.isPaused ? undefined : startOffset);
|
|
154
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weightedsound.js","sourceRoot":"","sources":["../../../../dev/core/src/Audio/weightedsound.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"weightedsound.js","sourceRoot":"","sources":["../../../../dev/core/src/Audio/weightedsound.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC;;GAEG;AACH,MAAM,OAAO,aAAa;IAetB;;;;;OAKG;IACH,YAAY,IAAa,EAAE,MAAe,EAAE,OAAiB;QApB7D,8FAA8F;QACvF,SAAI,GAAY,KAAK,CAAC;QACrB,oBAAe,GAAW,GAAG,CAAC;QAC9B,oBAAe,GAAW,GAAG,CAAC;QAC9B,YAAO,GAAW,CAAC,CAAC;QAC5B,oCAAoC;QAC7B,cAAS,GAAY,KAAK,CAAC;QAClC,mCAAmC;QAC5B,aAAQ,GAAY,KAAK,CAAC;QAEzB,YAAO,GAAY,EAAE,CAAC;QACtB,aAAQ,GAAa,EAAE,CAAC;QAU5B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAClE;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,wBAAwB;QACxB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC1B,SAAS,IAAI,MAAM,CAAC;SACvB;QACD,MAAM,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;SACpC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;YAC9B,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAED;;OAEG;IACH,IAAW,yBAAyB;QAChC,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAW,yBAAyB,CAAC,KAAa;QAC9C,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE;YAChC,IAAI,IAAI,CAAC,eAAe,GAAG,KAAK,EAAE;gBAC9B,MAAM,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;gBACjH,OAAO;aACV;YAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9B,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC;aAC3C;SACJ;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,yBAAyB;QAChC,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAW,yBAAyB,CAAC,KAAa;QAC9C,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE;YAChC,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;gBAC9B,MAAM,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;gBACjH,OAAO;aACV;YAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9B,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC;aAC3C;SACJ;IACL,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,MAAM,CAAC,KAAa;QAC3B,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE;YACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9B,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAEO,QAAQ;QACZ,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;SACrD;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;SACf;aAAM;YACH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;SAC1B;IACL,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;gBAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;aAC5C;SACJ;IACL,CAAC;IAED;;OAEG;IACI,IAAI;QACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;SAC3C;IACL,CAAC;IAED;;;OAGG;IACI,IAAI,CAAC,WAAoB;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC3C,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,WAAW,IAAI,KAAK,EAAE;oBACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;oBACvB,MAAM;iBACT;aACJ;SACJ;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;QACpD,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE;YACjB,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;SAC1D;aAAM;YACH,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;SACzB;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;CACJ","sourcesContent":["import type { Sound } from \"../Audio/sound\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\n/**\r\n * Wraps one or more Sound objects and selects one with random weight for playback.\r\n */\r\nexport class WeightedSound {\r\n /** When true a Sound will be selected and played when the current playing Sound completes. */\r\n public loop: boolean = false;\r\n private _coneInnerAngle: number = 360;\r\n private _coneOuterAngle: number = 360;\r\n private _volume: number = 1;\r\n /** A Sound is currently playing. */\r\n public isPlaying: boolean = false;\r\n /** A Sound is currently paused. */\r\n public isPaused: boolean = false;\r\n\r\n private _sounds: Sound[] = [];\r\n private _weights: number[] = [];\r\n private _currentIndex?: number;\r\n\r\n /**\r\n * Creates a new WeightedSound from the list of sounds given.\r\n * @param loop When true a Sound will be selected and played when the current playing Sound completes.\r\n * @param sounds Array of Sounds that will be selected from.\r\n * @param weights Array of number values for selection weights; length must equal sounds, values will be normalized to 1\r\n */\r\n constructor(loop: boolean, sounds: Sound[], weights: number[]) {\r\n if (sounds.length !== weights.length) {\r\n throw new Error(\"Sounds length does not equal weights length\");\r\n }\r\n\r\n this.loop = loop;\r\n this._weights = weights;\r\n // Normalize the weights\r\n let weightSum = 0;\r\n for (const weight of weights) {\r\n weightSum += weight;\r\n }\r\n const invWeightSum = weightSum > 0 ? 1 / weightSum : 0;\r\n for (let i = 0; i < this._weights.length; i++) {\r\n this._weights[i] *= invWeightSum;\r\n }\r\n this._sounds = sounds;\r\n for (const sound of this._sounds) {\r\n sound.onEndedObservable.add(() => {\r\n this._onended();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * The size of cone in degrees for a directional sound in which there will be no attenuation.\r\n */\r\n public get directionalConeInnerAngle(): number {\r\n return this._coneInnerAngle;\r\n }\r\n\r\n /**\r\n * The size of cone in degrees for a directional sound in which there will be no attenuation.\r\n */\r\n public set directionalConeInnerAngle(value: number) {\r\n if (value !== this._coneInnerAngle) {\r\n if (this._coneOuterAngle < value) {\r\n Logger.Error(\"directionalConeInnerAngle: outer angle of the cone must be superior or equal to the inner angle.\");\r\n return;\r\n }\r\n\r\n this._coneInnerAngle = value;\r\n for (const sound of this._sounds) {\r\n sound.directionalConeInnerAngle = value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Size of cone in degrees for a directional sound outside of which there will be no sound.\r\n * Listener angles between innerAngle and outerAngle will falloff linearly.\r\n */\r\n public get directionalConeOuterAngle(): number {\r\n return this._coneOuterAngle;\r\n }\r\n\r\n /**\r\n * Size of cone in degrees for a directional sound outside of which there will be no sound.\r\n * Listener angles between innerAngle and outerAngle will falloff linearly.\r\n */\r\n public set directionalConeOuterAngle(value: number) {\r\n if (value !== this._coneOuterAngle) {\r\n if (value < this._coneInnerAngle) {\r\n Logger.Error(\"directionalConeOuterAngle: outer angle of the cone must be superior or equal to the inner angle.\");\r\n return;\r\n }\r\n\r\n this._coneOuterAngle = value;\r\n for (const sound of this._sounds) {\r\n sound.directionalConeOuterAngle = value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Playback volume.\r\n */\r\n public get volume(): number {\r\n return this._volume;\r\n }\r\n\r\n /**\r\n * Playback volume.\r\n */\r\n public set volume(value: number) {\r\n if (value !== this._volume) {\r\n for (const sound of this._sounds) {\r\n sound.setVolume(value);\r\n }\r\n }\r\n }\r\n\r\n private _onended() {\r\n if (this._currentIndex !== undefined) {\r\n this._sounds[this._currentIndex].autoplay = false;\r\n }\r\n if (this.loop && this.isPlaying) {\r\n this.play();\r\n } else {\r\n this.isPlaying = false;\r\n }\r\n }\r\n\r\n /**\r\n * Suspend playback\r\n */\r\n public pause() {\r\n if (this.isPlaying) {\r\n this.isPaused = true;\r\n if (this._currentIndex !== undefined) {\r\n this._sounds[this._currentIndex].pause();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Stop playback\r\n */\r\n public stop() {\r\n this.isPlaying = false;\r\n if (this._currentIndex !== undefined) {\r\n this._sounds[this._currentIndex].stop();\r\n }\r\n }\r\n\r\n /**\r\n * Start playback.\r\n * @param startOffset Position the clip head at a specific time in seconds.\r\n */\r\n public play(startOffset?: number) {\r\n if (!this.isPaused) {\r\n this.stop();\r\n const randomValue = Math.random();\r\n let total = 0;\r\n for (let i = 0; i < this._weights.length; i++) {\r\n total += this._weights[i];\r\n if (randomValue <= total) {\r\n this._currentIndex = i;\r\n break;\r\n }\r\n }\r\n }\r\n const sound = this._sounds[this._currentIndex ?? 0];\r\n if (sound.isReady()) {\r\n sound.play(0, this.isPaused ? undefined : startOffset);\r\n } else {\r\n sound.autoplay = true;\r\n }\r\n this.isPlaying = true;\r\n this.isPaused = false;\r\n }\r\n}\r\n"]}
|
|
@@ -53,6 +53,11 @@ export declare class GPUPicker {
|
|
|
53
53
|
* Gets the shader language used in this generator.
|
|
54
54
|
*/
|
|
55
55
|
get shaderLanguage(): ShaderLanguage;
|
|
56
|
+
private _pickingInProgress;
|
|
57
|
+
/**
|
|
58
|
+
* Gets a boolean indicating if the picking is in progress
|
|
59
|
+
*/
|
|
60
|
+
get pickingInProgress(): boolean;
|
|
56
61
|
private static _IdToRgb;
|
|
57
62
|
private _getColorIdFromReadBuffer;
|
|
58
63
|
private static _SetColorData;
|
package/Collisions/gpuPicker.js
CHANGED
|
@@ -18,6 +18,7 @@ export class GPUPicker {
|
|
|
18
18
|
this._attributeName = "instanceMeshID";
|
|
19
19
|
/** Shader language used by the generator */
|
|
20
20
|
this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
21
|
+
this._pickingInProgress = false;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Gets the shader language used in this generator.
|
|
@@ -25,6 +26,12 @@ export class GPUPicker {
|
|
|
25
26
|
get shaderLanguage() {
|
|
26
27
|
return this._shaderLanguage;
|
|
27
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Gets a boolean indicating if the picking is in progress
|
|
31
|
+
*/
|
|
32
|
+
get pickingInProgress() {
|
|
33
|
+
return this._pickingInProgress;
|
|
34
|
+
}
|
|
28
35
|
static _IdToRgb(id) {
|
|
29
36
|
GPUPicker._TempColor.r = (id & 0xff0000) >> 16;
|
|
30
37
|
GPUPicker._TempColor.g = (id & 0x00ff00) >> 8;
|
|
@@ -226,17 +233,21 @@ export class GPUPicker {
|
|
|
226
233
|
* @returns A promise with the picking results
|
|
227
234
|
*/
|
|
228
235
|
async pickAsync(x, y, disposeWhenDone = false) {
|
|
236
|
+
if (this._pickingInProgress) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
229
239
|
if (!this._pickableMeshes || this._pickableMeshes.length === 0) {
|
|
230
|
-
return
|
|
240
|
+
return null;
|
|
231
241
|
}
|
|
232
242
|
const { x: adjustedX, y: adjustedY, rttSizeW, rttSizeH } = this._prepareForPicking(x, y);
|
|
233
243
|
if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) {
|
|
234
|
-
return
|
|
244
|
+
return null;
|
|
235
245
|
}
|
|
246
|
+
this._pickingInProgress = true;
|
|
236
247
|
// Invert Y
|
|
237
|
-
const invertedY = rttSizeH -
|
|
238
|
-
this._preparePickingBuffer(this._engine, rttSizeW, rttSizeH,
|
|
239
|
-
return
|
|
248
|
+
const invertedY = rttSizeH - adjustedY - 1;
|
|
249
|
+
this._preparePickingBuffer(this._engine, rttSizeW, rttSizeH, adjustedX, invertedY);
|
|
250
|
+
return this._executePicking(adjustedX, invertedY, disposeWhenDone);
|
|
240
251
|
}
|
|
241
252
|
/**
|
|
242
253
|
* Execute a picking operation on multiple coordinates
|
|
@@ -245,6 +256,9 @@ export class GPUPicker {
|
|
|
245
256
|
* @returns A promise with the picking results. Always returns an array with the same length as the number of coordinates. The mesh or null at the index where no mesh was picked.
|
|
246
257
|
*/
|
|
247
258
|
async multiPickAsync(xy, disposeWhenDone = false) {
|
|
259
|
+
if (this._pickingInProgress) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
248
262
|
if (!this._pickableMeshes || this._pickableMeshes.length === 0 || xy.length === 0) {
|
|
249
263
|
return null;
|
|
250
264
|
}
|
|
@@ -255,6 +269,7 @@ export class GPUPicker {
|
|
|
255
269
|
thinInstanceIndexes: pi?.thinInstanceIndex ? [pi.thinInstanceIndex] : undefined,
|
|
256
270
|
};
|
|
257
271
|
}
|
|
272
|
+
this._pickingInProgress = true;
|
|
258
273
|
let minX = xy[0].x, maxX = xy[0].x, minY = xy[0].y, maxY = xy[0].y;
|
|
259
274
|
for (let i = 1; i < xy.length; i++) {
|
|
260
275
|
const { x, y } = xy[i];
|
|
@@ -268,7 +283,7 @@ export class GPUPicker {
|
|
|
268
283
|
const h = Math.max(maxY - minY, 1);
|
|
269
284
|
const partialCutH = rttSizeH - maxY - 1;
|
|
270
285
|
this._preparePickingBuffer(this._engine, rttSizeW, rttSizeH, minX, partialCutH, w, h);
|
|
271
|
-
return
|
|
286
|
+
return this._executeMultiPicking(xy, minX, maxY, rttSizeH, w, h, disposeWhenDone);
|
|
272
287
|
}
|
|
273
288
|
_prepareForPicking(x, y) {
|
|
274
289
|
const scene = this._cachedScene;
|
|
@@ -286,27 +301,30 @@ export class GPUPicker {
|
|
|
286
301
|
if (!this._readbuffer || this._readbuffer.length < requiredBufferSize) {
|
|
287
302
|
this._readbuffer = new Uint8Array(requiredBufferSize);
|
|
288
303
|
}
|
|
289
|
-
this._pickingTexture.clearColor = new Color4(0, 0, 0, 0);
|
|
290
|
-
this._pickingTexture.onBeforeRender = () => {
|
|
291
|
-
this._enableScissor(x, y, w, h);
|
|
292
|
-
};
|
|
293
|
-
this._cachedScene.customRenderTargets.push(this._pickingTexture);
|
|
294
304
|
// Do we need to rebuild the RTT?
|
|
295
305
|
const size = this._pickingTexture.getSize();
|
|
296
306
|
if (size.width !== rttSizeW || size.height !== rttSizeH) {
|
|
297
307
|
this._createRenderTarget(this._cachedScene, rttSizeW, rttSizeH);
|
|
298
308
|
this._updateRenderList();
|
|
299
309
|
}
|
|
310
|
+
this._pickingTexture.clearColor = new Color4(0, 0, 0, 0);
|
|
311
|
+
this._pickingTexture.onBeforeRender = () => {
|
|
312
|
+
this._enableScissor(x, y, w, h);
|
|
313
|
+
};
|
|
314
|
+
this._cachedScene.customRenderTargets.push(this._pickingTexture);
|
|
300
315
|
}
|
|
301
316
|
// pick one pixel
|
|
302
317
|
_executePicking(x, y, disposeWhenDone) {
|
|
303
318
|
return new Promise((resolve, reject) => {
|
|
304
319
|
if (!this._pickingTexture) {
|
|
320
|
+
this._pickingInProgress = false;
|
|
305
321
|
reject();
|
|
322
|
+
return;
|
|
306
323
|
}
|
|
307
324
|
this._pickingTexture.onAfterRender = async () => {
|
|
308
325
|
this._disableScissor();
|
|
309
326
|
if (this._checkRenderStatus()) {
|
|
327
|
+
this._pickingTexture.onAfterRender = null;
|
|
310
328
|
let pickedMesh = null;
|
|
311
329
|
let thinInstanceIndex = undefined;
|
|
312
330
|
// Remove from the active RTTs
|
|
@@ -329,6 +347,7 @@ export class GPUPicker {
|
|
|
329
347
|
if (disposeWhenDone) {
|
|
330
348
|
this.dispose();
|
|
331
349
|
}
|
|
350
|
+
this._pickingInProgress = false;
|
|
332
351
|
if (pickedMesh) {
|
|
333
352
|
resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });
|
|
334
353
|
}
|
|
@@ -343,11 +362,14 @@ export class GPUPicker {
|
|
|
343
362
|
_executeMultiPicking(xy, minX, maxY, rttSizeH, w, h, disposeWhenDone) {
|
|
344
363
|
return new Promise((resolve, reject) => {
|
|
345
364
|
if (!this._pickingTexture) {
|
|
365
|
+
this._pickingInProgress = false;
|
|
346
366
|
reject();
|
|
367
|
+
return;
|
|
347
368
|
}
|
|
348
369
|
this._pickingTexture.onAfterRender = async () => {
|
|
349
370
|
this._disableScissor();
|
|
350
371
|
if (this._checkRenderStatus()) {
|
|
372
|
+
this._pickingTexture.onAfterRender = null;
|
|
351
373
|
const pickedMeshes = [];
|
|
352
374
|
const thinInstanceIndexes = [];
|
|
353
375
|
if (await this._readTexturePixelsAsync(minX, rttSizeH - maxY - 1, w, h)) {
|
|
@@ -360,6 +382,7 @@ export class GPUPicker {
|
|
|
360
382
|
if (disposeWhenDone) {
|
|
361
383
|
this.dispose();
|
|
362
384
|
}
|
|
385
|
+
this._pickingInProgress = false;
|
|
363
386
|
resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes });
|
|
364
387
|
}
|
|
365
388
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { 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 { IColor3Like, IVector2Like } from \"core/Maths/math.like\";\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 * Stores the result of a multi GPU piciking operation\r\n */\r\nexport interface IGPUMultiPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n meshes: Nullable<AbstractMesh>[];\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndexes?: 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 _engine: Nullable<AbstractEngine>;\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 private static _TempColor: IColor3Like = {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n };\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 static _IdToRgb(id: number) {\r\n GPUPicker._TempColor.r = (id & 0xff0000) >> 16;\r\n GPUPicker._TempColor.g = (id & 0x00ff00) >> 8;\r\n GPUPicker._TempColor.b = (id & 0x0000ff) >> 0;\r\n }\r\n\r\n private _getColorIdFromReadBuffer(offset: number) {\r\n const r = this._readbuffer[offset];\r\n const g = this._readbuffer[offset + 1];\r\n const b = this._readbuffer[offset + 2];\r\n return (r << 16) + (g << 8) + b;\r\n }\r\n\r\n private static _SetColorData(buffer: Float32Array, i: number, r: number, g: number, b: number) {\r\n buffer[i] = r / 255.0;\r\n buffer[i + 1] = g / 255.0;\r\n buffer[i + 2] = b / 255.0;\r\n buffer[i + 3] = 1.0;\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 GPUPicker._SetColorData(colorData, 0, r, g, b);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n GPUPicker._IdToRgb(id);\r\n\r\n onInstance(i, id);\r\n GPUPicker._SetColorData(colorData, (i + 1) * 4, GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.b);\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 GPUPicker._IdToRgb(id);\r\n\r\n onInstance(i, id);\r\n GPUPicker._SetColorData(colorData, i * 4, GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.b);\r\n\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 this._engine = scene.getEngine();\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 GPUPicker._IdToRgb(id);\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, GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\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(GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.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 { x: adjustedX, y: adjustedY, rttSizeW, rttSizeH } = this._prepareForPicking(x, y);\r\n if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n // Invert Y\r\n const invertedY = rttSizeH - y - 1;\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, x, invertedY);\r\n\r\n return await this._executePicking(x, invertedY, disposeWhenDone);\r\n }\r\n\r\n /**\r\n * Execute a picking operation on multiple coordinates\r\n * @param xy defines the X,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. Always returns an array with the same length as the number of coordinates. The mesh or null at the index where no mesh was picked.\r\n */\r\n public async multiPickAsync(xy: IVector2Like[], disposeWhenDone = false): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0 || xy.length === 0) {\r\n return null;\r\n }\r\n\r\n if (xy.length === 1) {\r\n const pi = await this.pickAsync(xy[0].x, xy[0].y, disposeWhenDone);\r\n return {\r\n meshes: [pi?.mesh ?? null],\r\n thinInstanceIndexes: pi?.thinInstanceIndex ? [pi.thinInstanceIndex] : undefined,\r\n };\r\n }\r\n\r\n let minX = xy[0].x,\r\n maxX = xy[0].x,\r\n minY = xy[0].y,\r\n maxY = xy[0].y;\r\n\r\n for (let i = 1; i < xy.length; i++) {\r\n const { x, y } = xy[i];\r\n minX = Math.min(minX, x);\r\n maxX = Math.max(maxX, x);\r\n minY = Math.min(minY, y);\r\n maxY = Math.max(maxY, y);\r\n }\r\n\r\n const { rttSizeW, rttSizeH } = this._prepareForPicking(minX, minY);\r\n const w = Math.max(maxX - minX, 1);\r\n const h = Math.max(maxY - minY, 1);\r\n const partialCutH = rttSizeH - maxY - 1;\r\n\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, minX, partialCutH, w, h);\r\n\r\n return await this._executeMultiPicking(xy, minX, maxY, rttSizeH, w, h, disposeWhenDone);\r\n }\r\n\r\n private _prepareForPicking(x: number, y: number) {\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 const intX = (devicePixelRatio * x) >> 0;\r\n const intY = (devicePixelRatio * y) >> 0;\r\n\r\n return { x: intX, y: intY, rttSizeW, rttSizeH };\r\n }\r\n\r\n private _preparePickingBuffer(engine: AbstractEngine, rttSizeW: number, rttSizeH: number, x: number, y: number, w = 1, h = 1) {\r\n this._meshRenderingCount = 0;\r\n\r\n const requiredBufferSize = engine.isWebGPU ? (4 * w * h + 255) & ~255 : 4 * w * h;\r\n if (!this._readbuffer || this._readbuffer.length < requiredBufferSize) {\r\n this._readbuffer = new Uint8Array(requiredBufferSize);\r\n }\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTexture!.onBeforeRender = () => {\r\n this._enableScissor(x, y, w, h);\r\n };\r\n\r\n this._cachedScene!.customRenderTargets.push(this._pickingTexture!);\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(this._cachedScene!, rttSizeW, rttSizeH);\r\n this._updateRenderList();\r\n }\r\n }\r\n\r\n // pick one pixel\r\n private _executePicking(x: number, y: number, disposeWhenDone: boolean): Promise<Nullable<IGPUPickingInfo>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n reject();\r\n }\r\n this._pickingTexture!.onAfterRender = async () => {\r\n this._disableScissor();\r\n\r\n if (this._checkRenderStatus()) {\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.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._getColorIdFromReadBuffer(0);\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 if (disposeWhenDone) {\r\n this.dispose();\r\n }\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 // pick multiple pixels\r\n private _executeMultiPicking(\r\n xy: IVector2Like[],\r\n minX: number,\r\n maxY: number,\r\n rttSizeH: number,\r\n w: number,\r\n h: number,\r\n disposeWhenDone: boolean\r\n ): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n reject();\r\n }\r\n\r\n this._pickingTexture!.onAfterRender = async () => {\r\n this._disableScissor();\r\n\r\n if (this._checkRenderStatus()) {\r\n const pickedMeshes: Nullable<AbstractMesh>[] = [];\r\n const thinInstanceIndexes: number[] = [];\r\n\r\n if (await this._readTexturePixelsAsync(minX, rttSizeH - maxY - 1, w, h)) {\r\n for (let i = 0; i < xy.length; i++) {\r\n const { pickedMesh, thinInstanceIndex } = this._getMeshFromMultiplePoints(xy[i].x, xy[i].y, minX, maxY, w);\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(thinInstanceIndex ?? 0);\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes });\r\n }\r\n };\r\n });\r\n }\r\n\r\n private _enableScissor(x: number, y: number, w = 1, h = 1) {\r\n if ((this._engine as WebGPUEngine | Engine).enableScissor) {\r\n (this._engine as WebGPUEngine | Engine).enableScissor(x, y, w, h);\r\n }\r\n }\r\n private _disableScissor() {\r\n if ((this._engine as WebGPUEngine | Engine).disableScissor) {\r\n (this._engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n }\r\n\r\n /**\r\n * @returns true if rendering if the picking texture has finished, otherwise false\r\n */\r\n private _checkRenderStatus(): boolean {\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.customRenderTargets.splice(index, 1);\r\n }\r\n return true;\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n return false; // Wait for shaders to be ready\r\n }\r\n\r\n private _getMeshFromMultiplePoints(x: number, y: number, minX: number, maxY: number, w: number): { pickedMesh: Nullable<AbstractMesh>; thinInstanceIndex: number | undefined } {\r\n let offsetX = (x - minX - 1) * 4;\r\n let offsetY = (maxY - y - 1) * w * 4;\r\n\r\n offsetX = Math.max(offsetX, 0);\r\n offsetY = Math.max(offsetY, 0);\r\n\r\n const colorId = this._getColorIdFromReadBuffer(offsetX + offsetY);\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined;\r\n\r\n if (colorId > 0) {\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 return { pickedMesh, thinInstanceIndex };\r\n }\r\n\r\n /**\r\n * Updates the render list with the current pickable meshes.\r\n */\r\n private _updateRenderList() {\r\n this._pickingTexture!.renderList = [];\r\n for (const mesh of this._pickableMeshes!) {\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 private async _readTexturePixelsAsync(x: number, y: number, w = 1, h = 1) {\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, w, h, -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"]}
|
|
1
|
+
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { 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 { IColor3Like, IVector2Like } from \"core/Maths/math.like\";\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 * Stores the result of a multi GPU piciking operation\r\n */\r\nexport interface IGPUMultiPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n meshes: Nullable<AbstractMesh>[];\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndexes?: 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 _engine: Nullable<AbstractEngine>;\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 private static _TempColor: IColor3Like = {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n };\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 _pickingInProgress = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the picking is in progress\r\n */\r\n public get pickingInProgress() {\r\n return this._pickingInProgress;\r\n }\r\n\r\n private static _IdToRgb(id: number) {\r\n GPUPicker._TempColor.r = (id & 0xff0000) >> 16;\r\n GPUPicker._TempColor.g = (id & 0x00ff00) >> 8;\r\n GPUPicker._TempColor.b = (id & 0x0000ff) >> 0;\r\n }\r\n\r\n private _getColorIdFromReadBuffer(offset: number) {\r\n const r = this._readbuffer[offset];\r\n const g = this._readbuffer[offset + 1];\r\n const b = this._readbuffer[offset + 2];\r\n return (r << 16) + (g << 8) + b;\r\n }\r\n\r\n private static _SetColorData(buffer: Float32Array, i: number, r: number, g: number, b: number) {\r\n buffer[i] = r / 255.0;\r\n buffer[i + 1] = g / 255.0;\r\n buffer[i + 2] = b / 255.0;\r\n buffer[i + 3] = 1.0;\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 GPUPicker._SetColorData(colorData, 0, r, g, b);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n GPUPicker._IdToRgb(id);\r\n\r\n onInstance(i, id);\r\n GPUPicker._SetColorData(colorData, (i + 1) * 4, GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.b);\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 GPUPicker._IdToRgb(id);\r\n\r\n onInstance(i, id);\r\n GPUPicker._SetColorData(colorData, i * 4, GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.b);\r\n\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 this._engine = scene.getEngine();\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 GPUPicker._IdToRgb(id);\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, GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\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(GPUPicker._TempColor.r, GPUPicker._TempColor.g, GPUPicker._TempColor.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._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return null;\r\n }\r\n\r\n const { x: adjustedX, y: adjustedY, rttSizeW, rttSizeH } = this._prepareForPicking(x, y);\r\n if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) {\r\n return null;\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n // Invert Y\r\n const invertedY = rttSizeH - adjustedY - 1;\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, adjustedX, invertedY);\r\n\r\n return this._executePicking(adjustedX, invertedY, disposeWhenDone);\r\n }\r\n\r\n /**\r\n * Execute a picking operation on multiple coordinates\r\n * @param xy defines the X,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. Always returns an array with the same length as the number of coordinates. The mesh or null at the index where no mesh was picked.\r\n */\r\n public async multiPickAsync(xy: IVector2Like[], disposeWhenDone = false): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n if (this._pickingInProgress) {\r\n return null;\r\n }\r\n\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0 || xy.length === 0) {\r\n return null;\r\n }\r\n\r\n if (xy.length === 1) {\r\n const pi = await this.pickAsync(xy[0].x, xy[0].y, disposeWhenDone);\r\n return {\r\n meshes: [pi?.mesh ?? null],\r\n thinInstanceIndexes: pi?.thinInstanceIndex ? [pi.thinInstanceIndex] : undefined,\r\n };\r\n }\r\n\r\n this._pickingInProgress = true;\r\n\r\n let minX = xy[0].x,\r\n maxX = xy[0].x,\r\n minY = xy[0].y,\r\n maxY = xy[0].y;\r\n\r\n for (let i = 1; i < xy.length; i++) {\r\n const { x, y } = xy[i];\r\n minX = Math.min(minX, x);\r\n maxX = Math.max(maxX, x);\r\n minY = Math.min(minY, y);\r\n maxY = Math.max(maxY, y);\r\n }\r\n\r\n const { rttSizeW, rttSizeH } = this._prepareForPicking(minX, minY);\r\n const w = Math.max(maxX - minX, 1);\r\n const h = Math.max(maxY - minY, 1);\r\n const partialCutH = rttSizeH - maxY - 1;\r\n\r\n this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, minX, partialCutH, w, h);\r\n\r\n return this._executeMultiPicking(xy, minX, maxY, rttSizeH, w, h, disposeWhenDone);\r\n }\r\n\r\n private _prepareForPicking(x: number, y: number) {\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 const intX = (devicePixelRatio * x) >> 0;\r\n const intY = (devicePixelRatio * y) >> 0;\r\n\r\n return { x: intX, y: intY, rttSizeW, rttSizeH };\r\n }\r\n\r\n private _preparePickingBuffer(engine: AbstractEngine, rttSizeW: number, rttSizeH: number, x: number, y: number, w = 1, h = 1) {\r\n this._meshRenderingCount = 0;\r\n\r\n const requiredBufferSize = engine.isWebGPU ? (4 * w * h + 255) & ~255 : 4 * w * h;\r\n if (!this._readbuffer || this._readbuffer.length < requiredBufferSize) {\r\n this._readbuffer = new Uint8Array(requiredBufferSize);\r\n }\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(this._cachedScene!, rttSizeW, rttSizeH);\r\n this._updateRenderList();\r\n }\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTexture!.onBeforeRender = () => {\r\n this._enableScissor(x, y, w, h);\r\n };\r\n\r\n this._cachedScene!.customRenderTargets.push(this._pickingTexture!);\r\n }\r\n\r\n // pick one pixel\r\n private _executePicking(x: number, y: number, disposeWhenDone: boolean): Promise<Nullable<IGPUPickingInfo>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject();\r\n return;\r\n }\r\n\r\n this._pickingTexture!.onAfterRender = async () => {\r\n this._disableScissor();\r\n\r\n if (this._checkRenderStatus()) {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.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._getColorIdFromReadBuffer(0);\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 if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\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 // pick multiple pixels\r\n private _executeMultiPicking(\r\n xy: IVector2Like[],\r\n minX: number,\r\n maxY: number,\r\n rttSizeH: number,\r\n w: number,\r\n h: number,\r\n disposeWhenDone: boolean\r\n ): Promise<Nullable<IGPUMultiPickingInfo>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this._pickingTexture) {\r\n this._pickingInProgress = false;\r\n reject();\r\n return;\r\n }\r\n\r\n this._pickingTexture!.onAfterRender = async () => {\r\n this._disableScissor();\r\n\r\n if (this._checkRenderStatus()) {\r\n this._pickingTexture!.onAfterRender = null as any;\r\n const pickedMeshes: Nullable<AbstractMesh>[] = [];\r\n const thinInstanceIndexes: number[] = [];\r\n\r\n if (await this._readTexturePixelsAsync(minX, rttSizeH - maxY - 1, w, h)) {\r\n for (let i = 0; i < xy.length; i++) {\r\n const { pickedMesh, thinInstanceIndex } = this._getMeshFromMultiplePoints(xy[i].x, xy[i].y, minX, maxY, w);\r\n pickedMeshes.push(pickedMesh);\r\n thinInstanceIndexes.push(thinInstanceIndex ?? 0);\r\n }\r\n }\r\n\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n\r\n this._pickingInProgress = false;\r\n resolve({ meshes: pickedMeshes, thinInstanceIndexes: thinInstanceIndexes });\r\n }\r\n };\r\n });\r\n }\r\n\r\n private _enableScissor(x: number, y: number, w = 1, h = 1) {\r\n if ((this._engine as WebGPUEngine | Engine).enableScissor) {\r\n (this._engine as WebGPUEngine | Engine).enableScissor(x, y, w, h);\r\n }\r\n }\r\n private _disableScissor() {\r\n if ((this._engine as WebGPUEngine | Engine).disableScissor) {\r\n (this._engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n }\r\n\r\n /**\r\n * @returns true if rendering if the picking texture has finished, otherwise false\r\n */\r\n private _checkRenderStatus(): boolean {\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = this._cachedScene!.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n this._cachedScene!.customRenderTargets.splice(index, 1);\r\n }\r\n return true;\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n return false; // Wait for shaders to be ready\r\n }\r\n\r\n private _getMeshFromMultiplePoints(x: number, y: number, minX: number, maxY: number, w: number): { pickedMesh: Nullable<AbstractMesh>; thinInstanceIndex: number | undefined } {\r\n let offsetX = (x - minX - 1) * 4;\r\n let offsetY = (maxY - y - 1) * w * 4;\r\n\r\n offsetX = Math.max(offsetX, 0);\r\n offsetY = Math.max(offsetY, 0);\r\n\r\n const colorId = this._getColorIdFromReadBuffer(offsetX + offsetY);\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined;\r\n\r\n if (colorId > 0) {\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 return { pickedMesh, thinInstanceIndex };\r\n }\r\n\r\n /**\r\n * Updates the render list with the current pickable meshes.\r\n */\r\n private _updateRenderList() {\r\n this._pickingTexture!.renderList = [];\r\n for (const mesh of this._pickableMeshes!) {\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 private async _readTexturePixelsAsync(x: number, y: number, w = 1, h = 1) {\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, w, h, -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"]}
|
|
@@ -741,13 +741,13 @@ export class AbstractEngine {
|
|
|
741
741
|
*/
|
|
742
742
|
// Not mixed with Version for tooling purpose.
|
|
743
743
|
static get NpmPackage() {
|
|
744
|
-
return "babylonjs@7.25.
|
|
744
|
+
return "babylonjs@7.25.2";
|
|
745
745
|
}
|
|
746
746
|
/**
|
|
747
747
|
* Returns the current version of the framework
|
|
748
748
|
*/
|
|
749
749
|
static get Version() {
|
|
750
|
-
return "7.25.
|
|
750
|
+
return "7.25.2";
|
|
751
751
|
}
|
|
752
752
|
/**
|
|
753
753
|
* Gets the HTML canvas attached with the current webGL context
|