three-stdlib 2.6.3 → 2.7.2

Sign up to get free protection for your applications and to get access to all the features.
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);