three-stdlib 2.29.7 → 2.29.9
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/loaders/RGBELoader.cjs +50 -60
- package/loaders/RGBELoader.cjs.map +1 -1
- package/loaders/RGBELoader.js +50 -60
- package/loaders/RGBELoader.js.map +1 -1
- package/loaders/SVGLoader.cjs +158 -50
- package/loaders/SVGLoader.cjs.map +1 -1
- package/loaders/SVGLoader.js +158 -50
- package/loaders/SVGLoader.js.map +1 -1
- package/package.json +1 -1
package/loaders/RGBELoader.cjs
CHANGED
@@ -8,22 +8,18 @@ class RGBELoader extends THREE.DataTextureLoader {
|
|
8
8
|
}
|
9
9
|
// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html
|
10
10
|
parse(buffer) {
|
11
|
-
const
|
11
|
+
const rgbe_read_error = 1, rgbe_write_error = 2, rgbe_format_error = 3, rgbe_memory_error = 4, rgbe_error = function(rgbe_error_code, msg) {
|
12
12
|
switch (rgbe_error_code) {
|
13
13
|
case rgbe_read_error:
|
14
|
-
|
15
|
-
break;
|
14
|
+
throw new Error("THREE.RGBELoader: Read Error: " + (msg || ""));
|
16
15
|
case rgbe_write_error:
|
17
|
-
|
18
|
-
break;
|
16
|
+
throw new Error("THREE.RGBELoader: Write Error: " + (msg || ""));
|
19
17
|
case rgbe_format_error:
|
20
|
-
|
21
|
-
break;
|
18
|
+
throw new Error("THREE.RGBELoader: Bad File Format: " + (msg || ""));
|
22
19
|
default:
|
23
20
|
case rgbe_memory_error:
|
24
|
-
|
21
|
+
throw new Error("THREE.RGBELoader: Memory Error: " + (msg || ""));
|
25
22
|
}
|
26
|
-
return RGBE_RETURN_FAILURE;
|
27
23
|
}, RGBE_VALID_PROGRAMTYPE = 1, RGBE_VALID_FORMAT = 2, RGBE_VALID_DIMENSIONS = 4, NEWLINE = "\n", fgets = function(buffer2, lineLimit, consume) {
|
28
24
|
const chunkSize = 128;
|
29
25
|
lineLimit = !lineLimit ? 1024 : lineLimit;
|
@@ -54,10 +50,10 @@ class RGBELoader extends THREE.DataTextureLoader {
|
|
54
50
|
};
|
55
51
|
let line, match;
|
56
52
|
if (buffer2.pos >= buffer2.byteLength || !(line = fgets(buffer2))) {
|
57
|
-
|
53
|
+
rgbe_error(rgbe_read_error, "no header found");
|
58
54
|
}
|
59
55
|
if (!(match = line.match(magic_token_re))) {
|
60
|
-
|
56
|
+
rgbe_error(rgbe_format_error, "bad initial token");
|
61
57
|
}
|
62
58
|
header.valid |= RGBE_VALID_PROGRAMTYPE;
|
63
59
|
header.programtype = match[1];
|
@@ -90,14 +86,14 @@ class RGBELoader extends THREE.DataTextureLoader {
|
|
90
86
|
break;
|
91
87
|
}
|
92
88
|
if (!(header.valid & RGBE_VALID_FORMAT)) {
|
93
|
-
|
89
|
+
rgbe_error(rgbe_format_error, "missing format specifier");
|
94
90
|
}
|
95
91
|
if (!(header.valid & RGBE_VALID_DIMENSIONS)) {
|
96
|
-
|
92
|
+
rgbe_error(rgbe_format_error, "missing image size specifier");
|
97
93
|
}
|
98
94
|
return header;
|
99
|
-
}, RGBE_ReadPixels_RLE = function(buffer2,
|
100
|
-
const scanline_width =
|
95
|
+
}, RGBE_ReadPixels_RLE = function(buffer2, w2, h2) {
|
96
|
+
const scanline_width = w2;
|
101
97
|
if (
|
102
98
|
// run length encoding is not allowed so read flat
|
103
99
|
scanline_width < 8 || scanline_width > 32767 || // this file is not run length encoded
|
@@ -106,27 +102,27 @@ class RGBELoader extends THREE.DataTextureLoader {
|
|
106
102
|
return new Uint8Array(buffer2);
|
107
103
|
}
|
108
104
|
if (scanline_width !== (buffer2[2] << 8 | buffer2[3])) {
|
109
|
-
|
105
|
+
rgbe_error(rgbe_format_error, "wrong scanline width");
|
110
106
|
}
|
111
|
-
const data_rgba = new Uint8Array(4 *
|
107
|
+
const data_rgba = new Uint8Array(4 * w2 * h2);
|
112
108
|
if (!data_rgba.length) {
|
113
|
-
|
109
|
+
rgbe_error(rgbe_memory_error, "unable to allocate buffer space");
|
114
110
|
}
|
115
111
|
let offset = 0, pos = 0;
|
116
112
|
const ptr_end = 4 * scanline_width;
|
117
113
|
const rgbeStart = new Uint8Array(4);
|
118
114
|
const scanline_buffer = new Uint8Array(ptr_end);
|
119
|
-
let num_scanlines =
|
115
|
+
let num_scanlines = h2;
|
120
116
|
while (num_scanlines > 0 && pos < buffer2.byteLength) {
|
121
117
|
if (pos + 4 > buffer2.byteLength) {
|
122
|
-
|
118
|
+
rgbe_error(rgbe_read_error);
|
123
119
|
}
|
124
120
|
rgbeStart[0] = buffer2[pos++];
|
125
121
|
rgbeStart[1] = buffer2[pos++];
|
126
122
|
rgbeStart[2] = buffer2[pos++];
|
127
123
|
rgbeStart[3] = buffer2[pos++];
|
128
124
|
if (2 != rgbeStart[0] || 2 != rgbeStart[1] || (rgbeStart[2] << 8 | rgbeStart[3]) != scanline_width) {
|
129
|
-
|
125
|
+
rgbe_error(rgbe_format_error, "bad rgbe scanline format");
|
130
126
|
}
|
131
127
|
let ptr = 0, count;
|
132
128
|
while (ptr < ptr_end && pos < buffer2.byteLength) {
|
@@ -135,7 +131,7 @@ class RGBELoader extends THREE.DataTextureLoader {
|
|
135
131
|
if (isEncodedRun)
|
136
132
|
count -= 128;
|
137
133
|
if (0 === count || ptr + count > ptr_end) {
|
138
|
-
|
134
|
+
rgbe_error(rgbe_format_error, "bad scanline data");
|
139
135
|
}
|
140
136
|
if (isEncodedRun) {
|
141
137
|
const byteValue = buffer2[pos++];
|
@@ -183,46 +179,40 @@ class RGBELoader extends THREE.DataTextureLoader {
|
|
183
179
|
const byteArray = new Uint8Array(buffer);
|
184
180
|
byteArray.pos = 0;
|
185
181
|
const rgbe_header_info = RGBE_ReadHeader(byteArray);
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
for (let j = 0; j < numElements; j++) {
|
196
|
-
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4);
|
197
|
-
}
|
198
|
-
data = floatArray;
|
199
|
-
type = THREE.FloatType;
|
200
|
-
break;
|
201
|
-
case THREE.HalfFloatType:
|
202
|
-
numElements = image_rgba_data.length / 4;
|
203
|
-
const halfArray = new Uint16Array(numElements * 4);
|
204
|
-
for (let j = 0; j < numElements; j++) {
|
205
|
-
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4);
|
206
|
-
}
|
207
|
-
data = halfArray;
|
208
|
-
type = THREE.HalfFloatType;
|
209
|
-
break;
|
210
|
-
default:
|
211
|
-
console.error("THREE.RGBELoader: unsupported type: ", this.type);
|
212
|
-
break;
|
182
|
+
const w = rgbe_header_info.width, h = rgbe_header_info.height, image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h);
|
183
|
+
let data, type;
|
184
|
+
let numElements;
|
185
|
+
switch (this.type) {
|
186
|
+
case THREE.FloatType:
|
187
|
+
numElements = image_rgba_data.length / 4;
|
188
|
+
const floatArray = new Float32Array(numElements * 4);
|
189
|
+
for (let j = 0; j < numElements; j++) {
|
190
|
+
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4);
|
213
191
|
}
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
}
|
223
|
-
|
192
|
+
data = floatArray;
|
193
|
+
type = THREE.FloatType;
|
194
|
+
break;
|
195
|
+
case THREE.HalfFloatType:
|
196
|
+
numElements = image_rgba_data.length / 4;
|
197
|
+
const halfArray = new Uint16Array(numElements * 4);
|
198
|
+
for (let j = 0; j < numElements; j++) {
|
199
|
+
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4);
|
200
|
+
}
|
201
|
+
data = halfArray;
|
202
|
+
type = THREE.HalfFloatType;
|
203
|
+
break;
|
204
|
+
default:
|
205
|
+
throw new Error("THREE.RGBELoader: Unsupported type: " + this.type);
|
224
206
|
}
|
225
|
-
return
|
207
|
+
return {
|
208
|
+
width: w,
|
209
|
+
height: h,
|
210
|
+
data,
|
211
|
+
header: rgbe_header_info.string,
|
212
|
+
gamma: rgbe_header_info.gamma,
|
213
|
+
exposure: rgbe_header_info.exposure,
|
214
|
+
type
|
215
|
+
};
|
226
216
|
}
|
227
217
|
setDataType(value) {
|
228
218
|
this.type = value;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RGBELoader.cjs","sources":["../../src/loaders/RGBELoader.js"],"sourcesContent":["import { DataTextureLoader, DataUtils, FloatType, HalfFloatType, LinearFilter } from 'three'\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n constructor(manager) {\n super(manager)\n\n this.type = HalfFloatType\n }\n\n // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n parse(buffer) {\n const /* return codes for rgbe routines */\n //RGBE_RETURN_SUCCESS = 0,\n RGBE_RETURN_FAILURE = -1,\n /* default error routine. change this to change error handling */\n rgbe_read_error = 1,\n rgbe_write_error = 2,\n rgbe_format_error = 3,\n rgbe_memory_error = 4,\n rgbe_error = function (rgbe_error_code, msg) {\n switch (rgbe_error_code) {\n case rgbe_read_error:\n console.error('THREE.RGBELoader Read Error: ' + (msg || ''))\n break\n case rgbe_write_error:\n console.error('THREE.RGBELoader Write Error: ' + (msg || ''))\n break\n case rgbe_format_error:\n console.error('THREE.RGBELoader Bad File Format: ' + (msg || ''))\n break\n default:\n case rgbe_memory_error:\n console.error('THREE.RGBELoader: Error: ' + (msg || ''))\n }\n\n return RGBE_RETURN_FAILURE\n },\n /* offsets to red, green, and blue components in a data (float) pixel */\n //RGBE_DATA_RED = 0,\n //RGBE_DATA_GREEN = 1,\n //RGBE_DATA_BLUE = 2,\n\n /* number of floats per pixel, use 4 since stored in rgba image format */\n //RGBE_DATA_SIZE = 4,\n\n /* flags indicating which fields in an rgbe_header_info are valid */\n RGBE_VALID_PROGRAMTYPE = 1,\n RGBE_VALID_FORMAT = 2,\n RGBE_VALID_DIMENSIONS = 4,\n NEWLINE = '\\n',\n fgets = function (buffer, lineLimit, consume) {\n const chunkSize = 128\n\n lineLimit = !lineLimit ? 1024 : lineLimit\n let p = buffer.pos,\n i = -1,\n len = 0,\n s = '',\n chunk = String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n\n while (0 > (i = chunk.indexOf(NEWLINE)) && len < lineLimit && p < buffer.byteLength) {\n s += chunk\n len += chunk.length\n p += chunkSize\n chunk += String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n }\n\n if (-1 < i) {\n /*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n if (false !== consume) buffer.pos += len + i + 1\n return s + chunk.slice(0, i)\n }\n\n return false\n },\n /* minimal header reading. modify if you want to parse more information */\n RGBE_ReadHeader = function (buffer) {\n // regexes to parse header info fields\n const magic_token_re = /^#\\?(\\S+)/,\n gamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n exposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n format_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n dimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n // RGBE format header struct\n header = {\n valid: 0 /* indicate which fields are valid */,\n\n string: '' /* the actual header string */,\n\n comments: '' /* comments found in header */,\n\n programtype: 'RGBE' /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */,\n\n format: '' /* RGBE format, default 32-bit_rle_rgbe */,\n\n gamma: 1.0 /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */,\n\n exposure: 1.0 /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */,\n\n width: 0,\n height: 0 /* image dimensions, width/height */,\n }\n\n let line, match\n\n if (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) {\n return rgbe_error(rgbe_read_error, 'no header found')\n }\n\n /* if you want to require the magic token then uncomment the next line */\n if (!(match = line.match(magic_token_re))) {\n return rgbe_error(rgbe_format_error, 'bad initial token')\n }\n\n header.valid |= RGBE_VALID_PROGRAMTYPE\n header.programtype = match[1]\n header.string += line + '\\n'\n\n while (true) {\n line = fgets(buffer)\n if (false === line) break\n header.string += line + '\\n'\n\n if ('#' === line.charAt(0)) {\n header.comments += line + '\\n'\n continue // comment line\n }\n\n if ((match = line.match(gamma_re))) {\n header.gamma = parseFloat(match[1])\n }\n\n if ((match = line.match(exposure_re))) {\n header.exposure = parseFloat(match[1])\n }\n\n if ((match = line.match(format_re))) {\n header.valid |= RGBE_VALID_FORMAT\n header.format = match[1] //'32-bit_rle_rgbe';\n }\n\n if ((match = line.match(dimensions_re))) {\n header.valid |= RGBE_VALID_DIMENSIONS\n header.height = parseInt(match[1], 10)\n header.width = parseInt(match[2], 10)\n }\n\n if (header.valid & RGBE_VALID_FORMAT && header.valid & RGBE_VALID_DIMENSIONS) break\n }\n\n if (!(header.valid & RGBE_VALID_FORMAT)) {\n return rgbe_error(rgbe_format_error, 'missing format specifier')\n }\n\n if (!(header.valid & RGBE_VALID_DIMENSIONS)) {\n return rgbe_error(rgbe_format_error, 'missing image size specifier')\n }\n\n return header\n },\n RGBE_ReadPixels_RLE = function (buffer, w, h) {\n const scanline_width = w\n\n if (\n // run length encoding is not allowed so read flat\n scanline_width < 8 ||\n scanline_width > 0x7fff ||\n // this file is not run length encoded\n 2 !== buffer[0] ||\n 2 !== buffer[1] ||\n buffer[2] & 0x80\n ) {\n // return the flat buffer\n return new Uint8Array(buffer)\n }\n\n if (scanline_width !== ((buffer[2] << 8) | buffer[3])) {\n return rgbe_error(rgbe_format_error, 'wrong scanline width')\n }\n\n const data_rgba = new Uint8Array(4 * w * h)\n\n if (!data_rgba.length) {\n return rgbe_error(rgbe_memory_error, 'unable to allocate buffer space')\n }\n\n let offset = 0,\n pos = 0\n\n const ptr_end = 4 * scanline_width\n const rgbeStart = new Uint8Array(4)\n const scanline_buffer = new Uint8Array(ptr_end)\n let num_scanlines = h\n\n // read in each successive scanline\n while (num_scanlines > 0 && pos < buffer.byteLength) {\n if (pos + 4 > buffer.byteLength) {\n return rgbe_error(rgbe_read_error)\n }\n\n rgbeStart[0] = buffer[pos++]\n rgbeStart[1] = buffer[pos++]\n rgbeStart[2] = buffer[pos++]\n rgbeStart[3] = buffer[pos++]\n\n if (2 != rgbeStart[0] || 2 != rgbeStart[1] || ((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width) {\n return rgbe_error(rgbe_format_error, 'bad rgbe scanline format')\n }\n\n // read each of the four channels for the scanline into the buffer\n // first red, then green, then blue, then exponent\n let ptr = 0,\n count\n\n while (ptr < ptr_end && pos < buffer.byteLength) {\n count = buffer[pos++]\n const isEncodedRun = count > 128\n if (isEncodedRun) count -= 128\n\n if (0 === count || ptr + count > ptr_end) {\n return rgbe_error(rgbe_format_error, 'bad scanline data')\n }\n\n if (isEncodedRun) {\n // a (encoded) run of the same value\n const byteValue = buffer[pos++]\n for (let i = 0; i < count; i++) {\n scanline_buffer[ptr++] = byteValue\n }\n //ptr += count;\n } else {\n // a literal-run\n scanline_buffer.set(buffer.subarray(pos, pos + count), ptr)\n ptr += count\n pos += count\n }\n }\n\n // now convert data from buffer into rgba\n // first red, then green, then blue, then exponent (alpha)\n const l = scanline_width //scanline_buffer.byteLength;\n for (let i = 0; i < l; i++) {\n let off = 0\n data_rgba[offset] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 1] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 2] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 3] = scanline_buffer[i + off]\n offset += 4\n }\n\n num_scanlines--\n }\n\n return data_rgba\n }\n\n const RGBEByteToRGBFloat = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n destArray[destOffset + 0] = sourceArray[sourceOffset + 0] * scale\n destArray[destOffset + 1] = sourceArray[sourceOffset + 1] * scale\n destArray[destOffset + 2] = sourceArray[sourceOffset + 2] * scale\n destArray[destOffset + 3] = 1\n }\n\n const RGBEByteToRGBHalf = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n // clamping to 65504, the maximum representable value in float16\n destArray[destOffset + 0] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504))\n destArray[destOffset + 1] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504))\n destArray[destOffset + 2] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504))\n destArray[destOffset + 3] = DataUtils.toHalfFloat(1)\n }\n\n const byteArray = new Uint8Array(buffer)\n byteArray.pos = 0\n const rgbe_header_info = RGBE_ReadHeader(byteArray)\n\n if (RGBE_RETURN_FAILURE !== rgbe_header_info) {\n const w = rgbe_header_info.width,\n h = rgbe_header_info.height,\n image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h)\n\n if (RGBE_RETURN_FAILURE !== image_rgba_data) {\n let data, type\n let numElements\n\n switch (this.type) {\n case FloatType:\n numElements = image_rgba_data.length / 4\n const floatArray = new Float32Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4)\n }\n\n data = floatArray\n type = FloatType\n break\n\n case HalfFloatType:\n numElements = image_rgba_data.length / 4\n const halfArray = new Uint16Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4)\n }\n\n data = halfArray\n type = HalfFloatType\n break\n\n default:\n console.error('THREE.RGBELoader: unsupported type: ', this.type)\n break\n }\n\n return {\n width: w,\n height: h,\n data: data,\n header: rgbe_header_info.string,\n gamma: rgbe_header_info.gamma,\n exposure: rgbe_header_info.exposure,\n type: type,\n }\n }\n }\n\n return null\n }\n\n setDataType(value) {\n this.type = value\n return this\n }\n\n load(url, onLoad, onProgress, onError) {\n function onLoadCallback(texture, texData) {\n switch (texture.type) {\n case FloatType:\n case HalfFloatType:\n if ('colorSpace' in texture) texture.colorSpace = 'srgb-linear'\n else texture.encoding = 3000 // LinearEncoding\n texture.minFilter = LinearFilter\n texture.magFilter = LinearFilter\n texture.generateMipmaps = false\n texture.flipY = true\n\n break\n }\n\n if (onLoad) onLoad(texture, texData)\n }\n\n return super.load(url, onLoadCallback, onProgress, onError)\n }\n}\n\nexport { RGBELoader }\n"],"names":["DataTextureLoader","HalfFloatType","buffer","DataUtils","FloatType","LinearFilter"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"RGBELoader.cjs","sources":["../../src/loaders/RGBELoader.js"],"sourcesContent":["import { DataTextureLoader, DataUtils, FloatType, HalfFloatType, LinearFilter } from 'three'\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n constructor(manager) {\n super(manager)\n\n this.type = HalfFloatType\n }\n\n // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n parse(buffer) {\n const /* default error routine. change this to change error handling */\n rgbe_read_error = 1,\n rgbe_write_error = 2,\n rgbe_format_error = 3,\n rgbe_memory_error = 4,\n rgbe_error = function (rgbe_error_code, msg) {\n switch (rgbe_error_code) {\n case rgbe_read_error:\n throw new Error('THREE.RGBELoader: Read Error: ' + (msg || ''))\n case rgbe_write_error:\n throw new Error('THREE.RGBELoader: Write Error: ' + (msg || ''))\n case rgbe_format_error:\n throw new Error('THREE.RGBELoader: Bad File Format: ' + (msg || ''))\n default:\n case rgbe_memory_error:\n throw new Error('THREE.RGBELoader: Memory Error: ' + (msg || ''))\n }\n },\n /* offsets to red, green, and blue components in a data (float) pixel */\n //RGBE_DATA_RED = 0,\n //RGBE_DATA_GREEN = 1,\n //RGBE_DATA_BLUE = 2,\n\n /* number of floats per pixel, use 4 since stored in rgba image format */\n //RGBE_DATA_SIZE = 4,\n\n /* flags indicating which fields in an rgbe_header_info are valid */\n RGBE_VALID_PROGRAMTYPE = 1,\n RGBE_VALID_FORMAT = 2,\n RGBE_VALID_DIMENSIONS = 4,\n NEWLINE = '\\n',\n fgets = function (buffer, lineLimit, consume) {\n const chunkSize = 128\n\n lineLimit = !lineLimit ? 1024 : lineLimit\n let p = buffer.pos,\n i = -1,\n len = 0,\n s = '',\n chunk = String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n\n while (0 > (i = chunk.indexOf(NEWLINE)) && len < lineLimit && p < buffer.byteLength) {\n s += chunk\n len += chunk.length\n p += chunkSize\n chunk += String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n }\n\n if (-1 < i) {\n /*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n if (false !== consume) buffer.pos += len + i + 1\n return s + chunk.slice(0, i)\n }\n\n return false\n },\n /* minimal header reading. modify if you want to parse more information */\n RGBE_ReadHeader = function (buffer) {\n // regexes to parse header info fields\n const magic_token_re = /^#\\?(\\S+)/,\n gamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n exposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n format_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n dimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n // RGBE format header struct\n header = {\n valid: 0 /* indicate which fields are valid */,\n\n string: '' /* the actual header string */,\n\n comments: '' /* comments found in header */,\n\n programtype: 'RGBE' /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */,\n\n format: '' /* RGBE format, default 32-bit_rle_rgbe */,\n\n gamma: 1.0 /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */,\n\n exposure: 1.0 /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */,\n\n width: 0,\n height: 0 /* image dimensions, width/height */,\n }\n\n let line, match\n\n if (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) {\n rgbe_error(rgbe_read_error, 'no header found')\n }\n\n /* if you want to require the magic token then uncomment the next line */\n if (!(match = line.match(magic_token_re))) {\n rgbe_error(rgbe_format_error, 'bad initial token')\n }\n\n header.valid |= RGBE_VALID_PROGRAMTYPE\n header.programtype = match[1]\n header.string += line + '\\n'\n\n while (true) {\n line = fgets(buffer)\n if (false === line) break\n header.string += line + '\\n'\n\n if ('#' === line.charAt(0)) {\n header.comments += line + '\\n'\n continue // comment line\n }\n\n if ((match = line.match(gamma_re))) {\n header.gamma = parseFloat(match[1])\n }\n\n if ((match = line.match(exposure_re))) {\n header.exposure = parseFloat(match[1])\n }\n\n if ((match = line.match(format_re))) {\n header.valid |= RGBE_VALID_FORMAT\n header.format = match[1] //'32-bit_rle_rgbe';\n }\n\n if ((match = line.match(dimensions_re))) {\n header.valid |= RGBE_VALID_DIMENSIONS\n header.height = parseInt(match[1], 10)\n header.width = parseInt(match[2], 10)\n }\n\n if (header.valid & RGBE_VALID_FORMAT && header.valid & RGBE_VALID_DIMENSIONS) break\n }\n\n if (!(header.valid & RGBE_VALID_FORMAT)) {\n rgbe_error(rgbe_format_error, 'missing format specifier')\n }\n\n if (!(header.valid & RGBE_VALID_DIMENSIONS)) {\n rgbe_error(rgbe_format_error, 'missing image size specifier')\n }\n\n return header\n },\n RGBE_ReadPixels_RLE = function (buffer, w, h) {\n const scanline_width = w\n\n if (\n // run length encoding is not allowed so read flat\n scanline_width < 8 ||\n scanline_width > 0x7fff ||\n // this file is not run length encoded\n 2 !== buffer[0] ||\n 2 !== buffer[1] ||\n buffer[2] & 0x80\n ) {\n // return the flat buffer\n return new Uint8Array(buffer)\n }\n\n if (scanline_width !== ((buffer[2] << 8) | buffer[3])) {\n rgbe_error(rgbe_format_error, 'wrong scanline width')\n }\n\n const data_rgba = new Uint8Array(4 * w * h)\n\n if (!data_rgba.length) {\n rgbe_error(rgbe_memory_error, 'unable to allocate buffer space')\n }\n\n let offset = 0,\n pos = 0\n\n const ptr_end = 4 * scanline_width\n const rgbeStart = new Uint8Array(4)\n const scanline_buffer = new Uint8Array(ptr_end)\n let num_scanlines = h\n\n // read in each successive scanline\n while (num_scanlines > 0 && pos < buffer.byteLength) {\n if (pos + 4 > buffer.byteLength) {\n rgbe_error(rgbe_read_error)\n }\n\n rgbeStart[0] = buffer[pos++]\n rgbeStart[1] = buffer[pos++]\n rgbeStart[2] = buffer[pos++]\n rgbeStart[3] = buffer[pos++]\n\n if (2 != rgbeStart[0] || 2 != rgbeStart[1] || ((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width) {\n rgbe_error(rgbe_format_error, 'bad rgbe scanline format')\n }\n\n // read each of the four channels for the scanline into the buffer\n // first red, then green, then blue, then exponent\n let ptr = 0,\n count\n\n while (ptr < ptr_end && pos < buffer.byteLength) {\n count = buffer[pos++]\n const isEncodedRun = count > 128\n if (isEncodedRun) count -= 128\n\n if (0 === count || ptr + count > ptr_end) {\n rgbe_error(rgbe_format_error, 'bad scanline data')\n }\n\n if (isEncodedRun) {\n // a (encoded) run of the same value\n const byteValue = buffer[pos++]\n for (let i = 0; i < count; i++) {\n scanline_buffer[ptr++] = byteValue\n }\n //ptr += count;\n } else {\n // a literal-run\n scanline_buffer.set(buffer.subarray(pos, pos + count), ptr)\n ptr += count\n pos += count\n }\n }\n\n // now convert data from buffer into rgba\n // first red, then green, then blue, then exponent (alpha)\n const l = scanline_width //scanline_buffer.byteLength;\n for (let i = 0; i < l; i++) {\n let off = 0\n data_rgba[offset] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 1] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 2] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 3] = scanline_buffer[i + off]\n offset += 4\n }\n\n num_scanlines--\n }\n\n return data_rgba\n }\n\n const RGBEByteToRGBFloat = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n destArray[destOffset + 0] = sourceArray[sourceOffset + 0] * scale\n destArray[destOffset + 1] = sourceArray[sourceOffset + 1] * scale\n destArray[destOffset + 2] = sourceArray[sourceOffset + 2] * scale\n destArray[destOffset + 3] = 1\n }\n\n const RGBEByteToRGBHalf = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n // clamping to 65504, the maximum representable value in float16\n destArray[destOffset + 0] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504))\n destArray[destOffset + 1] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504))\n destArray[destOffset + 2] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504))\n destArray[destOffset + 3] = DataUtils.toHalfFloat(1)\n }\n\n const byteArray = new Uint8Array(buffer)\n byteArray.pos = 0\n const rgbe_header_info = RGBE_ReadHeader(byteArray)\n\n const w = rgbe_header_info.width,\n h = rgbe_header_info.height,\n image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h)\n\n let data, type\n let numElements\n\n switch (this.type) {\n case FloatType:\n numElements = image_rgba_data.length / 4\n const floatArray = new Float32Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4)\n }\n\n data = floatArray\n type = FloatType\n break\n\n case HalfFloatType:\n numElements = image_rgba_data.length / 4\n const halfArray = new Uint16Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4)\n }\n\n data = halfArray\n type = HalfFloatType\n break\n\n default:\n throw new Error('THREE.RGBELoader: Unsupported type: ' + this.type)\n break\n }\n\n return {\n width: w,\n height: h,\n data: data,\n header: rgbe_header_info.string,\n gamma: rgbe_header_info.gamma,\n exposure: rgbe_header_info.exposure,\n type: type,\n }\n }\n\n setDataType(value) {\n this.type = value\n return this\n }\n\n load(url, onLoad, onProgress, onError) {\n function onLoadCallback(texture, texData) {\n switch (texture.type) {\n case FloatType:\n case HalfFloatType:\n if ('colorSpace' in texture) texture.colorSpace = 'srgb-linear'\n else texture.encoding = 3000 // LinearEncoding\n texture.minFilter = LinearFilter\n texture.magFilter = LinearFilter\n texture.generateMipmaps = false\n texture.flipY = true\n\n break\n }\n\n if (onLoad) onLoad(texture, texData)\n }\n\n return super.load(url, onLoadCallback, onProgress, onError)\n }\n}\n\nexport { RGBELoader }\n"],"names":["DataTextureLoader","HalfFloatType","buffer","w","h","DataUtils","FloatType","LinearFilter"],"mappings":";;;AAKA,MAAM,mBAAmBA,MAAAA,kBAAkB;AAAA,EACzC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,OAAOC,MAAa;AAAA,EAC1B;AAAA;AAAA,EAID,MAAM,QAAQ;AACZ,UACE,kBAAkB,GAClB,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,aAAa,SAAU,iBAAiB,KAAK;AAC3C,cAAQ,iBAAe;AAAA,QACrB,KAAK;AACH,gBAAM,IAAI,MAAM,oCAAoC,OAAO,GAAG;AAAA,QAChE,KAAK;AACH,gBAAM,IAAI,MAAM,qCAAqC,OAAO,GAAG;AAAA,QACjE,KAAK;AACH,gBAAM,IAAI,MAAM,yCAAyC,OAAO,GAAG;AAAA,QACrE;AAAA,QACA,KAAK;AACH,gBAAM,IAAI,MAAM,sCAAsC,OAAO,GAAG;AAAA,MACnE;AAAA,IACF,GAUD,yBAAyB,GACzB,oBAAoB,GACpB,wBAAwB,GACxB,UAAU,MACV,QAAQ,SAAUC,SAAQ,WAAW,SAAS;AAC5C,YAAM,YAAY;AAElB,kBAAY,CAAC,YAAY,OAAO;AAChC,UAAI,IAAIA,QAAO,KACb,IAAI,IACJ,MAAM,GACN,IAAI,IACJ,QAAQ,OAAO,aAAa,MAAM,MAAM,IAAI,YAAYA,QAAO,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAE5F,aAAO,KAAK,IAAI,MAAM,QAAQ,OAAO,MAAM,MAAM,aAAa,IAAIA,QAAO,YAAY;AACnF,aAAK;AACL,eAAO,MAAM;AACb,aAAK;AACL,iBAAS,OAAO,aAAa,MAAM,MAAM,IAAI,YAAYA,QAAO,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,MAC5F;AAED,UAAI,KAAK,GAAG;AAOV,YAAI,UAAU;AAAS,UAAAA,QAAO,OAAO,MAAM,IAAI;AAC/C,eAAO,IAAI,MAAM,MAAM,GAAG,CAAC;AAAA,MAC5B;AAED,aAAO;AAAA,IACR,GAED,kBAAkB,SAAUA,SAAQ;AAElC,YAAM,iBAAiB,aACrB,WAAW,qCACX,cAAc,wCACd,YAAY,wBACZ,gBAAgB,qCAEhB,SAAS;AAAA,QACP,OAAO;AAAA,QAEP,QAAQ;AAAA,QAER,UAAU;AAAA,QAEV,aAAa;AAAA,QAEb,QAAQ;AAAA,QAER,OAAO;AAAA,QAEP,UAAU;AAAA,QAEV,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAEH,UAAI,MAAM;AAEV,UAAIA,QAAO,OAAOA,QAAO,cAAc,EAAE,OAAO,MAAMA,OAAM,IAAI;AAC9D,mBAAW,iBAAiB,iBAAiB;AAAA,MAC9C;AAGD,UAAI,EAAE,QAAQ,KAAK,MAAM,cAAc,IAAI;AACzC,mBAAW,mBAAmB,mBAAmB;AAAA,MAClD;AAED,aAAO,SAAS;AAChB,aAAO,cAAc,MAAM,CAAC;AAC5B,aAAO,UAAU,OAAO;AAExB,aAAO,MAAM;AACX,eAAO,MAAMA,OAAM;AACnB,YAAI,UAAU;AAAM;AACpB,eAAO,UAAU,OAAO;AAExB,YAAI,QAAQ,KAAK,OAAO,CAAC,GAAG;AAC1B,iBAAO,YAAY,OAAO;AAC1B;AAAA,QACD;AAED,YAAK,QAAQ,KAAK,MAAM,QAAQ,GAAI;AAClC,iBAAO,QAAQ,WAAW,MAAM,CAAC,CAAC;AAAA,QACnC;AAED,YAAK,QAAQ,KAAK,MAAM,WAAW,GAAI;AACrC,iBAAO,WAAW,WAAW,MAAM,CAAC,CAAC;AAAA,QACtC;AAED,YAAK,QAAQ,KAAK,MAAM,SAAS,GAAI;AACnC,iBAAO,SAAS;AAChB,iBAAO,SAAS,MAAM,CAAC;AAAA,QACxB;AAED,YAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,iBAAO,SAAS;AAChB,iBAAO,SAAS,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,iBAAO,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,QACrC;AAED,YAAI,OAAO,QAAQ,qBAAqB,OAAO,QAAQ;AAAuB;AAAA,MAC/E;AAED,UAAI,EAAE,OAAO,QAAQ,oBAAoB;AACvC,mBAAW,mBAAmB,0BAA0B;AAAA,MACzD;AAED,UAAI,EAAE,OAAO,QAAQ,wBAAwB;AAC3C,mBAAW,mBAAmB,8BAA8B;AAAA,MAC7D;AAED,aAAO;AAAA,IACR,GACD,sBAAsB,SAAUA,SAAQC,IAAGC,IAAG;AAC5C,YAAM,iBAAiBD;AAEvB;AAAA;AAAA,QAEE,iBAAiB,KACjB,iBAAiB;AAAA,QAEjB,MAAMD,QAAO,CAAC,KACd,MAAMA,QAAO,CAAC,KACdA,QAAO,CAAC,IAAI;AAAA,QACZ;AAEA,eAAO,IAAI,WAAWA,OAAM;AAAA,MAC7B;AAED,UAAI,oBAAqBA,QAAO,CAAC,KAAK,IAAKA,QAAO,CAAC,IAAI;AACrD,mBAAW,mBAAmB,sBAAsB;AAAA,MACrD;AAED,YAAM,YAAY,IAAI,WAAW,IAAIC,KAAIC,EAAC;AAE1C,UAAI,CAAC,UAAU,QAAQ;AACrB,mBAAW,mBAAmB,iCAAiC;AAAA,MAChE;AAED,UAAI,SAAS,GACX,MAAM;AAER,YAAM,UAAU,IAAI;AACpB,YAAM,YAAY,IAAI,WAAW,CAAC;AAClC,YAAM,kBAAkB,IAAI,WAAW,OAAO;AAC9C,UAAI,gBAAgBA;AAGpB,aAAO,gBAAgB,KAAK,MAAMF,QAAO,YAAY;AACnD,YAAI,MAAM,IAAIA,QAAO,YAAY;AAC/B,qBAAW,eAAe;AAAA,QAC3B;AAED,kBAAU,CAAC,IAAIA,QAAO,KAAK;AAC3B,kBAAU,CAAC,IAAIA,QAAO,KAAK;AAC3B,kBAAU,CAAC,IAAIA,QAAO,KAAK;AAC3B,kBAAU,CAAC,IAAIA,QAAO,KAAK;AAE3B,YAAI,KAAK,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC,MAAO,UAAU,CAAC,KAAK,IAAK,UAAU,CAAC,MAAM,gBAAgB;AACpG,qBAAW,mBAAmB,0BAA0B;AAAA,QACzD;AAID,YAAI,MAAM,GACR;AAEF,eAAO,MAAM,WAAW,MAAMA,QAAO,YAAY;AAC/C,kBAAQA,QAAO,KAAK;AACpB,gBAAM,eAAe,QAAQ;AAC7B,cAAI;AAAc,qBAAS;AAE3B,cAAI,MAAM,SAAS,MAAM,QAAQ,SAAS;AACxC,uBAAW,mBAAmB,mBAAmB;AAAA,UAClD;AAED,cAAI,cAAc;AAEhB,kBAAM,YAAYA,QAAO,KAAK;AAC9B,qBAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,8BAAgB,KAAK,IAAI;AAAA,YAC1B;AAAA,UAEf,OAAmB;AAEL,4BAAgB,IAAIA,QAAO,SAAS,KAAK,MAAM,KAAK,GAAG,GAAG;AAC1D,mBAAO;AACP,mBAAO;AAAA,UACR;AAAA,QACF;AAID,cAAM,IAAI;AACV,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAI,MAAM;AACV,oBAAU,MAAM,IAAI,gBAAgB,IAAI,GAAG;AAC3C,iBAAO;AACP,oBAAU,SAAS,CAAC,IAAI,gBAAgB,IAAI,GAAG;AAC/C,iBAAO;AACP,oBAAU,SAAS,CAAC,IAAI,gBAAgB,IAAI,GAAG;AAC/C,iBAAO;AACP,oBAAU,SAAS,CAAC,IAAI,gBAAgB,IAAI,GAAG;AAC/C,oBAAU;AAAA,QACX;AAED;AAAA,MACD;AAED,aAAO;AAAA,IACR;AAEH,UAAM,qBAAqB,SAAU,aAAa,cAAc,WAAW,YAAY;AACrF,YAAM,IAAI,YAAY,eAAe,CAAC;AACtC,YAAM,QAAQ,KAAK,IAAI,GAAK,IAAI,GAAK,IAAI;AAEzC,gBAAU,aAAa,CAAC,IAAI,YAAY,eAAe,CAAC,IAAI;AAC5D,gBAAU,aAAa,CAAC,IAAI,YAAY,eAAe,CAAC,IAAI;AAC5D,gBAAU,aAAa,CAAC,IAAI,YAAY,eAAe,CAAC,IAAI;AAC5D,gBAAU,aAAa,CAAC,IAAI;AAAA,IAC7B;AAED,UAAM,oBAAoB,SAAU,aAAa,cAAc,WAAW,YAAY;AACpF,YAAM,IAAI,YAAY,eAAe,CAAC;AACtC,YAAM,QAAQ,KAAK,IAAI,GAAK,IAAI,GAAK,IAAI;AAGzC,gBAAU,aAAa,CAAC,IAAIG,MAAS,UAAC,YAAY,KAAK,IAAI,YAAY,eAAe,CAAC,IAAI,OAAO,KAAK,CAAC;AACxG,gBAAU,aAAa,CAAC,IAAIA,MAAS,UAAC,YAAY,KAAK,IAAI,YAAY,eAAe,CAAC,IAAI,OAAO,KAAK,CAAC;AACxG,gBAAU,aAAa,CAAC,IAAIA,MAAS,UAAC,YAAY,KAAK,IAAI,YAAY,eAAe,CAAC,IAAI,OAAO,KAAK,CAAC;AACxG,gBAAU,aAAa,CAAC,IAAIA,MAAAA,UAAU,YAAY,CAAC;AAAA,IACpD;AAED,UAAM,YAAY,IAAI,WAAW,MAAM;AACvC,cAAU,MAAM;AAChB,UAAM,mBAAmB,gBAAgB,SAAS;AAElD,UAAM,IAAI,iBAAiB,OACzB,IAAI,iBAAiB,QACrB,kBAAkB,oBAAoB,UAAU,SAAS,UAAU,GAAG,GAAG,GAAG,CAAC;AAE/E,QAAI,MAAM;AACV,QAAI;AAEJ,YAAQ,KAAK,MAAI;AAAA,MACf,KAAKC,MAAS;AACZ,sBAAc,gBAAgB,SAAS;AACvC,cAAM,aAAa,IAAI,aAAa,cAAc,CAAC;AAEnD,iBAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,6BAAmB,iBAAiB,IAAI,GAAG,YAAY,IAAI,CAAC;AAAA,QAC7D;AAED,eAAO;AACP,eAAOA,MAAS;AAChB;AAAA,MAEF,KAAKL,MAAa;AAChB,sBAAc,gBAAgB,SAAS;AACvC,cAAM,YAAY,IAAI,YAAY,cAAc,CAAC;AAEjD,iBAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,4BAAkB,iBAAiB,IAAI,GAAG,WAAW,IAAI,CAAC;AAAA,QAC3D;AAED,eAAO;AACP,eAAOA,MAAa;AACpB;AAAA,MAEF;AACE,cAAM,IAAI,MAAM,yCAAyC,KAAK,IAAI;AAAA,IAErE;AAED,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,iBAAiB;AAAA,MACzB,OAAO,iBAAiB;AAAA,MACxB,UAAU,iBAAiB;AAAA,MAC3B;AAAA,IACD;AAAA,EACF;AAAA,EAED,YAAY,OAAO;AACjB,SAAK,OAAO;AACZ,WAAO;AAAA,EACR;AAAA,EAED,KAAK,KAAK,QAAQ,YAAY,SAAS;AACrC,aAAS,eAAe,SAAS,SAAS;AACxC,cAAQ,QAAQ,MAAI;AAAA,QAClB,KAAKK;QACL,KAAKL,MAAa;AAChB,cAAI,gBAAgB;AAAS,oBAAQ,aAAa;AAAA;AAC7C,oBAAQ,WAAW;AACxB,kBAAQ,YAAYM,MAAY;AAChC,kBAAQ,YAAYA,MAAY;AAChC,kBAAQ,kBAAkB;AAC1B,kBAAQ,QAAQ;AAEhB;AAAA,MACH;AAED,UAAI;AAAQ,eAAO,SAAS,OAAO;AAAA,IACpC;AAED,WAAO,MAAM,KAAK,KAAK,gBAAgB,YAAY,OAAO;AAAA,EAC3D;AACH;;"}
|
package/loaders/RGBELoader.js
CHANGED
@@ -6,22 +6,18 @@ class RGBELoader extends DataTextureLoader {
|
|
6
6
|
}
|
7
7
|
// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html
|
8
8
|
parse(buffer) {
|
9
|
-
const
|
9
|
+
const rgbe_read_error = 1, rgbe_write_error = 2, rgbe_format_error = 3, rgbe_memory_error = 4, rgbe_error = function(rgbe_error_code, msg) {
|
10
10
|
switch (rgbe_error_code) {
|
11
11
|
case rgbe_read_error:
|
12
|
-
|
13
|
-
break;
|
12
|
+
throw new Error("THREE.RGBELoader: Read Error: " + (msg || ""));
|
14
13
|
case rgbe_write_error:
|
15
|
-
|
16
|
-
break;
|
14
|
+
throw new Error("THREE.RGBELoader: Write Error: " + (msg || ""));
|
17
15
|
case rgbe_format_error:
|
18
|
-
|
19
|
-
break;
|
16
|
+
throw new Error("THREE.RGBELoader: Bad File Format: " + (msg || ""));
|
20
17
|
default:
|
21
18
|
case rgbe_memory_error:
|
22
|
-
|
19
|
+
throw new Error("THREE.RGBELoader: Memory Error: " + (msg || ""));
|
23
20
|
}
|
24
|
-
return RGBE_RETURN_FAILURE;
|
25
21
|
}, RGBE_VALID_PROGRAMTYPE = 1, RGBE_VALID_FORMAT = 2, RGBE_VALID_DIMENSIONS = 4, NEWLINE = "\n", fgets = function(buffer2, lineLimit, consume) {
|
26
22
|
const chunkSize = 128;
|
27
23
|
lineLimit = !lineLimit ? 1024 : lineLimit;
|
@@ -52,10 +48,10 @@ class RGBELoader extends DataTextureLoader {
|
|
52
48
|
};
|
53
49
|
let line, match;
|
54
50
|
if (buffer2.pos >= buffer2.byteLength || !(line = fgets(buffer2))) {
|
55
|
-
|
51
|
+
rgbe_error(rgbe_read_error, "no header found");
|
56
52
|
}
|
57
53
|
if (!(match = line.match(magic_token_re))) {
|
58
|
-
|
54
|
+
rgbe_error(rgbe_format_error, "bad initial token");
|
59
55
|
}
|
60
56
|
header.valid |= RGBE_VALID_PROGRAMTYPE;
|
61
57
|
header.programtype = match[1];
|
@@ -88,14 +84,14 @@ class RGBELoader extends DataTextureLoader {
|
|
88
84
|
break;
|
89
85
|
}
|
90
86
|
if (!(header.valid & RGBE_VALID_FORMAT)) {
|
91
|
-
|
87
|
+
rgbe_error(rgbe_format_error, "missing format specifier");
|
92
88
|
}
|
93
89
|
if (!(header.valid & RGBE_VALID_DIMENSIONS)) {
|
94
|
-
|
90
|
+
rgbe_error(rgbe_format_error, "missing image size specifier");
|
95
91
|
}
|
96
92
|
return header;
|
97
|
-
}, RGBE_ReadPixels_RLE = function(buffer2,
|
98
|
-
const scanline_width =
|
93
|
+
}, RGBE_ReadPixels_RLE = function(buffer2, w2, h2) {
|
94
|
+
const scanline_width = w2;
|
99
95
|
if (
|
100
96
|
// run length encoding is not allowed so read flat
|
101
97
|
scanline_width < 8 || scanline_width > 32767 || // this file is not run length encoded
|
@@ -104,27 +100,27 @@ class RGBELoader extends DataTextureLoader {
|
|
104
100
|
return new Uint8Array(buffer2);
|
105
101
|
}
|
106
102
|
if (scanline_width !== (buffer2[2] << 8 | buffer2[3])) {
|
107
|
-
|
103
|
+
rgbe_error(rgbe_format_error, "wrong scanline width");
|
108
104
|
}
|
109
|
-
const data_rgba = new Uint8Array(4 *
|
105
|
+
const data_rgba = new Uint8Array(4 * w2 * h2);
|
110
106
|
if (!data_rgba.length) {
|
111
|
-
|
107
|
+
rgbe_error(rgbe_memory_error, "unable to allocate buffer space");
|
112
108
|
}
|
113
109
|
let offset = 0, pos = 0;
|
114
110
|
const ptr_end = 4 * scanline_width;
|
115
111
|
const rgbeStart = new Uint8Array(4);
|
116
112
|
const scanline_buffer = new Uint8Array(ptr_end);
|
117
|
-
let num_scanlines =
|
113
|
+
let num_scanlines = h2;
|
118
114
|
while (num_scanlines > 0 && pos < buffer2.byteLength) {
|
119
115
|
if (pos + 4 > buffer2.byteLength) {
|
120
|
-
|
116
|
+
rgbe_error(rgbe_read_error);
|
121
117
|
}
|
122
118
|
rgbeStart[0] = buffer2[pos++];
|
123
119
|
rgbeStart[1] = buffer2[pos++];
|
124
120
|
rgbeStart[2] = buffer2[pos++];
|
125
121
|
rgbeStart[3] = buffer2[pos++];
|
126
122
|
if (2 != rgbeStart[0] || 2 != rgbeStart[1] || (rgbeStart[2] << 8 | rgbeStart[3]) != scanline_width) {
|
127
|
-
|
123
|
+
rgbe_error(rgbe_format_error, "bad rgbe scanline format");
|
128
124
|
}
|
129
125
|
let ptr = 0, count;
|
130
126
|
while (ptr < ptr_end && pos < buffer2.byteLength) {
|
@@ -133,7 +129,7 @@ class RGBELoader extends DataTextureLoader {
|
|
133
129
|
if (isEncodedRun)
|
134
130
|
count -= 128;
|
135
131
|
if (0 === count || ptr + count > ptr_end) {
|
136
|
-
|
132
|
+
rgbe_error(rgbe_format_error, "bad scanline data");
|
137
133
|
}
|
138
134
|
if (isEncodedRun) {
|
139
135
|
const byteValue = buffer2[pos++];
|
@@ -181,46 +177,40 @@ class RGBELoader extends DataTextureLoader {
|
|
181
177
|
const byteArray = new Uint8Array(buffer);
|
182
178
|
byteArray.pos = 0;
|
183
179
|
const rgbe_header_info = RGBE_ReadHeader(byteArray);
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
for (let j = 0; j < numElements; j++) {
|
194
|
-
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4);
|
195
|
-
}
|
196
|
-
data = floatArray;
|
197
|
-
type = FloatType;
|
198
|
-
break;
|
199
|
-
case HalfFloatType:
|
200
|
-
numElements = image_rgba_data.length / 4;
|
201
|
-
const halfArray = new Uint16Array(numElements * 4);
|
202
|
-
for (let j = 0; j < numElements; j++) {
|
203
|
-
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4);
|
204
|
-
}
|
205
|
-
data = halfArray;
|
206
|
-
type = HalfFloatType;
|
207
|
-
break;
|
208
|
-
default:
|
209
|
-
console.error("THREE.RGBELoader: unsupported type: ", this.type);
|
210
|
-
break;
|
180
|
+
const w = rgbe_header_info.width, h = rgbe_header_info.height, image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h);
|
181
|
+
let data, type;
|
182
|
+
let numElements;
|
183
|
+
switch (this.type) {
|
184
|
+
case FloatType:
|
185
|
+
numElements = image_rgba_data.length / 4;
|
186
|
+
const floatArray = new Float32Array(numElements * 4);
|
187
|
+
for (let j = 0; j < numElements; j++) {
|
188
|
+
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4);
|
211
189
|
}
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
}
|
221
|
-
|
190
|
+
data = floatArray;
|
191
|
+
type = FloatType;
|
192
|
+
break;
|
193
|
+
case HalfFloatType:
|
194
|
+
numElements = image_rgba_data.length / 4;
|
195
|
+
const halfArray = new Uint16Array(numElements * 4);
|
196
|
+
for (let j = 0; j < numElements; j++) {
|
197
|
+
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4);
|
198
|
+
}
|
199
|
+
data = halfArray;
|
200
|
+
type = HalfFloatType;
|
201
|
+
break;
|
202
|
+
default:
|
203
|
+
throw new Error("THREE.RGBELoader: Unsupported type: " + this.type);
|
222
204
|
}
|
223
|
-
return
|
205
|
+
return {
|
206
|
+
width: w,
|
207
|
+
height: h,
|
208
|
+
data,
|
209
|
+
header: rgbe_header_info.string,
|
210
|
+
gamma: rgbe_header_info.gamma,
|
211
|
+
exposure: rgbe_header_info.exposure,
|
212
|
+
type
|
213
|
+
};
|
224
214
|
}
|
225
215
|
setDataType(value) {
|
226
216
|
this.type = value;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RGBELoader.js","sources":["../../src/loaders/RGBELoader.js"],"sourcesContent":["import { DataTextureLoader, DataUtils, FloatType, HalfFloatType, LinearFilter } from 'three'\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n constructor(manager) {\n super(manager)\n\n this.type = HalfFloatType\n }\n\n // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n parse(buffer) {\n const /* return codes for rgbe routines */\n //RGBE_RETURN_SUCCESS = 0,\n RGBE_RETURN_FAILURE = -1,\n /* default error routine. change this to change error handling */\n rgbe_read_error = 1,\n rgbe_write_error = 2,\n rgbe_format_error = 3,\n rgbe_memory_error = 4,\n rgbe_error = function (rgbe_error_code, msg) {\n switch (rgbe_error_code) {\n case rgbe_read_error:\n console.error('THREE.RGBELoader Read Error: ' + (msg || ''))\n break\n case rgbe_write_error:\n console.error('THREE.RGBELoader Write Error: ' + (msg || ''))\n break\n case rgbe_format_error:\n console.error('THREE.RGBELoader Bad File Format: ' + (msg || ''))\n break\n default:\n case rgbe_memory_error:\n console.error('THREE.RGBELoader: Error: ' + (msg || ''))\n }\n\n return RGBE_RETURN_FAILURE\n },\n /* offsets to red, green, and blue components in a data (float) pixel */\n //RGBE_DATA_RED = 0,\n //RGBE_DATA_GREEN = 1,\n //RGBE_DATA_BLUE = 2,\n\n /* number of floats per pixel, use 4 since stored in rgba image format */\n //RGBE_DATA_SIZE = 4,\n\n /* flags indicating which fields in an rgbe_header_info are valid */\n RGBE_VALID_PROGRAMTYPE = 1,\n RGBE_VALID_FORMAT = 2,\n RGBE_VALID_DIMENSIONS = 4,\n NEWLINE = '\\n',\n fgets = function (buffer, lineLimit, consume) {\n const chunkSize = 128\n\n lineLimit = !lineLimit ? 1024 : lineLimit\n let p = buffer.pos,\n i = -1,\n len = 0,\n s = '',\n chunk = String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n\n while (0 > (i = chunk.indexOf(NEWLINE)) && len < lineLimit && p < buffer.byteLength) {\n s += chunk\n len += chunk.length\n p += chunkSize\n chunk += String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n }\n\n if (-1 < i) {\n /*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n if (false !== consume) buffer.pos += len + i + 1\n return s + chunk.slice(0, i)\n }\n\n return false\n },\n /* minimal header reading. modify if you want to parse more information */\n RGBE_ReadHeader = function (buffer) {\n // regexes to parse header info fields\n const magic_token_re = /^#\\?(\\S+)/,\n gamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n exposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n format_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n dimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n // RGBE format header struct\n header = {\n valid: 0 /* indicate which fields are valid */,\n\n string: '' /* the actual header string */,\n\n comments: '' /* comments found in header */,\n\n programtype: 'RGBE' /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */,\n\n format: '' /* RGBE format, default 32-bit_rle_rgbe */,\n\n gamma: 1.0 /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */,\n\n exposure: 1.0 /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */,\n\n width: 0,\n height: 0 /* image dimensions, width/height */,\n }\n\n let line, match\n\n if (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) {\n return rgbe_error(rgbe_read_error, 'no header found')\n }\n\n /* if you want to require the magic token then uncomment the next line */\n if (!(match = line.match(magic_token_re))) {\n return rgbe_error(rgbe_format_error, 'bad initial token')\n }\n\n header.valid |= RGBE_VALID_PROGRAMTYPE\n header.programtype = match[1]\n header.string += line + '\\n'\n\n while (true) {\n line = fgets(buffer)\n if (false === line) break\n header.string += line + '\\n'\n\n if ('#' === line.charAt(0)) {\n header.comments += line + '\\n'\n continue // comment line\n }\n\n if ((match = line.match(gamma_re))) {\n header.gamma = parseFloat(match[1])\n }\n\n if ((match = line.match(exposure_re))) {\n header.exposure = parseFloat(match[1])\n }\n\n if ((match = line.match(format_re))) {\n header.valid |= RGBE_VALID_FORMAT\n header.format = match[1] //'32-bit_rle_rgbe';\n }\n\n if ((match = line.match(dimensions_re))) {\n header.valid |= RGBE_VALID_DIMENSIONS\n header.height = parseInt(match[1], 10)\n header.width = parseInt(match[2], 10)\n }\n\n if (header.valid & RGBE_VALID_FORMAT && header.valid & RGBE_VALID_DIMENSIONS) break\n }\n\n if (!(header.valid & RGBE_VALID_FORMAT)) {\n return rgbe_error(rgbe_format_error, 'missing format specifier')\n }\n\n if (!(header.valid & RGBE_VALID_DIMENSIONS)) {\n return rgbe_error(rgbe_format_error, 'missing image size specifier')\n }\n\n return header\n },\n RGBE_ReadPixels_RLE = function (buffer, w, h) {\n const scanline_width = w\n\n if (\n // run length encoding is not allowed so read flat\n scanline_width < 8 ||\n scanline_width > 0x7fff ||\n // this file is not run length encoded\n 2 !== buffer[0] ||\n 2 !== buffer[1] ||\n buffer[2] & 0x80\n ) {\n // return the flat buffer\n return new Uint8Array(buffer)\n }\n\n if (scanline_width !== ((buffer[2] << 8) | buffer[3])) {\n return rgbe_error(rgbe_format_error, 'wrong scanline width')\n }\n\n const data_rgba = new Uint8Array(4 * w * h)\n\n if (!data_rgba.length) {\n return rgbe_error(rgbe_memory_error, 'unable to allocate buffer space')\n }\n\n let offset = 0,\n pos = 0\n\n const ptr_end = 4 * scanline_width\n const rgbeStart = new Uint8Array(4)\n const scanline_buffer = new Uint8Array(ptr_end)\n let num_scanlines = h\n\n // read in each successive scanline\n while (num_scanlines > 0 && pos < buffer.byteLength) {\n if (pos + 4 > buffer.byteLength) {\n return rgbe_error(rgbe_read_error)\n }\n\n rgbeStart[0] = buffer[pos++]\n rgbeStart[1] = buffer[pos++]\n rgbeStart[2] = buffer[pos++]\n rgbeStart[3] = buffer[pos++]\n\n if (2 != rgbeStart[0] || 2 != rgbeStart[1] || ((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width) {\n return rgbe_error(rgbe_format_error, 'bad rgbe scanline format')\n }\n\n // read each of the four channels for the scanline into the buffer\n // first red, then green, then blue, then exponent\n let ptr = 0,\n count\n\n while (ptr < ptr_end && pos < buffer.byteLength) {\n count = buffer[pos++]\n const isEncodedRun = count > 128\n if (isEncodedRun) count -= 128\n\n if (0 === count || ptr + count > ptr_end) {\n return rgbe_error(rgbe_format_error, 'bad scanline data')\n }\n\n if (isEncodedRun) {\n // a (encoded) run of the same value\n const byteValue = buffer[pos++]\n for (let i = 0; i < count; i++) {\n scanline_buffer[ptr++] = byteValue\n }\n //ptr += count;\n } else {\n // a literal-run\n scanline_buffer.set(buffer.subarray(pos, pos + count), ptr)\n ptr += count\n pos += count\n }\n }\n\n // now convert data from buffer into rgba\n // first red, then green, then blue, then exponent (alpha)\n const l = scanline_width //scanline_buffer.byteLength;\n for (let i = 0; i < l; i++) {\n let off = 0\n data_rgba[offset] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 1] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 2] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 3] = scanline_buffer[i + off]\n offset += 4\n }\n\n num_scanlines--\n }\n\n return data_rgba\n }\n\n const RGBEByteToRGBFloat = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n destArray[destOffset + 0] = sourceArray[sourceOffset + 0] * scale\n destArray[destOffset + 1] = sourceArray[sourceOffset + 1] * scale\n destArray[destOffset + 2] = sourceArray[sourceOffset + 2] * scale\n destArray[destOffset + 3] = 1\n }\n\n const RGBEByteToRGBHalf = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n // clamping to 65504, the maximum representable value in float16\n destArray[destOffset + 0] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504))\n destArray[destOffset + 1] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504))\n destArray[destOffset + 2] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504))\n destArray[destOffset + 3] = DataUtils.toHalfFloat(1)\n }\n\n const byteArray = new Uint8Array(buffer)\n byteArray.pos = 0\n const rgbe_header_info = RGBE_ReadHeader(byteArray)\n\n if (RGBE_RETURN_FAILURE !== rgbe_header_info) {\n const w = rgbe_header_info.width,\n h = rgbe_header_info.height,\n image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h)\n\n if (RGBE_RETURN_FAILURE !== image_rgba_data) {\n let data, type\n let numElements\n\n switch (this.type) {\n case FloatType:\n numElements = image_rgba_data.length / 4\n const floatArray = new Float32Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4)\n }\n\n data = floatArray\n type = FloatType\n break\n\n case HalfFloatType:\n numElements = image_rgba_data.length / 4\n const halfArray = new Uint16Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4)\n }\n\n data = halfArray\n type = HalfFloatType\n break\n\n default:\n console.error('THREE.RGBELoader: unsupported type: ', this.type)\n break\n }\n\n return {\n width: w,\n height: h,\n data: data,\n header: rgbe_header_info.string,\n gamma: rgbe_header_info.gamma,\n exposure: rgbe_header_info.exposure,\n type: type,\n }\n }\n }\n\n return null\n }\n\n setDataType(value) {\n this.type = value\n return this\n }\n\n load(url, onLoad, onProgress, onError) {\n function onLoadCallback(texture, texData) {\n switch (texture.type) {\n case FloatType:\n case HalfFloatType:\n if ('colorSpace' in texture) texture.colorSpace = 'srgb-linear'\n else texture.encoding = 3000 // LinearEncoding\n texture.minFilter = LinearFilter\n texture.magFilter = LinearFilter\n texture.generateMipmaps = false\n texture.flipY = true\n\n break\n }\n\n if (onLoad) onLoad(texture, texData)\n }\n\n return super.load(url, onLoadCallback, onProgress, onError)\n }\n}\n\nexport { RGBELoader }\n"],"names":["buffer"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"RGBELoader.js","sources":["../../src/loaders/RGBELoader.js"],"sourcesContent":["import { DataTextureLoader, DataUtils, FloatType, HalfFloatType, LinearFilter } from 'three'\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n constructor(manager) {\n super(manager)\n\n this.type = HalfFloatType\n }\n\n // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n parse(buffer) {\n const /* default error routine. change this to change error handling */\n rgbe_read_error = 1,\n rgbe_write_error = 2,\n rgbe_format_error = 3,\n rgbe_memory_error = 4,\n rgbe_error = function (rgbe_error_code, msg) {\n switch (rgbe_error_code) {\n case rgbe_read_error:\n throw new Error('THREE.RGBELoader: Read Error: ' + (msg || ''))\n case rgbe_write_error:\n throw new Error('THREE.RGBELoader: Write Error: ' + (msg || ''))\n case rgbe_format_error:\n throw new Error('THREE.RGBELoader: Bad File Format: ' + (msg || ''))\n default:\n case rgbe_memory_error:\n throw new Error('THREE.RGBELoader: Memory Error: ' + (msg || ''))\n }\n },\n /* offsets to red, green, and blue components in a data (float) pixel */\n //RGBE_DATA_RED = 0,\n //RGBE_DATA_GREEN = 1,\n //RGBE_DATA_BLUE = 2,\n\n /* number of floats per pixel, use 4 since stored in rgba image format */\n //RGBE_DATA_SIZE = 4,\n\n /* flags indicating which fields in an rgbe_header_info are valid */\n RGBE_VALID_PROGRAMTYPE = 1,\n RGBE_VALID_FORMAT = 2,\n RGBE_VALID_DIMENSIONS = 4,\n NEWLINE = '\\n',\n fgets = function (buffer, lineLimit, consume) {\n const chunkSize = 128\n\n lineLimit = !lineLimit ? 1024 : lineLimit\n let p = buffer.pos,\n i = -1,\n len = 0,\n s = '',\n chunk = String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n\n while (0 > (i = chunk.indexOf(NEWLINE)) && len < lineLimit && p < buffer.byteLength) {\n s += chunk\n len += chunk.length\n p += chunkSize\n chunk += String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)))\n }\n\n if (-1 < i) {\n /*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n if (false !== consume) buffer.pos += len + i + 1\n return s + chunk.slice(0, i)\n }\n\n return false\n },\n /* minimal header reading. modify if you want to parse more information */\n RGBE_ReadHeader = function (buffer) {\n // regexes to parse header info fields\n const magic_token_re = /^#\\?(\\S+)/,\n gamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n exposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n format_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n dimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n // RGBE format header struct\n header = {\n valid: 0 /* indicate which fields are valid */,\n\n string: '' /* the actual header string */,\n\n comments: '' /* comments found in header */,\n\n programtype: 'RGBE' /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */,\n\n format: '' /* RGBE format, default 32-bit_rle_rgbe */,\n\n gamma: 1.0 /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */,\n\n exposure: 1.0 /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */,\n\n width: 0,\n height: 0 /* image dimensions, width/height */,\n }\n\n let line, match\n\n if (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) {\n rgbe_error(rgbe_read_error, 'no header found')\n }\n\n /* if you want to require the magic token then uncomment the next line */\n if (!(match = line.match(magic_token_re))) {\n rgbe_error(rgbe_format_error, 'bad initial token')\n }\n\n header.valid |= RGBE_VALID_PROGRAMTYPE\n header.programtype = match[1]\n header.string += line + '\\n'\n\n while (true) {\n line = fgets(buffer)\n if (false === line) break\n header.string += line + '\\n'\n\n if ('#' === line.charAt(0)) {\n header.comments += line + '\\n'\n continue // comment line\n }\n\n if ((match = line.match(gamma_re))) {\n header.gamma = parseFloat(match[1])\n }\n\n if ((match = line.match(exposure_re))) {\n header.exposure = parseFloat(match[1])\n }\n\n if ((match = line.match(format_re))) {\n header.valid |= RGBE_VALID_FORMAT\n header.format = match[1] //'32-bit_rle_rgbe';\n }\n\n if ((match = line.match(dimensions_re))) {\n header.valid |= RGBE_VALID_DIMENSIONS\n header.height = parseInt(match[1], 10)\n header.width = parseInt(match[2], 10)\n }\n\n if (header.valid & RGBE_VALID_FORMAT && header.valid & RGBE_VALID_DIMENSIONS) break\n }\n\n if (!(header.valid & RGBE_VALID_FORMAT)) {\n rgbe_error(rgbe_format_error, 'missing format specifier')\n }\n\n if (!(header.valid & RGBE_VALID_DIMENSIONS)) {\n rgbe_error(rgbe_format_error, 'missing image size specifier')\n }\n\n return header\n },\n RGBE_ReadPixels_RLE = function (buffer, w, h) {\n const scanline_width = w\n\n if (\n // run length encoding is not allowed so read flat\n scanline_width < 8 ||\n scanline_width > 0x7fff ||\n // this file is not run length encoded\n 2 !== buffer[0] ||\n 2 !== buffer[1] ||\n buffer[2] & 0x80\n ) {\n // return the flat buffer\n return new Uint8Array(buffer)\n }\n\n if (scanline_width !== ((buffer[2] << 8) | buffer[3])) {\n rgbe_error(rgbe_format_error, 'wrong scanline width')\n }\n\n const data_rgba = new Uint8Array(4 * w * h)\n\n if (!data_rgba.length) {\n rgbe_error(rgbe_memory_error, 'unable to allocate buffer space')\n }\n\n let offset = 0,\n pos = 0\n\n const ptr_end = 4 * scanline_width\n const rgbeStart = new Uint8Array(4)\n const scanline_buffer = new Uint8Array(ptr_end)\n let num_scanlines = h\n\n // read in each successive scanline\n while (num_scanlines > 0 && pos < buffer.byteLength) {\n if (pos + 4 > buffer.byteLength) {\n rgbe_error(rgbe_read_error)\n }\n\n rgbeStart[0] = buffer[pos++]\n rgbeStart[1] = buffer[pos++]\n rgbeStart[2] = buffer[pos++]\n rgbeStart[3] = buffer[pos++]\n\n if (2 != rgbeStart[0] || 2 != rgbeStart[1] || ((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width) {\n rgbe_error(rgbe_format_error, 'bad rgbe scanline format')\n }\n\n // read each of the four channels for the scanline into the buffer\n // first red, then green, then blue, then exponent\n let ptr = 0,\n count\n\n while (ptr < ptr_end && pos < buffer.byteLength) {\n count = buffer[pos++]\n const isEncodedRun = count > 128\n if (isEncodedRun) count -= 128\n\n if (0 === count || ptr + count > ptr_end) {\n rgbe_error(rgbe_format_error, 'bad scanline data')\n }\n\n if (isEncodedRun) {\n // a (encoded) run of the same value\n const byteValue = buffer[pos++]\n for (let i = 0; i < count; i++) {\n scanline_buffer[ptr++] = byteValue\n }\n //ptr += count;\n } else {\n // a literal-run\n scanline_buffer.set(buffer.subarray(pos, pos + count), ptr)\n ptr += count\n pos += count\n }\n }\n\n // now convert data from buffer into rgba\n // first red, then green, then blue, then exponent (alpha)\n const l = scanline_width //scanline_buffer.byteLength;\n for (let i = 0; i < l; i++) {\n let off = 0\n data_rgba[offset] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 1] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 2] = scanline_buffer[i + off]\n off += scanline_width //1;\n data_rgba[offset + 3] = scanline_buffer[i + off]\n offset += 4\n }\n\n num_scanlines--\n }\n\n return data_rgba\n }\n\n const RGBEByteToRGBFloat = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n destArray[destOffset + 0] = sourceArray[sourceOffset + 0] * scale\n destArray[destOffset + 1] = sourceArray[sourceOffset + 1] * scale\n destArray[destOffset + 2] = sourceArray[sourceOffset + 2] * scale\n destArray[destOffset + 3] = 1\n }\n\n const RGBEByteToRGBHalf = function (sourceArray, sourceOffset, destArray, destOffset) {\n const e = sourceArray[sourceOffset + 3]\n const scale = Math.pow(2.0, e - 128.0) / 255.0\n\n // clamping to 65504, the maximum representable value in float16\n destArray[destOffset + 0] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504))\n destArray[destOffset + 1] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504))\n destArray[destOffset + 2] = DataUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504))\n destArray[destOffset + 3] = DataUtils.toHalfFloat(1)\n }\n\n const byteArray = new Uint8Array(buffer)\n byteArray.pos = 0\n const rgbe_header_info = RGBE_ReadHeader(byteArray)\n\n const w = rgbe_header_info.width,\n h = rgbe_header_info.height,\n image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h)\n\n let data, type\n let numElements\n\n switch (this.type) {\n case FloatType:\n numElements = image_rgba_data.length / 4\n const floatArray = new Float32Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4)\n }\n\n data = floatArray\n type = FloatType\n break\n\n case HalfFloatType:\n numElements = image_rgba_data.length / 4\n const halfArray = new Uint16Array(numElements * 4)\n\n for (let j = 0; j < numElements; j++) {\n RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4)\n }\n\n data = halfArray\n type = HalfFloatType\n break\n\n default:\n throw new Error('THREE.RGBELoader: Unsupported type: ' + this.type)\n break\n }\n\n return {\n width: w,\n height: h,\n data: data,\n header: rgbe_header_info.string,\n gamma: rgbe_header_info.gamma,\n exposure: rgbe_header_info.exposure,\n type: type,\n }\n }\n\n setDataType(value) {\n this.type = value\n return this\n }\n\n load(url, onLoad, onProgress, onError) {\n function onLoadCallback(texture, texData) {\n switch (texture.type) {\n case FloatType:\n case HalfFloatType:\n if ('colorSpace' in texture) texture.colorSpace = 'srgb-linear'\n else texture.encoding = 3000 // LinearEncoding\n texture.minFilter = LinearFilter\n texture.magFilter = LinearFilter\n texture.generateMipmaps = false\n texture.flipY = true\n\n break\n }\n\n if (onLoad) onLoad(texture, texData)\n }\n\n return super.load(url, onLoadCallback, onProgress, onError)\n }\n}\n\nexport { RGBELoader }\n"],"names":["buffer","w","h"],"mappings":"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"}
|