@carbonenginejs/runtime 0.1.0-alpha.4 → 0.1.0-alpha.5

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 (384) hide show
  1. package/dist/global/blue/BlueClasses.js +200 -0
  2. package/dist/global/blue/BlueClasses.js.map +1 -0
  3. package/dist/global/blue/IBlueClasses.js +79 -0
  4. package/dist/global/blue/IBlueClasses.js.map +1 -0
  5. package/dist/global/blue/IBlueDynamicResourceConstructor.js +16 -0
  6. package/dist/global/blue/IBlueDynamicResourceConstructor.js.map +1 -1
  7. package/dist/global/blue/blue.js +8 -2
  8. package/dist/global/blue/blue.js.map +1 -1
  9. package/dist/global/blue/index.js +2 -0
  10. package/dist/global/blue/index.js.map +1 -1
  11. package/dist/global/consts/index.js +0 -1
  12. package/dist/global/consts/index.js.map +1 -1
  13. package/dist/global/consts/renderContext/formats.js +26 -25
  14. package/dist/global/consts/renderContext/formats.js.map +1 -1
  15. package/dist/{trinityal/Tr2BitmapDimensions.js → global/imageio/BitmapDimensions.js} +19 -15
  16. package/dist/global/imageio/BitmapDimensions.js.map +1 -0
  17. package/dist/global/imageio/Cutout.js +28 -0
  18. package/dist/global/imageio/Cutout.js.map +1 -0
  19. package/dist/global/imageio/HostBitmap.js +1106 -0
  20. package/dist/global/imageio/HostBitmap.js.map +1 -0
  21. package/dist/global/imageio/ImageIOResult.js +99 -0
  22. package/dist/global/imageio/ImageIOResult.js.map +1 -0
  23. package/dist/global/imageio/ImageUtility.js +205 -0
  24. package/dist/global/imageio/ImageUtility.js.map +1 -0
  25. package/dist/global/imageio/LoadParameters.js +86 -0
  26. package/dist/global/imageio/LoadParameters.js.map +1 -0
  27. package/dist/global/imageio/Metadata.js +22 -0
  28. package/dist/global/imageio/Metadata.js.map +1 -0
  29. package/dist/global/imageio/index.js +8 -0
  30. package/dist/global/{consts/webgpu → imageio}/index.js.map +1 -1
  31. package/dist/global/index.js +2 -1
  32. package/dist/global/index.js.map +1 -1
  33. package/dist/global/math/color.js +1 -1
  34. package/dist/global/math/color.js.map +1 -1
  35. package/dist/global/schema/CjsSchema.js +8 -0
  36. package/dist/global/schema/CjsSchema.js.map +1 -1
  37. package/dist/index.js +12 -4
  38. package/dist/index.js.map +1 -1
  39. package/dist/resource/CjsResMan.js +47 -7
  40. package/dist/resource/CjsResMan.js.map +1 -1
  41. package/dist/resource/Tr2LightProfileRes.js +37 -0
  42. package/dist/resource/Tr2LightProfileRes.js.map +1 -1
  43. package/dist/resource/format/CjsByteWriter.js +46 -46
  44. package/dist/resource/format/CjsByteWriter.js.map +1 -1
  45. package/dist/resource/format/CjsFormat.js +7 -8
  46. package/dist/resource/format/CjsFormat.js.map +1 -1
  47. package/dist/resource/format/CjsFormatStore.js +8 -8
  48. package/dist/resource/format/CjsFormatStore.js.map +1 -1
  49. package/dist/resource/format/CjsGeometryFormat.js +114 -0
  50. package/dist/resource/format/CjsGeometryFormat.js.map +1 -0
  51. package/dist/resource/format/CjsImageFormat.js +282 -0
  52. package/dist/resource/format/CjsImageFormat.js.map +1 -0
  53. package/dist/resource/format/CjsResourceProbe.js +12 -48
  54. package/dist/resource/format/CjsResourceProbe.js.map +1 -1
  55. package/dist/resource/format/CjsStringTable.js +37 -37
  56. package/dist/resource/format/CjsStringTable.js.map +1 -1
  57. package/dist/resource/format/carbonEffect/CjsCarbonEffectReader.js +10 -10
  58. package/dist/resource/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
  59. package/dist/resource/format/carbonEffect/CjsCarbonEffectWriter.js +37 -37
  60. package/dist/resource/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -1
  61. package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js +35 -7
  62. package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
  63. package/dist/resource/format/index.js +3 -1
  64. package/dist/resource/format/index.js.map +1 -1
  65. package/dist/resource/formats/black/CjsBlackFormat.js +130 -137
  66. package/dist/resource/formats/black/CjsBlackFormat.js.map +1 -1
  67. package/dist/resource/formats/bnk/CjsBnkFormat.js +12 -19
  68. package/dist/resource/formats/bnk/CjsBnkFormat.js.map +1 -1
  69. package/dist/resource/formats/bnk/core/helpers.js +1 -3
  70. package/dist/resource/formats/bnk/core/helpers.js.map +1 -1
  71. package/dist/resource/formats/cmf/CjsCmfFormat.js +19 -82
  72. package/dist/resource/formats/cmf/CjsCmfFormat.js.map +1 -1
  73. package/dist/resource/formats/cmf/core/constants.js +1 -2
  74. package/dist/resource/formats/cmf/core/constants.js.map +1 -1
  75. package/dist/resource/formats/{stl/core/targets.js → cmf/core/flatShared.js} +9 -8
  76. package/dist/resource/formats/cmf/core/flatShared.js.map +1 -0
  77. package/dist/resource/formats/cmf/core/helpers.js +13 -13
  78. package/dist/resource/formats/cmf/core/helpers.js.map +1 -1
  79. package/dist/resource/formats/cmf/core/writer.js +24 -24
  80. package/dist/resource/formats/cmf/core/writer.js.map +1 -1
  81. package/dist/resource/formats/dds/CjsDdsFormat.js +134 -17
  82. package/dist/resource/formats/dds/CjsDdsFormat.js.map +1 -1
  83. package/dist/resource/formats/dds/core/helpers.js +125 -40
  84. package/dist/resource/formats/dds/core/helpers.js.map +1 -1
  85. package/dist/resource/formats/dxbc/CjsDxbcFormat.js +14 -16
  86. package/dist/resource/formats/dxbc/CjsDxbcFormat.js.map +1 -1
  87. package/dist/resource/formats/dxbc/core/{container.js → DxbcContainer.js} +2 -2
  88. package/dist/resource/formats/dxbc/core/DxbcContainer.js.map +1 -0
  89. package/dist/resource/formats/dxbc/core/{errors.js → DxbcReadError.js} +1 -1
  90. package/dist/resource/formats/dxbc/core/DxbcReadError.js.map +1 -0
  91. package/dist/resource/formats/dxbc/core/DxbcReader.js +1 -1
  92. package/dist/resource/formats/dxbc/core/DxbcReader.js.map +1 -1
  93. package/dist/resource/formats/dxbc/core/{program.js → DxbcShaderProgram.js} +2 -2
  94. package/dist/resource/formats/dxbc/core/DxbcShaderProgram.js.map +1 -0
  95. package/dist/resource/formats/dxbc/core/{signature.js → DxbcSignatureChunk.js} +2 -2
  96. package/dist/resource/formats/dxbc/core/DxbcSignatureChunk.js.map +1 -0
  97. package/dist/resource/formats/dxbc/core/decoder.js +2 -2
  98. package/dist/resource/formats/dxbc/core/decoder.js.map +1 -1
  99. package/dist/resource/formats/dxbc/core/helpers.js +3 -3
  100. package/dist/resource/formats/dxbc/core/helpers.js.map +1 -1
  101. package/dist/resource/formats/fbx/CjsFbxFormat.js +18 -20
  102. package/dist/resource/formats/fbx/CjsFbxFormat.js.map +1 -1
  103. package/dist/resource/formats/flac/CjsFlacFormat.js +7 -13
  104. package/dist/resource/formats/flac/CjsFlacFormat.js.map +1 -1
  105. package/dist/resource/formats/fsd/32/CjsFsd32Format.js +29 -29
  106. package/dist/resource/formats/fsd/32/CjsFsd32Format.js.map +1 -1
  107. package/dist/resource/formats/fsd/64/CjsFsd64Format.js +3 -3
  108. package/dist/resource/formats/fsd/64/CjsFsd64Format.js.map +1 -1
  109. package/dist/resource/formats/fsd/64/core/CjsFsd64Binary.js +23 -23
  110. package/dist/resource/formats/fsd/64/core/CjsFsd64Binary.js.map +1 -1
  111. package/dist/resource/formats/fsd/64/core/CjsFsd64Reader.js +8 -8
  112. package/dist/resource/formats/fsd/64/core/CjsFsd64Reader.js.map +1 -1
  113. package/dist/resource/formats/fsd/CjsFsdFormat.js +23 -23
  114. package/dist/resource/formats/fsd/CjsFsdFormat.js.map +1 -1
  115. package/dist/resource/formats/gif/CjsGifFormat.js +24 -15
  116. package/dist/resource/formats/gif/CjsGifFormat.js.map +1 -1
  117. package/dist/resource/formats/gltf/CjsGltfFormat.js +33 -98
  118. package/dist/resource/formats/gltf/CjsGltfFormat.js.map +1 -1
  119. package/dist/resource/formats/gltf/core/helpers.js +3 -12
  120. package/dist/resource/formats/gltf/core/helpers.js.map +1 -1
  121. package/dist/resource/formats/gr2/CjsGr2Format.js +27 -91
  122. package/dist/resource/formats/gr2/CjsGr2Format.js.map +1 -1
  123. package/dist/resource/formats/hlsl/CjsHlslFormat.js +22 -25
  124. package/dist/resource/formats/hlsl/CjsHlslFormat.js.map +1 -1
  125. package/dist/resource/formats/hlsl/core/carbonDescriptionToRuntime.js +1 -1
  126. package/dist/resource/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
  127. package/dist/resource/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +3 -3
  128. package/dist/resource/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js.map +1 -1
  129. package/dist/resource/formats/ies/CjsIESFormat.js +29 -29
  130. package/dist/resource/formats/ies/CjsIESFormat.js.map +1 -1
  131. package/dist/resource/formats/jpeg/CjsJpegFormat.js +24 -15
  132. package/dist/resource/formats/jpeg/CjsJpegFormat.js.map +1 -1
  133. package/dist/resource/formats/jpeg/core/helpers.js +3 -5
  134. package/dist/resource/formats/jpeg/core/helpers.js.map +1 -1
  135. package/dist/resource/formats/jpeg/core/jpeg.js +58 -58
  136. package/dist/resource/formats/jpeg/core/jpeg.js.map +1 -1
  137. package/dist/resource/formats/jsonl/CjsJsonlFormat.js +3 -3
  138. package/dist/resource/formats/jsonl/CjsJsonlFormat.js.map +1 -1
  139. package/dist/resource/formats/mp3/CjsMp3Format.js +7 -14
  140. package/dist/resource/formats/mp3/CjsMp3Format.js.map +1 -1
  141. package/dist/resource/formats/mp3/core/helpers.js +3 -5
  142. package/dist/resource/formats/mp3/core/helpers.js.map +1 -1
  143. package/dist/resource/formats/mp4/CjsMp4Format.js +7 -13
  144. package/dist/resource/formats/mp4/CjsMp4Format.js.map +1 -1
  145. package/dist/resource/formats/mp4/core/helpers.js +3 -5
  146. package/dist/resource/formats/mp4/core/helpers.js.map +1 -1
  147. package/dist/resource/formats/obj/CjsObjFormat.js +92 -157
  148. package/dist/resource/formats/obj/CjsObjFormat.js.map +1 -1
  149. package/dist/resource/formats/obj/core/helpers.js +5 -113
  150. package/dist/resource/formats/obj/core/helpers.js.map +1 -1
  151. package/dist/resource/formats/ogg/CjsOggFormat.js +7 -14
  152. package/dist/resource/formats/ogg/CjsOggFormat.js.map +1 -1
  153. package/dist/resource/formats/pickle/CjsPickleFormat.js +7 -12
  154. package/dist/resource/formats/pickle/CjsPickleFormat.js.map +1 -1
  155. package/dist/resource/formats/pickle/core/CjsPickleProtocol0Reader.js +7 -7
  156. package/dist/resource/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -1
  157. package/dist/resource/formats/pickle/core/CjsPickleProtocol4Reader.js +7 -7
  158. package/dist/resource/formats/pickle/core/CjsPickleProtocol4Reader.js.map +1 -1
  159. package/dist/resource/formats/png/CjsPngFormat.js +40 -15
  160. package/dist/resource/formats/png/CjsPngFormat.js.map +1 -1
  161. package/dist/resource/formats/png/core/helpers.js +4 -6
  162. package/dist/resource/formats/png/core/helpers.js.map +1 -1
  163. package/dist/resource/formats/red/CjsRedFormat.js +22 -28
  164. package/dist/resource/formats/red/CjsRedFormat.js.map +1 -1
  165. package/dist/resource/formats/schemabound/CjsSchemaBoundFormat.js +3 -7
  166. package/dist/resource/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -1
  167. package/dist/resource/formats/schemabound/core/schemaBoundValues.js +5 -0
  168. package/dist/resource/formats/schemabound/core/schemaBoundValues.js.map +1 -1
  169. package/dist/resource/formats/sqlite/CjsSqliteFormat.js +4 -9
  170. package/dist/resource/formats/sqlite/CjsSqliteFormat.js.map +1 -1
  171. package/dist/resource/formats/static/CjsStaticFormat.js +4 -4
  172. package/dist/resource/formats/static/CjsStaticFormat.js.map +1 -1
  173. package/dist/resource/formats/stl/CjsStlFormat.js +39 -104
  174. package/dist/resource/formats/stl/CjsStlFormat.js.map +1 -1
  175. package/dist/resource/formats/stl/core/helpers.js +5 -19
  176. package/dist/resource/formats/stl/core/helpers.js.map +1 -1
  177. package/dist/resource/formats/tga/CjsTgaFormat.js +26 -15
  178. package/dist/resource/formats/tga/CjsTgaFormat.js.map +1 -1
  179. package/dist/resource/formats/tga/core/helpers.js +3 -5
  180. package/dist/resource/formats/tga/core/helpers.js.map +1 -1
  181. package/dist/resource/formats/vta/CjsVtaFormat.js +8 -15
  182. package/dist/resource/formats/vta/CjsVtaFormat.js.map +1 -1
  183. package/dist/resource/formats/wav/CjsWavFormat.js +7 -14
  184. package/dist/resource/formats/wav/CjsWavFormat.js.map +1 -1
  185. package/dist/resource/formats/wav/core/helpers.js +3 -5
  186. package/dist/resource/formats/wav/core/helpers.js.map +1 -1
  187. package/dist/resource/formats/webgl/CjsWebglFormat.js +103 -105
  188. package/dist/resource/formats/webgl/CjsWebglFormat.js.map +1 -1
  189. package/dist/resource/formats/webgl/core/{errors.js → WebglReadError.js} +1 -1
  190. package/dist/resource/formats/webgl/core/WebglReadError.js.map +1 -0
  191. package/dist/resource/formats/webgl/core/effectPackage.js +1 -1
  192. package/dist/resource/formats/webgl/core/effectPackage.js.map +1 -1
  193. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +3 -3
  194. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  195. package/dist/resource/formats/webgl/core/glsl/{DxbcGlslHelpers.js → DxbcGlslHelperRegistry.js} +2 -2
  196. package/dist/resource/formats/webgl/core/glsl/DxbcGlslHelperRegistry.js.map +1 -0
  197. package/dist/resource/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +1 -1
  198. package/dist/resource/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
  199. package/dist/resource/formats/webgl/core/glslBackendBlock.js +1 -1
  200. package/dist/resource/formats/webgl/core/glslBackendBlock.js.map +1 -1
  201. package/dist/resource/formats/webgl/core/helpers.js.map +1 -1
  202. package/dist/resource/formats/webgpu/CjsWebgpuFormat.js +28 -29
  203. package/dist/resource/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  204. package/dist/resource/formats/webgpu/core/{errors.js → WebgpuReadError.js} +1 -1
  205. package/dist/resource/formats/webgpu/core/WebgpuReadError.js.map +1 -0
  206. package/dist/resource/formats/webgpu/core/carbonWebgpu/validateContainer.js +1 -1
  207. package/dist/resource/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -1
  208. package/dist/resource/formats/webgpu/core/helpers.js +1 -1
  209. package/dist/resource/formats/webgpu/core/helpers.js.map +1 -1
  210. package/dist/resource/formats/webgpu/core/ir/lowerDxbcToIr.js +1 -1
  211. package/dist/resource/formats/webgpu/core/ir/lowerDxbcToIr.js.map +1 -1
  212. package/dist/resource/formats/webgpu/core/wgsl/buildWgslSet.js +18 -6
  213. package/dist/resource/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
  214. package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js +39 -13
  215. package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -1
  216. package/dist/resource/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +16 -14
  217. package/dist/resource/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js.map +1 -1
  218. package/dist/resource/formats/webm/CjsWebmFormat.js +8 -13
  219. package/dist/resource/formats/webm/CjsWebmFormat.js.map +1 -1
  220. package/dist/resource/formats/webm/core/helpers.js +3 -5
  221. package/dist/resource/formats/webm/core/helpers.js.map +1 -1
  222. package/dist/resource/formats/webp/CjsWebpFormat.js +8 -12
  223. package/dist/resource/formats/webp/CjsWebpFormat.js.map +1 -1
  224. package/dist/resource/formats/wem/CjsWemFormat.js +9 -17
  225. package/dist/resource/formats/wem/CjsWemFormat.js.map +1 -1
  226. package/dist/resource/formats/wem/core/bitStream.js +35 -35
  227. package/dist/resource/formats/wem/core/bitStream.js.map +1 -1
  228. package/dist/resource/formats/wem/core/helpers.js +1 -3
  229. package/dist/resource/formats/wem/core/helpers.js.map +1 -1
  230. package/dist/resource/formats/yaml/CjsYamlFormat.js +28 -37
  231. package/dist/resource/formats/yaml/CjsYamlFormat.js.map +1 -1
  232. package/dist/resource/imageio/ImageIO.js +142 -0
  233. package/dist/resource/imageio/ImageIO.js.map +1 -0
  234. package/dist/resource/imageio/index.js +17 -0
  235. package/dist/resource/imageio/index.js.map +1 -0
  236. package/dist/resource/index.js +7 -0
  237. package/dist/resource/index.js.map +1 -1
  238. package/dist/resource/shader/reflection/Tr2EffectResource.js +24 -2
  239. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  240. package/dist/resource/shader/reflection/Tr2Pass.js +76 -5
  241. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  242. package/dist/resource/texture/CjsTextureArrayConstructor.js +97 -0
  243. package/dist/resource/texture/CjsTextureArrayConstructor.js.map +1 -0
  244. package/dist/resource/texture/CjsTexturePackConstructor.js +160 -0
  245. package/dist/resource/texture/CjsTexturePackConstructor.js.map +1 -0
  246. package/dist/resource/texture/CjsTexturePipelineStepArray.js +72 -0
  247. package/dist/resource/texture/CjsTexturePipelineStepArray.js.map +1 -0
  248. package/dist/resource/texture/CjsTexturePipelineStepConvert.js +73 -0
  249. package/dist/resource/texture/CjsTexturePipelineStepConvert.js.map +1 -0
  250. package/dist/resource/texture/CjsTexturePipelineStepPack.js +71 -0
  251. package/dist/resource/texture/CjsTexturePipelineStepPack.js.map +1 -0
  252. package/dist/resource/texture/CjsTexturePipelineStepResize.js +123 -0
  253. package/dist/resource/texture/CjsTexturePipelineStepResize.js.map +1 -0
  254. package/dist/resource/texture/SolidColorTextureConstructor.js +11 -1
  255. package/dist/resource/texture/SolidColorTextureConstructor.js.map +1 -1
  256. package/dist/resource/texture/Tr2ImageRes.js +100 -68
  257. package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
  258. package/dist/resource/texture/Tr2TexturePipeline.js +45 -25
  259. package/dist/resource/texture/Tr2TexturePipeline.js.map +1 -1
  260. package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +34 -1
  261. package/dist/resource/texture/Tr2TexturePipelineStepCompress.js.map +1 -1
  262. package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js +30 -3
  263. package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js.map +1 -1
  264. package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js +81 -1
  265. package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js.map +1 -1
  266. package/dist/resource/texture/Tr2TexturePipelineStepLoad.js +36 -1
  267. package/dist/resource/texture/Tr2TexturePipelineStepLoad.js.map +1 -1
  268. package/dist/resource/texture/Tr2TexturePipelineStepPack.js +146 -24
  269. package/dist/resource/texture/Tr2TexturePipelineStepPack.js.map +1 -1
  270. package/dist/resource/texture/TriTextureRes.js +151 -29
  271. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  272. package/dist/resource/texture/index.js +7 -0
  273. package/dist/resource/texture/index.js.map +1 -1
  274. package/dist/resource/texture/registerTextureResources.js +83 -0
  275. package/dist/resource/texture/registerTextureResources.js.map +1 -0
  276. package/dist/resource/texture/solidColorTexture.js +10 -19
  277. package/dist/resource/texture/solidColorTexture.js.map +1 -1
  278. package/dist/sof/EveSOF.js +39 -7
  279. package/dist/sof/EveSOF.js.map +1 -1
  280. package/dist/trinity/core/Tr2GpuResourcePool/Tr2GpuResourcePool.js +2 -2
  281. package/dist/trinity/core/Tr2GpuResourcePool/Tr2GpuResourcePool.js.map +1 -1
  282. package/dist/trinity/core/Tr2ImageIOHelpers.js +80 -17
  283. package/dist/trinity/core/Tr2ImageIOHelpers.js.map +1 -1
  284. package/dist/trinity/core/Tr2RenderUtils.js +1 -1
  285. package/dist/trinity/core/Tr2TextureArray/Tr2TextureArray.js +49 -62
  286. package/dist/trinity/core/Tr2TextureArray/Tr2TextureArray.js.map +1 -1
  287. package/dist/trinity/core/Tr2TextureReference.js +114 -0
  288. package/dist/trinity/core/Tr2TextureReference.js.map +1 -0
  289. package/dist/trinity/core/device/Tr2DepthStencil.js +2 -2
  290. package/dist/trinity/core/device/Tr2DepthStencil.js.map +1 -1
  291. package/dist/trinity/core/device/Tr2RingBuffer/Tr2RingBuffer.js +1 -1
  292. package/dist/trinity/core/index.js +1 -0
  293. package/dist/trinity/core/index.js.map +1 -1
  294. package/dist/trinity/core/lighting/Tr2LightManager.js +5 -4
  295. package/dist/trinity/core/lighting/Tr2LightManager.js.map +1 -1
  296. package/dist/trinity/core/procedural/GradientTextureConstructor.js +5 -4
  297. package/dist/trinity/core/procedural/GradientTextureConstructor.js.map +1 -1
  298. package/dist/trinity/core/procedural/gradientTexture.js +10 -13
  299. package/dist/trinity/core/procedural/gradientTexture.js.map +1 -1
  300. package/dist/trinity/core/volumetrics/Tr2VolumetricsRenderer.js +1 -1
  301. package/dist/trinity/core/volumetrics/Tr2VolumetricsRenderer.js.map +1 -1
  302. package/dist/trinity/eve/EveImpactOverlay.js +102 -50
  303. package/dist/trinity/eve/EveImpactOverlay.js.map +1 -1
  304. package/dist/trinity/eve/EveModularObjectModifier.js +9 -18
  305. package/dist/trinity/eve/EveModularObjectModifier.js.map +1 -1
  306. package/dist/trinity/eve/attachment/turrets/EveTurretSet.js +175 -157
  307. package/dist/trinity/eve/attachment/turrets/EveTurretSet.js.map +1 -1
  308. package/dist/trinity/eve/attachment/turrets/EveTurretTarget.js +100 -83
  309. package/dist/trinity/eve/attachment/turrets/EveTurretTarget.js.map +1 -1
  310. package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMesh.js +26 -20
  311. package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMesh.js.map +1 -1
  312. package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMeshes.js +368 -179
  313. package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMeshes.js.map +1 -1
  314. package/dist/trinity/eve/child/EveChildMesh.js +242 -234
  315. package/dist/trinity/eve/child/EveChildMesh.js.map +1 -1
  316. package/dist/trinity/eve/child/EveChildTurret.js +57 -16
  317. package/dist/trinity/eve/child/EveChildTurret.js.map +1 -1
  318. package/dist/trinity/eve/child/EveSpaceObjectChild.js +28 -1
  319. package/dist/trinity/eve/child/EveSpaceObjectChild.js.map +1 -1
  320. package/dist/trinity/eve/index.js +2 -2
  321. package/dist/trinity/eve/overlays/EveDamageOverlay.js +5 -1
  322. package/dist/trinity/eve/overlays/EveDamageOverlay.js.map +1 -1
  323. package/dist/trinity/eve/scene/EveSpaceScene.js +234 -233
  324. package/dist/trinity/eve/scene/EveSpaceScene.js.map +1 -1
  325. package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js +2 -0
  326. package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js.map +1 -1
  327. package/dist/trinity/eve/spaceObject/EveSpaceObject2.js +492 -437
  328. package/dist/trinity/eve/spaceObject/EveSpaceObject2.js.map +1 -1
  329. package/dist/trinity/generated/index.js +0 -1
  330. package/dist/trinity/generated/index.js.map +1 -1
  331. package/dist/trinity/generated/trinityCore/index.js +0 -1
  332. package/dist/trinity/generated/trinityCore/index.js.map +1 -1
  333. package/dist/trinity/index.js +3 -3
  334. package/dist/trinity/particle/emitter/Tr2GpuSharedEmitter.js +10 -1
  335. package/dist/trinity/particle/emitter/Tr2GpuSharedEmitter.js.map +1 -1
  336. package/dist/trinity/shader/Tr2DataTextureManager.js +152 -66
  337. package/dist/trinity/shader/Tr2DataTextureManager.js.map +1 -1
  338. package/dist/trinity/shader/Tr2Material.js +1 -1
  339. package/dist/trinityal/Tr2HalHelperStructures/Tr2TextureSubresource.js +5 -5
  340. package/dist/trinityal/Tr2HalHelperStructures/Tr2TextureSubresource.js.map +1 -1
  341. package/dist/trinityal/index.js +1 -1
  342. package/dist/trinityal/stub/Tr2RenderContextALStub/Tr2RenderContextALStub.js +2 -2
  343. package/dist/trinityal/stub/Tr2RenderContextALStub/Tr2RenderContextALStub.js.map +1 -1
  344. package/dist/trinityal/stub/Tr2SwapChainALStub.js +45 -45
  345. package/dist/trinityal/stub/Tr2SwapChainALStub.js.map +1 -1
  346. package/dist/trinityal/stub/Tr2TextureALStub.js +170 -170
  347. package/dist/trinityal/stub/Tr2TextureALStub.js.map +1 -1
  348. package/dist/trinityal/webgpu/CjsWebgpuDevice.js +234 -164
  349. package/dist/trinityal/webgpu/CjsWebgpuDevice.js.map +1 -1
  350. package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js +7 -0
  351. package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js.map +1 -1
  352. package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js +78 -14
  353. package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js.map +1 -1
  354. package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js +94 -0
  355. package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js.map +1 -0
  356. package/dist/trinityal/webgpu/internal.js +1 -0
  357. package/dist/trinityal/webgpu/internal.js.map +1 -1
  358. package/docs/global/reference/classes/README.md +90 -0
  359. package/docs/resource/concepts/format-capabilities.md +3 -3
  360. package/docs/resource/formats/README.md +1 -1
  361. package/docs/resource/reference/classes/core.md +31 -1
  362. package/docs/resource/reference/classes/formats.md +7 -7
  363. package/docs/resource/reference/classes/resources.md +76 -16
  364. package/docs/trinity/reference/classes/generated.md +0 -10
  365. package/docs/trinity/reference/classes/trinity-core.md +1692 -1682
  366. package/docs/trinityal/reference/classes/README.md +0 -10
  367. package/docs/trinityal/webgpu/reference/classes/README.md +276 -266
  368. package/package.json +4 -3
  369. package/dist/global/consts/webgpu/index.js +0 -2
  370. package/dist/global/consts/webgpu/textureFormats.js +0 -180
  371. package/dist/global/consts/webgpu/textureFormats.js.map +0 -1
  372. package/dist/resource/formats/dxbc/core/container.js.map +0 -1
  373. package/dist/resource/formats/dxbc/core/errors.js.map +0 -1
  374. package/dist/resource/formats/dxbc/core/program.js.map +0 -1
  375. package/dist/resource/formats/dxbc/core/signature.js.map +0 -1
  376. package/dist/resource/formats/stl/core/targets.js.map +0 -1
  377. package/dist/resource/formats/webgl/core/errors.js.map +0 -1
  378. package/dist/resource/formats/webgl/core/glsl/DxbcGlslHelpers.js.map +0 -1
  379. package/dist/resource/formats/webgpu/core/errors.js.map +0 -1
  380. package/dist/resource/texture/texturePipelineBehavior.js +0 -332
  381. package/dist/resource/texture/texturePipelineBehavior.js.map +0 -1
  382. package/dist/trinity/generated/trinityCore/Tr2TextureReference.js +0 -40
  383. package/dist/trinity/generated/trinityCore/Tr2TextureReference.js.map +0 -1
  384. package/dist/trinityal/Tr2BitmapDimensions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sources":["../../../../../../src/resource/formats/cmf/core/writer.js"],"sourcesContent":["import { MeshoptEncoder } from \"meshoptimizer/encoder\";\r\nimport {\r\n AnimationChannelTargetType,\r\n ElementType,\r\n FILE_SIGNATURE,\r\n FILE_VERSION,\r\n Interpolation,\r\n MeshTopology,\r\n STRUCT_SIZE,\r\n SectionCompression,\r\n SectionType,\r\n Usage\r\n} from \"./constants.js\";\r\nimport { crc32 } from \"./binary.js\";\nimport { readCmf } from \"./schema.js\";\nimport { validateCmfGraph } from \"./validate.js\";\n\r\n/**\r\n * Binary CMF v1 writer.\r\n *\r\n * Mirrors CarbonEngine's `cmf::BuildFile`: the object graph is flattened into\r\n * the Data section as structs with self-relative tagged span offsets\r\n * (depth-first in member order, 8-byte chunk alignment, identical leaf chunks\r\n * deduplicated), GPU buffers referenced by BufferViews become one section\r\n * each (remapped to section indices in first-encounter order, meshoptimizer\r\n * compressed by default), optional metadata flattens into a trailing section,\r\n * and the header CRC covers everything after the crc32 field.\r\n */\r\n\r\nconst textEncoder = new TextEncoder();\nconst FLOAT32_MAX = 3.4028234663852886e38;\n\r\nlet encoderReady = false;\r\nMeshoptEncoder.ready.then(() => { encoderReady = true; });\r\n\r\nfunction writeError(message)\r\n{\r\n const error = new Error(`CMF write: ${message}`);\r\n error.code = \"CJS_FORMAT_WRITE_ERROR\";\r\n return error;\r\n}\r\n\r\nfunction enumValue(names, value, label)\r\n{\r\n if (typeof value === \"number\") return value;\r\n const index = names.indexOf(value);\r\n if (index >= 0) return index;\r\n const unknown = /^Unknown\\((\\d+)\\)$/u.exec(String(value ?? \"\"));\r\n if (unknown) return Number(unknown[1]);\r\n throw writeError(`unknown ${label} value ${JSON.stringify(value)}`);\r\n}\r\n\r\n/**\r\n * Growable little-endian struct buffer with tagged span support.\r\n */\r\nclass Flattener\r\n{\r\n #bytes = new Uint8Array(1024);\r\n #view = new DataView(this.#bytes.buffer);\r\n #chunkCache = new Map();\r\n size = 0;\r\n\r\n /**\r\n * Grows the output buffer when the requested write would exceed capacity for\r\n * the CMF binary writer.\r\n */\r\n #ensure(capacity)\r\n {\r\n if (capacity <= this.#bytes.length) return;\r\n let next = this.#bytes.length * 2;\r\n while (next < capacity) next *= 2;\r\n const grown = new Uint8Array(next);\r\n grown.set(this.#bytes.subarray(0, this.size));\r\n this.#bytes = grown;\r\n this.#view = new DataView(grown.buffer);\r\n }\r\n\r\n /** Reserves output storage in the current CMF binary writer. */\r\n reserve(byteLength)\r\n {\r\n const offset = this.size;\r\n this.#ensure(offset + byteLength);\r\n this.#bytes.fill(0, offset, offset + byteLength);\r\n this.size = offset + byteLength;\r\n return offset;\r\n }\r\n\r\n /** Reserves aligned in the current CMF binary writer. */\r\n reserveAligned(byteLength, alignment = 8)\r\n {\r\n const padded = Math.ceil(this.size / alignment) * alignment;\r\n this.#ensure(padded);\r\n this.#bytes.fill(0, this.size, padded);\r\n this.size = padded;\r\n return this.reserve(byteLength);\r\n }\r\n\r\n /**\r\n * Writes an unsigned 8-bit integer into the output buffer for the CMF binary\r\n * writer.\r\n */\r\n u8(offset, value) { this.#view.setUint8(offset, value); }\r\n\r\n /**\r\n * Writes an unsigned 16-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n u16(offset, value) { this.#view.setUint16(offset, value, true); }\r\n\r\n /**\r\n * Writes an unsigned 32-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n u32(offset, value) { this.#view.setUint32(offset, value, true); }\n\r\n /**\r\n * Writes a 32-bit little-endian float into the output buffer for the CMF\r\n * binary writer.\r\n */\r\n f32(offset, value) { this.#view.setFloat32(offset, value ?? 0, true); }\n\r\n /**\r\n * Writes a signed 64-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n i64(offset, value) { this.#view.setBigInt64(offset, BigInt(value), true); }\r\n\r\n /**\r\n * Writes an unsigned 64-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n u64(offset, value) { this.#view.setBigUint64(offset, BigInt(value), true); }\r\n\r\n /**\r\n * Copies bytes into a previously reserved output range for the CMF binary\r\n * writer.\r\n */\r\n setBytes(offset, bytes)\r\n {\r\n this.#bytes.set(bytes, offset);\r\n }\r\n\r\n /**\r\n * Write a span field and append its element chunk.\r\n *\r\n * `writeElement(flattener, offset, element)` may itself append nested\r\n * chunks; leaf chunks (`dedup: true`) are shared when byte-identical,\r\n * matching the reference writer.\r\n */\r\n span(fieldOffset, elements, elementSize, writeElement, { dedup = false } = {})\r\n {\r\n const count = elements ? elements.length : 0;\r\n const byteSize = count * elementSize;\r\n if (byteSize === 0)\r\n {\r\n // tagged self-relative offset of 0 keeps span pointers valid\r\n this.i64(fieldOffset, 1);\r\n this.u64(fieldOffset + 8, 0);\r\n return;\r\n }\r\n\r\n if (dedup)\r\n {\r\n const scratch = new Flattener();\r\n const scratchOffset = scratch.reserve(byteSize);\r\n for (let i = 0; i < count; i++) writeElement(scratch, scratchOffset + i * elementSize, elements[i]);\r\n const chunk = scratch.bytes();\r\n const key = chunkKey(chunk);\r\n const cached = this.#chunkCache.get(key);\r\n if (cached !== undefined && bytesEqual(this.#bytes, cached, chunk))\r\n {\r\n this.i64(fieldOffset, cached - fieldOffset + 1);\n this.u64(fieldOffset + 8, byteSize);\r\n return;\r\n }\r\n const chunkOffset = this.reserveAligned(byteSize);\r\n this.setBytes(chunkOffset, chunk);\r\n this.#chunkCache.set(key, chunkOffset);\r\n this.i64(fieldOffset, chunkOffset - fieldOffset + 1);\n this.u64(fieldOffset + 8, byteSize);\r\n return;\r\n }\r\n\r\n const chunkOffset = this.reserveAligned(byteSize);\r\n this.i64(fieldOffset, chunkOffset - fieldOffset + 1);\n this.u64(fieldOffset + 8, byteSize);\r\n for (let i = 0; i < count; i++) writeElement(this, chunkOffset + i * elementSize, elements[i]);\r\n }\r\n\r\n /**\r\n * Writes a length-prefixed UTF-8 string into the output buffer for the CMF\r\n * binary writer.\r\n */\r\n string(fieldOffset, value)\r\n {\r\n const encoded = textEncoder.encode(value || \"\");\r\n this.span(fieldOffset, encoded, 1, (buffer, offset, byte) => buffer.u8(offset, byte), { dedup: true });\r\n }\r\n\r\n /**\r\n * Writes a length-prefixed byte block into the output buffer for the CMF\r\n * binary writer.\r\n */\r\n bytes()\r\n {\r\n return this.#bytes.slice(0, this.size);\r\n }\r\n}\r\n\r\nfunction chunkKey(bytes)\r\n{\r\n let hash = 2166136261 >>> 0;\r\n for (let i = 0; i < bytes.length; i++)\r\n {\r\n hash = Math.imul(hash, 16777619) >>> 0;\r\n hash = (hash ^ bytes[i]) >>> 0;\r\n }\r\n return `${bytes.length}:${hash}`;\r\n}\r\n\r\nfunction bytesEqual(target, offset, chunk)\r\n{\r\n for (let i = 0; i < chunk.length; i++)\r\n {\r\n if (target[offset + i] !== chunk[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction writeBounds(buffer, offset, bounds)\n{\n const min = bounds?.min ?? [ FLOAT32_MAX, FLOAT32_MAX, FLOAT32_MAX ];\n const max = bounds?.max ?? [ -FLOAT32_MAX, -FLOAT32_MAX, -FLOAT32_MAX ];\n for (let i = 0; i < 3; i++) buffer.f32(offset + i * 4, min[i]);\r\n for (let i = 0; i < 3; i++) buffer.f32(offset + 12 + i * 4, max[i]);\r\n}\r\n\r\nfunction writeBufferView(buffer, offset, view, remap)\r\n{\r\n const size = view?.size || 0;\r\n const index = view?.index || 0;\r\n buffer.u32(offset, size === 0 ? index : (remap.get(index) ?? index));\r\n buffer.u32(offset + 4, view?.offset || 0);\r\n buffer.u32(offset + 8, size);\r\n buffer.u32(offset + 12, view?.stride || 0);\r\n}\r\n\r\nfunction writeVertexElement(buffer, offset, element)\r\n{\r\n buffer.u8(offset, enumValue(Usage, element.usage, \"vertex usage\"));\r\n buffer.u8(offset + 1, element.usageIndex || 0);\r\n buffer.u8(offset + 2, enumValue(ElementType, element.type, \"element type\"));\r\n buffer.u8(offset + 3, element.elementCount || 0);\r\n buffer.u32(offset + 4, element.offset || 0);\r\n}\r\n\r\nfunction writeData(buffer, offset, graph, remap)\r\n{\r\n const writeMesh = (target, meshOffset, mesh) =>\r\n {\r\n target.string(meshOffset, mesh.name);\r\n target.span(meshOffset + 16, mesh.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, { dedup: true });\r\n target.span(meshOffset + 32, mesh.lods || [], STRUCT_SIZE.MeshLod, (lodTarget, lodOffset, lod) =>\r\n {\r\n writeBufferView(lodTarget, lodOffset, lod.vb, remap);\r\n writeBufferView(lodTarget, lodOffset + 16, lod.ib, remap);\r\n lodTarget.span(lodOffset + 32, lod.areas || [], STRUCT_SIZE.LodMeshArea, (areaTarget, areaOffset, area) =>\r\n {\r\n areaTarget.u32(areaOffset, area.firstElement || 0);\r\n areaTarget.u32(areaOffset + 4, area.elementCount || 0);\r\n }, { dedup: true });\r\n lodTarget.span(lodOffset + 48, lod.morphTargets || [], STRUCT_SIZE.LodMorphTarget, (morphTarget, morphOffset, morph) =>\r\n {\r\n writeBufferView(morphTarget, morphOffset, morph.vb, remap);\r\n });\r\n lodTarget.u32(lodOffset + 64, lod.threshold ?? 0xffffffff);\r\n });\r\n target.span(meshOffset + 48, mesh.areas || [], STRUCT_SIZE.MeshArea, (areaTarget, areaOffset, area) =>\r\n {\r\n areaTarget.string(areaOffset, area.name);\r\n writeBounds(areaTarget, areaOffset + 16, area.bounds);\r\n areaTarget.span(areaOffset + 40, area.bones || [], 2, (boneTarget, boneOffset, bone) => boneTarget.u16(boneOffset, bone), { dedup: true });\r\n areaTarget.u8(areaOffset + 56, area.affectedByBones ? 1 : 0);\r\n areaTarget.u8(areaOffset + 57, area.affectedByMorphTargets ? 1 : 0);\r\n });\r\n target.span(meshOffset + 64, mesh.boneBindings || [], STRUCT_SIZE.BoneBinding, (bindingTarget, bindingOffset, binding) =>\r\n {\r\n bindingTarget.string(bindingOffset, binding.name);\r\n writeBounds(bindingTarget, bindingOffset + 16, binding.bounds);\r\n });\r\n target.span(meshOffset + 80, mesh.morphTargets?.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, { dedup: true });\r\n target.span(meshOffset + 96, mesh.morphTargets?.targets || [], STRUCT_SIZE.MorphTarget, (morphTarget, morphOffset, morph) =>\r\n {\r\n morphTarget.string(morphOffset, morph.name);\r\n morphTarget.f32(morphOffset + 16, morph.maxDisplacement ?? 0);\n });\r\n target.span(meshOffset + 112, mesh.uvDensities || [], 4, (densityTarget, densityOffset, value) => densityTarget.f32(densityOffset, value), { dedup: true });\r\n writeBounds(target, meshOffset + 128, mesh.bounds);\r\n const occlusion = mesh.audioOcclusionMesh || {};\r\n target.span(meshOffset + 152, occlusion.vertices || [], 12, (vertexTarget, vertexOffset, vertex) =>\r\n {\r\n for (let i = 0; i < 3; i++) vertexTarget.f32(vertexOffset + i * 4, vertex[i]);\r\n }, { dedup: true });\r\n target.span(meshOffset + 168, occlusion.indices || [], 2, (indexTarget, indexOffset, index) => indexTarget.u16(indexOffset, index), { dedup: true });\r\n writeBounds(target, meshOffset + 184, occlusion.bounds);\r\n target.u8(meshOffset + 208, enumValue(MeshTopology, mesh.topology ?? \"TriangleList\", \"topology\"));\r\n target.u8(meshOffset + 209, mesh.skeleton === null || mesh.skeleton === undefined ? 0xff : mesh.skeleton);\r\n };\r\n\r\n const writeSkeleton = (target, skeletonOffset, skeleton) =>\r\n {\r\n if ((skeleton.bones || []).some((bone) => typeof bone !== \"string\"))\r\n {\r\n throw writeError(\r\n \"skeleton bones must be name strings; GR2-shaped skeletons need conversion (use writeShared) before writing\"\r\n );\r\n }\r\n target.string(skeletonOffset, skeleton.name);\r\n target.span(skeletonOffset + 16, skeleton.bones || [], 16, (boneTarget, boneOffset, bone) => boneTarget.string(boneOffset, bone));\r\n target.span(skeletonOffset + 32, skeleton.parents || [], 4, (parentTarget, parentOffset, parent) => parentTarget.u32(parentOffset, parent), { dedup: true });\r\n target.span(skeletonOffset + 48, skeleton.restTransforms || [], STRUCT_SIZE.Transform, (transformTarget, transformOffset, transform) =>\r\n {\r\n const position = transform.position || [ 0, 0, 0 ];\r\n const rotation = transform.rotation || [ 0, 0, 0, 1 ];\r\n const scale = transform.scale || [ 1, 1, 1 ];\r\n for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + i * 4, position[i]);\r\n for (let i = 0; i < 4; i++) transformTarget.f32(transformOffset + 12 + i * 4, rotation[i]);\r\n for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + 28 + i * 4, scale[i]);\r\n }, { dedup: true });\r\n target.span(skeletonOffset + 64, skeleton.invBindTransforms || [], 64, (matrixTarget, matrixOffset, matrix) =>\r\n {\r\n for (let i = 0; i < 16; i++) matrixTarget.f32(matrixOffset + i * 4, matrix[i]);\r\n }, { dedup: true });\r\n target.span(skeletonOffset + 80, skeleton.boneMasks || [], STRUCT_SIZE.BoneMask, (maskTarget, maskOffset, mask) =>\r\n {\r\n maskTarget.string(maskOffset, mask.name);\r\n maskTarget.span(maskOffset + 16, mask.weights || [], STRUCT_SIZE.BoneWeight, (weightTarget, weightOffset, weight) =>\r\n {\r\n weightTarget.u32(weightOffset, weight.index || 0);\r\n weightTarget.f32(weightOffset + 4, weight.weight ?? 1);\r\n }, { dedup: true });\r\n });\r\n };\r\n\r\n const writeAnimation = (target, animationOffset, animation) =>\r\n {\r\n target.string(animationOffset, animation.name);\r\n target.span(animationOffset + 16, animation.channels || [], STRUCT_SIZE.AnimationChannel, (channelTarget, channelOffset, channel) =>\r\n {\r\n channelTarget.string(channelOffset, channel.target);\r\n channelTarget.u8(channelOffset + 16, enumValue(AnimationChannelTargetType, channel.targetType, \"channel target type\"));\r\n channelTarget.u32(channelOffset + 20, channel.curveIndex || 0);\r\n });\r\n target.span(animationOffset + 32, animation.curves || [], STRUCT_SIZE.AnimationCurve, (curveTarget, curveOffset, curve) =>\r\n {\r\n curveTarget.u8(curveOffset, curve.valueDimension || 0);\r\n curveTarget.u8(curveOffset + 1, enumValue(Interpolation, curve.interpolation, \"interpolation\"));\r\n curveTarget.u8(curveOffset + 2, enumValue(ElementType, curve.knotType, \"knot type\"));\r\n curveTarget.u8(curveOffset + 3, enumValue(ElementType, curve.valueType, \"value type\"));\r\n curveTarget.u32(curveOffset + 4, curve.knotCount || 0);\r\n curveTarget.span(curveOffset + 8, curve.knots || [], 1, (knotTarget, knotOffset, knot) => knotTarget.u8(knotOffset, knot), { dedup: true });\r\n curveTarget.span(curveOffset + 24, curve.values || [], 1, (valueTarget, valueOffset, value) => valueTarget.u8(valueOffset, value), { dedup: true });\r\n });\r\n target.f32(animationOffset + 48, animation.duration ?? 0);\n };\r\n\r\n buffer.span(offset, graph.meshes || [], STRUCT_SIZE.Mesh, writeMesh);\r\n buffer.span(offset + 16, graph.skeletons || [], STRUCT_SIZE.Skeleton, writeSkeleton);\r\n buffer.span(offset + 32, graph.animations || [], STRUCT_SIZE.Animation, writeAnimation);\r\n}\r\n\r\n/**\r\n * Collect BufferView usage in reference-writer order and decide per-buffer\r\n * compression (conflicting stride/kind across views falls back to None).\r\n */\r\nfunction collectBufferRecords(graph, compress)\r\n{\r\n const records = [];\r\n const recordsByIndex = new Map();\r\n const visit = (view, compression) =>\r\n {\r\n if (!view || !view.size) return;\r\n const existing = recordsByIndex.get(view.index);\r\n if (!existing)\r\n {\r\n const record = {\r\n index: view.index,\r\n stride: view.stride || 0,\r\n compression: compress ? compression : \"None\"\r\n };\r\n records.push(record);\r\n recordsByIndex.set(view.index, record);\r\n }\r\n else if (existing.stride !== (view.stride || 0) || (compress ? compression : \"None\") !== existing.compression)\r\n {\r\n existing.stride = 0;\r\n existing.compression = \"None\";\r\n }\r\n };\r\n\r\n for (const mesh of graph.meshes || [])\r\n {\r\n for (const lod of mesh.lods || [])\r\n {\r\n visit(lod.vb, \"MeshOptimizerVertexBuffer\");\r\n visit(lod.ib, \"MeshOptimizerIndexBuffer\");\r\n for (const morph of lod.morphTargets || [])\r\n {\r\n visit(morph.vb, \"MeshOptimizerVertexBuffer\");\r\n }\r\n }\r\n }\r\n return records;\r\n}\r\n\r\nfunction resolveBufferBytes(graph, record)\r\n{\r\n const buffers = graph.buffers || [];\r\n const entry = buffers.find?.((buffer) => buffer && buffer.index === record.index) ?? buffers[record.index];\r\n const data = entry?.data ?? (entry instanceof Uint8Array ? entry : null);\r\n if (!data)\r\n {\r\n throw writeError(`no buffer data supplied for BufferView index ${record.index}`);\r\n }\r\n return data instanceof Uint8Array ? data : new Uint8Array(data);\r\n}\r\n\r\nfunction compressBuffer(bytes, record)\r\n{\r\n if (record.compression === \"None\" || bytes.byteLength === 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: record.stride };\r\n }\r\n if (!encoderReady)\r\n {\r\n throw writeError(\"compressed output requires writeAsync/WriteAsync so meshoptimizer can initialize (or pass compress: false)\");\r\n }\r\n\r\n if (record.compression === \"MeshOptimizerVertexBuffer\")\r\n {\r\n if (record.stride === 0 || bytes.byteLength % record.stride !== 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: record.stride };\r\n }\r\n const count = bytes.byteLength / record.stride;\r\n const data = MeshoptEncoder.encodeVertexBuffer(bytes, count, record.stride);\r\n return { data, compression: \"MeshOptimizerVertexBuffer\", gpuAlignment: record.stride };\r\n }\r\n\r\n // index buffers: meshopt encodes triangle lists of u32; u16 sources widen\r\n const stride = record.stride;\r\n if ((stride !== 2 && stride !== 4) || bytes.byteLength % stride !== 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: stride };\r\n }\r\n const count = bytes.byteLength / stride;\r\n if (count % 3 !== 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: stride };\r\n }\r\n let source = bytes;\r\n if (stride === 2)\r\n {\r\n const wide = new Uint32Array(count);\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n for (let i = 0; i < count; i++) wide[i] = view.getUint16(i * 2, true);\r\n source = new Uint8Array(wide.buffer);\r\n }\r\n const data = MeshoptEncoder.encodeIndexBuffer(source, count, 4);\r\n return { data, compression: \"MeshOptimizerIndexBuffer\", gpuAlignment: stride };\r\n}\r\n\r\n/**\r\n * Serialize a CMF-native graph into .cmf bytes.\r\n *\r\n * @param {object} graph Native graph: `{ meshes, skeletons, animations, metadata?, buffers? }`\r\n * where `buffers` supplies uncompressed GPU bytes for each BufferView\r\n * `index` (as `{ index, data }` entries or an index-keyed array).\r\n * @param {object} [options] `compress` (default false for the sync writer)\r\n * enables meshoptimizer vertex/index compression.\r\n * @returns {Uint8Array} Complete .cmf file bytes.\r\n */\r\nexport function writeCmf(graph, options = {})\n{\n if (!graph || typeof graph !== \"object\")\r\n {\n throw writeError(\"input graph must be an object\");\n }\n if ((graph.skeletons ?? []).some(skeleton =>\n (skeleton?.bones ?? []).some(bone => typeof bone !== \"string\")))\n {\n throw writeError(\n \"skeleton bones must be name strings; GR2-shaped skeletons need conversion (use writeShared) before writing\"\n );\n }\n validateCmfGraph(graph, { phase: \"write\" });\n const compress = options.compress === true;\n\r\n const records = collectBufferRecords(graph, compress);\r\n const compressed = records.map((record) =>\r\n {\r\n const bytes = resolveBufferBytes(graph, record);\r\n return { record, ...compressBuffer(bytes, record), uncompressedSize: bytes.byteLength };\r\n });\r\n const remap = new Map(records.map((record, position) => [ record.index, position + 1 ]));\r\n\r\n const data = new Flattener();\r\n data.reserve(STRUCT_SIZE.Data);\r\n writeData(data, 0, graph, remap);\r\n const dataBytes = data.bytes();\r\n\r\n let metadataBytes = null;\r\n if (graph.metadata && (graph.metadata.entries || []).length)\r\n {\r\n const metadata = new Flattener();\r\n metadata.reserve(STRUCT_SIZE.Metadata);\r\n metadata.span(0, graph.metadata.entries, STRUCT_SIZE.MetadataEntry, (target, offset, entry) =>\r\n {\r\n target.string(offset, entry.key);\r\n target.string(offset + 16, entry.value);\r\n });\r\n metadataBytes = metadata.bytes();\r\n }\r\n\r\n const sections = [\r\n { type: \"Data\", compression: \"None\", gpuAlignment: 0, compressedSize: dataBytes.byteLength, uncompressedSize: dataBytes.byteLength, data: dataBytes }\r\n ];\r\n for (const entry of compressed)\r\n {\r\n sections.push({\r\n type: \"GpuBuffer\",\r\n compression: entry.compression,\r\n gpuAlignment: entry.gpuAlignment,\r\n compressedSize: entry.data.byteLength,\r\n uncompressedSize: entry.uncompressedSize,\r\n data: entry.data\r\n });\r\n }\r\n if (metadataBytes)\r\n {\r\n sections.push({ type: \"Metadata\", compression: \"None\", gpuAlignment: 0, compressedSize: metadataBytes.byteLength, uncompressedSize: metadataBytes.byteLength, data: metadataBytes });\r\n }\r\n\r\n const header = new Flattener();\r\n header.reserve(STRUCT_SIZE.Header);\r\n header.u32(0, FILE_SIGNATURE);\r\n header.u32(4, FILE_VERSION);\r\n header.span(16, sections, STRUCT_SIZE.Section, () => {});\r\n const headerSize = header.size;\r\n header.u32(8, headerSize);\r\n\r\n let offset = headerSize;\r\n const sectionOffsets = sections.map((section) =>\r\n {\r\n offset = Math.ceil(offset / 8) * 8;\r\n const sectionOffset = offset;\r\n offset += section.compressedSize;\r\n return sectionOffset;\r\n });\r\n\r\n const sectionsChunk = headerSize - sections.length * STRUCT_SIZE.Section;\r\n sections.forEach((section, index) =>\r\n {\r\n const base = sectionsChunk + index * STRUCT_SIZE.Section;\r\n header.u32(base, sectionOffsets[index]);\r\n header.u32(base + 4, section.compressedSize);\r\n header.u32(base + 8, section.uncompressedSize);\r\n header.u16(base + 12, section.gpuAlignment || 0);\r\n header.u8(base + 14, enumValue(SectionType, section.type, \"section type\"));\r\n header.u8(base + 15, enumValue(SectionCompression, section.compression, \"section compression\"));\r\n });\r\n\r\n const total = offset;\r\n const file = new Uint8Array(total);\r\n file.set(header.bytes(), 0);\r\n sections.forEach((section, index) =>\r\n {\r\n file.set(section.data, sectionOffsets[index]);\r\n });\r\n\r\n const checksum = crc32(file, 16, file.byteLength);\n new DataView(file.buffer).setUint32(12, checksum, true);\n // Carbon validates every produced file at its save boundary. Re-read the\n // structural result here as the writer's equivalent postcondition; source\n // buffer finiteness was already checked by validateCmfGraph above.\n readCmf(file, { decodeBuffers: false, validateCrc: true });\n return file;\n}\n\r\n/**\r\n * Serialize a CMF-native graph asynchronously with compression enabled by\r\n * default (awaits meshoptimizer encoder initialization).\r\n *\r\n * @param {object} graph Native graph (see `writeCmf`).\r\n * @param {object} [options] `compress` defaults to true.\r\n * @returns {Promise<Uint8Array>} Complete .cmf file bytes.\r\n */\r\nexport async function writeCmfAsync(graph, options = {})\r\n{\r\n await MeshoptEncoder.ready;\r\n encoderReady = true;\r\n return writeCmf(graph, { ...options, compress: options.compress !== false });\r\n}\r\n"],"names":["textEncoder","TextEncoder","FLOAT32_MAX","encoderReady","MeshoptEncoder","ready","then","writeError","message","error","Error","code","enumValue","names","value","label","index","indexOf","unknown","exec","String","Number","JSON","stringify","Flattener","Uint8Array","DataView","buffer","Map","size","#ensure","capacity","length","next","grown","set","subarray","reserve","byteLength","offset","fill","reserveAligned","alignment","padded","Math","ceil","u8","setUint8","u16","setUint16","u32","setUint32","f32","setFloat32","i64","setBigInt64","BigInt","u64","setBigUint64","setBytes","bytes","span","fieldOffset","elements","elementSize","writeElement","dedup","count","byteSize","scratch","scratchOffset","i","chunk","key","chunkKey","cached","get","undefined","bytesEqual","chunkOffset","string","encoded","encode","byte","slice","hash","imul","target","writeBounds","bounds","min","max","writeBufferView","view","remap","stride","writeVertexElement","element","Usage","usage","usageIndex","ElementType","type","elementCount","writeData","graph","writeMesh","meshOffset","mesh","name","decl","STRUCT_SIZE","VertexElement","lods","MeshLod","lodTarget","lodOffset","lod","vb","ib","areas","LodMeshArea","areaTarget","areaOffset","area","firstElement","morphTargets","LodMorphTarget","morphTarget","morphOffset","morph","threshold","MeshArea","bones","boneTarget","boneOffset","bone","affectedByBones","affectedByMorphTargets","boneBindings","BoneBinding","bindingTarget","bindingOffset","binding","targets","MorphTarget","maxDisplacement","uvDensities","densityTarget","densityOffset","occlusion","audioOcclusionMesh","vertices","vertexTarget","vertexOffset","vertex","indices","indexTarget","indexOffset","MeshTopology","topology","skeleton","writeSkeleton","skeletonOffset","some","parents","parentTarget","parentOffset","parent","restTransforms","Transform","transformTarget","transformOffset","transform","position","rotation","scale","invBindTransforms","matrixTarget","matrixOffset","matrix","boneMasks","BoneMask","maskTarget","maskOffset","mask","weights","BoneWeight","weightTarget","weightOffset","weight","writeAnimation","animationOffset","animation","channels","AnimationChannel","channelTarget","channelOffset","channel","AnimationChannelTargetType","targetType","curveIndex","curves","AnimationCurve","curveTarget","curveOffset","curve","valueDimension","Interpolation","interpolation","knotType","valueType","knotCount","knots","knotTarget","knotOffset","knot","values","valueTarget","valueOffset","duration","meshes","Mesh","skeletons","Skeleton","animations","Animation","collectBufferRecords","compress","records","recordsByIndex","visit","compression","existing","record","push","resolveBufferBytes","buffers","entry","find","data","compressBuffer","gpuAlignment","encodeVertexBuffer","source","wide","Uint32Array","byteOffset","getUint16","encodeIndexBuffer","writeCmf","options","validateCmfGraph","phase","compressed","map","uncompressedSize","Data","dataBytes","metadataBytes","metadata","entries","Metadata","MetadataEntry","sections","compressedSize","header","Header","FILE_SIGNATURE","FILE_VERSION","Section","headerSize","sectionOffsets","section","sectionOffset","sectionsChunk","forEach","base","SectionType","SectionCompression","total","file","checksum","crc32","readCmf","decodeBuffers","validateCrc","writeCmfAsync"],"mappings":"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"}
1
+ {"version":3,"file":"writer.js","sources":["../../../../../../src/resource/formats/cmf/core/writer.js"],"sourcesContent":["import { MeshoptEncoder } from \"meshoptimizer/encoder\";\r\nimport {\r\n AnimationChannelTargetType,\r\n ElementType,\r\n FILE_SIGNATURE,\r\n FILE_VERSION,\r\n Interpolation,\r\n MeshTopology,\r\n STRUCT_SIZE,\r\n SectionCompression,\r\n SectionType,\r\n Usage\r\n} from \"./constants.js\";\r\nimport { crc32 } from \"./binary.js\";\nimport { readCmf } from \"./schema.js\";\nimport { validateCmfGraph } from \"./validate.js\";\n\r\n/**\r\n * Binary CMF v1 writer.\r\n *\r\n * Mirrors CarbonEngine's `cmf::BuildFile`: the object graph is flattened into\r\n * the Data section as structs with self-relative tagged span offsets\r\n * (depth-first in member order, 8-byte chunk alignment, identical leaf chunks\r\n * deduplicated), GPU buffers referenced by BufferViews become one section\r\n * each (remapped to section indices in first-encounter order, meshoptimizer\r\n * compressed by default), optional metadata flattens into a trailing section,\r\n * and the header CRC covers everything after the crc32 field.\r\n */\r\n\r\nconst textEncoder = new TextEncoder();\nconst FLOAT32_MAX = 3.4028234663852886e38;\n\r\nlet encoderReady = false;\r\nMeshoptEncoder.ready.then(() => { encoderReady = true; });\r\n\r\nfunction writeError(message)\r\n{\r\n const error = new Error(`CMF write: ${message}`);\r\n error.code = \"CJS_FORMAT_WRITE_ERROR\";\r\n return error;\r\n}\r\n\r\nfunction enumValue(names, value, label)\r\n{\r\n if (typeof value === \"number\") return value;\r\n const index = names.indexOf(value);\r\n if (index >= 0) return index;\r\n const unknown = /^Unknown\\((\\d+)\\)$/u.exec(String(value ?? \"\"));\r\n if (unknown) return Number(unknown[1]);\r\n throw writeError(`unknown ${label} value ${JSON.stringify(value)}`);\r\n}\r\n\r\n/**\r\n * Growable little-endian struct buffer with tagged span support.\r\n */\r\nclass Flattener\r\n{\r\n _bytes = new Uint8Array(1024);\r\n _view = new DataView(this._bytes.buffer);\r\n _chunkCache = new Map();\r\n size = 0;\r\n\r\n /**\r\n * Grows the output buffer when the requested write would exceed capacity for\r\n * the CMF binary writer.\r\n */\r\n _ensure(capacity)\r\n {\r\n if (capacity <= this._bytes.length) return;\r\n let next = this._bytes.length * 2;\r\n while (next < capacity) next *= 2;\r\n const grown = new Uint8Array(next);\r\n grown.set(this._bytes.subarray(0, this.size));\r\n this._bytes = grown;\r\n this._view = new DataView(grown.buffer);\r\n }\r\n\r\n /** Reserves output storage in the current CMF binary writer. */\r\n reserve(byteLength)\r\n {\r\n const offset = this.size;\r\n this._ensure(offset + byteLength);\r\n this._bytes.fill(0, offset, offset + byteLength);\r\n this.size = offset + byteLength;\r\n return offset;\r\n }\r\n\r\n /** Reserves aligned in the current CMF binary writer. */\r\n reserveAligned(byteLength, alignment = 8)\r\n {\r\n const padded = Math.ceil(this.size / alignment) * alignment;\r\n this._ensure(padded);\r\n this._bytes.fill(0, this.size, padded);\r\n this.size = padded;\r\n return this.reserve(byteLength);\r\n }\r\n\r\n /**\r\n * Writes an unsigned 8-bit integer into the output buffer for the CMF binary\r\n * writer.\r\n */\r\n u8(offset, value) { this._view.setUint8(offset, value); }\r\n\r\n /**\r\n * Writes an unsigned 16-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n u16(offset, value) { this._view.setUint16(offset, value, true); }\r\n\r\n /**\r\n * Writes an unsigned 32-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n u32(offset, value) { this._view.setUint32(offset, value, true); }\n\r\n /**\r\n * Writes a 32-bit little-endian float into the output buffer for the CMF\r\n * binary writer.\r\n */\r\n f32(offset, value) { this._view.setFloat32(offset, value ?? 0, true); }\n\r\n /**\r\n * Writes a signed 64-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n i64(offset, value) { this._view.setBigInt64(offset, BigInt(value), true); }\r\n\r\n /**\r\n * Writes an unsigned 64-bit little-endian integer into the output buffer for\r\n * the CMF binary writer.\r\n */\r\n u64(offset, value) { this._view.setBigUint64(offset, BigInt(value), true); }\r\n\r\n /**\r\n * Copies bytes into a previously reserved output range for the CMF binary\r\n * writer.\r\n */\r\n setBytes(offset, bytes)\r\n {\r\n this._bytes.set(bytes, offset);\r\n }\r\n\r\n /**\r\n * Write a span field and append its element chunk.\r\n *\r\n * `writeElement(flattener, offset, element)` may itself append nested\r\n * chunks; leaf chunks (`dedup: true`) are shared when byte-identical,\r\n * matching the reference writer.\r\n */\r\n span(fieldOffset, elements, elementSize, writeElement, { dedup = false } = {})\r\n {\r\n const count = elements ? elements.length : 0;\r\n const byteSize = count * elementSize;\r\n if (byteSize === 0)\r\n {\r\n // tagged self-relative offset of 0 keeps span pointers valid\r\n this.i64(fieldOffset, 1);\r\n this.u64(fieldOffset + 8, 0);\r\n return;\r\n }\r\n\r\n if (dedup)\r\n {\r\n const scratch = new Flattener();\r\n const scratchOffset = scratch.reserve(byteSize);\r\n for (let i = 0; i < count; i++) writeElement(scratch, scratchOffset + i * elementSize, elements[i]);\r\n const chunk = scratch.bytes();\r\n const key = chunkKey(chunk);\r\n const cached = this._chunkCache.get(key);\r\n if (cached !== undefined && bytesEqual(this._bytes, cached, chunk))\r\n {\r\n this.i64(fieldOffset, cached - fieldOffset + 1);\n this.u64(fieldOffset + 8, byteSize);\r\n return;\r\n }\r\n const chunkOffset = this.reserveAligned(byteSize);\r\n this.setBytes(chunkOffset, chunk);\r\n this._chunkCache.set(key, chunkOffset);\r\n this.i64(fieldOffset, chunkOffset - fieldOffset + 1);\n this.u64(fieldOffset + 8, byteSize);\r\n return;\r\n }\r\n\r\n const chunkOffset = this.reserveAligned(byteSize);\r\n this.i64(fieldOffset, chunkOffset - fieldOffset + 1);\n this.u64(fieldOffset + 8, byteSize);\r\n for (let i = 0; i < count; i++) writeElement(this, chunkOffset + i * elementSize, elements[i]);\r\n }\r\n\r\n /**\r\n * Writes a length-prefixed UTF-8 string into the output buffer for the CMF\r\n * binary writer.\r\n */\r\n string(fieldOffset, value)\r\n {\r\n const encoded = textEncoder.encode(value || \"\");\r\n this.span(fieldOffset, encoded, 1, (buffer, offset, byte) => buffer.u8(offset, byte), { dedup: true });\r\n }\r\n\r\n /**\r\n * Writes a length-prefixed byte block into the output buffer for the CMF\r\n * binary writer.\r\n */\r\n bytes()\r\n {\r\n return this._bytes.slice(0, this.size);\r\n }\r\n}\r\n\r\nfunction chunkKey(bytes)\r\n{\r\n let hash = 2166136261 >>> 0;\r\n for (let i = 0; i < bytes.length; i++)\r\n {\r\n hash = Math.imul(hash, 16777619) >>> 0;\r\n hash = (hash ^ bytes[i]) >>> 0;\r\n }\r\n return `${bytes.length}:${hash}`;\r\n}\r\n\r\nfunction bytesEqual(target, offset, chunk)\r\n{\r\n for (let i = 0; i < chunk.length; i++)\r\n {\r\n if (target[offset + i] !== chunk[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction writeBounds(buffer, offset, bounds)\n{\n const min = bounds?.min ?? [ FLOAT32_MAX, FLOAT32_MAX, FLOAT32_MAX ];\n const max = bounds?.max ?? [ -FLOAT32_MAX, -FLOAT32_MAX, -FLOAT32_MAX ];\n for (let i = 0; i < 3; i++) buffer.f32(offset + i * 4, min[i]);\r\n for (let i = 0; i < 3; i++) buffer.f32(offset + 12 + i * 4, max[i]);\r\n}\r\n\r\nfunction writeBufferView(buffer, offset, view, remap)\r\n{\r\n const size = view?.size || 0;\r\n const index = view?.index || 0;\r\n buffer.u32(offset, size === 0 ? index : (remap.get(index) ?? index));\r\n buffer.u32(offset + 4, view?.offset || 0);\r\n buffer.u32(offset + 8, size);\r\n buffer.u32(offset + 12, view?.stride || 0);\r\n}\r\n\r\nfunction writeVertexElement(buffer, offset, element)\r\n{\r\n buffer.u8(offset, enumValue(Usage, element.usage, \"vertex usage\"));\r\n buffer.u8(offset + 1, element.usageIndex || 0);\r\n buffer.u8(offset + 2, enumValue(ElementType, element.type, \"element type\"));\r\n buffer.u8(offset + 3, element.elementCount || 0);\r\n buffer.u32(offset + 4, element.offset || 0);\r\n}\r\n\r\nfunction writeData(buffer, offset, graph, remap)\r\n{\r\n const writeMesh = (target, meshOffset, mesh) =>\r\n {\r\n target.string(meshOffset, mesh.name);\r\n target.span(meshOffset + 16, mesh.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, { dedup: true });\r\n target.span(meshOffset + 32, mesh.lods || [], STRUCT_SIZE.MeshLod, (lodTarget, lodOffset, lod) =>\r\n {\r\n writeBufferView(lodTarget, lodOffset, lod.vb, remap);\r\n writeBufferView(lodTarget, lodOffset + 16, lod.ib, remap);\r\n lodTarget.span(lodOffset + 32, lod.areas || [], STRUCT_SIZE.LodMeshArea, (areaTarget, areaOffset, area) =>\r\n {\r\n areaTarget.u32(areaOffset, area.firstElement || 0);\r\n areaTarget.u32(areaOffset + 4, area.elementCount || 0);\r\n }, { dedup: true });\r\n lodTarget.span(lodOffset + 48, lod.morphTargets || [], STRUCT_SIZE.LodMorphTarget, (morphTarget, morphOffset, morph) =>\r\n {\r\n writeBufferView(morphTarget, morphOffset, morph.vb, remap);\r\n });\r\n lodTarget.u32(lodOffset + 64, lod.threshold ?? 0xffffffff);\r\n });\r\n target.span(meshOffset + 48, mesh.areas || [], STRUCT_SIZE.MeshArea, (areaTarget, areaOffset, area) =>\r\n {\r\n areaTarget.string(areaOffset, area.name);\r\n writeBounds(areaTarget, areaOffset + 16, area.bounds);\r\n areaTarget.span(areaOffset + 40, area.bones || [], 2, (boneTarget, boneOffset, bone) => boneTarget.u16(boneOffset, bone), { dedup: true });\r\n areaTarget.u8(areaOffset + 56, area.affectedByBones ? 1 : 0);\r\n areaTarget.u8(areaOffset + 57, area.affectedByMorphTargets ? 1 : 0);\r\n });\r\n target.span(meshOffset + 64, mesh.boneBindings || [], STRUCT_SIZE.BoneBinding, (bindingTarget, bindingOffset, binding) =>\r\n {\r\n bindingTarget.string(bindingOffset, binding.name);\r\n writeBounds(bindingTarget, bindingOffset + 16, binding.bounds);\r\n });\r\n target.span(meshOffset + 80, mesh.morphTargets?.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, { dedup: true });\r\n target.span(meshOffset + 96, mesh.morphTargets?.targets || [], STRUCT_SIZE.MorphTarget, (morphTarget, morphOffset, morph) =>\r\n {\r\n morphTarget.string(morphOffset, morph.name);\r\n morphTarget.f32(morphOffset + 16, morph.maxDisplacement ?? 0);\n });\r\n target.span(meshOffset + 112, mesh.uvDensities || [], 4, (densityTarget, densityOffset, value) => densityTarget.f32(densityOffset, value), { dedup: true });\r\n writeBounds(target, meshOffset + 128, mesh.bounds);\r\n const occlusion = mesh.audioOcclusionMesh || {};\r\n target.span(meshOffset + 152, occlusion.vertices || [], 12, (vertexTarget, vertexOffset, vertex) =>\r\n {\r\n for (let i = 0; i < 3; i++) vertexTarget.f32(vertexOffset + i * 4, vertex[i]);\r\n }, { dedup: true });\r\n target.span(meshOffset + 168, occlusion.indices || [], 2, (indexTarget, indexOffset, index) => indexTarget.u16(indexOffset, index), { dedup: true });\r\n writeBounds(target, meshOffset + 184, occlusion.bounds);\r\n target.u8(meshOffset + 208, enumValue(MeshTopology, mesh.topology ?? \"TriangleList\", \"topology\"));\r\n target.u8(meshOffset + 209, mesh.skeleton === null || mesh.skeleton === undefined ? 0xff : mesh.skeleton);\r\n };\r\n\r\n const writeSkeleton = (target, skeletonOffset, skeleton) =>\r\n {\r\n if ((skeleton.bones || []).some((bone) => typeof bone !== \"string\"))\r\n {\r\n throw writeError(\r\n \"skeleton bones must be name strings; GR2-shaped skeletons need conversion (use writeShared) before writing\"\r\n );\r\n }\r\n target.string(skeletonOffset, skeleton.name);\r\n target.span(skeletonOffset + 16, skeleton.bones || [], 16, (boneTarget, boneOffset, bone) => boneTarget.string(boneOffset, bone));\r\n target.span(skeletonOffset + 32, skeleton.parents || [], 4, (parentTarget, parentOffset, parent) => parentTarget.u32(parentOffset, parent), { dedup: true });\r\n target.span(skeletonOffset + 48, skeleton.restTransforms || [], STRUCT_SIZE.Transform, (transformTarget, transformOffset, transform) =>\r\n {\r\n const position = transform.position || [ 0, 0, 0 ];\r\n const rotation = transform.rotation || [ 0, 0, 0, 1 ];\r\n const scale = transform.scale || [ 1, 1, 1 ];\r\n for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + i * 4, position[i]);\r\n for (let i = 0; i < 4; i++) transformTarget.f32(transformOffset + 12 + i * 4, rotation[i]);\r\n for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + 28 + i * 4, scale[i]);\r\n }, { dedup: true });\r\n target.span(skeletonOffset + 64, skeleton.invBindTransforms || [], 64, (matrixTarget, matrixOffset, matrix) =>\r\n {\r\n for (let i = 0; i < 16; i++) matrixTarget.f32(matrixOffset + i * 4, matrix[i]);\r\n }, { dedup: true });\r\n target.span(skeletonOffset + 80, skeleton.boneMasks || [], STRUCT_SIZE.BoneMask, (maskTarget, maskOffset, mask) =>\r\n {\r\n maskTarget.string(maskOffset, mask.name);\r\n maskTarget.span(maskOffset + 16, mask.weights || [], STRUCT_SIZE.BoneWeight, (weightTarget, weightOffset, weight) =>\r\n {\r\n weightTarget.u32(weightOffset, weight.index || 0);\r\n weightTarget.f32(weightOffset + 4, weight.weight ?? 1);\r\n }, { dedup: true });\r\n });\r\n };\r\n\r\n const writeAnimation = (target, animationOffset, animation) =>\r\n {\r\n target.string(animationOffset, animation.name);\r\n target.span(animationOffset + 16, animation.channels || [], STRUCT_SIZE.AnimationChannel, (channelTarget, channelOffset, channel) =>\r\n {\r\n channelTarget.string(channelOffset, channel.target);\r\n channelTarget.u8(channelOffset + 16, enumValue(AnimationChannelTargetType, channel.targetType, \"channel target type\"));\r\n channelTarget.u32(channelOffset + 20, channel.curveIndex || 0);\r\n });\r\n target.span(animationOffset + 32, animation.curves || [], STRUCT_SIZE.AnimationCurve, (curveTarget, curveOffset, curve) =>\r\n {\r\n curveTarget.u8(curveOffset, curve.valueDimension || 0);\r\n curveTarget.u8(curveOffset + 1, enumValue(Interpolation, curve.interpolation, \"interpolation\"));\r\n curveTarget.u8(curveOffset + 2, enumValue(ElementType, curve.knotType, \"knot type\"));\r\n curveTarget.u8(curveOffset + 3, enumValue(ElementType, curve.valueType, \"value type\"));\r\n curveTarget.u32(curveOffset + 4, curve.knotCount || 0);\r\n curveTarget.span(curveOffset + 8, curve.knots || [], 1, (knotTarget, knotOffset, knot) => knotTarget.u8(knotOffset, knot), { dedup: true });\r\n curveTarget.span(curveOffset + 24, curve.values || [], 1, (valueTarget, valueOffset, value) => valueTarget.u8(valueOffset, value), { dedup: true });\r\n });\r\n target.f32(animationOffset + 48, animation.duration ?? 0);\n };\r\n\r\n buffer.span(offset, graph.meshes || [], STRUCT_SIZE.Mesh, writeMesh);\r\n buffer.span(offset + 16, graph.skeletons || [], STRUCT_SIZE.Skeleton, writeSkeleton);\r\n buffer.span(offset + 32, graph.animations || [], STRUCT_SIZE.Animation, writeAnimation);\r\n}\r\n\r\n/**\r\n * Collect BufferView usage in reference-writer order and decide per-buffer\r\n * compression (conflicting stride/kind across views falls back to None).\r\n */\r\nfunction collectBufferRecords(graph, compress)\r\n{\r\n const records = [];\r\n const recordsByIndex = new Map();\r\n const visit = (view, compression) =>\r\n {\r\n if (!view || !view.size) return;\r\n const existing = recordsByIndex.get(view.index);\r\n if (!existing)\r\n {\r\n const record = {\r\n index: view.index,\r\n stride: view.stride || 0,\r\n compression: compress ? compression : \"None\"\r\n };\r\n records.push(record);\r\n recordsByIndex.set(view.index, record);\r\n }\r\n else if (existing.stride !== (view.stride || 0) || (compress ? compression : \"None\") !== existing.compression)\r\n {\r\n existing.stride = 0;\r\n existing.compression = \"None\";\r\n }\r\n };\r\n\r\n for (const mesh of graph.meshes || [])\r\n {\r\n for (const lod of mesh.lods || [])\r\n {\r\n visit(lod.vb, \"MeshOptimizerVertexBuffer\");\r\n visit(lod.ib, \"MeshOptimizerIndexBuffer\");\r\n for (const morph of lod.morphTargets || [])\r\n {\r\n visit(morph.vb, \"MeshOptimizerVertexBuffer\");\r\n }\r\n }\r\n }\r\n return records;\r\n}\r\n\r\nfunction resolveBufferBytes(graph, record)\r\n{\r\n const buffers = graph.buffers || [];\r\n const entry = buffers.find?.((buffer) => buffer && buffer.index === record.index) ?? buffers[record.index];\r\n const data = entry?.data ?? (entry instanceof Uint8Array ? entry : null);\r\n if (!data)\r\n {\r\n throw writeError(`no buffer data supplied for BufferView index ${record.index}`);\r\n }\r\n return data instanceof Uint8Array ? data : new Uint8Array(data);\r\n}\r\n\r\nfunction compressBuffer(bytes, record)\r\n{\r\n if (record.compression === \"None\" || bytes.byteLength === 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: record.stride };\r\n }\r\n if (!encoderReady)\r\n {\r\n throw writeError(\"compressed output requires writeAsync/WriteAsync so meshoptimizer can initialize (or pass compress: false)\");\r\n }\r\n\r\n if (record.compression === \"MeshOptimizerVertexBuffer\")\r\n {\r\n if (record.stride === 0 || bytes.byteLength % record.stride !== 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: record.stride };\r\n }\r\n const count = bytes.byteLength / record.stride;\r\n const data = MeshoptEncoder.encodeVertexBuffer(bytes, count, record.stride);\r\n return { data, compression: \"MeshOptimizerVertexBuffer\", gpuAlignment: record.stride };\r\n }\r\n\r\n // index buffers: meshopt encodes triangle lists of u32; u16 sources widen\r\n const stride = record.stride;\r\n if ((stride !== 2 && stride !== 4) || bytes.byteLength % stride !== 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: stride };\r\n }\r\n const count = bytes.byteLength / stride;\r\n if (count % 3 !== 0)\r\n {\r\n return { data: bytes, compression: \"None\", gpuAlignment: stride };\r\n }\r\n let source = bytes;\r\n if (stride === 2)\r\n {\r\n const wide = new Uint32Array(count);\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n for (let i = 0; i < count; i++) wide[i] = view.getUint16(i * 2, true);\r\n source = new Uint8Array(wide.buffer);\r\n }\r\n const data = MeshoptEncoder.encodeIndexBuffer(source, count, 4);\r\n return { data, compression: \"MeshOptimizerIndexBuffer\", gpuAlignment: stride };\r\n}\r\n\r\n/**\r\n * Serialize a CMF-native graph into .cmf bytes.\r\n *\r\n * @param {object} graph Native graph: `{ meshes, skeletons, animations, metadata?, buffers? }`\r\n * where `buffers` supplies uncompressed GPU bytes for each BufferView\r\n * `index` (as `{ index, data }` entries or an index-keyed array).\r\n * @param {object} [options] `compress` (default false for the sync writer)\r\n * enables meshoptimizer vertex/index compression.\r\n * @returns {Uint8Array} Complete .cmf file bytes.\r\n */\r\nexport function writeCmf(graph, options = {})\n{\n if (!graph || typeof graph !== \"object\")\r\n {\n throw writeError(\"input graph must be an object\");\n }\n if ((graph.skeletons ?? []).some(skeleton =>\n (skeleton?.bones ?? []).some(bone => typeof bone !== \"string\")))\n {\n throw writeError(\n \"skeleton bones must be name strings; GR2-shaped skeletons need conversion (use writeShared) before writing\"\n );\n }\n validateCmfGraph(graph, { phase: \"write\" });\n const compress = options.compress === true;\n\r\n const records = collectBufferRecords(graph, compress);\r\n const compressed = records.map((record) =>\r\n {\r\n const bytes = resolveBufferBytes(graph, record);\r\n return { record, ...compressBuffer(bytes, record), uncompressedSize: bytes.byteLength };\r\n });\r\n const remap = new Map(records.map((record, position) => [ record.index, position + 1 ]));\r\n\r\n const data = new Flattener();\r\n data.reserve(STRUCT_SIZE.Data);\r\n writeData(data, 0, graph, remap);\r\n const dataBytes = data.bytes();\r\n\r\n let metadataBytes = null;\r\n if (graph.metadata && (graph.metadata.entries || []).length)\r\n {\r\n const metadata = new Flattener();\r\n metadata.reserve(STRUCT_SIZE.Metadata);\r\n metadata.span(0, graph.metadata.entries, STRUCT_SIZE.MetadataEntry, (target, offset, entry) =>\r\n {\r\n target.string(offset, entry.key);\r\n target.string(offset + 16, entry.value);\r\n });\r\n metadataBytes = metadata.bytes();\r\n }\r\n\r\n const sections = [\r\n { type: \"Data\", compression: \"None\", gpuAlignment: 0, compressedSize: dataBytes.byteLength, uncompressedSize: dataBytes.byteLength, data: dataBytes }\r\n ];\r\n for (const entry of compressed)\r\n {\r\n sections.push({\r\n type: \"GpuBuffer\",\r\n compression: entry.compression,\r\n gpuAlignment: entry.gpuAlignment,\r\n compressedSize: entry.data.byteLength,\r\n uncompressedSize: entry.uncompressedSize,\r\n data: entry.data\r\n });\r\n }\r\n if (metadataBytes)\r\n {\r\n sections.push({ type: \"Metadata\", compression: \"None\", gpuAlignment: 0, compressedSize: metadataBytes.byteLength, uncompressedSize: metadataBytes.byteLength, data: metadataBytes });\r\n }\r\n\r\n const header = new Flattener();\r\n header.reserve(STRUCT_SIZE.Header);\r\n header.u32(0, FILE_SIGNATURE);\r\n header.u32(4, FILE_VERSION);\r\n header.span(16, sections, STRUCT_SIZE.Section, () => {});\r\n const headerSize = header.size;\r\n header.u32(8, headerSize);\r\n\r\n let offset = headerSize;\r\n const sectionOffsets = sections.map((section) =>\r\n {\r\n offset = Math.ceil(offset / 8) * 8;\r\n const sectionOffset = offset;\r\n offset += section.compressedSize;\r\n return sectionOffset;\r\n });\r\n\r\n const sectionsChunk = headerSize - sections.length * STRUCT_SIZE.Section;\r\n sections.forEach((section, index) =>\r\n {\r\n const base = sectionsChunk + index * STRUCT_SIZE.Section;\r\n header.u32(base, sectionOffsets[index]);\r\n header.u32(base + 4, section.compressedSize);\r\n header.u32(base + 8, section.uncompressedSize);\r\n header.u16(base + 12, section.gpuAlignment || 0);\r\n header.u8(base + 14, enumValue(SectionType, section.type, \"section type\"));\r\n header.u8(base + 15, enumValue(SectionCompression, section.compression, \"section compression\"));\r\n });\r\n\r\n const total = offset;\r\n const file = new Uint8Array(total);\r\n file.set(header.bytes(), 0);\r\n sections.forEach((section, index) =>\r\n {\r\n file.set(section.data, sectionOffsets[index]);\r\n });\r\n\r\n const checksum = crc32(file, 16, file.byteLength);\n new DataView(file.buffer).setUint32(12, checksum, true);\n // Carbon validates every produced file at its save boundary. Re-read the\n // structural result here as the writer's equivalent postcondition; source\n // buffer finiteness was already checked by validateCmfGraph above.\n readCmf(file, { decodeBuffers: false, validateCrc: true });\n return file;\n}\n\r\n/**\r\n * Serialize a CMF-native graph asynchronously with compression enabled by\r\n * default (awaits meshoptimizer encoder initialization).\r\n *\r\n * @param {object} graph Native graph (see `writeCmf`).\r\n * @param {object} [options] `compress` defaults to true.\r\n * @returns {Promise<Uint8Array>} Complete .cmf file bytes.\r\n */\r\nexport async function writeCmfAsync(graph, options = {})\r\n{\r\n await MeshoptEncoder.ready;\r\n encoderReady = true;\r\n return writeCmf(graph, { ...options, compress: options.compress !== false });\r\n}\r\n"],"names":["textEncoder","TextEncoder","FLOAT32_MAX","encoderReady","MeshoptEncoder","ready","then","writeError","message","error","Error","code","enumValue","names","value","label","index","indexOf","unknown","exec","String","Number","JSON","stringify","Flattener","_bytes","Uint8Array","_view","DataView","buffer","_chunkCache","Map","size","_ensure","capacity","length","next","grown","set","subarray","reserve","byteLength","offset","fill","reserveAligned","alignment","padded","Math","ceil","u8","setUint8","u16","setUint16","u32","setUint32","f32","setFloat32","i64","setBigInt64","BigInt","u64","setBigUint64","setBytes","bytes","span","fieldOffset","elements","elementSize","writeElement","dedup","count","byteSize","scratch","scratchOffset","i","chunk","key","chunkKey","cached","get","undefined","bytesEqual","chunkOffset","string","encoded","encode","byte","slice","hash","imul","target","writeBounds","bounds","min","max","writeBufferView","view","remap","stride","writeVertexElement","element","Usage","usage","usageIndex","ElementType","type","elementCount","writeData","graph","writeMesh","meshOffset","mesh","name","decl","STRUCT_SIZE","VertexElement","lods","MeshLod","lodTarget","lodOffset","lod","vb","ib","areas","LodMeshArea","areaTarget","areaOffset","area","firstElement","morphTargets","LodMorphTarget","morphTarget","morphOffset","morph","threshold","MeshArea","bones","boneTarget","boneOffset","bone","affectedByBones","affectedByMorphTargets","boneBindings","BoneBinding","bindingTarget","bindingOffset","binding","targets","MorphTarget","maxDisplacement","uvDensities","densityTarget","densityOffset","occlusion","audioOcclusionMesh","vertices","vertexTarget","vertexOffset","vertex","indices","indexTarget","indexOffset","MeshTopology","topology","skeleton","writeSkeleton","skeletonOffset","some","parents","parentTarget","parentOffset","parent","restTransforms","Transform","transformTarget","transformOffset","transform","position","rotation","scale","invBindTransforms","matrixTarget","matrixOffset","matrix","boneMasks","BoneMask","maskTarget","maskOffset","mask","weights","BoneWeight","weightTarget","weightOffset","weight","writeAnimation","animationOffset","animation","channels","AnimationChannel","channelTarget","channelOffset","channel","AnimationChannelTargetType","targetType","curveIndex","curves","AnimationCurve","curveTarget","curveOffset","curve","valueDimension","Interpolation","interpolation","knotType","valueType","knotCount","knots","knotTarget","knotOffset","knot","values","valueTarget","valueOffset","duration","meshes","Mesh","skeletons","Skeleton","animations","Animation","collectBufferRecords","compress","records","recordsByIndex","visit","compression","existing","record","push","resolveBufferBytes","buffers","entry","find","data","compressBuffer","gpuAlignment","encodeVertexBuffer","source","wide","Uint32Array","byteOffset","getUint16","encodeIndexBuffer","writeCmf","options","validateCmfGraph","phase","compressed","map","uncompressedSize","Data","dataBytes","metadataBytes","metadata","entries","Metadata","MetadataEntry","sections","compressedSize","header","Header","FILE_SIGNATURE","FILE_VERSION","Section","headerSize","sectionOffsets","section","sectionOffset","sectionsChunk","forEach","base","SectionType","SectionCompression","total","file","checksum","crc32","readCmf","decodeBuffers","validateCrc","writeCmfAsync"],"mappings":"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"}
@@ -1,19 +1,38 @@
1
1
  import { asUint8Array } from '#utils/bytes';
2
2
  import { CjsFormat } from '../../format/CjsFormat.js';
3
- import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, probeSupportWithValues, canDecodeDdsBlockFormat, decodeDdsSlice, OUTPUT_JSON, OUTPUT_RAW, OUTPUT_RGBA, OUTPUT_TEXTURE, OUTPUT_IMAGE } from './core/helpers.js';
3
+ import { CjsImageFormat } from '../../format/CjsImageFormat.js';
4
+ import { ImageIOResult, BitmapDimensions, Cutout } from '#imageio';
5
+ import { PixelFormat, PixelFormatFromCanonical, TextureType } from '#consts/render-context';
6
+ import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, probeSupportWithValues, inspectBytes, expand24To32, convertL8A8ToBgra, canDecodeDdsBlockFormat, decodeDdsSlice } from './core/helpers.js';
4
7
  import { toJsonWithByteSummary } from '../../format/jsonPolicies.js';
5
8
  import { isDDS } from '../../format/imageSignatures.js';
6
9
 
7
10
  const FORMAT_NAME = "CjsDdsFormat";
8
11
 
12
+ /**
13
+ * The legacy (non-DX10) DDS formats this format's parser names with a DDS-only
14
+ * string, mapped to Carbon's PixelFormat as Tr2DdsHandler's s_ddsFormats does
15
+ * (imageio/Tr2DdsHandler.cpp:190-226). Everything else maps through
16
+ * PixelFormatFromCanonical.
17
+ */
18
+ const LEGACY_PIXEL_FORMATS = {
19
+ "bgr8unorm": PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM,
20
+ "bgrx8unorm": PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM,
21
+ "rgbx8unorm": PixelFormat.PIXEL_FORMAT_R8G8B8A8_UNORM,
22
+ "l8unorm": PixelFormat.PIXEL_FORMAT_R8_UNORM,
23
+ "l8a8unorm": PixelFormat.PIXEL_FORMAT_R8G8_UNORM,
24
+ "a8unorm": PixelFormat.PIXEL_FORMAT_A8_UNORM,
25
+ "rgb32float": PixelFormat.PIXEL_FORMAT_R32G32B32_FLOAT
26
+ };
27
+
9
28
  /**
10
29
  * DDS texture format profile that inspects header metadata, probes output
11
30
  * support, and reads DDS bytes into raw, GPU-free texture, image, or
12
31
  * software-decoded RGBA and float payloads (BC1-BC5, BC7, and BC6H
13
32
  * included).
14
33
  */
15
- class CjsDdsFormat extends CjsFormat {
16
- #values = DEFAULT_VALUES;
34
+ class CjsDdsFormat extends CjsImageFormat {
35
+ _values = DEFAULT_VALUES;
17
36
 
18
37
  /**
19
38
  * Create a reusable DDS format profile.
@@ -32,7 +51,7 @@ class CjsDdsFormat extends CjsFormat {
32
51
  * @returns {CjsDdsFormat} This format profile.
33
52
  */
34
53
  SetValues(options = {}) {
35
- this.#values = normalizeValues(this.#values, {
54
+ this._values = normalizeValues(this._values, {
36
55
  inputType: "dds",
37
56
  ...options
38
57
  }, FORMAT_NAME);
@@ -46,7 +65,7 @@ class CjsDdsFormat extends CjsFormat {
46
65
  * @returns {object} Normalized read values.
47
66
  */
48
67
  GetValues(options = {}) {
49
- return normalizeValues(this.#values, {
68
+ return normalizeValues(this._values, {
50
69
  inputType: "dds",
51
70
  ...options
52
71
  }, FORMAT_NAME);
@@ -173,8 +192,114 @@ class CjsDdsFormat extends CjsFormat {
173
192
  }
174
193
 
175
194
  /**
176
- * Emit targets for this format (canonical frozen enum).
195
+ * Fill a HostBitmap from DDS bytes: Carbon's `Dds::ReadImage`
196
+ * (imageio/Tr2DdsHandler.cpp:922-958), read through this format's own
197
+ * header parser rather than a second one, so it covers every DDS variant the
198
+ * parser does - more than Carbon's handler table.
199
+ *
200
+ * Kept from Carbon: mip skipping from `LoadParameters` (not for cubes,
201
+ * DoReadHeader :484-515), 24-bit RGB expanded to 32-bit BGRX with X = 0
202
+ * (`Convert24BitTo32Bit`, :774-795), and A8L8 read as R8G8 then converted
203
+ * to BGRA (:863-868). The pixel data is copied as it lies: the file order is
204
+ * the HostBitmap layout.
205
+ *
206
+ * adapted: a cube ARRAY loads whole (arraySize = 6 x cubes); Carbon's
207
+ * CopyHeaderValuesToMembers always makes one cube (:447-449). Not yet
208
+ * ported: the CCP-META trailer; metadata gets its default cutout only.
209
+ *
210
+ * @param {Uint8Array|ArrayBuffer} input DDS bytes.
211
+ * @param {import("#imageio").LoadParameters} loadParameters Load parameters.
212
+ * @param {object} bitmap Destination HostBitmap; only its methods are used.
213
+ * @param {import("#imageio").Metadata|null} [metadata] Optional Metadata out.
214
+ * @returns {ImageIOResult} The result.
215
+ */
216
+ static readImageNative(input, loadParameters, bitmap, metadata = null) {
217
+ const Code = ImageIOResult.Code;
218
+ const bytes = asUint8Array(input, "Image input");
219
+ let meta;
220
+ try {
221
+ meta = inspectBytes(bytes);
222
+ } catch (error) {
223
+ return new ImageIOResult(Code.INVALID_HEADER, error.message);
224
+ }
225
+ if (meta.sourceFormat !== "dds") return new ImageIOResult(Code.INVALID_HEADER);
226
+ const format = meta.hasDx10 ? meta.dxgiFormat : LEGACY_PIXEL_FORMATS[meta.pixelFormat] ?? PixelFormatFromCanonical[meta.pixelFormat] ?? PixelFormat.PIXEL_FORMAT_UNKNOWN;
227
+ if (format === PixelFormat.PIXEL_FORMAT_UNKNOWN) {
228
+ return new ImageIOResult(Code.HEADER_NOT_SUPPORTED, `unsupported DDS format ${meta.textureFormat}`);
229
+ }
230
+ const isRgb24 = meta.pixelFormat === "bgr8unorm";
231
+ const description = {
232
+ type: meta.isCube ? TextureType.TEX_TYPE_CUBE : meta.isVolume ? TextureType.TEX_TYPE_3D : TextureType.TEX_TYPE_2D,
233
+ format,
234
+ width: meta.width,
235
+ height: meta.height,
236
+ depth: meta.isVolume ? Math.max(meta.depth, 1) : 1,
237
+ mipCount: meta.mipCount,
238
+ arraySize: meta.isCube ? 6 * Math.max(meta.arraySize, 1) : Math.max(meta.arraySize, 1)
239
+ };
240
+ let skipBytes = 0;
241
+ if (!meta.isCube) {
242
+ const full = new BitmapDimensions(description);
243
+ const range = loadParameters.GetMipLevelRange(meta.width, meta.height, meta.hasMipMaps ? meta.mipCount : 0);
244
+ if (range.skipCount) {
245
+ for (let i = 0; i < range.skipCount; ++i) {
246
+ skipBytes += isRgb24 ? full.GetMipWidth(i) * full.GetMipHeight(i) * full.GetMipDepth(i) * 3 : full.GetMipSize(i);
247
+ }
248
+ description.mipCount = range.mipCount;
249
+ description.width = meta.width >>> range.skipCount;
250
+ description.height = meta.height >>> range.skipCount;
251
+ description.depth = Math.max(1, description.depth >>> range.skipCount);
252
+ }
253
+ }
254
+ if (metadata) metadata.cutout = new Cutout();
255
+ if (!bitmap.CreateFromBitmapDimensions(new BitmapDimensions(description))) {
256
+ return new ImageIOResult(Code.ERROR_CREATING_BITMAP);
257
+ }
258
+ const dst = bitmap.GetRawData();
259
+ const elementSize = bitmap.GetArrayElementSize();
260
+ const sourceElementSize = isRgb24 ? Math.floor(elementSize / 4) * 3 : elementSize;
261
+ let cursor = meta.dataOffset;
262
+ for (let element = 0; element < bitmap.GetArraySize(); ++element) {
263
+ cursor += skipBytes;
264
+ const source = bytes.subarray(cursor, Math.min(cursor + sourceElementSize, bytes.length));
265
+ if (isRgb24) {
266
+ dst.set(CjsDdsFormat.expand24To32(source), element * elementSize);
267
+ } else {
268
+ // quirk: a short file leaves a zeroed tail rather than failing,
269
+ // as a CCP stream's partial Read does.
270
+ dst.set(source, element * elementSize);
271
+ }
272
+ cursor += sourceElementSize;
273
+ }
274
+ if (meta.pixelFormat === "l8a8unorm" && !bitmap.ConvertFormat(PixelFormat.PIXEL_FORMAT_B8G8R8A8_UNORM)) {
275
+ bitmap.Destroy();
276
+ return new ImageIOResult(Code.ERROR_CONVERTING_FORMAT);
277
+ }
278
+ return new ImageIOResult(Code.OK);
279
+ }
280
+
281
+ /**
282
+ * Carbon's 24-bit clean-up: BGR -> BGRX, X = 0 (Tr2DdsHandler.cpp:774-795).
283
+ * Also available on the texture output as `read(bytes, { emit: "texture", expandLegacy: true })`.
284
+ *
285
+ * @param {Uint8Array} source 24-bit pixels.
286
+ * @returns {Uint8Array} 32-bit pixels.
177
287
  */
288
+ static expand24To32(source) {
289
+ return expand24To32(source);
290
+ }
291
+
292
+ /**
293
+ * Carbon's A8L8 clean-up: -> BGRA with B = G = R = L (Tr2DdsHandler.cpp:863-868).
294
+ * Also available on the texture output as `read(bytes, { emit: "texture", expandLegacy: true })`.
295
+ *
296
+ * @param {Uint8Array} source L8A8 pixels.
297
+ * @returns {Uint8Array} BGRA pixels.
298
+ */
299
+ static convertL8A8ToBgra(source) {
300
+ return convertL8A8ToBgra(source);
301
+ }
302
+
178
303
  /**
179
304
  * Decodes one block-compressed 2D slice to RGBA8.
180
305
  *
@@ -224,16 +349,8 @@ class CjsDdsFormat extends CjsFormat {
224
349
  static canDecodeBlockSlice(pixelFormat) {
225
350
  return canDecodeDdsBlockFormat(pixelFormat);
226
351
  }
227
- static Output = Object.freeze({
228
- IMAGE: OUTPUT_IMAGE,
229
- TEXTURE: OUTPUT_TEXTURE,
230
- RGBA: OUTPUT_RGBA,
231
- RAW: OUTPUT_RAW,
232
- JSON: OUTPUT_JSON
233
- });
234
- static OUTPUT_DDS_JSON = "ddsJson";
235
- static id = "dds";
236
- static mediaTypes = Object.freeze(["texture", "image"]);
352
+ static id = "CjsDdsFormat";
353
+ static mediaTypes = ["texture", "image"];
237
354
  static outputs = CjsFormat.defineOutputs({
238
355
  texture: {
239
356
  probes: ["texture", "compressed"]
@@ -255,7 +372,7 @@ class CjsDdsFormat extends CjsFormat {
255
372
  passthrough: true
256
373
  }
257
374
  });
258
- static extensions = Object.freeze([".dds"]);
375
+ static extensions = [".dds"];
259
376
  }
260
377
 
261
378
  export { CjsDdsFormat };
@@ -1 +1 @@
1
- {"version":3,"file":"CjsDdsFormat.js","sources":["../../../../../src/resource/formats/dds/CjsDdsFormat.js"],"sourcesContent":["import { asUint8Array } from \"#utils/bytes\";\nimport { CjsFormat } from \"../../format/CjsFormat.js\";\nimport {\n DEFAULT_VALUES,\n canDecodeDdsBlockFormat,\n decodeDdsSlice,\n OUTPUT_IMAGE,\n OUTPUT_JSON,\n OUTPUT_RAW,\n OUTPUT_RGBA,\n OUTPUT_TEXTURE,\n inspectWithValues,\n isDDS,\n probeSupportWithValues,\n normalizeValues,\n readWithValues,\n toJsonValue\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsDdsFormat\";\n\n/**\n * DDS texture format profile that inspects header metadata, probes output\n * support, and reads DDS bytes into raw, GPU-free texture, image, or\n * software-decoded RGBA and float payloads (BC1-BC5, BC7, and BC6H\n * included).\n */\nexport class CjsDdsFormat extends CjsFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Create a reusable DDS format profile.\n *\n * @param {object} [options] Default read/inspect options.\n */\n constructor(options = {})\n {\n super();\n this.SetValues(options);\n }\n\n /**\n * Merge options into this profile.\n *\n * @param {object} [options] Values to merge.\n * @returns {CjsDdsFormat} This format profile.\n */\n SetValues(options = {})\n {\n this.#values = normalizeValues(this.#values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n return this;\n }\n\n /**\n * Get normalized profile values with optional per-call overrides.\n *\n * @param {object} [options] Per-call values.\n * @returns {object} Normalized read values.\n */\n GetValues(options = {})\n {\n return normalizeValues(this.#values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n }\n\n /**\n * Read DDS bytes with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n Read(input, options = {})\n {\n return readWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Read DDS bytes asynchronously with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n async ReadAsync(input, options = {})\n {\n return this.Read(input, options);\n }\n\n /**\n * Inspect DDS bytes without decoding texture data.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} DDS header metadata.\n */\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * One-shot DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static read(input, options = {})\n {\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot asynchronous DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static async readAsync(input, options = {})\n {\n return CjsDdsFormat.read(input, options);\n }\n\n /**\n * One-shot DDS inspection.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Inspect options.\n * @returns {object} DDS header metadata.\n */\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot DDS support probe.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Support/probe report.\n */\n static probeSupport(input, options = {})\n {\n return probeSupportWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Test whether bytes look like a DDS file.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate DDS bytes.\n * @returns {boolean} True when the DDS header is present and sized correctly.\n */\n static isDDS(input)\n {\n try\n {\n return isDDS(asUint8Array(input, \"Image input\"));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n /**\n * Decodes one block-compressed 2D slice to RGBA8.\n *\n * The whole-file readers answer \"give me this image\"; a volume texture asks\n * a different question - \"give me slice 7 of mip 2\" - and no amount of\n * reading a file down to one subresource expresses it. This is that seam,\n * and it exists because WebGL cannot take the block data as it is:\n * `EXT_texture_compression_bptc` grants `compressedTexImage2D` only, so a\n * BC7 volume has to be decoded on the CPU and uploaded with `texImage3D`.\n * Carbon does not do this - it hands D3D11 the blocks verbatim, volumes\n * included (`trinity/trinity/Tr2ImageIOHelpers.cpp:48-88`) - so this is a\n * platform-forced divergence rather than a design choice.\n *\n * @param {Uint8Array} bytes - the slice's block data, and nothing else\n * @param {Object} values\n * @param {String} values.pixelFormat - e.g. \"bc7-rgba-unorm\"\n * @param {Number} values.width\n * @param {Number} values.height\n * @param {Number} [values.rowPitch] - bytes per block row; derived when absent\n * @returns {Uint8Array} width * height * 4, row-major, top-left origin\n */\n static decodeBlockSlice(bytes, values = {})\n {\n const { pixelFormat, width, height } = values;\n\n if (!canDecodeDdsBlockFormat(pixelFormat))\n {\n throw new Error(`CjsDdsFormat.decodeBlockSlice: \"${pixelFormat}\" is not a block-compressed format`);\n }\n\n const blockBytes = /^bc(1|4)/u.test(pixelFormat) ? 8 : 16;\n const rowPitch = values.rowPitch ?? Math.max(1, Math.ceil(width / 4)) * blockBytes;\n\n return decodeDdsSlice(bytes, { width, height, pixelFormat }, { rowPitch });\n }\n\n /**\n * Whether `decodeBlockSlice` can decode a pixel format\n * @param {String} pixelFormat\n * @returns {Boolean}\n */\n static canDecodeBlockSlice(pixelFormat)\n {\n return canDecodeDdsBlockFormat(pixelFormat);\n }\n\n static Output = Object.freeze({\n IMAGE: OUTPUT_IMAGE,\n TEXTURE: OUTPUT_TEXTURE,\n RGBA: OUTPUT_RGBA,\n RAW: OUTPUT_RAW,\n JSON: OUTPUT_JSON\n });\n static OUTPUT_DDS_JSON = \"ddsJson\";\n static id = \"dds\";\n static mediaTypes = Object.freeze([ \"texture\", \"image\" ]);\n static outputs = CjsFormat.defineOutputs({\n texture: { probes: [ \"texture\", \"compressed\" ] },\n image: { decoded: true, probes: [ \"image\", \"rgba\" ] },\n rgba: { decoded: true },\n ddsJson: { role: \"debug\", probes: [ \"ddsJson\", \"raw\" ] },\n raw: { role: \"debug\", default: true, passthrough: true }\n });\n static extensions = Object.freeze([ \".dds\" ]);\n}\n\nexport default CjsDdsFormat;\n"],"names":["FORMAT_NAME","CjsDdsFormat","CjsFormat","DEFAULT_VALUES","constructor","options","SetValues","normalizeValues","inputType","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","probeSupport","probeSupportWithValues","toJSON","isDDS","asUint8Array","decodeBlockSlice","bytes","values","pixelFormat","width","height","canDecodeDdsBlockFormat","Error","blockBytes","test","rowPitch","Math","max","ceil","decodeDdsSlice","canDecodeBlockSlice","Output","Object","freeze","IMAGE","OUTPUT_IMAGE","TEXTURE","OUTPUT_TEXTURE","RGBA","OUTPUT_RGBA","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","OUTPUT_DDS_JSON","id","mediaTypes","outputs","defineOutputs","texture","probes","image","decoded","rgba","ddsJson","role","raw","default","passthrough","extensions"],"mappings":"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"}
1
+ {"version":3,"file":"CjsDdsFormat.js","sources":["../../../../../src/resource/formats/dds/CjsDdsFormat.js"],"sourcesContent":["import { asUint8Array } from \"#utils/bytes\";\nimport { CjsFormat } from \"../../format/CjsFormat.js\";\nimport { CjsImageFormat } from \"../../format/CjsImageFormat.js\";\nimport { BitmapDimensions, Cutout, ImageIOResult } from \"#imageio\";\nimport { PixelFormat, PixelFormatFromCanonical, TextureType } from \"#consts/render-context\";\nimport {\n DEFAULT_VALUES,\n canDecodeDdsBlockFormat,\n decodeDdsSlice,\n OUTPUT_IMAGE,\n OUTPUT_JSON,\n OUTPUT_RAW,\n OUTPUT_RGBA,\n OUTPUT_TEXTURE,\n convertL8A8ToBgra,\n expand24To32,\n inspectBytes,\n inspectWithValues,\n isDDS,\n probeSupportWithValues,\n normalizeValues,\n readWithValues,\n toJsonValue\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsDdsFormat\";\n\n/**\n * The legacy (non-DX10) DDS formats this format's parser names with a DDS-only\n * string, mapped to Carbon's PixelFormat as Tr2DdsHandler's s_ddsFormats does\n * (imageio/Tr2DdsHandler.cpp:190-226). Everything else maps through\n * PixelFormatFromCanonical.\n */\nconst LEGACY_PIXEL_FORMATS = {\n \"bgr8unorm\": PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM,\n \"bgrx8unorm\": PixelFormat.PIXEL_FORMAT_B8G8R8X8_UNORM,\n \"rgbx8unorm\": PixelFormat.PIXEL_FORMAT_R8G8B8A8_UNORM,\n \"l8unorm\": PixelFormat.PIXEL_FORMAT_R8_UNORM,\n \"l8a8unorm\": PixelFormat.PIXEL_FORMAT_R8G8_UNORM,\n \"a8unorm\": PixelFormat.PIXEL_FORMAT_A8_UNORM,\n \"rgb32float\": PixelFormat.PIXEL_FORMAT_R32G32B32_FLOAT\n};\n\n/**\n * DDS texture format profile that inspects header metadata, probes output\n * support, and reads DDS bytes into raw, GPU-free texture, image, or\n * software-decoded RGBA and float payloads (BC1-BC5, BC7, and BC6H\n * included).\n */\nexport class CjsDdsFormat extends CjsImageFormat\n{\n _values = DEFAULT_VALUES;\n\n /**\n * Create a reusable DDS format profile.\n *\n * @param {object} [options] Default read/inspect options.\n */\n constructor(options = {})\n {\n super();\n this.SetValues(options);\n }\n\n /**\n * Merge options into this profile.\n *\n * @param {object} [options] Values to merge.\n * @returns {CjsDdsFormat} This format profile.\n */\n SetValues(options = {})\n {\n this._values = normalizeValues(this._values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n return this;\n }\n\n /**\n * Get normalized profile values with optional per-call overrides.\n *\n * @param {object} [options] Per-call values.\n * @returns {object} Normalized read values.\n */\n GetValues(options = {})\n {\n return normalizeValues(this._values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n }\n\n /**\n * Read DDS bytes with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n Read(input, options = {})\n {\n return readWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Read DDS bytes asynchronously with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n async ReadAsync(input, options = {})\n {\n return this.Read(input, options);\n }\n\n /**\n * Inspect DDS bytes without decoding texture data.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} DDS header metadata.\n */\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * One-shot DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static read(input, options = {})\n {\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot asynchronous DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static async readAsync(input, options = {})\n {\n return CjsDdsFormat.read(input, options);\n }\n\n /**\n * One-shot DDS inspection.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Inspect options.\n * @returns {object} DDS header metadata.\n */\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot DDS support probe.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Support/probe report.\n */\n static probeSupport(input, options = {})\n {\n return probeSupportWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Test whether bytes look like a DDS file.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate DDS bytes.\n * @returns {boolean} True when the DDS header is present and sized correctly.\n */\n static isDDS(input)\n {\n try\n {\n return isDDS(asUint8Array(input, \"Image input\"));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Fill a HostBitmap from DDS bytes: Carbon's `Dds::ReadImage`\n * (imageio/Tr2DdsHandler.cpp:922-958), read through this format's own\n * header parser rather than a second one, so it covers every DDS variant the\n * parser does - more than Carbon's handler table.\n *\n * Kept from Carbon: mip skipping from `LoadParameters` (not for cubes,\n * DoReadHeader :484-515), 24-bit RGB expanded to 32-bit BGRX with X = 0\n * (`Convert24BitTo32Bit`, :774-795), and A8L8 read as R8G8 then converted\n * to BGRA (:863-868). The pixel data is copied as it lies: the file order is\n * the HostBitmap layout.\n *\n * adapted: a cube ARRAY loads whole (arraySize = 6 x cubes); Carbon's\n * CopyHeaderValuesToMembers always makes one cube (:447-449). Not yet\n * ported: the CCP-META trailer; metadata gets its default cutout only.\n *\n * @param {Uint8Array|ArrayBuffer} input DDS bytes.\n * @param {import(\"#imageio\").LoadParameters} loadParameters Load parameters.\n * @param {object} bitmap Destination HostBitmap; only its methods are used.\n * @param {import(\"#imageio\").Metadata|null} [metadata] Optional Metadata out.\n * @returns {ImageIOResult} The result.\n */\n static readImageNative(input, loadParameters, bitmap, metadata = null)\n {\n const Code = ImageIOResult.Code;\n const bytes = asUint8Array(input, \"Image input\");\n\n let meta;\n try\n {\n meta = inspectBytes(bytes);\n }\n catch (error)\n {\n return new ImageIOResult(Code.INVALID_HEADER, error.message);\n }\n\n if (meta.sourceFormat !== \"dds\") return new ImageIOResult(Code.INVALID_HEADER);\n\n const format = meta.hasDx10\n ? meta.dxgiFormat\n : LEGACY_PIXEL_FORMATS[meta.pixelFormat] ?? PixelFormatFromCanonical[meta.pixelFormat] ?? PixelFormat.PIXEL_FORMAT_UNKNOWN;\n\n if (format === PixelFormat.PIXEL_FORMAT_UNKNOWN)\n {\n return new ImageIOResult(Code.HEADER_NOT_SUPPORTED, `unsupported DDS format ${meta.textureFormat}`);\n }\n\n const isRgb24 = meta.pixelFormat === \"bgr8unorm\";\n const description = {\n type: meta.isCube ? TextureType.TEX_TYPE_CUBE : (meta.isVolume ? TextureType.TEX_TYPE_3D : TextureType.TEX_TYPE_2D),\n format,\n width: meta.width,\n height: meta.height,\n depth: meta.isVolume ? Math.max(meta.depth, 1) : 1,\n mipCount: meta.mipCount,\n arraySize: meta.isCube ? 6 * Math.max(meta.arraySize, 1) : Math.max(meta.arraySize, 1)\n };\n\n let skipBytes = 0;\n\n if (!meta.isCube)\n {\n const full = new BitmapDimensions(description);\n const range = loadParameters.GetMipLevelRange(meta.width, meta.height, meta.hasMipMaps ? meta.mipCount : 0);\n\n if (range.skipCount)\n {\n for (let i = 0; i < range.skipCount; ++i)\n {\n skipBytes += isRgb24\n ? full.GetMipWidth(i) * full.GetMipHeight(i) * full.GetMipDepth(i) * 3\n : full.GetMipSize(i);\n }\n\n description.mipCount = range.mipCount;\n description.width = meta.width >>> range.skipCount;\n description.height = meta.height >>> range.skipCount;\n description.depth = Math.max(1, description.depth >>> range.skipCount);\n }\n }\n\n if (metadata) metadata.cutout = new Cutout();\n\n if (!bitmap.CreateFromBitmapDimensions(new BitmapDimensions(description)))\n {\n return new ImageIOResult(Code.ERROR_CREATING_BITMAP);\n }\n\n const dst = bitmap.GetRawData();\n const elementSize = bitmap.GetArrayElementSize();\n const sourceElementSize = isRgb24 ? Math.floor(elementSize / 4) * 3 : elementSize;\n let cursor = meta.dataOffset;\n\n for (let element = 0; element < bitmap.GetArraySize(); ++element)\n {\n cursor += skipBytes;\n const source = bytes.subarray(cursor, Math.min(cursor + sourceElementSize, bytes.length));\n\n if (isRgb24)\n {\n dst.set(CjsDdsFormat.expand24To32(source), element * elementSize);\n }\n else\n {\n // quirk: a short file leaves a zeroed tail rather than failing,\n // as a CCP stream's partial Read does.\n dst.set(source, element * elementSize);\n }\n\n cursor += sourceElementSize;\n }\n\n if (meta.pixelFormat === \"l8a8unorm\" && !bitmap.ConvertFormat(PixelFormat.PIXEL_FORMAT_B8G8R8A8_UNORM))\n {\n bitmap.Destroy();\n return new ImageIOResult(Code.ERROR_CONVERTING_FORMAT);\n }\n\n return new ImageIOResult(Code.OK);\n }\n\n /**\n * Carbon's 24-bit clean-up: BGR -> BGRX, X = 0 (Tr2DdsHandler.cpp:774-795).\n * Also available on the texture output as `read(bytes, { emit: \"texture\", expandLegacy: true })`.\n *\n * @param {Uint8Array} source 24-bit pixels.\n * @returns {Uint8Array} 32-bit pixels.\n */\n static expand24To32(source)\n {\n return expand24To32(source);\n }\n\n /**\n * Carbon's A8L8 clean-up: -> BGRA with B = G = R = L (Tr2DdsHandler.cpp:863-868).\n * Also available on the texture output as `read(bytes, { emit: \"texture\", expandLegacy: true })`.\n *\n * @param {Uint8Array} source L8A8 pixels.\n * @returns {Uint8Array} BGRA pixels.\n */\n static convertL8A8ToBgra(source)\n {\n return convertL8A8ToBgra(source);\n }\n\n /**\n * Decodes one block-compressed 2D slice to RGBA8.\n *\n * The whole-file readers answer \"give me this image\"; a volume texture asks\n * a different question - \"give me slice 7 of mip 2\" - and no amount of\n * reading a file down to one subresource expresses it. This is that seam,\n * and it exists because WebGL cannot take the block data as it is:\n * `EXT_texture_compression_bptc` grants `compressedTexImage2D` only, so a\n * BC7 volume has to be decoded on the CPU and uploaded with `texImage3D`.\n * Carbon does not do this - it hands D3D11 the blocks verbatim, volumes\n * included (`trinity/trinity/Tr2ImageIOHelpers.cpp:48-88`) - so this is a\n * platform-forced divergence rather than a design choice.\n *\n * @param {Uint8Array} bytes - the slice's block data, and nothing else\n * @param {Object} values\n * @param {String} values.pixelFormat - e.g. \"bc7-rgba-unorm\"\n * @param {Number} values.width\n * @param {Number} values.height\n * @param {Number} [values.rowPitch] - bytes per block row; derived when absent\n * @returns {Uint8Array} width * height * 4, row-major, top-left origin\n */\n static decodeBlockSlice(bytes, values = {})\n {\n const { pixelFormat, width, height } = values;\n\n if (!canDecodeDdsBlockFormat(pixelFormat))\n {\n throw new Error(`CjsDdsFormat.decodeBlockSlice: \"${pixelFormat}\" is not a block-compressed format`);\n }\n\n const blockBytes = /^bc(1|4)/u.test(pixelFormat) ? 8 : 16;\n const rowPitch = values.rowPitch ?? Math.max(1, Math.ceil(width / 4)) * blockBytes;\n\n return decodeDdsSlice(bytes, { width, height, pixelFormat }, { rowPitch });\n }\n\n /**\n * Whether `decodeBlockSlice` can decode a pixel format\n * @param {String} pixelFormat\n * @returns {Boolean}\n */\n static canDecodeBlockSlice(pixelFormat)\n {\n return canDecodeDdsBlockFormat(pixelFormat);\n }\n\n static id = \"CjsDdsFormat\";\n static mediaTypes = [ \"texture\", \"image\" ];\n static outputs = CjsFormat.defineOutputs({\n texture: { probes: [ \"texture\", \"compressed\" ] },\n image: { decoded: true, probes: [ \"image\", \"rgba\" ] },\n rgba: { decoded: true },\n ddsJson: { role: \"debug\", probes: [ \"ddsJson\", \"raw\" ] },\n raw: { role: \"debug\", default: true, passthrough: true }\n });\n static extensions = [ \".dds\" ];\n}\n\nexport default CjsDdsFormat;\n"],"names":["FORMAT_NAME","LEGACY_PIXEL_FORMATS","PixelFormat","PIXEL_FORMAT_B8G8R8X8_UNORM","PIXEL_FORMAT_R8G8B8A8_UNORM","PIXEL_FORMAT_R8_UNORM","PIXEL_FORMAT_R8G8_UNORM","PIXEL_FORMAT_A8_UNORM","PIXEL_FORMAT_R32G32B32_FLOAT","CjsDdsFormat","CjsImageFormat","_values","DEFAULT_VALUES","constructor","options","SetValues","normalizeValues","inputType","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","probeSupport","probeSupportWithValues","toJSON","isDDS","asUint8Array","readImageNative","loadParameters","bitmap","metadata","Code","ImageIOResult","bytes","meta","inspectBytes","error","INVALID_HEADER","message","sourceFormat","format","hasDx10","dxgiFormat","pixelFormat","PixelFormatFromCanonical","PIXEL_FORMAT_UNKNOWN","HEADER_NOT_SUPPORTED","textureFormat","isRgb24","description","type","isCube","TextureType","TEX_TYPE_CUBE","isVolume","TEX_TYPE_3D","TEX_TYPE_2D","width","height","depth","Math","max","mipCount","arraySize","skipBytes","full","BitmapDimensions","range","GetMipLevelRange","hasMipMaps","skipCount","i","GetMipWidth","GetMipHeight","GetMipDepth","GetMipSize","cutout","Cutout","CreateFromBitmapDimensions","ERROR_CREATING_BITMAP","dst","GetRawData","elementSize","GetArrayElementSize","sourceElementSize","floor","cursor","dataOffset","element","GetArraySize","source","subarray","min","length","set","expand24To32","ConvertFormat","PIXEL_FORMAT_B8G8R8A8_UNORM","Destroy","ERROR_CONVERTING_FORMAT","OK","convertL8A8ToBgra","decodeBlockSlice","values","canDecodeDdsBlockFormat","Error","blockBytes","test","rowPitch","ceil","decodeDdsSlice","canDecodeBlockSlice","id","mediaTypes","outputs","CjsFormat","defineOutputs","texture","probes","image","decoded","rgba","ddsJson","role","raw","default","passthrough","extensions"],"mappings":"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"}