Working on graph evaluations. WIP.

This commit is contained in:
Martin Felis
2022-04-13 15:48:39 +02:00
parent b518220576
commit 2da07ef961
7 changed files with 233 additions and 68 deletions
+27 -17
View File
@@ -13,6 +13,18 @@ bool AnimGraph::init(AnimGraphContext& context) {
}
}
std::vector<AnimGraphConnection>& graph_outputs = m_node_input_connections[0];
for (size_t i = 0, n = graph_outputs.size(); i < n; i++) {
AnimGraphConnection& connection = graph_outputs[i];
if (connection.m_target_socket.m_type == SocketType::SocketTypeAnimation) {
AnimData* graph_anim_output =
static_cast<AnimData*>(connection.m_target_socket.m_reference.ptr);
assert(graph_anim_output != nullptr);
graph_anim_output->m_local_matrices.resize(
context.m_skeleton->num_soa_joints());
}
}
return true;
}
@@ -56,7 +68,7 @@ void AnimGraph::markActiveNodes() {
}
}
for (size_t i = 0, n = m_eval_ordered_nodes.size(); i < n; i++) {
for (size_t i = m_eval_ordered_nodes.size() - 1; i > 0; i--) {
AnimNode* node = m_eval_ordered_nodes[i];
if (checkIsNodeActive(node)) {
int node_index = node->m_index;
@@ -78,7 +90,9 @@ void AnimGraph::markActiveNodes() {
}
}
void AnimGraph::prepareNodeEval(size_t node_index) {
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 =
@@ -88,9 +102,10 @@ void AnimGraph::prepareNodeEval(size_t node_index) {
continue;
}
assert (*output_connection.m_source_socket.m_reference.ptr_ptr == nullptr);
(*output_connection.m_source_socket.m_reference.ptr_ptr) =
m_anim_data_work_buffer.peek();
m_anim_data_work_buffer.pop();
m_anim_data_work_buffer.allocate(graph_context);
}
for (size_t i = 0, n = m_node_input_connections[node_index].size(); i < n;
@@ -117,13 +132,12 @@ void AnimGraph::finishNodeEval(size_t node_index) {
continue;
}
m_anim_data_work_buffer.push(
static_cast<AnimData*>(input_connection.m_source_socket.m_reference.ptr));
m_anim_data_work_buffer.free(static_cast<AnimData*>(
input_connection.m_source_socket.m_reference.ptr));
(*input_connection.m_source_socket.m_reference.ptr_ptr) = nullptr;
}
}
void AnimGraph::evalInputNode() {
for (size_t i = 0, n = m_node_output_connections[1].size(); i < n; i++) {
AnimGraphConnection& graph_input_connection =
@@ -154,7 +168,11 @@ void AnimGraph::evalOutputNode() {
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?
AnimData* source_data = static_cast<AnimData*>(
*graph_output_connection.m_source_socket.m_reference.ptr_ptr);
AnimData* target_data = static_cast<AnimData*>(
graph_output_connection.m_target_socket.m_reference.ptr);
target_data->m_local_matrices = source_data->m_local_matrices;
}
}
}
@@ -208,14 +226,6 @@ void AnimGraph::updateTime(float dt) {
}
void AnimGraph::evaluate(AnimGraphContext& context) {
constexpr int eval_stack_size = 5;
int eval_stack_index = eval_stack_size;
AnimData eval_buffers[eval_stack_size];
AnimData* eval_stack[eval_stack_size];
for (size_t i = 0; i < eval_stack_size; i++) {
eval_stack[i] = &eval_buffers[i];
}
for (int i = 0, n = m_eval_ordered_nodes.size(); i < n; i++) {
AnimNode* node = m_eval_ordered_nodes[i];
@@ -223,7 +233,7 @@ void AnimGraph::evaluate(AnimGraphContext& context) {
continue;
}
prepareNodeEval(node->m_index);
prepareNodeEval(context, node->m_index);
node->Evaluate(context);