@carbonenginejs/runtime-resource 0.8.0 → 0.9.0

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 (259) hide show
  1. package/LICENSE +21 -21
  2. package/NOTICE +29 -29
  3. package/README.md +67 -548
  4. package/dist/CjsMotherLode.js +1271 -1271
  5. package/dist/CjsResMan.js +3005 -3005
  6. package/dist/CjsResManQueue.js +214 -214
  7. package/dist/CjsResource.js +566 -566
  8. package/dist/CjsResourceSource.js +59 -59
  9. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  10. package/dist/format/CjsBlueReader.js +269 -269
  11. package/dist/format/CjsFormat.js +192 -192
  12. package/dist/format/CjsReader.js +18 -18
  13. package/dist/format/CjsResourceProbe.js +277 -277
  14. package/dist/format/payloadContract.js +173 -173
  15. package/dist/formats/black/CjsBlackFormat.js +278 -278
  16. package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
  17. package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
  18. package/dist/formats/black/core/CjsBlackReader.js +639 -639
  19. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
  20. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
  21. package/dist/formats/black/core/blackConstants.js +7 -7
  22. package/dist/formats/black/core/blackDefinitions.js +10 -10
  23. package/dist/formats/black/core/blackEnums.js +6 -6
  24. package/dist/formats/black/core/blackSchema.js +3 -3
  25. package/dist/formats/black/core/blackVersion.js +22 -22
  26. package/dist/formats/black/core/helpers.js +182 -182
  27. package/dist/formats/black/core/schema.js +4 -4
  28. package/dist/formats/black/index.js +2 -2
  29. package/dist/formats/bnk/CjsBnkFormat.js +125 -125
  30. package/dist/formats/bnk/core/graph.js +140 -140
  31. package/dist/formats/bnk/core/helpers.js +409 -409
  32. package/dist/formats/bnk/core/musicNodes.js +489 -489
  33. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  34. package/dist/formats/bnk/index.js +2 -2
  35. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  36. package/dist/formats/cmf/core/binary.js +118 -118
  37. package/dist/formats/cmf/core/buffers.js +233 -233
  38. package/dist/formats/cmf/core/constants.js +47 -47
  39. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  40. package/dist/formats/cmf/core/helpers.js +287 -287
  41. package/dist/formats/cmf/core/pack.js +276 -276
  42. package/dist/formats/cmf/core/schema.js +364 -364
  43. package/dist/formats/cmf/core/shared.js +268 -268
  44. package/dist/formats/cmf/core/writer.js +517 -517
  45. package/dist/formats/cmf/index.js +2 -2
  46. package/dist/formats/dds/CjsDdsFormat.js +193 -193
  47. package/dist/formats/dds/core/bc6h.js +288 -288
  48. package/dist/formats/dds/core/bc7.js +251 -251
  49. package/dist/formats/dds/core/helpers.js +815 -815
  50. package/dist/formats/dds/index.js +2 -2
  51. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  52. package/dist/formats/fbx/core/helpers.js +3901 -3901
  53. package/dist/formats/fbx/index.js +2 -2
  54. package/dist/formats/flac/CjsFlacFormat.js +87 -87
  55. package/dist/formats/flac/core/helpers.js +295 -295
  56. package/dist/formats/flac/index.js +2 -2
  57. package/dist/formats/gif/CjsGifFormat.js +87 -87
  58. package/dist/formats/gif/core/helpers.js +360 -360
  59. package/dist/formats/gif/index.js +2 -2
  60. package/dist/formats/gltf/CjsGltfFormat.js +290 -290
  61. package/dist/formats/gltf/core/helpers.js +292 -292
  62. package/dist/formats/gltf/core/json.js +79 -79
  63. package/dist/formats/gltf/core/parser.js +666 -666
  64. package/dist/formats/gltf/core/targets.js +163 -163
  65. package/dist/formats/gltf/index.js +2 -2
  66. package/dist/formats/gr2/CjsGr2Format.js +46 -0
  67. package/dist/formats/gr2/CjsGr2Format.js.map +1 -0
  68. package/dist/formats/gr2/core/CjsFormatGr2.js +273 -0
  69. package/dist/formats/gr2/core/CjsFormatGr2.js.map +1 -0
  70. package/dist/formats/gr2/core/bitknit2.js +280 -0
  71. package/dist/formats/gr2/core/bitknit2.js.map +1 -0
  72. package/dist/formats/gr2/core/curves.js +1047 -0
  73. package/dist/formats/gr2/core/curves.js.map +1 -0
  74. package/dist/formats/gr2/core/gsf.js +72 -0
  75. package/dist/formats/gr2/core/gsf.js.map +1 -0
  76. package/dist/formats/gr2/core/helpers.js +332 -0
  77. package/dist/formats/gr2/core/helpers.js.map +1 -0
  78. package/dist/formats/gr2/core/json.js +622 -0
  79. package/dist/formats/gr2/core/json.js.map +1 -0
  80. package/dist/formats/gr2/core/oodle1.js +388 -0
  81. package/dist/formats/gr2/core/oodle1.js.map +1 -0
  82. package/dist/formats/gr2/core/reader.js +617 -0
  83. package/dist/formats/gr2/core/reader.js.map +1 -0
  84. package/dist/formats/gr2/core/tangents.js +48 -0
  85. package/dist/formats/gr2/core/tangents.js.map +1 -0
  86. package/dist/formats/gr2/core/targets.js +351 -0
  87. package/dist/formats/gr2/core/targets.js.map +1 -0
  88. package/dist/formats/gr2/index.js +3 -0
  89. package/dist/formats/gr2/index.js.map +1 -0
  90. package/dist/formats/index.js +30 -23
  91. package/dist/formats/index.js.map +1 -1
  92. package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
  93. package/dist/formats/jpeg/core/helpers.js +350 -350
  94. package/dist/formats/jpeg/core/jpeg.js +377 -377
  95. package/dist/formats/jpeg/index.js +2 -2
  96. package/dist/formats/mp3/CjsMp3Format.js +192 -192
  97. package/dist/formats/mp3/core/helpers.js +338 -338
  98. package/dist/formats/mp3/index.js +2 -2
  99. package/dist/formats/mp4/CjsMp4Format.js +191 -191
  100. package/dist/formats/mp4/core/helpers.js +449 -449
  101. package/dist/formats/mp4/index.js +2 -2
  102. package/dist/formats/obj/CjsObjFormat.js +253 -253
  103. package/dist/formats/obj/core/helpers.js +573 -573
  104. package/dist/formats/obj/core/json.js +64 -64
  105. package/dist/formats/obj/core/parser.js +321 -321
  106. package/dist/formats/obj/index.js +2 -2
  107. package/dist/formats/ogg/CjsOggFormat.js +88 -88
  108. package/dist/formats/ogg/core/helpers.js +387 -387
  109. package/dist/formats/ogg/core/imdct.js +178 -178
  110. package/dist/formats/ogg/core/vorbis.js +999 -999
  111. package/dist/formats/ogg/index.js +2 -2
  112. package/dist/formats/png/CjsPngFormat.js +195 -195
  113. package/dist/formats/png/core/helpers.js +583 -583
  114. package/dist/formats/png/index.js +2 -2
  115. package/dist/formats/red/CjsRedFormat.js +261 -261
  116. package/dist/formats/red/core/CjsRedReader.js +194 -194
  117. package/dist/formats/red/core/blackDefinitions.js +3 -3
  118. package/dist/formats/red/core/helpers.js +139 -139
  119. package/dist/formats/red/core/redGraph.js +68 -68
  120. package/dist/formats/red/core/schema.js +4 -4
  121. package/dist/formats/red/index.js +2 -2
  122. package/dist/formats/stl/CjsStlFormat.js +365 -365
  123. package/dist/formats/stl/core/helpers.js +261 -261
  124. package/dist/formats/stl/core/json.js +51 -51
  125. package/dist/formats/stl/core/stl.js +629 -629
  126. package/dist/formats/stl/core/targets.js +163 -163
  127. package/dist/formats/stl/index.js +2 -2
  128. package/dist/formats/tga/CjsTgaFormat.js +192 -192
  129. package/dist/formats/tga/core/helpers.js +446 -446
  130. package/dist/formats/tga/index.js +2 -2
  131. package/dist/formats/wav/CjsWavFormat.js +192 -192
  132. package/dist/formats/wav/core/helpers.js +328 -328
  133. package/dist/formats/wav/index.js +2 -2
  134. package/dist/formats/webm/CjsWebmFormat.js +191 -191
  135. package/dist/formats/webm/core/helpers.js +537 -537
  136. package/dist/formats/webm/index.js +2 -2
  137. package/dist/formats/webp/CjsWebpFormat.js +86 -86
  138. package/dist/formats/webp/core/helpers.js +214 -214
  139. package/dist/formats/webp/index.js +2 -2
  140. package/dist/formats/wem/CjsWemFormat.js +241 -241
  141. package/dist/formats/wem/core/bitStream.js +259 -259
  142. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  143. package/dist/formats/wem/core/helpers.js +417 -417
  144. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  145. package/dist/formats/wem/core/ptadpcm.js +77 -77
  146. package/dist/formats/wem/core/resolve.js +121 -121
  147. package/dist/formats/wem/core/wemToOgg.js +485 -485
  148. package/dist/formats/wem/index.js +2 -2
  149. package/dist/formats/yaml/CjsYamlFormat.js +83 -83
  150. package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
  151. package/dist/formats/yaml/core/helpers.js +160 -160
  152. package/dist/formats/yaml/index.js +2 -2
  153. package/dist/index.js +49 -48
  154. package/dist/index.js.map +1 -1
  155. package/dist/resourcePath.js +18 -18
  156. package/dist/resourceStates.js +9 -9
  157. package/dist/resources/AudioGeometryResData.js +47 -47
  158. package/dist/resources/GStateBindingCallbackData.js +31 -31
  159. package/dist/resources/MeshDecalData.js +37 -37
  160. package/dist/resources/MeshDecalLodData.js +34 -34
  161. package/dist/resources/Tr2EffectRes.js +71 -71
  162. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
  163. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  164. package/dist/resources/Tr2ImageRes.js +114 -114
  165. package/dist/resources/Tr2LightProfileRes.js +40 -40
  166. package/dist/resources/Tr2MaterialArea.js +34 -34
  167. package/dist/resources/Tr2MaterialMesh.js +31 -31
  168. package/dist/resources/Tr2MaterialRes.js +34 -34
  169. package/dist/resources/Tr2ShaderPermutation.js +43 -43
  170. package/dist/resources/Tr2TextureLodManager.js +80 -80
  171. package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
  172. package/dist/resources/Tr2TexturePackChannel.js +37 -37
  173. package/dist/resources/Tr2TexturePipeline.js +52 -52
  174. package/dist/resources/Tr2TexturePipelineParams.js +34 -34
  175. package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
  176. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js +22 -0
  177. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js.map +1 -0
  178. package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
  179. package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
  180. package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
  181. package/dist/resources/TriGeometryRes.js +239 -239
  182. package/dist/resources/TriGeometryResAreaData.js +59 -59
  183. package/dist/resources/TriGeometryResJointData.js +38 -38
  184. package/dist/resources/TriGeometryResLodData.js +88 -88
  185. package/dist/resources/TriGeometryResMeshData.js +63 -63
  186. package/dist/resources/TriGeometryResSkeletonData.js +34 -34
  187. package/dist/resources/TriGrannyRes.js +43 -43
  188. package/dist/resources/TriJointBinding.js +38 -38
  189. package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
  190. package/dist/resources/TriRtGeometryConstants.js +88 -88
  191. package/dist/resources/TriTextureRes.js +304 -304
  192. package/dist/resources/enums.js +18 -18
  193. package/dist/resources/resourceBoundary.js +47 -47
  194. package/dist/resources/texturePipelineBehavior.js +308 -308
  195. package/dist/texture/CjsTextureArrayRes.js +406 -406
  196. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  197. package/docs/README.md +69 -0
  198. package/docs/architecture.md +86 -0
  199. package/docs/concepts/resource-lifecycle.md +217 -0
  200. package/docs/formats/README.md +104 -0
  201. package/{FORMAT-PROVENANCE.md → docs/formats/provenance.md} +173 -155
  202. package/docs/formats/stl.md +37 -0
  203. package/docs/formats/wwise.md +44 -0
  204. package/docs/reference/events.md +92 -0
  205. package/docs/reference/motherlode-cache.md +244 -0
  206. package/docs/reference/queues.md +102 -0
  207. package/docs/reference/reload.md +107 -0
  208. package/docs/reference/texture-arrays.md +113 -0
  209. package/docs/reference/texture-pipeline.md +53 -0
  210. package/docs/roadmap.md +104 -0
  211. package/format-notices/black/LICENSE +21 -21
  212. package/format-notices/black/NOTICE +47 -47
  213. package/format-notices/bnk/LICENSE +21 -21
  214. package/format-notices/bnk/NOTICE +20 -20
  215. package/format-notices/cmf/LICENSE +21 -21
  216. package/format-notices/cmf/NOTICE +36 -36
  217. package/format-notices/dds/LICENSE +21 -21
  218. package/format-notices/dds/NOTICE +14 -14
  219. package/format-notices/fbx/LICENSE +21 -21
  220. package/format-notices/fbx/NOTICE +14 -14
  221. package/format-notices/flac/LICENSE +21 -21
  222. package/format-notices/flac/NOTICE +14 -14
  223. package/format-notices/gif/LICENSE +21 -21
  224. package/format-notices/gif/NOTICE +14 -14
  225. package/format-notices/gltf/LICENSE +21 -21
  226. package/format-notices/gltf/NOTICE +27 -27
  227. package/format-notices/gr2/LICENSE +21 -0
  228. package/format-notices/gr2/NOTICE +60 -0
  229. package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -0
  230. package/format-notices/jpeg/LICENSE +21 -21
  231. package/format-notices/jpeg/NOTICE +14 -14
  232. package/format-notices/mp3/LICENSE +21 -21
  233. package/format-notices/mp3/NOTICE +14 -14
  234. package/format-notices/mp4/LICENSE +21 -21
  235. package/format-notices/mp4/NOTICE +14 -14
  236. package/format-notices/obj/LICENSE +21 -21
  237. package/format-notices/obj/NOTICE +26 -26
  238. package/format-notices/ogg/LICENSE +21 -21
  239. package/format-notices/ogg/NOTICE +28 -28
  240. package/format-notices/png/LICENSE +21 -21
  241. package/format-notices/png/NOTICE +14 -14
  242. package/format-notices/red/LICENSE +21 -21
  243. package/format-notices/red/NOTICE +31 -31
  244. package/format-notices/stl/LICENSE +21 -21
  245. package/format-notices/stl/NOTICE +21 -21
  246. package/format-notices/tga/LICENSE +21 -21
  247. package/format-notices/tga/NOTICE +14 -14
  248. package/format-notices/wav/LICENSE +21 -21
  249. package/format-notices/wav/NOTICE +14 -14
  250. package/format-notices/webm/LICENSE +21 -21
  251. package/format-notices/webm/NOTICE +14 -14
  252. package/format-notices/webp/LICENSE +21 -21
  253. package/format-notices/webp/NOTICE +14 -14
  254. package/format-notices/wem/LICENSE +57 -57
  255. package/format-notices/wem/NOTICE +33 -33
  256. package/format-notices/yaml/LICENSE +21 -21
  257. package/format-notices/yaml/NOTICE +44 -44
  258. package/package.json +52 -51
  259. package/resource-lifecycle.md +0 -679
@@ -1,251 +1,251 @@
1
- // BC7 is defined as a little-endian 128-bit block format. The mode and
2
- // partition constants below are the fixed tables from the Khronos Data Format
3
- // Specification, section 20.1. The decoder itself is CarbonEngineJS code.
4
-
5
- const MODE = Object.freeze([{
6
- subsets: 3,
7
- partitionBits: 4,
8
- rotationBits: 0,
9
- selectionBits: 0,
10
- colorBits: 4,
11
- alphaBits: 0,
12
- endpointPBits: 1,
13
- sharedPBits: 0,
14
- indexBits: 3,
15
- secondaryIndexBits: 0
16
- }, {
17
- subsets: 2,
18
- partitionBits: 6,
19
- rotationBits: 0,
20
- selectionBits: 0,
21
- colorBits: 6,
22
- alphaBits: 0,
23
- endpointPBits: 0,
24
- sharedPBits: 1,
25
- indexBits: 3,
26
- secondaryIndexBits: 0
27
- }, {
28
- subsets: 3,
29
- partitionBits: 6,
30
- rotationBits: 0,
31
- selectionBits: 0,
32
- colorBits: 5,
33
- alphaBits: 0,
34
- endpointPBits: 0,
35
- sharedPBits: 0,
36
- indexBits: 2,
37
- secondaryIndexBits: 0
38
- }, {
39
- subsets: 2,
40
- partitionBits: 6,
41
- rotationBits: 0,
42
- selectionBits: 0,
43
- colorBits: 7,
44
- alphaBits: 0,
45
- endpointPBits: 1,
46
- sharedPBits: 0,
47
- indexBits: 2,
48
- secondaryIndexBits: 0
49
- }, {
50
- subsets: 1,
51
- partitionBits: 0,
52
- rotationBits: 2,
53
- selectionBits: 1,
54
- colorBits: 5,
55
- alphaBits: 6,
56
- endpointPBits: 0,
57
- sharedPBits: 0,
58
- indexBits: 2,
59
- secondaryIndexBits: 3
60
- }, {
61
- subsets: 1,
62
- partitionBits: 0,
63
- rotationBits: 2,
64
- selectionBits: 0,
65
- colorBits: 7,
66
- alphaBits: 8,
67
- endpointPBits: 0,
68
- sharedPBits: 0,
69
- indexBits: 2,
70
- secondaryIndexBits: 2
71
- }, {
72
- subsets: 1,
73
- partitionBits: 0,
74
- rotationBits: 0,
75
- selectionBits: 0,
76
- colorBits: 7,
77
- alphaBits: 7,
78
- endpointPBits: 1,
79
- sharedPBits: 0,
80
- indexBits: 4,
81
- secondaryIndexBits: 0
82
- }, {
83
- subsets: 2,
84
- partitionBits: 6,
85
- rotationBits: 0,
86
- selectionBits: 0,
87
- colorBits: 5,
88
- alphaBits: 5,
89
- endpointPBits: 1,
90
- sharedPBits: 0,
91
- indexBits: 2,
92
- secondaryIndexBits: 0
93
- }]);
94
- const WEIGHTS = Object.freeze({
95
- 2: new Uint8Array([0, 21, 43, 64]),
96
- 3: new Uint8Array([0, 9, 18, 27, 37, 46, 55, 64]),
97
- 4: new Uint8Array([0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64])
98
- });
99
-
100
- // One bit per texel, in y-major order.
101
- const PARTITIONS_2 = new Uint16Array([0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22]);
102
-
103
- // Two bits per texel, in y-major order.
104
- const PARTITIONS_3 = new Uint32Array([0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254]);
105
- const ANCHOR_2 = new Uint8Array([15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15]);
106
- const ANCHOR_3_SECOND = new Uint8Array([3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3]);
107
- const ANCHOR_3_THIRD = new Uint8Array([15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8]);
108
- function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16) {
109
- const rgba = new Uint8Array(width * height * 4);
110
- const blockRows = Math.ceil(height / 4);
111
- const blockColumns = Math.ceil(width / 4);
112
- for (let blockY = 0; blockY < blockRows; blockY++) {
113
- for (let blockX = 0; blockX < blockColumns; blockX++) {
114
- const blockOffset = blockY * rowPitch + blockX * 16;
115
- const pixels = decodeBc7Block(source.subarray(blockOffset, blockOffset + 16));
116
- copyBlock(pixels, rgba, width, height, blockX, blockY);
117
- }
118
- }
119
- return rgba;
120
- }
121
- function decodeBc7Block(block) {
122
- if (block.byteLength < 16) throw new RangeError("BC7 block must contain 16 bytes");
123
- if (block[0] === 0) return new Uint8Array(16 * 4);
124
- const reader = new BitReader(block);
125
- let mode = 0;
126
- while (mode < 8 && reader.read(1) === 0) mode++;
127
- if (mode === 8) return new Uint8Array(16 * 4);
128
- const info = MODE[mode];
129
- const partition = reader.read(info.partitionBits);
130
- const rotation = reader.read(info.rotationBits);
131
- const selection = reader.read(info.selectionBits);
132
- const endpointCount = info.subsets * 2;
133
- const endpoints = Array.from({
134
- length: endpointCount
135
- }, () => [0, 0, 0, 255]);
136
- for (let channel = 0; channel < 3; channel++) {
137
- for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
138
- endpoints[endpoint][channel] = reader.read(info.colorBits);
139
- }
140
- }
141
- if (info.alphaBits) {
142
- for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
143
- endpoints[endpoint][3] = reader.read(info.alphaBits);
144
- }
145
- }
146
- const pBits = new Uint8Array(endpointCount);
147
- if (info.endpointPBits) {
148
- for (let endpoint = 0; endpoint < endpointCount; endpoint++) pBits[endpoint] = reader.read(1);
149
- } else if (info.sharedPBits) {
150
- for (let subset = 0; subset < info.subsets; subset++) {
151
- const pBit = reader.read(1);
152
- pBits[subset * 2] = pBit;
153
- pBits[subset * 2 + 1] = pBit;
154
- }
155
- }
156
- const colorPrecision = info.colorBits + (info.endpointPBits || info.sharedPBits ? 1 : 0);
157
- const alphaPrecision = info.alphaBits + (info.alphaBits && (info.endpointPBits || info.sharedPBits) ? 1 : 0);
158
- for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
159
- for (let channel = 0; channel < 3; channel++) {
160
- const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][channel] << 1 | pBits[endpoint] : endpoints[endpoint][channel];
161
- endpoints[endpoint][channel] = expandEndpoint(value, colorPrecision);
162
- }
163
- if (info.alphaBits) {
164
- const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][3] << 1 | pBits[endpoint] : endpoints[endpoint][3];
165
- endpoints[endpoint][3] = expandEndpoint(value, alphaPrecision);
166
- }
167
- }
168
- const primary = readIndices(reader, info.indexBits, info.subsets, partition);
169
- const secondary = info.secondaryIndexBits ? readIndices(reader, info.secondaryIndexBits, info.subsets, partition) : primary;
170
- const colorUsesSecondary = info.selectionBits && selection === 1;
171
- const alphaUsesSecondary = info.secondaryIndexBits && (!info.selectionBits || selection === 0);
172
- const colorIndices = colorUsesSecondary ? secondary : primary;
173
- const alphaIndices = alphaUsesSecondary ? secondary : primary;
174
- const colorIndexBits = colorUsesSecondary ? info.secondaryIndexBits : info.indexBits;
175
- const alphaIndexBits = alphaUsesSecondary ? info.secondaryIndexBits : info.indexBits;
176
- const pixels = new Uint8Array(16 * 4);
177
- for (let pixel = 0; pixel < 16; pixel++) {
178
- const subset = getSubset(info.subsets, partition, pixel);
179
- const first = endpoints[subset * 2];
180
- const second = endpoints[subset * 2 + 1];
181
- const output = pixel * 4;
182
- for (let channel = 0; channel < 3; channel++) {
183
- pixels[output + channel] = interpolate(first[channel], second[channel], colorIndices[pixel], colorIndexBits);
184
- }
185
- pixels[output + 3] = interpolate(first[3], second[3], alphaIndices[pixel], alphaIndexBits);
186
- if (rotation) {
187
- const channel = rotation - 1;
188
- const value = pixels[output + channel];
189
- pixels[output + channel] = pixels[output + 3];
190
- pixels[output + 3] = value;
191
- }
192
- }
193
- return pixels;
194
- }
195
- function readIndices(reader, bitCount, subsets, partition) {
196
- const indices = new Uint8Array(16);
197
- for (let pixel = 0; pixel < 16; pixel++) {
198
- const subset = getSubset(subsets, partition, pixel);
199
- const isAnchor = pixel === getAnchor(subsets, partition, subset);
200
- indices[pixel] = reader.read(bitCount - (isAnchor ? 1 : 0));
201
- }
202
- return indices;
203
- }
204
- function getSubset(subsets, partition, pixel) {
205
- if (subsets === 1) return 0;
206
- if (subsets === 2) return PARTITIONS_2[partition] >>> pixel & 1;
207
- return PARTITIONS_3[partition] >>> pixel * 2 & 3;
208
- }
209
- function getAnchor(subsets, partition, subset) {
210
- if (subset === 0) return 0;
211
- if (subsets === 2) return ANCHOR_2[partition];
212
- return subset === 1 ? ANCHOR_3_SECOND[partition] : ANCHOR_3_THIRD[partition];
213
- }
214
- function expandEndpoint(value, bitCount) {
215
- if (bitCount === 8) return value;
216
- return value << 8 - bitCount | value >>> 2 * bitCount - 8;
217
- }
218
- function interpolate(first, second, index, bitCount) {
219
- const weight = WEIGHTS[bitCount][index];
220
- return (64 - weight) * first + weight * second + 32 >>> 6;
221
- }
222
- function copyBlock(block, output, width, height, blockX, blockY) {
223
- for (let y = 0; y < 4; y++) {
224
- const outputY = blockY * 4 + y;
225
- if (outputY >= height) continue;
226
- for (let x = 0; x < 4; x++) {
227
- const outputX = blockX * 4 + x;
228
- if (outputX >= width) continue;
229
- const sourceOffset = (y * 4 + x) * 4;
230
- output.set(block.subarray(sourceOffset, sourceOffset + 4), (outputY * width + outputX) * 4);
231
- }
232
- }
233
- }
234
- class BitReader {
235
- constructor(bytes) {
236
- this.bytes = bytes;
237
- this.offset = 0;
238
- }
239
- read(bitCount) {
240
- let value = 0;
241
- for (let bit = 0; bit < bitCount; bit++) {
242
- if (this.offset >= 128) throw new RangeError("BC7 block bitstream exceeds 128 bits");
243
- value |= (this.bytes[this.offset >>> 3] >>> (this.offset & 7) & 1) << bit;
244
- this.offset++;
245
- }
246
- return value;
247
- }
248
- }
249
-
250
- export { decodeBc7, decodeBc7Block };
251
- //# sourceMappingURL=bc7.js.map
1
+ // BC7 is defined as a little-endian 128-bit block format. The mode and
2
+ // partition constants below are the fixed tables from the Khronos Data Format
3
+ // Specification, section 20.1. The decoder itself is CarbonEngineJS code.
4
+
5
+ const MODE = Object.freeze([{
6
+ subsets: 3,
7
+ partitionBits: 4,
8
+ rotationBits: 0,
9
+ selectionBits: 0,
10
+ colorBits: 4,
11
+ alphaBits: 0,
12
+ endpointPBits: 1,
13
+ sharedPBits: 0,
14
+ indexBits: 3,
15
+ secondaryIndexBits: 0
16
+ }, {
17
+ subsets: 2,
18
+ partitionBits: 6,
19
+ rotationBits: 0,
20
+ selectionBits: 0,
21
+ colorBits: 6,
22
+ alphaBits: 0,
23
+ endpointPBits: 0,
24
+ sharedPBits: 1,
25
+ indexBits: 3,
26
+ secondaryIndexBits: 0
27
+ }, {
28
+ subsets: 3,
29
+ partitionBits: 6,
30
+ rotationBits: 0,
31
+ selectionBits: 0,
32
+ colorBits: 5,
33
+ alphaBits: 0,
34
+ endpointPBits: 0,
35
+ sharedPBits: 0,
36
+ indexBits: 2,
37
+ secondaryIndexBits: 0
38
+ }, {
39
+ subsets: 2,
40
+ partitionBits: 6,
41
+ rotationBits: 0,
42
+ selectionBits: 0,
43
+ colorBits: 7,
44
+ alphaBits: 0,
45
+ endpointPBits: 1,
46
+ sharedPBits: 0,
47
+ indexBits: 2,
48
+ secondaryIndexBits: 0
49
+ }, {
50
+ subsets: 1,
51
+ partitionBits: 0,
52
+ rotationBits: 2,
53
+ selectionBits: 1,
54
+ colorBits: 5,
55
+ alphaBits: 6,
56
+ endpointPBits: 0,
57
+ sharedPBits: 0,
58
+ indexBits: 2,
59
+ secondaryIndexBits: 3
60
+ }, {
61
+ subsets: 1,
62
+ partitionBits: 0,
63
+ rotationBits: 2,
64
+ selectionBits: 0,
65
+ colorBits: 7,
66
+ alphaBits: 8,
67
+ endpointPBits: 0,
68
+ sharedPBits: 0,
69
+ indexBits: 2,
70
+ secondaryIndexBits: 2
71
+ }, {
72
+ subsets: 1,
73
+ partitionBits: 0,
74
+ rotationBits: 0,
75
+ selectionBits: 0,
76
+ colorBits: 7,
77
+ alphaBits: 7,
78
+ endpointPBits: 1,
79
+ sharedPBits: 0,
80
+ indexBits: 4,
81
+ secondaryIndexBits: 0
82
+ }, {
83
+ subsets: 2,
84
+ partitionBits: 6,
85
+ rotationBits: 0,
86
+ selectionBits: 0,
87
+ colorBits: 5,
88
+ alphaBits: 5,
89
+ endpointPBits: 1,
90
+ sharedPBits: 0,
91
+ indexBits: 2,
92
+ secondaryIndexBits: 0
93
+ }]);
94
+ const WEIGHTS = Object.freeze({
95
+ 2: new Uint8Array([0, 21, 43, 64]),
96
+ 3: new Uint8Array([0, 9, 18, 27, 37, 46, 55, 64]),
97
+ 4: new Uint8Array([0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64])
98
+ });
99
+
100
+ // One bit per texel, in y-major order.
101
+ const PARTITIONS_2 = new Uint16Array([0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22]);
102
+
103
+ // Two bits per texel, in y-major order.
104
+ const PARTITIONS_3 = new Uint32Array([0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254]);
105
+ const ANCHOR_2 = new Uint8Array([15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15]);
106
+ const ANCHOR_3_SECOND = new Uint8Array([3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3]);
107
+ const ANCHOR_3_THIRD = new Uint8Array([15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8]);
108
+ function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16) {
109
+ const rgba = new Uint8Array(width * height * 4);
110
+ const blockRows = Math.ceil(height / 4);
111
+ const blockColumns = Math.ceil(width / 4);
112
+ for (let blockY = 0; blockY < blockRows; blockY++) {
113
+ for (let blockX = 0; blockX < blockColumns; blockX++) {
114
+ const blockOffset = blockY * rowPitch + blockX * 16;
115
+ const pixels = decodeBc7Block(source.subarray(blockOffset, blockOffset + 16));
116
+ copyBlock(pixels, rgba, width, height, blockX, blockY);
117
+ }
118
+ }
119
+ return rgba;
120
+ }
121
+ function decodeBc7Block(block) {
122
+ if (block.byteLength < 16) throw new RangeError("BC7 block must contain 16 bytes");
123
+ if (block[0] === 0) return new Uint8Array(16 * 4);
124
+ const reader = new BitReader(block);
125
+ let mode = 0;
126
+ while (mode < 8 && reader.read(1) === 0) mode++;
127
+ if (mode === 8) return new Uint8Array(16 * 4);
128
+ const info = MODE[mode];
129
+ const partition = reader.read(info.partitionBits);
130
+ const rotation = reader.read(info.rotationBits);
131
+ const selection = reader.read(info.selectionBits);
132
+ const endpointCount = info.subsets * 2;
133
+ const endpoints = Array.from({
134
+ length: endpointCount
135
+ }, () => [0, 0, 0, 255]);
136
+ for (let channel = 0; channel < 3; channel++) {
137
+ for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
138
+ endpoints[endpoint][channel] = reader.read(info.colorBits);
139
+ }
140
+ }
141
+ if (info.alphaBits) {
142
+ for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
143
+ endpoints[endpoint][3] = reader.read(info.alphaBits);
144
+ }
145
+ }
146
+ const pBits = new Uint8Array(endpointCount);
147
+ if (info.endpointPBits) {
148
+ for (let endpoint = 0; endpoint < endpointCount; endpoint++) pBits[endpoint] = reader.read(1);
149
+ } else if (info.sharedPBits) {
150
+ for (let subset = 0; subset < info.subsets; subset++) {
151
+ const pBit = reader.read(1);
152
+ pBits[subset * 2] = pBit;
153
+ pBits[subset * 2 + 1] = pBit;
154
+ }
155
+ }
156
+ const colorPrecision = info.colorBits + (info.endpointPBits || info.sharedPBits ? 1 : 0);
157
+ const alphaPrecision = info.alphaBits + (info.alphaBits && (info.endpointPBits || info.sharedPBits) ? 1 : 0);
158
+ for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
159
+ for (let channel = 0; channel < 3; channel++) {
160
+ const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][channel] << 1 | pBits[endpoint] : endpoints[endpoint][channel];
161
+ endpoints[endpoint][channel] = expandEndpoint(value, colorPrecision);
162
+ }
163
+ if (info.alphaBits) {
164
+ const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][3] << 1 | pBits[endpoint] : endpoints[endpoint][3];
165
+ endpoints[endpoint][3] = expandEndpoint(value, alphaPrecision);
166
+ }
167
+ }
168
+ const primary = readIndices(reader, info.indexBits, info.subsets, partition);
169
+ const secondary = info.secondaryIndexBits ? readIndices(reader, info.secondaryIndexBits, info.subsets, partition) : primary;
170
+ const colorUsesSecondary = info.selectionBits && selection === 1;
171
+ const alphaUsesSecondary = info.secondaryIndexBits && (!info.selectionBits || selection === 0);
172
+ const colorIndices = colorUsesSecondary ? secondary : primary;
173
+ const alphaIndices = alphaUsesSecondary ? secondary : primary;
174
+ const colorIndexBits = colorUsesSecondary ? info.secondaryIndexBits : info.indexBits;
175
+ const alphaIndexBits = alphaUsesSecondary ? info.secondaryIndexBits : info.indexBits;
176
+ const pixels = new Uint8Array(16 * 4);
177
+ for (let pixel = 0; pixel < 16; pixel++) {
178
+ const subset = getSubset(info.subsets, partition, pixel);
179
+ const first = endpoints[subset * 2];
180
+ const second = endpoints[subset * 2 + 1];
181
+ const output = pixel * 4;
182
+ for (let channel = 0; channel < 3; channel++) {
183
+ pixels[output + channel] = interpolate(first[channel], second[channel], colorIndices[pixel], colorIndexBits);
184
+ }
185
+ pixels[output + 3] = interpolate(first[3], second[3], alphaIndices[pixel], alphaIndexBits);
186
+ if (rotation) {
187
+ const channel = rotation - 1;
188
+ const value = pixels[output + channel];
189
+ pixels[output + channel] = pixels[output + 3];
190
+ pixels[output + 3] = value;
191
+ }
192
+ }
193
+ return pixels;
194
+ }
195
+ function readIndices(reader, bitCount, subsets, partition) {
196
+ const indices = new Uint8Array(16);
197
+ for (let pixel = 0; pixel < 16; pixel++) {
198
+ const subset = getSubset(subsets, partition, pixel);
199
+ const isAnchor = pixel === getAnchor(subsets, partition, subset);
200
+ indices[pixel] = reader.read(bitCount - (isAnchor ? 1 : 0));
201
+ }
202
+ return indices;
203
+ }
204
+ function getSubset(subsets, partition, pixel) {
205
+ if (subsets === 1) return 0;
206
+ if (subsets === 2) return PARTITIONS_2[partition] >>> pixel & 1;
207
+ return PARTITIONS_3[partition] >>> pixel * 2 & 3;
208
+ }
209
+ function getAnchor(subsets, partition, subset) {
210
+ if (subset === 0) return 0;
211
+ if (subsets === 2) return ANCHOR_2[partition];
212
+ return subset === 1 ? ANCHOR_3_SECOND[partition] : ANCHOR_3_THIRD[partition];
213
+ }
214
+ function expandEndpoint(value, bitCount) {
215
+ if (bitCount === 8) return value;
216
+ return value << 8 - bitCount | value >>> 2 * bitCount - 8;
217
+ }
218
+ function interpolate(first, second, index, bitCount) {
219
+ const weight = WEIGHTS[bitCount][index];
220
+ return (64 - weight) * first + weight * second + 32 >>> 6;
221
+ }
222
+ function copyBlock(block, output, width, height, blockX, blockY) {
223
+ for (let y = 0; y < 4; y++) {
224
+ const outputY = blockY * 4 + y;
225
+ if (outputY >= height) continue;
226
+ for (let x = 0; x < 4; x++) {
227
+ const outputX = blockX * 4 + x;
228
+ if (outputX >= width) continue;
229
+ const sourceOffset = (y * 4 + x) * 4;
230
+ output.set(block.subarray(sourceOffset, sourceOffset + 4), (outputY * width + outputX) * 4);
231
+ }
232
+ }
233
+ }
234
+ class BitReader {
235
+ constructor(bytes) {
236
+ this.bytes = bytes;
237
+ this.offset = 0;
238
+ }
239
+ read(bitCount) {
240
+ let value = 0;
241
+ for (let bit = 0; bit < bitCount; bit++) {
242
+ if (this.offset >= 128) throw new RangeError("BC7 block bitstream exceeds 128 bits");
243
+ value |= (this.bytes[this.offset >>> 3] >>> (this.offset & 7) & 1) << bit;
244
+ this.offset++;
245
+ }
246
+ return value;
247
+ }
248
+ }
249
+
250
+ export { decodeBc7, decodeBc7Block };
251
+ //# sourceMappingURL=bc7.js.map