mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Use unique camera shared by 3d view and preview (experimental)
This commit is contained in:
		
							parent
							
								
									af72d781ad
								
							
						
					
					
						commit
						aa4c44dbea
					
				
					 9 changed files with 448 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -58,5 +58,9 @@
 | 
			
		|||
 | 
			
		||||
// Toolbars and Gizmos use icons imported from svg files
 | 
			
		||||
#define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
// Use a unique camera shared by 3d view and preview
 | 
			
		||||
#define ENABLE_SHARED_CAMERA (1 && ENABLE_1_42_0_ALPHA8)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
#endif // _technologies_h_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,6 +76,8 @@ set(SLIC3R_GUI_SOURCES
 | 
			
		|||
    GUI/2DBed.hpp
 | 
			
		||||
    GUI/3DBed.cpp
 | 
			
		||||
    GUI/3DBed.hpp
 | 
			
		||||
    GUI/Camera.cpp
 | 
			
		||||
    GUI/Camera.hpp
 | 
			
		||||
    GUI/wxExtensions.cpp
 | 
			
		||||
    GUI/wxExtensions.hpp
 | 
			
		||||
    GUI/WipeTowerDialog.cpp
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										65
									
								
								src/slic3r/GUI/Camera.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/slic3r/GUI/Camera.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
#include "libslic3r/libslic3r.h"
 | 
			
		||||
 | 
			
		||||
#include "Camera.hpp"
 | 
			
		||||
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
 | 
			
		||||
static const float GIMBALL_LOCK_THETA_MAX = 180.0f;
 | 
			
		||||
 | 
			
		||||
namespace Slic3r {
 | 
			
		||||
namespace GUI {
 | 
			
		||||
 | 
			
		||||
Camera::Camera()
 | 
			
		||||
    : type(Ortho)
 | 
			
		||||
    , zoom(1.0f)
 | 
			
		||||
    , phi(45.0f)
 | 
			
		||||
//    , distance(0.0f)
 | 
			
		||||
    , requires_zoom_to_bed(false)
 | 
			
		||||
    , m_theta(45.0f)
 | 
			
		||||
    , m_target(Vec3d::Zero())
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string Camera::get_type_as_string() const
 | 
			
		||||
{
 | 
			
		||||
    switch (type)
 | 
			
		||||
    {
 | 
			
		||||
    default:
 | 
			
		||||
    case Unknown:
 | 
			
		||||
        return "unknown";
 | 
			
		||||
//    case Perspective:
 | 
			
		||||
//        return "perspective";
 | 
			
		||||
    case Ortho:
 | 
			
		||||
        return "ortho";
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Camera::set_target(const Vec3d& target)
 | 
			
		||||
{
 | 
			
		||||
    m_target = target;
 | 
			
		||||
    m_target(0) = clamp(m_scene_box.min(0), m_scene_box.max(0), m_target(0));
 | 
			
		||||
    m_target(1) = clamp(m_scene_box.min(1), m_scene_box.max(1), m_target(1));
 | 
			
		||||
    m_target(2) = clamp(m_scene_box.min(2), m_scene_box.max(2), m_target(2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Camera::set_theta(float theta, bool apply_limit)
 | 
			
		||||
{
 | 
			
		||||
    if (apply_limit)
 | 
			
		||||
        m_theta = clamp(0.0f, GIMBALL_LOCK_THETA_MAX, theta);
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_theta = fmod(theta, 360.0f);
 | 
			
		||||
        if (m_theta < 0.0f)
 | 
			
		||||
            m_theta += 360.0f;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Camera::set_scene_box(const BoundingBoxf3& box)
 | 
			
		||||
{
 | 
			
		||||
    m_scene_box = box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // GUI
 | 
			
		||||
} // Slic3r
 | 
			
		||||
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
							
								
								
									
										54
									
								
								src/slic3r/GUI/Camera.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/slic3r/GUI/Camera.hpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
#ifndef slic3r_Camera_hpp_
 | 
			
		||||
#define slic3r_Camera_hpp_
 | 
			
		||||
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
 | 
			
		||||
#include "libslic3r/BoundingBox.hpp"
 | 
			
		||||
 | 
			
		||||
namespace Slic3r {
 | 
			
		||||
namespace GUI {
 | 
			
		||||
 | 
			
		||||
struct Camera
 | 
			
		||||
{
 | 
			
		||||
    enum EType : unsigned char
 | 
			
		||||
    {
 | 
			
		||||
        Unknown,
 | 
			
		||||
//        Perspective,
 | 
			
		||||
        Ortho,
 | 
			
		||||
        Num_types
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    EType type;
 | 
			
		||||
    float zoom;
 | 
			
		||||
    float phi;
 | 
			
		||||
//    float distance;
 | 
			
		||||
    bool requires_zoom_to_bed;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Vec3d m_target;
 | 
			
		||||
    float m_theta;
 | 
			
		||||
 | 
			
		||||
    BoundingBoxf3 m_scene_box;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    Camera();
 | 
			
		||||
 | 
			
		||||
    std::string get_type_as_string() const;
 | 
			
		||||
 | 
			
		||||
    const Vec3d& get_target() const { return m_target; }
 | 
			
		||||
    void set_target(const Vec3d& target);
 | 
			
		||||
 | 
			
		||||
    float get_theta() const { return m_theta; }
 | 
			
		||||
    void set_theta(float theta, bool apply_limit);
 | 
			
		||||
 | 
			
		||||
    const BoundingBoxf3& get_scene_box() const { return m_scene_box; }
 | 
			
		||||
    void set_scene_box(const BoundingBoxf3& box);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // GUI
 | 
			
		||||
} // Slic3r
 | 
			
		||||
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
 | 
			
		||||
#endif // slic3r_Camera_hpp_
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -54,7 +54,13 @@
 | 
			
		|||
#include <cmath>
 | 
			
		||||
 | 
			
		||||
static const float TRACKBALLSIZE = 0.8f;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
static const float GIMBALL_LOCK_THETA_MAX = 180.0f;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
static const float GROUND_Z = -0.02f;
 | 
			
		||||
 | 
			
		||||
// phi / theta angles to orient the camera.
 | 
			
		||||
| 
						 | 
				
			
			@ -183,6 +189,9 @@ void Rect::set_bottom(float bottom)
 | 
			
		|||
    m_bottom = bottom;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
GLCanvas3D::Camera::Camera()
 | 
			
		||||
    : type(Ortho)
 | 
			
		||||
    , zoom(1.0f)
 | 
			
		||||
| 
						 | 
				
			
			@ -237,6 +246,9 @@ void GLCanvas3D::Camera::set_scene_box(const BoundingBoxf3& box, GLCanvas3D& can
 | 
			
		|||
        canvas.viewport_changed();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
#if !ENABLE_TEXTURES_FROM_SVG
 | 
			
		||||
GLCanvas3D::Shader::Shader()
 | 
			
		||||
| 
						 | 
				
			
			@ -3713,7 +3725,13 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const
 | 
			
		|||
wxDEFINE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent);
 | 
			
		||||
wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
 | 
			
		||||
wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
wxDEFINE_EVENT(EVT_GLCANVAS_VIEWPORT_CHANGED, SimpleEvent);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent);
 | 
			
		||||
wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent);
 | 
			
		||||
wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent);
 | 
			
		||||
| 
						 | 
				
			
			@ -3737,6 +3755,11 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
 | 
			
		|||
    , m_retina_helper(nullptr)
 | 
			
		||||
#endif
 | 
			
		||||
    , m_in_render(false)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    , m_camera(nullptr)
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    , m_bed(nullptr)
 | 
			
		||||
#if ENABLE_SVG_ICONS
 | 
			
		||||
    , m_toolbar(GLToolbar::Normal, "Top")
 | 
			
		||||
| 
						 | 
				
			
			@ -3752,7 +3775,13 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
 | 
			
		|||
    , m_dirty(true)
 | 
			
		||||
    , m_initialized(false)
 | 
			
		||||
    , m_use_VBOs(false)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    , m_requires_zoom_to_bed(false)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    , m_apply_zoom_to_volumes_filter(false)
 | 
			
		||||
    , m_hover_volume_id(-1)
 | 
			
		||||
    , m_toolbar_action_running(false)
 | 
			
		||||
| 
						 | 
				
			
			@ -3792,10 +3821,16 @@ void GLCanvas3D::post_event(wxEvent &&event)
 | 
			
		|||
    wxPostEvent(m_canvas, event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
void GLCanvas3D::viewport_changed()
 | 
			
		||||
{
 | 
			
		||||
    post_event(SimpleEvent(EVT_GLCANVAS_VIEWPORT_CHANGED));
 | 
			
		||||
}
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -3971,8 +4006,20 @@ void GLCanvas3D::set_model(Model* model)
 | 
			
		|||
 | 
			
		||||
void GLCanvas3D::bed_shape_changed()
 | 
			
		||||
{
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    if (m_camera != nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        m_camera->set_scene_box(scene_bounding_box());
 | 
			
		||||
        m_camera->requires_zoom_to_bed = true;
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    m_camera.set_scene_box(scene_bounding_box(), *this);
 | 
			
		||||
    m_requires_zoom_to_bed = true;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
    m_dirty = true;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3984,7 +4031,15 @@ void GLCanvas3D::set_color_by(const std::string& value)
 | 
			
		|||
 | 
			
		||||
float GLCanvas3D::get_camera_zoom() const
 | 
			
		||||
{
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    return (m_camera != nullptr) ? m_camera->zoom : 0.0f;
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    return m_camera.zoom;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const
 | 
			
		||||
| 
						 | 
				
			
			@ -4129,16 +4184,31 @@ void GLCanvas3D::select_view(const std::string& direction)
 | 
			
		|||
 | 
			
		||||
    if (dir_vec != nullptr)
 | 
			
		||||
    {
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
        if (m_camera != nullptr)
 | 
			
		||||
        {
 | 
			
		||||
            m_camera->phi = dir_vec[0];
 | 
			
		||||
            m_camera->set_theta(dir_vec[1], false);
 | 
			
		||||
        }
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
        m_camera.phi = dir_vec[0];
 | 
			
		||||
        m_camera.set_theta(dir_vec[1], false);
 | 
			
		||||
 | 
			
		||||
        viewport_changed();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
        
 | 
			
		||||
        if (m_canvas != nullptr)
 | 
			
		||||
            m_canvas->Refresh();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
void GLCanvas3D::set_viewport_from_scene(const GLCanvas3D& other)
 | 
			
		||||
{
 | 
			
		||||
    m_camera.phi = other.m_camera.phi;
 | 
			
		||||
| 
						 | 
				
			
			@ -4148,6 +4218,9 @@ void GLCanvas3D::set_viewport_from_scene(const GLCanvas3D& other)
 | 
			
		|||
    m_camera.zoom = other.m_camera.zoom;
 | 
			
		||||
    m_dirty = true;
 | 
			
		||||
}
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
void GLCanvas3D::update_volumes_colors_by_extruder()
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -4209,12 +4282,28 @@ void GLCanvas3D::render()
 | 
			
		|||
        post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    if ((m_camera != nullptr) && m_camera->requires_zoom_to_bed)
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    if (m_requires_zoom_to_bed)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    {
 | 
			
		||||
        zoom_to_bed();
 | 
			
		||||
        const Size& cnv_size = get_canvas_size();
 | 
			
		||||
        _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height());
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
        m_camera->requires_zoom_to_bed = false;
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
        m_requires_zoom_to_bed = false;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _camera_tranform();
 | 
			
		||||
| 
						 | 
				
			
			@ -4224,7 +4313,15 @@ void GLCanvas3D::render()
 | 
			
		|||
    GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f };
 | 
			
		||||
    ::glLightfv(GL_LIGHT0, GL_POSITION, position_top);
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    float theta = (m_camera != nullptr) ? m_camera->get_theta() : 0.0f;
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    float theta = m_camera.get_theta();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    if (theta > 180.f)
 | 
			
		||||
        // absolute value of the rotation
 | 
			
		||||
        theta = 360.f - theta;
 | 
			
		||||
| 
						 | 
				
			
			@ -4661,8 +4758,17 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
 | 
			
		|||
    // restore to default value
 | 
			
		||||
    m_regenerate_volumes = true;
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    if (m_camera != nullptr)
 | 
			
		||||
        m_camera->set_scene_box(scene_bounding_box());
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    m_camera.set_scene_box(scene_bounding_box(), *this);
 | 
			
		||||
    m_camera.set_target(m_camera.get_target(), *this);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
    if (m_selection.is_empty())
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -5349,7 +5455,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
			
		|||
            // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag
 | 
			
		||||
            if (m_selection.contains_volume(m_hover_volume_id))
 | 
			
		||||
            {
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
                if ((m_camera != nullptr) && (m_camera->get_theta() == 90.0f))
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
                if (m_camera.get_theta() == 90.0f)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
                {
 | 
			
		||||
                    // side view -> move selected volumes orthogonally to camera view direction
 | 
			
		||||
                    Linef3 ray = mouse_ray(pos);
 | 
			
		||||
| 
						 | 
				
			
			@ -5460,10 +5574,22 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
			
		|||
#endif // ENABLE_MOVE_MIN_THRESHOLD
 | 
			
		||||
            {
 | 
			
		||||
                const Vec3d& orig = m_mouse.drag.start_position_3D;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
                if (m_camera != nullptr)
 | 
			
		||||
                {
 | 
			
		||||
                    m_camera->phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE);
 | 
			
		||||
                    m_camera->set_theta(m_camera->get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
 | 
			
		||||
                }
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
                m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE);
 | 
			
		||||
                m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
 | 
			
		||||
 | 
			
		||||
                viewport_changed();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
                m_dirty = true;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -5478,9 +5604,18 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
			
		|||
                float z = 0.0f;
 | 
			
		||||
                const Vec3d& cur_pos = _mouse_to_3d(pos, &z);
 | 
			
		||||
                Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
                if (m_camera != nullptr)
 | 
			
		||||
                    m_camera->set_target(m_camera->get_target() + orig - cur_pos);
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
                m_camera.set_target(m_camera.get_target() + orig - cur_pos, *this);
 | 
			
		||||
 | 
			
		||||
                viewport_changed();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
                m_dirty = true;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -5558,8 +5693,16 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
			
		|||
            // Let the platter know that the dragging finished, so a delayed refresh
 | 
			
		||||
            // of the scene with the background processing data should be performed.
 | 
			
		||||
            post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
            m_camera->set_scene_box(scene_bounding_box());
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
            m_camera.set_scene_box(scene_bounding_box(), *this);
 | 
			
		||||
            set_camera_zoom(0.0f);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        m_moving = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -5904,8 +6047,17 @@ void GLCanvas3D::set_camera_zoom(float zoom)
 | 
			
		|||
    // Don't allow to zoom too close to the scene.
 | 
			
		||||
    zoom = std::min(zoom, 100.0f);
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    if (m_camera != nullptr)
 | 
			
		||||
        m_camera->zoom = zoom;
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    m_camera.zoom = zoom;
 | 
			
		||||
    viewport_changed();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    _refresh_if_shown_on_screen();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -6128,7 +6280,16 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h)
 | 
			
		|||
 | 
			
		||||
    const BoundingBoxf3& bbox = _max_bounding_box();
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    Camera::EType camera_type = (m_camera != nullptr) ? m_camera->type : Camera::Unknown;
 | 
			
		||||
    switch (camera_type)
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    switch (m_camera.type)
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    {
 | 
			
		||||
    case Camera::Ortho:
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -6196,11 +6357,24 @@ void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox)
 | 
			
		|||
    float zoom = _get_zoom_to_bounding_box_factor(bbox);
 | 
			
		||||
    if (zoom > 0.0f)
 | 
			
		||||
    {
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
        if (m_camera != nullptr)
 | 
			
		||||
        {
 | 
			
		||||
            m_camera->zoom = zoom;
 | 
			
		||||
            // center view around bounding box center
 | 
			
		||||
            m_camera->set_target(bbox.center());
 | 
			
		||||
        }
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
        m_camera.zoom = zoom;
 | 
			
		||||
        // center view around bounding box center
 | 
			
		||||
        m_camera.set_target(bbox.center(), *this);
 | 
			
		||||
 | 
			
		||||
        viewport_changed();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
        m_dirty = true;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -6291,10 +6465,24 @@ void GLCanvas3D::_camera_tranform() const
 | 
			
		|||
    ::glMatrixMode(GL_MODELVIEW);
 | 
			
		||||
    ::glLoadIdentity();
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    Vec3d target = Vec3d::Zero();
 | 
			
		||||
    if (m_camera != nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        ::glRotatef(-m_camera->get_theta(), 1.0f, 0.0f, 0.0f); // pitch
 | 
			
		||||
        ::glRotatef(m_camera->phi, 0.0f, 0.0f, 1.0f);          // yaw
 | 
			
		||||
        target = -m_camera->get_target();
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    ::glRotatef(-m_camera.get_theta(), 1.0f, 0.0f, 0.0f); // pitch
 | 
			
		||||
    ::glRotatef(m_camera.phi, 0.0f, 0.0f, 1.0f);          // yaw
 | 
			
		||||
 | 
			
		||||
    Vec3d target = -m_camera.get_target();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    ::glTranslated(target(0), target(1), target(2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,11 @@
 | 
			
		|||
#include "GLToolbar.hpp"
 | 
			
		||||
#include "Event.hpp"
 | 
			
		||||
#include "3DBed.hpp"
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
#include "Camera.hpp"
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
#include <float.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +105,13 @@ template <size_t N> using Vec3dsEvent = ArrayEvent<Vec3d, N>;
 | 
			
		|||
 | 
			
		||||
wxDECLARE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent);
 | 
			
		||||
wxDECLARE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
wxDECLARE_EVENT(EVT_GLCANVAS_VIEWPORT_CHANGED, SimpleEvent);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
wxDECLARE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent);
 | 
			
		||||
wxDECLARE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent);
 | 
			
		||||
wxDECLARE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent);
 | 
			
		||||
| 
						 | 
				
			
			@ -162,6 +173,9 @@ class GLCanvas3D
 | 
			
		|||
        void reset() { first_volumes.clear(); }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    struct Camera
 | 
			
		||||
    {
 | 
			
		||||
        enum EType : unsigned char
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +210,9 @@ class GLCanvas3D
 | 
			
		|||
        const BoundingBoxf3& get_scene_box() const { return m_scene_box; }
 | 
			
		||||
        void set_scene_box(const BoundingBoxf3& box, GLCanvas3D& canvas);
 | 
			
		||||
    };
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
#if !ENABLE_TEXTURES_FROM_SVG
 | 
			
		||||
    class Shader
 | 
			
		||||
| 
						 | 
				
			
			@ -885,7 +902,15 @@ private:
 | 
			
		|||
    LegendTexture m_legend_texture;
 | 
			
		||||
    WarningTexture m_warning_texture;
 | 
			
		||||
    wxTimer m_timer;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    Camera* m_camera;
 | 
			
		||||
#else
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    Camera m_camera;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    Bed3D* m_bed;
 | 
			
		||||
    LayersEditing m_layers_editing;
 | 
			
		||||
    Shader m_shader;
 | 
			
		||||
| 
						 | 
				
			
			@ -908,7 +933,13 @@ private:
 | 
			
		|||
    bool m_dirty;
 | 
			
		||||
    bool m_initialized;
 | 
			
		||||
    bool m_use_VBOs;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    bool m_requires_zoom_to_bed;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    bool m_apply_zoom_to_volumes_filter;
 | 
			
		||||
    mutable int m_hover_volume_id;
 | 
			
		||||
    bool m_toolbar_action_running;
 | 
			
		||||
| 
						 | 
				
			
			@ -942,6 +973,11 @@ public:
 | 
			
		|||
    wxGLCanvas* get_wxglcanvas() { return m_canvas; }
 | 
			
		||||
	const wxGLCanvas* get_wxglcanvas() const { return m_canvas; }
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    void set_camera(Camera* camera) { m_camera = camera; }
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void set_bed(Bed3D* bed) { m_bed = bed; }
 | 
			
		||||
 | 
			
		||||
    void set_view_toolbar(GLToolbar* toolbar) { m_view_toolbar = toolbar; }
 | 
			
		||||
| 
						 | 
				
			
			@ -1005,7 +1041,13 @@ public:
 | 
			
		|||
    void zoom_to_volumes();
 | 
			
		||||
    void zoom_to_selection();
 | 
			
		||||
    void select_view(const std::string& direction);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void set_viewport_from_scene(const GLCanvas3D& other);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
    void update_volumes_colors_by_extruder();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1070,7 +1112,13 @@ public:
 | 
			
		|||
 | 
			
		||||
    void update_gizmos_on_off_state();
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void viewport_changed();
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
    void handle_sidebar_focus_event(const std::string& opt_key, bool focus_on);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -95,6 +95,16 @@ void View3D::set_bed(Bed3D* bed)
 | 
			
		|||
        m_canvas->set_bed(bed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
void View3D::set_camera(Camera* camera)
 | 
			
		||||
{
 | 
			
		||||
    if (m_canvas != nullptr)
 | 
			
		||||
        m_canvas->set_camera(camera);
 | 
			
		||||
}
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
void View3D::set_view_toolbar(GLToolbar* toolbar)
 | 
			
		||||
{
 | 
			
		||||
    if (m_canvas != nullptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -348,6 +358,16 @@ void Preview::set_bed(Bed3D* bed)
 | 
			
		|||
        m_canvas->set_bed(bed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
void Preview::set_camera(Camera* camera)
 | 
			
		||||
{
 | 
			
		||||
    if (m_canvas != nullptr)
 | 
			
		||||
        m_canvas->set_camera(camera);
 | 
			
		||||
}
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
void Preview::set_view_toolbar(GLToolbar* toolbar)
 | 
			
		||||
{
 | 
			
		||||
    if (m_canvas != nullptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -390,6 +410,9 @@ void Preview::select_view(const std::string& direction)
 | 
			
		|||
    m_canvas->select_view(direction);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
void Preview::set_viewport_from_scene(GLCanvas3D* canvas)
 | 
			
		||||
{
 | 
			
		||||
    if (canvas != nullptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -401,6 +424,9 @@ void Preview::set_viewport_into_scene(GLCanvas3D* canvas)
 | 
			
		|||
    if (canvas != nullptr)
 | 
			
		||||
		canvas->set_viewport_from_scene(*m_canvas);
 | 
			
		||||
}
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
void Preview::set_drop_target(wxDropTarget* target)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,11 @@ namespace GUI {
 | 
			
		|||
class GLCanvas3D;
 | 
			
		||||
class GLToolbar;
 | 
			
		||||
class Bed3D;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
class Camera;
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
class View3D : public wxPanel
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -50,6 +55,11 @@ public:
 | 
			
		|||
    GLCanvas3D* get_canvas3d() { return m_canvas; }
 | 
			
		||||
 | 
			
		||||
    void set_bed(Bed3D* bed);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    void set_camera(Camera* camera);
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void set_view_toolbar(GLToolbar* toolbar);
 | 
			
		||||
 | 
			
		||||
    void set_as_dirty();
 | 
			
		||||
| 
						 | 
				
			
			@ -115,6 +125,11 @@ public:
 | 
			
		|||
    GLCanvas3D* get_canvas3d() { return m_canvas; }
 | 
			
		||||
 | 
			
		||||
    void set_bed(Bed3D* bed);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    void set_camera(Camera* camera);
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void set_view_toolbar(GLToolbar* toolbar);
 | 
			
		||||
 | 
			
		||||
    void set_number_extruders(unsigned int number_extruders);
 | 
			
		||||
| 
						 | 
				
			
			@ -122,8 +137,14 @@ public:
 | 
			
		|||
    void set_enabled(bool enabled);
 | 
			
		||||
    void bed_shape_changed();
 | 
			
		||||
    void select_view(const std::string& direction);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void set_viewport_from_scene(GLCanvas3D* canvas);
 | 
			
		||||
    void set_viewport_into_scene(GLCanvas3D* canvas);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void set_drop_target(wxDropTarget* target);
 | 
			
		||||
 | 
			
		||||
    void load_print();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,11 @@
 | 
			
		|||
#include "GLToolbar.hpp"
 | 
			
		||||
#include "GUI_Preview.hpp"
 | 
			
		||||
#include "3DBed.hpp"
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
#include "Camera.hpp"
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#include "Tab.hpp"
 | 
			
		||||
#include "PresetBundle.hpp"
 | 
			
		||||
#include "BackgroundSlicingProcess.hpp"
 | 
			
		||||
| 
						 | 
				
			
			@ -1019,6 +1024,11 @@ struct Plater::priv
 | 
			
		|||
    std::vector<wxPanel*> panels;
 | 
			
		||||
    Sidebar *sidebar;
 | 
			
		||||
    Bed3D bed;
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    Camera camera;
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    View3D* view3D;
 | 
			
		||||
    GLToolbar view_toolbar;
 | 
			
		||||
    Preview *preview;
 | 
			
		||||
| 
						 | 
				
			
			@ -1115,7 +1125,13 @@ struct Plater::priv
 | 
			
		|||
    void on_action_layersediting(SimpleEvent&);
 | 
			
		||||
 | 
			
		||||
    void on_object_select(SimpleEvent&);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void on_viewport_changed(SimpleEvent&);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    void on_right_click(Vec2dEvent&);
 | 
			
		||||
    void on_wipetower_moved(Vec3dEvent&);
 | 
			
		||||
    void on_update_geometry(Vec3dsEvent<2>&);
 | 
			
		||||
| 
						 | 
				
			
			@ -1207,6 +1223,12 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
 | 
			
		|||
 | 
			
		||||
    view3D->set_bed(&bed);
 | 
			
		||||
    preview->set_bed(&bed);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if ENABLE_SHARED_CAMERA
 | 
			
		||||
    view3D->set_camera(&camera);
 | 
			
		||||
    preview->set_camera(&camera);
 | 
			
		||||
#endif // ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
    panels.push_back(view3D);
 | 
			
		||||
    panels.push_back(preview);
 | 
			
		||||
| 
						 | 
				
			
			@ -1238,7 +1260,13 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
 | 
			
		|||
    // 3DScene events:
 | 
			
		||||
    view3D_canvas->Bind(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); });
 | 
			
		||||
    view3D_canvas->Bind(EVT_GLCANVAS_OBJECT_SELECT, &priv::on_object_select, this);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    view3D_canvas->Bind(EVT_GLCANVAS_VIEWPORT_CHANGED, &priv::on_viewport_changed, this);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    view3D_canvas->Bind(EVT_GLCANVAS_RIGHT_CLICK, &priv::on_right_click, this);
 | 
			
		||||
    view3D_canvas->Bind(EVT_GLCANVAS_REMOVE_OBJECT, [q](SimpleEvent&) { q->remove_selected(); });
 | 
			
		||||
    view3D_canvas->Bind(EVT_GLCANVAS_ARRANGE, [this](SimpleEvent&) { arrange(); });
 | 
			
		||||
| 
						 | 
				
			
			@ -1268,7 +1296,13 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
 | 
			
		|||
    view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option<ConfigOptionPoints>("bed_shape")->values); });
 | 
			
		||||
 | 
			
		||||
    // Preview events:
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_VIEWPORT_CHANGED, &priv::on_viewport_changed, this);
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
    preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); });
 | 
			
		||||
    preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option<ConfigOptionPoints>("bed_shape")->values); });
 | 
			
		||||
    preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); });
 | 
			
		||||
| 
						 | 
				
			
			@ -2435,6 +2469,9 @@ void Plater::priv::on_object_select(SimpleEvent& evt)
 | 
			
		|||
    selection_changed();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#if !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
void Plater::priv::on_viewport_changed(SimpleEvent& evt)
 | 
			
		||||
{
 | 
			
		||||
    wxObject* o = evt.GetEventObject();
 | 
			
		||||
| 
						 | 
				
			
			@ -2443,6 +2480,9 @@ void Plater::priv::on_viewport_changed(SimpleEvent& evt)
 | 
			
		|||
    else if (o == view3D->get_wxglcanvas())
 | 
			
		||||
        preview->set_viewport_from_scene(view3D->get_canvas3d());
 | 
			
		||||
}
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
#endif // !ENABLE_SHARED_CAMERA
 | 
			
		||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | 
			
		||||
 | 
			
		||||
void Plater::priv::on_right_click(Vec2dEvent& evt)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue