@carbonenginejs/runtime-resource 0.8.0 → 0.9.1

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 (297) hide show
  1. package/LICENSE +21 -21
  2. package/NOTICE +31 -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 +68 -59
  9. package/dist/CjsResourceSource.js.map +1 -1
  10. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  11. package/dist/format/CjsBlueReader.js +269 -269
  12. package/dist/format/CjsFormat.js +197 -192
  13. package/dist/format/CjsFormat.js.map +1 -1
  14. package/dist/format/CjsReader.js +18 -18
  15. package/dist/format/CjsResourceProbe.js +277 -277
  16. package/dist/format/payloadContract.js +173 -173
  17. package/dist/formats/black/CjsBlackFormat.js +278 -278
  18. package/dist/formats/black/core/CjsBlackBinaryReader.js +157 -153
  19. package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -1
  20. package/dist/formats/black/core/CjsBlackPropertyReaders.js +387 -382
  21. package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -1
  22. package/dist/formats/black/core/CjsBlackReader.js +639 -639
  23. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +437 -433
  24. package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -1
  25. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -0
  26. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js.map +1 -0
  27. package/dist/formats/black/core/blackConstants.js +7 -7
  28. package/dist/formats/black/core/blackDefinitions.js +10 -10
  29. package/dist/formats/black/core/blackDefinitions.js.map +1 -1
  30. package/dist/formats/black/core/blackEnums.js +6 -6
  31. package/dist/formats/black/core/blackSchema.js +3 -3
  32. package/dist/formats/black/core/blackVersion.js +22 -22
  33. package/dist/formats/black/core/helpers.js +182 -182
  34. package/dist/formats/black/core/schema.js +4 -4
  35. package/dist/formats/black/index.js +2 -2
  36. package/dist/formats/bnk/CjsBnkFormat.js +125 -125
  37. package/dist/formats/bnk/core/graph.js +140 -140
  38. package/dist/formats/bnk/core/helpers.js +409 -409
  39. package/dist/formats/bnk/core/musicNodes.js +493 -489
  40. package/dist/formats/bnk/core/musicNodes.js.map +1 -1
  41. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  42. package/dist/formats/bnk/index.js +2 -2
  43. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  44. package/dist/formats/cmf/core/binary.js +123 -118
  45. package/dist/formats/cmf/core/binary.js.map +1 -1
  46. package/dist/formats/cmf/core/buffers.js +233 -233
  47. package/dist/formats/cmf/core/constants.js +47 -47
  48. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  49. package/dist/formats/cmf/core/helpers.js +287 -287
  50. package/dist/formats/cmf/core/pack.js +276 -276
  51. package/dist/formats/cmf/core/schema.js +364 -364
  52. package/dist/formats/cmf/core/shared.js +268 -268
  53. package/dist/formats/cmf/core/writer.js +517 -517
  54. package/dist/formats/cmf/index.js +2 -2
  55. package/dist/formats/dds/CjsDdsFormat.js +200 -193
  56. package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
  57. package/dist/formats/dds/core/bc6h.js +288 -288
  58. package/dist/formats/dds/core/bc7.js +256 -251
  59. package/dist/formats/dds/core/bc7.js.map +1 -1
  60. package/dist/formats/dds/core/helpers.js +815 -815
  61. package/dist/formats/dds/index.js +2 -2
  62. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  63. package/dist/formats/fbx/core/helpers.js +3911 -3901
  64. package/dist/formats/fbx/core/helpers.js.map +1 -1
  65. package/dist/formats/fbx/index.js +2 -2
  66. package/dist/formats/flac/CjsFlacFormat.js +93 -87
  67. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  68. package/dist/formats/flac/core/helpers.js +295 -295
  69. package/dist/formats/flac/index.js +2 -2
  70. package/dist/formats/gif/CjsGifFormat.js +92 -87
  71. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  72. package/dist/formats/gif/core/helpers.js +360 -360
  73. package/dist/formats/gif/index.js +2 -2
  74. package/dist/formats/gltf/CjsGltfFormat.js +290 -290
  75. package/dist/formats/gltf/core/helpers.js +292 -292
  76. package/dist/formats/gltf/core/json.js +79 -79
  77. package/dist/formats/gltf/core/parser.js +666 -666
  78. package/dist/formats/gltf/core/targets.js +163 -163
  79. package/dist/formats/gltf/index.js +2 -2
  80. package/dist/formats/gr2/CjsGr2Format.js +46 -0
  81. package/dist/formats/gr2/CjsGr2Format.js.map +1 -0
  82. package/dist/formats/gr2/core/CjsFormatGr2.js +273 -0
  83. package/dist/formats/gr2/core/CjsFormatGr2.js.map +1 -0
  84. package/dist/formats/gr2/core/bitknit2.js +280 -0
  85. package/dist/formats/gr2/core/bitknit2.js.map +1 -0
  86. package/dist/formats/gr2/core/curves.js +1047 -0
  87. package/dist/formats/gr2/core/curves.js.map +1 -0
  88. package/dist/formats/gr2/core/gsf.js +72 -0
  89. package/dist/formats/gr2/core/gsf.js.map +1 -0
  90. package/dist/formats/gr2/core/helpers.js +332 -0
  91. package/dist/formats/gr2/core/helpers.js.map +1 -0
  92. package/dist/formats/gr2/core/json.js +622 -0
  93. package/dist/formats/gr2/core/json.js.map +1 -0
  94. package/dist/formats/gr2/core/oodle1.js +388 -0
  95. package/dist/formats/gr2/core/oodle1.js.map +1 -0
  96. package/dist/formats/gr2/core/reader.js +617 -0
  97. package/dist/formats/gr2/core/reader.js.map +1 -0
  98. package/dist/formats/gr2/core/tangents.js +48 -0
  99. package/dist/formats/gr2/core/tangents.js.map +1 -0
  100. package/dist/formats/gr2/core/targets.js +351 -0
  101. package/dist/formats/gr2/core/targets.js.map +1 -0
  102. package/dist/formats/gr2/index.js +3 -0
  103. package/dist/formats/gr2/index.js.map +1 -0
  104. package/dist/formats/index.js +30 -23
  105. package/dist/formats/index.js.map +1 -1
  106. package/dist/formats/jpeg/CjsJpegFormat.js +212 -206
  107. package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
  108. package/dist/formats/jpeg/core/helpers.js +350 -350
  109. package/dist/formats/jpeg/core/jpeg.js +387 -377
  110. package/dist/formats/jpeg/core/jpeg.js.map +1 -1
  111. package/dist/formats/jpeg/index.js +2 -2
  112. package/dist/formats/mp3/CjsMp3Format.js +197 -192
  113. package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
  114. package/dist/formats/mp3/core/helpers.js +338 -338
  115. package/dist/formats/mp3/index.js +2 -2
  116. package/dist/formats/mp4/CjsMp4Format.js +197 -191
  117. package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
  118. package/dist/formats/mp4/core/helpers.js +449 -449
  119. package/dist/formats/mp4/index.js +2 -2
  120. package/dist/formats/obj/CjsObjFormat.js +253 -253
  121. package/dist/formats/obj/core/helpers.js +573 -573
  122. package/dist/formats/obj/core/json.js +64 -64
  123. package/dist/formats/obj/core/parser.js +321 -321
  124. package/dist/formats/obj/index.js +2 -2
  125. package/dist/formats/ogg/CjsOggFormat.js +94 -88
  126. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  127. package/dist/formats/ogg/core/helpers.js +387 -387
  128. package/dist/formats/ogg/core/imdct.js +178 -178
  129. package/dist/formats/ogg/core/vorbis.js +1004 -999
  130. package/dist/formats/ogg/core/vorbis.js.map +1 -1
  131. package/dist/formats/ogg/index.js +2 -2
  132. package/dist/formats/png/CjsPngFormat.js +201 -195
  133. package/dist/formats/png/CjsPngFormat.js.map +1 -1
  134. package/dist/formats/png/core/helpers.js +583 -583
  135. package/dist/formats/png/index.js +2 -2
  136. package/dist/formats/red/CjsRedFormat.js +261 -261
  137. package/dist/formats/red/core/CjsRedReader.js +194 -194
  138. package/dist/formats/red/core/blackDefinitions.js +3 -3
  139. package/dist/formats/red/core/helpers.js +139 -139
  140. package/dist/formats/red/core/redGraph.js +68 -68
  141. package/dist/formats/red/core/schema.js +4 -4
  142. package/dist/formats/red/index.js +2 -2
  143. package/dist/formats/stl/CjsStlFormat.js +365 -365
  144. package/dist/formats/stl/core/helpers.js +261 -261
  145. package/dist/formats/stl/core/json.js +51 -51
  146. package/dist/formats/stl/core/stl.js +634 -629
  147. package/dist/formats/stl/core/stl.js.map +1 -1
  148. package/dist/formats/stl/core/targets.js +163 -163
  149. package/dist/formats/stl/index.js +2 -2
  150. package/dist/formats/tga/CjsTgaFormat.js +197 -192
  151. package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
  152. package/dist/formats/tga/core/helpers.js +446 -446
  153. package/dist/formats/tga/index.js +2 -2
  154. package/dist/formats/wav/CjsWavFormat.js +198 -192
  155. package/dist/formats/wav/CjsWavFormat.js.map +1 -1
  156. package/dist/formats/wav/core/helpers.js +328 -328
  157. package/dist/formats/wav/index.js +2 -2
  158. package/dist/formats/webm/CjsWebmFormat.js +197 -191
  159. package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
  160. package/dist/formats/webm/core/helpers.js +537 -537
  161. package/dist/formats/webm/index.js +2 -2
  162. package/dist/formats/webp/CjsWebpFormat.js +91 -86
  163. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  164. package/dist/formats/webp/core/helpers.js +214 -214
  165. package/dist/formats/webp/index.js +2 -2
  166. package/dist/formats/wem/CjsWemFormat.js +242 -241
  167. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  168. package/dist/formats/wem/core/bitStream.js +259 -259
  169. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  170. package/dist/formats/wem/core/helpers.js +417 -417
  171. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  172. package/dist/formats/wem/core/ptadpcm.js +77 -77
  173. package/dist/formats/wem/core/resolve.js +121 -121
  174. package/dist/formats/wem/core/wemToOgg.js +485 -485
  175. package/dist/formats/wem/index.js +2 -2
  176. package/dist/formats/yaml/CjsYamlFormat.js +89 -83
  177. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  178. package/dist/formats/yaml/core/CjsYamlReader.js +311 -305
  179. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  180. package/dist/formats/yaml/core/helpers.js +160 -160
  181. package/dist/formats/yaml/index.js +2 -2
  182. package/dist/index.js +49 -48
  183. package/dist/index.js.map +1 -1
  184. package/dist/resourcePath.js +18 -18
  185. package/dist/resourceStates.js +9 -9
  186. package/dist/resources/AudioGeometryResData.js +47 -47
  187. package/dist/resources/GStateBindingCallbackData.js +31 -31
  188. package/dist/resources/MeshDecalData.js +37 -37
  189. package/dist/resources/MeshDecalLodData.js +34 -34
  190. package/dist/resources/Tr2EffectRes.js +71 -71
  191. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
  192. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  193. package/dist/resources/Tr2ImageRes.js +114 -114
  194. package/dist/resources/Tr2LightProfileRes.js +40 -40
  195. package/dist/resources/Tr2MaterialArea.js +34 -34
  196. package/dist/resources/Tr2MaterialMesh.js +31 -31
  197. package/dist/resources/Tr2MaterialRes.js +34 -34
  198. package/dist/resources/Tr2ShaderPermutation.js +43 -43
  199. package/dist/resources/Tr2TextureLodManager.js +80 -80
  200. package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
  201. package/dist/resources/Tr2TexturePackChannel.js +37 -37
  202. package/dist/resources/Tr2TexturePipeline.js +52 -52
  203. package/dist/resources/Tr2TexturePipelineParams.js +34 -34
  204. package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
  205. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js +22 -0
  206. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js.map +1 -0
  207. package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
  208. package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
  209. package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
  210. package/dist/resources/TriGeometryRes.js +239 -239
  211. package/dist/resources/TriGeometryResAreaData.js +59 -59
  212. package/dist/resources/TriGeometryResJointData.js +38 -38
  213. package/dist/resources/TriGeometryResLodData.js +88 -88
  214. package/dist/resources/TriGeometryResMeshData.js +63 -63
  215. package/dist/resources/TriGeometryResSkeletonData.js +34 -34
  216. package/dist/resources/TriGrannyRes.js +43 -43
  217. package/dist/resources/TriJointBinding.js +38 -38
  218. package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
  219. package/dist/resources/TriRtGeometryConstants.js +88 -88
  220. package/dist/resources/TriTextureRes.js +304 -304
  221. package/dist/resources/enums.js +18 -18
  222. package/dist/resources/resourceBoundary.js +47 -47
  223. package/dist/resources/texturePipelineBehavior.js +308 -308
  224. package/dist/texture/CjsTextureArrayRes.js +406 -406
  225. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  226. package/docs/README.md +73 -0
  227. package/docs/architecture.md +86 -0
  228. package/docs/concepts/resource-lifecycle.md +217 -0
  229. package/docs/formats/README.md +105 -0
  230. package/docs/formats/gr2.md +161 -0
  231. package/{FORMAT-PROVENANCE.md → docs/formats/provenance.md} +173 -155
  232. package/docs/formats/stl.md +37 -0
  233. package/docs/formats/wwise.md +44 -0
  234. package/docs/reference/classes/README.md +33 -0
  235. package/docs/reference/classes/core.md +106 -0
  236. package/docs/reference/classes/dropped.md +46 -0
  237. package/docs/reference/classes/formats.md +522 -0
  238. package/docs/reference/classes/resources.md +346 -0
  239. package/docs/reference/classes/texture.md +26 -0
  240. package/docs/reference/events.md +92 -0
  241. package/docs/reference/motherlode-cache.md +244 -0
  242. package/docs/reference/queues.md +102 -0
  243. package/docs/reference/reload.md +107 -0
  244. package/docs/reference/texture-arrays.md +113 -0
  245. package/docs/reference/texture-pipeline.md +53 -0
  246. package/docs/roadmap.md +104 -0
  247. package/format-notices/black/LICENSE +21 -21
  248. package/format-notices/black/NOTICE +47 -47
  249. package/format-notices/bnk/LICENSE +21 -21
  250. package/format-notices/bnk/NOTICE +20 -20
  251. package/format-notices/cmf/LICENSE +21 -21
  252. package/format-notices/cmf/NOTICE +36 -36
  253. package/format-notices/dds/LICENSE +21 -21
  254. package/format-notices/dds/NOTICE +14 -14
  255. package/format-notices/fbx/LICENSE +21 -21
  256. package/format-notices/fbx/NOTICE +14 -14
  257. package/format-notices/flac/LICENSE +21 -21
  258. package/format-notices/flac/NOTICE +14 -14
  259. package/format-notices/gif/LICENSE +21 -21
  260. package/format-notices/gif/NOTICE +14 -14
  261. package/format-notices/gltf/LICENSE +21 -21
  262. package/format-notices/gltf/NOTICE +27 -27
  263. package/format-notices/gr2/LICENSE +21 -0
  264. package/format-notices/gr2/NOTICE +60 -0
  265. package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -0
  266. package/format-notices/jpeg/LICENSE +21 -21
  267. package/format-notices/jpeg/NOTICE +14 -14
  268. package/format-notices/mp3/LICENSE +21 -21
  269. package/format-notices/mp3/NOTICE +14 -14
  270. package/format-notices/mp4/LICENSE +21 -21
  271. package/format-notices/mp4/NOTICE +14 -14
  272. package/format-notices/obj/LICENSE +21 -21
  273. package/format-notices/obj/NOTICE +26 -26
  274. package/format-notices/ogg/LICENSE +21 -21
  275. package/format-notices/ogg/NOTICE +28 -28
  276. package/format-notices/png/LICENSE +21 -21
  277. package/format-notices/png/NOTICE +14 -14
  278. package/format-notices/red/LICENSE +21 -21
  279. package/format-notices/red/NOTICE +31 -31
  280. package/format-notices/stl/LICENSE +21 -21
  281. package/format-notices/stl/NOTICE +21 -21
  282. package/format-notices/tga/LICENSE +21 -21
  283. package/format-notices/tga/NOTICE +14 -14
  284. package/format-notices/wav/LICENSE +21 -21
  285. package/format-notices/wav/NOTICE +14 -14
  286. package/format-notices/webm/LICENSE +21 -21
  287. package/format-notices/webm/NOTICE +14 -14
  288. package/format-notices/webp/LICENSE +21 -21
  289. package/format-notices/webp/NOTICE +14 -14
  290. package/format-notices/wem/LICENSE +57 -57
  291. package/format-notices/wem/NOTICE +33 -33
  292. package/format-notices/yaml/LICENSE +21 -21
  293. package/format-notices/yaml/NOTICE +44 -44
  294. package/package.json +52 -51
  295. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +0 -4
  296. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js.map +0 -1
  297. package/resource-lifecycle.md +0 -679
@@ -1,133 +1,133 @@
1
- import { CjsEventEmitter } from '@carbonenginejs/core-types/model';
2
-
3
- /**
4
- * Runtime-only internal texture parameter facade for one array layer.
5
- *
6
- * The proxy mirrors the public texture-parameter path API while delegating
7
- * storage, invalidation, readiness, and adapter ownership to its parent array.
8
- * Engines bridge public parameters into it; it does not replace persisted
9
- * parameter entries or their individual source resources. It deliberately
10
- * carries no shader metadata or backend objects.
11
- */
12
- class CjsTextureParameterProxy extends CjsEventEmitter {
13
- #parent;
14
- #layer;
15
- #name;
16
- constructor(parent, layer, options = {}) {
17
- super();
18
- if (!parent || typeof parent.SetLayerResourcePath !== "function") {
19
- throw new TypeError("CjsTextureParameterProxy requires a CjsTextureArrayRes-compatible parent.");
20
- }
21
- if (!Number.isInteger(layer) || layer < 0) {
22
- throw new RangeError("CjsTextureParameterProxy layer must be a non-negative integer.");
23
- }
24
- this.#parent = parent;
25
- this.#layer = layer;
26
- this.#name = options.name === undefined ? "" : String(options.name);
27
- }
28
- get resourcePath() {
29
- return this.GetResourcePath();
30
- }
31
-
32
- /** The aggregate texture resource used by the shader. */
33
- get textureRes() {
34
- return this.#parent;
35
- }
36
-
37
- /** Compatibility alias for textureRes. */
38
- get res() {
39
- return this.#parent;
40
- }
41
-
42
- /** Compatibility alias used by Carbon-shaped texture parameters. */
43
- get resource() {
44
- return this.#parent;
45
- }
46
- set resourcePath(value) {
47
- this.SetResourcePath(value);
48
- }
49
- get name() {
50
- return this.#name;
51
- }
52
- set name(value) {
53
- this.SetParameterName(value);
54
- }
55
- GetParent() {
56
- return this.#parent;
57
- }
58
- GetLayerIndex() {
59
- return this.#layer;
60
- }
61
- GetParameterName() {
62
- return this.#name;
63
- }
64
- SetParameterName(value) {
65
- const next = value === null || value === undefined ? "" : String(value);
66
- if (next === this.#name) return false;
67
- const previous = this.#name;
68
- this.#name = next;
69
- this.EmitEvent("changed", this, "name", next, previous);
70
- return true;
71
- }
72
- GetResourcePath() {
73
- return this.#parent.GetLayerResourcePath(this.#layer);
74
- }
75
- SetResourcePath(value) {
76
- const previous = this.GetResourcePath();
77
- if (!this.#parent.SetLayerResourcePath(this.#layer, value)) return false;
78
- this.EmitEvent("changed", this, "resourcepath", this.GetResourcePath(), previous);
79
- return true;
80
- }
81
- GetValue() {
82
- return this.GetResourcePath();
83
- }
84
- SetValue(value) {
85
- if (value === undefined) return false;
86
- return this.SetResourcePath(value);
87
- }
88
- EqualsValue(value) {
89
- return String(value ?? "").trim().replace(/\\/gu, "/").replace(/\/+/gu, "/").toLowerCase() === this.GetResourcePath();
90
- }
91
-
92
- /** Return the aggregate texture resource used by the shader binding. */
93
- GetResource() {
94
- return this.#parent;
95
- }
96
-
97
- /** Return the optional resolved source resource for this layer. */
98
- GetSourceResource() {
99
- return this.#parent.GetLayerResource(this.#layer);
100
- }
101
- SetSourceResource(resource) {
102
- const previous = this.GetSourceResource();
103
- if (!this.#parent.SetLayerResource(this.#layer, resource)) return false;
104
- this.EmitEvent("changed", this, "sourceresource", this.GetSourceResource(), previous);
105
- return true;
106
- }
107
- SetResource(resource) {
108
- return this.SetSourceResource(resource);
109
- }
110
-
111
- /** Invalidate this layer after an in-place source content revision. */
112
- Touch() {
113
- this.#parent.TouchLayer(this.#layer);
114
- this.EmitEvent("changed", this, "sourcerevision", this.GetSourceResource());
115
- return this;
116
- }
117
- GetResources(out = []) {
118
- if (!out.includes(this.#parent)) out.push(this.#parent);
119
- return out;
120
- }
121
- IsPrepared() {
122
- return this.#parent.IsPrepared();
123
- }
124
- IsGood() {
125
- return this.#parent.IsGood();
126
- }
127
- Ready(options = {}) {
128
- return this.#parent.Ready(options);
129
- }
130
- }
131
-
132
- export { CjsTextureParameterProxy };
133
- //# sourceMappingURL=CjsTextureParameterProxy.js.map
1
+ import { CjsEventEmitter } from '@carbonenginejs/core-types/model';
2
+
3
+ /**
4
+ * Runtime-only internal texture parameter facade for one array layer.
5
+ *
6
+ * The proxy mirrors the public texture-parameter path API while delegating
7
+ * storage, invalidation, readiness, and adapter ownership to its parent array.
8
+ * Engines bridge public parameters into it; it does not replace persisted
9
+ * parameter entries or their individual source resources. It deliberately
10
+ * carries no shader metadata or backend objects.
11
+ */
12
+ class CjsTextureParameterProxy extends CjsEventEmitter {
13
+ #parent;
14
+ #layer;
15
+ #name;
16
+ constructor(parent, layer, options = {}) {
17
+ super();
18
+ if (!parent || typeof parent.SetLayerResourcePath !== "function") {
19
+ throw new TypeError("CjsTextureParameterProxy requires a CjsTextureArrayRes-compatible parent.");
20
+ }
21
+ if (!Number.isInteger(layer) || layer < 0) {
22
+ throw new RangeError("CjsTextureParameterProxy layer must be a non-negative integer.");
23
+ }
24
+ this.#parent = parent;
25
+ this.#layer = layer;
26
+ this.#name = options.name === undefined ? "" : String(options.name);
27
+ }
28
+ get resourcePath() {
29
+ return this.GetResourcePath();
30
+ }
31
+
32
+ /** The aggregate texture resource used by the shader. */
33
+ get textureRes() {
34
+ return this.#parent;
35
+ }
36
+
37
+ /** Compatibility alias for textureRes. */
38
+ get res() {
39
+ return this.#parent;
40
+ }
41
+
42
+ /** Compatibility alias used by Carbon-shaped texture parameters. */
43
+ get resource() {
44
+ return this.#parent;
45
+ }
46
+ set resourcePath(value) {
47
+ this.SetResourcePath(value);
48
+ }
49
+ get name() {
50
+ return this.#name;
51
+ }
52
+ set name(value) {
53
+ this.SetParameterName(value);
54
+ }
55
+ GetParent() {
56
+ return this.#parent;
57
+ }
58
+ GetLayerIndex() {
59
+ return this.#layer;
60
+ }
61
+ GetParameterName() {
62
+ return this.#name;
63
+ }
64
+ SetParameterName(value) {
65
+ const next = value === null || value === undefined ? "" : String(value);
66
+ if (next === this.#name) return false;
67
+ const previous = this.#name;
68
+ this.#name = next;
69
+ this.EmitEvent("changed", this, "name", next, previous);
70
+ return true;
71
+ }
72
+ GetResourcePath() {
73
+ return this.#parent.GetLayerResourcePath(this.#layer);
74
+ }
75
+ SetResourcePath(value) {
76
+ const previous = this.GetResourcePath();
77
+ if (!this.#parent.SetLayerResourcePath(this.#layer, value)) return false;
78
+ this.EmitEvent("changed", this, "resourcepath", this.GetResourcePath(), previous);
79
+ return true;
80
+ }
81
+ GetValue() {
82
+ return this.GetResourcePath();
83
+ }
84
+ SetValue(value) {
85
+ if (value === undefined) return false;
86
+ return this.SetResourcePath(value);
87
+ }
88
+ EqualsValue(value) {
89
+ return String(value ?? "").trim().replace(/\\/gu, "/").replace(/\/+/gu, "/").toLowerCase() === this.GetResourcePath();
90
+ }
91
+
92
+ /** Return the aggregate texture resource used by the shader binding. */
93
+ GetResource() {
94
+ return this.#parent;
95
+ }
96
+
97
+ /** Return the optional resolved source resource for this layer. */
98
+ GetSourceResource() {
99
+ return this.#parent.GetLayerResource(this.#layer);
100
+ }
101
+ SetSourceResource(resource) {
102
+ const previous = this.GetSourceResource();
103
+ if (!this.#parent.SetLayerResource(this.#layer, resource)) return false;
104
+ this.EmitEvent("changed", this, "sourceresource", this.GetSourceResource(), previous);
105
+ return true;
106
+ }
107
+ SetResource(resource) {
108
+ return this.SetSourceResource(resource);
109
+ }
110
+
111
+ /** Invalidate this layer after an in-place source content revision. */
112
+ Touch() {
113
+ this.#parent.TouchLayer(this.#layer);
114
+ this.EmitEvent("changed", this, "sourcerevision", this.GetSourceResource());
115
+ return this;
116
+ }
117
+ GetResources(out = []) {
118
+ if (!out.includes(this.#parent)) out.push(this.#parent);
119
+ return out;
120
+ }
121
+ IsPrepared() {
122
+ return this.#parent.IsPrepared();
123
+ }
124
+ IsGood() {
125
+ return this.#parent.IsGood();
126
+ }
127
+ Ready(options = {}) {
128
+ return this.#parent.Ready(options);
129
+ }
130
+ }
131
+
132
+ export { CjsTextureParameterProxy };
133
+ //# sourceMappingURL=CjsTextureParameterProxy.js.map
package/docs/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # Package documentation
2
+
3
+ Status: Evolving
4
+ Scope: `@carbonenginejs/runtime-resource`
5
+ Audience: Users and integrators
6
+ Summary: Documentation home for the GPU-free resource lifecycle, cache, format, and object-loading package.
7
+
8
+ ## Purpose
9
+
10
+ `@carbonenginejs/runtime-resource` owns the GPU-free resource layer of
11
+ CarbonEngineJS: resource identity and state, the MotherLode cache, semantic
12
+ resource classes, registered format readers, source adapters, and the queued
13
+ CPU load/publication pipeline. It stops at a published CPU payload; engine
14
+ packages realize that payload into backend objects.
15
+
16
+ ## Use this package when
17
+
18
+ - you need Carbon-shaped resource loading (`res:/` paths, requirement/emit
19
+ selection, `Ready()`/`GetObject()`) without choosing a GPU backend;
20
+ - you need one of the non-shader format readers as a tree-shakeable subpath
21
+ (`@carbonenginejs/runtime-resource/formats/<name>`);
22
+ - you are writing an engine adapter that consumes published CPU payloads and
23
+ needs the documented retention, reload, and texture-array contracts.
24
+
25
+ ## Where it fits
26
+
27
+ - Foundations consumed: `@carbonenginejs/core-types` (event emitter, model
28
+ contracts) and `@carbonenginejs/core-math` where formats need math values.
29
+ - Normal consumers: `runtime-core` (configures and exposes a `CjsResMan`),
30
+ `runtime-trinity` and `runtime-sof` (request GPU-free objects), and engine
31
+ packages (`engine-webgpu`, future WebGL engines) that realize prepared
32
+ resources.
33
+ - Owned responsibility: resource identity, cache, CPU payload lifecycle,
34
+ format selection and conversion, and load/publication queues.
35
+ - Owned elsewhere: WebGL/WebGPU realization, device budgets, and device-loss
36
+ recovery belong to engine packages; shader formats belong to the dedicated
37
+ shader format packages.
38
+
39
+ ## Start here
40
+
41
+ - [Architecture and boundaries](architecture.md)
42
+ - [Resource lifecycle concepts](concepts/resource-lifecycle.md)
43
+ - [Format subpaths](formats/README.md)
44
+
45
+ ## Documentation map
46
+
47
+ - [architecture.md](architecture.md): package boundary, relationships, and the
48
+ GPU-free split.
49
+ - [concepts/resource-lifecycle.md](concepts/resource-lifecycle.md): states,
50
+ the load/prepare split, and the request workflow.
51
+ - [reference/motherlode-cache.md](reference/motherlode-cache.md): canonical
52
+ identity, byte-budget cache, payload retention, and purge contracts.
53
+ - [reference/reload.md](reference/reload.md): the candidate-first atomic
54
+ reload contract.
55
+ - [reference/queues.md](reference/queues.md): queued CPU load, publication,
56
+ registration, and the `Wait()` fence.
57
+ - [reference/texture-arrays.md](reference/texture-arrays.md): texture-array
58
+ proxies, update generations, and adapter commits.
59
+ - [reference/texture-pipeline.md](reference/texture-pipeline.md):
60
+ `Tr2TexturePipeline` CPU steps and `Tr2TextureLodManager` membership.
61
+ - [reference/events.md](reference/events.md): the `CjsEventEmitter` contract
62
+ and event memory rules.
63
+ - [reference/classes/README.md](reference/classes/README.md): the searchable
64
+ one-sentence class-purpose catalog.
65
+ - [formats/README.md](formats/README.md): format import map and per-format
66
+ output notes.
67
+ - [formats/gr2.md](formats/gr2.md): Granny GR2/GSF reading, output modes,
68
+ conversions, graph shape, and class hydration.
69
+ - [formats/wwise.md](formats/wwise.md): Wwise soundbank and media readers.
70
+ - [formats/stl.md](formats/stl.md): STL geometry export.
71
+ - [formats/provenance.md](formats/provenance.md): format ownership, fork
72
+ provenance, and retained snapshots.
73
+ - [roadmap.md](roadmap.md): approved future direction that is not implemented.
@@ -0,0 +1,86 @@
1
+ # Architecture and boundaries
2
+
3
+ Status: Evolving
4
+ Scope: `@carbonenginejs/runtime-resource`
5
+ Audience: Users and integrators
6
+ Summary: Defines the GPU-free boundary this package owns and how engine and runtime packages relate to it.
7
+
8
+ ## The GPU-free split
9
+
10
+ `runtime-resource` owns the GPU-free half of the Carbon resource lifecycle:
11
+
12
+ ```text
13
+ EMPTY -> REQUESTED/LOADING -> LOADED
14
+ ```
15
+
16
+ Engine adapters own device realization:
17
+
18
+ ```text
19
+ LOADED -> PREPARING -> PREPARED
20
+ ```
21
+
22
+ The package selects and runs registered non-shader readers, hydrates or
23
+ returns the promised CPU outcome, and stores lifecycle state, cache entries,
24
+ and loaded payloads. It never creates WebGL/WebGPU textures, buffers, shader
25
+ modules, pipelines, or bind groups, and it never inspects backend capability.
26
+ A realization failure destroys its candidate and returns the resource to
27
+ `LOADED` without discarding the valid CPU payload.
28
+
29
+ This deliberately differs from Carbon and ccpwgl, whose resource classes live
30
+ inside an engine that can prepare GPU objects directly. Keeping the
31
+ format/resource layer reusable means stopping before GPU work; see
32
+ [resource lifecycle concepts](concepts/resource-lifecycle.md) for the
33
+ historical mapping.
34
+
35
+ ## What the package owns
36
+
37
+ - `CjsResource` state and Carbon-style resource methods.
38
+ - `CjsMotherLode` canonical identity, explicit replacement results, activity
39
+ and lock metadata, deterministic payload/adapter cleanup, and cache stats.
40
+ - `CjsResMan` semantic resource construction, registered-format selection,
41
+ concurrency-limited source loading, staged prepare queues, layered
42
+ source/read/resource deduplication, object loader dispatch, and prefetch.
43
+ - `CjsTextureArrayRes` and `CjsTextureParameterProxy` for material-facing,
44
+ frame-coalesced texture-array inputs.
45
+ - Raw `CjsEventEmitter` (from `core-types/model`) for manager/runtime events
46
+ without requiring `CjsModel` inheritance.
47
+ - Path normalization, extension helpers, and source adapters for memory and
48
+ `fetch`.
49
+ - Plain reader/converter payload objects with focused shared validators.
50
+ - Canonical Carbon resource classes that validate and hold CPU payloads
51
+ privately: `TriTextureRes`, `TriGeometryRes`, `Tr2EffectRes`, `Tr2ImageRes`,
52
+ `TriGrannyRes`, `Tr2GrannyStateRes`, and `Tr2LightProfileRes`.
53
+ - `Tr2TexturePipeline` CPU-only texture steps and `Tr2TextureLodManager`
54
+ membership.
55
+ - Opaque engine-owned subobject slots for backend adapters.
56
+ - Non-shader format implementations as explicit tree-shakeable subpaths under
57
+ `@carbonenginejs/runtime-resource/formats/<name>`.
58
+
59
+ ## What the package does not own
60
+
61
+ - WebGL/WebGPU realization, allocations, upload accounting, device budgets,
62
+ capability limits, and device-loss recovery (engine packages).
63
+ - Shader formats (`format-dxbc`, `format-hlsl`, `format-webgl`,
64
+ `format-webgpu` remain separate packages).
65
+ - AudioBuffer construction, playback, or audio manager behavior.
66
+
67
+ ## Package relationships
68
+
69
+ - `runtime-core` may configure and expose a `CjsResMan`, but does not own its
70
+ implementation.
71
+ - `runtime-trinity` and `runtime-sof` may request GPU-free objects and
72
+ resources without selecting an engine.
73
+ - `engine-webgpu` and future WebGL engines consume loaded resources and own
74
+ all backend allocations, preparation, replacement, and destruction.
75
+
76
+ Concrete formats are not imported or registered by the package root; see
77
+ [formats/README.md](formats/README.md) for the import rule and map.
78
+
79
+ ## Source layout
80
+
81
+ Authoring source is decorated JavaScript; published output is built ESM in
82
+ `npm/dist`. Completed Carbon data classes live with maintained source under
83
+ `src/resources`; `src/generated` is reserved for unresolved active ports and
84
+ is currently absent. Native shapes that JavaScript replaces or does not use
85
+ are retained only under `src/dropped`, with their disposition documented
86
+ there, and are never exported or bundled.
@@ -0,0 +1,217 @@
1
+ # Resource lifecycle
2
+
3
+ Status: Evolving
4
+ Scope: `@carbonenginejs/runtime-resource`
5
+ Audience: Users and integrators
6
+ Summary: Explains resource states, the load/prepare split, and how a resource request flows from path to published CPU payload.
7
+
8
+ ## Carbon and ccpwgl background
9
+
10
+ Carbon's resource model separates load from prepare. The source schemas expose
11
+ resource classes through `BlueAsyncRes`, and Carbon notes distinguish
12
+ background load work from main-thread/device prepare work.
13
+
14
+ ccpwgl makes that split visible in `Tw2Resource`:
15
+
16
+ ```text
17
+ NO_INIT -> REQUESTED -> LOADED -> PREPARED
18
+ ```
19
+
20
+ Additional terminal or cleanup states include `ERROR`, `UNLOADED`, and
21
+ `PURGED`. The important behavior is:
22
+
23
+ - `Tw2ResMan.LoadResource()` requests a resource.
24
+ - The raw fetch resolves.
25
+ - `Tw2Resource.OnLoaded()` marks bytes or source data as loaded.
26
+ - The resource is queued for prepare.
27
+ - The manager tick later calls `res.Prepare(data)`.
28
+ - The concrete resource calls `OnPrepared()` after prepare work succeeds.
29
+
30
+ Some ccpwgl concrete `Prepare()` implementations also create WebGL objects.
31
+ That is a historical engine/runtime coupling, not the boundary CarbonEngineJS
32
+ keeps; see [architecture](../architecture.md).
33
+
34
+ ## CarbonEngineJS states
35
+
36
+ ```text
37
+ EMPTY -> REQUESTED/LOADING -> LOADED (runtime-resource)
38
+ LOADED -> PREPARING -> PREPARED (engine adapters)
39
+ ```
40
+
41
+ - `EMPTY`: resource identity exists, but no payload has been read.
42
+ - `REQUESTED`: the resource is waiting on a queued or shared source load.
43
+ - `LOADING`: source bytes are available and CPU reader/format work is active.
44
+ - `LOADED`: CPU payload or hydrated object graph exists.
45
+ - `PREPARING`: an engine adapter is realizing backend-owned resources.
46
+ - `PREPARED`: preparation completed successfully and the resource is usable.
47
+ - `FAILED`: CPU loading, conversion, validation, or publication failed before
48
+ a valid payload was published.
49
+ - `UNLOADED`: resource payload was released.
50
+ - `PURGED`: an inactivity or recorded-byte cache policy evicted the resource
51
+ from active ownership. Ordinary replacement, `Delete()`, `Clear()`,
52
+ `ClearCached()`, and shutdown clean owned payloads/adapters but preserve the
53
+ detached handle's last valid state.
54
+
55
+ `CjsResMan.LoadObject()` queues one deduplicated background source operation
56
+ per source/path and limits active source operations with
57
+ `maxConcurrentLoads`. After bytes arrive, object construction is split into
58
+ separate main-queue items (`reader/format conversion -> publish`). Publication
59
+ moves the resource to `LOADED`, then stops. ResMan never performs backend
60
+ realization or marks the resource `PREPARED`/`GOOD`. See
61
+ [reference/queues.md](../reference/queues.md) for the queue contract and
62
+ [reference/motherlode-cache.md](../reference/motherlode-cache.md) for
63
+ identity, retention, and release behavior.
64
+
65
+ ## Request workflow
66
+
67
+ The normal direct resource-path flow is:
68
+
69
+ ```text
70
+ Application / runtime object
71
+ |
72
+ | requests "res:/model/ship.gr2"
73
+ | with optional per-request overrides
74
+ v
75
+ +-----------------------------------------------+
76
+ | CjsLibrary |
77
+ | |
78
+ | - starts from registered default behavior |
79
+ | - considers registered capability reports |
80
+ | - chooses requirement / emit / format |
81
+ | - applies explicit request overrides |
82
+ +-----------------------------------------------+
83
+ |
84
+ | path + resolved request options
85
+ v
86
+ +-----------------------------------------------+
87
+ | CjsResMan.GetResource(path, options) |
88
+ | |
89
+ | - normalize source path and extension |
90
+ | - resolve the promised output tag |
91
+ +-----------------------------------------------+
92
+ |
93
+ v
94
+ +-----------------------------------------------+
95
+ | CjsMotherLode.Lookup(resolved key) |
96
+ +-----------------------------------------------+
97
+ |
98
+ +--- cache hit ------------------------------+
99
+ | |
100
+ | reuse the CjsResource and any active |
101
+ | load/build operation |
102
+ | |
103
+ `--- cache miss -----------------------------+
104
+ | |
105
+ | resolve class from requirement |
106
+ | construct + Initialize() |
107
+ | insert into CjsMotherLode |
108
+ v |
109
+ new CjsResource -------------------------------+
110
+ |
111
+ | Ready() / GetObject()
112
+ v
113
+ +===============================================+
114
+ | BACKGROUND LOAD QUEUE |
115
+ | |
116
+ | - mark resource REQUESTED |
117
+ | - share one source operation per source/path |
118
+ | - obey maxConcurrentLoads |
119
+ | - source.Read(path) |
120
+ +===============================================+
121
+ |
122
+ | source bytes
123
+ v
124
+ +===============================================+
125
+ | MAIN PREPARE QUEUE |
126
+ | |
127
+ | every box below is a separately budgeted item |
128
+ +===============================================+
129
+ |
130
+ v
131
+ +-----------------------------------------------+
132
+ | Read stage |
133
+ | |
134
+ | current object loader for extension? |
135
+ | yes -> call it |
136
+ | no -> resolve registered formats by |
137
+ | bytes + request options |
138
+ +-----------------------------------------------+
139
+ |
140
+ | plain payload / hydrated object
141
+ v
142
+ +-----------------------------------------------+
143
+ | Publish stage |
144
+ | |
145
+ | semantic resource -> SetPayload(payload) |
146
+ | generic resource -> SetPayload(value) |
147
+ | object aliases payload |
148
+ +-----------------------------------------------+
149
+ |
150
+ +--- validation failure --------------------+
151
+ | |
152
+ | resource -> FAILED |
153
+ | Ready() rejects |
154
+ | |
155
+ `--- publication succeeds -----------------+
156
+ |
157
+ | resource -> LOADED
158
+ v
159
+ CjsLibrary returns
160
+ the built CjsResource/object
161
+ ```
162
+
163
+ Device realization is a separate continuation selected outside ResMan. It can
164
+ run again after adapter eviction or device loss while the CPU payload remains
165
+ resident:
166
+
167
+ ```text
168
+ CjsResource LOADED
169
+ |
170
+ | selected engine adapter
171
+ v
172
+ PREPARING
173
+ |
174
+ | create candidate -> verify current target -> synchronous attach
175
+ v
176
+ PREPARED
177
+
178
+ failure: destroy candidate -> LOADED (CPU payload retained)
179
+ ```
180
+
181
+ ## Retention model
182
+
183
+ ccpwgl keeps every resource in `Tw2MotherLode` until it is explicitly cleared
184
+ or auto-purged, and its `IsGood()` implicitly calls `KeepAlive()`, so many
185
+ read/check paths keep resources resident. CarbonEngineJS is deliberately more
186
+ explicit:
187
+
188
+ - `IsGood()`, `IsPrepared()`, and `HasLoaded()` remain pure state checks.
189
+ - `KeepAlive()` and `KeepPayloadAlive()` are the explicit liveness operations.
190
+ - `Lock()` / `Unlock()` maintain a non-underflowing count and prevent identity
191
+ and payload eviction during a sweep.
192
+ - MotherLode tracks separate identity and CPU-payload frame/time observations.
193
+ - `CjsMotherLode.PurgeInactive()` scans only when explicitly requested and
194
+ never infers JavaScript reachability. `CjsResMan.Update()` may request it
195
+ only under an explicitly configured automatic policy.
196
+
197
+ The CPU/GPU split adds an axis that ccpwgl blurs: CPU payload memory and
198
+ device memory are different budgets. Retention therefore distinguishes:
199
+
200
+ - resource identity: path, extension, state, error summary, lightweight
201
+ metadata;
202
+ - CPU payload: plain reader/converter objects, hydrated object graphs, decoded
203
+ typed arrays;
204
+ - adapter payload: WebGL/WebGPU textures, buffers, shader modules, pipelines.
205
+
206
+ Identity and lightweight metadata stay resident while CPU payloads and adapter
207
+ payloads release independently. Engine adapters own adapter-resource
208
+ destruction; runtime-resource provides lifecycle hooks and opaque adapter
209
+ slots so cleanup has a consistent place to run. The exact contracts live in
210
+ [reference/motherlode-cache.md](../reference/motherlode-cache.md).
211
+
212
+ ## Related documentation
213
+
214
+ - [Architecture and boundaries](../architecture.md)
215
+ - [MotherLode identity, cache, and retention](../reference/motherlode-cache.md)
216
+ - [Candidate-first atomic reload](../reference/reload.md)
217
+ - [Queues and the Wait fence](../reference/queues.md)