@carbonenginejs/runtime-resource 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/NOTICE +6 -0
  2. package/dist/CjsResMan.js +1374 -1318
  3. package/dist/CjsResMan.js.map +1 -1
  4. package/dist/format/CjsFormat.js +393 -164
  5. package/dist/format/CjsFormat.js.map +1 -1
  6. package/dist/format/CjsFormatStore.js +315 -0
  7. package/dist/format/CjsFormatStore.js.map +1 -0
  8. package/dist/format/CjsResourceProbe.js +66 -234
  9. package/dist/format/CjsResourceProbe.js.map +1 -1
  10. package/dist/format/payloadContract.js +47 -6
  11. package/dist/format/payloadContract.js.map +1 -1
  12. package/dist/formats/black/CjsBlackFormat.js +23 -6
  13. package/dist/formats/black/CjsBlackFormat.js.map +1 -1
  14. package/dist/formats/bnk/CjsBnkFormat.js +122 -120
  15. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  16. package/dist/formats/bnk/core/helpers.js +5 -15
  17. package/dist/formats/bnk/core/helpers.js.map +1 -1
  18. package/dist/formats/cmf/CjsCmfFormat.js +31 -14
  19. package/dist/formats/cmf/CjsCmfFormat.js.map +1 -1
  20. package/dist/formats/dds/CjsDdsFormat.js +29 -19
  21. package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
  22. package/dist/formats/dds/core/helpers.js +4 -5
  23. package/dist/formats/dds/core/helpers.js.map +1 -1
  24. package/dist/formats/dxbc/CjsDxbcFormat.js +15 -13
  25. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
  26. package/dist/formats/fbx/CjsFbxFormat.js +27 -19
  27. package/dist/formats/fbx/CjsFbxFormat.js.map +1 -1
  28. package/dist/formats/fbx/core/helpers.js +4 -4
  29. package/dist/formats/fbx/core/helpers.js.map +1 -1
  30. package/dist/formats/flac/CjsFlacFormat.js +19 -17
  31. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  32. package/dist/formats/flac/core/helpers.js +5 -11
  33. package/dist/formats/flac/core/helpers.js.map +1 -1
  34. package/dist/formats/fsd/32/CjsFsd32Format.js +55 -0
  35. package/dist/formats/fsd/32/CjsFsd32Format.js.map +1 -0
  36. package/dist/formats/fsd/32/index.js +2 -0
  37. package/dist/formats/fsd/32/index.js.map +1 -0
  38. package/dist/formats/fsd/64/CjsFsd64Format.js +119 -0
  39. package/dist/formats/fsd/64/CjsFsd64Format.js.map +1 -0
  40. package/dist/formats/fsd/64/core/CjsFsd64Binary.js +393 -0
  41. package/dist/formats/fsd/64/core/CjsFsd64Binary.js.map +1 -0
  42. package/dist/formats/fsd/64/core/CjsFsd64Reader.js +138 -0
  43. package/dist/formats/fsd/64/core/CjsFsd64Reader.js.map +1 -0
  44. package/dist/formats/fsd/64/core/CjsFsd64SchemaDecoder.js +389 -0
  45. package/dist/formats/fsd/64/core/CjsFsd64SchemaDecoder.js.map +1 -0
  46. package/dist/formats/fsd/64/core/CjsFsd64SchemaReader.js +43 -0
  47. package/dist/formats/fsd/64/core/CjsFsd64SchemaReader.js.map +1 -0
  48. package/dist/formats/fsd/64/core/fsd64Records.js +60 -0
  49. package/dist/formats/fsd/64/core/fsd64Records.js.map +1 -0
  50. package/dist/formats/fsd/64/index.js +7 -0
  51. package/dist/formats/fsd/64/index.js.map +1 -0
  52. package/dist/formats/fsd/64/readers/CjsFsd64ReaderSetCharacterStaticData.js +33 -0
  53. package/dist/formats/fsd/64/readers/CjsFsd64ReaderSetCharacterStaticData.js.map +1 -0
  54. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentTypes.js +35 -0
  55. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentTypes.js.map +1 -0
  56. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentsInSpace.js +50 -0
  57. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentsInSpace.js.map +1 -0
  58. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAncestries.js +75 -0
  59. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAncestries.js.map +1 -0
  60. package/dist/formats/fsd/64/readers/CjsFsd64SchemaArchetypes.js +57 -0
  61. package/dist/formats/fsd/64/readers/CjsFsd64SchemaArchetypes.js.map +1 -0
  62. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAudioMetadata.js +201 -0
  63. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAudioMetadata.js.map +1 -0
  64. package/dist/formats/fsd/64/readers/CjsFsd64SchemaBloodlines.js +73 -0
  65. package/dist/formats/fsd/64/readers/CjsFsd64SchemaBloodlines.js.map +1 -0
  66. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCategories.js +53 -0
  67. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCategories.js.map +1 -0
  68. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterAvatarBehaviors.js +44 -0
  69. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterAvatarBehaviors.js.map +1 -0
  70. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorLocations.js +38 -0
  71. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorLocations.js.map +1 -0
  72. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorNames.js +34 -0
  73. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorNames.js.map +1 -0
  74. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterModifierLocations.js +34 -0
  75. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterModifierLocations.js.map +1 -0
  76. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterPortraitResources.js +44 -0
  77. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterPortraitResources.js.map +1 -0
  78. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterResources.js +81 -0
  79. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterResources.js.map +1 -0
  80. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterSculptingLocations.js +34 -0
  81. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterSculptingLocations.js.map +1 -0
  82. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCompressibleTypes.js +41 -0
  83. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCompressibleTypes.js.map +1 -0
  84. package/dist/formats/fsd/64/readers/CjsFsd64SchemaContrabandTypes.js +63 -0
  85. package/dist/formats/fsd/64/readers/CjsFsd64SchemaContrabandTypes.js.map +1 -0
  86. package/dist/formats/fsd/64/readers/CjsFsd64SchemaControlTowerResources.js +76 -0
  87. package/dist/formats/fsd/64/readers/CjsFsd64SchemaControlTowerResources.js.map +1 -0
  88. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationActivities.js +38 -0
  89. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationActivities.js.map +1 -0
  90. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoleGroups.js +74 -0
  91. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoleGroups.js.map +1 -0
  92. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoles.js +59 -0
  93. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoles.js.map +1 -0
  94. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributeCategories.js +46 -0
  95. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributeCategories.js.map +1 -0
  96. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributes.js +133 -0
  97. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributes.js.map +1 -0
  98. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaEffects.js +236 -0
  99. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaEffects.js.map +1 -0
  100. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaUnits.js +60 -0
  101. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaUnits.js.map +1 -0
  102. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDynamicItemAttributes.js +95 -0
  103. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDynamicItemAttributes.js.map +1 -0
  104. package/dist/formats/fsd/64/readers/CjsFsd64SchemaEpicArcs.js +106 -0
  105. package/dist/formats/fsd/64/readers/CjsFsd64SchemaEpicArcs.js.map +1 -0
  106. package/dist/formats/fsd/64/readers/CjsFsd64SchemaExpertSystems.js +86 -0
  107. package/dist/formats/fsd/64/readers/CjsFsd64SchemaExpertSystems.js.map +1 -0
  108. package/dist/formats/fsd/64/readers/CjsFsd64SchemaFactions.js +117 -0
  109. package/dist/formats/fsd/64/readers/CjsFsd64SchemaFactions.js.map +1 -0
  110. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicIds.js +70 -0
  111. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicIds.js.map +1 -0
  112. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicMaterialSets.js +173 -0
  113. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicMaterialSets.js.map +1 -0
  114. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGroups.js +77 -0
  115. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGroups.js.map +1 -0
  116. package/dist/formats/fsd/64/readers/CjsFsd64SchemaIcons.js +62 -0
  117. package/dist/formats/fsd/64/readers/CjsFsd64SchemaIcons.js.map +1 -0
  118. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMarketGroups.js +63 -0
  119. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMarketGroups.js.map +1 -0
  120. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMetaGroups.js +86 -0
  121. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMetaGroups.js.map +1 -0
  122. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporationDivisions.js +72 -0
  123. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporationDivisions.js.map +1 -0
  124. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporations.js +326 -0
  125. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporations.js.map +1 -0
  126. package/dist/formats/fsd/64/readers/CjsFsd64SchemaPaperdolls.js +279 -0
  127. package/dist/formats/fsd/64/readers/CjsFsd64SchemaPaperdolls.js.map +1 -0
  128. package/dist/formats/fsd/64/readers/CjsFsd64SchemaRaces.js +64 -0
  129. package/dist/formats/fsd/64/readers/CjsFsd64SchemaRaces.js.map +1 -0
  130. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchoolMap.js +40 -0
  131. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchoolMap.js.map +1 -0
  132. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchools.js +113 -0
  133. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchools.js.map +1 -0
  134. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkillPlans.js +130 -0
  135. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkillPlans.js.map +1 -0
  136. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentCategories.js +38 -0
  137. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentCategories.js.map +1 -0
  138. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentPointValues.js +45 -0
  139. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentPointValues.js.map +1 -0
  140. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentRarities.js +44 -0
  141. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentRarities.js.map +1 -0
  142. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponents.js +163 -0
  143. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponents.js.map +1 -0
  144. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotCategories.js +37 -0
  145. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotCategories.js.map +1 -0
  146. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotConfigurations.js +77 -0
  147. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotConfigurations.js.map +1 -0
  148. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotNames.js +37 -0
  149. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotNames.js.map +1 -0
  150. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlots.js +74 -0
  151. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlots.js.map +1 -0
  152. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrTierThresholds.js +44 -0
  153. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrTierThresholds.js.map +1 -0
  154. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationOperations.js +120 -0
  155. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationOperations.js.map +1 -0
  156. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationServices.js +49 -0
  157. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationServices.js.map +1 -0
  158. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeDogma.js +73 -0
  159. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeDogma.js.map +1 -0
  160. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeLists.js +122 -0
  161. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeLists.js.map +1 -0
  162. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeMaterials.js +83 -0
  163. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeMaterials.js.map +1 -0
  164. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypes.js +194 -0
  165. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypes.js.map +1 -0
  166. package/dist/formats/fsd/64/readers/index.js +58 -0
  167. package/dist/formats/fsd/64/readers/index.js.map +1 -0
  168. package/dist/formats/fsd/CjsFsdFormat.js +62 -0
  169. package/dist/formats/fsd/CjsFsdFormat.js.map +1 -0
  170. package/dist/formats/fsd/index.js +9 -0
  171. package/dist/formats/fsd/index.js.map +1 -0
  172. package/dist/formats/gif/CjsGifFormat.js +26 -16
  173. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  174. package/dist/formats/gif/core/helpers.js +6 -18
  175. package/dist/formats/gif/core/helpers.js.map +1 -1
  176. package/dist/formats/gltf/CjsGltfFormat.js +25 -13
  177. package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
  178. package/dist/formats/gr2/CjsGr2Format.js +27 -6
  179. package/dist/formats/gr2/CjsGr2Format.js.map +1 -1
  180. package/dist/formats/hlsl/CjsHlslFormat.js +20 -16
  181. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
  182. package/dist/formats/hlsl/core/analysis.js +1 -1
  183. package/dist/formats/index.js +5 -0
  184. package/dist/formats/index.js.map +1 -1
  185. package/dist/formats/jpeg/CjsJpegFormat.js +26 -19
  186. package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
  187. package/dist/formats/jpeg/core/helpers.js +6 -15
  188. package/dist/formats/jpeg/core/helpers.js.map +1 -1
  189. package/dist/formats/jpeg/core/jpeg.js +0 -3
  190. package/dist/formats/jpeg/core/jpeg.js.map +1 -1
  191. package/dist/formats/mp3/CjsMp3Format.js +19 -19
  192. package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
  193. package/dist/formats/mp3/core/helpers.js +5 -11
  194. package/dist/formats/mp3/core/helpers.js.map +1 -1
  195. package/dist/formats/mp4/CjsMp4Format.js +20 -19
  196. package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
  197. package/dist/formats/mp4/core/helpers.js +6 -15
  198. package/dist/formats/mp4/core/helpers.js.map +1 -1
  199. package/dist/formats/obj/CjsObjFormat.js +25 -12
  200. package/dist/formats/obj/CjsObjFormat.js.map +1 -1
  201. package/dist/formats/ogg/CjsOggFormat.js +26 -17
  202. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  203. package/dist/formats/ogg/core/helpers.js +5 -16
  204. package/dist/formats/ogg/core/helpers.js.map +1 -1
  205. package/dist/formats/pickle/CjsPickleFormat.js +64 -5
  206. package/dist/formats/pickle/CjsPickleFormat.js.map +1 -1
  207. package/dist/formats/png/CjsPngFormat.js +28 -19
  208. package/dist/formats/png/CjsPngFormat.js.map +1 -1
  209. package/dist/formats/png/core/helpers.js +5 -14
  210. package/dist/formats/png/core/helpers.js.map +1 -1
  211. package/dist/formats/red/CjsRedFormat.js +19 -5
  212. package/dist/formats/red/CjsRedFormat.js.map +1 -1
  213. package/dist/formats/schemabound/CjsSchemaBoundFormat.js +48 -38
  214. package/dist/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -1
  215. package/dist/formats/sqlite/CjsSqliteFormat.js +49 -41
  216. package/dist/formats/sqlite/CjsSqliteFormat.js.map +1 -1
  217. package/dist/formats/static/CjsStaticFormat.js +15 -57
  218. package/dist/formats/static/CjsStaticFormat.js.map +1 -1
  219. package/dist/formats/static/staticContainers.js +6 -6
  220. package/dist/formats/static/staticContainers.js.map +1 -1
  221. package/dist/formats/stl/CjsStlFormat.js +25 -12
  222. package/dist/formats/stl/CjsStlFormat.js.map +1 -1
  223. package/dist/formats/tga/CjsTgaFormat.js +26 -19
  224. package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
  225. package/dist/formats/tga/core/helpers.js +7 -22
  226. package/dist/formats/tga/core/helpers.js.map +1 -1
  227. package/dist/formats/wav/CjsWavFormat.js +26 -19
  228. package/dist/formats/wav/CjsWavFormat.js.map +1 -1
  229. package/dist/formats/wav/core/helpers.js +7 -16
  230. package/dist/formats/wav/core/helpers.js.map +1 -1
  231. package/dist/formats/webgl/CjsWebglFormat.js +11 -13
  232. package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
  233. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +31 -1
  234. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  235. package/dist/formats/webgl/core/readGlslEffectContainer.js +8 -8
  236. package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
  237. package/dist/formats/webgpu/CjsWebgpuFormat.js +11 -5
  238. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  239. package/dist/formats/webm/CjsWebmFormat.js +20 -19
  240. package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
  241. package/dist/formats/webm/core/helpers.js +6 -15
  242. package/dist/formats/webm/core/helpers.js.map +1 -1
  243. package/dist/formats/webp/CjsWebpFormat.js +19 -17
  244. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  245. package/dist/formats/webp/core/helpers.js +5 -11
  246. package/dist/formats/webp/core/helpers.js.map +1 -1
  247. package/dist/formats/wem/CjsWemFormat.js +128 -141
  248. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  249. package/dist/formats/wem/core/helpers.js +1 -114
  250. package/dist/formats/wem/core/helpers.js.map +1 -1
  251. package/dist/formats/wem/core/{resolve.js → probeCodecSupport.js} +11 -18
  252. package/dist/formats/wem/core/probeCodecSupport.js.map +1 -0
  253. package/dist/formats/yaml/CjsYamlFormat.js +20 -5
  254. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  255. package/dist/generated/index.js +2 -0
  256. package/dist/generated/index.js.map +1 -0
  257. package/dist/generated/resources/Tr2RaycastGeometryRes.js +34 -0
  258. package/dist/generated/resources/Tr2RaycastGeometryRes.js.map +1 -0
  259. package/dist/generated/resources/index.js +2 -0
  260. package/dist/generated/resources/index.js.map +1 -0
  261. package/dist/index.js +3 -1
  262. package/dist/index.js.map +1 -1
  263. package/dist/resource/CjsResource.js +134 -0
  264. package/dist/resource/CjsResource.js.map +1 -1
  265. package/dist/resource/ResourceRequirement.js +42 -0
  266. package/dist/resource/ResourceRequirement.js.map +1 -0
  267. package/dist/resource/Tr2LightProfileRes.js +2 -1
  268. package/dist/resource/Tr2LightProfileRes.js.map +1 -1
  269. package/dist/resource/geometry/TriGeometryRes.js +34 -7
  270. package/dist/resource/geometry/TriGeometryRes.js.map +1 -1
  271. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +184 -7
  272. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js.map +1 -1
  273. package/dist/resource/geometry/granny/TriGrannyRes.js +20 -8
  274. package/dist/resource/geometry/granny/TriGrannyRes.js.map +1 -1
  275. package/dist/resource/index.js +1 -0
  276. package/dist/resource/index.js.map +1 -1
  277. package/dist/resource/resourceBoundary.js +24 -1
  278. package/dist/resource/resourceBoundary.js.map +1 -1
  279. package/dist/resource/shader/Tr2EffectRes.js +2 -1
  280. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  281. package/dist/resource/texture/CjsTextureArrayRes.js +2 -1
  282. package/dist/resource/texture/CjsTextureArrayRes.js.map +1 -1
  283. package/dist/resource/texture/Tr2ImageRes.js +2 -1
  284. package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
  285. package/dist/resource/texture/TriTextureRes.js +40 -2
  286. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  287. package/docs/architecture.md +121 -116
  288. package/docs/concepts/format-capabilities.md +90 -0
  289. package/docs/formats/README.md +14 -6
  290. package/docs/formats/fsd.md +104 -0
  291. package/docs/formats/gr2.md +1 -1
  292. package/docs/formats/hlsl/reference/api.md +6 -4
  293. package/docs/formats/provenance.md +18 -0
  294. package/docs/formats/schemabound.md +10 -4
  295. package/docs/formats/static.md +26 -26
  296. package/docs/formats/webgpu/reference/api.md +4 -3
  297. package/docs/reference/classes/core.md +22 -2
  298. package/docs/reference/classes/formats.md +643 -1
  299. package/docs/reference/classes/resources.md +463 -453
  300. package/docs/reference/queues.md +205 -194
  301. package/docs/roadmap.md +14 -18
  302. package/format-notices/fsd/LICENSE +21 -0
  303. package/format-notices/fsd/NOTICE +11 -0
  304. package/package.json +70 -64
  305. package/dist/formats/wem/core/resolve.js.map +0 -1
  306. package/docs/concepts/format-type-resolution.md +0 -79
@@ -1 +1 @@
1
- {"version":3,"file":"TriGeometryRes.js","sources":["../../../../src/resource/geometry/TriGeometryRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/TriGeometryRes.h\r\n// Source: trinity/trinity/Resources/TriGeometryRes.cpp\r\n// Source: trinity/trinity/Resources/TriGeometryRes_Blue.cpp\r\nimport { CjsSchema, carbon, impl, io, type } from \"@carbonenginejs/runtime-utils/schema\";\r\nimport { box3 } from \"@carbonenginejs/runtime-utils/box3\";\r\nimport { triangleNormalTo } from \"@carbonenginejs/runtime-utils/mesh\";\r\nimport { ray3 } from \"@carbonenginejs/runtime-utils/ray3\";\r\nimport { sph3 } from \"@carbonenginejs/runtime-utils/sph3\";\r\nimport { vec3 } from \"@carbonenginejs/runtime-utils/vec3\";\r\nimport { vec4 } from \"@carbonenginejs/runtime-utils/vec4\";\r\nimport { CjsResource } from \"../CjsResource.js\";\r\nimport {\r\n assertResourcePayloadArray,\r\n assertResourcePayloadObject,\r\n resourceBoundaryError,\r\n resourcePayloadError\r\n} from \"../resourceBoundary.js\";\r\n\r\n/**\r\n * Resource record that owns geometry payload facts (meshes, optional\r\n * skeletons and animations) and LOD-force metadata, while engine packages\r\n * decide device buffers, vertex declarations, and draw-time state.\r\n *\r\n * Geometry inspection composes the generic math supplied by runtime-utils\r\n * with resource-specific payload traversal.\r\n */\r\nexport class TriGeometryRes extends CjsResource\r\n{\r\n forceLod = false;\r\n forcedLodIndex = -1;\r\n name = \"\";\r\n\r\n /** Creates a TriGeometryRes with caller-provided initial state. */\r\n constructor(values = null)\r\n {\r\n super();\r\n this.SetValues(values || {}, {\r\n markDirty: false,\r\n skipUpdate: true,\r\n skipEvents: true\r\n });\r\n }\r\n\r\n /**\r\n * Attach a plain geometry payload.\r\n *\r\n * @param {object|null} payload\r\n * @param {object|null} options\r\n * @returns {TriGeometryRes}\r\n */\r\n SetPayload(payload = null, options = null)\r\n {\r\n if (payload === null)\r\n {\r\n super.SetPayload(null);\r\n return this;\r\n }\r\n assertResourcePayloadObject(\"TriGeometryRes\", payload);\r\n assertResourcePayloadArray(\"TriGeometryRes\", payload, \"meshes\");\r\n for (const field of [ \"skeletons\", \"animations\" ])\r\n {\r\n if (payload[field] !== undefined && !Array.isArray(payload[field]))\r\n {\r\n throw resourcePayloadError(\"TriGeometryRes\", \"Expected an array when provided.\", field);\r\n }\r\n }\r\n super.SetPayload(payload);\r\n this.SetValues(options || {});\r\n return this;\r\n }\r\n\r\n /**\r\n * Get mesh count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetMeshCount()\r\n {\r\n return this.GetPayload()?.meshes?.length || 0;\r\n }\r\n\r\n /**\r\n * Get animation count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetAnimationCount()\r\n {\r\n return this.GetPayload()?.animations?.length || 0;\r\n }\r\n\r\n /**\r\n * Get skeleton count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetSkeletonCount()\r\n {\r\n return this.GetPayload()?.skeletons?.length || 0;\r\n }\r\n\r\n /**\r\n * Get one resource-owned skeleton from the CPU geometry payload.\r\n *\r\n * @param {number} skeletonIndex\r\n * @returns {*}\r\n */\r\n GetSkeletonData(skeletonIndex = 0)\r\n {\r\n const index = Number(skeletonIndex);\r\n\r\n if (!Number.isInteger(index) || index < 0)\r\n {\r\n return null;\r\n }\r\n\r\n return this.GetPayload()?.skeletons?.[index] || null;\r\n }\r\n\r\n /**\r\n * Get mesh area count from a CPU geometry payload mesh.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {number}\r\n */\r\n GetMeshAreaCount(meshIndex = 0)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n return mesh?.areas?.length || 0;\r\n }\r\n\r\n // Carbon TriGeometryRes.cpp:294-319. Walks LODs from the LOWEST quality up\r\n // and takes the first whose authored maxScreenSize still covers the requested\r\n // size; a request larger than the best LOD falls back to LOD 0, which Carbon\r\n // comments explicitly. forceLod pins the index instead, clamped to the last\r\n // LOD.\r\n\r\n /**\r\n * The LOD index this mesh should be drawn at for a screen size, or -1 when the\r\n * mesh does not exist.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} screenSize\r\n * @returns {number}\r\n */\r\n GetLodIndexForScreenSize(meshIndex = 0, screenSize = Infinity)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n if (!mesh) return -1;\r\n\r\n // A decoder may flatten a single-LOD mesh, putting the areas on the mesh\r\n // itself; that mesh IS its own only LOD (see getMeshAreas).\r\n const lods = mesh.lods?.length ? mesh.lods : null;\r\n const lastLod = lods ? lods.length - 1 : 0;\r\n\r\n if (this.forceLod && this.forcedLodIndex >= 0)\r\n {\r\n return Math.min(this.forcedLodIndex, lastLod);\r\n }\r\n\r\n for (let index = lastLod; index >= 0; index--)\r\n {\r\n const maxScreenSize = (lods ? lods[index]?.maxScreenSize : mesh.maxScreenSize) ?? 0;\r\n if (maxScreenSize >= screenSize) return index;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n // Carbon TriGeometryRes.cpp:268-279. Carbon overloads this on float\r\n // screenSize versus int lodIndex; JavaScript cannot, so the index form is\r\n // GetMeshLodByIndex. Carbon indexes m_lods with the result unguarded, so a\r\n // mesh with an EMPTY lod list reads out of bounds there; this port returns\r\n // null (docs/research/carbon-known-defects.md).\r\n\r\n /**\r\n * The LOD data this mesh should be drawn at for a screen size, or null when\r\n * the mesh has no LODs.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} screenSize\r\n * @returns {object|null}\r\n */\r\n GetMeshLod(meshIndex = 0, screenSize = Infinity)\r\n {\r\n return this.GetMeshLodByIndex(meshIndex, this.GetLodIndexForScreenSize(meshIndex, screenSize));\r\n }\r\n\r\n /**\r\n * The LOD data at an explicit index, or null when the mesh or index does not\r\n * exist (Carbon TriGeometryRes.cpp:281-292).\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} lodIndex\r\n * @returns {object|null}\r\n */\r\n GetMeshLodByIndex(meshIndex = 0, lodIndex = 0)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n if (!mesh || lodIndex < 0) return null;\r\n\r\n if (mesh.lods?.length)\r\n {\r\n return lodIndex < mesh.lods.length ? mesh.lods[lodIndex] : null;\r\n }\r\n\r\n return lodIndex === 0 && mesh.areas ? mesh : null;\r\n }\r\n\r\n /**\r\n * Get mesh name from a CPU geometry payload.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {string}\r\n */\r\n GetMeshName(meshIndex = 0)\r\n {\r\n return this.GetPayload()?.meshes?.[meshIndex]?.name || \"\";\r\n }\r\n\r\n /**\r\n * Get mesh area name from a CPU geometry payload.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} areaIndex\r\n * @returns {string}\r\n */\r\n GetMeshAreaName(meshIndex = 0, areaIndex = 0)\r\n {\r\n return this.GetPayload()?.meshes?.[meshIndex]?.areas?.[areaIndex]?.name || \"\";\r\n }\r\n\r\n /**\r\n * Get area bounding box from geometry payload data.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} areaIndex\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n GetAreaBoundingBox(meshIndex = 0, areaIndex = 0, outMin = null, outMax = null)\r\n {\r\n const area = TriGeometryRes.getMeshAreas(this.GetPayload()?.meshes?.[meshIndex])?.[areaIndex];\r\n const bounds = TriGeometryRes.getBounds(area);\r\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\r\n }\r\n\r\n /**\r\n * Get mesh bounding box from geometry payload data.\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n GetBoundingBox(meshIndex = 0, outMin = null, outMax = null)\r\n {\r\n const payload = this.GetPayload();\r\n const bounds = TriGeometryRes.getBounds(payload?.meshes?.[meshIndex])\r\n || TriGeometryRes.getBounds(payload);\r\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\r\n }\r\n\r\n /**\r\n * Get mesh bounding sphere from geometry payload data.\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|null} out\r\n * @returns {*|boolean}\r\n */\r\n GetBoundingSphere(meshIndex = 0, out = null)\r\n {\r\n const payload = this.GetPayload();\r\n const sphere = TriGeometryRes.getSphere(payload?.meshes?.[meshIndex])\r\n || TriGeometryRes.getSphere(payload);\r\n if (!out) return sphere;\r\n if (!sphere) return false;\r\n vec4.copy(out, sphere);\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculate a transformed bounding box from canonical CPU vertex data.\r\n *\r\n * Carbon stores the same matrix bytes as gl-matrix; transforming one point\r\n * therefore uses the ordinary column-vector index layout.\r\n *\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>} transform\r\n * @returns {{min: number[], max: number[]}|null}\r\n */\r\n CalculateBoundingBoxFromTransform(meshIndex = 0, transform = null)\r\n {\r\n if (!transform || transform.length < 16)\r\n {\r\n throw new TypeError(\"TriGeometryRes transform must contain 16 matrix elements.\");\r\n }\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n if (!mesh) return null;\r\n const positions = TriGeometryRes.getMeshPositions(mesh);\r\n const sourceBounds = TriGeometryRes.getBounds(mesh);\r\n if (!positions && !sourceBounds) return null;\r\n\r\n const\r\n bounds = box3.alloc(),\r\n point = vec3.alloc();\r\n try\r\n {\r\n if (!TriGeometryRes.setBoundsFromPositions(bounds, positions, point))\r\n {\r\n if (!sourceBounds) return null;\r\n box3.fromBounds(bounds, sourceBounds.min, sourceBounds.max);\r\n }\r\n box3.transformMat4(bounds, bounds, transform);\r\n return {\r\n min: [ bounds[0], bounds[1], bounds[2] ],\r\n max: [ bounds[3], bounds[4], bounds[5] ]\r\n };\r\n }\r\n finally\r\n {\r\n vec3.unalloc(point);\r\n box3.unalloc(bounds);\r\n }\r\n }\r\n\r\n /**\r\n * Recalculate bounding sphere data from canonical CPU vertex positions.\r\n *\r\n * @returns {boolean}\r\n */\r\n RecalculateBoundingSphere()\r\n {\r\n let updated = false;\r\n const\r\n sphere = sph3.alloc(),\r\n point = vec3.alloc();\r\n try\r\n {\r\n for (const mesh of this.GetPayload()?.meshes || [])\r\n {\r\n if (!TriGeometryRes.calculateMeshSphere(sphere, mesh, point)) continue;\r\n TriGeometryRes.setMeshSphere(mesh, sphere);\r\n updated = true;\r\n }\r\n return updated;\r\n }\r\n finally\r\n {\r\n vec3.unalloc(point);\r\n sph3.unalloc(sphere);\r\n }\r\n }\r\n\r\n /**\r\n * Reloading belongs to the resource manager because it owns source and\r\n * canonical replacement policy.\r\n *\r\n * @throws {Error}\r\n */\r\n Reload() {\r\n throw resourceBoundaryError(\r\n \"TriGeometryRes\",\r\n \"Reload\",\r\n \"Request a reload through CjsResMan so source reads and canonical replacement remain manager-owned.\"\r\n );\r\n }\r\n\r\n /**\r\n * Intersect a ray with canonical CPU triangle data.\r\n *\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @returns {object}\r\n */\r\n GetIntersectionPointNormalBone(position, direction)\r\n {\r\n return TriGeometryRes.intersectGeometry(\r\n this.GetPayload()?.meshes,\r\n position,\r\n direction,\r\n -1\r\n );\r\n }\r\n\r\n /**\r\n * Intersect a ray with one area index across canonical CPU meshes.\r\n *\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @param {number} areaIndex\r\n * @returns {object}\r\n */\r\n GetAreaIntersectionPointNormalBone(position, direction, areaIndex = -1)\r\n {\r\n if (!Number.isInteger(areaIndex) || areaIndex < -1)\r\n {\r\n throw new RangeError(\"TriGeometryRes area index must be -1 or a non-negative integer.\");\r\n }\r\n return TriGeometryRes.intersectGeometry(\r\n this.GetPayload()?.meshes,\r\n position,\r\n direction,\r\n areaIndex\r\n );\r\n }\r\n\r\n /**\r\n * Get vertex element descriptors for a mesh.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {Array<*>}\r\n */\r\n GetMeshVertexElements(meshIndex = 0)\r\n {\r\n // The CMF reader emits the element list as `decl`, matching the CMF struct\r\n // field; this accessor read only `vertexElements`, which no reader in this\r\n // package populates, so it returned an empty list for every real decoded\r\n // payload. Both names are accepted because the name is the producer's.\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n return mesh?.decl || mesh?.vertexElements || [];\r\n }\r\n\r\n /**\r\n * Saving belongs to the selected geometry format writer and destination.\r\n *\r\n * @throws {Error}\r\n */\r\n SaveMesh()\r\n {\r\n throw resourceBoundaryError(\r\n \"TriGeometryRes\",\r\n \"SaveMesh\",\r\n \"Use a geometry format writer with the resource payload and a caller-owned destination.\"\r\n );\r\n }\r\n\r\n static payload = \"geometry\";\r\n\r\n // Carbon TriGeometryRes.cpp:158-178, declared beside the class\r\n // (TriGeometryRes.h:202) because it reads LOD data rather than resource\r\n // state - which is why it is static here. It returns a PLAIN SUM and does not\r\n // multiply by three: the *3 belongs to the caller, so triangles-only is a\r\n // property of the mesh draw path rather than of the geometry layer.\r\n\r\n /**\r\n * The summed primitive count over `count` areas of a LOD starting at `index`,\r\n * with the run clamped to the area list as Carbon clamps it; zero when the\r\n * index is out of range, which callers treat as \"emit no draw\".\r\n *\r\n * @param {object|null} lod\r\n * @param {number} index\r\n * @param {number} count\r\n * @returns {number}\r\n */\r\n static getPrimitiveCount(lod, index, count)\r\n {\r\n const areas = lod?.areas ?? null;\r\n const areaCount = areas?.length ?? 0;\r\n\r\n if (!areaCount || index >= areaCount) return 0;\r\n\r\n const run = index + count > areaCount ? areaCount - index : count;\r\n\r\n let primitiveCount = 0;\r\n\r\n for (let offset = 0; offset < run; offset++)\r\n {\r\n primitiveCount += areas[index + offset]?.primitiveCount ?? 0;\r\n }\r\n\r\n return primitiveCount;\r\n }\r\n\r\n /**\r\n * Gets the canonical area list from a mesh or its first LOD.\r\n *\r\n * @param {object|null} mesh\r\n * @returns {Array<*>|null}\r\n */\r\n static getMeshAreas(mesh)\r\n {\r\n return mesh?.areas || mesh?.lods?.[0]?.areas || null;\r\n }\r\n\r\n /**\r\n * Gets canonical bounds from a geometry payload object.\r\n *\r\n * @param {object|null} value\r\n * @returns {{min: ArrayLike<number>, max: ArrayLike<number>}|null}\r\n */\r\n static getBounds(value)\r\n {\r\n if (!value || typeof value !== \"object\") return null;\r\n if (value.bounds?.min && value.bounds?.max) return value.bounds;\r\n if (value.minBounds && value.maxBounds)\r\n {\r\n return { min: value.minBounds, max: value.maxBounds };\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the canonical bounding sphere from a geometry payload object.\r\n *\r\n * @param {object|null} value\r\n * @returns {ArrayLike<number>|null}\r\n */\r\n static getSphere(value)\r\n {\r\n if (!value || typeof value !== \"object\") return null;\r\n return value.sphere || value.boundingSphere || null;\r\n }\r\n\r\n /**\r\n * Copies bounds into caller-owned outputs, or returns the source object.\r\n *\r\n * @param {{min: ArrayLike<number>, max: ArrayLike<number>}|null} bounds\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n static copyBounds(bounds, outMin, outMax)\r\n {\r\n if (!outMin && !outMax) return bounds;\r\n if (!bounds || !outMin || !outMax) return false;\r\n vec3.copy(outMin, bounds.min);\r\n vec3.copy(outMax, bounds.max);\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets canonical positions from a mesh or its first LOD.\r\n *\r\n * @param {object|null} mesh\r\n * @returns {ArrayLike<number>|Array<ArrayLike<number>>|null}\r\n */\r\n static getMeshPositions(mesh)\r\n {\r\n return mesh?.vertex?.position\r\n || mesh?.positions\r\n || mesh?.lods?.[0]?.vertex?.position\r\n || mesh?.lods?.[0]?.positions\r\n || null;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices represented by flat or nested positions.\r\n *\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @returns {number}\r\n */\r\n static getPositionCount(positions)\r\n {\r\n if (!positions) return 0;\r\n return typeof positions[0] === \"number\"\r\n ? Math.floor(positions.length / 3)\r\n : positions.length;\r\n }\r\n\r\n /**\r\n * Calculates bounds from canonical positions using caller-owned scratch.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static setBoundsFromPositions(out, positions, point)\r\n {\r\n const count = this.getPositionCount(positions);\r\n let found = false;\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n if (!found)\r\n {\r\n out[0] = out[3] = point[0];\r\n out[1] = out[4] = point[1];\r\n out[2] = out[5] = point[2];\r\n found = true;\r\n continue;\r\n }\r\n out[0] = Math.min(out[0], point[0]);\r\n out[1] = Math.min(out[1], point[1]);\r\n out[2] = Math.min(out[2], point[2]);\r\n out[3] = Math.max(out[3], point[0]);\r\n out[4] = Math.max(out[4], point[1]);\r\n out[5] = Math.max(out[5], point[2]);\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Calculates a bounding sphere from positions using caller-owned scratch.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static setSphereFromPositions(out, positions, point)\r\n {\r\n const count = this.getPositionCount(positions);\r\n let\r\n found = false,\r\n minX = Infinity,\r\n minY = Infinity,\r\n minZ = Infinity,\r\n maxX = -Infinity,\r\n maxY = -Infinity,\r\n maxZ = -Infinity;\r\n\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n minX = Math.min(minX, point[0]);\r\n minY = Math.min(minY, point[1]);\r\n minZ = Math.min(minZ, point[2]);\r\n maxX = Math.max(maxX, point[0]);\r\n maxY = Math.max(maxY, point[1]);\r\n maxZ = Math.max(maxZ, point[2]);\r\n found = true;\r\n }\r\n if (!found) return false;\r\n\r\n out[0] = (minX + maxX) * 0.5;\r\n out[1] = (minY + maxY) * 0.5;\r\n out[2] = (minZ + maxZ) * 0.5;\r\n let maxSquaredRadius = 0;\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n const\r\n x = out[0] - point[0],\r\n y = out[1] - point[1],\r\n z = out[2] - point[2];\r\n maxSquaredRadius = Math.max(maxSquaredRadius, x * x + y * y + z * z);\r\n }\r\n out[3] = Math.sqrt(maxSquaredRadius);\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculates a mesh sphere from positions or existing bounds.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {object} mesh\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static calculateMeshSphere(out, mesh, point)\r\n {\r\n if (this.setSphereFromPositions(out, this.getMeshPositions(mesh), point)) return true;\r\n const bounds = this.getBounds(mesh);\r\n if (!bounds) return false;\r\n sph3.fromBounds(out, bounds.min, bounds.max);\r\n return true;\r\n }\r\n\r\n /**\r\n * Stores a calculated sphere in the mesh's canonical sphere fields.\r\n *\r\n * @param {object} mesh\r\n * @param {ArrayLike<number>} sphere\r\n * @returns {void}\r\n */\r\n static setMeshSphere(mesh, sphere)\r\n {\r\n if (mesh.sphere && typeof mesh.sphere.set === \"function\") mesh.sphere.set(sphere);\r\n else mesh.sphere = [ ...sphere ];\r\n if (mesh.boundingSphere && typeof mesh.boundingSphere.set === \"function\")\r\n {\r\n mesh.boundingSphere.set(sphere);\r\n }\r\n else if (\"boundingSphere\" in mesh)\r\n {\r\n mesh.boundingSphere = [ ...sphere ];\r\n }\r\n }\r\n\r\n /**\r\n * Intersects a ray with canonical CPU geometry.\r\n *\r\n * @param {Array<object>|null} meshes\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @param {number} areaIndex\r\n * @returns {object}\r\n */\r\n static intersectGeometry(meshes, position, direction, areaIndex)\r\n {\r\n this.validateRayVector(position, \"position\");\r\n this.validateRayVector(direction, \"direction\");\r\n const\r\n ray = ray3.from(ray3.alloc(), position, direction),\r\n point = vec3.alloc(),\r\n vertexA = vec3.alloc(),\r\n vertexB = vec3.alloc(),\r\n vertexC = vec3.alloc(),\r\n normal = vec3.alloc();\r\n let nearest = null;\r\n try\r\n {\r\n for (let meshIndex = 0; meshIndex < (meshes?.length || 0); meshIndex++)\r\n {\r\n const mesh = meshes[meshIndex];\r\n const positions = this.getMeshPositions(mesh);\r\n if (!positions) continue;\r\n const groups = mesh?.indices || mesh?.lods?.[0]?.indices || null;\r\n if (ArrayBuffer.isView(groups)\r\n || (Array.isArray(groups) && typeof groups[0] === \"number\"))\r\n {\r\n if (areaIndex !== -1 && areaIndex !== 0) continue;\r\n nearest = this.intersectFaces(\r\n nearest,\r\n groups,\r\n 0,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n continue;\r\n }\r\n if (Array.isArray(groups))\r\n {\r\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++)\r\n {\r\n if (areaIndex !== -1 && areaIndex !== groupIndex) continue;\r\n const faces = groups[groupIndex]?.faces || groups[groupIndex]?.indices || [];\r\n nearest = this.intersectFaces(\r\n nearest,\r\n faces,\r\n groupIndex,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n }\r\n continue;\r\n }\r\n if (areaIndex === -1 || areaIndex === 0)\r\n {\r\n nearest = this.intersectFaces(\r\n nearest,\r\n null,\r\n 0,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n }\r\n }\r\n return nearest || {\r\n hit: false,\r\n boneIndex: -1,\r\n point: [ 0, 0, 0 ],\r\n normal: [ 0, 0, 0 ],\r\n distance: Infinity,\r\n meshIndex: -1,\r\n areaIndex\r\n };\r\n }\r\n finally\r\n {\r\n vec3.unalloc(normal);\r\n vec3.unalloc(vertexC);\r\n vec3.unalloc(vertexB);\r\n vec3.unalloc(vertexA);\r\n vec3.unalloc(point);\r\n ray3.unalloc(ray);\r\n }\r\n }\r\n\r\n /**\r\n * Validates a caller-provided ray vector.\r\n *\r\n * @param {ArrayLike<number>} value\r\n * @param {string} name\r\n * @returns {void}\r\n */\r\n static validateRayVector(value, name)\r\n {\r\n if (!value\r\n || value.length < 3\r\n || !Number.isFinite(value[0])\r\n || !Number.isFinite(value[1])\r\n || !Number.isFinite(value[2]))\r\n {\r\n throw new TypeError(`TriGeometryRes ray ${name} must contain three finite numbers.`);\r\n }\r\n }\r\n\r\n /**\r\n * Intersects a ray with one flat face list.\r\n *\r\n * @param {object|null} nearest\r\n * @param {ArrayLike<number>|null} faces\r\n * @param {number} areaIndex\r\n * @param {object} mesh\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\r\n * @param {ArrayLike<number>} rayOrigin\r\n * @param {ArrayLike<number>} ray\r\n * @param {ArrayLike<number>} point\r\n * @param {ArrayLike<number>} vertexA\r\n * @param {ArrayLike<number>} vertexB\r\n * @param {ArrayLike<number>} vertexC\r\n * @param {ArrayLike<number>} normal\r\n * @returns {object|null}\r\n */\r\n static intersectFaces(\r\n nearest,\r\n faces,\r\n areaIndex,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n rayOrigin,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n )\r\n {\r\n const count = faces?.length ?? this.getPositionCount(positions);\r\n for (let index = 0; index + 2 < count; index += 3)\r\n {\r\n const\r\n vertexIndexA = faces ? faces[index] : index,\r\n vertexIndexB = faces ? faces[index + 1] : index + 1,\r\n vertexIndexC = faces ? faces[index + 2] : index + 2;\r\n if (!this.copyPosition(vertexA, positions, vertexIndexA)\r\n || !this.copyPosition(vertexB, positions, vertexIndexB)\r\n || !this.copyPosition(vertexC, positions, vertexIndexC)\r\n || !ray3.getIntersectVertices(\r\n point,\r\n ray,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n false\r\n ))\r\n {\r\n continue;\r\n }\r\n const distance = vec3.distance(rayOrigin, point);\r\n if (nearest && nearest.distance <= distance) continue;\r\n if (!nearest)\r\n {\r\n nearest = {\r\n hit: true,\r\n boneIndex: -1,\r\n point: [ 0, 0, 0 ],\r\n normal: [ 0, 0, 0 ],\r\n distance,\r\n meshIndex,\r\n areaIndex\r\n };\r\n }\r\n nearest.boneIndex = this.getMeshBoneIndex(mesh, vertexIndexA);\r\n vec3.copy(nearest.point, point);\r\n triangleNormalTo(normal, vertexA, vertexB, vertexC);\r\n vec3.copy(nearest.normal, normal);\r\n nearest.distance = distance;\r\n nearest.meshIndex = meshIndex;\r\n nearest.areaIndex = areaIndex;\r\n }\r\n return nearest;\r\n }\r\n\r\n /**\r\n * Copies one flat or nested position into caller-owned output.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\r\n * @param {number} index\r\n * @returns {boolean}\r\n */\r\n static copyPosition(out, positions, index)\r\n {\r\n if (!Number.isInteger(index) || index < 0) return false;\r\n if (typeof positions[0] === \"number\")\r\n {\r\n const offset = index * 3;\r\n if (offset + 2 >= positions.length) return false;\r\n out[0] = positions[offset];\r\n out[1] = positions[offset + 1];\r\n out[2] = positions[offset + 2];\r\n return true;\r\n }\r\n const point = positions[index];\r\n if (!point || point.length < 3) return false;\r\n out[0] = point[0];\r\n out[1] = point[1];\r\n out[2] = point[2];\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the first blend index for a mesh vertex.\r\n *\r\n * @param {object} mesh\r\n * @param {number} vertexIndex\r\n * @returns {number}\r\n */\r\n static getMeshBoneIndex(mesh, vertexIndex)\r\n {\r\n const indices = mesh?.vertex?.blendIndices || mesh?.blendIndices;\r\n if (!indices) return -1;\r\n if (typeof indices[0] === \"number\")\r\n {\r\n return Number(indices[vertexIndex * 4] ?? indices[vertexIndex] ?? -1);\r\n }\r\n return Number(indices[vertexIndex]?.[0] ?? -1);\r\n }\r\n\r\n}\r\n\r\n// Declared as data rather than with decorators, so the resource tree loads from\r\n// source without a transform. Field order is key order, and GetValues() exports\r\n// in that order.\r\nCjsSchema.define(TriGeometryRes, {\r\n className: \"TriGeometryRes\",\r\n family: \"resources\",\r\n fields: {\r\n forceLod: [ type.boolean, io.readwrite ],\r\n forcedLodIndex: [ type.int32, io.readwrite ],\r\n name: [ type.string, io.readwrite ]\r\n },\r\n methods: {\r\n GetMeshCount: [ carbon.method, impl.adapted ],\r\n GetAnimationCount: [ carbon.method, impl.adapted ],\r\n GetSkeletonCount: [ carbon.method, impl.adapted ],\r\n GetSkeletonData: [ carbon.method, impl.adapted ],\r\n GetMeshAreaCount: [ carbon.method, impl.adapted ],\r\n GetLodIndexForScreenSize: [ carbon.method, impl.adapted ],\r\n GetMeshLod: [ carbon.method, impl.adapted ],\r\n GetMeshLodByIndex: [ carbon.method, impl.adapted ],\r\n GetMeshName: [ carbon.method, impl.adapted ],\r\n GetMeshAreaName: [ carbon.method, impl.adapted ],\r\n GetAreaBoundingBox: [ carbon.method, impl.adapted ],\r\n GetBoundingBox: [ carbon.method, impl.adapted ],\r\n GetBoundingSphere: [ carbon.method, impl.adapted ],\r\n CalculateBoundingBoxFromTransform: [ carbon.method, impl.adapted ],\r\n RecalculateBoundingSphere: [ carbon.method, impl.adapted ],\r\n Reload: [ carbon.method, impl.notSupported ],\r\n GetIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\r\n GetAreaIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\r\n GetMeshVertexElements: [ carbon.method, impl.adapted ],\r\n SaveMesh: [ carbon.method, impl.notSupported ]\r\n }\r\n});\r\n"],"names":["TriGeometryRes","CjsResource","forceLod","forcedLodIndex","name","constructor","values","SetValues","markDirty","skipUpdate","skipEvents","SetPayload","payload","options","assertResourcePayloadObject","assertResourcePayloadArray","field","undefined","Array","isArray","resourcePayloadError","GetMeshCount","GetPayload","meshes","length","GetAnimationCount","animations","GetSkeletonCount","skeletons","GetSkeletonData","skeletonIndex","index","Number","isInteger","GetMeshAreaCount","meshIndex","mesh","areas","GetLodIndexForScreenSize","screenSize","Infinity","lods","lastLod","Math","min","maxScreenSize","GetMeshLod","GetMeshLodByIndex","lodIndex","GetMeshName","GetMeshAreaName","areaIndex","GetAreaBoundingBox","outMin","outMax","area","getMeshAreas","bounds","getBounds","copyBounds","GetBoundingBox","GetBoundingSphere","out","sphere","getSphere","vec4","copy","CalculateBoundingBoxFromTransform","transform","TypeError","positions","getMeshPositions","sourceBounds","box3","alloc","point","vec3","setBoundsFromPositions","fromBounds","max","transformMat4","unalloc","RecalculateBoundingSphere","updated","sph3","calculateMeshSphere","setMeshSphere","Reload","resourceBoundaryError","GetIntersectionPointNormalBone","position","direction","intersectGeometry","GetAreaIntersectionPointNormalBone","RangeError","GetMeshVertexElements","decl","vertexElements","SaveMesh","getPrimitiveCount","lod","count","areaCount","run","primitiveCount","offset","value","minBounds","maxBounds","boundingSphere","vertex","getPositionCount","floor","found","copyPosition","setSphereFromPositions","minX","minY","minZ","maxX","maxY","maxZ","maxSquaredRadius","x","y","z","sqrt","set","validateRayVector","ray","ray3","from","vertexA","vertexB","vertexC","normal","nearest","groups","indices","ArrayBuffer","isView","intersectFaces","groupIndex","faces","hit","boneIndex","distance","isFinite","rayOrigin","vertexIndexA","vertexIndexB","vertexIndexC","getIntersectVertices","getMeshBoneIndex","triangleNormalTo","vertexIndex","blendIndices","CjsSchema","define","className","family","fields","type","boolean","io","readwrite","int32","string","methods","carbon","method","impl","adapted","notSupported"],"mappings":"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"}
1
+ {"version":3,"file":"TriGeometryRes.js","sources":["../../../../src/resource/geometry/TriGeometryRes.js"],"sourcesContent":["import { ResourceRequirement } from \"../ResourceRequirement.js\";\n// Source: trinity/trinity/Resources/TriGeometryRes.h\r\n// Source: trinity/trinity/Resources/TriGeometryRes.cpp\r\n// Source: trinity/trinity/Resources/TriGeometryRes_Blue.cpp\r\nimport { CjsSchema, carbon, impl, io, type } from \"@carbonenginejs/runtime-utils/schema\";\r\nimport { box3 } from \"@carbonenginejs/runtime-utils/box3\";\r\nimport { triangleNormalTo } from \"@carbonenginejs/runtime-utils/mesh\";\r\nimport { ray3 } from \"@carbonenginejs/runtime-utils/ray3\";\r\nimport { sph3 } from \"@carbonenginejs/runtime-utils/sph3\";\r\nimport { vec3 } from \"@carbonenginejs/runtime-utils/vec3\";\r\nimport { vec4 } from \"@carbonenginejs/runtime-utils/vec4\";\r\nimport { CjsResource } from \"../CjsResource.js\";\r\nimport {\r\n assertResourcePayloadArray,\r\n assertResourcePayloadObject,\r\n resourceBoundaryError,\r\n resourcePayloadError\r\n} from \"../resourceBoundary.js\";\r\n\r\n/**\r\n * Resource record that owns geometry payload facts (meshes, optional\r\n * skeletons and animations) and LOD-force metadata, while engine packages\r\n * decide device buffers, vertex declarations, and draw-time state.\r\n *\r\n * Geometry inspection composes the generic math supplied by runtime-utils\r\n * with resource-specific payload traversal.\r\n */\r\nexport class TriGeometryRes extends CjsResource\r\n{\r\n forceLod = false;\r\n forcedLodIndex = -1;\r\n name = \"\";\r\n\r\n /** Creates a TriGeometryRes with caller-provided initial state. */\r\n constructor(values = null)\r\n {\r\n super();\r\n this.SetValues(values || {}, {\r\n markDirty: false,\r\n skipUpdate: true,\r\n skipEvents: true\r\n });\r\n }\r\n\r\n /**\r\n * Attach a plain geometry payload.\r\n *\r\n * @param {object|null} payload\r\n * @param {object|null} options\r\n * @returns {TriGeometryRes}\r\n */\r\n SetPayload(payload = null, options = null)\r\n {\r\n if (payload === null)\r\n {\r\n super.SetPayload(null);\r\n return this;\r\n }\r\n assertResourcePayloadObject(\"TriGeometryRes\", payload);\r\n assertResourcePayloadArray(\"TriGeometryRes\", payload, \"meshes\");\r\n for (const field of [ \"skeletons\", \"animations\" ])\r\n {\r\n if (payload[field] !== undefined && !Array.isArray(payload[field]))\r\n {\r\n throw resourcePayloadError(\"TriGeometryRes\", \"Expected an array when provided.\", field);\r\n }\r\n }\r\n super.SetPayload(payload);\r\n this.SetValues(options || {});\r\n return this;\r\n }\r\n\r\n /**\r\n * Get mesh count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetMeshCount()\r\n {\r\n return this.GetPayload()?.meshes?.length || 0;\r\n }\r\n\r\n /**\r\n * Get animation count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetAnimationCount()\r\n {\r\n return this.GetPayload()?.animations?.length || 0;\r\n }\r\n\r\n /**\r\n * Get skeleton count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetSkeletonCount()\r\n {\r\n return this.GetPayload()?.skeletons?.length || 0;\r\n }\r\n\r\n /**\r\n * Get one resource-owned skeleton from the CPU geometry payload.\r\n *\r\n * @param {number} skeletonIndex\r\n * @returns {*}\r\n */\r\n GetSkeletonData(skeletonIndex = 0)\r\n {\r\n const index = Number(skeletonIndex);\r\n\r\n if (!Number.isInteger(index) || index < 0)\r\n {\r\n return null;\r\n }\r\n\r\n return this.GetPayload()?.skeletons?.[index] || null;\r\n }\r\n\r\n /**\r\n * Get mesh area count from a CPU geometry payload mesh.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {number}\r\n */\r\n GetMeshAreaCount(meshIndex = 0)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n return mesh?.areas?.length || 0;\r\n }\r\n\r\n // Carbon TriGeometryRes.cpp:294-319. Walks LODs from the LOWEST quality up\r\n // and takes the first whose authored maxScreenSize still covers the requested\r\n // size; a request larger than the best LOD falls back to LOD 0, which Carbon\r\n // comments explicitly. forceLod pins the index instead, clamped to the last\r\n // LOD.\r\n\r\n /**\r\n * The LOD index this mesh should be drawn at for a screen size, or -1 when the\r\n * mesh does not exist.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} screenSize\r\n * @returns {number}\r\n */\r\n GetLodIndexForScreenSize(meshIndex = 0, screenSize = Infinity)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n if (!mesh) return -1;\r\n\r\n // A decoder may flatten a single-LOD mesh, putting the areas on the mesh\r\n // itself; that mesh IS its own only LOD (see getMeshAreas).\r\n const lods = mesh.lods?.length ? mesh.lods : null;\r\n const lastLod = lods ? lods.length - 1 : 0;\r\n\r\n if (this.forceLod && this.forcedLodIndex >= 0)\r\n {\r\n return Math.min(this.forcedLodIndex, lastLod);\r\n }\r\n\r\n for (let index = lastLod; index >= 0; index--)\r\n {\r\n const maxScreenSize = (lods ? lods[index]?.maxScreenSize : mesh.maxScreenSize) ?? 0;\r\n if (maxScreenSize >= screenSize) return index;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n // Carbon TriGeometryRes.cpp:268-279. Carbon overloads this on float\r\n // screenSize versus int lodIndex; JavaScript cannot, so the index form is\r\n // GetMeshLodByIndex. Carbon indexes m_lods with the result unguarded, so a\r\n // mesh with an EMPTY lod list reads out of bounds there; this port returns\r\n // null (docs/research/carbon-known-defects.md).\r\n\r\n /**\r\n * The LOD data this mesh should be drawn at for a screen size, or null when\r\n * the mesh has no LODs.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} screenSize\r\n * @returns {object|null}\r\n */\r\n GetMeshLod(meshIndex = 0, screenSize = Infinity)\r\n {\r\n return this.GetMeshLodByIndex(meshIndex, this.GetLodIndexForScreenSize(meshIndex, screenSize));\r\n }\r\n\r\n /**\r\n * The LOD data at an explicit index, or null when the mesh or index does not\r\n * exist (Carbon TriGeometryRes.cpp:281-292).\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} lodIndex\r\n * @returns {object|null}\r\n */\r\n GetMeshLodByIndex(meshIndex = 0, lodIndex = 0)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n if (!mesh || lodIndex < 0) return null;\r\n\r\n if (mesh.lods?.length)\r\n {\r\n return lodIndex < mesh.lods.length ? mesh.lods[lodIndex] : null;\r\n }\r\n\r\n return lodIndex === 0 && mesh.areas ? mesh : null;\r\n }\r\n\r\n /**\r\n * Get mesh name from a CPU geometry payload.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {string}\r\n */\r\n GetMeshName(meshIndex = 0)\r\n {\r\n return this.GetPayload()?.meshes?.[meshIndex]?.name || \"\";\r\n }\r\n\r\n /**\r\n * Get mesh area name from a CPU geometry payload.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} areaIndex\r\n * @returns {string}\r\n */\r\n GetMeshAreaName(meshIndex = 0, areaIndex = 0)\r\n {\r\n return this.GetPayload()?.meshes?.[meshIndex]?.areas?.[areaIndex]?.name || \"\";\r\n }\r\n\r\n /**\r\n * Get area bounding box from geometry payload data.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} areaIndex\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n GetAreaBoundingBox(meshIndex = 0, areaIndex = 0, outMin = null, outMax = null)\r\n {\r\n const area = TriGeometryRes.getMeshAreas(this.GetPayload()?.meshes?.[meshIndex])?.[areaIndex];\r\n const bounds = TriGeometryRes.getBounds(area);\r\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\r\n }\r\n\r\n /**\r\n * Get mesh bounding box from geometry payload data.\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n GetBoundingBox(meshIndex = 0, outMin = null, outMax = null)\r\n {\r\n const payload = this.GetPayload();\r\n const bounds = TriGeometryRes.getBounds(payload?.meshes?.[meshIndex])\r\n || TriGeometryRes.getBounds(payload);\r\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\r\n }\r\n\r\n /**\r\n * Get mesh bounding sphere from geometry payload data.\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|null} out\r\n * @returns {*|boolean}\r\n */\r\n GetBoundingSphere(meshIndex = 0, out = null)\r\n {\r\n const payload = this.GetPayload();\r\n const sphere = TriGeometryRes.getSphere(payload?.meshes?.[meshIndex])\r\n || TriGeometryRes.getSphere(payload);\r\n if (!out) return sphere;\r\n if (!sphere) return false;\r\n vec4.copy(out, sphere);\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculate a transformed bounding box from canonical CPU vertex data.\r\n *\r\n * Carbon stores the same matrix bytes as gl-matrix; transforming one point\r\n * therefore uses the ordinary column-vector index layout.\r\n *\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>} transform\r\n * @returns {{min: number[], max: number[]}|null}\r\n */\r\n CalculateBoundingBoxFromTransform(meshIndex = 0, transform = null)\r\n {\r\n if (!transform || transform.length < 16)\r\n {\r\n throw new TypeError(\"TriGeometryRes transform must contain 16 matrix elements.\");\r\n }\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n if (!mesh) return null;\r\n const positions = TriGeometryRes.getMeshPositions(mesh);\r\n const sourceBounds = TriGeometryRes.getBounds(mesh);\r\n if (!positions && !sourceBounds) return null;\r\n\r\n const\r\n bounds = box3.alloc(),\r\n point = vec3.alloc();\r\n try\r\n {\r\n if (!TriGeometryRes.setBoundsFromPositions(bounds, positions, point))\r\n {\r\n if (!sourceBounds) return null;\r\n box3.fromBounds(bounds, sourceBounds.min, sourceBounds.max);\r\n }\r\n box3.transformMat4(bounds, bounds, transform);\r\n return {\r\n min: [ bounds[0], bounds[1], bounds[2] ],\r\n max: [ bounds[3], bounds[4], bounds[5] ]\r\n };\r\n }\r\n finally\r\n {\r\n vec3.unalloc(point);\r\n box3.unalloc(bounds);\r\n }\r\n }\r\n\r\n /**\r\n * Recalculate bounding sphere data from canonical CPU vertex positions.\r\n *\r\n * @returns {boolean}\r\n */\r\n RecalculateBoundingSphere()\r\n {\r\n let updated = false;\r\n const\r\n sphere = sph3.alloc(),\r\n point = vec3.alloc();\r\n try\r\n {\r\n for (const mesh of this.GetPayload()?.meshes || [])\r\n {\r\n if (!TriGeometryRes.calculateMeshSphere(sphere, mesh, point)) continue;\r\n TriGeometryRes.setMeshSphere(mesh, sphere);\r\n updated = true;\r\n }\r\n return updated;\r\n }\r\n finally\r\n {\r\n vec3.unalloc(point);\r\n sph3.unalloc(sphere);\r\n }\r\n }\r\n\r\n /**\r\n * Reloading belongs to the resource manager because it owns source and\r\n * canonical replacement policy.\r\n *\r\n * @throws {Error}\r\n */\r\n Reload() {\r\n throw resourceBoundaryError(\r\n \"TriGeometryRes\",\r\n \"Reload\",\r\n \"Request a reload through CjsResMan so source reads and canonical replacement remain manager-owned.\"\r\n );\r\n }\r\n\r\n /**\r\n * Intersect a ray with canonical CPU triangle data.\r\n *\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @returns {object}\r\n */\r\n GetIntersectionPointNormalBone(position, direction)\r\n {\r\n return TriGeometryRes.intersectGeometry(\r\n this.RequireIntersectionMeshes(),\r\n position,\r\n direction,\r\n -1\r\n );\r\n }\r\n\r\n /**\r\n * Intersect a ray with one area index across canonical CPU meshes.\r\n *\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @param {number} areaIndex\r\n * @returns {object}\r\n */\r\n GetAreaIntersectionPointNormalBone(position, direction, areaIndex = -1)\r\n {\r\n if (!Number.isInteger(areaIndex) || areaIndex < -1)\r\n {\r\n throw new RangeError(\"TriGeometryRes area index must be -1 or a non-negative integer.\");\r\n }\r\n return TriGeometryRes.intersectGeometry(\r\n this.RequireIntersectionMeshes(),\r\n position,\r\n direction,\r\n areaIndex\r\n );\r\n }\r\n\r\n /**\r\n * The CPU triangle data an intersection query needs, or a loud failure.\r\n *\r\n * A ray query used to read `GetPayload()?.meshes`, and `intersectGeometry`\r\n * loops over `meshes?.length || 0`. So an absent payload produced a clean\r\n * MISS: `hit: false`, no error, indistinguishable from the ray genuinely\r\n * passing the object by. Picking would appear to work and simply stop\r\n * hitting things, and the symptom reads as a maths bug rather than a\r\n * residency one.\r\n *\r\n * Carbon never has to answer this, because it holds the loaded file for the\r\n * resource's lifetime and its CPU data is always resident. Ours is\r\n * releasable, so the unavailable case is real and must be named.\r\n *\r\n * Throwing is the interim answer, not the final one: once accuracy tiers\r\n * exist a query degrades to bounds or sphere and reports which produced it.\r\n * What it must never do again is report absence as a miss. See\r\n * `/docs/contracts/cpu-geometry-residency.md`.\r\n *\r\n * @returns {Array<*>} Canonical CPU meshes.\r\n * @throws {Error} When the CPU geometry is not resident.\r\n */\r\n RequireIntersectionMeshes()\r\n {\r\n const meshes = this.GetPayload()?.meshes;\r\n if (!Array.isArray(meshes))\r\n {\r\n throw new Error(\r\n \"TriGeometryRes cannot answer an intersection query: CPU geometry is \"\r\n + \"not resident. The payload was never loaded or has been released. \"\r\n + \"Reload through CjsResMan before querying.\"\r\n );\r\n }\r\n return meshes;\r\n }\r\n\r\n /**\r\n * Get vertex element descriptors for a mesh.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {Array<*>}\r\n */\r\n GetMeshVertexElements(meshIndex = 0)\r\n {\r\n // The CMF reader emits the element list as `decl`, matching the CMF struct\r\n // field; this accessor read only `vertexElements`, which no reader in this\r\n // package populates, so it returned an empty list for every real decoded\r\n // payload. Both names are accepted because the name is the producer's.\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n return mesh?.decl || mesh?.vertexElements || [];\r\n }\r\n\r\n /**\r\n * Saving belongs to the selected geometry format writer and destination.\r\n *\r\n * @throws {Error}\r\n */\r\n SaveMesh()\r\n {\r\n throw resourceBoundaryError(\r\n \"TriGeometryRes\",\r\n \"SaveMesh\",\r\n \"Use a geometry format writer with the resource payload and a caller-owned destination.\"\r\n );\r\n }\r\n\r\n static payload = ResourceRequirement.GEOMETRY;\r\n\r\n // Carbon TriGeometryRes.cpp:158-178, declared beside the class\r\n // (TriGeometryRes.h:202) because it reads LOD data rather than resource\r\n // state - which is why it is static here. It returns a PLAIN SUM and does not\r\n // multiply by three: the *3 belongs to the caller, so triangles-only is a\r\n // property of the mesh draw path rather than of the geometry layer.\r\n\r\n /**\r\n * The summed primitive count over `count` areas of a LOD starting at `index`,\r\n * with the run clamped to the area list as Carbon clamps it; zero when the\r\n * index is out of range, which callers treat as \"emit no draw\".\r\n *\r\n * @param {object|null} lod\r\n * @param {number} index\r\n * @param {number} count\r\n * @returns {number}\r\n */\r\n static getPrimitiveCount(lod, index, count)\r\n {\r\n const areas = lod?.areas ?? null;\r\n const areaCount = areas?.length ?? 0;\r\n\r\n if (!areaCount || index >= areaCount) return 0;\r\n\r\n const run = index + count > areaCount ? areaCount - index : count;\r\n\r\n let primitiveCount = 0;\r\n\r\n for (let offset = 0; offset < run; offset++)\r\n {\r\n primitiveCount += areas[index + offset]?.primitiveCount ?? 0;\r\n }\r\n\r\n return primitiveCount;\r\n }\r\n\r\n /**\r\n * Gets the canonical area list from a mesh or its first LOD.\r\n *\r\n * @param {object|null} mesh\r\n * @returns {Array<*>|null}\r\n */\r\n static getMeshAreas(mesh)\r\n {\r\n return mesh?.areas || mesh?.lods?.[0]?.areas || null;\r\n }\r\n\r\n /**\r\n * Gets canonical bounds from a geometry payload object.\r\n *\r\n * @param {object|null} value\r\n * @returns {{min: ArrayLike<number>, max: ArrayLike<number>}|null}\r\n */\r\n static getBounds(value)\r\n {\r\n if (!value || typeof value !== \"object\") return null;\r\n if (value.bounds?.min && value.bounds?.max) return value.bounds;\r\n if (value.minBounds && value.maxBounds)\r\n {\r\n return { min: value.minBounds, max: value.maxBounds };\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the canonical bounding sphere from a geometry payload object.\r\n *\r\n * @param {object|null} value\r\n * @returns {ArrayLike<number>|null}\r\n */\r\n static getSphere(value)\r\n {\r\n if (!value || typeof value !== \"object\") return null;\r\n return value.sphere || value.boundingSphere || null;\r\n }\r\n\r\n /**\r\n * Copies bounds into caller-owned outputs, or returns the source object.\r\n *\r\n * @param {{min: ArrayLike<number>, max: ArrayLike<number>}|null} bounds\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n static copyBounds(bounds, outMin, outMax)\r\n {\r\n if (!outMin && !outMax) return bounds;\r\n if (!bounds || !outMin || !outMax) return false;\r\n vec3.copy(outMin, bounds.min);\r\n vec3.copy(outMax, bounds.max);\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets canonical positions from a mesh or its first LOD.\r\n *\r\n * @param {object|null} mesh\r\n * @returns {ArrayLike<number>|Array<ArrayLike<number>>|null}\r\n */\r\n static getMeshPositions(mesh)\r\n {\r\n return mesh?.vertex?.position\r\n || mesh?.positions\r\n || mesh?.lods?.[0]?.vertex?.position\r\n || mesh?.lods?.[0]?.positions\r\n || null;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices represented by flat or nested positions.\r\n *\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @returns {number}\r\n */\r\n static getPositionCount(positions)\r\n {\r\n if (!positions) return 0;\r\n return typeof positions[0] === \"number\"\r\n ? Math.floor(positions.length / 3)\r\n : positions.length;\r\n }\r\n\r\n /**\r\n * Calculates bounds from canonical positions using caller-owned scratch.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static setBoundsFromPositions(out, positions, point)\r\n {\r\n const count = this.getPositionCount(positions);\r\n let found = false;\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n if (!found)\r\n {\r\n out[0] = out[3] = point[0];\r\n out[1] = out[4] = point[1];\r\n out[2] = out[5] = point[2];\r\n found = true;\r\n continue;\r\n }\r\n out[0] = Math.min(out[0], point[0]);\r\n out[1] = Math.min(out[1], point[1]);\r\n out[2] = Math.min(out[2], point[2]);\r\n out[3] = Math.max(out[3], point[0]);\r\n out[4] = Math.max(out[4], point[1]);\r\n out[5] = Math.max(out[5], point[2]);\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Calculates a bounding sphere from positions using caller-owned scratch.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static setSphereFromPositions(out, positions, point)\r\n {\r\n const count = this.getPositionCount(positions);\r\n let\r\n found = false,\r\n minX = Infinity,\r\n minY = Infinity,\r\n minZ = Infinity,\r\n maxX = -Infinity,\r\n maxY = -Infinity,\r\n maxZ = -Infinity;\r\n\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n minX = Math.min(minX, point[0]);\r\n minY = Math.min(minY, point[1]);\r\n minZ = Math.min(minZ, point[2]);\r\n maxX = Math.max(maxX, point[0]);\r\n maxY = Math.max(maxY, point[1]);\r\n maxZ = Math.max(maxZ, point[2]);\r\n found = true;\r\n }\r\n if (!found) return false;\r\n\r\n out[0] = (minX + maxX) * 0.5;\r\n out[1] = (minY + maxY) * 0.5;\r\n out[2] = (minZ + maxZ) * 0.5;\r\n let maxSquaredRadius = 0;\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n const\r\n x = out[0] - point[0],\r\n y = out[1] - point[1],\r\n z = out[2] - point[2];\r\n maxSquaredRadius = Math.max(maxSquaredRadius, x * x + y * y + z * z);\r\n }\r\n out[3] = Math.sqrt(maxSquaredRadius);\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculates a mesh sphere from positions or existing bounds.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {object} mesh\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static calculateMeshSphere(out, mesh, point)\r\n {\r\n if (this.setSphereFromPositions(out, this.getMeshPositions(mesh), point)) return true;\r\n const bounds = this.getBounds(mesh);\r\n if (!bounds) return false;\r\n sph3.fromBounds(out, bounds.min, bounds.max);\r\n return true;\r\n }\r\n\r\n /**\r\n * Stores a calculated sphere in the mesh's canonical sphere fields.\r\n *\r\n * @param {object} mesh\r\n * @param {ArrayLike<number>} sphere\r\n * @returns {void}\r\n */\r\n static setMeshSphere(mesh, sphere)\r\n {\r\n if (mesh.sphere && typeof mesh.sphere.set === \"function\") mesh.sphere.set(sphere);\r\n else mesh.sphere = [ ...sphere ];\r\n if (mesh.boundingSphere && typeof mesh.boundingSphere.set === \"function\")\r\n {\r\n mesh.boundingSphere.set(sphere);\r\n }\r\n else if (\"boundingSphere\" in mesh)\r\n {\r\n mesh.boundingSphere = [ ...sphere ];\r\n }\r\n }\r\n\r\n /**\r\n * Intersects a ray with canonical CPU geometry.\r\n *\r\n * @param {Array<object>|null} meshes\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @param {number} areaIndex\r\n * @returns {object}\r\n */\r\n static intersectGeometry(meshes, position, direction, areaIndex)\r\n {\r\n this.validateRayVector(position, \"position\");\r\n this.validateRayVector(direction, \"direction\");\r\n const\r\n ray = ray3.from(ray3.alloc(), position, direction),\r\n point = vec3.alloc(),\r\n vertexA = vec3.alloc(),\r\n vertexB = vec3.alloc(),\r\n vertexC = vec3.alloc(),\r\n normal = vec3.alloc();\r\n let nearest = null;\r\n try\r\n {\r\n for (let meshIndex = 0; meshIndex < (meshes?.length || 0); meshIndex++)\r\n {\r\n const mesh = meshes[meshIndex];\r\n const positions = this.getMeshPositions(mesh);\r\n if (!positions) continue;\r\n const groups = mesh?.indices || mesh?.lods?.[0]?.indices || null;\r\n if (ArrayBuffer.isView(groups)\r\n || (Array.isArray(groups) && typeof groups[0] === \"number\"))\r\n {\r\n if (areaIndex !== -1 && areaIndex !== 0) continue;\r\n nearest = this.intersectFaces(\r\n nearest,\r\n groups,\r\n 0,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n continue;\r\n }\r\n if (Array.isArray(groups))\r\n {\r\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++)\r\n {\r\n if (areaIndex !== -1 && areaIndex !== groupIndex) continue;\r\n const faces = groups[groupIndex]?.faces || groups[groupIndex]?.indices || [];\r\n nearest = this.intersectFaces(\r\n nearest,\r\n faces,\r\n groupIndex,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n }\r\n continue;\r\n }\r\n if (areaIndex === -1 || areaIndex === 0)\r\n {\r\n nearest = this.intersectFaces(\r\n nearest,\r\n null,\r\n 0,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n }\r\n }\r\n return nearest || {\r\n hit: false,\r\n boneIndex: -1,\r\n point: [ 0, 0, 0 ],\r\n normal: [ 0, 0, 0 ],\r\n distance: Infinity,\r\n meshIndex: -1,\r\n areaIndex\r\n };\r\n }\r\n finally\r\n {\r\n vec3.unalloc(normal);\r\n vec3.unalloc(vertexC);\r\n vec3.unalloc(vertexB);\r\n vec3.unalloc(vertexA);\r\n vec3.unalloc(point);\r\n ray3.unalloc(ray);\r\n }\r\n }\r\n\r\n /**\r\n * Validates a caller-provided ray vector.\r\n *\r\n * @param {ArrayLike<number>} value\r\n * @param {string} name\r\n * @returns {void}\r\n */\r\n static validateRayVector(value, name)\r\n {\r\n if (!value\r\n || value.length < 3\r\n || !Number.isFinite(value[0])\r\n || !Number.isFinite(value[1])\r\n || !Number.isFinite(value[2]))\r\n {\r\n throw new TypeError(`TriGeometryRes ray ${name} must contain three finite numbers.`);\r\n }\r\n }\r\n\r\n /**\r\n * Intersects a ray with one flat face list.\r\n *\r\n * @param {object|null} nearest\r\n * @param {ArrayLike<number>|null} faces\r\n * @param {number} areaIndex\r\n * @param {object} mesh\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\r\n * @param {ArrayLike<number>} rayOrigin\r\n * @param {ArrayLike<number>} ray\r\n * @param {ArrayLike<number>} point\r\n * @param {ArrayLike<number>} vertexA\r\n * @param {ArrayLike<number>} vertexB\r\n * @param {ArrayLike<number>} vertexC\r\n * @param {ArrayLike<number>} normal\r\n * @returns {object|null}\r\n */\r\n static intersectFaces(\r\n nearest,\r\n faces,\r\n areaIndex,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n rayOrigin,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n )\r\n {\r\n const count = faces?.length ?? this.getPositionCount(positions);\r\n for (let index = 0; index + 2 < count; index += 3)\r\n {\r\n const\r\n vertexIndexA = faces ? faces[index] : index,\r\n vertexIndexB = faces ? faces[index + 1] : index + 1,\r\n vertexIndexC = faces ? faces[index + 2] : index + 2;\r\n if (!this.copyPosition(vertexA, positions, vertexIndexA)\r\n || !this.copyPosition(vertexB, positions, vertexIndexB)\r\n || !this.copyPosition(vertexC, positions, vertexIndexC)\r\n || !ray3.getIntersectVertices(\r\n point,\r\n ray,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n false\r\n ))\r\n {\r\n continue;\r\n }\r\n const distance = vec3.distance(rayOrigin, point);\r\n if (nearest && nearest.distance <= distance) continue;\r\n if (!nearest)\r\n {\r\n nearest = {\r\n hit: true,\r\n boneIndex: -1,\r\n point: [ 0, 0, 0 ],\r\n normal: [ 0, 0, 0 ],\r\n distance,\r\n meshIndex,\r\n areaIndex\r\n };\r\n }\r\n nearest.boneIndex = this.getMeshBoneIndex(mesh, vertexIndexA);\r\n vec3.copy(nearest.point, point);\r\n triangleNormalTo(normal, vertexA, vertexB, vertexC);\r\n vec3.copy(nearest.normal, normal);\r\n nearest.distance = distance;\r\n nearest.meshIndex = meshIndex;\r\n nearest.areaIndex = areaIndex;\r\n }\r\n return nearest;\r\n }\r\n\r\n /**\r\n * Copies one flat or nested position into caller-owned output.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\r\n * @param {number} index\r\n * @returns {boolean}\r\n */\r\n static copyPosition(out, positions, index)\r\n {\r\n if (!Number.isInteger(index) || index < 0) return false;\r\n if (typeof positions[0] === \"number\")\r\n {\r\n const offset = index * 3;\r\n if (offset + 2 >= positions.length) return false;\r\n out[0] = positions[offset];\r\n out[1] = positions[offset + 1];\r\n out[2] = positions[offset + 2];\r\n return true;\r\n }\r\n const point = positions[index];\r\n if (!point || point.length < 3) return false;\r\n out[0] = point[0];\r\n out[1] = point[1];\r\n out[2] = point[2];\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the first blend index for a mesh vertex.\r\n *\r\n * @param {object} mesh\r\n * @param {number} vertexIndex\r\n * @returns {number}\r\n */\r\n static getMeshBoneIndex(mesh, vertexIndex)\r\n {\r\n const indices = mesh?.vertex?.blendIndices || mesh?.blendIndices;\r\n if (!indices) return -1;\r\n if (typeof indices[0] === \"number\")\r\n {\r\n return Number(indices[vertexIndex * 4] ?? indices[vertexIndex] ?? -1);\r\n }\r\n return Number(indices[vertexIndex]?.[0] ?? -1);\r\n }\r\n\r\n}\r\n\r\n// Declared as data rather than with decorators, so the resource tree loads from\r\n// source without a transform. Field order is key order, and GetValues() exports\r\n// in that order.\r\nCjsSchema.define(TriGeometryRes, {\r\n className: \"TriGeometryRes\",\r\n family: \"resources\",\r\n fields: {\r\n forceLod: [ type.boolean, io.readwrite ],\r\n forcedLodIndex: [ type.int32, io.readwrite ],\r\n name: [ type.string, io.readwrite ]\r\n },\r\n methods: {\r\n GetMeshCount: [ carbon.method, impl.adapted ],\r\n GetAnimationCount: [ carbon.method, impl.adapted ],\r\n GetSkeletonCount: [ carbon.method, impl.adapted ],\r\n GetSkeletonData: [ carbon.method, impl.adapted ],\r\n GetMeshAreaCount: [ carbon.method, impl.adapted ],\r\n GetLodIndexForScreenSize: [ carbon.method, impl.adapted ],\r\n GetMeshLod: [ carbon.method, impl.adapted ],\r\n GetMeshLodByIndex: [ carbon.method, impl.adapted ],\r\n GetMeshName: [ carbon.method, impl.adapted ],\r\n GetMeshAreaName: [ carbon.method, impl.adapted ],\r\n GetAreaBoundingBox: [ carbon.method, impl.adapted ],\r\n GetBoundingBox: [ carbon.method, impl.adapted ],\r\n GetBoundingSphere: [ carbon.method, impl.adapted ],\r\n CalculateBoundingBoxFromTransform: [ carbon.method, impl.adapted ],\r\n RecalculateBoundingSphere: [ carbon.method, impl.adapted ],\r\n Reload: [ carbon.method, impl.notSupported ],\r\n GetIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\r\n GetAreaIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\r\n GetMeshVertexElements: [ carbon.method, impl.adapted ],\r\n SaveMesh: [ carbon.method, impl.notSupported ]\r\n }\r\n});\r\n"],"names":["TriGeometryRes","CjsResource","forceLod","forcedLodIndex","name","constructor","values","SetValues","markDirty","skipUpdate","skipEvents","SetPayload","payload","options","assertResourcePayloadObject","assertResourcePayloadArray","field","undefined","Array","isArray","resourcePayloadError","GetMeshCount","GetPayload","meshes","length","GetAnimationCount","animations","GetSkeletonCount","skeletons","GetSkeletonData","skeletonIndex","index","Number","isInteger","GetMeshAreaCount","meshIndex","mesh","areas","GetLodIndexForScreenSize","screenSize","Infinity","lods","lastLod","Math","min","maxScreenSize","GetMeshLod","GetMeshLodByIndex","lodIndex","GetMeshName","GetMeshAreaName","areaIndex","GetAreaBoundingBox","outMin","outMax","area","getMeshAreas","bounds","getBounds","copyBounds","GetBoundingBox","GetBoundingSphere","out","sphere","getSphere","vec4","copy","CalculateBoundingBoxFromTransform","transform","TypeError","positions","getMeshPositions","sourceBounds","box3","alloc","point","vec3","setBoundsFromPositions","fromBounds","max","transformMat4","unalloc","RecalculateBoundingSphere","updated","sph3","calculateMeshSphere","setMeshSphere","Reload","resourceBoundaryError","GetIntersectionPointNormalBone","position","direction","intersectGeometry","RequireIntersectionMeshes","GetAreaIntersectionPointNormalBone","RangeError","Error","GetMeshVertexElements","decl","vertexElements","SaveMesh","ResourceRequirement","GEOMETRY","getPrimitiveCount","lod","count","areaCount","run","primitiveCount","offset","value","minBounds","maxBounds","boundingSphere","vertex","getPositionCount","floor","found","copyPosition","setSphereFromPositions","minX","minY","minZ","maxX","maxY","maxZ","maxSquaredRadius","x","y","z","sqrt","set","validateRayVector","ray","ray3","from","vertexA","vertexB","vertexC","normal","nearest","groups","indices","ArrayBuffer","isView","intersectFaces","groupIndex","faces","hit","boneIndex","distance","isFinite","rayOrigin","vertexIndexA","vertexIndexB","vertexIndexC","getIntersectVertices","getMeshBoneIndex","triangleNormalTo","vertexIndex","blendIndices","CjsSchema","define","className","family","fields","type","boolean","io","readwrite","int32","string","methods","carbon","method","impl","adapted","notSupported"],"mappings":"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"}
@@ -1,17 +1,39 @@
1
1
  import { CjsSchema } from '@carbonenginejs/runtime-utils/schema';
2
2
  import { CjsResource } from '../../CjsResource.js';
3
- import { assertResourcePayloadObject, resourcePayloadError } from '../../resourceBoundary.js';
3
+ import { assertResourcePayloadObject, resourcePayloadError, resourceFormatRequiredError } from '../../resourceBoundary.js';
4
+ import { ResourceRequirement } from '../../ResourceRequirement.js';
4
5
 
5
6
  // Source: trinity/trinity/Resources/Tr2GrannyStateRes.h
6
7
 
7
8
  /**
8
9
  * Runtime-owned GState resource.
9
10
  *
10
- * GState uses the Gr2Reader path but may contain additive skeleton/state data
11
- * without models. Consumers inspect its plain payload rather than assuming the
12
- * model-bearing TriGrannyRes payload shape.
11
+ * A `.gsf` is a Granny container whose root is a character animation STATE
12
+ * MACHINE rather than geometry: the state graph, the animation slots it binds
13
+ * clips into, and animation sets that reference external `.gr2` animation
14
+ * files by relative path. It carries no geometry and no skeleton — the
15
+ * skeleton lives in the referenced `.gr2`.
16
+ *
17
+ * Carbon's `Tr2GrannyStateRes` holds the parsed container plus a map of those
18
+ * referenced animations loaded as separate `TriGrannyRes`, and binds them
19
+ * through `GStateBindCharacterFileReferences`. `Tr2GStateAnimation` is the
20
+ * consumer: named parameters drive the state machine, active states sample
21
+ * clips from the referenced sets, and the composited pose becomes bone
22
+ * matrices for skinning.
23
+ *
24
+ * THE GUARD THIS REPLACES WAS FABRICATED. It demanded `skeleton` or an
25
+ * `additiveAnimations` array — two fields that appear in no reader output, no
26
+ * Carbon struct, and no schema. `CjsGr2Format.readGsf` returns
27
+ * `{format, container, character, stateMachine, animationSlots, animationSets,
28
+ * uniqueTokenCount, editorData, extendedData}`, so the guard rejected 100% of
29
+ * the only GSF data this organization can produce. It survived because its
30
+ * test built a literal to satisfy the guard rather than reading a file, which
31
+ * is a test proving its own premise.
13
32
  */
14
33
  class Tr2GrannyStateRes extends CjsResource {
34
+ /** Resolved animation path to its loaded resource, as Carbon's m_gStateAnimFiles. */
35
+ #animations = new Map();
36
+
15
37
  /** Updates payload in the current resource payload lifecycle. */
16
38
  SetPayload(payload = null) {
17
39
  if (payload === null) {
@@ -19,13 +41,168 @@ class Tr2GrannyStateRes extends CjsResource {
19
41
  return this;
20
42
  }
21
43
  assertResourcePayloadObject("Tr2GrannyStateRes", payload);
22
- if (!payload.skeleton && !Array.isArray(payload.additiveAnimations)) {
23
- throw resourcePayloadError("Tr2GrannyStateRes", "Expected skeleton data or an additiveAnimations array.");
44
+ // The state machine is what makes it a GState. Carbon walks the animation
45
+ // sets straight after, so an absent or malformed set list is worth
46
+ // rejecting here rather than at the first bind.
47
+ if (!payload.stateMachine) {
48
+ throw resourcePayloadError("Tr2GrannyStateRes", "Expected a GState payload carrying stateMachine.");
49
+ }
50
+ if (payload.animationSets !== undefined && !Array.isArray(payload.animationSets)) {
51
+ throw resourcePayloadError("Tr2GrannyStateRes", "animationSets must be an array of animation sets when present.");
24
52
  }
25
53
  super.SetPayload(payload);
26
54
  return this;
27
55
  }
28
- static payload = "granny-state";
56
+
57
+ /**
58
+ * Turn GSF source into this resource.
59
+ *
60
+ * `data` may be an already-projected GSF document or the raw reflected
61
+ * Granny result. Bytes require `options.format` - a `CjsGr2Format`-shaped
62
+ * reader - rather than an import, because every format here is a
63
+ * tree-shakeable subpath and a resource that imports its reader drags the
64
+ * whole of gr2 into anything that touches GState.
65
+ *
66
+ * @param {object|ArrayBuffer|ArrayBufferView} data GSF document, raw result, or bytes.
67
+ * @param {object|null} [options] `{ format }` plus model values applied after the read.
68
+ * @returns {Tr2GrannyStateRes} This resource.
69
+ */
70
+ DoLoad(data, options = null) {
71
+ const {
72
+ format = null,
73
+ ...values
74
+ } = options || {};
75
+ let document = data;
76
+ if (!data?.stateMachine) {
77
+ // `readGsf`, not `read`: a `.gsf` and a `.gr2` are the same container
78
+ // family read two different ways, and gr2 carries a separate entry point
79
+ // for the state-machine one. Naming it here is the fallback for a caller
80
+ // that passed a bare format; a registered route carries the reader name
81
+ // as data, so the store's answer needs no such knowledge.
82
+ const route = this.ResolveFormat(data, format ? {
83
+ format,
84
+ read: "readGsf"
85
+ } : null);
86
+ if (!route) throw resourceFormatRequiredError("Tr2GrannyStateRes", this.ext);
87
+ document = route.Read(data);
88
+ }
89
+ this.#animations.clear();
90
+ this.SetPayload(document);
91
+ this.SetValues(values);
92
+ return this;
93
+ }
94
+
95
+ /** The authored animation state graph. */
96
+ GetStateMachine() {
97
+ return this.GetPayload()?.stateMachine ?? null;
98
+ }
99
+
100
+ /** Named slots the state machine binds clips into. */
101
+ GetAnimationSlots() {
102
+ return this.GetPayload()?.animationSlots ?? [];
103
+ }
104
+
105
+ /** Animation sets, each naming external `.gr2` clips. */
106
+ GetAnimationSets() {
107
+ return this.GetPayload()?.animationSets ?? [];
108
+ }
109
+
110
+ /** Which model in the referenced geometry this graph drives, and its retarget source. */
111
+ GetCharacterInfo() {
112
+ return this.GetPayload()?.character ?? null;
113
+ }
114
+
115
+ /**
116
+ * Every referenced `.gr2` animation path, resolved against this resource and
117
+ * deduplicated, in first-seen order.
118
+ *
119
+ * References are authored RELATIVE to the `.gsf` - `../anim/idle.gr2` - so a
120
+ * consumer that requests them verbatim asks for a path that does not exist.
121
+ * Carbon resolves them the same way in `GetFullAnimPath`
122
+ * (`Tr2GrannyStateRes.cpp:80-103`), which is ported here rather than
123
+ * reinvented.
124
+ *
125
+ * @returns {string[]} Resolved animation resource paths.
126
+ */
127
+ GetGStateAnimFileRefPaths() {
128
+ const seen = [];
129
+ for (const set of this.GetAnimationSets()) {
130
+ for (const reference of set?.sourceFileReferences || []) {
131
+ const resolved = Tr2GrannyStateRes.ResolveAnimPath(reference, this.path);
132
+ if (resolved && !seen.includes(resolved)) seen.push(resolved);
133
+ }
134
+ }
135
+ return seen;
136
+ }
137
+
138
+ /**
139
+ * Resolve one authored reference against the GSF's own directory.
140
+ *
141
+ * Ported from Carbon `Tr2GrannyStateRes.cpp:80-103`: drop the file name, walk
142
+ * up one directory per leading `..`, drop a leading `.`, join, and normalize
143
+ * separators. An absolute `res:/` reference is returned as-is, since nothing
144
+ * relative can be meant by it.
145
+ *
146
+ * @param {string} reference Authored, usually relative, reference.
147
+ * @param {string} owner Path of the `.gsf` that carries it.
148
+ * @returns {string} Resolved path.
149
+ */
150
+ static ResolveAnimPath(reference, owner) {
151
+ let value = String(reference || "").replace(/\\/gu, "/");
152
+ if (!value) return "";
153
+ if (/^[a-z]+:\//iu.test(value)) return value;
154
+ let directory = String(owner || "").replace(/\\/gu, "/");
155
+ const cut = directory.lastIndexOf("/");
156
+ directory = cut === -1 ? "" : directory.slice(0, cut);
157
+
158
+ // Carbon tests `substr(0, 2) == ".."` and then erases three characters,
159
+ // which mangles a file whose NAME begins with two dots. Matching the
160
+ // separator too cannot break a legitimate relative path and cannot corrupt
161
+ // a name, so the guard is tightened rather than ported verbatim.
162
+ while (value.startsWith("../")) {
163
+ value = value.slice(3);
164
+ const up = directory.lastIndexOf("/");
165
+ directory = up === -1 ? "" : directory.slice(0, up);
166
+ }
167
+ if (value.startsWith("./")) value = value.slice(2);
168
+ return directory ? `${directory}/${value}` : value;
169
+ }
170
+
171
+ /**
172
+ * Attach a loaded animation resource for one resolved reference.
173
+ *
174
+ * Carbon keeps the same map (`m_gStateAnimFiles`) and binds the whole set
175
+ * once every reference is present. Who fetches them is the caller's business;
176
+ * this resource only records what has arrived.
177
+ *
178
+ * @param {string} path Resolved animation path.
179
+ * @param {*} resource Loaded animation resource.
180
+ * @returns {Tr2GrannyStateRes} This resource.
181
+ */
182
+ SetAnimationResource(path, resource) {
183
+ this.#animations.set(String(path), resource);
184
+ return this;
185
+ }
186
+
187
+ /** The animation resource attached for a resolved reference, if any. */
188
+ GetAnimationResource(path) {
189
+ return this.#animations.get(String(path)) ?? null;
190
+ }
191
+
192
+ /**
193
+ * Whether every referenced animation has been attached.
194
+ *
195
+ * Carbon gates binding on exactly this: the state machine cannot sample a
196
+ * clip whose file has not arrived. A GSF that references nothing is fully
197
+ * loaded once its own document is present, not before.
198
+ *
199
+ * @returns {boolean}
200
+ */
201
+ IsFullyLoaded() {
202
+ if (!this.GetPayload()) return false;
203
+ return this.GetGStateAnimFileRefPaths().every(path => this.#animations.has(path));
204
+ }
205
+ static payload = ResourceRequirement.GRANNY_STATE;
29
206
  }
30
207
  CjsSchema.define(Tr2GrannyStateRes, {
31
208
  className: "Tr2GrannyStateRes",
@@ -1 +1 @@
1
- {"version":3,"file":"Tr2GrannyStateRes.js","sources":["../../../../../src/resource/geometry/granny/Tr2GrannyStateRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/Tr2GrannyStateRes.h\nimport { CjsSchema } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsResource } from \"../../CjsResource.js\";\nimport { assertResourcePayloadObject, resourcePayloadError } from \"../../resourceBoundary.js\";\n\n/**\n * Runtime-owned GState resource.\n *\n * GState uses the Gr2Reader path but may contain additive skeleton/state data\n * without models. Consumers inspect its plain payload rather than assuming the\n * model-bearing TriGrannyRes payload shape.\n */\nexport class Tr2GrannyStateRes extends CjsResource\n{\n /** Updates payload in the current resource payload lifecycle. */\n SetPayload(payload = null)\n {\n if (payload === null)\n {\n super.SetPayload(null);\n return this;\n }\n assertResourcePayloadObject(\"Tr2GrannyStateRes\", payload);\n if (!payload.skeleton && !Array.isArray(payload.additiveAnimations))\n {\n throw resourcePayloadError(\n \"Tr2GrannyStateRes\",\n \"Expected skeleton data or an additiveAnimations array.\"\n );\n }\n super.SetPayload(payload);\n return this;\n }\n\n static payload = \"granny-state\";\n}\n\nCjsSchema.define(Tr2GrannyStateRes, {\n className: \"Tr2GrannyStateRes\",\n family: \"resources\"\n});\n"],"names":["Tr2GrannyStateRes","CjsResource","SetPayload","payload","assertResourcePayloadObject","skeleton","Array","isArray","additiveAnimations","resourcePayloadError","CjsSchema","define","className","family"],"mappings":";;;;AAAA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,iBAAiB,SAASC,WAAW,CAClD;AACE;AACAC,EAAAA,UAAUA,CAACC,OAAO,GAAG,IAAI,EACzB;IACE,IAAIA,OAAO,KAAK,IAAI,EACpB;AACE,MAAA,KAAK,CAACD,UAAU,CAAC,IAAI,CAAC;AACtB,MAAA,OAAO,IAAI;AACb,IAAA;AACAE,IAAAA,2BAA2B,CAAC,mBAAmB,EAAED,OAAO,CAAC;AACzD,IAAA,IAAI,CAACA,OAAO,CAACE,QAAQ,IAAI,CAACC,KAAK,CAACC,OAAO,CAACJ,OAAO,CAACK,kBAAkB,CAAC,EACnE;AACE,MAAA,MAAMC,oBAAoB,CACxB,mBAAmB,EACnB,wDACF,CAAC;AACH,IAAA;AACA,IAAA,KAAK,CAACP,UAAU,CAACC,OAAO,CAAC;AACzB,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,OAAOA,OAAO,GAAG,cAAc;AACjC;AAEAO,SAAS,CAACC,MAAM,CAACX,iBAAiB,EAAE;AAClCY,EAAAA,SAAS,EAAE,mBAAmB;AAC9BC,EAAAA,MAAM,EAAE;AACV,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"Tr2GrannyStateRes.js","sources":["../../../../../src/resource/geometry/granny/Tr2GrannyStateRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/Tr2GrannyStateRes.h\nimport { CjsSchema } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsResource } from \"../../CjsResource.js\";\nimport { assertResourcePayloadObject, resourceFormatRequiredError, resourcePayloadError } from \"../../resourceBoundary.js\";\nimport { ResourceRequirement } from \"../../ResourceRequirement.js\";\n\n/**\n * Runtime-owned GState resource.\n *\n * A `.gsf` is a Granny container whose root is a character animation STATE\n * MACHINE rather than geometry: the state graph, the animation slots it binds\n * clips into, and animation sets that reference external `.gr2` animation\n * files by relative path. It carries no geometry and no skeleton — the\n * skeleton lives in the referenced `.gr2`.\n *\n * Carbon's `Tr2GrannyStateRes` holds the parsed container plus a map of those\n * referenced animations loaded as separate `TriGrannyRes`, and binds them\n * through `GStateBindCharacterFileReferences`. `Tr2GStateAnimation` is the\n * consumer: named parameters drive the state machine, active states sample\n * clips from the referenced sets, and the composited pose becomes bone\n * matrices for skinning.\n *\n * THE GUARD THIS REPLACES WAS FABRICATED. It demanded `skeleton` or an\n * `additiveAnimations` array — two fields that appear in no reader output, no\n * Carbon struct, and no schema. `CjsGr2Format.readGsf` returns\n * `{format, container, character, stateMachine, animationSlots, animationSets,\n * uniqueTokenCount, editorData, extendedData}`, so the guard rejected 100% of\n * the only GSF data this organization can produce. It survived because its\n * test built a literal to satisfy the guard rather than reading a file, which\n * is a test proving its own premise.\n */\nexport class Tr2GrannyStateRes extends CjsResource\n{\n /** Resolved animation path to its loaded resource, as Carbon's m_gStateAnimFiles. */\n #animations = new Map();\n\n /** Updates payload in the current resource payload lifecycle. */\n SetPayload(payload = null)\n {\n if (payload === null)\n {\n super.SetPayload(null);\n return this;\n }\n assertResourcePayloadObject(\"Tr2GrannyStateRes\", payload);\n // The state machine is what makes it a GState. Carbon walks the animation\n // sets straight after, so an absent or malformed set list is worth\n // rejecting here rather than at the first bind.\n if (!payload.stateMachine)\n {\n throw resourcePayloadError(\n \"Tr2GrannyStateRes\",\n \"Expected a GState payload carrying stateMachine.\"\n );\n }\n if (payload.animationSets !== undefined && !Array.isArray(payload.animationSets))\n {\n throw resourcePayloadError(\n \"Tr2GrannyStateRes\",\n \"animationSets must be an array of animation sets when present.\"\n );\n }\n super.SetPayload(payload);\n return this;\n }\n\n\n /**\n * Turn GSF source into this resource.\n *\n * `data` may be an already-projected GSF document or the raw reflected\n * Granny result. Bytes require `options.format` - a `CjsGr2Format`-shaped\n * reader - rather than an import, because every format here is a\n * tree-shakeable subpath and a resource that imports its reader drags the\n * whole of gr2 into anything that touches GState.\n *\n * @param {object|ArrayBuffer|ArrayBufferView} data GSF document, raw result, or bytes.\n * @param {object|null} [options] `{ format }` plus model values applied after the read.\n * @returns {Tr2GrannyStateRes} This resource.\n */\n DoLoad(data, options = null)\n {\n const { format = null, ...values } = options || {};\n let document = data;\n\n if (!data?.stateMachine)\n {\n // `readGsf`, not `read`: a `.gsf` and a `.gr2` are the same container\n // family read two different ways, and gr2 carries a separate entry point\n // for the state-machine one. Naming it here is the fallback for a caller\n // that passed a bare format; a registered route carries the reader name\n // as data, so the store's answer needs no such knowledge.\n const route = this.ResolveFormat(data, format ? { format, read: \"readGsf\" } : null);\n if (!route) throw resourceFormatRequiredError(\"Tr2GrannyStateRes\", this.ext);\n document = route.Read(data);\n }\n\n this.#animations.clear();\n this.SetPayload(document);\n this.SetValues(values);\n return this;\n }\n\n /** The authored animation state graph. */\n GetStateMachine()\n {\n return this.GetPayload()?.stateMachine ?? null;\n }\n\n /** Named slots the state machine binds clips into. */\n GetAnimationSlots()\n {\n return this.GetPayload()?.animationSlots ?? [];\n }\n\n /** Animation sets, each naming external `.gr2` clips. */\n GetAnimationSets()\n {\n return this.GetPayload()?.animationSets ?? [];\n }\n\n /** Which model in the referenced geometry this graph drives, and its retarget source. */\n GetCharacterInfo()\n {\n return this.GetPayload()?.character ?? null;\n }\n\n /**\n * Every referenced `.gr2` animation path, resolved against this resource and\n * deduplicated, in first-seen order.\n *\n * References are authored RELATIVE to the `.gsf` - `../anim/idle.gr2` - so a\n * consumer that requests them verbatim asks for a path that does not exist.\n * Carbon resolves them the same way in `GetFullAnimPath`\n * (`Tr2GrannyStateRes.cpp:80-103`), which is ported here rather than\n * reinvented.\n *\n * @returns {string[]} Resolved animation resource paths.\n */\n GetGStateAnimFileRefPaths()\n {\n const seen = [];\n for (const set of this.GetAnimationSets())\n {\n for (const reference of (set?.sourceFileReferences || []))\n {\n const resolved = Tr2GrannyStateRes.ResolveAnimPath(reference, this.path);\n if (resolved && !seen.includes(resolved)) seen.push(resolved);\n }\n }\n return seen;\n }\n\n /**\n * Resolve one authored reference against the GSF's own directory.\n *\n * Ported from Carbon `Tr2GrannyStateRes.cpp:80-103`: drop the file name, walk\n * up one directory per leading `..`, drop a leading `.`, join, and normalize\n * separators. An absolute `res:/` reference is returned as-is, since nothing\n * relative can be meant by it.\n *\n * @param {string} reference Authored, usually relative, reference.\n * @param {string} owner Path of the `.gsf` that carries it.\n * @returns {string} Resolved path.\n */\n static ResolveAnimPath(reference, owner)\n {\n let value = String(reference || \"\").replace(/\\\\/gu, \"/\");\n if (!value) return \"\";\n if (/^[a-z]+:\\//iu.test(value)) return value;\n\n let directory = String(owner || \"\").replace(/\\\\/gu, \"/\");\n const cut = directory.lastIndexOf(\"/\");\n directory = cut === -1 ? \"\" : directory.slice(0, cut);\n\n // Carbon tests `substr(0, 2) == \"..\"` and then erases three characters,\n // which mangles a file whose NAME begins with two dots. Matching the\n // separator too cannot break a legitimate relative path and cannot corrupt\n // a name, so the guard is tightened rather than ported verbatim.\n while (value.startsWith(\"../\"))\n {\n value = value.slice(3);\n const up = directory.lastIndexOf(\"/\");\n directory = up === -1 ? \"\" : directory.slice(0, up);\n }\n if (value.startsWith(\"./\")) value = value.slice(2);\n\n return directory ? `${directory}/${value}` : value;\n }\n\n /**\n * Attach a loaded animation resource for one resolved reference.\n *\n * Carbon keeps the same map (`m_gStateAnimFiles`) and binds the whole set\n * once every reference is present. Who fetches them is the caller's business;\n * this resource only records what has arrived.\n *\n * @param {string} path Resolved animation path.\n * @param {*} resource Loaded animation resource.\n * @returns {Tr2GrannyStateRes} This resource.\n */\n SetAnimationResource(path, resource)\n {\n this.#animations.set(String(path), resource);\n return this;\n }\n\n /** The animation resource attached for a resolved reference, if any. */\n GetAnimationResource(path)\n {\n return this.#animations.get(String(path)) ?? null;\n }\n\n /**\n * Whether every referenced animation has been attached.\n *\n * Carbon gates binding on exactly this: the state machine cannot sample a\n * clip whose file has not arrived. A GSF that references nothing is fully\n * loaded once its own document is present, not before.\n *\n * @returns {boolean}\n */\n IsFullyLoaded()\n {\n if (!this.GetPayload()) return false;\n return this.GetGStateAnimFileRefPaths().every(path => this.#animations.has(path));\n }\n\n static payload = ResourceRequirement.GRANNY_STATE;\n}\n\nCjsSchema.define(Tr2GrannyStateRes, {\n className: \"Tr2GrannyStateRes\",\n family: \"resources\"\n});\n"],"names":["Tr2GrannyStateRes","CjsResource","Map","SetPayload","payload","assertResourcePayloadObject","stateMachine","resourcePayloadError","animationSets","undefined","Array","isArray","DoLoad","data","options","format","values","document","route","ResolveFormat","read","resourceFormatRequiredError","ext","Read","clear","SetValues","GetStateMachine","GetPayload","GetAnimationSlots","animationSlots","GetAnimationSets","GetCharacterInfo","character","GetGStateAnimFileRefPaths","seen","set","reference","sourceFileReferences","resolved","ResolveAnimPath","path","includes","push","owner","value","String","replace","test","directory","cut","lastIndexOf","slice","startsWith","up","SetAnimationResource","resource","GetAnimationResource","get","IsFullyLoaded","every","has","ResourceRequirement","GRANNY_STATE","CjsSchema","define","className","family"],"mappings":"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"}
@@ -1,14 +1,15 @@
1
1
  import { CjsSchema } from '@carbonenginejs/runtime-utils/schema';
2
2
  import { CjsResource } from '../../CjsResource.js';
3
3
  import { assertResourcePayloadObject, resourcePayloadError } from '../../resourceBoundary.js';
4
+ import { ResourceRequirement } from '../../ResourceRequirement.js';
4
5
 
5
6
  // Source: trinity/trinity/Resources/TriGrannyRes.h
6
7
 
7
- /**
8
- * Runtime-owned Granny resource.
9
- *
10
- * The attached plain payload carries decoded Granny data. This resource
11
- * owns lifecycle identity; reader and engine-specific behavior stays outside.
8
+ /**
9
+ * Runtime-owned Granny resource.
10
+ *
11
+ * The attached plain payload carries decoded Granny data. This resource
12
+ * owns lifecycle identity; reader and engine-specific behavior stays outside.
12
13
  */
13
14
  class TriGrannyRes extends CjsResource {
14
15
  /** Updates payload in the current resource payload lifecycle. */
@@ -18,13 +19,24 @@ class TriGrannyRes extends CjsResource {
18
19
  return this;
19
20
  }
20
21
  assertResourcePayloadObject("TriGrannyRes", payload);
21
- if (!Array.isArray(payload.models) && !Array.isArray(payload.meshes)) {
22
- throw resourcePayloadError("TriGrannyRes", "Expected a models or meshes array.", "models");
22
+ // Emptiness, not absence. The old guard asked whether the arrays EXISTED,
23
+ // and `CjsGr2Format.read` always builds them - so reading a `.gsf` state
24
+ // machine as geometry produced `{ meshes: [], models: [], animations: [] }`,
25
+ // which sailed through and published a model with nothing in it.
26
+ //
27
+ // The Granny container is the same for both, and only content distinguishes
28
+ // them, so this is where the expectation "I am geometry" has to be enforced:
29
+ // the format cannot know what the caller wanted. Animations count, because
30
+ // an animation-only `.gr2` is a real file - a GSF's referenced clips are
31
+ // exactly that, and they carry no meshes by design.
32
+ const empty = value => !Array.isArray(value) || value.length === 0;
33
+ if (empty(payload.models) && empty(payload.meshes) && empty(payload.animations)) {
34
+ throw resourcePayloadError("TriGrannyRes", "Expected models, meshes or animations, and found none. A Granny " + "container carrying none of them is usually a state machine read as " + "geometry - check whether this file is a GState.", "models");
23
35
  }
24
36
  super.SetPayload(payload);
25
37
  return this;
26
38
  }
27
- static payload = "granny";
39
+ static payload = ResourceRequirement.GEOMETRY;
28
40
  }
29
41
  CjsSchema.define(TriGrannyRes, {
30
42
  className: "TriGrannyRes",
@@ -1 +1 @@
1
- {"version":3,"file":"TriGrannyRes.js","sources":["../../../../../src/resource/geometry/granny/TriGrannyRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/TriGrannyRes.h\nimport { CjsSchema } from \"@carbonenginejs/runtime-utils/schema\";\nimport { CjsResource } from \"../../CjsResource.js\";\nimport { assertResourcePayloadObject, resourcePayloadError } from \"../../resourceBoundary.js\";\n\n/**\n * Runtime-owned Granny resource.\n *\n * The attached plain payload carries decoded Granny data. This resource\n * owns lifecycle identity; reader and engine-specific behavior stays outside.\n */\nexport class TriGrannyRes extends CjsResource\n{\n /** Updates payload in the current resource payload lifecycle. */\n SetPayload(payload = null)\n {\n if (payload === null)\n {\n super.SetPayload(null);\n return this;\n }\n assertResourcePayloadObject(\"TriGrannyRes\", payload);\n if (!Array.isArray(payload.models) && !Array.isArray(payload.meshes))\n {\n throw resourcePayloadError(\n \"TriGrannyRes\",\n \"Expected a models or meshes array.\",\n \"models\"\n );\n }\n super.SetPayload(payload);\n return this;\n }\n\n static payload = \"granny\";\n}\n\nCjsSchema.define(TriGrannyRes, {\n className: \"TriGrannyRes\",\n family: \"resources\"\n});\n"],"names":["TriGrannyRes","CjsResource","SetPayload","payload","assertResourcePayloadObject","Array","isArray","models","meshes","resourcePayloadError","CjsSchema","define","className","family"],"mappings":";;;;AAAA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAY,SAASC,WAAW,CAC7C;AACE;AACAC,EAAAA,UAAUA,CAACC,OAAO,GAAG,IAAI,EACzB;IACE,IAAIA,OAAO,KAAK,IAAI,EACpB;AACE,MAAA,KAAK,CAACD,UAAU,CAAC,IAAI,CAAC;AACtB,MAAA,OAAO,IAAI;AACb,IAAA;AACAE,IAAAA,2BAA2B,CAAC,cAAc,EAAED,OAAO,CAAC;AACpD,IAAA,IAAI,CAACE,KAAK,CAACC,OAAO,CAACH,OAAO,CAACI,MAAM,CAAC,IAAI,CAACF,KAAK,CAACC,OAAO,CAACH,OAAO,CAACK,MAAM,CAAC,EACpE;AACE,MAAA,MAAMC,oBAAoB,CACxB,cAAc,EACd,oCAAoC,EACpC,QACF,CAAC;AACH,IAAA;AACA,IAAA,KAAK,CAACP,UAAU,CAACC,OAAO,CAAC;AACzB,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,OAAOA,OAAO,GAAG,QAAQ;AAC3B;AAEAO,SAAS,CAACC,MAAM,CAACX,YAAY,EAAE;AAC7BY,EAAAA,SAAS,EAAE,cAAc;AACzBC,EAAAA,MAAM,EAAE;AACV,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"TriGrannyRes.js","sources":["../../../../../src/resource/geometry/granny/TriGrannyRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/TriGrannyRes.h\r\nimport { CjsSchema } from \"@carbonenginejs/runtime-utils/schema\";\r\nimport { CjsResource } from \"../../CjsResource.js\";\r\nimport { assertResourcePayloadObject, resourcePayloadError } from \"../../resourceBoundary.js\";\r\nimport { ResourceRequirement } from \"../../ResourceRequirement.js\";\r\n\r\n/**\r\n * Runtime-owned Granny resource.\r\n *\r\n * The attached plain payload carries decoded Granny data. This resource\r\n * owns lifecycle identity; reader and engine-specific behavior stays outside.\r\n */\r\nexport class TriGrannyRes extends CjsResource\r\n{\r\n /** Updates payload in the current resource payload lifecycle. */\r\n SetPayload(payload = null)\r\n {\r\n if (payload === null)\r\n {\r\n super.SetPayload(null);\r\n return this;\r\n }\r\n assertResourcePayloadObject(\"TriGrannyRes\", payload);\r\n // Emptiness, not absence. The old guard asked whether the arrays EXISTED,\r\n // and `CjsGr2Format.read` always builds them - so reading a `.gsf` state\r\n // machine as geometry produced `{ meshes: [], models: [], animations: [] }`,\r\n // which sailed through and published a model with nothing in it.\r\n //\r\n // The Granny container is the same for both, and only content distinguishes\r\n // them, so this is where the expectation \"I am geometry\" has to be enforced:\r\n // the format cannot know what the caller wanted. Animations count, because\r\n // an animation-only `.gr2` is a real file - a GSF's referenced clips are\r\n // exactly that, and they carry no meshes by design.\r\n const empty = value => !Array.isArray(value) || value.length === 0;\r\n if (empty(payload.models) && empty(payload.meshes) && empty(payload.animations))\r\n {\r\n throw resourcePayloadError(\r\n \"TriGrannyRes\",\r\n \"Expected models, meshes or animations, and found none. A Granny \"\r\n + \"container carrying none of them is usually a state machine read as \"\r\n + \"geometry - check whether this file is a GState.\",\r\n \"models\"\r\n );\r\n }\r\n super.SetPayload(payload);\r\n return this;\r\n }\r\n\r\n static payload = ResourceRequirement.GEOMETRY;\n}\n\r\nCjsSchema.define(TriGrannyRes, {\r\n className: \"TriGrannyRes\",\r\n family: \"resources\"\r\n});\r\n"],"names":["TriGrannyRes","CjsResource","SetPayload","payload","assertResourcePayloadObject","empty","value","Array","isArray","length","models","meshes","animations","resourcePayloadError","ResourceRequirement","GEOMETRY","CjsSchema","define","className","family"],"mappings":";;;;;AAAA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAY,SAASC,WAAW,CAC7C;AACE;AACAC,EAAAA,UAAUA,CAACC,OAAO,GAAG,IAAI,EACzB;IACE,IAAIA,OAAO,KAAK,IAAI,EACpB;AACE,MAAA,KAAK,CAACD,UAAU,CAAC,IAAI,CAAC;AACtB,MAAA,OAAO,IAAI;AACb,IAAA;AACAE,IAAAA,2BAA2B,CAAC,cAAc,EAAED,OAAO,CAAC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,MAAME,KAAK,GAAGC,KAAK,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,IAAIA,KAAK,CAACG,MAAM,KAAK,CAAC;IAClE,IAAIJ,KAAK,CAACF,OAAO,CAACO,MAAM,CAAC,IAAIL,KAAK,CAACF,OAAO,CAACQ,MAAM,CAAC,IAAIN,KAAK,CAACF,OAAO,CAACS,UAAU,CAAC,EAC/E;MACE,MAAMC,oBAAoB,CACxB,cAAc,EACd,kEAAkE,GAChE,qEAAqE,GACrE,iDAAiD,EACnD,QACF,CAAC;AACH,IAAA;AACA,IAAA,KAAK,CAACX,UAAU,CAACC,OAAO,CAAC;AACzB,IAAA,OAAO,IAAI;AACb,EAAA;AAEA,EAAA,OAAOA,OAAO,GAAGW,mBAAmB,CAACC,QAAQ;AAC/C;AAEAC,SAAS,CAACC,MAAM,CAACjB,YAAY,EAAE;AAC7BkB,EAAAA,SAAS,EAAE,cAAc;AACzBC,EAAAA,MAAM,EAAE;AACV,CAAC,CAAC;;;;"}
@@ -1,6 +1,7 @@
1
1
  export { CjsResource } from './CjsResource.js';
2
2
  export { CjsLoadingObject } from './CjsLoadingObject.js';
3
3
  export { ResourceHandlerMode } from './ResourceHandlerMode.js';
4
+ export { ResourceRequirement, isResourceRequirement } from './ResourceRequirement.js';
4
5
  export { Tr2LightProfileRes } from './Tr2LightProfileRes.js';
5
6
  export { AudioGeometryResData } from './audio/AudioGeometryResData.js';
6
7
  export { CjsAudioBufferRes } from './audio/CjsAudioBufferRes.js';