From 6c36577e8e48e27a372f9a53cd2ba2a07e3a49a3 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 9 Mar 2020 15:23:29 +0100 Subject: [PATCH] #3782 - World Z axis always vertical for non-free camera --- src/slic3r/GUI/Camera.cpp | 3 ++- src/slic3r/GUI/Camera.hpp | 3 ++- src/slic3r/GUI/GLCanvas3D.cpp | 1 - src/slic3r/GUI/Plater.cpp | 8 ++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 0a0b02c6f..74c21d3e8 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -260,7 +260,7 @@ void Camera::debug_render() const imgui.begin(std::string("Camera statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); std::string type = get_type_as_string(); - if (wxGetApp().plater()->get_mouse3d_controller().is_running() || (wxGetApp().app_config->get("use_free_camera") == "1")) + if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1")) type += "/free"; else type += "/constrained"; @@ -537,6 +537,7 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up Vec3d unit_y = unit_z.cross(unit_x).normalized(); m_target = target; + m_distance = (position - target).norm(); Vec3d new_position = m_target + m_distance * unit_z; m_view_matrix(0, 0) = unit_x(0); diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index f592dbcd2..4b9144519 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -122,6 +122,8 @@ public: // returns true if the camera z axis (forward) is pointing in the negative direction of the world z axis bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } + void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); + double max_zoom() const { return 100.0; } double min_zoom() const; @@ -137,7 +139,6 @@ private: #endif // ENABLE_THUMBNAIL_GENERATOR void set_distance(double distance) const; - void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); void set_default_orientation(); Vec3d validate_target(const Vec3d& target) const; void update_zenit(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 540f82b4c..fc8a800d1 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3932,7 +3932,6 @@ void GLCanvas3D::handle_layers_data_focus_event(const t_layer_height_range range void GLCanvas3D::update_ui_from_settings() { - m_camera.set_type(wxGetApp().app_config->get("use_perspective_camera")); m_dirty = true; #if ENABLE_RETINA_GL diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 48eb86743..c20764067 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2245,6 +2245,14 @@ void Plater::priv::update_ui_from_settings() // $self->{buttons_sizer}->Layout; // } + camera.set_type(wxGetApp().app_config->get("use_perspective_camera")); + if (wxGetApp().app_config->get("use_free_camera") != "1") + { + // forces camera right vector to be parallel to XY plane + if (std::abs(camera.get_dir_right()(2)) > EPSILON) + camera.look_at(camera.get_position(), camera.get_target(), Vec3d::UnitZ()); + } + view3D->get_canvas3d()->update_ui_from_settings(); preview->get_canvas3d()->update_ui_from_settings(); }