@carbonenginejs/runtime-resource 0.12.2 → 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 (238) hide show
  1. package/README.md +21 -0
  2. package/dist/CjsResMan.js +393 -29
  3. package/dist/CjsResMan.js.map +1 -1
  4. package/dist/format/carbonEffect/CjsCarbonEffectReader.js +165 -118
  5. package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
  6. package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -0
  7. package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -0
  8. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +7 -113
  9. package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
  10. package/dist/format/carbonEffect/carbonEffectRecords.js +258 -66
  11. package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
  12. package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -0
  13. package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -0
  14. package/dist/format/effect/effectBodyInventory.js +146 -0
  15. package/dist/format/effect/effectBodyInventory.js.map +1 -0
  16. package/dist/format/effect/effectPermutationGraph.js +13 -13
  17. package/dist/format/effect/effectPermutationGraph.js.map +1 -1
  18. package/dist/format/index.js +4 -4
  19. package/dist/formats/black/CjsBlackFormat.js +19 -1
  20. package/dist/formats/black/CjsBlackFormat.js.map +1 -1
  21. package/dist/formats/bnk/CjsBnkFormat.js +28 -9
  22. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  23. package/dist/formats/bnk/core/busNodes.js +252 -0
  24. package/dist/formats/bnk/core/busNodes.js.map +1 -0
  25. package/dist/formats/bnk/core/effectNodes.js +147 -0
  26. package/dist/formats/bnk/core/effectNodes.js.map +1 -0
  27. package/dist/formats/bnk/core/eventAction.js +135 -24
  28. package/dist/formats/bnk/core/eventAction.js.map +1 -1
  29. package/dist/formats/bnk/core/globalSettings.js +215 -0
  30. package/dist/formats/bnk/core/globalSettings.js.map +1 -0
  31. package/dist/formats/bnk/core/helpers.js +37 -5
  32. package/dist/formats/bnk/core/helpers.js.map +1 -1
  33. package/dist/formats/bnk/core/musicNodes.js +43 -19
  34. package/dist/formats/bnk/core/musicNodes.js.map +1 -1
  35. package/dist/formats/bnk/core/nodeBase.js +28 -7
  36. package/dist/formats/bnk/core/nodeBase.js.map +1 -1
  37. package/dist/formats/dds/core/helpers.js +40 -1
  38. package/dist/formats/dds/core/helpers.js.map +1 -1
  39. package/dist/formats/dxbc/CjsDxbcFormat.js +45 -0
  40. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
  41. package/dist/formats/dxbc/core/disassemble.js +240 -0
  42. package/dist/formats/dxbc/core/disassemble.js.map +1 -0
  43. package/dist/formats/gltf/CjsGltfFormat.js +1 -39
  44. package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
  45. package/dist/formats/gltf/core/helpers.js +1 -21
  46. package/dist/formats/gltf/core/helpers.js.map +1 -1
  47. package/dist/formats/hlsl/CjsHlslFormat.js +0 -21
  48. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
  49. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +118 -49
  50. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
  51. package/dist/formats/hlsl/core/detailMapFamily.js +128 -0
  52. package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -0
  53. package/dist/formats/hlsl/core/localLightFamily.js +133 -0
  54. package/dist/formats/hlsl/core/localLightFamily.js.map +1 -0
  55. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +79 -73
  56. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
  57. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +8 -1
  58. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
  59. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +11 -691
  60. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -1
  61. package/dist/formats/index.js +4 -2
  62. package/dist/formats/index.js.map +1 -1
  63. package/dist/formats/obj/CjsObjFormat.js +1 -22
  64. package/dist/formats/obj/CjsObjFormat.js.map +1 -1
  65. package/dist/formats/obj/core/helpers.js +1 -21
  66. package/dist/formats/obj/core/helpers.js.map +1 -1
  67. package/dist/formats/pickle/CjsPickleFormat.js +214 -0
  68. package/dist/formats/pickle/CjsPickleFormat.js.map +1 -0
  69. package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -0
  70. package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -0
  71. package/dist/formats/pickle/index.js +2 -0
  72. package/dist/formats/pickle/index.js.map +1 -0
  73. package/dist/formats/red/core/redGraph.js +11 -8
  74. package/dist/formats/red/core/redGraph.js.map +1 -1
  75. package/dist/formats/stl/CjsStlFormat.js +1 -46
  76. package/dist/formats/stl/CjsStlFormat.js.map +1 -1
  77. package/dist/formats/stl/core/helpers.js +1 -21
  78. package/dist/formats/stl/core/helpers.js.map +1 -1
  79. package/dist/formats/webgl/CjsWebglFormat.js +33 -55
  80. package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
  81. package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -0
  82. package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -0
  83. package/dist/formats/webgl/core/effectPackage.js +216 -108
  84. package/dist/formats/webgl/core/effectPackage.js.map +1 -1
  85. package/dist/formats/webgl/core/errors.js +1 -1
  86. package/dist/formats/webgl/core/errors.js.map +1 -1
  87. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +166 -24
  88. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  89. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +63 -5
  90. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
  91. package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -0
  92. package/dist/formats/webgl/core/glsl/packedLightFixups.js.map +1 -0
  93. package/dist/formats/webgl/core/glslBackendBlock.js +552 -0
  94. package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -0
  95. package/dist/formats/webgl/core/glslBackendBodySet.js +243 -0
  96. package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -0
  97. package/dist/formats/webgl/core/{cewgCompleteness.js → glslEffectCompleteness.js} +12 -8
  98. package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -0
  99. package/dist/formats/webgl/core/helpers.js +33 -172
  100. package/dist/formats/webgl/core/helpers.js.map +1 -1
  101. package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -0
  102. package/dist/formats/webgl/core/inspectGlslEffectContainer.js.map +1 -0
  103. package/dist/formats/webgl/core/readGlslEffectContainer.js +249 -0
  104. package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -0
  105. package/dist/formats/webgpu/CjsWebgpuFormat.js +15 -15
  106. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  107. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +37 -145
  108. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
  109. package/dist/formats/webgpu/core/{cewgpu/CewgpuContainer.js → carbonWebgpu/CarbonWebgpuContainer.js} +13 -27
  110. package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -0
  111. package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/containerViews.js +1 -1
  112. package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -0
  113. package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/validateContainer.js +4 -4
  114. package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -0
  115. package/dist/formats/webgpu/core/effectBackendBodySet.js +18 -18
  116. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  117. package/dist/formats/webgpu/core/errors.js +1 -1
  118. package/dist/formats/webgpu/core/errors.js.map +1 -1
  119. package/dist/formats/webgpu/core/helpers.js +22 -22
  120. package/dist/formats/webgpu/core/helpers.js.map +1 -1
  121. package/dist/formats/webgpu/core/packageEffect.js +11 -15
  122. package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
  123. package/dist/formats/webgpu/core/packageEffectSelection.js +1 -1
  124. package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -1
  125. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +23 -23
  126. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
  127. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +6 -6
  128. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
  129. package/dist/formats/yaml/CjsYamlFormat.js +3 -3
  130. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  131. package/dist/formats/yaml/core/CjsYamlReader.js +4 -6
  132. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  133. package/dist/formats/yaml/core/helpers.js +27 -1
  134. package/dist/formats/yaml/core/helpers.js.map +1 -1
  135. package/dist/index.js +2 -0
  136. package/dist/index.js.map +1 -1
  137. package/dist/resource/CjsLoadingObject.js +19 -0
  138. package/dist/resource/CjsLoadingObject.js.map +1 -0
  139. package/dist/resource/CjsResource.js +4 -0
  140. package/dist/resource/CjsResource.js.map +1 -1
  141. package/dist/resource/ResourceHandlerMode.js +14 -0
  142. package/dist/resource/ResourceHandlerMode.js.map +1 -0
  143. package/dist/resource/index.js +2 -0
  144. package/dist/resource/index.js.map +1 -1
  145. package/dist/resource/shader/Tr2EffectRes.js +118 -213
  146. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  147. package/dist/resource/shader/Tr2Shader.js +37 -15
  148. package/dist/resource/shader/Tr2Shader.js.map +1 -1
  149. package/dist/resource/shader/reflection/Tr2EffectConstant.js +37 -29
  150. package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
  151. package/dist/resource/shader/reflection/Tr2EffectDescription.js +39 -34
  152. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
  153. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +51 -30
  154. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
  155. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +45 -25
  156. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
  157. package/dist/resource/shader/reflection/Tr2EffectResource.js +51 -17
  158. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  159. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +219 -88
  160. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  161. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +28 -18
  162. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
  163. package/dist/resource/shader/reflection/Tr2Pass.js +96 -39
  164. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  165. package/dist/resource/shader/reflection/carbonRecordFields.js +159 -0
  166. package/dist/resource/shader/reflection/carbonRecordFields.js.map +1 -0
  167. package/dist/resource/shader/reflection/shaderStage.js +22 -0
  168. package/dist/resource/shader/reflection/shaderStage.js.map +1 -0
  169. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +68 -10
  170. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
  171. package/dist/worker/CjsResManMainThreadLoader.js +9 -7
  172. package/dist/worker/CjsResManMainThreadLoader.js.map +1 -1
  173. package/dist/worker/CjsResManWorker.js +5 -4
  174. package/dist/worker/CjsResManWorker.js.map +1 -1
  175. package/dist/worker/CjsResManWorkerLoader.js +9 -6
  176. package/dist/worker/CjsResManWorkerLoader.js.map +1 -1
  177. package/docs/README.md +2 -2
  178. package/docs/architecture.md +12 -3
  179. package/docs/concepts/resource-lifecycle.md +9 -8
  180. package/docs/concepts/shader-resource-model.md +14 -17
  181. package/docs/concepts/writing-an-engine-adapter.md +1 -1
  182. package/docs/formats/README.md +4 -2
  183. package/docs/formats/carbon-effect-container.md +127 -26
  184. package/docs/formats/dxbc/architecture.md +1 -1
  185. package/docs/formats/dxbc/reference/api.md +28 -0
  186. package/docs/formats/hlsl/README.md +3 -3
  187. package/docs/formats/hlsl/architecture.md +8 -9
  188. package/docs/formats/hlsl/guides/hydrating-json-output.md +3 -5
  189. package/docs/formats/hlsl/guides/reading-effects.md +5 -1
  190. package/docs/formats/hlsl/reference/advanced-analysis.md +20 -25
  191. package/docs/formats/hlsl/reference/api.md +0 -7
  192. package/docs/formats/hlsl/reference/json-graph.md +1 -4
  193. package/docs/formats/pickle.md +82 -0
  194. package/docs/formats/webgl/README.md +71 -13
  195. package/docs/formats/webgl/architecture.md +16 -17
  196. package/docs/formats/webgl/carbon-constant-layouts.md +3 -3
  197. package/docs/formats/webgl/decl-io.md +3 -3
  198. package/docs/formats/webgl/memory-structured.md +27 -8
  199. package/docs/formats/webgl/texture-sample.md +1 -1
  200. package/docs/formats/webgpu/README.md +3 -3
  201. package/docs/formats/webgpu/architecture.md +5 -6
  202. package/docs/formats/webgpu/formats/{cewgpu.md → carbon-webgpu.md} +10 -11
  203. package/docs/formats/webgpu/guides/effect-packaging.md +6 -8
  204. package/docs/formats/webgpu/reference/api.md +11 -12
  205. package/docs/formats/webgpu/reference/wgsl-compatibility.md +11 -8
  206. package/docs/formats/wwise.md +63 -2
  207. package/docs/reference/classes/core.md +10 -0
  208. package/docs/reference/classes/formats.md +40 -48
  209. package/docs/reference/classes/resources.md +2 -2
  210. package/docs/reference/queues.md +88 -4
  211. package/docs/reference/workers.md +7 -0
  212. package/package.json +61 -61
  213. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +0 -372
  214. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +0 -1
  215. package/dist/format/effect/effectReflectionPackage.js +0 -636
  216. package/dist/format/effect/effectReflectionPackage.js.map +0 -1
  217. package/dist/formats/hlsl/core/HlslReader.js +0 -16
  218. package/dist/formats/hlsl/core/HlslReader.js.map +0 -1
  219. package/dist/formats/hlsl/core/portableReflection.js +0 -848
  220. package/dist/formats/hlsl/core/portableReflection.js.map +0 -1
  221. package/dist/formats/hlsl/portable.js +0 -2
  222. package/dist/formats/hlsl/portable.js.map +0 -1
  223. package/dist/formats/webgl/core/cewg/CewgPackage.js +0 -340
  224. package/dist/formats/webgl/core/cewg/CewgPackage.js.map +0 -1
  225. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +0 -104
  226. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +0 -1
  227. package/dist/formats/webgl/core/cewg/binary.js +0 -19
  228. package/dist/formats/webgl/core/cewg/binary.js.map +0 -1
  229. package/dist/formats/webgl/core/cewgCompleteness.js.map +0 -1
  230. package/dist/formats/webgl/core/effectPackageValidation.js +0 -331
  231. package/dist/formats/webgl/core/effectPackageValidation.js.map +0 -1
  232. package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +0 -1
  233. package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +0 -1
  234. package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +0 -1
  235. package/dist/resource/shader/portable.js +0 -33
  236. package/dist/resource/shader/portable.js.map +0 -1
  237. package/docs/formats/hlsl/reference/portable-reflection.md +0 -141
  238. package/docs/formats/webgl/effect-reflection.md +0 -127
@@ -1,18 +1,28 @@
1
1
  import { CjsSchema, impl, type } from '@carbonenginejs/runtime-utils/schema';
2
2
  import { CjsModel } from '@carbonenginejs/runtime-utils/model';
3
3
  import { copyBytes } from '@carbonenginejs/runtime-utils/bytes';
4
- import { isPlainObject, isArray, isUint32 } from '@carbonenginejs/runtime-utils/is';
5
- import { cloneCarbonValue } from '@carbonenginejs/runtime-utils/types';
6
- import { requirePortableStageType, clonePortableSourceProgram } from '../portable.js';
7
- import { validateEffectBodyInput } from '../../../formats/hlsl/core/portableReflection.js';
4
+ import { isPlainObject, isUint32 } from '@carbonenginejs/runtime-utils/is';
8
5
  import { Tr2SamplerSetup } from '../sampler/Tr2SamplerSetup.js';
9
6
  import { Tr2EffectConstant } from './Tr2EffectConstant.js';
10
7
  import { Tr2EffectParameterAnnotation } from './Tr2EffectParameterAnnotation.js';
11
8
  import { Tr2EffectResource } from './Tr2EffectResource.js';
9
+ import { recordBytes, recordRawBits, toRecordBlob, toRecordFloat } from './carbonRecordFields.js';
10
+ import { compareUtf8 } from '../../../format/compareUtf8.js';
11
+ import { requireShaderStageType } from './shaderStage.js';
12
12
 
13
13
  // Source: trinity/trinity/Shader/Tr2EffectDescription.h
14
14
  // Source: trinity/trinity/Shader/Tr2EffectDescription.cpp
15
15
 
16
+ /**
17
+ * The offset word a zero-size blob carries, or the null sentinel.
18
+ *
19
+ * @param {{size:number,offset:number}} ref Blob reference.
20
+ * @returns {number} Offset word worth retaining.
21
+ */
22
+ function unsetOffsetOf(ref) {
23
+ return ref.size === 0 ? ref.offset : 0xffffffff;
24
+ }
25
+
16
26
  /** Complete device-free reflection for one shader stage input. */
17
27
  class Tr2EffectStageInput extends CjsModel {
18
28
  /** Portable stage index; Carbon otherwise implies this from the containing array. */
@@ -78,124 +88,244 @@ class Tr2EffectStageInput extends CjsModel {
78
88
  }
79
89
 
80
90
  /**
81
- * Build one stage input from its complete portable JSON stage record.
91
+ * Hydrate one canonical stage input from a decoded Carbon binary record.
82
92
  *
83
- * @param {object} value Portable stage record.
84
- * @returns {Tr2EffectStageInput} Reflected stage input.
93
+ * @param {object} record Decoded Carbon stage record.
94
+ * @returns {Tr2EffectStageInput} Hydrated canonical stage input.
85
95
  */
86
- static fromPortable(value) {
87
- if (!isPlainObject(value)) {
88
- throw new TypeError("Portable effect stage must be an object");
96
+ static fromCarbonBinary(record) {
97
+ if (!isPlainObject(record)) {
98
+ throw new TypeError("Carbon effect stage record must be an object");
89
99
  }
90
- const stageType = requirePortableStageType(value.stageType);
91
- return this.fromPortableInput(value.input, stageType, value.sourceProgram);
100
+ const input = this.fromCarbonBinaryInput(record, record.type);
101
+ input.signature.pipelineInputCount = record.pipelineInputs.length;
102
+ input.signature.pipelineInputs = record.pipelineInputs.map(entry => ({
103
+ usage: entry.usage,
104
+ registerIndex: entry.registerIndex,
105
+ usageIndex: entry.usageIndex,
106
+ usedMask: entry.usedMask,
107
+ type: entry.type,
108
+ dimension: entry.dimension
109
+ }));
110
+ input.signature.threadGroupSize = {
111
+ x: record.threadGroupSize[0],
112
+ y: record.threadGroupSize[1],
113
+ z: record.threadGroupSize[2]
114
+ };
115
+ input.sourceProgram = {
116
+ kind: "stage",
117
+ bytes: copyBytes(recordBytes(record.shaderData)),
118
+ shaderSize: record.shaderData.size,
119
+ // Meaningful only at size zero, where the writer passes the word through
120
+ // rather than interning. At any other size it is a live arena offset that
121
+ // belongs to the container it was read from, so it is not retained.
122
+ unsetOffset: unsetOffsetOf(record.shaderData)
123
+ };
124
+ return input;
92
125
  }
93
126
 
94
127
  /**
95
- * Build one input record used by a render stage or shader library.
128
+ * Build one stage input from a Carbon v15 `StageData` block.
129
+ *
130
+ * A raytracing library's global and local inputs are the same block without a
131
+ * stage wrapper — no stage type, no pipeline inputs, no thread group, no
132
+ * program of their own — so this is the half both callers share and
133
+ * `fromCarbonBinary` is the stage-only remainder layered on top.
134
+ *
135
+ * Carbon writes textures, samplers and UAVs in ascending register order because
136
+ * they are `std::map`s, and they are re-keyed by register here rather than by
137
+ * position, so the map is authoritative and the record's order is not load
138
+ * bearing.
96
139
  *
97
- * @param {object} value Portable input record.
98
- * @param {number} stageType Stage index, or -1 for a library input.
99
- * @param {object|null} sourceProgram Optional stage source program.
100
- * @returns {Tr2EffectStageInput} Reflected input.
140
+ * @param {object} record Carbon stage-data record.
141
+ * @param {number} [stageType] Stage index, or -1 for a library input.
142
+ * @returns {Tr2EffectStageInput} Reflected stage input.
101
143
  */
102
- static fromPortableInput(value, stageType = -1, sourceProgram = null) {
103
- if (!isPlainObject(value)) {
104
- throw new TypeError("Portable effect stage input must be an object");
105
- }
106
- validateEffectBodyInput(value);
107
- if (!isArray(value.constants)) {
108
- throw new TypeError("Portable effect constants must be an array");
109
- }
110
- if (!isArray(value.resources)) {
111
- throw new TypeError("Portable effect resources must be an array");
112
- }
113
- if (!isArray(value.uavs)) {
114
- throw new TypeError("Portable effect UAVs must be an array");
115
- }
116
- if (!isArray(value.samplers)) {
117
- throw new TypeError("Portable effect samplers must be an array");
118
- }
119
- if (!isArray(value.annotations)) {
120
- throw new TypeError("Portable effect stage annotations must be an array");
121
- }
122
- if (!isPlainObject(value.constantDefaults)) {
123
- throw new TypeError("Portable effect constant defaults must be an object");
124
- }
125
- if (!(value.constantDefaults.bytes instanceof Uint8Array)) {
126
- throw new TypeError("Portable effect constant defaults must be Uint8Array bytes");
127
- }
128
- const defaults = value.constantDefaults;
129
- const constantValues = copyBytes(defaults.bytes);
130
- if (defaults.declaredByteLength !== constantValues.byteLength) {
131
- throw new Error("Portable effect constant defaults disagree with their declared byte length");
144
+ static fromCarbonBinaryInput(record, stageType = -1) {
145
+ if (!isPlainObject(record)) {
146
+ throw new TypeError("Carbon effect stage-data record must be an object");
132
147
  }
148
+ const constantValues = copyBytes(recordBytes(record.defaultValues));
133
149
  const input = new this();
134
150
  input.stageType = stageType;
135
151
  input.exists = true;
136
- input.constants = value.constants.map(entry => Tr2EffectConstant.fromPortable(entry));
137
- input.resources = this.readPortableResourceMap(value.resources);
138
- input.uavs = this.readPortableResourceMap(value.uavs);
139
- input.samplers = this.readPortableSamplerMap(value.samplers);
152
+ input.constants = record.constants.map(entry => Tr2EffectConstant.fromCarbonBinary(entry));
153
+ input.resources = this.readCarbonBinaryResourceMap(record.textures);
154
+ input.uavs = this.readCarbonBinaryResourceMap(record.uavs);
155
+ input.samplers = this.readCarbonBinarySamplerMap(record.samplers);
140
156
  input.constantValueSize = constantValues.byteLength;
141
157
  input.constantValues = constantValues;
142
- input.signature = cloneCarbonValue(value.signature);
143
- input.annotation = value.annotations.map(entry => Tr2EffectParameterAnnotation.fromPortable(entry));
144
- input.sourceProgram = sourceProgram ? clonePortableSourceProgram(sourceProgram, "stage") : null;
158
+ input.constantValuesUnsetOffset = unsetOffsetOf(record.defaultValues);
159
+ input.annotation = record.annotations.map(entry => Tr2EffectParameterAnnotation.fromCarbonBinary(entry));
160
+ input.signature = {
161
+ pipelineInputCount: 0,
162
+ pipelineInputs: [],
163
+ registerCount: record.registers.length,
164
+ // Carbon stores one field its reader calls `arrayCount` and its writer
165
+ // calls `registerCount`. Both names are carried forward from the single
166
+ // stored value, because the write direction refuses to emit a record whose
167
+ // two names disagree.
168
+ registers: record.registers.map(entry => ({
169
+ registerType: entry.registerType,
170
+ registerIndex: entry.registerIndex,
171
+ arrayCount: entry.registerCount,
172
+ registerCount: entry.registerCount,
173
+ registerSpace: entry.registerSpace
174
+ })),
175
+ staticSamplerCount: record.staticSamplers.length,
176
+ staticSamplers: record.staticSamplers.map(entry => ({
177
+ registerIndex: entry.registerIndex,
178
+ registerSpace: entry.registerSpace,
179
+ descriptor: {
180
+ comparison: !!entry.comparison,
181
+ minFilter: entry.minFilter,
182
+ magFilter: entry.magFilter,
183
+ mipFilter: entry.mipFilter,
184
+ addressU: entry.addressU,
185
+ addressV: entry.addressV,
186
+ addressW: entry.addressW,
187
+ mipLODBiasRaw: recordRawBits(entry.mipLODBias),
188
+ maxAnisotropy: entry.maxAnisotropy,
189
+ comparisonFunc: entry.comparisonFunc,
190
+ // A static sampler's border colour is a one-byte enum, not four
191
+ // floats. Sharing the dynamic sampler's mapping here would silently
192
+ // reinterpret it.
193
+ borderColor: entry.borderColor,
194
+ minLODRaw: recordRawBits(entry.minLOD),
195
+ maxLODRaw: recordRawBits(entry.maxLOD)
196
+ }
197
+ })),
198
+ threadGroupSize: {
199
+ x: 0,
200
+ y: 0,
201
+ z: 0
202
+ }
203
+ };
204
+ input.sourceProgram = null;
145
205
  return input;
146
206
  }
147
207
 
148
208
  /**
149
- * Create one explicit absent stage slot.
209
+ * Emit this stage as a Carbon v15 stage record.
150
210
  *
151
- * @param {number} stageType Stage index.
152
- * @returns {Tr2EffectStageInput} Empty stage input.
211
+ * @returns {object} Carbon stage record.
153
212
  */
154
- static createEmpty(stageType) {
155
- const stage = new this();
156
- stage.stageType = requirePortableStageType(stageType);
157
- return stage;
213
+ toCarbonBinary() {
214
+ const signature = this.signature ?? {};
215
+ const program = this.sourceProgram ?? {};
216
+ return {
217
+ type: this.stageType,
218
+ shaderData: toRecordBlob(program.bytes, program.shaderSize, program.unsetOffset),
219
+ threadGroupSize: [signature.threadGroupSize?.x ?? 0, signature.threadGroupSize?.y ?? 0, signature.threadGroupSize?.z ?? 0],
220
+ pipelineInputs: (signature.pipelineInputs ?? []).map(entry => ({
221
+ usage: entry.usage,
222
+ registerIndex: entry.registerIndex,
223
+ usageIndex: entry.usageIndex,
224
+ usedMask: entry.usedMask,
225
+ type: entry.type,
226
+ dimension: entry.dimension
227
+ })),
228
+ ...this.toCarbonBinaryInput()
229
+ };
230
+ }
231
+
232
+ /**
233
+ * Emit this input as a Carbon v15 `StageData` block.
234
+ *
235
+ * Carbon holds textures, samplers, UAVs and render states in `std::map`s and
236
+ * writes them in key order, and it sorts annotation names by `strcmp` before
237
+ * writing. Our maps are keyed but not ordered, so every collection is sorted
238
+ * explicitly here rather than trusting insertion order — the reader is
239
+ * indifferent, but the bytes are not, and a container that disagrees with
240
+ * Carbon's ordering is not the file Carbon would have written.
241
+ *
242
+ * @returns {object} Carbon stage-data record.
243
+ */
244
+ toCarbonBinaryInput() {
245
+ const byRegister = (left, right) => left.registerIndex - right.registerIndex;
246
+ const signature = this.signature ?? {};
247
+ return {
248
+ registers: (signature.registers ?? []).map(entry => ({
249
+ registerType: entry.registerType,
250
+ registerIndex: entry.registerIndex,
251
+ registerCount: entry.registerCount,
252
+ registerSpace: entry.registerSpace
253
+ })),
254
+ staticSamplers: (signature.staticSamplers ?? []).map(entry => {
255
+ const descriptor = entry.descriptor ?? {};
256
+ return {
257
+ registerIndex: entry.registerIndex,
258
+ registerSpace: entry.registerSpace,
259
+ comparison: descriptor.comparison ? 1 : 0,
260
+ minFilter: descriptor.minFilter,
261
+ magFilter: descriptor.magFilter,
262
+ mipFilter: descriptor.mipFilter,
263
+ addressU: descriptor.addressU,
264
+ addressV: descriptor.addressV,
265
+ addressW: descriptor.addressW,
266
+ mipLODBias: toRecordFloat(descriptor.mipLODBiasRaw),
267
+ maxAnisotropy: descriptor.maxAnisotropy,
268
+ comparisonFunc: descriptor.comparisonFunc,
269
+ // One byte here, four floats on a dynamic sampler.
270
+ borderColor: descriptor.borderColor,
271
+ minLOD: toRecordFloat(descriptor.minLODRaw),
272
+ maxLOD: toRecordFloat(descriptor.maxLODRaw)
273
+ };
274
+ }),
275
+ constants: this.constants.map(constant => constant.toCarbonBinary()),
276
+ defaultValues: toRecordBlob(this.constantValues, this.constantValueSize, this.constantValuesUnsetOffset),
277
+ textures: Array.from(this.resources, ([register, resource]) => resource.toCarbonBinary(register)).sort(byRegister),
278
+ samplers: Array.from(this.samplers, ([register, sampler]) => sampler.toCarbonBinary(register)).sort(byRegister),
279
+ uavs: Array.from(this.uavs, ([register, uav]) => uav.toCarbonBinary(register, true)).sort(byRegister),
280
+ annotations: this.annotation.map(entry => entry.toCarbonBinary()).sort((left, right) => compareUtf8(left.name.value, right.name.value))
281
+ };
158
282
  }
159
283
 
160
- /** Build one register-indexed portable resource map. */
161
- static readPortableResourceMap(values) {
284
+ /** Build one register-indexed resource map from Carbon texture or UAV records. */
285
+ static readCarbonBinaryResourceMap(records) {
162
286
  const result = new Map();
163
- for (const value of values) {
164
- if (!isPlainObject(value)) {
165
- throw new TypeError("Portable effect resource must be an object");
166
- }
167
- if (!isUint32(value.registerIndex)) {
168
- throw new RangeError("Portable resource register index must fit uint32");
169
- }
170
- const registerIndex = value.registerIndex;
171
- if (result.has(registerIndex)) {
172
- throw new Error(`Portable effect resource register ${registerIndex} is duplicated`);
287
+ for (const record of records) {
288
+ if (result.has(record.registerIndex)) {
289
+ throw new Error(`Carbon effect resource register ${record.registerIndex} is duplicated`);
173
290
  }
174
- result.set(registerIndex, Tr2EffectResource.fromPortable(value));
291
+ result.set(record.registerIndex, Tr2EffectResource.fromCarbonBinary(record));
175
292
  }
176
293
  return result;
177
294
  }
178
295
 
179
- /** Build one register-indexed portable sampler map. */
180
- static readPortableSamplerMap(values) {
296
+ /** Build one register-indexed sampler map from Carbon sampler records. */
297
+ static readCarbonBinarySamplerMap(records) {
181
298
  const result = new Map();
182
- for (const value of values) {
183
- if (!isPlainObject(value)) {
184
- throw new TypeError("Portable effect sampler must be an object");
185
- }
186
- if (!isUint32(value.registerIndex)) {
187
- throw new RangeError("Portable sampler register index must fit uint32");
188
- }
189
- const registerIndex = value.registerIndex;
190
- if (result.has(registerIndex)) {
191
- throw new Error(`Portable effect sampler register ${registerIndex} is duplicated`);
299
+ for (const record of records) {
300
+ if (result.has(record.registerIndex)) {
301
+ throw new Error(`Carbon effect sampler register ${record.registerIndex} is duplicated`);
192
302
  }
193
- result.set(registerIndex, Tr2SamplerSetup.fromPortable(value));
303
+ result.set(record.registerIndex, Tr2SamplerSetup.fromCarbonBinary(record));
194
304
  }
195
305
  return result;
196
306
  }
197
307
 
198
- /** Hydrate one numeric-register map from canonical JS/JSON values. */
308
+ /**
309
+ * Create one explicit absent stage slot.
310
+ *
311
+ * @param {number} stageType Stage index.
312
+ * @returns {Tr2EffectStageInput} Empty stage input.
313
+ */
314
+ static createEmpty(stageType) {
315
+ const stage = new this();
316
+ stage.stageType = requireShaderStageType(stageType);
317
+ return stage;
318
+ }
319
+
320
+ /**
321
+ * Normalize one register-indexed collection into its canonical typed map.
322
+ *
323
+ * @param {Map|object} values Register-indexed source values.
324
+ * @param {Function} Constructor Entry constructor exposing `from`.
325
+ * @param {object} options Hydration options passed to entry construction.
326
+ * @param {string} field Diagnostic field name.
327
+ * @returns {Map<number, *>} Canonical register map.
328
+ */
199
329
  static readCanonicalRegisterMap(values, Constructor, options, field) {
200
330
  const entries = values instanceof Map ? values : Object.entries(values ?? {});
201
331
  const result = new Map();
@@ -231,6 +361,7 @@ CjsSchema.define(Tr2EffectStageInput, {
231
361
  constants: type.list("Tr2EffectConstant"),
232
362
  constantValueSize: type.uint32,
233
363
  constantValues: type.typedArray("Uint8Array"),
364
+ constantValuesUnsetOffset: [impl.custom, impl.reason("A zero-size blob's offset word is passed through rather than interned, and the shipped corpus does not always set it to the null sentinel; the graph retains it so a body re-emits as the file that produced it."), type.uint32],
234
365
  signature: type.rawStruct("Tr2ShaderSignatureAL"),
235
366
  annotation: type.list("Tr2EffectParameterAnnotation"),
236
367
  sourceProgram: [impl.adapted, impl.reason("Carbon replaces source program data with renderer handles while reading; the device-free resource graph must retain the portable source program for later engine realization."), type.rawStruct("CjsEffectSourceProgram")]
@@ -1 +1 @@
1
- {"version":3,"file":"Tr2EffectStageInput.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectStageInput.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\n// Source: trinity/trinity/Shader/Tr2EffectDescription.cpp\nimport { CjsSchema, impl, type } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\nimport { copyBytes } from \"@carbonenginejs/runtime-utils/bytes\";\nimport {\n isArray,\n isPlainObject,\n isUint32\n} from \"@carbonenginejs/runtime-utils/is\";\nimport { cloneCarbonValue } from \"@carbonenginejs/runtime-utils/types\";\nimport {\n clonePortableSourceProgram,\n requirePortableStageType\n} from \"../portable.js\";\nimport { validateEffectBodyInput } from \"../../../formats/hlsl/portable.js\";\nimport { Tr2SamplerSetup } from \"../sampler/Tr2SamplerSetup.js\";\nimport { Tr2EffectConstant } from \"./Tr2EffectConstant.js\";\nimport { Tr2EffectParameterAnnotation } from \"./Tr2EffectParameterAnnotation.js\";\nimport { Tr2EffectResource } from \"./Tr2EffectResource.js\";\n\n/** Complete device-free reflection for one shader stage input. */\nexport class Tr2EffectStageInput extends CjsModel\n{\n\n /** Portable stage index; Carbon otherwise implies this from the containing array. */\n stageType = -1;\n\n /** m_exists (bool) */\n exists = false;\n\n /** resources (Tr2EffectResourceMap) */\n resources = new Map();\n\n /** uavs (Tr2EffectResourceMap) */\n uavs = new Map();\n\n /** samplers (Tr2SamplerSetupMap) */\n samplers = new Map();\n\n /** m_shader (unsigned) */\n shader = 0xffffffff;\n\n /** constants (Tr2EffectConstantVector) */\n constants = [];\n\n /** m_constantValueSize (unsigned) */\n constantValueSize = 0;\n\n /** constantValues (char[SHADER_CONSTANTS_MAX]) */\n constantValues = new Uint8Array(0);\n\n /** signature (Tr2ShaderSignatureAL) */\n signature = null;\n\n /** annotation (Tr2EffectParameterAnnotationMap) */\n annotation = [];\n\n /** Exact source program metadata and owned bytes, before backend realization. */\n sourceProgram = null;\n\n /**\n * Construct one canonical stage input from JS/JSON model values.\n *\n * @param {object} values Canonical model values.\n * @param {object} options CjsModel import options.\n * @returns {Tr2EffectStageInput} Hydrated stage input.\n */\n static from(values = {}, options = {})\n {\n let normalized = values;\n const maps = new Map();\n for (const [ field, Constructor ] of [\n [ \"resources\", Tr2EffectResource ],\n [ \"uavs\", Tr2EffectResource ],\n [ \"samplers\", Tr2SamplerSetup ]\n ])\n {\n if (values && Object.hasOwn(values, field))\n {\n normalized = normalized === values ? { ...values } : normalized;\n normalized[field] = this.readCanonicalRegisterMap(\n values[field],\n Constructor,\n options,\n field\n );\n maps.set(field, normalized[field]);\n }\n }\n const stage = super.from(normalized, options);\n for (const [ field, value ] of maps)\n {\n stage[field] = value;\n }\n return stage;\n }\n\n /**\n * Build one stage input from its complete portable JSON stage record.\n *\n * @param {object} value Portable stage record.\n * @returns {Tr2EffectStageInput} Reflected stage input.\n */\n static fromPortable(value)\n {\n if (!isPlainObject(value))\n {\n throw new TypeError(\"Portable effect stage must be an object\");\n }\n const stageType = requirePortableStageType(value.stageType);\n return this.fromPortableInput(\n value.input,\n stageType,\n value.sourceProgram\n );\n }\n\n /**\n * Build one input record used by a render stage or shader library.\n *\n * @param {object} value Portable input record.\n * @param {number} stageType Stage index, or -1 for a library input.\n * @param {object|null} sourceProgram Optional stage source program.\n * @returns {Tr2EffectStageInput} Reflected input.\n */\n static fromPortableInput(value, stageType = -1, sourceProgram = null)\n {\n if (!isPlainObject(value))\n {\n throw new TypeError(\"Portable effect stage input must be an object\");\n }\n validateEffectBodyInput(value);\n if (!isArray(value.constants))\n {\n throw new TypeError(\"Portable effect constants must be an array\");\n }\n if (!isArray(value.resources))\n {\n throw new TypeError(\"Portable effect resources must be an array\");\n }\n if (!isArray(value.uavs))\n {\n throw new TypeError(\"Portable effect UAVs must be an array\");\n }\n if (!isArray(value.samplers))\n {\n throw new TypeError(\"Portable effect samplers must be an array\");\n }\n if (!isArray(value.annotations))\n {\n throw new TypeError(\n \"Portable effect stage annotations must be an array\"\n );\n }\n if (!isPlainObject(value.constantDefaults))\n {\n throw new TypeError(\n \"Portable effect constant defaults must be an object\"\n );\n }\n if (!(value.constantDefaults.bytes instanceof Uint8Array))\n {\n throw new TypeError(\n \"Portable effect constant defaults must be Uint8Array bytes\"\n );\n }\n\n const defaults = value.constantDefaults;\n const constantValues = copyBytes(defaults.bytes);\n if (defaults.declaredByteLength !== constantValues.byteLength)\n {\n throw new Error(\n \"Portable effect constant defaults disagree with their declared byte length\"\n );\n }\n\n const input = new this();\n input.stageType = stageType;\n input.exists = true;\n input.constants = value.constants.map(\n entry => Tr2EffectConstant.fromPortable(entry)\n );\n input.resources = this.readPortableResourceMap(value.resources);\n input.uavs = this.readPortableResourceMap(value.uavs);\n input.samplers = this.readPortableSamplerMap(value.samplers);\n input.constantValueSize = constantValues.byteLength;\n input.constantValues = constantValues;\n input.signature = cloneCarbonValue(value.signature);\n input.annotation = value.annotations.map(\n entry => Tr2EffectParameterAnnotation.fromPortable(entry)\n );\n input.sourceProgram = sourceProgram\n ? clonePortableSourceProgram(sourceProgram, \"stage\")\n : null;\n return input;\n }\n\n /**\n * Create one explicit absent stage slot.\n *\n * @param {number} stageType Stage index.\n * @returns {Tr2EffectStageInput} Empty stage input.\n */\n static createEmpty(stageType)\n {\n const stage = new this();\n stage.stageType = requirePortableStageType(stageType);\n return stage;\n }\n\n /** Build one register-indexed portable resource map. */\n static readPortableResourceMap(values)\n {\n const result = new Map();\n for (const value of values)\n {\n if (!isPlainObject(value))\n {\n throw new TypeError(\"Portable effect resource must be an object\");\n }\n if (!isUint32(value.registerIndex))\n {\n throw new RangeError(\n \"Portable resource register index must fit uint32\"\n );\n }\n const registerIndex = value.registerIndex;\n if (result.has(registerIndex))\n {\n throw new Error(\n `Portable effect resource register ${registerIndex} is duplicated`\n );\n }\n result.set(\n registerIndex,\n Tr2EffectResource.fromPortable(value)\n );\n }\n return result;\n }\n\n /** Build one register-indexed portable sampler map. */\n static readPortableSamplerMap(values)\n {\n const result = new Map();\n for (const value of values)\n {\n if (!isPlainObject(value))\n {\n throw new TypeError(\"Portable effect sampler must be an object\");\n }\n if (!isUint32(value.registerIndex))\n {\n throw new RangeError(\n \"Portable sampler register index must fit uint32\"\n );\n }\n const registerIndex = value.registerIndex;\n if (result.has(registerIndex))\n {\n throw new Error(\n `Portable effect sampler register ${registerIndex} is duplicated`\n );\n }\n result.set(\n registerIndex,\n Tr2SamplerSetup.fromPortable(value)\n );\n }\n return result;\n }\n\n /** Hydrate one numeric-register map from canonical JS/JSON values. */\n static readCanonicalRegisterMap(values, Constructor, options, field)\n {\n const entries = values instanceof Map\n ? values\n : Object.entries(values ?? {});\n const result = new Map();\n for (const [ key, value ] of entries)\n {\n const registerIndex = Number(key);\n if (!isUint32(registerIndex))\n {\n throw new RangeError(\n `Effect ${field} register index must fit uint32`\n );\n }\n if (result.has(registerIndex))\n {\n throw new Error(\n `Effect ${field} register ${registerIndex} is duplicated`\n );\n }\n result.set(\n registerIndex,\n value instanceof Constructor\n ? value\n : Constructor.from(value, options)\n );\n }\n return result;\n }\n\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2EffectStageInput, {\n className: \"Tr2EffectStageInput\",\n family: \"shader\",\n fields: {\n stageType: [ impl.adapted, impl.reason(\"The source format identifies stage inputs by array index; the device-free graph retains the index explicitly for serialization and engine adapters.\"), type.int32 ],\n exists: type.boolean,\n resources: type.map(\"Tr2EffectResource\"),\n uavs: type.map(\"Tr2EffectResource\"),\n samplers: type.map(\"Tr2SamplerSetup\"),\n shader: type.uint32,\n constants: type.list(\"Tr2EffectConstant\"),\n constantValueSize: type.uint32,\n constantValues: type.typedArray(\"Uint8Array\"),\n signature: type.rawStruct(\"Tr2ShaderSignatureAL\"),\n annotation: type.list(\"Tr2EffectParameterAnnotation\"),\n sourceProgram: [ impl.adapted, impl.reason(\"Carbon replaces source program data with renderer handles while reading; the device-free resource graph must retain the portable source program for later engine realization.\"), type.rawStruct(\"CjsEffectSourceProgram\") ]\n }\n});\n"],"names":["Tr2EffectStageInput","CjsModel","stageType","exists","resources","Map","uavs","samplers","shader","constants","constantValueSize","constantValues","Uint8Array","signature","annotation","sourceProgram","from","values","options","normalized","maps","field","Constructor","Tr2EffectResource","Tr2SamplerSetup","Object","hasOwn","readCanonicalRegisterMap","set","stage","value","fromPortable","isPlainObject","TypeError","requirePortableStageType","fromPortableInput","input","validateEffectBodyInput","isArray","annotations","constantDefaults","bytes","defaults","copyBytes","declaredByteLength","byteLength","Error","map","entry","Tr2EffectConstant","readPortableResourceMap","readPortableSamplerMap","cloneCarbonValue","Tr2EffectParameterAnnotation","clonePortableSourceProgram","createEmpty","result","isUint32","registerIndex","RangeError","has","entries","key","Number","CjsSchema","define","className","family","fields","impl","adapted","reason","type","int32","boolean","uint32","list","typedArray","rawStruct"],"mappings":"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"}
1
+ {"version":3,"file":"Tr2EffectStageInput.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectStageInput.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\n// Source: trinity/trinity/Shader/Tr2EffectDescription.cpp\nimport { CjsSchema, impl, type } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\nimport { copyBytes } from \"@carbonenginejs/runtime-utils/bytes\";\nimport {\n isPlainObject,\n isUint32\n} from \"@carbonenginejs/runtime-utils/is\";\nimport { Tr2SamplerSetup } from \"../sampler/Tr2SamplerSetup.js\";\nimport { Tr2EffectConstant } from \"./Tr2EffectConstant.js\";\nimport { Tr2EffectParameterAnnotation } from \"./Tr2EffectParameterAnnotation.js\";\nimport { Tr2EffectResource } from \"./Tr2EffectResource.js\";\nimport {\n recordBytes,\n recordRawBits,\n toRecordBlob,\n toRecordFloat,\n toRecordText\n} from \"./carbonRecordFields.js\";\nimport { compareUtf8 } from \"../../../format/compareUtf8.js\";\nimport { requireShaderStageType } from \"./shaderStage.js\";\n\n/**\n * The offset word a zero-size blob carries, or the null sentinel.\n *\n * @param {{size:number,offset:number}} ref Blob reference.\n * @returns {number} Offset word worth retaining.\n */\nfunction unsetOffsetOf(ref)\n{\n return ref.size === 0 ? ref.offset : 0xffffffff;\n}\n\n/** Complete device-free reflection for one shader stage input. */\nexport class Tr2EffectStageInput extends CjsModel\n{\n\n /** Portable stage index; Carbon otherwise implies this from the containing array. */\n stageType = -1;\n\n /** m_exists (bool) */\n exists = false;\n\n /** resources (Tr2EffectResourceMap) */\n resources = new Map();\n\n /** uavs (Tr2EffectResourceMap) */\n uavs = new Map();\n\n /** samplers (Tr2SamplerSetupMap) */\n samplers = new Map();\n\n /** m_shader (unsigned) */\n shader = 0xffffffff;\n\n /** constants (Tr2EffectConstantVector) */\n constants = [];\n\n /** m_constantValueSize (unsigned) */\n constantValueSize = 0;\n\n /** constantValues (char[SHADER_CONSTANTS_MAX]) */\n constantValues = new Uint8Array(0);\n\n /** signature (Tr2ShaderSignatureAL) */\n signature = null;\n\n /** annotation (Tr2EffectParameterAnnotationMap) */\n annotation = [];\n\n /** Exact source program metadata and owned bytes, before backend realization. */\n sourceProgram = null;\n\n /**\n * Construct one canonical stage input from JS/JSON model values.\n *\n * @param {object} values Canonical model values.\n * @param {object} options CjsModel import options.\n * @returns {Tr2EffectStageInput} Hydrated stage input.\n */\n static from(values = {}, options = {})\n {\n let normalized = values;\n const maps = new Map();\n for (const [ field, Constructor ] of [\n [ \"resources\", Tr2EffectResource ],\n [ \"uavs\", Tr2EffectResource ],\n [ \"samplers\", Tr2SamplerSetup ]\n ])\n {\n if (values && Object.hasOwn(values, field))\n {\n normalized = normalized === values ? { ...values } : normalized;\n normalized[field] = this.readCanonicalRegisterMap(\n values[field],\n Constructor,\n options,\n field\n );\n maps.set(field, normalized[field]);\n }\n }\n const stage = super.from(normalized, options);\n for (const [ field, value ] of maps)\n {\n stage[field] = value;\n }\n return stage;\n }\n\n /**\n * Hydrate one canonical stage input from a decoded Carbon binary record.\n *\n * @param {object} record Decoded Carbon stage record.\n * @returns {Tr2EffectStageInput} Hydrated canonical stage input.\n */\n static fromCarbonBinary(record)\n {\n if (!isPlainObject(record))\n {\n throw new TypeError(\"Carbon effect stage record must be an object\");\n }\n\n const input = this.fromCarbonBinaryInput(record, record.type);\n input.signature.pipelineInputCount = record.pipelineInputs.length;\n input.signature.pipelineInputs = record.pipelineInputs.map(entry => ({\n usage: entry.usage,\n registerIndex: entry.registerIndex,\n usageIndex: entry.usageIndex,\n usedMask: entry.usedMask,\n type: entry.type,\n dimension: entry.dimension\n }));\n input.signature.threadGroupSize = {\n x: record.threadGroupSize[0],\n y: record.threadGroupSize[1],\n z: record.threadGroupSize[2]\n };\n input.sourceProgram = {\n kind: \"stage\",\n bytes: copyBytes(recordBytes(record.shaderData)),\n shaderSize: record.shaderData.size,\n // Meaningful only at size zero, where the writer passes the word through\n // rather than interning. At any other size it is a live arena offset that\n // belongs to the container it was read from, so it is not retained.\n unsetOffset: unsetOffsetOf(record.shaderData)\n };\n return input;\n }\n\n /**\n * Build one stage input from a Carbon v15 `StageData` block.\n *\n * A raytracing library's global and local inputs are the same block without a\n * stage wrapper — no stage type, no pipeline inputs, no thread group, no\n * program of their own — so this is the half both callers share and\n * `fromCarbonBinary` is the stage-only remainder layered on top.\n *\n * Carbon writes textures, samplers and UAVs in ascending register order because\n * they are `std::map`s, and they are re-keyed by register here rather than by\n * position, so the map is authoritative and the record's order is not load\n * bearing.\n *\n * @param {object} record Carbon stage-data record.\n * @param {number} [stageType] Stage index, or -1 for a library input.\n * @returns {Tr2EffectStageInput} Reflected stage input.\n */\n static fromCarbonBinaryInput(record, stageType = -1)\n {\n if (!isPlainObject(record))\n {\n throw new TypeError(\"Carbon effect stage-data record must be an object\");\n }\n\n const constantValues = copyBytes(recordBytes(record.defaultValues));\n\n const input = new this();\n input.stageType = stageType;\n input.exists = true;\n input.constants = record.constants.map(\n entry => Tr2EffectConstant.fromCarbonBinary(entry)\n );\n input.resources = this.readCarbonBinaryResourceMap(record.textures);\n input.uavs = this.readCarbonBinaryResourceMap(record.uavs);\n input.samplers = this.readCarbonBinarySamplerMap(record.samplers);\n input.constantValueSize = constantValues.byteLength;\n input.constantValues = constantValues;\n input.constantValuesUnsetOffset = unsetOffsetOf(record.defaultValues);\n input.annotation = record.annotations.map(\n entry => Tr2EffectParameterAnnotation.fromCarbonBinary(entry)\n );\n input.signature = {\n pipelineInputCount: 0,\n pipelineInputs: [],\n registerCount: record.registers.length,\n // Carbon stores one field its reader calls `arrayCount` and its writer\n // calls `registerCount`. Both names are carried forward from the single\n // stored value, because the write direction refuses to emit a record whose\n // two names disagree.\n registers: record.registers.map(entry => ({\n registerType: entry.registerType,\n registerIndex: entry.registerIndex,\n arrayCount: entry.registerCount,\n registerCount: entry.registerCount,\n registerSpace: entry.registerSpace\n })),\n staticSamplerCount: record.staticSamplers.length,\n staticSamplers: record.staticSamplers.map(entry => ({\n registerIndex: entry.registerIndex,\n registerSpace: entry.registerSpace,\n descriptor: {\n comparison: !!entry.comparison,\n minFilter: entry.minFilter,\n magFilter: entry.magFilter,\n mipFilter: entry.mipFilter,\n addressU: entry.addressU,\n addressV: entry.addressV,\n addressW: entry.addressW,\n mipLODBiasRaw: recordRawBits(entry.mipLODBias),\n maxAnisotropy: entry.maxAnisotropy,\n comparisonFunc: entry.comparisonFunc,\n // A static sampler's border colour is a one-byte enum, not four\n // floats. Sharing the dynamic sampler's mapping here would silently\n // reinterpret it.\n borderColor: entry.borderColor,\n minLODRaw: recordRawBits(entry.minLOD),\n maxLODRaw: recordRawBits(entry.maxLOD)\n }\n })),\n threadGroupSize: { x: 0, y: 0, z: 0 }\n };\n input.sourceProgram = null;\n return input;\n }\n\n /**\n * Emit this stage as a Carbon v15 stage record.\n *\n * @returns {object} Carbon stage record.\n */\n toCarbonBinary()\n {\n const signature = this.signature ?? {};\n const program = this.sourceProgram ?? {};\n return {\n type: this.stageType,\n shaderData: toRecordBlob(\n program.bytes,\n program.shaderSize,\n program.unsetOffset\n ),\n threadGroupSize: [\n signature.threadGroupSize?.x ?? 0,\n signature.threadGroupSize?.y ?? 0,\n signature.threadGroupSize?.z ?? 0\n ],\n pipelineInputs: (signature.pipelineInputs ?? []).map(entry => ({\n usage: entry.usage,\n registerIndex: entry.registerIndex,\n usageIndex: entry.usageIndex,\n usedMask: entry.usedMask,\n type: entry.type,\n dimension: entry.dimension\n })),\n ...this.toCarbonBinaryInput()\n };\n }\n\n /**\n * Emit this input as a Carbon v15 `StageData` block.\n *\n * Carbon holds textures, samplers, UAVs and render states in `std::map`s and\n * writes them in key order, and it sorts annotation names by `strcmp` before\n * writing. Our maps are keyed but not ordered, so every collection is sorted\n * explicitly here rather than trusting insertion order — the reader is\n * indifferent, but the bytes are not, and a container that disagrees with\n * Carbon's ordering is not the file Carbon would have written.\n *\n * @returns {object} Carbon stage-data record.\n */\n toCarbonBinaryInput()\n {\n const byRegister = (left, right) => left.registerIndex - right.registerIndex;\n const signature = this.signature ?? {};\n return {\n registers: (signature.registers ?? []).map(entry => ({\n registerType: entry.registerType,\n registerIndex: entry.registerIndex,\n registerCount: entry.registerCount,\n registerSpace: entry.registerSpace\n })),\n staticSamplers: (signature.staticSamplers ?? []).map(entry =>\n {\n const descriptor = entry.descriptor ?? {};\n return {\n registerIndex: entry.registerIndex,\n registerSpace: entry.registerSpace,\n comparison: descriptor.comparison ? 1 : 0,\n minFilter: descriptor.minFilter,\n magFilter: descriptor.magFilter,\n mipFilter: descriptor.mipFilter,\n addressU: descriptor.addressU,\n addressV: descriptor.addressV,\n addressW: descriptor.addressW,\n mipLODBias: toRecordFloat(descriptor.mipLODBiasRaw),\n maxAnisotropy: descriptor.maxAnisotropy,\n comparisonFunc: descriptor.comparisonFunc,\n // One byte here, four floats on a dynamic sampler.\n borderColor: descriptor.borderColor,\n minLOD: toRecordFloat(descriptor.minLODRaw),\n maxLOD: toRecordFloat(descriptor.maxLODRaw)\n };\n }),\n constants: this.constants.map(constant => constant.toCarbonBinary()),\n defaultValues: toRecordBlob(\n this.constantValues,\n this.constantValueSize,\n this.constantValuesUnsetOffset\n ),\n textures: Array.from(this.resources, ([ register, resource ]) =>\n resource.toCarbonBinary(register)).sort(byRegister),\n samplers: Array.from(this.samplers, ([ register, sampler ]) =>\n sampler.toCarbonBinary(register)).sort(byRegister),\n uavs: Array.from(this.uavs, ([ register, uav ]) =>\n uav.toCarbonBinary(register, true)).sort(byRegister),\n annotations: this.annotation\n .map(entry => entry.toCarbonBinary())\n .sort((left, right) => compareUtf8(left.name.value, right.name.value))\n };\n }\n\n /** Build one register-indexed resource map from Carbon texture or UAV records. */\n static readCarbonBinaryResourceMap(records)\n {\n const result = new Map();\n for (const record of records)\n {\n if (result.has(record.registerIndex))\n {\n throw new Error(\n `Carbon effect resource register ${record.registerIndex} is duplicated`\n );\n }\n result.set(\n record.registerIndex,\n Tr2EffectResource.fromCarbonBinary(record)\n );\n }\n return result;\n }\n\n /** Build one register-indexed sampler map from Carbon sampler records. */\n static readCarbonBinarySamplerMap(records)\n {\n const result = new Map();\n for (const record of records)\n {\n if (result.has(record.registerIndex))\n {\n throw new Error(\n `Carbon effect sampler register ${record.registerIndex} is duplicated`\n );\n }\n result.set(\n record.registerIndex,\n Tr2SamplerSetup.fromCarbonBinary(record)\n );\n }\n return result;\n }\n\n /**\n * Create one explicit absent stage slot.\n *\n * @param {number} stageType Stage index.\n * @returns {Tr2EffectStageInput} Empty stage input.\n */\n static createEmpty(stageType)\n {\n const stage = new this();\n stage.stageType = requireShaderStageType(stageType);\n return stage;\n }\n\n /**\n * Normalize one register-indexed collection into its canonical typed map.\n *\n * @param {Map|object} values Register-indexed source values.\n * @param {Function} Constructor Entry constructor exposing `from`.\n * @param {object} options Hydration options passed to entry construction.\n * @param {string} field Diagnostic field name.\n * @returns {Map<number, *>} Canonical register map.\n */\n static readCanonicalRegisterMap(values, Constructor, options, field)\n {\n const entries = values instanceof Map\n ? values\n : Object.entries(values ?? {});\n const result = new Map();\n for (const [ key, value ] of entries)\n {\n const registerIndex = Number(key);\n if (!isUint32(registerIndex))\n {\n throw new RangeError(\n `Effect ${field} register index must fit uint32`\n );\n }\n if (result.has(registerIndex))\n {\n throw new Error(\n `Effect ${field} register ${registerIndex} is duplicated`\n );\n }\n result.set(\n registerIndex,\n value instanceof Constructor\n ? value\n : Constructor.from(value, options)\n );\n }\n return result;\n }\n\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2EffectStageInput, {\n className: \"Tr2EffectStageInput\",\n family: \"shader\",\n fields: {\n stageType: [ impl.adapted, impl.reason(\"The source format identifies stage inputs by array index; the device-free graph retains the index explicitly for serialization and engine adapters.\"), type.int32 ],\n exists: type.boolean,\n resources: type.map(\"Tr2EffectResource\"),\n uavs: type.map(\"Tr2EffectResource\"),\n samplers: type.map(\"Tr2SamplerSetup\"),\n shader: type.uint32,\n constants: type.list(\"Tr2EffectConstant\"),\n constantValueSize: type.uint32,\n constantValues: type.typedArray(\"Uint8Array\"),\n constantValuesUnsetOffset: [ impl.custom, impl.reason(\"A zero-size blob's offset word is passed through rather than interned, and the shipped corpus does not always set it to the null sentinel; the graph retains it so a body re-emits as the file that produced it.\"), type.uint32 ],\n signature: type.rawStruct(\"Tr2ShaderSignatureAL\"),\n annotation: type.list(\"Tr2EffectParameterAnnotation\"),\n sourceProgram: [ impl.adapted, impl.reason(\"Carbon replaces source program data with renderer handles while reading; the device-free resource graph must retain the portable source program for later engine realization.\"), type.rawStruct(\"CjsEffectSourceProgram\") ]\n }\n});\n"],"names":["unsetOffsetOf","ref","size","offset","Tr2EffectStageInput","CjsModel","stageType","exists","resources","Map","uavs","samplers","shader","constants","constantValueSize","constantValues","Uint8Array","signature","annotation","sourceProgram","from","values","options","normalized","maps","field","Constructor","Tr2EffectResource","Tr2SamplerSetup","Object","hasOwn","readCanonicalRegisterMap","set","stage","value","fromCarbonBinary","record","isPlainObject","TypeError","input","fromCarbonBinaryInput","type","pipelineInputCount","pipelineInputs","length","map","entry","usage","registerIndex","usageIndex","usedMask","dimension","threadGroupSize","x","y","z","kind","bytes","copyBytes","recordBytes","shaderData","shaderSize","unsetOffset","defaultValues","Tr2EffectConstant","readCarbonBinaryResourceMap","textures","readCarbonBinarySamplerMap","byteLength","constantValuesUnsetOffset","annotations","Tr2EffectParameterAnnotation","registerCount","registers","registerType","arrayCount","registerSpace","staticSamplerCount","staticSamplers","descriptor","comparison","minFilter","magFilter","mipFilter","addressU","addressV","addressW","mipLODBiasRaw","recordRawBits","mipLODBias","maxAnisotropy","comparisonFunc","borderColor","minLODRaw","minLOD","maxLODRaw","maxLOD","toCarbonBinary","program","toRecordBlob","toCarbonBinaryInput","byRegister","left","right","toRecordFloat","constant","Array","register","resource","sort","sampler","uav","compareUtf8","name","records","result","has","Error","createEmpty","requireShaderStageType","entries","key","Number","isUint32","RangeError","CjsSchema","define","className","family","fields","impl","adapted","reason","int32","boolean","uint32","list","typedArray","custom","rawStruct"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { CjsSchema, type } from '@carbonenginejs/runtime-utils/schema';
2
2
  import { CjsModel } from '@carbonenginejs/runtime-utils/model';
3
- import { isPlainObject, isArray } from '@carbonenginejs/runtime-utils/is';
3
+ import { isPlainObject } from '@carbonenginejs/runtime-utils/is';
4
4
  import { Tr2EffectLibrary } from './Tr2EffectLibrary.js';
5
5
  import { Tr2Pass } from './Tr2Pass.js';
6
+ import { recordText, toRecordText } from './carbonRecordFields.js';
6
7
 
7
8
  // Source: trinity/trinity/Shader/Tr2EffectDescription.h
8
9
 
@@ -21,31 +22,40 @@ class Tr2EffectTechnique extends CjsModel {
21
22
  shaderTypeMask = 0;
22
23
 
23
24
  /**
24
- * Build one technique from its portable JSON reflection record.
25
+ * Build one technique from its Carbon v15 description record.
25
26
  *
26
- * @param {object} value Portable technique record.
27
+ * The technique's shader-type mask is not stored; it is the union of its
28
+ * passes' masks, so it is recomputed here exactly as the portable path does.
29
+ *
30
+ * @param {object} record Carbon technique record.
27
31
  * @returns {Tr2EffectTechnique} Reflected technique.
28
32
  */
29
- static fromPortable(value) {
30
- if (!isPlainObject(value)) {
31
- throw new TypeError("Portable effect technique must be an object");
32
- }
33
- if (!isArray(value.passes)) {
34
- throw new TypeError("Portable effect technique passes must be an array");
35
- }
36
- if (!isArray(value.libraries)) {
37
- throw new TypeError("Portable effect technique libraries must be an array");
38
- }
39
- if (value.passCount !== value.passes.length || value.libraryCount !== value.libraries.length) {
40
- throw new Error("Portable effect technique counts disagree with its collections");
33
+ static fromCarbonBinary(record) {
34
+ if (!isPlainObject(record)) {
35
+ throw new TypeError("Carbon effect technique record must be an object");
41
36
  }
42
37
  const technique = new this();
43
- technique.name = String(value.name ?? "");
44
- technique.passes = value.passes.map(entry => Tr2Pass.fromPortable(entry));
45
- technique.libraries = value.libraries.map(entry => Tr2EffectLibrary.fromPortable(entry));
38
+ technique.name = recordText(record.name);
39
+ technique.passes = record.passes.map(entry => Tr2Pass.fromCarbonBinary(entry));
40
+ technique.libraries = record.libraries.map(entry => Tr2EffectLibrary.fromCarbonBinary(entry));
46
41
  technique.shaderTypeMask = technique.passes.reduce((mask, pass) => mask | pass.shaderTypeMask, 0) >>> 0;
47
42
  return technique;
48
43
  }
44
+
45
+ /**
46
+ * Emit this technique as a Carbon v15 record.
47
+ *
48
+ * `shaderTypeMask` is not written: Carbon recomputes it from the passes.
49
+ *
50
+ * @returns {object} Carbon technique record.
51
+ */
52
+ toCarbonBinary() {
53
+ return {
54
+ name: toRecordText(this.name),
55
+ passes: this.passes.map(pass => pass.toCarbonBinary()),
56
+ libraries: this.libraries.map(library => library.toCarbonBinary())
57
+ };
58
+ }
49
59
  }
50
60
 
51
61
  // Declared imperatively rather than with decorators, so this module stays
@@ -1 +1 @@
1
- {"version":3,"file":"Tr2EffectTechnique.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectTechnique.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\nimport { CjsSchema, impl, type } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\nimport {\n isArray,\n isPlainObject\n} from \"@carbonenginejs/runtime-utils/is\";\nimport { Tr2EffectLibrary } from \"./Tr2EffectLibrary.js\";\nimport { Tr2Pass } from \"./Tr2Pass.js\";\n\n/** Reflected effect technique and its passes and libraries. */\nexport class Tr2EffectTechnique extends CjsModel\n{\n\n /** name (BlueSharedString) */\n name = \"\";\n\n /** passes (TrackableStdVector<Tr2Pass>) */\n passes = [];\n\n /** libraries (std::vector<Tr2EffectLibrary>) */\n libraries = [];\n\n /** shaderTypeMask (unsigned int) */\n shaderTypeMask = 0;\n\n /**\n * Build one technique from its portable JSON reflection record.\n *\n * @param {object} value Portable technique record.\n * @returns {Tr2EffectTechnique} Reflected technique.\n */\n static fromPortable(value)\n {\n if (!isPlainObject(value))\n {\n throw new TypeError(\"Portable effect technique must be an object\");\n }\n if (!isArray(value.passes))\n {\n throw new TypeError(\n \"Portable effect technique passes must be an array\"\n );\n }\n if (!isArray(value.libraries))\n {\n throw new TypeError(\n \"Portable effect technique libraries must be an array\"\n );\n }\n if (value.passCount !== value.passes.length\n || value.libraryCount !== value.libraries.length)\n {\n throw new Error(\n \"Portable effect technique counts disagree with its collections\"\n );\n }\n\n const technique = new this();\n technique.name = String(value.name ?? \"\");\n technique.passes = value.passes.map(\n entry => Tr2Pass.fromPortable(entry)\n );\n technique.libraries = value.libraries.map(\n entry => Tr2EffectLibrary.fromPortable(entry)\n );\n technique.shaderTypeMask = technique.passes.reduce(\n (mask, pass) => mask | pass.shaderTypeMask,\n 0\n ) >>> 0;\n return technique;\n }\n\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2EffectTechnique, {\n className: \"Tr2EffectTechnique\",\n family: \"shader\",\n fields: {\n name: type.string,\n passes: type.list(\"Tr2Pass\"),\n libraries: type.list(\"Tr2EffectLibrary\"),\n shaderTypeMask: type.uint32\n }\n});\n"],"names":["Tr2EffectTechnique","CjsModel","name","passes","libraries","shaderTypeMask","fromPortable","value","isPlainObject","TypeError","isArray","passCount","length","libraryCount","Error","technique","String","map","entry","Tr2Pass","Tr2EffectLibrary","reduce","mask","pass","CjsSchema","define","className","family","fields","type","string","list","uint32"],"mappings":";;;;;;AAAA;;AAUA;AACO,MAAMA,kBAAkB,SAASC,QAAQ,CAChD;AAEE;AACAC,EAAAA,IAAI,GAAG,EAAE;;AAET;AACAC,EAAAA,MAAM,GAAG,EAAE;;AAEX;AACAC,EAAAA,SAAS,GAAG,EAAE;;AAEd;AACAC,EAAAA,cAAc,GAAG,CAAC;;AAElB;AACF;AACA;AACA;AACA;AACA;EACE,OAAOC,YAAYA,CAACC,KAAK,EACzB;AACE,IAAA,IAAI,CAACC,aAAa,CAACD,KAAK,CAAC,EACzB;AACE,MAAA,MAAM,IAAIE,SAAS,CAAC,6CAA6C,CAAC;AACpE,IAAA;AACA,IAAA,IAAI,CAACC,OAAO,CAACH,KAAK,CAACJ,MAAM,CAAC,EAC1B;AACE,MAAA,MAAM,IAAIM,SAAS,CACjB,mDACF,CAAC;AACH,IAAA;AACA,IAAA,IAAI,CAACC,OAAO,CAACH,KAAK,CAACH,SAAS,CAAC,EAC7B;AACE,MAAA,MAAM,IAAIK,SAAS,CACjB,sDACF,CAAC;AACH,IAAA;AACA,IAAA,IAAIF,KAAK,CAACI,SAAS,KAAKJ,KAAK,CAACJ,MAAM,CAACS,MAAM,IACtCL,KAAK,CAACM,YAAY,KAAKN,KAAK,CAACH,SAAS,CAACQ,MAAM,EAClD;AACE,MAAA,MAAM,IAAIE,KAAK,CACb,gEACF,CAAC;AACH,IAAA;AAEA,IAAA,MAAMC,SAAS,GAAG,IAAI,IAAI,EAAE;IAC5BA,SAAS,CAACb,IAAI,GAAGc,MAAM,CAACT,KAAK,CAACL,IAAI,IAAI,EAAE,CAAC;AACzCa,IAAAA,SAAS,CAACZ,MAAM,GAAGI,KAAK,CAACJ,MAAM,CAACc,GAAG,CACjCC,KAAK,IAAIC,OAAO,CAACb,YAAY,CAACY,KAAK,CACrC,CAAC;AACDH,IAAAA,SAAS,CAACX,SAAS,GAAGG,KAAK,CAACH,SAAS,CAACa,GAAG,CACvCC,KAAK,IAAIE,gBAAgB,CAACd,YAAY,CAACY,KAAK,CAC9C,CAAC;IACDH,SAAS,CAACV,cAAc,GAAGU,SAAS,CAACZ,MAAM,CAACkB,MAAM,CAChD,CAACC,IAAI,EAAEC,IAAI,KAAKD,IAAI,GAAGC,IAAI,CAAClB,cAAc,EAC1C,CACF,CAAC,KAAK,CAAC;AACP,IAAA,OAAOU,SAAS;AAClB,EAAA;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACAS,SAAS,CAACC,MAAM,CAACzB,kBAAkB,EAAE;AACnC0B,EAAAA,SAAS,EAAE,oBAAoB;AAC/BC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,MAAM,EAAE;IACN1B,IAAI,EAAE2B,IAAI,CAACC,MAAM;AACjB3B,IAAAA,MAAM,EAAE0B,IAAI,CAACE,IAAI,CAAC,SAAS,CAAC;AAC5B3B,IAAAA,SAAS,EAAEyB,IAAI,CAACE,IAAI,CAAC,kBAAkB,CAAC;IACxC1B,cAAc,EAAEwB,IAAI,CAACG;AACvB;AACF,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"Tr2EffectTechnique.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectTechnique.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\nimport { CjsSchema, impl, type } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\nimport {\n isPlainObject\n} from \"@carbonenginejs/runtime-utils/is\";\nimport { Tr2EffectLibrary } from \"./Tr2EffectLibrary.js\";\nimport { Tr2Pass } from \"./Tr2Pass.js\";\nimport { recordText, toRecordText } from \"./carbonRecordFields.js\";\n\n/** Reflected effect technique and its passes and libraries. */\nexport class Tr2EffectTechnique extends CjsModel\n{\n\n /** name (BlueSharedString) */\n name = \"\";\n\n /** passes (TrackableStdVector<Tr2Pass>) */\n passes = [];\n\n /** libraries (std::vector<Tr2EffectLibrary>) */\n libraries = [];\n\n /** shaderTypeMask (unsigned int) */\n shaderTypeMask = 0;\n\n /**\n * Build one technique from its Carbon v15 description record.\n *\n * The technique's shader-type mask is not stored; it is the union of its\n * passes' masks, so it is recomputed here exactly as the portable path does.\n *\n * @param {object} record Carbon technique record.\n * @returns {Tr2EffectTechnique} Reflected technique.\n */\n static fromCarbonBinary(record)\n {\n if (!isPlainObject(record))\n {\n throw new TypeError(\"Carbon effect technique record must be an object\");\n }\n\n const technique = new this();\n technique.name = recordText(record.name);\n technique.passes = record.passes.map(\n entry => Tr2Pass.fromCarbonBinary(entry)\n );\n technique.libraries = record.libraries.map(\n entry => Tr2EffectLibrary.fromCarbonBinary(entry)\n );\n technique.shaderTypeMask = technique.passes.reduce(\n (mask, pass) => mask | pass.shaderTypeMask,\n 0\n ) >>> 0;\n return technique;\n }\n\n\n /**\n * Emit this technique as a Carbon v15 record.\n *\n * `shaderTypeMask` is not written: Carbon recomputes it from the passes.\n *\n * @returns {object} Carbon technique record.\n */\n toCarbonBinary()\n {\n return {\n name: toRecordText(this.name),\n passes: this.passes.map(pass => pass.toCarbonBinary()),\n libraries: this.libraries.map(library => library.toCarbonBinary())\n };\n }\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2EffectTechnique, {\n className: \"Tr2EffectTechnique\",\n family: \"shader\",\n fields: {\n name: type.string,\n passes: type.list(\"Tr2Pass\"),\n libraries: type.list(\"Tr2EffectLibrary\"),\n shaderTypeMask: type.uint32\n }\n});\n"],"names":["Tr2EffectTechnique","CjsModel","name","passes","libraries","shaderTypeMask","fromCarbonBinary","record","isPlainObject","TypeError","technique","recordText","map","entry","Tr2Pass","Tr2EffectLibrary","reduce","mask","pass","toCarbonBinary","toRecordText","library","CjsSchema","define","className","family","fields","type","string","list","uint32"],"mappings":";;;;;;;AAAA;;AAUA;AACO,MAAMA,kBAAkB,SAASC,QAAQ,CAChD;AAEE;AACAC,EAAAA,IAAI,GAAG,EAAE;;AAET;AACAC,EAAAA,MAAM,GAAG,EAAE;;AAEX;AACAC,EAAAA,SAAS,GAAG,EAAE;;AAEd;AACAC,EAAAA,cAAc,GAAG,CAAC;;AAElB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,gBAAgBA,CAACC,MAAM,EAC9B;AACE,IAAA,IAAI,CAACC,aAAa,CAACD,MAAM,CAAC,EAC1B;AACE,MAAA,MAAM,IAAIE,SAAS,CAAC,kDAAkD,CAAC;AACzE,IAAA;AAEA,IAAA,MAAMC,SAAS,GAAG,IAAI,IAAI,EAAE;IAC5BA,SAAS,CAACR,IAAI,GAAGS,UAAU,CAACJ,MAAM,CAACL,IAAI,CAAC;AACxCQ,IAAAA,SAAS,CAACP,MAAM,GAAGI,MAAM,CAACJ,MAAM,CAACS,GAAG,CAClCC,KAAK,IAAIC,OAAO,CAACR,gBAAgB,CAACO,KAAK,CACzC,CAAC;AACDH,IAAAA,SAAS,CAACN,SAAS,GAAGG,MAAM,CAACH,SAAS,CAACQ,GAAG,CACxCC,KAAK,IAAIE,gBAAgB,CAACT,gBAAgB,CAACO,KAAK,CAClD,CAAC;IACDH,SAAS,CAACL,cAAc,GAAGK,SAAS,CAACP,MAAM,CAACa,MAAM,CAChD,CAACC,IAAI,EAAEC,IAAI,KAAKD,IAAI,GAAGC,IAAI,CAACb,cAAc,EAC1C,CACF,CAAC,KAAK,CAAC;AACP,IAAA,OAAOK,SAAS;AAClB,EAAA;;AAGA;AACF;AACA;AACA;AACA;AACA;AACA;AACES,EAAAA,cAAcA,GACd;IACE,OAAO;AACLjB,MAAAA,IAAI,EAAEkB,YAAY,CAAC,IAAI,CAAClB,IAAI,CAAC;AAC7BC,MAAAA,MAAM,EAAE,IAAI,CAACA,MAAM,CAACS,GAAG,CAACM,IAAI,IAAIA,IAAI,CAACC,cAAc,EAAE,CAAC;AACtDf,MAAAA,SAAS,EAAE,IAAI,CAACA,SAAS,CAACQ,GAAG,CAACS,OAAO,IAAIA,OAAO,CAACF,cAAc,EAAE;KAClE;AACH,EAAA;AACF;;AAEA;AACA;AACA;AACA;AACA;AACAG,SAAS,CAACC,MAAM,CAACvB,kBAAkB,EAAE;AACnCwB,EAAAA,SAAS,EAAE,oBAAoB;AAC/BC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,MAAM,EAAE;IACNxB,IAAI,EAAEyB,IAAI,CAACC,MAAM;AACjBzB,IAAAA,MAAM,EAAEwB,IAAI,CAACE,IAAI,CAAC,SAAS,CAAC;AAC5BzB,IAAAA,SAAS,EAAEuB,IAAI,CAACE,IAAI,CAAC,kBAAkB,CAAC;IACxCxB,cAAc,EAAEsB,IAAI,CAACG;AACvB;AACF,CAAC,CAAC;;;;"}