Add Imgui popup for rotation gizmo under SLA
This commit is contained in:
parent
b4b9af4100
commit
9f3e7617d8
@ -1,9 +1,15 @@
|
|||||||
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
|
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
|
||||||
#include "GLGizmoRotate.hpp"
|
#include "GLGizmoRotate.hpp"
|
||||||
#include "slic3r/GUI/GLCanvas3D.hpp"
|
#include "slic3r/GUI/GLCanvas3D.hpp"
|
||||||
|
#include "slic3r/GUI/ImGuiWrapper.hpp"
|
||||||
|
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
#include "slic3r/GUI/GUI_App.hpp"
|
||||||
|
#include "slic3r/GUI/GUI.hpp"
|
||||||
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
|
|
||||||
|
#include "libslic3r/SLA/Rotfinder.hpp"
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
@ -194,6 +200,64 @@ void GLGizmoRotate::on_render_for_picking() const
|
|||||||
glsafe(::glPopMatrix());
|
glsafe(::glPopMatrix());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui,
|
||||||
|
State & state,
|
||||||
|
const Alignment &alignment)
|
||||||
|
: m_imgui{imgui}
|
||||||
|
{
|
||||||
|
imgui->begin(_L("Rotation"), ImGuiWindowFlags_NoMove |
|
||||||
|
ImGuiWindowFlags_AlwaysAutoResize |
|
||||||
|
ImGuiWindowFlags_NoCollapse);
|
||||||
|
|
||||||
|
// adjust window position to avoid overlap the view toolbar
|
||||||
|
float win_h = ImGui::GetWindowHeight();
|
||||||
|
float x = alignment.x, y = alignment.y;
|
||||||
|
y = std::min(y, alignment.bottom_limit - win_h);
|
||||||
|
ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always);
|
||||||
|
|
||||||
|
ImGui::SliderFloat(_L("Accuracy").c_str(), &state.accuracy, 0.01f, 1.f, "%.1f");
|
||||||
|
|
||||||
|
if (imgui->button(_L("Optimize orientation"))) {
|
||||||
|
std::cout << "Blip" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const std::vector<std::string> options = {
|
||||||
|
_L("Least supports").ToStdString(),
|
||||||
|
_L("Suface quality").ToStdString()
|
||||||
|
};
|
||||||
|
|
||||||
|
if (imgui->combo(_L("Choose method"), options, state.method) ) {
|
||||||
|
std::cout << "method: " << state.method << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
GLGizmoRotate3D::RotoptimzeWindow::~RotoptimzeWindow()
|
||||||
|
{
|
||||||
|
m_imgui->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit)
|
||||||
|
{
|
||||||
|
if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// m_rotoptimizewin_state.mobj = ;
|
||||||
|
RotoptimzeWindow popup{m_imgui, m_rotoptimizewin_state, {x, y, bottom_limit}};
|
||||||
|
|
||||||
|
// if ((last_h != win_h) || (last_y != y))
|
||||||
|
// {
|
||||||
|
// // ask canvas for another frame to render the window in the correct position
|
||||||
|
// m_parent.request_extra_frame();
|
||||||
|
// if (last_h != win_h)
|
||||||
|
// last_h = win_h;
|
||||||
|
// if (last_y != y)
|
||||||
|
// last_y = y;
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void GLGizmoRotate::render_circle() const
|
void GLGizmoRotate::render_circle() const
|
||||||
{
|
{
|
||||||
::glBegin(GL_LINE_LOOP);
|
::glBegin(GL_LINE_LOOP);
|
||||||
|
@ -52,12 +52,12 @@ public:
|
|||||||
std::string get_tooltip() const override;
|
std::string get_tooltip() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool on_init();
|
bool on_init() override;
|
||||||
virtual std::string on_get_name() const { return ""; }
|
std::string on_get_name() const override { return ""; }
|
||||||
virtual void on_start_dragging();
|
void on_start_dragging() override;
|
||||||
virtual void on_update(const UpdateData& data);
|
void on_update(const UpdateData& data) override;
|
||||||
virtual void on_render() const;
|
void on_render() const override;
|
||||||
virtual void on_render_for_picking() const;
|
void on_render_for_picking() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void render_circle() const;
|
void render_circle() const;
|
||||||
@ -94,46 +94,74 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool on_init();
|
bool on_init() override;
|
||||||
virtual std::string on_get_name() const;
|
std::string on_get_name() const override;
|
||||||
virtual void on_set_state()
|
void on_set_state() override
|
||||||
{
|
{
|
||||||
for (GLGizmoRotate& g : m_gizmos)
|
for (GLGizmoRotate& g : m_gizmos)
|
||||||
g.set_state(m_state);
|
g.set_state(m_state);
|
||||||
}
|
}
|
||||||
virtual void on_set_hover_id()
|
void on_set_hover_id() override
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 3; ++i)
|
for (int i = 0; i < 3; ++i)
|
||||||
m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1);
|
m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1);
|
||||||
}
|
}
|
||||||
virtual void on_enable_grabber(unsigned int id)
|
void on_enable_grabber(unsigned int id) override
|
||||||
{
|
{
|
||||||
if (id < 3)
|
if (id < 3)
|
||||||
m_gizmos[id].enable_grabber(0);
|
m_gizmos[id].enable_grabber(0);
|
||||||
}
|
}
|
||||||
virtual void on_disable_grabber(unsigned int id)
|
void on_disable_grabber(unsigned int id) override
|
||||||
{
|
{
|
||||||
if (id < 3)
|
if (id < 3)
|
||||||
m_gizmos[id].disable_grabber(0);
|
m_gizmos[id].disable_grabber(0);
|
||||||
}
|
}
|
||||||
virtual bool on_is_activable() const;
|
bool on_is_activable() const override;
|
||||||
virtual void on_start_dragging();
|
void on_start_dragging() override;
|
||||||
virtual void on_stop_dragging();
|
void on_stop_dragging() override;
|
||||||
virtual void on_update(const UpdateData& data)
|
void on_update(const UpdateData& data) override
|
||||||
{
|
{
|
||||||
for (GLGizmoRotate& g : m_gizmos)
|
for (GLGizmoRotate& g : m_gizmos)
|
||||||
{
|
{
|
||||||
g.update(data);
|
g.update(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual void on_render() const;
|
void on_render() const override;
|
||||||
virtual void on_render_for_picking() const
|
void on_render_for_picking() const override
|
||||||
{
|
{
|
||||||
for (const GLGizmoRotate& g : m_gizmos)
|
for (const GLGizmoRotate& g : m_gizmos)
|
||||||
{
|
{
|
||||||
g.render_for_picking();
|
g.render_for_picking();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void on_render_input_window(float x, float y, float bottom_limit) override;
|
||||||
|
private:
|
||||||
|
|
||||||
|
class RotoptimzeWindow {
|
||||||
|
ImGuiWrapper *m_imgui = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct State {
|
||||||
|
enum Metods { mMinSupportPoints, mLegacy };
|
||||||
|
|
||||||
|
float accuracy = 1.f;
|
||||||
|
int method = mMinSupportPoints;
|
||||||
|
ModelObject *mobj = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Alignment { float x, y, bottom_limit; };
|
||||||
|
|
||||||
|
RotoptimzeWindow(ImGuiWrapper *imgui, State &settings, const Alignment &bottom_limit);
|
||||||
|
~RotoptimzeWindow();
|
||||||
|
|
||||||
|
RotoptimzeWindow(const RotoptimzeWindow&) = delete;
|
||||||
|
RotoptimzeWindow(RotoptimzeWindow &&) = delete;
|
||||||
|
RotoptimzeWindow& operator=(const RotoptimzeWindow &) = delete;
|
||||||
|
RotoptimzeWindow& operator=(RotoptimzeWindow &&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
RotoptimzeWindow::State m_rotoptimizewin_state = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace GUI
|
} // namespace GUI
|
||||||
|
@ -425,10 +425,10 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector<std::string>&
|
|||||||
text(label);
|
text(label);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
int selection_out = -1;
|
int selection_out = selection;
|
||||||
bool res = false;
|
bool res = false;
|
||||||
|
|
||||||
const char *selection_str = selection < (int)options.size() ? options[selection].c_str() : "";
|
const char *selection_str = selection < int(options.size()) && selection >= 0 ? options[selection].c_str() : "";
|
||||||
if (ImGui::BeginCombo("", selection_str)) {
|
if (ImGui::BeginCombo("", selection_str)) {
|
||||||
for (int i = 0; i < (int)options.size(); i++) {
|
for (int i = 0; i < (int)options.size(); i++) {
|
||||||
if (ImGui::Selectable(options[i].c_str(), i == selection)) {
|
if (ImGui::Selectable(options[i].c_str(), i == selection)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user