three-stdlib 2.29.12 → 2.30.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/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/math/Lut.cjs +4 -4
- package/math/Lut.cjs.map +1 -1
- package/math/Lut.js +4 -4
- package/math/Lut.js.map +1 -1
- package/objects/Reflector.cjs +1 -1
- package/objects/Reflector.cjs.map +1 -1
- package/objects/Reflector.js +1 -1
- package/objects/Reflector.js.map +1 -1
- package/objects/Refractor.cjs +1 -1
- package/objects/Refractor.cjs.map +1 -1
- package/objects/Refractor.js +1 -1
- package/objects/Refractor.js.map +1 -1
- package/package.json +1 -1
package/loaders/GLTFLoader.js
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, MeshPhysicalMaterial, Vector2, Matrix4, Vector3, Quaternion, InstancedMesh, Object3D, TextureLoader, ImageBitmapLoader, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, LinearFilter, LinearMipmapLinearFilter, RepeatWrapping, PointsMaterial, Material, LineBasicMaterial, MeshStandardMaterial, DoubleSide, PropertyBinding, BufferGeometry, SkinnedMesh, Mesh, TriangleStripDrawMode, TriangleFanDrawMode, LineSegments, Line, LineLoop, Points, Group, PerspectiveCamera, MathUtils, OrthographicCamera, Skeleton,
|
1
|
+
import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, MeshPhysicalMaterial, Vector2, Matrix4, Vector3, Quaternion, InstancedMesh, InstancedBufferAttribute, Object3D, TextureLoader, ImageBitmapLoader, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, LinearFilter, LinearMipmapLinearFilter, RepeatWrapping, PointsMaterial, Material, LineBasicMaterial, MeshStandardMaterial, DoubleSide, PropertyBinding, BufferGeometry, SkinnedMesh, Mesh, TriangleStripDrawMode, TriangleFanDrawMode, LineSegments, Line, LineLoop, Points, Group, PerspectiveCamera, MathUtils, OrthographicCamera, Skeleton, AnimationClip, Bone, InterpolateLinear, NearestFilter, NearestMipmapNearestFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, ClampToEdgeWrapping, MirroredRepeatWrapping, InterpolateDiscrete, FrontSide, Texture, VectorKeyframeTrack, NumberKeyframeTrack, QuaternionKeyframeTrack, Box3, Sphere, Interpolant } from "three";
|
2
2
|
import { toTrianglesDrawMode } from "../utils/BufferGeometryUtils.js";
|
3
3
|
import { version } from "../_polyfill/constants.js";
|
4
|
+
const SRGBColorSpace = "srgb";
|
5
|
+
const LinearSRGBColorSpace = "srgb-linear";
|
6
|
+
const sRGBEncoding = 3001;
|
7
|
+
const LinearEncoding = 3e3;
|
4
8
|
class GLTFLoader extends Loader {
|
5
9
|
constructor(manager) {
|
6
10
|
super(manager);
|
@@ -11,6 +15,9 @@ class GLTFLoader extends Loader {
|
|
11
15
|
this.register(function(parser) {
|
12
16
|
return new GLTFMaterialsClearcoatExtension(parser);
|
13
17
|
});
|
18
|
+
this.register(function(parser) {
|
19
|
+
return new GLTFMaterialsDispersionExtension(parser);
|
20
|
+
});
|
14
21
|
this.register(function(parser) {
|
15
22
|
return new GLTFTextureBasisUExtension(parser);
|
16
23
|
});
|
@@ -44,6 +51,9 @@ class GLTFLoader extends Loader {
|
|
44
51
|
this.register(function(parser) {
|
45
52
|
return new GLTFMaterialsAnisotropyExtension(parser);
|
46
53
|
});
|
54
|
+
this.register(function(parser) {
|
55
|
+
return new GLTFMaterialsBumpExtension(parser);
|
56
|
+
});
|
47
57
|
this.register(function(parser) {
|
48
58
|
return new GLTFLightsExtension(parser);
|
49
59
|
});
|
@@ -60,7 +70,8 @@ class GLTFLoader extends Loader {
|
|
60
70
|
if (this.resourcePath !== "") {
|
61
71
|
resourcePath = this.resourcePath;
|
62
72
|
} else if (this.path !== "") {
|
63
|
-
|
73
|
+
const relativeUrl = LoaderUtils.extractUrlBase(url);
|
74
|
+
resourcePath = LoaderUtils.resolveURL(relativeUrl, this.path);
|
64
75
|
} else {
|
65
76
|
resourcePath = LoaderUtils.extractUrlBase(url);
|
66
77
|
}
|
@@ -166,6 +177,8 @@ class GLTFLoader extends Loader {
|
|
166
177
|
parser.fileLoader.setRequestHeader(this.requestHeader);
|
167
178
|
for (let i = 0; i < this.pluginCallbacks.length; i++) {
|
168
179
|
const plugin = this.pluginCallbacks[i](parser);
|
180
|
+
if (!plugin.name)
|
181
|
+
console.error("THREE.GLTFLoader: Invalid plugin found: missing name");
|
169
182
|
plugins[plugin.name] = plugin;
|
170
183
|
extensions[plugin.name] = true;
|
171
184
|
}
|
@@ -226,6 +239,7 @@ const EXTENSIONS = {
|
|
226
239
|
KHR_DRACO_MESH_COMPRESSION: "KHR_draco_mesh_compression",
|
227
240
|
KHR_LIGHTS_PUNCTUAL: "KHR_lights_punctual",
|
228
241
|
KHR_MATERIALS_CLEARCOAT: "KHR_materials_clearcoat",
|
242
|
+
KHR_MATERIALS_DISPERSION: "KHR_materials_dispersion",
|
229
243
|
KHR_MATERIALS_IOR: "KHR_materials_ior",
|
230
244
|
KHR_MATERIALS_SHEEN: "KHR_materials_sheen",
|
231
245
|
KHR_MATERIALS_SPECULAR: "KHR_materials_specular",
|
@@ -238,6 +252,7 @@ const EXTENSIONS = {
|
|
238
252
|
KHR_TEXTURE_TRANSFORM: "KHR_texture_transform",
|
239
253
|
KHR_MESH_QUANTIZATION: "KHR_mesh_quantization",
|
240
254
|
KHR_MATERIALS_EMISSIVE_STRENGTH: "KHR_materials_emissive_strength",
|
255
|
+
EXT_MATERIALS_BUMP: "EXT_materials_bump",
|
241
256
|
EXT_TEXTURE_WEBP: "EXT_texture_webp",
|
242
257
|
EXT_TEXTURE_AVIF: "EXT_texture_avif",
|
243
258
|
EXT_MESHOPT_COMPRESSION: "EXT_meshopt_compression",
|
@@ -272,7 +287,7 @@ class GLTFLightsExtension {
|
|
272
287
|
let lightNode;
|
273
288
|
const color = new Color(16777215);
|
274
289
|
if (lightDef.color !== void 0)
|
275
|
-
color.
|
290
|
+
color.setRGB(lightDef.color[0], lightDef.color[1], lightDef.color[2], LinearSRGBColorSpace);
|
276
291
|
const range = lightDef.range !== void 0 ? lightDef.range : 0;
|
277
292
|
switch (lightDef.type) {
|
278
293
|
case "directional":
|
@@ -342,11 +357,11 @@ class GLTFMaterialsUnlitExtension {
|
|
342
357
|
if (metallicRoughness) {
|
343
358
|
if (Array.isArray(metallicRoughness.baseColorFactor)) {
|
344
359
|
const array = metallicRoughness.baseColorFactor;
|
345
|
-
materialParams.color.
|
360
|
+
materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace);
|
346
361
|
materialParams.opacity = array[3];
|
347
362
|
}
|
348
363
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
349
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
364
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace));
|
350
365
|
}
|
351
366
|
}
|
352
367
|
return Promise.all(pending);
|
@@ -412,6 +427,29 @@ class GLTFMaterialsClearcoatExtension {
|
|
412
427
|
return Promise.all(pending);
|
413
428
|
}
|
414
429
|
}
|
430
|
+
class GLTFMaterialsDispersionExtension {
|
431
|
+
constructor(parser) {
|
432
|
+
this.parser = parser;
|
433
|
+
this.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;
|
434
|
+
}
|
435
|
+
getMaterialType(materialIndex) {
|
436
|
+
const parser = this.parser;
|
437
|
+
const materialDef = parser.json.materials[materialIndex];
|
438
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name])
|
439
|
+
return null;
|
440
|
+
return MeshPhysicalMaterial;
|
441
|
+
}
|
442
|
+
extendMaterialParams(materialIndex, materialParams) {
|
443
|
+
const parser = this.parser;
|
444
|
+
const materialDef = parser.json.materials[materialIndex];
|
445
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
|
446
|
+
return Promise.resolve();
|
447
|
+
}
|
448
|
+
const extension = materialDef.extensions[this.name];
|
449
|
+
materialParams.dispersion = extension.dispersion !== void 0 ? extension.dispersion : 0;
|
450
|
+
return Promise.resolve();
|
451
|
+
}
|
452
|
+
}
|
415
453
|
class GLTFMaterialsIridescenceExtension {
|
416
454
|
constructor(parser) {
|
417
455
|
this.parser = parser;
|
@@ -482,13 +520,14 @@ class GLTFMaterialsSheenExtension {
|
|
482
520
|
materialParams.sheen = 1;
|
483
521
|
const extension = materialDef.extensions[this.name];
|
484
522
|
if (extension.sheenColorFactor !== void 0) {
|
485
|
-
|
523
|
+
const colorFactor = extension.sheenColorFactor;
|
524
|
+
materialParams.sheenColor.setRGB(colorFactor[0], colorFactor[1], colorFactor[2], LinearSRGBColorSpace);
|
486
525
|
}
|
487
526
|
if (extension.sheenRoughnessFactor !== void 0) {
|
488
527
|
materialParams.sheenRoughness = extension.sheenRoughnessFactor;
|
489
528
|
}
|
490
529
|
if (extension.sheenColorTexture !== void 0) {
|
491
|
-
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture,
|
530
|
+
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture, SRGBColorSpace));
|
492
531
|
}
|
493
532
|
if (extension.sheenRoughnessTexture !== void 0) {
|
494
533
|
pending.push(parser.assignTexture(materialParams, "sheenRoughnessMap", extension.sheenRoughnessTexture));
|
@@ -551,7 +590,12 @@ class GLTFMaterialsVolumeExtension {
|
|
551
590
|
}
|
552
591
|
materialParams.attenuationDistance = extension.attenuationDistance || Infinity;
|
553
592
|
const colorArray = extension.attenuationColor || [1, 1, 1];
|
554
|
-
materialParams.attenuationColor = new Color(
|
593
|
+
materialParams.attenuationColor = new Color().setRGB(
|
594
|
+
colorArray[0],
|
595
|
+
colorArray[1],
|
596
|
+
colorArray[2],
|
597
|
+
LinearSRGBColorSpace
|
598
|
+
);
|
555
599
|
return Promise.all(pending);
|
556
600
|
}
|
557
601
|
}
|
@@ -603,16 +647,42 @@ class GLTFMaterialsSpecularExtension {
|
|
603
647
|
pending.push(parser.assignTexture(materialParams, "specularIntensityMap", extension.specularTexture));
|
604
648
|
}
|
605
649
|
const colorArray = extension.specularColorFactor || [1, 1, 1];
|
606
|
-
materialParams.specularColor = new Color(colorArray[0], colorArray[1], colorArray[2]);
|
650
|
+
materialParams.specularColor = new Color().setRGB(colorArray[0], colorArray[1], colorArray[2], LinearSRGBColorSpace);
|
607
651
|
if (extension.specularColorTexture !== void 0) {
|
608
652
|
pending.push(
|
609
|
-
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture,
|
610
|
-
// sRGBEncoding
|
653
|
+
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture, SRGBColorSpace)
|
611
654
|
);
|
612
655
|
}
|
613
656
|
return Promise.all(pending);
|
614
657
|
}
|
615
658
|
}
|
659
|
+
class GLTFMaterialsBumpExtension {
|
660
|
+
constructor(parser) {
|
661
|
+
this.parser = parser;
|
662
|
+
this.name = EXTENSIONS.EXT_MATERIALS_BUMP;
|
663
|
+
}
|
664
|
+
getMaterialType(materialIndex) {
|
665
|
+
const parser = this.parser;
|
666
|
+
const materialDef = parser.json.materials[materialIndex];
|
667
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name])
|
668
|
+
return null;
|
669
|
+
return MeshPhysicalMaterial;
|
670
|
+
}
|
671
|
+
extendMaterialParams(materialIndex, materialParams) {
|
672
|
+
const parser = this.parser;
|
673
|
+
const materialDef = parser.json.materials[materialIndex];
|
674
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
|
675
|
+
return Promise.resolve();
|
676
|
+
}
|
677
|
+
const pending = [];
|
678
|
+
const extension = materialDef.extensions[this.name];
|
679
|
+
materialParams.bumpScale = extension.bumpFactor !== void 0 ? extension.bumpFactor : 1;
|
680
|
+
if (extension.bumpTexture !== void 0) {
|
681
|
+
pending.push(parser.assignTexture(materialParams, "bumpMap", extension.bumpTexture));
|
682
|
+
}
|
683
|
+
return Promise.all(pending);
|
684
|
+
}
|
685
|
+
}
|
616
686
|
class GLTFMaterialsAnisotropyExtension {
|
617
687
|
constructor(parser) {
|
618
688
|
this.parser = parser;
|
@@ -863,7 +933,10 @@ class GLTFMeshGpuInstancing {
|
|
863
933
|
instancedMesh.setMatrixAt(i, m.compose(p, q, s));
|
864
934
|
}
|
865
935
|
for (const attributeName in attributes) {
|
866
|
-
if (attributeName
|
936
|
+
if (attributeName === "_COLOR_0") {
|
937
|
+
const attr = attributes[attributeName];
|
938
|
+
instancedMesh.instanceColor = new InstancedBufferAttribute(attr.array, attr.itemSize, attr.normalized);
|
939
|
+
} else if (attributeName !== "TRANSLATION" && attributeName !== "ROTATION" && attributeName !== "SCALE") {
|
867
940
|
mesh.geometry.setAttribute(attributeName, attributes[attributeName]);
|
868
941
|
}
|
869
942
|
}
|
@@ -953,7 +1026,7 @@ class GLTFDracoMeshCompressionExtension {
|
|
953
1026
|
}
|
954
1027
|
}
|
955
1028
|
return parser.getDependency("bufferView", bufferViewIndex).then(function(bufferView) {
|
956
|
-
return new Promise(function(resolve) {
|
1029
|
+
return new Promise(function(resolve, reject) {
|
957
1030
|
dracoLoader.decodeDracoFile(
|
958
1031
|
bufferView,
|
959
1032
|
function(geometry) {
|
@@ -966,7 +1039,9 @@ class GLTFDracoMeshCompressionExtension {
|
|
966
1039
|
resolve(geometry);
|
967
1040
|
},
|
968
1041
|
threeAttributeMap,
|
969
|
-
attributeTypeMap
|
1042
|
+
attributeTypeMap,
|
1043
|
+
LinearSRGBColorSpace,
|
1044
|
+
reject
|
970
1045
|
);
|
971
1046
|
});
|
972
1047
|
});
|
@@ -1358,11 +1433,14 @@ class GLTFParser {
|
|
1358
1433
|
};
|
1359
1434
|
addUnknownExtensionsToUserData(extensions, result, json);
|
1360
1435
|
assignExtrasToUserData(result, json);
|
1361
|
-
Promise.all(
|
1436
|
+
return Promise.all(
|
1362
1437
|
parser._invokeAll(function(ext) {
|
1363
1438
|
return ext.afterRoot && ext.afterRoot(result);
|
1364
1439
|
})
|
1365
1440
|
).then(function() {
|
1441
|
+
for (const scene of result.scenes) {
|
1442
|
+
scene.updateMatrixWorld();
|
1443
|
+
}
|
1366
1444
|
onLoad(result);
|
1367
1445
|
});
|
1368
1446
|
}).catch(onError);
|
@@ -1749,6 +1827,7 @@ class GLTFParser {
|
|
1749
1827
|
if (isObjectURL === true) {
|
1750
1828
|
URL.revokeObjectURL(sourceURI);
|
1751
1829
|
}
|
1830
|
+
assignExtrasToUserData(texture, sourceDef);
|
1752
1831
|
texture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType(sourceDef.uri);
|
1753
1832
|
return texture;
|
1754
1833
|
}).catch(function(error) {
|
@@ -1765,7 +1844,7 @@ class GLTFParser {
|
|
1765
1844
|
* @param {Object} mapDef
|
1766
1845
|
* @return {Promise<Texture>}
|
1767
1846
|
*/
|
1768
|
-
assignTexture(materialParams, mapName, mapDef,
|
1847
|
+
assignTexture(materialParams, mapName, mapDef, colorSpace) {
|
1769
1848
|
const parser = this;
|
1770
1849
|
return this.getDependency("texture", mapDef.index).then(function(texture) {
|
1771
1850
|
if (!texture)
|
@@ -1782,11 +1861,13 @@ class GLTFParser {
|
|
1782
1861
|
parser.associations.set(texture, gltfReference);
|
1783
1862
|
}
|
1784
1863
|
}
|
1785
|
-
if (
|
1864
|
+
if (colorSpace !== void 0) {
|
1865
|
+
if (typeof colorSpace === "number")
|
1866
|
+
colorSpace = colorSpace === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
|
1786
1867
|
if ("colorSpace" in texture)
|
1787
|
-
texture.colorSpace =
|
1868
|
+
texture.colorSpace = colorSpace;
|
1788
1869
|
else
|
1789
|
-
texture.encoding =
|
1870
|
+
texture.encoding = colorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding;
|
1790
1871
|
}
|
1791
1872
|
materialParams[mapName] = texture;
|
1792
1873
|
return texture;
|
@@ -1885,11 +1966,11 @@ class GLTFParser {
|
|
1885
1966
|
materialParams.opacity = 1;
|
1886
1967
|
if (Array.isArray(metallicRoughness.baseColorFactor)) {
|
1887
1968
|
const array = metallicRoughness.baseColorFactor;
|
1888
|
-
materialParams.color.
|
1969
|
+
materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace);
|
1889
1970
|
materialParams.opacity = array[3];
|
1890
1971
|
}
|
1891
1972
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
1892
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
1973
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace));
|
1893
1974
|
}
|
1894
1975
|
materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1;
|
1895
1976
|
materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1;
|
@@ -1936,10 +2017,16 @@ class GLTFParser {
|
|
1936
2017
|
}
|
1937
2018
|
}
|
1938
2019
|
if (materialDef.emissiveFactor !== void 0 && materialType !== MeshBasicMaterial) {
|
1939
|
-
|
2020
|
+
const emissiveFactor = materialDef.emissiveFactor;
|
2021
|
+
materialParams.emissive = new Color().setRGB(
|
2022
|
+
emissiveFactor[0],
|
2023
|
+
emissiveFactor[1],
|
2024
|
+
emissiveFactor[2],
|
2025
|
+
LinearSRGBColorSpace
|
2026
|
+
);
|
1940
2027
|
}
|
1941
2028
|
if (materialDef.emissiveTexture !== void 0 && materialType !== MeshBasicMaterial) {
|
1942
|
-
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture,
|
2029
|
+
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture, SRGBColorSpace));
|
1943
2030
|
}
|
1944
2031
|
return Promise.all(pending).then(function() {
|
1945
2032
|
const material = new materialType(materialParams);
|
@@ -2149,6 +2236,7 @@ class GLTFParser {
|
|
2149
2236
|
*/
|
2150
2237
|
loadAnimation(animationIndex) {
|
2151
2238
|
const json = this.json;
|
2239
|
+
const parser = this;
|
2152
2240
|
const animationDef = json.animations[animationIndex];
|
2153
2241
|
const animationName = animationDef.name ? animationDef.name : "animation_" + animationIndex;
|
2154
2242
|
const pendingNodes = [];
|
@@ -2192,57 +2280,14 @@ class GLTFParser {
|
|
2192
2280
|
const target = targets[i];
|
2193
2281
|
if (node === void 0)
|
2194
2282
|
continue;
|
2195
|
-
node.updateMatrix
|
2196
|
-
|
2197
|
-
switch (PATH_PROPERTIES[target.path]) {
|
2198
|
-
case PATH_PROPERTIES.weights:
|
2199
|
-
TypedKeyframeTrack = NumberKeyframeTrack;
|
2200
|
-
break;
|
2201
|
-
case PATH_PROPERTIES.rotation:
|
2202
|
-
TypedKeyframeTrack = QuaternionKeyframeTrack;
|
2203
|
-
break;
|
2204
|
-
case PATH_PROPERTIES.position:
|
2205
|
-
case PATH_PROPERTIES.scale:
|
2206
|
-
default:
|
2207
|
-
TypedKeyframeTrack = VectorKeyframeTrack;
|
2208
|
-
break;
|
2209
|
-
}
|
2210
|
-
const targetName = node.name ? node.name : node.uuid;
|
2211
|
-
const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : InterpolateLinear;
|
2212
|
-
const targetNames = [];
|
2213
|
-
if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {
|
2214
|
-
node.traverse(function(object) {
|
2215
|
-
if (object.morphTargetInfluences) {
|
2216
|
-
targetNames.push(object.name ? object.name : object.uuid);
|
2217
|
-
}
|
2218
|
-
});
|
2219
|
-
} else {
|
2220
|
-
targetNames.push(targetName);
|
2283
|
+
if (node.updateMatrix) {
|
2284
|
+
node.updateMatrix();
|
2221
2285
|
}
|
2222
|
-
|
2223
|
-
if (
|
2224
|
-
|
2225
|
-
|
2226
|
-
for (let j = 0, jl = outputArray.length; j < jl; j++) {
|
2227
|
-
scaled[j] = outputArray[j] * scale;
|
2286
|
+
const createdTracks = parser._createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target);
|
2287
|
+
if (createdTracks) {
|
2288
|
+
for (let k = 0; k < createdTracks.length; k++) {
|
2289
|
+
tracks.push(createdTracks[k]);
|
2228
2290
|
}
|
2229
|
-
outputArray = scaled;
|
2230
|
-
}
|
2231
|
-
for (let j = 0, jl = targetNames.length; j < jl; j++) {
|
2232
|
-
const track = new TypedKeyframeTrack(
|
2233
|
-
targetNames[j] + "." + PATH_PROPERTIES[target.path],
|
2234
|
-
inputAccessor.array,
|
2235
|
-
outputArray,
|
2236
|
-
interpolation
|
2237
|
-
);
|
2238
|
-
if (sampler.interpolation === "CUBICSPLINE") {
|
2239
|
-
track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {
|
2240
|
-
const interpolantType = this instanceof QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
|
2241
|
-
return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);
|
2242
|
-
};
|
2243
|
-
track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;
|
2244
|
-
}
|
2245
|
-
tracks.push(track);
|
2246
2291
|
}
|
2247
2292
|
}
|
2248
2293
|
return new AnimationClip(animationName, void 0, tracks);
|
@@ -2420,6 +2465,79 @@ class GLTFParser {
|
|
2420
2465
|
return scene;
|
2421
2466
|
});
|
2422
2467
|
}
|
2468
|
+
_createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target) {
|
2469
|
+
const tracks = [];
|
2470
|
+
const targetName = node.name ? node.name : node.uuid;
|
2471
|
+
const targetNames = [];
|
2472
|
+
if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {
|
2473
|
+
node.traverse(function(object) {
|
2474
|
+
if (object.morphTargetInfluences) {
|
2475
|
+
targetNames.push(object.name ? object.name : object.uuid);
|
2476
|
+
}
|
2477
|
+
});
|
2478
|
+
} else {
|
2479
|
+
targetNames.push(targetName);
|
2480
|
+
}
|
2481
|
+
let TypedKeyframeTrack;
|
2482
|
+
switch (PATH_PROPERTIES[target.path]) {
|
2483
|
+
case PATH_PROPERTIES.weights:
|
2484
|
+
TypedKeyframeTrack = NumberKeyframeTrack;
|
2485
|
+
break;
|
2486
|
+
case PATH_PROPERTIES.rotation:
|
2487
|
+
TypedKeyframeTrack = QuaternionKeyframeTrack;
|
2488
|
+
break;
|
2489
|
+
case PATH_PROPERTIES.position:
|
2490
|
+
case PATH_PROPERTIES.scale:
|
2491
|
+
TypedKeyframeTrack = VectorKeyframeTrack;
|
2492
|
+
break;
|
2493
|
+
default:
|
2494
|
+
switch (outputAccessor.itemSize) {
|
2495
|
+
case 1:
|
2496
|
+
TypedKeyframeTrack = NumberKeyframeTrack;
|
2497
|
+
break;
|
2498
|
+
case 2:
|
2499
|
+
case 3:
|
2500
|
+
default:
|
2501
|
+
TypedKeyframeTrack = VectorKeyframeTrack;
|
2502
|
+
break;
|
2503
|
+
}
|
2504
|
+
break;
|
2505
|
+
}
|
2506
|
+
const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : InterpolateLinear;
|
2507
|
+
const outputArray = this._getArrayFromAccessor(outputAccessor);
|
2508
|
+
for (let j = 0, jl = targetNames.length; j < jl; j++) {
|
2509
|
+
const track = new TypedKeyframeTrack(
|
2510
|
+
targetNames[j] + "." + PATH_PROPERTIES[target.path],
|
2511
|
+
inputAccessor.array,
|
2512
|
+
outputArray,
|
2513
|
+
interpolation
|
2514
|
+
);
|
2515
|
+
if (sampler.interpolation === "CUBICSPLINE") {
|
2516
|
+
this._createCubicSplineTrackInterpolant(track);
|
2517
|
+
}
|
2518
|
+
tracks.push(track);
|
2519
|
+
}
|
2520
|
+
return tracks;
|
2521
|
+
}
|
2522
|
+
_getArrayFromAccessor(accessor) {
|
2523
|
+
let outputArray = accessor.array;
|
2524
|
+
if (accessor.normalized) {
|
2525
|
+
const scale = getNormalizedComponentScale(outputArray.constructor);
|
2526
|
+
const scaled = new Float32Array(outputArray.length);
|
2527
|
+
for (let j = 0, jl = outputArray.length; j < jl; j++) {
|
2528
|
+
scaled[j] = outputArray[j] * scale;
|
2529
|
+
}
|
2530
|
+
outputArray = scaled;
|
2531
|
+
}
|
2532
|
+
return outputArray;
|
2533
|
+
}
|
2534
|
+
_createCubicSplineTrackInterpolant(track) {
|
2535
|
+
track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {
|
2536
|
+
const interpolantType = this instanceof QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
|
2537
|
+
return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);
|
2538
|
+
};
|
2539
|
+
track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;
|
2540
|
+
}
|
2423
2541
|
}
|
2424
2542
|
function computeBounds(geometry, primitiveDef, parser) {
|
2425
2543
|
const attributes = primitiveDef.attributes;
|