ENABLE_SPLITTED_VERTEX_BUFFER - small refactoring in GCodeViewer::load_toolpaths()

This commit is contained in:
enricoturri1966 2021-01-18 11:37:23 +01:00
parent 59cabc9712
commit 3a0aabb924
2 changed files with 51 additions and 60 deletions

View file

@ -1151,6 +1151,11 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
#if ENABLE_SPLITTED_VERTEX_BUFFER
void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
{
// max vertex buffer size, in bytes
static const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024;
// max index buffer size, in bytes
static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024;
auto log_memory_usage = [this](const std::string& label, const std::vector<MultiVertexBuffer>& vertices, const std::vector<MultiIndexBuffer>& indices) {
int64_t vertices_size = 0;
for (const MultiVertexBuffer& buffers : vertices) {
@ -1601,9 +1606,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
std::vector<MultiIndexBuffer> indices(m_buffers.size());
std::vector<float> options_zs;
// max vertex buffer size, in bytes
const size_t VBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024;
// toolpaths data -> extract vertices from result
for (size_t i = 0; i < m_moves_count; ++i) {
const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i];
@ -1679,6 +1681,38 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
vertices[offset + 1] = position[1];
vertices[offset + 2] = position[2];
};
auto match_right_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path,
size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) {
// offset into the vertex buffer of the next segment 1st vertex
size_t next_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats;
// offset into the vertex buffer of the right vertex of the previous segment
size_t prev_right_offset = prev_sub_path.last.i_id - next_offset - 3 * vertex_size_floats;
// new position of the right vertices
Vec3f shared_vertex = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) + displacement_vec;
// update previous segment
update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_vertex);
// offset into the vertex buffer of the right vertex of the next segment
size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0;
size_t next_right_offset = next_sub_path.last.i_id - next_offset + r_offset * vertex_size_floats;
// update next segment
update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_vertex);
};
auto match_left_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path,
size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) {
// offset into the vertex buffer of the next segment 1st vertex
size_t next_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats;
// offset into the vertex buffer of the left vertex of the previous segment
size_t prev_left_offset = prev_sub_path.last.i_id - next_offset - 1 * vertex_size_floats;
// new position of the left vertices
Vec3f shared_vertex = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) + displacement_vec;
// update previous segment
update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_vertex);
// offset into the vertex buffer of the left vertex of the next segment
size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1;
size_t next_left_offset = next_sub_path.last.i_id - next_offset + l_offset * vertex_size_floats;
// update next segment
update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_vertex);
};
size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats();
for (const Path& path : t_buffer.paths) {
@ -1728,63 +1762,20 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length&& sq_displacement < sq_next_length;
if (can_displace) {
// displacement to apply to the vertices to match
Vec3f displacement_vec = displacement * prev_dir;
// matches inner corner vertices
if (is_right_turn) {
// offset into the vertex buffer of the right vertex of the previous segment
size_t prev_right_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 3) * vertex_size_floats;
// new position of the right vertices
Vec3f shared_right = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) - displacement_vec;
// update previous segment
update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_right);
// offset into the vertex buffer of the right vertex of the next segment
size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0;
size_t next_right_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - r_offset) * vertex_size_floats;
// update next segment
update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_right);
}
else {
// offset into the vertex buffer of the left vertex of the previous segment
size_t prev_left_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 1) * vertex_size_floats;
// new position of the left vertices
Vec3f shared_left = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) - displacement_vec;
// update previous segment
update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_left);
// offset into the vertex buffer of the left vertex of the next segment
size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1;
size_t next_left_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - l_offset) * vertex_size_floats;
// update next segment
update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_left);
}
if (is_right_turn)
match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec);
else
match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec);
if (!is_sharp) {
// matches outer corner vertices
if (is_right_turn) {
// offset into the vertex buffer of the left vertex of the previous segment
size_t prev_left_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 1) * vertex_size_floats;
// new position of the left vertices
Vec3f shared_left = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset) + displacement_vec;
// update previous segment
update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_left_offset, shared_left);
// offset into the vertex buffer of the left vertex of the next segment
size_t l_offset = (curr_s_id == next_sub_path.first.i_id) ? 3 : 1;
size_t next_left_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - l_offset) * vertex_size_floats;
// update next segment
update_position_at(v_multibuffer[next_sub_path.first.b_id], next_left_offset, shared_left);
}
else {
// offset into the vertex buffer of the right vertex of the previous segment
size_t prev_right_offset = prev_sub_path.last.i_id - ((prev_sub_path.last.s_id - curr_s_id) * 6 + 3) * vertex_size_floats;
// new position of the right vertices
Vec3f shared_right = extract_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset) + displacement_vec;
// update previous segment
update_position_at(v_multibuffer[prev_sub_path.first.b_id], prev_right_offset, shared_right);
// offset into the vertex buffer of the right vertex of the next segment
size_t r_offset = (curr_s_id == next_sub_path.first.i_id) ? 1 : 0;
size_t next_right_offset = next_sub_path.last.i_id - ((next_sub_path.last.s_id - curr_s_id) * 6 - r_offset) * vertex_size_floats;
// update next segment
update_position_at(v_multibuffer[next_sub_path.first.b_id], next_right_offset, shared_right);
}
if (is_right_turn)
match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec);
else
match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec);
}
}
}
@ -1853,9 +1844,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
buffer.paths.clear();
}
// max index buffer size, in bytes
const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024;
// variable used to keep track of the current vertex buffers index and size
using CurrVertexBuffer = std::pair<unsigned int, size_t>;
std::vector<CurrVertexBuffer> curr_vertex_buffers(m_buffers.size(), { 0, 0 });

View file

@ -134,9 +134,12 @@ class GCodeViewer
{
struct Endpoint
{
// index of the index buffer
// index of the buffer in the multibuffer vector
// the buffer type may change:
// it is the vertex buffer while extracting vertices data,
// the index buffer while extracting indices data
unsigned int b_id{ 0 };
// index into the index buffer
// index into the buffer
size_t i_id{ 0 };
// move id
size_t s_id{ 0 };