Initial works for actial animation sampling and graph evaluation.

This commit is contained in:
Martin Felis
2022-04-11 16:46:09 +02:00
parent bf0c7a7daa
commit eeef635c64
9 changed files with 430 additions and 158 deletions
+24 -18
View File
@@ -6,6 +6,16 @@
#include <cstring>
bool AnimGraph::init(AnimGraphContext& context) {
for (size_t i = 2; i < m_nodes.size(); i++) {
if (!m_nodes[i]->Init(context)) {
return false;
}
}
return true;
}
void AnimGraph::updateOrderedNodes() {
m_eval_ordered_nodes.clear();
updateOrderedNodesRecursive(0);
@@ -69,8 +79,6 @@ void AnimGraph::markActiveNodes() {
}
void AnimGraph::prepareNodeEval(size_t node_index) {
AnimNode* node = m_nodes[node_index];
for (size_t i = 0, n = m_node_output_connections[node_index].size(); i < n;
i++) {
AnimGraphConnection& output_connection =
@@ -80,7 +88,7 @@ void AnimGraph::prepareNodeEval(size_t node_index) {
continue;
}
(*output_connection.m_source_socket.m_value.ptr_ptr) =
(*output_connection.m_source_socket.m_reference.ptr_ptr) =
m_anim_data_work_buffer.peek();
m_anim_data_work_buffer.pop();
}
@@ -94,14 +102,12 @@ void AnimGraph::prepareNodeEval(size_t node_index) {
continue;
}
(*input_connection.m_target_socket.m_value.ptr_ptr) =
(*input_connection.m_source_socket.m_value.ptr_ptr);
(*input_connection.m_target_socket.m_reference.ptr_ptr) =
(*input_connection.m_source_socket.m_reference.ptr_ptr);
}
}
void AnimGraph::finishNodeEval(size_t node_index) {
AnimNode* node = m_nodes[node_index];
for (size_t i = 0, n = m_node_input_connections[node_index].size(); i < n;
i++) {
AnimGraphConnection& input_connection =
@@ -112,8 +118,8 @@ void AnimGraph::finishNodeEval(size_t node_index) {
}
m_anim_data_work_buffer.push(
static_cast<AnimData*>(input_connection.m_source_socket.m_value.ptr));
(*input_connection.m_source_socket.m_value.ptr_ptr) = nullptr;
static_cast<AnimData*>(input_connection.m_source_socket.m_reference.ptr));
(*input_connection.m_source_socket.m_reference.ptr_ptr) = nullptr;
}
}
@@ -126,8 +132,8 @@ void AnimGraph::evalInputNode() {
if (graph_input_connection.m_source_socket.m_type
!= SocketType::SocketTypeAnimation) {
memcpy(
*graph_input_connection.m_target_socket.m_value.ptr_ptr,
graph_input_connection.m_source_socket.m_value.ptr,
*graph_input_connection.m_target_socket.m_reference.ptr_ptr,
graph_input_connection.m_source_socket.m_reference.ptr,
sizeof(void*));
printf("bla");
} else {
@@ -144,8 +150,8 @@ void AnimGraph::evalOutputNode() {
if (graph_output_connection.m_source_socket.m_type
!= SocketType::SocketTypeAnimation) {
memcpy(
graph_output_connection.m_target_socket.m_value.ptr,
graph_output_connection.m_source_socket.m_value.ptr,
graph_output_connection.m_target_socket.m_reference.ptr,
graph_output_connection.m_source_socket.m_reference.ptr,
graph_output_connection.m_target_socket.m_type_size);
} else {
// TODO: how to deal with anim data outputs?
@@ -166,7 +172,7 @@ void AnimGraph::evalSyncTracks() {
}
void AnimGraph::updateTime(float dt) {
const std::vector<AnimGraphConnection> graph_output_inputs =
const std::vector<AnimGraphConnection>& graph_output_inputs =
m_node_input_connections[0];
for (size_t i = 0, n = graph_output_inputs.size(); i < n; i++) {
AnimNode* node = graph_output_inputs[i].m_source_node;
@@ -182,11 +188,11 @@ void AnimGraph::updateTime(float dt) {
}
int node_index = node->m_index;
const std::vector<AnimGraphConnection> node_input_connections =
m_node_input_connections[node_index];
float node_time_now = node->m_time_now;
float node_time_last = node->m_time_last;
const std::vector<AnimGraphConnection>& node_input_connections =
m_node_input_connections[node_index];
for (size_t i = 0, n = node_input_connections.size(); i < n; i++) {
AnimNode* input_node = node_input_connections[i].m_source_node;
@@ -201,7 +207,7 @@ void AnimGraph::updateTime(float dt) {
}
}
void AnimGraph::evaluate() {
void AnimGraph::evaluate(AnimGraphContext& context) {
constexpr int eval_stack_size = 5;
int eval_stack_index = eval_stack_size;
AnimData eval_buffers[eval_stack_size];
@@ -219,7 +225,7 @@ void AnimGraph::evaluate() {
prepareNodeEval(node->m_index);
node->Evaluate();
node->Evaluate(context);
finishNodeEval(node->m_index);
}