@loaders.gl/textures 4.4.0-alpha.18 → 4.4.0-alpha.19

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 (129) hide show
  1. package/README.md +153 -1
  2. package/dist/basis-worker-node.js +44 -28
  3. package/dist/basis-worker.js +43 -27
  4. package/dist/compressed-texture-worker.js +110 -77
  5. package/dist/crunch-worker.js +24 -10
  6. package/dist/dist.dev.js +1323 -239
  7. package/dist/dist.min.js +1 -1
  8. package/dist/index.cjs +1024 -151
  9. package/dist/index.cjs.map +4 -4
  10. package/dist/index.d.ts +11 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/ktx2-basis-writer-worker-node.js +2 -2
  15. package/dist/ktx2-basis-writer-worker.js +2 -2
  16. package/dist/lib/composite-image/image-texture-cube.d.ts +47 -0
  17. package/dist/lib/composite-image/image-texture-cube.d.ts.map +1 -0
  18. package/dist/lib/composite-image/image-texture-cube.js +42 -0
  19. package/dist/lib/composite-image/image-texture-cube.js.map +1 -0
  20. package/dist/lib/composite-image/parse-composite-image.d.ts +43 -0
  21. package/dist/lib/composite-image/parse-composite-image.d.ts.map +1 -0
  22. package/dist/lib/composite-image/parse-composite-image.js +437 -0
  23. package/dist/lib/composite-image/parse-composite-image.js.map +1 -0
  24. package/dist/lib/gl-extensions.d.ts +2 -0
  25. package/dist/lib/gl-extensions.d.ts.map +1 -1
  26. package/dist/lib/gl-extensions.js +2 -0
  27. package/dist/lib/gl-extensions.js.map +1 -1
  28. package/dist/lib/gl-types.d.ts +4 -0
  29. package/dist/lib/gl-types.d.ts.map +1 -0
  30. package/dist/lib/gl-types.js +5 -0
  31. package/dist/lib/gl-types.js.map +1 -0
  32. package/dist/lib/parsers/parse-basis.d.ts +9 -1
  33. package/dist/lib/parsers/parse-basis.d.ts.map +1 -1
  34. package/dist/lib/parsers/parse-basis.js +48 -25
  35. package/dist/lib/parsers/parse-basis.js.map +1 -1
  36. package/dist/lib/parsers/parse-crunch.d.ts.map +1 -1
  37. package/dist/lib/parsers/parse-crunch.js +4 -5
  38. package/dist/lib/parsers/parse-crunch.js.map +1 -1
  39. package/dist/lib/parsers/parse-dds.d.ts.map +1 -1
  40. package/dist/lib/parsers/parse-dds.js +10 -11
  41. package/dist/lib/parsers/parse-dds.js.map +1 -1
  42. package/dist/lib/parsers/parse-hdr.d.ts +21 -0
  43. package/dist/lib/parsers/parse-hdr.d.ts.map +1 -0
  44. package/dist/lib/parsers/parse-hdr.js +305 -0
  45. package/dist/lib/parsers/parse-hdr.js.map +1 -0
  46. package/dist/lib/parsers/parse-ktx.d.ts.map +1 -1
  47. package/dist/lib/parsers/parse-ktx.js +5 -5
  48. package/dist/lib/parsers/parse-ktx.js.map +1 -1
  49. package/dist/lib/parsers/parse-pvr.d.ts.map +1 -1
  50. package/dist/lib/parsers/parse-pvr.js +31 -32
  51. package/dist/lib/parsers/parse-pvr.js.map +1 -1
  52. package/dist/lib/texture-api/generate-url.d.ts.map +1 -1
  53. package/dist/lib/texture-api/generate-url.js +2 -10
  54. package/dist/lib/texture-api/generate-url.js.map +1 -1
  55. package/dist/lib/texture-api/load-image-array.d.ts +6 -3
  56. package/dist/lib/texture-api/load-image-array.d.ts.map +1 -1
  57. package/dist/lib/texture-api/load-image-array.js +5 -3
  58. package/dist/lib/texture-api/load-image-array.js.map +1 -1
  59. package/dist/lib/texture-api/load-image-cube.d.ts +7 -11
  60. package/dist/lib/texture-api/load-image-cube.d.ts.map +1 -1
  61. package/dist/lib/texture-api/load-image-cube.js +8 -20
  62. package/dist/lib/texture-api/load-image-cube.js.map +1 -1
  63. package/dist/lib/texture-api/load-image.d.ts +6 -3
  64. package/dist/lib/texture-api/load-image.d.ts.map +1 -1
  65. package/dist/lib/texture-api/load-image.js +8 -4
  66. package/dist/lib/texture-api/load-image.js.map +1 -1
  67. package/dist/lib/texture-api/texture-api-types.d.ts +13 -0
  68. package/dist/lib/texture-api/texture-api-types.d.ts.map +1 -1
  69. package/dist/lib/utils/detect-supported-texture-formats.js +4 -4
  70. package/dist/lib/utils/extract-mipmap-images.d.ts +5 -1
  71. package/dist/lib/utils/extract-mipmap-images.d.ts.map +1 -1
  72. package/dist/lib/utils/extract-mipmap-images.js +4 -3
  73. package/dist/lib/utils/extract-mipmap-images.js.map +1 -1
  74. package/dist/lib/utils/ktx-format-helper.d.ts +8 -1
  75. package/dist/lib/utils/ktx-format-helper.d.ts.map +1 -1
  76. package/dist/lib/utils/ktx-format-helper.js +9 -0
  77. package/dist/lib/utils/ktx-format-helper.js.map +1 -1
  78. package/dist/lib/utils/texture-format-map.d.ts +8 -1
  79. package/dist/lib/utils/texture-format-map.d.ts.map +1 -1
  80. package/dist/lib/utils/texture-format-map.js +19 -3
  81. package/dist/lib/utils/texture-format-map.js.map +1 -1
  82. package/dist/lib/utils/version.js +1 -1
  83. package/dist/npy-worker.js +1 -1
  84. package/dist/radiance-hdr-loader.d.ts +25 -0
  85. package/dist/radiance-hdr-loader.d.ts.map +1 -0
  86. package/dist/radiance-hdr-loader.js +23 -0
  87. package/dist/radiance-hdr-loader.js.map +1 -0
  88. package/dist/texture-array-loader.d.ts +25 -0
  89. package/dist/texture-array-loader.d.ts.map +1 -0
  90. package/dist/texture-array-loader.js +24 -0
  91. package/dist/texture-array-loader.js.map +1 -0
  92. package/dist/texture-cube-array-loader.d.ts +25 -0
  93. package/dist/texture-cube-array-loader.d.ts.map +1 -0
  94. package/dist/texture-cube-array-loader.js +24 -0
  95. package/dist/texture-cube-array-loader.js.map +1 -0
  96. package/dist/texture-cube-loader.d.ts +25 -0
  97. package/dist/texture-cube-loader.d.ts.map +1 -0
  98. package/dist/texture-cube-loader.js +24 -0
  99. package/dist/texture-cube-loader.js.map +1 -0
  100. package/dist/texture-loader.d.ts +25 -0
  101. package/dist/texture-loader.d.ts.map +1 -0
  102. package/dist/texture-loader.js +24 -0
  103. package/dist/texture-loader.js.map +1 -0
  104. package/package.json +6 -6
  105. package/src/index.ts +19 -0
  106. package/src/lib/composite-image/image-texture-cube.ts +49 -0
  107. package/src/lib/composite-image/parse-composite-image.ts +699 -0
  108. package/src/lib/gl-extensions.ts +2 -0
  109. package/src/lib/gl-types.ts +136 -0
  110. package/src/lib/parsers/parse-basis.ts +54 -26
  111. package/src/lib/parsers/parse-crunch.ts +6 -11
  112. package/src/lib/parsers/parse-dds.ts +11 -19
  113. package/src/lib/parsers/parse-hdr.ts +426 -0
  114. package/src/lib/parsers/parse-ktx.ts +6 -6
  115. package/src/lib/parsers/parse-pvr.ts +33 -75
  116. package/src/lib/texture-api/generate-url.ts +2 -12
  117. package/src/lib/texture-api/load-image-array.ts +15 -6
  118. package/src/lib/texture-api/load-image-cube.ts +20 -34
  119. package/src/lib/texture-api/load-image.ts +19 -8
  120. package/src/lib/texture-api/texture-api-types.ts +15 -0
  121. package/src/lib/utils/detect-supported-texture-formats.ts +4 -4
  122. package/src/lib/utils/extract-mipmap-images.ts +12 -4
  123. package/src/lib/utils/ktx-format-helper.ts +12 -1
  124. package/src/lib/utils/texture-format-map.ts +30 -3
  125. package/src/radiance-hdr-loader.ts +36 -0
  126. package/src/texture-array-loader.ts +46 -0
  127. package/src/texture-cube-array-loader.ts +49 -0
  128. package/src/texture-cube-loader.ts +46 -0
  129. package/src/texture-loader.ts +49 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [loaders.gl](https://loaders.gl/docs) is a collection of framework-independent 3D and geospatial parsers and encoders.
4
4
 
5
- This module contains loaders for compressed textures and [basis universal textures](https://github.com/BinomialLLC/basis_universal).
5
+ This module contains loaders for compressed textures, Radiance HDR textures, and [basis universal textures](https://github.com/BinomialLLC/basis_universal).
6
6
 
7
7
  ## Texture Levels
8
8
 
@@ -12,11 +12,14 @@ This module contains loaders for compressed textures and [basis universal textur
12
12
 
13
13
  `CrunchLoader` returns `TextureLevel[]` for Crunch mip chains.
14
14
 
15
+ `RadianceHDRLoader` returns a `Texture` with `shape: 'texture'`, `type: '2d'`, and one decoded `rgba32float` level for Radiance `.hdr` images.
16
+
15
17
  Each returned `TextureLevel` now exposes:
16
18
 
17
19
  - `shape`: always `'texture-level'`. <img src="https://img.shields.io/badge/From-v4.4-blue.svg?style=flat-square" alt="From-v4.4" />
18
20
  - `format`: the corresponding WebGL internal format number. <img src="https://img.shields.io/badge/From-v4.4-blue.svg?style=flat-square" alt="From-v4.4" />
19
21
  - `textureFormat`: the corresponding luma.gl / WebGPU-style texture format string. <img src="https://img.shields.io/badge/From-v4.4-blue.svg?style=flat-square" alt="From-v4.4" />
22
+ - `data`: a typed array containing the mip level payload. Compressed textures expose byte data, while `RadianceHDRLoader` exposes `Float32Array`.
20
23
 
21
24
  ```ts
22
25
  import {load} from '@loaders.gl/core';
@@ -48,4 +51,153 @@ console.log(images[0][0].format);
48
51
  console.log(images[0][0].textureFormat);
49
52
  ```
50
53
 
54
+ ## Composite Image Texture Loaders
55
+
56
+ The `textures` module also exports JSON manifest loaders for image-based composite textures:
57
+
58
+ - `TextureLoader` for a single image or mip chain
59
+ - `TextureArrayLoader` for texture arrays
60
+ - `TextureCubeLoader` for cubemaps
61
+ - `TextureCubeArrayLoader` for cube arrays
62
+
63
+ Each manifest includes a `shape` discriminator and resolves relative member URLs against the manifest URL.
64
+ Member assets are parsed with `ImageLoader` by default, and additional loaders passed to top-level `load()` are also available for manifest members.
65
+ These loaders return schema `Texture` objects rather than raw image trees.
66
+
67
+ ```ts
68
+ import {load} from '@loaders.gl/core';
69
+ import {BasisLoader, CompressedTextureLoader, TextureCubeLoader} from '@loaders.gl/textures';
70
+
71
+ const imageCube = await load('environment.image-texture-cube.json', [
72
+ TextureCubeLoader,
73
+ CompressedTextureLoader,
74
+ BasisLoader
75
+ ]);
76
+ ```
77
+
78
+ ### Manifest Shapes
79
+
80
+ Single image:
81
+
82
+ ```json
83
+ {
84
+ "shape": "image-texture",
85
+ "image": "texture.png"
86
+ }
87
+ ```
88
+
89
+ Single image with mipmaps:
90
+
91
+ ```json
92
+ {
93
+ "shape": "image-texture",
94
+ "mipmaps": ["texture-0.png", "texture-1.png", "texture-2.png"]
95
+ }
96
+ ```
97
+
98
+ Texture array:
99
+
100
+ ```json
101
+ {
102
+ "shape": "image-texture-array",
103
+ "layers": ["layer-0.png", "layer-1.png"]
104
+ }
105
+ ```
106
+
107
+ Texture array with mipmaps:
108
+
109
+ ```json
110
+ {
111
+ "shape": "image-texture-array",
112
+ "layers": [
113
+ ["layer-0-0.png", "layer-0-1.png"],
114
+ ["layer-1-0.png", "layer-1-1.png"]
115
+ ]
116
+ }
117
+ ```
118
+
119
+ Cubemap:
120
+
121
+ ```json
122
+ {
123
+ "shape": "image-texture-cube",
124
+ "faces": {
125
+ "+X": "right.png",
126
+ "-X": "left.png",
127
+ "+Y": "top.png",
128
+ "-Y": "bottom.png",
129
+ "+Z": "front.png",
130
+ "-Z": "back.png"
131
+ }
132
+ }
133
+ ```
134
+
135
+ Cubemap with mipmaps:
136
+
137
+ ```json
138
+ {
139
+ "shape": "image-texture-cube",
140
+ "faces": {
141
+ "+X": ["right-0.png", "right-1.png"],
142
+ "-X": ["left-0.png", "left-1.png"],
143
+ "+Y": ["top-0.png", "top-1.png"],
144
+ "-Y": ["bottom-0.png", "bottom-1.png"],
145
+ "+Z": ["front-0.png", "front-1.png"],
146
+ "-Z": ["back-0.png", "back-1.png"]
147
+ }
148
+ }
149
+ ```
150
+
151
+ Cube array:
152
+
153
+ ```json
154
+ {
155
+ "shape": "image-texture-cube-array",
156
+ "layers": [
157
+ {
158
+ "faces": {
159
+ "+X": "sky-right.png",
160
+ "-X": "sky-left.png",
161
+ "+Y": "sky-top.png",
162
+ "-Y": "sky-bottom.png",
163
+ "+Z": "sky-front.png",
164
+ "-Z": "sky-back.png"
165
+ }
166
+ },
167
+ {
168
+ "faces": {
169
+ "+X": "irr-right.png",
170
+ "-X": "irr-left.png",
171
+ "+Y": "irr-top.png",
172
+ "-Y": "irr-bottom.png",
173
+ "+Z": "irr-front.png",
174
+ "-Z": "irr-back.png"
175
+ }
176
+ }
177
+ ]
178
+ }
179
+ ```
180
+
181
+ Template-driven mipmaps:
182
+
183
+ ```json
184
+ {
185
+ "shape": "image-texture",
186
+ "mipLevels": "auto",
187
+ "template": "texture-{lod}.png"
188
+ }
189
+ ```
190
+
191
+ Template placeholders are validated strictly. Supported placeholders are:
192
+
193
+ - `{lod}` for mip level
194
+ - `{index}` for array or cube-array layer index
195
+ - `{face}`, `{direction}`, `{axis}`, `{sign}` for cubemap faces
196
+
197
+ Use `\\{` and `\\}` to include literal braces in filenames.
198
+
199
+ Cube manifests use luma.gl-style face names: `'+X'`, `'-X'`, `'+Y'`, `'-Y'`, `'+Z'`, `'-Z'`. Directional aliases such as `right`, `left`, `top`, `bottom`, `front`, and `back` are still accepted for compatibility, but new manifests should use the luma.gl names.
200
+
201
+ If you parse an in-memory manifest instead of loading from a URL, provide `options.core.baseUrl` so relative member URLs can still be resolved.
202
+
51
203
  For documentation please visit the [website](https://loaders.gl).
@@ -50494,7 +50494,7 @@ function getVersion() {
50494
50494
  globalThis._loadersgl_.version = NPM_TAG;
50495
50495
  warningIssued = true;
50496
50496
  } else {
50497
- globalThis._loadersgl_.version = "4.4.0-alpha.18";
50497
+ globalThis._loadersgl_.version = "4.4.0-alpha.19";
50498
50498
  }
50499
50499
  }
50500
50500
  return globalThis._loadersgl_.version;
@@ -54239,7 +54239,7 @@ if (nodeVersion2 < 18) {
54239
54239
  }
54240
54240
 
54241
54241
  // src/lib/utils/version.ts
54242
- var VERSION2 = true ? "4.4.0-alpha.18" : "latest";
54242
+ var VERSION2 = true ? "4.4.0-alpha.19" : "latest";
54243
54243
 
54244
54244
  // src/lib/parsers/basis-module-loader.ts
54245
54245
  var BASIS_EXTERNAL_LIBRARIES = {
@@ -54358,7 +54358,7 @@ var WEBGL_TEXTURE_FORMATS = {
54358
54358
  "bc7-rgba-unorm",
54359
54359
  "bc7-rgba-unorm-srgb"
54360
54360
  ],
54361
- WEBGL_compressed_texture_etc1: ["etc1-rbg-unorm-webgl"],
54361
+ WEBGL_compressed_texture_etc1: ["etc1-rgb-unorm-webgl"],
54362
54362
  WEBGL_compressed_texture_etc: [
54363
54363
  "etc2-rgb8unorm",
54364
54364
  "etc2-rgb8unorm-srgb",
@@ -54374,7 +54374,7 @@ var WEBGL_TEXTURE_FORMATS = {
54374
54374
  WEBGL_compressed_texture_pvrtc: [
54375
54375
  "pvrtc-rgb4unorm-webgl",
54376
54376
  "pvrtc-rgba4unorm-webgl",
54377
- "pvrtc-rbg2unorm-webgl",
54377
+ "pvrtc-rgb2unorm-webgl",
54378
54378
  "pvrtc-rgba2unorm-webgl"
54379
54379
  ],
54380
54380
  WEBGL_compressed_texture_atc: [
@@ -54474,12 +54474,13 @@ function isKTX(data) {
54474
54474
  }
54475
54475
 
54476
54476
  // src/lib/parsers/parse-basis.ts
54477
+ var basisTranscodingLock = Promise.resolve();
54477
54478
  var BASIS_FORMAT_TO_OUTPUT_OPTIONS = {
54478
54479
  etc1: {
54479
54480
  basisFormat: 0,
54480
54481
  compressed: true,
54481
54482
  format: GL_COMPRESSED_RGB_ETC1_WEBGL,
54482
- textureFormat: "etc1-rbg-unorm-webgl"
54483
+ textureFormat: "etc1-rgb-unorm-webgl"
54483
54484
  },
54484
54485
  etc2: {
54485
54486
  basisFormat: 1,
@@ -54581,32 +54582,47 @@ var BASIS_FORMAT_TO_OUTPUT_OPTIONS = {
54581
54582
  var BASIS_FORMATS = Object.freeze(
54582
54583
  Object.keys(BASIS_FORMAT_TO_OUTPUT_OPTIONS)
54583
54584
  );
54585
+ async function withBasisTranscodingLock(transcode) {
54586
+ const previousLock = basisTranscodingLock;
54587
+ let releaseLock;
54588
+ basisTranscodingLock = new Promise((resolve) => {
54589
+ releaseLock = resolve;
54590
+ });
54591
+ await previousLock;
54592
+ try {
54593
+ return await transcode();
54594
+ } finally {
54595
+ releaseLock();
54596
+ }
54597
+ }
54584
54598
  async function parseBasis(data, options = {}) {
54585
- var _a;
54586
54599
  const loadLibraryOptions = extractLoadLibraryOptions(options);
54587
- if (!((_a = options.basis) == null ? void 0 : _a.containerFormat) || options.basis.containerFormat === "auto") {
54588
- if (isKTX(data)) {
54589
- const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
54590
- return parseKTX2File(fileConstructors.KTX2File, data, options);
54591
- }
54592
- const { BasisFile } = await loadBasisTranscoderModule(loadLibraryOptions);
54593
- return parseBasisFile(BasisFile, data, options);
54594
- }
54595
- switch (options.basis.module) {
54596
- case "encoder":
54597
- const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
54598
- switch (options.basis.containerFormat) {
54599
- case "ktx2":
54600
- return parseKTX2File(fileConstructors.KTX2File, data, options);
54601
- case "basis":
54602
- default:
54603
- return parseBasisFile(fileConstructors.BasisFile, data, options);
54600
+ return await withBasisTranscodingLock(async () => {
54601
+ var _a;
54602
+ if (!((_a = options.basis) == null ? void 0 : _a.containerFormat) || options.basis.containerFormat === "auto") {
54603
+ if (isKTX(data)) {
54604
+ const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
54605
+ return parseKTX2File(fileConstructors.KTX2File, data, options);
54604
54606
  }
54605
- case "transcoder":
54606
- default:
54607
54607
  const { BasisFile } = await loadBasisTranscoderModule(loadLibraryOptions);
54608
54608
  return parseBasisFile(BasisFile, data, options);
54609
- }
54609
+ }
54610
+ switch (options.basis.module) {
54611
+ case "encoder":
54612
+ const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
54613
+ switch (options.basis.containerFormat) {
54614
+ case "ktx2":
54615
+ return parseKTX2File(fileConstructors.KTX2File, data, options);
54616
+ case "basis":
54617
+ default:
54618
+ return parseBasisFile(fileConstructors.BasisFile, data, options);
54619
+ }
54620
+ case "transcoder":
54621
+ default:
54622
+ const { BasisFile } = await loadBasisTranscoderModule(loadLibraryOptions);
54623
+ return parseBasisFile(BasisFile, data, options);
54624
+ }
54625
+ });
54610
54626
  }
54611
54627
  function parseBasisFile(BasisFile, data, options) {
54612
54628
  const basisFile = new BasisFile(new Uint8Array(data));
@@ -54752,7 +54768,7 @@ function selectSupportedBasisFormat(supportedTextureFormats = detectSupportedTex
54752
54768
  } else if (hasSupportedTextureFormat(textureFormats2, [
54753
54769
  "pvrtc-rgb4unorm-webgl",
54754
54770
  "pvrtc-rgba4unorm-webgl",
54755
- "pvrtc-rbg2unorm-webgl",
54771
+ "pvrtc-rgb2unorm-webgl",
54756
54772
  "pvrtc-rgba2unorm-webgl"
54757
54773
  ])) {
54758
54774
  return {
@@ -54772,7 +54788,7 @@ function selectSupportedBasisFormat(supportedTextureFormats = detectSupportedTex
54772
54788
  "eac-rg11snorm"
54773
54789
  ])) {
54774
54790
  return "etc2";
54775
- } else if (textureFormats2.has("etc1-rbg-unorm-webgl")) {
54791
+ } else if (textureFormats2.has("etc1-rgb-unorm-webgl")) {
54776
54792
  return "etc1";
54777
54793
  } else if (hasSupportedTextureFormat(textureFormats2, [
54778
54794
  "atc-rgb-unorm-webgl",
@@ -22,7 +22,7 @@
22
22
  globalThis._loadersgl_.version = NPM_TAG;
23
23
  warningIssued = true;
24
24
  } else {
25
- globalThis._loadersgl_.version = "4.4.0-alpha.18";
25
+ globalThis._loadersgl_.version = "4.4.0-alpha.19";
26
26
  }
27
27
  }
28
28
  return globalThis._loadersgl_.version;
@@ -382,7 +382,7 @@
382
382
  }
383
383
 
384
384
  // src/lib/utils/version.ts
385
- var VERSION2 = true ? "4.4.0-alpha.18" : "latest";
385
+ var VERSION2 = true ? "4.4.0-alpha.19" : "latest";
386
386
 
387
387
  // src/lib/parsers/basis-module-loader.ts
388
388
  var BASIS_EXTERNAL_LIBRARIES = {
@@ -501,7 +501,7 @@
501
501
  "bc7-rgba-unorm",
502
502
  "bc7-rgba-unorm-srgb"
503
503
  ],
504
- WEBGL_compressed_texture_etc1: ["etc1-rbg-unorm-webgl"],
504
+ WEBGL_compressed_texture_etc1: ["etc1-rgb-unorm-webgl"],
505
505
  WEBGL_compressed_texture_etc: [
506
506
  "etc2-rgb8unorm",
507
507
  "etc2-rgb8unorm-srgb",
@@ -517,7 +517,7 @@
517
517
  WEBGL_compressed_texture_pvrtc: [
518
518
  "pvrtc-rgb4unorm-webgl",
519
519
  "pvrtc-rgba4unorm-webgl",
520
- "pvrtc-rbg2unorm-webgl",
520
+ "pvrtc-rgb2unorm-webgl",
521
521
  "pvrtc-rgba2unorm-webgl"
522
522
  ],
523
523
  WEBGL_compressed_texture_atc: [
@@ -617,12 +617,13 @@
617
617
  }
618
618
 
619
619
  // src/lib/parsers/parse-basis.ts
620
+ var basisTranscodingLock = Promise.resolve();
620
621
  var BASIS_FORMAT_TO_OUTPUT_OPTIONS = {
621
622
  etc1: {
622
623
  basisFormat: 0,
623
624
  compressed: true,
624
625
  format: GL_COMPRESSED_RGB_ETC1_WEBGL,
625
- textureFormat: "etc1-rbg-unorm-webgl"
626
+ textureFormat: "etc1-rgb-unorm-webgl"
626
627
  },
627
628
  etc2: {
628
629
  basisFormat: 1,
@@ -724,31 +725,46 @@
724
725
  var BASIS_FORMATS = Object.freeze(
725
726
  Object.keys(BASIS_FORMAT_TO_OUTPUT_OPTIONS)
726
727
  );
728
+ async function withBasisTranscodingLock(transcode) {
729
+ const previousLock = basisTranscodingLock;
730
+ let releaseLock;
731
+ basisTranscodingLock = new Promise((resolve) => {
732
+ releaseLock = resolve;
733
+ });
734
+ await previousLock;
735
+ try {
736
+ return await transcode();
737
+ } finally {
738
+ releaseLock();
739
+ }
740
+ }
727
741
  async function parseBasis(data, options = {}) {
728
742
  const loadLibraryOptions = extractLoadLibraryOptions(options);
729
- if (!options.basis?.containerFormat || options.basis.containerFormat === "auto") {
730
- if (isKTX(data)) {
731
- const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
732
- return parseKTX2File(fileConstructors.KTX2File, data, options);
733
- }
734
- const { BasisFile } = await loadBasisTranscoderModule(loadLibraryOptions);
735
- return parseBasisFile(BasisFile, data, options);
736
- }
737
- switch (options.basis.module) {
738
- case "encoder":
739
- const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
740
- switch (options.basis.containerFormat) {
741
- case "ktx2":
742
- return parseKTX2File(fileConstructors.KTX2File, data, options);
743
- case "basis":
744
- default:
745
- return parseBasisFile(fileConstructors.BasisFile, data, options);
743
+ return await withBasisTranscodingLock(async () => {
744
+ if (!options.basis?.containerFormat || options.basis.containerFormat === "auto") {
745
+ if (isKTX(data)) {
746
+ const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
747
+ return parseKTX2File(fileConstructors.KTX2File, data, options);
746
748
  }
747
- case "transcoder":
748
- default:
749
749
  const { BasisFile } = await loadBasisTranscoderModule(loadLibraryOptions);
750
750
  return parseBasisFile(BasisFile, data, options);
751
- }
751
+ }
752
+ switch (options.basis.module) {
753
+ case "encoder":
754
+ const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);
755
+ switch (options.basis.containerFormat) {
756
+ case "ktx2":
757
+ return parseKTX2File(fileConstructors.KTX2File, data, options);
758
+ case "basis":
759
+ default:
760
+ return parseBasisFile(fileConstructors.BasisFile, data, options);
761
+ }
762
+ case "transcoder":
763
+ default:
764
+ const { BasisFile } = await loadBasisTranscoderModule(loadLibraryOptions);
765
+ return parseBasisFile(BasisFile, data, options);
766
+ }
767
+ });
752
768
  }
753
769
  function parseBasisFile(BasisFile, data, options) {
754
770
  const basisFile = new BasisFile(new Uint8Array(data));
@@ -893,7 +909,7 @@
893
909
  } else if (hasSupportedTextureFormat(textureFormats2, [
894
910
  "pvrtc-rgb4unorm-webgl",
895
911
  "pvrtc-rgba4unorm-webgl",
896
- "pvrtc-rbg2unorm-webgl",
912
+ "pvrtc-rgb2unorm-webgl",
897
913
  "pvrtc-rgba2unorm-webgl"
898
914
  ])) {
899
915
  return {
@@ -913,7 +929,7 @@
913
929
  "eac-rg11snorm"
914
930
  ])) {
915
931
  return "etc2";
916
- } else if (textureFormats2.has("etc1-rbg-unorm-webgl")) {
932
+ } else if (textureFormats2.has("etc1-rgb-unorm-webgl")) {
917
933
  return "etc1";
918
934
  } else if (hasSupportedTextureFormat(textureFormats2, [
919
935
  "atc-rgb-unorm-webgl",