mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-14 10:17:55 -06:00
ENABLE_SPLITTED_VERTEX_BUFFER - fixed bugs in export of toolpaths to obj files and in index buffer splitting
This commit is contained in:
parent
bda43e4482
commit
8bdfb6bbce
1 changed files with 30 additions and 13 deletions
|
@ -793,13 +793,13 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(fp, "# G-Code Toolpaths Materials\n");
|
fprintf(fp, "# G-Code Toolpaths Materials\n");
|
||||||
fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID);
|
fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION);
|
||||||
|
|
||||||
unsigned int colors_count = 1;
|
unsigned int colors_count = 1;
|
||||||
for (const Color& color : colors) {
|
for (const Color& color : colors) {
|
||||||
fprintf(fp, "\nnewmtl material_%d\n", colors_count++);
|
fprintf(fp, "\nnewmtl material_%d\n", colors_count++);
|
||||||
fprintf(fp, "Ka 1 1 1\n");
|
fprintf(fp, "Ka 1 1 1\n");
|
||||||
fprintf(fp, "Kd %f %f %f\n", color[0], color[1], color[2]);
|
fprintf(fp, "Kd %g %g %g\n", color[0], color[1], color[2]);
|
||||||
fprintf(fp, "Ks 0 0 0\n");
|
fprintf(fp, "Ks 0 0 0\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -813,7 +813,7 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(fp, "# G-Code Toolpaths\n");
|
fprintf(fp, "# G-Code Toolpaths\n");
|
||||||
fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID);
|
fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION);
|
||||||
fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str());
|
fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str());
|
||||||
|
|
||||||
#if ENABLE_SPLITTED_VERTEX_BUFFER
|
#if ENABLE_SPLITTED_VERTEX_BUFFER
|
||||||
|
@ -821,8 +821,14 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
|
||||||
|
|
||||||
std::vector<Vec3f> out_vertices;
|
std::vector<Vec3f> out_vertices;
|
||||||
std::vector<Vec3f> out_normals;
|
std::vector<Vec3f> out_normals;
|
||||||
std::vector<size_t> vertices_offsets;
|
|
||||||
vertices_offsets.push_back(0);
|
struct VerticesOffset
|
||||||
|
{
|
||||||
|
unsigned int vbo;
|
||||||
|
size_t offset;
|
||||||
|
};
|
||||||
|
std::vector<VerticesOffset> vertices_offsets;
|
||||||
|
vertices_offsets.push_back({ t_buffer.vertices.vbos.front(), 0 });
|
||||||
|
|
||||||
// get vertices/normals data from vertex buffers on gpu
|
// get vertices/normals data from vertex buffers on gpu
|
||||||
for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) {
|
for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) {
|
||||||
|
@ -837,7 +843,9 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
|
||||||
out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] });
|
out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] });
|
||||||
out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] });
|
out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] });
|
||||||
}
|
}
|
||||||
vertices_offsets.push_back(vertices_offsets.back() + vertices_count);
|
|
||||||
|
if (i < t_buffer.vertices.vbos.size() - 1)
|
||||||
|
vertices_offsets.push_back({ t_buffer.vertices.vbos[i + 1], vertices_offsets.back().offset + vertices_count });
|
||||||
}
|
}
|
||||||
|
|
||||||
// save vertices to file
|
// save vertices to file
|
||||||
|
@ -863,16 +871,23 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const IBuffer& ibuffer = t_buffer.indices[render_path.index_buffer_id];
|
const IBuffer& ibuffer = t_buffer.indices[render_path.index_buffer_id];
|
||||||
const size_t vertices_offset = vertices_offsets[render_path.index_buffer_id];
|
size_t vertices_offset = 0;
|
||||||
|
for (size_t j = 0; j < vertices_offsets.size(); ++j) {
|
||||||
|
const VerticesOffset& offset = vertices_offsets[j];
|
||||||
|
if (offset.vbo == ibuffer.vbo) {
|
||||||
|
vertices_offset = offset.offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get indices data from index buffer on gpu
|
// get indices data from index buffer on gpu
|
||||||
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo));
|
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo));
|
||||||
for (size_t j = 0; j < render_path.sizes.size(); ++j) {
|
for (size_t j = 0; j < render_path.sizes.size(); ++j) {
|
||||||
const size_t triangles_count = render_path.sizes[j] / 3;
|
|
||||||
IndexBuffer indices(render_path.sizes[j]);
|
IndexBuffer indices(render_path.sizes[j]);
|
||||||
glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast<GLintptr>(render_path.offsets[j]),
|
glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast<GLintptr>(render_path.offsets[j]),
|
||||||
static_cast<GLsizeiptr>(render_path.sizes[j] * sizeof(unsigned int)), static_cast<void*>(indices.data())));
|
static_cast<GLsizeiptr>(render_path.sizes[j] * sizeof(unsigned int)), static_cast<void*>(indices.data())));
|
||||||
|
|
||||||
|
const size_t triangles_count = render_path.sizes[j] / 3;
|
||||||
for (size_t k = 0; k < triangles_count; ++k) {
|
for (size_t k = 0; k < triangles_count; ++k) {
|
||||||
const size_t base = k * 3;
|
const size_t base = k * 3;
|
||||||
const size_t v1 = 1 + static_cast<size_t>(indices[base + 0]) + vertices_offset;
|
const size_t v1 = 1 + static_cast<size_t>(indices[base + 0]) + vertices_offset;
|
||||||
|
@ -1676,6 +1691,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
|
||||||
if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) {
|
if (i_multibuffer.back().size() * sizeof(unsigned int) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) {
|
||||||
i_multibuffer.push_back(IndexBuffer());
|
i_multibuffer.push_back(IndexBuffer());
|
||||||
vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]);
|
vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]);
|
||||||
|
if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) {
|
||||||
|
Path& last_path = t_buffer.paths.back();
|
||||||
|
--last_path.sub_paths.back().last.s_id;
|
||||||
|
last_path.add_sub_path(prev, static_cast<unsigned int>(i_multibuffer.size()) - 1, 0, i - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer
|
// if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer
|
||||||
|
@ -1689,6 +1709,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
|
||||||
|
|
||||||
if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) {
|
if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) {
|
||||||
Path& last_path = t_buffer.paths.back();
|
Path& last_path = t_buffer.paths.back();
|
||||||
|
--last_path.sub_paths.back().last.s_id;
|
||||||
last_path.add_sub_path(prev, static_cast<unsigned int>(i_multibuffer.size()) - 1, 0, i - 1);
|
last_path.add_sub_path(prev, static_cast<unsigned int>(i_multibuffer.size()) - 1, 0, i - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1728,10 +1749,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
|
||||||
size_t size_elements = i_buffer.size();
|
size_t size_elements = i_buffer.size();
|
||||||
size_t size_bytes = size_elements * sizeof(unsigned int);
|
size_t size_bytes = size_elements * sizeof(unsigned int);
|
||||||
|
|
||||||
if (size_elements == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// stores index buffer informations into TBuffer
|
// stores index buffer informations into TBuffer
|
||||||
t_buffer.indices.push_back(IBuffer());
|
t_buffer.indices.push_back(IBuffer());
|
||||||
IBuffer& ibuf = t_buffer.indices.back();
|
IBuffer& ibuf = t_buffer.indices.back();
|
||||||
|
@ -2777,6 +2794,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool
|
||||||
RenderPath key{ color, static_cast<unsigned int>(ibuffer_id), path_id };
|
RenderPath key{ color, static_cast<unsigned int>(ibuffer_id), path_id };
|
||||||
if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key))
|
if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key))
|
||||||
render_path = const_cast<RenderPath*>(&(*buffer->render_paths.emplace(key).first));
|
render_path = const_cast<RenderPath*>(&(*buffer->render_paths.emplace(key).first));
|
||||||
|
|
||||||
unsigned int size_in_indices = 0;
|
unsigned int size_in_indices = 0;
|
||||||
switch (buffer->render_primitive_type)
|
switch (buffer->render_primitive_type)
|
||||||
{
|
{
|
||||||
|
@ -2791,7 +2809,6 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render_path->sizes.push_back(size_in_indices);
|
render_path->sizes.push_back(size_in_indices);
|
||||||
|
|
||||||
unsigned int delta_1st = 0;
|
unsigned int delta_1st = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue