mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-11 08:47:52 -06:00
Removed immediate OpenGL mode calls for clipping plane rendering
This commit is contained in:
parent
ac8491b599
commit
6e597bb1ee
3 changed files with 34 additions and 39 deletions
|
@ -342,15 +342,11 @@ void ObjectClipper::render_cut() const
|
||||||
clipper->set_plane(*m_clp);
|
clipper->set_plane(*m_clp);
|
||||||
clipper->set_transformation(trafo);
|
clipper->set_transformation(trafo);
|
||||||
|
|
||||||
if (! clipper->get_triangles().empty()) {
|
::glPushMatrix();
|
||||||
::glPushMatrix();
|
::glColor3f(1.0f, 0.37f, 0.0f);
|
||||||
::glColor3f(1.0f, 0.37f, 0.0f);
|
clipper->render_cut();
|
||||||
::glBegin(GL_TRIANGLES);
|
::glPopMatrix();
|
||||||
for (const Vec3f& point : clipper->get_triangles())
|
|
||||||
::glVertex3f(point(0), point(1), point(2));
|
|
||||||
::glEnd();
|
|
||||||
::glPopMatrix();
|
|
||||||
}
|
|
||||||
++clipper_id;
|
++clipper_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,15 +453,10 @@ void SupportsClipper::render_cut() const
|
||||||
m_clipper->set_plane(*ocl->get_clipping_plane());
|
m_clipper->set_plane(*ocl->get_clipping_plane());
|
||||||
m_clipper->set_transformation(supports_trafo);
|
m_clipper->set_transformation(supports_trafo);
|
||||||
|
|
||||||
if (! m_clipper->get_triangles().empty()) {
|
::glPushMatrix();
|
||||||
::glPushMatrix();
|
::glColor3f(1.0f, 0.f, 0.37f);
|
||||||
::glColor3f(1.0f, 0.f, 0.37f);
|
m_clipper->render_cut();
|
||||||
::glBegin(GL_TRIANGLES);
|
::glPopMatrix();
|
||||||
for (const Vec3f& point : m_clipper->get_triangles())
|
|
||||||
::glVertex3f(point(0), point(1), point(2));
|
|
||||||
::glEnd();
|
|
||||||
::glPopMatrix();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ void MeshClipper::set_mesh(const TriangleMesh& mesh)
|
||||||
m_mesh = &mesh;
|
m_mesh = &mesh;
|
||||||
m_triangles_valid = false;
|
m_triangles_valid = false;
|
||||||
m_triangles2d.resize(0);
|
m_triangles2d.resize(0);
|
||||||
m_triangles3d.resize(0);
|
|
||||||
m_tms.reset(nullptr);
|
m_tms.reset(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,18 +39,17 @@ void MeshClipper::set_transformation(const Geometry::Transformation& trafo)
|
||||||
m_trafo = trafo;
|
m_trafo = trafo;
|
||||||
m_triangles_valid = false;
|
m_triangles_valid = false;
|
||||||
m_triangles2d.resize(0);
|
m_triangles2d.resize(0);
|
||||||
m_triangles3d.resize(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const std::vector<Vec3f>& MeshClipper::get_triangles()
|
void MeshClipper::render_cut()
|
||||||
{
|
{
|
||||||
if (! m_triangles_valid)
|
if (! m_triangles_valid)
|
||||||
recalculate_triangles();
|
recalculate_triangles();
|
||||||
|
|
||||||
return m_triangles3d;
|
m_vertex_array.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,29 +65,35 @@ void MeshClipper::recalculate_triangles()
|
||||||
const Vec3f& scaling = m_trafo.get_scaling_factor().cast<float>();
|
const Vec3f& scaling = m_trafo.get_scaling_factor().cast<float>();
|
||||||
// Calculate clipping plane normal in mesh coordinates.
|
// Calculate clipping plane normal in mesh coordinates.
|
||||||
Vec3f up_noscale = instance_matrix_no_translation_no_scaling.inverse() * m_plane.get_normal().cast<float>();
|
Vec3f up_noscale = instance_matrix_no_translation_no_scaling.inverse() * m_plane.get_normal().cast<float>();
|
||||||
Vec3f up (up_noscale(0)*scaling(0), up_noscale(1)*scaling(1), up_noscale(2)*scaling(2));
|
Vec3d up (up_noscale(0)*scaling(0), up_noscale(1)*scaling(1), up_noscale(2)*scaling(2));
|
||||||
// Calculate distance from mesh origin to the clipping plane (in mesh coordinates).
|
// Calculate distance from mesh origin to the clipping plane (in mesh coordinates).
|
||||||
float height_mesh = m_plane.distance(m_trafo.get_offset()) * (up_noscale.norm()/up.norm());
|
float height_mesh = m_plane.distance(m_trafo.get_offset()) * (up_noscale.norm()/up.norm());
|
||||||
|
|
||||||
// Now do the cutting
|
// Now do the cutting
|
||||||
std::vector<ExPolygons> list_of_expolys;
|
std::vector<ExPolygons> list_of_expolys;
|
||||||
m_tms->set_up_direction(up);
|
m_tms->set_up_direction(up.cast<float>());
|
||||||
m_tms->slice(std::vector<float>{height_mesh}, SlicingMode::Regular, 0.f, &list_of_expolys, [](){});
|
m_tms->slice(std::vector<float>{height_mesh}, SlicingMode::Regular, 0.f, &list_of_expolys, [](){});
|
||||||
m_triangles2d = triangulate_expolygons_2f(list_of_expolys[0], m_trafo.get_matrix().matrix().determinant() < 0.);
|
m_triangles2d = triangulate_expolygons_2f(list_of_expolys[0], m_trafo.get_matrix().matrix().determinant() < 0.);
|
||||||
|
|
||||||
// Rotate the cut into world coords:
|
// Rotate the cut into world coords:
|
||||||
Eigen::Quaternionf q;
|
Eigen::Quaterniond q;
|
||||||
q.setFromTwoVectors(Vec3f::UnitZ(), up);
|
q.setFromTwoVectors(Vec3d::UnitZ(), up);
|
||||||
Transform3f tr = Transform3f::Identity();
|
Transform3d tr = Transform3d::Identity();
|
||||||
tr.rotate(q);
|
tr.rotate(q);
|
||||||
tr = m_trafo.get_matrix().cast<float>() * tr;
|
tr = m_trafo.get_matrix() * tr;
|
||||||
|
|
||||||
m_triangles3d.clear();
|
// to avoid z-fighting
|
||||||
m_triangles3d.reserve(m_triangles2d.size());
|
height_mesh += 0.001f;
|
||||||
for (const Vec2f& pt : m_triangles2d) {
|
|
||||||
m_triangles3d.push_back(Vec3f(pt(0), pt(1), height_mesh+0.001f));
|
m_vertex_array.release_geometry();
|
||||||
m_triangles3d.back() = tr * m_triangles3d.back();
|
for (auto it=m_triangles2d.cbegin(); it != m_triangles2d.cend(); it=it+3) {
|
||||||
}
|
m_vertex_array.push_geometry(tr * Vec3d((*(it+0))(0), (*(it+0))(1), height_mesh), up);
|
||||||
|
m_vertex_array.push_geometry(tr * Vec3d((*(it+1))(0), (*(it+1))(1), height_mesh), up);
|
||||||
|
m_vertex_array.push_geometry(tr * Vec3d((*(it+2))(0), (*(it+2))(1), height_mesh), up);
|
||||||
|
size_t idx = it - m_triangles2d.cbegin();
|
||||||
|
m_vertex_array.push_triangle(idx, idx+1, idx+2);
|
||||||
|
}
|
||||||
|
m_vertex_array.finalize_geometry(true);
|
||||||
|
|
||||||
m_triangles_valid = true;
|
m_triangles_valid = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "libslic3r/SLA/EigenMesh3D.hpp"
|
#include "libslic3r/SLA/EigenMesh3D.hpp"
|
||||||
#include "admesh/stl.h"
|
#include "admesh/stl.h"
|
||||||
|
|
||||||
|
#include "slic3r/GUI/3DScene.hpp"
|
||||||
|
|
||||||
#include <cfloat>
|
#include <cfloat>
|
||||||
|
|
||||||
|
@ -82,9 +82,9 @@ public:
|
||||||
// into world coordinates.
|
// into world coordinates.
|
||||||
void set_transformation(const Geometry::Transformation& trafo);
|
void set_transformation(const Geometry::Transformation& trafo);
|
||||||
|
|
||||||
// Return the triangulated cut. The points are returned directly
|
// Render the triangulated cut. Transformation matrices should
|
||||||
// in world coordinates.
|
// be set in world coords.
|
||||||
const std::vector<Vec3f>& get_triangles();
|
void render_cut();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void recalculate_triangles();
|
void recalculate_triangles();
|
||||||
|
@ -93,7 +93,7 @@ private:
|
||||||
const TriangleMesh* m_mesh = nullptr;
|
const TriangleMesh* m_mesh = nullptr;
|
||||||
ClippingPlane m_plane;
|
ClippingPlane m_plane;
|
||||||
std::vector<Vec2f> m_triangles2d;
|
std::vector<Vec2f> m_triangles2d;
|
||||||
std::vector<Vec3f> m_triangles3d;
|
GLIndexedVertexArray m_vertex_array;
|
||||||
bool m_triangles_valid = false;
|
bool m_triangles_valid = false;
|
||||||
std::unique_ptr<TriangleMeshSlicer> m_tms;
|
std::unique_ptr<TriangleMeshSlicer> m_tms;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue