Some progress with single socket storage.
This commit is contained in:
parent
5d54b57a95
commit
4b8bee5a9b
@ -170,49 +170,3 @@ void AnimGraphBlendTree::PropagateTimeToNodeInputs(const AnimNode* node) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Socket* AnimGraphBlendTree::GetInputSocket(const std::string& name) {
|
||||
for (size_t i = 0, n = m_node_output_connections[1].size(); i < n; i++) {
|
||||
AnimGraphConnection& connection = m_node_output_connections[1][i];
|
||||
if (connection.m_source_socket_name == name) {
|
||||
return &connection.m_socket;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Socket* AnimGraphBlendTree::GetOutputSocket(const std::string& name) {
|
||||
for (size_t i = 0, n = m_node_input_connections[0].size(); i < n; i++) {
|
||||
AnimGraphConnection& connection = m_node_input_connections[0][i];
|
||||
if (connection.m_target_socket_name == name) {
|
||||
return &connection.m_socket;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const Socket* AnimGraphBlendTree::GetInputSocket(
|
||||
const std::string& name) const {
|
||||
for (size_t i = 0, n = m_node_output_connections[1].size(); i < n; i++) {
|
||||
const AnimGraphConnection& connection = m_node_output_connections[1][i];
|
||||
if (connection.m_source_socket_name == name) {
|
||||
return &connection.m_socket;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const Socket* AnimGraphBlendTree::GetOutputSocket(
|
||||
const std::string& name) const {
|
||||
for (size_t i = 0, n = m_node_input_connections[0].size(); i < n; i++) {
|
||||
const AnimGraphConnection& connection = m_node_input_connections[0][i];
|
||||
if (connection.m_target_socket_name == name) {
|
||||
return &connection.m_socket;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
@ -17,6 +17,17 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
std::vector<AnimNode*> m_eval_ordered_nodes;
|
||||
std::vector<std::vector<AnimGraphConnection> > m_node_input_connections;
|
||||
std::vector<std::vector<AnimGraphConnection> > m_node_output_connections;
|
||||
|
||||
[[nodiscard]] const std::vector<AnimGraphConnection>&
|
||||
GetGraphInputConnections() const {
|
||||
return m_node_output_connections[1];
|
||||
}
|
||||
|
||||
[[nodiscard]] const std::vector<AnimGraphConnection>&
|
||||
GetGraphOutputConnections() const {
|
||||
return m_node_input_connections[0];
|
||||
}
|
||||
|
||||
std::vector<AnimData*> m_animdata_blocks;
|
||||
NodeDescriptorBase* m_node_descriptor = nullptr;
|
||||
char* m_input_buffer = nullptr;
|
||||
@ -80,9 +91,6 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
}
|
||||
}
|
||||
|
||||
Socket* GetInputSocket(const std::string& name);
|
||||
Socket* GetOutputSocket(const std::string& name);
|
||||
|
||||
const Socket* GetInputSocket(const std::string& name) const;
|
||||
const Socket* GetOutputSocket(const std::string& name) const;
|
||||
|
||||
@ -103,24 +111,9 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
m_node_output_connections[1][i];
|
||||
|
||||
if (graph_input_connection.m_source_socket_name == name) {
|
||||
connected_node_indices.push_back(
|
||||
GetAnimNodeIndex(graph_input_connection.m_target_node));
|
||||
*graph_input_connection.m_socket.m_reference.ptr_ptr = value_ptr;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < connected_node_indices.size(); i++) {
|
||||
const std::vector<AnimGraphConnection>& connected_node_input_connections =
|
||||
m_node_input_connections[connected_node_indices[i]];
|
||||
for (int j = 0; j < connected_node_input_connections.size(); j++) {
|
||||
const AnimGraphConnection& node_input_connection =
|
||||
connected_node_input_connections[j];
|
||||
if (node_input_connection.m_source_node == m_nodes[1]
|
||||
&& node_input_connection.m_source_socket_name == name) {
|
||||
*node_input_connection.m_socket.m_reference.ptr_ptr = value_ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Sets the address that is used for the specified AnimGraph output Socket.
|
||||
@ -133,9 +126,11 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
void SetOutput(const char* name, T* value_ptr) {
|
||||
m_node_descriptor->SetInput(name, value_ptr);
|
||||
|
||||
for (int i = 0; i < m_node_input_connections[0].size(); i++) {
|
||||
const std::vector<AnimGraphConnection>& graph_output_connections =
|
||||
GetGraphOutputConnections();
|
||||
for (int i = 0; i < graph_output_connections.size(); i++) {
|
||||
const AnimGraphConnection& graph_output_connection =
|
||||
m_node_input_connections[0][i];
|
||||
graph_output_connections[i];
|
||||
|
||||
if (graph_output_connection.m_target_socket_name == name) {
|
||||
if (graph_output_connection.m_source_node == m_nodes[1]
|
||||
@ -149,23 +144,6 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
}
|
||||
|
||||
*graph_output_connection.m_socket.m_reference.ptr_ptr = value_ptr;
|
||||
|
||||
// Make sure all other output connections of this pin use the same output pointer
|
||||
int source_node_index =
|
||||
GetAnimNodeIndex(graph_output_connection.m_source_node);
|
||||
for (int j = 0; j < m_node_output_connections[source_node_index].size();
|
||||
j++) {
|
||||
const AnimGraphConnection& source_output_connection =
|
||||
m_node_output_connections[source_node_index][j];
|
||||
if (source_output_connection.m_target_node == m_nodes[0]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (source_output_connection.m_source_socket_name
|
||||
== graph_output_connection.m_source_socket_name) {
|
||||
*source_output_connection.m_socket.m_reference.ptr_ptr = value_ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -185,7 +163,7 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
const AnimGraphConnection& graph_output_connection =
|
||||
m_node_input_connections[0][i];
|
||||
if (graph_output_connection.m_target_socket_name == name) {
|
||||
return static_cast<float*>(
|
||||
return static_cast<T*>(
|
||||
*graph_output_connection.m_socket.m_reference.ptr_ptr);
|
||||
}
|
||||
}
|
||||
@ -194,18 +172,24 @@ struct AnimGraphBlendTree : public AnimNode {
|
||||
}
|
||||
|
||||
void* GetInputPtr(const std::string& name) const {
|
||||
const Socket* input_socket = GetInputSocket(name);
|
||||
if (input_socket != nullptr) {
|
||||
return input_socket->m_reference.ptr;
|
||||
const std::vector<AnimGraphConnection> graph_input_connections =
|
||||
GetGraphInputConnections();
|
||||
for (const AnimGraphConnection& connection : graph_input_connections) {
|
||||
if (connection.m_source_socket_name == name) {
|
||||
return connection.m_socket.m_reference.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void* GetOutputPtr(const std::string& name) const {
|
||||
const Socket* input_socket = GetOutputSocket(name);
|
||||
if (input_socket != nullptr) {
|
||||
return input_socket->m_reference.ptr;
|
||||
const std::vector<AnimGraphConnection> graph_output_connections =
|
||||
GetGraphOutputConnections();
|
||||
for (const AnimGraphConnection& connection : graph_output_connections) {
|
||||
if (connection.m_source_socket_name == name) {
|
||||
return connection.m_socket.m_reference.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
@ -730,8 +730,12 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
|
||||
if (connection.source_node_index == 1) {
|
||||
instance_connection.m_socket = *target_socket;
|
||||
} else if (connection.target_node_index == 0) {
|
||||
instance_connection.m_socket = *source_socket;
|
||||
} else {
|
||||
*instance_connection.m_socket.m_reference.ptr_ptr =
|
||||
*target_socket->m_reference.ptr_ptr =
|
||||
&instance.m_connection_data_storage[connection_data_offset];
|
||||
*source_socket->m_reference.ptr_ptr =
|
||||
&instance.m_connection_data_storage[connection_data_offset];
|
||||
}
|
||||
|
||||
@ -740,16 +744,8 @@ void AnimGraphResource::CreateBlendTreeConnectionInstances(
|
||||
instance.m_node_output_connections[connection.source_node_index].push_back(
|
||||
instance_connection);
|
||||
|
||||
source_node_descriptor->SetOutputUnchecked(
|
||||
connection.source_socket_name.c_str(),
|
||||
instance_connection.m_socket.m_reference.ptr_ptr);
|
||||
|
||||
target_node_descriptor->SetInputUnchecked(
|
||||
connection.target_socket_name.c_str(),
|
||||
instance_connection.m_socket.m_reference.ptr_ptr);
|
||||
|
||||
//*instance_connection.m_socket.m_reference.ptr_ptr =
|
||||
// &instance.m_connection_data_storage[connection_data_offset];
|
||||
*instance_connection.m_socket.m_reference.ptr_ptr =
|
||||
&instance.m_connection_data_storage[connection_data_offset];
|
||||
|
||||
if (source_socket->m_type == SocketType::SocketTypeAnimation) {
|
||||
instance.m_animdata_blocks.push_back(
|
||||
|
@ -754,17 +754,14 @@ TEST_CASE_METHOD(
|
||||
CHECK(blend2_instance->i_input0 == anim_sampler_walk->o_output);
|
||||
CHECK(blend2_instance->i_input1 == anim_sampler_run->o_output);
|
||||
|
||||
const Socket* graph_output_socket =
|
||||
blend_tree_graph.GetOutputSocket("GraphOutput");
|
||||
AnimData* graph_output =
|
||||
static_cast<AnimData*>(*graph_output_socket->m_reference.ptr_ptr);
|
||||
AnimData* graph_output = static_cast<AnimData*>(
|
||||
blend_tree_graph.GetOutputPtr<AnimData>("GraphOutput"));
|
||||
|
||||
CHECK(
|
||||
graph_output->m_local_matrices.size()
|
||||
== graph_context.m_skeleton->num_soa_joints());
|
||||
|
||||
CHECK(
|
||||
blend2_instance->o_output == *graph_output_socket->m_reference.ptr_ptr);
|
||||
CHECK(blend2_instance->o_output == graph_output);
|
||||
}
|
||||
|
||||
graph_context.freeAnimations();
|
||||
@ -811,39 +808,40 @@ TEST_CASE("ResourceSaveLoadMathGraphInputs", "[AnimGraphResource]") {
|
||||
"GraphVec3Output",
|
||||
nullptr);
|
||||
|
||||
AnimNodeResource* graph_input_node = blend_tree_resource.GetGraphInputNode();
|
||||
graph_input_node->m_socket_accessor->RegisterOutput<float>(
|
||||
AnimNodeResource* graph_input_node_resource =
|
||||
blend_tree_resource.GetGraphInputNode();
|
||||
graph_input_node_resource->m_socket_accessor->RegisterOutput<float>(
|
||||
"GraphFloatInput",
|
||||
nullptr);
|
||||
|
||||
// Prepare graph inputs and outputs
|
||||
AnimNodeResource* float_to_vec3_node =
|
||||
AnimNodeResource* float_to_vec3_node_resource =
|
||||
blend_tree_resource.m_nodes[float_to_vec3_node_index];
|
||||
|
||||
REQUIRE(blend_tree_resource.ConnectSockets(
|
||||
graph_input_node,
|
||||
graph_input_node_resource,
|
||||
"GraphFloatInput",
|
||||
graph_output_node,
|
||||
"GraphFloatOutput"));
|
||||
|
||||
REQUIRE(blend_tree_resource.ConnectSockets(
|
||||
graph_input_node,
|
||||
graph_input_node_resource,
|
||||
"GraphFloatInput",
|
||||
float_to_vec3_node,
|
||||
float_to_vec3_node_resource,
|
||||
"Input0"));
|
||||
REQUIRE(blend_tree_resource.ConnectSockets(
|
||||
graph_input_node,
|
||||
graph_input_node_resource,
|
||||
"GraphFloatInput",
|
||||
float_to_vec3_node,
|
||||
float_to_vec3_node_resource,
|
||||
"Input1"));
|
||||
REQUIRE(blend_tree_resource.ConnectSockets(
|
||||
graph_input_node,
|
||||
graph_input_node_resource,
|
||||
"GraphFloatInput",
|
||||
float_to_vec3_node,
|
||||
float_to_vec3_node_resource,
|
||||
"Input2"));
|
||||
|
||||
REQUIRE(blend_tree_resource.ConnectSockets(
|
||||
float_to_vec3_node,
|
||||
float_to_vec3_node_resource,
|
||||
"Output",
|
||||
graph_output_node,
|
||||
"GraphVec3Output"));
|
||||
@ -869,7 +867,7 @@ TEST_CASE("ResourceSaveLoadMathGraphInputs", "[AnimGraphResource]") {
|
||||
== graph_loaded_output_node->m_socket_accessor->m_inputs.size());
|
||||
|
||||
REQUIRE(
|
||||
graph_input_node->m_socket_accessor->m_outputs.size()
|
||||
graph_input_node_resource->m_socket_accessor->m_outputs.size()
|
||||
== graph_loaded_input_node->m_socket_accessor->m_outputs.size());
|
||||
|
||||
REQUIRE(
|
||||
@ -890,17 +888,17 @@ TEST_CASE("ResourceSaveLoadMathGraphInputs", "[AnimGraphResource]") {
|
||||
AnimGraphBlendTree blend_tree_node;
|
||||
graph_resource_loaded.CreateBlendTreeInstance(blend_tree_node);
|
||||
|
||||
REQUIRE(blend_tree_node.GetInputSocket("GraphFloatInput") != nullptr);
|
||||
Socket* input_socket =
|
||||
blend_tree_node.GetInputSocket("GraphFloatInput");
|
||||
|
||||
REQUIRE(
|
||||
blend_tree_node.GetInputPtr("GraphFloatInput")
|
||||
== blend_tree_node.m_input_buffer);
|
||||
|
||||
float graph_float_input = 123.456f;
|
||||
blend_tree_node.SetInput("GraphFloatInput", &graph_float_input);
|
||||
|
||||
MathFloatToVec3Node* float_to_vec3_node =
|
||||
dynamic_cast<MathFloatToVec3Node*>(
|
||||
blend_tree_node.m_nodes[float_to_vec3_node_index]);
|
||||
|
||||
CHECK(float_to_vec3_node->i_input0 == &graph_float_input);
|
||||
CHECK(float_to_vec3_node->i_input1 == &graph_float_input);
|
||||
CHECK(float_to_vec3_node->i_input2 == &graph_float_input);
|
||||
|
||||
AND_WHEN("Evaluating Graph") {
|
||||
AnimGraphContext context;
|
||||
context.m_graph = nullptr;
|
||||
@ -1028,8 +1026,7 @@ TEST_CASE("SimpleMathEvaluations", "[AnimGraphResource]") {
|
||||
AnimGraphBlendTree blend_tree;
|
||||
graph_resource_loaded.CreateBlendTreeInstance(blend_tree);
|
||||
|
||||
REQUIRE(blend_tree.GetInputSocket("GraphFloatInput") != nullptr);
|
||||
REQUIRE(
|
||||
CHECK(
|
||||
blend_tree.GetInputPtr("GraphFloatInput")
|
||||
== blend_tree.m_input_buffer);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user