Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVojtech Bubnik <bubnikv@gmail.com>2021-09-14 12:58:07 +0300
committerVojtech Bubnik <bubnikv@gmail.com>2021-09-14 12:58:14 +0300
commit58d8ab3deaaac1049439728d5a0f46c4b6a592f5 (patch)
tree1753840b69e999bc2a937685d87e5db63499c21e /src/slic3r
parent1c6ecd9c1a7a4306895621e4e5712759a5a44c1c (diff)
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).
Diffstat (limited to 'src/slic3r')
-rw-r--r--src/slic3r/GUI/3DScene.cpp29
-rw-r--r--src/slic3r/GUI/3DScene.hpp2
-rw-r--r--src/slic3r/GUI/GLModel.cpp23
-rw-r--r--src/slic3r/GUI/GLModel.hpp3
-rw-r--r--src/slic3r/GUI/GUI_App.cpp3
-rw-r--r--src/slic3r/GUI/GUI_ObjectList.cpp2
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp9
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp26
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp24
-rw-r--r--src/slic3r/GUI/MeshUtils.hpp4
10 files changed, 67 insertions, 58 deletions
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<float> vertices = std::vector<float>(18 * mesh.stl.stats.number_of_facets);
- std::vector<unsigned int> indices = std::vector<unsigned int>(3 * mesh.stl.stats.number_of_facets);
+ std::vector<float> vertices = std::vector<float>(18 * its.indices.size());
+ std::vector<unsigned int> indices = std::vector<unsigned int>(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<void*>(&vertices[offset]), static_cast<const void*>(facet.vertex[j].data()), 3 * sizeof(float));
- ::memcpy(static_cast<void*>(&vertices[3 + offset]), static_cast<const void*>(facet.normal.data()), 3 * sizeof(float));
+ ::memcpy(static_cast<void*>(&vertices[offset]), static_cast<const void*>(vertex[j].data()), 3 * sizeof(float));
+ ::memcpy(static_cast<void*>(&vertices[3 + offset]), static_cast<const void*>(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<unsigned int>(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<int> facet_queue(num_of_facets, 0);
- std::vector<bool> 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<Vec3f> face_normals = its_face_normals(ch.its);
+ const std::vector<Vec3i> face_neighbors = its_face_neighbors(ch.its);
+ std::vector<int> facet_queue(num_of_facets, 0);
+ std::vector<bool> 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<double>());
+ m_planes.back().vertices.emplace_back(ch.its.vertices[face[j]].cast<double>());
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<double>();
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.its.vertices.size(); ++i)
- m_vbo_sphere.push_geometry(sphere_mesh.its.vertices[i].cast<double>(),
- sphere_mesh.stl.facet_start[i].normal.cast<double>());
- 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,