mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 09:47:58 -06:00
Tech ENABLE_GLBEGIN_GLEND_REMOVAL - SLA caps rendered using GLModel
(cherry picked from commit prusa3d/PrusaSlicer@c9ff260d13)
This commit is contained in:
parent
10243b3a8c
commit
dde64acf72
2 changed files with 64 additions and 49 deletions
|
@ -8096,32 +8096,54 @@ void GLCanvas3D::_render_sla_slices()
|
||||||
if (!obj->is_step_done(slaposSliceSupports))
|
if (!obj->is_step_done(slaposSliceSupports))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SlaCap::ObjectIdToTrianglesMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i);
|
SlaCap::ObjectIdToModelsMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i);
|
||||||
SlaCap::ObjectIdToTrianglesMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i);
|
SlaCap::ObjectIdToModelsMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i);
|
||||||
{
|
{
|
||||||
if (it_caps_bottom == m_sla_caps[0].triangles.end())
|
if (it_caps_bottom == m_sla_caps[0].triangles.end())
|
||||||
it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first;
|
it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first;
|
||||||
if (!m_sla_caps[0].matches(clip_min_z)) {
|
if (!m_sla_caps[0].matches(clip_min_z)) {
|
||||||
m_sla_caps[0].z = clip_min_z;
|
m_sla_caps[0].z = clip_min_z;
|
||||||
it_caps_bottom->second.object.clear();
|
it_caps_bottom->second.object.reset();
|
||||||
it_caps_bottom->second.supports.clear();
|
it_caps_bottom->second.supports.reset();
|
||||||
}
|
}
|
||||||
if (it_caps_top == m_sla_caps[1].triangles.end())
|
if (it_caps_top == m_sla_caps[1].triangles.end())
|
||||||
it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first;
|
it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first;
|
||||||
if (!m_sla_caps[1].matches(clip_max_z)) {
|
if (!m_sla_caps[1].matches(clip_max_z)) {
|
||||||
m_sla_caps[1].z = clip_max_z;
|
m_sla_caps[1].z = clip_max_z;
|
||||||
it_caps_top->second.object.clear();
|
it_caps_top->second.object.reset();
|
||||||
it_caps_top->second.supports.clear();
|
it_caps_top->second.supports.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Pointf3s &bottom_obj_triangles = it_caps_bottom->second.object;
|
GLModel& bottom_obj_triangles = it_caps_bottom->second.object;
|
||||||
Pointf3s &bottom_sup_triangles = it_caps_bottom->second.supports;
|
GLModel& bottom_sup_triangles = it_caps_bottom->second.supports;
|
||||||
Pointf3s &top_obj_triangles = it_caps_top->second.object;
|
GLModel& top_obj_triangles = it_caps_top->second.object;
|
||||||
Pointf3s &top_sup_triangles = it_caps_top->second.supports;
|
GLModel& top_sup_triangles = it_caps_top->second.supports;
|
||||||
|
|
||||||
if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) &&
|
auto init_model = [](GLModel& model, const Pointf3s& triangles, const ColorRGBA& color) {
|
||||||
!obj->get_slice_index().empty())
|
GLModel::Geometry init_data;
|
||||||
{
|
init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(triangles.size()) };
|
||||||
|
init_data.reserve_vertices(triangles.size());
|
||||||
|
init_data.reserve_indices(triangles.size() / 3);
|
||||||
|
init_data.color = color;
|
||||||
|
|
||||||
|
unsigned int vertices_count = 0;
|
||||||
|
for (const Vec3d& v : triangles) {
|
||||||
|
init_data.add_vertex((Vec3f)v.cast<float>());
|
||||||
|
++vertices_count;
|
||||||
|
if (vertices_count % 3 == 0) {
|
||||||
|
if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT)
|
||||||
|
init_data.add_ushort_triangle((unsigned short)vertices_count - 3, (unsigned short)vertices_count - 2, (unsigned short)vertices_count - 1);
|
||||||
|
else
|
||||||
|
init_data.add_uint_triangle(vertices_count - 3, vertices_count - 2, vertices_count - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!init_data.is_empty())
|
||||||
|
model.init_from(std::move(init_data));
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((!bottom_obj_triangles.is_initialized() || !bottom_sup_triangles.is_initialized() ||
|
||||||
|
!top_obj_triangles.is_initialized() || !top_sup_triangles.is_initialized()) && !obj->get_slice_index().empty()) {
|
||||||
double layer_height = print->default_object_config().layer_height.value;
|
double layer_height = print->default_object_config().layer_height.value;
|
||||||
double initial_layer_height = print->material_config().initial_layer_height.value;
|
double initial_layer_height = print->material_config().initial_layer_height.value;
|
||||||
bool left_handed = obj->is_left_handed();
|
bool left_handed = obj->is_left_handed();
|
||||||
|
@ -8142,55 +8164,48 @@ void GLCanvas3D::_render_sla_slices()
|
||||||
const ExPolygons& obj_bottom = slice_low.get_slice(soModel);
|
const ExPolygons& obj_bottom = slice_low.get_slice(soModel);
|
||||||
const ExPolygons& sup_bottom = slice_low.get_slice(soSupport);
|
const ExPolygons& sup_bottom = slice_low.get_slice(soSupport);
|
||||||
// calculate model bottom cap
|
// calculate model bottom cap
|
||||||
if (bottom_obj_triangles.empty() && !obj_bottom.empty())
|
// calculate model bottom cap
|
||||||
bottom_obj_triangles = triangulate_expolygons_3d(obj_bottom, clip_min_z - plane_shift_z, ! left_handed);
|
if (!bottom_obj_triangles.is_initialized() && !obj_bottom.empty())
|
||||||
|
init_model(bottom_obj_triangles, triangulate_expolygons_3d(obj_bottom, clip_min_z - plane_shift_z, !left_handed), { 1.0f, 0.37f, 0.0f, 1.0f });
|
||||||
// calculate support bottom cap
|
// calculate support bottom cap
|
||||||
if (bottom_sup_triangles.empty() && !sup_bottom.empty())
|
if (!bottom_sup_triangles.is_initialized() && !sup_bottom.empty())
|
||||||
bottom_sup_triangles = triangulate_expolygons_3d(sup_bottom, clip_min_z - plane_shift_z, ! left_handed);
|
init_model(bottom_sup_triangles, triangulate_expolygons_3d(sup_bottom, clip_min_z - plane_shift_z, !left_handed), { 1.0f, 0.0f, 0.37f, 1.0f });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slice_high.is_valid()) {
|
if (slice_high.is_valid()) {
|
||||||
const ExPolygons& obj_top = slice_high.get_slice(soModel);
|
const ExPolygons& obj_top = slice_high.get_slice(soModel);
|
||||||
const ExPolygons& sup_top = slice_high.get_slice(soSupport);
|
const ExPolygons& sup_top = slice_high.get_slice(soSupport);
|
||||||
// calculate model top cap
|
// calculate model top cap
|
||||||
if (top_obj_triangles.empty() && !obj_top.empty())
|
// calculate model top cap
|
||||||
top_obj_triangles = triangulate_expolygons_3d(obj_top, clip_max_z + plane_shift_z, left_handed);
|
if (!top_obj_triangles.is_initialized() && !obj_top.empty())
|
||||||
|
init_model(top_obj_triangles, triangulate_expolygons_3d(obj_top, clip_max_z + plane_shift_z, left_handed), { 1.0f, 0.37f, 0.0f, 1.0f });
|
||||||
// calculate support top cap
|
// calculate support top cap
|
||||||
if (top_sup_triangles.empty() && !sup_top.empty())
|
if (!top_sup_triangles.is_initialized() && !sup_top.empty())
|
||||||
top_sup_triangles = triangulate_expolygons_3d(sup_top, clip_max_z + plane_shift_z, left_handed);
|
init_model(top_sup_triangles, triangulate_expolygons_3d(sup_top, clip_max_z + plane_shift_z, left_handed), { 1.0f, 0.0f, 0.37f, 1.0f });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bottom_obj_triangles.empty() || !top_obj_triangles.empty() || !bottom_sup_triangles.empty() || !top_sup_triangles.empty()) {
|
GLShaderProgram* shader = wxGetApp().get_shader("flat");
|
||||||
for (const SLAPrintObject::Instance& inst : obj->instances()) {
|
if (shader != nullptr) {
|
||||||
|
shader->start_using();
|
||||||
|
|
||||||
|
for (const SLAPrintObject::Instance& inst : obj->instances()) {
|
||||||
glsafe(::glPushMatrix());
|
glsafe(::glPushMatrix());
|
||||||
glsafe(::glTranslated(unscale<double>(inst.shift.x()), unscale<double>(inst.shift.y()), 0.0));
|
glsafe(::glTranslated(unscale<double>(inst.shift.x()), unscale<double>(inst.shift.y()), 0.0));
|
||||||
glsafe(::glRotatef(Geometry::rad2deg(inst.rotation), 0.0f, 0.0f, 1.0f));
|
glsafe(::glRotatef(Geometry::rad2deg(inst.rotation), 0.0f, 0.0f, 1.0f));
|
||||||
if (obj->is_left_handed())
|
if (obj->is_left_handed())
|
||||||
// The polygons are mirrored by X.
|
// The polygons are mirrored by X.
|
||||||
glsafe(::glScalef(-1.0f, 1.0f, 1.0f));
|
glsafe(::glScalef(-1.0f, 1.0f, 1.0f));
|
||||||
glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
|
|
||||||
glsafe(::glColor3f(1.0f, 0.37f, 0.0f));
|
bottom_obj_triangles.render();
|
||||||
if (!bottom_obj_triangles.empty()) {
|
top_obj_triangles.render();
|
||||||
glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)bottom_obj_triangles.front().data()));
|
bottom_sup_triangles.render();
|
||||||
glsafe(::glDrawArrays(GL_TRIANGLES, 0, bottom_obj_triangles.size()));
|
top_sup_triangles.render();
|
||||||
}
|
|
||||||
if (! top_obj_triangles.empty()) {
|
|
||||||
glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)top_obj_triangles.front().data()));
|
|
||||||
glsafe(::glDrawArrays(GL_TRIANGLES, 0, top_obj_triangles.size()));
|
|
||||||
}
|
|
||||||
glsafe(::glColor3f(1.0f, 0.0f, 0.37f));
|
|
||||||
if (! bottom_sup_triangles.empty()) {
|
|
||||||
glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)bottom_sup_triangles.front().data()));
|
|
||||||
glsafe(::glDrawArrays(GL_TRIANGLES, 0, bottom_sup_triangles.size()));
|
|
||||||
}
|
|
||||||
if (! top_sup_triangles.empty()) {
|
|
||||||
glsafe(::glVertexPointer(3, GL_DOUBLE, 0, (GLdouble*)top_sup_triangles.front().data()));
|
|
||||||
glsafe(::glDrawArrays(GL_TRIANGLES, 0, top_sup_triangles.size()));
|
|
||||||
}
|
|
||||||
glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
|
|
||||||
glsafe(::glPopMatrix());
|
glsafe(::glPopMatrix());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shader->stop_using();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,12 +355,12 @@ class GLCanvas3D
|
||||||
{
|
{
|
||||||
struct Triangles
|
struct Triangles
|
||||||
{
|
{
|
||||||
Pointf3s object;
|
GLModel object;
|
||||||
Pointf3s supports;
|
GLModel supports;
|
||||||
};
|
};
|
||||||
typedef std::map<unsigned int, Triangles> ObjectIdToTrianglesMap;
|
typedef std::map<unsigned int, Triangles> ObjectIdToModelsMap;
|
||||||
double z;
|
double z;
|
||||||
ObjectIdToTrianglesMap triangles;
|
ObjectIdToModelsMap triangles;
|
||||||
|
|
||||||
SlaCap() { reset(); }
|
SlaCap() { reset(); }
|
||||||
void reset() { z = DBL_MAX; triangles.clear(); }
|
void reset() { z = DBL_MAX; triangles.clear(); }
|
||||||
|
@ -526,7 +526,7 @@ private:
|
||||||
std::array<ClippingPlane, 2> m_clipping_planes;
|
std::array<ClippingPlane, 2> m_clipping_planes;
|
||||||
ClippingPlane m_camera_clipping_plane;
|
ClippingPlane m_camera_clipping_plane;
|
||||||
bool m_use_clipping_planes;
|
bool m_use_clipping_planes;
|
||||||
SlaCap m_sla_caps[2];
|
std::array<SlaCap, 2> m_sla_caps;
|
||||||
std::string m_sidebar_field;
|
std::string m_sidebar_field;
|
||||||
// when true renders an extra frame by not resetting m_dirty to false
|
// when true renders an extra frame by not resetting m_dirty to false
|
||||||
// see request_extra_frame()
|
// see request_extra_frame()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue