activity_sdk_squad_graph.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #pragma once
  2. #include <array>
  3. #include <cstdint>
  4. #include <string>
  5. #include <vector>
  6. #include "activity_sdk_squad_inventory.h"
  7. namespace sunrise::client::content::activity::sdk_generation::squad_inventory {
  8. /** Exact status of one authored spawner's unique source descriptor join. */
  9. enum class SourceDescriptorStatus : std::uint8_t {
  10. exact,
  11. missing,
  12. ambiguous,
  13. };
  14. /** Exact result of decoding and resolving one authored spawner object-slot reference. */
  15. enum class ReferenceResolutionStatus : std::uint8_t {
  16. exact,
  17. invalidEncoding,
  18. sourceDescriptorMissing,
  19. sourceDescriptorAmbiguous,
  20. targetMissing,
  21. targetDescriptorMismatch,
  22. targetAmbiguous,
  23. };
  24. /** Exact cardinality of one point identity in one rule config context's scenario. */
  25. enum class PointContextStatus : std::uint8_t {
  26. unresolved,
  27. exact,
  28. ambiguous,
  29. };
  30. /** One normalized authored-spawner definition before scenario ownership is projected. */
  31. struct GraphSpawner final {
  32. std::string id{};
  33. std::uint32_t configTag{};
  34. std::uint64_t rawReference98{};
  35. std::uint64_t rawReferenceA0{};
  36. std::uint64_t primaryComponentOffset{};
  37. std::uint64_t secondaryComponentOffset{};
  38. std::uint32_t primaryComponentClass{};
  39. std::uint32_t secondaryComponentClass{};
  40. format::Range members{};
  41. format::Range sourceDescriptorCandidates{};
  42. format::Range references{};
  43. std::uint32_t sourceDescriptorRow{format::kAbsentIndex};
  44. SourceDescriptorStatus sourceDescriptorStatus{SourceDescriptorStatus::missing};
  45. bool complete{};
  46. /** The rule row standing for the spawner's own point set, when it carries one. */
  47. bool hasInlinePointSet{};
  48. std::uint32_t inlineRuleRow{format::kAbsentIndex};
  49. };
  50. /** One normalized authored member with six exact candidate-lane ranges. */
  51. struct GraphMember final {
  52. std::string id{};
  53. std::uint32_t spawnerRow{format::kAbsentIndex};
  54. std::uint32_t memberOrdinal{};
  55. std::uint32_t memberKey{};
  56. std::uint32_t reservedU32{};
  57. std::array<format::Range, format::kSquadCandidateCountLaneCount> candidateLanes{};
  58. };
  59. /** One complete stable candidate row, including null and sentinel-valued placements. */
  60. struct GraphCandidate final {
  61. std::string id{};
  62. std::uint32_t spawnerRow{format::kAbsentIndex};
  63. std::uint32_t memberRow{format::kAbsentIndex};
  64. std::uint32_t memberOrdinal{};
  65. std::uint32_t lane{};
  66. std::uint32_t candidateOrdinal{};
  67. std::uint32_t actorDefinitionTag{format::kAbsentIndex};
  68. CandidateState state{CandidateState::nullPlacement};
  69. std::uint64_t candidateDescriptorOffset{};
  70. std::int64_t placementRelative{};
  71. std::uint64_t placementOffset{};
  72. std::array<std::byte, 16> candidateTail{};
  73. std::uint32_t placedEntryClass{format::kAbsentIndex};
  74. std::array<std::uint32_t, 4> quaternionBits{};
  75. std::array<std::uint32_t, 3> positionBits{};
  76. std::uint32_t uniformScaleBits{};
  77. std::uint32_t nameHash{};
  78. std::uint32_t placementFlagsRaw{};
  79. std::uint64_t placedEntryIdentity{};
  80. };
  81. /** One normalized authored spawn-rule definition. */
  82. struct GraphRule final {
  83. std::string id{};
  84. std::uint32_t configTag{};
  85. std::uint64_t primaryComponentOffset{};
  86. std::uint64_t secondaryComponentOffset{};
  87. std::uint32_t primaryComponentClass{};
  88. std::uint32_t secondaryComponentClass{};
  89. format::Range points{};
  90. bool complete{};
  91. /** An inline rule belongs to one spawner and shares its config tag. */
  92. bool inlineForm{};
  93. std::uint32_t spawnerRow{format::kAbsentIndex};
  94. };
  95. /** One complete 0x48 authored point row. */
  96. struct GraphPoint final {
  97. std::string id{};
  98. std::uint32_t ruleRow{format::kAbsentIndex};
  99. std::uint32_t pointOrdinal{};
  100. std::uint64_t placedEntryIdentity{};
  101. std::uint64_t rowOffset{};
  102. std::array<std::byte, 64> rawTail{};
  103. format::Range contexts{};
  104. };
  105. /** One package descriptor retained as authored graph provenance. */
  106. struct GraphDescriptor final {
  107. std::string id{};
  108. std::uint32_t configTag{};
  109. std::uint32_t objectIndex{format::kAbsentIndex};
  110. std::uint32_t slotIndex{format::kAbsentIndex};
  111. std::uint32_t descriptorOffset{};
  112. std::uint32_t componentClass{};
  113. std::uint32_t senseSchema{};
  114. std::uint32_t authSchema{};
  115. bool complete{};
  116. };
  117. /** One raw slot-schema input retained without presenting it as a replacement schema family. */
  118. struct GraphSlotSchemaProvenance final {
  119. std::uint32_t slotIndex{format::kAbsentIndex};
  120. std::uint32_t componentClass{format::kAbsentIndex};
  121. std::uint32_t senseSchema{format::kAbsentIndex};
  122. std::uint32_t authSchema{format::kAbsentIndex};
  123. bool exact{};
  124. };
  125. /** One reached actor definition tag retained as provenance for the actor_classes family. */
  126. struct GraphActorDefinitionProvenance final {
  127. std::uint32_t definitionTag{format::kAbsentIndex};
  128. };
  129. /** One source-descriptor candidate owned by an authored spawner. */
  130. struct GraphSourceDescriptorCandidate final {
  131. std::uint32_t spawnerRow{format::kAbsentIndex};
  132. std::uint32_t descriptorRow{format::kAbsentIndex};
  133. };
  134. /** One candidate descriptor inspected while resolving a raw spawner reference. */
  135. struct GraphReferenceDescriptor final {
  136. std::uint32_t referenceRow{format::kAbsentIndex};
  137. std::uint32_t descriptorRow{format::kAbsentIndex};
  138. bool authoritative{};
  139. bool resolvedTarget{};
  140. };
  141. /** One decoded raw 0x98 or 0xA0 spawner reference and its complete resolution evidence. */
  142. struct GraphReference final {
  143. std::uint32_t spawnerRow{format::kAbsentIndex};
  144. /** Exact occurrence-scoped source when one config is reused by separate scenarios. */
  145. std::uint32_t sourceDescriptorRow{format::kAbsentIndex};
  146. std::uint32_t referenceOrdinal{};
  147. std::uint64_t rawReference{};
  148. std::uint32_t targetObjectKey{};
  149. std::uint32_t targetSlotType{};
  150. std::uint32_t targetSlotIndex{};
  151. format::Range candidateDescriptors{};
  152. std::uint32_t resolvedRuleRow{format::kAbsentIndex};
  153. std::uint32_t resolvedObjectRow{format::kAbsentIndex};
  154. std::uint32_t resolvedSlotRow{format::kAbsentIndex};
  155. ReferenceResolutionStatus status{ReferenceResolutionStatus::targetMissing};
  156. bool encodingValid{};
  157. };
  158. /** One normalized authored-spawner to authored-rule definition edge. */
  159. struct GraphEdge final {
  160. std::string id{};
  161. std::uint32_t spawnerRow{format::kAbsentIndex};
  162. std::uint32_t ruleRow{format::kAbsentIndex};
  163. std::uint32_t sourceDescriptorRow{format::kAbsentIndex};
  164. std::uint32_t targetDescriptorRow{format::kAbsentIndex};
  165. std::uint32_t targetObjectRow{format::kAbsentIndex};
  166. std::uint32_t targetSlotRow{format::kAbsentIndex};
  167. std::uint32_t referenceMask{};
  168. format::Range targetDescriptors{};
  169. format::Range scenarioContexts{};
  170. bool associationExact{};
  171. bool sameObject{};
  172. };
  173. /** One descriptor in an edge's exact logical target group. */
  174. struct GraphEdgeTargetDescriptor final {
  175. std::uint32_t edgeRow{format::kAbsentIndex};
  176. std::uint32_t descriptorRow{format::kAbsentIndex};
  177. };
  178. /** One scenario-owned config context. */
  179. struct GraphConfigContext final {
  180. std::string id{};
  181. std::uint32_t globalRow{format::kAbsentIndex};
  182. std::uint32_t scenarioIndex{format::kAbsentIndex};
  183. std::uint32_t configTag{};
  184. std::uint32_t occurrenceIndex{format::kAbsentIndex};
  185. std::uint32_t objectIndex{format::kAbsentIndex};
  186. std::uint32_t pathOrdinal{};
  187. std::int32_t declaredBubbleIndex{};
  188. std::uint32_t spawnerRow{format::kAbsentIndex};
  189. std::uint32_t ruleRow{format::kAbsentIndex};
  190. bool complete{};
  191. };
  192. /** One scenario-owned authored placement context. */
  193. struct GraphPlacementContext final {
  194. std::string id{};
  195. std::uint32_t globalRow{format::kAbsentIndex};
  196. std::uint32_t scenarioIndex{format::kAbsentIndex};
  197. std::uint32_t occurrenceIndex{format::kAbsentIndex};
  198. /** Set for a container or descriptor-embedded row, which no activity occurrence owns. */
  199. bool external{};
  200. std::uint32_t objectListTag{};
  201. std::uint32_t placementOrdinal{};
  202. std::uint64_t placedEntryIdentity{};
  203. std::array<std::uint32_t, 3> positionBits{};
  204. std::uint32_t objectIndex{format::kAbsentIndex};
  205. std::uint32_t pathOrdinal{};
  206. std::int32_t declaredBubbleIndex{};
  207. std::uint32_t actorDefinitionTag{format::kAbsentIndex};
  208. std::uint64_t sourceOffset{};
  209. std::array<std::uint32_t, 4> quaternionBits{};
  210. std::uint32_t uniformScaleBits{};
  211. std::uint32_t nameHash{};
  212. std::uint32_t placementFlagsRaw{};
  213. std::int64_t auxiliaryRelative{};
  214. bool complete{};
  215. };
  216. /** One point/config-context cardinality summary, including zero and ambiguous matches. */
  217. struct GraphPointContext final {
  218. std::uint32_t globalRow{format::kAbsentIndex};
  219. std::uint32_t scenarioIndex{format::kAbsentIndex};
  220. std::uint32_t pointRow{format::kAbsentIndex};
  221. std::uint32_t configContextRow{format::kAbsentIndex};
  222. format::Range matches{};
  223. PointContextStatus status{PointContextStatus::unresolved};
  224. };
  225. /** One exact same-scenario point-to-placement identity match. */
  226. struct GraphPointPlacementMatch final {
  227. std::uint32_t globalRow{format::kAbsentIndex};
  228. std::uint32_t scenarioIndex{format::kAbsentIndex};
  229. std::uint32_t pointContextRow{format::kAbsentIndex};
  230. std::uint32_t pointRow{format::kAbsentIndex};
  231. std::uint32_t configContextRow{format::kAbsentIndex};
  232. std::uint32_t placementContextRow{format::kAbsentIndex};
  233. std::uint64_t placedEntryIdentity{};
  234. bool sameOccurrence{};
  235. };
  236. /** One scenario membership owned by a global spawner-rule edge. */
  237. struct GraphEdgeContext final {
  238. std::uint32_t globalRow{format::kAbsentIndex};
  239. std::uint32_t scenarioIndex{format::kAbsentIndex};
  240. std::uint32_t edgeRow{format::kAbsentIndex};
  241. };
  242. /** Lossless normalized authored-squad graph split into global definitions and scenario contexts. */
  243. struct GraphSnapshot final {
  244. std::vector<GraphSpawner> spawners{};
  245. std::vector<GraphMember> members{};
  246. std::vector<GraphCandidate> candidates{};
  247. std::vector<GraphRule> rules{};
  248. std::vector<GraphPoint> points{};
  249. std::vector<GraphDescriptor> descriptors{};
  250. std::vector<GraphSlotSchemaProvenance> slotSchemas{};
  251. std::vector<GraphActorDefinitionProvenance> actorDefinitions{};
  252. std::vector<GraphSourceDescriptorCandidate> sourceDescriptorCandidates{};
  253. std::vector<GraphReference> references{};
  254. std::vector<GraphReferenceDescriptor> referenceDescriptors{};
  255. std::vector<GraphEdge> edges{};
  256. std::vector<GraphEdgeTargetDescriptor> edgeTargetDescriptors{};
  257. std::vector<GraphConfigContext> configContexts{};
  258. std::vector<GraphPlacementContext> placementContexts{};
  259. std::vector<GraphPointContext> pointContexts{};
  260. std::vector<GraphPointPlacementMatch> pointPlacementMatches{};
  261. std::vector<GraphEdgeContext> edgeContexts{};
  262. bool ready{};
  263. };
  264. /** Builds one deterministic graph without publishing, serializing, or creating runnable squads. */
  265. [[nodiscard]] bool build_graph(const topology_inventory::Snapshot& topology,
  266. const Facts& facts,
  267. GraphSnapshot& output) noexcept;
  268. } // namespace sunrise::client::content::activity::sdk_generation::squad_inventory