BambuStudio/slic3r/GUI/Gizmos/GLGizmoFaceDetector.cpp

135 lines
3.8 KiB
C++
Raw Normal View History

2024-12-20 06:44:50 +00:00
#include "GLGizmoFaceDetector.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/SLA/IndexedMesh.hpp"
#include "libslic3r/FaceDetector.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/GUI/ImGuiWrapper.hpp"
#include "slic3r/GUI/Plater.hpp"
#include <GL/glew.h>
#ifdef __WINDOWS__
#include <windows.h>
#include <stdio.h>
#endif
namespace Slic3r {
namespace GUI {
bool GLGizmoFaceDetector::on_init()
{
return true;
}
std::string GLGizmoFaceDetector::on_get_name() const
{
return (_L("Face recognition") + " [P]").ToUTF8().data();
}
void GLGizmoFaceDetector::on_render()
{
if (m_iva.has_VBOs()) {
::glColor4f(0.f, 0.f, 1.f, 0.4f);
m_iva.render();
}
}
void GLGizmoFaceDetector::on_render_input_window(float x, float y, float bottom_limit)
{
#if 0
if (!m_c->selection_info() || !m_c->selection_info()->model_object())
return;
const float approx_height = m_imgui->scaled(14.0f);
y = std::min(y, bottom_limit - approx_height);
//BBS: GUI refactor: move gizmo to the right
#if BBS_TOOLBAR_ON_TOP
m_imgui->set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.0f);
#else
m_imgui->set_next_window_pos(x, y, ImGuiCond_Always, 1.0f, 0.0f);
#endif
ImGuiWrapper::push_toolbar_style();
m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
ImGui::PushItemWidth(m_imgui->get_style_scaling() * 150);
ImGui::InputDouble("Sample interval", &m_sample_interval, 0.0f, 0.0f, "%.2f");
bool btn_clicked = m_imgui->button(_L("Perform Recognition"));
if (btn_clicked) {
perform_recognition(m_parent.get_selection());
}
m_imgui->end();
ImGuiWrapper::pop_toolbar_style();
#endif
}
void GLGizmoFaceDetector::on_set_state()
{
if (get_state() == On) {
m_iva.release_geometry();
display_exterior_face();
}
}
bool GLGizmoFaceDetector::on_is_activable() const
{
const Selection& selection = m_parent.get_selection();
return selection.is_single_full_instance() && !selection.is_wipe_tower();
}
void GLGizmoFaceDetector::perform_recognition(const Selection& selection)
{
ModelObject* mo = m_c->selection_info()->model_object();
//FaceDetector face_detector(mo, m_sample_interval);
//face_detector.detect_exterior_face();
}
void GLGizmoFaceDetector::display_exterior_face()
{
int cnt = 0;
m_iva.release_geometry();
const ModelObjectPtrs& objects = wxGetApp().model().objects;
for (ModelObject* mo : objects) {
const ModelInstance* mi = mo->instances[0];
Transform3d inst_transfo = mi->get_matrix();
for (ModelVolume* mv : mo->volumes) {
TriangleMesh mesh_temp = mv->mesh();
mesh_temp.transform(mv->get_matrix() * inst_transfo);
indexed_triangle_set& mv_its = mesh_temp.its;
for (int facet_idx = 0; facet_idx < mv_its.indices.size(); facet_idx++) {
const stl_triangle_vertex_indices& facet_vert_idxs = mv_its.indices[facet_idx];
if (mv_its.get_property(facet_idx).type != eExteriorAppearance)
continue;
for (int i = 0; i < 3; ++i) {
m_iva.push_geometry(double(mv_its.vertices[facet_vert_idxs[i]](0)),
double(mv_its.vertices[facet_vert_idxs[i]](1)),
double(mv_its.vertices[facet_vert_idxs[i]](2)),
0., 0., 1.);
}
m_iva.push_triangle(cnt, cnt + 1, cnt + 2);
cnt += 3;
}
}
}
m_iva.finalize_geometry(true);
}
CommonGizmosDataID GLGizmoFaceDetector::on_get_requirements() const
{
return CommonGizmosDataID::SelectionInfo;
}
} // namespace GUI
} // namespace Slic3r