three-stdlib 2.6.3 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/{Nodes-ec4e1143.js → Nodes-894ac9dc.js} +0 -0
  2. package/{Nodes-427f68b0.js → Nodes-af575af7.js} +0 -0
  3. package/controls/ArcballControls.cjs.js +1 -1
  4. package/controls/ArcballControls.d.ts +161 -0
  5. package/controls/ArcballControls.js +554 -285
  6. package/controls/OrbitControls.cjs.js +1 -1
  7. package/controls/OrbitControls.d.ts +1 -0
  8. package/controls/OrbitControls.js +13 -2
  9. package/controls/TransformControls.cjs.js +1 -1
  10. package/controls/TransformControls.d.ts +2 -1
  11. package/controls/TransformControls.js +25 -26
  12. package/geometries/TeapotGeometry.js +2 -2
  13. package/geometries/TextGeometry.cjs.js +1 -0
  14. package/geometries/TextGeometry.d.ts +16 -0
  15. package/geometries/TextGeometry.js +26 -0
  16. package/index.cjs.js +1 -1
  17. package/index.d.ts +2 -0
  18. package/index.js +2 -0
  19. package/loaders/AMFLoader.js +1 -3
  20. package/loaders/ColladaLoader.cjs.js +1 -1
  21. package/loaders/ColladaLoader.js +58 -35
  22. package/loaders/EXRLoader.cjs.js +1 -1
  23. package/loaders/EXRLoader.js +197 -262
  24. package/loaders/FBXLoader.cjs.js +1 -1
  25. package/loaders/FBXLoader.js +41 -90
  26. package/loaders/FontLoader.cjs.js +1 -0
  27. package/loaders/FontLoader.d.ts +32 -0
  28. package/loaders/FontLoader.js +139 -0
  29. package/loaders/GLTFLoader.cjs.js +1 -1
  30. package/loaders/GLTFLoader.js +161 -75
  31. package/loaders/HDRCubeTextureLoader.cjs.js +1 -1
  32. package/loaders/HDRCubeTextureLoader.js +2 -2
  33. package/loaders/NodeMaterialLoader.cjs.js +1 -1
  34. package/loaders/RGBELoader.cjs.js +1 -1
  35. package/loaders/RGBELoader.js +10 -9
  36. package/loaders/RGBMLoader.cjs.js +1 -1
  37. package/loaders/RGBMLoader.js +181 -257
  38. package/loaders/STLLoader.js +7 -7
  39. package/loaders/SVGLoader.cjs.js +1 -1
  40. package/loaders/SVGLoader.js +46 -30
  41. package/loaders/VRMLLoader.cjs.js +1 -1
  42. package/loaders/VRMLLoader.js +2 -1
  43. package/nodes/accessors/CameraNode.js +12 -12
  44. package/nodes/accessors/PositionNode.js +3 -3
  45. package/nodes/accessors/ReflectNode.js +3 -3
  46. package/nodes/core/FunctionNode.js +3 -3
  47. package/nodes/core/InputNode.js +3 -3
  48. package/nodes/core/Node.js +6 -6
  49. package/nodes/core/TempNode.js +6 -6
  50. package/nodes/effects/BlurNode.js +3 -3
  51. package/nodes/math/MathNode.js +3 -3
  52. package/nodes/utils/VelocityNode.js +6 -6
  53. package/package.json +2 -2
  54. package/renderers/nodes/accessors/UVNode.js +1 -3
  55. package/renderers/nodes/core/AttributeNode.js +1 -3
  56. package/renderers/nodes/core/Node.js +4 -12
  57. package/renderers/nodes/core/NodeBuilder.js +6 -18
  58. package/webxr/ARButton.js +6 -6
  59. package/webxr/VRButton.js +6 -6
@@ -1,4 +1,4 @@
1
- import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, MeshPhysicalMaterial, Vector2, sRGBEncoding, TangentSpaceNormalMap, ImageBitmapLoader, TextureLoader, InterleavedBuffer, InterleavedBufferAttribute, BufferAttribute, RGBFormat, LinearFilter, LinearMipmapLinearFilter, RepeatWrapping, PointsMaterial, Material, LineBasicMaterial, MeshStandardMaterial, DoubleSide, PropertyBinding, BufferGeometry, SkinnedMesh, Mesh, LineSegments, Line, LineLoop, Points, Group, PerspectiveCamera, MathUtils, OrthographicCamera, InterpolateLinear, AnimationClip, Bone, Object3D, Matrix4, Skeleton, TriangleFanDrawMode, Interpolant, NearestFilter, NearestMipmapNearestFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, ClampToEdgeWrapping, MirroredRepeatWrapping, InterpolateDiscrete, FrontSide, Texture, TriangleStripDrawMode, VectorKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, Box3, Vector3, Sphere } from 'three';
1
+ import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, MeshPhysicalMaterial, Vector2, sRGBEncoding, TangentSpaceNormalMap, Quaternion, ImageBitmapLoader, TextureLoader, InterleavedBuffer, InterleavedBufferAttribute, BufferAttribute, LinearFilter, LinearMipmapLinearFilter, RepeatWrapping, PointsMaterial, Material, LineBasicMaterial, MeshStandardMaterial, DoubleSide, RGBFormat, PropertyBinding, BufferGeometry, SkinnedMesh, Mesh, LineSegments, Line, LineLoop, Points, Group, PerspectiveCamera, MathUtils, OrthographicCamera, InterpolateLinear, AnimationClip, Bone, Object3D, Matrix4, Skeleton, TriangleFanDrawMode, NearestFilter, NearestMipmapNearestFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, ClampToEdgeWrapping, MirroredRepeatWrapping, InterpolateDiscrete, FrontSide, Texture, TriangleStripDrawMode, VectorKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, Box3, Vector3, Sphere, Interpolant } from 'three';
2
2
 
3
3
  class GLTFLoader extends Loader {
4
4
  constructor(manager) {
@@ -16,6 +16,9 @@ class GLTFLoader extends Loader {
16
16
  this.register(function (parser) {
17
17
  return new GLTFTextureWebPExtension(parser);
18
18
  });
19
+ this.register(function (parser) {
20
+ return new GLTFMaterialsSheenExtension(parser);
21
+ });
19
22
  this.register(function (parser) {
20
23
  return new GLTFMaterialsTransmissionExtension(parser);
21
24
  });
@@ -207,6 +210,13 @@ class GLTFLoader extends Loader {
207
210
  parser.parse(onLoad, onError);
208
211
  }
209
212
 
213
+ parseAsync(data, path) {
214
+ const scope = this;
215
+ return new Promise(function (resolve, reject) {
216
+ scope.parse(data, path, resolve, reject);
217
+ });
218
+ }
219
+
210
220
  }
211
221
  /* GLTFREGISTRY */
212
222
 
@@ -242,6 +252,7 @@ const EXTENSIONS = {
242
252
  KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',
243
253
  KHR_MATERIALS_IOR: 'KHR_materials_ior',
244
254
  KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',
255
+ KHR_MATERIALS_SHEEN: 'KHR_materials_sheen',
245
256
  KHR_MATERIALS_SPECULAR: 'KHR_materials_specular',
246
257
  KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',
247
258
  KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',
@@ -439,15 +450,68 @@ class GLTFMaterialsClearcoatExtension {
439
450
  pending.push(parser.assignTexture(materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture));
440
451
 
441
452
  if (extension.clearcoatNormalTexture.scale !== undefined) {
442
- const scale = extension.clearcoatNormalTexture.scale; // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995
443
-
444
- materialParams.clearcoatNormalScale = new Vector2(scale, -scale);
453
+ const scale = extension.clearcoatNormalTexture.scale;
454
+ materialParams.clearcoatNormalScale = new Vector2(scale, scale);
445
455
  }
446
456
  }
447
457
 
448
458
  return Promise.all(pending);
449
459
  }
450
460
 
461
+ }
462
+ /**
463
+ * Sheen Materials Extension
464
+ *
465
+ * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen
466
+ */
467
+
468
+
469
+ class GLTFMaterialsSheenExtension {
470
+ constructor(parser) {
471
+ this.parser = parser;
472
+ this.name = EXTENSIONS.KHR_MATERIALS_SHEEN;
473
+ }
474
+
475
+ getMaterialType(materialIndex) {
476
+ const parser = this.parser;
477
+ const materialDef = parser.json.materials[materialIndex];
478
+ if (!materialDef.extensions || !materialDef.extensions[this.name]) return null;
479
+ return MeshPhysicalMaterial;
480
+ }
481
+
482
+ extendMaterialParams(materialIndex, materialParams) {
483
+ const parser = this.parser;
484
+ const materialDef = parser.json.materials[materialIndex];
485
+
486
+ if (!materialDef.extensions || !materialDef.extensions[this.name]) {
487
+ return Promise.resolve();
488
+ }
489
+
490
+ const pending = [];
491
+ materialParams.sheenColor = new Color(0, 0, 0);
492
+ materialParams.sheenRoughness = 0;
493
+ materialParams.sheen = 1;
494
+ const extension = materialDef.extensions[this.name];
495
+
496
+ if (extension.sheenColorFactor !== undefined) {
497
+ materialParams.sheenColor.fromArray(extension.sheenColorFactor);
498
+ }
499
+
500
+ if (extension.sheenRoughnessFactor !== undefined) {
501
+ materialParams.sheenRoughness = extension.sheenRoughnessFactor;
502
+ }
503
+
504
+ if (extension.sheenColorTexture !== undefined) {
505
+ pending.push(parser.assignTexture(materialParams, 'sheenColorMap', extension.sheenColorTexture));
506
+ }
507
+
508
+ if (extension.sheenRoughnessTexture !== undefined) {
509
+ pending.push(parser.assignTexture(materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture));
510
+ }
511
+
512
+ return Promise.all(pending);
513
+ }
514
+
451
515
  }
452
516
  /**
453
517
  * Transmission Materials Extension
@@ -531,7 +595,7 @@ class GLTFMaterialsVolumeExtension {
531
595
 
532
596
  materialParams.attenuationDistance = extension.attenuationDistance || 0;
533
597
  const colorArray = extension.attenuationColor || [1, 1, 1];
534
- materialParams.attenuationTint = new Color(colorArray[0], colorArray[1], colorArray[2]);
598
+ materialParams.attenuationColor = new Color(colorArray[0], colorArray[1], colorArray[2]);
535
599
  return Promise.all(pending);
536
600
  }
537
601
 
@@ -607,10 +671,10 @@ class GLTFMaterialsSpecularExtension {
607
671
  }
608
672
 
609
673
  const colorArray = extension.specularColorFactor || [1, 1, 1];
610
- materialParams.specularTint = new Color(colorArray[0], colorArray[1], colorArray[2]);
674
+ materialParams.specularColor = new Color(colorArray[0], colorArray[1], colorArray[2]);
611
675
 
612
676
  if (extension.specularColorTexture !== undefined) {
613
- pending.push(parser.assignTexture(materialParams, 'specularTintMap', extension.specularColorTexture).then(function (texture) {
677
+ pending.push(parser.assignTexture(materialParams, 'specularColorMap', extension.specularColorTexture).then(function (texture) {
614
678
  texture.encoding = sRGBEncoding;
615
679
  }));
616
680
  }
@@ -928,7 +992,7 @@ class GLTFTextureTransformExtension {
928
992
  /**
929
993
  * Specular-Glossiness Extension
930
994
  *
931
- * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness
995
+ * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness
932
996
  */
933
997
 
934
998
  /**
@@ -947,7 +1011,7 @@ class GLTFMeshStandardSGMaterial extends MeshStandardMaterial {
947
1011
  const glossinessMapParsFragmentChunk = ['#ifdef USE_GLOSSINESSMAP', ' uniform sampler2D glossinessMap;', '#endif'].join('\n');
948
1012
  const specularMapFragmentChunk = ['vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', ' vec4 texelSpecular = texture2D( specularMap, vUv );', ' texelSpecular = sRGBToLinear( texelSpecular );', ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', ' specularFactor *= texelSpecular.rgb;', '#endif'].join('\n');
949
1013
  const glossinessMapFragmentChunk = ['float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', ' glossinessFactor *= texelGlossiness.a;', '#endif'].join('\n');
950
- const lightPhysicalFragmentChunk = ['PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.specularRoughness += geometryRoughness;', 'material.specularRoughness = min( material.specularRoughness, 1.0 );', 'material.specularColor = specularFactor;'].join('\n');
1014
+ const lightPhysicalFragmentChunk = ['PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.roughness += geometryRoughness;', 'material.roughness = min( material.roughness, 1.0 );', 'material.specularColor = specularFactor;'].join('\n');
951
1015
  const uniforms = {
952
1016
  specular: {
953
1017
  value: new Color().setHex(0xffffff)
@@ -1196,6 +1260,19 @@ GLTFCubicSplineInterpolant.prototype.interpolate_ = function (i1, t0, t, t1) {
1196
1260
 
1197
1261
  return result;
1198
1262
  };
1263
+
1264
+ const _q = new Quaternion();
1265
+
1266
+ class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {
1267
+ interpolate_(i1, t0, t, t1) {
1268
+ const result = super.interpolate_(i1, t0, t, t1);
1269
+
1270
+ _q.fromArray(result).normalize().toArray(result);
1271
+
1272
+ return result;
1273
+ }
1274
+
1275
+ }
1199
1276
  /*********************************/
1200
1277
 
1201
1278
  /********** INTERNALS ************/
@@ -1284,30 +1361,10 @@ const ALPHA_MODES = {
1284
1361
  MASK: 'MASK',
1285
1362
  BLEND: 'BLEND'
1286
1363
  };
1287
- /* UTILITY FUNCTIONS */
1288
-
1289
- function resolveURL(url, path) {
1290
- // Invalid URL
1291
- if (typeof url !== 'string' || url === '') return ''; // Host Relative URL
1292
-
1293
- if (/^https?:\/\//i.test(path) && /^\//.test(url)) {
1294
- path = path.replace(/(^https?:\/\/[^\/]+).*/i, '$1');
1295
- } // Absolute URL http://,https://,//
1296
-
1297
-
1298
- if (/^(https?:)?\/\//i.test(url)) return url; // Data URI
1299
-
1300
- if (/^data:.*,.*$/i.test(url)) return url; // Blob URL
1301
-
1302
- if (/^blob:.*$/i.test(url)) return url; // Relative URL
1303
-
1304
- return path + url;
1305
- }
1306
1364
  /**
1307
1365
  * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material
1308
1366
  */
1309
1367
 
1310
-
1311
1368
  function createDefaultMaterial(cache) {
1312
1369
  if (cache['DefaultMaterial'] === undefined) {
1313
1370
  cache['DefaultMaterial'] = new MeshStandardMaterial({
@@ -1504,7 +1561,7 @@ class GLTFParser {
1504
1561
  this.nodeNamesUsed = {}; // Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the
1505
1562
  // expensive work of uploading a texture to the GPU off the main thread.
1506
1563
 
1507
- if (typeof createImageBitmap !== 'undefined' && /Firefox/.test(navigator.userAgent) === false) {
1564
+ if (typeof createImageBitmap !== 'undefined' && /Firefox|Safari/.test(navigator.userAgent) === false) {
1508
1565
  this.textureLoader = new ImageBitmapLoader(this.options.manager);
1509
1566
  } else {
1510
1567
  this.textureLoader = new TextureLoader(this.options.manager);
@@ -1627,7 +1684,22 @@ class GLTFParser {
1627
1684
 
1628
1685
  _getNodeRef(cache, index, object) {
1629
1686
  if (cache.refs[index] <= 1) return object;
1630
- const ref = object.clone();
1687
+ const ref = object.clone(); // Propagates mappings to the cloned object, prevents mappings on the
1688
+ // original object from being lost.
1689
+
1690
+ const updateMappings = (original, clone) => {
1691
+ const mappings = this.associations.get(original);
1692
+
1693
+ if (mappings != null) {
1694
+ this.associations.set(clone, mappings);
1695
+ }
1696
+
1697
+ for (const [i, child] of original.children.entries()) {
1698
+ updateMappings(child, clone.children[i]);
1699
+ }
1700
+ };
1701
+
1702
+ updateMappings(object, ref);
1631
1703
  ref.name += '_instance_' + cache.uses[index]++;
1632
1704
  return ref;
1633
1705
  }
@@ -1774,7 +1846,7 @@ class GLTFParser {
1774
1846
 
1775
1847
  const options = this.options;
1776
1848
  return new Promise(function (resolve, reject) {
1777
- loader.load(resolveURL(bufferDef.uri, options.path), resolve, undefined, function () {
1849
+ loader.load(LoaderUtils.resolveURL(bufferDef.uri, options.path), resolve, undefined, function () {
1778
1850
  reject(new Error('THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".'));
1779
1851
  });
1780
1852
  });
@@ -1927,24 +1999,10 @@ class GLTFParser {
1927
1999
  const URL = self.URL || self.webkitURL;
1928
2000
  let sourceURI = source.uri || '';
1929
2001
  let isObjectURL = false;
1930
- let hasAlpha = true;
1931
- const isJPEG = sourceURI.search(/\.jpe?g($|\?)/i) > 0 || sourceURI.search(/^data\:image\/jpeg/) === 0;
1932
- if (source.mimeType === 'image/jpeg' || isJPEG) hasAlpha = false;
1933
2002
 
1934
2003
  if (source.bufferView !== undefined) {
1935
2004
  // Load binary image data from bufferView, if provided.
1936
2005
  sourceURI = parser.getDependency('bufferView', source.bufferView).then(function (bufferView) {
1937
- if (source.mimeType === 'image/png') {
1938
- // Inspect the PNG 'IHDR' chunk to determine whether the image could have an
1939
- // alpha channel. This check is conservative — the image could have an alpha
1940
- // channel with all values == 1, and the indexed type (colorType == 3) only
1941
- // sometimes contains alpha.
1942
- //
1943
- // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header
1944
- const colorType = new DataView(bufferView, 25, 1).getUint8(0, false);
1945
- hasAlpha = colorType === 6 || colorType === 4 || colorType === 3;
1946
- }
1947
-
1948
2006
  isObjectURL = true;
1949
2007
  const blob = new Blob([bufferView], {
1950
2008
  type: source.mimeType
@@ -1968,7 +2026,7 @@ class GLTFParser {
1968
2026
  };
1969
2027
  }
1970
2028
 
1971
- loader.load(resolveURL(sourceURI, options.path), onLoad, undefined, reject);
2029
+ loader.load(LoaderUtils.resolveURL(sourceURI, options.path), onLoad, undefined, reject);
1972
2030
  });
1973
2031
  }).then(function (texture) {
1974
2032
  // Clean up resources and configure Texture.
@@ -1977,9 +2035,7 @@ class GLTFParser {
1977
2035
  }
1978
2036
 
1979
2037
  texture.flipY = false;
1980
- if (textureDef.name) texture.name = textureDef.name; // When there is definitely no alpha channel in the texture, set RGBFormat to save space.
1981
-
1982
- if (!hasAlpha) texture.format = RGBFormat;
2038
+ if (textureDef.name) texture.name = textureDef.name;
1983
2039
  const samplers = json.samplers || {};
1984
2040
  const sampler = samplers[textureDef.sampler] || {};
1985
2041
  texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || LinearFilter;
@@ -1987,8 +2043,7 @@ class GLTFParser {
1987
2043
  texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || RepeatWrapping;
1988
2044
  texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || RepeatWrapping;
1989
2045
  parser.associations.set(texture, {
1990
- type: 'textures',
1991
- index: textureIndex
2046
+ textures: textureIndex
1992
2047
  });
1993
2048
  return texture;
1994
2049
  }).catch(function () {
@@ -2043,7 +2098,7 @@ class GLTFParser {
2043
2098
  assignFinalMaterial(mesh) {
2044
2099
  const geometry = mesh.geometry;
2045
2100
  let material = mesh.material;
2046
- const useVertexTangents = geometry.attributes.tangent !== undefined;
2101
+ const useDerivativeTangents = geometry.attributes.tangent === undefined;
2047
2102
  const useVertexColors = geometry.attributes.color !== undefined;
2048
2103
  const useFlatShading = geometry.attributes.normal === undefined;
2049
2104
 
@@ -2077,10 +2132,10 @@ class GLTFParser {
2077
2132
  } // Clone the material if it will be modified
2078
2133
 
2079
2134
 
2080
- if (useVertexTangents || useVertexColors || useFlatShading) {
2135
+ if (useDerivativeTangents || useVertexColors || useFlatShading) {
2081
2136
  let cacheKey = 'ClonedMaterial:' + material.uuid + ':';
2082
2137
  if (material.isGLTFSpecularGlossinessMaterial) cacheKey += 'specular-glossiness:';
2083
- if (useVertexTangents) cacheKey += 'vertex-tangents:';
2138
+ if (useDerivativeTangents) cacheKey += 'derivative-tangents:';
2084
2139
  if (useVertexColors) cacheKey += 'vertex-colors:';
2085
2140
  if (useFlatShading) cacheKey += 'flat-shading:';
2086
2141
  let cachedMaterial = this.cache.get(cacheKey);
@@ -2090,7 +2145,7 @@ class GLTFParser {
2090
2145
  if (useVertexColors) cachedMaterial.vertexColors = true;
2091
2146
  if (useFlatShading) cachedMaterial.flatShading = true;
2092
2147
 
2093
- if (useVertexTangents) {
2148
+ if (useDerivativeTangents) {
2094
2149
  // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995
2095
2150
  if (cachedMaterial.normalScale) cachedMaterial.normalScale.y *= -1;
2096
2151
  if (cachedMaterial.clearcoatNormalScale) cachedMaterial.clearcoatNormalScale.y *= -1;
@@ -2111,9 +2166,7 @@ class GLTFParser {
2111
2166
  mesh.material = material;
2112
2167
  }
2113
2168
 
2114
- getMaterialType()
2115
- /* materialIndex */
2116
- {
2169
+ getMaterialType() {
2117
2170
  return MeshStandardMaterial;
2118
2171
  }
2119
2172
  /**
@@ -2185,6 +2238,7 @@ class GLTFParser {
2185
2238
 
2186
2239
  materialParams.depthWrite = false;
2187
2240
  } else {
2241
+ materialParams.format = RGBFormat;
2188
2242
  materialParams.transparent = false;
2189
2243
 
2190
2244
  if (alphaMode === ALPHA_MODES.MASK) {
@@ -2193,12 +2247,12 @@ class GLTFParser {
2193
2247
  }
2194
2248
 
2195
2249
  if (materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial) {
2196
- pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture)); // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995
2197
-
2198
- materialParams.normalScale = new Vector2(1, -1);
2250
+ pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture));
2251
+ materialParams.normalScale = new Vector2(1, 1);
2199
2252
 
2200
2253
  if (materialDef.normalTexture.scale !== undefined) {
2201
- materialParams.normalScale.set(materialDef.normalTexture.scale, -materialDef.normalTexture.scale);
2254
+ const scale = materialDef.normalTexture.scale;
2255
+ materialParams.normalScale.set(scale, scale);
2202
2256
  }
2203
2257
  }
2204
2258
 
@@ -2233,8 +2287,7 @@ class GLTFParser {
2233
2287
  if (material.emissiveMap) material.emissiveMap.encoding = sRGBEncoding;
2234
2288
  assignExtrasToUserData(material, materialDef);
2235
2289
  parser.associations.set(material, {
2236
- type: 'materials',
2237
- index: materialIndex
2290
+ materials: materialIndex
2238
2291
  });
2239
2292
  if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef);
2240
2293
  return material;
@@ -2379,11 +2432,21 @@ class GLTFParser {
2379
2432
  meshes.push(mesh);
2380
2433
  }
2381
2434
 
2435
+ for (let i = 0, il = meshes.length; i < il; i++) {
2436
+ parser.associations.set(meshes[i], {
2437
+ meshes: meshIndex,
2438
+ primitives: i
2439
+ });
2440
+ }
2441
+
2382
2442
  if (meshes.length === 1) {
2383
2443
  return meshes[0];
2384
2444
  }
2385
2445
 
2386
2446
  const group = new Group();
2447
+ parser.associations.set(group, {
2448
+ meshes: meshIndex
2449
+ });
2387
2450
 
2388
2451
  for (let i = 0, il = meshes.length; i < il; i++) {
2389
2452
  group.add(meshes[i]);
@@ -2512,9 +2575,8 @@ class GLTFParser {
2512
2575
  const targetNames = [];
2513
2576
 
2514
2577
  if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {
2515
- // Node may be a Group (glTF mesh with several primitives) or a Mesh.
2516
2578
  node.traverse(function (object) {
2517
- if (object.isMesh === true && object.morphTargetInfluences) {
2579
+ if (object.morphTargetInfluences) {
2518
2580
  targetNames.push(object.name ? object.name : object.uuid);
2519
2581
  }
2520
2582
  });
@@ -2543,7 +2605,8 @@ class GLTFParser {
2543
2605
  // A CUBICSPLINE keyframe in glTF has three output values for each input value,
2544
2606
  // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()
2545
2607
  // must be divided by three to get the interpolant's sampleSize argument.
2546
- return new GLTFCubicSplineInterpolant(this.times, this.values, this.getValueSize() / 3, result);
2608
+ const interpolantType = this instanceof QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
2609
+ return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);
2547
2610
  }; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.
2548
2611
 
2549
2612
 
@@ -2664,10 +2727,11 @@ class GLTFParser {
2664
2727
  }
2665
2728
  }
2666
2729
 
2667
- parser.associations.set(node, {
2668
- type: 'nodes',
2669
- index: nodeIndex
2670
- });
2730
+ if (!parser.associations.has(node)) {
2731
+ parser.associations.set(node, {});
2732
+ }
2733
+
2734
+ parser.associations.get(node).nodes = nodeIndex;
2671
2735
  return node;
2672
2736
  });
2673
2737
  }
@@ -2693,17 +2757,39 @@ class GLTFParser {
2693
2757
  const pending = [];
2694
2758
 
2695
2759
  for (let i = 0, il = nodeIds.length; i < il; i++) {
2696
- pending.push(buildNodeHierachy(nodeIds[i], scene, json, parser));
2760
+ pending.push(buildNodeHierarchy(nodeIds[i], scene, json, parser));
2697
2761
  }
2698
2762
 
2699
2763
  return Promise.all(pending).then(function () {
2764
+ // Removes dangling associations, associations that reference a node that
2765
+ // didn't make it into the scene.
2766
+ const reduceAssociations = node => {
2767
+ const reducedAssociations = new Map();
2768
+
2769
+ for (const [key, value] of parser.associations) {
2770
+ if (key instanceof Material || key instanceof Texture) {
2771
+ reducedAssociations.set(key, value);
2772
+ }
2773
+ }
2774
+
2775
+ node.traverse(node => {
2776
+ const mappings = parser.associations.get(node);
2777
+
2778
+ if (mappings != null) {
2779
+ reducedAssociations.set(node, mappings);
2780
+ }
2781
+ });
2782
+ return reducedAssociations;
2783
+ };
2784
+
2785
+ parser.associations = reduceAssociations(scene);
2700
2786
  return scene;
2701
2787
  });
2702
2788
  }
2703
2789
 
2704
2790
  }
2705
2791
 
2706
- function buildNodeHierachy(nodeId, parentObject, json, parser) {
2792
+ function buildNodeHierarchy(nodeId, parentObject, json, parser) {
2707
2793
  const nodeDef = json.nodes[nodeId];
2708
2794
  return parser.getDependency('node', nodeId).then(function (node) {
2709
2795
  if (nodeDef.skin === undefined) return node; // build skeleton here as well
@@ -2755,7 +2841,7 @@ function buildNodeHierachy(nodeId, parentObject, json, parser) {
2755
2841
 
2756
2842
  for (let i = 0, il = children.length; i < il; i++) {
2757
2843
  const child = children[i];
2758
- pending.push(buildNodeHierachy(child, node, json, parser));
2844
+ pending.push(buildNodeHierarchy(child, node, json, parser));
2759
2845
  }
2760
2846
  }
2761
2847
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),t=require("./RGBELoader.cjs.js");class a extends e.Loader{constructor(e){super(e),this.hdrLoader=new t.RGBELoader,this.type=UnsignedByteType}load(t,a,r,i){Array.isArray(t)||(console.warn("THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead."),this.setDataType(t),t=a,a=r,r=i,i=arguments[4]);const s=new e.CubeTexture;switch(s.type=this.type,s.type){case e.FloatType:case e.HalfFloatType:s.encoding=e.LinearEncoding,s.format=e.RGBFormat,s.minFilter=e.LinearFilter,s.magFilter=e.LinearFilter,s.generateMipmaps=!1}const n=this;let o=0;function d(a,r,i,d){new e.FileLoader(n.manager).setPath(n.path).setResponseType("arraybuffer").setWithCredentials(n.withCredentials).load(t[a],(function(t){o++;const i=n.hdrLoader.parse(t);if(i){if(void 0!==i.data){const t=new e.DataTexture(i.data,i.width,i.height);t.type=s.type,t.encoding=s.encoding,t.format=s.format,t.minFilter=s.minFilter,t.magFilter=s.magFilter,t.generateMipmaps=s.generateMipmaps,s.images[a]=t}6===o&&(s.needsUpdate=!0,r&&r(s))}}),i,d)}for(let e=0;e<t.length;e++)d(e,a,r,i);return s}setDataType(e){return this.type=e,this.hdrLoader.setDataType(e),this}}exports.HDRCubeTextureLoader=a;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),t=require("./RGBELoader.cjs.js");class a extends e.Loader{constructor(a){super(a),this.hdrLoader=new t.RGBELoader,this.type=e.HalfFloatType}load(t,a,r,i){Array.isArray(t)||(console.warn("THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead."),this.setDataType(t),t=a,a=r,r=i,i=arguments[4]);const s=new e.CubeTexture;switch(s.type=this.type,s.type){case e.FloatType:case e.HalfFloatType:s.encoding=e.LinearEncoding,s.format=e.RGBFormat,s.minFilter=e.LinearFilter,s.magFilter=e.LinearFilter,s.generateMipmaps=!1}const n=this;let o=0;function d(a,r,i,d){new e.FileLoader(n.manager).setPath(n.path).setResponseType("arraybuffer").setWithCredentials(n.withCredentials).load(t[a],(function(t){o++;const i=n.hdrLoader.parse(t);if(i){if(void 0!==i.data){const t=new e.DataTexture(i.data,i.width,i.height);t.type=s.type,t.encoding=s.encoding,t.format=s.format,t.minFilter=s.minFilter,t.magFilter=s.magFilter,t.generateMipmaps=s.generateMipmaps,s.images[a]=t}6===o&&(s.needsUpdate=!0,r&&r(s))}}),i,d)}for(let e=0;e<t.length;e++)d(e,a,r,i);return s}setDataType(e){return this.type=e,this.hdrLoader.setDataType(e),this}}exports.HDRCubeTextureLoader=a;
@@ -1,11 +1,11 @@
1
- import { Loader, CubeTexture, HalfFloatType, LinearEncoding, RGBFormat, LinearFilter, FloatType, FileLoader, DataTexture } from 'three';
1
+ import { Loader, HalfFloatType, CubeTexture, LinearEncoding, RGBFormat, LinearFilter, FloatType, FileLoader, DataTexture } from 'three';
2
2
  import { RGBELoader } from './RGBELoader.js';
3
3
 
4
4
  class HDRCubeTextureLoader extends Loader {
5
5
  constructor(manager) {
6
6
  super(manager);
7
7
  this.hdrLoader = new RGBELoader();
8
- this.type = UnsignedByteType;
8
+ this.type = HalfFloatType;
9
9
  }
10
10
 
11
11
  load(urls, onLoad, onProgress, onError) {
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),s=require("../Nodes-ec4e1143.js");require("../nodes/core/Node.cjs.js"),require("../nodes/core/TempNode.cjs.js"),require("../nodes/core/InputNode.cjs.js"),require("../nodes/core/ConstNode.cjs.js"),require("../nodes/core/VarNode.cjs.js"),require("../nodes/core/StructNode.cjs.js"),require("../nodes/core/AttributeNode.cjs.js"),require("../nodes/core/FunctionNode.cjs.js"),require("../nodes/core/NodeLib.cjs.js"),require("../nodes/core/ExpressionNode.cjs.js"),require("../nodes/core/FunctionCallNode.cjs.js"),require("../nodes/core/NodeUtils.cjs.js"),require("../nodes/core/NodeFrame.cjs.js"),require("../nodes/core/NodeUniform.cjs.js"),require("../nodes/core/NodeBuilder.cjs.js"),require("../nodes/inputs/Vector2Node.cjs.js"),require("../nodes/inputs/Vector3Node.cjs.js"),require("../nodes/inputs/Vector4Node.cjs.js"),require("../nodes/inputs/TextureNode.cjs.js"),require("../nodes/accessors/UVNode.cjs.js"),require("../nodes/utils/ColorSpaceNode.cjs.js"),require("../nodes/inputs/CubeTextureNode.cjs.js"),require("../nodes/accessors/ReflectNode.cjs.js"),require("../nodes/accessors/PositionNode.cjs.js"),require("../nodes/accessors/NormalNode.cjs.js"),require("../nodes/misc/TextureCubeNode.cjs.js"),require("../nodes/inputs/FloatNode.cjs.js"),require("../nodes/misc/TextureCubeUVNode.cjs.js"),require("../nodes/math/OperatorNode.cjs.js"),require("../nodes/math/MathNode.cjs.js"),require("../nodes/inputs/BoolNode.cjs.js"),require("../nodes/inputs/IntNode.cjs.js"),require("../nodes/inputs/ColorNode.cjs.js"),require("../nodes/inputs/Matrix3Node.cjs.js"),require("../nodes/inputs/Matrix4Node.cjs.js"),require("../nodes/inputs/ScreenNode.cjs.js"),require("../nodes/inputs/ReflectorNode.cjs.js"),require("../nodes/inputs/PropertyNode.cjs.js"),require("../nodes/inputs/RTTNode.cjs.js"),require("../nodes/materials/NodeMaterial.cjs.js"),require("../nodes/materials/nodes/RawNode.cjs.js"),require("../nodes/accessors/ColorsNode.cjs.js"),require("../nodes/accessors/CameraNode.cjs.js"),require("../nodes/accessors/LightNode.cjs.js"),require("../nodes/accessors/ScreenUVNode.cjs.js"),require("../nodes/accessors/ResolutionNode.cjs.js"),require("../nodes/math/CondNode.cjs.js"),require("../nodes/procedural/NoiseNode.cjs.js"),require("../nodes/procedural/CheckerNode.cjs.js"),require("../nodes/misc/NormalMapNode.cjs.js"),require("../nodes/misc/BumpMapNode.cjs.js"),require("../nodes/utils/BypassNode.cjs.js"),require("../nodes/utils/JoinNode.cjs.js"),require("../nodes/utils/SwitchNode.cjs.js"),require("../nodes/utils/TimerNode.cjs.js"),require("../nodes/utils/VelocityNode.cjs.js"),require("../nodes/utils/UVTransformNode.cjs.js"),require("../nodes/utils/MaxMIPLevelNode.cjs.js"),require("../nodes/utils/SpecularMIPLevelNode.cjs.js"),require("../nodes/utils/SubSlotNode.cjs.js"),require("../nodes/effects/BlurNode.cjs.js"),require("../nodes/effects/ColorAdjustmentNode.cjs.js"),require("../nodes/effects/LuminanceNode.cjs.js"),require("../nodes/materials/nodes/BasicNode.cjs.js"),require("../nodes/materials/nodes/SpriteNode.cjs.js"),require("../nodes/materials/nodes/PhongNode.cjs.js"),require("../nodes/materials/nodes/StandardNode.cjs.js"),require("../nodes/materials/nodes/MeshStandardNode.cjs.js"),require("../nodes/materials/BasicNodeMaterial.cjs.js"),require("../nodes/materials/SpriteNodeMaterial.cjs.js"),require("../nodes/materials/PhongNodeMaterial.cjs.js"),require("../nodes/materials/StandardNodeMaterial.cjs.js"),require("../nodes/materials/MeshStandardNodeMaterial.cjs.js"),require("../nodes/postprocessing/NodePostProcessing.cjs.js");class r extends e.Loader{constructor(e,s={}){super(e),this.nodes={},this.materials={},this.passes={},this.names={},this.library=s}load(s,r,o,i){const t=this,d=new e.FileLoader(t.manager);return d.setPath(t.path),d.load(s,(function(e){r(t.parse(JSON.parse(e)))}),o,i),this}getObjectByName(e){return this.names[e]}getObjectById(e){return this.library[e]||this.nodes[e]||this.materials[e]||this.passes[e]||this.names[e]}getNode(e){const s=this.getObjectById(e);return s||console.warn('Node "'+e+'" not found.'),s}resolve(e){switch(typeof e){case"boolean":case"number":return e;case"string":return/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/i.test(e)||this.library[e]?this.getNode(e):e;default:if(Array.isArray(e))for(let s=0;s<e.length;s++)e[s]=this.resolve(e[s]);else for(const s in e)"uuid"!==s&&(e[s]=this.resolve(e[s]))}return e}declare(e){let r,o,i;for(r in e.nodes)o=e.nodes[r],i=new s.Nodes[o.nodeType+"Node"],o.name&&(i.name=o.name,this.names[i.name]=i),this.nodes[r]=i;for(r in e.materials)o=e.materials[r],i=new s.Nodes[o.type],o.name&&(i.name=o.name,this.names[i.name]=i),this.materials[r]=i;for(r in e.passes)o=e.passes[r],i=new s.Nodes[o.type],o.name&&(i.name=o.name,this.names[i.name]=i),this.passes[r]=i;return e.material&&(this.material=this.materials[e.material]),e.pass&&(this.pass=this.passes[e.pass]),e}parse(e){let s;for(s in(e=this.resolve(this.declare(e))).nodes)this.nodes[s].copy(e.nodes[s]);for(s in e.materials)this.materials[s].copy(e.materials[s]);for(s in e.passes)this.passes[s].copy(e.passes[s]);return this.material||this.pass||this}}exports.NodeMaterialLoader=r,exports.NodeMaterialLoaderUtils=class{static replaceUUIDObject(e,s,r,o){if(o=void 0===o||o,"object"==typeof s&&(s=s.uuid),"object"==typeof e){const i=Object.keys(e);for(let t=0;t<i.length;t++){const d=i[t];o&&(e[d]=this.replaceUUIDObject(e[d],s,r)),d===s&&(e[s]=e[d],delete e[d])}}return e===s?r:e}static replaceUUID(e,s,r){return this.replaceUUIDObject(e,s,r,!1),this.replaceUUIDObject(e.nodes,s,r),this.replaceUUIDObject(e.materials,s,r),this.replaceUUIDObject(e.passes,s,r),this.replaceUUIDObject(e.library,s,r,!1),e}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),s=require("../Nodes-894ac9dc.js");require("../nodes/core/Node.cjs.js"),require("../nodes/core/TempNode.cjs.js"),require("../nodes/core/InputNode.cjs.js"),require("../nodes/core/ConstNode.cjs.js"),require("../nodes/core/VarNode.cjs.js"),require("../nodes/core/StructNode.cjs.js"),require("../nodes/core/AttributeNode.cjs.js"),require("../nodes/core/FunctionNode.cjs.js"),require("../nodes/core/NodeLib.cjs.js"),require("../nodes/core/ExpressionNode.cjs.js"),require("../nodes/core/FunctionCallNode.cjs.js"),require("../nodes/core/NodeUtils.cjs.js"),require("../nodes/core/NodeFrame.cjs.js"),require("../nodes/core/NodeUniform.cjs.js"),require("../nodes/core/NodeBuilder.cjs.js"),require("../nodes/inputs/Vector2Node.cjs.js"),require("../nodes/inputs/Vector3Node.cjs.js"),require("../nodes/inputs/Vector4Node.cjs.js"),require("../nodes/inputs/TextureNode.cjs.js"),require("../nodes/accessors/UVNode.cjs.js"),require("../nodes/utils/ColorSpaceNode.cjs.js"),require("../nodes/inputs/CubeTextureNode.cjs.js"),require("../nodes/accessors/ReflectNode.cjs.js"),require("../nodes/accessors/PositionNode.cjs.js"),require("../nodes/accessors/NormalNode.cjs.js"),require("../nodes/misc/TextureCubeNode.cjs.js"),require("../nodes/inputs/FloatNode.cjs.js"),require("../nodes/misc/TextureCubeUVNode.cjs.js"),require("../nodes/math/OperatorNode.cjs.js"),require("../nodes/math/MathNode.cjs.js"),require("../nodes/inputs/BoolNode.cjs.js"),require("../nodes/inputs/IntNode.cjs.js"),require("../nodes/inputs/ColorNode.cjs.js"),require("../nodes/inputs/Matrix3Node.cjs.js"),require("../nodes/inputs/Matrix4Node.cjs.js"),require("../nodes/inputs/ScreenNode.cjs.js"),require("../nodes/inputs/ReflectorNode.cjs.js"),require("../nodes/inputs/PropertyNode.cjs.js"),require("../nodes/inputs/RTTNode.cjs.js"),require("../nodes/materials/NodeMaterial.cjs.js"),require("../nodes/materials/nodes/RawNode.cjs.js"),require("../nodes/accessors/ColorsNode.cjs.js"),require("../nodes/accessors/CameraNode.cjs.js"),require("../nodes/accessors/LightNode.cjs.js"),require("../nodes/accessors/ScreenUVNode.cjs.js"),require("../nodes/accessors/ResolutionNode.cjs.js"),require("../nodes/math/CondNode.cjs.js"),require("../nodes/procedural/NoiseNode.cjs.js"),require("../nodes/procedural/CheckerNode.cjs.js"),require("../nodes/misc/NormalMapNode.cjs.js"),require("../nodes/misc/BumpMapNode.cjs.js"),require("../nodes/utils/BypassNode.cjs.js"),require("../nodes/utils/JoinNode.cjs.js"),require("../nodes/utils/SwitchNode.cjs.js"),require("../nodes/utils/TimerNode.cjs.js"),require("../nodes/utils/VelocityNode.cjs.js"),require("../nodes/utils/UVTransformNode.cjs.js"),require("../nodes/utils/MaxMIPLevelNode.cjs.js"),require("../nodes/utils/SpecularMIPLevelNode.cjs.js"),require("../nodes/utils/SubSlotNode.cjs.js"),require("../nodes/effects/BlurNode.cjs.js"),require("../nodes/effects/ColorAdjustmentNode.cjs.js"),require("../nodes/effects/LuminanceNode.cjs.js"),require("../nodes/materials/nodes/BasicNode.cjs.js"),require("../nodes/materials/nodes/SpriteNode.cjs.js"),require("../nodes/materials/nodes/PhongNode.cjs.js"),require("../nodes/materials/nodes/StandardNode.cjs.js"),require("../nodes/materials/nodes/MeshStandardNode.cjs.js"),require("../nodes/materials/BasicNodeMaterial.cjs.js"),require("../nodes/materials/SpriteNodeMaterial.cjs.js"),require("../nodes/materials/PhongNodeMaterial.cjs.js"),require("../nodes/materials/StandardNodeMaterial.cjs.js"),require("../nodes/materials/MeshStandardNodeMaterial.cjs.js"),require("../nodes/postprocessing/NodePostProcessing.cjs.js");class r extends e.Loader{constructor(e,s={}){super(e),this.nodes={},this.materials={},this.passes={},this.names={},this.library=s}load(s,r,o,i){const t=this,d=new e.FileLoader(t.manager);return d.setPath(t.path),d.load(s,(function(e){r(t.parse(JSON.parse(e)))}),o,i),this}getObjectByName(e){return this.names[e]}getObjectById(e){return this.library[e]||this.nodes[e]||this.materials[e]||this.passes[e]||this.names[e]}getNode(e){const s=this.getObjectById(e);return s||console.warn('Node "'+e+'" not found.'),s}resolve(e){switch(typeof e){case"boolean":case"number":return e;case"string":return/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/i.test(e)||this.library[e]?this.getNode(e):e;default:if(Array.isArray(e))for(let s=0;s<e.length;s++)e[s]=this.resolve(e[s]);else for(const s in e)"uuid"!==s&&(e[s]=this.resolve(e[s]))}return e}declare(e){let r,o,i;for(r in e.nodes)o=e.nodes[r],i=new s.Nodes[o.nodeType+"Node"],o.name&&(i.name=o.name,this.names[i.name]=i),this.nodes[r]=i;for(r in e.materials)o=e.materials[r],i=new s.Nodes[o.type],o.name&&(i.name=o.name,this.names[i.name]=i),this.materials[r]=i;for(r in e.passes)o=e.passes[r],i=new s.Nodes[o.type],o.name&&(i.name=o.name,this.names[i.name]=i),this.passes[r]=i;return e.material&&(this.material=this.materials[e.material]),e.pass&&(this.pass=this.passes[e.pass]),e}parse(e){let s;for(s in(e=this.resolve(this.declare(e))).nodes)this.nodes[s].copy(e.nodes[s]);for(s in e.materials)this.materials[s].copy(e.materials[s]);for(s in e.passes)this.passes[s].copy(e.passes[s]);return this.material||this.pass||this}}exports.NodeMaterialLoader=r,exports.NodeMaterialLoaderUtils=class{static replaceUUIDObject(e,s,r,o){if(o=void 0===o||o,"object"==typeof s&&(s=s.uuid),"object"==typeof e){const i=Object.keys(e);for(let t=0;t<i.length;t++){const d=i[t];o&&(e[d]=this.replaceUUIDObject(e[d],s,r)),d===s&&(e[s]=e[d],delete e[d])}}return e===s?r:e}static replaceUUID(e,s,r){return this.replaceUUIDObject(e,s,r,!1),this.replaceUUIDObject(e.nodes,s,r),this.replaceUUIDObject(e.materials,s,r),this.replaceUUIDObject(e.passes,s,r),this.replaceUUIDObject(e.library,s,r,!1),e}};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");class t extends e.DataTextureLoader{constructor(e){super(e),this.type=UnsignedByteType}parse(t){const r=function(e,t){switch(e){case 1:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(t||""))}return-1},a=function(e,t,r){t=t||1024;let a=e.pos,n=-1,o=0,s="",i=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));for(;0>(n=i.indexOf("\n"))&&o<t&&a<e.byteLength;)s+=i,o+=i.length,a+=128,i+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));return-1<n&&(!1!==r&&(e.pos+=o+n+1),s+i.slice(0,n))},n=function(e,t,r,a){const n=e[t+3],o=Math.pow(2,n-128)/255;r[a+0]=e[t+0]*o,r[a+1]=e[t+1]*o,r[a+2]=e[t+2]*o},o=function(t,r,a,n){const o=t[r+3],s=Math.pow(2,o-128)/255;a[n+0]=e.DataUtils.toHalfFloat(t[r+0]*s),a[n+1]=e.DataUtils.toHalfFloat(t[r+1]*s),a[n+2]=e.DataUtils.toHalfFloat(t[r+2]*s)},s=new Uint8Array(t);s.pos=0;const i=function(e){const t=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,n=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,o=/^\s*FORMAT=(\S+)\s*$/,s=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,i={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let l,c;if(e.pos>=e.byteLength||!(l=a(e)))return r(1,"no header found");if(!(c=l.match(/^#\?(\S+)/)))return r(3,"bad initial token");for(i.valid|=1,i.programtype=c[1],i.string+=l+"\n";l=a(e),!1!==l;)if(i.string+=l+"\n","#"!==l.charAt(0)){if((c=l.match(t))&&(i.gamma=parseFloat(c[1],10)),(c=l.match(n))&&(i.exposure=parseFloat(c[1],10)),(c=l.match(o))&&(i.valid|=2,i.format=c[1]),(c=l.match(s))&&(i.valid|=4,i.height=parseInt(c[1],10),i.width=parseInt(c[2],10)),2&i.valid&&4&i.valid)break}else i.comments+=l+"\n";return 2&i.valid?4&i.valid?i:r(3,"missing image size specifier"):r(3,"missing format specifier")}(s);if(-1!==i){const t=i.width,a=i.height,l=function(e,t,a){const n=t;if(n<8||n>32767||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(n!==(e[2]<<8|e[3]))return r(3,"wrong scanline width");const o=new Uint8Array(4*t*a);if(!o.length)return r(4,"unable to allocate buffer space");let s=0,i=0;const l=4*n,c=new Uint8Array(4),p=new Uint8Array(l);let f=a;for(;f>0&&i<e.byteLength;){if(i+4>e.byteLength)return r(1);if(c[0]=e[i++],c[1]=e[i++],c[2]=e[i++],c[3]=e[i++],2!=c[0]||2!=c[1]||(c[2]<<8|c[3])!=n)return r(3,"bad rgbe scanline format");let t,a=0;for(;a<l&&i<e.byteLength;){t=e[i++];const n=t>128;if(n&&(t-=128),0===t||a+t>l)return r(3,"bad scanline data");if(n){const r=e[i++];for(let e=0;e<t;e++)p[a++]=r}else p.set(e.subarray(i,i+t),a),a+=t,i+=t}const d=n;for(let e=0;e<d;e++){let t=0;o[s]=p[e+t],t+=n,o[s+1]=p[e+t],t+=n,o[s+2]=p[e+t],t+=n,o[s+3]=p[e+t],s+=4}f--}return o}(s.subarray(s.pos),t,a);if(-1!==l){let r,s,c,p;switch(this.type){case e.FloatType:p=l.length/4*3;const t=new Float32Array(p);for(let e=0;e<p;e++)n(l,4*e,t,3*e);r=t,s=e.RGBFormat,c=e.FloatType;break;case e.HalfFloatType:p=l.length/4*3;const a=new Uint16Array(p);for(let e=0;e<p;e++)o(l,4*e,a,3*e);r=a,s=e.RGBFormat,c=e.HalfFloatType;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type)}return{width:t,height:a,data:r,header:i.string,gamma:i.gamma,exposure:i.exposure,format:s,type:c}}}return null}setDataType(e){return this.type=e,this}load(t,r,a,n){return super.load(t,(function(t,a){switch(t.type){case e.FloatType:case e.HalfFloatType:t.encoding=e.LinearEncoding,t.minFilter=e.LinearFilter,t.magFilter=e.LinearFilter,t.generateMipmaps=!1,t.flipY=!0}r&&r(t,a)}),a,n)}}exports.RGBELoader=t;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");class t extends e.DataTextureLoader{constructor(t){super(t),this.type=e.HalfFloatType}parse(t){const r=function(e,t){switch(e){case 1:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(t||""))}return-1},a=function(e,t,r){t=t||1024;let a=e.pos,n=-1,o=0,s="",i=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));for(;0>(n=i.indexOf("\n"))&&o<t&&a<e.byteLength;)s+=i,o+=i.length,a+=128,i+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));return-1<n&&(!1!==r&&(e.pos+=o+n+1),s+i.slice(0,n))},n=function(e,t,r,a){const n=e[t+3],o=Math.pow(2,n-128)/255;r[a+0]=e[t+0]*o,r[a+1]=e[t+1]*o,r[a+2]=e[t+2]*o},o=function(t,r,a,n){const o=t[r+3],s=Math.pow(2,o-128)/255;a[n+0]=e.DataUtils.toHalfFloat(Math.min(t[r+0]*s,65504)),a[n+1]=e.DataUtils.toHalfFloat(Math.min(t[r+1]*s,65504)),a[n+2]=e.DataUtils.toHalfFloat(Math.min(t[r+2]*s,65504))},s=new Uint8Array(t);s.pos=0;const i=function(e){const t=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,n=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,o=/^\s*FORMAT=(\S+)\s*$/,s=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,i={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let l,c;if(e.pos>=e.byteLength||!(l=a(e)))return r(1,"no header found");if(!(c=l.match(/^#\?(\S+)/)))return r(3,"bad initial token");for(i.valid|=1,i.programtype=c[1],i.string+=l+"\n";l=a(e),!1!==l;)if(i.string+=l+"\n","#"!==l.charAt(0)){if((c=l.match(t))&&(i.gamma=parseFloat(c[1],10)),(c=l.match(n))&&(i.exposure=parseFloat(c[1],10)),(c=l.match(o))&&(i.valid|=2,i.format=c[1]),(c=l.match(s))&&(i.valid|=4,i.height=parseInt(c[1],10),i.width=parseInt(c[2],10)),2&i.valid&&4&i.valid)break}else i.comments+=l+"\n";return 2&i.valid?4&i.valid?i:r(3,"missing image size specifier"):r(3,"missing format specifier")}(s);if(-1!==i){const t=i.width,a=i.height,l=function(e,t,a){const n=t;if(n<8||n>32767||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(n!==(e[2]<<8|e[3]))return r(3,"wrong scanline width");const o=new Uint8Array(4*t*a);if(!o.length)return r(4,"unable to allocate buffer space");let s=0,i=0;const l=4*n,c=new Uint8Array(4),f=new Uint8Array(l);let p=a;for(;p>0&&i<e.byteLength;){if(i+4>e.byteLength)return r(1);if(c[0]=e[i++],c[1]=e[i++],c[2]=e[i++],c[3]=e[i++],2!=c[0]||2!=c[1]||(c[2]<<8|c[3])!=n)return r(3,"bad rgbe scanline format");let t,a=0;for(;a<l&&i<e.byteLength;){t=e[i++];const n=t>128;if(n&&(t-=128),0===t||a+t>l)return r(3,"bad scanline data");if(n){const r=e[i++];for(let e=0;e<t;e++)f[a++]=r}else f.set(e.subarray(i,i+t),a),a+=t,i+=t}const d=n;for(let e=0;e<d;e++){let t=0;o[s]=f[e+t],t+=n,o[s+1]=f[e+t],t+=n,o[s+2]=f[e+t],t+=n,o[s+3]=f[e+t],s+=4}p--}return o}(s.subarray(s.pos),t,a);if(-1!==l){let r,s,c,f;switch(this.type){case e.FloatType:f=l.length/4;const t=new Float32Array(3*f);for(let e=0;e<f;e++)n(l,4*e,t,3*e);r=t,s=e.RGBFormat,c=e.FloatType;break;case e.HalfFloatType:f=l.length/4;const a=new Uint16Array(3*f);for(let e=0;e<f;e++)o(l,4*e,a,3*e);r=a,s=e.RGBFormat,c=e.HalfFloatType;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type)}return{width:t,height:a,data:r,header:i.string,gamma:i.gamma,exposure:i.exposure,format:s,type:c}}}return null}setDataType(e){return this.type=e,this}load(t,r,a,n){return super.load(t,(function(t,a){switch(t.type){case e.FloatType:case e.HalfFloatType:t.encoding=e.LinearEncoding,t.minFilter=e.LinearFilter,t.magFilter=e.LinearFilter,t.generateMipmaps=!1,t.flipY=!0}r&&r(t,a)}),a,n)}}exports.RGBELoader=t;
@@ -5,7 +5,7 @@ import { DataTextureLoader, HalfFloatType, FloatType, DataUtils, RGBFormat, Line
5
5
  class RGBELoader extends DataTextureLoader {
6
6
  constructor(manager) {
7
7
  super(manager);
8
- this.type = UnsignedByteType;
8
+ this.type = HalfFloatType;
9
9
  } // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html
10
10
 
11
11
 
@@ -285,10 +285,11 @@ class RGBELoader extends DataTextureLoader {
285
285
 
286
286
  const RGBEByteToRGBHalf = function (sourceArray, sourceOffset, destArray, destOffset) {
287
287
  const e = sourceArray[sourceOffset + 3];
288
- const scale = Math.pow(2.0, e - 128.0) / 255.0;
289
- destArray[destOffset + 0] = DataUtils.toHalfFloat(sourceArray[sourceOffset + 0] * scale);
290
- destArray[destOffset + 1] = DataUtils.toHalfFloat(sourceArray[sourceOffset + 1] * scale);
291
- destArray[destOffset + 2] = DataUtils.toHalfFloat(sourceArray[sourceOffset + 2] * scale);
288
+ const scale = Math.pow(2.0, e - 128.0) / 255.0; // clamping to 65504, the maximum representable value in float16
289
+
290
+ destArray[destOffset + 0] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504));
291
+ destArray[destOffset + 1] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504));
292
+ destArray[destOffset + 2] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504));
292
293
  };
293
294
 
294
295
  const byteArray = new Uint8Array(buffer);
@@ -306,8 +307,8 @@ class RGBELoader extends DataTextureLoader {
306
307
 
307
308
  switch (this.type) {
308
309
  case FloatType:
309
- numElements = image_rgba_data.length / 4 * 3;
310
- const floatArray = new Float32Array(numElements);
310
+ numElements = image_rgba_data.length / 4;
311
+ const floatArray = new Float32Array(numElements * 3);
311
312
 
312
313
  for (let j = 0; j < numElements; j++) {
313
314
  RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 3);
@@ -319,8 +320,8 @@ class RGBELoader extends DataTextureLoader {
319
320
  break;
320
321
 
321
322
  case HalfFloatType:
322
- numElements = image_rgba_data.length / 4 * 3;
323
- const halfArray = new Uint16Array(numElements);
323
+ numElements = image_rgba_data.length / 4;
324
+ const halfArray = new Uint16Array(numElements * 3);
324
325
 
325
326
  for (let j = 0; j < numElements; j++) {
326
327
  RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 3);