Refactored anim graph data usage and evaluation.
- Refactored NodeSocketAccessor to NodeDescriptor. - Connections are wired up during AnimGraph instantiation. - Output and input sockets point to the same memory location. - No re-wiring needed during evaluation. - AnimGraph are pre-allocated (refactoring for less memory usage postponed). - Evaluation of AnimGraph now possible from the editor.
This commit is contained in:
+12
-72
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "AnimGraph.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
|
||||
bool AnimGraph::init(AnimGraphContext& context) {
|
||||
@@ -44,6 +45,17 @@ void AnimGraph::updateOrderedNodesRecursive(int node_index) {
|
||||
}
|
||||
|
||||
if (node_index != 0) {
|
||||
// In case we have multiple output connections from the node we here
|
||||
// ensure that use the node evaluation that is the furthest away from
|
||||
// the output.
|
||||
std::vector<AnimNode*>::iterator find_iter = std::find(
|
||||
m_eval_ordered_nodes.begin(),
|
||||
m_eval_ordered_nodes.end(),
|
||||
node);
|
||||
if (find_iter != m_eval_ordered_nodes.end()) {
|
||||
m_eval_ordered_nodes.erase(find_iter);
|
||||
}
|
||||
|
||||
m_eval_ordered_nodes.push_back(node);
|
||||
}
|
||||
}
|
||||
@@ -85,71 +97,6 @@ void AnimGraph::markActiveNodes() {
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraph::prepareNodeEval(
|
||||
AnimGraphContext& graph_context,
|
||||
size_t node_index) {
|
||||
for (size_t i = 0, n = m_node_output_connections[node_index].size(); i < n;
|
||||
i++) {
|
||||
AnimGraphConnection& output_connection =
|
||||
m_node_output_connections[node_index][i];
|
||||
if (output_connection.m_source_socket.m_type
|
||||
!= SocketType::SocketTypeAnimation) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: only allocate local matrices for active nodes
|
||||
}
|
||||
|
||||
for (size_t i = 0, n = m_node_input_connections[node_index].size(); i < n;
|
||||
i++) {
|
||||
AnimGraphConnection& input_connection =
|
||||
m_node_input_connections[node_index][i];
|
||||
if (input_connection.m_source_socket.m_type
|
||||
!= SocketType::SocketTypeAnimation) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraph::finishNodeEval(size_t node_index) {
|
||||
for (size_t i = 0, n = m_node_input_connections[node_index].size(); i < n;
|
||||
i++) {
|
||||
AnimGraphConnection& input_connection =
|
||||
m_node_input_connections[node_index][i];
|
||||
if (input_connection.m_source_socket.m_type
|
||||
!= SocketType::SocketTypeAnimation) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: free local matrices for inactive nodes
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraph::evalInputNode() {
|
||||
for (size_t i = 0, n = m_node_output_connections[1].size(); i < n; i++) {
|
||||
AnimGraphConnection& graph_input_connection =
|
||||
m_node_output_connections[1][i];
|
||||
|
||||
if (graph_input_connection.m_source_socket.m_type
|
||||
!= SocketType::SocketTypeAnimation) {
|
||||
memcpy(
|
||||
*graph_input_connection.m_target_socket.m_reference.ptr_ptr,
|
||||
graph_input_connection.m_source_socket.m_reference.ptr,
|
||||
sizeof(void*));
|
||||
printf("bla");
|
||||
} else {
|
||||
// TODO: how to deal with anim data outputs?
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraph::evalOutputNode() {
|
||||
for (size_t i = 0, n = m_node_input_connections[0].size(); i < n; i++) {
|
||||
AnimGraphConnection& graph_output_connection =
|
||||
m_node_input_connections[0][i];
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraph::evalSyncTracks() {
|
||||
for (size_t i = m_eval_ordered_nodes.size() - 1; i >= 0; i--) {
|
||||
AnimNode* node = m_eval_ordered_nodes[i];
|
||||
@@ -206,15 +153,8 @@ void AnimGraph::evaluate(AnimGraphContext& context) {
|
||||
continue;
|
||||
}
|
||||
|
||||
prepareNodeEval(context, node->m_index);
|
||||
|
||||
node->Evaluate(context);
|
||||
|
||||
finishNodeEval(node->m_index);
|
||||
}
|
||||
|
||||
evalOutputNode();
|
||||
finishNodeEval(0);
|
||||
}
|
||||
|
||||
Socket* AnimGraph::getInputSocket(const std::string& name) {
|
||||
|
||||
Reference in New Issue
Block a user