three-stdlib 2.6.0 → 2.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{Nodes-acab3ca5.js → Nodes-427f68b0.js} +0 -0
- package/{Nodes-244507d0.js → Nodes-ec4e1143.js} +0 -0
- package/controls/TrackballControls.cjs.js +1 -1
- package/controls/TrackballControls.js +19 -6
- package/index.cjs.js +1 -1
- package/index.js +1 -1
- package/loaders/AMFLoader.js +1 -3
- package/loaders/ColladaLoader.cjs.js +1 -1
- package/loaders/ColladaLoader.js +58 -35
- package/loaders/EXRLoader.cjs.js +1 -1
- package/loaders/EXRLoader.js +197 -262
- package/loaders/FBXLoader.cjs.js +1 -1
- package/loaders/FBXLoader.js +41 -90
- package/loaders/GLTFLoader.cjs.js +1 -1
- package/loaders/GLTFLoader.js +160 -72
- package/loaders/HDRCubeTextureLoader.cjs.js +1 -1
- package/loaders/HDRCubeTextureLoader.js +2 -10
- package/loaders/NodeMaterialLoader.cjs.js +1 -1
- package/loaders/RGBELoader.cjs.js +1 -1
- package/loaders/RGBELoader.js +11 -25
- package/loaders/RGBMLoader.cjs.js +1 -1
- package/loaders/RGBMLoader.js +225 -263
- package/loaders/SVGLoader.cjs.js +1 -1
- package/loaders/SVGLoader.js +46 -30
- package/loaders/VRMLLoader.cjs.js +1 -1
- package/loaders/VRMLLoader.js +2 -1
- package/misc/WebGL.cjs.js +1 -1
- package/misc/WebGL.d.ts +5 -7
- package/misc/WebGL.js +67 -54
- package/nodes/core/NodeBuilder.cjs.js +1 -1
- package/nodes/core/NodeBuilder.js +2 -2
- package/nodes/inputs/CubeTextureNode.cjs.js +1 -1
- package/nodes/inputs/RTTNode.cjs.js +1 -1
- package/nodes/inputs/ReflectorNode.cjs.js +1 -1
- package/nodes/inputs/ScreenNode.cjs.js +1 -1
- package/nodes/inputs/TextureNode.cjs.js +1 -1
- package/nodes/materials/BasicNodeMaterial.cjs.js +1 -1
- package/nodes/materials/NodeMaterial.cjs.js +1 -1
- package/nodes/materials/SpriteNodeMaterial.cjs.js +1 -1
- package/nodes/postprocessing/NodePass.cjs.js +1 -1
- package/nodes/postprocessing/NodePostProcessing.cjs.js +1 -1
- package/nodes/utils/ColorSpaceNode.cjs.js +1 -1
- package/nodes/utils/ColorSpaceNode.js +2 -45
- package/package.json +1 -1
- package/shaders/GammaCorrectionShader.js +1 -2
package/loaders/GLTFLoader.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Loader, LoaderUtils, FileLoader, Color, SpotLight, PointLight, DirectionalLight, MeshBasicMaterial, MeshPhysicalMaterial, Vector2, sRGBEncoding, TangentSpaceNormalMap, ImageBitmapLoader, TextureLoader, InterleavedBuffer, InterleavedBufferAttribute, BufferAttribute,
|
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;
|
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.
|
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.
|
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, '
|
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/
|
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.
|
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;
|
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
|
-
|
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
|
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 (
|
2135
|
+
if (useDerivativeTangents || useVertexColors || useFlatShading) {
|
2081
2136
|
let cacheKey = 'ClonedMaterial:' + material.uuid + ':';
|
2082
2137
|
if (material.isGLTFSpecularGlossinessMaterial) cacheKey += 'specular-glossiness:';
|
2083
|
-
if (
|
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 (
|
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;
|
@@ -2185,6 +2240,7 @@ class GLTFParser {
|
|
2185
2240
|
|
2186
2241
|
materialParams.depthWrite = false;
|
2187
2242
|
} else {
|
2243
|
+
materialParams.format = RGBFormat;
|
2188
2244
|
materialParams.transparent = false;
|
2189
2245
|
|
2190
2246
|
if (alphaMode === ALPHA_MODES.MASK) {
|
@@ -2193,12 +2249,12 @@ class GLTFParser {
|
|
2193
2249
|
}
|
2194
2250
|
|
2195
2251
|
if (materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial) {
|
2196
|
-
pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture));
|
2197
|
-
|
2198
|
-
materialParams.normalScale = new Vector2(1, -1);
|
2252
|
+
pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture));
|
2253
|
+
materialParams.normalScale = new Vector2(1, 1);
|
2199
2254
|
|
2200
2255
|
if (materialDef.normalTexture.scale !== undefined) {
|
2201
|
-
|
2256
|
+
const scale = materialDef.normalTexture.scale;
|
2257
|
+
materialParams.normalScale.set(scale, scale);
|
2202
2258
|
}
|
2203
2259
|
}
|
2204
2260
|
|
@@ -2233,8 +2289,7 @@ class GLTFParser {
|
|
2233
2289
|
if (material.emissiveMap) material.emissiveMap.encoding = sRGBEncoding;
|
2234
2290
|
assignExtrasToUserData(material, materialDef);
|
2235
2291
|
parser.associations.set(material, {
|
2236
|
-
|
2237
|
-
index: materialIndex
|
2292
|
+
materials: materialIndex
|
2238
2293
|
});
|
2239
2294
|
if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef);
|
2240
2295
|
return material;
|
@@ -2379,11 +2434,21 @@ class GLTFParser {
|
|
2379
2434
|
meshes.push(mesh);
|
2380
2435
|
}
|
2381
2436
|
|
2437
|
+
for (let i = 0, il = meshes.length; i < il; i++) {
|
2438
|
+
parser.associations.set(meshes[i], {
|
2439
|
+
meshes: meshIndex,
|
2440
|
+
primitives: i
|
2441
|
+
});
|
2442
|
+
}
|
2443
|
+
|
2382
2444
|
if (meshes.length === 1) {
|
2383
2445
|
return meshes[0];
|
2384
2446
|
}
|
2385
2447
|
|
2386
2448
|
const group = new Group();
|
2449
|
+
parser.associations.set(group, {
|
2450
|
+
meshes: meshIndex
|
2451
|
+
});
|
2387
2452
|
|
2388
2453
|
for (let i = 0, il = meshes.length; i < il; i++) {
|
2389
2454
|
group.add(meshes[i]);
|
@@ -2512,9 +2577,8 @@ class GLTFParser {
|
|
2512
2577
|
const targetNames = [];
|
2513
2578
|
|
2514
2579
|
if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {
|
2515
|
-
// Node may be a Group (glTF mesh with several primitives) or a Mesh.
|
2516
2580
|
node.traverse(function (object) {
|
2517
|
-
if (object.
|
2581
|
+
if (object.morphTargetInfluences) {
|
2518
2582
|
targetNames.push(object.name ? object.name : object.uuid);
|
2519
2583
|
}
|
2520
2584
|
});
|
@@ -2543,7 +2607,8 @@ class GLTFParser {
|
|
2543
2607
|
// A CUBICSPLINE keyframe in glTF has three output values for each input value,
|
2544
2608
|
// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()
|
2545
2609
|
// must be divided by three to get the interpolant's sampleSize argument.
|
2546
|
-
|
2610
|
+
const interpolantType = this instanceof QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
|
2611
|
+
return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);
|
2547
2612
|
}; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.
|
2548
2613
|
|
2549
2614
|
|
@@ -2664,10 +2729,11 @@ class GLTFParser {
|
|
2664
2729
|
}
|
2665
2730
|
}
|
2666
2731
|
|
2667
|
-
parser.associations.
|
2668
|
-
|
2669
|
-
|
2670
|
-
|
2732
|
+
if (!parser.associations.has(node)) {
|
2733
|
+
parser.associations.set(node, {});
|
2734
|
+
}
|
2735
|
+
|
2736
|
+
parser.associations.get(node).nodes = nodeIndex;
|
2671
2737
|
return node;
|
2672
2738
|
});
|
2673
2739
|
}
|
@@ -2693,17 +2759,39 @@ class GLTFParser {
|
|
2693
2759
|
const pending = [];
|
2694
2760
|
|
2695
2761
|
for (let i = 0, il = nodeIds.length; i < il; i++) {
|
2696
|
-
pending.push(
|
2762
|
+
pending.push(buildNodeHierarchy(nodeIds[i], scene, json, parser));
|
2697
2763
|
}
|
2698
2764
|
|
2699
2765
|
return Promise.all(pending).then(function () {
|
2766
|
+
// Removes dangling associations, associations that reference a node that
|
2767
|
+
// didn't make it into the scene.
|
2768
|
+
const reduceAssociations = node => {
|
2769
|
+
const reducedAssociations = new Map();
|
2770
|
+
|
2771
|
+
for (const [key, value] of parser.associations) {
|
2772
|
+
if (key instanceof Material || key instanceof Texture) {
|
2773
|
+
reducedAssociations.set(key, value);
|
2774
|
+
}
|
2775
|
+
}
|
2776
|
+
|
2777
|
+
node.traverse(node => {
|
2778
|
+
const mappings = parser.associations.get(node);
|
2779
|
+
|
2780
|
+
if (mappings != null) {
|
2781
|
+
reducedAssociations.set(node, mappings);
|
2782
|
+
}
|
2783
|
+
});
|
2784
|
+
return reducedAssociations;
|
2785
|
+
};
|
2786
|
+
|
2787
|
+
parser.associations = reduceAssociations(scene);
|
2700
2788
|
return scene;
|
2701
2789
|
});
|
2702
2790
|
}
|
2703
2791
|
|
2704
2792
|
}
|
2705
2793
|
|
2706
|
-
function
|
2794
|
+
function buildNodeHierarchy(nodeId, parentObject, json, parser) {
|
2707
2795
|
const nodeDef = json.nodes[nodeId];
|
2708
2796
|
return parser.getDependency('node', nodeId).then(function (node) {
|
2709
2797
|
if (nodeDef.skin === undefined) return node; // build skeleton here as well
|
@@ -2755,7 +2843,7 @@ function buildNodeHierachy(nodeId, parentObject, json, parser) {
|
|
2755
2843
|
|
2756
2844
|
for (let i = 0, il = children.length; i < il; i++) {
|
2757
2845
|
const child = children[i];
|
2758
|
-
pending.push(
|
2846
|
+
pending.push(buildNodeHierarchy(child, node, json, parser));
|
2759
2847
|
}
|
2760
2848
|
}
|
2761
2849
|
|
@@ -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(a){super(a),this.hdrLoader=new t.RGBELoader,this.type=e.
|
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,
|
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 =
|
8
|
+
this.type = HalfFloatType;
|
9
9
|
}
|
10
10
|
|
11
11
|
load(urls, onLoad, onProgress, onError) {
|
@@ -22,14 +22,6 @@ class HDRCubeTextureLoader extends Loader {
|
|
22
22
|
texture.type = this.type;
|
23
23
|
|
24
24
|
switch (texture.type) {
|
25
|
-
case UnsignedByteType:
|
26
|
-
texture.encoding = RGBEEncoding;
|
27
|
-
texture.format = RGBAFormat;
|
28
|
-
texture.minFilter = NearestFilter;
|
29
|
-
texture.magFilter = NearestFilter;
|
30
|
-
texture.generateMipmaps = false;
|
31
|
-
break;
|
32
|
-
|
33
25
|
case FloatType:
|
34
26
|
texture.encoding = LinearEncoding;
|
35
27
|
texture.format = RGBFormat;
|
@@ -1 +1 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),s=require("../Nodes-
|
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 +1 @@
|
|
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.
|
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;
|
package/loaders/RGBELoader.js
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
import { DataTextureLoader,
|
1
|
+
import { DataTextureLoader, HalfFloatType, FloatType, DataUtils, RGBFormat, LinearEncoding, LinearFilter } from 'three';
|
2
2
|
|
3
3
|
// http://en.wikipedia.org/wiki/RGBE_image_format
|
4
4
|
|
5
5
|
class RGBELoader extends DataTextureLoader {
|
6
6
|
constructor(manager) {
|
7
7
|
super(manager);
|
8
|
-
this.type =
|
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
|
-
|
290
|
-
destArray[destOffset +
|
291
|
-
destArray[destOffset +
|
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);
|
@@ -305,16 +306,9 @@ class RGBELoader extends DataTextureLoader {
|
|
305
306
|
let numElements;
|
306
307
|
|
307
308
|
switch (this.type) {
|
308
|
-
case UnsignedByteType:
|
309
|
-
data = image_rgba_data;
|
310
|
-
format = RGBEFormat; // handled as THREE.RGBAFormat in shaders
|
311
|
-
|
312
|
-
type = UnsignedByteType;
|
313
|
-
break;
|
314
|
-
|
315
309
|
case FloatType:
|
316
|
-
numElements = image_rgba_data.length / 4
|
317
|
-
const floatArray = new Float32Array(numElements);
|
310
|
+
numElements = image_rgba_data.length / 4;
|
311
|
+
const floatArray = new Float32Array(numElements * 3);
|
318
312
|
|
319
313
|
for (let j = 0; j < numElements; j++) {
|
320
314
|
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 3);
|
@@ -326,8 +320,8 @@ class RGBELoader extends DataTextureLoader {
|
|
326
320
|
break;
|
327
321
|
|
328
322
|
case HalfFloatType:
|
329
|
-
numElements = image_rgba_data.length / 4
|
330
|
-
const halfArray = new Uint16Array(numElements);
|
323
|
+
numElements = image_rgba_data.length / 4;
|
324
|
+
const halfArray = new Uint16Array(numElements * 3);
|
331
325
|
|
332
326
|
for (let j = 0; j < numElements; j++) {
|
333
327
|
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 3);
|
@@ -367,14 +361,6 @@ class RGBELoader extends DataTextureLoader {
|
|
367
361
|
load(url, onLoad, onProgress, onError) {
|
368
362
|
function onLoadCallback(texture, texData) {
|
369
363
|
switch (texture.type) {
|
370
|
-
case UnsignedByteType:
|
371
|
-
texture.encoding = RGBEEncoding;
|
372
|
-
texture.minFilter = NearestFilter;
|
373
|
-
texture.magFilter = NearestFilter;
|
374
|
-
texture.generateMipmaps = false;
|
375
|
-
texture.flipY = true;
|
376
|
-
break;
|
377
|
-
|
378
364
|
case FloatType:
|
379
365
|
texture.encoding = LinearEncoding;
|
380
366
|
texture.minFilter = LinearFilter;
|