diff --git a/src/libslic3r/Frustum.hpp b/src/libslic3r/Frustum.hpp index 444c9f858..c31ba92a0 100644 --- a/src/libslic3r/Frustum.hpp +++ b/src/libslic3r/Frustum.hpp @@ -23,7 +23,7 @@ public: float distance(const Vec3f &pt) const { return normal_.dot(pt) + d_; } inline const Vec3f &getNormal() const { return normal_; } - + const Vec3f & getCenter() const { return center_; } Plane::PlaneIntersects intersects(const BoundingBoxf3 &box) const; //// check intersect with point (world space) Plane::PlaneIntersects intersects(const Vec3f &p0) const; diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 8c86e4096..f3eba0dbe 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -10,7 +10,7 @@ #include "GLShader.hpp" #include "GUI_App.hpp" #include "GUI_Colors.hpp" -//#include "Camera.hpp" + #include "Plater.hpp" #include "BitmapCache.hpp" diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 75ebc4928..ae19304a5 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -109,11 +109,43 @@ void Camera::select_view(const std::string& direction) //how to use //BoundingBox bbox = mesh.aabb.transform(transform); //return camera_->getFrustum().intersects(bbox); +void Camera::debug_frustum() +{ + ImGuiWrapper &imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Camera debug_frusm"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + Vec3f frustum_min = m_frustum.bbox.min.cast(); + Vec3f frustum_max = m_frustum.bbox.max.cast(); + Vec3f _0_normal = m_frustum.planes[0].getNormal().cast(); + Vec3f _0_corner = m_frustum.corners[0].cast(); + Vec3f _1_corner = m_frustum.corners[1].cast(); + + ImGui::InputFloat3("m_last_eye", m_last_eye.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + ImGui::InputFloat3("m_last_center", m_last_center.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + ImGui::InputFloat3("m_last_up", m_last_up.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + ImGui::InputFloat3("frustum_min", frustum_min.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + ImGui::InputFloat3("frustum_max", frustum_max.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + for (size_t i = 0; i < 8; i++) { + std::string name = "corner" + std::to_string(i); + ImGui::InputFloat3(name.c_str(), m_frustum.corners[i].data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + } + for (size_t i = 0; i < 6; i++) { + std::string name = "plane_normal" + std::to_string(i); + Vec3f normal = m_frustum.planes[i].getNormal(); + ImGui::InputFloat3(name.c_str(), normal.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + + name = "plane_center" + std::to_string(i); + Vec3f center = m_frustum.planes[i].getCenter(); + ImGui::InputFloat3(name.c_str(), center.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); + } + imgui.end(); +} + void Camera::update_frustum() { - auto eye_ = get_position().cast(); - auto center_ = get_target().cast(); - auto up_ = get_dir_up().cast(); + Vec3f eye_ = get_position().cast(); + Vec3f center_ = get_target().cast(); + Vec3f up_ = get_dir_up().cast(); float near_ = m_frustrum_zs.first; float far_ = m_frustrum_zs.second; float aspect_ = m_viewport[2] / (double)m_viewport[3]; diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 9f16ce126..b2f1116f4 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -121,7 +121,7 @@ public: void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor); void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor); - + void debug_frustum(); #if ENABLE_CAMERA_STATISTICS void debug_render(); #endif // ENABLE_CAMERA_STATISTICS