three-stdlib 2.29.12 → 2.30.0
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/loaders/GLTFLoader.cjs +189 -71
- package/loaders/GLTFLoader.cjs.map +1 -1
- package/loaders/GLTFLoader.js +190 -72
- package/loaders/GLTFLoader.js.map +1 -1
- package/package.json +1 -1
package/loaders/GLTFLoader.cjs
CHANGED
@@ -3,6 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const THREE = require("three");
|
4
4
|
const BufferGeometryUtils = require("../utils/BufferGeometryUtils.cjs");
|
5
5
|
const constants = require("../_polyfill/constants.cjs");
|
6
|
+
const SRGBColorSpace = "srgb";
|
7
|
+
const LinearSRGBColorSpace = "srgb-linear";
|
8
|
+
const sRGBEncoding = 3001;
|
9
|
+
const LinearEncoding = 3e3;
|
6
10
|
class GLTFLoader extends THREE.Loader {
|
7
11
|
constructor(manager) {
|
8
12
|
super(manager);
|
@@ -13,6 +17,9 @@ class GLTFLoader extends THREE.Loader {
|
|
13
17
|
this.register(function(parser) {
|
14
18
|
return new GLTFMaterialsClearcoatExtension(parser);
|
15
19
|
});
|
20
|
+
this.register(function(parser) {
|
21
|
+
return new GLTFMaterialsDispersionExtension(parser);
|
22
|
+
});
|
16
23
|
this.register(function(parser) {
|
17
24
|
return new GLTFTextureBasisUExtension(parser);
|
18
25
|
});
|
@@ -46,6 +53,9 @@ class GLTFLoader extends THREE.Loader {
|
|
46
53
|
this.register(function(parser) {
|
47
54
|
return new GLTFMaterialsAnisotropyExtension(parser);
|
48
55
|
});
|
56
|
+
this.register(function(parser) {
|
57
|
+
return new GLTFMaterialsBumpExtension(parser);
|
58
|
+
});
|
49
59
|
this.register(function(parser) {
|
50
60
|
return new GLTFLightsExtension(parser);
|
51
61
|
});
|
@@ -62,7 +72,8 @@ class GLTFLoader extends THREE.Loader {
|
|
62
72
|
if (this.resourcePath !== "") {
|
63
73
|
resourcePath = this.resourcePath;
|
64
74
|
} else if (this.path !== "") {
|
65
|
-
|
75
|
+
const relativeUrl = THREE.LoaderUtils.extractUrlBase(url);
|
76
|
+
resourcePath = THREE.LoaderUtils.resolveURL(relativeUrl, this.path);
|
66
77
|
} else {
|
67
78
|
resourcePath = THREE.LoaderUtils.extractUrlBase(url);
|
68
79
|
}
|
@@ -168,6 +179,8 @@ class GLTFLoader extends THREE.Loader {
|
|
168
179
|
parser.fileLoader.setRequestHeader(this.requestHeader);
|
169
180
|
for (let i = 0; i < this.pluginCallbacks.length; i++) {
|
170
181
|
const plugin = this.pluginCallbacks[i](parser);
|
182
|
+
if (!plugin.name)
|
183
|
+
console.error("THREE.GLTFLoader: Invalid plugin found: missing name");
|
171
184
|
plugins[plugin.name] = plugin;
|
172
185
|
extensions[plugin.name] = true;
|
173
186
|
}
|
@@ -228,6 +241,7 @@ const EXTENSIONS = {
|
|
228
241
|
KHR_DRACO_MESH_COMPRESSION: "KHR_draco_mesh_compression",
|
229
242
|
KHR_LIGHTS_PUNCTUAL: "KHR_lights_punctual",
|
230
243
|
KHR_MATERIALS_CLEARCOAT: "KHR_materials_clearcoat",
|
244
|
+
KHR_MATERIALS_DISPERSION: "KHR_materials_dispersion",
|
231
245
|
KHR_MATERIALS_IOR: "KHR_materials_ior",
|
232
246
|
KHR_MATERIALS_SHEEN: "KHR_materials_sheen",
|
233
247
|
KHR_MATERIALS_SPECULAR: "KHR_materials_specular",
|
@@ -240,6 +254,7 @@ const EXTENSIONS = {
|
|
240
254
|
KHR_TEXTURE_TRANSFORM: "KHR_texture_transform",
|
241
255
|
KHR_MESH_QUANTIZATION: "KHR_mesh_quantization",
|
242
256
|
KHR_MATERIALS_EMISSIVE_STRENGTH: "KHR_materials_emissive_strength",
|
257
|
+
EXT_MATERIALS_BUMP: "EXT_materials_bump",
|
243
258
|
EXT_TEXTURE_WEBP: "EXT_texture_webp",
|
244
259
|
EXT_TEXTURE_AVIF: "EXT_texture_avif",
|
245
260
|
EXT_MESHOPT_COMPRESSION: "EXT_meshopt_compression",
|
@@ -274,7 +289,7 @@ class GLTFLightsExtension {
|
|
274
289
|
let lightNode;
|
275
290
|
const color = new THREE.Color(16777215);
|
276
291
|
if (lightDef.color !== void 0)
|
277
|
-
color.
|
292
|
+
color.setRGB(lightDef.color[0], lightDef.color[1], lightDef.color[2], LinearSRGBColorSpace);
|
278
293
|
const range = lightDef.range !== void 0 ? lightDef.range : 0;
|
279
294
|
switch (lightDef.type) {
|
280
295
|
case "directional":
|
@@ -344,11 +359,11 @@ class GLTFMaterialsUnlitExtension {
|
|
344
359
|
if (metallicRoughness) {
|
345
360
|
if (Array.isArray(metallicRoughness.baseColorFactor)) {
|
346
361
|
const array = metallicRoughness.baseColorFactor;
|
347
|
-
materialParams.color.
|
362
|
+
materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace);
|
348
363
|
materialParams.opacity = array[3];
|
349
364
|
}
|
350
365
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
351
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
366
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace));
|
352
367
|
}
|
353
368
|
}
|
354
369
|
return Promise.all(pending);
|
@@ -414,6 +429,29 @@ class GLTFMaterialsClearcoatExtension {
|
|
414
429
|
return Promise.all(pending);
|
415
430
|
}
|
416
431
|
}
|
432
|
+
class GLTFMaterialsDispersionExtension {
|
433
|
+
constructor(parser) {
|
434
|
+
this.parser = parser;
|
435
|
+
this.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;
|
436
|
+
}
|
437
|
+
getMaterialType(materialIndex) {
|
438
|
+
const parser = this.parser;
|
439
|
+
const materialDef = parser.json.materials[materialIndex];
|
440
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name])
|
441
|
+
return null;
|
442
|
+
return THREE.MeshPhysicalMaterial;
|
443
|
+
}
|
444
|
+
extendMaterialParams(materialIndex, materialParams) {
|
445
|
+
const parser = this.parser;
|
446
|
+
const materialDef = parser.json.materials[materialIndex];
|
447
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
|
448
|
+
return Promise.resolve();
|
449
|
+
}
|
450
|
+
const extension = materialDef.extensions[this.name];
|
451
|
+
materialParams.dispersion = extension.dispersion !== void 0 ? extension.dispersion : 0;
|
452
|
+
return Promise.resolve();
|
453
|
+
}
|
454
|
+
}
|
417
455
|
class GLTFMaterialsIridescenceExtension {
|
418
456
|
constructor(parser) {
|
419
457
|
this.parser = parser;
|
@@ -484,13 +522,14 @@ class GLTFMaterialsSheenExtension {
|
|
484
522
|
materialParams.sheen = 1;
|
485
523
|
const extension = materialDef.extensions[this.name];
|
486
524
|
if (extension.sheenColorFactor !== void 0) {
|
487
|
-
|
525
|
+
const colorFactor = extension.sheenColorFactor;
|
526
|
+
materialParams.sheenColor.setRGB(colorFactor[0], colorFactor[1], colorFactor[2], LinearSRGBColorSpace);
|
488
527
|
}
|
489
528
|
if (extension.sheenRoughnessFactor !== void 0) {
|
490
529
|
materialParams.sheenRoughness = extension.sheenRoughnessFactor;
|
491
530
|
}
|
492
531
|
if (extension.sheenColorTexture !== void 0) {
|
493
|
-
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture,
|
532
|
+
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture, SRGBColorSpace));
|
494
533
|
}
|
495
534
|
if (extension.sheenRoughnessTexture !== void 0) {
|
496
535
|
pending.push(parser.assignTexture(materialParams, "sheenRoughnessMap", extension.sheenRoughnessTexture));
|
@@ -553,7 +592,12 @@ class GLTFMaterialsVolumeExtension {
|
|
553
592
|
}
|
554
593
|
materialParams.attenuationDistance = extension.attenuationDistance || Infinity;
|
555
594
|
const colorArray = extension.attenuationColor || [1, 1, 1];
|
556
|
-
materialParams.attenuationColor = new THREE.Color(
|
595
|
+
materialParams.attenuationColor = new THREE.Color().setRGB(
|
596
|
+
colorArray[0],
|
597
|
+
colorArray[1],
|
598
|
+
colorArray[2],
|
599
|
+
LinearSRGBColorSpace
|
600
|
+
);
|
557
601
|
return Promise.all(pending);
|
558
602
|
}
|
559
603
|
}
|
@@ -605,16 +649,42 @@ class GLTFMaterialsSpecularExtension {
|
|
605
649
|
pending.push(parser.assignTexture(materialParams, "specularIntensityMap", extension.specularTexture));
|
606
650
|
}
|
607
651
|
const colorArray = extension.specularColorFactor || [1, 1, 1];
|
608
|
-
materialParams.specularColor = new THREE.Color(colorArray[0], colorArray[1], colorArray[2]);
|
652
|
+
materialParams.specularColor = new THREE.Color().setRGB(colorArray[0], colorArray[1], colorArray[2], LinearSRGBColorSpace);
|
609
653
|
if (extension.specularColorTexture !== void 0) {
|
610
654
|
pending.push(
|
611
|
-
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture,
|
612
|
-
// sRGBEncoding
|
655
|
+
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture, SRGBColorSpace)
|
613
656
|
);
|
614
657
|
}
|
615
658
|
return Promise.all(pending);
|
616
659
|
}
|
617
660
|
}
|
661
|
+
class GLTFMaterialsBumpExtension {
|
662
|
+
constructor(parser) {
|
663
|
+
this.parser = parser;
|
664
|
+
this.name = EXTENSIONS.EXT_MATERIALS_BUMP;
|
665
|
+
}
|
666
|
+
getMaterialType(materialIndex) {
|
667
|
+
const parser = this.parser;
|
668
|
+
const materialDef = parser.json.materials[materialIndex];
|
669
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name])
|
670
|
+
return null;
|
671
|
+
return THREE.MeshPhysicalMaterial;
|
672
|
+
}
|
673
|
+
extendMaterialParams(materialIndex, materialParams) {
|
674
|
+
const parser = this.parser;
|
675
|
+
const materialDef = parser.json.materials[materialIndex];
|
676
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
|
677
|
+
return Promise.resolve();
|
678
|
+
}
|
679
|
+
const pending = [];
|
680
|
+
const extension = materialDef.extensions[this.name];
|
681
|
+
materialParams.bumpScale = extension.bumpFactor !== void 0 ? extension.bumpFactor : 1;
|
682
|
+
if (extension.bumpTexture !== void 0) {
|
683
|
+
pending.push(parser.assignTexture(materialParams, "bumpMap", extension.bumpTexture));
|
684
|
+
}
|
685
|
+
return Promise.all(pending);
|
686
|
+
}
|
687
|
+
}
|
618
688
|
class GLTFMaterialsAnisotropyExtension {
|
619
689
|
constructor(parser) {
|
620
690
|
this.parser = parser;
|
@@ -865,7 +935,10 @@ class GLTFMeshGpuInstancing {
|
|
865
935
|
instancedMesh.setMatrixAt(i, m.compose(p, q, s));
|
866
936
|
}
|
867
937
|
for (const attributeName in attributes) {
|
868
|
-
if (attributeName
|
938
|
+
if (attributeName === "_COLOR_0") {
|
939
|
+
const attr = attributes[attributeName];
|
940
|
+
instancedMesh.instanceColor = new THREE.InstancedBufferAttribute(attr.array, attr.itemSize, attr.normalized);
|
941
|
+
} else if (attributeName !== "TRANSLATION" && attributeName !== "ROTATION" && attributeName !== "SCALE") {
|
869
942
|
mesh.geometry.setAttribute(attributeName, attributes[attributeName]);
|
870
943
|
}
|
871
944
|
}
|
@@ -955,7 +1028,7 @@ class GLTFDracoMeshCompressionExtension {
|
|
955
1028
|
}
|
956
1029
|
}
|
957
1030
|
return parser.getDependency("bufferView", bufferViewIndex).then(function(bufferView) {
|
958
|
-
return new Promise(function(resolve) {
|
1031
|
+
return new Promise(function(resolve, reject) {
|
959
1032
|
dracoLoader.decodeDracoFile(
|
960
1033
|
bufferView,
|
961
1034
|
function(geometry) {
|
@@ -968,7 +1041,9 @@ class GLTFDracoMeshCompressionExtension {
|
|
968
1041
|
resolve(geometry);
|
969
1042
|
},
|
970
1043
|
threeAttributeMap,
|
971
|
-
attributeTypeMap
|
1044
|
+
attributeTypeMap,
|
1045
|
+
LinearSRGBColorSpace,
|
1046
|
+
reject
|
972
1047
|
);
|
973
1048
|
});
|
974
1049
|
});
|
@@ -1360,11 +1435,14 @@ class GLTFParser {
|
|
1360
1435
|
};
|
1361
1436
|
addUnknownExtensionsToUserData(extensions, result, json);
|
1362
1437
|
assignExtrasToUserData(result, json);
|
1363
|
-
Promise.all(
|
1438
|
+
return Promise.all(
|
1364
1439
|
parser._invokeAll(function(ext) {
|
1365
1440
|
return ext.afterRoot && ext.afterRoot(result);
|
1366
1441
|
})
|
1367
1442
|
).then(function() {
|
1443
|
+
for (const scene of result.scenes) {
|
1444
|
+
scene.updateMatrixWorld();
|
1445
|
+
}
|
1368
1446
|
onLoad(result);
|
1369
1447
|
});
|
1370
1448
|
}).catch(onError);
|
@@ -1751,6 +1829,7 @@ class GLTFParser {
|
|
1751
1829
|
if (isObjectURL === true) {
|
1752
1830
|
URL.revokeObjectURL(sourceURI);
|
1753
1831
|
}
|
1832
|
+
assignExtrasToUserData(texture, sourceDef);
|
1754
1833
|
texture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType(sourceDef.uri);
|
1755
1834
|
return texture;
|
1756
1835
|
}).catch(function(error) {
|
@@ -1767,7 +1846,7 @@ class GLTFParser {
|
|
1767
1846
|
* @param {Object} mapDef
|
1768
1847
|
* @return {Promise<Texture>}
|
1769
1848
|
*/
|
1770
|
-
assignTexture(materialParams, mapName, mapDef,
|
1849
|
+
assignTexture(materialParams, mapName, mapDef, colorSpace) {
|
1771
1850
|
const parser = this;
|
1772
1851
|
return this.getDependency("texture", mapDef.index).then(function(texture) {
|
1773
1852
|
if (!texture)
|
@@ -1784,11 +1863,13 @@ class GLTFParser {
|
|
1784
1863
|
parser.associations.set(texture, gltfReference);
|
1785
1864
|
}
|
1786
1865
|
}
|
1787
|
-
if (
|
1866
|
+
if (colorSpace !== void 0) {
|
1867
|
+
if (typeof colorSpace === "number")
|
1868
|
+
colorSpace = colorSpace === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
|
1788
1869
|
if ("colorSpace" in texture)
|
1789
|
-
texture.colorSpace =
|
1870
|
+
texture.colorSpace = colorSpace;
|
1790
1871
|
else
|
1791
|
-
texture.encoding =
|
1872
|
+
texture.encoding = colorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding;
|
1792
1873
|
}
|
1793
1874
|
materialParams[mapName] = texture;
|
1794
1875
|
return texture;
|
@@ -1887,11 +1968,11 @@ class GLTFParser {
|
|
1887
1968
|
materialParams.opacity = 1;
|
1888
1969
|
if (Array.isArray(metallicRoughness.baseColorFactor)) {
|
1889
1970
|
const array = metallicRoughness.baseColorFactor;
|
1890
|
-
materialParams.color.
|
1971
|
+
materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace);
|
1891
1972
|
materialParams.opacity = array[3];
|
1892
1973
|
}
|
1893
1974
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
1894
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
1975
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace));
|
1895
1976
|
}
|
1896
1977
|
materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1;
|
1897
1978
|
materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1;
|
@@ -1938,10 +2019,16 @@ class GLTFParser {
|
|
1938
2019
|
}
|
1939
2020
|
}
|
1940
2021
|
if (materialDef.emissiveFactor !== void 0 && materialType !== THREE.MeshBasicMaterial) {
|
1941
|
-
|
2022
|
+
const emissiveFactor = materialDef.emissiveFactor;
|
2023
|
+
materialParams.emissive = new THREE.Color().setRGB(
|
2024
|
+
emissiveFactor[0],
|
2025
|
+
emissiveFactor[1],
|
2026
|
+
emissiveFactor[2],
|
2027
|
+
LinearSRGBColorSpace
|
2028
|
+
);
|
1942
2029
|
}
|
1943
2030
|
if (materialDef.emissiveTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) {
|
1944
|
-
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture,
|
2031
|
+
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture, SRGBColorSpace));
|
1945
2032
|
}
|
1946
2033
|
return Promise.all(pending).then(function() {
|
1947
2034
|
const material = new materialType(materialParams);
|
@@ -2151,6 +2238,7 @@ class GLTFParser {
|
|
2151
2238
|
*/
|
2152
2239
|
loadAnimation(animationIndex) {
|
2153
2240
|
const json = this.json;
|
2241
|
+
const parser = this;
|
2154
2242
|
const animationDef = json.animations[animationIndex];
|
2155
2243
|
const animationName = animationDef.name ? animationDef.name : "animation_" + animationIndex;
|
2156
2244
|
const pendingNodes = [];
|
@@ -2194,57 +2282,14 @@ class GLTFParser {
|
|
2194
2282
|
const target = targets[i];
|
2195
2283
|
if (node === void 0)
|
2196
2284
|
continue;
|
2197
|
-
node.updateMatrix
|
2198
|
-
|
2199
|
-
switch (PATH_PROPERTIES[target.path]) {
|
2200
|
-
case PATH_PROPERTIES.weights:
|
2201
|
-
TypedKeyframeTrack = THREE.NumberKeyframeTrack;
|
2202
|
-
break;
|
2203
|
-
case PATH_PROPERTIES.rotation:
|
2204
|
-
TypedKeyframeTrack = THREE.QuaternionKeyframeTrack;
|
2205
|
-
break;
|
2206
|
-
case PATH_PROPERTIES.position:
|
2207
|
-
case PATH_PROPERTIES.scale:
|
2208
|
-
default:
|
2209
|
-
TypedKeyframeTrack = THREE.VectorKeyframeTrack;
|
2210
|
-
break;
|
2211
|
-
}
|
2212
|
-
const targetName = node.name ? node.name : node.uuid;
|
2213
|
-
const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear;
|
2214
|
-
const targetNames = [];
|
2215
|
-
if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {
|
2216
|
-
node.traverse(function(object) {
|
2217
|
-
if (object.morphTargetInfluences) {
|
2218
|
-
targetNames.push(object.name ? object.name : object.uuid);
|
2219
|
-
}
|
2220
|
-
});
|
2221
|
-
} else {
|
2222
|
-
targetNames.push(targetName);
|
2285
|
+
if (node.updateMatrix) {
|
2286
|
+
node.updateMatrix();
|
2223
2287
|
}
|
2224
|
-
|
2225
|
-
if (
|
2226
|
-
|
2227
|
-
|
2228
|
-
for (let j = 0, jl = outputArray.length; j < jl; j++) {
|
2229
|
-
scaled[j] = outputArray[j] * scale;
|
2288
|
+
const createdTracks = parser._createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target);
|
2289
|
+
if (createdTracks) {
|
2290
|
+
for (let k = 0; k < createdTracks.length; k++) {
|
2291
|
+
tracks.push(createdTracks[k]);
|
2230
2292
|
}
|
2231
|
-
outputArray = scaled;
|
2232
|
-
}
|
2233
|
-
for (let j = 0, jl = targetNames.length; j < jl; j++) {
|
2234
|
-
const track = new TypedKeyframeTrack(
|
2235
|
-
targetNames[j] + "." + PATH_PROPERTIES[target.path],
|
2236
|
-
inputAccessor.array,
|
2237
|
-
outputArray,
|
2238
|
-
interpolation
|
2239
|
-
);
|
2240
|
-
if (sampler.interpolation === "CUBICSPLINE") {
|
2241
|
-
track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {
|
2242
|
-
const interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
|
2243
|
-
return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);
|
2244
|
-
};
|
2245
|
-
track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;
|
2246
|
-
}
|
2247
|
-
tracks.push(track);
|
2248
2293
|
}
|
2249
2294
|
}
|
2250
2295
|
return new THREE.AnimationClip(animationName, void 0, tracks);
|
@@ -2422,6 +2467,79 @@ class GLTFParser {
|
|
2422
2467
|
return scene;
|
2423
2468
|
});
|
2424
2469
|
}
|
2470
|
+
_createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target) {
|
2471
|
+
const tracks = [];
|
2472
|
+
const targetName = node.name ? node.name : node.uuid;
|
2473
|
+
const targetNames = [];
|
2474
|
+
if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {
|
2475
|
+
node.traverse(function(object) {
|
2476
|
+
if (object.morphTargetInfluences) {
|
2477
|
+
targetNames.push(object.name ? object.name : object.uuid);
|
2478
|
+
}
|
2479
|
+
});
|
2480
|
+
} else {
|
2481
|
+
targetNames.push(targetName);
|
2482
|
+
}
|
2483
|
+
let TypedKeyframeTrack;
|
2484
|
+
switch (PATH_PROPERTIES[target.path]) {
|
2485
|
+
case PATH_PROPERTIES.weights:
|
2486
|
+
TypedKeyframeTrack = THREE.NumberKeyframeTrack;
|
2487
|
+
break;
|
2488
|
+
case PATH_PROPERTIES.rotation:
|
2489
|
+
TypedKeyframeTrack = THREE.QuaternionKeyframeTrack;
|
2490
|
+
break;
|
2491
|
+
case PATH_PROPERTIES.position:
|
2492
|
+
case PATH_PROPERTIES.scale:
|
2493
|
+
TypedKeyframeTrack = THREE.VectorKeyframeTrack;
|
2494
|
+
break;
|
2495
|
+
default:
|
2496
|
+
switch (outputAccessor.itemSize) {
|
2497
|
+
case 1:
|
2498
|
+
TypedKeyframeTrack = THREE.NumberKeyframeTrack;
|
2499
|
+
break;
|
2500
|
+
case 2:
|
2501
|
+
case 3:
|
2502
|
+
default:
|
2503
|
+
TypedKeyframeTrack = THREE.VectorKeyframeTrack;
|
2504
|
+
break;
|
2505
|
+
}
|
2506
|
+
break;
|
2507
|
+
}
|
2508
|
+
const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear;
|
2509
|
+
const outputArray = this._getArrayFromAccessor(outputAccessor);
|
2510
|
+
for (let j = 0, jl = targetNames.length; j < jl; j++) {
|
2511
|
+
const track = new TypedKeyframeTrack(
|
2512
|
+
targetNames[j] + "." + PATH_PROPERTIES[target.path],
|
2513
|
+
inputAccessor.array,
|
2514
|
+
outputArray,
|
2515
|
+
interpolation
|
2516
|
+
);
|
2517
|
+
if (sampler.interpolation === "CUBICSPLINE") {
|
2518
|
+
this._createCubicSplineTrackInterpolant(track);
|
2519
|
+
}
|
2520
|
+
tracks.push(track);
|
2521
|
+
}
|
2522
|
+
return tracks;
|
2523
|
+
}
|
2524
|
+
_getArrayFromAccessor(accessor) {
|
2525
|
+
let outputArray = accessor.array;
|
2526
|
+
if (accessor.normalized) {
|
2527
|
+
const scale = getNormalizedComponentScale(outputArray.constructor);
|
2528
|
+
const scaled = new Float32Array(outputArray.length);
|
2529
|
+
for (let j = 0, jl = outputArray.length; j < jl; j++) {
|
2530
|
+
scaled[j] = outputArray[j] * scale;
|
2531
|
+
}
|
2532
|
+
outputArray = scaled;
|
2533
|
+
}
|
2534
|
+
return outputArray;
|
2535
|
+
}
|
2536
|
+
_createCubicSplineTrackInterpolant(track) {
|
2537
|
+
track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {
|
2538
|
+
const interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
|
2539
|
+
return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);
|
2540
|
+
};
|
2541
|
+
track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;
|
2542
|
+
}
|
2425
2543
|
}
|
2426
2544
|
function computeBounds(geometry, primitiveDef, parser) {
|
2427
2545
|
const attributes = primitiveDef.attributes;
|