Made BlendTreeResource::m_nodes and ::m_connections private.
This is a prerequisite to properly track Node input/output connections and to compute eval order in the BlendTreeResources.
This commit is contained in:
@@ -222,16 +222,16 @@ AnimNodeResource* sAnimGraphNodeFromJson(
|
||||
//
|
||||
// AnimGraphConnectionResource <-> Json
|
||||
//
|
||||
json sAnimGraphConnectionToJson(const BlendTreeConnectionResource& connection) {
|
||||
json sAnimGraphConnectionToJson(const BlendTreeConnectionResource* connection) {
|
||||
json result;
|
||||
|
||||
result["type"] = "AnimGraphConnectionResource";
|
||||
|
||||
result["source_node_index"] = connection.source_node_index;
|
||||
result["source_socket_name"] = connection.source_socket_name;
|
||||
result["source_node_index"] = connection->source_node_index;
|
||||
result["source_socket_name"] = connection->source_socket_name;
|
||||
|
||||
result["target_node_index"] = connection.target_node_index;
|
||||
result["target_socket_name"] = connection.target_socket_name;
|
||||
result["target_node_index"] = connection->target_node_index;
|
||||
result["target_socket_name"] = connection->target_socket_name;
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -260,8 +260,8 @@ static json sAnimGraphResourceBlendTreeToJson(
|
||||
const BlendTreeResource& blend_tree_resource =
|
||||
anim_graph_resource.m_blend_tree_resource;
|
||||
|
||||
for (size_t i = 0; i < blend_tree_resource.m_nodes.size(); i++) {
|
||||
const AnimNodeResource* node = blend_tree_resource.m_nodes[i];
|
||||
for (size_t i = 0; i < blend_tree_resource.GetNumNodes(); i++) {
|
||||
const AnimNodeResource* node = blend_tree_resource.GetNode(i);
|
||||
|
||||
if (node->m_node_type_name == "BlendTree") {
|
||||
const AnimGraphResource* graph_resource =
|
||||
@@ -269,26 +269,26 @@ static json sAnimGraphResourceBlendTreeToJson(
|
||||
result["nodes"][i] = sAnimGraphResourceBlendTreeToJson(*graph_resource);
|
||||
} else {
|
||||
result["nodes"][i] =
|
||||
sAnimGraphNodeToJson(node, i, blend_tree_resource.m_connections);
|
||||
sAnimGraphNodeToJson(node, i, blend_tree_resource.GetConnections());
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < blend_tree_resource.m_connections.size(); i++) {
|
||||
const BlendTreeConnectionResource& connection =
|
||||
blend_tree_resource.m_connections[i];
|
||||
for (size_t i = 0; i < blend_tree_resource.GetNumConnections(); i++) {
|
||||
const BlendTreeConnectionResource* connection =
|
||||
blend_tree_resource.GetConnection(i);
|
||||
result["connections"][i] = sAnimGraphConnectionToJson(connection);
|
||||
}
|
||||
|
||||
// Graph inputs and outputs
|
||||
{
|
||||
const AnimNodeResource* graph_output_node = blend_tree_resource.m_nodes[0];
|
||||
const AnimNodeResource* graph_output_node = blend_tree_resource.GetNode(0);
|
||||
const std::vector<Socket> graph_inputs =
|
||||
graph_output_node->m_socket_accessor->m_inputs;
|
||||
for (size_t i = 0; i < graph_inputs.size(); i++) {
|
||||
result["nodes"][0]["inputs"][i] = sSocketToJson(graph_inputs[i]);
|
||||
}
|
||||
|
||||
const AnimNodeResource* graph_input_node = blend_tree_resource.m_nodes[1];
|
||||
const AnimNodeResource* graph_input_node = blend_tree_resource.GetNode(1);
|
||||
const std::vector<Socket> graph_outputs =
|
||||
graph_input_node->m_socket_accessor->m_outputs;
|
||||
for (size_t i = 0; i < graph_outputs.size(); i++) {
|
||||
@@ -319,13 +319,13 @@ static bool sAnimGraphResourceBlendTreeFromJson(
|
||||
}
|
||||
|
||||
AnimNodeResource* node = sAnimGraphNodeFromJson(json_node, i);
|
||||
blend_tree_resource.m_nodes.push_back(node);
|
||||
blend_tree_resource.AddNode(node);
|
||||
}
|
||||
|
||||
// Graph outputs
|
||||
const json& graph_outputs = json_data["nodes"][0]["inputs"];
|
||||
for (const auto& graph_output : graph_outputs) {
|
||||
AnimNodeResource* graph_node = blend_tree_resource.m_nodes[0];
|
||||
AnimNodeResource* graph_node = blend_tree_resource.GetNode(0);
|
||||
graph_node->m_socket_accessor->m_inputs.push_back(
|
||||
sJsonToSocket(graph_output));
|
||||
}
|
||||
@@ -334,7 +334,7 @@ static bool sAnimGraphResourceBlendTreeFromJson(
|
||||
if (json_data["nodes"][1].contains("outputs")) {
|
||||
const json& graph_inputs = json_data["nodes"][1]["outputs"];
|
||||
for (const auto& graph_input : graph_inputs) {
|
||||
AnimNodeResource* graph_node = blend_tree_resource.m_nodes[1];
|
||||
AnimNodeResource* graph_node = blend_tree_resource.GetNode(1);
|
||||
graph_node->m_socket_accessor->m_outputs.push_back(
|
||||
sJsonToSocket(graph_input));
|
||||
}
|
||||
@@ -352,7 +352,12 @@ static bool sAnimGraphResourceBlendTreeFromJson(
|
||||
|
||||
BlendTreeConnectionResource connection =
|
||||
sAnimGraphConnectionFromJson(json_connection);
|
||||
blend_tree_resource.m_connections.push_back(connection);
|
||||
|
||||
blend_tree_resource.ConnectSockets(
|
||||
blend_tree_resource.GetNode(connection.source_node_index),
|
||||
connection.source_socket_name,
|
||||
blend_tree_resource.GetNode(connection.target_node_index),
|
||||
connection.target_socket_name);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -420,6 +425,11 @@ bool BlendTreeResource::ConnectSockets(
|
||||
connection.target_socket_name = target_socket_name;
|
||||
m_connections.push_back(connection);
|
||||
|
||||
m_node_input_connection_indices[target_node_index].emplace_back(
|
||||
m_connections.size() - 1);
|
||||
m_node_output_connection_indices[source_node_index].emplace_back(
|
||||
m_connections.size() - 1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -509,12 +519,13 @@ void AnimGraphResource::CreateBlendTreeInstance(
|
||||
|
||||
void AnimGraphResource::CreateBlendTreeRuntimeNodeInstances(
|
||||
AnimGraphBlendTree& result) const {
|
||||
for (auto node_resource : m_blend_tree_resource.m_nodes) {
|
||||
for (const AnimNodeResource* node_resource :
|
||||
m_blend_tree_resource.GetNodes()) {
|
||||
AnimNode* node = AnimNodeFactory(node_resource->m_node_type_name);
|
||||
|
||||
if (node_resource->m_node_type_name == "BlendTree") {
|
||||
AnimGraphResource* embedded_blend_tree_resource =
|
||||
dynamic_cast<AnimGraphResource*>(node_resource);
|
||||
const AnimGraphResource* embedded_blend_tree_resource =
|
||||
dynamic_cast<const AnimGraphResource*>(node_resource);
|
||||
assert(embedded_blend_tree_resource != nullptr);
|
||||
AnimGraphBlendTree* embedded_blend_tree =
|
||||
dynamic_cast<AnimGraphBlendTree*>(node);
|
||||
@@ -545,9 +556,9 @@ void AnimGraphResource::PrepareBlendTreeIOData(
|
||||
AnimNodeDescriptorFactory("BlendTree", instance.m_nodes[0]);
|
||||
|
||||
instance.m_node_descriptor->m_outputs =
|
||||
m_blend_tree_resource.m_nodes[1]->m_socket_accessor->m_outputs;
|
||||
m_blend_tree_resource.GetNode(1)->m_socket_accessor->m_outputs;
|
||||
instance.m_node_descriptor->m_inputs =
|
||||
m_blend_tree_resource.m_nodes[0]->m_socket_accessor->m_inputs;
|
||||
m_blend_tree_resource.GetNode(0)->m_socket_accessor->m_inputs;
|
||||
|
||||
//
|
||||
// graph inputs
|
||||
@@ -597,9 +608,10 @@ void AnimGraphResource::PrepareBlendTreeIOData(
|
||||
// connecton data storage
|
||||
//
|
||||
size_t connection_data_storage_size = 0;
|
||||
for (const auto& connection : m_blend_tree_resource.m_connections) {
|
||||
for (const BlendTreeConnectionResource& connection :
|
||||
m_blend_tree_resource.GetConnections()) {
|
||||
const AnimNodeResource* source_node =
|
||||
m_blend_tree_resource.m_nodes[connection.source_node_index];
|
||||
m_blend_tree_resource.GetNode(connection.source_node_index);
|
||||
Socket* source_socket = source_node->m_socket_accessor->GetOutputSocket(
|
||||
connection.source_socket_name.c_str());
|
||||
|
||||
@@ -622,19 +634,19 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
AnimGraphBlendTree& instance,
|
||||
NodeSocketDataOffsetMap& node_offset_map) const {
|
||||
std::vector<NodeDescriptorBase*> instance_node_descriptors(
|
||||
m_blend_tree_resource.m_nodes.size(),
|
||||
m_blend_tree_resource.GetNumNodes(),
|
||||
nullptr);
|
||||
for (int i = 0; i < m_blend_tree_resource.m_nodes.size(); i++) {
|
||||
for (int i = 0; i < m_blend_tree_resource.GetNumNodes(); i++) {
|
||||
instance_node_descriptors[i] = AnimNodeDescriptorFactory(
|
||||
m_blend_tree_resource.m_nodes[i]->m_node_type_name,
|
||||
m_blend_tree_resource.GetNode(i)->m_node_type_name,
|
||||
instance.m_nodes[i]);
|
||||
|
||||
if (i > 1
|
||||
&& m_blend_tree_resource.m_nodes[i]->m_node_type_name == "BlendTree") {
|
||||
&& m_blend_tree_resource.GetNode(i)->m_node_type_name == "BlendTree") {
|
||||
instance_node_descriptors[i]->m_inputs =
|
||||
m_blend_tree_resource.m_nodes[i]->m_socket_accessor->m_inputs;
|
||||
m_blend_tree_resource.GetNode(i)->m_socket_accessor->m_inputs;
|
||||
instance_node_descriptors[i]->m_outputs =
|
||||
m_blend_tree_resource.m_nodes[i]->m_socket_accessor->m_outputs;
|
||||
m_blend_tree_resource.GetNode(i)->m_socket_accessor->m_outputs;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -642,7 +654,9 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
instance_node_descriptors[1]->m_outputs =
|
||||
instance.m_node_descriptor->m_outputs;
|
||||
|
||||
for (const auto& connection : m_blend_tree_resource.m_connections) {
|
||||
size_t connection_data_offset = 0;
|
||||
for (const BlendTreeConnectionResource& connection :
|
||||
m_blend_tree_resource.GetConnections()) {
|
||||
NodeDescriptorBase* source_node_descriptor =
|
||||
instance_node_descriptors[connection.source_node_index];
|
||||
NodeDescriptorBase* target_node_descriptor =
|
||||
@@ -684,9 +698,9 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
instance.m_node_output_connections[connection.source_node_index]
|
||||
.push_back(embedded_graph_activation_connection);
|
||||
|
||||
AnimGraphResource* source_blend_tree_resource =
|
||||
dynamic_cast<AnimGraphResource*>(
|
||||
m_blend_tree_resource.m_nodes[connection.source_node_index]);
|
||||
const AnimGraphResource* source_blend_tree_resource =
|
||||
dynamic_cast<const AnimGraphResource*>(
|
||||
m_blend_tree_resource.GetNode(connection.source_node_index));
|
||||
AnimGraphBlendTree* source_blend_tree =
|
||||
dynamic_cast<AnimGraphBlendTree*>(source_node);
|
||||
|
||||
@@ -701,9 +715,9 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
// that the embedded node knows about its connection partner in the parent
|
||||
// tree. This allows the embedded node to properly activate the node in
|
||||
// the parent graph.
|
||||
AnimGraphResource* target_blend_tree_resource =
|
||||
dynamic_cast<AnimGraphResource*>(
|
||||
m_blend_tree_resource.m_nodes[connection.target_node_index]);
|
||||
const AnimGraphResource* target_blend_tree_resource =
|
||||
dynamic_cast<const AnimGraphResource*>(
|
||||
m_blend_tree_resource.GetNode(connection.target_node_index));
|
||||
AnimGraphBlendTree* target_blend_tree =
|
||||
dynamic_cast<AnimGraphBlendTree*>(target_node);
|
||||
|
||||
@@ -750,7 +764,7 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
}
|
||||
|
||||
NodeSocketPair node_socket_pair{
|
||||
m_blend_tree_resource.m_nodes[connection.source_node_index],
|
||||
m_blend_tree_resource.GetNode(connection.source_node_index),
|
||||
source_socket->m_name};
|
||||
|
||||
NodeSocketDataOffsetMap::const_iterator socket_data_offset_iter =
|
||||
@@ -822,15 +836,15 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
const_input_buffer_offset += i->m_type_size;
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_blend_tree_resource.m_nodes.size(); i++) {
|
||||
for (int i = 0; i < m_blend_tree_resource.GetNumNodes(); i++) {
|
||||
delete instance_node_descriptors[i];
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraphResource::SetRuntimeNodeProperties(
|
||||
AnimGraphBlendTree& result) const {
|
||||
for (int i = 2; i < m_blend_tree_resource.m_nodes.size(); i++) {
|
||||
const AnimNodeResource* node_resource = m_blend_tree_resource.m_nodes[i];
|
||||
for (int i = 2; i < m_blend_tree_resource.GetNumNodes(); i++) {
|
||||
const AnimNodeResource* node_resource = m_blend_tree_resource.GetNode(i);
|
||||
|
||||
NodeDescriptorBase* node_instance_accessor = AnimNodeDescriptorFactory(
|
||||
node_resource->m_node_type_name,
|
||||
|
||||
@@ -32,8 +32,8 @@ struct BlendTreeConnectionResource {
|
||||
};
|
||||
|
||||
struct BlendTreeResource {
|
||||
std::vector<AnimNodeResource*> m_nodes;
|
||||
std::vector<BlendTreeConnectionResource> m_connections;
|
||||
std::vector<std::vector<size_t> > m_node_input_connection_indices;
|
||||
std::vector<std::vector<size_t> > m_node_output_connection_indices;
|
||||
|
||||
~BlendTreeResource() { CleanupNodes(); }
|
||||
|
||||
@@ -41,6 +41,9 @@ struct BlendTreeResource {
|
||||
CleanupNodes();
|
||||
|
||||
m_connections.clear();
|
||||
|
||||
m_node_input_connection_indices.clear();
|
||||
m_node_output_connection_indices.clear();
|
||||
}
|
||||
|
||||
void CleanupNodes() {
|
||||
@@ -54,10 +57,13 @@ struct BlendTreeResource {
|
||||
}
|
||||
|
||||
void InitGraphConnectors() {
|
||||
m_nodes.push_back(AnimNodeResourceFactory("BlendTreeSockets"));
|
||||
m_nodes[0]->m_name = "Outputs";
|
||||
m_nodes.push_back(AnimNodeResourceFactory("BlendTreeSockets"));
|
||||
m_nodes[1]->m_name = "Inputs";
|
||||
AddNode(AnimNodeResourceFactory("BlendTreeSockets"));
|
||||
AnimNodeResource* output_node = GetGraphOutputNode();
|
||||
output_node->m_name = "Outputs";
|
||||
|
||||
AddNode(AnimNodeResourceFactory("BlendTreeSockets"));
|
||||
AnimNodeResource* input_node = GetGraphInputNode();
|
||||
output_node->m_name = "Inputs";
|
||||
}
|
||||
|
||||
[[nodiscard]] AnimNodeResource* GetGraphOutputNode() const {
|
||||
@@ -77,6 +83,40 @@ struct BlendTreeResource {
|
||||
return -1;
|
||||
}
|
||||
|
||||
[[maybe_unused]] size_t AddNode(AnimNodeResource* node_resource) {
|
||||
m_nodes.push_back(node_resource);
|
||||
m_node_input_connection_indices.emplace_back();
|
||||
m_node_output_connection_indices.emplace_back();
|
||||
return m_nodes.size() - 1;
|
||||
}
|
||||
|
||||
[[nodiscard]] size_t GetNumNodes() const { return m_nodes.size(); }
|
||||
[[nodiscard]] AnimNodeResource* GetNode(size_t i) { return m_nodes[i]; }
|
||||
[[nodiscard]] const AnimNodeResource* GetNode(size_t i) const {
|
||||
return m_nodes[i];
|
||||
}
|
||||
[[nodiscard]] const std::vector<AnimNodeResource*>& GetNodes() const {
|
||||
return m_nodes;
|
||||
}
|
||||
|
||||
[[nodiscard]] size_t GetNumConnections() const {
|
||||
return m_connections.size();
|
||||
}
|
||||
|
||||
[[nodiscard]] BlendTreeConnectionResource* GetConnection(size_t i) {
|
||||
return &m_connections[i];
|
||||
}
|
||||
|
||||
[[nodiscard]] const BlendTreeConnectionResource* GetConnection(
|
||||
size_t i) const {
|
||||
return &m_connections[i];
|
||||
}
|
||||
|
||||
[[nodiscard]] const std::vector<BlendTreeConnectionResource>& GetConnections()
|
||||
const {
|
||||
return m_connections;
|
||||
}
|
||||
|
||||
bool ConnectSockets(
|
||||
const AnimNodeResource* source_node,
|
||||
const std::string& source_socket_name,
|
||||
@@ -143,6 +183,10 @@ struct BlendTreeResource {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<AnimNodeResource*> m_nodes;
|
||||
std::vector<BlendTreeConnectionResource> m_connections;
|
||||
};
|
||||
|
||||
struct StateMachineTransitionResources {
|
||||
|
||||
Reference in New Issue
Block a user