@loaders.gl/textures 4.0.0-beta.2 → 4.0.0-beta.4

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 (235) hide show
  1. package/dist/{esm/basis-loader.js → basis-loader.js} +2 -2
  2. package/dist/basis-loader.js.map +1 -0
  3. package/dist/basis-worker-node.js +5365 -3586
  4. package/dist/basis-worker.js +106 -32
  5. package/dist/{esm/compressed-texture-loader.js → compressed-texture-loader.js} +3 -3
  6. package/dist/compressed-texture-loader.js.map +1 -0
  7. package/dist/compressed-texture-worker.js +159 -35
  8. package/dist/{esm/compressed-texture-writer.js → compressed-texture-writer.js} +2 -2
  9. package/dist/compressed-texture-writer.js.map +1 -0
  10. package/dist/{esm/crunch-loader.js → crunch-loader.js} +1 -1
  11. package/dist/crunch-loader.js.map +1 -0
  12. package/dist/crunch-worker.js +61 -27
  13. package/dist/{dist.min.js → dist.dev.js} +827 -1112
  14. package/dist/index.cjs +1360 -0
  15. package/dist/index.js +31 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/ktx2-basis-writer-worker-node.js +5044 -3316
  18. package/dist/ktx2-basis-writer-worker.js +53 -27
  19. package/dist/{esm/ktx2-basis-writer.js → ktx2-basis-writer.js} +2 -2
  20. package/dist/ktx2-basis-writer.js.map +1 -0
  21. package/dist/lib/encoders/encode-ktx.js.map +1 -0
  22. package/dist/{esm/lib → lib}/encoders/encode-ktx2-basis-texture.js +1 -1
  23. package/dist/lib/encoders/encode-ktx2-basis-texture.js.map +1 -0
  24. package/dist/lib/encoders/encode-texture.js.map +1 -0
  25. package/dist/lib/gl-extensions.js.map +1 -0
  26. package/dist/lib/parsers/basis-module-loader.js.map +1 -0
  27. package/dist/lib/parsers/crunch-module-loader.js.map +1 -0
  28. package/dist/{esm/lib → lib}/parsers/parse-basis.js +4 -4
  29. package/dist/lib/parsers/parse-basis.js.map +1 -0
  30. package/dist/{esm/lib → lib}/parsers/parse-compressed-texture.js +3 -3
  31. package/dist/lib/parsers/parse-compressed-texture.js.map +1 -0
  32. package/dist/{esm/lib → lib}/parsers/parse-crunch.js +4 -4
  33. package/dist/lib/parsers/parse-crunch.js.map +1 -0
  34. package/dist/{esm/lib → lib}/parsers/parse-dds.js +3 -3
  35. package/dist/lib/parsers/parse-dds.js.map +1 -0
  36. package/dist/{esm/lib → lib}/parsers/parse-ktx.js +2 -2
  37. package/dist/lib/parsers/parse-ktx.js.map +1 -0
  38. package/dist/lib/parsers/parse-npy.d.ts.map +1 -1
  39. package/dist/{esm/lib → lib}/parsers/parse-npy.js +1 -1
  40. package/dist/lib/parsers/parse-npy.js.map +1 -0
  41. package/dist/{esm/lib → lib}/parsers/parse-pvr.js +2 -2
  42. package/dist/lib/parsers/parse-pvr.js.map +1 -0
  43. package/dist/lib/texture-api/async-deep-map.js.map +1 -0
  44. package/dist/{esm/lib → lib}/texture-api/deep-load.js +1 -1
  45. package/dist/lib/texture-api/deep-load.js.map +1 -0
  46. package/dist/{esm/lib → lib}/texture-api/generate-url.js +1 -1
  47. package/dist/lib/texture-api/generate-url.js.map +1 -0
  48. package/dist/{esm/lib → lib}/texture-api/load-image-array.js +2 -2
  49. package/dist/lib/texture-api/load-image-array.js.map +1 -0
  50. package/dist/{esm/lib → lib}/texture-api/load-image-cube.js +2 -2
  51. package/dist/lib/texture-api/load-image-cube.js.map +1 -0
  52. package/dist/{esm/lib → lib}/texture-api/load-image.js +2 -2
  53. package/dist/lib/texture-api/load-image.js.map +1 -0
  54. package/dist/lib/texture-api/texture-api-types.js.map +1 -0
  55. package/dist/lib/utils/extract-mipmap-images.js.map +1 -0
  56. package/dist/{esm/lib → lib}/utils/ktx-format-helper.js +1 -1
  57. package/dist/lib/utils/ktx-format-helper.js.map +1 -0
  58. package/dist/{esm/lib → lib}/utils/texture-formats.js +1 -1
  59. package/dist/lib/utils/texture-formats.js.map +1 -0
  60. package/dist/lib/utils/version.js +2 -0
  61. package/dist/lib/utils/version.js.map +1 -0
  62. package/dist/libs/basis_encoder.js +5435 -19
  63. package/dist/libs/basis_encoder.js.map +1 -0
  64. package/dist/libs/basis_transcoder.js +2523 -20
  65. package/dist/libs/basis_transcoder.js.map +1 -0
  66. package/dist/libs/crunch.js +10043 -129
  67. package/dist/libs/crunch.js.map +1 -0
  68. package/dist/{esm/npy-loader.js → npy-loader.js} +2 -2
  69. package/dist/npy-loader.js.map +1 -0
  70. package/dist/npy-worker.js +17 -4
  71. package/dist/types.js.map +1 -0
  72. package/dist/{esm/workers → workers}/basis-worker-node.js +1 -1
  73. package/dist/workers/basis-worker-node.js.map +1 -0
  74. package/dist/{esm/workers → workers}/basis-worker.js +1 -1
  75. package/dist/workers/basis-worker.js.map +1 -0
  76. package/dist/workers/compressed-texture-worker.js +4 -0
  77. package/dist/workers/compressed-texture-worker.js.map +1 -0
  78. package/dist/{esm/workers → workers}/crunch-worker.js +2 -2
  79. package/dist/workers/crunch-worker.js.map +1 -0
  80. package/dist/{esm/workers → workers}/ktx2-basis-writer-worker-node.js +1 -1
  81. package/dist/workers/ktx2-basis-writer-worker-node.js.map +1 -0
  82. package/dist/{esm/workers → workers}/ktx2-basis-writer-worker.js +1 -1
  83. package/dist/workers/ktx2-basis-writer-worker.js.map +1 -0
  84. package/dist/{esm/workers → workers}/npy-worker.js +1 -1
  85. package/dist/workers/npy-worker.js.map +1 -0
  86. package/package.json +19 -11
  87. package/src/lib/parsers/parse-npy.ts +0 -2
  88. package/dist/bundle.d.ts +0 -2
  89. package/dist/bundle.d.ts.map +0 -1
  90. package/dist/es5/basis-loader.js +0 -37
  91. package/dist/es5/basis-loader.js.map +0 -1
  92. package/dist/es5/bundle.js +0 -6
  93. package/dist/es5/bundle.js.map +0 -1
  94. package/dist/es5/compressed-texture-loader.js +0 -74
  95. package/dist/es5/compressed-texture-loader.js.map +0 -1
  96. package/dist/es5/compressed-texture-writer.js +0 -28
  97. package/dist/es5/compressed-texture-writer.js.map +0 -1
  98. package/dist/es5/crunch-loader.js +0 -24
  99. package/dist/es5/crunch-loader.js.map +0 -1
  100. package/dist/es5/index.js +0 -145
  101. package/dist/es5/index.js.map +0 -1
  102. package/dist/es5/ktx2-basis-writer.js +0 -26
  103. package/dist/es5/ktx2-basis-writer.js.map +0 -1
  104. package/dist/es5/lib/encoders/encode-ktx.js +0 -12
  105. package/dist/es5/lib/encoders/encode-ktx.js.map +0 -1
  106. package/dist/es5/lib/encoders/encode-ktx2-basis-texture.js +0 -75
  107. package/dist/es5/lib/encoders/encode-ktx2-basis-texture.js.map +0 -1
  108. package/dist/es5/lib/encoders/encode-texture.js +0 -38
  109. package/dist/es5/lib/encoders/encode-texture.js.map +0 -1
  110. package/dist/es5/lib/gl-extensions.js +0 -68
  111. package/dist/es5/lib/gl-extensions.js.map +0 -1
  112. package/dist/es5/lib/parsers/basis-module-loader.js +0 -199
  113. package/dist/es5/lib/parsers/basis-module-loader.js.map +0 -1
  114. package/dist/es5/lib/parsers/crunch-module-loader.js +0 -72
  115. package/dist/es5/lib/parsers/crunch-module-loader.js.map +0 -1
  116. package/dist/es5/lib/parsers/parse-basis.js +0 -270
  117. package/dist/es5/lib/parsers/parse-basis.js.map +0 -1
  118. package/dist/es5/lib/parsers/parse-compressed-texture.js +0 -22
  119. package/dist/es5/lib/parsers/parse-compressed-texture.js.map +0 -1
  120. package/dist/es5/lib/parsers/parse-crunch.js +0 -100
  121. package/dist/es5/lib/parsers/parse-crunch.js.map +0 -1
  122. package/dist/es5/lib/parsers/parse-dds.js +0 -84
  123. package/dist/es5/lib/parsers/parse-dds.js.map +0 -1
  124. package/dist/es5/lib/parsers/parse-ktx.js +0 -34
  125. package/dist/es5/lib/parsers/parse-ktx.js.map +0 -1
  126. package/dist/es5/lib/parsers/parse-npy.js +0 -70
  127. package/dist/es5/lib/parsers/parse-npy.js.map +0 -1
  128. package/dist/es5/lib/parsers/parse-pvr.js +0 -161
  129. package/dist/es5/lib/parsers/parse-pvr.js.map +0 -1
  130. package/dist/es5/lib/texture-api/async-deep-map.js +0 -156
  131. package/dist/es5/lib/texture-api/async-deep-map.js.map +0 -1
  132. package/dist/es5/lib/texture-api/deep-load.js +0 -63
  133. package/dist/es5/lib/texture-api/deep-load.js.map +0 -1
  134. package/dist/es5/lib/texture-api/generate-url.js +0 -20
  135. package/dist/es5/lib/texture-api/generate-url.js.map +0 -1
  136. package/dist/es5/lib/texture-api/load-image-array.js +0 -75
  137. package/dist/es5/lib/texture-api/load-image-array.js.map +0 -1
  138. package/dist/es5/lib/texture-api/load-image-cube.js +0 -136
  139. package/dist/es5/lib/texture-api/load-image-cube.js.map +0 -1
  140. package/dist/es5/lib/texture-api/load-image.js +0 -129
  141. package/dist/es5/lib/texture-api/load-image.js.map +0 -1
  142. package/dist/es5/lib/texture-api/texture-api-types.js +0 -2
  143. package/dist/es5/lib/texture-api/texture-api-types.js.map +0 -1
  144. package/dist/es5/lib/utils/extract-mipmap-images.js +0 -41
  145. package/dist/es5/lib/utils/extract-mipmap-images.js.map +0 -1
  146. package/dist/es5/lib/utils/ktx-format-helper.js +0 -79
  147. package/dist/es5/lib/utils/ktx-format-helper.js.map +0 -1
  148. package/dist/es5/lib/utils/texture-formats.js +0 -54
  149. package/dist/es5/lib/utils/texture-formats.js.map +0 -1
  150. package/dist/es5/lib/utils/version.js +0 -9
  151. package/dist/es5/lib/utils/version.js.map +0 -1
  152. package/dist/es5/npy-loader.js +0 -51
  153. package/dist/es5/npy-loader.js.map +0 -1
  154. package/dist/es5/types.js +0 -2
  155. package/dist/es5/types.js.map +0 -1
  156. package/dist/es5/workers/basis-worker-node.js +0 -7
  157. package/dist/es5/workers/basis-worker-node.js.map +0 -1
  158. package/dist/es5/workers/basis-worker.js +0 -6
  159. package/dist/es5/workers/basis-worker.js.map +0 -1
  160. package/dist/es5/workers/compressed-texture-worker.js +0 -6
  161. package/dist/es5/workers/compressed-texture-worker.js.map +0 -1
  162. package/dist/es5/workers/crunch-worker.js +0 -19
  163. package/dist/es5/workers/crunch-worker.js.map +0 -1
  164. package/dist/es5/workers/ktx2-basis-writer-worker-node.js +0 -54
  165. package/dist/es5/workers/ktx2-basis-writer-worker-node.js.map +0 -1
  166. package/dist/es5/workers/ktx2-basis-writer-worker.js +0 -53
  167. package/dist/es5/workers/ktx2-basis-writer-worker.js.map +0 -1
  168. package/dist/es5/workers/npy-worker.js +0 -6
  169. package/dist/es5/workers/npy-worker.js.map +0 -1
  170. package/dist/esm/basis-loader.js.map +0 -1
  171. package/dist/esm/bundle.js +0 -4
  172. package/dist/esm/bundle.js.map +0 -1
  173. package/dist/esm/compressed-texture-loader.js.map +0 -1
  174. package/dist/esm/compressed-texture-writer.js.map +0 -1
  175. package/dist/esm/crunch-loader.js.map +0 -1
  176. package/dist/esm/index.js +0 -31
  177. package/dist/esm/index.js.map +0 -1
  178. package/dist/esm/ktx2-basis-writer.js.map +0 -1
  179. package/dist/esm/lib/encoders/encode-ktx.js.map +0 -1
  180. package/dist/esm/lib/encoders/encode-ktx2-basis-texture.js.map +0 -1
  181. package/dist/esm/lib/encoders/encode-texture.js.map +0 -1
  182. package/dist/esm/lib/gl-extensions.js.map +0 -1
  183. package/dist/esm/lib/parsers/basis-module-loader.js.map +0 -1
  184. package/dist/esm/lib/parsers/crunch-module-loader.js.map +0 -1
  185. package/dist/esm/lib/parsers/parse-basis.js.map +0 -1
  186. package/dist/esm/lib/parsers/parse-compressed-texture.js.map +0 -1
  187. package/dist/esm/lib/parsers/parse-crunch.js.map +0 -1
  188. package/dist/esm/lib/parsers/parse-dds.js.map +0 -1
  189. package/dist/esm/lib/parsers/parse-ktx.js.map +0 -1
  190. package/dist/esm/lib/parsers/parse-npy.js.map +0 -1
  191. package/dist/esm/lib/parsers/parse-pvr.js.map +0 -1
  192. package/dist/esm/lib/texture-api/async-deep-map.js.map +0 -1
  193. package/dist/esm/lib/texture-api/deep-load.js.map +0 -1
  194. package/dist/esm/lib/texture-api/generate-url.js.map +0 -1
  195. package/dist/esm/lib/texture-api/load-image-array.js.map +0 -1
  196. package/dist/esm/lib/texture-api/load-image-cube.js.map +0 -1
  197. package/dist/esm/lib/texture-api/load-image.js.map +0 -1
  198. package/dist/esm/lib/texture-api/texture-api-types.js.map +0 -1
  199. package/dist/esm/lib/utils/extract-mipmap-images.js.map +0 -1
  200. package/dist/esm/lib/utils/ktx-format-helper.js.map +0 -1
  201. package/dist/esm/lib/utils/texture-formats.js.map +0 -1
  202. package/dist/esm/lib/utils/version.js +0 -2
  203. package/dist/esm/lib/utils/version.js.map +0 -1
  204. package/dist/esm/libs/README.md +0 -9
  205. package/dist/esm/libs/basis_encoder.js +0 -21
  206. package/dist/esm/libs/basis_encoder.wasm +0 -0
  207. package/dist/esm/libs/basis_transcoder.js +0 -22
  208. package/dist/esm/libs/basis_transcoder.wasm +0 -0
  209. package/dist/esm/libs/crunch.js +0 -136
  210. package/dist/esm/npy-loader.js.map +0 -1
  211. package/dist/esm/types.js.map +0 -1
  212. package/dist/esm/workers/basis-worker-node.js.map +0 -1
  213. package/dist/esm/workers/basis-worker.js.map +0 -1
  214. package/dist/esm/workers/compressed-texture-worker.js +0 -4
  215. package/dist/esm/workers/compressed-texture-worker.js.map +0 -1
  216. package/dist/esm/workers/crunch-worker.js.map +0 -1
  217. package/dist/esm/workers/ktx2-basis-writer-worker-node.js.map +0 -1
  218. package/dist/esm/workers/ktx2-basis-writer-worker.js.map +0 -1
  219. package/dist/esm/workers/npy-worker.js.map +0 -1
  220. package/src/bundle.ts +0 -4
  221. /package/dist/{esm/lib → lib}/encoders/encode-ktx.js +0 -0
  222. /package/dist/{esm/lib → lib}/encoders/encode-texture.js +0 -0
  223. /package/dist/{esm/lib → lib}/gl-extensions.js +0 -0
  224. /package/dist/{esm/lib → lib}/parsers/basis-module-loader.js +0 -0
  225. /package/dist/{esm/lib → lib}/parsers/crunch-module-loader.js +0 -0
  226. /package/dist/{esm/lib → lib}/texture-api/async-deep-map.js +0 -0
  227. /package/dist/{esm/lib → lib}/texture-api/texture-api-types.js +0 -0
  228. /package/dist/{esm/lib → lib}/utils/extract-mipmap-images.js +0 -0
  229. /package/dist/{es5 → libs}/libs/README.md +0 -0
  230. /package/dist/{es5 → libs}/libs/basis_encoder.js +0 -0
  231. /package/dist/{es5 → libs}/libs/basis_encoder.wasm +0 -0
  232. /package/dist/{es5 → libs}/libs/basis_transcoder.js +0 -0
  233. /package/dist/{es5 → libs}/libs/basis_transcoder.wasm +0 -0
  234. /package/dist/{es5 → libs}/libs/crunch.js +0 -0
  235. /package/dist/{esm/types.js → types.js} +0 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,1360 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ BASIS_EXTERNAL_LIBRARIES: () => BASIS_EXTERNAL_LIBRARIES,
24
+ BasisLoader: () => BasisLoader,
25
+ BasisWorkerLoader: () => BasisWorkerLoader,
26
+ CRUNCH_EXTERNAL_LIBRARIES: () => CRUNCH_EXTERNAL_LIBRARIES,
27
+ CompressedTextureLoader: () => CompressedTextureLoader,
28
+ CompressedTextureWorkerLoader: () => CompressedTextureWorkerLoader,
29
+ CompressedTextureWriter: () => CompressedTextureWriter,
30
+ CrunchLoader: () => CrunchLoader,
31
+ CrunchWorkerLoader: () => CrunchLoader,
32
+ GL_EXTENSIONS_CONSTANTS: () => GL_EXTENSIONS_CONSTANTS,
33
+ KTX2BasisWriter: () => KTX2BasisWriter,
34
+ KTX2BasisWriterWorker: () => KTX2BasisWriterWorker,
35
+ NPYLoader: () => NPYLoader,
36
+ NPYWorkerLoader: () => NPYWorkerLoader,
37
+ getSupportedGPUTextureFormats: () => getSupportedGPUTextureFormats,
38
+ loadImageTexture: () => loadImageTexture,
39
+ loadImageTextureArray: () => loadImageTextureArray,
40
+ loadImageTextureCube: () => loadImageTextureCube,
41
+ selectSupportedBasisFormat: () => selectSupportedBasisFormat
42
+ });
43
+ module.exports = __toCommonJS(src_exports);
44
+
45
+ // src/lib/utils/version.ts
46
+ var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "beta";
47
+
48
+ // src/lib/parsers/basis-module-loader.ts
49
+ var import_worker_utils = require("@loaders.gl/worker-utils");
50
+ var BASIS_EXTERNAL_LIBRARIES = {
51
+ /** Basis transcoder, javascript wrapper part */
52
+ TRANSCODER: "basis_transcoder.js",
53
+ /** Basis transcoder, compiled web assembly part */
54
+ TRANSCODER_WASM: "basis_transcoder.wasm",
55
+ /** Basis encoder, javascript wrapper part */
56
+ ENCODER: "basis_encoder.js",
57
+ /** Basis encoder, compiled web assembly part */
58
+ ENCODER_WASM: "basis_encoder.wasm"
59
+ };
60
+ var loadBasisTranscoderPromise;
61
+ async function loadBasisTranscoderModule(options) {
62
+ const modules = options.modules || {};
63
+ if (modules.basis) {
64
+ return modules.basis;
65
+ }
66
+ loadBasisTranscoderPromise = loadBasisTranscoderPromise || loadBasisTranscoder(options);
67
+ return await loadBasisTranscoderPromise;
68
+ }
69
+ async function loadBasisTranscoder(options) {
70
+ let BASIS = null;
71
+ let wasmBinary = null;
72
+ [BASIS, wasmBinary] = await Promise.all([
73
+ await (0, import_worker_utils.loadLibrary)(BASIS_EXTERNAL_LIBRARIES.TRANSCODER, "textures", options),
74
+ await (0, import_worker_utils.loadLibrary)(BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, "textures", options)
75
+ ]);
76
+ BASIS = BASIS || globalThis.BASIS;
77
+ return await initializeBasisTranscoderModule(BASIS, wasmBinary);
78
+ }
79
+ function initializeBasisTranscoderModule(BasisModule, wasmBinary) {
80
+ const options = {};
81
+ if (wasmBinary) {
82
+ options.wasmBinary = wasmBinary;
83
+ }
84
+ return new Promise((resolve) => {
85
+ BasisModule(options).then((module2) => {
86
+ const { BasisFile, initializeBasis } = module2;
87
+ initializeBasis();
88
+ resolve({ BasisFile });
89
+ });
90
+ });
91
+ }
92
+ var loadBasisEncoderPromise;
93
+ async function loadBasisEncoderModule(options) {
94
+ const modules = options.modules || {};
95
+ if (modules.basisEncoder) {
96
+ return modules.basisEncoder;
97
+ }
98
+ loadBasisEncoderPromise = loadBasisEncoderPromise || loadBasisEncoder(options);
99
+ return await loadBasisEncoderPromise;
100
+ }
101
+ async function loadBasisEncoder(options) {
102
+ let BASIS_ENCODER = null;
103
+ let wasmBinary = null;
104
+ [BASIS_ENCODER, wasmBinary] = await Promise.all([
105
+ await (0, import_worker_utils.loadLibrary)(BASIS_EXTERNAL_LIBRARIES.ENCODER, "textures", options),
106
+ await (0, import_worker_utils.loadLibrary)(BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, "textures", options)
107
+ ]);
108
+ BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;
109
+ return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);
110
+ }
111
+ function initializeBasisEncoderModule(BasisEncoderModule, wasmBinary) {
112
+ const options = {};
113
+ if (wasmBinary) {
114
+ options.wasmBinary = wasmBinary;
115
+ }
116
+ return new Promise((resolve) => {
117
+ BasisEncoderModule(options).then((module2) => {
118
+ const { BasisFile, KTX2File, initializeBasis, BasisEncoder } = module2;
119
+ initializeBasis();
120
+ resolve({ BasisFile, KTX2File, BasisEncoder });
121
+ });
122
+ });
123
+ }
124
+
125
+ // src/lib/gl-extensions.ts
126
+ var GL_EXTENSIONS_CONSTANTS = {
127
+ // WEBGL_compressed_texture_s3tc
128
+ COMPRESSED_RGB_S3TC_DXT1_EXT: 33776,
129
+ COMPRESSED_RGBA_S3TC_DXT1_EXT: 33777,
130
+ COMPRESSED_RGBA_S3TC_DXT3_EXT: 33778,
131
+ COMPRESSED_RGBA_S3TC_DXT5_EXT: 33779,
132
+ // WEBGL_compressed_texture_es3
133
+ COMPRESSED_R11_EAC: 37488,
134
+ COMPRESSED_SIGNED_R11_EAC: 37489,
135
+ COMPRESSED_RG11_EAC: 37490,
136
+ COMPRESSED_SIGNED_RG11_EAC: 37491,
137
+ COMPRESSED_RGB8_ETC2: 37492,
138
+ COMPRESSED_RGBA8_ETC2_EAC: 37493,
139
+ COMPRESSED_SRGB8_ETC2: 37494,
140
+ COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 37495,
141
+ COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37496,
142
+ COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 37497,
143
+ // WEBGL_compressed_texture_pvrtc
144
+ COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 35840,
145
+ COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 35842,
146
+ COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 35841,
147
+ COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 35843,
148
+ // WEBGL_compressed_texture_etc1
149
+ COMPRESSED_RGB_ETC1_WEBGL: 36196,
150
+ // WEBGL_compressed_texture_atc
151
+ COMPRESSED_RGB_ATC_WEBGL: 35986,
152
+ COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: 35987,
153
+ COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: 34798,
154
+ // WEBGL_compressed_texture_astc
155
+ COMPRESSED_RGBA_ASTC_4X4_KHR: 37808,
156
+ COMPRESSED_RGBA_ASTC_5X4_KHR: 37809,
157
+ COMPRESSED_RGBA_ASTC_5X5_KHR: 37810,
158
+ COMPRESSED_RGBA_ASTC_6X5_KHR: 37811,
159
+ COMPRESSED_RGBA_ASTC_6X6_KHR: 37812,
160
+ COMPRESSED_RGBA_ASTC_8X5_KHR: 37813,
161
+ COMPRESSED_RGBA_ASTC_8X6_KHR: 37814,
162
+ COMPRESSED_RGBA_ASTC_8X8_KHR: 37815,
163
+ COMPRESSED_RGBA_ASTC_10X5_KHR: 37816,
164
+ COMPRESSED_RGBA_ASTC_10X6_KHR: 37817,
165
+ COMPRESSED_RGBA_ASTC_10X8_KHR: 37818,
166
+ COMPRESSED_RGBA_ASTC_10X10_KHR: 37819,
167
+ COMPRESSED_RGBA_ASTC_12X10_KHR: 37820,
168
+ COMPRESSED_RGBA_ASTC_12X12_KHR: 37821,
169
+ COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR: 37840,
170
+ COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR: 37841,
171
+ COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR: 37842,
172
+ COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR: 37843,
173
+ COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR: 37844,
174
+ COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR: 37845,
175
+ COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR: 37846,
176
+ COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR: 37847,
177
+ COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR: 37848,
178
+ COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR: 37849,
179
+ COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR: 37850,
180
+ COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR: 37851,
181
+ COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR: 37852,
182
+ COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR: 37853,
183
+ // EXT_texture_compression_rgtc
184
+ COMPRESSED_RED_RGTC1_EXT: 36283,
185
+ COMPRESSED_SIGNED_RED_RGTC1_EXT: 36284,
186
+ COMPRESSED_RED_GREEN_RGTC2_EXT: 36285,
187
+ COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: 36286,
188
+ // WEBGL_compressed_texture_s3tc_srgb
189
+ COMPRESSED_SRGB_S3TC_DXT1_EXT: 35916,
190
+ COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 35917,
191
+ COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 35918,
192
+ COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 35919
193
+ };
194
+
195
+ // src/lib/utils/texture-formats.ts
196
+ var BROWSER_PREFIXES = ["", "WEBKIT_", "MOZ_"];
197
+ var WEBGL_EXTENSIONS = {
198
+ /* eslint-disable camelcase */
199
+ WEBGL_compressed_texture_s3tc: "dxt",
200
+ WEBGL_compressed_texture_s3tc_srgb: "dxt-srgb",
201
+ WEBGL_compressed_texture_etc1: "etc1",
202
+ WEBGL_compressed_texture_etc: "etc2",
203
+ WEBGL_compressed_texture_pvrtc: "pvrtc",
204
+ WEBGL_compressed_texture_atc: "atc",
205
+ WEBGL_compressed_texture_astc: "astc",
206
+ EXT_texture_compression_rgtc: "rgtc"
207
+ /* eslint-enable camelcase */
208
+ };
209
+ var formats = null;
210
+ function getSupportedGPUTextureFormats(gl) {
211
+ if (!formats) {
212
+ gl = gl || getWebGLContext() || void 0;
213
+ formats = /* @__PURE__ */ new Set();
214
+ for (const prefix of BROWSER_PREFIXES) {
215
+ for (const extension in WEBGL_EXTENSIONS) {
216
+ if (gl && gl.getExtension(`${prefix}${extension}`)) {
217
+ const gpuTextureFormat = WEBGL_EXTENSIONS[extension];
218
+ formats.add(gpuTextureFormat);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ return formats;
224
+ }
225
+ function getWebGLContext() {
226
+ try {
227
+ const canvas = document.createElement("canvas");
228
+ return canvas.getContext("webgl");
229
+ } catch (error) {
230
+ return null;
231
+ }
232
+ }
233
+
234
+ // src/lib/parsers/parse-ktx.ts
235
+ var import_ktx_parse = require("ktx-parse");
236
+
237
+ // src/lib/utils/extract-mipmap-images.ts
238
+ function extractMipmapImages(data, options) {
239
+ const images = new Array(options.mipMapLevels);
240
+ let levelWidth = options.width;
241
+ let levelHeight = options.height;
242
+ let offset = 0;
243
+ for (let i = 0; i < options.mipMapLevels; ++i) {
244
+ const levelSize = getLevelSize(options, levelWidth, levelHeight, data, i);
245
+ const levelData = getLevelData(data, i, offset, levelSize);
246
+ images[i] = {
247
+ compressed: true,
248
+ format: options.internalFormat,
249
+ data: levelData,
250
+ width: levelWidth,
251
+ height: levelHeight,
252
+ levelSize
253
+ };
254
+ levelWidth = Math.max(1, levelWidth >> 1);
255
+ levelHeight = Math.max(1, levelHeight >> 1);
256
+ offset += levelSize;
257
+ }
258
+ return images;
259
+ }
260
+ function getLevelData(data, index, offset, levelSize) {
261
+ if (!Array.isArray(data)) {
262
+ return new Uint8Array(data.buffer, data.byteOffset + offset, levelSize);
263
+ }
264
+ return data[index].levelData;
265
+ }
266
+ function getLevelSize(options, levelWidth, levelHeight, data, index) {
267
+ if (!Array.isArray(data)) {
268
+ return options.sizeFunction(levelWidth, levelHeight);
269
+ }
270
+ return options.sizeFunction(data[index]);
271
+ }
272
+
273
+ // src/lib/utils/ktx-format-helper.ts
274
+ var VULKAN_TO_WEBGL_FORMAT_MAP = {
275
+ 131: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_S3TC_DXT1_EXT,
276
+ 132: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB_S3TC_DXT1_EXT,
277
+ 133: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT1_EXT,
278
+ 134: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
279
+ 135: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT3_EXT,
280
+ 136: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,
281
+ 137: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT5_EXT,
282
+ 138: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,
283
+ 139: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RED_RGTC1_EXT,
284
+ 140: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SIGNED_RED_RGTC1_EXT,
285
+ 141: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RED_GREEN_RGTC2_EXT,
286
+ 142: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT,
287
+ 147: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB8_ETC2,
288
+ 148: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ETC2,
289
+ 149: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
290
+ 150: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
291
+ 151: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA8_ETC2_EAC,
292
+ 152: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
293
+ 153: GL_EXTENSIONS_CONSTANTS.COMPRESSED_R11_EAC,
294
+ 154: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SIGNED_R11_EAC,
295
+ 155: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RG11_EAC,
296
+ 156: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SIGNED_RG11_EAC,
297
+ // @ts-ignore
298
+ 157: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_4x4_KHR,
299
+ // @ts-ignore
300
+ 158: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,
301
+ // @ts-ignore
302
+ 159: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_5x4_KHR,
303
+ // @ts-ignore
304
+ 160: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR,
305
+ // @ts-ignore
306
+ 161: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_5x5_KHR,
307
+ // @ts-ignore
308
+ 162: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,
309
+ // @ts-ignore
310
+ 163: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_6x5_KHR,
311
+ // @ts-ignore
312
+ 164: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
313
+ // @ts-ignore
314
+ 165: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_6x6_KHR,
315
+ // @ts-ignore
316
+ 166: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,
317
+ // @ts-ignore
318
+ 167: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8x5_KHR,
319
+ // @ts-ignore
320
+ 168: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
321
+ // @ts-ignore
322
+ 169: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8x6_KHR,
323
+ // @ts-ignore
324
+ 170: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,
325
+ // @ts-ignore
326
+ 171: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8x8_KHR,
327
+ // @ts-ignore
328
+ 172: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
329
+ // @ts-ignore
330
+ 173: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x5_KHR,
331
+ // @ts-ignore
332
+ 174: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,
333
+ // @ts-ignore
334
+ 175: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x6_KHR,
335
+ // @ts-ignore
336
+ 176: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
337
+ // @ts-ignore
338
+ 177: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x8_KHR,
339
+ // @ts-ignore
340
+ 178: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,
341
+ // @ts-ignore
342
+ 179: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x10_KHR,
343
+ // @ts-ignore
344
+ 180: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
345
+ // @ts-ignore
346
+ 181: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_12x10_KHR,
347
+ // @ts-ignore
348
+ 182: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,
349
+ // @ts-ignore
350
+ 183: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_12x12_KHR,
351
+ // @ts-ignore
352
+ 184: GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,
353
+ 1000054e3: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,
354
+ 1000054001: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,
355
+ // @ts-ignore
356
+ 1000066e3: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_4x4_KHR,
357
+ // @ts-ignore
358
+ 1000066001: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_5x4_KHR,
359
+ // @ts-ignore
360
+ 1000066002: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_5x5_KHR,
361
+ // @ts-ignore
362
+ 1000066003: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_6x5_KHR,
363
+ // @ts-ignore
364
+ 1000066004: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_6x6_KHR,
365
+ // @ts-ignore
366
+ 1000066005: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8x5_KHR,
367
+ // @ts-ignore
368
+ 1000066006: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8x6_KHR,
369
+ // @ts-ignore
370
+ 1000066007: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8x8_KHR,
371
+ // @ts-ignore
372
+ 1000066008: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x5_KHR,
373
+ // @ts-ignore
374
+ 1000066009: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x6_KHR,
375
+ // @ts-ignore
376
+ 1000066010: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x8_KHR,
377
+ // @ts-ignore
378
+ 1000066011: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10x10_KHR,
379
+ // @ts-ignore
380
+ 1000066012: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_12x10_KHR,
381
+ // @ts-ignore
382
+ 1000066013: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_12x12_KHR
383
+ };
384
+ function mapVkFormatToWebGL(vkFormat) {
385
+ return VULKAN_TO_WEBGL_FORMAT_MAP[vkFormat];
386
+ }
387
+
388
+ // src/lib/parsers/parse-ktx.ts
389
+ var KTX2_ID = [
390
+ // '´', 'K', 'T', 'X', '2', '0', 'ª', '\r', '\n', '\x1A', '\n'
391
+ 171,
392
+ 75,
393
+ 84,
394
+ 88,
395
+ 32,
396
+ 50,
397
+ 48,
398
+ 187,
399
+ 13,
400
+ 10,
401
+ 26,
402
+ 10
403
+ ];
404
+ function isKTX(data) {
405
+ const id = new Uint8Array(data);
406
+ const notKTX = id.byteLength < KTX2_ID.length || id[0] !== KTX2_ID[0] || // '´'
407
+ id[1] !== KTX2_ID[1] || // 'K'
408
+ id[2] !== KTX2_ID[2] || // 'T'
409
+ id[3] !== KTX2_ID[3] || // 'X'
410
+ id[4] !== KTX2_ID[4] || // ' '
411
+ id[5] !== KTX2_ID[5] || // '2'
412
+ id[6] !== KTX2_ID[6] || // '0'
413
+ id[7] !== KTX2_ID[7] || // 'ª'
414
+ id[8] !== KTX2_ID[8] || // '\r'
415
+ id[9] !== KTX2_ID[9] || // '\n'
416
+ id[10] !== KTX2_ID[10] || // '\x1A'
417
+ id[11] !== KTX2_ID[11];
418
+ return !notKTX;
419
+ }
420
+ function parseKTX(arrayBuffer) {
421
+ const uint8Array = new Uint8Array(arrayBuffer);
422
+ const ktx = (0, import_ktx_parse.read)(uint8Array);
423
+ const mipMapLevels = Math.max(1, ktx.levels.length);
424
+ const width = ktx.pixelWidth;
425
+ const height = ktx.pixelHeight;
426
+ const internalFormat = mapVkFormatToWebGL(ktx.vkFormat);
427
+ return extractMipmapImages(ktx.levels, {
428
+ mipMapLevels,
429
+ width,
430
+ height,
431
+ sizeFunction: (level) => level.uncompressedByteLength,
432
+ internalFormat
433
+ });
434
+ }
435
+
436
+ // src/lib/parsers/parse-basis.ts
437
+ var OutputFormat = {
438
+ etc1: {
439
+ basisFormat: 0,
440
+ compressed: true,
441
+ format: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_ETC1_WEBGL
442
+ },
443
+ etc2: { basisFormat: 1, compressed: true },
444
+ bc1: {
445
+ basisFormat: 2,
446
+ compressed: true,
447
+ format: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_S3TC_DXT1_EXT
448
+ },
449
+ bc3: {
450
+ basisFormat: 3,
451
+ compressed: true,
452
+ format: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT5_EXT
453
+ },
454
+ bc4: { basisFormat: 4, compressed: true },
455
+ bc5: { basisFormat: 5, compressed: true },
456
+ "bc7-m6-opaque-only": { basisFormat: 6, compressed: true },
457
+ "bc7-m5": { basisFormat: 7, compressed: true },
458
+ "pvrtc1-4-rgb": {
459
+ basisFormat: 8,
460
+ compressed: true,
461
+ format: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_PVRTC_4BPPV1_IMG
462
+ },
463
+ "pvrtc1-4-rgba": {
464
+ basisFormat: 9,
465
+ compressed: true,
466
+ format: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
467
+ },
468
+ "astc-4x4": {
469
+ basisFormat: 10,
470
+ compressed: true,
471
+ format: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_4X4_KHR
472
+ },
473
+ "atc-rgb": { basisFormat: 11, compressed: true },
474
+ "atc-rgba-interpolated-alpha": { basisFormat: 12, compressed: true },
475
+ rgba32: { basisFormat: 13, compressed: false },
476
+ rgb565: { basisFormat: 14, compressed: false },
477
+ bgr565: { basisFormat: 15, compressed: false },
478
+ rgba4444: { basisFormat: 16, compressed: false }
479
+ };
480
+ async function parseBasis(data, options) {
481
+ if (options.basis.containerFormat === "auto") {
482
+ if (isKTX(data)) {
483
+ const fileConstructors = await loadBasisEncoderModule(options);
484
+ return parseKTX2File(fileConstructors.KTX2File, data, options);
485
+ }
486
+ const { BasisFile } = await loadBasisTranscoderModule(options);
487
+ return parseBasisFile(BasisFile, data, options);
488
+ }
489
+ switch (options.basis.module) {
490
+ case "encoder":
491
+ const fileConstructors = await loadBasisEncoderModule(options);
492
+ switch (options.basis.containerFormat) {
493
+ case "ktx2":
494
+ return parseKTX2File(fileConstructors.KTX2File, data, options);
495
+ case "basis":
496
+ default:
497
+ return parseBasisFile(fileConstructors.BasisFile, data, options);
498
+ }
499
+ case "transcoder":
500
+ default:
501
+ const { BasisFile } = await loadBasisTranscoderModule(options);
502
+ return parseBasisFile(BasisFile, data, options);
503
+ }
504
+ }
505
+ function parseBasisFile(BasisFile, data, options) {
506
+ const basisFile = new BasisFile(new Uint8Array(data));
507
+ try {
508
+ if (!basisFile.startTranscoding()) {
509
+ throw new Error("Failed to start basis transcoding");
510
+ }
511
+ const imageCount = basisFile.getNumImages();
512
+ const images = [];
513
+ for (let imageIndex = 0; imageIndex < imageCount; imageIndex++) {
514
+ const levelsCount = basisFile.getNumLevels(imageIndex);
515
+ const levels = [];
516
+ for (let levelIndex = 0; levelIndex < levelsCount; levelIndex++) {
517
+ levels.push(transcodeImage(basisFile, imageIndex, levelIndex, options));
518
+ }
519
+ images.push(levels);
520
+ }
521
+ return images;
522
+ } finally {
523
+ basisFile.close();
524
+ basisFile.delete();
525
+ }
526
+ }
527
+ function transcodeImage(basisFile, imageIndex, levelIndex, options) {
528
+ const width = basisFile.getImageWidth(imageIndex, levelIndex);
529
+ const height = basisFile.getImageHeight(imageIndex, levelIndex);
530
+ const hasAlpha = basisFile.getHasAlpha(
531
+ /* imageIndex, levelIndex */
532
+ );
533
+ const { compressed, format, basisFormat } = getBasisOptions(options, hasAlpha);
534
+ const decodedSize = basisFile.getImageTranscodedSizeInBytes(imageIndex, levelIndex, basisFormat);
535
+ const decodedData = new Uint8Array(decodedSize);
536
+ if (!basisFile.transcodeImage(decodedData, imageIndex, levelIndex, basisFormat, 0, 0)) {
537
+ throw new Error("failed to start Basis transcoding");
538
+ }
539
+ return {
540
+ // standard loaders.gl image category payload
541
+ width,
542
+ height,
543
+ data: decodedData,
544
+ compressed,
545
+ format,
546
+ // Additional fields
547
+ // Add levelSize field.
548
+ hasAlpha
549
+ };
550
+ }
551
+ function parseKTX2File(KTX2File, data, options) {
552
+ const ktx2File = new KTX2File(new Uint8Array(data));
553
+ try {
554
+ if (!ktx2File.startTranscoding()) {
555
+ throw new Error("failed to start KTX2 transcoding");
556
+ }
557
+ const levelsCount = ktx2File.getLevels();
558
+ const levels = [];
559
+ for (let levelIndex = 0; levelIndex < levelsCount; levelIndex++) {
560
+ levels.push(transcodeKTX2Image(ktx2File, levelIndex, options));
561
+ break;
562
+ }
563
+ return [levels];
564
+ } finally {
565
+ ktx2File.close();
566
+ ktx2File.delete();
567
+ }
568
+ }
569
+ function transcodeKTX2Image(ktx2File, levelIndex, options) {
570
+ const { alphaFlag, height, width } = ktx2File.getImageLevelInfo(levelIndex, 0, 0);
571
+ const { compressed, format, basisFormat } = getBasisOptions(options, alphaFlag);
572
+ const decodedSize = ktx2File.getImageTranscodedSizeInBytes(
573
+ levelIndex,
574
+ 0,
575
+ 0,
576
+ basisFormat
577
+ );
578
+ const decodedData = new Uint8Array(decodedSize);
579
+ if (!ktx2File.transcodeImage(
580
+ decodedData,
581
+ levelIndex,
582
+ 0,
583
+ 0,
584
+ basisFormat,
585
+ 0,
586
+ -1,
587
+ -1
588
+ /* channel1 */
589
+ )) {
590
+ throw new Error("Failed to transcode KTX2 image");
591
+ }
592
+ return {
593
+ // standard loaders.gl image category payload
594
+ width,
595
+ height,
596
+ data: decodedData,
597
+ compressed,
598
+ // Additional fields
599
+ levelSize: decodedSize,
600
+ hasAlpha: alphaFlag,
601
+ format
602
+ };
603
+ }
604
+ function getBasisOptions(options, hasAlpha) {
605
+ let format = options && options.basis && options.basis.format;
606
+ if (format === "auto") {
607
+ format = selectSupportedBasisFormat();
608
+ }
609
+ if (typeof format === "object") {
610
+ format = hasAlpha ? format.alpha : format.noAlpha;
611
+ }
612
+ format = format.toLowerCase();
613
+ return OutputFormat[format];
614
+ }
615
+ function selectSupportedBasisFormat() {
616
+ const supportedFormats = getSupportedGPUTextureFormats();
617
+ if (supportedFormats.has("astc")) {
618
+ return "astc-4x4";
619
+ } else if (supportedFormats.has("dxt")) {
620
+ return {
621
+ alpha: "bc3",
622
+ noAlpha: "bc1"
623
+ };
624
+ } else if (supportedFormats.has("pvrtc")) {
625
+ return {
626
+ alpha: "pvrtc1-4-rgba",
627
+ noAlpha: "pvrtc1-4-rgb"
628
+ };
629
+ } else if (supportedFormats.has("etc1")) {
630
+ return "etc1";
631
+ } else if (supportedFormats.has("etc2")) {
632
+ return "etc2";
633
+ }
634
+ return "rgb565";
635
+ }
636
+
637
+ // src/basis-loader.ts
638
+ var BasisWorkerLoader = {
639
+ name: "Basis",
640
+ id: "basis",
641
+ module: "textures",
642
+ version: VERSION,
643
+ worker: true,
644
+ extensions: ["basis", "ktx2"],
645
+ mimeTypes: ["application/octet-stream", "image/ktx2"],
646
+ tests: ["sB"],
647
+ binary: true,
648
+ options: {
649
+ basis: {
650
+ format: "auto",
651
+ // gl context doesn't exist on a worker thread
652
+ libraryPath: "libs/",
653
+ containerFormat: "auto",
654
+ // 'basis' || 'ktx2' || 'auto'
655
+ module: "transcoder"
656
+ // 'transcoder' || 'encoder'
657
+ }
658
+ }
659
+ };
660
+ var BasisLoader = {
661
+ ...BasisWorkerLoader,
662
+ parse: parseBasis
663
+ };
664
+
665
+ // src/lib/parsers/parse-dds.ts
666
+ var import_loader_utils = require("@loaders.gl/loader-utils");
667
+ var DDS_CONSTANTS = {
668
+ MAGIC_NUMBER: 542327876,
669
+ HEADER_LENGTH: 31,
670
+ MAGIC_NUMBER_INDEX: 0,
671
+ HEADER_SIZE_INDEX: 1,
672
+ HEADER_FLAGS_INDEX: 2,
673
+ HEADER_HEIGHT_INDEX: 3,
674
+ HEADER_WIDTH_INDEX: 4,
675
+ MIPMAPCOUNT_INDEX: 7,
676
+ HEADER_PF_FLAGS_INDEX: 20,
677
+ HEADER_PF_FOURCC_INDEX: 21,
678
+ DDSD_MIPMAPCOUNT: 131072,
679
+ DDPF_FOURCC: 4
680
+ };
681
+ var DDS_PIXEL_FORMATS = {
682
+ DXT1: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_S3TC_DXT1_EXT,
683
+ DXT3: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT3_EXT,
684
+ DXT5: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT5_EXT,
685
+ "ATC ": GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_ATC_WEBGL,
686
+ ATCA: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL,
687
+ ATCI: GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL
688
+ };
689
+ var getATCLevelSize = getDxt1LevelSize;
690
+ var getATCALevelSize = getDxtXLevelSize;
691
+ var getATCILevelSize = getDxtXLevelSize;
692
+ var DDS_SIZE_FUNCTIONS = {
693
+ DXT1: getDxt1LevelSize,
694
+ DXT3: getDxtXLevelSize,
695
+ DXT5: getDxtXLevelSize,
696
+ "ATC ": getATCLevelSize,
697
+ ATCA: getATCALevelSize,
698
+ ATCI: getATCILevelSize
699
+ };
700
+ function isDDS(data) {
701
+ const header = new Uint32Array(data, 0, DDS_CONSTANTS.HEADER_LENGTH);
702
+ const magic = header[DDS_CONSTANTS.MAGIC_NUMBER_INDEX];
703
+ return magic === DDS_CONSTANTS.MAGIC_NUMBER;
704
+ }
705
+ function parseDDS(data) {
706
+ const header = new Int32Array(data, 0, DDS_CONSTANTS.HEADER_LENGTH);
707
+ const pixelFormatNumber = header[DDS_CONSTANTS.HEADER_PF_FOURCC_INDEX];
708
+ (0, import_loader_utils.assert)(
709
+ Boolean(header[DDS_CONSTANTS.HEADER_PF_FLAGS_INDEX] & DDS_CONSTANTS.DDPF_FOURCC),
710
+ "DDS: Unsupported format, must contain a FourCC code"
711
+ );
712
+ const fourCC = int32ToFourCC(pixelFormatNumber);
713
+ const internalFormat = DDS_PIXEL_FORMATS[fourCC];
714
+ const sizeFunction = DDS_SIZE_FUNCTIONS[fourCC];
715
+ (0, import_loader_utils.assert)(internalFormat && sizeFunction, `DDS: Unknown pixel format ${pixelFormatNumber}`);
716
+ let mipMapLevels = 1;
717
+ if (header[DDS_CONSTANTS.HEADER_FLAGS_INDEX] & DDS_CONSTANTS.DDSD_MIPMAPCOUNT) {
718
+ mipMapLevels = Math.max(1, header[DDS_CONSTANTS.MIPMAPCOUNT_INDEX]);
719
+ }
720
+ const width = header[DDS_CONSTANTS.HEADER_WIDTH_INDEX];
721
+ const height = header[DDS_CONSTANTS.HEADER_HEIGHT_INDEX];
722
+ const dataOffset = header[DDS_CONSTANTS.HEADER_SIZE_INDEX] + 4;
723
+ const image = new Uint8Array(data, dataOffset);
724
+ return extractMipmapImages(image, {
725
+ mipMapLevels,
726
+ width,
727
+ height,
728
+ sizeFunction,
729
+ internalFormat
730
+ });
731
+ }
732
+ function getDxt1LevelSize(width, height) {
733
+ return (width + 3 >> 2) * (height + 3 >> 2) * 8;
734
+ }
735
+ function getDxtXLevelSize(width, height) {
736
+ return (width + 3 >> 2) * (height + 3 >> 2) * 16;
737
+ }
738
+ function int32ToFourCC(value) {
739
+ return String.fromCharCode(
740
+ value & 255,
741
+ value >> 8 & 255,
742
+ value >> 16 & 255,
743
+ value >> 24 & 255
744
+ );
745
+ }
746
+
747
+ // src/lib/parsers/parse-pvr.ts
748
+ var PVR_CONSTANTS = {
749
+ MAGIC_NUMBER: 55727696,
750
+ MAGIC_NUMBER_EXTRA: 1347834371,
751
+ HEADER_LENGTH: 13,
752
+ HEADER_SIZE: 52,
753
+ MAGIC_NUMBER_INDEX: 0,
754
+ PIXEL_FORMAT_INDEX: 2,
755
+ COLOUR_SPACE_INDEX: 4,
756
+ HEIGHT_INDEX: 6,
757
+ WIDTH_INDEX: 7,
758
+ MIPMAPCOUNT_INDEX: 11,
759
+ METADATA_SIZE_INDEX: 12
760
+ };
761
+ var PVR_PIXEL_FORMATS = {
762
+ 0: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_PVRTC_2BPPV1_IMG],
763
+ 1: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG],
764
+ 2: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_PVRTC_4BPPV1_IMG],
765
+ 3: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG],
766
+ 6: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_ETC1_WEBGL],
767
+ 7: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_S3TC_DXT1_EXT],
768
+ 9: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT3_EXT],
769
+ 11: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT5_EXT],
770
+ 22: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB8_ETC2],
771
+ 23: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA8_ETC2_EAC],
772
+ 24: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2],
773
+ 25: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_R11_EAC],
774
+ 26: [GL_EXTENSIONS_CONSTANTS.COMPRESSED_RG11_EAC],
775
+ 27: [
776
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_4X4_KHR,
777
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR
778
+ ],
779
+ 28: [
780
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_5X4_KHR,
781
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR
782
+ ],
783
+ 29: [
784
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_5X5_KHR,
785
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR
786
+ ],
787
+ 30: [
788
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_6X5_KHR,
789
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR
790
+ ],
791
+ 31: [
792
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_6X6_KHR,
793
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR
794
+ ],
795
+ 32: [
796
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8X5_KHR,
797
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR
798
+ ],
799
+ 33: [
800
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8X6_KHR,
801
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR
802
+ ],
803
+ 34: [
804
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_8X8_KHR,
805
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR
806
+ ],
807
+ 35: [
808
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10X5_KHR,
809
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR
810
+ ],
811
+ 36: [
812
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10X6_KHR,
813
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR
814
+ ],
815
+ 37: [
816
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10X8_KHR,
817
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR
818
+ ],
819
+ 38: [
820
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_10X10_KHR,
821
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR
822
+ ],
823
+ 39: [
824
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_12X10_KHR,
825
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR
826
+ ],
827
+ 40: [
828
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_12X12_KHR,
829
+ GL_EXTENSIONS_CONSTANTS.COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR
830
+ ]
831
+ };
832
+ var PVR_SIZE_FUNCTIONS = {
833
+ 0: pvrtc2bppSize,
834
+ 1: pvrtc2bppSize,
835
+ 2: pvrtc4bppSize,
836
+ 3: pvrtc4bppSize,
837
+ 6: dxtEtcSmallSize,
838
+ 7: dxtEtcSmallSize,
839
+ 9: dxtEtcAstcBigSize,
840
+ 11: dxtEtcAstcBigSize,
841
+ 22: dxtEtcSmallSize,
842
+ 23: dxtEtcAstcBigSize,
843
+ 24: dxtEtcSmallSize,
844
+ 25: dxtEtcSmallSize,
845
+ 26: dxtEtcAstcBigSize,
846
+ 27: dxtEtcAstcBigSize,
847
+ 28: atc5x4Size,
848
+ 29: atc5x5Size,
849
+ 30: atc6x5Size,
850
+ 31: atc6x6Size,
851
+ 32: atc8x5Size,
852
+ 33: atc8x6Size,
853
+ 34: atc8x8Size,
854
+ 35: atc10x5Size,
855
+ 36: atc10x6Size,
856
+ 37: atc10x8Size,
857
+ 38: atc10x10Size,
858
+ 39: atc12x10Size,
859
+ 40: atc12x12Size
860
+ };
861
+ function isPVR(data) {
862
+ const header = new Uint32Array(data, 0, PVR_CONSTANTS.HEADER_LENGTH);
863
+ const version = header[PVR_CONSTANTS.MAGIC_NUMBER_INDEX];
864
+ return version === PVR_CONSTANTS.MAGIC_NUMBER || version === PVR_CONSTANTS.MAGIC_NUMBER_EXTRA;
865
+ }
866
+ function parsePVR(data) {
867
+ const header = new Uint32Array(data, 0, PVR_CONSTANTS.HEADER_LENGTH);
868
+ const pvrFormat = header[PVR_CONSTANTS.PIXEL_FORMAT_INDEX];
869
+ const colourSpace = header[PVR_CONSTANTS.COLOUR_SPACE_INDEX];
870
+ const pixelFormats = PVR_PIXEL_FORMATS[pvrFormat] || [];
871
+ const internalFormat = pixelFormats.length > 1 && colourSpace ? pixelFormats[1] : pixelFormats[0];
872
+ const sizeFunction = PVR_SIZE_FUNCTIONS[pvrFormat];
873
+ const mipMapLevels = header[PVR_CONSTANTS.MIPMAPCOUNT_INDEX];
874
+ const width = header[PVR_CONSTANTS.WIDTH_INDEX];
875
+ const height = header[PVR_CONSTANTS.HEIGHT_INDEX];
876
+ const dataOffset = PVR_CONSTANTS.HEADER_SIZE + header[PVR_CONSTANTS.METADATA_SIZE_INDEX];
877
+ const image = new Uint8Array(data, dataOffset);
878
+ return extractMipmapImages(image, {
879
+ mipMapLevels,
880
+ width,
881
+ height,
882
+ sizeFunction,
883
+ internalFormat
884
+ });
885
+ }
886
+ function pvrtc2bppSize(width, height) {
887
+ width = Math.max(width, 16);
888
+ height = Math.max(height, 8);
889
+ return width * height / 4;
890
+ }
891
+ function pvrtc4bppSize(width, height) {
892
+ width = Math.max(width, 8);
893
+ height = Math.max(height, 8);
894
+ return width * height / 2;
895
+ }
896
+ function dxtEtcSmallSize(width, height) {
897
+ return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;
898
+ }
899
+ function dxtEtcAstcBigSize(width, height) {
900
+ return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;
901
+ }
902
+ function atc5x4Size(width, height) {
903
+ return Math.floor((width + 4) / 5) * Math.floor((height + 3) / 4) * 16;
904
+ }
905
+ function atc5x5Size(width, height) {
906
+ return Math.floor((width + 4) / 5) * Math.floor((height + 4) / 5) * 16;
907
+ }
908
+ function atc6x5Size(width, height) {
909
+ return Math.floor((width + 5) / 6) * Math.floor((height + 4) / 5) * 16;
910
+ }
911
+ function atc6x6Size(width, height) {
912
+ return Math.floor((width + 5) / 6) * Math.floor((height + 5) / 6) * 16;
913
+ }
914
+ function atc8x5Size(width, height) {
915
+ return Math.floor((width + 7) / 8) * Math.floor((height + 4) / 5) * 16;
916
+ }
917
+ function atc8x6Size(width, height) {
918
+ return Math.floor((width + 7) / 8) * Math.floor((height + 5) / 6) * 16;
919
+ }
920
+ function atc8x8Size(width, height) {
921
+ return Math.floor((width + 7) / 8) * Math.floor((height + 7) / 8) * 16;
922
+ }
923
+ function atc10x5Size(width, height) {
924
+ return Math.floor((width + 9) / 10) * Math.floor((height + 4) / 5) * 16;
925
+ }
926
+ function atc10x6Size(width, height) {
927
+ return Math.floor((width + 9) / 10) * Math.floor((height + 5) / 6) * 16;
928
+ }
929
+ function atc10x8Size(width, height) {
930
+ return Math.floor((width + 9) / 10) * Math.floor((height + 7) / 8) * 16;
931
+ }
932
+ function atc10x10Size(width, height) {
933
+ return Math.floor((width + 9) / 10) * Math.floor((height + 9) / 10) * 16;
934
+ }
935
+ function atc12x10Size(width, height) {
936
+ return Math.floor((width + 11) / 12) * Math.floor((height + 9) / 10) * 16;
937
+ }
938
+ function atc12x12Size(width, height) {
939
+ return Math.floor((width + 11) / 12) * Math.floor((height + 11) / 12) * 16;
940
+ }
941
+
942
+ // src/lib/parsers/parse-compressed-texture.ts
943
+ function parseCompressedTexture(data) {
944
+ if (isKTX(data)) {
945
+ return parseKTX(data);
946
+ }
947
+ if (isDDS(data)) {
948
+ return parseDDS(data);
949
+ }
950
+ if (isPVR(data)) {
951
+ return parsePVR(data);
952
+ }
953
+ throw new Error("Texture container format not recognized");
954
+ }
955
+
956
+ // src/compressed-texture-loader.ts
957
+ var CompressedTextureWorkerLoader = {
958
+ name: "Texture Containers",
959
+ id: "compressed-texture",
960
+ module: "textures",
961
+ version: VERSION,
962
+ worker: true,
963
+ extensions: [
964
+ "ktx",
965
+ "ktx2",
966
+ "dds",
967
+ // WEBGL_compressed_texture_s3tc, WEBGL_compressed_texture_atc
968
+ "pvr"
969
+ // WEBGL_compressed_texture_pvrtc
970
+ ],
971
+ mimeTypes: [
972
+ "image/ktx2",
973
+ "image/ktx",
974
+ "image/vnd-ms.dds",
975
+ "image/x-dds",
976
+ "application/octet-stream"
977
+ ],
978
+ binary: true,
979
+ options: {
980
+ "compressed-texture": {
981
+ libraryPath: "libs/",
982
+ useBasis: false
983
+ }
984
+ }
985
+ };
986
+ var CompressedTextureLoader = {
987
+ ...CompressedTextureWorkerLoader,
988
+ parse: async (arrayBuffer, options) => {
989
+ var _a;
990
+ if ((_a = options == null ? void 0 : options["compressed-texture"]) == null ? void 0 : _a.useBasis) {
991
+ options.basis = {
992
+ format: {
993
+ alpha: "BC3",
994
+ noAlpha: "BC1"
995
+ },
996
+ // @ts-expect-error TODO not allowed to modify inputs
997
+ ...options.basis,
998
+ containerFormat: "ktx2",
999
+ module: "encoder"
1000
+ };
1001
+ const result = await parseBasis(arrayBuffer, options);
1002
+ return result[0];
1003
+ }
1004
+ return parseCompressedTexture(arrayBuffer);
1005
+ }
1006
+ };
1007
+
1008
+ // src/crunch-loader.ts
1009
+ var CrunchLoader = {
1010
+ id: "crunch",
1011
+ name: "Crunch",
1012
+ module: "textures",
1013
+ version: VERSION,
1014
+ worker: true,
1015
+ extensions: ["crn"],
1016
+ mimeTypes: ["image/crn", "image/x-crn", "application/octet-stream"],
1017
+ binary: true,
1018
+ options: {
1019
+ crunch: {
1020
+ libraryPath: "libs/"
1021
+ }
1022
+ }
1023
+ };
1024
+
1025
+ // src/lib/parsers/parse-npy.ts
1026
+ var a = new Uint32Array([305419896]);
1027
+ var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
1028
+ var isLittleEndian = !(b[0] === 18);
1029
+ var LITTLE_ENDIAN_OS = isLittleEndian;
1030
+ var DTYPES = {
1031
+ u1: Uint8Array,
1032
+ i1: Int8Array,
1033
+ u2: Uint16Array,
1034
+ i2: Int16Array,
1035
+ u4: Uint32Array,
1036
+ i4: Int32Array,
1037
+ f4: Float32Array,
1038
+ f8: Float64Array
1039
+ };
1040
+ function parseNPY(arrayBuffer, options) {
1041
+ var _a;
1042
+ const view = new DataView(arrayBuffer);
1043
+ const { header, headerEndOffset } = parseHeader(view);
1044
+ const numpyType = header.descr;
1045
+ const ArrayType = DTYPES[numpyType.slice(1, 3)];
1046
+ if (!ArrayType) {
1047
+ throw new Error(`Unimplemented type ${numpyType}`);
1048
+ }
1049
+ const nArrayElements = (_a = header.shape) == null ? void 0 : _a.reduce((a2, b2) => a2 * b2);
1050
+ const arrayByteLength = nArrayElements * ArrayType.BYTES_PER_ELEMENT;
1051
+ if (arrayBuffer.byteLength < headerEndOffset + arrayByteLength) {
1052
+ throw new Error("Buffer overflow");
1053
+ }
1054
+ const data = new ArrayType(arrayBuffer.slice(headerEndOffset, headerEndOffset + arrayByteLength));
1055
+ if (numpyType[0] === ">" && LITTLE_ENDIAN_OS || numpyType[0] === "<" && !LITTLE_ENDIAN_OS) {
1056
+ throw new Error("Incorrect endianness");
1057
+ }
1058
+ return {
1059
+ data,
1060
+ header
1061
+ };
1062
+ }
1063
+ function parseHeader(view) {
1064
+ const majorVersion = view.getUint8(6);
1065
+ let offset = 8;
1066
+ let headerLength;
1067
+ if (majorVersion >= 2) {
1068
+ headerLength = view.getUint32(offset, true);
1069
+ offset += 4;
1070
+ } else {
1071
+ headerLength = view.getUint16(offset, true);
1072
+ offset += 2;
1073
+ }
1074
+ const encoding = majorVersion <= 2 ? "latin1" : "utf-8";
1075
+ const decoder = new TextDecoder(encoding);
1076
+ const headerArray = new Uint8Array(view.buffer, offset, headerLength);
1077
+ const headerText = decoder.decode(headerArray);
1078
+ offset += headerLength;
1079
+ const header = JSON.parse(
1080
+ headerText.replace(/'/g, '"').replace("False", "false").replace("(", "[").replace(/,*\),*/g, "]")
1081
+ );
1082
+ return { header, headerEndOffset: offset };
1083
+ }
1084
+
1085
+ // src/npy-loader.ts
1086
+ var NPY_MAGIC_NUMBER = new Uint8Array([147, 78, 85, 77, 80, 89]);
1087
+ var NPYWorkerLoader = {
1088
+ name: "NPY",
1089
+ id: "npy",
1090
+ module: "textures",
1091
+ version: VERSION,
1092
+ worker: true,
1093
+ extensions: ["npy"],
1094
+ mimeTypes: [],
1095
+ tests: [NPY_MAGIC_NUMBER.buffer],
1096
+ options: {
1097
+ npy: {}
1098
+ }
1099
+ };
1100
+ var NPYLoader = {
1101
+ ...NPYWorkerLoader,
1102
+ parseSync: parseNPY,
1103
+ parse: async (arrayBuffer, options) => parseNPY(arrayBuffer, options)
1104
+ };
1105
+
1106
+ // src/lib/parsers/crunch-module-loader.ts
1107
+ var import_worker_utils2 = require("@loaders.gl/worker-utils");
1108
+ var CRUNCH_EXTERNAL_LIBRARIES = {
1109
+ /** Crunch decoder library. It is used as dynamically imported script */
1110
+ DECODER: "crunch.js"
1111
+ };
1112
+
1113
+ // src/lib/encoders/encode-texture.ts
1114
+ var import_worker_utils3 = require("@loaders.gl/worker-utils");
1115
+ async function encodeImageURLToCompressedTextureURL(inputUrl, outputUrl, options) {
1116
+ const args = [
1117
+ // Note: our actual executable is `npx`, so `texture-compressor` is an argument
1118
+ "texture-compressor",
1119
+ "--type",
1120
+ "s3tc",
1121
+ "--compression",
1122
+ "DXT1",
1123
+ "--quality",
1124
+ "normal",
1125
+ "--input",
1126
+ inputUrl,
1127
+ "--output",
1128
+ outputUrl
1129
+ ];
1130
+ const childProcess = new import_worker_utils3.ChildProcessProxy();
1131
+ await childProcess.start({
1132
+ command: "npx",
1133
+ arguments: args,
1134
+ spawn: options
1135
+ });
1136
+ return outputUrl;
1137
+ }
1138
+
1139
+ // src/compressed-texture-writer.ts
1140
+ var CompressedTextureWriter = {
1141
+ name: "DDS Texture Container",
1142
+ id: "dds",
1143
+ module: "textures",
1144
+ version: VERSION,
1145
+ extensions: ["dds"],
1146
+ options: {
1147
+ texture: {
1148
+ format: "auto",
1149
+ compression: "auto",
1150
+ quality: "auto",
1151
+ mipmap: false,
1152
+ flipY: false,
1153
+ toolFlags: ""
1154
+ }
1155
+ },
1156
+ encodeURLtoURL: encodeImageURLToCompressedTextureURL
1157
+ };
1158
+
1159
+ // src/lib/encoders/encode-ktx2-basis-texture.ts
1160
+ async function encodeKTX2BasisTexture(image, options = {}) {
1161
+ const {
1162
+ useSRGB = false,
1163
+ qualityLevel = 10,
1164
+ encodeUASTC = false,
1165
+ mipmaps = false
1166
+ } = (options == null ? void 0 : options["ktx2-basis-writer"]) || {};
1167
+ const { BasisEncoder } = await loadBasisEncoderModule(options);
1168
+ const basisEncoder = new BasisEncoder();
1169
+ try {
1170
+ const basisFileData = new Uint8Array(image.width * image.height * 4);
1171
+ basisEncoder.setCreateKTX2File(true);
1172
+ basisEncoder.setKTX2UASTCSupercompression(true);
1173
+ basisEncoder.setKTX2SRGBTransferFunc(true);
1174
+ basisEncoder.setSliceSourceImage(0, image.data, image.width, image.height, false);
1175
+ basisEncoder.setPerceptual(useSRGB);
1176
+ basisEncoder.setMipSRGB(useSRGB);
1177
+ basisEncoder.setQualityLevel(qualityLevel);
1178
+ basisEncoder.setUASTC(encodeUASTC);
1179
+ basisEncoder.setMipGen(mipmaps);
1180
+ const numOutputBytes = basisEncoder.encode(basisFileData);
1181
+ const actualKTX2FileData = basisFileData.subarray(0, numOutputBytes).buffer;
1182
+ return actualKTX2FileData;
1183
+ } catch (error) {
1184
+ console.error("Basis Universal Supercompressed GPU Texture encoder Error: ", error);
1185
+ throw error;
1186
+ } finally {
1187
+ basisEncoder.delete();
1188
+ }
1189
+ }
1190
+
1191
+ // src/ktx2-basis-writer.ts
1192
+ var KTX2BasisWriter = {
1193
+ name: "Basis Universal Supercompressed GPU Texture",
1194
+ id: "ktx2-basis-writer",
1195
+ module: "textures",
1196
+ version: VERSION,
1197
+ extensions: ["ktx2"],
1198
+ options: {
1199
+ ["ktx2-basis-writer"]: {
1200
+ useSRGB: false,
1201
+ qualityLevel: 10,
1202
+ encodeUASTC: false,
1203
+ mipmaps: false
1204
+ }
1205
+ },
1206
+ encode: encodeKTX2BasisTexture
1207
+ };
1208
+
1209
+ // src/lib/texture-api/load-image.ts
1210
+ var import_loader_utils3 = require("@loaders.gl/loader-utils");
1211
+ var import_images = require("@loaders.gl/images");
1212
+
1213
+ // src/lib/texture-api/generate-url.ts
1214
+ var import_loader_utils2 = require("@loaders.gl/loader-utils");
1215
+ function generateUrl(getUrl, options, urlOptions) {
1216
+ let url = typeof getUrl === "function" ? getUrl({ ...options, ...urlOptions }) : getUrl;
1217
+ const baseUrl = options.baseUrl;
1218
+ if (baseUrl) {
1219
+ url = baseUrl[baseUrl.length - 1] === "/" ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
1220
+ }
1221
+ return (0, import_loader_utils2.resolvePath)(url);
1222
+ }
1223
+
1224
+ // src/lib/texture-api/async-deep-map.ts
1225
+ var isObject = (value) => value && typeof value === "object";
1226
+ async function asyncDeepMap(tree, func, options = {}) {
1227
+ return await mapSubtree(tree, func, options);
1228
+ }
1229
+ async function mapSubtree(object, func, options) {
1230
+ if (Array.isArray(object)) {
1231
+ return await mapArray(object, func, options);
1232
+ }
1233
+ if (isObject(object)) {
1234
+ return await mapObject(object, func, options);
1235
+ }
1236
+ const url = object;
1237
+ return await func(url, options);
1238
+ }
1239
+ async function mapObject(object, func, options) {
1240
+ const promises = [];
1241
+ const values = {};
1242
+ for (const key in object) {
1243
+ const url = object[key];
1244
+ const promise = mapSubtree(url, func, options).then((value) => {
1245
+ values[key] = value;
1246
+ });
1247
+ promises.push(promise);
1248
+ }
1249
+ await Promise.all(promises);
1250
+ return values;
1251
+ }
1252
+ async function mapArray(urlArray, func, options = {}) {
1253
+ const promises = urlArray.map((url) => mapSubtree(url, func, options));
1254
+ return await Promise.all(promises);
1255
+ }
1256
+
1257
+ // src/lib/texture-api/deep-load.ts
1258
+ async function deepLoad(urlTree, load, options) {
1259
+ return await asyncDeepMap(urlTree, (url) => shallowLoad(url, load, options));
1260
+ }
1261
+ async function shallowLoad(url, load, options) {
1262
+ const response = await fetch(url, options.fetch);
1263
+ const arrayBuffer = await response.arrayBuffer();
1264
+ return await load(arrayBuffer, options);
1265
+ }
1266
+
1267
+ // src/lib/texture-api/load-image.ts
1268
+ async function loadImageTexture(getUrl, options = {}) {
1269
+ const imageUrls = await getImageUrls(getUrl, options);
1270
+ return await deepLoad(imageUrls, import_images.ImageLoader.parse, options);
1271
+ }
1272
+ async function getImageUrls(getUrl, options, urlOptions = {}) {
1273
+ const mipLevels = options && options.image && options.image.mipLevels || 0;
1274
+ return mipLevels !== 0 ? await getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) : generateUrl(getUrl, options, urlOptions);
1275
+ }
1276
+ async function getMipmappedImageUrls(getUrl, mipLevels, options, urlOptions) {
1277
+ const urls = [];
1278
+ if (mipLevels === "auto") {
1279
+ const url = generateUrl(getUrl, options, { ...urlOptions, lod: 0 });
1280
+ const image = await shallowLoad(url, import_images.ImageLoader.parse, options);
1281
+ const { width, height } = (0, import_images.getImageSize)(image);
1282
+ mipLevels = getMipLevels({ width, height });
1283
+ urls.push(url);
1284
+ }
1285
+ (0, import_loader_utils3.assert)(mipLevels > 0);
1286
+ for (let mipLevel = urls.length; mipLevel < mipLevels; ++mipLevel) {
1287
+ const url = generateUrl(getUrl, options, { ...urlOptions, lod: mipLevel });
1288
+ urls.push(url);
1289
+ }
1290
+ return urls;
1291
+ }
1292
+ function getMipLevels(size) {
1293
+ return 1 + Math.floor(Math.log2(Math.max(size.width, size.height)));
1294
+ }
1295
+
1296
+ // src/lib/texture-api/load-image-array.ts
1297
+ var import_images2 = require("@loaders.gl/images");
1298
+ async function loadImageTextureArray(count, getUrl, options = {}) {
1299
+ const imageUrls = await getImageArrayUrls(count, getUrl, options);
1300
+ return await deepLoad(imageUrls, import_images2.ImageLoader.parse, options);
1301
+ }
1302
+ async function getImageArrayUrls(count, getUrl, options = {}) {
1303
+ const promises = [];
1304
+ for (let index = 0; index < count; index++) {
1305
+ const promise = getImageUrls(getUrl, options, { index });
1306
+ promises.push(promise);
1307
+ }
1308
+ return await Promise.all(promises);
1309
+ }
1310
+
1311
+ // src/lib/texture-api/load-image-cube.ts
1312
+ var import_images3 = require("@loaders.gl/images");
1313
+ var GL_TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
1314
+ var GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
1315
+ var GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
1316
+ var GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
1317
+ var GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
1318
+ var GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
1319
+ var CUBE_FACES = [
1320
+ { face: GL_TEXTURE_CUBE_MAP_POSITIVE_X, direction: "right", axis: "x", sign: "positive" },
1321
+ { face: GL_TEXTURE_CUBE_MAP_NEGATIVE_X, direction: "left", axis: "x", sign: "negative" },
1322
+ { face: GL_TEXTURE_CUBE_MAP_POSITIVE_Y, direction: "top", axis: "y", sign: "positive" },
1323
+ { face: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, direction: "bottom", axis: "y", sign: "negative" },
1324
+ { face: GL_TEXTURE_CUBE_MAP_POSITIVE_Z, direction: "front", axis: "z", sign: "positive" },
1325
+ { face: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, direction: "back", axis: "z", sign: "negative" }
1326
+ ];
1327
+ async function getImageCubeUrls(getUrl, options) {
1328
+ const urls = {};
1329
+ const promises = [];
1330
+ let index = 0;
1331
+ for (let i = 0; i < CUBE_FACES.length; ++i) {
1332
+ const face = CUBE_FACES[index];
1333
+ const promise = getImageUrls(getUrl, options, { ...face, index: index++ }).then((url) => {
1334
+ urls[face.face] = url;
1335
+ });
1336
+ promises.push(promise);
1337
+ }
1338
+ await Promise.all(promises);
1339
+ return urls;
1340
+ }
1341
+ async function loadImageTextureCube(getUrl, options = {}) {
1342
+ const urls = await getImageCubeUrls(getUrl, options);
1343
+ return await deepLoad(urls, import_images3.ImageLoader.parse, options);
1344
+ }
1345
+
1346
+ // src/index.ts
1347
+ var KTX2BasisWriterWorker = {
1348
+ name: "Basis Universal Supercompressed GPU Texture",
1349
+ id: "ktx2-basis-writer",
1350
+ module: "textures",
1351
+ version: VERSION,
1352
+ extensions: ["ktx2"],
1353
+ worker: true,
1354
+ options: {
1355
+ useSRGB: false,
1356
+ qualityLevel: 10,
1357
+ encodeUASTC: false,
1358
+ mipmaps: false
1359
+ }
1360
+ };