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
						cf6552484d
					
				
					 9 changed files with 29 additions and 126 deletions
				
			
		| 
						 | 
				
			
			@ -186,7 +186,6 @@ sub new {
 | 
			
		|||
    # Initialize 3D toolpaths preview
 | 
			
		||||
    if ($Slic3r::GUI::have_OpenGL) {
 | 
			
		||||
        $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::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); });
 | 
			
		||||
        $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview'));
 | 
			
		||||
| 
						 | 
				
			
			@ -202,19 +201,12 @@ sub new {
 | 
			
		|||
    EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub {
 | 
			
		||||
        my $preview = $self->{preview_notebook}->GetCurrentPage;
 | 
			
		||||
        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->{canvas3D}, 0);
 | 
			
		||||
            $self->{preview3D}->load_print;
 | 
			
		||||
            # 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);
 | 
			
		||||
        } elsif ($preview == $self->{canvas3D}) {
 | 
			
		||||
            Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1);
 | 
			
		||||
            Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0);
 | 
			
		||||
            if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) {
 | 
			
		||||
                my $selections = $self->collect_selections;
 | 
			
		||||
                Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -279,7 +279,6 @@ sub reload_print {
 | 
			
		|||
    my ($self, $force) = @_;
 | 
			
		||||
 | 
			
		||||
    Slic3r::GUI::_3DScene::reset_volumes($self->canvas);
 | 
			
		||||
    Slic3r::GUI::_3DScene::reset_current_canvas();            
 | 
			
		||||
    $self->_loaded(0);
 | 
			
		||||
 | 
			
		||||
    if (! $self->IsShown && ! $force) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1754,21 +1754,6 @@ bool _3DScene::init(wxGLCanvas* 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)
 | 
			
		||||
{
 | 
			
		||||
    s_canvas_mgr.set_active(canvas, active);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _3DScene::set_as_dirty(wxGLCanvas* canvas)
 | 
			
		||||
{
 | 
			
		||||
    s_canvas_mgr.set_as_dirty(canvas);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -516,10 +516,6 @@ public:
 | 
			
		|||
 | 
			
		||||
    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_as_dirty(wxGLCanvas* canvas);
 | 
			
		||||
 | 
			
		||||
    static unsigned int get_volumes_count(wxGLCanvas* canvas);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1408,15 +1408,14 @@ GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const
 | 
			
		|||
    return (it != m_gizmos.end()) ? it->second : nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context)
 | 
			
		||||
GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
 | 
			
		||||
    : m_canvas(canvas)
 | 
			
		||||
    , m_context(context)
 | 
			
		||||
    , m_context(nullptr)
 | 
			
		||||
    , m_timer(nullptr)
 | 
			
		||||
    , m_config(nullptr)
 | 
			
		||||
    , m_print(nullptr)
 | 
			
		||||
    , m_model(nullptr)
 | 
			
		||||
    , m_dirty(true)
 | 
			
		||||
    , m_active(true)
 | 
			
		||||
    , m_initialized(false)
 | 
			
		||||
    , m_use_VBOs(false)
 | 
			
		||||
    , m_force_zoom_to_bed_enabled(false)
 | 
			
		||||
| 
						 | 
				
			
			@ -1434,7 +1433,10 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context)
 | 
			
		|||
    , m_reload_delayed(false)
 | 
			
		||||
{
 | 
			
		||||
    if (m_canvas != nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        m_context = new wxGLContext(m_canvas);
 | 
			
		||||
        m_timer = new wxTimer(m_canvas);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLCanvas3D::~GLCanvas3D()
 | 
			
		||||
| 
						 | 
				
			
			@ -1447,6 +1449,12 @@ GLCanvas3D::~GLCanvas3D()
 | 
			
		|||
        m_timer = nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (m_context != nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        delete m_context;
 | 
			
		||||
        m_context = nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _deregister_callbacks();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1455,6 +1463,9 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl)
 | 
			
		|||
    if (m_initialized)
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
    if ((m_canvas == nullptr) || (m_context == nullptr))
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    ::glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
 | 
			
		||||
    ::glClearDepth(1.0f);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1520,19 +1531,14 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl)
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GLCanvas3D::set_current(bool force)
 | 
			
		||||
bool GLCanvas3D::set_current()
 | 
			
		||||
{
 | 
			
		||||
    if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr))
 | 
			
		||||
    if ((m_canvas != nullptr) && (m_context != nullptr))
 | 
			
		||||
        return m_canvas->SetCurrent(*m_context);
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLCanvas3D::set_active(bool active)
 | 
			
		||||
{
 | 
			
		||||
    m_active = active;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLCanvas3D::set_as_dirty()
 | 
			
		||||
{
 | 
			
		||||
    m_dirty = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -1549,7 +1555,7 @@ void GLCanvas3D::reset_volumes()
 | 
			
		|||
    if (!m_volumes.empty())
 | 
			
		||||
    {
 | 
			
		||||
        // ensures this canvas is current
 | 
			
		||||
        if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true))
 | 
			
		||||
        if (!set_current())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        m_volumes.release_geometry();
 | 
			
		||||
| 
						 | 
				
			
			@ -1655,6 +1661,8 @@ void GLCanvas3D::set_bed_shape(const Pointfs& shape)
 | 
			
		|||
    // Set the origin and size for painting of the coordinate system axes.
 | 
			
		||||
    m_axes.origin = Pointf3(0.0, 0.0, (coordf_t)GROUND_Z);
 | 
			
		||||
    set_axes_length(0.3f * (float)m_bed.get_bounding_box().max_size());
 | 
			
		||||
 | 
			
		||||
    m_dirty = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLCanvas3D::set_auto_bed_shape()
 | 
			
		||||
| 
						 | 
				
			
			@ -1850,7 +1858,7 @@ void GLCanvas3D::render()
 | 
			
		|||
        return;
 | 
			
		||||
 | 
			
		||||
    // ensures this canvas is current and initialized
 | 
			
		||||
    if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas))
 | 
			
		||||
    if (!set_current() || !_3DScene::init(m_canvas))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (m_force_zoom_to_bed_enabled)
 | 
			
		||||
| 
						 | 
				
			
			@ -1933,7 +1941,7 @@ void GLCanvas3D::reload_scene(bool force)
 | 
			
		|||
    reset_volumes();
 | 
			
		||||
 | 
			
		||||
    // ensures this canvas is current
 | 
			
		||||
    if (!_3DScene::set_current(m_canvas, true))
 | 
			
		||||
    if (!set_current())
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
 | 
			
		||||
| 
						 | 
				
			
			@ -2008,7 +2016,7 @@ void GLCanvas3D::reload_scene(bool force)
 | 
			
		|||
void GLCanvas3D::load_print_toolpaths()
 | 
			
		||||
{
 | 
			
		||||
    // ensures this canvas is current
 | 
			
		||||
    if (!_3DScene::set_current(m_canvas, true))
 | 
			
		||||
    if (!set_current())
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (m_print == nullptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -2376,7 +2384,7 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const
 | 
			
		|||
    if ((m_canvas != nullptr) && (m_print != nullptr))
 | 
			
		||||
    {
 | 
			
		||||
        // ensures that this canvas is current
 | 
			
		||||
        if (!_3DScene::set_current(m_canvas, true))
 | 
			
		||||
        if (!set_current())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (m_volumes.empty())
 | 
			
		||||
| 
						 | 
				
			
			@ -2693,11 +2701,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
			
		|||
#endif
 | 
			
		||||
    } 
 | 
			
		||||
    else if (evt.LeftDClick() && (m_hover_volume_id != -1))
 | 
			
		||||
    {
 | 
			
		||||
        m_active = false;
 | 
			
		||||
        m_on_double_click_callback.call();
 | 
			
		||||
        m_active = true;
 | 
			
		||||
    }
 | 
			
		||||
    else if (evt.LeftDown() || evt.RightDown())
 | 
			
		||||
    {
 | 
			
		||||
        // If user pressed left or right button we first check whether this happened
 | 
			
		||||
| 
						 | 
				
			
			@ -2793,11 +2797,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
 | 
			
		|||
                {
 | 
			
		||||
                    // if right clicking on volume, propagate event through callback
 | 
			
		||||
                    if (m_volumes.volumes[volume_idx]->hover)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_active = false;
 | 
			
		||||
                        m_on_right_click_callback.call(pos.x, pos.y);
 | 
			
		||||
                        m_active = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -3004,7 +3004,7 @@ Point GLCanvas3D::get_local_mouse_position() const
 | 
			
		|||
 | 
			
		||||
bool GLCanvas3D::_is_shown_on_screen() const
 | 
			
		||||
{
 | 
			
		||||
    return (m_canvas != nullptr) ? m_active && m_canvas->IsShownOnScreen() : false;
 | 
			
		||||
    return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLCanvas3D::_force_zoom_to_bed()
 | 
			
		||||
| 
						 | 
				
			
			@ -3019,7 +3019,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h)
 | 
			
		|||
        return;
 | 
			
		||||
 | 
			
		||||
    // ensures that this canvas is current
 | 
			
		||||
    _3DScene::set_current(m_canvas, false);
 | 
			
		||||
    set_current();
 | 
			
		||||
    ::glViewport(0, 0, w, h);
 | 
			
		||||
 | 
			
		||||
    ::glMatrixMode(GL_PROJECTION);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -401,9 +401,6 @@ private:
 | 
			
		|||
    Model* m_model;
 | 
			
		||||
 | 
			
		||||
    bool m_dirty;
 | 
			
		||||
    // the active member has been introduced to overcome a bug in wxWidgets method IsShownOnScreen() which always return true
 | 
			
		||||
    // when a window is inside a wxNotebook
 | 
			
		||||
    bool m_active;
 | 
			
		||||
    bool m_initialized;
 | 
			
		||||
    bool m_use_VBOs;
 | 
			
		||||
    bool m_force_zoom_to_bed_enabled;
 | 
			
		||||
| 
						 | 
				
			
			@ -444,14 +441,13 @@ private:
 | 
			
		|||
    PerlCallback m_on_gizmo_scale_uniformly_callback;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context);
 | 
			
		||||
    GLCanvas3D(wxGLCanvas* canvas);
 | 
			
		||||
    ~GLCanvas3D();
 | 
			
		||||
 | 
			
		||||
    bool init(bool useVBOs, bool use_legacy_opengl);
 | 
			
		||||
 | 
			
		||||
    bool set_current(bool force);
 | 
			
		||||
    bool set_current();
 | 
			
		||||
 | 
			
		||||
    void set_active(bool active);
 | 
			
		||||
    void set_as_dirty();
 | 
			
		||||
 | 
			
		||||
    unsigned int get_volumes_count() const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -114,20 +114,13 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
GLCanvas3DManager::GLCanvas3DManager()
 | 
			
		||||
    : m_context(nullptr)
 | 
			
		||||
    , m_current(nullptr)
 | 
			
		||||
    : m_current(nullptr)
 | 
			
		||||
    , m_gl_initialized(false)
 | 
			
		||||
    , m_use_legacy_opengl(false)
 | 
			
		||||
    , m_use_VBOs(false)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLCanvas3DManager::~GLCanvas3DManager()
 | 
			
		||||
{
 | 
			
		||||
    if (m_context != nullptr)
 | 
			
		||||
        delete m_context;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GLCanvas3DManager::add(wxGLCanvas* canvas)
 | 
			
		||||
{
 | 
			
		||||
    if (canvas == nullptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -136,14 +129,7 @@ bool GLCanvas3DManager::add(wxGLCanvas* canvas)
 | 
			
		|||
    if (_get_canvas(canvas) != m_canvases.end())
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    if (m_context == nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        m_context = new wxGLContext(canvas);
 | 
			
		||||
        if (m_context == nullptr)
 | 
			
		||||
            return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    GLCanvas3D* canvas3D = new GLCanvas3D(canvas, m_context);
 | 
			
		||||
    GLCanvas3D* canvas3D = new GLCanvas3D(canvas);
 | 
			
		||||
    if (canvas3D == nullptr)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -213,41 +199,6 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
 | 
			
		|||
        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)
 | 
			
		||||
{
 | 
			
		||||
    CanvasesMap::iterator it = _get_canvas(canvas);
 | 
			
		||||
    if (it != m_canvases.end())
 | 
			
		||||
        it->second->set_active(active);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLCanvas3DManager::set_as_dirty(wxGLCanvas* canvas)
 | 
			
		||||
{
 | 
			
		||||
    CanvasesMap::iterator it = _get_canvas(canvas);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,6 @@ class GLCanvas3DManager
 | 
			
		|||
 | 
			
		||||
    typedef std::map<wxGLCanvas*, GLCanvas3D*> CanvasesMap;
 | 
			
		||||
 | 
			
		||||
    wxGLContext* m_context;
 | 
			
		||||
    CanvasesMap m_canvases;
 | 
			
		||||
    wxGLCanvas* m_current;
 | 
			
		||||
    GLInfo m_gl_info;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +52,6 @@ class GLCanvas3DManager
 | 
			
		|||
 | 
			
		||||
public:
 | 
			
		||||
    GLCanvas3DManager();
 | 
			
		||||
    ~GLCanvas3DManager();
 | 
			
		||||
 | 
			
		||||
    bool add(wxGLCanvas* canvas);
 | 
			
		||||
    bool remove(wxGLCanvas* canvas);
 | 
			
		||||
| 
						 | 
				
			
			@ -70,8 +68,6 @@ public:
 | 
			
		|||
 | 
			
		||||
    bool init(wxGLCanvas* canvas);
 | 
			
		||||
 | 
			
		||||
    bool set_current(wxGLCanvas* canvas, bool force);
 | 
			
		||||
    void set_active(wxGLCanvas* canvas, bool active);
 | 
			
		||||
    void set_as_dirty(wxGLCanvas* canvas);
 | 
			
		||||
 | 
			
		||||
    unsigned int get_volumes_count(wxGLCanvas* canvas) const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,18 +190,6 @@ remove_all_canvases()
 | 
			
		|||
    CODE:
 | 
			
		||||
        _3DScene::remove_all_canvases();
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
reset_current_canvas()
 | 
			
		||||
    CODE:
 | 
			
		||||
        _3DScene::reset_current_canvas();
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
set_active(canvas, active)
 | 
			
		||||
        SV   *canvas;
 | 
			
		||||
        bool active;
 | 
			
		||||
    CODE:
 | 
			
		||||
        _3DScene::set_active((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), active);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
set_as_dirty(canvas)
 | 
			
		||||
        SV *canvas;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue