@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
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Text disassembly of a decoded DXBC token stream.
3
+ *
4
+ * A translated shader can only be judged against what the bytecode actually
5
+ * says. Reading the emitted GLSL or WGSL beside the original HLSL proves
6
+ * nothing, because the compiler that produced the bytecode already rewrote the
7
+ * program; and the emitters cannot be their own oracle. This module turns the
8
+ * decoder's instruction records back into assembly text so a translation can be
9
+ * checked instruction by instruction against its own input.
10
+ *
11
+ * The output follows Microsoft's shader-assembly conventions closely enough to
12
+ * read beside published DXBC listings, but it is a rendering of this decoder's
13
+ * records, not a reimplementation of any disassembler. Every field printed here
14
+ * comes from `DxbcInstructionDecoder`.
15
+ */
16
+
17
+ const OPERAND_PREFIXES = Object.freeze({
18
+ temp: "r",
19
+ input: "v",
20
+ output: "o",
21
+ indexable_temp: "x",
22
+ immediate32: "l",
23
+ immediate64: "d",
24
+ sampler: "s",
25
+ resource: "t",
26
+ constant_buffer: "cb",
27
+ immediate_constant_buffer: "icb",
28
+ label: "label",
29
+ uav: "u",
30
+ thread_group_shared_memory: "g",
31
+ output_depth: "oDepth",
32
+ null: "null",
33
+ rasterizer: "rasterizer",
34
+ output_coverage: "oMask",
35
+ input_coverage_mask: "vCoverage",
36
+ input_primitive_id: "vPrim",
37
+ input_thread_id: "vThreadID",
38
+ input_thread_group_id: "vThreadGroupID",
39
+ input_thread_id_in_group: "vThreadIDInGroup",
40
+ input_thread_id_in_group_flattened: "vThreadIDInGroupFlattened",
41
+ input_domain_point: "vDomain",
42
+ input_control_point: "vicp",
43
+ output_control_point: "vocp",
44
+ input_patch_constant: "vpc",
45
+ output_depth_greater_equal: "oDepthGE",
46
+ output_depth_less_equal: "oDepthLE"
47
+ });
48
+
49
+ /**
50
+ * Registers whose name already stands alone: printing an index would invent a
51
+ * dimension the encoding does not have.
52
+ */
53
+ const UNINDEXED_OPERANDS = new Set(["null", "rasterizer", "output_depth", "output_depth_greater_equal", "output_depth_less_equal", "output_coverage", "input_coverage_mask", "input_primitive_id", "input_thread_id", "input_thread_group_id", "input_thread_id_in_group", "input_thread_id_in_group_flattened", "input_domain_point"]);
54
+
55
+ /**
56
+ * Formats one immediate component.
57
+ *
58
+ * Integer-typed opcodes carry their operands as the same 32 bits a float
59
+ * opcode would, so both readings are printed when they disagree meaningfully.
60
+ * A bare float is enough when the integer reading is small and matches.
61
+ *
62
+ * @param {object} value Decoded immediate with `uint32` and `float32`.
63
+ * @returns {string} Printable component.
64
+ */
65
+ function formatImmediateComponent(value) {
66
+ if (!value || typeof value !== "object") {
67
+ return String(value);
68
+ }
69
+ const {
70
+ uint32,
71
+ float32
72
+ } = value;
73
+ if (!Number.isFinite(float32)) {
74
+ return `0x${(uint32 >>> 0).toString(16).padStart(8, "0")}`;
75
+ }
76
+ if (Number.isInteger(float32) && Math.abs(float32) < 1e7) {
77
+ return float32.toFixed(1);
78
+ }
79
+ return String(float32);
80
+ }
81
+
82
+ /**
83
+ * Formats an operand index chain, including relative (indexed) addressing.
84
+ *
85
+ * @param {object} operand Decoded operand.
86
+ * @returns {string} Printable index chain.
87
+ */
88
+ function formatIndices(operand) {
89
+ const indices = operand.indices ?? [];
90
+ if (!indices.length || UNINDEXED_OPERANDS.has(operand.typeName)) {
91
+ return "";
92
+ }
93
+ return indices.map(index => {
94
+ const literal = index.values?.[0] ?? 0;
95
+ if (index.relative) {
96
+ // eslint-disable-next-line no-use-before-define
97
+ const inner = formatOperand(index.relative);
98
+ return literal ? `[${inner} + ${literal}]` : `[${inner}]`;
99
+ }
100
+ return `[${literal}]`;
101
+ }).join("");
102
+ }
103
+
104
+ /**
105
+ * Formats the component selection suffix for an operand.
106
+ *
107
+ * A masked destination and a swizzled source print differently, and a
108
+ * single-component selection prints as one letter. Getting this wrong is the
109
+ * whole reason a translation review needs the listing, so it is printed
110
+ * exactly as encoded rather than normalized.
111
+ *
112
+ * @param {object} operand Decoded operand.
113
+ * @returns {string} Printable suffix, including the leading dot.
114
+ */
115
+ function formatSelection(operand) {
116
+ if (operand.selectionModeName === "mask") {
117
+ return operand.mask ? `.${operand.mask}` : "";
118
+ }
119
+ if (operand.selectionModeName === "swizzle") {
120
+ return operand.swizzle ? `.${operand.swizzle}` : "";
121
+ }
122
+ return operand.selected ? `.${operand.selected}` : "";
123
+ }
124
+
125
+ /**
126
+ * Formats one decoded operand.
127
+ *
128
+ * @param {object} operand Decoded operand.
129
+ * @returns {string} Printable operand.
130
+ */
131
+ function formatOperand(operand) {
132
+ if (!operand) {
133
+ return "<null>";
134
+ }
135
+ if (operand.typeName === "immediate32" || operand.typeName === "immediate64") {
136
+ const components = (operand.immediateValues ?? []).map(formatImmediateComponent);
137
+ return `l(${components.join(", ")})`;
138
+ }
139
+ const prefix = OPERAND_PREFIXES[operand.typeName] ?? operand.typeName;
140
+ let text = `${prefix}${formatIndices(operand)}${formatSelection(operand)}`;
141
+ if (operand.minPrecisionName && operand.minPrecisionName !== "default") {
142
+ text = `${text} {${operand.minPrecisionName}}`;
143
+ }
144
+ if (operand.nonUniform) {
145
+ text = `${text} {nonuniform}`;
146
+ }
147
+ switch (operand.modifierName) {
148
+ case "neg":
149
+ return `-${text}`;
150
+ case "abs":
151
+ return `|${text}|`;
152
+ case "absneg":
153
+ return `-|${text}|`;
154
+ default:
155
+ return text;
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Formats the trailing detail a declaration carries outside its operands.
161
+ *
162
+ * @param {object} instruction Decoded declaration instruction.
163
+ * @returns {string} Printable suffix, or an empty string.
164
+ */
165
+ function formatDeclarationDetail(instruction) {
166
+ const declaration = instruction.declaration;
167
+ if (!declaration) {
168
+ return "";
169
+ }
170
+ const parts = [];
171
+ for (const [key, value] of Object.entries(declaration)) {
172
+ if (value === null || value === undefined || key === "registerIndex") {
173
+ continue;
174
+ }
175
+ if (typeof value === "object") {
176
+ continue;
177
+ }
178
+ parts.push(`${key}=${value}`);
179
+ }
180
+ return parts.length ? ` ; ${parts.join(" ")}` : "";
181
+ }
182
+ const OPENS_BLOCK = new Set(["if", "else", "loop", "switch", "case", "default"]);
183
+ const CLOSES_BLOCK = new Set(["endif", "else", "endloop", "endswitch", "case", "default"]);
184
+
185
+ /**
186
+ * Disassembles a decoded DXBC instruction stream to assembly text.
187
+ *
188
+ * Accepts either the raw decoder (`emit: "raw"` gives `result.decoder`) or the
189
+ * JSON form of the same record, because the two share field names.
190
+ *
191
+ * @param {object} decoder Decoder record with an `instructions` array.
192
+ * @param {object} [options] Listing options.
193
+ * @param {boolean} [options.declarations] Include declarations. Default true.
194
+ * @param {boolean} [options.numbers] Prefix executable instructions with their
195
+ * index. Default true. The numbering counts executable instructions only,
196
+ * so it matches the order a translation walks them in.
197
+ * @param {boolean} [options.indent] Indent control-flow bodies. Default true.
198
+ * @returns {string} Assembly listing.
199
+ */
200
+ function disassembleInstructions(decoder, options = {}) {
201
+ const instructions = decoder?.instructions ?? [];
202
+ const showDeclarations = options.declarations !== false;
203
+ const showNumbers = options.numbers !== false;
204
+ const indentBodies = options.indent !== false;
205
+ const lines = [];
206
+ let index = 0;
207
+ let depth = 0;
208
+ for (const instruction of instructions) {
209
+ const name = instruction.opcodeName ?? `opcode_${instruction.opcode}`;
210
+ if (instruction.isDeclaration) {
211
+ if (showDeclarations) {
212
+ const operands = (instruction.operands ?? []).map(formatOperand).join(", ");
213
+ lines.push(`${" ".repeat(showNumbers ? 6 : 0)}${name}${operands ? ` ${operands}` : ""}` + formatDeclarationDetail(instruction));
214
+ }
215
+ continue;
216
+ }
217
+ if (instruction.customData) {
218
+ const className = instruction.customData.dataClassName ?? "custom_data";
219
+ lines.push(`${" ".repeat(showNumbers ? 6 : 0)}${className}`);
220
+ continue;
221
+ }
222
+ if (indentBodies && CLOSES_BLOCK.has(name)) {
223
+ depth = Math.max(0, depth - 1);
224
+ }
225
+ const operands = (instruction.operands ?? []).map(formatOperand).join(", ");
226
+ const modifiers = instruction.saturate ? "_sat" : "";
227
+ const precise = instruction.preciseMask ? ` {precise ${instruction.preciseMask}}` : "";
228
+ const prefix = showNumbers ? `${String(index).padStart(4)}: ` : "";
229
+ const pad = indentBodies ? " ".repeat(depth) : "";
230
+ lines.push(`${prefix}${pad}${name}${modifiers}${operands ? ` ${operands}` : ""}${precise}`);
231
+ index++;
232
+ if (indentBodies && OPENS_BLOCK.has(name)) {
233
+ depth++;
234
+ }
235
+ }
236
+ return lines.join("\n");
237
+ }
238
+
239
+ export { disassembleInstructions, formatOperand };
240
+ //# sourceMappingURL=disassemble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disassemble.js","sources":["../../../../../src/formats/dxbc/core/disassemble.js"],"sourcesContent":["/**\n * Text disassembly of a decoded DXBC token stream.\n *\n * A translated shader can only be judged against what the bytecode actually\n * says. Reading the emitted GLSL or WGSL beside the original HLSL proves\n * nothing, because the compiler that produced the bytecode already rewrote the\n * program; and the emitters cannot be their own oracle. This module turns the\n * decoder's instruction records back into assembly text so a translation can be\n * checked instruction by instruction against its own input.\n *\n * The output follows Microsoft's shader-assembly conventions closely enough to\n * read beside published DXBC listings, but it is a rendering of this decoder's\n * records, not a reimplementation of any disassembler. Every field printed here\n * comes from `DxbcInstructionDecoder`.\n */\n\nconst OPERAND_PREFIXES = Object.freeze({\n temp: \"r\",\n input: \"v\",\n output: \"o\",\n indexable_temp: \"x\",\n immediate32: \"l\",\n immediate64: \"d\",\n sampler: \"s\",\n resource: \"t\",\n constant_buffer: \"cb\",\n immediate_constant_buffer: \"icb\",\n label: \"label\",\n uav: \"u\",\n thread_group_shared_memory: \"g\",\n output_depth: \"oDepth\",\n null: \"null\",\n rasterizer: \"rasterizer\",\n output_coverage: \"oMask\",\n input_coverage_mask: \"vCoverage\",\n input_primitive_id: \"vPrim\",\n input_thread_id: \"vThreadID\",\n input_thread_group_id: \"vThreadGroupID\",\n input_thread_id_in_group: \"vThreadIDInGroup\",\n input_thread_id_in_group_flattened: \"vThreadIDInGroupFlattened\",\n input_domain_point: \"vDomain\",\n input_control_point: \"vicp\",\n output_control_point: \"vocp\",\n input_patch_constant: \"vpc\",\n output_depth_greater_equal: \"oDepthGE\",\n output_depth_less_equal: \"oDepthLE\"\n});\n\n/**\n * Registers whose name already stands alone: printing an index would invent a\n * dimension the encoding does not have.\n */\nconst UNINDEXED_OPERANDS = new Set([\n \"null\", \"rasterizer\", \"output_depth\", \"output_depth_greater_equal\",\n \"output_depth_less_equal\", \"output_coverage\", \"input_coverage_mask\",\n \"input_primitive_id\", \"input_thread_id\", \"input_thread_group_id\",\n \"input_thread_id_in_group\", \"input_thread_id_in_group_flattened\",\n \"input_domain_point\"\n]);\n\n/**\n * Formats one immediate component.\n *\n * Integer-typed opcodes carry their operands as the same 32 bits a float\n * opcode would, so both readings are printed when they disagree meaningfully.\n * A bare float is enough when the integer reading is small and matches.\n *\n * @param {object} value Decoded immediate with `uint32` and `float32`.\n * @returns {string} Printable component.\n */\nfunction formatImmediateComponent(value)\n{\n if (!value || typeof value !== \"object\")\n {\n return String(value);\n }\n\n const { uint32, float32 } = value;\n\n if (!Number.isFinite(float32))\n {\n return `0x${(uint32 >>> 0).toString(16).padStart(8, \"0\")}`;\n }\n\n if (Number.isInteger(float32) && Math.abs(float32) < 1e7)\n {\n return float32.toFixed(1);\n }\n\n return String(float32);\n}\n\n/**\n * Formats an operand index chain, including relative (indexed) addressing.\n *\n * @param {object} operand Decoded operand.\n * @returns {string} Printable index chain.\n */\nfunction formatIndices(operand)\n{\n const indices = operand.indices ?? [];\n\n if (!indices.length || UNINDEXED_OPERANDS.has(operand.typeName))\n {\n return \"\";\n }\n\n return indices.map((index) =>\n {\n const literal = index.values?.[0] ?? 0;\n\n if (index.relative)\n {\n // eslint-disable-next-line no-use-before-define\n const inner = formatOperand(index.relative);\n\n return literal ? `[${inner} + ${literal}]` : `[${inner}]`;\n }\n\n return `[${literal}]`;\n }).join(\"\");\n}\n\n/**\n * Formats the component selection suffix for an operand.\n *\n * A masked destination and a swizzled source print differently, and a\n * single-component selection prints as one letter. Getting this wrong is the\n * whole reason a translation review needs the listing, so it is printed\n * exactly as encoded rather than normalized.\n *\n * @param {object} operand Decoded operand.\n * @returns {string} Printable suffix, including the leading dot.\n */\nfunction formatSelection(operand)\n{\n if (operand.selectionModeName === \"mask\")\n {\n return operand.mask ? `.${operand.mask}` : \"\";\n }\n\n if (operand.selectionModeName === \"swizzle\")\n {\n return operand.swizzle ? `.${operand.swizzle}` : \"\";\n }\n\n return operand.selected ? `.${operand.selected}` : \"\";\n}\n\n/**\n * Formats one decoded operand.\n *\n * @param {object} operand Decoded operand.\n * @returns {string} Printable operand.\n */\nexport function formatOperand(operand)\n{\n if (!operand)\n {\n return \"<null>\";\n }\n\n if (operand.typeName === \"immediate32\" || operand.typeName === \"immediate64\")\n {\n const components = (operand.immediateValues ?? []).map(formatImmediateComponent);\n\n return `l(${components.join(\", \")})`;\n }\n\n const prefix = OPERAND_PREFIXES[operand.typeName] ?? operand.typeName;\n let text = `${prefix}${formatIndices(operand)}${formatSelection(operand)}`;\n\n if (operand.minPrecisionName && operand.minPrecisionName !== \"default\")\n {\n text = `${text} {${operand.minPrecisionName}}`;\n }\n\n if (operand.nonUniform)\n {\n text = `${text} {nonuniform}`;\n }\n\n switch (operand.modifierName)\n {\n case \"neg\":\n return `-${text}`;\n\n case \"abs\":\n return `|${text}|`;\n\n case \"absneg\":\n return `-|${text}|`;\n\n default:\n return text;\n }\n}\n\n/**\n * Formats the trailing detail a declaration carries outside its operands.\n *\n * @param {object} instruction Decoded declaration instruction.\n * @returns {string} Printable suffix, or an empty string.\n */\nfunction formatDeclarationDetail(instruction)\n{\n const declaration = instruction.declaration;\n\n if (!declaration)\n {\n return \"\";\n }\n\n const parts = [];\n\n for (const [ key, value ] of Object.entries(declaration))\n {\n if (value === null || value === undefined || key === \"registerIndex\")\n {\n continue;\n }\n\n if (typeof value === \"object\")\n {\n continue;\n }\n\n parts.push(`${key}=${value}`);\n }\n\n return parts.length ? ` ; ${parts.join(\" \")}` : \"\";\n}\n\nconst OPENS_BLOCK = new Set([ \"if\", \"else\", \"loop\", \"switch\", \"case\", \"default\" ]);\nconst CLOSES_BLOCK = new Set([ \"endif\", \"else\", \"endloop\", \"endswitch\", \"case\", \"default\" ]);\n\n/**\n * Disassembles a decoded DXBC instruction stream to assembly text.\n *\n * Accepts either the raw decoder (`emit: \"raw\"` gives `result.decoder`) or the\n * JSON form of the same record, because the two share field names.\n *\n * @param {object} decoder Decoder record with an `instructions` array.\n * @param {object} [options] Listing options.\n * @param {boolean} [options.declarations] Include declarations. Default true.\n * @param {boolean} [options.numbers] Prefix executable instructions with their\n * index. Default true. The numbering counts executable instructions only,\n * so it matches the order a translation walks them in.\n * @param {boolean} [options.indent] Indent control-flow bodies. Default true.\n * @returns {string} Assembly listing.\n */\nexport function disassembleInstructions(decoder, options = {})\n{\n const instructions = decoder?.instructions ?? [];\n const showDeclarations = options.declarations !== false;\n const showNumbers = options.numbers !== false;\n const indentBodies = options.indent !== false;\n const lines = [];\n let index = 0;\n let depth = 0;\n\n for (const instruction of instructions)\n {\n const name = instruction.opcodeName ?? `opcode_${instruction.opcode}`;\n\n if (instruction.isDeclaration)\n {\n if (showDeclarations)\n {\n const operands = (instruction.operands ?? []).map(formatOperand).join(\", \");\n\n lines.push(`${\" \".repeat(showNumbers ? 6 : 0)}${name}${operands ? ` ${operands}` : \"\"}`\n + formatDeclarationDetail(instruction));\n }\n\n continue;\n }\n\n if (instruction.customData)\n {\n const className = instruction.customData.dataClassName ?? \"custom_data\";\n\n lines.push(`${\" \".repeat(showNumbers ? 6 : 0)}${className}`);\n continue;\n }\n\n if (indentBodies && CLOSES_BLOCK.has(name))\n {\n depth = Math.max(0, depth - 1);\n }\n\n const operands = (instruction.operands ?? []).map(formatOperand).join(\", \");\n const modifiers = instruction.saturate ? \"_sat\" : \"\";\n const precise = instruction.preciseMask ? ` {precise ${instruction.preciseMask}}` : \"\";\n const prefix = showNumbers ? `${String(index).padStart(4)}: ` : \"\";\n const pad = indentBodies ? \" \".repeat(depth) : \"\";\n\n lines.push(`${prefix}${pad}${name}${modifiers}${operands ? ` ${operands}` : \"\"}${precise}`);\n index++;\n\n if (indentBodies && OPENS_BLOCK.has(name))\n {\n depth++;\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport default disassembleInstructions;\n"],"names":["OPERAND_PREFIXES","Object","freeze","temp","input","output","indexable_temp","immediate32","immediate64","sampler","resource","constant_buffer","immediate_constant_buffer","label","uav","thread_group_shared_memory","output_depth","null","rasterizer","output_coverage","input_coverage_mask","input_primitive_id","input_thread_id","input_thread_group_id","input_thread_id_in_group","input_thread_id_in_group_flattened","input_domain_point","input_control_point","output_control_point","input_patch_constant","output_depth_greater_equal","output_depth_less_equal","UNINDEXED_OPERANDS","Set","formatImmediateComponent","value","String","uint32","float32","Number","isFinite","toString","padStart","isInteger","Math","abs","toFixed","formatIndices","operand","indices","length","has","typeName","map","index","literal","values","relative","inner","formatOperand","join","formatSelection","selectionModeName","mask","swizzle","selected","components","immediateValues","prefix","text","minPrecisionName","nonUniform","modifierName","formatDeclarationDetail","instruction","declaration","parts","key","entries","undefined","push","OPENS_BLOCK","CLOSES_BLOCK","disassembleInstructions","decoder","options","instructions","showDeclarations","declarations","showNumbers","numbers","indentBodies","indent","lines","depth","name","opcodeName","opcode","isDeclaration","operands","repeat","customData","className","dataClassName","max","modifiers","saturate","precise","preciseMask","pad"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMA,gBAAgB,GAAGC,MAAM,CAACC,MAAM,CAAC;AACnCC,EAAAA,IAAI,EAAE,GAAG;AACTC,EAAAA,KAAK,EAAE,GAAG;AACVC,EAAAA,MAAM,EAAE,GAAG;AACXC,EAAAA,cAAc,EAAE,GAAG;AACnBC,EAAAA,WAAW,EAAE,GAAG;AAChBC,EAAAA,WAAW,EAAE,GAAG;AAChBC,EAAAA,OAAO,EAAE,GAAG;AACZC,EAAAA,QAAQ,EAAE,GAAG;AACbC,EAAAA,eAAe,EAAE,IAAI;AACrBC,EAAAA,yBAAyB,EAAE,KAAK;AAChCC,EAAAA,KAAK,EAAE,OAAO;AACdC,EAAAA,GAAG,EAAE,GAAG;AACRC,EAAAA,0BAA0B,EAAE,GAAG;AAC/BC,EAAAA,YAAY,EAAE,QAAQ;AACtBC,EAAAA,IAAI,EAAE,MAAM;AACZC,EAAAA,UAAU,EAAE,YAAY;AACxBC,EAAAA,eAAe,EAAE,OAAO;AACxBC,EAAAA,mBAAmB,EAAE,WAAW;AAChCC,EAAAA,kBAAkB,EAAE,OAAO;AAC3BC,EAAAA,eAAe,EAAE,WAAW;AAC5BC,EAAAA,qBAAqB,EAAE,gBAAgB;AACvCC,EAAAA,wBAAwB,EAAE,kBAAkB;AAC5CC,EAAAA,kCAAkC,EAAE,2BAA2B;AAC/DC,EAAAA,kBAAkB,EAAE,SAAS;AAC7BC,EAAAA,mBAAmB,EAAE,MAAM;AAC3BC,EAAAA,oBAAoB,EAAE,MAAM;AAC5BC,EAAAA,oBAAoB,EAAE,KAAK;AAC3BC,EAAAA,0BAA0B,EAAE,UAAU;AACtCC,EAAAA,uBAAuB,EAAE;AAC7B,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA,MAAMC,kBAAkB,GAAG,IAAIC,GAAG,CAAC,CAC/B,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,4BAA4B,EAClE,yBAAyB,EAAE,iBAAiB,EAAE,qBAAqB,EACnE,oBAAoB,EAAE,iBAAiB,EAAE,uBAAuB,EAChE,0BAA0B,EAAE,oCAAoC,EAChE,oBAAoB,CACvB,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,wBAAwBA,CAACC,KAAK,EACvC;AACI,EAAA,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EACvC;IACI,OAAOC,MAAM,CAACD,KAAK,CAAC;AACxB,EAAA;EAEA,MAAM;IAAEE,MAAM;AAAEC,IAAAA;AAAQ,GAAC,GAAGH,KAAK;AAEjC,EAAA,IAAI,CAACI,MAAM,CAACC,QAAQ,CAACF,OAAO,CAAC,EAC7B;AACI,IAAA,OAAO,KAAK,CAACD,MAAM,KAAK,CAAC,EAAEI,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;AAC9D,EAAA;AAEA,EAAA,IAAIH,MAAM,CAACI,SAAS,CAACL,OAAO,CAAC,IAAIM,IAAI,CAACC,GAAG,CAACP,OAAO,CAAC,GAAG,GAAG,EACxD;AACI,IAAA,OAAOA,OAAO,CAACQ,OAAO,CAAC,CAAC,CAAC;AAC7B,EAAA;EAEA,OAAOV,MAAM,CAACE,OAAO,CAAC;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASS,aAAaA,CAACC,OAAO,EAC9B;AACI,EAAA,MAAMC,OAAO,GAAGD,OAAO,CAACC,OAAO,IAAI,EAAE;AAErC,EAAA,IAAI,CAACA,OAAO,CAACC,MAAM,IAAIlB,kBAAkB,CAACmB,GAAG,CAACH,OAAO,CAACI,QAAQ,CAAC,EAC/D;AACI,IAAA,OAAO,EAAE;AACb,EAAA;AAEA,EAAA,OAAOH,OAAO,CAACI,GAAG,CAAEC,KAAK,IACzB;IACI,MAAMC,OAAO,GAAGD,KAAK,CAACE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;IAEtC,IAAIF,KAAK,CAACG,QAAQ,EAClB;AACI;AACA,MAAA,MAAMC,KAAK,GAAGC,aAAa,CAACL,KAAK,CAACG,QAAQ,CAAC;MAE3C,OAAOF,OAAO,GAAG,CAAA,CAAA,EAAIG,KAAK,CAAA,GAAA,EAAMH,OAAO,CAAA,CAAA,CAAG,GAAG,CAAA,CAAA,EAAIG,KAAK,CAAA,CAAA,CAAG;AAC7D,IAAA;IAEA,OAAO,CAAA,CAAA,EAAIH,OAAO,CAAA,CAAA,CAAG;AACzB,EAAA,CAAC,CAAC,CAACK,IAAI,CAAC,EAAE,CAAC;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,eAAeA,CAACb,OAAO,EAChC;AACI,EAAA,IAAIA,OAAO,CAACc,iBAAiB,KAAK,MAAM,EACxC;IACI,OAAOd,OAAO,CAACe,IAAI,GAAG,CAAA,CAAA,EAAIf,OAAO,CAACe,IAAI,CAAA,CAAE,GAAG,EAAE;AACjD,EAAA;AAEA,EAAA,IAAIf,OAAO,CAACc,iBAAiB,KAAK,SAAS,EAC3C;IACI,OAAOd,OAAO,CAACgB,OAAO,GAAG,CAAA,CAAA,EAAIhB,OAAO,CAACgB,OAAO,CAAA,CAAE,GAAG,EAAE;AACvD,EAAA;EAEA,OAAOhB,OAAO,CAACiB,QAAQ,GAAG,CAAA,CAAA,EAAIjB,OAAO,CAACiB,QAAQ,CAAA,CAAE,GAAG,EAAE;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASN,aAAaA,CAACX,OAAO,EACrC;EACI,IAAI,CAACA,OAAO,EACZ;AACI,IAAA,OAAO,QAAQ;AACnB,EAAA;EAEA,IAAIA,OAAO,CAACI,QAAQ,KAAK,aAAa,IAAIJ,OAAO,CAACI,QAAQ,KAAK,aAAa,EAC5E;AACI,IAAA,MAAMc,UAAU,GAAG,CAAClB,OAAO,CAACmB,eAAe,IAAI,EAAE,EAAEd,GAAG,CAACnB,wBAAwB,CAAC;AAEhF,IAAA,OAAO,KAAKgC,UAAU,CAACN,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;AACxC,EAAA;EAEA,MAAMQ,MAAM,GAAGpE,gBAAgB,CAACgD,OAAO,CAACI,QAAQ,CAAC,IAAIJ,OAAO,CAACI,QAAQ;AACrE,EAAA,IAAIiB,IAAI,GAAG,CAAA,EAAGD,MAAM,GAAGrB,aAAa,CAACC,OAAO,CAAC,CAAA,EAAGa,eAAe,CAACb,OAAO,CAAC,CAAA,CAAE;EAE1E,IAAIA,OAAO,CAACsB,gBAAgB,IAAItB,OAAO,CAACsB,gBAAgB,KAAK,SAAS,EACtE;AACID,IAAAA,IAAI,GAAG,CAAA,EAAGA,IAAI,KAAKrB,OAAO,CAACsB,gBAAgB,CAAA,CAAA,CAAG;AAClD,EAAA;EAEA,IAAItB,OAAO,CAACuB,UAAU,EACtB;IACIF,IAAI,GAAG,CAAA,EAAGA,IAAI,CAAA,aAAA,CAAe;AACjC,EAAA;EAEA,QAAQrB,OAAO,CAACwB,YAAY;AAExB,IAAA,KAAK,KAAK;MACN,OAAO,CAAA,CAAA,EAAIH,IAAI,CAAA,CAAE;AAErB,IAAA,KAAK,KAAK;MACN,OAAO,CAAA,CAAA,EAAIA,IAAI,CAAA,CAAA,CAAG;AAEtB,IAAA,KAAK,QAAQ;MACT,OAAO,CAAA,EAAA,EAAKA,IAAI,CAAA,CAAA,CAAG;AAEvB,IAAA;AACI,MAAA,OAAOA,IAAI;AACnB;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASI,uBAAuBA,CAACC,WAAW,EAC5C;AACI,EAAA,MAAMC,WAAW,GAAGD,WAAW,CAACC,WAAW;EAE3C,IAAI,CAACA,WAAW,EAChB;AACI,IAAA,OAAO,EAAE;AACb,EAAA;EAEA,MAAMC,KAAK,GAAG,EAAE;AAEhB,EAAA,KAAK,MAAM,CAAEC,GAAG,EAAE1C,KAAK,CAAE,IAAIlC,MAAM,CAAC6E,OAAO,CAACH,WAAW,CAAC,EACxD;IACI,IAAIxC,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK4C,SAAS,IAAIF,GAAG,KAAK,eAAe,EACpE;AACI,MAAA;AACJ,IAAA;AAEA,IAAA,IAAI,OAAO1C,KAAK,KAAK,QAAQ,EAC7B;AACI,MAAA;AACJ,IAAA;IAEAyC,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGH,GAAG,CAAA,CAAA,EAAI1C,KAAK,EAAE,CAAC;AACjC,EAAA;AAEA,EAAA,OAAOyC,KAAK,CAAC1B,MAAM,GAAG,CAAA,GAAA,EAAM0B,KAAK,CAAChB,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,GAAG,EAAE;AACtD;AAEA,MAAMqB,WAAW,GAAG,IAAIhD,GAAG,CAAC,CAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAE,CAAC;AAClF,MAAMiD,YAAY,GAAG,IAAIjD,GAAG,CAAC,CAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAE,CAAC;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASkD,uBAAuBA,CAACC,OAAO,EAAEC,OAAO,GAAG,EAAE,EAC7D;AACI,EAAA,MAAMC,YAAY,GAAGF,OAAO,EAAEE,YAAY,IAAI,EAAE;AAChD,EAAA,MAAMC,gBAAgB,GAAGF,OAAO,CAACG,YAAY,KAAK,KAAK;AACvD,EAAA,MAAMC,WAAW,GAAGJ,OAAO,CAACK,OAAO,KAAK,KAAK;AAC7C,EAAA,MAAMC,YAAY,GAAGN,OAAO,CAACO,MAAM,KAAK,KAAK;EAC7C,MAAMC,KAAK,GAAG,EAAE;EAChB,IAAIvC,KAAK,GAAG,CAAC;EACb,IAAIwC,KAAK,GAAG,CAAC;AAEb,EAAA,KAAK,MAAMpB,WAAW,IAAIY,YAAY,EACtC;IACI,MAAMS,IAAI,GAAGrB,WAAW,CAACsB,UAAU,IAAI,CAAA,OAAA,EAAUtB,WAAW,CAACuB,MAAM,CAAA,CAAE;IAErE,IAAIvB,WAAW,CAACwB,aAAa,EAC7B;AACI,MAAA,IAAIX,gBAAgB,EACpB;AACI,QAAA,MAAMY,QAAQ,GAAG,CAACzB,WAAW,CAACyB,QAAQ,IAAI,EAAE,EAAE9C,GAAG,CAACM,aAAa,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;AAE3EiC,QAAAA,KAAK,CAACb,IAAI,CAAC,CAAA,EAAG,GAAG,CAACoB,MAAM,CAACX,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,EAAGM,IAAI,CAAA,EAAGI,QAAQ,GAAG,CAAA,CAAA,EAAIA,QAAQ,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,GACjF1B,uBAAuB,CAACC,WAAW,CAAC,CAAC;AAC/C,MAAA;AAEA,MAAA;AACJ,IAAA;IAEA,IAAIA,WAAW,CAAC2B,UAAU,EAC1B;MACI,MAAMC,SAAS,GAAG5B,WAAW,CAAC2B,UAAU,CAACE,aAAa,IAAI,aAAa;AAEvEV,MAAAA,KAAK,CAACb,IAAI,CAAC,CAAA,EAAG,GAAG,CAACoB,MAAM,CAACX,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,EAAGa,SAAS,EAAE,CAAC;AAC5D,MAAA;AACJ,IAAA;IAEA,IAAIX,YAAY,IAAIT,YAAY,CAAC/B,GAAG,CAAC4C,IAAI,CAAC,EAC1C;MACID,KAAK,GAAGlD,IAAI,CAAC4D,GAAG,CAAC,CAAC,EAAEV,KAAK,GAAG,CAAC,CAAC;AAClC,IAAA;AAEA,IAAA,MAAMK,QAAQ,GAAG,CAACzB,WAAW,CAACyB,QAAQ,IAAI,EAAE,EAAE9C,GAAG,CAACM,aAAa,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAC3E,MAAM6C,SAAS,GAAG/B,WAAW,CAACgC,QAAQ,GAAG,MAAM,GAAG,EAAE;AACpD,IAAA,MAAMC,OAAO,GAAGjC,WAAW,CAACkC,WAAW,GAAG,CAAA,UAAA,EAAalC,WAAW,CAACkC,WAAW,CAAA,CAAA,CAAG,GAAG,EAAE;AACtF,IAAA,MAAMxC,MAAM,GAAGqB,WAAW,GAAG,CAAA,EAAGrD,MAAM,CAACkB,KAAK,CAAC,CAACZ,QAAQ,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI,GAAG,EAAE;IAClE,MAAMmE,GAAG,GAAGlB,YAAY,GAAG,IAAI,CAACS,MAAM,CAACN,KAAK,CAAC,GAAG,EAAE;IAElDD,KAAK,CAACb,IAAI,CAAC,CAAA,EAAGZ,MAAM,CAAA,EAAGyC,GAAG,CAAA,EAAGd,IAAI,CAAA,EAAGU,SAAS,GAAGN,QAAQ,GAAG,IAAIA,QAAQ,CAAA,CAAE,GAAG,EAAE,CAAA,EAAGQ,OAAO,CAAA,CAAE,CAAC;AAC3FrD,IAAAA,KAAK,EAAE;IAEP,IAAIqC,YAAY,IAAIV,WAAW,CAAC9B,GAAG,CAAC4C,IAAI,CAAC,EACzC;AACID,MAAAA,KAAK,EAAE;AACX,IAAA;AACJ,EAAA;AAEA,EAAA,OAAOD,KAAK,CAACjC,IAAI,CAAC,IAAI,CAAC;AAC3B;;;;"}
@@ -1,4 +1,4 @@
1
- import { DEFAULT_VALUES, normalizeValues, validateClassKey, validateClass, readWithValues, inspectWithValues, toJsonValue, importNodeModule, OUTPUT_CMF, OUTPUT_GR2, OUTPUT_SHARED, OUTPUT_GLTF_JSON, OUTPUT_JSON, CLASS_KEYS } from './core/helpers.js';
1
+ import { DEFAULT_VALUES, normalizeValues, validateClassKey, validateClass, readWithValues, inspectWithValues, toJsonValue, OUTPUT_CMF, OUTPUT_GR2, OUTPUT_SHARED, OUTPUT_GLTF_JSON, OUTPUT_JSON, CLASS_KEYS } from './core/helpers.js';
2
2
  import { isGlb, toBytes } from './core/parser.js';
3
3
 
4
4
  /**
@@ -200,44 +200,6 @@ class CjsGltfFormat {
200
200
  return toJsonValue(value);
201
201
  }
202
202
 
203
- /**
204
- * Node-only convenience: reads a glTF or GLB file from disk.
205
- *
206
- * External `.bin` buffers referenced by relative URI are loaded beside the
207
- * `.gltf` file. GLB binary chunks are handled directly.
208
- *
209
- * @param {string} path Path to a `.gltf` or `.glb` file.
210
- * @param {object} [options] Format values.
211
- * @returns {Promise<object>} The shared CarbonEngineJS JSON geometry schema.
212
- */
213
- static async readFile(path, options = {}) {
214
- if (typeof path !== "string" || !path) {
215
- throw new TypeError(`${FORMAT_NAME}: readFile path must be a non-empty string`);
216
- }
217
- const fs = await importNodeModule("node:fs/promises"),
218
- pathModule = await importNodeModule("node:path"),
219
- input = await fs.readFile(path);
220
- if (isGlb(input)) {
221
- return CjsGltfFormat.read(input, {
222
- source: path,
223
- ...options
224
- });
225
- }
226
- const text = new TextDecoder().decode(input),
227
- gltf = JSON.parse(text),
228
- buffers = {};
229
- for (const buffer of gltf.buffers || []) {
230
- if (!buffer.uri || buffer.uri.startsWith("data:")) continue;
231
- const uri = decodeURIComponent(buffer.uri);
232
- buffers[buffer.uri] = await fs.readFile(pathModule.resolve(pathModule.dirname(path), uri));
233
- }
234
- return CjsGltfFormat.read(gltf, {
235
- source: path,
236
- buffers,
237
- ...options
238
- });
239
- }
240
-
241
203
  /**
242
204
  * Cheap payload sniff for GLB bytes.
243
205
  *
@@ -1 +1 @@
1
- {"version":3,"file":"CjsGltfFormat.js","sources":["../../../../src/formats/gltf/CjsGltfFormat.js"],"sourcesContent":["/**\n * Exposed CarbonEngineJS-facing glTF/GLB format class.\n *\n * Keep this file small and reviewable: glTF parsing, accessor decoding,\n * mesh conversion, skin conversion, animation conversion, and geometry helper\n * glue live under src/core.\n */\n\nimport {\n CLASS_KEYS,\n DEFAULT_VALUES,\n OUTPUT_CMF,\n OUTPUT_GLTF_JSON,\n OUTPUT_GR2,\n OUTPUT_JSON,\n OUTPUT_SHARED,\n importNodeModule,\n inspectWithValues,\n isGlb,\n normalizeValues,\n readWithValues,\n toBytes,\n toJsonValue,\n validateClass,\n validateClassKey\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsGltfFormat\";\n\n/**\n * CarbonEngineJS-facing glTF/GLB format surface.\n *\n * The Cjs prefix marks this as a JavaScript format/construction boundary.\n * glTF is the import source; the public read contract is the shared\n * CarbonEngineJS JSON mesh, skeleton, and animation schema.\n */\nexport class CjsGltfFormat\n{\n\n #emit = DEFAULT_VALUES.emit;\n #source = DEFAULT_VALUES.source;\n #buffers = DEFAULT_VALUES.buffers;\n #packTangents = DEFAULT_VALUES.packTangents;\n #uvHandedness = DEFAULT_VALUES.uvHandedness;\n #rebuildMissingNormals = DEFAULT_VALUES.rebuildMissingNormals;\n #rebuildMissingTangents = DEFAULT_VALUES.rebuildMissingTangents;\n #rebuildMissingBiNormals = DEFAULT_VALUES.rebuildMissingBiNormals;\n #classes = DEFAULT_VALUES.classes;\n\n /**\n * Create a reusable format profile.\n *\n * @param {object} [options] Default format values.\n */\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n /**\n * Set format values for this reusable profile.\n *\n * @param {object} [options] Values to merge into the profile.\n * @returns {CjsGltfFormat} This format profile.\n */\n SetValues(options = {})\n {\n const values = normalizeValues(this.GetValues(), options, FORMAT_NAME);\n\n this.#emit = values.emit;\n this.#source = values.source;\n this.#buffers = values.buffers;\n this.#packTangents = values.packTangents;\n this.#uvHandedness = values.uvHandedness;\n this.#rebuildMissingNormals = values.rebuildMissingNormals;\n this.#rebuildMissingTangents = values.rebuildMissingTangents;\n this.#rebuildMissingBiNormals = values.rebuildMissingBiNormals;\n this.#classes = values.classes;\n\n return this;\n }\n\n /**\n * Get this profile's current values, optionally with per-call overrides.\n *\n * @param {object} [options] Optional values to merge into a copy.\n * @returns {object} A copy of the effective values.\n */\n GetValues(options = {})\n {\n return normalizeValues({\n emit: this.#emit,\n source: this.#source,\n buffers: this.#buffers,\n packTangents: this.#packTangents,\n uvHandedness: this.#uvHandedness,\n rebuildMissingNormals: this.#rebuildMissingNormals,\n rebuildMissingTangents: this.#rebuildMissingTangents,\n rebuildMissingBiNormals: this.#rebuildMissingBiNormals,\n classes: this.#classes\n }, options, FORMAT_NAME);\n }\n\n /**\n * Set multiple node-class constructors for this profile.\n *\n * @param {object} [classes] Map of node class keys to constructors.\n * @returns {CjsGltfFormat} This format profile.\n */\n SetClasses(classes = {})\n {\n return this.SetValues({ classes });\n }\n\n /**\n * Set one node-class constructor for this profile.\n *\n * @param {string} type Node class key.\n * @param {Function|null|undefined} Class Constructor to use, or nullish to delete.\n * @returns {CjsGltfFormat} This format profile.\n */\n SetClass(type, Class)\n {\n if (Class === null || Class === undefined)\n {\n validateClassKey(type, FORMAT_NAME);\n const classes = { ...this.#classes };\n delete classes[type];\n this.#classes = classes;\n return this;\n }\n\n validateClass(type, Class, FORMAT_NAME);\n return this.SetValues({ classes: { [type]: Class } });\n }\n\n /**\n * Get a configured node-class constructor.\n *\n * @param {string} type Node class key.\n * @returns {Function|undefined} The registered constructor, if any.\n */\n GetClass(type)\n {\n validateClassKey(type, FORMAT_NAME);\n return this.#classes[type];\n }\n\n /**\n * Whether this format profile has a constructor registered for a node key.\n *\n * @param {string} type Node class key.\n * @returns {boolean} True when a constructor is registered.\n */\n HasClass(type)\n {\n return !!this.GetClass(type);\n }\n\n /**\n * Read glTF/GLB data with this profile's values.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Per-call value overrides.\n * @returns {object} The shared CarbonEngineJS JSON geometry schema.\n */\n Read(input, options = {})\n {\n return readWithValues(this, input, this.GetValues(options));\n }\n\n /**\n * Inspect glTF/GLB data without hydrating classes.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Per-call value overrides.\n * @returns {object} Plain summary data.\n */\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options));\n }\n\n /**\n * Convert format output to JSON-compatible data.\n *\n * @param {any} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Static one-shot read. Static methods use camelCase by convention.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Format values.\n * @returns {object} The shared CarbonEngineJS JSON geometry schema.\n */\n static read(input, options = {})\n {\n return readWithValues(CjsGltfFormat, input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\n }\n\n /**\n * Static one-shot inspection.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Format values.\n * @returns {object} Plain summary data.\n */\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\n }\n\n /**\n * Static JSON-compatible conversion.\n *\n * @param {any} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Node-only convenience: reads a glTF or GLB file from disk.\n *\n * External `.bin` buffers referenced by relative URI are loaded beside the\n * `.gltf` file. GLB binary chunks are handled directly.\n *\n * @param {string} path Path to a `.gltf` or `.glb` file.\n * @param {object} [options] Format values.\n * @returns {Promise<object>} The shared CarbonEngineJS JSON geometry schema.\n */\n static async readFile(path, options = {})\n {\n if (typeof path !== \"string\" || !path)\n {\n throw new TypeError(`${FORMAT_NAME}: readFile path must be a non-empty string`);\n }\n\n const\n fs = await importNodeModule(\"node:fs/promises\"),\n pathModule = await importNodeModule(\"node:path\"),\n input = await fs.readFile(path);\n\n if (isGlb(input))\n {\n return CjsGltfFormat.read(input, { source: path, ...options });\n }\n\n const\n text = new TextDecoder().decode(input),\n gltf = JSON.parse(text),\n buffers = {};\n\n for (const buffer of gltf.buffers || [])\n {\n if (!buffer.uri || buffer.uri.startsWith(\"data:\")) continue;\n const uri = decodeURIComponent(buffer.uri);\n buffers[buffer.uri] = await fs.readFile(pathModule.resolve(pathModule.dirname(path), uri));\n }\n\n return CjsGltfFormat.read(gltf, { source: path, buffers, ...options });\n }\n\n /**\n * Cheap payload sniff for GLB bytes.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate bytes.\n * @returns {boolean} True when the payload starts with GLB magic.\n */\n static isGlb(input)\n {\n return isGlb(input);\n }\n\n /**\n * Cheap object/text/bytes sniff for glTF-like assets.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input Candidate glTF data.\n * @returns {boolean} True when the input looks like glTF 2.x or GLB.\n */\n static isGltf(input)\n {\n try\n {\n if (isGlb(input)) return true;\n if (input && typeof input === \"object\" && !ArrayBuffer.isView(input) && !(input instanceof ArrayBuffer))\n {\n return !!(input.asset && String(input.asset.version || \"\").startsWith(\"2\"));\n }\n const text = typeof input === \"string\" ? input : new TextDecoder().decode(toBytes(input));\n const json = JSON.parse(text);\n return !!(json.asset && String(json.asset.version || \"\").startsWith(\"2\"));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n static Output = Object.freeze({\n JSON: OUTPUT_JSON,\n GLTF_JSON: OUTPUT_GLTF_JSON,\n SHARED: OUTPUT_SHARED,\n GR2: OUTPUT_GR2,\n CMF: OUTPUT_CMF\n });\n static CLASS_KEYS = CLASS_KEYS;\n static type = Object.freeze([ \"geometry\" ]);\n static mediaTypes = Object.freeze([ \"geometry\" ]);\n static inputTypes = Object.freeze([ \"gltf\", \"glb\" ]);\n static outputTypes = Object.freeze([ OUTPUT_SHARED, OUTPUT_GR2, OUTPUT_CMF ]);\n static debugOutputTypes = Object.freeze([ OUTPUT_JSON, OUTPUT_GLTF_JSON ]);\n\n}\n\nexport default CjsGltfFormat;\n"],"names":["FORMAT_NAME","CjsGltfFormat","DEFAULT_VALUES","emit","source","buffers","packTangents","uvHandedness","rebuildMissingNormals","rebuildMissingTangents","rebuildMissingBiNormals","classes","constructor","options","SetValues","values","normalizeValues","GetValues","SetClasses","SetClass","type","Class","undefined","validateClassKey","validateClass","GetClass","HasClass","Read","input","readWithValues","Inspect","inspectWithValues","ToJSON","value","toJsonValue","read","inspect","toJSON","readFile","path","TypeError","fs","importNodeModule","pathModule","isGlb","text","TextDecoder","decode","gltf","JSON","parse","buffer","uri","startsWith","decodeURIComponent","resolve","dirname","isGltf","ArrayBuffer","isView","asset","String","version","toBytes","json","Output","Object","freeze","OUTPUT_JSON","GLTF_JSON","OUTPUT_GLTF_JSON","SHARED","OUTPUT_SHARED","GR2","OUTPUT_GR2","CMF","OUTPUT_CMF","CLASS_KEYS","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAqBA,MAAMA,WAAW,GAAG,eAAe;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,aAAa,CAC1B;AAEI,EAAA,KAAK,GAAGC,cAAc,CAACC,IAAI;AAC3B,EAAA,OAAO,GAAGD,cAAc,CAACE,MAAM;AAC/B,EAAA,QAAQ,GAAGF,cAAc,CAACG,OAAO;AACjC,EAAA,aAAa,GAAGH,cAAc,CAACI,YAAY;AAC3C,EAAA,aAAa,GAAGJ,cAAc,CAACK,YAAY;AAC3C,EAAA,sBAAsB,GAAGL,cAAc,CAACM,qBAAqB;AAC7D,EAAA,uBAAuB,GAAGN,cAAc,CAACO,sBAAsB;AAC/D,EAAA,wBAAwB,GAAGP,cAAc,CAACQ,uBAAuB;AACjE,EAAA,QAAQ,GAAGR,cAAc,CAACS,OAAO;;AAEjC;AACJ;AACA;AACA;AACA;AACIC,EAAAA,WAAWA,CAACC,OAAO,GAAG,EAAE,EACxB;AACI,IAAA,IAAI,CAACC,SAAS,CAACD,OAAO,CAAC;AAC3B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACIC,EAAAA,SAASA,CAACD,OAAO,GAAG,EAAE,EACtB;AACI,IAAA,MAAME,MAAM,GAAGC,eAAe,CAAC,IAAI,CAACC,SAAS,EAAE,EAAEJ,OAAO,EAAEb,WAAW,CAAC;AAEtE,IAAA,IAAI,CAAC,KAAK,GAAGe,MAAM,CAACZ,IAAI;AACxB,IAAA,IAAI,CAAC,OAAO,GAAGY,MAAM,CAACX,MAAM;AAC5B,IAAA,IAAI,CAAC,QAAQ,GAAGW,MAAM,CAACV,OAAO;AAC9B,IAAA,IAAI,CAAC,aAAa,GAAGU,MAAM,CAACT,YAAY;AACxC,IAAA,IAAI,CAAC,aAAa,GAAGS,MAAM,CAACR,YAAY;AACxC,IAAA,IAAI,CAAC,sBAAsB,GAAGQ,MAAM,CAACP,qBAAqB;AAC1D,IAAA,IAAI,CAAC,uBAAuB,GAAGO,MAAM,CAACN,sBAAsB;AAC5D,IAAA,IAAI,CAAC,wBAAwB,GAAGM,MAAM,CAACL,uBAAuB;AAC9D,IAAA,IAAI,CAAC,QAAQ,GAAGK,MAAM,CAACJ,OAAO;AAE9B,IAAA,OAAO,IAAI;AACf,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACIM,EAAAA,SAASA,CAACJ,OAAO,GAAG,EAAE,EACtB;AACI,IAAA,OAAOG,eAAe,CAAC;AACnBb,MAAAA,IAAI,EAAE,IAAI,CAAC,KAAK;AAChBC,MAAAA,MAAM,EAAE,IAAI,CAAC,OAAO;AACpBC,MAAAA,OAAO,EAAE,IAAI,CAAC,QAAQ;AACtBC,MAAAA,YAAY,EAAE,IAAI,CAAC,aAAa;AAChCC,MAAAA,YAAY,EAAE,IAAI,CAAC,aAAa;AAChCC,MAAAA,qBAAqB,EAAE,IAAI,CAAC,sBAAsB;AAClDC,MAAAA,sBAAsB,EAAE,IAAI,CAAC,uBAAuB;AACpDC,MAAAA,uBAAuB,EAAE,IAAI,CAAC,wBAAwB;MACtDC,OAAO,EAAE,IAAI,CAAC;AAClB,KAAC,EAAEE,OAAO,EAAEb,WAAW,CAAC;AAC5B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACIkB,EAAAA,UAAUA,CAACP,OAAO,GAAG,EAAE,EACvB;IACI,OAAO,IAAI,CAACG,SAAS,CAAC;AAAEH,MAAAA;AAAQ,KAAC,CAAC;AACtC,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACIQ,EAAAA,QAAQA,CAACC,IAAI,EAAEC,KAAK,EACpB;AACI,IAAA,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EACzC;AACIC,MAAAA,gBAAgB,CAACH,IAAI,EAAEpB,WAAW,CAAC;AACnC,MAAA,MAAMW,OAAO,GAAG;QAAE,GAAG,IAAI,CAAC;OAAU;MACpC,OAAOA,OAAO,CAACS,IAAI,CAAC;AACpB,MAAA,IAAI,CAAC,QAAQ,GAAGT,OAAO;AACvB,MAAA,OAAO,IAAI;AACf,IAAA;AAEAa,IAAAA,aAAa,CAACJ,IAAI,EAAEC,KAAK,EAAErB,WAAW,CAAC;IACvC,OAAO,IAAI,CAACc,SAAS,CAAC;AAAEH,MAAAA,OAAO,EAAE;AAAE,QAAA,CAACS,IAAI,GAAGC;AAAM;AAAE,KAAC,CAAC;AACzD,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACII,QAAQA,CAACL,IAAI,EACb;AACIG,IAAAA,gBAAgB,CAACH,IAAI,EAAEpB,WAAW,CAAC;AACnC,IAAA,OAAO,IAAI,CAAC,QAAQ,CAACoB,IAAI,CAAC;AAC9B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACIM,QAAQA,CAACN,IAAI,EACb;AACI,IAAA,OAAO,CAAC,CAAC,IAAI,CAACK,QAAQ,CAACL,IAAI,CAAC;AAChC,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACIO,EAAAA,IAAIA,CAACC,KAAK,EAAEf,OAAO,GAAG,EAAE,EACxB;AACI,IAAA,OAAOgB,cAAc,CAAC,IAAI,EAAED,KAAK,EAAE,IAAI,CAACX,SAAS,CAACJ,OAAO,CAAC,CAAC;AAC/D,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACIiB,EAAAA,OAAOA,CAACF,KAAK,EAAEf,OAAO,GAAG,EAAE,EAC3B;IACI,OAAOkB,iBAAiB,CAACH,KAAK,EAAE,IAAI,CAACX,SAAS,CAACJ,OAAO,CAAC,CAAC;AAC5D,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACImB,MAAMA,CAACC,KAAK,EACZ;IACI,OAAOC,WAAW,CAACD,KAAK,CAAC;AAC7B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,OAAOE,IAAIA,CAACP,KAAK,EAAEf,OAAO,GAAG,EAAE,EAC/B;AACI,IAAA,OAAOgB,cAAc,CAAC5B,aAAa,EAAE2B,KAAK,EAAEZ,eAAe,CAACd,cAAc,EAAEW,OAAO,EAAEb,WAAW,CAAC,CAAC;AACtG,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,OAAOoC,OAAOA,CAACR,KAAK,EAAEf,OAAO,GAAG,EAAE,EAClC;AACI,IAAA,OAAOkB,iBAAiB,CAACH,KAAK,EAAEZ,eAAe,CAACd,cAAc,EAAEW,OAAO,EAAEb,WAAW,CAAC,CAAC;AAC1F,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAOqC,MAAMA,CAACJ,KAAK,EACnB;IACI,OAAOC,WAAW,CAACD,KAAK,CAAC;AAC7B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,aAAaK,QAAQA,CAACC,IAAI,EAAE1B,OAAO,GAAG,EAAE,EACxC;AACI,IAAA,IAAI,OAAO0B,IAAI,KAAK,QAAQ,IAAI,CAACA,IAAI,EACrC;AACI,MAAA,MAAM,IAAIC,SAAS,CAAC,CAAA,EAAGxC,WAAW,4CAA4C,CAAC;AACnF,IAAA;AAEA,IAAA,MACIyC,EAAE,GAAG,MAAMC,gBAAgB,CAAC,kBAAkB,CAAC;AAC/CC,MAAAA,UAAU,GAAG,MAAMD,gBAAgB,CAAC,WAAW,CAAC;AAChDd,MAAAA,KAAK,GAAG,MAAMa,EAAE,CAACH,QAAQ,CAACC,IAAI,CAAC;AAEnC,IAAA,IAAIK,KAAK,CAAChB,KAAK,CAAC,EAChB;AACI,MAAA,OAAO3B,aAAa,CAACkC,IAAI,CAACP,KAAK,EAAE;AAAExB,QAAAA,MAAM,EAAEmC,IAAI;QAAE,GAAG1B;AAAQ,OAAC,CAAC;AAClE,IAAA;IAEA,MACIgC,IAAI,GAAG,IAAIC,WAAW,EAAE,CAACC,MAAM,CAACnB,KAAK,CAAC;AACtCoB,MAAAA,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACL,IAAI,CAAC;MACvBxC,OAAO,GAAG,EAAE;IAEhB,KAAK,MAAM8C,MAAM,IAAIH,IAAI,CAAC3C,OAAO,IAAI,EAAE,EACvC;AACI,MAAA,IAAI,CAAC8C,MAAM,CAACC,GAAG,IAAID,MAAM,CAACC,GAAG,CAACC,UAAU,CAAC,OAAO,CAAC,EAAE;AACnD,MAAA,MAAMD,GAAG,GAAGE,kBAAkB,CAACH,MAAM,CAACC,GAAG,CAAC;MAC1C/C,OAAO,CAAC8C,MAAM,CAACC,GAAG,CAAC,GAAG,MAAMX,EAAE,CAACH,QAAQ,CAACK,UAAU,CAACY,OAAO,CAACZ,UAAU,CAACa,OAAO,CAACjB,IAAI,CAAC,EAAEa,GAAG,CAAC,CAAC;AAC9F,IAAA;AAEA,IAAA,OAAOnD,aAAa,CAACkC,IAAI,CAACa,IAAI,EAAE;AAAE5C,MAAAA,MAAM,EAAEmC,IAAI;MAAElC,OAAO;MAAE,GAAGQ;AAAQ,KAAC,CAAC;AAC1E,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAO+B,KAAKA,CAAChB,KAAK,EAClB;IACI,OAAOgB,KAAK,CAAChB,KAAK,CAAC;AACvB,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAO6B,MAAMA,CAAC7B,KAAK,EACnB;IACI,IACA;AACI,MAAA,IAAIgB,KAAK,CAAChB,KAAK,CAAC,EAAE,OAAO,IAAI;MAC7B,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAAC8B,WAAW,CAACC,MAAM,CAAC/B,KAAK,CAAC,IAAI,EAAEA,KAAK,YAAY8B,WAAW,CAAC,EACvG;QACI,OAAO,CAAC,EAAE9B,KAAK,CAACgC,KAAK,IAAIC,MAAM,CAACjC,KAAK,CAACgC,KAAK,CAACE,OAAO,IAAI,EAAE,CAAC,CAACT,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/E,MAAA;MACA,MAAMR,IAAI,GAAG,OAAOjB,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,IAAIkB,WAAW,EAAE,CAACC,MAAM,CAACgB,OAAO,CAACnC,KAAK,CAAC,CAAC;AACzF,MAAA,MAAMoC,IAAI,GAAGf,IAAI,CAACC,KAAK,CAACL,IAAI,CAAC;MAC7B,OAAO,CAAC,EAAEmB,IAAI,CAACJ,KAAK,IAAIC,MAAM,CAACG,IAAI,CAACJ,KAAK,CAACE,OAAO,IAAI,EAAE,CAAC,CAACT,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7E,IAAA,CAAC,CACD,MACA;AACI,MAAA,OAAO,KAAK;AAChB,IAAA;AACJ,EAAA;;AAEA;AACJ;AACA;AACI,EAAA,OAAOY,MAAM,GAAGC,MAAM,CAACC,MAAM,CAAC;AAC1BlB,IAAAA,IAAI,EAAEmB,WAAW;AACjBC,IAAAA,SAAS,EAAEC,gBAAgB;AAC3BC,IAAAA,MAAM,EAAEC,aAAa;AACrBC,IAAAA,GAAG,EAAEC,UAAU;AACfC,IAAAA,GAAG,EAAEC;AACT,GAAC,CAAC;EACF,OAAOC,UAAU,GAAGA,UAAU;EAC9B,OAAOzD,IAAI,GAAG8C,MAAM,CAACC,MAAM,CAAC,CAAE,UAAU,CAAE,CAAC;EAC3C,OAAOW,UAAU,GAAGZ,MAAM,CAACC,MAAM,CAAC,CAAE,UAAU,CAAE,CAAC;EACjD,OAAOY,UAAU,GAAGb,MAAM,CAACC,MAAM,CAAC,CAAE,MAAM,EAAE,KAAK,CAAE,CAAC;AACpD,EAAA,OAAOa,WAAW,GAAGd,MAAM,CAACC,MAAM,CAAC,CAAEK,aAAa,EAAEE,UAAU,EAAEE,UAAU,CAAE,CAAC;EAC7E,OAAOK,gBAAgB,GAAGf,MAAM,CAACC,MAAM,CAAC,CAAEC,WAAW,EAAEE,gBAAgB,CAAE,CAAC;AAE9E;;;;"}
1
+ {"version":3,"file":"CjsGltfFormat.js","sources":["../../../../src/formats/gltf/CjsGltfFormat.js"],"sourcesContent":["/**\n * Exposed CarbonEngineJS-facing glTF/GLB format class.\n *\n * Keep this file small and reviewable: glTF parsing, accessor decoding,\n * mesh conversion, skin conversion, animation conversion, and geometry helper\n * glue live under src/core.\n */\n\nimport {\n CLASS_KEYS,\n DEFAULT_VALUES,\n OUTPUT_CMF,\n OUTPUT_GLTF_JSON,\n OUTPUT_GR2,\n OUTPUT_JSON,\n OUTPUT_SHARED,\n inspectWithValues,\n isGlb,\n normalizeValues,\n readWithValues,\n toBytes,\n toJsonValue,\n validateClass,\n validateClassKey\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsGltfFormat\";\n\n/**\n * CarbonEngineJS-facing glTF/GLB format surface.\n *\n * The Cjs prefix marks this as a JavaScript format/construction boundary.\n * glTF is the import source; the public read contract is the shared\n * CarbonEngineJS JSON mesh, skeleton, and animation schema.\n */\nexport class CjsGltfFormat\n{\n\n #emit = DEFAULT_VALUES.emit;\n #source = DEFAULT_VALUES.source;\n #buffers = DEFAULT_VALUES.buffers;\n #packTangents = DEFAULT_VALUES.packTangents;\n #uvHandedness = DEFAULT_VALUES.uvHandedness;\n #rebuildMissingNormals = DEFAULT_VALUES.rebuildMissingNormals;\n #rebuildMissingTangents = DEFAULT_VALUES.rebuildMissingTangents;\n #rebuildMissingBiNormals = DEFAULT_VALUES.rebuildMissingBiNormals;\n #classes = DEFAULT_VALUES.classes;\n\n /**\n * Create a reusable format profile.\n *\n * @param {object} [options] Default format values.\n */\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n /**\n * Set format values for this reusable profile.\n *\n * @param {object} [options] Values to merge into the profile.\n * @returns {CjsGltfFormat} This format profile.\n */\n SetValues(options = {})\n {\n const values = normalizeValues(this.GetValues(), options, FORMAT_NAME);\n\n this.#emit = values.emit;\n this.#source = values.source;\n this.#buffers = values.buffers;\n this.#packTangents = values.packTangents;\n this.#uvHandedness = values.uvHandedness;\n this.#rebuildMissingNormals = values.rebuildMissingNormals;\n this.#rebuildMissingTangents = values.rebuildMissingTangents;\n this.#rebuildMissingBiNormals = values.rebuildMissingBiNormals;\n this.#classes = values.classes;\n\n return this;\n }\n\n /**\n * Get this profile's current values, optionally with per-call overrides.\n *\n * @param {object} [options] Optional values to merge into a copy.\n * @returns {object} A copy of the effective values.\n */\n GetValues(options = {})\n {\n return normalizeValues({\n emit: this.#emit,\n source: this.#source,\n buffers: this.#buffers,\n packTangents: this.#packTangents,\n uvHandedness: this.#uvHandedness,\n rebuildMissingNormals: this.#rebuildMissingNormals,\n rebuildMissingTangents: this.#rebuildMissingTangents,\n rebuildMissingBiNormals: this.#rebuildMissingBiNormals,\n classes: this.#classes\n }, options, FORMAT_NAME);\n }\n\n /**\n * Set multiple node-class constructors for this profile.\n *\n * @param {object} [classes] Map of node class keys to constructors.\n * @returns {CjsGltfFormat} This format profile.\n */\n SetClasses(classes = {})\n {\n return this.SetValues({ classes });\n }\n\n /**\n * Set one node-class constructor for this profile.\n *\n * @param {string} type Node class key.\n * @param {Function|null|undefined} Class Constructor to use, or nullish to delete.\n * @returns {CjsGltfFormat} This format profile.\n */\n SetClass(type, Class)\n {\n if (Class === null || Class === undefined)\n {\n validateClassKey(type, FORMAT_NAME);\n const classes = { ...this.#classes };\n delete classes[type];\n this.#classes = classes;\n return this;\n }\n\n validateClass(type, Class, FORMAT_NAME);\n return this.SetValues({ classes: { [type]: Class } });\n }\n\n /**\n * Get a configured node-class constructor.\n *\n * @param {string} type Node class key.\n * @returns {Function|undefined} The registered constructor, if any.\n */\n GetClass(type)\n {\n validateClassKey(type, FORMAT_NAME);\n return this.#classes[type];\n }\n\n /**\n * Whether this format profile has a constructor registered for a node key.\n *\n * @param {string} type Node class key.\n * @returns {boolean} True when a constructor is registered.\n */\n HasClass(type)\n {\n return !!this.GetClass(type);\n }\n\n /**\n * Read glTF/GLB data with this profile's values.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Per-call value overrides.\n * @returns {object} The shared CarbonEngineJS JSON geometry schema.\n */\n Read(input, options = {})\n {\n return readWithValues(this, input, this.GetValues(options));\n }\n\n /**\n * Inspect glTF/GLB data without hydrating classes.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Per-call value overrides.\n * @returns {object} Plain summary data.\n */\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options));\n }\n\n /**\n * Convert format output to JSON-compatible data.\n *\n * @param {any} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Static one-shot read. Static methods use camelCase by convention.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Format values.\n * @returns {object} The shared CarbonEngineJS JSON geometry schema.\n */\n static read(input, options = {})\n {\n return readWithValues(CjsGltfFormat, input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\n }\n\n /**\n * Static one-shot inspection.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input glTF object, JSON text/bytes, or GLB bytes.\n * @param {object} [options] Format values.\n * @returns {object} Plain summary data.\n */\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\n }\n\n /**\n * Static JSON-compatible conversion.\n *\n * @param {any} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Cheap payload sniff for GLB bytes.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate bytes.\n * @returns {boolean} True when the payload starts with GLB magic.\n */\n static isGlb(input)\n {\n return isGlb(input);\n }\n\n /**\n * Cheap object/text/bytes sniff for glTF-like assets.\n *\n * @param {object|string|Uint8Array|ArrayBuffer|DataView} input Candidate glTF data.\n * @returns {boolean} True when the input looks like glTF 2.x or GLB.\n */\n static isGltf(input)\n {\n try\n {\n if (isGlb(input)) return true;\n if (input && typeof input === \"object\" && !ArrayBuffer.isView(input) && !(input instanceof ArrayBuffer))\n {\n return !!(input.asset && String(input.asset.version || \"\").startsWith(\"2\"));\n }\n const text = typeof input === \"string\" ? input : new TextDecoder().decode(toBytes(input));\n const json = JSON.parse(text);\n return !!(json.asset && String(json.asset.version || \"\").startsWith(\"2\"));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n static Output = Object.freeze({\n JSON: OUTPUT_JSON,\n GLTF_JSON: OUTPUT_GLTF_JSON,\n SHARED: OUTPUT_SHARED,\n GR2: OUTPUT_GR2,\n CMF: OUTPUT_CMF\n });\n static CLASS_KEYS = CLASS_KEYS;\n static type = Object.freeze([ \"geometry\" ]);\n static mediaTypes = Object.freeze([ \"geometry\" ]);\n static inputTypes = Object.freeze([ \"gltf\", \"glb\" ]);\n static outputTypes = Object.freeze([ OUTPUT_SHARED, OUTPUT_GR2, OUTPUT_CMF ]);\n static debugOutputTypes = Object.freeze([ OUTPUT_JSON, OUTPUT_GLTF_JSON ]);\n\n}\n\nexport default CjsGltfFormat;\n"],"names":["FORMAT_NAME","CjsGltfFormat","DEFAULT_VALUES","emit","source","buffers","packTangents","uvHandedness","rebuildMissingNormals","rebuildMissingTangents","rebuildMissingBiNormals","classes","constructor","options","SetValues","values","normalizeValues","GetValues","SetClasses","SetClass","type","Class","undefined","validateClassKey","validateClass","GetClass","HasClass","Read","input","readWithValues","Inspect","inspectWithValues","ToJSON","value","toJsonValue","read","inspect","toJSON","isGlb","isGltf","ArrayBuffer","isView","asset","String","version","startsWith","text","TextDecoder","decode","toBytes","json","JSON","parse","Output","Object","freeze","OUTPUT_JSON","GLTF_JSON","OUTPUT_GLTF_JSON","SHARED","OUTPUT_SHARED","GR2","OUTPUT_GR2","CMF","OUTPUT_CMF","CLASS_KEYS","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoBA,MAAMA,WAAW,GAAG,eAAe;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,aAAa,CAC1B;AAEI,EAAA,KAAK,GAAGC,cAAc,CAACC,IAAI;AAC3B,EAAA,OAAO,GAAGD,cAAc,CAACE,MAAM;AAC/B,EAAA,QAAQ,GAAGF,cAAc,CAACG,OAAO;AACjC,EAAA,aAAa,GAAGH,cAAc,CAACI,YAAY;AAC3C,EAAA,aAAa,GAAGJ,cAAc,CAACK,YAAY;AAC3C,EAAA,sBAAsB,GAAGL,cAAc,CAACM,qBAAqB;AAC7D,EAAA,uBAAuB,GAAGN,cAAc,CAACO,sBAAsB;AAC/D,EAAA,wBAAwB,GAAGP,cAAc,CAACQ,uBAAuB;AACjE,EAAA,QAAQ,GAAGR,cAAc,CAACS,OAAO;;AAEjC;AACJ;AACA;AACA;AACA;AACIC,EAAAA,WAAWA,CAACC,OAAO,GAAG,EAAE,EACxB;AACI,IAAA,IAAI,CAACC,SAAS,CAACD,OAAO,CAAC;AAC3B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACIC,EAAAA,SAASA,CAACD,OAAO,GAAG,EAAE,EACtB;AACI,IAAA,MAAME,MAAM,GAAGC,eAAe,CAAC,IAAI,CAACC,SAAS,EAAE,EAAEJ,OAAO,EAAEb,WAAW,CAAC;AAEtE,IAAA,IAAI,CAAC,KAAK,GAAGe,MAAM,CAACZ,IAAI;AACxB,IAAA,IAAI,CAAC,OAAO,GAAGY,MAAM,CAACX,MAAM;AAC5B,IAAA,IAAI,CAAC,QAAQ,GAAGW,MAAM,CAACV,OAAO;AAC9B,IAAA,IAAI,CAAC,aAAa,GAAGU,MAAM,CAACT,YAAY;AACxC,IAAA,IAAI,CAAC,aAAa,GAAGS,MAAM,CAACR,YAAY;AACxC,IAAA,IAAI,CAAC,sBAAsB,GAAGQ,MAAM,CAACP,qBAAqB;AAC1D,IAAA,IAAI,CAAC,uBAAuB,GAAGO,MAAM,CAACN,sBAAsB;AAC5D,IAAA,IAAI,CAAC,wBAAwB,GAAGM,MAAM,CAACL,uBAAuB;AAC9D,IAAA,IAAI,CAAC,QAAQ,GAAGK,MAAM,CAACJ,OAAO;AAE9B,IAAA,OAAO,IAAI;AACf,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACIM,EAAAA,SAASA,CAACJ,OAAO,GAAG,EAAE,EACtB;AACI,IAAA,OAAOG,eAAe,CAAC;AACnBb,MAAAA,IAAI,EAAE,IAAI,CAAC,KAAK;AAChBC,MAAAA,MAAM,EAAE,IAAI,CAAC,OAAO;AACpBC,MAAAA,OAAO,EAAE,IAAI,CAAC,QAAQ;AACtBC,MAAAA,YAAY,EAAE,IAAI,CAAC,aAAa;AAChCC,MAAAA,YAAY,EAAE,IAAI,CAAC,aAAa;AAChCC,MAAAA,qBAAqB,EAAE,IAAI,CAAC,sBAAsB;AAClDC,MAAAA,sBAAsB,EAAE,IAAI,CAAC,uBAAuB;AACpDC,MAAAA,uBAAuB,EAAE,IAAI,CAAC,wBAAwB;MACtDC,OAAO,EAAE,IAAI,CAAC;AAClB,KAAC,EAAEE,OAAO,EAAEb,WAAW,CAAC;AAC5B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACIkB,EAAAA,UAAUA,CAACP,OAAO,GAAG,EAAE,EACvB;IACI,OAAO,IAAI,CAACG,SAAS,CAAC;AAAEH,MAAAA;AAAQ,KAAC,CAAC;AACtC,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACIQ,EAAAA,QAAQA,CAACC,IAAI,EAAEC,KAAK,EACpB;AACI,IAAA,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EACzC;AACIC,MAAAA,gBAAgB,CAACH,IAAI,EAAEpB,WAAW,CAAC;AACnC,MAAA,MAAMW,OAAO,GAAG;QAAE,GAAG,IAAI,CAAC;OAAU;MACpC,OAAOA,OAAO,CAACS,IAAI,CAAC;AACpB,MAAA,IAAI,CAAC,QAAQ,GAAGT,OAAO;AACvB,MAAA,OAAO,IAAI;AACf,IAAA;AAEAa,IAAAA,aAAa,CAACJ,IAAI,EAAEC,KAAK,EAAErB,WAAW,CAAC;IACvC,OAAO,IAAI,CAACc,SAAS,CAAC;AAAEH,MAAAA,OAAO,EAAE;AAAE,QAAA,CAACS,IAAI,GAAGC;AAAM;AAAE,KAAC,CAAC;AACzD,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACII,QAAQA,CAACL,IAAI,EACb;AACIG,IAAAA,gBAAgB,CAACH,IAAI,EAAEpB,WAAW,CAAC;AACnC,IAAA,OAAO,IAAI,CAAC,QAAQ,CAACoB,IAAI,CAAC;AAC9B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACIM,QAAQA,CAACN,IAAI,EACb;AACI,IAAA,OAAO,CAAC,CAAC,IAAI,CAACK,QAAQ,CAACL,IAAI,CAAC;AAChC,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACIO,EAAAA,IAAIA,CAACC,KAAK,EAAEf,OAAO,GAAG,EAAE,EACxB;AACI,IAAA,OAAOgB,cAAc,CAAC,IAAI,EAAED,KAAK,EAAE,IAAI,CAACX,SAAS,CAACJ,OAAO,CAAC,CAAC;AAC/D,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACIiB,EAAAA,OAAOA,CAACF,KAAK,EAAEf,OAAO,GAAG,EAAE,EAC3B;IACI,OAAOkB,iBAAiB,CAACH,KAAK,EAAE,IAAI,CAACX,SAAS,CAACJ,OAAO,CAAC,CAAC;AAC5D,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACImB,MAAMA,CAACC,KAAK,EACZ;IACI,OAAOC,WAAW,CAACD,KAAK,CAAC;AAC7B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,OAAOE,IAAIA,CAACP,KAAK,EAAEf,OAAO,GAAG,EAAE,EAC/B;AACI,IAAA,OAAOgB,cAAc,CAAC5B,aAAa,EAAE2B,KAAK,EAAEZ,eAAe,CAACd,cAAc,EAAEW,OAAO,EAAEb,WAAW,CAAC,CAAC;AACtG,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,OAAOoC,OAAOA,CAACR,KAAK,EAAEf,OAAO,GAAG,EAAE,EAClC;AACI,IAAA,OAAOkB,iBAAiB,CAACH,KAAK,EAAEZ,eAAe,CAACd,cAAc,EAAEW,OAAO,EAAEb,WAAW,CAAC,CAAC;AAC1F,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAOqC,MAAMA,CAACJ,KAAK,EACnB;IACI,OAAOC,WAAW,CAACD,KAAK,CAAC;AAC7B,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAOK,KAAKA,CAACV,KAAK,EAClB;IACI,OAAOU,KAAK,CAACV,KAAK,CAAC;AACvB,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAOW,MAAMA,CAACX,KAAK,EACnB;IACI,IACA;AACI,MAAA,IAAIU,KAAK,CAACV,KAAK,CAAC,EAAE,OAAO,IAAI;MAC7B,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACY,WAAW,CAACC,MAAM,CAACb,KAAK,CAAC,IAAI,EAAEA,KAAK,YAAYY,WAAW,CAAC,EACvG;QACI,OAAO,CAAC,EAAEZ,KAAK,CAACc,KAAK,IAAIC,MAAM,CAACf,KAAK,CAACc,KAAK,CAACE,OAAO,IAAI,EAAE,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/E,MAAA;MACA,MAAMC,IAAI,GAAG,OAAOlB,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,IAAImB,WAAW,EAAE,CAACC,MAAM,CAACC,OAAO,CAACrB,KAAK,CAAC,CAAC;AACzF,MAAA,MAAMsB,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACN,IAAI,CAAC;MAC7B,OAAO,CAAC,EAAEI,IAAI,CAACR,KAAK,IAAIC,MAAM,CAACO,IAAI,CAACR,KAAK,CAACE,OAAO,IAAI,EAAE,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7E,IAAA,CAAC,CACD,MACA;AACI,MAAA,OAAO,KAAK;AAChB,IAAA;AACJ,EAAA;;AAEA;AACJ;AACA;AACI,EAAA,OAAOQ,MAAM,GAAGC,MAAM,CAACC,MAAM,CAAC;AAC1BJ,IAAAA,IAAI,EAAEK,WAAW;AACjBC,IAAAA,SAAS,EAAEC,gBAAgB;AAC3BC,IAAAA,MAAM,EAAEC,aAAa;AACrBC,IAAAA,GAAG,EAAEC,UAAU;AACfC,IAAAA,GAAG,EAAEC;AACT,GAAC,CAAC;EACF,OAAOC,UAAU,GAAGA,UAAU;EAC9B,OAAO7C,IAAI,GAAGkC,MAAM,CAACC,MAAM,CAAC,CAAE,UAAU,CAAE,CAAC;EAC3C,OAAOW,UAAU,GAAGZ,MAAM,CAACC,MAAM,CAAC,CAAE,UAAU,CAAE,CAAC;EACjD,OAAOY,UAAU,GAAGb,MAAM,CAACC,MAAM,CAAC,CAAE,MAAM,EAAE,KAAK,CAAE,CAAC;AACpD,EAAA,OAAOa,WAAW,GAAGd,MAAM,CAACC,MAAM,CAAC,CAAEK,aAAa,EAAEE,UAAU,EAAEE,UAAU,CAAE,CAAC;EAC7E,OAAOK,gBAAgB,GAAGf,MAAM,CAACC,MAAM,CAAC,CAAEC,WAAW,EAAEE,gBAAgB,CAAE,CAAC;AAE9E;;;;"}
@@ -283,25 +283,5 @@ function toJsonValue(value) {
283
283
  return out;
284
284
  }
285
285
 
286
- /**
287
- * Imports a Node built-in module without exposing the specifier to any
288
- * bundler's static import graph.
289
- *
290
- * `await import("node:fs/promises")` written as a literal is resolved
291
- * eagerly by webpack/Rollup/esbuild alike when they walk the module
292
- * graph, breaking browser builds even though this path only ever runs
293
- * under Node (readFile is a Node-only convenience). Building the
294
- * specifier inside a `Function` body hides it from every bundler's
295
- * static analysis - it only exists at runtime, in the Node process that
296
- * actually calls readFile.
297
- *
298
- * @param {string} specifier Node built-in module specifier, e.g. "node:fs/promises".
299
- * @returns {Promise<any>} The imported module namespace.
300
- */
301
- function importNodeModule(specifier) {
302
- // eslint-disable-next-line no-new-func
303
- return new Function("s", "return import(s)")(specifier);
304
- }
305
-
306
- export { CLASS_KEYS, DEFAULT_VALUES, OUTPUT_CMF, OUTPUT_GLTF_JSON, OUTPUT_GR2, OUTPUT_JSON, OUTPUT_SHARED, importNodeModule, inspectWithValues, normalizeValues, readWithValues, toJsonValue, validateClass, validateClassKey };
286
+ export { CLASS_KEYS, DEFAULT_VALUES, OUTPUT_CMF, OUTPUT_GLTF_JSON, OUTPUT_GR2, OUTPUT_JSON, OUTPUT_SHARED, inspectWithValues, normalizeValues, readWithValues, toJsonValue, validateClass, validateClassKey };
307
287
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../../../src/formats/gltf/core/helpers.js"],"sourcesContent":["/**\n * Internal read-pipeline glue for CjsGltfFormat.\n */\n\nimport { CLASS_KEYS as GR2_CLASS_KEYS, hydrateJson } from \"./json.js\";\nimport { buildCmfFromShared, CMF_CLASS_KEYS, hydrateCmf } from \"./targets.js\";\nimport { inspectGltf, isGlb, parseGltfToJson, parseInput, toBytes } from \"./parser.js\";\nimport {\n generateBiNormals,\n generateNormals,\n generateTangents\n} from \"@carbonenginejs/runtime-utils/mesh\";\nimport {\n packTangentFrames\n} from \"@carbonenginejs/runtime-utils/tangent\";\nimport {\n cross,\n normalize\n} from \"@carbonenginejs/runtime-utils/vec3\";\n\nexport const CLASS_KEYS = Object.freeze(Array.from(new Set([\n ...GR2_CLASS_KEYS,\n ...CMF_CLASS_KEYS\n])));\n\nexport { isGlb, toBytes };\n\nexport const OUTPUT_JSON = \"json\";\nexport const OUTPUT_GLTF_JSON = \"gltfJson\";\nexport const OUTPUT_SHARED = \"shared\";\nexport const OUTPUT_GR2 = \"gr2\";\nexport const OUTPUT_CMF = \"cmf\";\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_GLTF_JSON,\n source: \"memory\",\n buffers: null,\n packTangents: false,\n uvHandedness: \"right\",\n rebuildMissingNormals: false,\n rebuildMissingTangents: false,\n rebuildMissingBiNormals: false,\n classes: Object.freeze({})\n});\n\nconst OPTION_KEYS = new Set([\n \"emit\",\n \"source\",\n \"buffers\",\n \"packTangents\",\n \"uvHandedness\",\n \"rebuildMissingNormals\",\n \"rebuildMissingTangents\",\n \"rebuildMissingBiNormals\",\n \"classes\"\n]);\n\n/** Validates a requested runtime class key for the glTF format reader. */\nexport function validateClassKey(key, readerName = \"CjsGltfFormat\")\n{\n if (!CLASS_KEYS.includes(key))\n {\n throw new Error(`${readerName}: unknown class key ${JSON.stringify(key)}; expected one of ${CLASS_KEYS.join(\", \")}`);\n }\n}\n\n/** Validates a resolved runtime class constructor for the glTF format reader. */\nexport function validateClass(key, Class, readerName = \"CjsGltfFormat\")\n{\n validateClassKey(key, readerName);\n if (typeof Class !== \"function\")\n {\n throw new TypeError(`${readerName}: class ${JSON.stringify(key)} must be a constructor`);\n }\n}\n\nfunction mergeClasses(base, classes, readerName)\n{\n if (!classes || typeof classes !== \"object\")\n {\n throw new TypeError(`${readerName}: classes option must be an object`);\n }\n\n const next = { ...base };\n for (const [ key, Class ] of Object.entries(classes))\n {\n if (Class === null || Class === undefined)\n {\n delete next[key];\n continue;\n }\n validateClass(key, Class, readerName);\n next[key] = Class;\n }\n return next;\n}\n\nfunction validateRule(name, value, readerName)\n{\n if (typeof value === \"boolean\" || typeof value === \"function\") return value;\n throw new TypeError(`${readerName}: ${name} must be true, false, or a function`);\n}\n\nfunction normalizeUvHandedness(value, readerName)\n{\n if (value === undefined || value === null) return DEFAULT_VALUES.uvHandedness;\n if (value === \"right\" || value === 1 || value === \"positive\") return \"right\";\n if (value === \"left\" || value === -1 || value === \"negative\") return \"left\";\n throw new TypeError(`${readerName}: uvHandedness must be \"right\" or \"left\"`);\n}\n\n/**\n * Normalizes reader options against their supported defaults for the glTF format\n * reader.\n */\nexport function normalizeValues(base, options = {}, readerName = \"CjsGltfFormat\")\n{\n if (!options || typeof options !== \"object\")\n {\n throw new TypeError(`${readerName}: options must be an object`);\n }\n for (const key of Object.keys(options))\n {\n if (!OPTION_KEYS.has(key))\n {\n throw new TypeError(`${readerName}: unknown option ${JSON.stringify(key)}`);\n }\n }\n\n const values = { ...base, ...options };\n const emit = normalizeEmit(values.emit, readerName);\n const classes = Object.prototype.hasOwnProperty.call(options, \"classes\")\n ? mergeClasses(base.classes || {}, options.classes, readerName)\n : { ...(base.classes || {}) };\n if ((emit === OUTPUT_GR2 || emit === OUTPUT_CMF) && !hasClasses(classes))\n {\n throw new TypeError(`${readerName}: emit \"${emit}\" requires explicit classes`);\n }\n if (typeof values.source !== \"string\" || !values.source)\n {\n values.source = DEFAULT_VALUES.source;\n }\n\n return {\n emit,\n source: values.source,\n buffers: values.buffers || null,\n packTangents: validateRule(\"packTangents\", values.packTangents, readerName),\n uvHandedness: normalizeUvHandedness(values.uvHandedness, readerName),\n rebuildMissingNormals: validateRule(\"rebuildMissingNormals\", values.rebuildMissingNormals, readerName),\n rebuildMissingTangents: validateRule(\"rebuildMissingTangents\", values.rebuildMissingTangents, readerName),\n rebuildMissingBiNormals: validateRule(\"rebuildMissingBiNormals\", values.rebuildMissingBiNormals, readerName),\n classes\n };\n}\n\nfunction normalizeEmit(emit, readerName)\n{\n if (emit === undefined || emit === null || emit === OUTPUT_JSON || emit === OUTPUT_GLTF_JSON || emit === OUTPUT_SHARED)\n {\n return OUTPUT_GLTF_JSON;\n }\n if (emit === OUTPUT_GR2 || emit === OUTPUT_CMF) return emit;\n throw new TypeError(`${readerName}: emit must be \"${OUTPUT_SHARED}\", \"${OUTPUT_GLTF_JSON}\", \"${OUTPUT_GR2}\", or \"${OUTPUT_CMF}\", got ${JSON.stringify(emit)}`);\n}\n\nfunction hasClasses(classes)\n{\n return !!classes && Object.values(classes).some((Class) => typeof Class === \"function\");\n}\n\nfunction hasVertexChannel(mesh, channel)\n{\n const value = mesh && mesh.vertex && mesh.vertex[channel];\n return !!value && value.length > 0;\n}\n\nfunction requireVertexChannel(mesh, meshIndex, channel, feature)\n{\n const value = mesh && mesh.vertex && mesh.vertex[channel];\n if (!value || value.length === 0)\n {\n const name = mesh && mesh.name ? JSON.stringify(mesh.name) : `#${meshIndex}`;\n throw new Error(`CjsGltfFormat: ${feature} requires mesh.vertex.${channel} for mesh ${name}`);\n }\n return value;\n}\n\nfunction triangleFaces(mesh, meshIndex, feature)\n{\n const faces = [];\n for (const group of mesh.indices || [])\n {\n if (group && group.faces) faces.push(...group.faces);\n }\n if (faces.length === 0)\n {\n const name = mesh && mesh.name ? JSON.stringify(mesh.name) : `#${meshIndex}`;\n throw new Error(`CjsGltfFormat: ${feature} requires triangle indices for mesh ${name}`);\n }\n return faces;\n}\n\nfunction shouldApplyMeshRule(format, rule, context)\n{\n if (typeof rule === \"function\")\n {\n const result = rule({ format, reader: format, ...context });\n if (typeof result !== \"boolean\")\n {\n throw new TypeError(`CjsGltfFormat: ${context.feature} rule must return true or false`);\n }\n return result;\n }\n return rule;\n}\n\nfunction vertexCount(mesh)\n{\n return mesh.vertex.position.length / 3;\n}\n\nfunction tangentXyz(mesh)\n{\n const\n tangent = requireVertexChannel(mesh, 0, \"tangent\", \"tangent conversion\"),\n count = vertexCount(mesh),\n width = tangent.length / count;\n\n if (width === 3) return tangent.slice();\n if (width !== 4) throw new Error(\"CjsGltfFormat: tangent channel must have 3 or 4 components per vertex\");\n\n const out = new Array(count * 3);\n for (let i = 0, o = 0; i < tangent.length; i += 4, o += 3)\n {\n out[o] = tangent[i];\n out[o + 1] = tangent[i + 1];\n out[o + 2] = tangent[i + 2];\n }\n return out;\n}\n\nfunction generatedBiNormalsForMesh(mesh, values)\n{\n const\n normals = requireVertexChannel(mesh, 0, \"normal\", \"binormal generation\"),\n tangent = requireVertexChannel(mesh, 0, \"tangent\", \"binormal generation\"),\n count = vertexCount(mesh),\n width = tangent.length / count;\n\n if (width === 3)\n {\n return generateBiNormals(normals, tangent, { uvHandedness: values.uvHandedness });\n }\n\n if (width !== 4) throw new Error(\"CjsGltfFormat: tangent channel must have 3 or 4 components per vertex\");\n\n const out = new Array(count * 3);\n for (let i = 0, o = 0; i < tangent.length; i += 4, o += 3)\n {\n const b = normalize(\n [ 0, 0, 0 ],\n cross(\n [ 0, 0, 0 ],\n [ normals[o], normals[o + 1], normals[o + 2] ],\n [ tangent[i], tangent[i + 1], tangent[i + 2] ]\n )\n );\n const sign = tangent[i + 3] < 0 ? -1 : 1;\n out[o] = b[0] * sign;\n out[o + 1] = b[1] * sign;\n out[o + 2] = b[2] * sign;\n }\n return out;\n}\n\nfunction rebuildMissingMeshData(format, json, values)\n{\n for (let meshIndex = 0; meshIndex < json.meshes.length; meshIndex++)\n {\n const\n mesh = json.meshes[meshIndex],\n common = { options: values, raw: null, json, mesh, meshIndex },\n shouldPackTangents = shouldApplyMeshRule(\n format,\n values.packTangents,\n { ...common, feature: \"packTangents\", channel: \"tangent\" }\n );\n\n if (!hasVertexChannel(mesh, \"normal\") && (shouldApplyMeshRule(\n format,\n values.rebuildMissingNormals,\n { ...common, feature: \"rebuildMissingNormals\", channel: \"normal\" }) || shouldPackTangents))\n {\n mesh.vertex.normal = generateNormals(\n requireVertexChannel(mesh, meshIndex, \"position\", \"rebuildMissingNormals\"),\n triangleFaces(mesh, meshIndex, \"rebuildMissingNormals\")\n );\n }\n\n if (!hasVertexChannel(mesh, \"tangent\") && (shouldApplyMeshRule(\n format,\n values.rebuildMissingTangents,\n { ...common, feature: \"rebuildMissingTangents\", channel: \"tangent\" }) || shouldPackTangents))\n {\n mesh.vertex.tangent = generateTangents(\n requireVertexChannel(mesh, meshIndex, \"position\", \"rebuildMissingTangents\"),\n requireVertexChannel(mesh, meshIndex, \"normal\", \"rebuildMissingTangents\"),\n requireVertexChannel(mesh, meshIndex, \"texcoord0\", \"rebuildMissingTangents\"),\n triangleFaces(mesh, meshIndex, \"rebuildMissingTangents\")\n );\n }\n\n if (!hasVertexChannel(mesh, \"binormal\") && (shouldApplyMeshRule(\n format,\n values.rebuildMissingBiNormals,\n { ...common, feature: \"rebuildMissingBiNormals\", channel: \"binormal\" }) || shouldPackTangents))\n {\n mesh.vertex.binormal = generatedBiNormalsForMesh(mesh, values);\n }\n\n if (shouldPackTangents)\n {\n mesh.vertex.tangent = packTangentFrames(\n requireVertexChannel(mesh, meshIndex, \"normal\", \"packTangents\"),\n tangentXyz(mesh),\n requireVertexChannel(mesh, meshIndex, \"binormal\", \"packTangents\")\n );\n mesh.vertex.normal = [];\n mesh.vertex.binormal = [];\n }\n }\n}\n\n/** Reads input using normalized format options for the glTF format reader. */\nexport function readWithValues(format, input, values)\n{\n const parsed = parseInput(input);\n const json = parseGltfToJson(parsed.gltf, {\n binaryChunk: parsed.binaryChunk,\n source: values.source,\n buffers: values.buffers\n });\n rebuildMissingMeshData(format, json, values);\n if (values.emit === OUTPUT_CMF) return hydrateCmf(buildCmfFromShared(json), values.classes, { source: values.source });\n return hydrateJson(json, { classes: values.classes, source: values.source });\n}\n\n/** Inspects input using normalized format options for the glTF format reader. */\nexport function inspectWithValues(input, values)\n{\n const parsed = parseInput(input);\n return inspectGltf(parsed.gltf, { format: parsed.format, source: values.source });\n}\n\n/** Converts a parsed payload into a JSON-safe value for the glTF format reader. */\nexport function toJsonValue(value)\n{\n if (value === null || value === undefined) return value;\n if (typeof value !== \"object\") return value;\n\n if (typeof value.toJSON === \"function\")\n {\n const next = value.toJSON();\n if (next !== value) return toJsonValue(next);\n }\n\n if (Array.isArray(value)) return value.map(toJsonValue);\n if (ArrayBuffer.isView(value) && !(value instanceof DataView)) return Array.from(value);\n\n const out = {};\n for (const key of Object.keys(value))\n {\n out[key] = toJsonValue(value[key]);\n }\n return out;\n}\n\n/**\n * Imports a Node built-in module without exposing the specifier to any\n * bundler's static import graph.\n *\n * `await import(\"node:fs/promises\")` written as a literal is resolved\n * eagerly by webpack/Rollup/esbuild alike when they walk the module\n * graph, breaking browser builds even though this path only ever runs\n * under Node (readFile is a Node-only convenience). Building the\n * specifier inside a `Function` body hides it from every bundler's\n * static analysis - it only exists at runtime, in the Node process that\n * actually calls readFile.\n *\n * @param {string} specifier Node built-in module specifier, e.g. \"node:fs/promises\".\n * @returns {Promise<any>} The imported module namespace.\n */\nexport function importNodeModule(specifier)\n{\n // eslint-disable-next-line no-new-func\n return new Function(\"s\", \"return import(s)\")(specifier);\n}\n"],"names":["CLASS_KEYS","Object","freeze","Array","from","Set","GR2_CLASS_KEYS","CMF_CLASS_KEYS","OUTPUT_JSON","OUTPUT_GLTF_JSON","OUTPUT_SHARED","OUTPUT_GR2","OUTPUT_CMF","DEFAULT_VALUES","emit","source","buffers","packTangents","uvHandedness","rebuildMissingNormals","rebuildMissingTangents","rebuildMissingBiNormals","classes","OPTION_KEYS","validateClassKey","key","readerName","includes","Error","JSON","stringify","join","validateClass","Class","TypeError","mergeClasses","base","next","entries","undefined","validateRule","name","value","normalizeUvHandedness","normalizeValues","options","keys","has","values","normalizeEmit","prototype","hasOwnProperty","call","hasClasses","some","hasVertexChannel","mesh","channel","vertex","length","requireVertexChannel","meshIndex","feature","triangleFaces","faces","group","indices","push","shouldApplyMeshRule","format","rule","context","result","reader","vertexCount","position","tangentXyz","tangent","count","width","slice","out","i","o","generatedBiNormalsForMesh","normals","generateBiNormals","b","normalize","cross","sign","rebuildMissingMeshData","json","meshes","common","raw","shouldPackTangents","normal","generateNormals","generateTangents","binormal","packTangentFrames","readWithValues","input","parsed","parseInput","parseGltfToJson","gltf","binaryChunk","hydrateCmf","buildCmfFromShared","hydrateJson","inspectWithValues","inspectGltf","toJsonValue","toJSON","isArray","map","ArrayBuffer","isView","DataView","importNodeModule","specifier","Function"],"mappings":";;;;;;;;AAAA;AACA;AACA;;AAkBO,MAAMA,UAAU,GAAGC,MAAM,CAACC,MAAM,CAACC,KAAK,CAACC,IAAI,CAAC,IAAIC,GAAG,CAAC,CACvD,GAAGC,YAAc,EACjB,GAAGC,cAAc,CACpB,CAAC,CAAC;AAII,MAAMC,WAAW,GAAG;AACpB,MAAMC,gBAAgB,GAAG;AACzB,MAAMC,aAAa,GAAG;AACtB,MAAMC,UAAU,GAAG;AACnB,MAAMC,UAAU,GAAG;MAEbC,cAAc,GAAGZ,MAAM,CAACC,MAAM,CAAC;AACxCY,EAAAA,IAAI,EAAEL,gBAAgB;AACtBM,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,OAAO,EAAE,IAAI;AACbC,EAAAA,YAAY,EAAE,KAAK;AACnBC,EAAAA,YAAY,EAAE,OAAO;AACrBC,EAAAA,qBAAqB,EAAE,KAAK;AAC5BC,EAAAA,sBAAsB,EAAE,KAAK;AAC7BC,EAAAA,uBAAuB,EAAE,KAAK;AAC9BC,EAAAA,OAAO,EAAErB,MAAM,CAACC,MAAM,CAAC,EAAE;AAC7B,CAAC;AAED,MAAMqB,WAAW,GAAG,IAAIlB,GAAG,CAAC,CACxB,MAAM,EACN,QAAQ,EACR,SAAS,EACT,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,SAAS,CACZ,CAAC;;AAEF;AACO,SAASmB,gBAAgBA,CAACC,GAAG,EAAEC,UAAU,GAAG,eAAe,EAClE;AACI,EAAA,IAAI,CAAC1B,UAAU,CAAC2B,QAAQ,CAACF,GAAG,CAAC,EAC7B;IACI,MAAM,IAAIG,KAAK,CAAC,CAAA,EAAGF,UAAU,CAAA,oBAAA,EAAuBG,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,CAAA,kBAAA,EAAqBzB,UAAU,CAAC+B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACxH,EAAA;AACJ;;AAEA;AACO,SAASC,aAAaA,CAACP,GAAG,EAAEQ,KAAK,EAAEP,UAAU,GAAG,eAAe,EACtE;AACIF,EAAAA,gBAAgB,CAACC,GAAG,EAAEC,UAAU,CAAC;AACjC,EAAA,IAAI,OAAOO,KAAK,KAAK,UAAU,EAC/B;AACI,IAAA,MAAM,IAAIC,SAAS,CAAC,CAAA,EAAGR,UAAU,CAAA,QAAA,EAAWG,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,wBAAwB,CAAC;AAC5F,EAAA;AACJ;AAEA,SAASU,YAAYA,CAACC,IAAI,EAAEd,OAAO,EAAEI,UAAU,EAC/C;AACI,EAAA,IAAI,CAACJ,OAAO,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAC3C;AACI,IAAA,MAAM,IAAIY,SAAS,CAAC,CAAA,EAAGR,UAAU,oCAAoC,CAAC;AAC1E,EAAA;AAEA,EAAA,MAAMW,IAAI,GAAG;IAAE,GAAGD;GAAM;AACxB,EAAA,KAAK,MAAM,CAAEX,GAAG,EAAEQ,KAAK,CAAE,IAAIhC,MAAM,CAACqC,OAAO,CAAChB,OAAO,CAAC,EACpD;AACI,IAAA,IAAIW,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKM,SAAS,EACzC;MACI,OAAOF,IAAI,CAACZ,GAAG,CAAC;AAChB,MAAA;AACJ,IAAA;AACAO,IAAAA,aAAa,CAACP,GAAG,EAAEQ,KAAK,EAAEP,UAAU,CAAC;AACrCW,IAAAA,IAAI,CAACZ,GAAG,CAAC,GAAGQ,KAAK;AACrB,EAAA;AACA,EAAA,OAAOI,IAAI;AACf;AAEA,SAASG,YAAYA,CAACC,IAAI,EAAEC,KAAK,EAAEhB,UAAU,EAC7C;EACI,IAAI,OAAOgB,KAAK,KAAK,SAAS,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE,OAAOA,KAAK;EAC3E,MAAM,IAAIR,SAAS,CAAC,CAAA,EAAGR,UAAU,CAAA,EAAA,EAAKe,IAAI,qCAAqC,CAAC;AACpF;AAEA,SAASE,qBAAqBA,CAACD,KAAK,EAAEhB,UAAU,EAChD;EACI,IAAIgB,KAAK,KAAKH,SAAS,IAAIG,KAAK,KAAK,IAAI,EAAE,OAAO7B,cAAc,CAACK,YAAY;AAC7E,EAAA,IAAIwB,KAAK,KAAK,OAAO,IAAIA,KAAK,KAAK,CAAC,IAAIA,KAAK,KAAK,UAAU,EAAE,OAAO,OAAO;AAC5E,EAAA,IAAIA,KAAK,KAAK,MAAM,IAAIA,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,UAAU,EAAE,OAAO,MAAM;AAC3E,EAAA,MAAM,IAAIR,SAAS,CAAC,CAAA,EAAGR,UAAU,0CAA0C,CAAC;AAChF;;AAEA;AACA;AACA;AACA;AACO,SAASkB,eAAeA,CAACR,IAAI,EAAES,OAAO,GAAG,EAAE,EAAEnB,UAAU,GAAG,eAAe,EAChF;AACI,EAAA,IAAI,CAACmB,OAAO,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAC3C;AACI,IAAA,MAAM,IAAIX,SAAS,CAAC,CAAA,EAAGR,UAAU,6BAA6B,CAAC;AACnE,EAAA;EACA,KAAK,MAAMD,GAAG,IAAIxB,MAAM,CAAC6C,IAAI,CAACD,OAAO,CAAC,EACtC;AACI,IAAA,IAAI,CAACtB,WAAW,CAACwB,GAAG,CAACtB,GAAG,CAAC,EACzB;AACI,MAAA,MAAM,IAAIS,SAAS,CAAC,CAAA,EAAGR,UAAU,CAAA,iBAAA,EAAoBG,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,EAAE,CAAC;AAC/E,IAAA;AACJ,EAAA;AAEA,EAAA,MAAMuB,MAAM,GAAG;AAAE,IAAA,GAAGZ,IAAI;IAAE,GAAGS;GAAS;EACtC,MAAM/B,IAAI,GAAGmC,aAAa,CAACD,MAAM,CAAClC,IAAI,EAAEY,UAAU,CAAC;AACnD,EAAA,MAAMJ,OAAO,GAAGrB,MAAM,CAACiD,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,OAAO,EAAE,SAAS,CAAC,GAClEV,YAAY,CAACC,IAAI,CAACd,OAAO,IAAI,EAAE,EAAEuB,OAAO,CAACvB,OAAO,EAAEI,UAAU,CAAC,GAC7D;AAAE,IAAA,IAAIU,IAAI,CAACd,OAAO,IAAI,EAAE;GAAG;AACjC,EAAA,IAAI,CAACR,IAAI,KAAKH,UAAU,IAAIG,IAAI,KAAKF,UAAU,KAAK,CAACyC,UAAU,CAAC/B,OAAO,CAAC,EACxE;IACI,MAAM,IAAIY,SAAS,CAAC,CAAA,EAAGR,UAAU,CAAA,QAAA,EAAWZ,IAAI,6BAA6B,CAAC;AAClF,EAAA;EACA,IAAI,OAAOkC,MAAM,CAACjC,MAAM,KAAK,QAAQ,IAAI,CAACiC,MAAM,CAACjC,MAAM,EACvD;AACIiC,IAAAA,MAAM,CAACjC,MAAM,GAAGF,cAAc,CAACE,MAAM;AACzC,EAAA;EAEA,OAAO;IACHD,IAAI;IACJC,MAAM,EAAEiC,MAAM,CAACjC,MAAM;AACrBC,IAAAA,OAAO,EAAEgC,MAAM,CAAChC,OAAO,IAAI,IAAI;IAC/BC,YAAY,EAAEuB,YAAY,CAAC,cAAc,EAAEQ,MAAM,CAAC/B,YAAY,EAAES,UAAU,CAAC;IAC3ER,YAAY,EAAEyB,qBAAqB,CAACK,MAAM,CAAC9B,YAAY,EAAEQ,UAAU,CAAC;IACpEP,qBAAqB,EAAEqB,YAAY,CAAC,uBAAuB,EAAEQ,MAAM,CAAC7B,qBAAqB,EAAEO,UAAU,CAAC;IACtGN,sBAAsB,EAAEoB,YAAY,CAAC,wBAAwB,EAAEQ,MAAM,CAAC5B,sBAAsB,EAAEM,UAAU,CAAC;IACzGL,uBAAuB,EAAEmB,YAAY,CAAC,yBAAyB,EAAEQ,MAAM,CAAC3B,uBAAuB,EAAEK,UAAU,CAAC;AAC5GJ,IAAAA;GACH;AACL;AAEA,SAAS2B,aAAaA,CAACnC,IAAI,EAAEY,UAAU,EACvC;AACI,EAAA,IAAIZ,IAAI,KAAKyB,SAAS,IAAIzB,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAKN,WAAW,IAAIM,IAAI,KAAKL,gBAAgB,IAAIK,IAAI,KAAKJ,aAAa,EACtH;AACI,IAAA,OAAOD,gBAAgB;AAC3B,EAAA;EACA,IAAIK,IAAI,KAAKH,UAAU,IAAIG,IAAI,KAAKF,UAAU,EAAE,OAAOE,IAAI;EAC3D,MAAM,IAAIoB,SAAS,CAAC,CAAA,EAAGR,UAAU,CAAA,gBAAA,EAAmBhB,aAAa,OAAOD,gBAAgB,CAAA,IAAA,EAAOE,UAAU,CAAA,OAAA,EAAUC,UAAU,UAAUiB,IAAI,CAACC,SAAS,CAAChB,IAAI,CAAC,CAAA,CAAE,CAAC;AAClK;AAEA,SAASuC,UAAUA,CAAC/B,OAAO,EAC3B;AACI,EAAA,OAAO,CAAC,CAACA,OAAO,IAAIrB,MAAM,CAAC+C,MAAM,CAAC1B,OAAO,CAAC,CAACgC,IAAI,CAAErB,KAAK,IAAK,OAAOA,KAAK,KAAK,UAAU,CAAC;AAC3F;AAEA,SAASsB,gBAAgBA,CAACC,IAAI,EAAEC,OAAO,EACvC;AACI,EAAA,MAAMf,KAAK,GAAGc,IAAI,IAAIA,IAAI,CAACE,MAAM,IAAIF,IAAI,CAACE,MAAM,CAACD,OAAO,CAAC;EACzD,OAAO,CAAC,CAACf,KAAK,IAAIA,KAAK,CAACiB,MAAM,GAAG,CAAC;AACtC;AAEA,SAASC,oBAAoBA,CAACJ,IAAI,EAAEK,SAAS,EAAEJ,OAAO,EAAEK,OAAO,EAC/D;AACI,EAAA,MAAMpB,KAAK,GAAGc,IAAI,IAAIA,IAAI,CAACE,MAAM,IAAIF,IAAI,CAACE,MAAM,CAACD,OAAO,CAAC;EACzD,IAAI,CAACf,KAAK,IAAIA,KAAK,CAACiB,MAAM,KAAK,CAAC,EAChC;AACI,IAAA,MAAMlB,IAAI,GAAGe,IAAI,IAAIA,IAAI,CAACf,IAAI,GAAGZ,IAAI,CAACC,SAAS,CAAC0B,IAAI,CAACf,IAAI,CAAC,GAAG,CAAA,CAAA,EAAIoB,SAAS,CAAA,CAAE;IAC5E,MAAM,IAAIjC,KAAK,CAAC,CAAA,eAAA,EAAkBkC,OAAO,yBAAyBL,OAAO,CAAA,UAAA,EAAahB,IAAI,CAAA,CAAE,CAAC;AACjG,EAAA;AACA,EAAA,OAAOC,KAAK;AAChB;AAEA,SAASqB,aAAaA,CAACP,IAAI,EAAEK,SAAS,EAAEC,OAAO,EAC/C;EACI,MAAME,KAAK,GAAG,EAAE;EAChB,KAAK,MAAMC,KAAK,IAAIT,IAAI,CAACU,OAAO,IAAI,EAAE,EACtC;AACI,IAAA,IAAID,KAAK,IAAIA,KAAK,CAACD,KAAK,EAAEA,KAAK,CAACG,IAAI,CAAC,GAAGF,KAAK,CAACD,KAAK,CAAC;AACxD,EAAA;AACA,EAAA,IAAIA,KAAK,CAACL,MAAM,KAAK,CAAC,EACtB;AACI,IAAA,MAAMlB,IAAI,GAAGe,IAAI,IAAIA,IAAI,CAACf,IAAI,GAAGZ,IAAI,CAACC,SAAS,CAAC0B,IAAI,CAACf,IAAI,CAAC,GAAG,CAAA,CAAA,EAAIoB,SAAS,CAAA,CAAE;IAC5E,MAAM,IAAIjC,KAAK,CAAC,CAAA,eAAA,EAAkBkC,OAAO,CAAA,oCAAA,EAAuCrB,IAAI,EAAE,CAAC;AAC3F,EAAA;AACA,EAAA,OAAOuB,KAAK;AAChB;AAEA,SAASI,mBAAmBA,CAACC,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAClD;AACI,EAAA,IAAI,OAAOD,IAAI,KAAK,UAAU,EAC9B;IACI,MAAME,MAAM,GAAGF,IAAI,CAAC;MAAED,MAAM;AAAEI,MAAAA,MAAM,EAAEJ,MAAM;MAAE,GAAGE;AAAQ,KAAC,CAAC;AAC3D,IAAA,IAAI,OAAOC,MAAM,KAAK,SAAS,EAC/B;MACI,MAAM,IAAItC,SAAS,CAAC,CAAA,eAAA,EAAkBqC,OAAO,CAACT,OAAO,iCAAiC,CAAC;AAC3F,IAAA;AACA,IAAA,OAAOU,MAAM;AACjB,EAAA;AACA,EAAA,OAAOF,IAAI;AACf;AAEA,SAASI,WAAWA,CAAClB,IAAI,EACzB;EACI,OAAOA,IAAI,CAACE,MAAM,CAACiB,QAAQ,CAAChB,MAAM,GAAG,CAAC;AAC1C;AAEA,SAASiB,UAAUA,CAACpB,IAAI,EACxB;EACI,MACIqB,OAAO,GAAGjB,oBAAoB,CAACJ,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC;AACxEsB,IAAAA,KAAK,GAAGJ,WAAW,CAAClB,IAAI,CAAC;AACzBuB,IAAAA,KAAK,GAAGF,OAAO,CAAClB,MAAM,GAAGmB,KAAK;EAElC,IAAIC,KAAK,KAAK,CAAC,EAAE,OAAOF,OAAO,CAACG,KAAK,EAAE;EACvC,IAAID,KAAK,KAAK,CAAC,EAAE,MAAM,IAAInD,KAAK,CAAC,uEAAuE,CAAC;EAEzG,MAAMqD,GAAG,GAAG,IAAI9E,KAAK,CAAC2E,KAAK,GAAG,CAAC,CAAC;EAChC,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEC,CAAC,GAAG,CAAC,EAAED,CAAC,GAAGL,OAAO,CAAClB,MAAM,EAAEuB,CAAC,IAAI,CAAC,EAAEC,CAAC,IAAI,CAAC,EACzD;AACIF,IAAAA,GAAG,CAACE,CAAC,CAAC,GAAGN,OAAO,CAACK,CAAC,CAAC;IACnBD,GAAG,CAACE,CAAC,GAAG,CAAC,CAAC,GAAGN,OAAO,CAACK,CAAC,GAAG,CAAC,CAAC;IAC3BD,GAAG,CAACE,CAAC,GAAG,CAAC,CAAC,GAAGN,OAAO,CAACK,CAAC,GAAG,CAAC,CAAC;AAC/B,EAAA;AACA,EAAA,OAAOD,GAAG;AACd;AAEA,SAASG,yBAAyBA,CAAC5B,IAAI,EAAER,MAAM,EAC/C;EACI,MACIqC,OAAO,GAAGzB,oBAAoB,CAACJ,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,CAAC;IACxEqB,OAAO,GAAGjB,oBAAoB,CAACJ,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC;AACzEsB,IAAAA,KAAK,GAAGJ,WAAW,CAAClB,IAAI,CAAC;AACzBuB,IAAAA,KAAK,GAAGF,OAAO,CAAClB,MAAM,GAAGmB,KAAK;EAElC,IAAIC,KAAK,KAAK,CAAC,EACf;AACI,IAAA,OAAOO,iBAAiB,CAACD,OAAO,EAAER,OAAO,EAAE;MAAE3D,YAAY,EAAE8B,MAAM,CAAC9B;AAAa,KAAC,CAAC;AACrF,EAAA;EAEA,IAAI6D,KAAK,KAAK,CAAC,EAAE,MAAM,IAAInD,KAAK,CAAC,uEAAuE,CAAC;EAEzG,MAAMqD,GAAG,GAAG,IAAI9E,KAAK,CAAC2E,KAAK,GAAG,CAAC,CAAC;EAChC,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEC,CAAC,GAAG,CAAC,EAAED,CAAC,GAAGL,OAAO,CAAClB,MAAM,EAAEuB,CAAC,IAAI,CAAC,EAAEC,CAAC,IAAI,CAAC,EACzD;AACI,IAAA,MAAMI,CAAC,GAAGC,SAAS,CACf,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,EACXC,KAAK,CACD,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,EACX,CAAEJ,OAAO,CAACF,CAAC,CAAC,EAAEE,OAAO,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,OAAO,CAACF,CAAC,GAAG,CAAC,CAAC,CAAE,EAC9C,CAAEN,OAAO,CAACK,CAAC,CAAC,EAAEL,OAAO,CAACK,CAAC,GAAG,CAAC,CAAC,EAAEL,OAAO,CAACK,CAAC,GAAG,CAAC,CAAC,CAChD,CACJ,CAAC;AACD,IAAA,MAAMQ,IAAI,GAAGb,OAAO,CAACK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;IACxCD,GAAG,CAACE,CAAC,CAAC,GAAGI,CAAC,CAAC,CAAC,CAAC,GAAGG,IAAI;IACpBT,GAAG,CAACE,CAAC,GAAG,CAAC,CAAC,GAAGI,CAAC,CAAC,CAAC,CAAC,GAAGG,IAAI;IACxBT,GAAG,CAACE,CAAC,GAAG,CAAC,CAAC,GAAGI,CAAC,CAAC,CAAC,CAAC,GAAGG,IAAI;AAC5B,EAAA;AACA,EAAA,OAAOT,GAAG;AACd;AAEA,SAASU,sBAAsBA,CAACtB,MAAM,EAAEuB,IAAI,EAAE5C,MAAM,EACpD;AACI,EAAA,KAAK,IAAIa,SAAS,GAAG,CAAC,EAAEA,SAAS,GAAG+B,IAAI,CAACC,MAAM,CAAClC,MAAM,EAAEE,SAAS,EAAE,EACnE;AACI,IAAA,MACIL,IAAI,GAAGoC,IAAI,CAACC,MAAM,CAAChC,SAAS,CAAC;AAC7BiC,MAAAA,MAAM,GAAG;AAAEjD,QAAAA,OAAO,EAAEG,MAAM;AAAE+C,QAAAA,GAAG,EAAE,IAAI;QAAEH,IAAI;QAAEpC,IAAI;AAAEK,QAAAA;OAAW;MAC9DmC,kBAAkB,GAAG5B,mBAAmB,CACpCC,MAAM,EACNrB,MAAM,CAAC/B,YAAY,EACnB;AAAE,QAAA,GAAG6E,MAAM;AAAEhC,QAAAA,OAAO,EAAE,cAAc;AAAEL,QAAAA,OAAO,EAAE;AAAU,OAC7D,CAAC;AAEL,IAAA,IAAI,CAACF,gBAAgB,CAACC,IAAI,EAAE,QAAQ,CAAC,KAAKY,mBAAmB,CACzDC,MAAM,EACNrB,MAAM,CAAC7B,qBAAqB,EAC5B;AAAE,MAAA,GAAG2E,MAAM;AAAEhC,MAAAA,OAAO,EAAE,uBAAuB;AAAEL,MAAAA,OAAO,EAAE;AAAS,KAAC,CAAC,IAAIuC,kBAAkB,CAAC,EAC9F;MACIxC,IAAI,CAACE,MAAM,CAACuC,MAAM,GAAGC,eAAe,CAChCtC,oBAAoB,CAACJ,IAAI,EAAEK,SAAS,EAAE,UAAU,EAAE,uBAAuB,CAAC,EAC1EE,aAAa,CAACP,IAAI,EAAEK,SAAS,EAAE,uBAAuB,CAC1D,CAAC;AACL,IAAA;AAEA,IAAA,IAAI,CAACN,gBAAgB,CAACC,IAAI,EAAE,SAAS,CAAC,KAAKY,mBAAmB,CAC1DC,MAAM,EACNrB,MAAM,CAAC5B,sBAAsB,EAC7B;AAAE,MAAA,GAAG0E,MAAM;AAAEhC,MAAAA,OAAO,EAAE,wBAAwB;AAAEL,MAAAA,OAAO,EAAE;AAAU,KAAC,CAAC,IAAIuC,kBAAkB,CAAC,EAChG;MACIxC,IAAI,CAACE,MAAM,CAACmB,OAAO,GAAGsB,gBAAgB,CAClCvC,oBAAoB,CAACJ,IAAI,EAAEK,SAAS,EAAE,UAAU,EAAE,wBAAwB,CAAC,EAC3ED,oBAAoB,CAACJ,IAAI,EAAEK,SAAS,EAAE,QAAQ,EAAE,wBAAwB,CAAC,EACzED,oBAAoB,CAACJ,IAAI,EAAEK,SAAS,EAAE,WAAW,EAAE,wBAAwB,CAAC,EAC5EE,aAAa,CAACP,IAAI,EAAEK,SAAS,EAAE,wBAAwB,CAC3D,CAAC;AACL,IAAA;AAEA,IAAA,IAAI,CAACN,gBAAgB,CAACC,IAAI,EAAE,UAAU,CAAC,KAAKY,mBAAmB,CAC3DC,MAAM,EACNrB,MAAM,CAAC3B,uBAAuB,EAC9B;AAAE,MAAA,GAAGyE,MAAM;AAAEhC,MAAAA,OAAO,EAAE,yBAAyB;AAAEL,MAAAA,OAAO,EAAE;AAAW,KAAC,CAAC,IAAIuC,kBAAkB,CAAC,EAClG;MACIxC,IAAI,CAACE,MAAM,CAAC0C,QAAQ,GAAGhB,yBAAyB,CAAC5B,IAAI,EAAER,MAAM,CAAC;AAClE,IAAA;AAEA,IAAA,IAAIgD,kBAAkB,EACtB;AACIxC,MAAAA,IAAI,CAACE,MAAM,CAACmB,OAAO,GAAGwB,iBAAiB,CACnCzC,oBAAoB,CAACJ,IAAI,EAAEK,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,EAC/De,UAAU,CAACpB,IAAI,CAAC,EAChBI,oBAAoB,CAACJ,IAAI,EAAEK,SAAS,EAAE,UAAU,EAAE,cAAc,CACpE,CAAC;AACDL,MAAAA,IAAI,CAACE,MAAM,CAACuC,MAAM,GAAG,EAAE;AACvBzC,MAAAA,IAAI,CAACE,MAAM,CAAC0C,QAAQ,GAAG,EAAE;AAC7B,IAAA;AACJ,EAAA;AACJ;;AAEA;AACO,SAASE,cAAcA,CAACjC,MAAM,EAAEkC,KAAK,EAAEvD,MAAM,EACpD;AACI,EAAA,MAAMwD,MAAM,GAAGC,UAAU,CAACF,KAAK,CAAC;AAChC,EAAA,MAAMX,IAAI,GAAGc,eAAe,CAACF,MAAM,CAACG,IAAI,EAAE;IACtCC,WAAW,EAAEJ,MAAM,CAACI,WAAW;IAC/B7F,MAAM,EAAEiC,MAAM,CAACjC,MAAM;IACrBC,OAAO,EAAEgC,MAAM,CAAChC;AACpB,GAAC,CAAC;AACF2E,EAAAA,sBAAsB,CAACtB,MAAM,EAAEuB,IAAI,EAAE5C,MAAM,CAAC;AAC5C,EAAA,IAAIA,MAAM,CAAClC,IAAI,KAAKF,UAAU,EAAE,OAAOiG,UAAU,CAACC,kBAAkB,CAAClB,IAAI,CAAC,EAAE5C,MAAM,CAAC1B,OAAO,EAAE;IAAEP,MAAM,EAAEiC,MAAM,CAACjC;AAAO,GAAC,CAAC;EACtH,OAAOgG,WAAW,CAACnB,IAAI,EAAE;IAAEtE,OAAO,EAAE0B,MAAM,CAAC1B,OAAO;IAAEP,MAAM,EAAEiC,MAAM,CAACjC;AAAO,GAAC,CAAC;AAChF;;AAEA;AACO,SAASiG,iBAAiBA,CAACT,KAAK,EAAEvD,MAAM,EAC/C;AACI,EAAA,MAAMwD,MAAM,GAAGC,UAAU,CAACF,KAAK,CAAC;AAChC,EAAA,OAAOU,WAAW,CAACT,MAAM,CAACG,IAAI,EAAE;IAAEtC,MAAM,EAAEmC,MAAM,CAACnC,MAAM;IAAEtD,MAAM,EAAEiC,MAAM,CAACjC;AAAO,GAAC,CAAC;AACrF;;AAEA;AACO,SAASmG,WAAWA,CAACxE,KAAK,EACjC;EACI,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKH,SAAS,EAAE,OAAOG,KAAK;AACvD,EAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;AAE3C,EAAA,IAAI,OAAOA,KAAK,CAACyE,MAAM,KAAK,UAAU,EACtC;AACI,IAAA,MAAM9E,IAAI,GAAGK,KAAK,CAACyE,MAAM,EAAE;IAC3B,IAAI9E,IAAI,KAAKK,KAAK,EAAE,OAAOwE,WAAW,CAAC7E,IAAI,CAAC;AAChD,EAAA;AAEA,EAAA,IAAIlC,KAAK,CAACiH,OAAO,CAAC1E,KAAK,CAAC,EAAE,OAAOA,KAAK,CAAC2E,GAAG,CAACH,WAAW,CAAC;AACvD,EAAA,IAAII,WAAW,CAACC,MAAM,CAAC7E,KAAK,CAAC,IAAI,EAAEA,KAAK,YAAY8E,QAAQ,CAAC,EAAE,OAAOrH,KAAK,CAACC,IAAI,CAACsC,KAAK,CAAC;EAEvF,MAAMuC,GAAG,GAAG,EAAE;EACd,KAAK,MAAMxD,GAAG,IAAIxB,MAAM,CAAC6C,IAAI,CAACJ,KAAK,CAAC,EACpC;IACIuC,GAAG,CAACxD,GAAG,CAAC,GAAGyF,WAAW,CAACxE,KAAK,CAACjB,GAAG,CAAC,CAAC;AACtC,EAAA;AACA,EAAA,OAAOwD,GAAG;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASwC,gBAAgBA,CAACC,SAAS,EAC1C;AACI;EACA,OAAO,IAAIC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAACD,SAAS,CAAC;AAC3D;;;;"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../../../src/formats/gltf/core/helpers.js"],"sourcesContent":["/**\n * Internal read-pipeline glue for CjsGltfFormat.\n */\n\nimport { CLASS_KEYS as GR2_CLASS_KEYS, hydrateJson } from \"./json.js\";\nimport { buildCmfFromShared, CMF_CLASS_KEYS, hydrateCmf } from \"./targets.js\";\nimport { inspectGltf, isGlb, parseGltfToJson, parseInput, toBytes } from \"./parser.js\";\nimport {\n generateBiNormals,\n generateNormals,\n generateTangents\n} from \"@carbonenginejs/runtime-utils/mesh\";\nimport {\n packTangentFrames\n} from \"@carbonenginejs/runtime-utils/tangent\";\nimport {\n cross,\n normalize\n} from \"@carbonenginejs/runtime-utils/vec3\";\n\nexport const CLASS_KEYS = Object.freeze(Array.from(new Set([\n ...GR2_CLASS_KEYS,\n ...CMF_CLASS_KEYS\n])));\n\nexport { isGlb, toBytes };\n\nexport const OUTPUT_JSON = \"json\";\nexport const OUTPUT_GLTF_JSON = \"gltfJson\";\nexport const OUTPUT_SHARED = \"shared\";\nexport const OUTPUT_GR2 = \"gr2\";\nexport const OUTPUT_CMF = \"cmf\";\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_GLTF_JSON,\n source: \"memory\",\n buffers: null,\n packTangents: false,\n uvHandedness: \"right\",\n rebuildMissingNormals: false,\n rebuildMissingTangents: false,\n rebuildMissingBiNormals: false,\n classes: Object.freeze({})\n});\n\nconst OPTION_KEYS = new Set([\n \"emit\",\n \"source\",\n \"buffers\",\n \"packTangents\",\n \"uvHandedness\",\n \"rebuildMissingNormals\",\n \"rebuildMissingTangents\",\n \"rebuildMissingBiNormals\",\n \"classes\"\n]);\n\n/** Validates a requested runtime class key for the glTF format reader. */\nexport function validateClassKey(key, readerName = \"CjsGltfFormat\")\n{\n if (!CLASS_KEYS.includes(key))\n {\n throw new Error(`${readerName}: unknown class key ${JSON.stringify(key)}; expected one of ${CLASS_KEYS.join(\", \")}`);\n }\n}\n\n/** Validates a resolved runtime class constructor for the glTF format reader. */\nexport function validateClass(key, Class, readerName = \"CjsGltfFormat\")\n{\n validateClassKey(key, readerName);\n if (typeof Class !== \"function\")\n {\n throw new TypeError(`${readerName}: class ${JSON.stringify(key)} must be a constructor`);\n }\n}\n\nfunction mergeClasses(base, classes, readerName)\n{\n if (!classes || typeof classes !== \"object\")\n {\n throw new TypeError(`${readerName}: classes option must be an object`);\n }\n\n const next = { ...base };\n for (const [ key, Class ] of Object.entries(classes))\n {\n if (Class === null || Class === undefined)\n {\n delete next[key];\n continue;\n }\n validateClass(key, Class, readerName);\n next[key] = Class;\n }\n return next;\n}\n\nfunction validateRule(name, value, readerName)\n{\n if (typeof value === \"boolean\" || typeof value === \"function\") return value;\n throw new TypeError(`${readerName}: ${name} must be true, false, or a function`);\n}\n\nfunction normalizeUvHandedness(value, readerName)\n{\n if (value === undefined || value === null) return DEFAULT_VALUES.uvHandedness;\n if (value === \"right\" || value === 1 || value === \"positive\") return \"right\";\n if (value === \"left\" || value === -1 || value === \"negative\") return \"left\";\n throw new TypeError(`${readerName}: uvHandedness must be \"right\" or \"left\"`);\n}\n\n/**\n * Normalizes reader options against their supported defaults for the glTF format\n * reader.\n */\nexport function normalizeValues(base, options = {}, readerName = \"CjsGltfFormat\")\n{\n if (!options || typeof options !== \"object\")\n {\n throw new TypeError(`${readerName}: options must be an object`);\n }\n for (const key of Object.keys(options))\n {\n if (!OPTION_KEYS.has(key))\n {\n throw new TypeError(`${readerName}: unknown option ${JSON.stringify(key)}`);\n }\n }\n\n const values = { ...base, ...options };\n const emit = normalizeEmit(values.emit, readerName);\n const classes = Object.prototype.hasOwnProperty.call(options, \"classes\")\n ? mergeClasses(base.classes || {}, options.classes, readerName)\n : { ...(base.classes || {}) };\n if ((emit === OUTPUT_GR2 || emit === OUTPUT_CMF) && !hasClasses(classes))\n {\n throw new TypeError(`${readerName}: emit \"${emit}\" requires explicit classes`);\n }\n if (typeof values.source !== \"string\" || !values.source)\n {\n values.source = DEFAULT_VALUES.source;\n }\n\n return {\n emit,\n source: values.source,\n buffers: values.buffers || null,\n packTangents: validateRule(\"packTangents\", values.packTangents, readerName),\n uvHandedness: normalizeUvHandedness(values.uvHandedness, readerName),\n rebuildMissingNormals: validateRule(\"rebuildMissingNormals\", values.rebuildMissingNormals, readerName),\n rebuildMissingTangents: validateRule(\"rebuildMissingTangents\", values.rebuildMissingTangents, readerName),\n rebuildMissingBiNormals: validateRule(\"rebuildMissingBiNormals\", values.rebuildMissingBiNormals, readerName),\n classes\n };\n}\n\nfunction normalizeEmit(emit, readerName)\n{\n if (emit === undefined || emit === null || emit === OUTPUT_JSON || emit === OUTPUT_GLTF_JSON || emit === OUTPUT_SHARED)\n {\n return OUTPUT_GLTF_JSON;\n }\n if (emit === OUTPUT_GR2 || emit === OUTPUT_CMF) return emit;\n throw new TypeError(`${readerName}: emit must be \"${OUTPUT_SHARED}\", \"${OUTPUT_GLTF_JSON}\", \"${OUTPUT_GR2}\", or \"${OUTPUT_CMF}\", got ${JSON.stringify(emit)}`);\n}\n\nfunction hasClasses(classes)\n{\n return !!classes && Object.values(classes).some((Class) => typeof Class === \"function\");\n}\n\nfunction hasVertexChannel(mesh, channel)\n{\n const value = mesh && mesh.vertex && mesh.vertex[channel];\n return !!value && value.length > 0;\n}\n\nfunction requireVertexChannel(mesh, meshIndex, channel, feature)\n{\n const value = mesh && mesh.vertex && mesh.vertex[channel];\n if (!value || value.length === 0)\n {\n const name = mesh && mesh.name ? JSON.stringify(mesh.name) : `#${meshIndex}`;\n throw new Error(`CjsGltfFormat: ${feature} requires mesh.vertex.${channel} for mesh ${name}`);\n }\n return value;\n}\n\nfunction triangleFaces(mesh, meshIndex, feature)\n{\n const faces = [];\n for (const group of mesh.indices || [])\n {\n if (group && group.faces) faces.push(...group.faces);\n }\n if (faces.length === 0)\n {\n const name = mesh && mesh.name ? JSON.stringify(mesh.name) : `#${meshIndex}`;\n throw new Error(`CjsGltfFormat: ${feature} requires triangle indices for mesh ${name}`);\n }\n return faces;\n}\n\nfunction shouldApplyMeshRule(format, rule, context)\n{\n if (typeof rule === \"function\")\n {\n const result = rule({ format, reader: format, ...context });\n if (typeof result !== \"boolean\")\n {\n throw new TypeError(`CjsGltfFormat: ${context.feature} rule must return true or false`);\n }\n return result;\n }\n return rule;\n}\n\nfunction vertexCount(mesh)\n{\n return mesh.vertex.position.length / 3;\n}\n\nfunction tangentXyz(mesh)\n{\n const\n tangent = requireVertexChannel(mesh, 0, \"tangent\", \"tangent conversion\"),\n count = vertexCount(mesh),\n width = tangent.length / count;\n\n if (width === 3) return tangent.slice();\n if (width !== 4) throw new Error(\"CjsGltfFormat: tangent channel must have 3 or 4 components per vertex\");\n\n const out = new Array(count * 3);\n for (let i = 0, o = 0; i < tangent.length; i += 4, o += 3)\n {\n out[o] = tangent[i];\n out[o + 1] = tangent[i + 1];\n out[o + 2] = tangent[i + 2];\n }\n return out;\n}\n\nfunction generatedBiNormalsForMesh(mesh, values)\n{\n const\n normals = requireVertexChannel(mesh, 0, \"normal\", \"binormal generation\"),\n tangent = requireVertexChannel(mesh, 0, \"tangent\", \"binormal generation\"),\n count = vertexCount(mesh),\n width = tangent.length / count;\n\n if (width === 3)\n {\n return generateBiNormals(normals, tangent, { uvHandedness: values.uvHandedness });\n }\n\n if (width !== 4) throw new Error(\"CjsGltfFormat: tangent channel must have 3 or 4 components per vertex\");\n\n const out = new Array(count * 3);\n for (let i = 0, o = 0; i < tangent.length; i += 4, o += 3)\n {\n const b = normalize(\n [ 0, 0, 0 ],\n cross(\n [ 0, 0, 0 ],\n [ normals[o], normals[o + 1], normals[o + 2] ],\n [ tangent[i], tangent[i + 1], tangent[i + 2] ]\n )\n );\n const sign = tangent[i + 3] < 0 ? -1 : 1;\n out[o] = b[0] * sign;\n out[o + 1] = b[1] * sign;\n out[o + 2] = b[2] * sign;\n }\n return out;\n}\n\nfunction rebuildMissingMeshData(format, json, values)\n{\n for (let meshIndex = 0; meshIndex < json.meshes.length; meshIndex++)\n {\n const\n mesh = json.meshes[meshIndex],\n common = { options: values, raw: null, json, mesh, meshIndex },\n shouldPackTangents = shouldApplyMeshRule(\n format,\n values.packTangents,\n { ...common, feature: \"packTangents\", channel: \"tangent\" }\n );\n\n if (!hasVertexChannel(mesh, \"normal\") && (shouldApplyMeshRule(\n format,\n values.rebuildMissingNormals,\n { ...common, feature: \"rebuildMissingNormals\", channel: \"normal\" }) || shouldPackTangents))\n {\n mesh.vertex.normal = generateNormals(\n requireVertexChannel(mesh, meshIndex, \"position\", \"rebuildMissingNormals\"),\n triangleFaces(mesh, meshIndex, \"rebuildMissingNormals\")\n );\n }\n\n if (!hasVertexChannel(mesh, \"tangent\") && (shouldApplyMeshRule(\n format,\n values.rebuildMissingTangents,\n { ...common, feature: \"rebuildMissingTangents\", channel: \"tangent\" }) || shouldPackTangents))\n {\n mesh.vertex.tangent = generateTangents(\n requireVertexChannel(mesh, meshIndex, \"position\", \"rebuildMissingTangents\"),\n requireVertexChannel(mesh, meshIndex, \"normal\", \"rebuildMissingTangents\"),\n requireVertexChannel(mesh, meshIndex, \"texcoord0\", \"rebuildMissingTangents\"),\n triangleFaces(mesh, meshIndex, \"rebuildMissingTangents\")\n );\n }\n\n if (!hasVertexChannel(mesh, \"binormal\") && (shouldApplyMeshRule(\n format,\n values.rebuildMissingBiNormals,\n { ...common, feature: \"rebuildMissingBiNormals\", channel: \"binormal\" }) || shouldPackTangents))\n {\n mesh.vertex.binormal = generatedBiNormalsForMesh(mesh, values);\n }\n\n if (shouldPackTangents)\n {\n mesh.vertex.tangent = packTangentFrames(\n requireVertexChannel(mesh, meshIndex, \"normal\", \"packTangents\"),\n tangentXyz(mesh),\n requireVertexChannel(mesh, meshIndex, \"binormal\", \"packTangents\")\n );\n mesh.vertex.normal = [];\n mesh.vertex.binormal = [];\n }\n }\n}\n\n/** Reads input using normalized format options for the glTF format reader. */\nexport function readWithValues(format, input, values)\n{\n const parsed = parseInput(input);\n const json = parseGltfToJson(parsed.gltf, {\n binaryChunk: parsed.binaryChunk,\n source: values.source,\n buffers: values.buffers\n });\n rebuildMissingMeshData(format, json, values);\n if (values.emit === OUTPUT_CMF) return hydrateCmf(buildCmfFromShared(json), values.classes, { source: values.source });\n return hydrateJson(json, { classes: values.classes, source: values.source });\n}\n\n/** Inspects input using normalized format options for the glTF format reader. */\nexport function inspectWithValues(input, values)\n{\n const parsed = parseInput(input);\n return inspectGltf(parsed.gltf, { format: parsed.format, source: values.source });\n}\n\n/** Converts a parsed payload into a JSON-safe value for the glTF format reader. */\nexport function toJsonValue(value)\n{\n if (value === null || value === undefined) return value;\n if (typeof value !== \"object\") return value;\n\n if (typeof value.toJSON === \"function\")\n {\n const next = value.toJSON();\n if (next !== value) return toJsonValue(next);\n }\n\n if (Array.isArray(value)) return value.map(toJsonValue);\n if (ArrayBuffer.isView(value) && !(value instanceof DataView)) return Array.from(value);\n\n const out = {};\n for (const key of Object.keys(value))\n {\n out[key] = toJsonValue(value[key]);\n }\n return out;\n}\n\n"],"names":["CLASS_KEYS","Object","freeze","Array","from","Set","GR2_CLASS_KEYS","CMF_CLASS_KEYS","OUTPUT_JSON","OUTPUT_GLTF_JSON","OUTPUT_SHARED","OUTPUT_GR2","OUTPUT_CMF","DEFAULT_VALUES","emit","source","buffers","packTangents","uvHandedness","rebuildMissingNormals","rebuildMissingTangents","rebuildMissingBiNormals","classes","OPTION_KEYS","validateClassKey","key","readerName","includes","Error","JSON","stringify","join","validateClass","Class","TypeError","mergeClasses","base","next","entries","undefined","validateRule","name","value","normalizeUvHandedness","normalizeValues","options","keys","has","values","normalizeEmit","prototype","hasOwnProperty","call","hasClasses","some","hasVertexChannel","mesh","channel","vertex","length","requireVertexChannel","meshIndex","feature","triangleFaces","faces","group","indices","push","shouldApplyMeshRule","format","rule","context","result","reader","vertexCount","position","tangentXyz","tangent","count","width","slice","out","i","o","generatedBiNormalsForMesh","normals","generateBiNormals","b","normalize","cross","sign","rebuildMissingMeshData","json","meshes","common","raw","shouldPackTangents","normal","generateNormals","generateTangents","binormal","packTangentFrames","readWithValues","input","parsed","parseInput","parseGltfToJson","gltf","binaryChunk","hydrateCmf","buildCmfFromShared","hydrateJson","inspectWithValues","inspectGltf","toJsonValue","toJSON","isArray","map","ArrayBuffer","isView","DataView"],"mappings":"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"}
@@ -218,27 +218,6 @@ class CjsHlslFormat {
218
218
  static toJSON(value) {
219
219
  return toJsonValue(value);
220
220
  }
221
-
222
- /**
223
- * Node-only convenience: reads a compiled Tr2 effect file from disk.
224
- *
225
- * @param {string} path Path to a compiled Carbon effect file (`.sm_hi` etc.).
226
- * @param {object} [options] Format values.
227
- * @returns {Promise<HlslEffectRes|object>} The raw HlslEffectRes instance, compact metadata, or the documented JSON graph.
228
- */
229
- static async readFile(path, options = {}) {
230
- if (typeof path !== "string" || !path) {
231
- throw new TypeError(`${FORMAT_NAME}: readFile path must be a non-empty string`);
232
- }
233
- const {
234
- readFile
235
- } = await import('node:fs/promises');
236
- const input = await readFile(path);
237
- return readWithValues(input, normalizeValues(DEFAULT_VALUES, {
238
- source: path,
239
- ...options
240
- }, FORMAT_NAME));
241
- }
242
221
  static OUTPUT_JSON = OUTPUT_JSON;
243
222
  static OUTPUT_METADATA = OUTPUT_METADATA;
244
223
  static OUTPUT_RAW = OUTPUT_RAW;