From 58d8ab3deaaac1049439728d5a0f46c4b6a592f5 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 14 Sep 2021 11:58:07 +0200 Subject: Removed the PRUS format parser. WIP: admesh eradication: stl_stats are newly only accessed by TriangleMesh::stats(), most of the direct access to TriangleMesh::stl is gone with the exception of parsing input files (3MF, AMF, obj). --- src/slic3r/GUI/3DScene.cpp | 29 ++++++++++++++++------------ src/slic3r/GUI/3DScene.hpp | 2 ++ src/slic3r/GUI/GLModel.cpp | 23 +++++++++++----------- src/slic3r/GUI/GLModel.hpp | 3 ++- src/slic3r/GUI/GUI_App.cpp | 3 +-- src/slic3r/GUI/GUI_ObjectList.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 9 ++++++--- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 26 ++++++++++++------------- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 24 +++++++++++------------ src/slic3r/GUI/MeshUtils.hpp | 4 +--- 10 files changed, 67 insertions(+), 58 deletions(-) (limited to 'src/slic3r') diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index ba72c432d..b4258e781 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -158,22 +158,27 @@ void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh& mesh) } else { #endif // ENABLE_SMOOTH_NORMALS - this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count()); - - unsigned int vertices_count = 0; - for (int i = 0; i < (int)mesh.stl.stats.number_of_facets; ++i) { - const stl_facet& facet = mesh.stl.facet_start[i]; - for (int j = 0; j < 3; ++j) - this->push_geometry(facet.vertex[j](0), facet.vertex[j](1), facet.vertex[j](2), facet.normal(0), facet.normal(1), facet.normal(2)); - - this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); - vertices_count += 3; - } + this->load_its_flat_shading(mesh.its); #if ENABLE_SMOOTH_NORMALS } #endif // ENABLE_SMOOTH_NORMALS } +void GLIndexedVertexArray::load_its_flat_shading(const indexed_triangle_set &its) +{ + this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * its.indices.size()); + unsigned int vertices_count = 0; + for (int i = 0; i < int(its.indices.size()); ++ i) { + stl_triangle_vertex_indices face = its.indices[i]; + stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + stl_vertex n = (vertex[2] - vertex[1]).cross(vertex[3] - vertex[2]).normalized(); + for (int j = 0; j < 3; ++j) + this->push_geometry(vertex[j](0), vertex[j](1), vertex[j](2), n(0), n(1), n(2)); + this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); + vertices_count += 3; + } +} + void GLIndexedVertexArray::finalize_geometry(bool opengl_initialized) { assert(this->vertices_and_normals_interleaved_VBO_id == 0); @@ -531,7 +536,7 @@ const BoundingBoxf3& GLVolume::transformed_convex_hull_bounding_box() const BoundingBoxf3 GLVolume::transformed_convex_hull_bounding_box(const Transform3d &trafo) const { - return (m_convex_hull && m_convex_hull->stl.stats.number_of_facets > 0) ? + return (m_convex_hull && m_convex_hull->facets_count() > 0) ? m_convex_hull->transformed_bounding_box(trafo) : bounding_box().transformed(trafo); } diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 1a85cc41e..c90af7d4b 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -128,6 +128,8 @@ public: void load_mesh(const TriangleMesh& mesh) { this->load_mesh_full_shading(mesh); } #endif // ENABLE_SMOOTH_NORMALS + void load_its_flat_shading(const indexed_triangle_set &its); + inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; } inline void reserve(size_t sz) { diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index d22925673..6e58a3231 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -78,7 +78,7 @@ void GLModel::init_from(const InitializationData& data) } } -void GLModel::init_from(const TriangleMesh& mesh) +void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bbox) { if (!m_render_data.empty()) // call reset() if you want to reuse this model return; @@ -86,25 +86,26 @@ void GLModel::init_from(const TriangleMesh& mesh) RenderData data; data.type = PrimitiveType::Triangles; - std::vector vertices = std::vector(18 * mesh.stl.stats.number_of_facets); - std::vector indices = std::vector(3 * mesh.stl.stats.number_of_facets); + std::vector vertices = std::vector(18 * its.indices.size()); + std::vector indices = std::vector(3 * its.indices.size()); unsigned int vertices_count = 0; - for (uint32_t i = 0; i < mesh.stl.stats.number_of_facets; ++i) { - const stl_facet& facet = mesh.stl.facet_start[i]; - for (size_t j = 0; j < 3; ++j) { + for (uint32_t i = 0; i < its.indices.size(); ++i) { + stl_triangle_vertex_indices face = its.indices[i]; + stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + stl_vertex n = (vertex[2] - vertex[1]).cross(vertex[3] - vertex[2]).normalized(); + for (size_t j = 0; j < 3; ++ j) { size_t offset = i * 18 + j * 6; - ::memcpy(static_cast(&vertices[offset]), static_cast(facet.vertex[j].data()), 3 * sizeof(float)); - ::memcpy(static_cast(&vertices[3 + offset]), static_cast(facet.normal.data()), 3 * sizeof(float)); + ::memcpy(static_cast(&vertices[offset]), static_cast(vertex[j].data()), 3 * sizeof(float)); + ::memcpy(static_cast(&vertices[3 + offset]), static_cast(n.data()), 3 * sizeof(float)); } - for (size_t j = 0; j < 3; ++j) { + for (size_t j = 0; j < 3; ++j) indices[i * 3 + j] = vertices_count + j; - } vertices_count += 3; } data.indices_count = static_cast(indices.size()); - m_bounding_box = mesh.bounding_box(); + m_bounding_box = bbox; send_to_gpu(data, vertices, indices); m_render_data.emplace_back(data); diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 7422466f0..c57faa9e8 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -70,7 +70,8 @@ namespace GUI { virtual ~GLModel() { reset(); } void init_from(const InitializationData& data); - void init_from(const TriangleMesh& mesh); + void init_from(const TriangleMesh& mesh) { this->init_from(mesh.its, mesh.bounding_box()); } + void init_from(const indexed_triangle_set& its, const BoundingBoxf3& bbox); #if ENABLE_SINKING_CONTOURS void init_from(const Polygons& polygons, float z); #endif // ENABLE_SINKING_CONTOURS diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 79186a8ea..2c9aabc38 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -429,9 +429,8 @@ wxString file_wildcards(FileType file_type, const std::string &custom_extension) /* FT_OBJ */ "OBJ files (*.obj)|*.obj;*.OBJ", /* FT_AMF */ "AMF files (*.amf)|*.zip.amf;*.amf;*.AMF;*.xml;*.XML", /* FT_3MF */ "3MF files (*.3mf)|*.3mf;*.3MF;", - /* FT_PRUSA */ "Prusa Control files (*.prusa)|*.prusa;*.PRUSA", /* FT_GCODE */ "G-code files (*.gcode, *.gco, *.g, *.ngc)|*.gcode;*.GCODE;*.gco;*.GCO;*.g;*.G;*.ngc;*.NGC", - /* FT_MODEL */ "Known files (*.stl, *.obj, *.amf, *.xml, *.3mf, *.prusa)|*.stl;*.STL;*.obj;*.OBJ;*.amf;*.AMF;*.xml;*.XML;*.3mf;*.3MF;*.prusa;*.PRUSA", + /* FT_MODEL */ "Known files (*.stl, *.obj, *.amf, *.xml, *.3mf, *.prusa)|*.stl;*.STL;*.obj;*.OBJ;*.amf;*.AMF;*.xml;*.XML;*.3mf;*.3MF", /* FT_PROJECT */ "Project files (*.3mf, *.amf)|*.3mf;*.3MF;*.amf;*.AMF", /* FT_GALLERY */ "Known files (*.stl, *.obj)|*.stl;*.STL;*.obj;*.OBJ", diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 378f91cbc..6eadb9681 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -393,7 +393,7 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / const stl_stats& stats = vol_idx == -1 ? (*m_objects)[obj_idx]->get_object_stl_stats() : - (*m_objects)[obj_idx]->volumes[vol_idx]->mesh().stl.stats; + (*m_objects)[obj_idx]->volumes[vol_idx]->mesh().stats(); if (stats.degenerate_facets > 0) tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d degenerate facet", "%1$d degenerate facets", stats.degenerate_facets), stats.degenerate_facets) + "\n"; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 1ebba4d11..5270087be 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -288,9 +288,12 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) // Now calculate dot product of vert_direction and facets' normals. int idx = -1; - for (const stl_facet &facet : mv->mesh().stl.facet_start) { - ++idx; - if (facet.normal.dot(down) > dot_limit) { + const indexed_triangle_set &its = mv->mesh().its; + for (stl_triangle_vertex_indices face : its.indices) { + stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + stl_vertex n = (vertex[2] - vertex[1]).cross(vertex[3] - vertex[2]).normalized(); + ++ idx; + if (n.dot(down) > dot_limit) { m_triangle_selectors[mesh_id]->set_facet(idx, block ? EnforcerBlockerType::BLOCKER : EnforcerBlockerType::ENFORCER); m_triangle_selectors.back()->request_update_render_data(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index b8c7d9f92..9e30202bd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -142,11 +142,13 @@ void GLGizmoFlatten::update_planes() // Now we'll go through all the facets and append Points of facets sharing the same normal. // This part is still performed in mesh coordinate system. - const int num_of_facets = ch.stl.stats.number_of_facets; - std::vector facet_queue(num_of_facets, 0); - std::vector facet_visited(num_of_facets, false); - int facet_queue_cnt = 0; - const stl_normal* normal_ptr = nullptr; + const int num_of_facets = ch.facets_count(); + const std::vector face_normals = its_face_normals(ch.its); + const std::vector face_neighbors = its_face_neighbors(ch.its); + std::vector facet_queue(num_of_facets, 0); + std::vector facet_visited(num_of_facets, false); + int facet_queue_cnt = 0; + const stl_normal* normal_ptr = nullptr; while (1) { // Find next unvisited triangle: int facet_idx = 0; @@ -154,7 +156,7 @@ void GLGizmoFlatten::update_planes() if (!facet_visited[facet_idx]) { facet_queue[facet_queue_cnt ++] = facet_idx; facet_visited[facet_idx] = true; - normal_ptr = &ch.stl.facet_start[facet_idx].normal; + normal_ptr = &face_normals[facet_idx]; m_planes.emplace_back(); break; } @@ -163,18 +165,16 @@ void GLGizmoFlatten::update_planes() while (facet_queue_cnt > 0) { int facet_idx = facet_queue[-- facet_queue_cnt]; - const stl_normal& this_normal = ch.stl.facet_start[facet_idx].normal; + const stl_normal& this_normal = face_normals[facet_idx]; if (std::abs(this_normal(0) - (*normal_ptr)(0)) < 0.001 && std::abs(this_normal(1) - (*normal_ptr)(1)) < 0.001 && std::abs(this_normal(2) - (*normal_ptr)(2)) < 0.001) { - stl_vertex* first_vertex = ch.stl.facet_start[facet_idx].vertex; + const Vec3i face = ch.its.indices[facet_idx]; for (int j=0; j<3; ++j) - m_planes.back().vertices.emplace_back(first_vertex[j].cast()); + m_planes.back().vertices.emplace_back(ch.its.vertices[face[j]].cast()); facet_visited[facet_idx] = true; - for (int j = 0; j < 3; ++ j) { - int neighbor_idx = ch.stl.neighbors_start[facet_idx].neighbor[j]; - if (! facet_visited[neighbor_idx]) + for (int j = 0; j < 3; ++ j) + if (int neighbor_idx = face_neighbors[facet_idx][j]; neighbor_idx >= 0 && ! facet_visited[neighbor_idx]) facet_queue[facet_queue_cnt ++] = neighbor_idx; - } } } m_planes.back().normal = normal_ptr->cast(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 155738b32..aac4d6ff7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -8,8 +8,9 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/Plater.hpp" -#include "libslic3r/PresetBundle.hpp" #include "libslic3r/Model.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/TriangleMesh.hpp" @@ -20,17 +21,10 @@ GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& ic : GLGizmoBase(parent, icon_filename, sprite_id) { // Make sphere and save it into a vertex buffer. - const TriangleMesh sphere_mesh = make_sphere(1., (2*M_PI)/24.); - for (size_t i=0; i(), - sphere_mesh.stl.facet_start[i].normal.cast()); - for (const stl_triangle_vertex_indices& indices : sphere_mesh.its.indices) - m_vbo_sphere.push_triangle(indices(0), indices(1), indices(2)); + m_vbo_sphere.load_its_flat_shading(its_make_sphere(1., (2*M_PI)/24.)); m_vbo_sphere.finalize_geometry(true); } - - // port of 948bc382655993721d93d3b9fce9b0186fcfb211 void GLGizmoPainterBase::activate_internal_undo_redo_stack(bool activate) { @@ -632,9 +626,15 @@ void TriangleSelectorGUI::update_render_data() GLIndexedVertexArray &iva = tr.get_state() == EnforcerBlockerType::ENFORCER ? m_iva_enforcers : m_iva_blockers; int & cnt = tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt : blc_cnt; - - for (int i = 0; i < 3; ++i) - iva.push_geometry(m_vertices[tr.verts_idxs[i]].v, m_mesh->stl.facet_start[tr.source_triangle].normal); + const Vec3f &v0 = m_vertices[tr.verts_idxs[0]].v; + const Vec3f &v1 = m_vertices[tr.verts_idxs[1]].v; + const Vec3f &v2 = m_vertices[tr.verts_idxs[2]].v; + //FIXME the normal may likely be pulled from m_triangle_selectors, but it may not be worth the effort + // or the current implementation may be more cache friendly. + const Vec3f n = (v1 - v0).cross(v2 - v1).normalized(); + iva.push_geometry(v0, n); + iva.push_geometry(v1, n); + iva.push_geometry(v2, n); iva.push_triangle(cnt, cnt + 1, cnt + 2); cnt += 3; } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index 65c326116..6d767df03 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -113,10 +113,8 @@ public: // during MeshRaycaster existence. MeshRaycaster(const TriangleMesh& mesh) : m_emesh(mesh, true) // calculate epsilon for triangle-ray intersection from an average edge length + , m_normals(its_face_normals(mesh.its)) { - m_normals.reserve(mesh.stl.facet_start.size()); - for (const stl_facet& facet : mesh.stl.facet_start) - m_normals.push_back(facet.normal); } void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, -- cgit v1.2.3