three-stdlib 2.23.4 → 2.23.5
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/README.md +23 -12
- package/loaders/GLTFLoader.cjs +71 -36
- package/loaders/GLTFLoader.js +72 -37
- package/package.json +1 -1
package/README.md
CHANGED
@@ -10,7 +10,9 @@ Stand-alone version of [threejs/examples/jsm](https://github.com/mrdoob/three.js
|
|
10
10
|
|
11
11
|
## Basic usage
|
12
12
|
|
13
|
-
|
13
|
+
```bash
|
14
|
+
npm install three-stdlib
|
15
|
+
```
|
14
16
|
|
15
17
|
```ts
|
16
18
|
// Export collection
|
@@ -21,24 +23,33 @@ import { OrbitControls, ... } from 'three-stdlib'
|
|
21
23
|
|
22
24
|
## Problem
|
23
25
|
|
24
|
-
`
|
26
|
+
`three/examples` are usually regarded as something that you copy/paste into your project and adapt to your needs. That's not how people use it, and this has caused numerous issues in the past.
|
25
27
|
|
26
28
|
## Solution
|
27
29
|
|
28
|
-
- A build system for
|
29
|
-
- Version managed dependencies
|
30
|
+
- A build system for ESM and CJS, compatible with browser, workers, and Node
|
30
31
|
- Class based, optimized for tree-shaking, no globals, exports instead of collections
|
31
|
-
- Single flatbundle as well as individual transpiles
|
32
32
|
- Typesafety with simple annotation-like types
|
33
|
-
-
|
33
|
+
- SemVer and NPM managed dependencies
|
34
34
|
|
35
35
|
But most importantly, allowing more people that use and rely on these primitives to hold a little stake, and to share the weight of maintaining it.
|
36
36
|
|
37
|
-
## How to
|
37
|
+
## How to Contribute
|
38
|
+
|
39
|
+
1. Fork and clone the repo
|
40
|
+
2. Run `yarn install` to install dependencies
|
41
|
+
3. Create a branch for your PR with `git checkout -b pr-type/issue-number-your-branch-name beta
|
42
|
+
4. Let's get cooking! 👨🏻🍳🥓
|
43
|
+
|
44
|
+
### Commit Guidelines
|
45
|
+
|
46
|
+
Be sure your commit messages follow this specification: https://conventionalcommits.org/en/v1.0.0-beta.4
|
47
|
+
|
48
|
+
## Publishing
|
38
49
|
|
39
|
-
|
50
|
+
We use `semantic-release-action` to deploy the package. Because of this only certain commits will trigger the action of creating a release:
|
40
51
|
|
41
|
-
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
52
|
+
- `chore` will not release a new version
|
53
|
+
- `fix:` will create a `0.0.x` version
|
54
|
+
- `feat:` will create a `0.x.0` version
|
55
|
+
- `BREAKING CHANGE:` will create a `x.0.0` version
|
package/loaders/GLTFLoader.cjs
CHANGED
@@ -42,6 +42,9 @@ class GLTFLoader extends THREE.Loader {
|
|
42
42
|
this.register(function(parser) {
|
43
43
|
return new GLTFMaterialsIridescenceExtension(parser);
|
44
44
|
});
|
45
|
+
this.register(function(parser) {
|
46
|
+
return new GLTFMaterialsAnisotropyExtension(parser);
|
47
|
+
});
|
45
48
|
this.register(function(parser) {
|
46
49
|
return new GLTFLightsExtension(parser);
|
47
50
|
});
|
@@ -129,10 +132,11 @@ class GLTFLoader extends THREE.Loader {
|
|
129
132
|
let json;
|
130
133
|
const extensions = {};
|
131
134
|
const plugins = {};
|
135
|
+
const textDecoder = new TextDecoder();
|
132
136
|
if (typeof data === "string") {
|
133
137
|
json = JSON.parse(data);
|
134
138
|
} else if (data instanceof ArrayBuffer) {
|
135
|
-
const magic =
|
139
|
+
const magic = textDecoder.decode(new Uint8Array(data, 0, 4));
|
136
140
|
if (magic === BINARY_EXTENSION_HEADER_MAGIC) {
|
137
141
|
try {
|
138
142
|
extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data);
|
@@ -143,7 +147,7 @@ class GLTFLoader extends THREE.Loader {
|
|
143
147
|
}
|
144
148
|
json = JSON.parse(extensions[EXTENSIONS.KHR_BINARY_GLTF].content);
|
145
149
|
} else {
|
146
|
-
json = JSON.parse(
|
150
|
+
json = JSON.parse(textDecoder.decode(data));
|
147
151
|
}
|
148
152
|
} else {
|
149
153
|
json = data;
|
@@ -229,6 +233,7 @@ const EXTENSIONS = {
|
|
229
233
|
KHR_MATERIALS_SPECULAR: "KHR_materials_specular",
|
230
234
|
KHR_MATERIALS_TRANSMISSION: "KHR_materials_transmission",
|
231
235
|
KHR_MATERIALS_IRIDESCENCE: "KHR_materials_iridescence",
|
236
|
+
KHR_MATERIALS_ANISOTROPY: "KHR_materials_anisotropy",
|
232
237
|
KHR_MATERIALS_UNLIT: "KHR_materials_unlit",
|
233
238
|
KHR_MATERIALS_VOLUME: "KHR_materials_volume",
|
234
239
|
KHR_TEXTURE_BASISU: "KHR_texture_basisu",
|
@@ -343,7 +348,7 @@ class GLTFMaterialsUnlitExtension {
|
|
343
348
|
materialParams.opacity = array[3];
|
344
349
|
}
|
345
350
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
346
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
351
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, THREE.SRGBColorSpace));
|
347
352
|
}
|
348
353
|
}
|
349
354
|
return Promise.all(pending);
|
@@ -485,7 +490,7 @@ class GLTFMaterialsSheenExtension {
|
|
485
490
|
materialParams.sheenRoughness = extension.sheenRoughnessFactor;
|
486
491
|
}
|
487
492
|
if (extension.sheenColorTexture !== void 0) {
|
488
|
-
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture,
|
493
|
+
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture, THREE.SRGBColorSpace));
|
489
494
|
}
|
490
495
|
if (extension.sheenRoughnessTexture !== void 0) {
|
491
496
|
pending.push(parser.assignTexture(materialParams, "sheenRoughnessMap", extension.sheenRoughnessTexture));
|
@@ -603,13 +608,44 @@ class GLTFMaterialsSpecularExtension {
|
|
603
608
|
materialParams.specularColor = new THREE.Color(colorArray[0], colorArray[1], colorArray[2]);
|
604
609
|
if (extension.specularColorTexture !== void 0) {
|
605
610
|
pending.push(
|
606
|
-
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture,
|
607
|
-
// sRGBEncoding
|
611
|
+
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture, THREE.SRGBColorSpace)
|
608
612
|
);
|
609
613
|
}
|
610
614
|
return Promise.all(pending);
|
611
615
|
}
|
612
616
|
}
|
617
|
+
class GLTFMaterialsAnisotropyExtension {
|
618
|
+
constructor(parser) {
|
619
|
+
this.parser = parser;
|
620
|
+
this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;
|
621
|
+
}
|
622
|
+
getMaterialType(materialIndex) {
|
623
|
+
const parser = this.parser;
|
624
|
+
const materialDef = parser.json.materials[materialIndex];
|
625
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name])
|
626
|
+
return null;
|
627
|
+
return THREE.MeshPhysicalMaterial;
|
628
|
+
}
|
629
|
+
extendMaterialParams(materialIndex, materialParams) {
|
630
|
+
const parser = this.parser;
|
631
|
+
const materialDef = parser.json.materials[materialIndex];
|
632
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
|
633
|
+
return Promise.resolve();
|
634
|
+
}
|
635
|
+
const pending = [];
|
636
|
+
const extension = materialDef.extensions[this.name];
|
637
|
+
if (extension.anisotropyStrength !== void 0) {
|
638
|
+
materialParams.anisotropy = extension.anisotropyStrength;
|
639
|
+
}
|
640
|
+
if (extension.anisotropyRotation !== void 0) {
|
641
|
+
materialParams.anisotropyRotation = extension.anisotropyRotation;
|
642
|
+
}
|
643
|
+
if (extension.anisotropyTexture !== void 0) {
|
644
|
+
pending.push(parser.assignTexture(materialParams, "anisotropyMap", extension.anisotropyTexture));
|
645
|
+
}
|
646
|
+
return Promise.all(pending);
|
647
|
+
}
|
648
|
+
}
|
613
649
|
class GLTFTextureBasisUExtension {
|
614
650
|
constructor(parser) {
|
615
651
|
this.parser = parser;
|
@@ -854,8 +890,9 @@ class GLTFBinaryExtension {
|
|
854
890
|
this.content = null;
|
855
891
|
this.body = null;
|
856
892
|
const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH);
|
893
|
+
const textDecoder = new TextDecoder();
|
857
894
|
this.header = {
|
858
|
-
magic:
|
895
|
+
magic: textDecoder.decode(new Uint8Array(data.slice(0, 4))),
|
859
896
|
version: headerView.getUint32(4, true),
|
860
897
|
length: headerView.getUint32(8, true)
|
861
898
|
};
|
@@ -874,7 +911,7 @@ class GLTFBinaryExtension {
|
|
874
911
|
chunkIndex += 4;
|
875
912
|
if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) {
|
876
913
|
const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength);
|
877
|
-
this.content =
|
914
|
+
this.content = textDecoder.decode(contentArray);
|
878
915
|
} else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) {
|
879
916
|
const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;
|
880
917
|
this.body = data.slice(byteOffset, byteOffset + chunkLength);
|
@@ -1004,7 +1041,7 @@ class GLTFCubicSplineInterpolant extends THREE.Interpolant {
|
|
1004
1041
|
return result;
|
1005
1042
|
}
|
1006
1043
|
}
|
1007
|
-
const _q =
|
1044
|
+
const _q = new THREE.Quaternion();
|
1008
1045
|
class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {
|
1009
1046
|
interpolate_(i1, t0, t, t1) {
|
1010
1047
|
const result = super.interpolate_(i1, t0, t, t1);
|
@@ -1067,18 +1104,10 @@ const ATTRIBUTES = {
|
|
1067
1104
|
POSITION: "position",
|
1068
1105
|
NORMAL: "normal",
|
1069
1106
|
TANGENT: "tangent",
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
TEXCOORD_0: "uv",
|
1075
|
-
TEXCOORD_1: "uv1",
|
1076
|
-
TEXCOORD_2: "uv2",
|
1077
|
-
TEXCOORD_3: "uv3"
|
1078
|
-
} : {
|
1079
|
-
TEXCOORD_0: "uv",
|
1080
|
-
TEXCOORD_1: "uv2"
|
1081
|
-
},
|
1107
|
+
TEXCOORD_0: "uv",
|
1108
|
+
TEXCOORD_1: "uv1",
|
1109
|
+
TEXCOORD_2: "uv2",
|
1110
|
+
TEXCOORD_3: "uv3",
|
1082
1111
|
COLOR_0: "color",
|
1083
1112
|
WEIGHTS_0: "skinWeight",
|
1084
1113
|
JOINTS_0: "skinIndex"
|
@@ -1205,13 +1234,18 @@ function updateMorphTargets(mesh, meshDef) {
|
|
1205
1234
|
}
|
1206
1235
|
}
|
1207
1236
|
function createPrimitiveKey(primitiveDef) {
|
1208
|
-
const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];
|
1209
1237
|
let geometryKey;
|
1238
|
+
const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];
|
1210
1239
|
if (dracoExtension) {
|
1211
1240
|
geometryKey = "draco:" + dracoExtension.bufferView + ":" + dracoExtension.indices + ":" + createAttributesKey(dracoExtension.attributes);
|
1212
1241
|
} else {
|
1213
1242
|
geometryKey = primitiveDef.indices + ":" + createAttributesKey(primitiveDef.attributes) + ":" + primitiveDef.mode;
|
1214
1243
|
}
|
1244
|
+
if (primitiveDef.targets !== void 0) {
|
1245
|
+
for (let i = 0, il = primitiveDef.targets.length; i < il; i++) {
|
1246
|
+
geometryKey += ":" + createAttributesKey(primitiveDef.targets[i]);
|
1247
|
+
}
|
1248
|
+
}
|
1215
1249
|
return geometryKey;
|
1216
1250
|
}
|
1217
1251
|
function createAttributesKey(attributes) {
|
@@ -1243,7 +1277,7 @@ function getImageURIMimeType(uri) {
|
|
1243
1277
|
return "image/webp";
|
1244
1278
|
return "image/png";
|
1245
1279
|
}
|
1246
|
-
const _identityMatrix =
|
1280
|
+
const _identityMatrix = new THREE.Matrix4();
|
1247
1281
|
class GLTFParser {
|
1248
1282
|
constructor(json = {}, options = {}) {
|
1249
1283
|
this.json = json;
|
@@ -1725,7 +1759,7 @@ class GLTFParser {
|
|
1725
1759
|
* @param {Object} mapDef
|
1726
1760
|
* @return {Promise<Texture>}
|
1727
1761
|
*/
|
1728
|
-
assignTexture(materialParams, mapName, mapDef,
|
1762
|
+
assignTexture(materialParams, mapName, mapDef, colorSpace) {
|
1729
1763
|
const parser = this;
|
1730
1764
|
return this.getDependency("texture", mapDef.index).then(function(texture) {
|
1731
1765
|
if (!texture)
|
@@ -1742,11 +1776,8 @@ class GLTFParser {
|
|
1742
1776
|
parser.associations.set(texture, gltfReference);
|
1743
1777
|
}
|
1744
1778
|
}
|
1745
|
-
if (
|
1746
|
-
|
1747
|
-
texture.colorSpace = encoding === 3001 ? "srgb" : "srgb-linear";
|
1748
|
-
else
|
1749
|
-
texture.encoding = encoding;
|
1779
|
+
if (colorSpace !== void 0) {
|
1780
|
+
texture.colorSpace = colorSpace;
|
1750
1781
|
}
|
1751
1782
|
materialParams[mapName] = texture;
|
1752
1783
|
return texture;
|
@@ -1849,7 +1880,7 @@ class GLTFParser {
|
|
1849
1880
|
materialParams.opacity = array[3];
|
1850
1881
|
}
|
1851
1882
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
1852
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
1883
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, THREE.SRGBColorSpace));
|
1853
1884
|
}
|
1854
1885
|
materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1;
|
1855
1886
|
materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1;
|
@@ -1899,7 +1930,7 @@ class GLTFParser {
|
|
1899
1930
|
materialParams.emissive = new THREE.Color().fromArray(materialDef.emissiveFactor);
|
1900
1931
|
}
|
1901
1932
|
if (materialDef.emissiveTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) {
|
1902
|
-
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture,
|
1933
|
+
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture, THREE.SRGBColorSpace));
|
1903
1934
|
}
|
1904
1935
|
return Promise.all(pending).then(function() {
|
1905
1936
|
const material = new materialType(materialParams);
|
@@ -1915,12 +1946,12 @@ class GLTFParser {
|
|
1915
1946
|
/** When Object3D instances are targeted by animation, they need unique names. */
|
1916
1947
|
createUniqueName(originalName) {
|
1917
1948
|
const sanitizedName = THREE.PropertyBinding.sanitizeNodeName(originalName || "");
|
1918
|
-
|
1919
|
-
|
1920
|
-
|
1949
|
+
if (sanitizedName in this.nodeNamesUsed) {
|
1950
|
+
return sanitizedName + "_" + ++this.nodeNamesUsed[sanitizedName];
|
1951
|
+
} else {
|
1952
|
+
this.nodeNamesUsed[sanitizedName] = 0;
|
1953
|
+
return sanitizedName;
|
1921
1954
|
}
|
1922
|
-
this.nodeNamesUsed[name] = true;
|
1923
|
-
return name;
|
1924
1955
|
}
|
1925
1956
|
/**
|
1926
1957
|
* Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry
|
@@ -2023,9 +2054,13 @@ class GLTFParser {
|
|
2023
2054
|
});
|
2024
2055
|
}
|
2025
2056
|
if (meshes.length === 1) {
|
2057
|
+
if (meshDef.extensions)
|
2058
|
+
addUnknownExtensionsToUserData(extensions, meshes[0], meshDef);
|
2026
2059
|
return meshes[0];
|
2027
2060
|
}
|
2028
2061
|
const group = new THREE.Group();
|
2062
|
+
if (meshDef.extensions)
|
2063
|
+
addUnknownExtensionsToUserData(extensions, group, meshDef);
|
2029
2064
|
parser.associations.set(group, { meshes: meshIndex });
|
2030
2065
|
for (let i = 0, il = meshes.length; i < il; i++) {
|
2031
2066
|
group.add(meshes[i]);
|
package/loaders/GLTFLoader.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, MeshPhysicalMaterial, Vector2, Matrix4, Vector3, Quaternion, InstancedMesh, Object3D, Interpolant, NearestFilter, LinearFilter, NearestMipmapNearestFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter, ClampToEdgeWrapping, MirroredRepeatWrapping, RepeatWrapping,
|
1
|
+
import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, SRGBColorSpace, MeshPhysicalMaterial, Vector2, Matrix4, Vector3, Quaternion, InstancedMesh, Object3D, Interpolant, NearestFilter, LinearFilter, NearestMipmapNearestFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter, ClampToEdgeWrapping, MirroredRepeatWrapping, RepeatWrapping, InterpolateLinear, InterpolateDiscrete, MeshStandardMaterial, FrontSide, TextureLoader, ImageBitmapLoader, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Texture, PointsMaterial, Material, LineBasicMaterial, DoubleSide, PropertyBinding, BufferGeometry, SkinnedMesh, Mesh, TriangleStripDrawMode, TriangleFanDrawMode, LineSegments, Line, LineLoop, Points, Group, PerspectiveCamera, MathUtils, OrthographicCamera, Skeleton, VectorKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, AnimationClip, Bone, Box3, Sphere } from "three";
|
2
2
|
import { toTrianglesDrawMode } from "../utils/BufferGeometryUtils.js";
|
3
3
|
class GLTFLoader extends Loader {
|
4
4
|
constructor(manager) {
|
@@ -40,6 +40,9 @@ class GLTFLoader extends Loader {
|
|
40
40
|
this.register(function(parser) {
|
41
41
|
return new GLTFMaterialsIridescenceExtension(parser);
|
42
42
|
});
|
43
|
+
this.register(function(parser) {
|
44
|
+
return new GLTFMaterialsAnisotropyExtension(parser);
|
45
|
+
});
|
43
46
|
this.register(function(parser) {
|
44
47
|
return new GLTFLightsExtension(parser);
|
45
48
|
});
|
@@ -127,10 +130,11 @@ class GLTFLoader extends Loader {
|
|
127
130
|
let json;
|
128
131
|
const extensions = {};
|
129
132
|
const plugins = {};
|
133
|
+
const textDecoder = new TextDecoder();
|
130
134
|
if (typeof data === "string") {
|
131
135
|
json = JSON.parse(data);
|
132
136
|
} else if (data instanceof ArrayBuffer) {
|
133
|
-
const magic =
|
137
|
+
const magic = textDecoder.decode(new Uint8Array(data, 0, 4));
|
134
138
|
if (magic === BINARY_EXTENSION_HEADER_MAGIC) {
|
135
139
|
try {
|
136
140
|
extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data);
|
@@ -141,7 +145,7 @@ class GLTFLoader extends Loader {
|
|
141
145
|
}
|
142
146
|
json = JSON.parse(extensions[EXTENSIONS.KHR_BINARY_GLTF].content);
|
143
147
|
} else {
|
144
|
-
json = JSON.parse(
|
148
|
+
json = JSON.parse(textDecoder.decode(data));
|
145
149
|
}
|
146
150
|
} else {
|
147
151
|
json = data;
|
@@ -227,6 +231,7 @@ const EXTENSIONS = {
|
|
227
231
|
KHR_MATERIALS_SPECULAR: "KHR_materials_specular",
|
228
232
|
KHR_MATERIALS_TRANSMISSION: "KHR_materials_transmission",
|
229
233
|
KHR_MATERIALS_IRIDESCENCE: "KHR_materials_iridescence",
|
234
|
+
KHR_MATERIALS_ANISOTROPY: "KHR_materials_anisotropy",
|
230
235
|
KHR_MATERIALS_UNLIT: "KHR_materials_unlit",
|
231
236
|
KHR_MATERIALS_VOLUME: "KHR_materials_volume",
|
232
237
|
KHR_TEXTURE_BASISU: "KHR_texture_basisu",
|
@@ -341,7 +346,7 @@ class GLTFMaterialsUnlitExtension {
|
|
341
346
|
materialParams.opacity = array[3];
|
342
347
|
}
|
343
348
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
344
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
349
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace));
|
345
350
|
}
|
346
351
|
}
|
347
352
|
return Promise.all(pending);
|
@@ -483,7 +488,7 @@ class GLTFMaterialsSheenExtension {
|
|
483
488
|
materialParams.sheenRoughness = extension.sheenRoughnessFactor;
|
484
489
|
}
|
485
490
|
if (extension.sheenColorTexture !== void 0) {
|
486
|
-
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture,
|
491
|
+
pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture, SRGBColorSpace));
|
487
492
|
}
|
488
493
|
if (extension.sheenRoughnessTexture !== void 0) {
|
489
494
|
pending.push(parser.assignTexture(materialParams, "sheenRoughnessMap", extension.sheenRoughnessTexture));
|
@@ -601,13 +606,44 @@ class GLTFMaterialsSpecularExtension {
|
|
601
606
|
materialParams.specularColor = new Color(colorArray[0], colorArray[1], colorArray[2]);
|
602
607
|
if (extension.specularColorTexture !== void 0) {
|
603
608
|
pending.push(
|
604
|
-
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture,
|
605
|
-
// sRGBEncoding
|
609
|
+
parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture, SRGBColorSpace)
|
606
610
|
);
|
607
611
|
}
|
608
612
|
return Promise.all(pending);
|
609
613
|
}
|
610
614
|
}
|
615
|
+
class GLTFMaterialsAnisotropyExtension {
|
616
|
+
constructor(parser) {
|
617
|
+
this.parser = parser;
|
618
|
+
this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;
|
619
|
+
}
|
620
|
+
getMaterialType(materialIndex) {
|
621
|
+
const parser = this.parser;
|
622
|
+
const materialDef = parser.json.materials[materialIndex];
|
623
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name])
|
624
|
+
return null;
|
625
|
+
return MeshPhysicalMaterial;
|
626
|
+
}
|
627
|
+
extendMaterialParams(materialIndex, materialParams) {
|
628
|
+
const parser = this.parser;
|
629
|
+
const materialDef = parser.json.materials[materialIndex];
|
630
|
+
if (!materialDef.extensions || !materialDef.extensions[this.name]) {
|
631
|
+
return Promise.resolve();
|
632
|
+
}
|
633
|
+
const pending = [];
|
634
|
+
const extension = materialDef.extensions[this.name];
|
635
|
+
if (extension.anisotropyStrength !== void 0) {
|
636
|
+
materialParams.anisotropy = extension.anisotropyStrength;
|
637
|
+
}
|
638
|
+
if (extension.anisotropyRotation !== void 0) {
|
639
|
+
materialParams.anisotropyRotation = extension.anisotropyRotation;
|
640
|
+
}
|
641
|
+
if (extension.anisotropyTexture !== void 0) {
|
642
|
+
pending.push(parser.assignTexture(materialParams, "anisotropyMap", extension.anisotropyTexture));
|
643
|
+
}
|
644
|
+
return Promise.all(pending);
|
645
|
+
}
|
646
|
+
}
|
611
647
|
class GLTFTextureBasisUExtension {
|
612
648
|
constructor(parser) {
|
613
649
|
this.parser = parser;
|
@@ -852,8 +888,9 @@ class GLTFBinaryExtension {
|
|
852
888
|
this.content = null;
|
853
889
|
this.body = null;
|
854
890
|
const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH);
|
891
|
+
const textDecoder = new TextDecoder();
|
855
892
|
this.header = {
|
856
|
-
magic:
|
893
|
+
magic: textDecoder.decode(new Uint8Array(data.slice(0, 4))),
|
857
894
|
version: headerView.getUint32(4, true),
|
858
895
|
length: headerView.getUint32(8, true)
|
859
896
|
};
|
@@ -872,7 +909,7 @@ class GLTFBinaryExtension {
|
|
872
909
|
chunkIndex += 4;
|
873
910
|
if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) {
|
874
911
|
const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength);
|
875
|
-
this.content =
|
912
|
+
this.content = textDecoder.decode(contentArray);
|
876
913
|
} else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) {
|
877
914
|
const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;
|
878
915
|
this.body = data.slice(byteOffset, byteOffset + chunkLength);
|
@@ -1002,7 +1039,7 @@ class GLTFCubicSplineInterpolant extends Interpolant {
|
|
1002
1039
|
return result;
|
1003
1040
|
}
|
1004
1041
|
}
|
1005
|
-
const _q =
|
1042
|
+
const _q = new Quaternion();
|
1006
1043
|
class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {
|
1007
1044
|
interpolate_(i1, t0, t, t1) {
|
1008
1045
|
const result = super.interpolate_(i1, t0, t, t1);
|
@@ -1065,18 +1102,10 @@ const ATTRIBUTES = {
|
|
1065
1102
|
POSITION: "position",
|
1066
1103
|
NORMAL: "normal",
|
1067
1104
|
TANGENT: "tangent",
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
TEXCOORD_0: "uv",
|
1073
|
-
TEXCOORD_1: "uv1",
|
1074
|
-
TEXCOORD_2: "uv2",
|
1075
|
-
TEXCOORD_3: "uv3"
|
1076
|
-
} : {
|
1077
|
-
TEXCOORD_0: "uv",
|
1078
|
-
TEXCOORD_1: "uv2"
|
1079
|
-
},
|
1105
|
+
TEXCOORD_0: "uv",
|
1106
|
+
TEXCOORD_1: "uv1",
|
1107
|
+
TEXCOORD_2: "uv2",
|
1108
|
+
TEXCOORD_3: "uv3",
|
1080
1109
|
COLOR_0: "color",
|
1081
1110
|
WEIGHTS_0: "skinWeight",
|
1082
1111
|
JOINTS_0: "skinIndex"
|
@@ -1203,13 +1232,18 @@ function updateMorphTargets(mesh, meshDef) {
|
|
1203
1232
|
}
|
1204
1233
|
}
|
1205
1234
|
function createPrimitiveKey(primitiveDef) {
|
1206
|
-
const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];
|
1207
1235
|
let geometryKey;
|
1236
|
+
const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];
|
1208
1237
|
if (dracoExtension) {
|
1209
1238
|
geometryKey = "draco:" + dracoExtension.bufferView + ":" + dracoExtension.indices + ":" + createAttributesKey(dracoExtension.attributes);
|
1210
1239
|
} else {
|
1211
1240
|
geometryKey = primitiveDef.indices + ":" + createAttributesKey(primitiveDef.attributes) + ":" + primitiveDef.mode;
|
1212
1241
|
}
|
1242
|
+
if (primitiveDef.targets !== void 0) {
|
1243
|
+
for (let i = 0, il = primitiveDef.targets.length; i < il; i++) {
|
1244
|
+
geometryKey += ":" + createAttributesKey(primitiveDef.targets[i]);
|
1245
|
+
}
|
1246
|
+
}
|
1213
1247
|
return geometryKey;
|
1214
1248
|
}
|
1215
1249
|
function createAttributesKey(attributes) {
|
@@ -1241,7 +1275,7 @@ function getImageURIMimeType(uri) {
|
|
1241
1275
|
return "image/webp";
|
1242
1276
|
return "image/png";
|
1243
1277
|
}
|
1244
|
-
const _identityMatrix =
|
1278
|
+
const _identityMatrix = new Matrix4();
|
1245
1279
|
class GLTFParser {
|
1246
1280
|
constructor(json = {}, options = {}) {
|
1247
1281
|
this.json = json;
|
@@ -1723,7 +1757,7 @@ class GLTFParser {
|
|
1723
1757
|
* @param {Object} mapDef
|
1724
1758
|
* @return {Promise<Texture>}
|
1725
1759
|
*/
|
1726
|
-
assignTexture(materialParams, mapName, mapDef,
|
1760
|
+
assignTexture(materialParams, mapName, mapDef, colorSpace) {
|
1727
1761
|
const parser = this;
|
1728
1762
|
return this.getDependency("texture", mapDef.index).then(function(texture) {
|
1729
1763
|
if (!texture)
|
@@ -1740,11 +1774,8 @@ class GLTFParser {
|
|
1740
1774
|
parser.associations.set(texture, gltfReference);
|
1741
1775
|
}
|
1742
1776
|
}
|
1743
|
-
if (
|
1744
|
-
|
1745
|
-
texture.colorSpace = encoding === 3001 ? "srgb" : "srgb-linear";
|
1746
|
-
else
|
1747
|
-
texture.encoding = encoding;
|
1777
|
+
if (colorSpace !== void 0) {
|
1778
|
+
texture.colorSpace = colorSpace;
|
1748
1779
|
}
|
1749
1780
|
materialParams[mapName] = texture;
|
1750
1781
|
return texture;
|
@@ -1847,7 +1878,7 @@ class GLTFParser {
|
|
1847
1878
|
materialParams.opacity = array[3];
|
1848
1879
|
}
|
1849
1880
|
if (metallicRoughness.baseColorTexture !== void 0) {
|
1850
|
-
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture,
|
1881
|
+
pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace));
|
1851
1882
|
}
|
1852
1883
|
materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1;
|
1853
1884
|
materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1;
|
@@ -1897,7 +1928,7 @@ class GLTFParser {
|
|
1897
1928
|
materialParams.emissive = new Color().fromArray(materialDef.emissiveFactor);
|
1898
1929
|
}
|
1899
1930
|
if (materialDef.emissiveTexture !== void 0 && materialType !== MeshBasicMaterial) {
|
1900
|
-
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture,
|
1931
|
+
pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture, SRGBColorSpace));
|
1901
1932
|
}
|
1902
1933
|
return Promise.all(pending).then(function() {
|
1903
1934
|
const material = new materialType(materialParams);
|
@@ -1913,12 +1944,12 @@ class GLTFParser {
|
|
1913
1944
|
/** When Object3D instances are targeted by animation, they need unique names. */
|
1914
1945
|
createUniqueName(originalName) {
|
1915
1946
|
const sanitizedName = PropertyBinding.sanitizeNodeName(originalName || "");
|
1916
|
-
|
1917
|
-
|
1918
|
-
|
1947
|
+
if (sanitizedName in this.nodeNamesUsed) {
|
1948
|
+
return sanitizedName + "_" + ++this.nodeNamesUsed[sanitizedName];
|
1949
|
+
} else {
|
1950
|
+
this.nodeNamesUsed[sanitizedName] = 0;
|
1951
|
+
return sanitizedName;
|
1919
1952
|
}
|
1920
|
-
this.nodeNamesUsed[name] = true;
|
1921
|
-
return name;
|
1922
1953
|
}
|
1923
1954
|
/**
|
1924
1955
|
* Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry
|
@@ -2021,9 +2052,13 @@ class GLTFParser {
|
|
2021
2052
|
});
|
2022
2053
|
}
|
2023
2054
|
if (meshes.length === 1) {
|
2055
|
+
if (meshDef.extensions)
|
2056
|
+
addUnknownExtensionsToUserData(extensions, meshes[0], meshDef);
|
2024
2057
|
return meshes[0];
|
2025
2058
|
}
|
2026
2059
|
const group = new Group();
|
2060
|
+
if (meshDef.extensions)
|
2061
|
+
addUnknownExtensionsToUserData(extensions, group, meshDef);
|
2027
2062
|
parser.associations.set(group, { meshes: meshIndex });
|
2028
2063
|
for (let i = 0, il = meshes.length; i < il; i++) {
|
2029
2064
|
group.add(meshes[i]);
|