diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 54b32e0f9..f2cee748e 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -87,6 +87,12 @@ void Camera::select_view(const std::string& direction) { if (direction == "iso") set_iso_orientation(); + else if (direction == "iso_1") + set_iso_orientation(ViewAngleType::Iso_1); + else if (direction == "iso_2") + set_iso_orientation(ViewAngleType::Iso_2); + else if (direction == "iso_3") + set_iso_orientation(ViewAngleType::Iso_3); else if (direction == "left") look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); else if (direction == "right") @@ -99,11 +105,8 @@ void Camera::select_view(const std::string& direction) look_at(m_target - m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); else if (direction == "rear") look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); - else if (direction == "topfront") + else if (direction == "topfront" || "plate") look_at(m_target - 0.707 * m_distance * Vec3d::UnitY() + 0.707 * m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY() + Vec3d::UnitZ()); - else if (direction == "plate") { - look_at(m_target - 0.707 * m_distance * Vec3d::UnitY() + 0.707 * m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY() + Vec3d::UnitZ()); - } } void Camera::select_view(ViewAngleType type) { @@ -112,6 +115,18 @@ void Camera::select_view(ViewAngleType type) select_view("iso"); break; } + case Slic3r::GUI::Camera::ViewAngleType::Iso_1: { + select_view("iso_1"); + break; + } + case Slic3r::GUI::Camera::ViewAngleType::Iso_2: { + select_view("iso_2"); + break; + } + case Slic3r::GUI::Camera::ViewAngleType::Iso_3: { + select_view("iso_3"); + break; + } case Slic3r::GUI::Camera::ViewAngleType::Top_Front: { select_view("topfront"); break; @@ -746,28 +761,30 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up void Camera::set_default_orientation() { // BBS modify default orientation - look_at(m_target - 0.707 * m_distance * Vec3d::UnitY() + 0.707 * m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY() + Vec3d::UnitZ()); - - /*m_zenit = 45.0f; - const double theta_rad = Geometry::deg2rad(-(double)m_zenit); - const double phi_rad = Geometry::deg2rad(45.0); - const double sin_theta = ::sin(theta_rad); - const Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); - m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, Vec3d::UnitZ()); - m_view_rotation.normalize(); - m_view_matrix.fromPositionOrientationScale(m_view_rotation * (-camera_pos), m_view_rotation, Vec3d::Ones());*/ + select_view("topfront"); } -void Camera::set_iso_orientation() +void Camera::set_iso_orientation(ViewAngleType va_type) { - m_zenit = 45.0f; - const double theta_rad = Geometry::deg2rad(-(double)m_zenit); - const double phi_rad = Geometry::deg2rad(45.0); - const double sin_theta = ::sin(theta_rad); - const Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); - m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, Vec3d::UnitZ()); + if (!(va_type == ViewAngleType::Iso || va_type == ViewAngleType::Iso_1 || va_type == ViewAngleType::Iso_2 ||va_type == ViewAngleType::Iso_3)) { + return; + } + Vec3d dir = Vec3d(-0.5f, -0.5f, std::sqrt(2) / 2.f); + m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(45.0), Vec3d::UnitZ()); + if (va_type == ViewAngleType::Iso_1) { + dir = Vec3d(-0.5f, 0.5f, std::sqrt(2) / 2.f); + m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(135.0), Vec3d::UnitZ()); + } else if (va_type == ViewAngleType::Iso_2) { + dir = Vec3d(0.5f, 0.5f, std::sqrt(2) / 2.f); + m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(225.0), Vec3d::UnitZ()); + } else if (va_type == ViewAngleType::Iso_3) { + dir = Vec3d(0.5f, -0.5f, std::sqrt(2) / 2.f); + m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(315.0), Vec3d::UnitZ()); + } m_view_rotation.normalize(); + const Vec3d camera_pos = m_target + m_distance * dir; m_view_matrix.fromPositionOrientationScale(m_view_rotation * (-camera_pos), m_view_rotation, Vec3d::Ones()); + update_zenit(); } @@ -788,7 +805,8 @@ Vec3d Camera::validate_target(const Vec3d& target) const void Camera::update_zenit() { - m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0))); } + m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0))); +} void Camera::update_target() { Vec3d temptarget = get_position() + m_distance * get_dir_forward(); diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 119b7e37f..2322d5bfe 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -43,6 +43,9 @@ struct Camera Rear, Count_ViewAngleType, Top_Plate,//for 3mf and Skip parts + Iso_1,//clockwise rotate 90 degrees on the basis of Iso + Iso_2,//clockwise rotate 180 degrees on the basis of Iso + Iso_3,//clockwise rotate 270 degrees on the basis of Iso }; bool requires_zoom_to_bed{ false }; //BBS @@ -178,7 +181,7 @@ private: void set_distance(double distance); void set_default_orientation(); - void set_iso_orientation(); + void set_iso_orientation(ViewAngleType va_type = ViewAngleType::Iso); Vec3d validate_target(const Vec3d& target) const; void update_zenit(); void update_target(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 47ba5a966..537d0b417 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3659,7 +3659,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case '4': { select_view("rear"); break; } case '5': { select_view("left"); break; } case '6': { select_view("right"); break; } - case '7': { select_plate(); break; } + case '7': { select_view("iso");break; } #ifdef __APPLE__ case 'k': case 'K': @@ -4052,7 +4052,11 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } case '7': case WXK_NUMPAD7: //7 on numpad - { select_plate(); break; } + { + select_view("iso"); + m_gizmos.update_paint_base_camera_rotate_rad(); + break; + } default: break; } } diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 2535f449a..4476dba3d 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -247,8 +247,9 @@ void KBShortcutsDialog::fill_shortcuts() {ctrl + "2", L("Camera view - Bottom")}, {ctrl + "3", L("Camera view - Front")}, {ctrl + "4", L("Camera view - Behind")}, - {ctrl + "5", L("Camera Angle - Left side")}, - {ctrl + "6", L("Camera Angle - Right side")}, + {ctrl + "5", L("Camera view - Left")}, + {ctrl + "6", L("Camera view - Right")}, + {ctrl + "7", L("Camera view - Isometric")}, {ctrl + "A", L("Select all objects")}, {ctrl + L("Shift+D"), L("Delete all")}, diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 030494eda..784e2073b 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2426,6 +2426,16 @@ static void add_common_view_menu_items(wxMenu* view_menu, MainFrame* mainFrame, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Right", "Camera"), "Camera") + "\t" + ctrl + "6", _L("Right View"),[mainFrame](wxCommandEvent &) { mainFrame->select_view("right"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); + append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric", "Camera"), "Camera") + "\t" + ctrl + "7", _L("Isometric View"), [mainFrame](wxCommandEvent &) { mainFrame->select_view("iso"); }, "", + nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); +#if !BBL_RELEASE_TO_PUBLIC + append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric 1", "Camera"), "Camera"), _L("Isometric 1 View"), + [mainFrame](wxCommandEvent &) { mainFrame->select_view("iso_1"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); + append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric 2", "Camera"), "Camera"), _L("Isometric 2 View"), + [mainFrame](wxCommandEvent &) { mainFrame->select_view("iso_2"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); + append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric 3", "Camera"), "Camera"), _L("Isometric 3 View"), + [mainFrame](wxCommandEvent &) { mainFrame->select_view("iso_3"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame); +#endif } void MainFrame::init_menubar_as_editor()