WIP: graph evaluations. Fixed various memory issues, better tests.
This commit is contained in:
+16
-56
@@ -8,61 +8,6 @@
|
||||
#include "AnimGraphData.h"
|
||||
#include "AnimGraphNodes.h"
|
||||
|
||||
struct AnimDataWorkBuffer {
|
||||
struct AnimDataList {
|
||||
AnimData* m_anim_data = nullptr;
|
||||
AnimDataList* next = nullptr;
|
||||
};
|
||||
|
||||
AnimDataList* m_anim_data_list = nullptr;
|
||||
size_t m_num_allocations = 0;
|
||||
|
||||
~AnimDataWorkBuffer() {
|
||||
AnimDataList* list_node = m_anim_data_list;
|
||||
while (list_node != nullptr) {
|
||||
AnimDataList* current_node = list_node;
|
||||
list_node = list_node->next;
|
||||
//delete current_node->m_anim_data;
|
||||
current_node->m_anim_data = nullptr;
|
||||
delete current_node;
|
||||
}
|
||||
}
|
||||
|
||||
AnimData* allocate(AnimGraphContext& graph_context) {
|
||||
if (m_anim_data_list == nullptr) {
|
||||
AnimData* result = new AnimData();
|
||||
result->m_local_matrices.resize(graph_context.m_skeleton->num_soa_joints());
|
||||
m_num_allocations++;
|
||||
return result;
|
||||
}
|
||||
|
||||
AnimData* result = m_anim_data_list->m_anim_data;
|
||||
m_anim_data_list = m_anim_data_list->next;
|
||||
delete m_anim_data_list;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void free(AnimData* anim_data) {
|
||||
AnimDataList* list_node = new AnimDataList;
|
||||
list_node->next = m_anim_data_list;
|
||||
list_node->m_anim_data = anim_data;
|
||||
m_anim_data_list = list_node;
|
||||
}
|
||||
|
||||
size_t size() {
|
||||
size_t result = 0;
|
||||
|
||||
AnimDataList* node = m_anim_data_list;
|
||||
while (node != nullptr) {
|
||||
result ++;
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// AnimGraph (Runtime)
|
||||
//
|
||||
@@ -80,9 +25,24 @@ struct AnimGraph {
|
||||
std::vector<Socket>& getGraphOutputs() { return m_socket_accessor->m_inputs; }
|
||||
std::vector<Socket>& getGraphInputs() { return m_socket_accessor->m_outputs; }
|
||||
|
||||
AnimDataWorkBuffer m_anim_data_work_buffer;
|
||||
AnimDataAllocator m_anim_data_allocator;
|
||||
|
||||
~AnimGraph() {
|
||||
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);
|
||||
|
||||
// we have to explicitly call the destructor as the AnimData* was
|
||||
// initialized using a placement new operator.
|
||||
graph_anim_output->m_local_matrices.vector::~vector();
|
||||
}
|
||||
}
|
||||
|
||||
delete[] m_input_buffer;
|
||||
delete[] m_output_buffer;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user