Tech ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL - Replace GLIndexedVertexArray with GLModel:

TriangleSelectorGUI::m_iva_enforcers

TriangleSelectorGUI::m_iva_blockers

TriangleSelectorGUI::m_iva_seed_fills

TriangleSelectorGUI::m_varrays

GLGizmoPainterBase::s_sphere

(cherry picked from commit prusa3d/PrusaSlicer@8916a00821)
This commit is contained in:
enricoturri1966 2023-10-22 22:39:08 +08:00 committed by Noisyfox
parent b7989e3b2f
commit baa575b5aa
5 changed files with 101 additions and 67 deletions

View file

@ -561,8 +561,8 @@ void GLModel::render()
const Geometry& data = m_render_data.geometry; const Geometry& data = m_render_data.geometry;
GLenum mode = get_primitive_mode(data.format); const GLenum mode = get_primitive_mode(data.format);
GLenum index_type = get_index_type(data.format); const GLenum index_type = get_index_type(data.format);
const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format);
const bool position = Geometry::has_position(data.format); const bool position = Geometry::has_position(data.format);

View file

@ -86,6 +86,8 @@ namespace GUI {
unsigned int extract_uint_index(size_t id) const; unsigned int extract_uint_index(size_t id) const;
unsigned short extract_ushort_index(size_t id) const; unsigned short extract_ushort_index(size_t id) const;
bool is_empty() const { return vertices.empty() || indices.empty(); }
size_t vertices_count() const { return vertices.size() / vertex_stride_floats(format); } size_t vertices_count() const { return vertices.size() / vertex_stride_floats(format); }
size_t indices_count() const { return indices.size() / index_stride_bytes(format); } size_t indices_count() const { return indices.size() / index_stride_bytes(format); }

View file

@ -5,6 +5,7 @@
//BBS //BBS
#include "libslic3r/Print.hpp" #include "libslic3r/Print.hpp"
#include "libslic3r/ObjectID.hpp" #include "libslic3r/ObjectID.hpp"
#include "slic3r/GUI/3DScene.hpp"
#include <boost/thread.hpp> #include <boost/thread.hpp>

View file

@ -18,7 +18,7 @@
namespace Slic3r::GUI { namespace Slic3r::GUI {
std::shared_ptr<GLIndexedVertexArray> GLGizmoPainterBase::s_sphere = nullptr; std::shared_ptr<GLModel> GLGizmoPainterBase::s_sphere = nullptr;
GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
: GLGizmoBase(parent, icon_filename, sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id)
@ -29,8 +29,8 @@ GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& ic
GLGizmoPainterBase::~GLGizmoPainterBase() GLGizmoPainterBase::~GLGizmoPainterBase()
{ {
if (s_sphere != nullptr && s_sphere->has_VBOs()) if (s_sphere != nullptr)
s_sphere->release_geometry(); s_sphere.reset();
} }
void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection) void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection)
@ -241,11 +241,14 @@ void GLGizmoPainterBase::render_cursor_circle()
void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const
{ {
if (s_sphere == nullptr) { if (s_sphere == nullptr) {
s_sphere = std::make_shared<GLIndexedVertexArray>(); s_sphere = std::make_shared<GLModel>();
s_sphere->load_its_flat_shading(its_make_sphere(1.0, double(PI) / 12.0)); s_sphere->init_from(its_make_sphere(1.0, double(PI) / 12.0));
s_sphere->finalize_geometry(true);
} }
GLShaderProgram* shader = wxGetApp().get_shader("flat");
if (shader == nullptr)
return;
const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse();
const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed(); const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed();
@ -265,11 +268,13 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const
render_color = this->get_cursor_sphere_left_button_color(); render_color = this->get_cursor_sphere_left_button_color();
else if (m_button_down == Button::Right) else if (m_button_down == Button::Right)
render_color = this->get_cursor_sphere_right_button_color(); render_color = this->get_cursor_sphere_right_button_color();
glsafe(::glColor4fv(render_color.data())); shader->start_using();
assert(s_sphere != nullptr); assert(s_sphere != nullptr);
s_sphere->set_color(render_color);
s_sphere->render(); s_sphere->render();
shader->stop_using();
if (is_left_handed) if (is_left_handed)
glFrontFace(GL_CCW); glFrontFace(GL_CCW);
@ -1066,19 +1071,16 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui)
shader->set_uniform("offset_depth_buffer", true); shader->set_uniform("offset_depth_buffer", true);
for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color),
std::make_pair(&m_iva_blockers, blockers_color)}) { std::make_pair(&m_iva_blockers, blockers_color)}) {
if (iva.first->has_VBOs()) { iva.first->set_color(iva.second);
shader->set_uniform("uniform_color", iva.second);
iva.first->render(); iva.first->render();
} }
}
for (auto &iva : m_iva_seed_fills) for (auto& iva : m_iva_seed_fills) {
if (iva.has_VBOs()) {
size_t color_idx = &iva - &m_iva_seed_fills.front(); size_t color_idx = &iva - &m_iva_seed_fills.front();
const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color :
color_idx == 2 ? blockers_color : color_idx == 2 ? blockers_color :
GLVolume::NEUTRAL_COLOR); GLVolume::NEUTRAL_COLOR);
shader->set_uniform("uniform_color", color); iva.set_color(color);
iva.render(); iva.render();
} }
@ -1110,11 +1112,21 @@ void TriangleSelectorGUI::update_render_data()
int blc_cnt = 0; int blc_cnt = 0;
std::vector<int> seed_fill_cnt(m_iva_seed_fills.size(), 0); std::vector<int> seed_fill_cnt(m_iva_seed_fills.size(), 0);
for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) {
iva->release_geometry(); iva->reset();
}
for (auto &iva : m_iva_seed_fills) for (auto& iva : m_iva_seed_fills) {
iva.release_geometry(); iva.reset();
}
GLModel::Geometry iva_enforcers_data;
iva_enforcers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT };
GLModel::Geometry iva_blockers_data;
iva_blockers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT };
std::array<GLModel::Geometry, 3> iva_seed_fills_data;
for (auto& data : iva_seed_fills_data)
data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT };
for (const Triangle &tr : m_triangles) { for (const Triangle &tr : m_triangles) {
bool is_valid = tr.valid(); bool is_valid = tr.valid();
@ -1125,9 +1137,9 @@ void TriangleSelectorGUI::update_render_data()
continue; continue;
int tr_state = int(tr.get_state()); int tr_state = int(tr.get_state());
GLIndexedVertexArray &iva = tr.is_selected_by_seed_fill() ? m_iva_seed_fills[tr_state] : GLModel::Geometry &iva = tr.is_selected_by_seed_fill() ? iva_seed_fills_data[tr_state] :
tr.get_state() == EnforcerBlockerType::ENFORCER ? m_iva_enforcers : tr.get_state() == EnforcerBlockerType::ENFORCER ? iva_enforcers_data :
m_iva_blockers; iva_blockers_data;
int &cnt = tr.is_selected_by_seed_fill() ? seed_fill_cnt[tr_state] : int &cnt = tr.is_selected_by_seed_fill() ? seed_fill_cnt[tr_state] :
tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt : tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt :
blc_cnt; blc_cnt;
@ -1137,18 +1149,21 @@ void TriangleSelectorGUI::update_render_data()
//FIXME the normal may likely be pulled from m_triangle_selectors, but it may not be worth the effort //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. // or the current implementation may be more cache friendly.
const Vec3f n = (v1 - v0).cross(v2 - v1).normalized(); const Vec3f n = (v1 - v0).cross(v2 - v1).normalized();
iva.push_geometry(v0, n); iva.add_vertex(v0, n);
iva.push_geometry(v1, n); iva.add_vertex(v1, n);
iva.push_geometry(v2, n); iva.add_vertex(v2, n);
iva.push_triangle(cnt, cnt + 1, cnt + 2); iva.add_uint_triangle((unsigned int)cnt, (unsigned int)cnt + 1, (unsigned int)cnt + 2);
cnt += 3; cnt += 3;
} }
for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) if (!iva_enforcers_data.is_empty())
iva->finalize_geometry(true); m_iva_enforcers.init_from(std::move(iva_enforcers_data));
if (!iva_blockers_data.is_empty())
for (auto &iva : m_iva_seed_fills) m_iva_blockers.init_from(std::move(iva_blockers_data));
iva.finalize_geometry(true); for (size_t i = 0; i < m_iva_seed_fills.size(); ++i) {
if (!iva_seed_fills_data[i].is_empty())
m_iva_seed_fills[i].init_from(std::move(iva_seed_fills_data[i]));
}
m_paint_contour.release_geometry(); m_paint_contour.release_geometry();
std::vector<Vec2i> contour_edges = this->get_seed_fill_contour(); std::vector<Vec2i> contour_edges = this->get_seed_fill_contour();
@ -1689,59 +1704,73 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui)
}; };
for (auto& va : m_varrays) for (auto& va : m_varrays)
va.release_geometry(); va.reset();
std::array<int, 3> cnts; std::array<int, 3> cnts;
::glScalef(1.01f, 1.01f, 1.01f); ::glScalef(1.01f, 1.01f, 1.01f);
std::array<GLModel::Geometry, 3> varrays_data;
for (auto& data : varrays_data)
data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT };
for (int tr_id=0; tr_id<int(m_triangles.size()); ++tr_id) { for (int tr_id=0; tr_id<int(m_triangles.size()); ++tr_id) {
const Triangle& tr = m_triangles[tr_id]; const Triangle& tr = m_triangles[tr_id];
GLIndexedVertexArray* va = nullptr; GLModel::Geometry* va = nullptr;
int* cnt = nullptr; int* cnt = nullptr;
if (tr_id < m_orig_size_indices) { if (tr_id < m_orig_size_indices) {
va = &m_varrays[ORIGINAL]; va = &varrays_data[ORIGINAL];
cnt = &cnts[ORIGINAL]; cnt = &cnts[ORIGINAL];
} }
else if (tr.valid()) { else if (tr.valid()) {
va = &m_varrays[SPLIT]; va = &varrays_data[SPLIT];
cnt = &cnts[SPLIT]; cnt = &cnts[SPLIT];
} }
else { else {
if (! m_show_invalid) if (! m_show_invalid)
continue; continue;
va = &m_varrays[INVALID]; va = &varrays_data[INVALID];
cnt = &cnts[INVALID]; cnt = &cnts[INVALID];
} }
for (int i=0; i<3; ++i) for (int i = 0; i < 3; ++i) {
va->push_geometry(double(m_vertices[tr.verts_idxs[i]].v[0]), va->add_vertex(m_vertices[tr.verts_idxs[i]].v, Vec3f(0.0f, 0.0f, 1.0f));
double(m_vertices[tr.verts_idxs[i]].v[1]), }
double(m_vertices[tr.verts_idxs[i]].v[2]), va->add_uint_triangle((unsigned int)*cnt, (unsigned int)*cnt + 1, (unsigned int)*cnt + 2);
0., 0., 1.);
va->push_triangle(*cnt,
*cnt+1,
*cnt+2);
*cnt += 3; *cnt += 3;
} }
for (int i = 0; i < 3; ++i) {
if (!varrays_data[i].is_empty())
m_varrays[i].init_from(std::move(varrays_data[i]));
}
GLShaderProgram* curr_shader = wxGetApp().get_current_shader();
if (curr_shader != nullptr)
curr_shader->stop_using();
GLShaderProgram* shader = wxGetApp().get_shader("flat");
if (shader != nullptr) {
shader->start_using();
::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
for (vtype i : {ORIGINAL, SPLIT, INVALID}) { for (vtype i : {ORIGINAL, SPLIT, INVALID}) {
GLIndexedVertexArray& va = m_varrays[i]; GLModel& va = m_varrays[i];
va.finalize_geometry(true);
if (va.has_VBOs()) {
switch (i) { switch (i) {
case ORIGINAL : ::glColor3f(0.f, 0.f, 1.f); break; case ORIGINAL: va.set_color({ 0.0f, 0.0f, 1.0f, 1.0f }); break;
case SPLIT : ::glColor3f(1.f, 0.f, 0.f); break; case SPLIT: va.set_color({ 1.0f, 0.0f, 0.0f, 1.0f }); break;
case INVALID : ::glColor3f(1.f, 1.f, 0.f); break; case INVALID: va.set_color({ 1.0f, 1.0f, 0.0f, 1.0f }); break;
} }
va.render(); va.render();
} }
}
::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); ::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
shader->stop_using();
}
if (curr_shader != nullptr)
curr_shader->start_using();
} }
#endif #endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
} // namespace Slic3r::GUI } // namespace Slic3r::GUI

View file

@ -3,7 +3,7 @@
#include "GLGizmoBase.hpp" #include "GLGizmoBase.hpp"
#include "slic3r/GUI/3DScene.hpp" #include "slic3r/GUI/GLModel.hpp"
#include "libslic3r/ObjectID.hpp" #include "libslic3r/ObjectID.hpp"
#include "libslic3r/TriangleSelector.hpp" #include "libslic3r/TriangleSelector.hpp"
@ -104,10 +104,12 @@ protected:
private: private:
void update_render_data(); void update_render_data();
GLIndexedVertexArray m_iva_enforcers; GLModel m_iva_enforcers;
GLIndexedVertexArray m_iva_blockers; GLModel m_iva_blockers;
std::array<GLIndexedVertexArray, 3> m_iva_seed_fills; std::array<GLModel, 3> m_iva_seed_fills;
std::array<GLIndexedVertexArray, 3> m_varrays; #ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
std::array<GLModel, 3> m_varrays;
#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
protected: protected:
GLPaintContour m_paint_contour; GLPaintContour m_paint_contour;
@ -342,7 +344,7 @@ private:
const Camera& camera, const Camera& camera,
const std::vector<Transform3d>& trafo_matrices) const; const std::vector<Transform3d>& trafo_matrices) const;
static std::shared_ptr<GLIndexedVertexArray> s_sphere; static std::shared_ptr<GLModel> s_sphere;
bool m_internal_stack_active = false; bool m_internal_stack_active = false;
bool m_schedule_update = false; bool m_schedule_update = false;