@babylonjs/core 7.40.4 → 7.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Culling/Helper/computeShaderBoundingHelper.js +1 -0
- package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
- package/Culling/Helper/transformFeedbackBoundingHelper.js +1 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/thinEngine.js +1 -6
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -6
- package/Engines/webgpuEngine.js.map +1 -1
- package/Layers/effectLayer.js +1 -0
- package/Layers/effectLayer.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +1 -0
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +12 -3
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +2 -0
- package/Materials/Node/nodeMaterial.js +2 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.js +1 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/effect.js +1 -0
- package/Materials/effect.js.map +1 -1
- package/Materials/materialHelper.functions.js +10 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/shaderMaterial.js +5 -1
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/standardMaterial.d.ts +1 -0
- package/Materials/standardMaterial.js +1 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/mesh.js +1 -1
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/subMesh.js +10 -2
- package/Meshes/subMesh.js.map +1 -1
- package/Misc/screenshotTools.d.ts +18 -12
- package/Misc/screenshotTools.js +57 -47
- package/Misc/screenshotTools.js.map +1 -1
- package/Morph/morphTarget.d.ts +4 -0
- package/Morph/morphTarget.js +16 -0
- package/Morph/morphTarget.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +10 -0
- package/Morph/morphTargetManager.js +115 -96
- package/Morph/morphTargetManager.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +1 -0
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Rendering/depthRenderer.js +1 -0
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +1 -0
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js +1 -0
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +7 -6
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/morphTargetsVertex.js +6 -1
- package/Shaders/ShadersInclude/morphTargetsVertex.js.map +1 -1
- package/Shaders/ShadersInclude/morphTargetsVertexDeclaration.js +2 -0
- package/Shaders/ShadersInclude/morphTargetsVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/helperFunctions.js +23 -21
- package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +6 -1
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.js +2 -0
- package/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.js.map +1 -1
- package/package.json +1 -1
|
@@ -20,7 +20,8 @@ export class MorphTargetManager {
|
|
|
20
20
|
this._blockCounter--;
|
|
21
21
|
if (this._blockCounter <= 0) {
|
|
22
22
|
this._blockCounter = 0;
|
|
23
|
-
this.
|
|
23
|
+
this._mustSynchronize = true;
|
|
24
|
+
this._syncActiveTargets();
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -36,6 +37,7 @@ export class MorphTargetManager {
|
|
|
36
37
|
this._targetInfluenceChangedObservers = new Array();
|
|
37
38
|
this._targetDataLayoutChangedObservers = new Array();
|
|
38
39
|
this._activeTargets = new SmartArray(16);
|
|
40
|
+
this._supportsPositions = false;
|
|
39
41
|
this._supportsNormals = false;
|
|
40
42
|
this._supportsTangents = false;
|
|
41
43
|
this._supportsUVs = false;
|
|
@@ -45,6 +47,7 @@ export class MorphTargetManager {
|
|
|
45
47
|
this._tempInfluences = new Array();
|
|
46
48
|
this._canUseTextureForTargets = false;
|
|
47
49
|
this._blockCounter = 0;
|
|
50
|
+
this._mustSynchronize = true;
|
|
48
51
|
/** @internal */
|
|
49
52
|
this._textureVertexStride = 0;
|
|
50
53
|
/** @internal */
|
|
@@ -57,6 +60,10 @@ export class MorphTargetManager {
|
|
|
57
60
|
* Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)
|
|
58
61
|
*/
|
|
59
62
|
this.optimizeInfluencers = true;
|
|
63
|
+
/**
|
|
64
|
+
* Gets or sets a boolean indicating if positions must be morphed
|
|
65
|
+
*/
|
|
66
|
+
this.enablePositionMorphing = true;
|
|
60
67
|
/**
|
|
61
68
|
* Gets or sets a boolean indicating if normals must be morphed
|
|
62
69
|
*/
|
|
@@ -103,7 +110,8 @@ export class MorphTargetManager {
|
|
|
103
110
|
return;
|
|
104
111
|
}
|
|
105
112
|
this._numMaxInfluencers = value;
|
|
106
|
-
this.
|
|
113
|
+
this._mustSynchronize = true;
|
|
114
|
+
this._syncActiveTargets();
|
|
107
115
|
}
|
|
108
116
|
/**
|
|
109
117
|
* Gets the unique ID of this manager
|
|
@@ -117,6 +125,12 @@ export class MorphTargetManager {
|
|
|
117
125
|
get vertexCount() {
|
|
118
126
|
return this._vertexCount;
|
|
119
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Gets a boolean indicating if this manager supports morphing of positions
|
|
130
|
+
*/
|
|
131
|
+
get supportsPositions() {
|
|
132
|
+
return this._supportsPositions && this.enablePositionMorphing;
|
|
133
|
+
}
|
|
120
134
|
/**
|
|
121
135
|
* Gets a boolean indicating if this manager supports morphing of normals
|
|
122
136
|
*/
|
|
@@ -167,7 +181,12 @@ export class MorphTargetManager {
|
|
|
167
181
|
return this._useTextureToStoreTargets;
|
|
168
182
|
}
|
|
169
183
|
set useTextureToStoreTargets(value) {
|
|
184
|
+
if (this._useTextureToStoreTargets === value) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
170
187
|
this._useTextureToStoreTargets = value;
|
|
188
|
+
this._mustSynchronize = true;
|
|
189
|
+
this._syncActiveTargets();
|
|
171
190
|
}
|
|
172
191
|
/**
|
|
173
192
|
* Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)
|
|
@@ -217,9 +236,11 @@ export class MorphTargetManager {
|
|
|
217
236
|
this._syncActiveTargets(needUpdate);
|
|
218
237
|
}));
|
|
219
238
|
this._targetDataLayoutChangedObservers.push(target._onDataLayoutChanged.add(() => {
|
|
220
|
-
this.
|
|
239
|
+
this._mustSynchronize = true;
|
|
240
|
+
this._syncActiveTargets();
|
|
221
241
|
}));
|
|
222
|
-
this.
|
|
242
|
+
this._mustSynchronize = true;
|
|
243
|
+
this._syncActiveTargets();
|
|
223
244
|
}
|
|
224
245
|
/**
|
|
225
246
|
* Removes a target from the manager
|
|
@@ -231,7 +252,8 @@ export class MorphTargetManager {
|
|
|
231
252
|
this._targets.splice(index, 1);
|
|
232
253
|
target.onInfluenceChanged.remove(this._targetInfluenceChangedObservers.splice(index, 1)[0]);
|
|
233
254
|
target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);
|
|
234
|
-
this.
|
|
255
|
+
this._mustSynchronize = true;
|
|
256
|
+
this._syncActiveTargets();
|
|
235
257
|
}
|
|
236
258
|
if (this._scene) {
|
|
237
259
|
this._scene.stopAnimation(target);
|
|
@@ -274,20 +296,18 @@ export class MorphTargetManager {
|
|
|
274
296
|
}
|
|
275
297
|
return serializationObject;
|
|
276
298
|
}
|
|
277
|
-
_syncActiveTargets(needUpdate) {
|
|
299
|
+
_syncActiveTargets(needUpdate = false) {
|
|
278
300
|
if (this.areUpdatesFrozen) {
|
|
279
301
|
return;
|
|
280
302
|
}
|
|
303
|
+
const wasUsingTextureForTargets = !!this._targetStoreTexture;
|
|
304
|
+
const isUsingTextureForTargets = this.isUsingTextureForTargets;
|
|
305
|
+
if (this._mustSynchronize || wasUsingTextureForTargets !== isUsingTextureForTargets) {
|
|
306
|
+
this._mustSynchronize = false;
|
|
307
|
+
this.synchronize();
|
|
308
|
+
}
|
|
281
309
|
let influenceCount = 0;
|
|
282
310
|
this._activeTargets.reset();
|
|
283
|
-
this._supportsNormals = true;
|
|
284
|
-
this._supportsTangents = true;
|
|
285
|
-
this._supportsUVs = true;
|
|
286
|
-
this._supportsUV2s = true;
|
|
287
|
-
this._vertexCount = 0;
|
|
288
|
-
if (this._scene && this._targets.length > this._scene.getEngine().getCaps().texture2DArrayMaxLayerCount) {
|
|
289
|
-
this.useTextureToStoreTargets = false;
|
|
290
|
-
}
|
|
291
311
|
if (!this._morphTargetTextureIndices || this._morphTargetTextureIndices.length !== this._targets.length) {
|
|
292
312
|
this._morphTargetTextureIndices = new Float32Array(this._targets.length);
|
|
293
313
|
}
|
|
@@ -303,21 +323,6 @@ export class MorphTargetManager {
|
|
|
303
323
|
this._activeTargets.push(target);
|
|
304
324
|
this._morphTargetTextureIndices[influenceCount] = targetIndex;
|
|
305
325
|
this._tempInfluences[influenceCount++] = target.influence;
|
|
306
|
-
this._supportsNormals = this._supportsNormals && target.hasNormals;
|
|
307
|
-
this._supportsTangents = this._supportsTangents && target.hasTangents;
|
|
308
|
-
this._supportsUVs = this._supportsUVs && target.hasUVs;
|
|
309
|
-
this._supportsUV2s = this._supportsUV2s && target.hasUV2s;
|
|
310
|
-
const positions = target.getPositions();
|
|
311
|
-
if (positions) {
|
|
312
|
-
const vertexCount = positions.length / 3;
|
|
313
|
-
if (this._vertexCount === 0) {
|
|
314
|
-
this._vertexCount = vertexCount;
|
|
315
|
-
}
|
|
316
|
-
else if (this._vertexCount !== vertexCount) {
|
|
317
|
-
Logger.Error("Incompatible target. Targets must all have the same vertices count.");
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
326
|
}
|
|
322
327
|
if (this._morphTargetTextureIndices.length !== influenceCount) {
|
|
323
328
|
this._morphTargetTextureIndices = this._morphTargetTextureIndices.slice(0, influenceCount);
|
|
@@ -328,8 +333,17 @@ export class MorphTargetManager {
|
|
|
328
333
|
for (let index = 0; index < influenceCount; index++) {
|
|
329
334
|
this._influences[index] = this._tempInfluences[index];
|
|
330
335
|
}
|
|
331
|
-
if (needUpdate) {
|
|
332
|
-
this.
|
|
336
|
+
if (needUpdate && this._scene) {
|
|
337
|
+
for (const mesh of this._scene.meshes) {
|
|
338
|
+
if (mesh.morphTargetManager === this) {
|
|
339
|
+
if (isUsingTextureForTargets) {
|
|
340
|
+
mesh._markSubMeshesAsAttributesDirty();
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
mesh._syncGeometryWithMorphTargetManager();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
333
347
|
}
|
|
334
348
|
}
|
|
335
349
|
/**
|
|
@@ -339,86 +353,91 @@ export class MorphTargetManager {
|
|
|
339
353
|
if (!this._scene || this.areUpdatesFrozen) {
|
|
340
354
|
return;
|
|
341
355
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
356
|
+
const engine = this._scene.getEngine();
|
|
357
|
+
this._supportsPositions = true;
|
|
358
|
+
this._supportsNormals = true;
|
|
359
|
+
this._supportsTangents = true;
|
|
360
|
+
this._supportsUVs = true;
|
|
361
|
+
this._supportsUV2s = true;
|
|
362
|
+
this._vertexCount = 0;
|
|
363
|
+
this._targetStoreTexture?.dispose();
|
|
364
|
+
this._targetStoreTexture = null;
|
|
365
|
+
if (this.isUsingTextureForTargets && this._targets.length > engine.getCaps().texture2DArrayMaxLayerCount) {
|
|
366
|
+
this.useTextureToStoreTargets = false;
|
|
367
|
+
}
|
|
368
|
+
for (const target of this._targets) {
|
|
369
|
+
this._supportsPositions = this._supportsPositions && target.hasPositions;
|
|
370
|
+
this._supportsNormals = this._supportsNormals && target.hasNormals;
|
|
371
|
+
this._supportsTangents = this._supportsTangents && target.hasTangents;
|
|
372
|
+
this._supportsUVs = this._supportsUVs && target.hasUVs;
|
|
373
|
+
this._supportsUV2s = this._supportsUV2s && target.hasUV2s;
|
|
374
|
+
const vertexCount = target.vertexCount;
|
|
375
|
+
if (this._vertexCount === 0) {
|
|
376
|
+
this._vertexCount = vertexCount;
|
|
352
377
|
}
|
|
353
|
-
if (this.
|
|
354
|
-
this.
|
|
378
|
+
else if (this._vertexCount !== vertexCount) {
|
|
379
|
+
Logger.Error(`Incompatible target. Targets must all have the same vertices count. Current vertex count: ${this._vertexCount}, vertex count for target "${target.name}": ${vertexCount}`);
|
|
380
|
+
return;
|
|
355
381
|
}
|
|
382
|
+
}
|
|
383
|
+
if (this.isUsingTextureForTargets) {
|
|
384
|
+
this._textureVertexStride = 0;
|
|
385
|
+
this._supportsPositions && this._textureVertexStride++;
|
|
386
|
+
this._supportsNormals && this._textureVertexStride++;
|
|
387
|
+
this._supportsTangents && this._textureVertexStride++;
|
|
388
|
+
this._supportsUVs && this._textureVertexStride++;
|
|
389
|
+
this.supportsUV2s && this._textureVertexStride++;
|
|
356
390
|
this._textureWidth = this._vertexCount * this._textureVertexStride || 1;
|
|
357
391
|
this._textureHeight = 1;
|
|
358
|
-
const maxTextureSize =
|
|
392
|
+
const maxTextureSize = engine.getCaps().maxTextureSize;
|
|
359
393
|
if (this._textureWidth > maxTextureSize) {
|
|
360
394
|
this._textureHeight = Math.ceil(this._textureWidth / maxTextureSize);
|
|
361
395
|
this._textureWidth = maxTextureSize;
|
|
362
396
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
let offset = 0;
|
|
377
|
-
for (let index = 0; index < targetCount; index++) {
|
|
378
|
-
const target = this._targets[index];
|
|
379
|
-
const positions = target.getPositions();
|
|
380
|
-
const normals = target.getNormals();
|
|
381
|
-
const uvs = target.getUVs();
|
|
382
|
-
const tangents = target.getTangents();
|
|
383
|
-
const uv2s = target.getUV2s();
|
|
384
|
-
if (!positions) {
|
|
385
|
-
if (index === 0) {
|
|
386
|
-
Logger.Error("Invalid morph target. Target must have positions.");
|
|
387
|
-
}
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
offset = index * this._textureWidth * this._textureHeight * 4;
|
|
391
|
-
for (let vertex = 0; vertex < this._vertexCount; vertex++) {
|
|
397
|
+
const targetCount = this._targets.length;
|
|
398
|
+
const data = new Float32Array(targetCount * this._textureWidth * this._textureHeight * 4);
|
|
399
|
+
let offset = 0;
|
|
400
|
+
for (let index = 0; index < targetCount; index++) {
|
|
401
|
+
const target = this._targets[index];
|
|
402
|
+
const positions = target.getPositions();
|
|
403
|
+
const normals = target.getNormals();
|
|
404
|
+
const uvs = target.getUVs();
|
|
405
|
+
const tangents = target.getTangents();
|
|
406
|
+
const uv2s = target.getUV2s();
|
|
407
|
+
offset = index * this._textureWidth * this._textureHeight * 4;
|
|
408
|
+
for (let vertex = 0; vertex < this._vertexCount; vertex++) {
|
|
409
|
+
if (this._supportsPositions && positions) {
|
|
392
410
|
data[offset] = positions[vertex * 3];
|
|
393
411
|
data[offset + 1] = positions[vertex * 3 + 1];
|
|
394
412
|
data[offset + 2] = positions[vertex * 3 + 2];
|
|
395
413
|
offset += 4;
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
414
|
+
}
|
|
415
|
+
if (this._supportsNormals && normals) {
|
|
416
|
+
data[offset] = normals[vertex * 3];
|
|
417
|
+
data[offset + 1] = normals[vertex * 3 + 1];
|
|
418
|
+
data[offset + 2] = normals[vertex * 3 + 2];
|
|
419
|
+
offset += 4;
|
|
420
|
+
}
|
|
421
|
+
if (this._supportsUVs && uvs) {
|
|
422
|
+
data[offset] = uvs[vertex * 2];
|
|
423
|
+
data[offset + 1] = uvs[vertex * 2 + 1];
|
|
424
|
+
offset += 4;
|
|
425
|
+
}
|
|
426
|
+
if (this._supportsTangents && tangents) {
|
|
427
|
+
data[offset] = tangents[vertex * 3];
|
|
428
|
+
data[offset + 1] = tangents[vertex * 3 + 1];
|
|
429
|
+
data[offset + 2] = tangents[vertex * 3 + 2];
|
|
430
|
+
offset += 4;
|
|
431
|
+
}
|
|
432
|
+
if (this._supportsUV2s && uv2s) {
|
|
433
|
+
data[offset] = uv2s[vertex * 2];
|
|
434
|
+
data[offset + 1] = uv2s[vertex * 2 + 1];
|
|
435
|
+
offset += 4;
|
|
418
436
|
}
|
|
419
437
|
}
|
|
420
|
-
this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(data, this._textureWidth, this._textureHeight, targetCount, this._scene, false, false, 1, 1);
|
|
421
438
|
}
|
|
439
|
+
this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(data, this._textureWidth, this._textureHeight, targetCount, this._scene, false, false, 1, 1);
|
|
440
|
+
this._targetStoreTexture.name = `Morph texture_${this.uniqueId}`;
|
|
422
441
|
}
|
|
423
442
|
// Flag meshes as dirty to resync with the active targets
|
|
424
443
|
for (const mesh of this._scene.meshes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morphTargetManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Morph/morphTargetManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { MorphTarget } from \"./morphTarget\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RawTexture2DArray } from \"../Materials/Textures/rawTexture2DArray\";\r\nimport type { IAssetContainer } from \"core/IAssetContainer\";\r\n/**\r\n * This class is used to deform meshes using morphing between different targets\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\nexport class MorphTargetManager implements IDisposable {\r\n /** Enable storing morph target data into textures when set to true (true by default) */\r\n public static EnableTextureStorage = true;\r\n\r\n /** Maximum number of active morph targets supported in the \"vertex attribute\" mode (i.e., not the \"texture\" mode) */\r\n public static MaxActiveMorphTargetsInVertexAttributeMode = 8;\r\n\r\n private _targets = new Array<MorphTarget>();\r\n private _targetInfluenceChangedObservers = new Array<Nullable<Observer<boolean>>>();\r\n private _targetDataLayoutChangedObservers = new Array<Nullable<Observer<void>>>();\r\n private _activeTargets = new SmartArray<MorphTarget>(16);\r\n private _scene: Nullable<Scene>;\r\n private _influences: Float32Array;\r\n private _supportsNormals = false;\r\n private _supportsTangents = false;\r\n private _supportsUVs = false;\r\n private _supportsUV2s = false;\r\n private _vertexCount = 0;\r\n private _uniqueId = 0;\r\n private _tempInfluences = new Array<number>();\r\n private _canUseTextureForTargets = false;\r\n private _blockCounter = 0;\r\n\r\n /** @internal */\r\n public _textureVertexStride = 0;\r\n\r\n /** @internal */\r\n public _textureWidth = 0;\r\n\r\n /** @internal */\r\n public _textureHeight = 1;\r\n\r\n /** @internal */\r\n public _morphTargetTextureIndices: Float32Array;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable<IAssetContainer> = null;\r\n\r\n /** @internal */\r\n public _targetStoreTexture: Nullable<RawTexture2DArray>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)\r\n */\r\n public optimizeInfluencers = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if normals must be morphed\r\n */\r\n public enableNormalMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if tangents must be morphed\r\n */\r\n public enableTangentMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if UV must be morphed\r\n */\r\n public enableUVMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if UV2 must be morphed\r\n */\r\n public enableUV2Morphing = true;\r\n\r\n /**\r\n * Sets a boolean indicating that adding new target or updating an existing target will not update the underlying data buffers\r\n */\r\n public set areUpdatesFrozen(block: boolean) {\r\n if (block) {\r\n this._blockCounter++;\r\n } else {\r\n this._blockCounter--;\r\n if (this._blockCounter <= 0) {\r\n this._blockCounter = 0;\r\n\r\n this._syncActiveTargets(true);\r\n }\r\n }\r\n }\r\n\r\n public get areUpdatesFrozen() {\r\n return this._blockCounter > 0;\r\n }\r\n\r\n /**\r\n * Creates a new MorphTargetManager\r\n * @param scene defines the current scene\r\n */\r\n public constructor(scene: Nullable<Scene> = null) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene;\r\n }\r\n\r\n this._scene = scene;\r\n\r\n if (this._scene) {\r\n this._scene.addMorphTargetManager(this);\r\n\r\n this._uniqueId = this._scene.getUniqueId();\r\n\r\n const engineCaps = this._scene.getEngine().getCaps();\r\n this._canUseTextureForTargets =\r\n engineCaps.canUseGLVertexID && engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0 && engineCaps.texture2DArrayMaxLayerCount > 1;\r\n }\r\n }\r\n\r\n private _numMaxInfluencers = 0;\r\n\r\n /**\r\n * Gets or sets the maximum number of influencers (targets) (default value: 0).\r\n * Setting a value for this property can lead to a smoother experience, as only one shader will be compiled, which will use this value as the maximum number of influencers.\r\n * If you leave the value at 0 (default), a new shader will be compiled every time the number of active influencers changes. This can cause problems, as compiling a shader takes time.\r\n * If you assign a non-zero value to this property, you need to ensure that this value is greater than the maximum number of (active) influencers you'll need for this morph manager.\r\n * Otherwise, the number of active influencers will be truncated at the value you set for this property, which can lead to unexpected results.\r\n * Note that this property has no effect if \"useTextureToStoreTargets\" is false.\r\n */\r\n public get numMaxInfluencers(): number {\r\n return this._numMaxInfluencers;\r\n }\r\n\r\n public set numMaxInfluencers(value: number) {\r\n if (this._numMaxInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._numMaxInfluencers = value;\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n /**\r\n * Gets the unique ID of this manager\r\n */\r\n public get uniqueId(): number {\r\n return this._uniqueId;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices handled by this manager\r\n */\r\n public get vertexCount(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of normals\r\n */\r\n public get supportsNormals(): boolean {\r\n return this._supportsNormals && this.enableNormalMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of tangents\r\n */\r\n public get supportsTangents(): boolean {\r\n return this._supportsTangents && this.enableTangentMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of texture coordinates\r\n */\r\n public get supportsUVs(): boolean {\r\n return this._supportsUVs && this.enableUVMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of texture coordinates 2\r\n */\r\n public get supportsUV2s(): boolean {\r\n return this._supportsUV2s && this.enableUV2Morphing;\r\n }\r\n\r\n /**\r\n * Gets the number of targets stored in this manager\r\n */\r\n public get numTargets(): number {\r\n return this._targets.length;\r\n }\r\n\r\n /**\r\n * Gets the number of influencers (ie. the number of targets with influences > 0)\r\n */\r\n public get numInfluencers(): number {\r\n return this._activeTargets.length;\r\n }\r\n\r\n /**\r\n * Gets the list of influences (one per target)\r\n */\r\n public get influences(): Float32Array {\r\n return this._influences;\r\n }\r\n\r\n private _useTextureToStoreTargets = true;\r\n /**\r\n * Gets or sets a boolean indicating that targets should be stored as a texture instead of using vertex attributes (default is true).\r\n * Please note that this option is not available if the hardware does not support it\r\n */\r\n public get useTextureToStoreTargets(): boolean {\r\n return this._useTextureToStoreTargets;\r\n }\r\n\r\n public set useTextureToStoreTargets(value: boolean) {\r\n this._useTextureToStoreTargets = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)\r\n */\r\n public get isUsingTextureForTargets() {\r\n return (\r\n MorphTargetManager.EnableTextureStorage &&\r\n this.useTextureToStoreTargets &&\r\n this._canUseTextureForTargets &&\r\n !this._scene?.getEngine().getCaps().disableMorphTargetTexture\r\n );\r\n }\r\n\r\n /**\r\n * Gets the active target at specified index. An active target is a target with an influence > 0\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getActiveTarget(index: number): MorphTarget {\r\n return this._activeTargets.data[index];\r\n }\r\n\r\n /**\r\n * Gets the target at specified index\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getTarget(index: number): MorphTarget {\r\n return this._targets[index];\r\n }\r\n\r\n /**\r\n * Gets the first target with the specified name\r\n * @param name defines the name to check\r\n * @returns the requested target\r\n */\r\n public getTargetByName(name: string): Nullable<MorphTarget> {\r\n for (const target of this._targets) {\r\n if (target.name === name) {\r\n return target;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Add a new target to this manager\r\n * @param target defines the target to add\r\n */\r\n public addTarget(target: MorphTarget): void {\r\n this._targets.push(target);\r\n this._targetInfluenceChangedObservers.push(\r\n target.onInfluenceChanged.add((needUpdate) => {\r\n this._syncActiveTargets(needUpdate);\r\n })\r\n );\r\n this._targetDataLayoutChangedObservers.push(\r\n target._onDataLayoutChanged.add(() => {\r\n this._syncActiveTargets(true);\r\n })\r\n );\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n /**\r\n * Removes a target from the manager\r\n * @param target defines the target to remove\r\n */\r\n public removeTarget(target: MorphTarget): void {\r\n const index = this._targets.indexOf(target);\r\n if (index >= 0) {\r\n this._targets.splice(index, 1);\r\n\r\n target.onInfluenceChanged.remove(this._targetInfluenceChangedObservers.splice(index, 1)[0]);\r\n target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n if (this._scene) {\r\n this._scene.stopAnimation(target);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(effect: Effect) {\r\n effect.setFloat3(\"morphTargetTextureInfo\", this._textureVertexStride, this._textureWidth, this._textureHeight);\r\n effect.setFloatArray(\"morphTargetTextureIndices\", this._morphTargetTextureIndices);\r\n effect.setTexture(\"morphTargets\", this._targetStoreTexture);\r\n effect.setInt(\"morphTargetCount\", this.numInfluencers);\r\n }\r\n\r\n /**\r\n * Clone the current manager\r\n * @returns a new MorphTargetManager\r\n */\r\n public clone(): MorphTargetManager {\r\n const copy = new MorphTargetManager(this._scene);\r\n\r\n for (const target of this._targets) {\r\n copy.addTarget(target.clone());\r\n }\r\n\r\n copy.enableNormalMorphing = this.enableNormalMorphing;\r\n copy.enableTangentMorphing = this.enableTangentMorphing;\r\n copy.enableUVMorphing = this.enableUVMorphing;\r\n copy.enableUV2Morphing = this.enableUV2Morphing;\r\n\r\n return copy;\r\n }\r\n\r\n /**\r\n * Serializes the current manager into a Serialization object\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.id = this.uniqueId;\r\n\r\n serializationObject.targets = [];\r\n for (const target of this._targets) {\r\n serializationObject.targets.push(target.serialize());\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _syncActiveTargets(needUpdate: boolean): void {\r\n if (this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n let influenceCount = 0;\r\n this._activeTargets.reset();\r\n this._supportsNormals = true;\r\n this._supportsTangents = true;\r\n this._supportsUVs = true;\r\n this._supportsUV2s = true;\r\n this._vertexCount = 0;\r\n\r\n if (this._scene && this._targets.length > this._scene.getEngine().getCaps().texture2DArrayMaxLayerCount) {\r\n this.useTextureToStoreTargets = false;\r\n }\r\n\r\n if (!this._morphTargetTextureIndices || this._morphTargetTextureIndices.length !== this._targets.length) {\r\n this._morphTargetTextureIndices = new Float32Array(this._targets.length);\r\n }\r\n\r\n let targetIndex = -1;\r\n for (const target of this._targets) {\r\n targetIndex++;\r\n if (target.influence === 0 && this.optimizeInfluencers) {\r\n continue;\r\n }\r\n\r\n if (this._activeTargets.length >= MorphTargetManager.MaxActiveMorphTargetsInVertexAttributeMode && !this.isUsingTextureForTargets) {\r\n break;\r\n }\r\n\r\n this._activeTargets.push(target);\r\n this._morphTargetTextureIndices[influenceCount] = targetIndex;\r\n this._tempInfluences[influenceCount++] = target.influence;\r\n\r\n this._supportsNormals = this._supportsNormals && target.hasNormals;\r\n this._supportsTangents = this._supportsTangents && target.hasTangents;\r\n this._supportsUVs = this._supportsUVs && target.hasUVs;\r\n this._supportsUV2s = this._supportsUV2s && target.hasUV2s;\r\n\r\n const positions = target.getPositions();\r\n if (positions) {\r\n const vertexCount = positions.length / 3;\r\n if (this._vertexCount === 0) {\r\n this._vertexCount = vertexCount;\r\n } else if (this._vertexCount !== vertexCount) {\r\n Logger.Error(\"Incompatible target. Targets must all have the same vertices count.\");\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this._morphTargetTextureIndices.length !== influenceCount) {\r\n this._morphTargetTextureIndices = this._morphTargetTextureIndices.slice(0, influenceCount);\r\n }\r\n\r\n if (!this._influences || this._influences.length !== influenceCount) {\r\n this._influences = new Float32Array(influenceCount);\r\n }\r\n\r\n for (let index = 0; index < influenceCount; index++) {\r\n this._influences[index] = this._tempInfluences[index];\r\n }\r\n\r\n if (needUpdate) {\r\n this.synchronize();\r\n }\r\n }\r\n\r\n /**\r\n * Synchronize the targets with all the meshes using this morph target manager\r\n */\r\n public synchronize(): void {\r\n if (!this._scene || this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n if (this.isUsingTextureForTargets && (this._vertexCount || this.numMaxInfluencers > 0)) {\r\n this._textureVertexStride = 1;\r\n\r\n if (this._supportsNormals) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this._supportsTangents) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this._supportsUVs) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this.supportsUV2s) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n this._textureWidth = this._vertexCount * this._textureVertexStride || 1;\r\n this._textureHeight = 1;\r\n\r\n const maxTextureSize = this._scene.getEngine().getCaps().maxTextureSize;\r\n if (this._textureWidth > maxTextureSize) {\r\n this._textureHeight = Math.ceil(this._textureWidth / maxTextureSize);\r\n this._textureWidth = maxTextureSize;\r\n }\r\n\r\n let mustUpdateTexture = true;\r\n if (this._targetStoreTexture) {\r\n const textureSize = this._targetStoreTexture.getSize();\r\n if (textureSize.width === this._textureWidth && textureSize.height === this._textureHeight && this._targetStoreTexture.depth === this._targets.length) {\r\n mustUpdateTexture = false;\r\n }\r\n }\r\n\r\n if (mustUpdateTexture) {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n const targetCount = this._targets.length;\r\n const data = new Float32Array(targetCount * this._textureWidth * this._textureHeight * 4);\r\n\r\n let offset = 0;\r\n for (let index = 0; index < targetCount; index++) {\r\n const target = this._targets[index];\r\n\r\n const positions = target.getPositions();\r\n const normals = target.getNormals();\r\n const uvs = target.getUVs();\r\n const tangents = target.getTangents();\r\n const uv2s = target.getUV2s();\r\n\r\n if (!positions) {\r\n if (index === 0) {\r\n Logger.Error(\"Invalid morph target. Target must have positions.\");\r\n }\r\n return;\r\n }\r\n\r\n offset = index * this._textureWidth * this._textureHeight * 4;\r\n for (let vertex = 0; vertex < this._vertexCount; vertex++) {\r\n data[offset] = positions[vertex * 3];\r\n data[offset + 1] = positions[vertex * 3 + 1];\r\n data[offset + 2] = positions[vertex * 3 + 2];\r\n\r\n offset += 4;\r\n\r\n if (this._supportsNormals && normals) {\r\n data[offset] = normals[vertex * 3];\r\n data[offset + 1] = normals[vertex * 3 + 1];\r\n data[offset + 2] = normals[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsUVs && uvs) {\r\n data[offset] = uvs[vertex * 2];\r\n data[offset + 1] = uvs[vertex * 2 + 1];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsTangents && tangents) {\r\n data[offset] = tangents[vertex * 3];\r\n data[offset + 1] = tangents[vertex * 3 + 1];\r\n data[offset + 2] = tangents[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsUV2s && uv2s) {\r\n data[offset] = uv2s[vertex * 2];\r\n data[offset + 1] = uv2s[vertex * 2 + 1];\r\n offset += 4;\r\n }\r\n }\r\n }\r\n\r\n this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(\r\n data,\r\n this._textureWidth,\r\n this._textureHeight,\r\n targetCount,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n\r\n // Flag meshes as dirty to resync with the active targets\r\n for (const mesh of this._scene.meshes) {\r\n if ((<any>mesh).morphTargetManager === this) {\r\n (<Mesh>mesh)._syncGeometryWithMorphTargetManager();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose() {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n this._targetStoreTexture = null;\r\n\r\n // Remove from scene\r\n if (this._scene) {\r\n this._scene.removeMorphTargetManager(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.morphTargetManagers.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.morphTargetManagers.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n for (const morph of this._targets) {\r\n this._scene.stopAnimation(morph);\r\n }\r\n }\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new MorphTargetManager from serialized data\r\n * @param serializationObject defines the serialized data\r\n * @param scene defines the hosting scene\r\n * @returns the new MorphTargetManager\r\n */\r\n public static Parse(serializationObject: any, scene: Scene): MorphTargetManager {\r\n const result = new MorphTargetManager(scene);\r\n\r\n for (const targetData of serializationObject.targets) {\r\n result.addTarget(MorphTarget.Parse(targetData, scene));\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"morphTargetManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Morph/morphTargetManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { MorphTarget } from \"./morphTarget\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RawTexture2DArray } from \"../Materials/Textures/rawTexture2DArray\";\r\nimport type { IAssetContainer } from \"core/IAssetContainer\";\r\n/**\r\n * This class is used to deform meshes using morphing between different targets\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\nexport class MorphTargetManager implements IDisposable {\r\n /** Enable storing morph target data into textures when set to true (true by default) */\r\n public static EnableTextureStorage = true;\r\n\r\n /** Maximum number of active morph targets supported in the \"vertex attribute\" mode (i.e., not the \"texture\" mode) */\r\n public static MaxActiveMorphTargetsInVertexAttributeMode = 8;\r\n\r\n private _targets = new Array<MorphTarget>();\r\n private _targetInfluenceChangedObservers = new Array<Nullable<Observer<boolean>>>();\r\n private _targetDataLayoutChangedObservers = new Array<Nullable<Observer<void>>>();\r\n private _activeTargets = new SmartArray<MorphTarget>(16);\r\n private _scene: Nullable<Scene>;\r\n private _influences: Float32Array;\r\n private _supportsPositions = false;\r\n private _supportsNormals = false;\r\n private _supportsTangents = false;\r\n private _supportsUVs = false;\r\n private _supportsUV2s = false;\r\n private _vertexCount = 0;\r\n private _uniqueId = 0;\r\n private _tempInfluences = new Array<number>();\r\n private _canUseTextureForTargets = false;\r\n private _blockCounter = 0;\r\n private _mustSynchronize = true;\r\n\r\n /** @internal */\r\n public _textureVertexStride = 0;\r\n\r\n /** @internal */\r\n public _textureWidth = 0;\r\n\r\n /** @internal */\r\n public _textureHeight = 1;\r\n\r\n /** @internal */\r\n public _morphTargetTextureIndices: Float32Array;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable<IAssetContainer> = null;\r\n\r\n /** @internal */\r\n public _targetStoreTexture: Nullable<RawTexture2DArray>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)\r\n */\r\n public optimizeInfluencers = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if positions must be morphed\r\n */\r\n public enablePositionMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if normals must be morphed\r\n */\r\n public enableNormalMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if tangents must be morphed\r\n */\r\n public enableTangentMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if UV must be morphed\r\n */\r\n public enableUVMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if UV2 must be morphed\r\n */\r\n public enableUV2Morphing = true;\r\n\r\n /**\r\n * Sets a boolean indicating that adding new target or updating an existing target will not update the underlying data buffers\r\n */\r\n public set areUpdatesFrozen(block: boolean) {\r\n if (block) {\r\n this._blockCounter++;\r\n } else {\r\n this._blockCounter--;\r\n if (this._blockCounter <= 0) {\r\n this._blockCounter = 0;\r\n\r\n this._mustSynchronize = true;\r\n this._syncActiveTargets();\r\n }\r\n }\r\n }\r\n\r\n public get areUpdatesFrozen() {\r\n return this._blockCounter > 0;\r\n }\r\n\r\n /**\r\n * Creates a new MorphTargetManager\r\n * @param scene defines the current scene\r\n */\r\n public constructor(scene: Nullable<Scene> = null) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene;\r\n }\r\n\r\n this._scene = scene;\r\n\r\n if (this._scene) {\r\n this._scene.addMorphTargetManager(this);\r\n\r\n this._uniqueId = this._scene.getUniqueId();\r\n\r\n const engineCaps = this._scene.getEngine().getCaps();\r\n this._canUseTextureForTargets =\r\n engineCaps.canUseGLVertexID && engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0 && engineCaps.texture2DArrayMaxLayerCount > 1;\r\n }\r\n }\r\n\r\n private _numMaxInfluencers = 0;\r\n\r\n /**\r\n * Gets or sets the maximum number of influencers (targets) (default value: 0).\r\n * Setting a value for this property can lead to a smoother experience, as only one shader will be compiled, which will use this value as the maximum number of influencers.\r\n * If you leave the value at 0 (default), a new shader will be compiled every time the number of active influencers changes. This can cause problems, as compiling a shader takes time.\r\n * If you assign a non-zero value to this property, you need to ensure that this value is greater than the maximum number of (active) influencers you'll need for this morph manager.\r\n * Otherwise, the number of active influencers will be truncated at the value you set for this property, which can lead to unexpected results.\r\n * Note that this property has no effect if \"useTextureToStoreTargets\" is false.\r\n */\r\n public get numMaxInfluencers(): number {\r\n return this._numMaxInfluencers;\r\n }\r\n\r\n public set numMaxInfluencers(value: number) {\r\n if (this._numMaxInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._numMaxInfluencers = value;\r\n this._mustSynchronize = true;\r\n this._syncActiveTargets();\r\n }\r\n\r\n /**\r\n * Gets the unique ID of this manager\r\n */\r\n public get uniqueId(): number {\r\n return this._uniqueId;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices handled by this manager\r\n */\r\n public get vertexCount(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of positions\r\n */\r\n public get supportsPositions(): boolean {\r\n return this._supportsPositions && this.enablePositionMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of normals\r\n */\r\n public get supportsNormals(): boolean {\r\n return this._supportsNormals && this.enableNormalMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of tangents\r\n */\r\n public get supportsTangents(): boolean {\r\n return this._supportsTangents && this.enableTangentMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of texture coordinates\r\n */\r\n public get supportsUVs(): boolean {\r\n return this._supportsUVs && this.enableUVMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of texture coordinates 2\r\n */\r\n public get supportsUV2s(): boolean {\r\n return this._supportsUV2s && this.enableUV2Morphing;\r\n }\r\n\r\n /**\r\n * Gets the number of targets stored in this manager\r\n */\r\n public get numTargets(): number {\r\n return this._targets.length;\r\n }\r\n\r\n /**\r\n * Gets the number of influencers (ie. the number of targets with influences > 0)\r\n */\r\n public get numInfluencers(): number {\r\n return this._activeTargets.length;\r\n }\r\n\r\n /**\r\n * Gets the list of influences (one per target)\r\n */\r\n public get influences(): Float32Array {\r\n return this._influences;\r\n }\r\n\r\n private _useTextureToStoreTargets = true;\r\n /**\r\n * Gets or sets a boolean indicating that targets should be stored as a texture instead of using vertex attributes (default is true).\r\n * Please note that this option is not available if the hardware does not support it\r\n */\r\n public get useTextureToStoreTargets(): boolean {\r\n return this._useTextureToStoreTargets;\r\n }\r\n\r\n public set useTextureToStoreTargets(value: boolean) {\r\n if (this._useTextureToStoreTargets === value) {\r\n return;\r\n }\r\n this._useTextureToStoreTargets = value;\r\n this._mustSynchronize = true;\r\n this._syncActiveTargets();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)\r\n */\r\n public get isUsingTextureForTargets() {\r\n return (\r\n MorphTargetManager.EnableTextureStorage &&\r\n this.useTextureToStoreTargets &&\r\n this._canUseTextureForTargets &&\r\n !this._scene?.getEngine().getCaps().disableMorphTargetTexture\r\n );\r\n }\r\n\r\n /**\r\n * Gets the active target at specified index. An active target is a target with an influence > 0\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getActiveTarget(index: number): MorphTarget {\r\n return this._activeTargets.data[index];\r\n }\r\n\r\n /**\r\n * Gets the target at specified index\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getTarget(index: number): MorphTarget {\r\n return this._targets[index];\r\n }\r\n\r\n /**\r\n * Gets the first target with the specified name\r\n * @param name defines the name to check\r\n * @returns the requested target\r\n */\r\n public getTargetByName(name: string): Nullable<MorphTarget> {\r\n for (const target of this._targets) {\r\n if (target.name === name) {\r\n return target;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Add a new target to this manager\r\n * @param target defines the target to add\r\n */\r\n public addTarget(target: MorphTarget): void {\r\n this._targets.push(target);\r\n this._targetInfluenceChangedObservers.push(\r\n target.onInfluenceChanged.add((needUpdate) => {\r\n this._syncActiveTargets(needUpdate);\r\n })\r\n );\r\n this._targetDataLayoutChangedObservers.push(\r\n target._onDataLayoutChanged.add(() => {\r\n this._mustSynchronize = true;\r\n this._syncActiveTargets();\r\n })\r\n );\r\n this._mustSynchronize = true;\r\n this._syncActiveTargets();\r\n }\r\n\r\n /**\r\n * Removes a target from the manager\r\n * @param target defines the target to remove\r\n */\r\n public removeTarget(target: MorphTarget): void {\r\n const index = this._targets.indexOf(target);\r\n if (index >= 0) {\r\n this._targets.splice(index, 1);\r\n\r\n target.onInfluenceChanged.remove(this._targetInfluenceChangedObservers.splice(index, 1)[0]);\r\n target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);\r\n this._mustSynchronize = true;\r\n this._syncActiveTargets();\r\n }\r\n\r\n if (this._scene) {\r\n this._scene.stopAnimation(target);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(effect: Effect) {\r\n effect.setFloat3(\"morphTargetTextureInfo\", this._textureVertexStride, this._textureWidth, this._textureHeight);\r\n effect.setFloatArray(\"morphTargetTextureIndices\", this._morphTargetTextureIndices);\r\n effect.setTexture(\"morphTargets\", this._targetStoreTexture);\r\n effect.setInt(\"morphTargetCount\", this.numInfluencers);\r\n }\r\n\r\n /**\r\n * Clone the current manager\r\n * @returns a new MorphTargetManager\r\n */\r\n public clone(): MorphTargetManager {\r\n const copy = new MorphTargetManager(this._scene);\r\n\r\n for (const target of this._targets) {\r\n copy.addTarget(target.clone());\r\n }\r\n\r\n copy.enableNormalMorphing = this.enableNormalMorphing;\r\n copy.enableTangentMorphing = this.enableTangentMorphing;\r\n copy.enableUVMorphing = this.enableUVMorphing;\r\n copy.enableUV2Morphing = this.enableUV2Morphing;\r\n\r\n return copy;\r\n }\r\n\r\n /**\r\n * Serializes the current manager into a Serialization object\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.id = this.uniqueId;\r\n\r\n serializationObject.targets = [];\r\n for (const target of this._targets) {\r\n serializationObject.targets.push(target.serialize());\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _syncActiveTargets(needUpdate = false): void {\r\n if (this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n const wasUsingTextureForTargets = !!this._targetStoreTexture;\r\n const isUsingTextureForTargets = this.isUsingTextureForTargets;\r\n\r\n if (this._mustSynchronize || wasUsingTextureForTargets !== isUsingTextureForTargets) {\r\n this._mustSynchronize = false;\r\n this.synchronize();\r\n }\r\n\r\n let influenceCount = 0;\r\n this._activeTargets.reset();\r\n\r\n if (!this._morphTargetTextureIndices || this._morphTargetTextureIndices.length !== this._targets.length) {\r\n this._morphTargetTextureIndices = new Float32Array(this._targets.length);\r\n }\r\n\r\n let targetIndex = -1;\r\n for (const target of this._targets) {\r\n targetIndex++;\r\n if (target.influence === 0 && this.optimizeInfluencers) {\r\n continue;\r\n }\r\n\r\n if (this._activeTargets.length >= MorphTargetManager.MaxActiveMorphTargetsInVertexAttributeMode && !this.isUsingTextureForTargets) {\r\n break;\r\n }\r\n\r\n this._activeTargets.push(target);\r\n this._morphTargetTextureIndices[influenceCount] = targetIndex;\r\n this._tempInfluences[influenceCount++] = target.influence;\r\n }\r\n\r\n if (this._morphTargetTextureIndices.length !== influenceCount) {\r\n this._morphTargetTextureIndices = this._morphTargetTextureIndices.slice(0, influenceCount);\r\n }\r\n\r\n if (!this._influences || this._influences.length !== influenceCount) {\r\n this._influences = new Float32Array(influenceCount);\r\n }\r\n\r\n for (let index = 0; index < influenceCount; index++) {\r\n this._influences[index] = this._tempInfluences[index];\r\n }\r\n\r\n if (needUpdate && this._scene) {\r\n for (const mesh of this._scene.meshes) {\r\n if ((<any>mesh).morphTargetManager === this) {\r\n if (isUsingTextureForTargets) {\r\n mesh._markSubMeshesAsAttributesDirty();\r\n } else {\r\n (<Mesh>mesh)._syncGeometryWithMorphTargetManager();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Synchronize the targets with all the meshes using this morph target manager\r\n */\r\n public synchronize(): void {\r\n if (!this._scene || this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._supportsPositions = true;\r\n this._supportsNormals = true;\r\n this._supportsTangents = true;\r\n this._supportsUVs = true;\r\n this._supportsUV2s = true;\r\n this._vertexCount = 0;\r\n\r\n this._targetStoreTexture?.dispose();\r\n this._targetStoreTexture = null;\r\n\r\n if (this.isUsingTextureForTargets && this._targets.length > engine.getCaps().texture2DArrayMaxLayerCount) {\r\n this.useTextureToStoreTargets = false;\r\n }\r\n\r\n for (const target of this._targets) {\r\n this._supportsPositions = this._supportsPositions && target.hasPositions;\r\n this._supportsNormals = this._supportsNormals && target.hasNormals;\r\n this._supportsTangents = this._supportsTangents && target.hasTangents;\r\n this._supportsUVs = this._supportsUVs && target.hasUVs;\r\n this._supportsUV2s = this._supportsUV2s && target.hasUV2s;\r\n\r\n const vertexCount = target.vertexCount;\r\n if (this._vertexCount === 0) {\r\n this._vertexCount = vertexCount;\r\n } else if (this._vertexCount !== vertexCount) {\r\n Logger.Error(\r\n `Incompatible target. Targets must all have the same vertices count. Current vertex count: ${this._vertexCount}, vertex count for target \"${target.name}\": ${vertexCount}`\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (this.isUsingTextureForTargets) {\r\n this._textureVertexStride = 0;\r\n\r\n this._supportsPositions && this._textureVertexStride++;\r\n this._supportsNormals && this._textureVertexStride++;\r\n this._supportsTangents && this._textureVertexStride++;\r\n this._supportsUVs && this._textureVertexStride++;\r\n this.supportsUV2s && this._textureVertexStride++;\r\n\r\n this._textureWidth = this._vertexCount * this._textureVertexStride || 1;\r\n this._textureHeight = 1;\r\n\r\n const maxTextureSize = engine.getCaps().maxTextureSize;\r\n if (this._textureWidth > maxTextureSize) {\r\n this._textureHeight = Math.ceil(this._textureWidth / maxTextureSize);\r\n this._textureWidth = maxTextureSize;\r\n }\r\n\r\n const targetCount = this._targets.length;\r\n const data = new Float32Array(targetCount * this._textureWidth * this._textureHeight * 4);\r\n\r\n let offset = 0;\r\n for (let index = 0; index < targetCount; index++) {\r\n const target = this._targets[index];\r\n\r\n const positions = target.getPositions();\r\n const normals = target.getNormals();\r\n const uvs = target.getUVs();\r\n const tangents = target.getTangents();\r\n const uv2s = target.getUV2s();\r\n\r\n offset = index * this._textureWidth * this._textureHeight * 4;\r\n for (let vertex = 0; vertex < this._vertexCount; vertex++) {\r\n if (this._supportsPositions && positions) {\r\n data[offset] = positions[vertex * 3];\r\n data[offset + 1] = positions[vertex * 3 + 1];\r\n data[offset + 2] = positions[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsNormals && normals) {\r\n data[offset] = normals[vertex * 3];\r\n data[offset + 1] = normals[vertex * 3 + 1];\r\n data[offset + 2] = normals[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsUVs && uvs) {\r\n data[offset] = uvs[vertex * 2];\r\n data[offset + 1] = uvs[vertex * 2 + 1];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsTangents && tangents) {\r\n data[offset] = tangents[vertex * 3];\r\n data[offset + 1] = tangents[vertex * 3 + 1];\r\n data[offset + 2] = tangents[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsUV2s && uv2s) {\r\n data[offset] = uv2s[vertex * 2];\r\n data[offset + 1] = uv2s[vertex * 2 + 1];\r\n offset += 4;\r\n }\r\n }\r\n }\r\n\r\n this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(\r\n data,\r\n this._textureWidth,\r\n this._textureHeight,\r\n targetCount,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._targetStoreTexture.name = `Morph texture_${this.uniqueId}`;\r\n }\r\n\r\n // Flag meshes as dirty to resync with the active targets\r\n for (const mesh of this._scene.meshes) {\r\n if ((<any>mesh).morphTargetManager === this) {\r\n (<Mesh>mesh)._syncGeometryWithMorphTargetManager();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose() {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n this._targetStoreTexture = null;\r\n\r\n // Remove from scene\r\n if (this._scene) {\r\n this._scene.removeMorphTargetManager(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.morphTargetManagers.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.morphTargetManagers.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n for (const morph of this._targets) {\r\n this._scene.stopAnimation(morph);\r\n }\r\n }\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new MorphTargetManager from serialized data\r\n * @param serializationObject defines the serialized data\r\n * @param scene defines the hosting scene\r\n * @returns the new MorphTargetManager\r\n */\r\n public static Parse(serializationObject: any, scene: Scene): MorphTargetManager {\r\n const result = new MorphTargetManager(scene);\r\n\r\n for (const targetData of serializationObject.targets) {\r\n result.addTarget(MorphTarget.Parse(targetData, scene));\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -175,6 +175,7 @@ export class VolumetricLightScatteringPostProcess extends PostProcess {
|
|
|
175
175
|
numMorphInfluencers = morphTargetManager.numMaxInfluencers || morphTargetManager.numInfluencers;
|
|
176
176
|
if (numMorphInfluencers > 0) {
|
|
177
177
|
defines.push("#define MORPHTARGETS");
|
|
178
|
+
defines.push("#define MORPHTARGETS_POSITION");
|
|
178
179
|
defines.push("#define NUM_MORPH_INFLUENCERS " + numMorphInfluencers);
|
|
179
180
|
if (morphTargetManager.isUsingTextureForTargets) {
|
|
180
181
|
defines.push("#define MORPHTARGETS_TEXTURE");
|