@carbonenginejs/runtime-resource 0.13.0 → 0.14.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 (453) hide show
  1. package/LICENSE +21 -21
  2. package/NOTICE +32 -32
  3. package/README.md +129 -129
  4. package/dist/CjsMotherLode.js +1271 -1271
  5. package/dist/CjsResMan.js +3858 -3858
  6. package/dist/CjsResManFetchProvider.js +94 -94
  7. package/dist/CjsResManWorkQueue.js +301 -301
  8. package/dist/_virtual/_rollupPluginBabelHelpers.js +150 -150
  9. package/dist/format/CjsBlueReader.js +358 -358
  10. package/dist/format/CjsByteReader.js +310 -310
  11. package/dist/format/CjsByteWriter.js +242 -242
  12. package/dist/format/CjsFormat.js +223 -223
  13. package/dist/format/CjsFormatError.js +41 -41
  14. package/dist/format/CjsReader.js +22 -22
  15. package/dist/format/CjsResourceProbe.js +279 -279
  16. package/dist/format/CjsStringTable.js +268 -268
  17. package/dist/format/carbonEffect/CjsCarbonEffectReader.js +265 -265
  18. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -373
  19. package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -182
  20. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +321 -321
  21. package/dist/format/carbonEffect/carbonEffectRecords.js +1147 -1147
  22. package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -197
  23. package/dist/format/compareUtf8.js +36 -36
  24. package/dist/format/effect/effectBodyInventory.js +146 -146
  25. package/dist/format/effect/effectPermutationGraph.js +257 -257
  26. package/dist/format/effect/sha256.js +114 -114
  27. package/dist/format/index.js +11 -11
  28. package/dist/format/payloadContract.js +193 -193
  29. package/dist/formats/black/CjsBlackFormat.js +310 -310
  30. package/dist/formats/black/core/CjsBlackBinaryReader.js +260 -260
  31. package/dist/formats/black/core/CjsBlackPropertyReaders.js +448 -448
  32. package/dist/formats/black/core/CjsBlackReader.js +764 -764
  33. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +540 -540
  34. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -4
  35. package/dist/formats/black/core/blackConstants.js +7 -7
  36. package/dist/formats/black/core/blackDefinitions.js +10 -10
  37. package/dist/formats/black/core/blackEnums.js +6 -6
  38. package/dist/formats/black/core/blackSchema.js +3 -3
  39. package/dist/formats/black/core/blackVersion.js +22 -22
  40. package/dist/formats/black/core/helpers.js +199 -199
  41. package/dist/formats/black/core/schema.js +4 -4
  42. package/dist/formats/black/index.js +2 -2
  43. package/dist/formats/bnk/CjsBnkFormat.js +175 -175
  44. package/dist/formats/bnk/core/busNodes.js +252 -252
  45. package/dist/formats/bnk/core/effectNodes.js +147 -147
  46. package/dist/formats/bnk/core/eventAction.js +416 -416
  47. package/dist/formats/bnk/core/globalSettings.js +215 -215
  48. package/dist/formats/bnk/core/graph.js +137 -137
  49. package/dist/formats/bnk/core/helpers.js +512 -512
  50. package/dist/formats/bnk/core/musicNodes.js +540 -540
  51. package/dist/formats/bnk/core/nodeBase.js +553 -553
  52. package/dist/formats/bnk/core/sfxNodes.js +632 -632
  53. package/dist/formats/bnk/core/soundbanksInfo.js +209 -209
  54. package/dist/formats/bnk/index.js +2 -2
  55. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  56. package/dist/formats/cmf/core/binary.js +194 -194
  57. package/dist/formats/cmf/core/buffers.js +237 -237
  58. package/dist/formats/cmf/core/constants.js +47 -47
  59. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  60. package/dist/formats/cmf/core/helpers.js +318 -318
  61. package/dist/formats/cmf/core/pack.js +276 -276
  62. package/dist/formats/cmf/core/schema.js +374 -374
  63. package/dist/formats/cmf/core/shared.js +277 -277
  64. package/dist/formats/cmf/core/writer.js +571 -571
  65. package/dist/formats/cmf/index.js +2 -2
  66. package/dist/formats/dds/CjsDdsFormat.js +200 -200
  67. package/dist/formats/dds/core/bc6h.js +298 -298
  68. package/dist/formats/dds/core/bc7.js +272 -272
  69. package/dist/formats/dds/core/helpers.js +901 -862
  70. package/dist/formats/dds/core/helpers.js.map +1 -1
  71. package/dist/formats/dds/index.js +2 -2
  72. package/dist/formats/dxbc/CjsDxbcFormat.js +187 -142
  73. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
  74. package/dist/formats/dxbc/core/DxbcReader.js +266 -266
  75. package/dist/formats/dxbc/core/container.js +169 -169
  76. package/dist/formats/dxbc/core/decoder.js +789 -789
  77. package/dist/formats/dxbc/core/disassemble.js +240 -0
  78. package/dist/formats/dxbc/core/disassemble.js.map +1 -0
  79. package/dist/formats/dxbc/core/errors.js +19 -19
  80. package/dist/formats/dxbc/core/helpers.js +220 -220
  81. package/dist/formats/dxbc/core/opcodes.js +45 -45
  82. package/dist/formats/dxbc/core/program.js +91 -91
  83. package/dist/formats/dxbc/core/signature.js +172 -172
  84. package/dist/formats/dxbc/index.js +2 -2
  85. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  86. package/dist/formats/fbx/core/helpers.js +3932 -3932
  87. package/dist/formats/fbx/index.js +2 -2
  88. package/dist/formats/flac/CjsFlacFormat.js +142 -142
  89. package/dist/formats/flac/core/helpers.js +315 -315
  90. package/dist/formats/flac/index.js +2 -2
  91. package/dist/formats/gif/CjsGifFormat.js +141 -141
  92. package/dist/formats/gif/core/helpers.js +380 -380
  93. package/dist/formats/gif/index.js +2 -2
  94. package/dist/formats/gltf/CjsGltfFormat.js +252 -290
  95. package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
  96. package/dist/formats/gltf/core/helpers.js +287 -307
  97. package/dist/formats/gltf/core/helpers.js.map +1 -1
  98. package/dist/formats/gltf/core/json.js +79 -79
  99. package/dist/formats/gltf/core/parser.js +679 -679
  100. package/dist/formats/gltf/core/targets.js +173 -173
  101. package/dist/formats/gltf/index.js +2 -2
  102. package/dist/formats/gr2/CjsGr2Format.js +289 -289
  103. package/dist/formats/gr2/core/bitknit2.js +282 -282
  104. package/dist/formats/gr2/core/curves.js +1047 -1047
  105. package/dist/formats/gr2/core/gsf.js +72 -72
  106. package/dist/formats/gr2/core/helpers.js +352 -352
  107. package/dist/formats/gr2/core/json.js +622 -622
  108. package/dist/formats/gr2/core/oodle1.js +388 -388
  109. package/dist/formats/gr2/core/tangents.js +48 -48
  110. package/dist/formats/gr2/core/targets.js +361 -361
  111. package/dist/formats/gr2/index.js +2 -2
  112. package/dist/formats/hlsl/CjsHlslFormat.js +233 -254
  113. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
  114. package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -15
  115. package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -19
  116. package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -130
  117. package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -37
  118. package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -94
  119. package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -44
  120. package/dist/formats/hlsl/core/analysis.js +51 -51
  121. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +850 -850
  122. package/dist/formats/hlsl/core/detailMapFamily.js +128 -128
  123. package/dist/formats/hlsl/core/helpers.js +270 -270
  124. package/dist/formats/hlsl/core/json.js +284 -284
  125. package/dist/formats/hlsl/core/localLightFamily.js +133 -133
  126. package/dist/formats/hlsl/core/metadata.js +327 -327
  127. package/dist/formats/hlsl/core/render-states.js +280 -280
  128. package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -43
  129. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +320 -320
  130. package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -33
  131. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +423 -416
  132. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
  133. package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -40
  134. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +62 -62
  135. package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -52
  136. package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -38
  137. package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -50
  138. package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -86
  139. package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -31
  140. package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -42
  141. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -55
  142. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -29
  143. package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -220
  144. package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -30
  145. package/dist/formats/hlsl/index.js +3 -3
  146. package/dist/formats/index.js +33 -33
  147. package/dist/formats/jpeg/CjsJpegFormat.js +212 -212
  148. package/dist/formats/jpeg/core/helpers.js +402 -402
  149. package/dist/formats/jpeg/core/jpeg.js +480 -480
  150. package/dist/formats/jpeg/index.js +2 -2
  151. package/dist/formats/mp3/CjsMp3Format.js +197 -197
  152. package/dist/formats/mp3/core/helpers.js +375 -375
  153. package/dist/formats/mp3/index.js +2 -2
  154. package/dist/formats/mp4/CjsMp4Format.js +197 -197
  155. package/dist/formats/mp4/core/helpers.js +484 -484
  156. package/dist/formats/mp4/index.js +2 -2
  157. package/dist/formats/obj/CjsObjFormat.js +232 -253
  158. package/dist/formats/obj/CjsObjFormat.js.map +1 -1
  159. package/dist/formats/obj/core/helpers.js +553 -573
  160. package/dist/formats/obj/core/helpers.js.map +1 -1
  161. package/dist/formats/obj/core/json.js +64 -64
  162. package/dist/formats/obj/core/parser.js +321 -321
  163. package/dist/formats/obj/index.js +2 -2
  164. package/dist/formats/ogg/CjsOggFormat.js +143 -143
  165. package/dist/formats/ogg/core/helpers.js +410 -410
  166. package/dist/formats/ogg/core/imdct.js +178 -178
  167. package/dist/formats/ogg/core/vorbis.js +1017 -1017
  168. package/dist/formats/ogg/index.js +2 -2
  169. package/dist/formats/pickle/CjsPickleFormat.js +214 -214
  170. package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -551
  171. package/dist/formats/pickle/index.js +2 -2
  172. package/dist/formats/png/CjsPngFormat.js +201 -201
  173. package/dist/formats/png/core/helpers.js +635 -635
  174. package/dist/formats/png/index.js +2 -2
  175. package/dist/formats/red/CjsRedFormat.js +263 -263
  176. package/dist/formats/red/core/CjsRedReader.js +246 -246
  177. package/dist/formats/red/core/blackDefinitions.js +3 -3
  178. package/dist/formats/red/core/helpers.js +158 -158
  179. package/dist/formats/red/core/redGraph.js +71 -71
  180. package/dist/formats/red/core/schema.js +4 -4
  181. package/dist/formats/red/index.js +2 -2
  182. package/dist/formats/stl/CjsStlFormat.js +320 -365
  183. package/dist/formats/stl/CjsStlFormat.js.map +1 -1
  184. package/dist/formats/stl/core/helpers.js +241 -261
  185. package/dist/formats/stl/core/helpers.js.map +1 -1
  186. package/dist/formats/stl/core/json.js +51 -51
  187. package/dist/formats/stl/core/stl.js +642 -642
  188. package/dist/formats/stl/core/targets.js +173 -173
  189. package/dist/formats/stl/index.js +2 -2
  190. package/dist/formats/tga/CjsTgaFormat.js +197 -197
  191. package/dist/formats/tga/core/helpers.js +493 -493
  192. package/dist/formats/tga/index.js +2 -2
  193. package/dist/formats/wav/CjsWavFormat.js +198 -198
  194. package/dist/formats/wav/core/helpers.js +365 -365
  195. package/dist/formats/wav/index.js +2 -2
  196. package/dist/formats/webgl/CjsWebglFormat.js +199 -199
  197. package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -70
  198. package/dist/formats/webgl/core/effectPackage.js +900 -900
  199. package/dist/formats/webgl/core/errors.js +27 -27
  200. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2820 -2820
  201. package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -89
  202. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +486 -486
  203. package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -98
  204. package/dist/formats/webgl/core/glslBackendBlock.js +552 -552
  205. package/dist/formats/webgl/core/glslBackendBodySet.js +243 -243
  206. package/dist/formats/webgl/core/glslEffectCompleteness.js +85 -85
  207. package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -1
  208. package/dist/formats/webgl/core/helpers.js +167 -167
  209. package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -122
  210. package/dist/formats/webgl/core/readGlslEffectContainer.js +202 -256
  211. package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
  212. package/dist/formats/webgl/index.js +2 -2
  213. package/dist/formats/webgpu/CjsWebgpuFormat.js +357 -357
  214. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +89 -89
  215. package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js +354 -354
  216. package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js +355 -355
  217. package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js +90 -90
  218. package/dist/formats/webgpu/core/effectAnalysis.js +82 -82
  219. package/dist/formats/webgpu/core/effectBackendBodySet.js +306 -306
  220. package/dist/formats/webgpu/core/errors.js +20 -20
  221. package/dist/formats/webgpu/core/helpers.js +443 -443
  222. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +212 -212
  223. package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -220
  224. package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -137
  225. package/dist/formats/webgpu/core/ir/inferValueTypes.js +449 -449
  226. package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -494
  227. package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -177
  228. package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -61
  229. package/dist/formats/webgpu/core/packageEffect.js +381 -381
  230. package/dist/formats/webgpu/core/packageEffectSelection.js +164 -164
  231. package/dist/formats/webgpu/core/packageMetadata.js +17 -17
  232. package/dist/formats/webgpu/core/schema.js +4 -4
  233. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +263 -263
  234. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +172 -172
  235. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +325 -325
  236. package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -356
  237. package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -77
  238. package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -451
  239. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +735 -735
  240. package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -457
  241. package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -1572
  242. package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -659
  243. package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -734
  244. package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -583
  245. package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -621
  246. package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -824
  247. package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -697
  248. package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -559
  249. package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -1328
  250. package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -110
  251. package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -55
  252. package/dist/formats/webgpu/core/wgsl/selectionPlans.js +717 -717
  253. package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -78
  254. package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -196
  255. package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -37
  256. package/dist/formats/webgpu/index.js +2 -2
  257. package/dist/formats/webm/CjsWebmFormat.js +197 -197
  258. package/dist/formats/webm/core/helpers.js +572 -572
  259. package/dist/formats/webm/index.js +2 -2
  260. package/dist/formats/webp/CjsWebpFormat.js +140 -140
  261. package/dist/formats/webp/core/helpers.js +237 -237
  262. package/dist/formats/webp/index.js +2 -2
  263. package/dist/formats/wem/CjsWemFormat.js +250 -250
  264. package/dist/formats/wem/core/bitStream.js +261 -261
  265. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  266. package/dist/formats/wem/core/helpers.js +437 -437
  267. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  268. package/dist/formats/wem/core/ptadpcm.js +77 -77
  269. package/dist/formats/wem/core/resolve.js +121 -121
  270. package/dist/formats/wem/core/wemToOgg.js +485 -485
  271. package/dist/formats/wem/index.js +2 -2
  272. package/dist/formats/yaml/CjsYamlFormat.js +134 -134
  273. package/dist/formats/yaml/core/CjsYamlReader.js +400 -400
  274. package/dist/formats/yaml/core/helpers.js +196 -196
  275. package/dist/formats/yaml/index.js +2 -2
  276. package/dist/index.js +64 -64
  277. package/dist/resource/CjsLoadingObject.js +19 -19
  278. package/dist/resource/CjsResource.js +801 -801
  279. package/dist/resource/ResourceHandlerMode.js +14 -14
  280. package/dist/resource/Tr2LightProfileRes.js +32 -32
  281. package/dist/resource/audio/AudioGeometryResData.js +47 -47
  282. package/dist/resource/audio/CjsAudioBufferRes.js +86 -86
  283. package/dist/resource/audio/CjsAudioRes.js +213 -213
  284. package/dist/resource/audio/index.js +4 -4
  285. package/dist/resource/geometry/MeshDecalData.js +37 -37
  286. package/dist/resource/geometry/MeshDecalLodData.js +34 -34
  287. package/dist/resource/geometry/TriGeometryRes.js +675 -675
  288. package/dist/resource/geometry/TriGeometryResAreaData.js +59 -59
  289. package/dist/resource/geometry/TriGeometryResJointData.js +38 -38
  290. package/dist/resource/geometry/TriGeometryResLodData.js +88 -88
  291. package/dist/resource/geometry/TriGeometryResMeshData.js +63 -63
  292. package/dist/resource/geometry/TriGeometryResSkeletonData.js +34 -34
  293. package/dist/resource/geometry/TriJointBinding.js +38 -38
  294. package/dist/resource/geometry/TriMorphTargetGeometryConstants.js +46 -46
  295. package/dist/resource/geometry/TriRtGeometryConstants.js +88 -88
  296. package/dist/resource/geometry/granny/GStateBindingCallbackData.js +31 -31
  297. package/dist/resource/geometry/granny/Tr2GrannyIntersectionResult.js +60 -60
  298. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +36 -36
  299. package/dist/resource/geometry/granny/TriGrannyRes.js +35 -35
  300. package/dist/resource/geometry/granny/enums.js +10 -10
  301. package/dist/resource/geometry/granny/index.js +6 -6
  302. package/dist/resource/geometry/index.js +17 -17
  303. package/dist/resource/index.js +54 -54
  304. package/dist/resource/resourceBoundary.js +64 -64
  305. package/dist/resource/shader/Tr2EffectRes.js +336 -336
  306. package/dist/resource/shader/Tr2MaterialArea.js +31 -31
  307. package/dist/resource/shader/Tr2MaterialMesh.js +27 -27
  308. package/dist/resource/shader/Tr2MaterialRes.js +31 -31
  309. package/dist/resource/shader/Tr2Shader.js +283 -283
  310. package/dist/resource/shader/Tr2ShaderPermutation.js +43 -43
  311. package/dist/resource/shader/index.js +17 -17
  312. package/dist/resource/shader/reflection/Tr2EffectConstant.js +143 -143
  313. package/dist/resource/shader/reflection/Tr2EffectDefine.js +30 -30
  314. package/dist/resource/shader/reflection/Tr2EffectDescription.js +114 -114
  315. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +168 -168
  316. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +125 -125
  317. package/dist/resource/shader/reflection/Tr2EffectResource.js +120 -120
  318. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +372 -372
  319. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +78 -78
  320. package/dist/resource/shader/reflection/Tr2Pass.js +168 -168
  321. package/dist/resource/shader/reflection/carbonRecordFields.js +159 -159
  322. package/dist/resource/shader/reflection/shaderStage.js +22 -22
  323. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +135 -135
  324. package/dist/resource/texture/CjsTextureArrayRes.js +472 -472
  325. package/dist/resource/texture/CjsTextureArrayResParameterProxy.js +179 -179
  326. package/dist/resource/texture/Tr2ImageRes.js +120 -120
  327. package/dist/resource/texture/Tr2TextureLodManager.js +82 -82
  328. package/dist/resource/texture/Tr2TextureLodUpdateRequest.js +37 -37
  329. package/dist/resource/texture/Tr2TexturePackChannel.js +37 -37
  330. package/dist/resource/texture/Tr2TexturePipeline.js +54 -54
  331. package/dist/resource/texture/Tr2TexturePipelineParams.js +34 -34
  332. package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +40 -40
  333. package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js +22 -22
  334. package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js +34 -34
  335. package/dist/resource/texture/Tr2TexturePipelineStepLoad.js +31 -31
  336. package/dist/resource/texture/Tr2TexturePipelineStepPack.js +43 -43
  337. package/dist/resource/texture/TriTextureRes.js +359 -359
  338. package/dist/resource/texture/index.js +15 -15
  339. package/dist/resource/texture/texturePipelineBehavior.js +308 -308
  340. package/dist/worker/CjsResManMainThreadLoader.js +89 -89
  341. package/dist/worker/CjsResManWorker.js +218 -218
  342. package/dist/worker/CjsResManWorkerLoader.js +437 -437
  343. package/dist/worker/protocol.js +12 -12
  344. package/docs/README.md +98 -98
  345. package/docs/architecture.md +118 -118
  346. package/docs/concepts/resource-lifecycle.md +226 -226
  347. package/docs/concepts/shader-resource-model.md +111 -111
  348. package/docs/concepts/writing-an-engine-adapter.md +115 -115
  349. package/docs/formats/README.md +138 -138
  350. package/docs/formats/carbon-effect-container.md +553 -553
  351. package/docs/formats/dxbc/README.md +68 -68
  352. package/docs/formats/dxbc/architecture.md +80 -80
  353. package/docs/formats/dxbc/reference/api.md +105 -77
  354. package/docs/formats/dxbc/reference/classes/README.md +9 -9
  355. package/docs/formats/dxbc/reference/decoded-output.md +122 -122
  356. package/docs/formats/gr2.md +160 -160
  357. package/docs/formats/hlsl/README.md +54 -54
  358. package/docs/formats/hlsl/architecture.md +66 -65
  359. package/docs/formats/hlsl/guides/hydrating-json-output.md +60 -60
  360. package/docs/formats/hlsl/guides/reading-effects.md +68 -64
  361. package/docs/formats/hlsl/reference/advanced-analysis.md +61 -61
  362. package/docs/formats/hlsl/reference/api.md +91 -92
  363. package/docs/formats/hlsl/reference/classes/README.md +11 -11
  364. package/docs/formats/hlsl/reference/json-graph.md +97 -97
  365. package/docs/formats/pickle.md +82 -82
  366. package/docs/formats/provenance.md +196 -196
  367. package/docs/formats/stl.md +37 -37
  368. package/docs/formats/webgl/README.md +115 -115
  369. package/docs/formats/webgl/architecture.md +69 -69
  370. package/docs/formats/webgl/carbon-constant-layouts.md +326 -326
  371. package/docs/formats/webgl/decl-io.md +1234 -1234
  372. package/docs/formats/webgl/memory-structured.md +890 -890
  373. package/docs/formats/webgl/reference/classes/README.md +9 -9
  374. package/docs/formats/webgl/texture-sample.md +964 -964
  375. package/docs/formats/webgpu/README.md +84 -84
  376. package/docs/formats/webgpu/architecture.md +95 -95
  377. package/docs/formats/webgpu/formats/carbon-webgpu.md +215 -215
  378. package/docs/formats/webgpu/guides/effect-packaging.md +189 -189
  379. package/docs/formats/webgpu/reference/api.md +196 -196
  380. package/docs/formats/webgpu/reference/classes/README.md +9 -9
  381. package/docs/formats/webgpu/reference/wgsl-compatibility.md +1546 -1546
  382. package/docs/formats/wwise.md +146 -146
  383. package/docs/reference/classes/README.md +35 -35
  384. package/docs/reference/classes/audio.md +30 -30
  385. package/docs/reference/classes/core.md +216 -216
  386. package/docs/reference/classes/dropped.md +46 -46
  387. package/docs/reference/classes/formats.md +944 -944
  388. package/docs/reference/classes/resources.md +456 -456
  389. package/docs/reference/classes/texture.md +26 -26
  390. package/docs/reference/events.md +117 -117
  391. package/docs/reference/motherlode-cache.md +275 -275
  392. package/docs/reference/queues.md +194 -194
  393. package/docs/reference/reload.md +107 -107
  394. package/docs/reference/texture-arrays.md +113 -113
  395. package/docs/reference/texture-pipeline.md +53 -53
  396. package/docs/reference/workers.md +142 -142
  397. package/docs/roadmap.md +150 -150
  398. package/format-notices/black/LICENSE +21 -21
  399. package/format-notices/black/NOTICE +47 -47
  400. package/format-notices/bnk/LICENSE +21 -21
  401. package/format-notices/bnk/NOTICE +21 -21
  402. package/format-notices/cmf/LICENSE +21 -21
  403. package/format-notices/cmf/NOTICE +36 -36
  404. package/format-notices/dds/LICENSE +21 -21
  405. package/format-notices/dds/NOTICE +14 -14
  406. package/format-notices/dxbc/LICENSE +21 -21
  407. package/format-notices/dxbc/NOTICE +20 -20
  408. package/format-notices/fbx/LICENSE +21 -21
  409. package/format-notices/fbx/NOTICE +14 -14
  410. package/format-notices/flac/LICENSE +21 -21
  411. package/format-notices/flac/NOTICE +14 -14
  412. package/format-notices/gif/LICENSE +21 -21
  413. package/format-notices/gif/NOTICE +14 -14
  414. package/format-notices/gltf/LICENSE +21 -21
  415. package/format-notices/gltf/NOTICE +27 -27
  416. package/format-notices/gr2/LICENSE +21 -21
  417. package/format-notices/gr2/NOTICE +60 -60
  418. package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -93
  419. package/format-notices/hlsl/LICENSE +21 -21
  420. package/format-notices/hlsl/NOTICE +25 -25
  421. package/format-notices/jpeg/LICENSE +21 -21
  422. package/format-notices/jpeg/NOTICE +14 -14
  423. package/format-notices/mp3/LICENSE +21 -21
  424. package/format-notices/mp3/NOTICE +14 -14
  425. package/format-notices/mp4/LICENSE +21 -21
  426. package/format-notices/mp4/NOTICE +14 -14
  427. package/format-notices/obj/LICENSE +21 -21
  428. package/format-notices/obj/NOTICE +26 -26
  429. package/format-notices/ogg/LICENSE +21 -21
  430. package/format-notices/ogg/NOTICE +28 -28
  431. package/format-notices/png/LICENSE +21 -21
  432. package/format-notices/png/NOTICE +14 -14
  433. package/format-notices/red/LICENSE +21 -21
  434. package/format-notices/red/NOTICE +31 -31
  435. package/format-notices/stl/LICENSE +21 -21
  436. package/format-notices/stl/NOTICE +21 -21
  437. package/format-notices/tga/LICENSE +21 -21
  438. package/format-notices/tga/NOTICE +14 -14
  439. package/format-notices/wav/LICENSE +21 -21
  440. package/format-notices/wav/NOTICE +14 -14
  441. package/format-notices/webgl/LICENSE +21 -21
  442. package/format-notices/webgl/NOTICE +35 -35
  443. package/format-notices/webgpu/LICENSE +21 -21
  444. package/format-notices/webgpu/NOTICE +31 -31
  445. package/format-notices/webm/LICENSE +21 -21
  446. package/format-notices/webm/NOTICE +14 -14
  447. package/format-notices/webp/LICENSE +21 -21
  448. package/format-notices/webp/NOTICE +14 -14
  449. package/format-notices/wem/LICENSE +57 -57
  450. package/format-notices/wem/NOTICE +33 -33
  451. package/format-notices/yaml/LICENSE +21 -21
  452. package/format-notices/yaml/NOTICE +44 -44
  453. package/package.json +63 -63
@@ -1,111 +1,111 @@
1
- # Shader resource model
2
-
3
- Status: Stable
4
- Scope: `@carbonenginejs/runtime-resource`, with notes on `@carbonenginejs/runtime-trinity`
5
- Audience: Anyone touching `Tr2EffectRes`, `Tr2Shader`, `Tr2Effect`, or shader effect formats
6
- Summary: Explains how one effect file, its permutations, and the objects that resolve them relate.
7
-
8
- ## Three levels
9
-
10
- The distinction between resource, resolved shader, and effect instance is
11
- load-bearing:
12
-
13
- | Level | Represents | Owns |
14
- | --- | --- | --- |
15
- | `Tr2EffectRes` | One effect file | Bytes, permutation axes, offset table, and a cache of resolved shaders |
16
- | `Tr2Shader` | One permutation | Techniques and passes for one option set |
17
- | `Tr2Effect` | One instance | Authored options, a resource reference, and the currently resolved shader |
18
-
19
- One file yields many shaders. One shader represents one permutation. Many
20
- effect instances may share the same resource and cached shader.
21
-
22
- ## Carbon model
23
-
24
- Carbon's `Tr2EffectRes` retains the whole compiled file, its permutation
25
- records, and a map from permutation index to `Tr2Shader`. Its
26
- `GetShader(options, count)` resolves an option tuple to an index and reuses the
27
- cached shader for that index.
28
-
29
- `Tr2Effect` inherits the shader pointer from `Tr2Material`. Rebuilding an
30
- effect clears that pointer and resolves it again through the resource. This
31
- creates two deliberate caches:
32
-
33
- - the resource caches one hydrated shader per permutation index; and
34
- - each effect instance caches its currently resolved pointer.
35
-
36
- Changing effect options therefore selects another shader from the same loaded
37
- file rather than loading another file.
38
-
39
- ## Runtime-resource model
40
-
41
- `runtime-resource/src/resource/shader/Tr2EffectRes.js` follows the same shape:
42
-
43
- | Carbon | Runtime-resource |
44
- | --- | --- |
45
- | shader map keyed by permutation index | private `#shaders` map |
46
- | `GetShader(options, count)` | option resolution followed by `GetShaderByIndex` |
47
- | permutation records | `permutationGraph.axes` and `variants` |
48
- | offset-table body lookup | `CjsCarbonEffectReader` retained by `DoLoad`, read per index |
49
- | retained file bytes | `GetPayload()` |
50
-
51
- `runtime-trinity`'s `Tr2Effect.RebuildCachedDataInternal` clears and
52
- re-resolves its shader through the effect resource. Renderer-owned pipelines,
53
- bind groups, and GPU handles are not part of this device-free graph.
54
-
55
- ## Package coverage
56
-
57
- Carbon effect files carry every permutation and select through a dense offset
58
- table. Representative source files demonstrate why body count and permutation
59
- count are different:
60
-
61
- | File | Permutations | Distinct bodies |
62
- | --- | ---: | ---: |
63
- | `effect.dx11/.../unpacked_quadv5.sm_hi` | 480 | 144 |
64
- | `effect.gles2/.../geometryviewer.sm_hi` | 80 | 27 |
65
- | `effect.gles2/.../textureviewer.sm_hi` | 18 | 3 |
66
-
67
- Current `.carbonwebgpu` bytes use Carbon's version-15 record layout and retain every
68
- permutation row and representable non-program description fields, including
69
- non-dynamic sampler names and the file's authored pass-stage order — Carbon's
70
- runtime discards both, the file does not. Emitted body dedupe follows exact
71
- emitted bytes, so it need not preserve the original source alias partition. `mode: "selected"` narrows which body receives translated
72
- WGSL; it does not discard source permutations. `mode: "all"` attempts every
73
- distinct body after the resolved selection passes the initial translation gate.
74
-
75
- `.carbonwebgl` remains its own Carbon WebGL chunk format. Its current package contract also
76
- preserves complete source permutation topology and supports selected versus
77
- all backend coverage.
78
-
79
- The selected/all distinction is therefore backend translation scope, not
80
- source cardinality. A resource can still reason about every option tuple even
81
- when some bodies have no translated backend program.
82
-
83
- ## Current integration boundaries
84
-
85
- The read path is direct: `Tr2EffectRes.DoLoad` retains a
86
- `CjsCarbonEffectReader` over the container bytes, and
87
- `Tr2Shader.fromCarbonBinary(reader, index)` builds the device-free graph from
88
- one description record. No intermediate document sits between them.
89
-
90
- What remains unproven is execution, not construction. The presence of every
91
- permutation proves source preservation; it does not prove a rendered result.
92
-
93
- ## Reading the model without inventing gaps
94
-
95
- Three recurring mistakes explain most false conclusions in this area:
96
-
97
- 1. **Searching only one package.** `Tr2EffectRes` is in runtime-resource while
98
- `Tr2Effect` is in runtime-trinity.
99
- 2. **Searching only the derived class.** The effect's shader pointer is
100
- declared on its `Tr2Material` base.
101
- 3. **Confusing permutation rows with stored bodies.** Several rows may alias
102
- one description body while remaining distinct option selections.
103
-
104
- When an expected mechanism appears absent, check the owner package, base
105
- classes, and record indirection before treating the absence as a design gap.
106
-
107
- ## Related documentation
108
-
109
- - [Carbon WebGPU effect container](../formats/webgpu/formats/carbon-webgpu.md)
110
- - [Carbon compiled-effect container](../formats/carbon-effect-container.md)
111
- - [WebGPU effect packaging](../formats/webgpu/guides/effect-packaging.md)
1
+ # Shader resource model
2
+
3
+ Status: Stable
4
+ Scope: `@carbonenginejs/runtime-resource`, with notes on `@carbonenginejs/runtime-trinity`
5
+ Audience: Anyone touching `Tr2EffectRes`, `Tr2Shader`, `Tr2Effect`, or shader effect formats
6
+ Summary: Explains how one effect file, its permutations, and the objects that resolve them relate.
7
+
8
+ ## Three levels
9
+
10
+ The distinction between resource, resolved shader, and effect instance is
11
+ load-bearing:
12
+
13
+ | Level | Represents | Owns |
14
+ | --- | --- | --- |
15
+ | `Tr2EffectRes` | One effect file | Bytes, permutation axes, offset table, and a cache of resolved shaders |
16
+ | `Tr2Shader` | One permutation | Techniques and passes for one option set |
17
+ | `Tr2Effect` | One instance | Authored options, a resource reference, and the currently resolved shader |
18
+
19
+ One file yields many shaders. One shader represents one permutation. Many
20
+ effect instances may share the same resource and cached shader.
21
+
22
+ ## Carbon model
23
+
24
+ Carbon's `Tr2EffectRes` retains the whole compiled file, its permutation
25
+ records, and a map from permutation index to `Tr2Shader`. Its
26
+ `GetShader(options, count)` resolves an option tuple to an index and reuses the
27
+ cached shader for that index.
28
+
29
+ `Tr2Effect` inherits the shader pointer from `Tr2Material`. Rebuilding an
30
+ effect clears that pointer and resolves it again through the resource. This
31
+ creates two deliberate caches:
32
+
33
+ - the resource caches one hydrated shader per permutation index; and
34
+ - each effect instance caches its currently resolved pointer.
35
+
36
+ Changing effect options therefore selects another shader from the same loaded
37
+ file rather than loading another file.
38
+
39
+ ## Runtime-resource model
40
+
41
+ `runtime-resource/src/resource/shader/Tr2EffectRes.js` follows the same shape:
42
+
43
+ | Carbon | Runtime-resource |
44
+ | --- | --- |
45
+ | shader map keyed by permutation index | private `#shaders` map |
46
+ | `GetShader(options, count)` | option resolution followed by `GetShaderByIndex` |
47
+ | permutation records | `permutationGraph.axes` and `variants` |
48
+ | offset-table body lookup | `CjsCarbonEffectReader` retained by `DoLoad`, read per index |
49
+ | retained file bytes | `GetPayload()` |
50
+
51
+ `runtime-trinity`'s `Tr2Effect.RebuildCachedDataInternal` clears and
52
+ re-resolves its shader through the effect resource. Renderer-owned pipelines,
53
+ bind groups, and GPU handles are not part of this device-free graph.
54
+
55
+ ## Package coverage
56
+
57
+ Carbon effect files carry every permutation and select through a dense offset
58
+ table. Representative source files demonstrate why body count and permutation
59
+ count are different:
60
+
61
+ | File | Permutations | Distinct bodies |
62
+ | --- | ---: | ---: |
63
+ | `effect.dx11/.../unpacked_quadv5.sm_hi` | 480 | 144 |
64
+ | `effect.gles2/.../geometryviewer.sm_hi` | 80 | 27 |
65
+ | `effect.gles2/.../textureviewer.sm_hi` | 18 | 3 |
66
+
67
+ Current `.carbonwebgpu` bytes use Carbon's version-15 record layout and retain every
68
+ permutation row and representable non-program description fields, including
69
+ non-dynamic sampler names and the file's authored pass-stage order — Carbon's
70
+ runtime discards both, the file does not. Emitted body dedupe follows exact
71
+ emitted bytes, so it need not preserve the original source alias partition. `mode: "selected"` narrows which body receives translated
72
+ WGSL; it does not discard source permutations. `mode: "all"` attempts every
73
+ distinct body after the resolved selection passes the initial translation gate.
74
+
75
+ `.carbonwebgl` remains its own Carbon WebGL chunk format. Its current package contract also
76
+ preserves complete source permutation topology and supports selected versus
77
+ all backend coverage.
78
+
79
+ The selected/all distinction is therefore backend translation scope, not
80
+ source cardinality. A resource can still reason about every option tuple even
81
+ when some bodies have no translated backend program.
82
+
83
+ ## Current integration boundaries
84
+
85
+ The read path is direct: `Tr2EffectRes.DoLoad` retains a
86
+ `CjsCarbonEffectReader` over the container bytes, and
87
+ `Tr2Shader.fromCarbonBinary(reader, index)` builds the device-free graph from
88
+ one description record. No intermediate document sits between them.
89
+
90
+ What remains unproven is execution, not construction. The presence of every
91
+ permutation proves source preservation; it does not prove a rendered result.
92
+
93
+ ## Reading the model without inventing gaps
94
+
95
+ Three recurring mistakes explain most false conclusions in this area:
96
+
97
+ 1. **Searching only one package.** `Tr2EffectRes` is in runtime-resource while
98
+ `Tr2Effect` is in runtime-trinity.
99
+ 2. **Searching only the derived class.** The effect's shader pointer is
100
+ declared on its `Tr2Material` base.
101
+ 3. **Confusing permutation rows with stored bodies.** Several rows may alias
102
+ one description body while remaining distinct option selections.
103
+
104
+ When an expected mechanism appears absent, check the owner package, base
105
+ classes, and record indirection before treating the absence as a design gap.
106
+
107
+ ## Related documentation
108
+
109
+ - [Carbon WebGPU effect container](../formats/webgpu/formats/carbon-webgpu.md)
110
+ - [Carbon compiled-effect container](../formats/carbon-effect-container.md)
111
+ - [WebGPU effect packaging](../formats/webgpu/guides/effect-packaging.md)
@@ -1,115 +1,115 @@
1
- # Writing an engine adapter
2
-
3
- Status: Stable
4
- Scope: `@carbonenginejs/runtime-resource`, addressed to engine packages
5
- Audience: Anyone building `engine-webgl`, a second WebGPU engine, or any package that realizes CPU payloads into backend objects
6
- Summary: The coupling rules, the reflection/topology seam, and the two mistakes `engine-webgpu` already made that a second engine must not repeat.
7
-
8
- ## Read this before writing a second engine
9
-
10
- `engine-webgpu` is currently the only engine package. Most of its shape is right
11
- and worth copying. Two things are not, and both are easier to avoid than to undo.
12
- This document exists because the second engine is being written after the first
13
- one's mistakes were diagnosed but before they were fixed.
14
-
15
- ## The coupling rule
16
-
17
- **Engine packages take functions and duck-typed objects. They do not import the
18
- layers above or beside them.**
19
-
20
- `engine-webgpu` declares this as a non-goal and holds it: no dependency on
21
- `runtime-core`, `runtime-resource`, or `runtime-trinity`. Three existing seams
22
- show the pattern, and a new engine should reach for one of them rather than
23
- inventing a fourth:
24
-
25
- | seam | shape |
26
- |---|---|
27
- | `CjsWebGPUPackage.fromBytes(bytes, { read })` | the format reader arrives as a **function** |
28
- | `CjsWebGPUTrinityBatchDispatcher(hooks)` | `ResolveMaterial` / `ResolveBindings` arrive as **hooks**; the batch is duck-typed on the `Tr2RenderBatch` shape |
29
- | `CjsTextureArrayRes` | the engine calls `ConsumeUpdateRequest()`, prepares a candidate, then `CommitPreparedAdapterRevision()` — **the resource layer owns the state machine and never holds engine code** |
30
-
31
- The third is the most instructive. Realization is not a callback the resource
32
- layer fires into the engine; it is a request the engine consumes and a commit it
33
- returns. The engine drives its own frame, which is what an engine must do, while
34
- the resource layer keeps the queue, the revisions, and the failure handling.
35
-
36
- ## What the resource layer owns
37
-
38
- Resource identity, the cache, CPU payload lifecycle, format selection, the
39
- load/publication queues, and **permutation selection**. It stops at a published
40
- CPU payload; it hands out objects and accepts commits.
41
-
42
- It is GPU-free and stays that way. It does not define GPU-shaped interfaces for
43
- engines to implement, which is precisely why the consume/commit shape is used
44
- instead of an injected realizer.
45
-
46
- ## The seam: reflection from the shader, topology from the package
47
-
48
- This is the distinction the first engine got wrong.
49
-
50
- **Carbon reflection belongs to `Tr2Shader`.** One file yields many shaders, one
51
- shader is one permutation, and many effects share them — see
52
- [shader-resource-model.md](shader-resource-model.md). The surface is
53
- `GetConstant(name)`, `GetResource(name)`, `GetParameterAnnotations(parameterName)`,
54
- `GetEffectDescription()` and `iterateStages()`, reachable through
55
- `Tr2EffectRes.DoLoad(bytes)` -> `Tr2Shader.fromCarbonBinary(reader, index)`.
56
-
57
- **Backend binding topology belongs to the package**, because it has no Carbon
58
- counterpart — it comes from the lowered IR, not from Carbon's D3D-era reflection.
59
-
60
- | ask the shader | ask the package |
61
- |---|---|
62
- | `constants[].{name, offset, size}` | `group`, `binding`, `visibility` |
63
- | resource `type`, `isSRGB` | `generatedSymbol`, `resourceKind` |
64
- | annotations | `registerIndex`, `registerSpace` |
65
- | the parameter's name | `viewDimension` |
66
-
67
- If you find yourself wanting *richer package reflection*, you are on the wrong
68
- side of this table. The data you want is on the shader, and it is there because
69
- Carbon put it there.
70
-
71
- ## The two mistakes not to copy
72
-
73
- ### 1. Do not read format-package records for Carbon reflection
74
-
75
- `engine-webgpu/src/core/packageHelpers.js` and
76
- `src/core/spaceObjectMainBindings.js` read `metadataName`, `heapView`,
77
- `carbon.type`, `carbon.isSRGB` and `carbon.constants[].{name, offset, size}`
78
- directly out of the format package, to pack real material uniform bytes. Twelve
79
- lines, two files, and a known layering defect: engine code must consume the
80
- resource-owned `Tr2Shader` reflection graph rather than make format-package
81
- records its material API.
82
-
83
- It is deferred rather than fixed because nothing can use that path until the
84
- shader work lands, so the break is theoretical. That is a reason not to rush it,
85
- not a reason to reproduce it.
86
-
87
- ### 2. Do not reimplement permutation selection
88
-
89
- `Tr2EffectRes` already keeps a permutation-index-keyed shader cache and resolves
90
- options through it — Carbon's own mechanism, and ours matches. An engine that
91
- grows its own index-keyed resolution is writing a second copy of a tested thing.
92
-
93
- Building pipelines, bind groups and GPU objects is **not** duplication; that is
94
- the engine's whole job. The line falls exactly where the table above falls.
95
-
96
- ## runtime-core is optional
97
-
98
- `runtime-core` wires named services by default — `RegisterResourceBehavior`
99
- registers "a structural request policy without importing its owner", and the
100
- resource manager, space-object factory and audio manager register the same way.
101
- It is a convenience wrapper, not a dependency.
102
-
103
- Every hook it registers can be passed by hand. An engine that only works when
104
- `runtime-core` is present has taken a dependency through the back door.
105
-
106
- ## Checklist for a new engine package
107
-
108
- - no imports of `runtime-core`, `runtime-resource`, or `runtime-trinity`
109
- - readers, material resolvers and batch shapes arrive injected or duck-typed
110
- - Carbon reflection is read from a shader object handed in, never from format
111
- records
112
- - permutation selection is asked for, never reimplemented
113
- - long-lived state machines and queues stay in the resource layer; the engine
114
- consumes requests and commits results
115
- - the package works with `runtime-core` absent
1
+ # Writing an engine adapter
2
+
3
+ Status: Stable
4
+ Scope: `@carbonenginejs/runtime-resource`, addressed to engine packages
5
+ Audience: Anyone building `engine-webgl`, a second WebGPU engine, or any package that realizes CPU payloads into backend objects
6
+ Summary: The coupling rules, the reflection/topology seam, and the two mistakes `engine-webgpu` already made that a second engine must not repeat.
7
+
8
+ ## Read this before writing a second engine
9
+
10
+ `engine-webgpu` is currently the only engine package. Most of its shape is right
11
+ and worth copying. Two things are not, and both are easier to avoid than to undo.
12
+ This document exists because the second engine is being written after the first
13
+ one's mistakes were diagnosed but before they were fixed.
14
+
15
+ ## The coupling rule
16
+
17
+ **Engine packages take functions and duck-typed objects. They do not import the
18
+ layers above or beside them.**
19
+
20
+ `engine-webgpu` declares this as a non-goal and holds it: no dependency on
21
+ `runtime-core`, `runtime-resource`, or `runtime-trinity`. Three existing seams
22
+ show the pattern, and a new engine should reach for one of them rather than
23
+ inventing a fourth:
24
+
25
+ | seam | shape |
26
+ |---|---|
27
+ | `CjsWebGPUPackage.fromBytes(bytes, { read })` | the format reader arrives as a **function** |
28
+ | `CjsWebGPUTrinityBatchDispatcher(hooks)` | `ResolveMaterial` / `ResolveBindings` arrive as **hooks**; the batch is duck-typed on the `Tr2RenderBatch` shape |
29
+ | `CjsTextureArrayRes` | the engine calls `ConsumeUpdateRequest()`, prepares a candidate, then `CommitPreparedAdapterRevision()` — **the resource layer owns the state machine and never holds engine code** |
30
+
31
+ The third is the most instructive. Realization is not a callback the resource
32
+ layer fires into the engine; it is a request the engine consumes and a commit it
33
+ returns. The engine drives its own frame, which is what an engine must do, while
34
+ the resource layer keeps the queue, the revisions, and the failure handling.
35
+
36
+ ## What the resource layer owns
37
+
38
+ Resource identity, the cache, CPU payload lifecycle, format selection, the
39
+ load/publication queues, and **permutation selection**. It stops at a published
40
+ CPU payload; it hands out objects and accepts commits.
41
+
42
+ It is GPU-free and stays that way. It does not define GPU-shaped interfaces for
43
+ engines to implement, which is precisely why the consume/commit shape is used
44
+ instead of an injected realizer.
45
+
46
+ ## The seam: reflection from the shader, topology from the package
47
+
48
+ This is the distinction the first engine got wrong.
49
+
50
+ **Carbon reflection belongs to `Tr2Shader`.** One file yields many shaders, one
51
+ shader is one permutation, and many effects share them — see
52
+ [shader-resource-model.md](shader-resource-model.md). The surface is
53
+ `GetConstant(name)`, `GetResource(name)`, `GetParameterAnnotations(parameterName)`,
54
+ `GetEffectDescription()` and `iterateStages()`, reachable through
55
+ `Tr2EffectRes.DoLoad(bytes)` -> `Tr2Shader.fromCarbonBinary(reader, index)`.
56
+
57
+ **Backend binding topology belongs to the package**, because it has no Carbon
58
+ counterpart — it comes from the lowered IR, not from Carbon's D3D-era reflection.
59
+
60
+ | ask the shader | ask the package |
61
+ |---|---|
62
+ | `constants[].{name, offset, size}` | `group`, `binding`, `visibility` |
63
+ | resource `type`, `isSRGB` | `generatedSymbol`, `resourceKind` |
64
+ | annotations | `registerIndex`, `registerSpace` |
65
+ | the parameter's name | `viewDimension` |
66
+
67
+ If you find yourself wanting *richer package reflection*, you are on the wrong
68
+ side of this table. The data you want is on the shader, and it is there because
69
+ Carbon put it there.
70
+
71
+ ## The two mistakes not to copy
72
+
73
+ ### 1. Do not read format-package records for Carbon reflection
74
+
75
+ `engine-webgpu/src/core/packageHelpers.js` and
76
+ `src/core/spaceObjectMainBindings.js` read `metadataName`, `heapView`,
77
+ `carbon.type`, `carbon.isSRGB` and `carbon.constants[].{name, offset, size}`
78
+ directly out of the format package, to pack real material uniform bytes. Twelve
79
+ lines, two files, and a known layering defect: engine code must consume the
80
+ resource-owned `Tr2Shader` reflection graph rather than make format-package
81
+ records its material API.
82
+
83
+ It is deferred rather than fixed because nothing can use that path until the
84
+ shader work lands, so the break is theoretical. That is a reason not to rush it,
85
+ not a reason to reproduce it.
86
+
87
+ ### 2. Do not reimplement permutation selection
88
+
89
+ `Tr2EffectRes` already keeps a permutation-index-keyed shader cache and resolves
90
+ options through it — Carbon's own mechanism, and ours matches. An engine that
91
+ grows its own index-keyed resolution is writing a second copy of a tested thing.
92
+
93
+ Building pipelines, bind groups and GPU objects is **not** duplication; that is
94
+ the engine's whole job. The line falls exactly where the table above falls.
95
+
96
+ ## runtime-core is optional
97
+
98
+ `runtime-core` wires named services by default — `RegisterResourceBehavior`
99
+ registers "a structural request policy without importing its owner", and the
100
+ resource manager, space-object factory and audio manager register the same way.
101
+ It is a convenience wrapper, not a dependency.
102
+
103
+ Every hook it registers can be passed by hand. An engine that only works when
104
+ `runtime-core` is present has taken a dependency through the back door.
105
+
106
+ ## Checklist for a new engine package
107
+
108
+ - no imports of `runtime-core`, `runtime-resource`, or `runtime-trinity`
109
+ - readers, material resolvers and batch shapes arrive injected or duck-typed
110
+ - Carbon reflection is read from a shader object handed in, never from format
111
+ records
112
+ - permutation selection is asked for, never reimplemented
113
+ - long-lived state machines and queues stay in the resource layer; the engine
114
+ consumes requests and commits results
115
+ - the package works with `runtime-core` absent