mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Merge branch 'master' of https://github.com/prusa3d/Slic3r into scene_manipulators
This commit is contained in:
		
						commit
						ba0637461f
					
				
					 10 changed files with 113 additions and 32 deletions
				
			
		| 
						 | 
					@ -187,6 +187,7 @@ sub new {
 | 
				
			||||||
    if ($Slic3r::GUI::have_OpenGL) {
 | 
					    if ($Slic3r::GUI::have_OpenGL) {
 | 
				
			||||||
        $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config});
 | 
					        $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config});
 | 
				
			||||||
        Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
 | 
					        Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
 | 
				
			||||||
 | 
					        Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1);
 | 
				
			||||||
        Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); });
 | 
					        Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); });
 | 
				
			||||||
        $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview'));
 | 
					        $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview'));
 | 
				
			||||||
        $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1;
 | 
					        $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1;
 | 
				
			||||||
| 
						 | 
					@ -200,19 +201,18 @@ sub new {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub {
 | 
					    EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub {
 | 
				
			||||||
        my $preview = $self->{preview_notebook}->GetCurrentPage;
 | 
					        my $preview = $self->{preview_notebook}->GetCurrentPage;
 | 
				
			||||||
        if ($preview == $self->{preview3D})
 | 
					        if (($preview != $self->{preview3D}) && ($preview != $self->{canvas3D})) {
 | 
				
			||||||
        {
 | 
					            Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
 | 
				
			||||||
 | 
					            Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
 | 
				
			||||||
 | 
					            Slic3r::GUI::_3DScene::reset_current_canvas();
 | 
				
			||||||
 | 
					            $preview->OnActivate if $preview->can('OnActivate');        
 | 
				
			||||||
 | 
					        } elsif ($preview == $self->{preview3D}) {
 | 
				
			||||||
            Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1);
 | 
					            Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1);
 | 
				
			||||||
            Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
 | 
					            Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
 | 
				
			||||||
            Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1);
 | 
					            $self->{preview3D}->load_print;
 | 
				
			||||||
            $self->{preview3D}->load_print(1);
 | 
					 | 
				
			||||||
            # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
 | 
					            # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
 | 
				
			||||||
            Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas);
 | 
					            Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas);
 | 
				
			||||||
        } else {
 | 
					        } elsif ($preview == $self->{canvas3D}) {
 | 
				
			||||||
            Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 0);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if ($preview == $self->{canvas3D}) {
 | 
					 | 
				
			||||||
            Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1);
 | 
					            Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1);
 | 
				
			||||||
            Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
 | 
					            Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
 | 
				
			||||||
            if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) {
 | 
					            if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) {
 | 
				
			||||||
| 
						 | 
					@ -222,8 +222,6 @@ sub new {
 | 
				
			||||||
            }            
 | 
					            }            
 | 
				
			||||||
            # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
 | 
					            # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
 | 
				
			||||||
            Slic3r::GUI::_3DScene::set_as_dirty($self->{canvas3D});
 | 
					            Slic3r::GUI::_3DScene::set_as_dirty($self->{canvas3D});
 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            $preview->OnActivate if $preview->can('OnActivate');        
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -231,8 +231,10 @@ sub mouse_event {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $self->Refresh;
 | 
					        $self->Refresh;
 | 
				
			||||||
    } elsif ($event->LeftUp) {
 | 
					    } elsif ($event->LeftUp) {
 | 
				
			||||||
        $self->{on_instances_moved}->()
 | 
					        if ($self->{drag_object}) {
 | 
				
			||||||
            if $self->{drag_object};
 | 
					            $self->{on_instances_moved}->();
 | 
				
			||||||
 | 
					            Slic3r::GUI::_3DScene::reset_current_canvas();            
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        $self->{drag_start_pos} = undef;
 | 
					        $self->{drag_start_pos} = undef;
 | 
				
			||||||
        $self->{drag_object} = undef;
 | 
					        $self->{drag_object} = undef;
 | 
				
			||||||
        $self->SetCursor(wxSTANDARD_CURSOR);
 | 
					        $self->SetCursor(wxSTANDARD_CURSOR);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1754,6 +1754,16 @@ bool _3DScene::init(wxGLCanvas* canvas)
 | 
				
			||||||
    return s_canvas_mgr.init(canvas);
 | 
					    return s_canvas_mgr.init(canvas);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool _3DScene::set_current(wxGLCanvas* canvas, bool force)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return s_canvas_mgr.set_current(canvas, force);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void _3DScene::reset_current_canvas()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    s_canvas_mgr.set_current(nullptr, false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void _3DScene::set_active(wxGLCanvas* canvas, bool active)
 | 
					void _3DScene::set_active(wxGLCanvas* canvas, bool active)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    s_canvas_mgr.set_active(canvas, active);
 | 
					    s_canvas_mgr.set_active(canvas, active);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -516,6 +516,9 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static bool init(wxGLCanvas* canvas);
 | 
					    static bool init(wxGLCanvas* canvas);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static bool set_current(wxGLCanvas* canvas, bool force);
 | 
				
			||||||
 | 
					    static void reset_current_canvas();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static void set_active(wxGLCanvas* canvas, bool active);
 | 
					    static void set_active(wxGLCanvas* canvas, bool active);
 | 
				
			||||||
    static void set_as_dirty(wxGLCanvas* canvas);
 | 
					    static void set_as_dirty(wxGLCanvas* canvas);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,10 +12,20 @@ namespace Slic3r { namespace GUI {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wxString double_to_string(double const value)
 | 
						wxString double_to_string(double const value)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int precision = 10 * value - int(10 * value) == 0 ? 1 : 2;
 | 
							if (value - int(value) == 0)
 | 
				
			||||||
		return value - int(value) == 0 ?
 | 
								return wxString::Format(_T("%i"), int(value));
 | 
				
			||||||
			wxString::Format(_T("%i"), int(value)) :
 | 
							else {
 | 
				
			||||||
			wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
 | 
								int precision = 4;
 | 
				
			||||||
 | 
								for (size_t p = 1; p < 4; p++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									double cur_val = pow(10, p)*value;
 | 
				
			||||||
 | 
									if (cur_val - int(cur_val) == 0) {
 | 
				
			||||||
 | 
										precision = p;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Field::PostInitialize(){
 | 
						void Field::PostInitialize(){
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1520,13 +1520,10 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl)
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool GLCanvas3D::set_current()
 | 
					bool GLCanvas3D::set_current(bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if ((m_canvas != nullptr) && (m_context != nullptr))
 | 
					    if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr))
 | 
				
			||||||
    {
 | 
					        return m_canvas->SetCurrent(*m_context);
 | 
				
			||||||
        m_canvas->SetCurrent(*m_context);
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1548,8 +1545,13 @@ unsigned int GLCanvas3D::get_volumes_count() const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GLCanvas3D::reset_volumes()
 | 
					void GLCanvas3D::reset_volumes()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (set_current())
 | 
					
 | 
				
			||||||
 | 
					    if (!m_volumes.empty())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        // ensures this canvas is current
 | 
				
			||||||
 | 
					        if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true))
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        m_volumes.release_geometry();
 | 
					        m_volumes.release_geometry();
 | 
				
			||||||
        m_volumes.clear();
 | 
					        m_volumes.clear();
 | 
				
			||||||
        m_dirty = true;
 | 
					        m_dirty = true;
 | 
				
			||||||
| 
						 | 
					@ -1847,8 +1849,8 @@ void GLCanvas3D::render()
 | 
				
			||||||
    if (!_is_shown_on_screen())
 | 
					    if (!_is_shown_on_screen())
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ensures that the proper context is selected and that this canvas is initialized
 | 
					    // ensures this canvas is current and initialized
 | 
				
			||||||
    if (!set_current() || !_3DScene::init(m_canvas))
 | 
					    if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas))
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_force_zoom_to_bed_enabled)
 | 
					    if (m_force_zoom_to_bed_enabled)
 | 
				
			||||||
| 
						 | 
					@ -1929,6 +1931,11 @@ void GLCanvas3D::reload_scene(bool force)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reset_volumes();
 | 
					    reset_volumes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ensures this canvas is current
 | 
				
			||||||
 | 
					    if (!_3DScene::set_current(m_canvas, true))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
 | 
					    set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!m_canvas->IsShown() && !force)
 | 
					    if (!m_canvas->IsShown() && !force)
 | 
				
			||||||
| 
						 | 
					@ -2000,6 +2007,10 @@ void GLCanvas3D::reload_scene(bool force)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GLCanvas3D::load_print_toolpaths()
 | 
					void GLCanvas3D::load_print_toolpaths()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    // ensures this canvas is current
 | 
				
			||||||
 | 
					    if (!_3DScene::set_current(m_canvas, true))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_print == nullptr)
 | 
					    if (m_print == nullptr)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2364,8 +2375,8 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if ((m_canvas != nullptr) && (m_print != nullptr))
 | 
					    if ((m_canvas != nullptr) && (m_print != nullptr))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // ensures that the proper context is selected
 | 
					        // ensures that this canvas is current
 | 
				
			||||||
        if (!set_current())
 | 
					        if (!_3DScene::set_current(m_canvas, false))
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (m_volumes.empty())
 | 
					        if (m_volumes.empty())
 | 
				
			||||||
| 
						 | 
					@ -2682,7 +2693,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    } 
 | 
					    } 
 | 
				
			||||||
    else if (evt.LeftDClick() && (m_hover_volume_id != -1))
 | 
					    else if (evt.LeftDClick() && (m_hover_volume_id != -1))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_active = false;
 | 
				
			||||||
        m_on_double_click_callback.call();
 | 
					        m_on_double_click_callback.call();
 | 
				
			||||||
 | 
					        m_active = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    else if (evt.LeftDown() || evt.RightDown())
 | 
					    else if (evt.LeftDown() || evt.RightDown())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // If user pressed left or right button we first check whether this happened
 | 
					        // If user pressed left or right button we first check whether this happened
 | 
				
			||||||
| 
						 | 
					@ -2778,7 +2793,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    // if right clicking on volume, propagate event through callback
 | 
					                    // if right clicking on volume, propagate event through callback
 | 
				
			||||||
                    if (m_volumes.volumes[volume_idx]->hover)
 | 
					                    if (m_volumes.volumes[volume_idx]->hover)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        m_active = false;
 | 
				
			||||||
                        m_on_right_click_callback.call(pos.x, pos.y);
 | 
					                        m_on_right_click_callback.call(pos.x, pos.y);
 | 
				
			||||||
 | 
					                        m_active = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -2996,10 +3015,11 @@ void GLCanvas3D::_force_zoom_to_bed()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GLCanvas3D::_resize(unsigned int w, unsigned int h)
 | 
					void GLCanvas3D::_resize(unsigned int w, unsigned int h)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (m_context == nullptr)
 | 
					    if ((m_canvas == nullptr) && (m_context == nullptr))
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_current();
 | 
					    // ensures that this canvas is current
 | 
				
			||||||
 | 
					    _3DScene::set_current(m_canvas, false);
 | 
				
			||||||
    ::glViewport(0, 0, w, h);
 | 
					    ::glViewport(0, 0, w, h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ::glMatrixMode(GL_PROJECTION);
 | 
					    ::glMatrixMode(GL_PROJECTION);
 | 
				
			||||||
| 
						 | 
					@ -3585,9 +3605,11 @@ void GLCanvas3D::_perform_layer_editing_action(wxMouseEvent* evt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pointf3 GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z)
 | 
					Pointf3 GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!set_current())
 | 
					    if (m_canvas == nullptr)
 | 
				
			||||||
        return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX);
 | 
					        return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _camera_tranform();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GLint viewport[4];
 | 
					    GLint viewport[4];
 | 
				
			||||||
    ::glGetIntegerv(GL_VIEWPORT, viewport);
 | 
					    ::glGetIntegerv(GL_VIEWPORT, viewport);
 | 
				
			||||||
    GLdouble modelview_matrix[16];
 | 
					    GLdouble modelview_matrix[16];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -449,7 +449,7 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool init(bool useVBOs, bool use_legacy_opengl);
 | 
					    bool init(bool useVBOs, bool use_legacy_opengl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool set_current();
 | 
					    bool set_current(bool force);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void set_active(bool active);
 | 
					    void set_active(bool active);
 | 
				
			||||||
    void set_as_dirty();
 | 
					    void set_as_dirty();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,6 +115,7 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLCanvas3DManager::GLCanvas3DManager()
 | 
					GLCanvas3DManager::GLCanvas3DManager()
 | 
				
			||||||
    : m_context(nullptr)
 | 
					    : m_context(nullptr)
 | 
				
			||||||
 | 
					    , m_current(nullptr)
 | 
				
			||||||
    , m_gl_initialized(false)
 | 
					    , m_gl_initialized(false)
 | 
				
			||||||
    , m_use_legacy_opengl(false)
 | 
					    , m_use_legacy_opengl(false)
 | 
				
			||||||
    , m_use_VBOs(false)
 | 
					    , m_use_VBOs(false)
 | 
				
			||||||
| 
						 | 
					@ -212,6 +213,34 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GLCanvas3DManager::set_current(wxGLCanvas* canvas, bool force)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // given canvas is already current, return
 | 
				
			||||||
 | 
					    if (m_current == canvas)
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (canvas == nullptr)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        m_current = nullptr;
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // set given canvas as current
 | 
				
			||||||
 | 
					    CanvasesMap::iterator it = _get_canvas(canvas);
 | 
				
			||||||
 | 
					    if (it != m_canvases.end())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        bool res = it->second->set_current(force);
 | 
				
			||||||
 | 
					        if (res)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_current = canvas;
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_current = nullptr;
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active)
 | 
					void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    CanvasesMap::iterator it = _get_canvas(canvas);
 | 
					    CanvasesMap::iterator it = _get_canvas(canvas);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,6 +45,7 @@ class GLCanvas3DManager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxGLContext* m_context;
 | 
					    wxGLContext* m_context;
 | 
				
			||||||
    CanvasesMap m_canvases;
 | 
					    CanvasesMap m_canvases;
 | 
				
			||||||
 | 
					    wxGLCanvas* m_current;
 | 
				
			||||||
    GLInfo m_gl_info;
 | 
					    GLInfo m_gl_info;
 | 
				
			||||||
    bool m_gl_initialized;
 | 
					    bool m_gl_initialized;
 | 
				
			||||||
    bool m_use_legacy_opengl;
 | 
					    bool m_use_legacy_opengl;
 | 
				
			||||||
| 
						 | 
					@ -69,6 +70,7 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool init(wxGLCanvas* canvas);
 | 
					    bool init(wxGLCanvas* canvas);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool set_current(wxGLCanvas* canvas, bool force);
 | 
				
			||||||
    void set_active(wxGLCanvas* canvas, bool active);
 | 
					    void set_active(wxGLCanvas* canvas, bool active);
 | 
				
			||||||
    void set_as_dirty(wxGLCanvas* canvas);
 | 
					    void set_as_dirty(wxGLCanvas* canvas);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,6 +190,11 @@ remove_all_canvases()
 | 
				
			||||||
    CODE:
 | 
					    CODE:
 | 
				
			||||||
        _3DScene::remove_all_canvases();
 | 
					        _3DScene::remove_all_canvases();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					reset_current_canvas()
 | 
				
			||||||
 | 
					    CODE:
 | 
				
			||||||
 | 
					        _3DScene::reset_current_canvas();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
set_active(canvas, active)
 | 
					set_active(canvas, active)
 | 
				
			||||||
        SV   *canvas;
 | 
					        SV   *canvas;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue