Ember
Loading...
Searching...
No Matches
TreeBuilder.cpp
Go to the documentation of this file.
2
4
5namespace Ember {
6namespace Network {
7
8TreeBuilder::BuildResult TreeBuilder::Build(const Protocol::TreeInit *tree_init) {
9 BuildResult result;
10 m_nodeCount = 0;
11
12 if (!tree_init) {
13 result.error = "TreeInit is null";
14 return result;
15 }
16
17 if (!tree_init->tree_id()) {
18 result.error = "TreeInit missing tree_id";
19 return result;
20 }
21
22 if (!tree_init->root()) {
23 result.error = "TreeInit missing root node";
24 return result;
25 }
26
27 std::string treeName = tree_init->tree_name() ? tree_init->tree_name()->str() : tree_init->tree_id()->str();
28
29 auto tree = std::make_shared<EmberCore::BehaviorTree>(treeName);
30
31 tree->SetMetadata("tree_id", tree_init->tree_id()->str());
32
33 auto rootNode = BuildNode(tree_init->root());
34 if (!rootNode) {
35 result.error = "Failed to build root node";
36 return result;
37 }
38
39 tree->SetRootNode(std::move(rootNode));
40
41 if (tree_init->blackboards()) {
42 BuildBlackboards(tree.get(), tree_init->blackboards());
43 }
44
45 if (tree_init->metadata()) {
46 for (const auto *kv : *tree_init->metadata()) {
47 if (kv->key()) {
48 std::string value = kv->value() ? kv->value()->str() : "";
49 tree->SetMetadata(kv->key()->str(), value);
50 }
51 }
52 }
53
54 result.success = true;
55 result.tree = tree;
56 result.node_count = m_nodeCount;
57
58 return result;
59}
60
61std::unique_ptr<EmberCore::Node> TreeBuilder::BuildNode(const Protocol::NodeDefinition *def) {
62 if (!def) {
63 return nullptr;
64 }
65
66 std::string name = def->name() ? def->name()->str() : "Unnamed";
67 EmberCore::Node::Type nodeType = ConvertNodeType(def->node_type());
68
69 auto node = std::make_unique<EmberCore::Node>(name, nodeType);
71
72 if (def->subtype()) {
73 node->SetAttribute("subtype", def->subtype()->str());
74 }
75
76 if (def->description()) {
77 node->SetAttribute("description", def->description()->str());
78 }
79
80 node->SetAttribute("tcp_node_id", std::to_string(def->id()));
81
82 if (def->attributes()) {
83 for (const auto *kv : *def->attributes()) {
84 if (kv->key()) {
85 std::string value = kv->value() ? kv->value()->str() : "";
86 node->SetAttribute(kv->key()->str(), value);
87 }
88 }
89 }
90
91 if (def->children()) {
92 for (const auto *childDef : *def->children()) {
93 auto childNode = BuildNode(childDef);
94 if (childNode) {
95 node->AddChild(std::move(childNode));
96 }
97 }
98 }
99
100 return node;
101}
102
105 const flatbuffers::Vector<flatbuffers::Offset<Protocol::BlackboardDefinition>> *blackboards) {
106 if (!tree || !blackboards) {
107 return;
108 }
109
110 for (const auto *bbDef : *blackboards) {
111 if (!bbDef || !bbDef->id()) {
112 continue;
113 }
114
115 auto blackboard = std::make_unique<EmberCore::Blackboard>(bbDef->id()->str());
116
117 if (bbDef->entries()) {
118 for (const auto *entryDef : *bbDef->entries()) {
119 if (!entryDef || !entryDef->key()) {
120 continue;
121 }
122
123 std::string key = entryDef->key()->str();
124 std::string typeStr = entryDef->value_type() ? entryDef->value_type()->str() : "STRING";
125 std::string value = entryDef->value() ? entryDef->value()->str() : "";
126
128
129 blackboard->AddEntry(key, dataType, value);
130 }
131 }
132
133 tree->AddBlackboard(std::move(blackboard));
134 }
135}
136
153
154} // namespace Network
155} // namespace Ember
Represents a complete behavior tree data structure.
void AddBlackboard(std::unique_ptr< Blackboard > blackboard)
static DataType ParseDataType(const EmberCore::String &typeStr)
DataType
Supported data types for blackboard entries.
Type
Node types for behavior tree classification.
Definition Node.h:25
void BuildBlackboards(EmberCore::BehaviorTree *tree, const flatbuffers::Vector< flatbuffers::Offset< Protocol::BlackboardDefinition > > *blackboards)
EmberCore::Node::Type ConvertNodeType(Protocol::NodeType fb_type)
BuildResult Build(const Protocol::TreeInit *tree_init)
std::unique_ptr< EmberCore::Node > BuildNode(const Protocol::NodeDefinition *def)
std::shared_ptr< EmberCore::BehaviorTree > tree
Definition TreeBuilder.h:17