mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-08 07:27:41 -06:00
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:
parent
b7989e3b2f
commit
baa575b5aa
5 changed files with 101 additions and 67 deletions
|
@ -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);
|
||||||
|
|
|
@ -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); }
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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);
|
iva.set_color(color);
|
||||||
shader->set_uniform("uniform_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);
|
switch (i) {
|
||||||
if (va.has_VBOs()) {
|
case ORIGINAL: va.set_color({ 0.0f, 0.0f, 1.0f, 1.0f }); break;
|
||||||
switch (i) {
|
case SPLIT: va.set_color({ 1.0f, 0.0f, 0.0f, 1.0f }); break;
|
||||||
case ORIGINAL : ::glColor3f(0.f, 0.f, 1.f); break;
|
case INVALID: va.set_color({ 1.0f, 1.0f, 0.0f, 1.0f }); break;
|
||||||
case SPLIT : ::glColor3f(1.f, 0.f, 0.f); break;
|
|
||||||
case INVALID : ::glColor3f(1.f, 1.f, 0.f); 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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue