@babylonjs/core 7.21.0 → 7.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/easing.d.ts +20 -20
- package/Animations/easing.js +10 -10
- package/Animations/easing.js.map +1 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js +2 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
- package/Cameras/VR/vrExperienceHelper.d.ts +2 -2
- package/Cameras/VR/vrExperienceHelper.js +1 -1
- package/Cameras/VR/vrExperienceHelper.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +9 -4
- package/Collisions/gpuPicker.js +64 -44
- package/Collisions/gpuPicker.js.map +1 -1
- package/Collisions/index.d.ts +4 -0
- package/Collisions/index.js +4 -0
- package/Collisions/index.js.map +1 -1
- package/Culling/Helper/computeShaderBoundingHelper.js +0 -3
- package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +0 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +0 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/abstractEngine.d.ts +2 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/nativeEngine.js +0 -3
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +2 -1
- package/Engines/thinEngine.js +3 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +3 -1
- package/Engines/webgpuEngine.js +6 -3
- package/Engines/webgpuEngine.js.map +1 -1
- package/Gizmos/gizmo.d.ts +2 -2
- package/Gizmos/gizmo.js +1 -1
- package/Gizmos/gizmo.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -1
- package/Layers/effectLayer.js +18 -16
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.d.ts +1 -1
- package/Layers/glowLayer.js +3 -5
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.d.ts +1 -1
- package/Layers/highlightLayer.js +7 -9
- package/Layers/highlightLayer.js.map +1 -1
- package/Layers/layer.d.ts +0 -1
- package/Layers/layer.js +15 -17
- package/Layers/layer.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.d.ts +0 -3
- package/Lights/Shadows/cascadedShadowGenerator.js +0 -3
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Materials/Background/backgroundMaterial.d.ts +0 -1
- package/Materials/Background/backgroundMaterial.js +20 -20
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +0 -1
- package/Materials/PBR/pbrBaseMaterial.js +34 -39
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/effect.d.ts +7 -2
- package/Materials/effect.js +7 -3
- package/Materials/effect.js.map +1 -1
- package/Materials/shaderMaterial.d.ts +4 -0
- package/Materials/shaderMaterial.js +1 -0
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/standardMaterial.d.ts +0 -1
- package/Materials/standardMaterial.js +20 -20
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.isovector.js +6 -6
- package/Maths/math.isovector.js.map +1 -1
- package/Meshes/Builders/geodesicBuilder.js +2 -2
- package/Meshes/Builders/geodesicBuilder.js.map +1 -1
- package/Meshes/Builders/goldbergBuilder.js +2 -2
- package/Meshes/Builders/goldbergBuilder.js.map +1 -1
- package/Meshes/linesMesh.d.ts +0 -2
- package/Meshes/linesMesh.js +16 -20
- package/Meshes/linesMesh.js.map +1 -1
- package/Misc/assetsManager.d.ts +16 -16
- package/Misc/assetsManager.js +8 -8
- package/Misc/assetsManager.js.map +1 -1
- package/Misc/copyTextureToTexture.d.ts +9 -1
- package/Misc/copyTextureToTexture.js +23 -2
- package/Misc/copyTextureToTexture.js.map +1 -1
- package/Misc/environmentTextureTools.d.ts +0 -2
- package/Misc/environmentTextureTools.js +0 -2
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/index.d.ts +2 -0
- package/Misc/index.js +3 -0
- package/Misc/index.js.map +1 -1
- package/Misc/sceneOptimizer.d.ts +16 -16
- package/Misc/sceneOptimizer.js +8 -8
- package/Misc/sceneOptimizer.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.d.ts +4 -4
- package/Particles/EmitterTypes/coneParticleEmitter.js +2 -2
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +4 -4
- package/Particles/EmitterTypes/cylinderParticleEmitter.js +2 -2
- package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +4 -4
- package/Particles/EmitterTypes/sphereParticleEmitter.js +2 -2
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/particleSystemComponent.d.ts +0 -1
- package/Particles/particleSystemComponent.js +8 -2
- package/Particles/particleSystemComponent.js.map +1 -1
- package/Particles/thinParticleSystem.d.ts +0 -2
- package/Particles/thinParticleSystem.js +0 -2
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Physics/v1/physicsJoint.js +0 -3
- package/Physics/v1/physicsJoint.js.map +1 -1
- package/Physics/v2/physicsConstraint.d.ts +14 -20
- package/Physics/v2/physicsConstraint.js +14 -20
- package/Physics/v2/physicsConstraint.js.map +1 -1
- package/PostProcesses/anaglyphPostProcess.d.ts +1 -2
- package/PostProcesses/anaglyphPostProcess.js +4 -5
- package/PostProcesses/anaglyphPostProcess.js.map +1 -1
- package/PostProcesses/blackAndWhitePostProcess.d.ts +1 -1
- package/PostProcesses/blackAndWhitePostProcess.js +4 -4
- package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
- package/PostProcesses/bloomMergePostProcess.d.ts +1 -1
- package/PostProcesses/bloomMergePostProcess.js +4 -4
- package/PostProcesses/bloomMergePostProcess.js.map +1 -1
- package/PostProcesses/blurPostProcess.d.ts +1 -3
- package/PostProcesses/blurPostProcess.js +4 -6
- package/PostProcesses/blurPostProcess.js.map +1 -1
- package/PostProcesses/chromaticAberrationPostProcess.d.ts +1 -1
- package/PostProcesses/chromaticAberrationPostProcess.js +4 -4
- package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
- package/PostProcesses/circleOfConfusionPostProcess.d.ts +1 -1
- package/PostProcesses/circleOfConfusionPostProcess.js +4 -4
- package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
- package/PostProcesses/colorCorrectionPostProcess.d.ts +1 -1
- package/PostProcesses/colorCorrectionPostProcess.js +4 -4
- package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
- package/PostProcesses/convolutionPostProcess.d.ts +1 -1
- package/PostProcesses/convolutionPostProcess.js +4 -4
- package/PostProcesses/convolutionPostProcess.js.map +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.d.ts +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.js +4 -4
- package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
- package/PostProcesses/displayPassPostProcess.d.ts +1 -1
- package/PostProcesses/displayPassPostProcess.js +10 -1
- package/PostProcesses/displayPassPostProcess.js.map +1 -1
- package/PostProcesses/extractHighlightsPostProcess.d.ts +1 -1
- package/PostProcesses/extractHighlightsPostProcess.js +4 -4
- package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
- package/PostProcesses/filterPostProcess.d.ts +1 -1
- package/PostProcesses/filterPostProcess.js +10 -1
- package/PostProcesses/filterPostProcess.js.map +1 -1
- package/PostProcesses/fxaaPostProcess.d.ts +1 -1
- package/PostProcesses/fxaaPostProcess.js +4 -4
- package/PostProcesses/fxaaPostProcess.js.map +1 -1
- package/PostProcesses/grainPostProcess.d.ts +1 -2
- package/PostProcesses/grainPostProcess.js +4 -5
- package/PostProcesses/grainPostProcess.js.map +1 -1
- package/PostProcesses/highlightsPostProcess.d.ts +1 -1
- package/PostProcesses/highlightsPostProcess.js +10 -1
- package/PostProcesses/highlightsPostProcess.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.d.ts +1 -1
- package/PostProcesses/imageProcessingPostProcess.js +4 -4
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/index.d.ts +8 -0
- package/PostProcesses/index.js +12 -0
- package/PostProcesses/index.js.map +1 -1
- package/PostProcesses/motionBlurPostProcess.d.ts +1 -1
- package/PostProcesses/motionBlurPostProcess.js +4 -4
- package/PostProcesses/motionBlurPostProcess.js.map +1 -1
- package/PostProcesses/passPostProcess.d.ts +2 -2
- package/PostProcesses/passPostProcess.js +8 -8
- package/PostProcesses/passPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +5 -4
- package/PostProcesses/postProcess.js +14 -27
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/sharpenPostProcess.d.ts +1 -1
- package/PostProcesses/sharpenPostProcess.js +4 -4
- package/PostProcesses/sharpenPostProcess.js.map +1 -1
- package/PostProcesses/tonemapPostProcess.d.ts +1 -1
- package/PostProcesses/tonemapPostProcess.js +10 -1
- package/PostProcesses/tonemapPostProcess.js.map +1 -1
- package/PostProcesses/vrDistortionCorrectionPostProcess.d.ts +1 -1
- package/PostProcesses/vrDistortionCorrectionPostProcess.js +4 -4
- package/PostProcesses/vrDistortionCorrectionPostProcess.js.map +1 -1
- package/ShadersWGSL/copyTextureToTexture.fragment.d.ts +6 -0
- package/ShadersWGSL/copyTextureToTexture.fragment.js +21 -0
- package/ShadersWGSL/copyTextureToTexture.fragment.js.map +1 -0
- package/ShadersWGSL/displayPass.fragment.d.ts +5 -0
- package/ShadersWGSL/displayPass.fragment.js +12 -0
- package/ShadersWGSL/displayPass.fragment.js.map +1 -0
- package/ShadersWGSL/filter.fragment.d.ts +5 -0
- package/ShadersWGSL/filter.fragment.js +12 -0
- package/ShadersWGSL/filter.fragment.js.map +1 -0
- package/ShadersWGSL/highlights.fragment.d.ts +5 -0
- package/ShadersWGSL/highlights.fragment.js +12 -0
- package/ShadersWGSL/highlights.fragment.js.map +1 -0
- package/ShadersWGSL/picking.fragment.d.ts +5 -0
- package/ShadersWGSL/picking.fragment.js +21 -0
- package/ShadersWGSL/picking.fragment.js.map +1 -0
- package/ShadersWGSL/picking.vertex.d.ts +15 -0
- package/ShadersWGSL/picking.vertex.js +43 -0
- package/ShadersWGSL/picking.vertex.js.map +1 -0
- package/ShadersWGSL/tonemap.fragment.d.ts +5 -0
- package/ShadersWGSL/tonemap.fragment.js +29 -0
- package/ShadersWGSL/tonemap.fragment.js.map +1 -0
- package/XR/features/WebXRControllerPointerSelection.js +1 -1
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/package.json +1 -1
package/Collisions/gpuPicker.js
CHANGED
|
@@ -3,32 +3,43 @@ import { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture.j
|
|
|
3
3
|
import { ShaderMaterial } from "../Materials/shaderMaterial.js";
|
|
4
4
|
import { Color3, Color4 } from "../Maths/math.color.js";
|
|
5
5
|
import { VertexBuffer } from "../Meshes/buffer.js";
|
|
6
|
-
import "../Shaders/picking.fragment.js";
|
|
7
|
-
import "../Shaders/picking.vertex.js";
|
|
8
6
|
/**
|
|
9
7
|
* Class used to perform a picking operation using GPU
|
|
10
8
|
* Please note that GPUPIcker cannot pick instances, only meshes
|
|
11
9
|
*/
|
|
12
10
|
export class GPUPicker {
|
|
13
11
|
constructor() {
|
|
14
|
-
this.
|
|
12
|
+
this._pickingTexture = null;
|
|
15
13
|
this._idMap = [];
|
|
16
14
|
this._thinIdMap = [];
|
|
17
15
|
this._idColors = [];
|
|
18
16
|
this._meshMaterialMap = new Map();
|
|
19
17
|
this._meshRenderingCount = 0;
|
|
20
18
|
this._attributeName = "instanceMeshID";
|
|
19
|
+
/** Shader language used by the generator */
|
|
20
|
+
this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Gets the shader language used in this generator.
|
|
24
|
+
*/
|
|
25
|
+
get shaderLanguage() {
|
|
26
|
+
return this._shaderLanguage;
|
|
21
27
|
}
|
|
22
28
|
_createRenderTarget(scene, width, height) {
|
|
23
|
-
if (this.
|
|
24
|
-
this.
|
|
29
|
+
if (this._pickingTexture) {
|
|
30
|
+
this._pickingTexture.dispose();
|
|
25
31
|
}
|
|
26
|
-
this.
|
|
32
|
+
this._pickingTexture = new RenderTargetTexture("pickingTexure", { width: width, height: height }, scene, false, undefined, 0, false, 1);
|
|
27
33
|
}
|
|
28
|
-
|
|
34
|
+
async _createColorMaterialAsync(scene) {
|
|
29
35
|
if (this._defaultRenderMaterial) {
|
|
30
36
|
this._defaultRenderMaterial.dispose();
|
|
31
37
|
}
|
|
38
|
+
this._defaultRenderMaterial = null;
|
|
39
|
+
const engine = scene.getEngine();
|
|
40
|
+
if (engine.isWebGPU) {
|
|
41
|
+
this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
|
42
|
+
}
|
|
32
43
|
const defines = [];
|
|
33
44
|
const options = {
|
|
34
45
|
attributes: [VertexBuffer.PositionKind, this._attributeName, "bakedVertexAnimationSettingsInstanced"],
|
|
@@ -36,6 +47,15 @@ export class GPUPicker {
|
|
|
36
47
|
needAlphaBlending: false,
|
|
37
48
|
defines: defines,
|
|
38
49
|
useClipPlane: null,
|
|
50
|
+
shaderLanguage: this._shaderLanguage,
|
|
51
|
+
extraInitializationsAsync: async () => {
|
|
52
|
+
if (this.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
53
|
+
await Promise.all([import("../ShadersWGSL/picking.fragment.js"), import("../ShadersWGSL/picking.vertex.js")]);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
await Promise.all([import("../Shaders/picking.fragment.js"), import("../Shaders/picking.vertex.js")]);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
39
59
|
};
|
|
40
60
|
this._defaultRenderMaterial = new ShaderMaterial("pickingShader", scene, "picking", options, false);
|
|
41
61
|
this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
|
|
@@ -102,8 +122,8 @@ export class GPUPicker {
|
|
|
102
122
|
if (mesh.hasThinInstances) {
|
|
103
123
|
mesh.thinInstanceSetBuffer(this._attributeName, null);
|
|
104
124
|
}
|
|
105
|
-
if (this.
|
|
106
|
-
this.
|
|
125
|
+
if (this._pickingTexture) {
|
|
126
|
+
this._pickingTexture.setMaterialForRendering(mesh, undefined);
|
|
107
127
|
}
|
|
108
128
|
const material = this._meshMaterialMap.get(mesh);
|
|
109
129
|
if (material !== this._defaultRenderMaterial) {
|
|
@@ -115,30 +135,32 @@ export class GPUPicker {
|
|
|
115
135
|
this._idMap.length = 0;
|
|
116
136
|
this._thinIdMap.length = 0;
|
|
117
137
|
this._idColors.length = 0;
|
|
118
|
-
if (this.
|
|
119
|
-
this.
|
|
138
|
+
if (this._pickingTexture) {
|
|
139
|
+
this._pickingTexture.renderList = [];
|
|
120
140
|
}
|
|
121
141
|
}
|
|
122
142
|
if (!list || list.length === 0) {
|
|
123
143
|
return;
|
|
124
144
|
}
|
|
145
|
+
this._pickableMeshes = list;
|
|
125
146
|
// Prepare target
|
|
126
147
|
const scene = ("mesh" in list[0] ? list[0].mesh : list[0]).getScene();
|
|
127
148
|
const engine = scene.getEngine();
|
|
128
149
|
const rttSizeW = engine.getRenderWidth();
|
|
129
150
|
const rttSizeH = engine.getRenderHeight();
|
|
130
|
-
if (!this.
|
|
151
|
+
if (!this._pickingTexture) {
|
|
131
152
|
this._createRenderTarget(scene, rttSizeW, rttSizeH);
|
|
132
153
|
}
|
|
133
154
|
else {
|
|
134
|
-
const size = this.
|
|
155
|
+
const size = this._pickingTexture.getSize();
|
|
135
156
|
if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {
|
|
136
157
|
this._createRenderTarget(scene, rttSizeW, rttSizeH);
|
|
137
158
|
}
|
|
138
159
|
}
|
|
139
160
|
if (!this._cachedScene || this._cachedScene !== scene) {
|
|
140
|
-
this.
|
|
161
|
+
this._createColorMaterialAsync(scene);
|
|
141
162
|
}
|
|
163
|
+
this._cachedScene = scene;
|
|
142
164
|
for (let i = 0; i < list.length; i++) {
|
|
143
165
|
const item = list[i];
|
|
144
166
|
if ("mesh" in item) {
|
|
@@ -149,9 +171,7 @@ export class GPUPicker {
|
|
|
149
171
|
this._meshMaterialMap.set(item, this._defaultRenderMaterial);
|
|
150
172
|
}
|
|
151
173
|
}
|
|
152
|
-
this.
|
|
153
|
-
this._cachedScene = scene;
|
|
154
|
-
this._pickingTexure.renderList = [];
|
|
174
|
+
this._pickingTexture.renderList = [];
|
|
155
175
|
// We will affect colors and create vertex color buffers
|
|
156
176
|
let id = 1;
|
|
157
177
|
for (let index = 0; index < this._pickableMeshes.length; index++) {
|
|
@@ -160,8 +180,8 @@ export class GPUPicker {
|
|
|
160
180
|
if (material !== this._defaultRenderMaterial) {
|
|
161
181
|
material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);
|
|
162
182
|
}
|
|
163
|
-
this.
|
|
164
|
-
this.
|
|
183
|
+
this._pickingTexture.setMaterialForRendering(mesh, material);
|
|
184
|
+
this._pickingTexture.renderList.push(mesh);
|
|
165
185
|
if (mesh.isAnInstance) {
|
|
166
186
|
continue; // This will be handled by the source mesh
|
|
167
187
|
}
|
|
@@ -202,7 +222,7 @@ export class GPUPicker {
|
|
|
202
222
|
* @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)
|
|
203
223
|
* @returns A promise with the picking results
|
|
204
224
|
*/
|
|
205
|
-
pickAsync(x, y, disposeWhenDone = false) {
|
|
225
|
+
async pickAsync(x, y, disposeWhenDone = false) {
|
|
206
226
|
if (!this._pickableMeshes || this._pickableMeshes.length === 0) {
|
|
207
227
|
return Promise.resolve(null);
|
|
208
228
|
}
|
|
@@ -211,20 +231,6 @@ export class GPUPicker {
|
|
|
211
231
|
const rttSizeW = engine.getRenderWidth();
|
|
212
232
|
const rttSizeH = engine.getRenderHeight();
|
|
213
233
|
const devicePixelRatio = 1 / engine._hardwareScalingLevel;
|
|
214
|
-
if (!this._readbuffer) {
|
|
215
|
-
this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU
|
|
216
|
-
}
|
|
217
|
-
// Do we need to rebuild the RTT?
|
|
218
|
-
const size = this._pickingTexure.getSize();
|
|
219
|
-
if (size.width !== rttSizeW || size.height !== rttSizeH) {
|
|
220
|
-
this._createRenderTarget(scene, rttSizeW, rttSizeH);
|
|
221
|
-
this._pickingTexure.renderList = [];
|
|
222
|
-
for (let index = 0; index < this._pickableMeshes.length; index++) {
|
|
223
|
-
const mesh = this._pickableMeshes[index];
|
|
224
|
-
this._pickingTexure.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));
|
|
225
|
-
this._pickingTexure.renderList.push(mesh);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
234
|
this._meshRenderingCount = 0;
|
|
229
235
|
// Ensure ints and adapt to screen resolution
|
|
230
236
|
x = (devicePixelRatio * x) >> 0;
|
|
@@ -232,23 +238,37 @@ export class GPUPicker {
|
|
|
232
238
|
if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {
|
|
233
239
|
return Promise.resolve(null);
|
|
234
240
|
}
|
|
241
|
+
if (!this._readbuffer) {
|
|
242
|
+
this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU
|
|
243
|
+
}
|
|
235
244
|
// Invert Y
|
|
236
245
|
y = rttSizeH - y;
|
|
237
|
-
this.
|
|
238
|
-
|
|
239
|
-
this._pickingTexure.onBeforeRender = () => {
|
|
246
|
+
this._pickingTexture.clearColor = new Color4(0, 0, 0, 0);
|
|
247
|
+
this._pickingTexture.onBeforeRender = () => {
|
|
240
248
|
// Enable scissor
|
|
241
249
|
if (engine.enableScissor) {
|
|
242
250
|
engine.enableScissor(x, y, 1, 1);
|
|
243
251
|
}
|
|
244
252
|
};
|
|
253
|
+
scene.customRenderTargets.push(this._pickingTexture);
|
|
254
|
+
// Do we need to rebuild the RTT?
|
|
255
|
+
const size = this._pickingTexture.getSize();
|
|
256
|
+
if (size.width !== rttSizeW || size.height !== rttSizeH) {
|
|
257
|
+
this._createRenderTarget(scene, rttSizeW, rttSizeH);
|
|
258
|
+
this._pickingTexture.renderList = [];
|
|
259
|
+
for (let index = 0; index < this._pickableMeshes.length; index++) {
|
|
260
|
+
const mesh = this._pickableMeshes[index];
|
|
261
|
+
this._pickingTexture.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh));
|
|
262
|
+
this._pickingTexture.renderList.push(mesh);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
245
265
|
return new Promise((resolve, reject) => {
|
|
246
|
-
this.
|
|
266
|
+
this._pickingTexture.onAfterRender = async () => {
|
|
247
267
|
// Disable scissor
|
|
248
268
|
if (engine.disableScissor) {
|
|
249
269
|
engine.disableScissor();
|
|
250
270
|
}
|
|
251
|
-
if (!this.
|
|
271
|
+
if (!this._pickingTexture) {
|
|
252
272
|
reject();
|
|
253
273
|
}
|
|
254
274
|
let pickedMesh = null;
|
|
@@ -256,7 +276,7 @@ export class GPUPicker {
|
|
|
256
276
|
const wasSuccessfull = this._meshRenderingCount > 0;
|
|
257
277
|
if (wasSuccessfull) {
|
|
258
278
|
// Remove from the active RTTs
|
|
259
|
-
const index = scene.customRenderTargets.indexOf(this.
|
|
279
|
+
const index = scene.customRenderTargets.indexOf(this._pickingTexture);
|
|
260
280
|
if (index > -1) {
|
|
261
281
|
scene.customRenderTargets.splice(index, 1);
|
|
262
282
|
}
|
|
@@ -296,11 +316,11 @@ export class GPUPicker {
|
|
|
296
316
|
});
|
|
297
317
|
}
|
|
298
318
|
async _readTexturePixelsAsync(x, y) {
|
|
299
|
-
if (!this._cachedScene || !this.
|
|
319
|
+
if (!this._cachedScene || !this._pickingTexture?._texture) {
|
|
300
320
|
return false;
|
|
301
321
|
}
|
|
302
322
|
const engine = this._cachedScene.getEngine();
|
|
303
|
-
await engine._readTexturePixels(this.
|
|
323
|
+
await engine._readTexturePixels(this._pickingTexture._texture, 1, 1, -1, 0, this._readbuffer, true, true, x, y);
|
|
304
324
|
return true;
|
|
305
325
|
}
|
|
306
326
|
/** Release the resources */
|
|
@@ -308,8 +328,8 @@ export class GPUPicker {
|
|
|
308
328
|
this.setPickingList(null);
|
|
309
329
|
this._cachedScene = null;
|
|
310
330
|
// Cleaning up
|
|
311
|
-
this.
|
|
312
|
-
this.
|
|
331
|
+
this._pickingTexture?.dispose();
|
|
332
|
+
this._pickingTexture = null;
|
|
313
333
|
this._defaultRenderMaterial?.dispose();
|
|
314
334
|
this._defaultRenderMaterial = null;
|
|
315
335
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { 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\nimport \"../Shaders/picking.fragment\";\r\nimport \"../Shaders/picking.vertex\";\r\n\r\n/**\r\n * Class used to store the result of a GPU picking operation\r\n */\r\nexport interface IGPUPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n mesh: AbstractMesh;\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndex?: number;\r\n}\r\n\r\n/**\r\n * Class used to perform a picking operation using GPU\r\n * Please note that GPUPIcker cannot pick instances, only meshes\r\n */\r\nexport class GPUPicker {\r\n private _pickingTexure: Nullable<RenderTargetTexture> = null;\r\n private _idMap: Array<number> = [];\r\n private _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private _idColors: Array<Color3> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _defaultRenderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _meshMaterialMap: Map<AbstractMesh, ShaderMaterial> = new Map();\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private readonly _attributeName = \"instanceMeshID\";\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n if (this._pickingTexure) {\r\n this._pickingTexure.dispose();\r\n }\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._defaultRenderMaterial) {\r\n this._defaultRenderMaterial.dispose();\r\n }\r\n\r\n const defines: string[] = [];\r\n const options = {\r\n attributes: [VertexBuffer.PositionKind, this._attributeName, \"bakedVertexAnimationSettingsInstanced\"],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n };\r\n\r\n this._defaultRenderMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n\r\n this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n const effect = material.getEffect()!;\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {\r\n effect.setColor4(\"meshID\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n private _generateColorData(instanceCount: number, id: number, index: number, r: number, g: number, b: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * (instanceCount + 1));\r\n\r\n colorData[0] = r / 255.0;\r\n colorData[1] = g / 255.0;\r\n colorData[2] = b / 255.0;\r\n colorData[3] = 1.0;\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[(i + 1) * 4] = r / 255.0;\r\n colorData[(i + 1) * 4 + 1] = g / 255.0;\r\n colorData[(i + 1) * 4 + 2] = b / 255.0;\r\n colorData[(i + 1) * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n private _generateThinInstanceColorData(instanceCount: number, id: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * instanceCount);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[i * 4] = r / 255.0;\r\n colorData[i * 4 + 1] = g / 255.0;\r\n colorData[i * 4 + 2] = b / 255.0;\r\n colorData[i * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * Set that value to null to clear the list (and avoid leaks)\r\n * The module will read and delete from the array provided by reference. Disposing the module or setting the value to null will clear the array.\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>>) {\r\n if (this._pickableMeshes) {\r\n // Cleanup\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(this._attributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, null);\r\n }\r\n if (this._pickingTexure) {\r\n this._pickingTexure.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._pickingTexure) {\r\n this._pickingTexure.renderList = [];\r\n }\r\n }\r\n if (!list || list.length === 0) {\r\n return;\r\n }\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._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._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 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 this._pickableMeshes = list as Array<AbstractMesh>;\r\n\r\n this._cachedScene = scene;\r\n this._pickingTexure!.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._pickingTexure!.setMaterialForRendering(mesh, material);\r\n this._pickingTexure!.renderList.push(mesh);\r\n\r\n if (mesh.isAnInstance) {\r\n continue; // This will be handled by the source mesh\r\n }\r\n\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n\r\n if (mesh.hasThinInstances) {\r\n const colorData = this._generateThinInstanceColorData((mesh as Mesh).thinInstanceCount, id, (i, id) => {\r\n this._thinIdMap[id] = { meshId: index, thinId: i };\r\n });\r\n id += (mesh as Mesh).thinInstanceCount;\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, colorData, 4);\r\n } else {\r\n this._idMap[id] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\r\n id += instances.length;\r\n const engine = mesh.getEngine();\r\n\r\n const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute a picking operation\r\n * @param x defines the X coordinates where to run the pick\r\n * @param y defines the Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results\r\n */\r\n public pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const scene = this._cachedScene!;\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n 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 // Do we need to rebuild the RTT?\r\n const size = this._pickingTexure!.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n\r\n this._pickingTexure!.renderList = [];\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexure!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh)!);\r\n this._pickingTexure!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n this._meshRenderingCount = 0;\r\n // Ensure ints and adapt to screen resolution\r\n x = (devicePixelRatio * x) >> 0;\r\n y = (devicePixelRatio * y) >> 0;\r\n\r\n if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n // Invert Y\r\n y = rttSizeH - y;\r\n\r\n this._pickingTexure!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n scene.customRenderTargets.push(this._pickingTexure!);\r\n this._pickingTexure!.onBeforeRender = () => {\r\n // Enable scissor\r\n if ((engine as WebGPUEngine | Engine).enableScissor) {\r\n (engine as WebGPUEngine | Engine).enableScissor(x, y, 1, 1);\r\n }\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n this._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 let thinInstanceIndex: number | undefined = undefined;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._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 r = this._readbuffer[0];\r\n const g = this._readbuffer[1];\r\n const b = this._readbuffer[2];\r\n const colorId = (r << 16) + (g << 8) + b;\r\n\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n }\r\n\r\n // Clean-up\r\n if (!wasSuccessfull) {\r\n this._meshRenderingCount = 0;\r\n return; // We need to wait for the shaders to be ready\r\n } else {\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n if (pickedMesh) {\r\n resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n private async _readTexturePixelsAsync(x: number, y: number) {\r\n if (!this._cachedScene || !this._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 this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexure?.dispose();\r\n this._pickingTexure = null;\r\n this._defaultRenderMaterial?.dispose();\r\n this._defaultRenderMaterial = null;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"gpuPicker.js","sourceRoot":"","sources":["../../../../dev/core/src/Collisions/gpuPicker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { IShaderMaterialOptions } from \"core/Materials/shaderMaterial\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Class used to store the result of a GPU picking operation\r\n */\r\nexport interface IGPUPickingInfo {\r\n /**\r\n * Picked mesh\r\n */\r\n mesh: AbstractMesh;\r\n /**\r\n * Picked thin instance index\r\n */\r\n thinInstanceIndex?: number;\r\n}\r\n\r\n/**\r\n * Class used to perform a picking operation using GPU\r\n * Please note that GPUPIcker cannot pick instances, only meshes\r\n */\r\nexport class GPUPicker {\r\n private _pickingTexture: Nullable<RenderTargetTexture> = null;\r\n private _idMap: Array<number> = [];\r\n private _thinIdMap: Array<{ meshId: number; thinId: number }> = [];\r\n private _idColors: Array<Color3> = [];\r\n private _cachedScene: Nullable<Scene>;\r\n private _defaultRenderMaterial: Nullable<ShaderMaterial>;\r\n private _pickableMeshes: Array<AbstractMesh>;\r\n private _meshMaterialMap: Map<AbstractMesh, ShaderMaterial> = new Map();\r\n private _readbuffer: Uint8Array;\r\n private _meshRenderingCount: number = 0;\r\n private readonly _attributeName = \"instanceMeshID\";\r\n\r\n /** Shader language used by the generator */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this generator.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _createRenderTarget(scene: Scene, width: number, height: number) {\r\n if (this._pickingTexture) {\r\n this._pickingTexture.dispose();\r\n }\r\n this._pickingTexture = new RenderTargetTexture(\r\n \"pickingTexure\",\r\n { width: width, height: height },\r\n scene,\r\n false,\r\n undefined,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Constants.TEXTURE_NEAREST_NEAREST\r\n );\r\n }\r\n\r\n private async _createColorMaterialAsync(scene: Scene) {\r\n if (this._defaultRenderMaterial) {\r\n this._defaultRenderMaterial.dispose();\r\n }\r\n\r\n this._defaultRenderMaterial = null;\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n const defines: string[] = [];\r\n const options: Partial<IShaderMaterialOptions> = {\r\n attributes: [VertexBuffer.PositionKind, this._attributeName, \"bakedVertexAnimationSettingsInstanced\"],\r\n uniforms: [\"world\", \"viewProjection\", \"meshID\"],\r\n needAlphaBlending: false,\r\n defines: defines,\r\n useClipPlane: null,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/picking.fragment\"), import(\"../ShadersWGSL/picking.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/picking.fragment\"), import(\"../Shaders/picking.vertex\")]);\r\n }\r\n },\r\n };\r\n\r\n this._defaultRenderMaterial = new ShaderMaterial(\"pickingShader\", scene, \"picking\", options, false);\r\n\r\n this._defaultRenderMaterial.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n\r\n private _materialBindCallback(mesh: AbstractMesh | undefined) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n const effect = material.getEffect()!;\r\n\r\n if (!mesh.hasInstances && !mesh.isAnInstance && !mesh.hasThinInstances) {\r\n effect.setColor4(\"meshID\", this._idColors[mesh.uniqueId], 1);\r\n }\r\n\r\n this._meshRenderingCount++;\r\n }\r\n\r\n private _generateColorData(instanceCount: number, id: number, index: number, r: number, g: number, b: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * (instanceCount + 1));\r\n\r\n colorData[0] = r / 255.0;\r\n colorData[1] = g / 255.0;\r\n colorData[2] = b / 255.0;\r\n colorData[3] = 1.0;\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[(i + 1) * 4] = r / 255.0;\r\n colorData[(i + 1) * 4 + 1] = g / 255.0;\r\n colorData[(i + 1) * 4 + 2] = b / 255.0;\r\n colorData[(i + 1) * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n private _generateThinInstanceColorData(instanceCount: number, id: number, onInstance: (i: number, id: number) => void) {\r\n const colorData = new Float32Array(4 * instanceCount);\r\n\r\n for (let i = 0; i < instanceCount; i++) {\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n onInstance(i, id);\r\n\r\n colorData[i * 4] = r / 255.0;\r\n colorData[i * 4 + 1] = g / 255.0;\r\n colorData[i * 4 + 2] = b / 255.0;\r\n colorData[i * 4 + 3] = 1.0;\r\n id++;\r\n }\r\n\r\n return colorData;\r\n }\r\n\r\n /**\r\n * Set the list of meshes to pick from\r\n * Set that value to null to clear the list (and avoid leaks)\r\n * The module will read and delete from the array provided by reference. Disposing the module or setting the value to null will clear the array.\r\n * @param list defines the list of meshes to pick from\r\n */\r\n public setPickingList(list: Nullable<Array<AbstractMesh | { mesh: AbstractMesh; material: ShaderMaterial }>>) {\r\n if (this._pickableMeshes) {\r\n // Cleanup\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n if (mesh.hasInstances) {\r\n (mesh as Mesh).removeVerticesData(this._attributeName);\r\n }\r\n if (mesh.hasThinInstances) {\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, null);\r\n }\r\n if (this._pickingTexture) {\r\n this._pickingTexture.setMaterialForRendering(mesh, undefined);\r\n }\r\n\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.removeCallback(this._materialBindCallback);\r\n }\r\n }\r\n this._pickableMeshes.length = 0;\r\n this._meshMaterialMap.clear();\r\n this._idMap.length = 0;\r\n this._thinIdMap.length = 0;\r\n this._idColors.length = 0;\r\n if (this._pickingTexture) {\r\n this._pickingTexture.renderList = [];\r\n }\r\n }\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n\r\n this._pickableMeshes = list as Array<AbstractMesh>;\r\n\r\n // Prepare target\r\n const scene = (\"mesh\" in list[0] ? list[0].mesh : list[0]).getScene();\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n if (!this._pickingTexture) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n } else {\r\n const size = this._pickingTexture.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH || this._cachedScene !== scene) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n }\r\n }\r\n\r\n if (!this._cachedScene || this._cachedScene !== scene) {\r\n this._createColorMaterialAsync(scene);\r\n }\r\n\r\n this._cachedScene = scene;\r\n\r\n for (let i = 0; i < list.length; i++) {\r\n const item = list[i];\r\n if (\"mesh\" in item) {\r\n this._meshMaterialMap.set(item.mesh, item.material);\r\n list[i] = item.mesh;\r\n } else {\r\n this._meshMaterialMap.set(item, this._defaultRenderMaterial!);\r\n }\r\n }\r\n\r\n this._pickingTexture!.renderList = [];\r\n\r\n // We will affect colors and create vertex color buffers\r\n let id = 1;\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n const material = this._meshMaterialMap.get(mesh)!;\r\n\r\n if (material !== this._defaultRenderMaterial) {\r\n material.onBindObservable.add(this._materialBindCallback, undefined, undefined, this);\r\n }\r\n this._pickingTexture!.setMaterialForRendering(mesh, material);\r\n this._pickingTexture!.renderList.push(mesh);\r\n\r\n if (mesh.isAnInstance) {\r\n continue; // This will be handled by the source mesh\r\n }\r\n\r\n const r = (id & 0xff0000) >> 16;\r\n const g = (id & 0x00ff00) >> 8;\r\n const b = (id & 0x0000ff) >> 0;\r\n\r\n if (mesh.hasThinInstances) {\r\n const colorData = this._generateThinInstanceColorData((mesh as Mesh).thinInstanceCount, id, (i, id) => {\r\n this._thinIdMap[id] = { meshId: index, thinId: i };\r\n });\r\n id += (mesh as Mesh).thinInstanceCount;\r\n (mesh as Mesh).thinInstanceSetBuffer(this._attributeName, colorData, 4);\r\n } else {\r\n this._idMap[id] = index;\r\n id++;\r\n\r\n if (mesh.hasInstances) {\r\n const instances = (mesh as Mesh).instances;\r\n const colorData = this._generateColorData(instances.length, id, index, r, g, b, (i, id) => {\r\n const instance = instances[i];\r\n this._idMap[id] = this._pickableMeshes.indexOf(instance);\r\n });\r\n id += instances.length;\r\n const engine = mesh.getEngine();\r\n\r\n const buffer = new VertexBuffer(engine, colorData, this._attributeName, false, false, 4, true);\r\n (mesh as Mesh).setVerticesBuffer(buffer, true);\r\n } else {\r\n this._idColors[mesh.uniqueId] = Color3.FromInts(r, g, b);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute a picking operation\r\n * @param x defines the X coordinates where to run the pick\r\n * @param y defines the Y coordinates where to run the pick\r\n * @param disposeWhenDone defines a boolean indicating we do not want to keep resources alive (false by default)\r\n * @returns A promise with the picking results\r\n */\r\n public async pickAsync(x: number, y: number, disposeWhenDone = false): Promise<Nullable<IGPUPickingInfo>> {\r\n if (!this._pickableMeshes || this._pickableMeshes.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const scene = this._cachedScene!;\r\n const engine = scene.getEngine();\r\n const rttSizeW = engine.getRenderWidth();\r\n const rttSizeH = engine.getRenderHeight();\r\n const devicePixelRatio = 1 / engine._hardwareScalingLevel;\r\n\r\n this._meshRenderingCount = 0;\r\n\r\n // Ensure ints and adapt to screen resolution\r\n x = (devicePixelRatio * x) >> 0;\r\n y = (devicePixelRatio * y) >> 0;\r\n\r\n if (x < 0 || y < 0 || x >= rttSizeW || y >= rttSizeH) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (!this._readbuffer) {\r\n this._readbuffer = new Uint8Array(engine.isWebGPU ? 256 : 4); // Because of block alignment in WebGPU\r\n }\r\n\r\n // Invert Y\r\n y = rttSizeH - y;\r\n\r\n this._pickingTexture!.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n this._pickingTexture!.onBeforeRender = () => {\r\n // Enable scissor\r\n if ((engine as WebGPUEngine | Engine).enableScissor) {\r\n (engine as WebGPUEngine | Engine).enableScissor(x, y, 1, 1);\r\n }\r\n };\r\n\r\n scene.customRenderTargets.push(this._pickingTexture!);\r\n\r\n // Do we need to rebuild the RTT?\r\n const size = this._pickingTexture!.getSize();\r\n\r\n if (size.width !== rttSizeW || size.height !== rttSizeH) {\r\n this._createRenderTarget(scene, rttSizeW, rttSizeH);\r\n\r\n this._pickingTexture!.renderList = [];\r\n for (let index = 0; index < this._pickableMeshes.length; index++) {\r\n const mesh = this._pickableMeshes[index];\r\n this._pickingTexture!.setMaterialForRendering(mesh, this._meshMaterialMap.get(mesh)!);\r\n this._pickingTexture!.renderList.push(mesh);\r\n }\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this._pickingTexture!.onAfterRender = async () => {\r\n // Disable scissor\r\n if ((engine as WebGPUEngine | Engine).disableScissor) {\r\n (engine as WebGPUEngine | Engine).disableScissor();\r\n }\r\n\r\n if (!this._pickingTexture) {\r\n reject();\r\n }\r\n\r\n let pickedMesh: Nullable<AbstractMesh> = null;\r\n let thinInstanceIndex: number | undefined = undefined;\r\n const wasSuccessfull = this._meshRenderingCount > 0;\r\n\r\n if (wasSuccessfull) {\r\n // Remove from the active RTTs\r\n const index = scene.customRenderTargets.indexOf(this._pickingTexture!);\r\n if (index > -1) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n // Do the actual picking\r\n if (await this._readTexturePixelsAsync(x, y)) {\r\n const r = this._readbuffer[0];\r\n const g = this._readbuffer[1];\r\n const b = this._readbuffer[2];\r\n const colorId = (r << 16) + (g << 8) + b;\r\n\r\n // Thin?\r\n if (this._thinIdMap[colorId]) {\r\n pickedMesh = this._pickableMeshes[this._thinIdMap[colorId].meshId];\r\n thinInstanceIndex = this._thinIdMap[colorId].thinId;\r\n } else {\r\n pickedMesh = this._pickableMeshes[this._idMap[colorId]];\r\n }\r\n }\r\n }\r\n\r\n // Clean-up\r\n if (!wasSuccessfull) {\r\n this._meshRenderingCount = 0;\r\n return; // We need to wait for the shaders to be ready\r\n } else {\r\n if (disposeWhenDone) {\r\n this.dispose();\r\n }\r\n if (pickedMesh) {\r\n resolve({ mesh: pickedMesh, thinInstanceIndex: thinInstanceIndex });\r\n } else {\r\n resolve(null);\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n private async _readTexturePixelsAsync(x: number, y: number) {\r\n if (!this._cachedScene || !this._pickingTexture?._texture) {\r\n return false;\r\n }\r\n const engine = this._cachedScene.getEngine();\r\n await engine._readTexturePixels(this._pickingTexture._texture, 1, 1, -1, 0, this._readbuffer, true, true, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /** Release the resources */\r\n public dispose() {\r\n this.setPickingList(null);\r\n this._cachedScene = null;\r\n\r\n // Cleaning up\r\n this._pickingTexture?.dispose();\r\n this._pickingTexture = null;\r\n this._defaultRenderMaterial?.dispose();\r\n this._defaultRenderMaterial = null;\r\n }\r\n}\r\n"]}
|
package/Collisions/index.d.ts
CHANGED
|
@@ -4,3 +4,7 @@ export * from "./pickingInfo";
|
|
|
4
4
|
export * from "./intersectionInfo";
|
|
5
5
|
export * from "./meshCollisionData";
|
|
6
6
|
export * from "./gpuPicker";
|
|
7
|
+
export * from "../Shaders/picking.fragment";
|
|
8
|
+
export * from "../Shaders/picking.vertex";
|
|
9
|
+
export * from "../ShadersWGSL/picking.fragment";
|
|
10
|
+
export * from "../ShadersWGSL/picking.vertex";
|
package/Collisions/index.js
CHANGED
|
@@ -4,4 +4,8 @@ export * from "./pickingInfo.js";
|
|
|
4
4
|
export * from "./intersectionInfo.js";
|
|
5
5
|
export * from "./meshCollisionData.js";
|
|
6
6
|
export * from "./gpuPicker.js";
|
|
7
|
+
export * from "../Shaders/picking.fragment.js";
|
|
8
|
+
export * from "../Shaders/picking.vertex.js";
|
|
9
|
+
export * from "../ShadersWGSL/picking.fragment.js";
|
|
10
|
+
export * from "../ShadersWGSL/picking.vertex.js";
|
|
7
11
|
//# sourceMappingURL=index.js.map
|
package/Collisions/index.js.map
CHANGED
|
@@ -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;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"]}
|
|
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;AAE5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,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\r\nexport * from \"../Shaders/picking.fragment\";\r\nexport * from \"../Shaders/picking.vertex\";\r\nexport * from \"../ShadersWGSL/picking.fragment\";\r\nexport * from \"../ShadersWGSL/picking.vertex\";\r\n"]}
|
|
@@ -244,9 +244,6 @@ export class ComputeShaderBoundingHelper {
|
|
|
244
244
|
maximum.maximizeInPlace(mesh.getBoundingInfo().maximum);
|
|
245
245
|
}
|
|
246
246
|
mesh._refreshBoundingInfoDirect(minmax);
|
|
247
|
-
if (i === 0) {
|
|
248
|
-
//console.log("Q", j, minimum + "", maximum + "");
|
|
249
|
-
}
|
|
250
247
|
}
|
|
251
248
|
resultDataOffset += 8 * this._processedMeshes.length;
|
|
252
249
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeShaderBoundingHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { ComputeShader } from \"core/Compute/computeShader\";\r\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport type { ComputeBindingMapping } from \"core/Engines/Extensions/engine.computeShader\";\r\n\r\nimport \"../../ShadersWGSL/boundingInfo.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {\r\n private _engine: AbstractEngine;\r\n private _computeShadersCache: { [key: string]: ComputeShader } = {};\r\n private _positionBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetInfluenceBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetTextureIndexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _ubos: UniformBuffer[] = [];\r\n private _uboIndex: number = 0;\r\n private _processedMeshes: AbstractMesh[] = [];\r\n private _computeShaders: ComputeShader[][] = [];\r\n private _uniqueComputeShaders: Set<ComputeShader> = new Set();\r\n private _resultBuffers: StorageBuffer[] = [];\r\n\r\n /**\r\n * Creates a new ComputeShaderBoundingHelper\r\n * @param engine defines the engine to use\r\n */\r\n constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n private _getComputeShader(defines: string[], hasBones: boolean, hasMorphs: boolean) {\r\n let computeShader: ComputeShader;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (!this._computeShadersCache[join]) {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n positionBuffer: { group: 0, binding: 0 },\r\n resultBuffer: { group: 0, binding: 1 },\r\n settings: { group: 0, binding: 7 },\r\n };\r\n\r\n if (hasBones) {\r\n bindingsMapping.boneSampler = { group: 0, binding: 2 };\r\n bindingsMapping.indexBuffer = { group: 0, binding: 3 };\r\n bindingsMapping.weightBuffer = { group: 0, binding: 4 };\r\n bindingsMapping.indexExtraBuffer = { group: 0, binding: 5 };\r\n bindingsMapping.weightExtraBuffer = { group: 0, binding: 6 };\r\n }\r\n if (hasMorphs) {\r\n bindingsMapping.morphTargets = { group: 0, binding: 8 };\r\n bindingsMapping.morphTargetInfluences = { group: 0, binding: 9 };\r\n bindingsMapping.morphTargetTextureIndices = { group: 0, binding: 10 };\r\n }\r\n\r\n computeShader = new ComputeShader(`boundingInfoCompute${hasBones ? \"_bones\" : \"\"}${hasMorphs ? \"_morphs\" : \"\"}`, this._engine, \"boundingInfo\", {\r\n bindingsMapping,\r\n defines: defines,\r\n });\r\n this._computeShadersCache[join] = computeShader;\r\n } else {\r\n computeShader = this._computeShadersCache[join];\r\n }\r\n\r\n return computeShader;\r\n }\r\n\r\n private _getUBO() {\r\n if (this._uboIndex >= this._ubos.length) {\r\n const ubo = new UniformBuffer(this._engine);\r\n ubo.addFloat3(\"morphTargetTextureInfo\", 0, 0, 0);\r\n ubo.addUniform(\"morphTargetCount\", 1);\r\n ubo.addUniform(\"indexResult\", 1);\r\n this._ubos.push(ubo);\r\n }\r\n\r\n return this._ubos[this._uboIndex++];\r\n }\r\n\r\n private _extractDataAndLink(computeShader: ComputeShader, mesh: Mesh, kind: string, stride: number, name: string, storageUnit: { [key: number]: StorageBuffer }) {\r\n let buffer: StorageBuffer;\r\n const vertexCount = mesh.getTotalVertices();\r\n if (!storageUnit[mesh.uniqueId]) {\r\n const dataArray = mesh.getVertexBuffer(kind)?.getFloatData(vertexCount);\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * vertexCount * stride);\r\n buffer.update(dataArray!);\r\n\r\n storageUnit[mesh.uniqueId] = buffer;\r\n } else {\r\n buffer = storageUnit[mesh.uniqueId];\r\n }\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n private _prepareStorage(computeShader: ComputeShader, name: string, id: number, storageUnit: { [key: number]: StorageBuffer }, numInfluencers: number, data: Float32Array) {\r\n let buffer: StorageBuffer;\r\n if (!storageUnit[id]) {\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * numInfluencers);\r\n\r\n storageUnit[id] = buffer;\r\n } else {\r\n buffer = storageUnit[id];\r\n }\r\n buffer.update(data);\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n /** @internal */\r\n public async processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n await this.registerMeshListAsync(meshes);\r\n this.processMeshList();\r\n await this.fetchResultsForMeshListAsync();\r\n }\r\n\r\n /** @internal */\r\n public registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n this._disposeForMeshList();\r\n\r\n if (!Array.isArray(meshes)) {\r\n meshes = [meshes];\r\n }\r\n\r\n let maxNumInfluencers = 0;\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n if (vertexCount === 0 || !(mesh as Mesh).getVertexBuffer || !(mesh as Mesh).getVertexBuffer(VertexBuffer.PositionKind)) {\r\n continue;\r\n }\r\n\r\n this._processedMeshes.push(mesh);\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager) {\r\n maxNumInfluencers = Math.max(maxNumInfluencers, manager.numTargets);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n let defines = [\"\"];\r\n\r\n let hasBones = false;\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n hasBones = true;\r\n }\r\n\r\n const computeShaderWithoutMorph = this._getComputeShader(defines, hasBones, false);\r\n\r\n this._uniqueComputeShaders.add(computeShaderWithoutMorph);\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager) {\r\n defines = defines.slice();\r\n defines.push(\"#define MORPHTARGETS\");\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + maxNumInfluencers);\r\n\r\n const computeShaderWithMorph = this._getComputeShader(defines, hasBones, true);\r\n\r\n this._uniqueComputeShaders.add(computeShaderWithMorph);\r\n this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithMorph]);\r\n } else {\r\n this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithoutMorph]);\r\n }\r\n\r\n // Pre-build the ubos, as they won't change if there's no morph targets\r\n const ubo = this._getUBO();\r\n ubo.updateUInt(\"indexResult\", i);\r\n\r\n ubo.update();\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const check = () => {\r\n const iterator = this._uniqueComputeShaders.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const computeShader = key.value;\r\n if (!computeShader.isReady()) {\r\n setTimeout(check, 10);\r\n return;\r\n }\r\n }\r\n resolve();\r\n };\r\n check();\r\n });\r\n }\r\n\r\n /** @internal */\r\n public processMeshList(): void {\r\n if (this._processedMeshes.length === 0) {\r\n return;\r\n }\r\n\r\n this._uboIndex = 0;\r\n\r\n const resultDataSize = 8 * this._processedMeshes.length;\r\n const resultData = new Float32Array(resultDataSize);\r\n\r\n const resultBuffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);\r\n this._resultBuffers.push(resultBuffer);\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n resultData[i * 8 + 0] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 1] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 2] = Number.POSITIVE_INFINITY;\r\n\r\n resultData[i * 8 + 3] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 4] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 5] = Number.NEGATIVE_INFINITY;\r\n }\r\n\r\n resultBuffer.update(resultData);\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n const [computeShaderWithoutMorph, computeShaderWithMorph] = this._computeShaders[i];\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n const hasMorphs = manager && manager.numInfluencers > 0;\r\n const computeShader = hasMorphs ? computeShaderWithMorph : computeShaderWithoutMorph;\r\n\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.PositionKind, 3, \"positionBuffer\", this._positionBuffers);\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton && mesh.skeleton.useTextureToStoreBoneMatrices) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesKind, 4, \"indexBuffer\", this._indexBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsKind, 4, \"weightBuffer\", this._weightBuffers);\r\n const boneSampler = mesh.skeleton.getTransformMatrixTexture(mesh);\r\n computeShader.setTexture(\"boneSampler\", boneSampler!, false);\r\n if (mesh.numBoneInfluencers > 4) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesExtraKind, 4, \"indexExtraBuffer\", this._indexExtraBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsExtraKind, 4, \"weightExtraBuffer\", this._weightExtraBuffers);\r\n }\r\n }\r\n\r\n const ubo = this._getUBO();\r\n\r\n // Morphs\r\n if (hasMorphs) {\r\n const morphTargets = manager._targetStoreTexture;\r\n computeShader.setTexture(\"morphTargets\", morphTargets!, false);\r\n\r\n this._prepareStorage(computeShader, \"morphTargetInfluences\", mesh.uniqueId, this._morphTargetInfluenceBuffers, manager.numInfluencers, manager.influences);\r\n this._prepareStorage(\r\n computeShader,\r\n \"morphTargetTextureIndices\",\r\n mesh.uniqueId,\r\n this._morphTargetTextureIndexBuffers,\r\n manager.numInfluencers,\r\n manager._morphTargetTextureIndices\r\n );\r\n\r\n ubo.updateFloat3(\"morphTargetTextureInfo\", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);\r\n ubo.updateInt(\"morphTargetCount\", manager.numInfluencers);\r\n ubo.update();\r\n }\r\n\r\n computeShader.setStorageBuffer(\"resultBuffer\", resultBuffer);\r\n\r\n computeShader.setUniformBuffer(\"settings\", ubo);\r\n\r\n // Dispatch\r\n computeShader.dispatch(Math.ceil(vertexCount / 256));\r\n\r\n this._engine.flushFramebuffer();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public fetchResultsForMeshListAsync(): Promise<void> {\r\n return new Promise((resolve) => {\r\n const buffers: DataBuffer[] = [];\r\n let size = 0;\r\n for (let i = 0; i < this._resultBuffers.length; i++) {\r\n const buffer = this._resultBuffers[i].getBuffer();\r\n buffers.push(buffer);\r\n size += buffer.capacity;\r\n }\r\n\r\n const resultData = new Float32Array(size / Float32Array.BYTES_PER_ELEMENT);\r\n\r\n const minimum = Vector3.Zero();\r\n const maximum = Vector3.Zero();\r\n\r\n const minmax = { minimum, maximum };\r\n\r\n (this._engine as WebGPUEngine).readFromMultipleStorageBuffers(buffers, 0, undefined, resultData, true).then(() => {\r\n let resultDataOffset = 0;\r\n for (let j = 0; j < this._resultBuffers.length; j++) {\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n\r\n Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8, minimum);\r\n Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8 + 3, maximum);\r\n\r\n if (j > 0) {\r\n minimum.minimizeInPlace(mesh.getBoundingInfo().minimum);\r\n maximum.maximizeInPlace(mesh.getBoundingInfo().maximum);\r\n }\r\n\r\n mesh._refreshBoundingInfoDirect(minmax);\r\n\r\n if (i === 0) {\r\n //console.log(\"Q\", j, minimum + \"\", maximum + \"\");\r\n }\r\n }\r\n\r\n resultDataOffset += 8 * this._processedMeshes.length;\r\n }\r\n\r\n for (const resultBuffer of this._resultBuffers) {\r\n resultBuffer.dispose();\r\n }\r\n\r\n this._resultBuffers = [];\r\n this._uboIndex = 0;\r\n\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n private _disposeCache(storageUnit: { [key: number]: StorageBuffer }) {\r\n for (const key in storageUnit) {\r\n storageUnit[key].dispose();\r\n }\r\n }\r\n\r\n private _disposeForMeshList() {\r\n for (const resultBuffer of this._resultBuffers) {\r\n resultBuffer.dispose();\r\n }\r\n this._resultBuffers = [];\r\n this._processedMeshes = [];\r\n this._computeShaders = [];\r\n this._uniqueComputeShaders = new Set();\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n this._disposeCache(this._positionBuffers);\r\n this._positionBuffers = {};\r\n this._disposeCache(this._indexBuffers);\r\n this._indexBuffers = {};\r\n this._disposeCache(this._weightBuffers);\r\n this._weightBuffers = {};\r\n this._disposeCache(this._morphTargetInfluenceBuffers);\r\n this._morphTargetInfluenceBuffers = {};\r\n this._disposeCache(this._morphTargetTextureIndexBuffers);\r\n this._morphTargetTextureIndexBuffers = {};\r\n for (const ubo of this._ubos) {\r\n ubo.dispose();\r\n }\r\n this._ubos = [];\r\n this._computeShadersCache = {};\r\n this._engine = undefined!;\r\n this._disposeForMeshList();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"computeShaderBoundingHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { ComputeShader } from \"core/Compute/computeShader\";\r\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport type { ComputeBindingMapping } from \"core/Engines/Extensions/engine.computeShader\";\r\n\r\nimport \"../../ShadersWGSL/boundingInfo.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {\r\n private _engine: AbstractEngine;\r\n private _computeShadersCache: { [key: string]: ComputeShader } = {};\r\n private _positionBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightBuffers: { [key: number]: StorageBuffer } = {};\r\n private _indexExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _weightExtraBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetInfluenceBuffers: { [key: number]: StorageBuffer } = {};\r\n private _morphTargetTextureIndexBuffers: { [key: number]: StorageBuffer } = {};\r\n private _ubos: UniformBuffer[] = [];\r\n private _uboIndex: number = 0;\r\n private _processedMeshes: AbstractMesh[] = [];\r\n private _computeShaders: ComputeShader[][] = [];\r\n private _uniqueComputeShaders: Set<ComputeShader> = new Set();\r\n private _resultBuffers: StorageBuffer[] = [];\r\n\r\n /**\r\n * Creates a new ComputeShaderBoundingHelper\r\n * @param engine defines the engine to use\r\n */\r\n constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n private _getComputeShader(defines: string[], hasBones: boolean, hasMorphs: boolean) {\r\n let computeShader: ComputeShader;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (!this._computeShadersCache[join]) {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n positionBuffer: { group: 0, binding: 0 },\r\n resultBuffer: { group: 0, binding: 1 },\r\n settings: { group: 0, binding: 7 },\r\n };\r\n\r\n if (hasBones) {\r\n bindingsMapping.boneSampler = { group: 0, binding: 2 };\r\n bindingsMapping.indexBuffer = { group: 0, binding: 3 };\r\n bindingsMapping.weightBuffer = { group: 0, binding: 4 };\r\n bindingsMapping.indexExtraBuffer = { group: 0, binding: 5 };\r\n bindingsMapping.weightExtraBuffer = { group: 0, binding: 6 };\r\n }\r\n if (hasMorphs) {\r\n bindingsMapping.morphTargets = { group: 0, binding: 8 };\r\n bindingsMapping.morphTargetInfluences = { group: 0, binding: 9 };\r\n bindingsMapping.morphTargetTextureIndices = { group: 0, binding: 10 };\r\n }\r\n\r\n computeShader = new ComputeShader(`boundingInfoCompute${hasBones ? \"_bones\" : \"\"}${hasMorphs ? \"_morphs\" : \"\"}`, this._engine, \"boundingInfo\", {\r\n bindingsMapping,\r\n defines: defines,\r\n });\r\n this._computeShadersCache[join] = computeShader;\r\n } else {\r\n computeShader = this._computeShadersCache[join];\r\n }\r\n\r\n return computeShader;\r\n }\r\n\r\n private _getUBO() {\r\n if (this._uboIndex >= this._ubos.length) {\r\n const ubo = new UniformBuffer(this._engine);\r\n ubo.addFloat3(\"morphTargetTextureInfo\", 0, 0, 0);\r\n ubo.addUniform(\"morphTargetCount\", 1);\r\n ubo.addUniform(\"indexResult\", 1);\r\n this._ubos.push(ubo);\r\n }\r\n\r\n return this._ubos[this._uboIndex++];\r\n }\r\n\r\n private _extractDataAndLink(computeShader: ComputeShader, mesh: Mesh, kind: string, stride: number, name: string, storageUnit: { [key: number]: StorageBuffer }) {\r\n let buffer: StorageBuffer;\r\n const vertexCount = mesh.getTotalVertices();\r\n if (!storageUnit[mesh.uniqueId]) {\r\n const dataArray = mesh.getVertexBuffer(kind)?.getFloatData(vertexCount);\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * vertexCount * stride);\r\n buffer.update(dataArray!);\r\n\r\n storageUnit[mesh.uniqueId] = buffer;\r\n } else {\r\n buffer = storageUnit[mesh.uniqueId];\r\n }\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n private _prepareStorage(computeShader: ComputeShader, name: string, id: number, storageUnit: { [key: number]: StorageBuffer }, numInfluencers: number, data: Float32Array) {\r\n let buffer: StorageBuffer;\r\n if (!storageUnit[id]) {\r\n buffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * numInfluencers);\r\n\r\n storageUnit[id] = buffer;\r\n } else {\r\n buffer = storageUnit[id];\r\n }\r\n buffer.update(data);\r\n\r\n computeShader.setStorageBuffer(name, buffer);\r\n }\r\n\r\n /** @internal */\r\n public async processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n await this.registerMeshListAsync(meshes);\r\n this.processMeshList();\r\n await this.fetchResultsForMeshListAsync();\r\n }\r\n\r\n /** @internal */\r\n public registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n this._disposeForMeshList();\r\n\r\n if (!Array.isArray(meshes)) {\r\n meshes = [meshes];\r\n }\r\n\r\n let maxNumInfluencers = 0;\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n if (vertexCount === 0 || !(mesh as Mesh).getVertexBuffer || !(mesh as Mesh).getVertexBuffer(VertexBuffer.PositionKind)) {\r\n continue;\r\n }\r\n\r\n this._processedMeshes.push(mesh);\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager) {\r\n maxNumInfluencers = Math.max(maxNumInfluencers, manager.numTargets);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n let defines = [\"\"];\r\n\r\n let hasBones = false;\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n hasBones = true;\r\n }\r\n\r\n const computeShaderWithoutMorph = this._getComputeShader(defines, hasBones, false);\r\n\r\n this._uniqueComputeShaders.add(computeShaderWithoutMorph);\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager) {\r\n defines = defines.slice();\r\n defines.push(\"#define MORPHTARGETS\");\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + maxNumInfluencers);\r\n\r\n const computeShaderWithMorph = this._getComputeShader(defines, hasBones, true);\r\n\r\n this._uniqueComputeShaders.add(computeShaderWithMorph);\r\n this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithMorph]);\r\n } else {\r\n this._computeShaders.push([computeShaderWithoutMorph, computeShaderWithoutMorph]);\r\n }\r\n\r\n // Pre-build the ubos, as they won't change if there's no morph targets\r\n const ubo = this._getUBO();\r\n ubo.updateUInt(\"indexResult\", i);\r\n\r\n ubo.update();\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const check = () => {\r\n const iterator = this._uniqueComputeShaders.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const computeShader = key.value;\r\n if (!computeShader.isReady()) {\r\n setTimeout(check, 10);\r\n return;\r\n }\r\n }\r\n resolve();\r\n };\r\n check();\r\n });\r\n }\r\n\r\n /** @internal */\r\n public processMeshList(): void {\r\n if (this._processedMeshes.length === 0) {\r\n return;\r\n }\r\n\r\n this._uboIndex = 0;\r\n\r\n const resultDataSize = 8 * this._processedMeshes.length;\r\n const resultData = new Float32Array(resultDataSize);\r\n\r\n const resultBuffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);\r\n this._resultBuffers.push(resultBuffer);\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n resultData[i * 8 + 0] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 1] = Number.POSITIVE_INFINITY;\r\n resultData[i * 8 + 2] = Number.POSITIVE_INFINITY;\r\n\r\n resultData[i * 8 + 3] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 4] = Number.NEGATIVE_INFINITY;\r\n resultData[i * 8 + 5] = Number.NEGATIVE_INFINITY;\r\n }\r\n\r\n resultBuffer.update(resultData);\r\n\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n const [computeShaderWithoutMorph, computeShaderWithMorph] = this._computeShaders[i];\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n const hasMorphs = manager && manager.numInfluencers > 0;\r\n const computeShader = hasMorphs ? computeShaderWithMorph : computeShaderWithoutMorph;\r\n\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.PositionKind, 3, \"positionBuffer\", this._positionBuffers);\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton && mesh.skeleton.useTextureToStoreBoneMatrices) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesKind, 4, \"indexBuffer\", this._indexBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsKind, 4, \"weightBuffer\", this._weightBuffers);\r\n const boneSampler = mesh.skeleton.getTransformMatrixTexture(mesh);\r\n computeShader.setTexture(\"boneSampler\", boneSampler!, false);\r\n if (mesh.numBoneInfluencers > 4) {\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesIndicesExtraKind, 4, \"indexExtraBuffer\", this._indexExtraBuffers);\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.MatricesWeightsExtraKind, 4, \"weightExtraBuffer\", this._weightExtraBuffers);\r\n }\r\n }\r\n\r\n const ubo = this._getUBO();\r\n\r\n // Morphs\r\n if (hasMorphs) {\r\n const morphTargets = manager._targetStoreTexture;\r\n computeShader.setTexture(\"morphTargets\", morphTargets!, false);\r\n\r\n this._prepareStorage(computeShader, \"morphTargetInfluences\", mesh.uniqueId, this._morphTargetInfluenceBuffers, manager.numInfluencers, manager.influences);\r\n this._prepareStorage(\r\n computeShader,\r\n \"morphTargetTextureIndices\",\r\n mesh.uniqueId,\r\n this._morphTargetTextureIndexBuffers,\r\n manager.numInfluencers,\r\n manager._morphTargetTextureIndices\r\n );\r\n\r\n ubo.updateFloat3(\"morphTargetTextureInfo\", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);\r\n ubo.updateInt(\"morphTargetCount\", manager.numInfluencers);\r\n ubo.update();\r\n }\r\n\r\n computeShader.setStorageBuffer(\"resultBuffer\", resultBuffer);\r\n\r\n computeShader.setUniformBuffer(\"settings\", ubo);\r\n\r\n // Dispatch\r\n computeShader.dispatch(Math.ceil(vertexCount / 256));\r\n\r\n this._engine.flushFramebuffer();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public fetchResultsForMeshListAsync(): Promise<void> {\r\n return new Promise((resolve) => {\r\n const buffers: DataBuffer[] = [];\r\n let size = 0;\r\n for (let i = 0; i < this._resultBuffers.length; i++) {\r\n const buffer = this._resultBuffers[i].getBuffer();\r\n buffers.push(buffer);\r\n size += buffer.capacity;\r\n }\r\n\r\n const resultData = new Float32Array(size / Float32Array.BYTES_PER_ELEMENT);\r\n\r\n const minimum = Vector3.Zero();\r\n const maximum = Vector3.Zero();\r\n\r\n const minmax = { minimum, maximum };\r\n\r\n (this._engine as WebGPUEngine).readFromMultipleStorageBuffers(buffers, 0, undefined, resultData, true).then(() => {\r\n let resultDataOffset = 0;\r\n for (let j = 0; j < this._resultBuffers.length; j++) {\r\n for (let i = 0; i < this._processedMeshes.length; i++) {\r\n const mesh = this._processedMeshes[i];\r\n\r\n Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8, minimum);\r\n Vector3.FromArrayToRef(resultData, resultDataOffset + i * 8 + 3, maximum);\r\n\r\n if (j > 0) {\r\n minimum.minimizeInPlace(mesh.getBoundingInfo().minimum);\r\n maximum.maximizeInPlace(mesh.getBoundingInfo().maximum);\r\n }\r\n\r\n mesh._refreshBoundingInfoDirect(minmax);\r\n }\r\n\r\n resultDataOffset += 8 * this._processedMeshes.length;\r\n }\r\n\r\n for (const resultBuffer of this._resultBuffers) {\r\n resultBuffer.dispose();\r\n }\r\n\r\n this._resultBuffers = [];\r\n this._uboIndex = 0;\r\n\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n private _disposeCache(storageUnit: { [key: number]: StorageBuffer }) {\r\n for (const key in storageUnit) {\r\n storageUnit[key].dispose();\r\n }\r\n }\r\n\r\n private _disposeForMeshList() {\r\n for (const resultBuffer of this._resultBuffers) {\r\n resultBuffer.dispose();\r\n }\r\n this._resultBuffers = [];\r\n this._processedMeshes = [];\r\n this._computeShaders = [];\r\n this._uniqueComputeShaders = new Set();\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n this._disposeCache(this._positionBuffers);\r\n this._positionBuffers = {};\r\n this._disposeCache(this._indexBuffers);\r\n this._indexBuffers = {};\r\n this._disposeCache(this._weightBuffers);\r\n this._weightBuffers = {};\r\n this._disposeCache(this._morphTargetInfluenceBuffers);\r\n this._morphTargetInfluenceBuffers = {};\r\n this._disposeCache(this._morphTargetTextureIndexBuffers);\r\n this._morphTargetTextureIndexBuffers = {};\r\n for (const ubo of this._ubos) {\r\n ubo.dispose();\r\n }\r\n this._ubos = [];\r\n this._computeShadersCache = {};\r\n this._engine = undefined!;\r\n this._disposeForMeshList();\r\n }\r\n}\r\n"]}
|
|
@@ -12,7 +12,6 @@ import "../../ShadersWGSL/ShadersInclude/fresnelFunction";
|
|
|
12
12
|
import "../../ShadersWGSL/ShadersInclude/meshUboDeclaration";
|
|
13
13
|
import "../../ShadersWGSL/ShadersInclude/sceneUboDeclaration";
|
|
14
14
|
import "../../ShadersWGSL/ShadersInclude/decalFragment";
|
|
15
|
-
import "../../ShadersWGSL/particles.vertex";
|
|
16
15
|
/** @internal */
|
|
17
16
|
export declare class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {
|
|
18
17
|
protected _attributesInputWGSL: string[];
|
|
@@ -12,7 +12,6 @@ import "../../ShadersWGSL/ShadersInclude/fresnelFunction.js";
|
|
|
12
12
|
import "../../ShadersWGSL/ShadersInclude/meshUboDeclaration.js";
|
|
13
13
|
import "../../ShadersWGSL/ShadersInclude/sceneUboDeclaration.js";
|
|
14
14
|
import "../../ShadersWGSL/ShadersInclude/decalFragment.js";
|
|
15
|
-
import "../../ShadersWGSL/particles.vertex.js";
|
|
16
15
|
const builtInName_frag_depth = "fragmentOutputs.fragDepth";
|
|
17
16
|
const leftOverVarName = "uniforms";
|
|
18
17
|
const internalsVarName = "internals";
|