NEW: add meshboolean gizmo

Change-Id: I89a343a2ed3b43f97b87d99a0836abf4b291a4f8
This commit is contained in:
liz.li 2023-06-06 10:47:39 +08:00 committed by Lane.Wei
parent e80ecc045e
commit a66c2d6d13
10 changed files with 557 additions and 2 deletions

View file

@ -0,0 +1,81 @@
#ifndef slic3r_GLGizmoMeshBoolean_hpp_
#define slic3r_GLGizmoMeshBoolean_hpp_
#include "GLGizmoBase.hpp"
#include "GLGizmosCommon.hpp"
#include "libslic3r/Model.hpp"
namespace Slic3r {
namespace GUI {
enum class MeshBooleanSelectingState {
Undef,
SelectSource,
SelectTool,
};
enum class MeshBooleanOperation{
Undef,
Union,
Difference,
Intersection,
};
struct VolumeInfo {
ModelVolume* mv{ nullptr };
int volume_idx{-1};
Transform3d trafo;
void reset() {
mv = nullptr;
volume_idx = -1;
trafo = Transform3d::Identity();
};
};
class GLGizmoMeshBoolean : public GLGizmoBase
{
public:
GLGizmoMeshBoolean(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
~GLGizmoMeshBoolean();
void set_enable(bool enable) { m_enable = enable; }
bool get_enable() { return m_enable; }
MeshBooleanSelectingState get_selecting_state() { return m_selecting_state; }
void set_src_volume(ModelVolume* mv) {
m_src.mv = mv;
if (m_src.mv == m_tool.mv)
m_tool.mv = nullptr;
}
void set_tool_volume(ModelVolume* mv) {
m_tool.mv = mv;
if (m_tool.mv == m_src.mv)
m_src.mv = nullptr;
}
bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
protected:
virtual bool on_init() override;
virtual std::string on_get_name() const override;
virtual bool on_is_activable() const override;
virtual void on_render() override;
virtual void on_render_for_picking() override {}
virtual void on_set_state() override;
virtual CommonGizmosDataID on_get_requirements() const override;
virtual void on_render_input_window(float x, float y, float bottom_limit);
private:
bool m_enable{ false };
MeshBooleanOperation m_operation_mode;
MeshBooleanSelectingState m_selecting_state;
bool m_diff_delete_input = false;
bool m_inter_delete_input = false;
VolumeInfo m_src;
VolumeInfo m_tool;
void generate_new_volume(bool delete_input, const TriangleMesh& mesh_result);
};
} // namespace GUI
} // namespace Slic3r
#endif // slic3r_GLGizmoMeshBoolean_hpp_