From cf245a79959f6d99163a89b8dc5e36cf15e2983b Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 16 Feb 2022 12:36:41 +0100 Subject: [PATCH] Tech ENABLE_WORLD_COORDINATE_SHOW_AXES - Show axes of the current reference system when sidebar hints are active for non-world reference systems --- src/libslic3r/Technologies.hpp | 2 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/3DBed.cpp | 10 +++++ src/slic3r/GUI/3DBed.hpp | 10 +++++ src/slic3r/GUI/CoordAxes.cpp | 79 ++++++++++++++++++++++++++++++++++ src/slic3r/GUI/CoordAxes.hpp | 59 +++++++++++++++++++++++++ src/slic3r/GUI/Selection.cpp | 66 +++++++++++++++++++++++++++- src/slic3r/GUI/Selection.hpp | 13 +++++- 8 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 src/slic3r/GUI/CoordAxes.cpp create mode 100644 src/slic3r/GUI/CoordAxes.hpp diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index dd91fa3c36..bb55befab3 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -84,6 +84,8 @@ #define ENABLE_WORLD_COORDINATE_VOLUMES_LOCAL_OFFSET (0 && ENABLE_WORLD_COORDINATE) // Enable rendering the selection bounding box in the current reference system #define ENABLE_COORDINATE_DEPENDENT_SELECTION_BOX (1 && ENABLE_WORLD_COORDINATE) +// Enable showing the axes of the current reference system when sidebar hints are active +#define ENABLE_WORLD_COORDINATE_SHOW_AXES (1 && ENABLE_WORLD_COORDINATE) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index aa11066292..2bf5a17a78 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -131,6 +131,8 @@ set(SLIC3R_GUI_SOURCES GUI/2DBed.hpp GUI/3DBed.cpp GUI/3DBed.hpp + GUI/CoordAxes.cpp + GUI/CoordAxes.hpp GUI/Camera.cpp GUI/Camera.hpp GUI/wxExtensions.cpp diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 244a802dbc..97a8e6a870 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -98,6 +98,7 @@ const float* GeometryBuffer::get_vertices_data() const } #endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES const float Bed3D::Axes::DefaultStemRadius = 0.5f; const float Bed3D::Axes::DefaultStemLength = 25.0f; const float Bed3D::Axes::DefaultTipRadius = 2.5f * Bed3D::Axes::DefaultStemRadius; @@ -152,6 +153,7 @@ void Bed3D::Axes::render() glsafe(::glDisable(GL_DEPTH_TEST)); } +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom) { @@ -288,7 +290,11 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const out.max.z() = 0.0; // extend to contain axes out.merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones()); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + out.merge(out.min + Vec3d(-m_axes.get_tip_radius(), -m_axes.get_tip_radius(), out.max.z())); +#else out.merge(out.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, out.max.z())); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES // extend to contain model, if any BoundingBoxf3 model_bb = m_model.get_bounding_box(); if (model_bb.defined) { @@ -458,7 +464,11 @@ std::tuple Bed3D::detect_type(const Point void Bed3D::render_axes() { if (m_build_volume.valid()) +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + m_axes.render(0.25f); +#else m_axes.render(); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES } void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 350ae48f6a..65c8856a87 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -3,7 +3,11 @@ #include "GLTexture.hpp" #include "3DScene.hpp" +#if ENABLE_WORLD_COORDINATE_SHOW_AXES +#include "CoordAxes.hpp" +#else #include "GLModel.hpp" +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES #include "libslic3r/BuildVolume.hpp" #if ENABLE_GLBEGIN_GLEND_REMOVAL @@ -44,6 +48,7 @@ public: class Bed3D { +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES class Axes { public: @@ -67,6 +72,7 @@ class Bed3D float get_total_length() const { return m_stem_length + DefaultTipLength; } void render(); }; +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES public: enum class Type : unsigned char @@ -105,7 +111,11 @@ private: #if !ENABLE_GLBEGIN_GLEND_REMOVAL unsigned int m_vbo_id{ 0 }; #endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + CoordAxes m_axes; +#else Axes m_axes; +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES float m_scale_factor{ 1.0f }; diff --git a/src/slic3r/GUI/CoordAxes.cpp b/src/slic3r/GUI/CoordAxes.cpp new file mode 100644 index 0000000000..4999d968a5 --- /dev/null +++ b/src/slic3r/GUI/CoordAxes.cpp @@ -0,0 +1,79 @@ +#include "libslic3r/libslic3r.h" + +#include "CoordAxes.hpp" +#include "GUI_App.hpp" +#include "3DScene.hpp" + +#include + +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + +namespace Slic3r { +namespace GUI { + +const float CoordAxes::DefaultStemRadius = 0.5f; +const float CoordAxes::DefaultStemLength = 25.0f; +const float CoordAxes::DefaultTipRadius = 2.5f * CoordAxes::DefaultStemRadius; +const float CoordAxes::DefaultTipLength = 5.0f; + +void CoordAxes::render(float emission_factor) +{ + auto render_axis = [this](const Transform3f& transform) { + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixf(transform.data())); + m_arrow.render(); + glsafe(::glPopMatrix()); + }; + + if (!m_arrow.is_initialized()) + m_arrow.init_from(stilized_arrow(16, m_tip_radius, m_tip_length, m_stem_radius, m_stem_length)); + + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + bool shader_differs = (curr_shader == nullptr || curr_shader->get_name() != "gouraud_light"); + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + + if (shader_differs) { + if (curr_shader != nullptr) + curr_shader->stop_using(); + shader->start_using(); + } + shader->set_uniform("emission_factor", emission_factor); + + // x axis +#if ENABLE_GLBEGIN_GLEND_REMOVAL + m_arrow.set_color(ColorRGBA::X()); +#else + m_arrow.set_color(-1, ColorRGBA::X()); +#endif // ENABLE_GLBEGIN_GLEND_REMOVAL + render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); + + // y axis +#if ENABLE_GLBEGIN_GLEND_REMOVAL + m_arrow.set_color(ColorRGBA::Y()); +#else + m_arrow.set_color(-1, ColorRGBA::Y()); +#endif // ENABLE_GLBEGIN_GLEND_REMOVAL + render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); + + // z axis +#if ENABLE_GLBEGIN_GLEND_REMOVAL + m_arrow.set_color(ColorRGBA::Z()); +#else + m_arrow.set_color(-1, ColorRGBA::Z()); +#endif // ENABLE_GLBEGIN_GLEND_REMOVAL + render_axis(Geometry::assemble_transform(m_origin).cast()); + + if (shader_differs) { + shader->stop_using(); + if (curr_shader != nullptr) + curr_shader->start_using(); + } +} + +} // GUI +} // Slic3r + +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES diff --git a/src/slic3r/GUI/CoordAxes.hpp b/src/slic3r/GUI/CoordAxes.hpp new file mode 100644 index 0000000000..de5472b13e --- /dev/null +++ b/src/slic3r/GUI/CoordAxes.hpp @@ -0,0 +1,59 @@ +#ifndef slic3r_CoordAxes_hpp_ +#define slic3r_CoordAxes_hpp_ + +#if ENABLE_WORLD_COORDINATE_SHOW_AXES +#include "GLModel.hpp" + +namespace Slic3r { +namespace GUI { + +class CoordAxes +{ +public: + static const float DefaultStemRadius; + static const float DefaultStemLength; + static const float DefaultTipRadius; + static const float DefaultTipLength; + +private: + Vec3d m_origin{ Vec3d::Zero() }; + float m_stem_radius{ DefaultStemRadius }; + float m_stem_length{ DefaultStemLength }; + float m_tip_radius{ DefaultTipRadius }; + float m_tip_length{ DefaultTipLength }; + GLModel m_arrow; + +public: + const Vec3d& get_origin() const { return m_origin; } + void set_origin(const Vec3d& origin) { m_origin = origin; } + void set_stem_radius(float radius) { + m_stem_radius = radius; + m_arrow.reset(); + } + void set_stem_length(float length) { + m_stem_length = length; + m_arrow.reset(); + } + void set_tip_radius(float radius) { + m_tip_radius = radius; + m_arrow.reset(); + } + void set_tip_length(float length) { + m_tip_length = length; + m_arrow.reset(); + } + + float get_stem_radius() const { return m_stem_radius; } + float get_stem_length() const { return m_stem_length; } + float get_tip_radius() const { return m_tip_radius; } + float get_tip_length() const { return m_tip_length; } + float get_total_length() const { return m_stem_length + m_tip_length; } + void render(float emission_factor = 0.0f); +}; + +} // GUI +} // Slic3r + +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES + +#endif // slic3r_CoordAxes_hpp_ diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index fd7b163b88..0ba20a38bd 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -118,6 +118,12 @@ Selection::Selection() , m_dragging(false) { this->set_bounding_boxes_dirty(); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + m_axes.set_stem_radius(0.15f); + m_axes.set_stem_length(3.0f); + m_axes.set_tip_radius(0.45f); + m_axes.set_tip_length(1.5f); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES } @@ -1503,21 +1509,36 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glEnable(GL_DEPTH_TEST)); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + const Vec3d center = get_bounding_box().center(); + Vec3d axes_center = center; + Transform3d orient_matrix = Transform3d::Identity(); +#else glsafe(::glPushMatrix()); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES if (!boost::starts_with(sidebar_field, "layer")) { +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES const Vec3d center = get_bounding_box().center(); - +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES #if ENABLE_WORLD_COORDINATE if (is_single_full_instance() && !wxGetApp().obj_manipul()->is_world_coordinates()) { #else if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) { #endif // ENABLE_WORLD_COORDINATE +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES glsafe(::glTranslated(center.x(), center.y(), center.z())); +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES #if ENABLE_WORLD_COORDINATE +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES Transform3d orient_matrix = Transform3d::Identity(); +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + axes_center = (*m_volumes)[*m_list.begin()]->get_instance_offset(); +#else glsafe(::glMultMatrixd(orient_matrix.data())); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES #else if (!boost::starts_with(sidebar_field, "position")) { Transform3d orient_matrix = Transform3d::Identity(); @@ -1544,17 +1565,30 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) #else else if (is_single_volume() || is_single_modifier()) { #endif // ENABLE_WORLD_COORDINATE +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES glsafe(::glTranslated(center.x(), center.y(), center.z())); +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES #if ENABLE_WORLD_COORDINATE if (!wxGetApp().obj_manipul()->is_world_coordinates()) { +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES Transform3d orient_matrix = Transform3d::Identity(); +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES if (wxGetApp().obj_manipul()->is_local_coordinates()) { const GLVolume* v = (*m_volumes)[*m_list.begin()]; orient_matrix = v->get_instance_transformation().get_matrix(true, false, true, true) * v->get_volume_transformation().get_matrix(true, false, true, true); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + axes_center = (*m_volumes)[*m_list.begin()]->world_matrix().translation(); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES } - else + else { orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + axes_center = (*m_volumes)[*m_list.begin()]->get_instance_offset(); + } +#else + } glsafe(::glMultMatrixd(orient_matrix.data())); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES } #else Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); @@ -1564,11 +1598,16 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) #endif // ENABLE_WORLD_COORDINATE } else { +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + if (requires_local_axes()) + orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); +#else glsafe(::glTranslated(center.x(), center.y(), center.z())); if (requires_local_axes()) { const Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); glsafe(::glMultMatrixd(orient_matrix.data())); } +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES } } @@ -1577,6 +1616,15 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + if (!boost::starts_with(sidebar_field, "layer")) { + shader->set_uniform("emission_factor", 0.1f); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glMultMatrixd(orient_matrix.data())); + } +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES + if (boost::starts_with(sidebar_field, "position")) render_sidebar_position_hints(sidebar_field); else if (boost::starts_with(sidebar_field, "rotation")) @@ -1586,7 +1634,19 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) else if (boost::starts_with(sidebar_field, "layer")) render_sidebar_layers_hints(sidebar_field); +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + if (!boost::starts_with(sidebar_field, "layer")) { + glsafe(::glPopMatrix()); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(axes_center.x(), axes_center.y(), axes_center.z())); + glsafe(::glMultMatrixd(orient_matrix.data())); + if (!wxGetApp().obj_manipul()->is_world_coordinates()) + m_axes.render(0.25f); + glsafe(::glPopMatrix()); + } +#else glsafe(::glPopMatrix()); +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES #if !ENABLE_GLBEGIN_GLEND_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) @@ -2324,9 +2384,11 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) #else m_arrow.set_color(-1, uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_WORLD_COORDINATE_SHOW_AXES GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader != nullptr) shader->set_uniform("emission_factor", 0.0f); +#endif // !ENABLE_WORLD_COORDINATE_SHOW_AXES glsafe(::glTranslated(0.0, 5.0, 0.0)); m_arrow.render(); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 4fc0e6b2e4..a967225fe6 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -3,9 +3,15 @@ #include "libslic3r/Geometry.hpp" #if ENABLE_WORLD_COORDINATE -#include "slic3r/GUI/GUI_Geometry.hpp" -#endif // ENABLE_WORLD_COORDINATE +#include "GUI_Geometry.hpp" +#if ENABLE_WORLD_COORDINATE_SHOW_AXES +#include "CoordAxes.hpp" +#else #include "GLModel.hpp" +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES +#else +#include "GLModel.hpp" +#endif // ENABLE_WORLD_COORDINATE #include #include @@ -221,6 +227,9 @@ private: GLModel m_vbo_sphere; #endif // ENABLE_RENDER_SELECTION_CENTER +#if ENABLE_WORLD_COORDINATE_SHOW_AXES + CoordAxes m_axes; +#endif // ENABLE_WORLD_COORDINATE_SHOW_AXES GLModel m_arrow; GLModel m_curved_arrow; #if ENABLE_GLBEGIN_GLEND_REMOVAL