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