@babylonjs/core 7.20.0 → 7.20.1

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.
Files changed (117) hide show
  1. package/Bones/bone.js +3 -3
  2. package/Bones/bone.js.map +1 -1
  3. package/Bones/boneLookController.js +3 -3
  4. package/Bones/boneLookController.js.map +1 -1
  5. package/Compat/compatibilityOptions.d.ts +13 -6
  6. package/Compat/compatibilityOptions.js +20 -4
  7. package/Compat/compatibilityOptions.js.map +1 -1
  8. package/Compat/index.d.ts +1 -1
  9. package/Compat/index.js +1 -1
  10. package/Compat/index.js.map +1 -1
  11. package/Culling/boundingBox.js +5 -5
  12. package/Culling/boundingBox.js.map +1 -1
  13. package/Culling/boundingInfo.js +2 -2
  14. package/Culling/boundingInfo.js.map +1 -1
  15. package/Culling/boundingSphere.js +2 -2
  16. package/Culling/boundingSphere.js.map +1 -1
  17. package/Culling/ray.js +2 -2
  18. package/Culling/ray.js.map +1 -1
  19. package/Debug/debugLayer.d.ts +3 -0
  20. package/Debug/debugLayer.js +15 -0
  21. package/Debug/debugLayer.js.map +1 -1
  22. package/Engines/abstractEngine.js +2 -2
  23. package/Engines/abstractEngine.js.map +1 -1
  24. package/Engines/engine.js +11 -2
  25. package/Engines/engine.js.map +1 -1
  26. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.d.ts +2 -2
  27. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js +1 -1
  28. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphDoNBlock.js.map +1 -1
  29. package/Layers/highlightLayer.js +0 -1
  30. package/Layers/highlightLayer.js.map +1 -1
  31. package/Materials/Textures/Loaders/hdrTextureLoader.js +3 -3
  32. package/Materials/Textures/Loaders/hdrTextureLoader.js.map +1 -1
  33. package/Materials/Textures/hdrCubeTexture.js +2 -2
  34. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  35. package/Materials/Textures/renderTargetTexture.js +2 -2
  36. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  37. package/Materials/Textures/texture.js +3 -3
  38. package/Materials/Textures/texture.js.map +1 -1
  39. package/Maths/math.color.js +3 -3
  40. package/Maths/math.color.js.map +1 -1
  41. package/Maths/math.vector.js +13 -14
  42. package/Maths/math.vector.js.map +1 -1
  43. package/Meshes/Builders/boxBuilder.js +5 -5
  44. package/Meshes/Builders/boxBuilder.js.map +1 -1
  45. package/Meshes/Builders/capsuleBuilder.js +4 -4
  46. package/Meshes/Builders/capsuleBuilder.js.map +1 -1
  47. package/Meshes/Builders/cylinderBuilder.js +8 -8
  48. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  49. package/Meshes/Builders/decalBuilder.js +3 -3
  50. package/Meshes/Builders/decalBuilder.js.map +1 -1
  51. package/Meshes/Builders/discBuilder.js +3 -3
  52. package/Meshes/Builders/discBuilder.js.map +1 -1
  53. package/Meshes/Builders/goldbergBuilder.js +2 -2
  54. package/Meshes/Builders/goldbergBuilder.js.map +1 -1
  55. package/Meshes/Builders/groundBuilder.js +2 -2
  56. package/Meshes/Builders/groundBuilder.js.map +1 -1
  57. package/Meshes/Builders/icoSphereBuilder.js +2 -2
  58. package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
  59. package/Meshes/Builders/planeBuilder.js +5 -5
  60. package/Meshes/Builders/planeBuilder.js.map +1 -1
  61. package/Meshes/Builders/polygonBuilder.js +4 -4
  62. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  63. package/Meshes/Builders/polyhedronBuilder.js +3 -3
  64. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  65. package/Meshes/Builders/ribbonBuilder.js +4 -4
  66. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  67. package/Meshes/Builders/sphereBuilder.js +2 -2
  68. package/Meshes/Builders/sphereBuilder.js.map +1 -1
  69. package/Meshes/Builders/tiledBoxBuilder.js +2 -2
  70. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  71. package/Meshes/Builders/torusBuilder.js +2 -2
  72. package/Meshes/Builders/torusBuilder.js.map +1 -1
  73. package/Meshes/Builders/torusKnotBuilder.js +2 -2
  74. package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
  75. package/Meshes/geometry.js +7 -7
  76. package/Meshes/geometry.js.map +1 -1
  77. package/Misc/HighDynamicRange/hdr.d.ts +40 -42
  78. package/Misc/HighDynamicRange/hdr.js +209 -202
  79. package/Misc/HighDynamicRange/hdr.js.map +1 -1
  80. package/Misc/HighDynamicRange/index.d.ts +1 -1
  81. package/Misc/HighDynamicRange/index.js +1 -1
  82. package/Misc/HighDynamicRange/index.js.map +1 -1
  83. package/Misc/arrayTools.d.ts +12 -17
  84. package/Misc/arrayTools.js +18 -23
  85. package/Misc/arrayTools.js.map +1 -1
  86. package/Misc/dumpTools.d.ts +50 -47
  87. package/Misc/dumpTools.js +153 -143
  88. package/Misc/dumpTools.js.map +1 -1
  89. package/Misc/environmentTextureTools.js +2 -2
  90. package/Misc/environmentTextureTools.js.map +1 -1
  91. package/Misc/equirectangularCapture.js +2 -2
  92. package/Misc/equirectangularCapture.js.map +1 -1
  93. package/Misc/index.d.ts +2 -1
  94. package/Misc/index.js +2 -1
  95. package/Misc/index.js.map +1 -1
  96. package/Misc/rgbdTextureTools.js +1 -0
  97. package/Misc/rgbdTextureTools.js.map +1 -1
  98. package/Misc/screenshotTools.js +3 -3
  99. package/Misc/screenshotTools.js.map +1 -1
  100. package/Physics/v1/physicsImpostor.js +2 -2
  101. package/Physics/v1/physicsImpostor.js.map +1 -1
  102. package/Physics/v2/Plugins/havokPlugin.js +2 -2
  103. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  104. package/PostProcesses/blurPostProcess.js +0 -1
  105. package/PostProcesses/blurPostProcess.js.map +1 -1
  106. package/PostProcesses/passPostProcess.js +0 -2
  107. package/PostProcesses/passPostProcess.js.map +1 -1
  108. package/PostProcesses/postProcess.d.ts +6 -0
  109. package/PostProcesses/postProcess.js +22 -1
  110. package/PostProcesses/postProcess.js.map +1 -1
  111. package/Shaders/ShadersInclude/pbrDebug.js +1 -1
  112. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  113. package/ShadersWGSL/ShadersInclude/pbrDebug.js +1 -1
  114. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  115. package/ShadersWGSL/background.fragment.js +1 -1
  116. package/ShadersWGSL/background.fragment.js.map +1 -1
  117. package/package.json +1 -1
@@ -17,46 +17,44 @@ export interface HDRInfo {
17
17
  dataPosition: number;
18
18
  }
19
19
  /**
20
- * This groups tools to convert HDR texture to native colors array.
20
+ * Reads header information from an RGBE texture stored in a native array.
21
+ * More information on this format are available here:
22
+ * https://en.wikipedia.org/wiki/RGBE_image_format
23
+ *
24
+ * @param uint8array The binary file stored in native array.
25
+ * @returns The header information.
21
26
  */
22
- export declare class HDRTools {
23
- private static _Ldexp;
24
- private static _Rgbe2float;
25
- private static _ReadStringLine;
26
- /**
27
- * Reads header information from an RGBE texture stored in a native array.
28
- * More information on this format are available here:
29
- * https://en.wikipedia.org/wiki/RGBE_image_format
30
- *
31
- * @param uint8array The binary file stored in native array.
32
- * @returns The header information.
33
- */
34
- static RGBE_ReadHeader(uint8array: Uint8Array): HDRInfo;
35
- /**
36
- * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.
37
- * This RGBE texture needs to store the information as a panorama.
38
- *
39
- * More information on this format are available here:
40
- * https://en.wikipedia.org/wiki/RGBE_image_format
41
- *
42
- * @param buffer The binary file stored in an array buffer.
43
- * @param size The expected size of the extracted cubemap.
44
- * @param supersample enable supersampling the cubemap (default: false)
45
- * @returns The Cube Map information.
46
- */
47
- static GetCubeMapTextureData(buffer: ArrayBuffer, size: number, supersample?: boolean): CubeMapInfo;
48
- /**
49
- * Returns the pixels data extracted from an RGBE texture.
50
- * This pixels will be stored left to right up to down in the R G B order in one array.
51
- *
52
- * More information on this format are available here:
53
- * https://en.wikipedia.org/wiki/RGBE_image_format
54
- *
55
- * @param uint8array The binary file stored in an array buffer.
56
- * @param hdrInfo The header information of the file.
57
- * @returns The pixels data in RGB right to left up to down order.
58
- */
59
- static RGBE_ReadPixels(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array;
60
- private static _RGBEReadPixelsRLE;
61
- private static _RGBEReadPixelsNOTRLE;
62
- }
27
+ export declare function RGBE_ReadHeader(uint8array: Uint8Array): HDRInfo;
28
+ /**
29
+ * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.
30
+ * This RGBE texture needs to store the information as a panorama.
31
+ *
32
+ * More information on this format are available here:
33
+ * https://en.wikipedia.org/wiki/RGBE_image_format
34
+ *
35
+ * @param buffer The binary file stored in an array buffer.
36
+ * @param size The expected size of the extracted cubemap.
37
+ * @param supersample enable supersampling the cubemap (default: false)
38
+ * @returns The Cube Map information.
39
+ */
40
+ export declare function GetCubeMapTextureData(buffer: ArrayBuffer, size: number, supersample?: boolean): CubeMapInfo;
41
+ /**
42
+ * Returns the pixels data extracted from an RGBE texture.
43
+ * This pixels will be stored left to right up to down in the R G B order in one array.
44
+ *
45
+ * More information on this format are available here:
46
+ * https://en.wikipedia.org/wiki/RGBE_image_format
47
+ *
48
+ * @param uint8array The binary file stored in an array buffer.
49
+ * @param hdrInfo The header information of the file.
50
+ * @returns The pixels data in RGB right to left up to down order.
51
+ */
52
+ export declare function RGBE_ReadPixels(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array;
53
+ /**
54
+ * @deprecated Use functions separately
55
+ */
56
+ export declare const HDRTools: {
57
+ RGBE_ReadHeader: typeof RGBE_ReadHeader;
58
+ GetCubeMapTextureData: typeof GetCubeMapTextureData;
59
+ RGBE_ReadPixels: typeof RGBE_ReadPixels;
60
+ };
@@ -1,225 +1,232 @@
1
1
  import { PanoramaToCubeMapTools } from "./panoramaToCubemap.js";
2
- /**
3
- * This groups tools to convert HDR texture to native colors array.
4
- */
5
- export class HDRTools {
6
- static _Ldexp(mantissa, exponent) {
7
- if (exponent > 1023) {
8
- return mantissa * Math.pow(2, 1023) * Math.pow(2, exponent - 1023);
9
- }
10
- if (exponent < -1074) {
11
- return mantissa * Math.pow(2, -1074) * Math.pow(2, exponent + 1074);
12
- }
13
- return mantissa * Math.pow(2, exponent);
2
+ /* This groups tools to convert HDR texture to native colors array. */
3
+ function ldexp(mantissa, exponent) {
4
+ if (exponent > 1023) {
5
+ return mantissa * Math.pow(2, 1023) * Math.pow(2, exponent - 1023);
14
6
  }
15
- static _Rgbe2float(float32array, red, green, blue, exponent, index) {
16
- if (exponent > 0) {
17
- /*nonzero pixel*/
18
- exponent = this._Ldexp(1.0, exponent - (128 + 8));
19
- float32array[index + 0] = red * exponent;
20
- float32array[index + 1] = green * exponent;
21
- float32array[index + 2] = blue * exponent;
22
- }
23
- else {
24
- float32array[index + 0] = 0;
25
- float32array[index + 1] = 0;
26
- float32array[index + 2] = 0;
27
- }
7
+ if (exponent < -1074) {
8
+ return mantissa * Math.pow(2, -1074) * Math.pow(2, exponent + 1074);
28
9
  }
29
- static _ReadStringLine(uint8array, startIndex) {
30
- let line = "";
31
- let character = "";
32
- for (let i = startIndex; i < uint8array.length - startIndex; i++) {
33
- character = String.fromCharCode(uint8array[i]);
34
- if (character == "\n") {
35
- break;
36
- }
37
- line += character;
38
- }
39
- return line;
10
+ return mantissa * Math.pow(2, exponent);
11
+ }
12
+ function rgbe2float(float32array, red, green, blue, exponent, index) {
13
+ if (exponent > 0) {
14
+ /*nonzero pixel*/
15
+ exponent = ldexp(1.0, exponent - (128 + 8));
16
+ float32array[index + 0] = red * exponent;
17
+ float32array[index + 1] = green * exponent;
18
+ float32array[index + 2] = blue * exponent;
40
19
  }
41
- /**
42
- * Reads header information from an RGBE texture stored in a native array.
43
- * More information on this format are available here:
44
- * https://en.wikipedia.org/wiki/RGBE_image_format
45
- *
46
- * @param uint8array The binary file stored in native array.
47
- * @returns The header information.
48
- */
49
- // eslint-disable-next-line @typescript-eslint/naming-convention
50
- static RGBE_ReadHeader(uint8array) {
51
- let height = 0;
52
- let width = 0;
53
- let line = this._ReadStringLine(uint8array, 0);
54
- if (line[0] != "#" || line[1] != "?") {
55
- // eslint-disable-next-line no-throw-literal
56
- throw "Bad HDR Format.";
57
- }
58
- let endOfHeader = false;
59
- let findFormat = false;
60
- let lineIndex = 0;
61
- do {
62
- lineIndex += line.length + 1;
63
- line = this._ReadStringLine(uint8array, lineIndex);
64
- if (line == "FORMAT=32-bit_rle_rgbe") {
65
- findFormat = true;
66
- }
67
- else if (line.length == 0) {
68
- endOfHeader = true;
69
- }
70
- } while (!endOfHeader);
71
- if (!findFormat) {
72
- // eslint-disable-next-line no-throw-literal
73
- throw "HDR Bad header format, unsupported FORMAT";
20
+ else {
21
+ float32array[index + 0] = 0;
22
+ float32array[index + 1] = 0;
23
+ float32array[index + 2] = 0;
24
+ }
25
+ }
26
+ function readStringLine(uint8array, startIndex) {
27
+ let line = "";
28
+ let character = "";
29
+ for (let i = startIndex; i < uint8array.length - startIndex; i++) {
30
+ character = String.fromCharCode(uint8array[i]);
31
+ if (character == "\n") {
32
+ break;
74
33
  }
34
+ line += character;
35
+ }
36
+ return line;
37
+ }
38
+ /**
39
+ * Reads header information from an RGBE texture stored in a native array.
40
+ * More information on this format are available here:
41
+ * https://en.wikipedia.org/wiki/RGBE_image_format
42
+ *
43
+ * @param uint8array The binary file stored in native array.
44
+ * @returns The header information.
45
+ */
46
+ // eslint-disable-next-line @typescript-eslint/naming-convention
47
+ export function RGBE_ReadHeader(uint8array) {
48
+ let height = 0;
49
+ let width = 0;
50
+ let line = readStringLine(uint8array, 0);
51
+ if (line[0] != "#" || line[1] != "?") {
52
+ // eslint-disable-next-line no-throw-literal
53
+ throw "Bad HDR Format.";
54
+ }
55
+ let endOfHeader = false;
56
+ let findFormat = false;
57
+ let lineIndex = 0;
58
+ do {
75
59
  lineIndex += line.length + 1;
76
- line = this._ReadStringLine(uint8array, lineIndex);
77
- const sizeRegexp = /^-Y (.*) \+X (.*)$/g;
78
- const match = sizeRegexp.exec(line);
79
- // TODO. Support +Y and -X if needed.
80
- if (!match || match.length < 3) {
81
- // eslint-disable-next-line no-throw-literal
82
- throw "HDR Bad header format, no size";
60
+ line = readStringLine(uint8array, lineIndex);
61
+ if (line == "FORMAT=32-bit_rle_rgbe") {
62
+ findFormat = true;
83
63
  }
84
- width = parseInt(match[2]);
85
- height = parseInt(match[1]);
86
- if (width < 8 || width > 0x7fff) {
87
- // eslint-disable-next-line no-throw-literal
88
- throw "HDR Bad header format, unsupported size";
64
+ else if (line.length == 0) {
65
+ endOfHeader = true;
89
66
  }
90
- lineIndex += line.length + 1;
91
- return {
92
- height: height,
93
- width: width,
94
- dataPosition: lineIndex,
95
- };
67
+ } while (!endOfHeader);
68
+ if (!findFormat) {
69
+ // eslint-disable-next-line no-throw-literal
70
+ throw "HDR Bad header format, unsupported FORMAT";
96
71
  }
97
- /**
98
- * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.
99
- * This RGBE texture needs to store the information as a panorama.
100
- *
101
- * More information on this format are available here:
102
- * https://en.wikipedia.org/wiki/RGBE_image_format
103
- *
104
- * @param buffer The binary file stored in an array buffer.
105
- * @param size The expected size of the extracted cubemap.
106
- * @param supersample enable supersampling the cubemap (default: false)
107
- * @returns The Cube Map information.
108
- */
109
- static GetCubeMapTextureData(buffer, size, supersample = false) {
110
- const uint8array = new Uint8Array(buffer);
111
- const hdrInfo = this.RGBE_ReadHeader(uint8array);
112
- const data = this.RGBE_ReadPixels(uint8array, hdrInfo);
113
- const cubeMapData = PanoramaToCubeMapTools.ConvertPanoramaToCubemap(data, hdrInfo.width, hdrInfo.height, size, supersample);
114
- return cubeMapData;
72
+ lineIndex += line.length + 1;
73
+ line = readStringLine(uint8array, lineIndex);
74
+ const sizeRegexp = /^-Y (.*) \+X (.*)$/g;
75
+ const match = sizeRegexp.exec(line);
76
+ // TODO. Support +Y and -X if needed.
77
+ if (!match || match.length < 3) {
78
+ // eslint-disable-next-line no-throw-literal
79
+ throw "HDR Bad header format, no size";
115
80
  }
116
- /**
117
- * Returns the pixels data extracted from an RGBE texture.
118
- * This pixels will be stored left to right up to down in the R G B order in one array.
119
- *
120
- * More information on this format are available here:
121
- * https://en.wikipedia.org/wiki/RGBE_image_format
122
- *
123
- * @param uint8array The binary file stored in an array buffer.
124
- * @param hdrInfo The header information of the file.
125
- * @returns The pixels data in RGB right to left up to down order.
126
- */
127
- // eslint-disable-next-line @typescript-eslint/naming-convention
128
- static RGBE_ReadPixels(uint8array, hdrInfo) {
129
- return this._RGBEReadPixelsRLE(uint8array, hdrInfo);
81
+ width = parseInt(match[2]);
82
+ height = parseInt(match[1]);
83
+ if (width < 8 || width > 0x7fff) {
84
+ // eslint-disable-next-line no-throw-literal
85
+ throw "HDR Bad header format, unsupported size";
130
86
  }
131
- static _RGBEReadPixelsRLE(uint8array, hdrInfo) {
132
- let num_scanlines = hdrInfo.height;
133
- const scanline_width = hdrInfo.width;
134
- let a, b, c, d, count;
135
- let dataIndex = hdrInfo.dataPosition;
136
- let index = 0, endIndex = 0, i = 0;
137
- const scanLineArrayBuffer = new ArrayBuffer(scanline_width * 4); // four channel R G B E
138
- const scanLineArray = new Uint8Array(scanLineArrayBuffer);
139
- // 3 channels of 4 bytes per pixel in float.
140
- const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);
141
- const resultArray = new Float32Array(resultBuffer);
142
- // read in each successive scanline
143
- while (num_scanlines > 0) {
144
- a = uint8array[dataIndex++];
145
- b = uint8array[dataIndex++];
146
- c = uint8array[dataIndex++];
147
- d = uint8array[dataIndex++];
148
- if (a != 2 || b != 2 || c & 0x80 || hdrInfo.width < 8 || hdrInfo.width > 32767) {
149
- return this._RGBEReadPixelsNOTRLE(uint8array, hdrInfo);
150
- }
151
- if (((c << 8) | d) != scanline_width) {
152
- // eslint-disable-next-line no-throw-literal
153
- throw "HDR Bad header format, wrong scan line width";
154
- }
155
- index = 0;
156
- // read each of the four channels for the scanline into the buffer
157
- for (i = 0; i < 4; i++) {
158
- endIndex = (i + 1) * scanline_width;
159
- while (index < endIndex) {
160
- a = uint8array[dataIndex++];
161
- b = uint8array[dataIndex++];
162
- if (a > 128) {
163
- // a run of the same value
164
- count = a - 128;
165
- if (count == 0 || count > endIndex - index) {
166
- // eslint-disable-next-line no-throw-literal
167
- throw "HDR Bad Format, bad scanline data (run)";
168
- }
169
- while (count-- > 0) {
170
- scanLineArray[index++] = b;
171
- }
87
+ lineIndex += line.length + 1;
88
+ return {
89
+ height: height,
90
+ width: width,
91
+ dataPosition: lineIndex,
92
+ };
93
+ }
94
+ /**
95
+ * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.
96
+ * This RGBE texture needs to store the information as a panorama.
97
+ *
98
+ * More information on this format are available here:
99
+ * https://en.wikipedia.org/wiki/RGBE_image_format
100
+ *
101
+ * @param buffer The binary file stored in an array buffer.
102
+ * @param size The expected size of the extracted cubemap.
103
+ * @param supersample enable supersampling the cubemap (default: false)
104
+ * @returns The Cube Map information.
105
+ */
106
+ export function GetCubeMapTextureData(buffer, size, supersample = false) {
107
+ const uint8array = new Uint8Array(buffer);
108
+ const hdrInfo = RGBE_ReadHeader(uint8array);
109
+ const data = RGBE_ReadPixels(uint8array, hdrInfo);
110
+ const cubeMapData = PanoramaToCubeMapTools.ConvertPanoramaToCubemap(data, hdrInfo.width, hdrInfo.height, size, supersample);
111
+ return cubeMapData;
112
+ }
113
+ /**
114
+ * Returns the pixels data extracted from an RGBE texture.
115
+ * This pixels will be stored left to right up to down in the R G B order in one array.
116
+ *
117
+ * More information on this format are available here:
118
+ * https://en.wikipedia.org/wiki/RGBE_image_format
119
+ *
120
+ * @param uint8array The binary file stored in an array buffer.
121
+ * @param hdrInfo The header information of the file.
122
+ * @returns The pixels data in RGB right to left up to down order.
123
+ */
124
+ // eslint-disable-next-line @typescript-eslint/naming-convention
125
+ export function RGBE_ReadPixels(uint8array, hdrInfo) {
126
+ return readRGBEPixelsRLE(uint8array, hdrInfo);
127
+ }
128
+ function readRGBEPixelsRLE(uint8array, hdrInfo) {
129
+ let num_scanlines = hdrInfo.height;
130
+ const scanline_width = hdrInfo.width;
131
+ let a, b, c, d, count;
132
+ let dataIndex = hdrInfo.dataPosition;
133
+ let index = 0, endIndex = 0, i = 0;
134
+ const scanLineArrayBuffer = new ArrayBuffer(scanline_width * 4); // four channel R G B E
135
+ const scanLineArray = new Uint8Array(scanLineArrayBuffer);
136
+ // 3 channels of 4 bytes per pixel in float.
137
+ const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);
138
+ const resultArray = new Float32Array(resultBuffer);
139
+ // read in each successive scanline
140
+ while (num_scanlines > 0) {
141
+ a = uint8array[dataIndex++];
142
+ b = uint8array[dataIndex++];
143
+ c = uint8array[dataIndex++];
144
+ d = uint8array[dataIndex++];
145
+ if (a != 2 || b != 2 || c & 0x80 || hdrInfo.width < 8 || hdrInfo.width > 32767) {
146
+ return readRGBEPixelsNotRLE(uint8array, hdrInfo);
147
+ }
148
+ if (((c << 8) | d) != scanline_width) {
149
+ // eslint-disable-next-line no-throw-literal
150
+ throw "HDR Bad header format, wrong scan line width";
151
+ }
152
+ index = 0;
153
+ // read each of the four channels for the scanline into the buffer
154
+ for (i = 0; i < 4; i++) {
155
+ endIndex = (i + 1) * scanline_width;
156
+ while (index < endIndex) {
157
+ a = uint8array[dataIndex++];
158
+ b = uint8array[dataIndex++];
159
+ if (a > 128) {
160
+ // a run of the same value
161
+ count = a - 128;
162
+ if (count == 0 || count > endIndex - index) {
163
+ // eslint-disable-next-line no-throw-literal
164
+ throw "HDR Bad Format, bad scanline data (run)";
172
165
  }
173
- else {
174
- // a non-run
175
- count = a;
176
- if (count == 0 || count > endIndex - index) {
177
- // eslint-disable-next-line no-throw-literal
178
- throw "HDR Bad Format, bad scanline data (non-run)";
179
- }
166
+ while (count-- > 0) {
180
167
  scanLineArray[index++] = b;
181
- if (--count > 0) {
182
- for (let j = 0; j < count; j++) {
183
- scanLineArray[index++] = uint8array[dataIndex++];
184
- }
168
+ }
169
+ }
170
+ else {
171
+ // a non-run
172
+ count = a;
173
+ if (count == 0 || count > endIndex - index) {
174
+ // eslint-disable-next-line no-throw-literal
175
+ throw "HDR Bad Format, bad scanline data (non-run)";
176
+ }
177
+ scanLineArray[index++] = b;
178
+ if (--count > 0) {
179
+ for (let j = 0; j < count; j++) {
180
+ scanLineArray[index++] = uint8array[dataIndex++];
185
181
  }
186
182
  }
187
183
  }
188
184
  }
189
- // now convert data from buffer into floats
190
- for (i = 0; i < scanline_width; i++) {
191
- a = scanLineArray[i];
192
- b = scanLineArray[i + scanline_width];
193
- c = scanLineArray[i + 2 * scanline_width];
194
- d = scanLineArray[i + 3 * scanline_width];
195
- this._Rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);
196
- }
197
- num_scanlines--;
198
185
  }
199
- return resultArray;
186
+ // now convert data from buffer into floats
187
+ for (i = 0; i < scanline_width; i++) {
188
+ a = scanLineArray[i];
189
+ b = scanLineArray[i + scanline_width];
190
+ c = scanLineArray[i + 2 * scanline_width];
191
+ d = scanLineArray[i + 3 * scanline_width];
192
+ rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);
193
+ }
194
+ num_scanlines--;
200
195
  }
201
- static _RGBEReadPixelsNOTRLE(uint8array, hdrInfo) {
202
- // this file is not run length encoded
203
- // read values sequentially
204
- let num_scanlines = hdrInfo.height;
205
- const scanline_width = hdrInfo.width;
206
- let a, b, c, d, i;
207
- let dataIndex = hdrInfo.dataPosition;
208
- // 3 channels of 4 bytes per pixel in float.
209
- const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);
210
- const resultArray = new Float32Array(resultBuffer);
211
- // read in each successive scanline
212
- while (num_scanlines > 0) {
213
- for (i = 0; i < hdrInfo.width; i++) {
214
- a = uint8array[dataIndex++];
215
- b = uint8array[dataIndex++];
216
- c = uint8array[dataIndex++];
217
- d = uint8array[dataIndex++];
218
- this._Rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);
219
- }
220
- num_scanlines--;
196
+ return resultArray;
197
+ }
198
+ function readRGBEPixelsNotRLE(uint8array, hdrInfo) {
199
+ // this file is not run length encoded
200
+ // read values sequentially
201
+ let num_scanlines = hdrInfo.height;
202
+ const scanline_width = hdrInfo.width;
203
+ let a, b, c, d, i;
204
+ let dataIndex = hdrInfo.dataPosition;
205
+ // 3 channels of 4 bytes per pixel in float.
206
+ const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);
207
+ const resultArray = new Float32Array(resultBuffer);
208
+ // read in each successive scanline
209
+ while (num_scanlines > 0) {
210
+ for (i = 0; i < hdrInfo.width; i++) {
211
+ a = uint8array[dataIndex++];
212
+ b = uint8array[dataIndex++];
213
+ c = uint8array[dataIndex++];
214
+ d = uint8array[dataIndex++];
215
+ rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);
221
216
  }
222
- return resultArray;
217
+ num_scanlines--;
223
218
  }
219
+ return resultArray;
224
220
  }
221
+ /**
222
+ * @deprecated Use functions separately
223
+ */
224
+ export const HDRTools = {
225
+ // eslint-disable-next-line @typescript-eslint/naming-convention
226
+ RGBE_ReadHeader,
227
+ // eslint-disable-next-line @typescript-eslint/naming-convention
228
+ GetCubeMapTextureData,
229
+ // eslint-disable-next-line @typescript-eslint/naming-convention
230
+ RGBE_ReadPixels,
231
+ };
225
232
  //# sourceMappingURL=hdr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hdr.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/HighDynamicRange/hdr.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CubeMapInfo } from \"./panoramaToCubemap\";\r\nimport { PanoramaToCubeMapTools } from \"./panoramaToCubemap\";\r\n\r\n/**\r\n * Header information of HDR texture files.\r\n */\r\nexport interface HDRInfo {\r\n /**\r\n * The height of the texture in pixels.\r\n */\r\n height: number;\r\n\r\n /**\r\n * The width of the texture in pixels.\r\n */\r\n width: number;\r\n\r\n /**\r\n * The index of the beginning of the data in the binary file.\r\n */\r\n dataPosition: number;\r\n}\r\n\r\n/**\r\n * This groups tools to convert HDR texture to native colors array.\r\n */\r\nexport class HDRTools {\r\n private static _Ldexp(mantissa: number, exponent: number): number {\r\n if (exponent > 1023) {\r\n return mantissa * Math.pow(2, 1023) * Math.pow(2, exponent - 1023);\r\n }\r\n\r\n if (exponent < -1074) {\r\n return mantissa * Math.pow(2, -1074) * Math.pow(2, exponent + 1074);\r\n }\r\n\r\n return mantissa * Math.pow(2, exponent);\r\n }\r\n\r\n private static _Rgbe2float(float32array: Float32Array, red: number, green: number, blue: number, exponent: number, index: number) {\r\n if (exponent > 0) {\r\n /*nonzero pixel*/\r\n exponent = this._Ldexp(1.0, exponent - (128 + 8));\r\n\r\n float32array[index + 0] = red * exponent;\r\n float32array[index + 1] = green * exponent;\r\n float32array[index + 2] = blue * exponent;\r\n } else {\r\n float32array[index + 0] = 0;\r\n float32array[index + 1] = 0;\r\n float32array[index + 2] = 0;\r\n }\r\n }\r\n\r\n private static _ReadStringLine(uint8array: Uint8Array, startIndex: number): string {\r\n let line = \"\";\r\n let character = \"\";\r\n\r\n for (let i = startIndex; i < uint8array.length - startIndex; i++) {\r\n character = String.fromCharCode(uint8array[i]);\r\n\r\n if (character == \"\\n\") {\r\n break;\r\n }\r\n\r\n line += character;\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * Reads header information from an RGBE texture stored in a native array.\r\n * More information on this format are available here:\r\n * https://en.wikipedia.org/wiki/RGBE_image_format\r\n *\r\n * @param uint8array The binary file stored in native array.\r\n * @returns The header information.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static RGBE_ReadHeader(uint8array: Uint8Array): HDRInfo {\r\n let height: number = 0;\r\n let width: number = 0;\r\n\r\n let line = this._ReadStringLine(uint8array, 0);\r\n if (line[0] != \"#\" || line[1] != \"?\") {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Bad HDR Format.\";\r\n }\r\n\r\n let endOfHeader = false;\r\n let findFormat = false;\r\n let lineIndex: number = 0;\r\n\r\n do {\r\n lineIndex += line.length + 1;\r\n line = this._ReadStringLine(uint8array, lineIndex);\r\n\r\n if (line == \"FORMAT=32-bit_rle_rgbe\") {\r\n findFormat = true;\r\n } else if (line.length == 0) {\r\n endOfHeader = true;\r\n }\r\n } while (!endOfHeader);\r\n\r\n if (!findFormat) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, unsupported FORMAT\";\r\n }\r\n\r\n lineIndex += line.length + 1;\r\n line = this._ReadStringLine(uint8array, lineIndex);\r\n\r\n const sizeRegexp = /^-Y (.*) \\+X (.*)$/g;\r\n const match = sizeRegexp.exec(line);\r\n\r\n // TODO. Support +Y and -X if needed.\r\n if (!match || match.length < 3) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, no size\";\r\n }\r\n width = parseInt(match[2]);\r\n height = parseInt(match[1]);\r\n\r\n if (width < 8 || width > 0x7fff) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, unsupported size\";\r\n }\r\n\r\n lineIndex += line.length + 1;\r\n\r\n return {\r\n height: height,\r\n width: width,\r\n dataPosition: lineIndex,\r\n };\r\n }\r\n\r\n /**\r\n * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.\r\n * This RGBE texture needs to store the information as a panorama.\r\n *\r\n * More information on this format are available here:\r\n * https://en.wikipedia.org/wiki/RGBE_image_format\r\n *\r\n * @param buffer The binary file stored in an array buffer.\r\n * @param size The expected size of the extracted cubemap.\r\n * @param supersample enable supersampling the cubemap (default: false)\r\n * @returns The Cube Map information.\r\n */\r\n public static GetCubeMapTextureData(buffer: ArrayBuffer, size: number, supersample = false): CubeMapInfo {\r\n const uint8array = new Uint8Array(buffer);\r\n const hdrInfo = this.RGBE_ReadHeader(uint8array);\r\n const data = this.RGBE_ReadPixels(uint8array, hdrInfo);\r\n\r\n const cubeMapData = PanoramaToCubeMapTools.ConvertPanoramaToCubemap(data, hdrInfo.width, hdrInfo.height, size, supersample);\r\n\r\n return cubeMapData;\r\n }\r\n\r\n /**\r\n * Returns the pixels data extracted from an RGBE texture.\r\n * This pixels will be stored left to right up to down in the R G B order in one array.\r\n *\r\n * More information on this format are available here:\r\n * https://en.wikipedia.org/wiki/RGBE_image_format\r\n *\r\n * @param uint8array The binary file stored in an array buffer.\r\n * @param hdrInfo The header information of the file.\r\n * @returns The pixels data in RGB right to left up to down order.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static RGBE_ReadPixels(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array {\r\n return this._RGBEReadPixelsRLE(uint8array, hdrInfo);\r\n }\r\n\r\n private static _RGBEReadPixelsRLE(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array {\r\n let num_scanlines = hdrInfo.height;\r\n const scanline_width = hdrInfo.width;\r\n\r\n let a: number, b: number, c: number, d: number, count: number;\r\n let dataIndex = hdrInfo.dataPosition;\r\n let index = 0,\r\n endIndex = 0,\r\n i = 0;\r\n\r\n const scanLineArrayBuffer = new ArrayBuffer(scanline_width * 4); // four channel R G B E\r\n const scanLineArray = new Uint8Array(scanLineArrayBuffer);\r\n\r\n // 3 channels of 4 bytes per pixel in float.\r\n const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);\r\n const resultArray = new Float32Array(resultBuffer);\r\n\r\n // read in each successive scanline\r\n while (num_scanlines > 0) {\r\n a = uint8array[dataIndex++];\r\n b = uint8array[dataIndex++];\r\n c = uint8array[dataIndex++];\r\n d = uint8array[dataIndex++];\r\n\r\n if (a != 2 || b != 2 || c & 0x80 || hdrInfo.width < 8 || hdrInfo.width > 32767) {\r\n return this._RGBEReadPixelsNOTRLE(uint8array, hdrInfo);\r\n }\r\n\r\n if (((c << 8) | d) != scanline_width) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, wrong scan line width\";\r\n }\r\n\r\n index = 0;\r\n\r\n // read each of the four channels for the scanline into the buffer\r\n for (i = 0; i < 4; i++) {\r\n endIndex = (i + 1) * scanline_width;\r\n\r\n while (index < endIndex) {\r\n a = uint8array[dataIndex++];\r\n b = uint8array[dataIndex++];\r\n\r\n if (a > 128) {\r\n // a run of the same value\r\n count = a - 128;\r\n if (count == 0 || count > endIndex - index) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad Format, bad scanline data (run)\";\r\n }\r\n\r\n while (count-- > 0) {\r\n scanLineArray[index++] = b;\r\n }\r\n } else {\r\n // a non-run\r\n count = a;\r\n if (count == 0 || count > endIndex - index) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad Format, bad scanline data (non-run)\";\r\n }\r\n\r\n scanLineArray[index++] = b;\r\n if (--count > 0) {\r\n for (let j = 0; j < count; j++) {\r\n scanLineArray[index++] = uint8array[dataIndex++];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // now convert data from buffer into floats\r\n for (i = 0; i < scanline_width; i++) {\r\n a = scanLineArray[i];\r\n b = scanLineArray[i + scanline_width];\r\n c = scanLineArray[i + 2 * scanline_width];\r\n d = scanLineArray[i + 3 * scanline_width];\r\n\r\n this._Rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);\r\n }\r\n\r\n num_scanlines--;\r\n }\r\n\r\n return resultArray;\r\n }\r\n\r\n private static _RGBEReadPixelsNOTRLE(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array {\r\n // this file is not run length encoded\r\n // read values sequentially\r\n\r\n let num_scanlines = hdrInfo.height;\r\n const scanline_width = hdrInfo.width;\r\n\r\n let a: number, b: number, c: number, d: number, i: number;\r\n let dataIndex = hdrInfo.dataPosition;\r\n\r\n // 3 channels of 4 bytes per pixel in float.\r\n const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);\r\n const resultArray = new Float32Array(resultBuffer);\r\n\r\n // read in each successive scanline\r\n while (num_scanlines > 0) {\r\n for (i = 0; i < hdrInfo.width; i++) {\r\n a = uint8array[dataIndex++];\r\n b = uint8array[dataIndex++];\r\n c = uint8array[dataIndex++];\r\n d = uint8array[dataIndex++];\r\n\r\n this._Rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);\r\n }\r\n\r\n num_scanlines--;\r\n }\r\n\r\n return resultArray;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"hdr.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/HighDynamicRange/hdr.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CubeMapInfo } from \"./panoramaToCubemap\";\r\nimport { PanoramaToCubeMapTools } from \"./panoramaToCubemap\";\r\n\r\n/**\r\n * Header information of HDR texture files.\r\n */\r\nexport interface HDRInfo {\r\n /**\r\n * The height of the texture in pixels.\r\n */\r\n height: number;\r\n\r\n /**\r\n * The width of the texture in pixels.\r\n */\r\n width: number;\r\n\r\n /**\r\n * The index of the beginning of the data in the binary file.\r\n */\r\n dataPosition: number;\r\n}\r\n\r\n/* This groups tools to convert HDR texture to native colors array. */\r\n\r\nfunction ldexp(mantissa: number, exponent: number): number {\r\n if (exponent > 1023) {\r\n return mantissa * Math.pow(2, 1023) * Math.pow(2, exponent - 1023);\r\n }\r\n\r\n if (exponent < -1074) {\r\n return mantissa * Math.pow(2, -1074) * Math.pow(2, exponent + 1074);\r\n }\r\n\r\n return mantissa * Math.pow(2, exponent);\r\n}\r\n\r\nfunction rgbe2float(float32array: Float32Array, red: number, green: number, blue: number, exponent: number, index: number) {\r\n if (exponent > 0) {\r\n /*nonzero pixel*/\r\n exponent = ldexp(1.0, exponent - (128 + 8));\r\n\r\n float32array[index + 0] = red * exponent;\r\n float32array[index + 1] = green * exponent;\r\n float32array[index + 2] = blue * exponent;\r\n } else {\r\n float32array[index + 0] = 0;\r\n float32array[index + 1] = 0;\r\n float32array[index + 2] = 0;\r\n }\r\n}\r\n\r\nfunction readStringLine(uint8array: Uint8Array, startIndex: number): string {\r\n let line = \"\";\r\n let character = \"\";\r\n\r\n for (let i = startIndex; i < uint8array.length - startIndex; i++) {\r\n character = String.fromCharCode(uint8array[i]);\r\n\r\n if (character == \"\\n\") {\r\n break;\r\n }\r\n\r\n line += character;\r\n }\r\n\r\n return line;\r\n}\r\n\r\n/**\r\n * Reads header information from an RGBE texture stored in a native array.\r\n * More information on this format are available here:\r\n * https://en.wikipedia.org/wiki/RGBE_image_format\r\n *\r\n * @param uint8array The binary file stored in native array.\r\n * @returns The header information.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RGBE_ReadHeader(uint8array: Uint8Array): HDRInfo {\r\n let height: number = 0;\r\n let width: number = 0;\r\n\r\n let line = readStringLine(uint8array, 0);\r\n if (line[0] != \"#\" || line[1] != \"?\") {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Bad HDR Format.\";\r\n }\r\n\r\n let endOfHeader = false;\r\n let findFormat = false;\r\n let lineIndex: number = 0;\r\n\r\n do {\r\n lineIndex += line.length + 1;\r\n line = readStringLine(uint8array, lineIndex);\r\n\r\n if (line == \"FORMAT=32-bit_rle_rgbe\") {\r\n findFormat = true;\r\n } else if (line.length == 0) {\r\n endOfHeader = true;\r\n }\r\n } while (!endOfHeader);\r\n\r\n if (!findFormat) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, unsupported FORMAT\";\r\n }\r\n\r\n lineIndex += line.length + 1;\r\n line = readStringLine(uint8array, lineIndex);\r\n\r\n const sizeRegexp = /^-Y (.*) \\+X (.*)$/g;\r\n const match = sizeRegexp.exec(line);\r\n\r\n // TODO. Support +Y and -X if needed.\r\n if (!match || match.length < 3) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, no size\";\r\n }\r\n width = parseInt(match[2]);\r\n height = parseInt(match[1]);\r\n\r\n if (width < 8 || width > 0x7fff) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, unsupported size\";\r\n }\r\n\r\n lineIndex += line.length + 1;\r\n\r\n return {\r\n height: height,\r\n width: width,\r\n dataPosition: lineIndex,\r\n };\r\n}\r\n\r\n/**\r\n * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.\r\n * This RGBE texture needs to store the information as a panorama.\r\n *\r\n * More information on this format are available here:\r\n * https://en.wikipedia.org/wiki/RGBE_image_format\r\n *\r\n * @param buffer The binary file stored in an array buffer.\r\n * @param size The expected size of the extracted cubemap.\r\n * @param supersample enable supersampling the cubemap (default: false)\r\n * @returns The Cube Map information.\r\n */\r\nexport function GetCubeMapTextureData(buffer: ArrayBuffer, size: number, supersample = false): CubeMapInfo {\r\n const uint8array = new Uint8Array(buffer);\r\n const hdrInfo = RGBE_ReadHeader(uint8array);\r\n const data = RGBE_ReadPixels(uint8array, hdrInfo);\r\n\r\n const cubeMapData = PanoramaToCubeMapTools.ConvertPanoramaToCubemap(data, hdrInfo.width, hdrInfo.height, size, supersample);\r\n\r\n return cubeMapData;\r\n}\r\n\r\n/**\r\n * Returns the pixels data extracted from an RGBE texture.\r\n * This pixels will be stored left to right up to down in the R G B order in one array.\r\n *\r\n * More information on this format are available here:\r\n * https://en.wikipedia.org/wiki/RGBE_image_format\r\n *\r\n * @param uint8array The binary file stored in an array buffer.\r\n * @param hdrInfo The header information of the file.\r\n * @returns The pixels data in RGB right to left up to down order.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RGBE_ReadPixels(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array {\r\n return readRGBEPixelsRLE(uint8array, hdrInfo);\r\n}\r\n\r\nfunction readRGBEPixelsRLE(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array {\r\n let num_scanlines = hdrInfo.height;\r\n const scanline_width = hdrInfo.width;\r\n\r\n let a: number, b: number, c: number, d: number, count: number;\r\n let dataIndex = hdrInfo.dataPosition;\r\n let index = 0,\r\n endIndex = 0,\r\n i = 0;\r\n\r\n const scanLineArrayBuffer = new ArrayBuffer(scanline_width * 4); // four channel R G B E\r\n const scanLineArray = new Uint8Array(scanLineArrayBuffer);\r\n\r\n // 3 channels of 4 bytes per pixel in float.\r\n const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);\r\n const resultArray = new Float32Array(resultBuffer);\r\n\r\n // read in each successive scanline\r\n while (num_scanlines > 0) {\r\n a = uint8array[dataIndex++];\r\n b = uint8array[dataIndex++];\r\n c = uint8array[dataIndex++];\r\n d = uint8array[dataIndex++];\r\n\r\n if (a != 2 || b != 2 || c & 0x80 || hdrInfo.width < 8 || hdrInfo.width > 32767) {\r\n return readRGBEPixelsNotRLE(uint8array, hdrInfo);\r\n }\r\n\r\n if (((c << 8) | d) != scanline_width) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad header format, wrong scan line width\";\r\n }\r\n\r\n index = 0;\r\n\r\n // read each of the four channels for the scanline into the buffer\r\n for (i = 0; i < 4; i++) {\r\n endIndex = (i + 1) * scanline_width;\r\n\r\n while (index < endIndex) {\r\n a = uint8array[dataIndex++];\r\n b = uint8array[dataIndex++];\r\n\r\n if (a > 128) {\r\n // a run of the same value\r\n count = a - 128;\r\n if (count == 0 || count > endIndex - index) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad Format, bad scanline data (run)\";\r\n }\r\n\r\n while (count-- > 0) {\r\n scanLineArray[index++] = b;\r\n }\r\n } else {\r\n // a non-run\r\n count = a;\r\n if (count == 0 || count > endIndex - index) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"HDR Bad Format, bad scanline data (non-run)\";\r\n }\r\n\r\n scanLineArray[index++] = b;\r\n if (--count > 0) {\r\n for (let j = 0; j < count; j++) {\r\n scanLineArray[index++] = uint8array[dataIndex++];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // now convert data from buffer into floats\r\n for (i = 0; i < scanline_width; i++) {\r\n a = scanLineArray[i];\r\n b = scanLineArray[i + scanline_width];\r\n c = scanLineArray[i + 2 * scanline_width];\r\n d = scanLineArray[i + 3 * scanline_width];\r\n\r\n rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);\r\n }\r\n\r\n num_scanlines--;\r\n }\r\n\r\n return resultArray;\r\n}\r\n\r\nfunction readRGBEPixelsNotRLE(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array {\r\n // this file is not run length encoded\r\n // read values sequentially\r\n\r\n let num_scanlines = hdrInfo.height;\r\n const scanline_width = hdrInfo.width;\r\n\r\n let a: number, b: number, c: number, d: number, i: number;\r\n let dataIndex = hdrInfo.dataPosition;\r\n\r\n // 3 channels of 4 bytes per pixel in float.\r\n const resultBuffer = new ArrayBuffer(hdrInfo.width * hdrInfo.height * 4 * 3);\r\n const resultArray = new Float32Array(resultBuffer);\r\n\r\n // read in each successive scanline\r\n while (num_scanlines > 0) {\r\n for (i = 0; i < hdrInfo.width; i++) {\r\n a = uint8array[dataIndex++];\r\n b = uint8array[dataIndex++];\r\n c = uint8array[dataIndex++];\r\n d = uint8array[dataIndex++];\r\n\r\n rgbe2float(resultArray, a, b, c, d, (hdrInfo.height - num_scanlines) * scanline_width * 3 + i * 3);\r\n }\r\n\r\n num_scanlines--;\r\n }\r\n\r\n return resultArray;\r\n}\r\n\r\n/**\r\n * @deprecated Use functions separately\r\n */\r\nexport const HDRTools = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n RGBE_ReadHeader,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n GetCubeMapTextureData,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n RGBE_ReadPixels,\r\n};\r\n"]}
@@ -1,3 +1,3 @@
1
1
  export * from "./cubemapToSphericalPolynomial";
2
- export * from "./hdr";
2
+ export { HDRTools } from "./hdr";
3
3
  export * from "./panoramaToCubemap";
@@ -1,4 +1,4 @@
1
1
  export * from "./cubemapToSphericalPolynomial.js";
2
- export * from "./hdr.js";
2
+ export { HDRTools } from "./hdr.js";
3
3
  export * from "./panoramaToCubemap.js";
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/HighDynamicRange/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,OAAO,CAAC;AACtB,cAAc,qBAAqB,CAAC","sourcesContent":["export * from \"./cubemapToSphericalPolynomial\";\r\nexport * from \"./hdr\";\r\nexport * from \"./panoramaToCubemap\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/HighDynamicRange/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,cAAc,qBAAqB,CAAC","sourcesContent":["export * from \"./cubemapToSphericalPolynomial\";\r\nexport { HDRTools } from \"./hdr\";\r\nexport * from \"./panoramaToCubemap\";\r\n"]}