mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-07 23:17:35 -06:00
ENH: wireframe: refine the rendering logic under paint
1. remove wireframe in 3d view, only keep in paint; 2. pass barycentric_coordinates from outside 3. add shortcut hints Change-Id: I911e5cdf3475926d9527dc0839fdce072ed54746 (cherry picked from commit 6e16d0ccfb71741e55daabd757be9f9e7613e695)
This commit is contained in:
parent
79b5c94f4f
commit
a9a228d071
9 changed files with 137 additions and 39 deletions
|
@ -1076,11 +1076,19 @@ void TriangleSelectorPatch::render(ImGuiWrapper* imgui)
|
|||
if (!shader)
|
||||
return;
|
||||
assert(shader->get_name() == "mm_gouraud");
|
||||
GLint position_id = -1;
|
||||
GLint barycentric_id = -1;
|
||||
if (wxGetApp().plater()->is_wireframe_enabled()) {
|
||||
if (wxGetApp().plater()->is_show_wireframe())
|
||||
position_id = shader->get_attrib_location("v_position");
|
||||
barycentric_id = shader->get_attrib_location("v_barycentric");
|
||||
if (m_need_wireframe && wxGetApp().plater()->is_show_wireframe()) {
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", show_wireframe on");
|
||||
shader->set_uniform("show_wireframe", true);
|
||||
else
|
||||
}
|
||||
else {
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", show_wireframe off");
|
||||
shader->set_uniform("show_wireframe", false);
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t buffer_idx = 0; buffer_idx < m_triangle_patches.size(); ++buffer_idx) {
|
||||
|
@ -1100,11 +1108,13 @@ void TriangleSelectorPatch::render(ImGuiWrapper* imgui)
|
|||
std::array<float, 4> new_color = adjust_color_for_rendering(color);
|
||||
shader->set_uniform("uniform_color", new_color);
|
||||
//shader->set_uniform("uniform_color", color);
|
||||
this->render(buffer_idx);
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", buffer_idx %1%: new_color[%2%, %3%, %4%, %5%]")%buffer_idx%new_color[0]%new_color[1]%new_color[2]%new_color[3];
|
||||
this->render(buffer_idx, (int)position_id, (int)barycentric_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_paint_contour.has_VBO()) {
|
||||
if (m_paint_contour.has_VBO())
|
||||
{
|
||||
ScopeGuard guard_mm_gouraud([shader]() { shader->start_using(); });
|
||||
shader->stop_using();
|
||||
|
||||
|
@ -1123,6 +1133,7 @@ void TriangleSelectorPatch::render(ImGuiWrapper* imgui)
|
|||
|
||||
void TriangleSelectorPatch::update_triangles_per_type()
|
||||
{
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", enter");
|
||||
m_triangle_patches.resize((int)EnforcerBlockerType::ExtruderMax + 1);
|
||||
for (int i = 0; i < m_triangle_patches.size(); i++) {
|
||||
auto& patch = m_triangle_patches[i];
|
||||
|
@ -1130,6 +1141,8 @@ void TriangleSelectorPatch::update_triangles_per_type()
|
|||
patch.triangle_indices.reserve(m_triangles.size() / 3);
|
||||
}
|
||||
|
||||
bool using_wireframe = (wxGetApp().plater()->is_wireframe_enabled())?true:false;
|
||||
|
||||
for (auto& triangle : m_triangles) {
|
||||
if (!triangle.valid() || triangle.is_split())
|
||||
continue;
|
||||
|
@ -1139,13 +1152,33 @@ void TriangleSelectorPatch::update_triangles_per_type()
|
|||
//patch.triangle_indices.insert(patch.triangle_indices.end(), triangle.verts_idxs.begin(), triangle.verts_idxs.end());
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
int j = triangle.verts_idxs[i];
|
||||
int index = int(patch.patch_vertices.size()/3);
|
||||
int index = using_wireframe?int(patch.patch_vertices.size()/6) : int(patch.patch_vertices.size()/3);
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: i=%2%, j=%3%, index=%4%, v[%5%,%6%,%7%]")%__LINE__%i%j%index%m_vertices[j].v(0)%m_vertices[j].v(1)%m_vertices[j].v(2);
|
||||
patch.patch_vertices.emplace_back(m_vertices[j].v(0));
|
||||
patch.patch_vertices.emplace_back(m_vertices[j].v(1));
|
||||
patch.patch_vertices.emplace_back(m_vertices[j].v(2));
|
||||
if (using_wireframe) {
|
||||
if (i == 0) {
|
||||
patch.patch_vertices.emplace_back(1.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
}
|
||||
else if (i == 1) {
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(1.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
}
|
||||
else {
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(1.0);
|
||||
}
|
||||
}
|
||||
patch.triangle_indices.emplace_back( index);
|
||||
}
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: state=%2%, vertice size=%3%, triangle size %4%")%__LINE__%state%patch.patch_vertices.size()%patch.triangle_indices.size();
|
||||
}
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("exit");
|
||||
}
|
||||
|
||||
void TriangleSelectorPatch::update_selector_triangles()
|
||||
|
@ -1166,6 +1199,8 @@ void TriangleSelectorPatch::update_triangles_per_patch()
|
|||
auto [neighbors, neighbors_propagated] = this->precompute_all_neighbors();
|
||||
std::vector<bool> visited(m_triangles.size(), false);
|
||||
|
||||
bool using_wireframe = (wxGetApp().plater()->is_wireframe_enabled())?true:false;
|
||||
|
||||
auto get_all_touching_triangles = [this](int facet_idx, const Vec3i& neighbors, const Vec3i& neighbors_propagated) -> std::vector<int> {
|
||||
assert(facet_idx != -1 && facet_idx < int(m_triangles.size()));
|
||||
assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors));
|
||||
|
@ -1218,10 +1253,27 @@ void TriangleSelectorPatch::update_triangles_per_patch()
|
|||
Triangle& triangle = m_triangles[current_facet];
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
int j = triangle.verts_idxs[i];
|
||||
int index = int(patch.patch_vertices.size()/3);
|
||||
int index = using_wireframe?int(patch.patch_vertices.size()/6) : int(patch.patch_vertices.size()/3);
|
||||
patch.patch_vertices.emplace_back(m_vertices[j].v(0));
|
||||
patch.patch_vertices.emplace_back(m_vertices[j].v(1));
|
||||
patch.patch_vertices.emplace_back(m_vertices[j].v(2));
|
||||
if (using_wireframe) {
|
||||
if (i == 0) {
|
||||
patch.patch_vertices.emplace_back(1.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
}
|
||||
else if (i == 1) {
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(1.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
}
|
||||
else {
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(0.0);
|
||||
patch.patch_vertices.emplace_back(1.0);
|
||||
}
|
||||
}
|
||||
patch.triangle_indices.emplace_back( index);
|
||||
}
|
||||
//patch.triangle_indices.insert(patch.triangle_indices.end(), triangle.verts_idxs.begin(), triangle.verts_idxs.end());
|
||||
|
@ -1268,6 +1320,7 @@ void TriangleSelectorPatch::set_filter_state(bool is_filter_state)
|
|||
|
||||
void TriangleSelectorPatch::update_render_data()
|
||||
{
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", m_paint_changed=%1%, m_triangle_patches.size %2%")%m_paint_changed%m_triangle_patches.size();
|
||||
if (m_paint_changed || (m_triangle_patches.size() == 0)) {
|
||||
this->release_geometry();
|
||||
|
||||
|
@ -1288,6 +1341,8 @@ void TriangleSelectorPatch::update_render_data()
|
|||
m_paint_changed = false;
|
||||
}
|
||||
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", before paint_contour");
|
||||
|
||||
m_paint_contour.release_geometry();
|
||||
std::vector<Vec2i> contour_edges = this->get_seed_fill_contour();
|
||||
m_paint_contour.contour_vertices.reserve(contour_edges.size() * 6);
|
||||
|
@ -1306,9 +1361,10 @@ void TriangleSelectorPatch::update_render_data()
|
|||
m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size();
|
||||
|
||||
m_paint_contour.finalize_geometry();
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", exit");
|
||||
}
|
||||
|
||||
void TriangleSelectorPatch::render(int triangle_indices_idx)
|
||||
void TriangleSelectorPatch::render(int triangle_indices_idx, int position_id, int barycentric_id)
|
||||
{
|
||||
assert(triangle_indices_idx < this->m_triangle_indices_VBO_ids.size());
|
||||
assert(this->m_triangle_patches.size() == this->m_triangle_indices_VBO_ids.size());
|
||||
|
@ -1321,7 +1377,20 @@ void TriangleSelectorPatch::render(int triangle_indices_idx)
|
|||
//glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), (const void*)(0 * sizeof(float))));
|
||||
if (this->m_triangle_indices_sizes[triangle_indices_idx] > 0) {
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_vertices_VBO_ids[triangle_indices_idx]));
|
||||
glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), nullptr));
|
||||
if (position_id != -1) {
|
||||
glsafe(::glEnableVertexAttribArray((GLint)position_id));
|
||||
glsafe(::glVertexAttribPointer((GLint)position_id, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), nullptr));
|
||||
}
|
||||
else {
|
||||
glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), nullptr));
|
||||
}
|
||||
|
||||
if (barycentric_id != -1) {
|
||||
glsafe(::glEnableVertexAttribArray((GLint)barycentric_id));
|
||||
glsafe(::glVertexAttribPointer((GLint)barycentric_id, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (GLvoid*)(intptr_t)(3 * sizeof(float))));
|
||||
}
|
||||
//glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), nullptr));
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: triangle_indices_idx %2%, bind vertex vbo, buffer id %3%")%__LINE__%triangle_indices_idx%this->m_vertices_VBO_ids[triangle_indices_idx];
|
||||
}
|
||||
|
||||
glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
|
||||
|
@ -1331,9 +1400,14 @@ void TriangleSelectorPatch::render(int triangle_indices_idx)
|
|||
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_triangle_indices_VBO_ids[triangle_indices_idx]));
|
||||
glsafe(::glDrawElements(GL_TRIANGLES, GLsizei(this->m_triangle_indices_sizes[triangle_indices_idx]), GL_UNSIGNED_INT, nullptr));
|
||||
glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: triangle_indices_idx %2%, bind indices vbo, buffer id %3%")%__LINE__%triangle_indices_idx%this->m_triangle_indices_VBO_ids[triangle_indices_idx];
|
||||
}
|
||||
|
||||
glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
|
||||
if ((this->m_triangle_indices_sizes[triangle_indices_idx] > 0)&&(position_id != -1))
|
||||
glsafe(::glDisableVertexAttribArray(position_id));
|
||||
if ((this->m_triangle_indices_sizes[triangle_indices_idx] > 0)&&(barycentric_id != -1))
|
||||
glsafe(::glDisableVertexAttribArray((GLint)barycentric_id));
|
||||
|
||||
if (this->m_triangle_indices_sizes[triangle_indices_idx] > 0)
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
|
||||
|
@ -1354,6 +1428,8 @@ void TriangleSelectorPatch::release_geometry()
|
|||
triangle_indices_VBO_id = 0;
|
||||
}
|
||||
this->clear();
|
||||
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: released geometry")%__LINE__;
|
||||
}
|
||||
|
||||
void TriangleSelectorPatch::finalize_vertices()
|
||||
|
@ -1382,6 +1458,7 @@ void TriangleSelectorPatch::finalize_triangle_indices()
|
|||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vertices_VBO_ids[buffer_idx]));
|
||||
glsafe(::glBufferData(GL_ARRAY_BUFFER, patch_vertices.size() * sizeof(float), patch_vertices.data(), GL_STATIC_DRAW));
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: buffer_idx %2%, vertices size %3%, buffer id %4%")%__LINE__%buffer_idx%patch_vertices.size()%m_vertices_VBO_ids[buffer_idx];
|
||||
patch_vertices.clear();
|
||||
}
|
||||
|
||||
|
@ -1392,6 +1469,7 @@ void TriangleSelectorPatch::finalize_triangle_indices()
|
|||
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_triangle_indices_VBO_ids[buffer_idx]));
|
||||
glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangle_indices.size() * sizeof(int), triangle_indices.data(), GL_STATIC_DRAW));
|
||||
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
|
||||
//BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", Line %1%: buffer_idx %2%, vertices size %3%, buffer id %4%")%__LINE__%buffer_idx%triangle_indices.size()%m_triangle_indices_VBO_ids[buffer_idx];
|
||||
triangle_indices.clear();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue