@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
@@ -0,0 +1,104 @@
1
+ # Format subpaths
2
+
3
+ Status: Evolving
4
+ Scope: `@carbonenginejs/runtime-resource/formats`
5
+ Audience: Users and integrators
6
+ Summary: Maps every non-shader format subpath and records cross-format output conventions.
7
+
8
+ ## Import rule
9
+
10
+ Concrete formats are never imported or registered by the package root. Each
11
+ format is an explicit tree-shakeable subpath, registered by the caller:
12
+
13
+ ```js
14
+ import { CjsResMan } from "@carbonenginejs/runtime-resource";
15
+ import { CjsMp4Format } from "@carbonenginejs/runtime-resource/formats/mp4";
16
+
17
+ const resMan = new CjsResMan().Register({
18
+ source,
19
+ formats: [ CjsMp4Format ]
20
+ });
21
+
22
+ const resource = resMan.GetResource("res:/video/intro.mp4");
23
+ const video = await resource.Ready();
24
+ ```
25
+
26
+ Formats return plain payload objects. Semantic resource classes apply them
27
+ through `SetPayload()`, validate their own required fields, and throw
28
+ `CJS_RESOURCE_PAYLOAD_INVALID` before replacing a previously valid payload.
29
+ `GetPayload()`, `HasPayload()`, and `ReleasePayload()` manage transient CPU
30
+ retention without introducing a parallel DTO class hierarchy.
31
+
32
+ ## Format map
33
+
34
+ | Format | Class | Import |
35
+ |---|---|---|
36
+ | Black (`.black`) | `CjsBlackFormat` | `@carbonenginejs/runtime-resource/formats/black` |
37
+ | Wwise soundbank (`.bnk`) | `CjsBnkFormat` | `@carbonenginejs/runtime-resource/formats/bnk` |
38
+ | CMF (`.cmf`) | `CjsCmfFormat` | `@carbonenginejs/runtime-resource/formats/cmf` |
39
+ | DDS (`.dds`) | `CjsDdsFormat` | `@carbonenginejs/runtime-resource/formats/dds` |
40
+ | FBX (`.fbx`) | `CjsFbxFormat` | `@carbonenginejs/runtime-resource/formats/fbx` |
41
+ | FLAC (`.flac`) | `CjsFlacFormat` | `@carbonenginejs/runtime-resource/formats/flac` |
42
+ | GIF (`.gif`) | `CjsGifFormat` | `@carbonenginejs/runtime-resource/formats/gif` |
43
+ | glTF (`.gltf`/`.glb`) | `CjsGltfFormat` | `@carbonenginejs/runtime-resource/formats/gltf` |
44
+ | Granny GR2/GSF (`.gr2`/`.gsf`) | `CjsGr2Format` | `@carbonenginejs/runtime-resource/formats/gr2` |
45
+ | JPEG (`.jpg`/`.jpeg`) | `CjsJpegFormat` | `@carbonenginejs/runtime-resource/formats/jpeg` |
46
+ | MP3 (`.mp3`) | `CjsMp3Format` | `@carbonenginejs/runtime-resource/formats/mp3` |
47
+ | MP4 (`.mp4`) | `CjsMp4Format` | `@carbonenginejs/runtime-resource/formats/mp4` |
48
+ | OBJ (`.obj`) | `CjsObjFormat` | `@carbonenginejs/runtime-resource/formats/obj` |
49
+ | Ogg (`.ogg`) | `CjsOggFormat` | `@carbonenginejs/runtime-resource/formats/ogg` |
50
+ | PNG (`.png`) | `CjsPngFormat` | `@carbonenginejs/runtime-resource/formats/png` |
51
+ | Red (`.red`) | `CjsRedFormat` | `@carbonenginejs/runtime-resource/formats/red` |
52
+ | STL (`.stl`) | `CjsStlFormat` | `@carbonenginejs/runtime-resource/formats/stl` |
53
+ | TGA (`.tga`) | `CjsTgaFormat` | `@carbonenginejs/runtime-resource/formats/tga` |
54
+ | WAV (`.wav`) | `CjsWavFormat` | `@carbonenginejs/runtime-resource/formats/wav` |
55
+ | WebM (`.webm`) | `CjsWebmFormat` | `@carbonenginejs/runtime-resource/formats/webm` |
56
+ | WebP (`.webp`) | `CjsWebpFormat` | `@carbonenginejs/runtime-resource/formats/webp` |
57
+ | Wwise media (`.wem`) | `CjsWemFormat` | `@carbonenginejs/runtime-resource/formats/wem` |
58
+ | YAML (`.yaml`/`.yml`) | `CjsYamlFormat` | `@carbonenginejs/runtime-resource/formats/yaml` |
59
+
60
+ Detailed pages: [Wwise soundbanks and media](wwise.md),
61
+ [STL export](stl.md). Ownership history, retained snapshots, and donor
62
+ licensing are recorded in [provenance.md](provenance.md).
63
+
64
+ ## Granny GR2/GSF
65
+
66
+ `CjsGr2Format` reads `.gr2` geometry/skeleton/animation graphs and `.gsf`
67
+ (GState) profiles with no native tooling: section decompression (None,
68
+ Oodle1, and the clean-room BitKnit2 decoder), reflected type-tree walking,
69
+ GR2 JSON emission, optional curve decompression, CCP packed tangent-frame
70
+ unpacking, and caller-class hydration (`emit: "gr2"`/`"cmf"` with a
71
+ `classes` map). It was migrated from `@carbonenginejs/format-gr2` after that
72
+ package's 2026-07-24 MIT relicense; the frozen donor repository documents
73
+ the reader API and JSON graph in detail, and this copy preserves its
74
+ behavior and test surface.
75
+
76
+ ## Red output markers
77
+
78
+ Red payload output reserves configurable type, ID, reference, and sequence
79
+ values markers (`_type`, `_id`, `_reference`, and `_values` by default).
80
+ Repeated or cyclic sequences use an ID-bearing values envelope; unique
81
+ sequences remain arrays. Authored fields may not collide with active markers,
82
+ so remap the marker options when those names are real data. Disabling the
83
+ reference marker preserves actual JavaScript identity; cyclic output in that
84
+ mode is intentionally not JSON-serializable.
85
+
86
+ ## DDS decoded fallback
87
+
88
+ Decoded DDS fallback currently has a narrower contract than native DDS
89
+ texture output. `emit: "rgba"` returns one canonical 2D surface decoded from
90
+ the first DDS subresource; it does not preserve stored mip levels, cube
91
+ faces, array layers, or volume slices. Consumers may use it for ordinary 2D
92
+ fallback when the engine owns any required mip generation, but must not infer
93
+ decoded multi-subresource support from a successful RGBA probe. A future
94
+ richer decoded-texture contract must be introduced explicitly rather than
95
+ overloading the current RGBA fields.
96
+
97
+ The software path includes BC1-BC5 and BC7 as RGBA8, plus signed and unsigned
98
+ BC6H as linear `Float32Array` RGBA without clamping HDR values. These block
99
+ decoders are implemented in-project with no codec package.
100
+
101
+ ## Related documentation
102
+
103
+ - [Queues, publication, and registration](../reference/queues.md)
104
+ - [Format ownership and fork provenance](provenance.md)
@@ -1,155 +1,173 @@
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.
1
+ # Format ownership and fork provenance
2
+
3
+ Status: Stable
4
+ Scope: `@carbonenginejs/runtime-resource/formats`
5
+ Audience: Users, integrators, and maintainers
6
+ Summary: Records where each format implementation came from, retained snapshots and digests, and what was deliberately not copied.
7
+
8
+ On 2026-07-13, the non-shader runtime format implementations below were copied
9
+ once into `runtime-resource`. Their standalone repositories remain frozen with
10
+ their existing APIs and names; they are not upstreams for the runtime copies.
11
+
12
+ Copied paths were `src/` and the behavioral `test/` corpus. Package publishing
13
+ scripts and CLIs were not copied. Exact donor license and notice files are kept
14
+ under `format-notices/<format>/`.
15
+
16
+ | Legacy package | Source revision/state | Runtime class | Runtime import |
17
+ |---|---|---|---|
18
+ | `format-black` | `9fcaaff9e5f28c90b628d8a10b7c79aff7913a90` | `CjsBlackFormat` | `@carbonenginejs/runtime-resource/formats/black` |
19
+ | `format-cmf` | unborn working-tree snapshot | `CjsCmfFormat` | `@carbonenginejs/runtime-resource/formats/cmf` |
20
+ | `format-dds` | `66fa149cd826e1114ad0be84479f89dee753ed76` | `CjsDdsFormat` | `@carbonenginejs/runtime-resource/formats/dds` |
21
+ | `format-fbx` | `8d0fcc2fe44c8096b35e360a903bff30b49eb592` | `CjsFbxFormat` | `@carbonenginejs/runtime-resource/formats/fbx` |
22
+ | `format-flac` | unborn working-tree snapshot | `CjsFlacFormat` | `@carbonenginejs/runtime-resource/formats/flac` |
23
+ | `format-gif` | `5d831c5c0533a9579682f776274574289a520899` | `CjsGifFormat` | `@carbonenginejs/runtime-resource/formats/gif` |
24
+ | `format-gltf` | `d0dadf920828bceec987c2a5fa1f161f81db28aa` | `CjsGltfFormat` | `@carbonenginejs/runtime-resource/formats/gltf` |
25
+ | `format-jpeg` | `bed2253ea979bba27812420fa897987d82a91793` | `CjsJpegFormat` | `@carbonenginejs/runtime-resource/formats/jpeg` |
26
+ | `format-mp3` | unborn working-tree snapshot | `CjsMp3Format` | `@carbonenginejs/runtime-resource/formats/mp3` |
27
+ | `format-mp4` | `cffc5a57b115a99ed9e0947a6b9d3390ffc3581c` | `CjsMp4Format` | `@carbonenginejs/runtime-resource/formats/mp4` |
28
+ | `format-obj` | `e5d3f9a1520c7855bd5b6edc1e2304a7b4e18176` | `CjsObjFormat` | `@carbonenginejs/runtime-resource/formats/obj` |
29
+ | `format-ogg` | unborn working-tree snapshot | `CjsOggFormat` | `@carbonenginejs/runtime-resource/formats/ogg` |
30
+ | `format-png` | `04dbb7c0f289043c3c32d9141ec3ef74aeeb1c43` | `CjsPngFormat` | `@carbonenginejs/runtime-resource/formats/png` |
31
+ | `format-red` | `98beab6988111418d6e09827b92d27e08da4c05b` | `CjsRedFormat` | `@carbonenginejs/runtime-resource/formats/red` |
32
+ | `format-stl` | `4858f9a37bf140a3c544fa30a13a6fcce015247b` | `CjsStlFormat` | `@carbonenginejs/runtime-resource/formats/stl` |
33
+ | `format-tga` | `b0f9df263727057537b2279322e8cd088f366179` | `CjsTgaFormat` | `@carbonenginejs/runtime-resource/formats/tga` |
34
+ | `format-wav` | unborn working-tree snapshot | `CjsWavFormat` | `@carbonenginejs/runtime-resource/formats/wav` |
35
+ | `format-webm` | `459203ac293d0d53fff0e43494b7e47d8d4c92bd` | `CjsWebmFormat` | `@carbonenginejs/runtime-resource/formats/webm` |
36
+ | `format-webp` | `19155e9cc7ae05845c23a3c259d3a586569eba40` | `CjsWebpFormat` | `@carbonenginejs/runtime-resource/formats/webp` |
37
+ | `format-yaml` | `3d7e1d1cf9b7a936283d6050efe43a0a9fadb6a4` | `CjsYamlFormat` | `@carbonenginejs/runtime-resource/formats/yaml` |
38
+
39
+ The unborn donors had no commit-addressable `HEAD`; this document deliberately
40
+ records them as working-tree snapshots rather than inventing a revision. Their
41
+ copied runtime files are the deterministic retained snapshot.
42
+
43
+ On 2026-07-24, following `format-gr2`'s MIT relicense (its EUPL-derived
44
+ BitKnit decoder was replaced by a clean-room implementation written from the
45
+ published specification in that package's `docs/formats/bitknit2.md`), the
46
+ GR2/GSF reader joined the runtime copies:
47
+
48
+ | Legacy package | Source revision/state | Runtime class | Runtime import |
49
+ |---|---|---|---|
50
+ | `format-gr2` | `fa64607de7a3a96ed3b1aec5288bf71057642043` (v0.2.0, MIT) | `CjsGr2Format` | `@carbonenginejs/runtime-resource/formats/gr2` |
51
+
52
+ The copied engine keeps its donor class name (`CjsFormatGr2`, re-exported)
53
+ under `formats/gr2/core/`; `CjsGr2Format` is the runtime-authored contract
54
+ wrapper. Donor license and notice files are kept under
55
+ `format-notices/gr2/`.
56
+
57
+ ## Black definition snapshot
58
+
59
+ The Black reader uses the package-owned generated definition snapshot at
60
+ `src/formats/black/core/black-schema-v1-2026-07-11.json`. The Red format exposes
61
+ the same catalog for discovery, but its YAML reader currently accepts named
62
+ fields without registry enforcement. The snapshot was copied from
63
+ `format-carbon` revision `d2a3c67cf3d46e8ba78ca19e66558d868178ec24`
64
+ with SHA-256
65
+ `008ECB29E670EFC678B471A6EFF099600A29C2907912FC42B854995904604691`.
66
+
67
+ This retained generated artifact keeps the published readers deterministic and
68
+ browser-safe without a runtime dependency on a sibling checkout or an
69
+ unpublished `format-carbon` export. `format-carbon` remains the build-time
70
+ authority for future schema regeneration; an updated snapshot must record its
71
+ new source revision and digest here.
72
+
73
+ ## Native additions
74
+
75
+ Formats below were authored directly in `runtime-resource` and have no legacy
76
+ donor package. Their `format-notices/<format>/` entries record third-party
77
+ format attribution rather than fork provenance.
78
+
79
+ | Format | Runtime class | Runtime import | Notes |
80
+ |---|---|---|---|
81
+ | 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). |
82
+ | 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). |
83
+
84
+ ## Post-fork additions inside copied formats
85
+
86
+ - `formats/dds` gained original, dependency-free **BC6H and BC7 CPU decoders**
87
+ in `runtime-resource` 0.8.0 (2026-07-21). BC6H covers all fourteen modes,
88
+ signed and unsigned HDR, transformed endpoints, partition/anchor fixups,
89
+ interpolation, reserved opaque-black modes, and float RGBA output. BC7 covers
90
+ all eight modes,
91
+ two- and three-subset partitions, anchor fixups, P-bits, dual index streams,
92
+ channel rotation, edge blocks, and the reserved transparent mode. Fixed bit
93
+ layouts and tables follow the Khronos Data Format Specification and Microsoft
94
+ BC6H/BC7 documentation. Tests cover every mode and signed/unsigned fixtures;
95
+ BC7 was also checked against randomized valid-mode blocks and both decoders
96
+ were exercised on real EVE textures acquired through `tools-core`.
97
+ - `formats/stl` received a writer hardening pass (2026-07-18) without changing
98
+ its donor origin: binary provenance headers now round-trip the caller's solid
99
+ name, shared triangle indices are validated as in-range safe integers, scaled
100
+ coordinates must remain finite, and binary coordinates must fit float32
101
+ instead of silently becoming infinities. Writer JSDoc and ASCII/binary
102
+ round-trip/error coverage were expanded in the runtime-owned copy.
103
+ - `formats/cmf` gained a **binary CMF v1 writer** (2026-07-15,
104
+ `src/formats/cmf/core/writer.js`, `CjsCmfFormat.write`/`writeAsync` and
105
+ `Write`/`WriteAsync`): original code implementing CarbonEngine's
106
+ `cmf::BuildFile` behavior tagged self-relative span flattening with leaf
107
+ chunk dedup, BufferView→section remapping in first-encounter order,
108
+ meshoptimizer vertex/index compression (index compression canonicalizes
109
+ triangle rotation, matching the engine's own writer test expectations), and
110
+ the post-crc32 file checksum. Verified by write→read roundtrips against the
111
+ runtime reader; CarbonEngine's `mesh` CMF sources were the behavioral
112
+ reference, no code copied. `writeShared`/`writeSharedAsync` plus
113
+ `core/pack.js` (channel interleaving, index packing, unique buffer-index
114
+ assignment) serialize shared geometry directly, enabling GR2/OBJ/glTF→CMF
115
+ verified against real EVE `.gr2` models fetched via
116
+ `@carbonenginejs/tool-index` (positions exact, triangles equivalent).
117
+ - `formats/cmf` also gained the **GR2 skeleton/animation converter**
118
+ (2026-07-15, `src/formats/cmf/core/gr2Anim.js`, applied automatically by
119
+ `writeShared`): GR2-shaped skeletons (root list or `models[].skeleton`)
120
+ convert to CMF bones/parents/rest transforms with inverse binds rebuilt
121
+ from the rest hierarchy; decoded Granny curves convert to CMF Step/Linear
122
+ channels degree ≤ 1 exactly, degree 2 via adaptive de Boor resampling
123
+ with discontinuities snapped to one float32 ULP. Consumes only decoded
124
+ `{knots, controls}` data so the MIT runtime stays independent of the GR2
125
+ package. Validated on EVE ships (cde3_t3, gde3_t3, cfaux1_t1, mfaux1_t1:
126
+ 3,377 channels ≤ 8.3e-4 positional / ≤ 0.14° rotational vs the GR2 runtime
127
+ sampler; 9 Granny curve formats) and characters (basicfemale: 132-bone
128
+ skeleton, exact skin weights).
129
+ - `formats/ogg` gained a pure-JS **Ogg Vorbis PCM decoder** (2026-07-15,
130
+ `src/formats/ogg/core/{vorbis.js,imdct.js}`, `emit: "pcm"`/`"audio"`):
131
+ original code implementing the Vorbis I specification (floor 1, residues
132
+ 0/1/2, square-polar coupling, FFT-based IMDCT, windowed overlap-add).
133
+ stb_vorbis (public domain) was consulted as a behavioral reference and is
134
+ the source of the spec's floor1 `inverse_db_table` constants; no licensed
135
+ code was copied. Validated bit-comparable to ffmpeg (max diff ~3e-8) and
136
+ vgmstream (±1 int16 LSB) across the EVE Vorbis corpus.
137
+
138
+ ## Wem packed-codebook snapshot
139
+
140
+ The wem Ogg repacker ships a package-owned copy of the aoTuV 6.03 packed
141
+ Vorbis codebook library at
142
+ `src/formats/wem/core/packedCodebooksAotuv603.js` (base64 module). It was
143
+ copied byte-identically from `packed_codebooks_aoTuV_603.bin` in the ww2ogg
144
+ distribution (`github.com/hcs64/ww2ogg`), 74,387 bytes, SHA-256
145
+ `00a93eab267d281401b1efd54e888a2e183299b9e6c446c48d09f701a89d9d27`, retrieved
146
+ 2026-07-15. The data is BSD-licensed (Xiph.org Foundation, Adam Gashlin);
147
+ attribution and the full license terms are recorded in
148
+ `format-notices/wem/NOTICE` and `format-notices/wem/LICENSE`. An updated
149
+ snapshot must record its new source and digest here.
150
+
151
+ ## Deliberately not copied
152
+
153
+ - `format-gr2` migrated into `formats/gr2` on 2026-07-24 (see the dated
154
+ table above) after its EUPL constraint was resolved; its standalone
155
+ repository is now a frozen legacy distribution like the other donors.
156
+ - `format-carbon` remains the schema emitter/generator and build-time schema
157
+ authority. Black consumes its published definitions; Red exposes the copied
158
+ catalog but does not yet enforce it while reading YAML fields.
159
+ - `format-dxbc`, `format-hlsl`, `format-webgl`, and `format-webgpu` are active
160
+ shader work and were not copied, annotated, or otherwise modified by this
161
+ migration.
162
+
163
+ ## Typed-array ownership adjustments
164
+
165
+ The runtime copies preserve caller byte objects by reference. During the fork,
166
+ three avoidable source-buffer copies were changed to views:
167
+
168
+ - CMF compressed sections use `Uint8Array.subarray`.
169
+ - glTF GLB chunks use `Uint8Array.subarray`.
170
+ - FBX raw binary property payloads use `Uint8Array.subarray`.
171
+
172
+ Decoder output buffers and GIF per-frame snapshots still allocate because those
173
+ values have independent semantic identity.
@@ -0,0 +1,37 @@
1
+ # STL export
2
+
3
+ Status: Evolving
4
+ Scope: `@carbonenginejs/runtime-resource/formats/stl`
5
+ Audience: Users and integrators
6
+ Summary: Defines the STL writer contract for shared geometry, including validation and watertight checking.
7
+
8
+ ## Contract
9
+
10
+ `CjsStlFormat` writes shared geometry directly to binary or ASCII STL. The
11
+ writer consumes `mesh.vertex.position` and triangular `mesh.indices[].faces`;
12
+ multiple meshes and index groups are flattened in encounter order because STL
13
+ does not carry portable scene, material, skin, or animation structure.
14
+
15
+ ```js
16
+ import { CjsStlFormat } from "@carbonenginejs/runtime-resource/formats/stl";
17
+
18
+ const bytes = CjsStlFormat.write(sharedGeometry, {
19
+ binary: true,
20
+ solidName: "ship_hull",
21
+ scale: 1000,
22
+ requireWatertight: true
23
+ });
24
+ ```
25
+
26
+ Writes do not mutate the shared input. Facet normals are recalculated from
27
+ winding by default; set `recalculateNormals: false` to average valid vertex
28
+ normals. Degenerate triangles are skipped by default. Index values must be
29
+ safe integers within the position channel, and binary output rejects
30
+ coordinates outside float32 range instead of silently emitting infinities.
31
+ The `requireWatertight` option rejects open, non-manifold, inconsistently
32
+ wound, or degenerate output.
33
+
34
+ ## Related documentation
35
+
36
+ - [Format subpaths](README.md)
37
+ - [Format ownership and fork provenance](provenance.md)
@@ -0,0 +1,44 @@
1
+ # Wwise soundbanks and media
2
+
3
+ Status: Evolving
4
+ Scope: `@carbonenginejs/runtime-resource/formats/bnk`, `@carbonenginejs/runtime-resource/formats/wem`
5
+ Audience: Users and integrators
6
+ Summary: Defines the Wwise container inspection, event/media graph extraction, and WEM conversion contracts.
7
+
8
+ ## Scope
9
+
10
+ `formats/bnk` and `formats/wem` cover Wwise container inspection, event/media
11
+ graph extraction, embedded-member access, and the currently supported WEM
12
+ conversion routes. They do not own AudioBuffer construction, playback, audio
13
+ manager behavior, or decoded-backend retention.
14
+
15
+ ## Soundbank inspection
16
+
17
+ `CjsBnkFormat.inspect()` decodes the chunk map, embedded media index, bank
18
+ names, and the HIRC listing with version-stable typed fields (event action
19
+ lists, action type/target, sound and music-track source ids; pinned against
20
+ bank generator version 150). The Wwise-domain toolkit is grouped under the
21
+ `CjsBnkFormat.wwise` static: the SoundbanksInfo catalog helpers, the FNV-1
22
+ id hash, and event to media resolution:
23
+
24
+ ```js
25
+ import { CjsBnkFormat } from "@carbonenginejs/runtime-resource/formats/bnk";
26
+ import { CjsWemFormat } from "@carbonenginejs/runtime-resource/formats/wem";
27
+
28
+ const inspections = bankByteArrays.map(bytes => CjsBnkFormat.inspect(bytes));
29
+ const { eventMedia } = CjsBnkFormat.wwise.eventMediaFromBanks(inspections);
30
+ // eventMedia: Map<eventObjectId, Set<wemId>> - banks may split events from
31
+ // their target sounds, so pass every related bank to one call.
32
+
33
+ const ogg = CjsWemFormat.toOgg(wemBytes); // Wwise Vorbis -> Ogg (lossless)
34
+ const pcm = CjsWemFormat.toPcm(wemBytes); // PTADPCM / 16-bit PCM -> float32
35
+ ```
36
+
37
+ The read/inspect path stays a pure container reader;
38
+ `wwise.eventMediaFromBanks` is graph interpretation offered for consumers
39
+ with their own engines — the resource lifecycle never calls it.
40
+
41
+ ## Related documentation
42
+
43
+ - [Format subpaths](README.md)
44
+ - [Format ownership and fork provenance](provenance.md)