Added index member to node, preparing synctrack and node evaluation.

AnimGraphEditor
Martin Felis 2022-02-24 22:55:40 +01:00
parent d6453911e2
commit 976875c218
3 changed files with 53 additions and 24 deletions

View File

@ -368,7 +368,7 @@ void AnimGraph::UpdateOrderedNodes() {
continue; continue;
} }
int input_node_index = getAnimNodeIndex(input_node); int input_node_index = input_node->m_index;
bool is_node_processed = false; bool is_node_processed = false;
for (size_t j = 0, m = m_eval_ordered_nodes.size(); j < m; j++) { for (size_t j = 0, m = m_eval_ordered_nodes.size(); j < m; j++) {
if (m_eval_ordered_nodes[j] == input_node) { if (m_eval_ordered_nodes[j] == input_node) {
@ -404,7 +404,7 @@ void AnimGraph::MarkActiveNodes() {
for (size_t i = 0, n = m_eval_ordered_nodes.size(); i < n; i++) { for (size_t i = 0, n = m_eval_ordered_nodes.size(); i < n; i++) {
AnimNode* node = m_eval_ordered_nodes[i]; AnimNode* node = m_eval_ordered_nodes[i];
if (CheckIsNodeActive(node)) { if (CheckIsNodeActive(node)) {
int node_index = getAnimNodeIndex(node); int node_index = node->m_index;
node->MarkActiveInputs(m_node_inputs[node_index]); node->MarkActiveInputs(m_node_inputs[node_index]);
// Non-animation data inputs are always active. // Non-animation data inputs are always active.
@ -418,6 +418,18 @@ void AnimGraph::MarkActiveNodes() {
} }
} }
void AnimGraph::EvalSyncTracks() {
for (size_t i = m_eval_ordered_nodes.size() - 1; i >= 0; i--) {
AnimNode* node = m_eval_ordered_nodes[i];
int node_index = node->m_index;
if (node->m_state == AnimNodeEvalState::Deactivated) {
continue;
}
node->CalcSyncTrack(m_node_inputs[node_index]);
}
}
void AnimGraph::UpdateTime(float dt) { void AnimGraph::UpdateTime(float dt) {
const std::vector<NodeInput> graph_output_inputs = m_node_inputs[0]; const std::vector<NodeInput> graph_output_inputs = m_node_inputs[0];
for (size_t i = 0, n = graph_output_inputs.size(); i < n; i++) { for (size_t i = 0, n = graph_output_inputs.size(); i < n; i++) {
@ -433,7 +445,7 @@ void AnimGraph::UpdateTime(float dt) {
continue; continue;
} }
int node_index = getAnimNodeIndex(node); int node_index = node->m_index;
const std::vector<NodeInput> node_inputs = const std::vector<NodeInput> node_inputs =
m_node_inputs[node_index]; m_node_inputs[node_index];
float node_time_now = node->m_time_now; float node_time_now = node->m_time_now;
@ -452,6 +464,17 @@ void AnimGraph::UpdateTime(float dt) {
} }
} }
void AnimGraph::Evaluate() {
for (size_t i = m_eval_ordered_nodes.size() - 1; i >= 0; i--) {
AnimNode* node = m_eval_ordered_nodes[i];
if (node->m_state == AnimNodeEvalState::Deactivated) {
continue;
}
node->Evaluate();
}
}
void* AnimGraph::GetOutput(const std::string& name) const { void* AnimGraph::GetOutput(const std::string& name) const {
Socket* socket = m_socket_accessor->FindInputSocket(name); Socket* socket = m_socket_accessor->FindInputSocket(name);
if (socket == nullptr) { if (socket == nullptr) {

View File

@ -98,6 +98,14 @@ enum class AnimNodeEvalState {
}; };
struct AnimNode { struct AnimNode {
std::string m_name;
std::string m_node_type_name;
float m_time_now = 0.f;
float m_time_last = 0.f;
size_t m_index = -1;
AnimNodeEvalState m_state = AnimNodeEvalState::Undefined;
SyncTrack m_sync_track;
virtual ~AnimNode(){}; virtual ~AnimNode(){};
virtual void MarkActiveInputs(const std::vector<NodeInput>& inputs) { virtual void MarkActiveInputs(const std::vector<NodeInput>& inputs) {
@ -109,18 +117,25 @@ struct AnimNode {
} }
} }
virtual void CalcSyncTrack(const std::vector<NodeInput>& inputs) {
for (size_t i = 0, n = inputs.size(); i < n; i++) {
AnimNode* input_node = inputs[i].m_node;
if (input_node != nullptr
&& inputs[i].m_type == SocketType::SocketTypeAnimation
&& input_node->m_state != AnimNodeEvalState::Deactivated) {
m_sync_track = input_node->m_sync_track;
return;
}
}
}
virtual void UpdateTime(float time_last, float time_now) { virtual void UpdateTime(float time_last, float time_now) {
m_time_last = time_last; m_time_last = time_last;
m_time_now = time_now; m_time_now = time_now;
m_state = AnimNodeEvalState::TimeUpdated; m_state = AnimNodeEvalState::TimeUpdated;
} }
std::string m_name; virtual void Evaluate() {};
std::string m_node_type_name;
float m_time_now = 0.f;
float m_time_last = 0.f;
AnimNodeEvalState m_state = AnimNodeEvalState::Undefined;
SyncTrack m_sync_track;
}; };
@ -598,6 +613,7 @@ struct AnimGraph {
bool CheckIsNodeActive(AnimNode* node) { bool CheckIsNodeActive(AnimNode* node) {
return node->m_state != AnimNodeEvalState::Deactivated; return node->m_state != AnimNodeEvalState::Deactivated;
} }
void EvalSyncTracks();
void UpdateTime(float dt); void UpdateTime(float dt);
void Evaluate(); void Evaluate();
void Reset() { void Reset() {
@ -658,17 +674,6 @@ struct AnimGraph {
return nullptr; return nullptr;
} }
size_t getAnimNodeIndex(AnimNode* node) {
for (size_t i = 0, n = m_nodes.size(); i < n; i++) {
if (m_nodes[i] == node) {
return i;
}
}
std::cerr << "Could not find node " << node << "." << std::endl;
return -1;
}
static AnimGraph createFromResource(const AnimGraphResource& resource) { static AnimGraph createFromResource(const AnimGraphResource& resource) {
AnimGraph result; AnimGraph result;
@ -678,6 +683,7 @@ struct AnimGraph {
AnimNode* node = AnimNodeFactory(node_resource.m_type_name.c_str()); AnimNode* node = AnimNodeFactory(node_resource.m_type_name.c_str());
node->m_name = node_resource.m_name; node->m_name = node_resource.m_name;
node->m_node_type_name = node_resource.m_type_name; node->m_node_type_name = node_resource.m_type_name;
node->m_index = i;
result.m_nodes.push_back(node); result.m_nodes.push_back(node);
assert(node_resource.m_socket_accessor != nullptr); assert(node_resource.m_socket_accessor != nullptr);
@ -821,7 +827,7 @@ struct AnimGraph {
(*source_socket->m_value.ptr_ptr) = target_socket->m_value.ptr; (*source_socket->m_value.ptr_ptr) = target_socket->m_value.ptr;
size_t target_node_index = result.getAnimNodeIndex(target_node); size_t target_node_index = target_node->m_index;
std::vector<NodeInput>& node_inputs = std::vector<NodeInput>& node_inputs =
result.m_node_inputs[target_node_index]; result.m_node_inputs[target_node_index];

View File

@ -90,9 +90,9 @@ TEST_CASE("BasicGraph", "[AnimGraphResource]") {
== graph.GetOutput("GraphOutput")); == graph.GetOutput("GraphOutput"));
// check node input dependencies // check node input dependencies
size_t anim_sampler_index0 = graph.getAnimNodeIndex(anim_sampler_instance0); size_t anim_sampler_index0 = anim_sampler_instance0->m_index;
size_t anim_sampler_index1 = graph.getAnimNodeIndex(anim_sampler_instance1); size_t anim_sampler_index1 = anim_sampler_instance1->m_index;
size_t blend_index = graph.getAnimNodeIndex(blend2_instance); size_t blend_index = blend2_instance->m_index;
CHECK(graph.m_node_inputs[anim_sampler_index0].size() == 0); CHECK(graph.m_node_inputs[anim_sampler_index0].size() == 0);
CHECK(graph.m_node_inputs[anim_sampler_index1].size() == 0); CHECK(graph.m_node_inputs[anim_sampler_index1].size() == 0);