3rd attempt to fix opengl on ubuntu

This commit is contained in:
Enrico Turri 2018-06-27 12:36:49 +02:00
parent 23d10fdadc
commit 8db4fdc24c
8 changed files with 58 additions and 45 deletions

View File

@ -186,7 +186,9 @@ sub new {
# Initialize 3D toolpaths preview # Initialize 3D toolpaths preview
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::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'));
@ -202,21 +204,25 @@ 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}) && ($preview != $self->{canvas3D})) { 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::set_active($self->{preview3D}->canvas, 0);
# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
# Slic3r::GUI::_3DScene::reset_current_canvas(); # Slic3r::GUI::_3DScene::reset_current_canvas();
#================================================================================================================== #==================================================================================================================
$preview->OnActivate if $preview->can('OnActivate'); $preview->OnActivate if $preview->can('OnActivate');
} elsif ($preview == $self->{preview3D}) { } elsif ($preview == $self->{preview3D}) {
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1); #==================================================================================================================
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); # Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1);
# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0);
#==================================================================================================================
$self->{preview3D}->load_print; $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) # 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);
} elsif ($preview == $self->{canvas3D}) { } elsif ($preview == $self->{canvas3D}) {
Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1); #==================================================================================================================
Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); # 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})) { if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) {
my $selections = $self->collect_selections; my $selections = $self->collect_selections;
Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections); Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections);

View File

@ -1764,13 +1764,13 @@ bool _3DScene::init(wxGLCanvas* canvas)
//{ //{
// s_canvas_mgr.set_current(nullptr, false); // 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_active(wxGLCanvas* canvas, bool active)
{
s_canvas_mgr.set_active(canvas, active);
}
void _3DScene::set_as_dirty(wxGLCanvas* canvas) void _3DScene::set_as_dirty(wxGLCanvas* canvas)
{ {
s_canvas_mgr.set_as_dirty(canvas); s_canvas_mgr.set_as_dirty(canvas);

View File

@ -519,9 +519,9 @@ public:
//################################################################################################################# //#################################################################################################################
// static bool set_current(wxGLCanvas* canvas, bool force); // static bool set_current(wxGLCanvas* canvas, bool force);
// static void reset_current_canvas(); // 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);
static unsigned int get_volumes_count(wxGLCanvas* canvas); static unsigned int get_volumes_count(wxGLCanvas* canvas);

View File

@ -1422,7 +1422,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
, m_print(nullptr) , m_print(nullptr)
, m_model(nullptr) , m_model(nullptr)
, m_dirty(true) , m_dirty(true)
, m_active(true) //#################################################################################################################
// , m_active(true)
//#################################################################################################################
, m_initialized(false) , m_initialized(false)
, m_use_VBOs(false) , m_use_VBOs(false)
, m_force_zoom_to_bed_enabled(false) , m_force_zoom_to_bed_enabled(false)
@ -1552,10 +1554,8 @@ bool GLCanvas3D::set_current()
{ {
if ((m_canvas != nullptr) && (m_context != nullptr)) if ((m_canvas != nullptr) && (m_context != nullptr))
// if (m_active && (m_canvas != nullptr) && (m_context != nullptr)) // if (m_active && (m_canvas != nullptr) && (m_context != nullptr))
{
// std::cout << "set_current: " << (void*)m_canvas << " - " << (void*)m_context << std::endl;
return m_canvas->SetCurrent(*m_context); return m_canvas->SetCurrent(*m_context);
}
return false; return false;
} }
@ -1568,10 +1568,12 @@ bool GLCanvas3D::set_current()
//} //}
//################################################################################################################# //#################################################################################################################
void GLCanvas3D::set_active(bool active) //#################################################################################################################
{ //void GLCanvas3D::set_active(bool active)
m_active = active; //{
} // m_active = active;
//}
//#################################################################################################################
void GLCanvas3D::set_as_dirty() void GLCanvas3D::set_as_dirty()
{ {
@ -2753,9 +2755,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
} }
else if (evt.LeftDClick() && (m_hover_volume_id != -1)) else if (evt.LeftDClick() && (m_hover_volume_id != -1))
{ {
m_active = false; //#################################################################################################################
// m_active = false;
//#################################################################################################################
m_on_double_click_callback.call(); m_on_double_click_callback.call();
m_active = true; //#################################################################################################################
// m_active = true;
//#################################################################################################################
} }
else if (evt.LeftDown() || evt.RightDown()) else if (evt.LeftDown() || evt.RightDown())
{ {
@ -2853,9 +2859,13 @@ 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_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; //#################################################################################################################
// m_active = true;
//#################################################################################################################
} }
} }
} }

View File

@ -401,9 +401,11 @@ private:
Model* m_model; Model* m_model;
bool m_dirty; 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 // // the active member has been introduced to overcome a bug in wxWidgets method IsShownOnScreen() which always return true
bool m_active; // // when a window is inside a wxNotebook
// bool m_active;
//#################################################################################################################
bool m_initialized; bool m_initialized;
bool m_use_VBOs; bool m_use_VBOs;
bool m_force_zoom_to_bed_enabled; bool m_force_zoom_to_bed_enabled;
@ -457,7 +459,9 @@ public:
// bool set_current(bool force); // bool set_current(bool force);
//################################################################################################################# //#################################################################################################################
void set_active(bool active); //#################################################################################################################
// void set_active(bool active);
//#################################################################################################################
void set_as_dirty(); void set_as_dirty();
unsigned int get_volumes_count() const; unsigned int get_volumes_count() const;

View File

@ -251,15 +251,15 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
// m_current = nullptr; // m_current = nullptr;
// return false; // 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_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) void GLCanvas3DManager::set_as_dirty(wxGLCanvas* canvas)
{ {
CanvasesMap::iterator it = _get_canvas(canvas); CanvasesMap::iterator it = _get_canvas(canvas);

View File

@ -74,8 +74,8 @@ public:
//################################################################################################################# //#################################################################################################################
// bool set_current(wxGLCanvas* canvas, bool force); // 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);
unsigned int get_volumes_count(wxGLCanvas* canvas) const; unsigned int get_volumes_count(wxGLCanvas* canvas) const;

View File

@ -190,13 +190,6 @@ remove_all_canvases()
CODE: CODE:
_3DScene::remove_all_canvases(); _3DScene::remove_all_canvases();
void
set_active(canvas, active)
SV *canvas;
bool active;
CODE:
_3DScene::set_active((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), active);
void void
set_as_dirty(canvas) set_as_dirty(canvas)
SV *canvas; SV *canvas;