@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.
Files changed (125) hide show
  1. package/Animations/animatable.d.ts +10 -10
  2. package/Animations/animatable.js +5 -5
  3. package/Animations/animatable.js.map +1 -1
  4. package/Animations/animationGroupMask.d.ts +2 -2
  5. package/Animations/animationGroupMask.js +1 -1
  6. package/Animations/animationGroupMask.js.map +1 -1
  7. package/Animations/easing.d.ts +2 -2
  8. package/Animations/easing.js +1 -1
  9. package/Animations/easing.js.map +1 -1
  10. package/Behaviors/Meshes/attachToBoxBehavior.d.ts +3 -3
  11. package/Behaviors/Meshes/attachToBoxBehavior.js +3 -3
  12. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  13. package/Cameras/Inputs/freeCameraMouseInput.d.ts +2 -2
  14. package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
  15. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  16. package/Cameras/Inputs/freeCameraTouchInput.d.ts +2 -2
  17. package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
  18. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  19. package/Compute/computeEffect.js +21 -3
  20. package/Compute/computeEffect.js.map +1 -1
  21. package/Culling/Helper/IBoundingInfoHelperPlatform.d.ts +8 -0
  22. package/Culling/Helper/IBoundingInfoHelperPlatform.js +2 -0
  23. package/Culling/Helper/IBoundingInfoHelperPlatform.js.map +1 -0
  24. package/Culling/Helper/boundingInfoHelper.d.ts +32 -0
  25. package/Culling/Helper/boundingInfoHelper.js +48 -0
  26. package/Culling/Helper/boundingInfoHelper.js.map +1 -0
  27. package/Culling/Helper/computeShaderBoundingHelper.d.ts +34 -0
  28. package/Culling/Helper/computeShaderBoundingHelper.js +209 -0
  29. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -0
  30. package/Culling/Helper/transformFeedbackBoundingHelper.d.ts +21 -0
  31. package/Culling/Helper/transformFeedbackBoundingHelper.js +197 -0
  32. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -0
  33. package/Culling/Octrees/octree.d.ts +2 -2
  34. package/Culling/Octrees/octree.js +1 -1
  35. package/Culling/Octrees/octree.js.map +1 -1
  36. package/Culling/index.d.ts +3 -0
  37. package/Culling/index.js +3 -0
  38. package/Culling/index.js.map +1 -1
  39. package/Culling/ray.d.ts +4 -4
  40. package/Culling/ray.js +2 -2
  41. package/Culling/ray.js.map +1 -1
  42. package/Debug/skeletonViewer.d.ts +6 -6
  43. package/Debug/skeletonViewer.js +3 -3
  44. package/Debug/skeletonViewer.js.map +1 -1
  45. package/DeviceInput/InputDevices/deviceSource.d.ts +2 -2
  46. package/DeviceInput/InputDevices/deviceSource.js +1 -1
  47. package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
  48. package/Engines/Extensions/engine.transformFeedback.d.ts +5 -0
  49. package/Engines/Extensions/engine.transformFeedback.js +3 -0
  50. package/Engines/Extensions/engine.transformFeedback.js.map +1 -1
  51. package/Engines/Processors/shaderProcessingOptions.d.ts +1 -1
  52. package/Engines/Processors/shaderProcessingOptions.js.map +1 -1
  53. package/Engines/Processors/shaderProcessor.js +2 -2
  54. package/Engines/Processors/shaderProcessor.js.map +1 -1
  55. package/Engines/abstractEngine.js +2 -2
  56. package/Engines/abstractEngine.js.map +1 -1
  57. package/Engines/nativeEngine.d.ts +7 -0
  58. package/Engines/nativeEngine.js +4 -1
  59. package/Engines/nativeEngine.js.map +1 -1
  60. package/Maths/math.color.d.ts +14 -14
  61. package/Maths/math.color.js +7 -7
  62. package/Maths/math.color.js.map +1 -1
  63. package/Maths/math.isovector.d.ts +4 -4
  64. package/Maths/math.isovector.js +2 -2
  65. package/Maths/math.isovector.js.map +1 -1
  66. package/Maths/math.vector.d.ts +12 -12
  67. package/Maths/math.vector.js +6 -6
  68. package/Maths/math.vector.js.map +1 -1
  69. package/Maths/math.vertexFormat.d.ts +10 -10
  70. package/Maths/math.vertexFormat.js +5 -5
  71. package/Maths/math.vertexFormat.js.map +1 -1
  72. package/Meshes/abstractMesh.d.ts +7 -0
  73. package/Meshes/abstractMesh.js +17 -0
  74. package/Meshes/abstractMesh.js.map +1 -1
  75. package/Meshes/mesh.d.ts +4 -0
  76. package/Meshes/mesh.js +13 -4
  77. package/Meshes/mesh.js.map +1 -1
  78. package/Misc/observable.d.ts +6 -6
  79. package/Misc/observable.js +4 -4
  80. package/Misc/observable.js.map +1 -1
  81. package/Misc/sceneOptimizer.d.ts +3 -3
  82. package/Misc/sceneOptimizer.js +2 -2
  83. package/Misc/sceneOptimizer.js.map +1 -1
  84. package/Morph/morphTargetManager.d.ts +8 -4
  85. package/Morph/morphTargetManager.js +6 -3
  86. package/Morph/morphTargetManager.js.map +1 -1
  87. package/Particles/EmitterTypes/coneParticleEmitter.d.ts +2 -2
  88. package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
  89. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  90. package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +8 -8
  91. package/Particles/EmitterTypes/cylinderParticleEmitter.js +4 -4
  92. package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
  93. package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +6 -6
  94. package/Particles/EmitterTypes/hemisphericParticleEmitter.js +3 -3
  95. package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
  96. package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +6 -6
  97. package/Particles/EmitterTypes/sphereParticleEmitter.js +3 -3
  98. package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
  99. package/Particles/pointsCloudSystem.d.ts +0 -1
  100. package/Particles/pointsCloudSystem.js +0 -1
  101. package/Particles/pointsCloudSystem.js.map +1 -1
  102. package/Shaders/gpuTransform.fragment.d.ts +5 -0
  103. package/Shaders/gpuTransform.fragment.js +11 -0
  104. package/Shaders/gpuTransform.fragment.js.map +1 -0
  105. package/Shaders/gpuTransform.vertex.d.ts +13 -0
  106. package/Shaders/gpuTransform.vertex.js +33 -0
  107. package/Shaders/gpuTransform.vertex.js.map +1 -0
  108. package/ShadersWGSL/boundingInfo.compute.d.ts +5 -0
  109. package/ShadersWGSL/boundingInfo.compute.js +80 -0
  110. package/ShadersWGSL/boundingInfo.compute.js.map +1 -0
  111. package/XR/features/WebXRBackgroundRemover.d.ts +2 -2
  112. package/XR/features/WebXRBackgroundRemover.js +1 -1
  113. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  114. package/XR/features/WebXRHitTest.d.ts +2 -2
  115. package/XR/features/WebXRHitTest.js +1 -1
  116. package/XR/features/WebXRHitTest.js.map +1 -1
  117. package/XR/features/WebXRHitTestLegacy.d.ts +2 -2
  118. package/XR/features/WebXRHitTestLegacy.js +1 -1
  119. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  120. package/XR/features/WebXRRawCameraAccess.js +0 -2
  121. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  122. package/XR/motionController/webXRAbstractMotionController.d.ts +2 -0
  123. package/XR/motionController/webXRAbstractMotionController.js +1 -0
  124. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  125. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IBoundingInfoHelperPlatform.js.map
@@ -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