@babylonjs/core 7.11.2 → 7.11.4
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/animatable.d.ts +10 -10
- package/Animations/animatable.js +5 -5
- package/Animations/animatable.js.map +1 -1
- package/Animations/animationGroupMask.d.ts +2 -2
- package/Animations/animationGroupMask.js +1 -1
- package/Animations/animationGroupMask.js.map +1 -1
- package/Animations/easing.d.ts +2 -2
- package/Animations/easing.js +1 -1
- package/Animations/easing.js.map +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.d.ts +3 -3
- package/Behaviors/Meshes/attachToBoxBehavior.js +3 -3
- package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.d.ts +2 -2
- package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.d.ts +2 -2
- package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Compute/computeEffect.js +21 -3
- package/Compute/computeEffect.js.map +1 -1
- package/Culling/Helper/IBoundingInfoHelperPlatform.d.ts +8 -0
- package/Culling/Helper/IBoundingInfoHelperPlatform.js +2 -0
- package/Culling/Helper/IBoundingInfoHelperPlatform.js.map +1 -0
- package/Culling/Helper/boundingInfoHelper.d.ts +32 -0
- package/Culling/Helper/boundingInfoHelper.js +48 -0
- package/Culling/Helper/boundingInfoHelper.js.map +1 -0
- package/Culling/Helper/computeShaderBoundingHelper.d.ts +34 -0
- package/Culling/Helper/computeShaderBoundingHelper.js +209 -0
- package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.d.ts +21 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.js +197 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -0
- package/Culling/Octrees/octree.d.ts +2 -2
- package/Culling/Octrees/octree.js +1 -1
- package/Culling/Octrees/octree.js.map +1 -1
- package/Culling/index.d.ts +3 -0
- package/Culling/index.js +3 -0
- package/Culling/index.js.map +1 -1
- package/Culling/ray.d.ts +4 -4
- package/Culling/ray.js +2 -2
- package/Culling/ray.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +6 -6
- package/Debug/skeletonViewer.js +3 -3
- package/Debug/skeletonViewer.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSource.d.ts +2 -2
- package/DeviceInput/InputDevices/deviceSource.js +1 -1
- package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
- package/Engines/Extensions/engine.transformFeedback.d.ts +5 -0
- package/Engines/Extensions/engine.transformFeedback.js +3 -0
- package/Engines/Extensions/engine.transformFeedback.js.map +1 -1
- package/Engines/Processors/shaderProcessingOptions.d.ts +1 -1
- package/Engines/Processors/shaderProcessingOptions.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +2 -2
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +7 -0
- package/Engines/nativeEngine.js +4 -1
- package/Engines/nativeEngine.js.map +1 -1
- package/Maths/math.color.d.ts +14 -14
- package/Maths/math.color.js +7 -7
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.isovector.d.ts +4 -4
- package/Maths/math.isovector.js +2 -2
- package/Maths/math.isovector.js.map +1 -1
- package/Maths/math.vector.d.ts +12 -12
- package/Maths/math.vector.js +6 -6
- package/Maths/math.vector.js.map +1 -1
- package/Maths/math.vertexFormat.d.ts +10 -10
- package/Maths/math.vertexFormat.js +5 -5
- package/Maths/math.vertexFormat.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +7 -0
- package/Meshes/abstractMesh.js +17 -0
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +4 -0
- package/Meshes/mesh.js +13 -4
- package/Meshes/mesh.js.map +1 -1
- package/Misc/observable.d.ts +6 -6
- package/Misc/observable.js +4 -4
- package/Misc/observable.js.map +1 -1
- package/Misc/sceneOptimizer.d.ts +3 -3
- package/Misc/sceneOptimizer.js +2 -2
- package/Misc/sceneOptimizer.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +8 -4
- package/Morph/morphTargetManager.js +6 -3
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.d.ts +2 -2
- package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +8 -8
- package/Particles/EmitterTypes/cylinderParticleEmitter.js +4 -4
- package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +6 -6
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +6 -6
- package/Particles/EmitterTypes/sphereParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/pointsCloudSystem.d.ts +0 -1
- package/Particles/pointsCloudSystem.js +0 -1
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Shaders/gpuTransform.fragment.d.ts +5 -0
- package/Shaders/gpuTransform.fragment.js +11 -0
- package/Shaders/gpuTransform.fragment.js.map +1 -0
- package/Shaders/gpuTransform.vertex.d.ts +13 -0
- package/Shaders/gpuTransform.vertex.js +33 -0
- package/Shaders/gpuTransform.vertex.js.map +1 -0
- package/ShadersWGSL/boundingInfo.compute.d.ts +5 -0
- package/ShadersWGSL/boundingInfo.compute.js +80 -0
- package/ShadersWGSL/boundingInfo.compute.js.map +1 -0
- package/XR/features/WebXRBackgroundRemover.d.ts +2 -2
- package/XR/features/WebXRBackgroundRemover.js +1 -1
- package/XR/features/WebXRBackgroundRemover.js.map +1 -1
- package/XR/features/WebXRHitTest.d.ts +2 -2
- package/XR/features/WebXRHitTest.js +1 -1
- package/XR/features/WebXRHitTest.js.map +1 -1
- package/XR/features/WebXRHitTestLegacy.d.ts +2 -2
- package/XR/features/WebXRHitTestLegacy.js +1 -1
- package/XR/features/WebXRHitTestLegacy.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js +0 -2
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +2 -0
- package/XR/motionController/webXRAbstractMotionController.js +1 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
2
|
+
/**
|
|
3
|
+
* Interface used to define a platform support for BoundingInfoHelper class
|
|
4
|
+
*/
|
|
5
|
+
export interface IBoundingInfoHelperPlatform {
|
|
6
|
+
processAsync(mesh: AbstractMesh | AbstractMesh[]): Promise<void>;
|
|
7
|
+
dispose(): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IBoundingInfoHelperPlatform.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/IBoundingInfoHelperPlatform.ts"],"names":[],"mappings":"","sourcesContent":["import type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\n/**\r\n * Interface used to define a platform support for BoundingInfoHelper class\r\n */\r\nexport interface IBoundingInfoHelperPlatform {\r\n processAsync(mesh: AbstractMesh | AbstractMesh[]): Promise<void>;\r\n dispose(): void;\r\n}\r\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
2
|
+
import type { AbstractEngine } from "../../Engines/abstractEngine.js";
|
|
3
|
+
/**
|
|
4
|
+
* Utility class to help with bounding info management
|
|
5
|
+
* #BCNJD4#41 =\> does not use the BoundingInfoHelper class, performs calculations on the CPU
|
|
6
|
+
* #BCNJD4#37 =\> same as #41 but use the BoundingInfoHelper class
|
|
7
|
+
* #BCNJD4#40 =\> example with bones and morphs (webGL2)
|
|
8
|
+
* #BCNJD4#42 =\> example with bones and morphs (webGPU)
|
|
9
|
+
* #HPV2TZ#475 =\> only morph (webGL2)
|
|
10
|
+
* #HPV2TZ#476 =\> only morph (webGPU)
|
|
11
|
+
* #B8B8Z2#8 =\> Large scale test (webGL2)
|
|
12
|
+
* #B8B8Z2#9 =\> Large scale test (webGPU)
|
|
13
|
+
*/
|
|
14
|
+
export declare class BoundingInfoHelper {
|
|
15
|
+
private _platform;
|
|
16
|
+
private _engine;
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new BoundingInfoHelper
|
|
19
|
+
* @param engine defines the engine to use
|
|
20
|
+
*/
|
|
21
|
+
constructor(engine: AbstractEngine);
|
|
22
|
+
/**
|
|
23
|
+
* Compute the bounding info of a mesh / array of meshes using shaders
|
|
24
|
+
* @param target defines the mesh(es) to update
|
|
25
|
+
* @returns a promise that resolves when the bounding info is/are computed
|
|
26
|
+
*/
|
|
27
|
+
computeAsync(target: AbstractMesh | AbstractMesh[]): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Dispose and release associated resources
|
|
30
|
+
*/
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility class to help with bounding info management
|
|
3
|
+
* #BCNJD4#41 =\> does not use the BoundingInfoHelper class, performs calculations on the CPU
|
|
4
|
+
* #BCNJD4#37 =\> same as #41 but use the BoundingInfoHelper class
|
|
5
|
+
* #BCNJD4#40 =\> example with bones and morphs (webGL2)
|
|
6
|
+
* #BCNJD4#42 =\> example with bones and morphs (webGPU)
|
|
7
|
+
* #HPV2TZ#475 =\> only morph (webGL2)
|
|
8
|
+
* #HPV2TZ#476 =\> only morph (webGPU)
|
|
9
|
+
* #B8B8Z2#8 =\> Large scale test (webGL2)
|
|
10
|
+
* #B8B8Z2#9 =\> Large scale test (webGPU)
|
|
11
|
+
*/
|
|
12
|
+
export class BoundingInfoHelper {
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new BoundingInfoHelper
|
|
15
|
+
* @param engine defines the engine to use
|
|
16
|
+
*/
|
|
17
|
+
constructor(engine) {
|
|
18
|
+
this._engine = engine;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Compute the bounding info of a mesh / array of meshes using shaders
|
|
22
|
+
* @param target defines the mesh(es) to update
|
|
23
|
+
* @returns a promise that resolves when the bounding info is/are computed
|
|
24
|
+
*/
|
|
25
|
+
async computeAsync(target) {
|
|
26
|
+
if (!this._platform) {
|
|
27
|
+
if (this._engine.getCaps().supportComputeShaders) {
|
|
28
|
+
const module = await import("./computeShaderBoundingHelper.js");
|
|
29
|
+
this._platform = new module.ComputeShaderBoundingHelper(this._engine);
|
|
30
|
+
}
|
|
31
|
+
else if (this._engine.getCaps().supportTransformFeedbacks) {
|
|
32
|
+
const module = await import("./transformFeedbackBoundingHelper.js");
|
|
33
|
+
this._platform = new module.TransformFeedbackBoundingHelper(this._engine);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error("Your engine does not support Compute Shaders or Transform Feedbacks");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return this._platform.processAsync(target);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Dispose and release associated resources
|
|
43
|
+
*/
|
|
44
|
+
dispose() {
|
|
45
|
+
this._platform.dispose();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=boundingInfoHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundingInfoHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/boundingInfoHelper.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,kBAAkB;IAI3B;;;OAGG;IACH,YAAmB,MAAsB;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,YAAY,CAAC,MAAqC;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACjB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;gBAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;gBAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACzE;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,yBAAyB,EAAE;gBACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBACjE,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAqB,CAAC,CAAC;aAC3F;iBAAM;gBACH,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;aAC1F;SACJ;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ","sourcesContent":["import type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\nimport type { ThinEngine } from \"core/Engines\";\r\n\r\n/**\r\n * Utility class to help with bounding info management\r\n * #BCNJD4#41 =\\> does not use the BoundingInfoHelper class, performs calculations on the CPU\r\n * #BCNJD4#37 =\\> same as #41 but use the BoundingInfoHelper class\r\n * #BCNJD4#40 =\\> example with bones and morphs (webGL2)\r\n * #BCNJD4#42 =\\> example with bones and morphs (webGPU)\r\n * #HPV2TZ#475 =\\> only morph (webGL2)\r\n * #HPV2TZ#476 =\\> only morph (webGPU)\r\n * #B8B8Z2#8 =\\> Large scale test (webGL2)\r\n * #B8B8Z2#9 =\\> Large scale test (webGPU)\r\n */\r\nexport class BoundingInfoHelper {\r\n private _platform: IBoundingInfoHelperPlatform;\r\n private _engine: AbstractEngine;\r\n\r\n /**\r\n * Creates a new BoundingInfoHelper\r\n * @param engine defines the engine to use\r\n */\r\n public constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n }\r\n\r\n /**\r\n * Compute the bounding info of a mesh / array of meshes using shaders\r\n * @param target defines the mesh(es) to update\r\n * @returns a promise that resolves when the bounding info is/are computed\r\n */\r\n public async computeAsync(target: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n if (!this._platform) {\r\n if (this._engine.getCaps().supportComputeShaders) {\r\n const module = await import(\"./computeShaderBoundingHelper\");\r\n this._platform = new module.ComputeShaderBoundingHelper(this._engine);\r\n } else if (this._engine.getCaps().supportTransformFeedbacks) {\r\n const module = await import(\"./transformFeedbackBoundingHelper\");\r\n this._platform = new module.TransformFeedbackBoundingHelper(this._engine as ThinEngine);\r\n } else {\r\n throw new Error(\"Your engine does not support Compute Shaders or Transform Feedbacks\");\r\n }\r\n }\r\n\r\n return this._platform.processAsync(target);\r\n }\r\n\r\n /**\r\n * Dispose and release associated resources\r\n */\r\n public dispose(): void {\r\n this._platform.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IBoundingInfoHelperPlatform } from "./IBoundingInfoHelperPlatform";
|
|
2
|
+
import type { AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
3
|
+
import type { AbstractEngine } from "../../Engines/abstractEngine.js";
|
|
4
|
+
import "../../ShadersWGSL/boundingInfo.compute";
|
|
5
|
+
/** @internal */
|
|
6
|
+
export declare class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {
|
|
7
|
+
private _engine;
|
|
8
|
+
private _computeShaders;
|
|
9
|
+
private _positionBuffers;
|
|
10
|
+
private _indexBuffers;
|
|
11
|
+
private _weightBuffers;
|
|
12
|
+
private _indexExtraBuffers;
|
|
13
|
+
private _weightExtraBuffers;
|
|
14
|
+
private _morphTargetInfluenceBuffers;
|
|
15
|
+
private _morphTargetTextureIndexBuffers;
|
|
16
|
+
private _resultData;
|
|
17
|
+
private _resultBuffer;
|
|
18
|
+
private _ubos;
|
|
19
|
+
private _uboIndex;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new ComputeShaderBoundingHelper
|
|
22
|
+
* @param engine defines the engine to use
|
|
23
|
+
*/
|
|
24
|
+
constructor(engine: AbstractEngine);
|
|
25
|
+
private _getComputeShader;
|
|
26
|
+
private _getUBO;
|
|
27
|
+
private _extractDataAndLink;
|
|
28
|
+
private _prepareStorage;
|
|
29
|
+
/** @internal */
|
|
30
|
+
processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void>;
|
|
31
|
+
private _disposeCache;
|
|
32
|
+
/** @internal */
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { ComputeShader } from "../../Compute/computeShader.js";
|
|
2
|
+
import { StorageBuffer } from "../../Buffers/storageBuffer.js";
|
|
3
|
+
import { VertexBuffer } from "../../Buffers/buffer.js";
|
|
4
|
+
import { Vector3 } from "../../Maths/math.vector.js";
|
|
5
|
+
import { UniformBuffer } from "../../Materials/uniformBuffer.js";
|
|
6
|
+
import "../../ShadersWGSL/boundingInfo.compute.js";
|
|
7
|
+
/** @internal */
|
|
8
|
+
export class ComputeShaderBoundingHelper {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new ComputeShaderBoundingHelper
|
|
11
|
+
* @param engine defines the engine to use
|
|
12
|
+
*/
|
|
13
|
+
constructor(engine) {
|
|
14
|
+
this._computeShaders = {};
|
|
15
|
+
this._positionBuffers = {};
|
|
16
|
+
this._indexBuffers = {};
|
|
17
|
+
this._weightBuffers = {};
|
|
18
|
+
this._indexExtraBuffers = {};
|
|
19
|
+
this._weightExtraBuffers = {};
|
|
20
|
+
this._morphTargetInfluenceBuffers = {};
|
|
21
|
+
this._morphTargetTextureIndexBuffers = {};
|
|
22
|
+
this._ubos = [];
|
|
23
|
+
this._uboIndex = 0;
|
|
24
|
+
this._engine = engine;
|
|
25
|
+
}
|
|
26
|
+
_getComputeShader(defines) {
|
|
27
|
+
let computeShader;
|
|
28
|
+
const join = defines.join("\n");
|
|
29
|
+
if (!this._computeShaders[join]) {
|
|
30
|
+
computeShader = new ComputeShader("boundingInfoCompute", this._engine, "boundingInfo", {
|
|
31
|
+
bindingsMapping: {
|
|
32
|
+
positionBuffer: { group: 0, binding: 0 },
|
|
33
|
+
resultBuffer: { group: 0, binding: 1 },
|
|
34
|
+
boneSampler: { group: 0, binding: 2 },
|
|
35
|
+
indexBuffer: { group: 0, binding: 3 },
|
|
36
|
+
weightBuffer: { group: 0, binding: 4 },
|
|
37
|
+
indexExtraBuffer: { group: 0, binding: 5 },
|
|
38
|
+
weightExtraBuffer: { group: 0, binding: 6 },
|
|
39
|
+
settings: { group: 0, binding: 7 },
|
|
40
|
+
morphTargets: { group: 0, binding: 8 },
|
|
41
|
+
morphTargetInfluences: { group: 0, binding: 9 },
|
|
42
|
+
morphTargetTextureIndices: { group: 0, binding: 10 },
|
|
43
|
+
},
|
|
44
|
+
defines: defines,
|
|
45
|
+
});
|
|
46
|
+
this._computeShaders[join] = computeShader;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
computeShader = this._computeShaders[join];
|
|
50
|
+
}
|
|
51
|
+
return computeShader;
|
|
52
|
+
}
|
|
53
|
+
_getUBO() {
|
|
54
|
+
if (this._uboIndex >= this._ubos.length) {
|
|
55
|
+
const ubo = new UniformBuffer(this._engine);
|
|
56
|
+
ubo.addUniform("indexResult", 4);
|
|
57
|
+
ubo.addFloat3("morphTargetTextureInfo", 0, 0, 0);
|
|
58
|
+
this._ubos.push(ubo);
|
|
59
|
+
}
|
|
60
|
+
return this._ubos[this._uboIndex++];
|
|
61
|
+
}
|
|
62
|
+
_extractDataAndLink(computeShader, mesh, kind, stride, name, storageUnit) {
|
|
63
|
+
let buffer;
|
|
64
|
+
const vertexCount = mesh.getTotalVertices();
|
|
65
|
+
if (!storageUnit[mesh.uniqueId]) {
|
|
66
|
+
const dataArray = mesh.getVertexBuffer(kind)?.getFloatData(vertexCount);
|
|
67
|
+
buffer = new StorageBuffer(this._engine, Float32Array.BYTES_PER_ELEMENT * vertexCount * stride);
|
|
68
|
+
buffer.update(dataArray);
|
|
69
|
+
storageUnit[mesh.uniqueId] = buffer;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
buffer = storageUnit[mesh.uniqueId];
|
|
73
|
+
}
|
|
74
|
+
computeShader.setStorageBuffer(name, buffer);
|
|
75
|
+
}
|
|
76
|
+
_prepareStorage(computeShader, name, id, storageUnit, numInfluencers, data) {
|
|
77
|
+
let buffer;
|
|
78
|
+
if (!storageUnit[id]) {
|
|
79
|
+
buffer = new StorageBuffer(this._engine, Float32Array.BYTES_PER_ELEMENT * numInfluencers);
|
|
80
|
+
storageUnit[id] = buffer;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
buffer = storageUnit[id];
|
|
84
|
+
}
|
|
85
|
+
buffer.update(data);
|
|
86
|
+
computeShader.setStorageBuffer(name, buffer);
|
|
87
|
+
}
|
|
88
|
+
/** @internal */
|
|
89
|
+
processAsync(meshes) {
|
|
90
|
+
if (!Array.isArray(meshes)) {
|
|
91
|
+
meshes = [meshes];
|
|
92
|
+
}
|
|
93
|
+
this._uboIndex = 0;
|
|
94
|
+
// Results
|
|
95
|
+
const resultDataSize = 8 * meshes.length;
|
|
96
|
+
let resultData;
|
|
97
|
+
let resultBuffer;
|
|
98
|
+
if (!this._resultData || this._resultData.length !== resultDataSize) {
|
|
99
|
+
this._resultBuffer?.dispose();
|
|
100
|
+
resultData = new Float32Array(resultDataSize);
|
|
101
|
+
resultBuffer = new StorageBuffer(this._engine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);
|
|
102
|
+
this._resultData = resultData;
|
|
103
|
+
this._resultBuffer = resultBuffer;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
resultData = this._resultData;
|
|
107
|
+
resultBuffer = this._resultBuffer;
|
|
108
|
+
}
|
|
109
|
+
for (let i = 0; i < meshes.length; i++) {
|
|
110
|
+
resultData[i * 8 + 0] = Number.POSITIVE_INFINITY;
|
|
111
|
+
resultData[i * 8 + 1] = Number.POSITIVE_INFINITY;
|
|
112
|
+
resultData[i * 8 + 2] = Number.POSITIVE_INFINITY;
|
|
113
|
+
resultData[i * 8 + 3] = Number.NEGATIVE_INFINITY;
|
|
114
|
+
resultData[i * 8 + 4] = Number.NEGATIVE_INFINITY;
|
|
115
|
+
resultData[i * 8 + 5] = Number.NEGATIVE_INFINITY;
|
|
116
|
+
}
|
|
117
|
+
resultBuffer.update(resultData);
|
|
118
|
+
const promises = [];
|
|
119
|
+
const processedMeshes = [];
|
|
120
|
+
for (let i = 0; i < meshes.length; i++) {
|
|
121
|
+
const mesh = meshes[i];
|
|
122
|
+
const vertexCount = mesh.getTotalVertices();
|
|
123
|
+
const defines = [""];
|
|
124
|
+
if (vertexCount === 0 || !mesh.getVertexBuffer || !mesh.getVertexBuffer(VertexBuffer.PositionKind)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
processedMeshes.push(mesh);
|
|
128
|
+
if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {
|
|
129
|
+
defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
|
|
130
|
+
}
|
|
131
|
+
const manager = mesh.morphTargetManager;
|
|
132
|
+
if (manager && manager.numInfluencers > 0) {
|
|
133
|
+
defines.push("MORPHTARGETS");
|
|
134
|
+
defines.push("#define NUM_MORPH_INFLUENCERS " + manager.numInfluencers);
|
|
135
|
+
}
|
|
136
|
+
const computeShader = this._getComputeShader(defines);
|
|
137
|
+
this._extractDataAndLink(computeShader, mesh, VertexBuffer.PositionKind, 3, "positionBuffer", this._positionBuffers);
|
|
138
|
+
// UBO
|
|
139
|
+
const ubo = this._getUBO();
|
|
140
|
+
ubo.updateUInt("indexResult", processedMeshes.length - 1);
|
|
141
|
+
// Bones
|
|
142
|
+
if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton && mesh.skeleton.useTextureToStoreBoneMatrices) {
|
|
143
|
+
this._extractDataAndLink(computeShader, mesh, VertexBuffer.MatricesIndicesKind, 4, "indexBuffer", this._indexBuffers);
|
|
144
|
+
this._extractDataAndLink(computeShader, mesh, VertexBuffer.MatricesWeightsKind, 4, "weightBuffer", this._weightBuffers);
|
|
145
|
+
const boneSampler = mesh.skeleton.getTransformMatrixTexture(mesh);
|
|
146
|
+
computeShader.setTexture("boneSampler", boneSampler, false);
|
|
147
|
+
if (mesh.numBoneInfluencers > 4) {
|
|
148
|
+
this._extractDataAndLink(computeShader, mesh, VertexBuffer.MatricesIndicesExtraKind, 4, "indexExtraBuffer", this._indexExtraBuffers);
|
|
149
|
+
this._extractDataAndLink(computeShader, mesh, VertexBuffer.MatricesWeightsExtraKind, 4, "weightExtraBuffer", this._weightExtraBuffers);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Morphs
|
|
153
|
+
if (manager && manager.numInfluencers > 0) {
|
|
154
|
+
const morphTargets = manager._targetStoreTexture;
|
|
155
|
+
computeShader.setTexture("morphTargets", morphTargets, false);
|
|
156
|
+
this._prepareStorage(computeShader, "morphTargetInfluences", mesh.uniqueId, this._morphTargetInfluenceBuffers, manager.numInfluencers, manager.influences);
|
|
157
|
+
this._prepareStorage(computeShader, "morphTargetTextureIndices", mesh.uniqueId, this._morphTargetTextureIndexBuffers, manager.numInfluencers, manager._morphTargetTextureIndices);
|
|
158
|
+
ubo.updateFloat3("morphTargetTextureInfo", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);
|
|
159
|
+
}
|
|
160
|
+
ubo.update();
|
|
161
|
+
computeShader.setStorageBuffer("resultBuffer", resultBuffer);
|
|
162
|
+
computeShader.setUniformBuffer("settings", ubo);
|
|
163
|
+
// Dispatch
|
|
164
|
+
promises.push(computeShader.dispatchWhenReady(Math.ceil(vertexCount / 64)));
|
|
165
|
+
}
|
|
166
|
+
if (promises.length === 0) {
|
|
167
|
+
return Promise.resolve();
|
|
168
|
+
}
|
|
169
|
+
return Promise.all(promises).then(() => {
|
|
170
|
+
return resultBuffer.read(undefined, undefined, resultData, true).then(() => {
|
|
171
|
+
for (let i = 0; i < processedMeshes.length; i++) {
|
|
172
|
+
const mesh = processedMeshes[i];
|
|
173
|
+
mesh._refreshBoundingInfoDirect({
|
|
174
|
+
minimum: Vector3.FromArray(resultData, i * 8),
|
|
175
|
+
maximum: Vector3.FromArray(resultData, i * 8 + 3),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
_disposeCache(storageUnit) {
|
|
182
|
+
for (const key in storageUnit) {
|
|
183
|
+
storageUnit[key].dispose();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** @internal */
|
|
187
|
+
dispose() {
|
|
188
|
+
this._disposeCache(this._positionBuffers);
|
|
189
|
+
this._positionBuffers = {};
|
|
190
|
+
this._disposeCache(this._indexBuffers);
|
|
191
|
+
this._indexBuffers = {};
|
|
192
|
+
this._disposeCache(this._weightBuffers);
|
|
193
|
+
this._weightBuffers = {};
|
|
194
|
+
this._disposeCache(this._morphTargetInfluenceBuffers);
|
|
195
|
+
this._morphTargetInfluenceBuffers = {};
|
|
196
|
+
this._disposeCache(this._morphTargetTextureIndexBuffers);
|
|
197
|
+
this._morphTargetTextureIndexBuffers = {};
|
|
198
|
+
this._resultBuffer.dispose();
|
|
199
|
+
this._resultBuffer = undefined;
|
|
200
|
+
this._resultData = undefined;
|
|
201
|
+
for (const ubo of this._ubos) {
|
|
202
|
+
ubo.dispose();
|
|
203
|
+
}
|
|
204
|
+
this._ubos = [];
|
|
205
|
+
this._computeShaders = {};
|
|
206
|
+
this._engine = null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=computeShaderBoundingHelper.js.map
|
|
@@ -0,0 +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 type { Nullable } from \"core/types\";\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\n\r\nimport \"../../ShadersWGSL/boundingInfo.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform {\r\n private _engine: Nullable<AbstractEngine>;\r\n private _computeShaders: { [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 _resultData: Float32Array;\r\n private _resultBuffer: StorageBuffer;\r\n private _ubos: UniformBuffer[] = [];\r\n private _uboIndex: number = 0;\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[]) {\r\n let computeShader: ComputeShader;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (!this._computeShaders[join]) {\r\n computeShader = new ComputeShader(\"boundingInfoCompute\", this._engine!, \"boundingInfo\", {\r\n bindingsMapping: {\r\n positionBuffer: { group: 0, binding: 0 },\r\n resultBuffer: { group: 0, binding: 1 },\r\n boneSampler: { group: 0, binding: 2 },\r\n indexBuffer: { group: 0, binding: 3 },\r\n weightBuffer: { group: 0, binding: 4 },\r\n indexExtraBuffer: { group: 0, binding: 5 },\r\n weightExtraBuffer: { group: 0, binding: 6 },\r\n settings: { group: 0, binding: 7 },\r\n morphTargets: { group: 0, binding: 8 },\r\n morphTargetInfluences: { group: 0, binding: 9 },\r\n morphTargetTextureIndices: { group: 0, binding: 10 },\r\n },\r\n defines: defines,\r\n });\r\n this._computeShaders[join] = computeShader;\r\n } else {\r\n computeShader = this._computeShaders[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.addUniform(\"indexResult\", 4);\r\n ubo.addFloat3(\"morphTargetTextureInfo\", 0, 0, 0);\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 processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void> {\r\n if (!Array.isArray(meshes)) {\r\n meshes = [meshes];\r\n }\r\n\r\n this._uboIndex = 0;\r\n\r\n // Results\r\n const resultDataSize = 8 * meshes.length;\r\n let resultData: Float32Array;\r\n let resultBuffer: StorageBuffer;\r\n if (!this._resultData || this._resultData.length !== resultDataSize) {\r\n this._resultBuffer?.dispose();\r\n\r\n resultData = new Float32Array(resultDataSize);\r\n resultBuffer = new StorageBuffer(this._engine as WebGPUEngine, Float32Array.BYTES_PER_ELEMENT * resultDataSize);\r\n\r\n this._resultData = resultData;\r\n this._resultBuffer = resultBuffer;\r\n } else {\r\n resultData = this._resultData;\r\n resultBuffer = this._resultBuffer;\r\n }\r\n\r\n for (let i = 0; i < meshes.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 const promises: Promise<void>[] = [];\r\n const processedMeshes: AbstractMesh[] = [];\r\n\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const vertexCount = mesh.getTotalVertices();\r\n const defines = [\"\"];\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 processedMeshes.push(mesh);\r\n\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n }\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager && manager.numInfluencers > 0) {\r\n defines.push(\"MORPHTARGETS\");\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + manager.numInfluencers);\r\n }\r\n\r\n const computeShader = this._getComputeShader(defines);\r\n\r\n this._extractDataAndLink(computeShader, mesh as Mesh, VertexBuffer.PositionKind, 3, \"positionBuffer\", this._positionBuffers);\r\n\r\n // UBO\r\n const ubo = this._getUBO();\r\n ubo.updateUInt(\"indexResult\", processedMeshes.length - 1);\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 // Morphs\r\n if (manager && manager.numInfluencers > 0) {\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 ubo.updateFloat3(\"morphTargetTextureInfo\", manager._textureVertexStride, manager._textureWidth, manager._textureHeight);\r\n }\r\n\r\n ubo.update();\r\n\r\n computeShader.setStorageBuffer(\"resultBuffer\", resultBuffer);\r\n computeShader.setUniformBuffer(\"settings\", ubo);\r\n\r\n // Dispatch\r\n promises.push(computeShader.dispatchWhenReady(Math.ceil(vertexCount / 64)));\r\n }\r\n\r\n if (promises.length === 0) {\r\n return Promise.resolve();\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n return resultBuffer.read(undefined, undefined, resultData, true).then(() => {\r\n for (let i = 0; i < processedMeshes.length; i++) {\r\n const mesh = processedMeshes[i];\r\n mesh._refreshBoundingInfoDirect({\r\n minimum: Vector3.FromArray(resultData, i * 8),\r\n maximum: Vector3.FromArray(resultData, i * 8 + 3),\r\n });\r\n }\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 /** @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 this._resultBuffer.dispose();\r\n this._resultBuffer = undefined!;\r\n this._resultData = undefined!;\r\n for (const ubo of this._ubos) {\r\n ubo.dispose();\r\n }\r\n this._ubos = [];\r\n this._computeShaders = {};\r\n this._engine = null;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ThinEngine } from "../../Engines/thinEngine.js";
|
|
2
|
+
import type { AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
3
|
+
import type { IBoundingInfoHelperPlatform } from "./IBoundingInfoHelperPlatform";
|
|
4
|
+
import "../../Shaders/gpuTransform.vertex";
|
|
5
|
+
import "../../Shaders/gpuTransform.fragment";
|
|
6
|
+
/** @internal */
|
|
7
|
+
export declare class TransformFeedbackBoundingHelper implements IBoundingInfoHelperPlatform {
|
|
8
|
+
private _engine;
|
|
9
|
+
private _buffers;
|
|
10
|
+
private _effects;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new TransformFeedbackBoundingHelper
|
|
13
|
+
* @param engine defines the engine to use
|
|
14
|
+
*/
|
|
15
|
+
constructor(engine: ThinEngine);
|
|
16
|
+
/** @internal */
|
|
17
|
+
processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise<void>;
|
|
18
|
+
private _compute;
|
|
19
|
+
/** @internal */
|
|
20
|
+
dispose(): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { VertexBuffer, Buffer } from "../../Buffers/buffer.js";
|
|
2
|
+
|
|
3
|
+
import { BindBonesParameters, BindMorphTargetParameters, PrepareAttributesForBakedVertexAnimation } from "../../Materials/materialHelper.functions.js";
|
|
4
|
+
import "../../Shaders/gpuTransform.vertex.js";
|
|
5
|
+
import "../../Shaders/gpuTransform.fragment.js";
|
|
6
|
+
/** @internal */
|
|
7
|
+
export class TransformFeedbackBoundingHelper {
|
|
8
|
+
/**
|
|
9
|
+
* Creates a new TransformFeedbackBoundingHelper
|
|
10
|
+
* @param engine defines the engine to use
|
|
11
|
+
*/
|
|
12
|
+
constructor(engine) {
|
|
13
|
+
this._buffers = {};
|
|
14
|
+
this._effects = {};
|
|
15
|
+
this._engine = engine;
|
|
16
|
+
}
|
|
17
|
+
/** @internal */
|
|
18
|
+
processAsync(meshes) {
|
|
19
|
+
if (!Array.isArray(meshes)) {
|
|
20
|
+
meshes = [meshes];
|
|
21
|
+
}
|
|
22
|
+
const promises = [];
|
|
23
|
+
for (let i = 0; i < meshes.length; ++i) {
|
|
24
|
+
const mesh = meshes[i];
|
|
25
|
+
const vertexCount = mesh.getTotalVertices();
|
|
26
|
+
if (vertexCount === 0 || !mesh.getVertexBuffer || !mesh.getVertexBuffer(VertexBuffer.PositionKind)) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// Get correct effect
|
|
30
|
+
let computeEffect;
|
|
31
|
+
let numInfluencers = 0;
|
|
32
|
+
const defines = [];
|
|
33
|
+
let uniforms = [];
|
|
34
|
+
const attribs = [VertexBuffer.PositionKind];
|
|
35
|
+
const samplers = [];
|
|
36
|
+
// Bones
|
|
37
|
+
if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {
|
|
38
|
+
attribs.push(VertexBuffer.MatricesIndicesKind);
|
|
39
|
+
attribs.push(VertexBuffer.MatricesWeightsKind);
|
|
40
|
+
if (mesh.numBoneInfluencers > 4) {
|
|
41
|
+
attribs.push(VertexBuffer.MatricesIndicesExtraKind);
|
|
42
|
+
attribs.push(VertexBuffer.MatricesWeightsExtraKind);
|
|
43
|
+
}
|
|
44
|
+
const skeleton = mesh.skeleton;
|
|
45
|
+
defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
|
|
46
|
+
if (skeleton.isUsingTextureForMatrices) {
|
|
47
|
+
defines.push("#define BONETEXTURE");
|
|
48
|
+
if (uniforms.indexOf("boneTextureWidth") === -1) {
|
|
49
|
+
uniforms.push("boneTextureWidth");
|
|
50
|
+
}
|
|
51
|
+
if (samplers.indexOf("boneSampler") === -1) {
|
|
52
|
+
samplers.push("boneSampler");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
defines.push("#define BonesPerMesh " + (skeleton.bones.length + 1));
|
|
57
|
+
if (uniforms.indexOf("mBones") === -1) {
|
|
58
|
+
uniforms.push("mBones");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
defines.push("#define NUM_BONE_INFLUENCERS 0");
|
|
64
|
+
}
|
|
65
|
+
// Morph
|
|
66
|
+
const manager = mesh ? mesh.morphTargetManager : null;
|
|
67
|
+
if (manager) {
|
|
68
|
+
numInfluencers = manager.numMaxInfluencers || manager.numInfluencers;
|
|
69
|
+
if (numInfluencers > 0) {
|
|
70
|
+
defines.push("#define MORPHTARGETS");
|
|
71
|
+
}
|
|
72
|
+
if (manager.isUsingTextureForTargets) {
|
|
73
|
+
defines.push("#define MORPHTARGETS_TEXTURE");
|
|
74
|
+
if (uniforms.indexOf("morphTargetTextureIndices") === -1) {
|
|
75
|
+
uniforms.push("morphTargetTextureIndices");
|
|
76
|
+
}
|
|
77
|
+
if (samplers.indexOf("morphTargets") === -1) {
|
|
78
|
+
samplers.push("morphTargets");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
defines.push("#define NUM_MORPH_INFLUENCERS " + numInfluencers);
|
|
82
|
+
for (let index = 0; index < numInfluencers; index++) {
|
|
83
|
+
attribs.push(VertexBuffer.PositionKind + index);
|
|
84
|
+
}
|
|
85
|
+
if (numInfluencers > 0) {
|
|
86
|
+
uniforms = uniforms.slice();
|
|
87
|
+
uniforms.push("morphTargetInfluences");
|
|
88
|
+
uniforms.push("morphTargetCount");
|
|
89
|
+
uniforms.push("morphTargetTextureInfo");
|
|
90
|
+
uniforms.push("morphTargetTextureIndices");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Baked Vertex Animation
|
|
94
|
+
const bvaManager = mesh.bakedVertexAnimationManager;
|
|
95
|
+
if (bvaManager && bvaManager.isEnabled) {
|
|
96
|
+
defines.push("#define BAKED_VERTEX_ANIMATION_TEXTURE");
|
|
97
|
+
if (uniforms.indexOf("bakedVertexAnimationSettings") === -1) {
|
|
98
|
+
uniforms.push("bakedVertexAnimationSettings");
|
|
99
|
+
}
|
|
100
|
+
if (uniforms.indexOf("bakedVertexAnimationTextureSizeInverted") === -1) {
|
|
101
|
+
uniforms.push("bakedVertexAnimationTextureSizeInverted");
|
|
102
|
+
}
|
|
103
|
+
if (uniforms.indexOf("bakedVertexAnimationTime") === -1) {
|
|
104
|
+
uniforms.push("bakedVertexAnimationTime");
|
|
105
|
+
}
|
|
106
|
+
if (samplers.indexOf("bakedVertexAnimationTexture") === -1) {
|
|
107
|
+
samplers.push("bakedVertexAnimationTexture");
|
|
108
|
+
}
|
|
109
|
+
PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);
|
|
110
|
+
}
|
|
111
|
+
const join = defines.join("\n");
|
|
112
|
+
if (!this._effects[join]) {
|
|
113
|
+
const computeEffectOptions = {
|
|
114
|
+
attributes: attribs,
|
|
115
|
+
uniformsNames: uniforms,
|
|
116
|
+
uniformBuffersNames: [],
|
|
117
|
+
samplers: samplers,
|
|
118
|
+
defines: join,
|
|
119
|
+
fallbacks: null,
|
|
120
|
+
onCompiled: null,
|
|
121
|
+
onError: null,
|
|
122
|
+
indexParameters: { maxSimultaneousMorphTargets: numInfluencers },
|
|
123
|
+
maxSimultaneousLights: 0,
|
|
124
|
+
transformFeedbackVaryings: ["outPosition"],
|
|
125
|
+
};
|
|
126
|
+
computeEffect = this._engine.createEffect("gpuTransform", computeEffectOptions, this._engine);
|
|
127
|
+
this._effects[join] = computeEffect;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
computeEffect = this._effects[join];
|
|
131
|
+
}
|
|
132
|
+
promises.push(new Promise((resolve) => {
|
|
133
|
+
if (computeEffect.isReady()) {
|
|
134
|
+
this._compute(mesh, computeEffect);
|
|
135
|
+
resolve();
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
computeEffect.onCompileObservable.addOnce(() => {
|
|
139
|
+
this._compute(mesh, computeEffect);
|
|
140
|
+
resolve();
|
|
141
|
+
});
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
return Promise.all(promises).then(() => { });
|
|
145
|
+
}
|
|
146
|
+
_compute(mesh, effect) {
|
|
147
|
+
const engine = this._engine;
|
|
148
|
+
// Buffer
|
|
149
|
+
let targetBuffer;
|
|
150
|
+
const vertexCount = mesh.getTotalVertices();
|
|
151
|
+
if (!this._buffers[mesh.uniqueId]) {
|
|
152
|
+
const targetData = new Float32Array(vertexCount * 3);
|
|
153
|
+
targetBuffer = new Buffer(mesh.getEngine(), targetData, true, 3);
|
|
154
|
+
this._buffers[mesh.uniqueId] = targetBuffer;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
targetBuffer = this._buffers[mesh.uniqueId];
|
|
158
|
+
}
|
|
159
|
+
// Bind
|
|
160
|
+
effect.getEngine().enableEffect(effect);
|
|
161
|
+
mesh._bindDirect(effect, null, true);
|
|
162
|
+
// Bones
|
|
163
|
+
BindBonesParameters(mesh, effect);
|
|
164
|
+
// Morph targets
|
|
165
|
+
const manager = mesh.morphTargetManager;
|
|
166
|
+
if (manager && manager.numInfluencers > 0) {
|
|
167
|
+
BindMorphTargetParameters(mesh, effect);
|
|
168
|
+
}
|
|
169
|
+
// BVA
|
|
170
|
+
const bvaManager = mesh.bakedVertexAnimationManager;
|
|
171
|
+
if (bvaManager && bvaManager.isEnabled) {
|
|
172
|
+
mesh.bakedVertexAnimationManager?.bind(effect, false);
|
|
173
|
+
}
|
|
174
|
+
// Update
|
|
175
|
+
const arrayBuffer = targetBuffer.getData();
|
|
176
|
+
engine.bindTransformFeedbackBuffer(targetBuffer.getBuffer());
|
|
177
|
+
engine.setRasterizerState(false);
|
|
178
|
+
engine.beginTransformFeedback(true);
|
|
179
|
+
engine.drawArraysType(2, 0, vertexCount);
|
|
180
|
+
engine.endTransformFeedback();
|
|
181
|
+
engine.setRasterizerState(true);
|
|
182
|
+
engine.readTransformFeedbackBuffer(arrayBuffer);
|
|
183
|
+
engine.bindTransformFeedbackBuffer(null);
|
|
184
|
+
// Update mesh
|
|
185
|
+
mesh._refreshBoundingInfo(arrayBuffer, null);
|
|
186
|
+
}
|
|
187
|
+
/** @internal */
|
|
188
|
+
dispose() {
|
|
189
|
+
for (const key in this._buffers) {
|
|
190
|
+
this._buffers[key].dispose();
|
|
191
|
+
}
|
|
192
|
+
this._buffers = {};
|
|
193
|
+
this._effects = {};
|
|
194
|
+
this._engine = null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=transformFeedbackBoundingHelper.js.map
|