@carbonenginejs/runtime-resource 0.7.0 → 0.8.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 (219) hide show
  1. package/FORMAT-PROVENANCE.md +155 -144
  2. package/LICENSE +21 -21
  3. package/NOTICE +29 -29
  4. package/README.md +11 -0
  5. package/dist/CjsMotherLode.js +1271 -1271
  6. package/dist/CjsResMan.js +3005 -3005
  7. package/dist/CjsResManQueue.js +214 -214
  8. package/dist/CjsResource.js +566 -566
  9. package/dist/CjsResourceSource.js +59 -59
  10. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  11. package/dist/format/CjsBlueReader.js +269 -269
  12. package/dist/format/CjsFormat.js +192 -192
  13. package/dist/format/CjsReader.js +18 -18
  14. package/dist/format/CjsResourceProbe.js +277 -277
  15. package/dist/format/payloadContract.js +173 -173
  16. package/dist/formats/black/CjsBlackFormat.js +278 -278
  17. package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
  18. package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
  19. package/dist/formats/black/core/CjsBlackReader.js +639 -639
  20. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
  21. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
  22. package/dist/formats/black/core/blackConstants.js +7 -7
  23. package/dist/formats/black/core/blackDefinitions.js +10 -10
  24. package/dist/formats/black/core/blackEnums.js +6 -6
  25. package/dist/formats/black/core/blackSchema.js +3 -3
  26. package/dist/formats/black/core/blackVersion.js +22 -22
  27. package/dist/formats/black/core/helpers.js +182 -182
  28. package/dist/formats/black/core/schema.js +4 -4
  29. package/dist/formats/black/index.js +2 -2
  30. package/dist/formats/bnk/CjsBnkFormat.js +125 -125
  31. package/dist/formats/bnk/core/graph.js +140 -140
  32. package/dist/formats/bnk/core/helpers.js +409 -409
  33. package/dist/formats/bnk/core/musicNodes.js +489 -489
  34. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  35. package/dist/formats/bnk/index.js +2 -2
  36. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  37. package/dist/formats/cmf/core/binary.js +118 -118
  38. package/dist/formats/cmf/core/buffers.js +233 -233
  39. package/dist/formats/cmf/core/constants.js +47 -47
  40. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  41. package/dist/formats/cmf/core/helpers.js +287 -287
  42. package/dist/formats/cmf/core/pack.js +276 -276
  43. package/dist/formats/cmf/core/schema.js +364 -364
  44. package/dist/formats/cmf/core/shared.js +268 -268
  45. package/dist/formats/cmf/core/writer.js +517 -517
  46. package/dist/formats/cmf/index.js +2 -2
  47. package/dist/formats/dds/CjsDdsFormat.js +193 -193
  48. package/dist/formats/dds/core/bc6h.js +288 -0
  49. package/dist/formats/dds/core/bc6h.js.map +1 -0
  50. package/dist/formats/dds/core/bc7.js +251 -0
  51. package/dist/formats/dds/core/bc7.js.map +1 -0
  52. package/dist/formats/dds/core/helpers.js +815 -812
  53. package/dist/formats/dds/core/helpers.js.map +1 -1
  54. package/dist/formats/dds/index.js +2 -2
  55. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  56. package/dist/formats/fbx/core/helpers.js +3901 -3901
  57. package/dist/formats/fbx/index.js +2 -2
  58. package/dist/formats/flac/CjsFlacFormat.js +87 -87
  59. package/dist/formats/flac/core/helpers.js +295 -295
  60. package/dist/formats/flac/index.js +2 -2
  61. package/dist/formats/gif/CjsGifFormat.js +87 -87
  62. package/dist/formats/gif/core/helpers.js +360 -360
  63. package/dist/formats/gif/index.js +2 -2
  64. package/dist/formats/gltf/CjsGltfFormat.js +290 -290
  65. package/dist/formats/gltf/core/helpers.js +292 -292
  66. package/dist/formats/gltf/core/json.js +79 -79
  67. package/dist/formats/gltf/core/parser.js +666 -666
  68. package/dist/formats/gltf/core/targets.js +163 -163
  69. package/dist/formats/gltf/index.js +2 -2
  70. package/dist/formats/index.js +23 -23
  71. package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
  72. package/dist/formats/jpeg/core/helpers.js +350 -350
  73. package/dist/formats/jpeg/core/jpeg.js +377 -377
  74. package/dist/formats/jpeg/index.js +2 -2
  75. package/dist/formats/mp3/CjsMp3Format.js +192 -192
  76. package/dist/formats/mp3/core/helpers.js +338 -338
  77. package/dist/formats/mp3/index.js +2 -2
  78. package/dist/formats/mp4/CjsMp4Format.js +191 -191
  79. package/dist/formats/mp4/core/helpers.js +449 -449
  80. package/dist/formats/mp4/index.js +2 -2
  81. package/dist/formats/obj/CjsObjFormat.js +253 -253
  82. package/dist/formats/obj/core/helpers.js +573 -573
  83. package/dist/formats/obj/core/json.js +64 -64
  84. package/dist/formats/obj/core/parser.js +321 -321
  85. package/dist/formats/obj/index.js +2 -2
  86. package/dist/formats/ogg/CjsOggFormat.js +88 -88
  87. package/dist/formats/ogg/core/helpers.js +387 -387
  88. package/dist/formats/ogg/core/imdct.js +178 -178
  89. package/dist/formats/ogg/core/vorbis.js +999 -999
  90. package/dist/formats/ogg/index.js +2 -2
  91. package/dist/formats/png/CjsPngFormat.js +195 -195
  92. package/dist/formats/png/core/helpers.js +583 -583
  93. package/dist/formats/png/index.js +2 -2
  94. package/dist/formats/red/CjsRedFormat.js +261 -261
  95. package/dist/formats/red/core/CjsRedReader.js +194 -194
  96. package/dist/formats/red/core/blackDefinitions.js +3 -3
  97. package/dist/formats/red/core/helpers.js +139 -139
  98. package/dist/formats/red/core/redGraph.js +68 -68
  99. package/dist/formats/red/core/schema.js +4 -4
  100. package/dist/formats/red/index.js +2 -2
  101. package/dist/formats/stl/CjsStlFormat.js +365 -365
  102. package/dist/formats/stl/core/helpers.js +261 -261
  103. package/dist/formats/stl/core/json.js +51 -51
  104. package/dist/formats/stl/core/stl.js +629 -629
  105. package/dist/formats/stl/core/targets.js +163 -163
  106. package/dist/formats/stl/index.js +2 -2
  107. package/dist/formats/tga/CjsTgaFormat.js +192 -192
  108. package/dist/formats/tga/core/helpers.js +446 -446
  109. package/dist/formats/tga/index.js +2 -2
  110. package/dist/formats/wav/CjsWavFormat.js +192 -192
  111. package/dist/formats/wav/core/helpers.js +328 -328
  112. package/dist/formats/wav/index.js +2 -2
  113. package/dist/formats/webm/CjsWebmFormat.js +191 -191
  114. package/dist/formats/webm/core/helpers.js +537 -537
  115. package/dist/formats/webm/index.js +2 -2
  116. package/dist/formats/webp/CjsWebpFormat.js +86 -86
  117. package/dist/formats/webp/core/helpers.js +214 -214
  118. package/dist/formats/webp/index.js +2 -2
  119. package/dist/formats/wem/CjsWemFormat.js +241 -241
  120. package/dist/formats/wem/core/bitStream.js +259 -259
  121. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  122. package/dist/formats/wem/core/helpers.js +417 -417
  123. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  124. package/dist/formats/wem/core/ptadpcm.js +77 -77
  125. package/dist/formats/wem/core/resolve.js +121 -121
  126. package/dist/formats/wem/core/wemToOgg.js +485 -485
  127. package/dist/formats/wem/index.js +2 -2
  128. package/dist/formats/yaml/CjsYamlFormat.js +83 -83
  129. package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
  130. package/dist/formats/yaml/core/helpers.js +160 -160
  131. package/dist/formats/yaml/index.js +2 -2
  132. package/dist/index.js +48 -48
  133. package/dist/resourcePath.js +18 -18
  134. package/dist/resourceStates.js +9 -9
  135. package/dist/resources/AudioGeometryResData.js +47 -47
  136. package/dist/resources/GStateBindingCallbackData.js +31 -31
  137. package/dist/resources/MeshDecalData.js +37 -37
  138. package/dist/resources/MeshDecalLodData.js +34 -34
  139. package/dist/resources/Tr2EffectRes.js +71 -71
  140. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
  141. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  142. package/dist/resources/Tr2ImageRes.js +114 -114
  143. package/dist/resources/Tr2LightProfileRes.js +40 -40
  144. package/dist/resources/Tr2MaterialArea.js +34 -34
  145. package/dist/resources/Tr2MaterialMesh.js +31 -31
  146. package/dist/resources/Tr2MaterialRes.js +34 -34
  147. package/dist/resources/Tr2ShaderPermutation.js +43 -43
  148. package/dist/resources/Tr2TextureLodManager.js +80 -80
  149. package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
  150. package/dist/resources/Tr2TexturePackChannel.js +37 -37
  151. package/dist/resources/Tr2TexturePipeline.js +52 -52
  152. package/dist/resources/Tr2TexturePipelineParams.js +34 -34
  153. package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
  154. package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
  155. package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
  156. package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
  157. package/dist/resources/TriGeometryRes.js +239 -216
  158. package/dist/resources/TriGeometryRes.js.map +1 -1
  159. package/dist/resources/TriGeometryResAreaData.js +59 -59
  160. package/dist/resources/TriGeometryResJointData.js +38 -38
  161. package/dist/resources/TriGeometryResLodData.js +88 -88
  162. package/dist/resources/TriGeometryResMeshData.js +63 -63
  163. package/dist/resources/TriGeometryResSkeletonData.js +34 -34
  164. package/dist/resources/TriGrannyRes.js +43 -43
  165. package/dist/resources/TriJointBinding.js +38 -38
  166. package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
  167. package/dist/resources/TriRtGeometryConstants.js +88 -88
  168. package/dist/resources/TriTextureRes.js +304 -304
  169. package/dist/resources/enums.js +18 -18
  170. package/dist/resources/resourceBoundary.js +47 -47
  171. package/dist/resources/texturePipelineBehavior.js +308 -308
  172. package/dist/texture/CjsTextureArrayRes.js +406 -406
  173. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  174. package/format-notices/black/LICENSE +21 -21
  175. package/format-notices/black/NOTICE +47 -47
  176. package/format-notices/bnk/LICENSE +21 -21
  177. package/format-notices/bnk/NOTICE +20 -20
  178. package/format-notices/cmf/LICENSE +21 -21
  179. package/format-notices/cmf/NOTICE +36 -36
  180. package/format-notices/dds/LICENSE +21 -21
  181. package/format-notices/dds/NOTICE +14 -14
  182. package/format-notices/fbx/LICENSE +21 -21
  183. package/format-notices/fbx/NOTICE +14 -14
  184. package/format-notices/flac/LICENSE +21 -21
  185. package/format-notices/flac/NOTICE +14 -14
  186. package/format-notices/gif/LICENSE +21 -21
  187. package/format-notices/gif/NOTICE +14 -14
  188. package/format-notices/gltf/LICENSE +21 -21
  189. package/format-notices/gltf/NOTICE +27 -27
  190. package/format-notices/jpeg/LICENSE +21 -21
  191. package/format-notices/jpeg/NOTICE +14 -14
  192. package/format-notices/mp3/LICENSE +21 -21
  193. package/format-notices/mp3/NOTICE +14 -14
  194. package/format-notices/mp4/LICENSE +21 -21
  195. package/format-notices/mp4/NOTICE +14 -14
  196. package/format-notices/obj/LICENSE +21 -21
  197. package/format-notices/obj/NOTICE +26 -26
  198. package/format-notices/ogg/LICENSE +21 -21
  199. package/format-notices/ogg/NOTICE +28 -28
  200. package/format-notices/png/LICENSE +21 -21
  201. package/format-notices/png/NOTICE +14 -14
  202. package/format-notices/red/LICENSE +21 -21
  203. package/format-notices/red/NOTICE +31 -31
  204. package/format-notices/stl/LICENSE +21 -21
  205. package/format-notices/stl/NOTICE +21 -21
  206. package/format-notices/tga/LICENSE +21 -21
  207. package/format-notices/tga/NOTICE +14 -14
  208. package/format-notices/wav/LICENSE +21 -21
  209. package/format-notices/wav/NOTICE +14 -14
  210. package/format-notices/webm/LICENSE +21 -21
  211. package/format-notices/webm/NOTICE +14 -14
  212. package/format-notices/webp/LICENSE +21 -21
  213. package/format-notices/webp/NOTICE +14 -14
  214. package/format-notices/wem/LICENSE +57 -57
  215. package/format-notices/wem/NOTICE +33 -33
  216. package/format-notices/yaml/LICENSE +21 -21
  217. package/format-notices/yaml/NOTICE +44 -44
  218. package/package.json +2 -2
  219. package/resource-lifecycle.md +679 -679
@@ -1,40 +1,40 @@
1
- import { validateRgbaPayload } from '../format/payloadContract.js';
2
- import { PixelFormat as PixelFormat$1 } from '@carbonenginejs/runtime-const/graphics';
3
- import { PixelFormat } from '@carbonenginejs/runtime-const/render-context';
4
-
5
- // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipeline.cpp
6
- // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepLoad.cpp
7
- // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepLimitSize.cpp
8
- // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepCompress.cpp
9
- // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepPack.cpp
10
- const STEP_LOAD = "Tr2TexturePipelineStepLoad";
11
- const STEP_LIMIT_SIZE = "Tr2TexturePipelineStepLimitSize";
12
- const STEP_COMPRESS = "Tr2TexturePipelineStepCompress";
13
- const STEP_PACK = "Tr2TexturePipelineStepPack";
14
- const PACK_FORMATS = new Set([PixelFormat.PIXEL_FORMAT_R8_UNORM, PixelFormat.PIXEL_FORMAT_B8G8R8A8_UNORM, PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM]);
15
-
1
+ import { validateRgbaPayload } from '../format/payloadContract.js';
2
+ import { PixelFormat as PixelFormat$1 } from '@carbonenginejs/runtime-const/graphics';
3
+ import { PixelFormat } from '@carbonenginejs/runtime-const/render-context';
4
+
5
+ // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipeline.cpp
6
+ // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepLoad.cpp
7
+ // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepLimitSize.cpp
8
+ // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepCompress.cpp
9
+ // Source: trinity/trinity/Resources/TexturePipeline/Tr2TexturePipelineStepPack.cpp
10
+ const STEP_LOAD = "Tr2TexturePipelineStepLoad";
11
+ const STEP_LIMIT_SIZE = "Tr2TexturePipelineStepLimitSize";
12
+ const STEP_COMPRESS = "Tr2TexturePipelineStepCompress";
13
+ const STEP_PACK = "Tr2TexturePipelineStepPack";
14
+ const PACK_FORMATS = new Set([PixelFormat.PIXEL_FORMAT_R8_UNORM, PixelFormat.PIXEL_FORMAT_B8G8R8A8_UNORM, PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM]);
15
+
16
16
  /**
17
17
  * Collect Carbon texture-pipeline dependencies in std::set-equivalent order.
18
18
  *
19
19
  * @param {object[]} steps Pipeline steps.
20
20
  * @returns {string[]} Sorted unique resource paths.
21
- */
22
- function GetTexturePipelineDependencies(steps) {
23
- const dependencies = new Set();
24
- for (const step of AssertSteps(steps)) {
25
- const name = StepName(step);
26
- if (name === STEP_LOAD) {
27
- AddDependency(dependencies, step.path);
28
- } else if (name === STEP_PACK) {
29
- AddDependency(dependencies, step.r?.path);
30
- AddDependency(dependencies, step.g?.path);
31
- AddDependency(dependencies, step.b?.path);
32
- AddDependency(dependencies, step.a?.path);
33
- }
34
- }
35
- return [...dependencies].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
36
- }
37
-
21
+ */
22
+ function GetTexturePipelineDependencies(steps) {
23
+ const dependencies = new Set();
24
+ for (const step of AssertSteps(steps)) {
25
+ const name = StepName(step);
26
+ if (name === STEP_LOAD) {
27
+ AddDependency(dependencies, step.path);
28
+ } else if (name === STEP_PACK) {
29
+ AddDependency(dependencies, step.r?.path);
30
+ AddDependency(dependencies, step.g?.path);
31
+ AddDependency(dependencies, step.b?.path);
32
+ AddDependency(dependencies, step.a?.path);
33
+ }
34
+ }
35
+ return [...dependencies].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
36
+ }
37
+
38
38
  /**
39
39
  * Execute the maintained JavaScript form of Carbon's CPU bitmap pipeline.
40
40
  *
@@ -42,279 +42,279 @@ function GetTexturePipelineDependencies(steps) {
42
42
  * @param {{maxWidth:number,maxHeight:number}} params Caller size limits.
43
43
  * @param {object|null} options Input resolution options.
44
44
  * @returns {Promise<object>} Canonical RGBA payload.
45
- */
46
- async function ExecuteTexturePipeline(steps, params, options = null) {
47
- const list = AssertSteps(steps);
48
- if (!list.length) {
49
- throw PipelineError("CJS_TEXTURE_PIPELINE_NO_STEPS", "Tr2TexturePipeline has no steps.");
50
- }
51
- const limits = {
52
- maxWidth: AssertLimit(params?.maxWidth, "maxWidth"),
53
- maxHeight: AssertLimit(params?.maxHeight, "maxHeight")
54
- };
55
- const settings = NormalizeOptions(options);
56
- const inputs = new Map();
57
- for (const path of GetTexturePipelineDependencies(list)) {
58
- inputs.set(path, await ResolveInput(path, settings));
59
- }
60
- let bitmap = null;
61
- for (const step of list) {
62
- const name = StepName(step);
63
- if (name === STEP_LOAD) {
64
- bitmap = CloneBitmap(RequireInput(inputs, step.path));
65
- } else if (name === STEP_LIMIT_SIZE) {
66
- bitmap = LimitBitmap(RequireBitmap(bitmap), CombineLimits(step, limits));
67
- } else if (name === STEP_COMPRESS) {
68
- // Carbon's current implementation validates the bitmap and otherwise
69
- // performs no compression work.
70
- RequireBitmap(bitmap);
71
- } else if (name === STEP_PACK) {
72
- bitmap = PackBitmap(step, inputs);
73
- } else {
74
- throw PipelineError("CJS_TEXTURE_PIPELINE_STEP_UNSUPPORTED", `Unsupported texture pipeline step: ${name || "unknown"}.`);
75
- }
76
- }
77
- bitmap = LimitBitmap(RequireBitmap(bitmap), limits);
78
- return ToPayload(bitmap);
79
- }
80
- function AssertSteps(steps) {
81
- if (!Array.isArray(steps)) {
82
- throw new TypeError("Tr2TexturePipeline.steps must be an array.");
83
- }
84
- return steps;
85
- }
86
- function AssertLimit(value, name) {
87
- if (!Number.isSafeInteger(value) || value < 0) {
88
- throw new TypeError(`Tr2TexturePipeline ${name} must be a non-negative safe integer.`);
89
- }
90
- return value;
91
- }
92
- function NormalizeOptions(options) {
93
- if (options === null || options === undefined) {
94
- return {};
95
- }
96
- if (!options || typeof options !== "object" || Array.isArray(options)) {
97
- throw new TypeError("Tr2TexturePipeline options must be an object or null.");
98
- }
99
- if (options.load !== undefined && typeof options.load !== "function") {
100
- throw new TypeError("Tr2TexturePipeline options.load must be a function.");
101
- }
102
- if (options.resMan !== undefined && typeof options.resMan?.GetObject !== "function") {
103
- throw new TypeError("Tr2TexturePipeline options.resMan must provide GetObject().");
104
- }
105
- return options;
106
- }
107
- async function ResolveInput(path, options) {
108
- let value;
109
- if (options.inputs instanceof Map) {
110
- value = options.inputs.get(path);
111
- } else if (options.inputs && typeof options.inputs === "object") {
112
- value = options.inputs[path];
113
- }
114
- if (value === undefined && options.load) {
115
- value = await options.load(path);
116
- }
117
- if (value === undefined && options.resMan) {
118
- value = await options.resMan.GetObject(path, {
119
- ...(options.resourceOptions || {}),
120
- requirement: "image",
121
- emit: "rgba"
122
- });
123
- }
124
- if (value === undefined) {
125
- throw PipelineError("CJS_TEXTURE_PIPELINE_INPUT_MISSING", `No texture pipeline input was provided for ${path}.`);
126
- }
127
- const payload = typeof value?.GetPayload === "function" ? value.GetPayload() : value;
128
- validateRgbaPayload(payload);
129
- if (payload.pixelFormat !== PixelFormat$1.RGBA8_UNORM) {
130
- throw PipelineError("CJS_TEXTURE_PIPELINE_FORMAT_UNSUPPORTED", `Texture pipeline input ${path} must use rgba8unorm.`);
131
- }
132
- return FromPayload(payload);
133
- }
134
- function FromPayload(payload) {
135
- const data = new Uint8Array(payload.width * payload.height * 4);
136
- for (let y = 0; y < payload.height; y++) {
137
- const sourceOffset = y * payload.strideBytes;
138
- const targetOffset = y * payload.width * 4;
139
- data.set(payload.data.subarray(sourceOffset, sourceOffset + payload.width * 4), targetOffset);
140
- }
141
- return {
142
- width: payload.width,
143
- height: payload.height,
144
- data,
145
- sourceFormat: payload.sourceFormat || "rgba",
146
- colorSpace: payload.colorSpace,
147
- alphaMode: payload.alphaMode,
148
- metadata: payload.metadata || null
149
- };
150
- }
151
- function ToPayload(bitmap) {
152
- return {
153
- payloadType: "rgba",
154
- sourceFormat: bitmap.sourceFormat || "texture-pipeline",
155
- width: bitmap.width,
156
- height: bitmap.height,
157
- pixelFormat: PixelFormat$1.RGBA8_UNORM,
158
- data: bitmap.data,
159
- strideBytes: bitmap.width * 4,
160
- origin: "top-left",
161
- colorSpace: bitmap.colorSpace || "unknown",
162
- alphaMode: bitmap.alphaMode || "unknown",
163
- ...(bitmap.metadata ? {
164
- metadata: bitmap.metadata
165
- } : {})
166
- };
167
- }
168
- function CloneBitmap(bitmap) {
169
- return {
170
- ...bitmap,
171
- data: new Uint8Array(bitmap.data),
172
- metadata: bitmap.metadata && typeof bitmap.metadata === "object" ? {
173
- ...bitmap.metadata
174
- } : bitmap.metadata
175
- };
176
- }
177
- function CombineLimits(step, params) {
178
- return {
179
- maxWidth: TightestLimit(AssertLimit(step.maxWidth ?? 0, "step.maxWidth"), params.maxWidth),
180
- maxHeight: TightestLimit(AssertLimit(step.maxHeight ?? 0, "step.maxHeight"), params.maxHeight)
181
- };
182
- }
183
- function TightestLimit(first, second) {
184
- if (!first) return second;
185
- if (!second) return first;
186
- return Math.min(first, second);
187
- }
188
- function LimitBitmap(bitmap, limits) {
189
- let result = bitmap;
190
- while (limits.maxWidth && result.width > limits.maxWidth || limits.maxHeight && result.height > limits.maxHeight) {
191
- result = Downsample2x2(result);
192
- }
193
- return result;
194
- }
195
- function Downsample2x2(bitmap) {
196
- const width = Math.max(1, Math.floor(bitmap.width / 2));
197
- const height = Math.max(1, Math.floor(bitmap.height / 2));
198
- const data = new Uint8Array(width * height * 4);
199
- for (let y = 0; y < height; y++) {
200
- for (let x = 0; x < width; x++) {
201
- const counts = [0, 0, 0, 0];
202
- let samples = 0;
203
- for (let oy = 0; oy < 2; oy++) {
204
- for (let ox = 0; ox < 2; ox++) {
205
- const sourceX = Math.min(bitmap.width - 1, x * 2 + ox);
206
- const sourceY = Math.min(bitmap.height - 1, y * 2 + oy);
207
- const source = (sourceY * bitmap.width + sourceX) * 4;
208
- for (let channel = 0; channel < 4; channel++) {
209
- counts[channel] += bitmap.data[source + channel];
210
- }
211
- samples++;
212
- }
213
- }
214
- const target = (y * width + x) * 4;
215
- for (let channel = 0; channel < 4; channel++) {
216
- data[target + channel] = Math.round(counts[channel] / samples);
217
- }
218
- }
219
- }
220
- return {
221
- ...bitmap,
222
- width,
223
- height,
224
- data
225
- };
226
- }
227
- function PackBitmap(step, inputs) {
228
- // The generated schema records the enum's zero value, while Carbon's
229
- // constructor initializes this step to B8G8R8A8_UNORM.
230
- const format = step.format === PixelFormat.PIXEL_FORMAT_UNKNOWN ? PixelFormat.PIXEL_FORMAT_B8G8R8A8_UNORM : step.format;
231
- if (!PACK_FORMATS.has(format)) {
232
- throw PipelineError("CJS_TEXTURE_PIPELINE_FORMAT_UNSUPPORTED", `Unsupported Carbon pack pixel format: ${String(format)}.`);
233
- }
234
- const descriptors = [step.r, step.g, step.b, step.a];
235
- const sources = descriptors.map(channel => channel?.path ? RequireInput(inputs, channel.path) : null);
236
- const first = sources.find(Boolean);
237
- const width = first?.width || 4;
238
- const height = first?.height || 4;
239
- for (const source of sources) {
240
- if (source && (source.width !== width || source.height !== height)) {
241
- throw PipelineError("CJS_TEXTURE_PIPELINE_SIZE_MISMATCH", "Texture pipeline pack inputs must have identical dimensions.");
242
- }
243
- }
244
- const data = new Uint8Array(width * height * 4);
245
- const isR8 = format === PixelFormat.PIXEL_FORMAT_R8_UNORM;
246
- const isX8 = format === PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM;
247
- for (let pixel = 0; pixel < width * height; pixel++) {
248
- const values = descriptors.map((channel, index) => ReadPackChannel(sources[index], channel, pixel));
249
- const target = pixel * 4;
250
- if (isR8) {
251
- data[target] = values[0];
252
- data[target + 3] = 255;
253
- } else {
254
- data[target] = values[0];
255
- data[target + 1] = values[1];
256
- data[target + 2] = values[2];
257
- data[target + 3] = isX8 ? 255 : values[3];
258
- }
259
- }
260
- return {
261
- width,
262
- height,
263
- data,
264
- sourceFormat: "texture-pipeline",
265
- colorSpace: first?.colorSpace || "unknown",
266
- alphaMode: isX8 || isR8 ? "opaque" : "unknown",
267
- metadata: {
268
- carbonPixelFormat: format
269
- }
270
- };
271
- }
272
- function ReadPackChannel(source, descriptor, pixel) {
273
- if (!source) {
274
- return AssertByte(descriptor?.fill ?? 0, "fill");
275
- }
276
- const channel = AssertByte(descriptor?.channel ?? 0, "channel");
277
- if (channel > 3) {
278
- throw new RangeError("Tr2TexturePackChannel.channel must be between 0 and 3.");
279
- }
280
- // Carbon's exposed chooser encodes RED=2 and BLUE=0 for BGRA host
281
- // bitmaps. Translate those values to this package's canonical RGBA input.
282
- const rgbaChannel = channel === 0 ? 2 : channel === 2 ? 0 : channel;
283
- return source.data[pixel * 4 + rgbaChannel];
284
- }
285
- function AssertByte(value, name) {
286
- if (!Number.isInteger(value) || value < 0 || value > 255) {
287
- throw new RangeError(`Tr2TexturePackChannel.${name} must be an integer from 0 to 255.`);
288
- }
289
- return value;
290
- }
291
- function RequireInput(inputs, path) {
292
- const value = inputs.get(String(path || ""));
293
- if (!value) {
294
- throw PipelineError("CJS_TEXTURE_PIPELINE_INPUT_MISSING", `Texture pipeline input is unavailable: ${String(path || "")}.`);
295
- }
296
- return value;
297
- }
298
- function RequireBitmap(bitmap) {
299
- if (!bitmap) {
300
- throw PipelineError("CJS_TEXTURE_PIPELINE_BITMAP_INVALID", "Texture pipeline step requires a valid input bitmap.");
301
- }
302
- return bitmap;
303
- }
304
- function AddDependency(dependencies, value) {
305
- const path = String(value || "");
306
- if (path) {
307
- dependencies.add(path);
308
- }
309
- }
310
- function StepName(step) {
311
- return step?.constructor?.name || step?.className || "";
312
- }
313
- function PipelineError(code, message) {
314
- const error = new Error(message);
315
- error.code = code;
316
- return error;
317
- }
318
-
319
- export { ExecuteTexturePipeline, GetTexturePipelineDependencies };
320
- //# sourceMappingURL=texturePipelineBehavior.js.map
45
+ */
46
+ async function ExecuteTexturePipeline(steps, params, options = null) {
47
+ const list = AssertSteps(steps);
48
+ if (!list.length) {
49
+ throw PipelineError("CJS_TEXTURE_PIPELINE_NO_STEPS", "Tr2TexturePipeline has no steps.");
50
+ }
51
+ const limits = {
52
+ maxWidth: AssertLimit(params?.maxWidth, "maxWidth"),
53
+ maxHeight: AssertLimit(params?.maxHeight, "maxHeight")
54
+ };
55
+ const settings = NormalizeOptions(options);
56
+ const inputs = new Map();
57
+ for (const path of GetTexturePipelineDependencies(list)) {
58
+ inputs.set(path, await ResolveInput(path, settings));
59
+ }
60
+ let bitmap = null;
61
+ for (const step of list) {
62
+ const name = StepName(step);
63
+ if (name === STEP_LOAD) {
64
+ bitmap = CloneBitmap(RequireInput(inputs, step.path));
65
+ } else if (name === STEP_LIMIT_SIZE) {
66
+ bitmap = LimitBitmap(RequireBitmap(bitmap), CombineLimits(step, limits));
67
+ } else if (name === STEP_COMPRESS) {
68
+ // Carbon's current implementation validates the bitmap and otherwise
69
+ // performs no compression work.
70
+ RequireBitmap(bitmap);
71
+ } else if (name === STEP_PACK) {
72
+ bitmap = PackBitmap(step, inputs);
73
+ } else {
74
+ throw PipelineError("CJS_TEXTURE_PIPELINE_STEP_UNSUPPORTED", `Unsupported texture pipeline step: ${name || "unknown"}.`);
75
+ }
76
+ }
77
+ bitmap = LimitBitmap(RequireBitmap(bitmap), limits);
78
+ return ToPayload(bitmap);
79
+ }
80
+ function AssertSteps(steps) {
81
+ if (!Array.isArray(steps)) {
82
+ throw new TypeError("Tr2TexturePipeline.steps must be an array.");
83
+ }
84
+ return steps;
85
+ }
86
+ function AssertLimit(value, name) {
87
+ if (!Number.isSafeInteger(value) || value < 0) {
88
+ throw new TypeError(`Tr2TexturePipeline ${name} must be a non-negative safe integer.`);
89
+ }
90
+ return value;
91
+ }
92
+ function NormalizeOptions(options) {
93
+ if (options === null || options === undefined) {
94
+ return {};
95
+ }
96
+ if (!options || typeof options !== "object" || Array.isArray(options)) {
97
+ throw new TypeError("Tr2TexturePipeline options must be an object or null.");
98
+ }
99
+ if (options.load !== undefined && typeof options.load !== "function") {
100
+ throw new TypeError("Tr2TexturePipeline options.load must be a function.");
101
+ }
102
+ if (options.resMan !== undefined && typeof options.resMan?.GetObject !== "function") {
103
+ throw new TypeError("Tr2TexturePipeline options.resMan must provide GetObject().");
104
+ }
105
+ return options;
106
+ }
107
+ async function ResolveInput(path, options) {
108
+ let value;
109
+ if (options.inputs instanceof Map) {
110
+ value = options.inputs.get(path);
111
+ } else if (options.inputs && typeof options.inputs === "object") {
112
+ value = options.inputs[path];
113
+ }
114
+ if (value === undefined && options.load) {
115
+ value = await options.load(path);
116
+ }
117
+ if (value === undefined && options.resMan) {
118
+ value = await options.resMan.GetObject(path, {
119
+ ...(options.resourceOptions || {}),
120
+ requirement: "image",
121
+ emit: "rgba"
122
+ });
123
+ }
124
+ if (value === undefined) {
125
+ throw PipelineError("CJS_TEXTURE_PIPELINE_INPUT_MISSING", `No texture pipeline input was provided for ${path}.`);
126
+ }
127
+ const payload = typeof value?.GetPayload === "function" ? value.GetPayload() : value;
128
+ validateRgbaPayload(payload);
129
+ if (payload.pixelFormat !== PixelFormat$1.RGBA8_UNORM) {
130
+ throw PipelineError("CJS_TEXTURE_PIPELINE_FORMAT_UNSUPPORTED", `Texture pipeline input ${path} must use rgba8unorm.`);
131
+ }
132
+ return FromPayload(payload);
133
+ }
134
+ function FromPayload(payload) {
135
+ const data = new Uint8Array(payload.width * payload.height * 4);
136
+ for (let y = 0; y < payload.height; y++) {
137
+ const sourceOffset = y * payload.strideBytes;
138
+ const targetOffset = y * payload.width * 4;
139
+ data.set(payload.data.subarray(sourceOffset, sourceOffset + payload.width * 4), targetOffset);
140
+ }
141
+ return {
142
+ width: payload.width,
143
+ height: payload.height,
144
+ data,
145
+ sourceFormat: payload.sourceFormat || "rgba",
146
+ colorSpace: payload.colorSpace,
147
+ alphaMode: payload.alphaMode,
148
+ metadata: payload.metadata || null
149
+ };
150
+ }
151
+ function ToPayload(bitmap) {
152
+ return {
153
+ payloadType: "rgba",
154
+ sourceFormat: bitmap.sourceFormat || "texture-pipeline",
155
+ width: bitmap.width,
156
+ height: bitmap.height,
157
+ pixelFormat: PixelFormat$1.RGBA8_UNORM,
158
+ data: bitmap.data,
159
+ strideBytes: bitmap.width * 4,
160
+ origin: "top-left",
161
+ colorSpace: bitmap.colorSpace || "unknown",
162
+ alphaMode: bitmap.alphaMode || "unknown",
163
+ ...(bitmap.metadata ? {
164
+ metadata: bitmap.metadata
165
+ } : {})
166
+ };
167
+ }
168
+ function CloneBitmap(bitmap) {
169
+ return {
170
+ ...bitmap,
171
+ data: new Uint8Array(bitmap.data),
172
+ metadata: bitmap.metadata && typeof bitmap.metadata === "object" ? {
173
+ ...bitmap.metadata
174
+ } : bitmap.metadata
175
+ };
176
+ }
177
+ function CombineLimits(step, params) {
178
+ return {
179
+ maxWidth: TightestLimit(AssertLimit(step.maxWidth ?? 0, "step.maxWidth"), params.maxWidth),
180
+ maxHeight: TightestLimit(AssertLimit(step.maxHeight ?? 0, "step.maxHeight"), params.maxHeight)
181
+ };
182
+ }
183
+ function TightestLimit(first, second) {
184
+ if (!first) return second;
185
+ if (!second) return first;
186
+ return Math.min(first, second);
187
+ }
188
+ function LimitBitmap(bitmap, limits) {
189
+ let result = bitmap;
190
+ while (limits.maxWidth && result.width > limits.maxWidth || limits.maxHeight && result.height > limits.maxHeight) {
191
+ result = Downsample2x2(result);
192
+ }
193
+ return result;
194
+ }
195
+ function Downsample2x2(bitmap) {
196
+ const width = Math.max(1, Math.floor(bitmap.width / 2));
197
+ const height = Math.max(1, Math.floor(bitmap.height / 2));
198
+ const data = new Uint8Array(width * height * 4);
199
+ for (let y = 0; y < height; y++) {
200
+ for (let x = 0; x < width; x++) {
201
+ const counts = [0, 0, 0, 0];
202
+ let samples = 0;
203
+ for (let oy = 0; oy < 2; oy++) {
204
+ for (let ox = 0; ox < 2; ox++) {
205
+ const sourceX = Math.min(bitmap.width - 1, x * 2 + ox);
206
+ const sourceY = Math.min(bitmap.height - 1, y * 2 + oy);
207
+ const source = (sourceY * bitmap.width + sourceX) * 4;
208
+ for (let channel = 0; channel < 4; channel++) {
209
+ counts[channel] += bitmap.data[source + channel];
210
+ }
211
+ samples++;
212
+ }
213
+ }
214
+ const target = (y * width + x) * 4;
215
+ for (let channel = 0; channel < 4; channel++) {
216
+ data[target + channel] = Math.round(counts[channel] / samples);
217
+ }
218
+ }
219
+ }
220
+ return {
221
+ ...bitmap,
222
+ width,
223
+ height,
224
+ data
225
+ };
226
+ }
227
+ function PackBitmap(step, inputs) {
228
+ // The generated schema records the enum's zero value, while Carbon's
229
+ // constructor initializes this step to B8G8R8A8_UNORM.
230
+ const format = step.format === PixelFormat.PIXEL_FORMAT_UNKNOWN ? PixelFormat.PIXEL_FORMAT_B8G8R8A8_UNORM : step.format;
231
+ if (!PACK_FORMATS.has(format)) {
232
+ throw PipelineError("CJS_TEXTURE_PIPELINE_FORMAT_UNSUPPORTED", `Unsupported Carbon pack pixel format: ${String(format)}.`);
233
+ }
234
+ const descriptors = [step.r, step.g, step.b, step.a];
235
+ const sources = descriptors.map(channel => channel?.path ? RequireInput(inputs, channel.path) : null);
236
+ const first = sources.find(Boolean);
237
+ const width = first?.width || 4;
238
+ const height = first?.height || 4;
239
+ for (const source of sources) {
240
+ if (source && (source.width !== width || source.height !== height)) {
241
+ throw PipelineError("CJS_TEXTURE_PIPELINE_SIZE_MISMATCH", "Texture pipeline pack inputs must have identical dimensions.");
242
+ }
243
+ }
244
+ const data = new Uint8Array(width * height * 4);
245
+ const isR8 = format === PixelFormat.PIXEL_FORMAT_R8_UNORM;
246
+ const isX8 = format === PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM;
247
+ for (let pixel = 0; pixel < width * height; pixel++) {
248
+ const values = descriptors.map((channel, index) => ReadPackChannel(sources[index], channel, pixel));
249
+ const target = pixel * 4;
250
+ if (isR8) {
251
+ data[target] = values[0];
252
+ data[target + 3] = 255;
253
+ } else {
254
+ data[target] = values[0];
255
+ data[target + 1] = values[1];
256
+ data[target + 2] = values[2];
257
+ data[target + 3] = isX8 ? 255 : values[3];
258
+ }
259
+ }
260
+ return {
261
+ width,
262
+ height,
263
+ data,
264
+ sourceFormat: "texture-pipeline",
265
+ colorSpace: first?.colorSpace || "unknown",
266
+ alphaMode: isX8 || isR8 ? "opaque" : "unknown",
267
+ metadata: {
268
+ carbonPixelFormat: format
269
+ }
270
+ };
271
+ }
272
+ function ReadPackChannel(source, descriptor, pixel) {
273
+ if (!source) {
274
+ return AssertByte(descriptor?.fill ?? 0, "fill");
275
+ }
276
+ const channel = AssertByte(descriptor?.channel ?? 0, "channel");
277
+ if (channel > 3) {
278
+ throw new RangeError("Tr2TexturePackChannel.channel must be between 0 and 3.");
279
+ }
280
+ // Carbon's exposed chooser encodes RED=2 and BLUE=0 for BGRA host
281
+ // bitmaps. Translate those values to this package's canonical RGBA input.
282
+ const rgbaChannel = channel === 0 ? 2 : channel === 2 ? 0 : channel;
283
+ return source.data[pixel * 4 + rgbaChannel];
284
+ }
285
+ function AssertByte(value, name) {
286
+ if (!Number.isInteger(value) || value < 0 || value > 255) {
287
+ throw new RangeError(`Tr2TexturePackChannel.${name} must be an integer from 0 to 255.`);
288
+ }
289
+ return value;
290
+ }
291
+ function RequireInput(inputs, path) {
292
+ const value = inputs.get(String(path || ""));
293
+ if (!value) {
294
+ throw PipelineError("CJS_TEXTURE_PIPELINE_INPUT_MISSING", `Texture pipeline input is unavailable: ${String(path || "")}.`);
295
+ }
296
+ return value;
297
+ }
298
+ function RequireBitmap(bitmap) {
299
+ if (!bitmap) {
300
+ throw PipelineError("CJS_TEXTURE_PIPELINE_BITMAP_INVALID", "Texture pipeline step requires a valid input bitmap.");
301
+ }
302
+ return bitmap;
303
+ }
304
+ function AddDependency(dependencies, value) {
305
+ const path = String(value || "");
306
+ if (path) {
307
+ dependencies.add(path);
308
+ }
309
+ }
310
+ function StepName(step) {
311
+ return step?.constructor?.name || step?.className || "";
312
+ }
313
+ function PipelineError(code, message) {
314
+ const error = new Error(message);
315
+ error.code = code;
316
+ return error;
317
+ }
318
+
319
+ export { ExecuteTexturePipeline, GetTexturePipelineDependencies };
320
+ //# sourceMappingURL=texturePipelineBehavior.js.map