@babylonjs/core 7.11.3 → 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 (36) hide show
  1. package/Compute/computeEffect.js +21 -3
  2. package/Compute/computeEffect.js.map +1 -1
  3. package/Culling/Helper/IBoundingInfoHelperPlatform.d.ts +8 -0
  4. package/Culling/Helper/IBoundingInfoHelperPlatform.js +2 -0
  5. package/Culling/Helper/IBoundingInfoHelperPlatform.js.map +1 -0
  6. package/Culling/Helper/boundingInfoHelper.d.ts +14 -10
  7. package/Culling/Helper/boundingInfoHelper.js +22 -152
  8. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  9. package/Culling/Helper/computeShaderBoundingHelper.d.ts +34 -0
  10. package/Culling/Helper/computeShaderBoundingHelper.js +209 -0
  11. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -0
  12. package/Culling/Helper/transformFeedbackBoundingHelper.d.ts +21 -0
  13. package/Culling/Helper/transformFeedbackBoundingHelper.js +197 -0
  14. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -0
  15. package/Culling/index.d.ts +2 -0
  16. package/Culling/index.js +2 -0
  17. package/Culling/index.js.map +1 -1
  18. package/Engines/Processors/shaderProcessingOptions.d.ts +1 -1
  19. package/Engines/Processors/shaderProcessingOptions.js.map +1 -1
  20. package/Engines/Processors/shaderProcessor.js +2 -2
  21. package/Engines/Processors/shaderProcessor.js.map +1 -1
  22. package/Engines/abstractEngine.js +2 -2
  23. package/Engines/abstractEngine.js.map +1 -1
  24. package/Meshes/abstractMesh.d.ts +7 -0
  25. package/Meshes/abstractMesh.js +17 -0
  26. package/Meshes/abstractMesh.js.map +1 -1
  27. package/Morph/morphTargetManager.d.ts +8 -4
  28. package/Morph/morphTargetManager.js +6 -3
  29. package/Morph/morphTargetManager.js.map +1 -1
  30. package/ShadersWGSL/boundingInfo.compute.d.ts +5 -0
  31. package/ShadersWGSL/boundingInfo.compute.js +80 -0
  32. package/ShadersWGSL/boundingInfo.compute.js.map +1 -0
  33. package/package.json +1 -1
  34. package/Culling/Helper/webgl2BoundingHelper.d.ts +0 -22
  35. package/Culling/Helper/webgl2BoundingHelper.js +0 -61
  36. package/Culling/Helper/webgl2BoundingHelper.js.map +0 -1
@@ -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":"AAGA,OAAO,EAAE,aAAa,EAAE,uCAAmC;AAC3D,OAAO,EAAE,aAAa,EAAE,uCAAmC;AAI3D,OAAO,EAAE,YAAY,EAAE,gCAA4B;AACnD,OAAO,EAAE,OAAO,EAAE,mCAA+B;AACjD,OAAO,EAAE,aAAa,EAAE,yCAAqC;AAE7D,OAAO,wCAAwC,CAAC;AAEhD,gBAAgB;AAChB,MAAM,OAAO,2BAA2B;IAepC;;;OAGG;IACH,YAAY,MAAsB;QAjB1B,oBAAe,GAAqC,EAAE,CAAC;QACvD,qBAAgB,GAAqC,EAAE,CAAC;QACxD,kBAAa,GAAqC,EAAE,CAAC;QACrD,mBAAc,GAAqC,EAAE,CAAC;QACtD,uBAAkB,GAAqC,EAAE,CAAC;QAC1D,wBAAmB,GAAqC,EAAE,CAAC;QAC3D,iCAA4B,GAAqC,EAAE,CAAC;QACpE,oCAA+B,GAAqC,EAAE,CAAC;QAGvE,UAAK,GAAoB,EAAE,CAAC;QAC5B,cAAS,GAAW,CAAC,CAAC;QAO1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAEO,iBAAiB,CAAC,OAAiB;QACvC,IAAI,aAA4B,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;YAC7B,aAAa,GAAG,IAAI,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAQ,EAAE,cAAc,EAAE;gBACpF,eAAe,EAAE;oBACb,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBACxC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBACtC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBACrC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBACrC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBACtC,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBAC1C,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBAC3C,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBAClC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBACtC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBAC/C,yBAAyB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;iBACvD;gBACD,OAAO,EAAE,OAAO;aACnB,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;SAC9C;aAAM;YACH,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC9C;QAED,OAAO,aAAa,CAAC;IACzB,CAAC;IAEO,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrC,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;YAC7C,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACxB;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,mBAAmB,CAAC,aAA4B,EAAE,IAAU,EAAE,IAAY,EAAE,MAAc,EAAE,IAAY,EAAE,WAA6C;QAC3J,IAAI,MAAqB,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;YACxE,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAuB,EAAE,YAAY,CAAC,iBAAiB,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC;YAChH,MAAM,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC;YAE1B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;SACvC;aAAM;YACH,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACvC;QAED,aAAa,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAEO,eAAe,CAAC,aAA4B,EAAE,IAAY,EAAE,EAAU,EAAE,WAA6C,EAAE,cAAsB,EAAE,IAAkB;QACrK,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;YAClB,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAuB,EAAE,YAAY,CAAC,iBAAiB,GAAG,cAAc,CAAC,CAAC;YAE1G,WAAW,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;SAC5B;aAAM;YACH,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;SAC5B;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpB,aAAa,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB;IACT,YAAY,CAAC,MAAqC;QACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACxB,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;SACrB;QAED,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QAEnB,UAAU;QACV,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACzC,IAAI,UAAwB,CAAC;QAC7B,IAAI,YAA2B,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,cAAc,EAAE;YACjE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;YAE9B,UAAU,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC;YAC9C,YAAY,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAuB,EAAE,YAAY,CAAC,iBAAiB,GAAG,cAAc,CAAC,CAAC;YAEhH,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;YAC9B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;SACrC;aAAM;YACH,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;YAC9B,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;SACrC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACjD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACjD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;YAEjD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACjD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACjD,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;SACpD;QAED,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,eAAe,GAAmB,EAAE,CAAC;QAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;YAErB,IAAI,WAAW,KAAK,CAAC,IAAI,CAAE,IAAa,CAAC,eAAe,IAAI,CAAE,IAAa,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;gBACpH,SAAS;aACZ;YAED,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3B,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACzE,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;aAC3E;YAED,MAAM,OAAO,GAAU,IAAK,CAAC,kBAAkB,CAAC;YAChD,IAAI,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE;gBACvC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,gCAAgC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;aAC3E;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEtD,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAY,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAE7H,MAAM;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE1D,QAAQ;YACR,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,6BAA6B,EAAE;gBACxH,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAY,EAAE,YAAY,CAAC,mBAAmB,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC9H,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAY,EAAE,YAAY,CAAC,mBAAmB,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAChI,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;gBAClE,aAAa,CAAC,UAAU,CAAC,aAAa,EAAE,WAAY,EAAE,KAAK,CAAC,CAAC;gBAC7D,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;oBAC7B,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAY,EAAE,YAAY,CAAC,wBAAwB,EAAE,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAC7I,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAY,EAAE,YAAY,CAAC,wBAAwB,EAAE,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;iBAClJ;aACJ;YAED,SAAS;YACT,IAAI,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE;gBACvC,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC;gBACjD,aAAa,CAAC,UAAU,CAAC,cAAc,EAAE,YAAa,EAAE,KAAK,CAAC,CAAC;gBAE/D,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,uBAAuB,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,4BAA4B,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC3J,IAAI,CAAC,eAAe,CAChB,aAAa,EACb,2BAA2B,EAC3B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,+BAA+B,EACpC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,0BAA0B,CACrC,CAAC;gBACF,GAAG,CAAC,YAAY,CAAC,wBAAwB,EAAE,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;aAC3H;YAED,GAAG,CAAC,MAAM,EAAE,CAAC;YAEb,aAAa,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAC7D,aAAa,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEhD,WAAW;YACX,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/E;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5B;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACnC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;oBAChC,IAAI,CAAC,0BAA0B,CAAC;wBAC5B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;wBAC7C,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;qBACpD,CAAC,CAAC;iBACN;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,aAAa,CAAC,WAA6C;QAC/D,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;YAC3B,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;SAC9B;IACL,CAAC;IAED,gBAAgB;IACT,OAAO;QACV,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACtD,IAAI,CAAC,4BAA4B,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACzD,IAAI,CAAC,+BAA+B,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,SAAU,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,SAAU,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE;YAC1B,GAAG,CAAC,OAAO,EAAE,CAAC;SACjB;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;CACJ","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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformFeedbackBoundingHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/transformFeedbackBoundingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Effect } from \"core/Materials/effect\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { VertexBuffer, Buffer } from \"core/Buffers/buffer\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareAttributesForBakedVertexAnimation } from \"core/Materials/materialHelper.functions\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport type { IBoundingInfoHelperPlatform } from \"./IBoundingInfoHelperPlatform\";\r\n\r\nimport \"../../Shaders/gpuTransform.vertex\";\r\nimport \"../../Shaders/gpuTransform.fragment\";\r\n\r\n/** @internal */\r\nexport class TransformFeedbackBoundingHelper implements IBoundingInfoHelperPlatform {\r\n private _engine: Nullable<ThinEngine>;\r\n private _buffers: { [key: number]: Buffer } = {};\r\n private _effects: { [key: string]: Effect } = {};\r\n\r\n /**\r\n * Creates a new TransformFeedbackBoundingHelper\r\n * @param engine defines the engine to use\r\n */\r\n constructor(engine: ThinEngine) {\r\n this._engine = engine;\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 const promises: Promise<void>[] = [];\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\r\n if (vertexCount === 0 || !(mesh as Mesh).getVertexBuffer || !(mesh as Mesh).getVertexBuffer(VertexBuffer.PositionKind)) {\r\n continue;\r\n }\r\n\r\n // Get correct effect\r\n let computeEffect: Effect;\r\n let numInfluencers = 0;\r\n const defines: string[] = [];\r\n let uniforms: string[] = [];\r\n const attribs = [VertexBuffer.PositionKind];\r\n const samplers: string[] = [];\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n\r\n const skeleton = mesh.skeleton;\r\n\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n\r\n if (uniforms.indexOf(\"boneTextureWidth\") === -1) {\r\n uniforms.push(\"boneTextureWidth\");\r\n }\r\n\r\n if (samplers.indexOf(\"boneSampler\") === -1) {\r\n samplers.push(\"boneSampler\");\r\n }\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n\r\n if (uniforms.indexOf(\"mBones\") === -1) {\r\n uniforms.push(\"mBones\");\r\n }\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph\r\n const manager = mesh ? (<Mesh>mesh).morphTargetManager : null;\r\n if (manager) {\r\n numInfluencers = manager.numMaxInfluencers || manager.numInfluencers;\r\n if (numInfluencers > 0) {\r\n defines.push(\"#define MORPHTARGETS\");\r\n }\r\n if (manager.isUsingTextureForTargets) {\r\n defines.push(\"#define MORPHTARGETS_TEXTURE\");\r\n\r\n if (uniforms.indexOf(\"morphTargetTextureIndices\") === -1) {\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n\r\n if (samplers.indexOf(\"morphTargets\") === -1) {\r\n samplers.push(\"morphTargets\");\r\n }\r\n }\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + numInfluencers);\r\n for (let index = 0; index < numInfluencers; index++) {\r\n attribs.push(VertexBuffer.PositionKind + index);\r\n }\r\n if (numInfluencers > 0) {\r\n uniforms = uniforms.slice();\r\n uniforms.push(\"morphTargetInfluences\");\r\n uniforms.push(\"morphTargetCount\");\r\n uniforms.push(\"morphTargetTextureInfo\");\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n }\r\n\r\n // Baked Vertex Animation\r\n const bvaManager = (<Mesh>mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (uniforms.indexOf(\"bakedVertexAnimationSettings\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationSettings\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTextureSizeInverted\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTextureSizeInverted\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTime\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTime\");\r\n }\r\n\r\n if (samplers.indexOf(\"bakedVertexAnimationTexture\") === -1) {\r\n samplers.push(\"bakedVertexAnimationTexture\");\r\n }\r\n PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n if (!this._effects[join]) {\r\n const computeEffectOptions = {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: null,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numInfluencers },\r\n maxSimultaneousLights: 0,\r\n transformFeedbackVaryings: [\"outPosition\"],\r\n };\r\n computeEffect = this._engine!.createEffect(\"gpuTransform\", computeEffectOptions, this._engine!);\r\n this._effects[join] = computeEffect;\r\n } else {\r\n computeEffect = this._effects[join];\r\n }\r\n\r\n promises.push(\r\n new Promise((resolve) => {\r\n if (computeEffect.isReady()) {\r\n this._compute(mesh, computeEffect);\r\n resolve();\r\n return;\r\n }\r\n\r\n computeEffect.onCompileObservable.addOnce(() => {\r\n this._compute(mesh, computeEffect);\r\n resolve();\r\n });\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n private _compute(mesh: AbstractMesh, effect: Effect): void {\r\n const engine = this._engine as Engine;\r\n\r\n // Buffer\r\n let targetBuffer: Buffer;\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n if (!this._buffers[mesh.uniqueId]) {\r\n const targetData = new Float32Array(vertexCount * 3);\r\n targetBuffer = new Buffer(mesh.getEngine(), targetData, true, 3);\r\n this._buffers[mesh.uniqueId] = targetBuffer;\r\n } else {\r\n targetBuffer = this._buffers[mesh.uniqueId];\r\n }\r\n\r\n // Bind\r\n effect.getEngine().enableEffect(effect);\r\n (mesh as Mesh)._bindDirect(effect, null, true);\r\n\r\n // Bones\r\n BindBonesParameters(mesh, effect);\r\n\r\n // Morph targets\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager && manager.numInfluencers > 0) {\r\n BindMorphTargetParameters(<Mesh>mesh, effect);\r\n }\r\n\r\n // BVA\r\n const bvaManager = (<Mesh>mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n mesh.bakedVertexAnimationManager?.bind(effect, false);\r\n }\r\n\r\n // Update\r\n const arrayBuffer = targetBuffer.getData()! as Float32Array;\r\n engine.bindTransformFeedbackBuffer(targetBuffer.getBuffer());\r\n engine.setRasterizerState(false);\r\n engine.beginTransformFeedback(true);\r\n engine.drawArraysType(Constants.MATERIAL_PointFillMode, 0, vertexCount);\r\n engine.endTransformFeedback();\r\n engine.setRasterizerState(true);\r\n engine.readTransformFeedbackBuffer(arrayBuffer);\r\n engine.bindTransformFeedbackBuffer(null);\r\n\r\n // Update mesh\r\n mesh._refreshBoundingInfo(arrayBuffer, null);\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n for (const key in this._buffers) {\r\n this._buffers[key].dispose();\r\n }\r\n this._buffers = {};\r\n this._effects = {};\r\n this._engine = null;\r\n }\r\n}\r\n"]}
@@ -1,6 +1,8 @@
1
1
  export * from "./boundingBox";
2
2
  export * from "./boundingInfo";
3
3
  export * from "./Helper/boundingInfoHelper";
4
+ export * from "./Helper/transformFeedbackBoundingHelper";
5
+ export * from "./Helper/computeShaderBoundingHelper";
4
6
  export * from "./boundingSphere";
5
7
  export * from "./Octrees/index";
6
8
  export * from "./ray";
package/Culling/index.js CHANGED
@@ -2,6 +2,8 @@
2
2
  export * from "./boundingBox.js";
3
3
  export * from "./boundingInfo.js";
4
4
  export * from "./Helper/boundingInfoHelper.js";
5
+ export * from "./Helper/transformFeedbackBoundingHelper.js";
6
+ export * from "./Helper/computeShaderBoundingHelper.js";
5
7
  export * from "./boundingSphere.js";
6
8
  export * from "./Octrees/index.js";
7
9
  export * from "./ray.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Culling/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./boundingBox\";\r\nexport * from \"./boundingInfo\";\r\nexport * from \"./Helper/boundingInfoHelper\";\r\nexport * from \"./boundingSphere\";\r\nexport * from \"./Octrees/index\";\r\nexport * from \"./ray\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Culling/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./boundingBox\";\r\nexport * from \"./boundingInfo\";\r\nexport * from \"./Helper/boundingInfoHelper\";\r\nexport * from \"./Helper/transformFeedbackBoundingHelper\";\r\nexport * from \"./Helper/computeShaderBoundingHelper\";\r\nexport * from \"./boundingSphere\";\r\nexport * from \"./Octrees/index\";\r\nexport * from \"./ray\";\r\n"]}
@@ -3,7 +3,7 @@ import type { Nullable } from "../../types";
3
3
  /**
4
4
  * Function for custom code generation
5
5
  */
6
- export type ShaderCustomProcessingFunction = (shaderType: string, code: string) => string;
6
+ export type ShaderCustomProcessingFunction = (shaderType: string, code: string, defines?: string[]) => string;
7
7
  /** @internal */
8
8
  export interface ShaderProcessingContext {
9
9
  vertexBufferKindToNumberOfComponents?: {
@@ -1 +1 @@
1
- {"version":3,"file":"shaderProcessingOptions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Processors/shaderProcessingOptions.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\r\nimport type { IShaderProcessor } from \"./iShaderProcessor\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * Function for custom code generation\r\n */\r\nexport type ShaderCustomProcessingFunction = (shaderType: string, code: string) => string;\r\n\r\n/** @internal */\r\nexport interface ShaderProcessingContext {\r\n // For engines that check for non float vertex buffers, this object is populated only with the vertex kinds known to be FLOAT by the engine (position, uv, ...)\r\n // and only if the type of the corresponding vertex buffer is an integer type. If the type is a signed integer type, the value is negated.\r\n vertexBufferKindToNumberOfComponents?: { [kind: string]: number };\r\n}\r\n\r\n/** @internal */\r\nexport interface ProcessingOptions {\r\n defines: string[];\r\n indexParameters: any;\r\n isFragment: boolean;\r\n shouldUseHighPrecisionShader: boolean;\r\n supportsUniformBuffers: boolean;\r\n shadersRepository: string;\r\n includesShadersStore: { [key: string]: string };\r\n processor: Nullable<IShaderProcessor>;\r\n version: string;\r\n platformName: string;\r\n lookForClosingBracketForUniformBuffer?: boolean;\r\n processingContext: Nullable<ShaderProcessingContext>;\r\n isNDCHalfZRange: boolean;\r\n useReverseDepthBuffer: boolean;\r\n processCodeAfterIncludes?: ShaderCustomProcessingFunction;\r\n}\r\n"]}
1
+ {"version":3,"file":"shaderProcessingOptions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Processors/shaderProcessingOptions.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\r\nimport type { IShaderProcessor } from \"./iShaderProcessor\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * Function for custom code generation\r\n */\r\nexport type ShaderCustomProcessingFunction = (shaderType: string, code: string, defines?: string[]) => string;\r\n\r\n/** @internal */\r\nexport interface ShaderProcessingContext {\r\n // For engines that check for non float vertex buffers, this object is populated only with the vertex kinds known to be FLOAT by the engine (position, uv, ...)\r\n // and only if the type of the corresponding vertex buffer is an integer type. If the type is a signed integer type, the value is negated.\r\n vertexBufferKindToNumberOfComponents?: { [kind: string]: number };\r\n}\r\n\r\n/** @internal */\r\nexport interface ProcessingOptions {\r\n defines: string[];\r\n indexParameters: any;\r\n isFragment: boolean;\r\n shouldUseHighPrecisionShader: boolean;\r\n supportsUniformBuffers: boolean;\r\n shadersRepository: string;\r\n includesShadersStore: { [key: string]: string };\r\n processor: Nullable<IShaderProcessor>;\r\n version: string;\r\n platformName: string;\r\n lookForClosingBracketForUniformBuffer?: boolean;\r\n processingContext: Nullable<ShaderProcessingContext>;\r\n isNDCHalfZRange: boolean;\r\n useReverseDepthBuffer: boolean;\r\n processCodeAfterIncludes?: ShaderCustomProcessingFunction;\r\n}\r\n"]}
@@ -31,7 +31,7 @@ export function Process(sourceCode, options, callback, engine) {
31
31
  }
32
32
  _ProcessIncludes(sourceCode, options, (codeWithIncludes) => {
33
33
  if (options.processCodeAfterIncludes) {
34
- codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes);
34
+ codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes, options.defines);
35
35
  }
36
36
  const migratedCode = _ProcessShaderConversion(codeWithIncludes, options, engine);
37
37
  callback(migratedCode, codeWithIncludes);
@@ -44,7 +44,7 @@ export function PreProcess(sourceCode, options, callback, engine) {
44
44
  }
45
45
  _ProcessIncludes(sourceCode, options, (codeWithIncludes) => {
46
46
  if (options.processCodeAfterIncludes) {
47
- codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes);
47
+ codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes, options.defines);
48
48
  }
49
49
  const migratedCode = _ApplyPreProcessing(codeWithIncludes, options, engine);
50
50
  callback(migratedCode, codeWithIncludes);