three-stdlib 2.29.7 → 2.29.8
Sign up to get free protection for your applications and to get access to all the features.
- 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/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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"}
|