FIX:Maintain good perspective effect

Non user versions can view debugging information through shortcut keys
jira: none

Change-Id: I251a6189e8909f4c52752827e359a7287bd15f7f
This commit is contained in:
zhou.xu 2024-10-16 19:17:15 +08:00 committed by Lane.Wei
parent 70a7e837d4
commit 5925b220d5
4 changed files with 28 additions and 12 deletions

View File

@ -11,7 +11,7 @@
// Renders a small sphere in the center of the bounding box of the current selection when no gizmo is active // Renders a small sphere in the center of the bounding box of the current selection when no gizmo is active
#define ENABLE_RENDER_SELECTION_CENTER 0 #define ENABLE_RENDER_SELECTION_CENTER 0
// Shows an imgui dialog with camera related data // Shows an imgui dialog with camera related data
#define ENABLE_CAMERA_STATISTICS 0 //#define ENABLE_CAMERA_STATISTICS 0// by ctrl +shift +space quick key
// Render the picking pass instead of the main scene (use [T] key to toggle between regular rendering and picking pass only rendering) // Render the picking pass instead of the main scene (use [T] key to toggle between regular rendering and picking pass only rendering)
#define ENABLE_RENDER_PICKING_PASS 0 #define ENABLE_RENDER_PICKING_PASS 0
// Enable extracting thumbnails from selected gcode and save them as png files // Enable extracting thumbnails from selected gcode and save them as png files
@ -22,7 +22,7 @@
#define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING 0 #define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING 0
// Enable G-Code viewer statistics imgui dialog // Enable G-Code viewer statistics imgui dialog
#define ENABLE_GCODE_VIEWER_STATISTICS 0 #define ENABLE_GCODE_VIEWER_STATISTICS 0
// Enable G-Code viewer comparison between toolpaths height and width detected from gcode and calculated at gcode generation // Enable G-Code viewer comparison between toolpaths height and width detected from gcode and calculated at gcode generation
#define ENABLE_GCODE_VIEWER_DATA_CHECKING 0 #define ENABLE_GCODE_VIEWER_DATA_CHECKING 0
// Enable project dirty state manager debug window // Enable project dirty state manager debug window
#define ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW 0 #define ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW 0

View File

@ -3,10 +3,9 @@
#include "Camera.hpp" #include "Camera.hpp"
#include "GUI_App.hpp" #include "GUI_App.hpp"
#if ENABLE_CAMERA_STATISTICS
#include "Mouse3DController.hpp" #include "Mouse3DController.hpp"
#include "Plater.hpp" #include "Plater.hpp"
#endif // ENABLE_CAMERA_STATISTICS
#include <GL/glew.h> #include <GL/glew.h>
@ -380,7 +379,6 @@ void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor)
} }
} }
#if ENABLE_CAMERA_STATISTICS
void Camera::debug_render() void Camera::debug_render()
{ {
ImGuiWrapper& imgui = *wxGetApp().imgui(); ImGuiWrapper& imgui = *wxGetApp().imgui();
@ -435,7 +433,6 @@ void Camera::debug_render()
ImGui::InputFloat("GUI scale", &gui_scale, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat("GUI scale", &gui_scale, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly);
imgui.end(); imgui.end();
} }
#endif // ENABLE_CAMERA_STATISTICS
void Camera::rotate_on_sphere_with_target(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits, Vec3d target) void Camera::rotate_on_sphere_with_target(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits, Vec3d target)
{ {
@ -524,7 +521,7 @@ std::pair<double, double> Camera::calc_tight_frustrum_zs_around(const BoundingBo
{ {
std::pair<double, double> ret; std::pair<double, double> ret;
auto& [near_z, far_z] = ret; auto& [near_z, far_z] = ret;
m_scene_box_radius = box.radius();
// box in eye space // box in eye space
const BoundingBoxf3 eye_box = box.transformed(m_view_matrix); const BoundingBoxf3 eye_box = box.transformed(m_view_matrix);
near_z = -eye_box.max(2); near_z = -eye_box.max(2);
@ -544,8 +541,15 @@ std::pair<double, double> Camera::calc_tight_frustrum_zs_around(const BoundingBo
if (near_z < FrustrumMinNearZ) { if (near_z < FrustrumMinNearZ) {
const double delta = FrustrumMinNearZ - near_z; const double delta = FrustrumMinNearZ - near_z;
set_distance(m_distance + delta);
m_last_scene_box_radius = m_scene_box_radius;
near_z += delta; near_z += delta;
far_z += delta; far_z += delta;
} else {
if (abs(m_last_scene_box_radius - m_scene_box_radius) > 1) {
m_last_scene_box_radius = m_scene_box_radius;
set_distance(DefaultDistance);
}
} }
return ret; return ret;
@ -608,6 +612,16 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double
return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy);
} }
void Camera::set_distance(double distance)
{
if (m_distance != distance) {
m_view_matrix.translate((distance - m_distance) * get_dir_forward());
m_distance = distance;
update_target();
}
}
double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor) const double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor) const
{ {
if (volumes.empty()) if (volumes.empty())

View File

@ -56,6 +56,8 @@ private:
std::pair<double, double> m_frustrum_zs; std::pair<double, double> m_frustrum_zs;
BoundingBoxf3 m_scene_box; BoundingBoxf3 m_scene_box;
float m_scene_box_radius{0};
float m_last_scene_box_radius{0};
Frustum m_frustum; Frustum m_frustum;
Vec3f m_last_eye, m_last_center, m_last_up; Vec3f m_last_eye, m_last_center, m_last_up;
float m_last_near, m_last_far, m_last_aspect, m_last_fov,m_last_zoom; float m_last_near, m_last_far, m_last_aspect, m_last_fov,m_last_zoom;
@ -122,9 +124,7 @@ public:
void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor); void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor);
void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor); void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor);
void debug_frustum(); void debug_frustum();
#if ENABLE_CAMERA_STATISTICS
void debug_render(); void debug_render();
#endif // ENABLE_CAMERA_STATISTICS
// translate the camera in world space // translate the camera in world space
void translate_world(const Vec3d& displacement) { set_target(m_target + displacement); } void translate_world(const Vec3d& displacement) { set_target(m_target + displacement); }
@ -164,6 +164,7 @@ private:
std::pair<double, double> calc_tight_frustrum_zs_around(const BoundingBoxf3& box); std::pair<double, double> calc_tight_frustrum_zs_around(const BoundingBoxf3& box);
double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor) const; double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor) const;
double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const; double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const;
void set_distance(double distance);
void set_default_orientation(); void set_default_orientation();
void set_iso_orientation(); void set_iso_orientation();

View File

@ -2037,9 +2037,10 @@ void GLCanvas3D::render(bool only_init)
wxGetApp().plater()->render_project_state_debug_window(); wxGetApp().plater()->render_project_state_debug_window();
#endif // ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW #endif // ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW
#if ENABLE_CAMERA_STATISTICS if (wxGetApp().plater()->is_render_statistic_dialog_visible()) {
camera.debug_render(); camera.debug_render();
#endif // ENABLE_CAMERA_STATISTICS camera.debug_frustum();
}
#if ENABLE_IMGUI_STYLE_EDITOR #if ENABLE_IMGUI_STYLE_EDITOR
if (wxGetApp().get_mode() == ConfigOptionMode::comDevelop) if (wxGetApp().get_mode() == ConfigOptionMode::comDevelop)