Initial works for actial animation sampling and graph evaluation.
This commit is contained in:
+24
-18
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user