@carbonenginejs/runtime-resource 0.7.0 → 0.8.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 (219) hide show
  1. package/FORMAT-PROVENANCE.md +155 -144
  2. package/LICENSE +21 -21
  3. package/NOTICE +29 -29
  4. package/README.md +11 -0
  5. package/dist/CjsMotherLode.js +1271 -1271
  6. package/dist/CjsResMan.js +3005 -3005
  7. package/dist/CjsResManQueue.js +214 -214
  8. package/dist/CjsResource.js +566 -566
  9. package/dist/CjsResourceSource.js +59 -59
  10. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  11. package/dist/format/CjsBlueReader.js +269 -269
  12. package/dist/format/CjsFormat.js +192 -192
  13. package/dist/format/CjsReader.js +18 -18
  14. package/dist/format/CjsResourceProbe.js +277 -277
  15. package/dist/format/payloadContract.js +173 -173
  16. package/dist/formats/black/CjsBlackFormat.js +278 -278
  17. package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
  18. package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
  19. package/dist/formats/black/core/CjsBlackReader.js +639 -639
  20. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
  21. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
  22. package/dist/formats/black/core/blackConstants.js +7 -7
  23. package/dist/formats/black/core/blackDefinitions.js +10 -10
  24. package/dist/formats/black/core/blackEnums.js +6 -6
  25. package/dist/formats/black/core/blackSchema.js +3 -3
  26. package/dist/formats/black/core/blackVersion.js +22 -22
  27. package/dist/formats/black/core/helpers.js +182 -182
  28. package/dist/formats/black/core/schema.js +4 -4
  29. package/dist/formats/black/index.js +2 -2
  30. package/dist/formats/bnk/CjsBnkFormat.js +125 -125
  31. package/dist/formats/bnk/core/graph.js +140 -140
  32. package/dist/formats/bnk/core/helpers.js +409 -409
  33. package/dist/formats/bnk/core/musicNodes.js +489 -489
  34. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  35. package/dist/formats/bnk/index.js +2 -2
  36. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  37. package/dist/formats/cmf/core/binary.js +118 -118
  38. package/dist/formats/cmf/core/buffers.js +233 -233
  39. package/dist/formats/cmf/core/constants.js +47 -47
  40. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  41. package/dist/formats/cmf/core/helpers.js +287 -287
  42. package/dist/formats/cmf/core/pack.js +276 -276
  43. package/dist/formats/cmf/core/schema.js +364 -364
  44. package/dist/formats/cmf/core/shared.js +268 -268
  45. package/dist/formats/cmf/core/writer.js +517 -517
  46. package/dist/formats/cmf/index.js +2 -2
  47. package/dist/formats/dds/CjsDdsFormat.js +193 -193
  48. package/dist/formats/dds/core/bc6h.js +288 -0
  49. package/dist/formats/dds/core/bc6h.js.map +1 -0
  50. package/dist/formats/dds/core/bc7.js +251 -0
  51. package/dist/formats/dds/core/bc7.js.map +1 -0
  52. package/dist/formats/dds/core/helpers.js +815 -812
  53. package/dist/formats/dds/core/helpers.js.map +1 -1
  54. package/dist/formats/dds/index.js +2 -2
  55. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  56. package/dist/formats/fbx/core/helpers.js +3901 -3901
  57. package/dist/formats/fbx/index.js +2 -2
  58. package/dist/formats/flac/CjsFlacFormat.js +87 -87
  59. package/dist/formats/flac/core/helpers.js +295 -295
  60. package/dist/formats/flac/index.js +2 -2
  61. package/dist/formats/gif/CjsGifFormat.js +87 -87
  62. package/dist/formats/gif/core/helpers.js +360 -360
  63. package/dist/formats/gif/index.js +2 -2
  64. package/dist/formats/gltf/CjsGltfFormat.js +290 -290
  65. package/dist/formats/gltf/core/helpers.js +292 -292
  66. package/dist/formats/gltf/core/json.js +79 -79
  67. package/dist/formats/gltf/core/parser.js +666 -666
  68. package/dist/formats/gltf/core/targets.js +163 -163
  69. package/dist/formats/gltf/index.js +2 -2
  70. package/dist/formats/index.js +23 -23
  71. package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
  72. package/dist/formats/jpeg/core/helpers.js +350 -350
  73. package/dist/formats/jpeg/core/jpeg.js +377 -377
  74. package/dist/formats/jpeg/index.js +2 -2
  75. package/dist/formats/mp3/CjsMp3Format.js +192 -192
  76. package/dist/formats/mp3/core/helpers.js +338 -338
  77. package/dist/formats/mp3/index.js +2 -2
  78. package/dist/formats/mp4/CjsMp4Format.js +191 -191
  79. package/dist/formats/mp4/core/helpers.js +449 -449
  80. package/dist/formats/mp4/index.js +2 -2
  81. package/dist/formats/obj/CjsObjFormat.js +253 -253
  82. package/dist/formats/obj/core/helpers.js +573 -573
  83. package/dist/formats/obj/core/json.js +64 -64
  84. package/dist/formats/obj/core/parser.js +321 -321
  85. package/dist/formats/obj/index.js +2 -2
  86. package/dist/formats/ogg/CjsOggFormat.js +88 -88
  87. package/dist/formats/ogg/core/helpers.js +387 -387
  88. package/dist/formats/ogg/core/imdct.js +178 -178
  89. package/dist/formats/ogg/core/vorbis.js +999 -999
  90. package/dist/formats/ogg/index.js +2 -2
  91. package/dist/formats/png/CjsPngFormat.js +195 -195
  92. package/dist/formats/png/core/helpers.js +583 -583
  93. package/dist/formats/png/index.js +2 -2
  94. package/dist/formats/red/CjsRedFormat.js +261 -261
  95. package/dist/formats/red/core/CjsRedReader.js +194 -194
  96. package/dist/formats/red/core/blackDefinitions.js +3 -3
  97. package/dist/formats/red/core/helpers.js +139 -139
  98. package/dist/formats/red/core/redGraph.js +68 -68
  99. package/dist/formats/red/core/schema.js +4 -4
  100. package/dist/formats/red/index.js +2 -2
  101. package/dist/formats/stl/CjsStlFormat.js +365 -365
  102. package/dist/formats/stl/core/helpers.js +261 -261
  103. package/dist/formats/stl/core/json.js +51 -51
  104. package/dist/formats/stl/core/stl.js +629 -629
  105. package/dist/formats/stl/core/targets.js +163 -163
  106. package/dist/formats/stl/index.js +2 -2
  107. package/dist/formats/tga/CjsTgaFormat.js +192 -192
  108. package/dist/formats/tga/core/helpers.js +446 -446
  109. package/dist/formats/tga/index.js +2 -2
  110. package/dist/formats/wav/CjsWavFormat.js +192 -192
  111. package/dist/formats/wav/core/helpers.js +328 -328
  112. package/dist/formats/wav/index.js +2 -2
  113. package/dist/formats/webm/CjsWebmFormat.js +191 -191
  114. package/dist/formats/webm/core/helpers.js +537 -537
  115. package/dist/formats/webm/index.js +2 -2
  116. package/dist/formats/webp/CjsWebpFormat.js +86 -86
  117. package/dist/formats/webp/core/helpers.js +214 -214
  118. package/dist/formats/webp/index.js +2 -2
  119. package/dist/formats/wem/CjsWemFormat.js +241 -241
  120. package/dist/formats/wem/core/bitStream.js +259 -259
  121. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  122. package/dist/formats/wem/core/helpers.js +417 -417
  123. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  124. package/dist/formats/wem/core/ptadpcm.js +77 -77
  125. package/dist/formats/wem/core/resolve.js +121 -121
  126. package/dist/formats/wem/core/wemToOgg.js +485 -485
  127. package/dist/formats/wem/index.js +2 -2
  128. package/dist/formats/yaml/CjsYamlFormat.js +83 -83
  129. package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
  130. package/dist/formats/yaml/core/helpers.js +160 -160
  131. package/dist/formats/yaml/index.js +2 -2
  132. package/dist/index.js +48 -48
  133. package/dist/resourcePath.js +18 -18
  134. package/dist/resourceStates.js +9 -9
  135. package/dist/resources/AudioGeometryResData.js +47 -47
  136. package/dist/resources/GStateBindingCallbackData.js +31 -31
  137. package/dist/resources/MeshDecalData.js +37 -37
  138. package/dist/resources/MeshDecalLodData.js +34 -34
  139. package/dist/resources/Tr2EffectRes.js +71 -71
  140. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
  141. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  142. package/dist/resources/Tr2ImageRes.js +114 -114
  143. package/dist/resources/Tr2LightProfileRes.js +40 -40
  144. package/dist/resources/Tr2MaterialArea.js +34 -34
  145. package/dist/resources/Tr2MaterialMesh.js +31 -31
  146. package/dist/resources/Tr2MaterialRes.js +34 -34
  147. package/dist/resources/Tr2ShaderPermutation.js +43 -43
  148. package/dist/resources/Tr2TextureLodManager.js +80 -80
  149. package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
  150. package/dist/resources/Tr2TexturePackChannel.js +37 -37
  151. package/dist/resources/Tr2TexturePipeline.js +52 -52
  152. package/dist/resources/Tr2TexturePipelineParams.js +34 -34
  153. package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
  154. package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
  155. package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
  156. package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
  157. package/dist/resources/TriGeometryRes.js +239 -216
  158. package/dist/resources/TriGeometryRes.js.map +1 -1
  159. package/dist/resources/TriGeometryResAreaData.js +59 -59
  160. package/dist/resources/TriGeometryResJointData.js +38 -38
  161. package/dist/resources/TriGeometryResLodData.js +88 -88
  162. package/dist/resources/TriGeometryResMeshData.js +63 -63
  163. package/dist/resources/TriGeometryResSkeletonData.js +34 -34
  164. package/dist/resources/TriGrannyRes.js +43 -43
  165. package/dist/resources/TriJointBinding.js +38 -38
  166. package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
  167. package/dist/resources/TriRtGeometryConstants.js +88 -88
  168. package/dist/resources/TriTextureRes.js +304 -304
  169. package/dist/resources/enums.js +18 -18
  170. package/dist/resources/resourceBoundary.js +47 -47
  171. package/dist/resources/texturePipelineBehavior.js +308 -308
  172. package/dist/texture/CjsTextureArrayRes.js +406 -406
  173. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  174. package/format-notices/black/LICENSE +21 -21
  175. package/format-notices/black/NOTICE +47 -47
  176. package/format-notices/bnk/LICENSE +21 -21
  177. package/format-notices/bnk/NOTICE +20 -20
  178. package/format-notices/cmf/LICENSE +21 -21
  179. package/format-notices/cmf/NOTICE +36 -36
  180. package/format-notices/dds/LICENSE +21 -21
  181. package/format-notices/dds/NOTICE +14 -14
  182. package/format-notices/fbx/LICENSE +21 -21
  183. package/format-notices/fbx/NOTICE +14 -14
  184. package/format-notices/flac/LICENSE +21 -21
  185. package/format-notices/flac/NOTICE +14 -14
  186. package/format-notices/gif/LICENSE +21 -21
  187. package/format-notices/gif/NOTICE +14 -14
  188. package/format-notices/gltf/LICENSE +21 -21
  189. package/format-notices/gltf/NOTICE +27 -27
  190. package/format-notices/jpeg/LICENSE +21 -21
  191. package/format-notices/jpeg/NOTICE +14 -14
  192. package/format-notices/mp3/LICENSE +21 -21
  193. package/format-notices/mp3/NOTICE +14 -14
  194. package/format-notices/mp4/LICENSE +21 -21
  195. package/format-notices/mp4/NOTICE +14 -14
  196. package/format-notices/obj/LICENSE +21 -21
  197. package/format-notices/obj/NOTICE +26 -26
  198. package/format-notices/ogg/LICENSE +21 -21
  199. package/format-notices/ogg/NOTICE +28 -28
  200. package/format-notices/png/LICENSE +21 -21
  201. package/format-notices/png/NOTICE +14 -14
  202. package/format-notices/red/LICENSE +21 -21
  203. package/format-notices/red/NOTICE +31 -31
  204. package/format-notices/stl/LICENSE +21 -21
  205. package/format-notices/stl/NOTICE +21 -21
  206. package/format-notices/tga/LICENSE +21 -21
  207. package/format-notices/tga/NOTICE +14 -14
  208. package/format-notices/wav/LICENSE +21 -21
  209. package/format-notices/wav/NOTICE +14 -14
  210. package/format-notices/webm/LICENSE +21 -21
  211. package/format-notices/webm/NOTICE +14 -14
  212. package/format-notices/webp/LICENSE +21 -21
  213. package/format-notices/webp/NOTICE +14 -14
  214. package/format-notices/wem/LICENSE +57 -57
  215. package/format-notices/wem/NOTICE +33 -33
  216. package/format-notices/yaml/LICENSE +21 -21
  217. package/format-notices/yaml/NOTICE +44 -44
  218. package/package.json +2 -2
  219. package/resource-lifecycle.md +679 -679
@@ -1,144 +1,155 @@
1
- # Format ownership and fork provenance
2
-
3
- On 2026-07-13, the non-shader runtime format implementations below were copied
4
- once into `runtime-resource`. Their standalone repositories remain frozen with
5
- their existing APIs and names; they are not upstreams for the runtime copies.
6
-
7
- Copied paths were `src/` and the behavioral `test/` corpus. Package publishing
8
- scripts and CLIs were not copied. Exact donor license and notice files are kept
9
- under `format-notices/<format>/`.
10
-
11
- | Legacy package | Source revision/state | Runtime class | Runtime import |
12
- |---|---|---|---|
13
- | `format-black` | `9fcaaff9e5f28c90b628d8a10b7c79aff7913a90` | `CjsBlackFormat` | `@carbonenginejs/runtime-resource/formats/black` |
14
- | `format-cmf` | unborn working-tree snapshot | `CjsCmfFormat` | `@carbonenginejs/runtime-resource/formats/cmf` |
15
- | `format-dds` | `66fa149cd826e1114ad0be84479f89dee753ed76` | `CjsDdsFormat` | `@carbonenginejs/runtime-resource/formats/dds` |
16
- | `format-fbx` | `8d0fcc2fe44c8096b35e360a903bff30b49eb592` | `CjsFbxFormat` | `@carbonenginejs/runtime-resource/formats/fbx` |
17
- | `format-flac` | unborn working-tree snapshot | `CjsFlacFormat` | `@carbonenginejs/runtime-resource/formats/flac` |
18
- | `format-gif` | `5d831c5c0533a9579682f776274574289a520899` | `CjsGifFormat` | `@carbonenginejs/runtime-resource/formats/gif` |
19
- | `format-gltf` | `d0dadf920828bceec987c2a5fa1f161f81db28aa` | `CjsGltfFormat` | `@carbonenginejs/runtime-resource/formats/gltf` |
20
- | `format-jpeg` | `bed2253ea979bba27812420fa897987d82a91793` | `CjsJpegFormat` | `@carbonenginejs/runtime-resource/formats/jpeg` |
21
- | `format-mp3` | unborn working-tree snapshot | `CjsMp3Format` | `@carbonenginejs/runtime-resource/formats/mp3` |
22
- | `format-mp4` | `cffc5a57b115a99ed9e0947a6b9d3390ffc3581c` | `CjsMp4Format` | `@carbonenginejs/runtime-resource/formats/mp4` |
23
- | `format-obj` | `e5d3f9a1520c7855bd5b6edc1e2304a7b4e18176` | `CjsObjFormat` | `@carbonenginejs/runtime-resource/formats/obj` |
24
- | `format-ogg` | unborn working-tree snapshot | `CjsOggFormat` | `@carbonenginejs/runtime-resource/formats/ogg` |
25
- | `format-png` | `04dbb7c0f289043c3c32d9141ec3ef74aeeb1c43` | `CjsPngFormat` | `@carbonenginejs/runtime-resource/formats/png` |
26
- | `format-red` | `98beab6988111418d6e09827b92d27e08da4c05b` | `CjsRedFormat` | `@carbonenginejs/runtime-resource/formats/red` |
27
- | `format-stl` | `4858f9a37bf140a3c544fa30a13a6fcce015247b` | `CjsStlFormat` | `@carbonenginejs/runtime-resource/formats/stl` |
28
- | `format-tga` | `b0f9df263727057537b2279322e8cd088f366179` | `CjsTgaFormat` | `@carbonenginejs/runtime-resource/formats/tga` |
29
- | `format-wav` | unborn working-tree snapshot | `CjsWavFormat` | `@carbonenginejs/runtime-resource/formats/wav` |
30
- | `format-webm` | `459203ac293d0d53fff0e43494b7e47d8d4c92bd` | `CjsWebmFormat` | `@carbonenginejs/runtime-resource/formats/webm` |
31
- | `format-webp` | `19155e9cc7ae05845c23a3c259d3a586569eba40` | `CjsWebpFormat` | `@carbonenginejs/runtime-resource/formats/webp` |
32
- | `format-yaml` | `3d7e1d1cf9b7a936283d6050efe43a0a9fadb6a4` | `CjsYamlFormat` | `@carbonenginejs/runtime-resource/formats/yaml` |
33
-
34
- The unborn donors had no commit-addressable `HEAD`; this document deliberately
35
- records them as working-tree snapshots rather than inventing a revision. Their
36
- copied runtime files are the deterministic retained snapshot.
37
-
38
- ## Black definition snapshot
39
-
40
- The Black reader uses the package-owned generated definition snapshot at
41
- `src/formats/black/core/black-schema-v1-2026-07-11.json`. The Red format exposes
42
- the same catalog for discovery, but its YAML reader currently accepts named
43
- fields without registry enforcement. The snapshot was copied from
44
- `format-carbon` revision `d2a3c67cf3d46e8ba78ca19e66558d868178ec24`
45
- with SHA-256
46
- `008ECB29E670EFC678B471A6EFF099600A29C2907912FC42B854995904604691`.
47
-
48
- This retained generated artifact keeps the published readers deterministic and
49
- browser-safe without a runtime dependency on a sibling checkout or an
50
- unpublished `format-carbon` export. `format-carbon` remains the build-time
51
- authority for future schema regeneration; an updated snapshot must record its
52
- new source revision and digest here.
53
-
54
- ## Native additions
55
-
56
- Formats below were authored directly in `runtime-resource` and have no legacy
57
- donor package. Their `format-notices/<format>/` entries record third-party
58
- format attribution rather than fork provenance.
59
-
60
- | Format | Runtime class | Runtime import | Notes |
61
- |---|---|---|---|
62
- | Wwise soundbank (`.bnk`) | `CjsBnkFormat` | `@carbonenginejs/runtime-resource/formats/bnk` | Original code; chunk layout from public community documentation (ww2ogg, vgmstream, wwiser), no code copied. Also carries the SoundbanksInfo JSON helpers (`parseSoundbanksInfo`, `buildSoundbanksCatalog`, `joinSoundbanksInfo`) and `wwiseIdFromName` (FNV-1 32 of the lowercased name, verified against EVE bank/language ids). HIRC entries additionally decode version-stable typed fields (event action lists, action type/target, sound and music-track source ids), pinned by hexdump against bank generator version 150, and the `wwise` static namespace groups the domain toolkit (SoundbanksInfo helpers, id hash, `wwise.eventMediaFromBanks` event → media resolution over inspected banks — graph interpretation for consumers; never used by the resource lifecycle). |
63
- | Wwise media (`.wem`) | `CjsWemFormat` | `@carbonenginejs/runtime-resource/formats/wem` | Original code; container/codec-tag behavior from public community documentation (ww2ogg, vgmstream, wwiser), no code copied. Includes a Wwise-Vorbis→Ogg repacker (`emit: "ogg"`), an original reimplementation of the ww2ogg algorithm with inline granule computation (no revorb pass needed), and a PTADPCM/16-bit-PCM decoder (`emit: "pcm"` / `toPcm()`, AudioBuffer-ready float32; PTADPCM algorithm from community documentation, verified against EVE media). |
64
-
65
- ## Post-fork additions inside copied formats
66
-
67
- - `formats/stl` received a writer hardening pass (2026-07-18) without changing
68
- its donor origin: binary provenance headers now round-trip the caller's solid
69
- name, shared triangle indices are validated as in-range safe integers, scaled
70
- coordinates must remain finite, and binary coordinates must fit float32
71
- instead of silently becoming infinities. Writer JSDoc and ASCII/binary
72
- round-trip/error coverage were expanded in the runtime-owned copy.
73
- - `formats/cmf` gained a **binary CMF v1 writer** (2026-07-15,
74
- `src/formats/cmf/core/writer.js`, `CjsCmfFormat.write`/`writeAsync` and
75
- `Write`/`WriteAsync`): original code implementing CarbonEngine's
76
- `cmf::BuildFile` behavior tagged self-relative span flattening with leaf
77
- chunk dedup, BufferView→section remapping in first-encounter order,
78
- meshoptimizer vertex/index compression (index compression canonicalizes
79
- triangle rotation, matching the engine's own writer test expectations), and
80
- the post-crc32 file checksum. Verified by write→read roundtrips against the
81
- runtime reader; `E:\carbonengine\mesh\{include,src}\cmf` was the behavioral
82
- reference, no code copied. `writeShared`/`writeSharedAsync` plus
83
- `core/pack.js` (channel interleaving, index packing, unique buffer-index
84
- assignment) serialize shared geometry directly, enabling GR2/OBJ/glTF→CMF
85
- verified against real EVE `.gr2` models fetched via
86
- `@carbonenginejs/tool-index` (positions exact, triangles equivalent).
87
- - `formats/cmf` also gained the **GR2 skeleton/animation converter**
88
- (2026-07-15, `src/formats/cmf/core/gr2Anim.js`, applied automatically by
89
- `writeShared`): GR2-shaped skeletons (root list or `models[].skeleton`)
90
- convert to CMF bones/parents/rest transforms with inverse binds rebuilt
91
- from the rest hierarchy; decoded Granny curves convert to CMF Step/Linear
92
- channels degree ≤ 1 exactly, degree 2 via adaptive de Boor resampling
93
- with discontinuities snapped to one float32 ULP. Consumes only decoded
94
- `{knots, controls}` data so the MIT runtime stays independent of the GR2
95
- package. Validated on EVE ships (cde3_t3, gde3_t3, cfaux1_t1, mfaux1_t1:
96
- 3,377 channels 8.3e-4 positional / 0.14° rotational vs the GR2 runtime
97
- sampler; 9 Granny curve formats) and characters (basicfemale: 132-bone
98
- skeleton, exact skin weights).
99
- - `formats/ogg` gained a pure-JS **Ogg Vorbis PCM decoder** (2026-07-15,
100
- `src/formats/ogg/core/{vorbis.js,imdct.js}`, `emit: "pcm"`/`"audio"`):
101
- original code implementing the Vorbis I specification (floor 1, residues
102
- 0/1/2, square-polar coupling, FFT-based IMDCT, windowed overlap-add).
103
- stb_vorbis (public domain) was consulted as a behavioral reference and is
104
- the source of the spec's floor1 `inverse_db_table` constants; no licensed
105
- code was copied. Validated bit-comparable to ffmpeg (max diff ~3e-8) and
106
- vgmstream (±1 int16 LSB) across the EVE Vorbis corpus.
107
-
108
- ## Wem packed-codebook snapshot
109
-
110
- The wem Ogg repacker ships a package-owned copy of the aoTuV 6.03 packed
111
- Vorbis codebook library at
112
- `src/formats/wem/core/packedCodebooksAotuv603.js` (base64 module). It was
113
- copied byte-identically from `packed_codebooks_aoTuV_603.bin` in the ww2ogg
114
- distribution (`github.com/hcs64/ww2ogg`), 74,387 bytes, SHA-256
115
- `00a93eab267d281401b1efd54e888a2e183299b9e6c446c48d09f701a89d9d27`, retrieved
116
- 2026-07-15. The data is BSD-licensed (Xiph.org Foundation, Adam Gashlin);
117
- attribution and the full license terms are recorded in
118
- `format-notices/wem/NOTICE` and `format-notices/wem/LICENSE`. An updated
119
- snapshot must record its new source and digest here.
120
-
121
- ## Deliberately not copied
122
-
123
- - `format-gr2` is the intended runtime-resource owner target, but its current
124
- BitKnit-derived implementation is EUPL-1.2. It remains separate and active
125
- until that code is replaced or an explicit distribution-license decision is
126
- made. It has not been deprecated or relabeled as MIT.
127
- - `format-carbon` remains the schema emitter/generator and build-time schema
128
- authority. Black consumes its published definitions; Red exposes the copied
129
- catalog but does not yet enforce it while reading YAML fields.
130
- - `format-dxbc`, `format-hlsl`, `format-webgl`, and `format-webgpu` are active
131
- shader work and were not copied, annotated, or otherwise modified by this
132
- migration.
133
-
134
- ## Typed-array ownership adjustments
135
-
136
- The runtime copies preserve caller byte objects by reference. During the fork,
137
- three avoidable source-buffer copies were changed to views:
138
-
139
- - CMF compressed sections use `Uint8Array.subarray`.
140
- - glTF GLB chunks use `Uint8Array.subarray`.
141
- - FBX raw binary property payloads use `Uint8Array.subarray`.
142
-
143
- Decoder output buffers and GIF per-frame snapshots still allocate because those
144
- values have independent semantic identity.
1
+ # Format ownership and fork provenance
2
+
3
+ On 2026-07-13, the non-shader runtime format implementations below were copied
4
+ once into `runtime-resource`. Their standalone repositories remain frozen with
5
+ their existing APIs and names; they are not upstreams for the runtime copies.
6
+
7
+ Copied paths were `src/` and the behavioral `test/` corpus. Package publishing
8
+ scripts and CLIs were not copied. Exact donor license and notice files are kept
9
+ under `format-notices/<format>/`.
10
+
11
+ | Legacy package | Source revision/state | Runtime class | Runtime import |
12
+ |---|---|---|---|
13
+ | `format-black` | `9fcaaff9e5f28c90b628d8a10b7c79aff7913a90` | `CjsBlackFormat` | `@carbonenginejs/runtime-resource/formats/black` |
14
+ | `format-cmf` | unborn working-tree snapshot | `CjsCmfFormat` | `@carbonenginejs/runtime-resource/formats/cmf` |
15
+ | `format-dds` | `66fa149cd826e1114ad0be84479f89dee753ed76` | `CjsDdsFormat` | `@carbonenginejs/runtime-resource/formats/dds` |
16
+ | `format-fbx` | `8d0fcc2fe44c8096b35e360a903bff30b49eb592` | `CjsFbxFormat` | `@carbonenginejs/runtime-resource/formats/fbx` |
17
+ | `format-flac` | unborn working-tree snapshot | `CjsFlacFormat` | `@carbonenginejs/runtime-resource/formats/flac` |
18
+ | `format-gif` | `5d831c5c0533a9579682f776274574289a520899` | `CjsGifFormat` | `@carbonenginejs/runtime-resource/formats/gif` |
19
+ | `format-gltf` | `d0dadf920828bceec987c2a5fa1f161f81db28aa` | `CjsGltfFormat` | `@carbonenginejs/runtime-resource/formats/gltf` |
20
+ | `format-jpeg` | `bed2253ea979bba27812420fa897987d82a91793` | `CjsJpegFormat` | `@carbonenginejs/runtime-resource/formats/jpeg` |
21
+ | `format-mp3` | unborn working-tree snapshot | `CjsMp3Format` | `@carbonenginejs/runtime-resource/formats/mp3` |
22
+ | `format-mp4` | `cffc5a57b115a99ed9e0947a6b9d3390ffc3581c` | `CjsMp4Format` | `@carbonenginejs/runtime-resource/formats/mp4` |
23
+ | `format-obj` | `e5d3f9a1520c7855bd5b6edc1e2304a7b4e18176` | `CjsObjFormat` | `@carbonenginejs/runtime-resource/formats/obj` |
24
+ | `format-ogg` | unborn working-tree snapshot | `CjsOggFormat` | `@carbonenginejs/runtime-resource/formats/ogg` |
25
+ | `format-png` | `04dbb7c0f289043c3c32d9141ec3ef74aeeb1c43` | `CjsPngFormat` | `@carbonenginejs/runtime-resource/formats/png` |
26
+ | `format-red` | `98beab6988111418d6e09827b92d27e08da4c05b` | `CjsRedFormat` | `@carbonenginejs/runtime-resource/formats/red` |
27
+ | `format-stl` | `4858f9a37bf140a3c544fa30a13a6fcce015247b` | `CjsStlFormat` | `@carbonenginejs/runtime-resource/formats/stl` |
28
+ | `format-tga` | `b0f9df263727057537b2279322e8cd088f366179` | `CjsTgaFormat` | `@carbonenginejs/runtime-resource/formats/tga` |
29
+ | `format-wav` | unborn working-tree snapshot | `CjsWavFormat` | `@carbonenginejs/runtime-resource/formats/wav` |
30
+ | `format-webm` | `459203ac293d0d53fff0e43494b7e47d8d4c92bd` | `CjsWebmFormat` | `@carbonenginejs/runtime-resource/formats/webm` |
31
+ | `format-webp` | `19155e9cc7ae05845c23a3c259d3a586569eba40` | `CjsWebpFormat` | `@carbonenginejs/runtime-resource/formats/webp` |
32
+ | `format-yaml` | `3d7e1d1cf9b7a936283d6050efe43a0a9fadb6a4` | `CjsYamlFormat` | `@carbonenginejs/runtime-resource/formats/yaml` |
33
+
34
+ The unborn donors had no commit-addressable `HEAD`; this document deliberately
35
+ records them as working-tree snapshots rather than inventing a revision. Their
36
+ copied runtime files are the deterministic retained snapshot.
37
+
38
+ ## Black definition snapshot
39
+
40
+ The Black reader uses the package-owned generated definition snapshot at
41
+ `src/formats/black/core/black-schema-v1-2026-07-11.json`. The Red format exposes
42
+ the same catalog for discovery, but its YAML reader currently accepts named
43
+ fields without registry enforcement. The snapshot was copied from
44
+ `format-carbon` revision `d2a3c67cf3d46e8ba78ca19e66558d868178ec24`
45
+ with SHA-256
46
+ `008ECB29E670EFC678B471A6EFF099600A29C2907912FC42B854995904604691`.
47
+
48
+ This retained generated artifact keeps the published readers deterministic and
49
+ browser-safe without a runtime dependency on a sibling checkout or an
50
+ unpublished `format-carbon` export. `format-carbon` remains the build-time
51
+ authority for future schema regeneration; an updated snapshot must record its
52
+ new source revision and digest here.
53
+
54
+ ## Native additions
55
+
56
+ Formats below were authored directly in `runtime-resource` and have no legacy
57
+ donor package. Their `format-notices/<format>/` entries record third-party
58
+ format attribution rather than fork provenance.
59
+
60
+ | Format | Runtime class | Runtime import | Notes |
61
+ |---|---|---|---|
62
+ | Wwise soundbank (`.bnk`) | `CjsBnkFormat` | `@carbonenginejs/runtime-resource/formats/bnk` | Original code; chunk layout from public community documentation (ww2ogg, vgmstream, wwiser), no code copied. Also carries the SoundbanksInfo JSON helpers (`parseSoundbanksInfo`, `buildSoundbanksCatalog`, `joinSoundbanksInfo`) and `wwiseIdFromName` (FNV-1 32 of the lowercased name, verified against EVE bank/language ids). HIRC entries additionally decode version-stable typed fields (event action lists, action type/target, sound and music-track source ids), pinned by hexdump against bank generator version 150, and the `wwise` static namespace groups the domain toolkit (SoundbanksInfo helpers, id hash, `wwise.eventMediaFromBanks` event → media resolution over inspected banks — graph interpretation for consumers; never used by the resource lifecycle). |
63
+ | Wwise media (`.wem`) | `CjsWemFormat` | `@carbonenginejs/runtime-resource/formats/wem` | Original code; container/codec-tag behavior from public community documentation (ww2ogg, vgmstream, wwiser), no code copied. Includes a Wwise-Vorbis→Ogg repacker (`emit: "ogg"`), an original reimplementation of the ww2ogg algorithm with inline granule computation (no revorb pass needed), and a PTADPCM/16-bit-PCM decoder (`emit: "pcm"` / `toPcm()`, AudioBuffer-ready float32; PTADPCM algorithm from community documentation, verified against EVE media). |
64
+
65
+ ## Post-fork additions inside copied formats
66
+
67
+ - `formats/dds` gained original, dependency-free **BC6H and BC7 CPU decoders**
68
+ in `runtime-resource` 0.8.0 (2026-07-21). BC6H covers all fourteen modes,
69
+ signed and unsigned HDR, transformed endpoints, partition/anchor fixups,
70
+ interpolation, reserved opaque-black modes, and float RGBA output. BC7 covers
71
+ all eight modes,
72
+ two- and three-subset partitions, anchor fixups, P-bits, dual index streams,
73
+ channel rotation, edge blocks, and the reserved transparent mode. Fixed bit
74
+ layouts and tables follow the Khronos Data Format Specification and Microsoft
75
+ BC6H/BC7 documentation. Tests cover every mode and signed/unsigned fixtures;
76
+ BC7 was also checked against randomized valid-mode blocks and both decoders
77
+ were exercised on real EVE textures acquired through `tools-core`.
78
+ - `formats/stl` received a writer hardening pass (2026-07-18) without changing
79
+ its donor origin: binary provenance headers now round-trip the caller's solid
80
+ name, shared triangle indices are validated as in-range safe integers, scaled
81
+ coordinates must remain finite, and binary coordinates must fit float32
82
+ instead of silently becoming infinities. Writer JSDoc and ASCII/binary
83
+ round-trip/error coverage were expanded in the runtime-owned copy.
84
+ - `formats/cmf` gained a **binary CMF v1 writer** (2026-07-15,
85
+ `src/formats/cmf/core/writer.js`, `CjsCmfFormat.write`/`writeAsync` and
86
+ `Write`/`WriteAsync`): original code implementing CarbonEngine's
87
+ `cmf::BuildFile` behavior tagged self-relative span flattening with leaf
88
+ chunk dedup, BufferView→section remapping in first-encounter order,
89
+ meshoptimizer vertex/index compression (index compression canonicalizes
90
+ triangle rotation, matching the engine's own writer test expectations), and
91
+ the post-crc32 file checksum. Verified by write→read roundtrips against the
92
+ runtime reader; `E:\carbonengine\mesh\{include,src}\cmf` was the behavioral
93
+ reference, no code copied. `writeShared`/`writeSharedAsync` plus
94
+ `core/pack.js` (channel interleaving, index packing, unique buffer-index
95
+ assignment) serialize shared geometry directly, enabling GR2/OBJ/glTF→CMF
96
+ verified against real EVE `.gr2` models fetched via
97
+ `@carbonenginejs/tool-index` (positions exact, triangles equivalent).
98
+ - `formats/cmf` also gained the **GR2 skeleton/animation converter**
99
+ (2026-07-15, `src/formats/cmf/core/gr2Anim.js`, applied automatically by
100
+ `writeShared`): GR2-shaped skeletons (root list or `models[].skeleton`)
101
+ convert to CMF bones/parents/rest transforms with inverse binds rebuilt
102
+ from the rest hierarchy; decoded Granny curves convert to CMF Step/Linear
103
+ channels degree 1 exactly, degree 2 via adaptive de Boor resampling
104
+ with discontinuities snapped to one float32 ULP. Consumes only decoded
105
+ `{knots, controls}` data so the MIT runtime stays independent of the GR2
106
+ package. Validated on EVE ships (cde3_t3, gde3_t3, cfaux1_t1, mfaux1_t1:
107
+ 3,377 channels ≤ 8.3e-4 positional / ≤ 0.14° rotational vs the GR2 runtime
108
+ sampler; 9 Granny curve formats) and characters (basicfemale: 132-bone
109
+ skeleton, exact skin weights).
110
+ - `formats/ogg` gained a pure-JS **Ogg Vorbis PCM decoder** (2026-07-15,
111
+ `src/formats/ogg/core/{vorbis.js,imdct.js}`, `emit: "pcm"`/`"audio"`):
112
+ original code implementing the Vorbis I specification (floor 1, residues
113
+ 0/1/2, square-polar coupling, FFT-based IMDCT, windowed overlap-add).
114
+ stb_vorbis (public domain) was consulted as a behavioral reference and is
115
+ the source of the spec's floor1 `inverse_db_table` constants; no licensed
116
+ code was copied. Validated bit-comparable to ffmpeg (max diff ~3e-8) and
117
+ vgmstream (±1 int16 LSB) across the EVE Vorbis corpus.
118
+
119
+ ## Wem packed-codebook snapshot
120
+
121
+ The wem Ogg repacker ships a package-owned copy of the aoTuV 6.03 packed
122
+ Vorbis codebook library at
123
+ `src/formats/wem/core/packedCodebooksAotuv603.js` (base64 module). It was
124
+ copied byte-identically from `packed_codebooks_aoTuV_603.bin` in the ww2ogg
125
+ distribution (`github.com/hcs64/ww2ogg`), 74,387 bytes, SHA-256
126
+ `00a93eab267d281401b1efd54e888a2e183299b9e6c446c48d09f701a89d9d27`, retrieved
127
+ 2026-07-15. The data is BSD-licensed (Xiph.org Foundation, Adam Gashlin);
128
+ attribution and the full license terms are recorded in
129
+ `format-notices/wem/NOTICE` and `format-notices/wem/LICENSE`. An updated
130
+ snapshot must record its new source and digest here.
131
+
132
+ ## Deliberately not copied
133
+
134
+ - `format-gr2` is the intended runtime-resource owner target, but its current
135
+ BitKnit-derived implementation is EUPL-1.2. It remains separate and active
136
+ until that code is replaced or an explicit distribution-license decision is
137
+ made. It has not been deprecated or relabeled as MIT.
138
+ - `format-carbon` remains the schema emitter/generator and build-time schema
139
+ authority. Black consumes its published definitions; Red exposes the copied
140
+ catalog but does not yet enforce it while reading YAML fields.
141
+ - `format-dxbc`, `format-hlsl`, `format-webgl`, and `format-webgpu` are active
142
+ shader work and were not copied, annotated, or otherwise modified by this
143
+ migration.
144
+
145
+ ## Typed-array ownership adjustments
146
+
147
+ The runtime copies preserve caller byte objects by reference. During the fork,
148
+ three avoidable source-buffer copies were changed to views:
149
+
150
+ - CMF compressed sections use `Uint8Array.subarray`.
151
+ - glTF GLB chunks use `Uint8Array.subarray`.
152
+ - FBX raw binary property payloads use `Uint8Array.subarray`.
153
+
154
+ Decoder output buffers and GIF per-frame snapshots still allocate because those
155
+ values have independent semantic identity.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 CarbonEngineJS contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CarbonEngineJS contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE CHANGED
@@ -1,29 +1,29 @@
1
- carbonenginejs/runtime-resource
2
- ================================
3
-
4
- Copyright (c) 2026 CarbonEngineJS contributors.
5
-
6
- This package owns CarbonEngineJS resource lifecycle, format selection, and the
7
- non-shader format implementations listed under `format-notices/`.
8
-
9
- CarbonEngine source material, format names, class names, and schema semantics
10
- remain copyright their original CarbonEngine authors. Fenris Creations
11
- (CCP Games) source material, tools, assets, shader behavior, and EVE-related
12
- data remain copyright their original holders. These names are used for
13
- interoperability and provenance context. This project is not affiliated with
14
- or endorsed by CCP Games.
15
-
16
- The copied format implementations retain their original MIT license and NOTICE
17
- files under `format-notices/<format>/`. Those notices include third-party
18
- dependency and behavioral-reference attribution, including meshoptimizer,
19
- yaml, and black-reader-js.
20
-
21
- The bundled Black definition JSON is a generated CarbonEngineJS schema artifact
22
- copied from `format-carbon` revision
23
- `d2a3c67cf3d46e8ba78ca19e66558d868178ec24`. Its exact digest and retention
24
- purpose are recorded in `FORMAT-PROVENANCE.md`; no CarbonEngine source file or
25
- game asset is embedded in that generated definition snapshot.
26
-
27
- The EUPL-1.2 `format-gr2` implementation is deliberately not included. GR2
28
- ownership migration remains deferred until its EUPL-derived BitKnit boundary
29
- is replaced or an explicit distribution-license decision is made.
1
+ carbonenginejs/runtime-resource
2
+ ================================
3
+
4
+ Copyright (c) 2026 CarbonEngineJS contributors.
5
+
6
+ This package owns CarbonEngineJS resource lifecycle, format selection, and the
7
+ non-shader format implementations listed under `format-notices/`.
8
+
9
+ CarbonEngine source material, format names, class names, and schema semantics
10
+ remain copyright their original CarbonEngine authors. Fenris Creations
11
+ (CCP Games) source material, tools, assets, shader behavior, and EVE-related
12
+ data remain copyright their original holders. These names are used for
13
+ interoperability and provenance context. This project is not affiliated with
14
+ or endorsed by CCP Games.
15
+
16
+ The copied format implementations retain their original MIT license and NOTICE
17
+ files under `format-notices/<format>/`. Those notices include third-party
18
+ dependency and behavioral-reference attribution, including meshoptimizer,
19
+ yaml, and black-reader-js.
20
+
21
+ The bundled Black definition JSON is a generated CarbonEngineJS schema artifact
22
+ copied from `format-carbon` revision
23
+ `d2a3c67cf3d46e8ba78ca19e66558d868178ec24`. Its exact digest and retention
24
+ purpose are recorded in `FORMAT-PROVENANCE.md`; no CarbonEngine source file or
25
+ game asset is embedded in that generated definition snapshot.
26
+
27
+ The EUPL-1.2 `format-gr2` implementation is deliberately not included. GR2
28
+ ownership migration remains deferred until its EUPL-derived BitKnit boundary
29
+ is replaced or an explicit distribution-license decision is made.
package/README.md CHANGED
@@ -115,6 +115,17 @@ downsample, pack builds logical RGBA channels from independent inputs, and
115
115
  Carbon's present compress step remains validation-only because the native
116
116
  method is itself a no-op. Unsupported step types fail explicitly.
117
117
 
118
+ Decoded DDS fallback currently has a narrower contract than native DDS texture
119
+ output. `emit: "rgba"` returns one canonical 2D surface decoded from the first
120
+ DDS subresource; it does not preserve stored mip levels, cube faces, array
121
+ layers, or volume slices. Consumers may use it for ordinary 2D fallback when
122
+ the engine owns any required mip generation, but must not infer decoded
123
+ multi-subresource support from a successful RGBA probe. A future richer
124
+ decoded-texture contract must be introduced explicitly rather than overloading
125
+ the current RGBA fields. The software path includes BC1-BC5 and BC7 as RGBA8,
126
+ plus signed and unsigned BC6H as linear `Float32Array` RGBA without clamping HDR
127
+ values. These block decoders are implemented in-project with no codec package.
128
+
118
129
  `Tr2TextureLodManager` owns only ordered resource membership through
119
130
  `RegisterTexture()`, `UnregisterTexture()`, and `GetManagedTextures()`. Engine
120
131
  packages continue to own GPU allocations, upload accounting, device budgets,