three-stdlib 2.6.3 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{Nodes-ec4e1143.js → Nodes-894ac9dc.js} +0 -0
- package/{Nodes-427f68b0.js → Nodes-af575af7.js} +0 -0
- package/controls/ArcballControls.cjs.js +1 -1
- package/controls/ArcballControls.d.ts +161 -0
- package/controls/ArcballControls.js +554 -285
- package/controls/OrbitControls.cjs.js +1 -1
- package/controls/OrbitControls.d.ts +1 -0
- package/controls/OrbitControls.js +13 -2
- package/controls/TransformControls.cjs.js +1 -1
- package/controls/TransformControls.d.ts +2 -1
- package/controls/TransformControls.js +25 -26
- package/geometries/TeapotGeometry.js +2 -2
- package/geometries/TextGeometry.cjs.js +1 -0
- package/geometries/TextGeometry.d.ts +16 -0
- package/geometries/TextGeometry.js +26 -0
- package/index.cjs.js +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- 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/FontLoader.cjs.js +1 -0
- package/loaders/FontLoader.d.ts +32 -0
- package/loaders/FontLoader.js +139 -0
- package/loaders/GLTFLoader.cjs.js +1 -1
- package/loaders/GLTFLoader.js +161 -75
- package/loaders/HDRCubeTextureLoader.cjs.js +1 -1
- package/loaders/HDRCubeTextureLoader.js +2 -2
- package/loaders/NodeMaterialLoader.cjs.js +1 -1
- package/loaders/RGBELoader.cjs.js +1 -1
- package/loaders/RGBELoader.js +10 -9
- package/loaders/RGBMLoader.cjs.js +1 -1
- package/loaders/RGBMLoader.js +181 -257
- package/loaders/STLLoader.js +7 -7
- 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/nodes/accessors/CameraNode.js +12 -12
- package/nodes/accessors/PositionNode.js +3 -3
- package/nodes/accessors/ReflectNode.js +3 -3
- package/nodes/core/FunctionNode.js +3 -3
- package/nodes/core/InputNode.js +3 -3
- package/nodes/core/Node.js +6 -6
- package/nodes/core/TempNode.js +6 -6
- package/nodes/effects/BlurNode.js +3 -3
- package/nodes/math/MathNode.js +3 -3
- package/nodes/utils/VelocityNode.js +6 -6
- package/package.json +2 -2
- package/renderers/nodes/accessors/UVNode.js +1 -3
- package/renderers/nodes/core/AttributeNode.js +1 -3
- package/renderers/nodes/core/Node.js +4 -12
- package/renderers/nodes/core/NodeBuilder.js +6 -18
- package/webxr/ARButton.js +6 -6
- package/webxr/VRButton.js +6 -6
package/loaders/EXRLoader.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { DataTextureLoader,
|
1
|
+
import { DataTextureLoader, HalfFloatType, FloatType, RGBAFormat, LinearEncoding, RedFormat, LinearFilter, DataUtils } from 'three';
|
2
2
|
import { unzlibSync } from 'fflate';
|
3
3
|
|
4
4
|
/**
|
@@ -71,7 +71,7 @@ import { unzlibSync } from 'fflate';
|
|
71
71
|
class EXRLoader extends DataTextureLoader {
|
72
72
|
constructor(manager) {
|
73
73
|
super(manager);
|
74
|
-
this.type =
|
74
|
+
this.type = HalfFloatType;
|
75
75
|
}
|
76
76
|
|
77
77
|
parse(buffer) {
|
@@ -103,33 +103,6 @@ class EXRLoader extends DataTextureLoader {
|
|
103
103
|
const LOSSY_DCT = 1;
|
104
104
|
const RLE = 2;
|
105
105
|
const logBase = Math.pow(2.7182818, 2.2);
|
106
|
-
var tmpDataView = new DataView(new ArrayBuffer(8));
|
107
|
-
|
108
|
-
function frexp(value) {
|
109
|
-
if (value === 0) return [value, 0];
|
110
|
-
tmpDataView.setFloat64(0, value);
|
111
|
-
var bits = tmpDataView.getUint32(0) >>> 20 & 0x7ff;
|
112
|
-
|
113
|
-
if (bits === 0) {
|
114
|
-
// denormal
|
115
|
-
tmpDataView.setFloat64(0, value * Math.pow(2, 64)); // exp + 64
|
116
|
-
|
117
|
-
bits = (tmpDataView.getUint32(0) >>> 20 & 0x7ff) - 64;
|
118
|
-
}
|
119
|
-
|
120
|
-
var exponent = bits - 1022;
|
121
|
-
var mantissa = ldexp(value, -exponent);
|
122
|
-
return [mantissa, exponent];
|
123
|
-
}
|
124
|
-
|
125
|
-
function ldexp(mantissa, exponent) {
|
126
|
-
var steps = Math.min(3, Math.ceil(Math.abs(exponent) / 1023));
|
127
|
-
var result = mantissa;
|
128
|
-
|
129
|
-
for (var i = 0; i < steps; i++) result *= Math.pow(2, Math.floor((exponent + i) / steps));
|
130
|
-
|
131
|
-
return result;
|
132
|
-
}
|
133
106
|
|
134
107
|
function reverseLutFromBitmap(bitmap, lut) {
|
135
108
|
var k = 0;
|
@@ -959,8 +932,7 @@ class EXRLoader extends DataTextureLoader {
|
|
959
932
|
var inOffset = {
|
960
933
|
value: info.offset.value
|
961
934
|
};
|
962
|
-
var
|
963
|
-
var outBuffer = new Uint16Array(tmpBufSize);
|
935
|
+
var outBuffer = new Uint16Array(info.width * info.scanlineBlockSize * (info.channels * info.type));
|
964
936
|
var bitmap = new Uint8Array(BITMAP_SIZE); // Setup channel info
|
965
937
|
|
966
938
|
var outBufferEnd = 0;
|
@@ -1080,7 +1052,7 @@ class EXRLoader extends DataTextureLoader {
|
|
1080
1052
|
var inOffset = {
|
1081
1053
|
value: info.offset.value
|
1082
1054
|
};
|
1083
|
-
var outBuffer = new Uint8Array(info.width * info.lines * (
|
1055
|
+
var outBuffer = new Uint8Array(info.width * info.lines * (info.channels * info.type * INT16_SIZE)); // Read compression header information
|
1084
1056
|
|
1085
1057
|
var dwaHeader = {
|
1086
1058
|
version: parseInt64(inDataView, inOffset),
|
@@ -1095,11 +1067,7 @@ class EXRLoader extends DataTextureLoader {
|
|
1095
1067
|
totalDcUncompressedCount: parseInt64(inDataView, inOffset),
|
1096
1068
|
acCompression: parseInt64(inDataView, inOffset)
|
1097
1069
|
};
|
1098
|
-
|
1099
|
-
if (dwaHeader.version < 2) {
|
1100
|
-
throw 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported';
|
1101
|
-
} // Read channel ruleset information
|
1102
|
-
|
1070
|
+
if (dwaHeader.version < 2) throw 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported'; // Read channel ruleset information
|
1103
1071
|
|
1104
1072
|
var channelRules = new Array();
|
1105
1073
|
var ruleSize = parseUint16(inDataView, inOffset) - INT16_SIZE;
|
@@ -1268,12 +1236,6 @@ class EXRLoader extends DataTextureLoader {
|
|
1268
1236
|
return stringValue;
|
1269
1237
|
}
|
1270
1238
|
|
1271
|
-
function parseUlong(dataView, offset) {
|
1272
|
-
var uLong = dataView.getUint32(0, true);
|
1273
|
-
offset.value = offset.value + ULONG_SIZE;
|
1274
|
-
return uLong;
|
1275
|
-
}
|
1276
|
-
|
1277
1239
|
function parseRational(dataView, offset) {
|
1278
1240
|
var x = parseInt32(dataView, offset);
|
1279
1241
|
var y = parseUint32(dataView, offset);
|
@@ -1461,253 +1423,240 @@ class EXRLoader extends DataTextureLoader {
|
|
1461
1423
|
}
|
1462
1424
|
}
|
1463
1425
|
|
1464
|
-
|
1465
|
-
|
1466
|
-
|
1467
|
-
|
1426
|
+
function parseHeader(dataView, buffer, offset) {
|
1427
|
+
const EXRHeader = {};
|
1428
|
+
if (dataView.getUint32(0, true) != 20000630) // magic
|
1429
|
+
throw "THREE.EXRLoader: provided file doesn't appear to be in OpenEXR format.";
|
1430
|
+
EXRHeader.version = dataView.getUint8(4, true);
|
1431
|
+
const spec = dataView.getUint8(5, true); // fullMask
|
1468
1432
|
|
1469
|
-
|
1433
|
+
EXRHeader.spec = {
|
1434
|
+
singleTile: !!(spec & 1),
|
1435
|
+
longName: !!(spec & 2),
|
1436
|
+
deepFormat: !!(spec & 4),
|
1437
|
+
multiPart: !!(spec & 8)
|
1438
|
+
}; // start of header
|
1470
1439
|
|
1471
|
-
|
1472
|
-
// start of header
|
1440
|
+
offset.value = 8; // start at 8 - after pre-amble
|
1473
1441
|
|
1474
|
-
|
1475
|
-
value: 8
|
1476
|
-
}; // start at 8, after magic stuff
|
1442
|
+
var keepReading = true;
|
1477
1443
|
|
1478
|
-
|
1479
|
-
|
1480
|
-
while (keepReading) {
|
1481
|
-
var attributeName = parseNullTerminatedString(buffer, offset);
|
1482
|
-
|
1483
|
-
if (attributeName == 0) {
|
1484
|
-
keepReading = false;
|
1485
|
-
} else {
|
1486
|
-
var attributeType = parseNullTerminatedString(buffer, offset);
|
1487
|
-
var attributeSize = parseUint32(bufferDataView, offset);
|
1488
|
-
var attributeValue = parseValue(bufferDataView, buffer, offset, attributeType, attributeSize);
|
1444
|
+
while (keepReading) {
|
1445
|
+
var attributeName = parseNullTerminatedString(buffer, offset);
|
1489
1446
|
|
1490
|
-
if (
|
1491
|
-
|
1447
|
+
if (attributeName == 0) {
|
1448
|
+
keepReading = false;
|
1492
1449
|
} else {
|
1493
|
-
|
1450
|
+
var attributeType = parseNullTerminatedString(buffer, offset);
|
1451
|
+
var attributeSize = parseUint32(dataView, offset);
|
1452
|
+
var attributeValue = parseValue(dataView, buffer, offset, attributeType, attributeSize);
|
1453
|
+
|
1454
|
+
if (attributeValue === undefined) {
|
1455
|
+
console.warn(`EXRLoader.parse: skipped unknown header attribute type \'${attributeType}\'.`);
|
1456
|
+
} else {
|
1457
|
+
EXRHeader[attributeName] = attributeValue;
|
1458
|
+
}
|
1494
1459
|
}
|
1495
1460
|
}
|
1496
|
-
} // offsets
|
1497
|
-
|
1498
|
-
|
1499
|
-
var dataWindowHeight = EXRHeader.dataWindow.yMax + 1;
|
1500
|
-
var uncompress;
|
1501
|
-
var scanlineBlockSize;
|
1502
|
-
|
1503
|
-
switch (EXRHeader.compression) {
|
1504
|
-
case 'NO_COMPRESSION':
|
1505
|
-
scanlineBlockSize = 1;
|
1506
|
-
uncompress = uncompressRAW;
|
1507
|
-
break;
|
1508
|
-
|
1509
|
-
case 'RLE_COMPRESSION':
|
1510
|
-
scanlineBlockSize = 1;
|
1511
|
-
uncompress = uncompressRLE;
|
1512
|
-
break;
|
1513
|
-
|
1514
|
-
case 'ZIPS_COMPRESSION':
|
1515
|
-
scanlineBlockSize = 1;
|
1516
|
-
uncompress = uncompressZIP;
|
1517
|
-
break;
|
1518
|
-
|
1519
|
-
case 'ZIP_COMPRESSION':
|
1520
|
-
scanlineBlockSize = 16;
|
1521
|
-
uncompress = uncompressZIP;
|
1522
|
-
break;
|
1523
|
-
|
1524
|
-
case 'PIZ_COMPRESSION':
|
1525
|
-
scanlineBlockSize = 32;
|
1526
|
-
uncompress = uncompressPIZ;
|
1527
|
-
break;
|
1528
|
-
|
1529
|
-
case 'PXR24_COMPRESSION':
|
1530
|
-
scanlineBlockSize = 16;
|
1531
|
-
uncompress = uncompressPXR;
|
1532
|
-
break;
|
1533
|
-
|
1534
|
-
case 'DWAA_COMPRESSION':
|
1535
|
-
scanlineBlockSize = 32;
|
1536
|
-
uncompress = uncompressDWA;
|
1537
|
-
break;
|
1538
|
-
|
1539
|
-
case 'DWAB_COMPRESSION':
|
1540
|
-
scanlineBlockSize = 256;
|
1541
|
-
uncompress = uncompressDWA;
|
1542
|
-
break;
|
1543
|
-
|
1544
|
-
default:
|
1545
|
-
throw 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported';
|
1546
|
-
}
|
1547
1461
|
|
1548
|
-
|
1549
|
-
|
1462
|
+
if (spec != 0) {
|
1463
|
+
console.error('EXRHeader:', EXRHeader);
|
1464
|
+
throw 'THREE.EXRLoader: provided file is currently unsupported.';
|
1465
|
+
}
|
1550
1466
|
|
1551
|
-
|
1467
|
+
return EXRHeader;
|
1468
|
+
}
|
1469
|
+
|
1470
|
+
function setupDecoder(EXRHeader, dataView, uInt8Array, offset, outputType) {
|
1471
|
+
const EXRDecoder = {
|
1472
|
+
size: 0,
|
1473
|
+
viewer: dataView,
|
1474
|
+
array: uInt8Array,
|
1475
|
+
offset: offset,
|
1476
|
+
width: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,
|
1477
|
+
height: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,
|
1478
|
+
channels: EXRHeader.channels.length,
|
1479
|
+
bytesPerLine: null,
|
1480
|
+
lines: null,
|
1481
|
+
inputSize: null,
|
1482
|
+
type: EXRHeader.channels[0].pixelType,
|
1483
|
+
uncompress: null,
|
1484
|
+
getter: null,
|
1485
|
+
format: null,
|
1486
|
+
encoding: null
|
1487
|
+
};
|
1552
1488
|
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1557
|
-
case FloatType:
|
1558
|
-
getValue = parseFloat16;
|
1559
|
-
size_t = INT16_SIZE;
|
1489
|
+
switch (EXRHeader.compression) {
|
1490
|
+
case 'NO_COMPRESSION':
|
1491
|
+
EXRDecoder.lines = 1;
|
1492
|
+
EXRDecoder.uncompress = uncompressRAW;
|
1560
1493
|
break;
|
1561
1494
|
|
1562
|
-
case
|
1563
|
-
|
1564
|
-
|
1495
|
+
case 'RLE_COMPRESSION':
|
1496
|
+
EXRDecoder.lines = 1;
|
1497
|
+
EXRDecoder.uncompress = uncompressRLE;
|
1565
1498
|
break;
|
1566
|
-
|
1567
|
-
|
1568
|
-
|
1569
|
-
|
1570
|
-
case UnsignedByteType:
|
1571
|
-
case FloatType:
|
1572
|
-
getValue = parseFloat32;
|
1573
|
-
size_t = FLOAT32_SIZE;
|
1499
|
+
|
1500
|
+
case 'ZIPS_COMPRESSION':
|
1501
|
+
EXRDecoder.lines = 1;
|
1502
|
+
EXRDecoder.uncompress = uncompressZIP;
|
1574
1503
|
break;
|
1575
1504
|
|
1576
|
-
case
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
} else {
|
1581
|
-
throw 'EXRLoader.parse: unsupported pixelType ' + pixelType + ' for ' + EXRHeader.compression + '.';
|
1582
|
-
}
|
1505
|
+
case 'ZIP_COMPRESSION':
|
1506
|
+
EXRDecoder.lines = 16;
|
1507
|
+
EXRDecoder.uncompress = uncompressZIP;
|
1508
|
+
break;
|
1583
1509
|
|
1584
|
-
|
1510
|
+
case 'PIZ_COMPRESSION':
|
1511
|
+
EXRDecoder.lines = 32;
|
1512
|
+
EXRDecoder.uncompress = uncompressPIZ;
|
1513
|
+
break;
|
1585
1514
|
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1515
|
+
case 'PXR24_COMPRESSION':
|
1516
|
+
EXRDecoder.lines = 16;
|
1517
|
+
EXRDecoder.uncompress = uncompressPXR;
|
1518
|
+
break;
|
1589
1519
|
|
1520
|
+
case 'DWAA_COMPRESSION':
|
1521
|
+
EXRDecoder.lines = 32;
|
1522
|
+
EXRDecoder.uncompress = uncompressDWA;
|
1523
|
+
break;
|
1590
1524
|
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1525
|
+
case 'DWAB_COMPRESSION':
|
1526
|
+
EXRDecoder.lines = 256;
|
1527
|
+
EXRDecoder.uncompress = uncompressDWA;
|
1528
|
+
break;
|
1529
|
+
|
1530
|
+
default:
|
1531
|
+
throw 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported';
|
1532
|
+
}
|
1594
1533
|
|
1595
|
-
|
1596
|
-
var size = width * height * numChannels; // Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten
|
1534
|
+
EXRDecoder.scanlineBlockSize = EXRDecoder.lines;
|
1597
1535
|
|
1598
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
|
1536
|
+
if (EXRDecoder.type == 1) {
|
1537
|
+
// half
|
1538
|
+
switch (outputType) {
|
1539
|
+
case FloatType:
|
1540
|
+
EXRDecoder.getter = parseFloat16;
|
1541
|
+
EXRDecoder.inputSize = INT16_SIZE;
|
1542
|
+
break;
|
1602
1543
|
|
1603
|
-
|
1604
|
-
|
1544
|
+
case HalfFloatType:
|
1545
|
+
EXRDecoder.getter = parseUint16;
|
1546
|
+
EXRDecoder.inputSize = INT16_SIZE;
|
1547
|
+
break;
|
1605
1548
|
}
|
1549
|
+
} else if (EXRDecoder.type == 2) {
|
1550
|
+
// float
|
1551
|
+
switch (outputType) {
|
1552
|
+
case FloatType:
|
1553
|
+
EXRDecoder.getter = parseFloat32;
|
1554
|
+
EXRDecoder.inputSize = FLOAT32_SIZE;
|
1555
|
+
break;
|
1606
1556
|
|
1607
|
-
|
1557
|
+
case HalfFloatType:
|
1558
|
+
EXRDecoder.getter = decodeFloat32;
|
1559
|
+
EXRDecoder.inputSize = FLOAT32_SIZE;
|
1560
|
+
}
|
1561
|
+
} else {
|
1562
|
+
throw 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.';
|
1563
|
+
}
|
1608
1564
|
|
1609
|
-
|
1610
|
-
var byteArray = new Uint16Array(size);
|
1565
|
+
EXRDecoder.blockCount = (EXRHeader.dataWindow.yMax + 1) / EXRDecoder.scanlineBlockSize;
|
1611
1566
|
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1567
|
+
for (var i = 0; i < EXRDecoder.blockCount; i++) parseInt64(dataView, offset); // scanlineOffset
|
1568
|
+
// we should be passed the scanline offset table, ready to start reading pixel data.
|
1569
|
+
// RGB images will be converted to RGBA format, preventing software emulation in select devices.
|
1615
1570
|
|
1616
|
-
break;
|
1617
1571
|
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
|
1572
|
+
EXRDecoder.outputChannels = EXRDecoder.channels == 3 ? 4 : EXRDecoder.channels;
|
1573
|
+
const size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;
|
1574
|
+
|
1575
|
+
switch (outputType) {
|
1576
|
+
case FloatType:
|
1577
|
+
EXRDecoder.byteArray = new Float32Array(size); // Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten
|
1578
|
+
|
1579
|
+
if (EXRDecoder.channels < EXRDecoder.outputChannels) EXRDecoder.byteArray.fill(1, 0, size);
|
1580
|
+
break;
|
1581
|
+
|
1582
|
+
case HalfFloatType:
|
1583
|
+
EXRDecoder.byteArray = new Uint16Array(size);
|
1584
|
+
if (EXRDecoder.channels < EXRDecoder.outputChannels) EXRDecoder.byteArray.fill(0x3c00, 0, size); // Uint16Array holds half float data, 0x3C00 is 1
|
1585
|
+
|
1586
|
+
break;
|
1587
|
+
|
1588
|
+
default:
|
1589
|
+
console.error('THREE.EXRLoader: unsupported type: ', outputType);
|
1590
|
+
break;
|
1591
|
+
}
|
1592
|
+
|
1593
|
+
EXRDecoder.bytesPerLine = EXRDecoder.width * EXRDecoder.inputSize * EXRDecoder.channels;
|
1594
|
+
|
1595
|
+
if (EXRDecoder.outputChannels == 4) {
|
1596
|
+
EXRDecoder.format = RGBAFormat;
|
1597
|
+
EXRDecoder.encoding = LinearEncoding;
|
1598
|
+
} else {
|
1599
|
+
EXRDecoder.format = RedFormat;
|
1600
|
+
EXRDecoder.encoding = LinearEncoding;
|
1601
|
+
}
|
1602
|
+
|
1603
|
+
return EXRDecoder;
|
1604
|
+
} // start parsing file [START]
|
1605
|
+
|
1606
|
+
|
1607
|
+
const bufferDataView = new DataView(buffer);
|
1608
|
+
const uInt8Array = new Uint8Array(buffer);
|
1609
|
+
const offset = {
|
1610
|
+
value: 0
|
1611
|
+
}; // get header information and validate format.
|
1612
|
+
|
1613
|
+
const EXRHeader = parseHeader(bufferDataView, buffer, offset); // get input compression information and prepare decoding.
|
1622
1614
|
|
1623
|
-
|
1615
|
+
const EXRDecoder = setupDecoder(EXRHeader, bufferDataView, uInt8Array, offset, this.type);
|
1616
|
+
const tmpOffset = {
|
1617
|
+
value: 0
|
1618
|
+
};
|
1619
|
+
const channelOffsets = {
|
1624
1620
|
R: 0,
|
1625
1621
|
G: 1,
|
1626
1622
|
B: 2,
|
1627
|
-
A: 3
|
1628
|
-
|
1629
|
-
var compressionInfo = {
|
1630
|
-
size: 0,
|
1631
|
-
width: width,
|
1632
|
-
lines: scanlineBlockSize,
|
1633
|
-
offset: offset,
|
1634
|
-
array: uInt8Array,
|
1635
|
-
viewer: bufferDataView,
|
1636
|
-
type: pixelType,
|
1637
|
-
channels: EXRHeader.channels.length
|
1638
|
-
};
|
1639
|
-
var line;
|
1640
|
-
var size;
|
1641
|
-
var viewer;
|
1642
|
-
var tmpOffset = {
|
1643
|
-
value: 0
|
1623
|
+
A: 3,
|
1624
|
+
Y: 0
|
1644
1625
|
};
|
1645
1626
|
|
1646
|
-
for (
|
1647
|
-
line = parseUint32(bufferDataView, offset); // line_no
|
1627
|
+
for (let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx++) {
|
1628
|
+
const line = parseUint32(bufferDataView, offset); // line_no
|
1648
1629
|
|
1649
|
-
size = parseUint32(bufferDataView, offset); // data_len
|
1630
|
+
EXRDecoder.size = parseUint32(bufferDataView, offset); // data_len
|
1650
1631
|
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
|
1655
|
-
offset.value += size;
|
1632
|
+
EXRDecoder.lines = line + EXRDecoder.scanlineBlockSize > EXRDecoder.height ? EXRDecoder.height - line : EXRDecoder.scanlineBlockSize;
|
1633
|
+
const isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine;
|
1634
|
+
const viewer = isCompressed ? EXRDecoder.uncompress(EXRDecoder) : uncompressRAW(EXRDecoder);
|
1635
|
+
offset.value += EXRDecoder.size;
|
1656
1636
|
|
1657
|
-
for (
|
1658
|
-
|
1659
|
-
if (true_y >= height) break;
|
1637
|
+
for (let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y++) {
|
1638
|
+
const true_y = line_y + scanlineBlockIdx * EXRDecoder.scanlineBlockSize;
|
1639
|
+
if (true_y >= EXRDecoder.height) break;
|
1660
1640
|
|
1661
|
-
for (
|
1662
|
-
|
1641
|
+
for (let channelID = 0; channelID < EXRDecoder.channels; channelID++) {
|
1642
|
+
const cOff = channelOffsets[EXRHeader.channels[channelID].name];
|
1663
1643
|
|
1664
|
-
for (
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
byteArray[(height - 1 - true_y) * (width * numChannels) + x * numChannels + cOff] = val;
|
1644
|
+
for (let x = 0; x < EXRDecoder.width; x++) {
|
1645
|
+
tmpOffset.value = (line_y * (EXRDecoder.channels * EXRDecoder.width) + channelID * EXRDecoder.width + x) * EXRDecoder.inputSize;
|
1646
|
+
const outIndex = (EXRDecoder.height - 1 - true_y) * (EXRDecoder.width * EXRDecoder.outputChannels) + x * EXRDecoder.outputChannels + cOff;
|
1647
|
+
EXRDecoder.byteArray[outIndex] = EXRDecoder.getter(viewer, tmpOffset);
|
1669
1648
|
}
|
1670
1649
|
}
|
1671
1650
|
}
|
1672
1651
|
}
|
1673
1652
|
|
1674
|
-
if (this.type === UnsignedByteType) {
|
1675
|
-
let v, i;
|
1676
|
-
const size = byteArray.length;
|
1677
|
-
const RGBEArray = new Uint8Array(size);
|
1678
|
-
|
1679
|
-
for (let h = 0; h < height; ++h) {
|
1680
|
-
for (let w = 0; w < width; ++w) {
|
1681
|
-
i = h * width * 4 + w * 4;
|
1682
|
-
const red = byteArray[i];
|
1683
|
-
const green = byteArray[i + 1];
|
1684
|
-
const blue = byteArray[i + 2];
|
1685
|
-
v = red > green ? red : green;
|
1686
|
-
v = blue > v ? blue : v;
|
1687
|
-
|
1688
|
-
if (v < 1e-32) {
|
1689
|
-
RGBEArray[i] = RGBEArray[i + 1] = RGBEArray[i + 2] = RGBEArray[i + 3] = 0;
|
1690
|
-
} else {
|
1691
|
-
const res = frexp(v);
|
1692
|
-
v = res[0] * 256 / v;
|
1693
|
-
RGBEArray[i] = red * v;
|
1694
|
-
RGBEArray[i + 1] = green * v;
|
1695
|
-
RGBEArray[i + 2] = blue * v;
|
1696
|
-
RGBEArray[i + 3] = res[1] + 128;
|
1697
|
-
}
|
1698
|
-
}
|
1699
|
-
}
|
1700
|
-
|
1701
|
-
byteArray = RGBEArray;
|
1702
|
-
}
|
1703
|
-
|
1704
|
-
const format = this.type === UnsignedByteType ? RGBEFormat : RGBAFormat ;
|
1705
1653
|
return {
|
1706
1654
|
header: EXRHeader,
|
1707
|
-
width: width,
|
1708
|
-
height: height,
|
1709
|
-
data: byteArray,
|
1710
|
-
format: format,
|
1655
|
+
width: EXRDecoder.width,
|
1656
|
+
height: EXRDecoder.height,
|
1657
|
+
data: EXRDecoder.byteArray,
|
1658
|
+
format: EXRDecoder.format,
|
1659
|
+
encoding: EXRDecoder.encoding,
|
1711
1660
|
type: this.type
|
1712
1661
|
};
|
1713
1662
|
}
|
@@ -1719,25 +1668,11 @@ class EXRLoader extends DataTextureLoader {
|
|
1719
1668
|
|
1720
1669
|
load(url, onLoad, onProgress, onError) {
|
1721
1670
|
function onLoadCallback(texture, texData) {
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
texture.generateMipmaps = false;
|
1728
|
-
texture.flipY = false;
|
1729
|
-
break;
|
1730
|
-
|
1731
|
-
case FloatType:
|
1732
|
-
case HalfFloatType:
|
1733
|
-
texture.encoding = LinearEncoding;
|
1734
|
-
texture.minFilter = LinearFilter;
|
1735
|
-
texture.magFilter = LinearFilter;
|
1736
|
-
texture.generateMipmaps = false;
|
1737
|
-
texture.flipY = false;
|
1738
|
-
break;
|
1739
|
-
}
|
1740
|
-
|
1671
|
+
texture.encoding = texData.encoding;
|
1672
|
+
texture.minFilter = LinearFilter;
|
1673
|
+
texture.magFilter = LinearFilter;
|
1674
|
+
texture.generateMipmaps = false;
|
1675
|
+
texture.flipY = false;
|
1741
1676
|
if (onLoad) onLoad(texture, texData);
|
1742
1677
|
}
|
1743
1678
|
|