mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	OpenGL to c++ 1st installment - WIP
This commit is contained in:
		
							parent
							
								
									8eb9ddc2eb
								
							
						
					
					
						commit
						5024fc4be7
					
				
					 14 changed files with 1015 additions and 56 deletions
				
			
		|  | @ -16,7 +16,10 @@ use strict; | |||
| use warnings; | ||||
| 
 | ||||
| use Wx qw(wxTheApp :timer :bitmap :icon :dialog); | ||||
| use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_ERASE_BACKGROUND EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS EVT_CHAR EVT_TIMER); | ||||
| #============================================================================================================================== | ||||
| use Wx::Event qw(EVT_PAINT EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS EVT_CHAR EVT_TIMER); | ||||
| #use Wx::Event qw(EVT_PAINT EVT_SIZE EVT_ERASE_BACKGROUND EVT_IDLE EVT_MOUSEWHEEL EVT_MOUSE_EVENTS EVT_CHAR EVT_TIMER); | ||||
| #============================================================================================================================== | ||||
| # must load OpenGL *before* Wx::GLCanvas | ||||
| use OpenGL qw(:glconstants :glfunctions :glufunctions :gluconstants); | ||||
| use base qw(Wx::GLCanvas Class::Accessor); | ||||
|  | @ -30,7 +33,8 @@ use Slic3r::Geometry qw(PI); | |||
| # _dirty: boolean flag indicating, that the screen has to be redrawn on EVT_IDLE. | ||||
| # volumes: reference to vector of Slic3r::GUI::3DScene::Volume. | ||||
| # _camera_type: 'perspective' or 'ortho' | ||||
| __PACKAGE__->mk_accessors( qw(_quat _dirty init | ||||
| #============================================================================================================================== | ||||
| __PACKAGE__->mk_accessors( qw(_quat init | ||||
|                               enable_picking | ||||
|                               enable_moving | ||||
|                               use_plain_shader | ||||
|  | @ -73,6 +77,50 @@ __PACKAGE__->mk_accessors( qw(_quat _dirty init | |||
|                               _mouse_dragging | ||||
|                                                              | ||||
|                               ) ); | ||||
| #__PACKAGE__->mk_accessors( qw(_quat _dirty init | ||||
| #                              enable_picking | ||||
| #                              enable_moving | ||||
| #                              use_plain_shader | ||||
| #                              on_viewport_changed | ||||
| #                              on_hover | ||||
| #                              on_select | ||||
| #                              on_double_click | ||||
| #                              on_right_click | ||||
| #                              on_move | ||||
| #                              on_model_update | ||||
| #                              volumes | ||||
| #                              _sphi _stheta | ||||
| #                              cutting_plane_z | ||||
| #                              cut_lines_vertices | ||||
| #                              bed_shape | ||||
| #                              bed_triangles | ||||
| #                              bed_grid_lines | ||||
| #                              bed_polygon | ||||
| #                              background | ||||
| #                              origin | ||||
| #                              _mouse_pos | ||||
| #                              _hover_volume_idx | ||||
| # | ||||
| #                              _drag_volume_idx | ||||
| #                              _drag_start_pos | ||||
| #                              _drag_volume_center_offset | ||||
| #                              _drag_start_xy | ||||
| #                              _dragged | ||||
| # | ||||
| #                              _layer_height_edited | ||||
| # | ||||
| #                              _camera_type | ||||
| #                              _camera_target | ||||
| #                              _camera_distance | ||||
| #                              _zoom | ||||
| #                               | ||||
| #                              _legend_enabled | ||||
| #                              _warning_enabled | ||||
| #                              _apply_zoom_to_volumes_filter | ||||
| #                              _mouse_dragging | ||||
| #                                                             | ||||
| #                              ) ); | ||||
| #============================================================================================================================== | ||||
|                                | ||||
| use constant TRACKBALLSIZE  => 0.8; | ||||
| use constant TURNTABLE_MODE => 1; | ||||
|  | @ -130,13 +178,22 @@ sub new { | |||
|     # we request a depth buffer explicitely because it looks like it's not created by  | ||||
|     # default on Linux, causing transparency issues | ||||
|     my $self = $class->SUPER::new($parent, -1, Wx::wxDefaultPosition, Wx::wxDefaultSize, 0, "", $attrib); | ||||
|     if (Wx::wxVERSION >= 3.000003) { | ||||
|         # Wx 3.0.3 contains an ugly hack to support some advanced OpenGL attributes through the attribute list. | ||||
|         # The attribute list is transferred between the wxGLCanvas and wxGLContext constructors using a single static array s_wglContextAttribs. | ||||
|         # Immediatelly force creation of the OpenGL context to consume the static variable s_wglContextAttribs. | ||||
|         $self->GetContext(); | ||||
|     } | ||||
| #============================================================================================================================== | ||||
| #    if (Wx::wxVERSION >= 3.000003) { | ||||
| #        # Wx 3.0.3 contains an ugly hack to support some advanced OpenGL attributes through the attribute list. | ||||
| #        # The attribute list is transferred between the wxGLCanvas and wxGLContext constructors using a single static array s_wglContextAttribs. | ||||
| #        # Immediatelly force creation of the OpenGL context to consume the static variable s_wglContextAttribs. | ||||
| #        $self->GetContext(); | ||||
| #    } | ||||
| #============================================================================================================================== | ||||
| 
 | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::add_canvas($self, $self->GetContext); | ||||
| #    my $context = $self->GetContext; | ||||
| #    $self->SetCurrent($context); | ||||
| #    Slic3r::GUI::_3DScene::add_canvas($self, $context); | ||||
| #==============================================================================================================================     | ||||
|      | ||||
|     $self->{can_multisample} = $can_multisample; | ||||
|     $self->background(1); | ||||
|     $self->_quat((0, 0, 0, 1)); | ||||
|  | @ -171,10 +228,16 @@ sub new { | |||
|         my $dc = Wx::PaintDC->new($self); | ||||
|         $self->Render($dc); | ||||
|     }); | ||||
|     EVT_SIZE($self, sub { $self->_dirty(1) }); | ||||
| #=======================================================================================================================     | ||||
| #    EVT_SIZE($self, sub { $self->_dirty(1) }); | ||||
| #=======================================================================================================================     | ||||
|     EVT_IDLE($self, sub { | ||||
|         return unless $self->_dirty; | ||||
|         return if !$self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|         return unless Slic3r::GUI::_3DScene::is_dirty($self); | ||||
|         return unless Slic3r::GUI::_3DScene::is_shown_on_screen($self); | ||||
| #        return unless $self->_dirty; | ||||
| #        return if !$self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|         $self->Resize( $self->GetSizeWH ); | ||||
|         $self->Refresh; | ||||
|     }); | ||||
|  | @ -237,6 +300,9 @@ sub Destroy { | |||
|     my ($self) = @_; | ||||
|     $self->{layer_height_edit_timer}->Stop; | ||||
|     $self->DestroyGL; | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::remove_canvas($self);     | ||||
| #============================================================================================================================== | ||||
|     return $self->SUPER::Destroy; | ||||
| } | ||||
| 
 | ||||
|  | @ -621,7 +687,10 @@ sub mouse_wheel_event { | |||
| #    ) if 0; | ||||
| 
 | ||||
|     $self->on_viewport_changed->() if $self->on_viewport_changed; | ||||
|     $self->Resize($self->GetSizeWH) if $self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|     $self->Resize($self->GetSizeWH) if Slic3r::GUI::_3DScene::is_shown_on_screen($self); | ||||
| #    $self->Resize($self->GetSizeWH) if $self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|     $self->Refresh; | ||||
| } | ||||
| 
 | ||||
|  | @ -633,7 +702,10 @@ sub reset_objects { | |||
|         $self->volumes->release_geometry; | ||||
|     } | ||||
|     $self->volumes->erase; | ||||
|     $self->_dirty(1); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_dirty($self, 1); | ||||
| #    $self->_dirty(1); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| # Setup camera to view all objects. | ||||
|  | @ -645,7 +717,10 @@ sub set_viewport_from_scene { | |||
|     $self->_camera_target($scene->_camera_target); | ||||
|     $self->_zoom($scene->_zoom); | ||||
|     $self->_quat($scene->_quat); | ||||
|     $self->_dirty(1); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_dirty($self, 1); | ||||
| #    $self->_dirty(1); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| # Set the camera to a default orientation, | ||||
|  | @ -777,7 +852,10 @@ sub zoom_to_bounding_box { | |||
|         # center view around bounding box center | ||||
|         $self->_camera_target($bb->center); | ||||
|         $self->on_viewport_changed->() if $self->on_viewport_changed; | ||||
|         $self->Resize($self->GetSizeWH) if $self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|         $self->Resize($self->GetSizeWH) if Slic3r::GUI::_3DScene::is_shown_on_screen($self); | ||||
| #        $self->Resize($self->GetSizeWH) if $self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|         $self->Refresh; | ||||
|     } | ||||
| } | ||||
|  | @ -1071,38 +1149,46 @@ sub SetCurrent { | |||
| sub UseVBOs { | ||||
|     my ($self) = @_; | ||||
| 
 | ||||
|     if (! defined ($self->{use_VBOs})) { | ||||
|         my $use_legacy = wxTheApp->{app_config}->get('use_legacy_opengl'); | ||||
|         if ($use_legacy eq '1') { | ||||
|             # Disable OpenGL 2.0 rendering. | ||||
|             $self->{use_VBOs} = 0; | ||||
|             # Don't enable the layer editing tool. | ||||
|             $self->{layer_editing_enabled} = 0; | ||||
|             # 2 means failed | ||||
|             $self->{layer_editing_initialized} = 2; | ||||
|             return 0; | ||||
|         } | ||||
|         # This is a special path for wxWidgets on GTK, where an OpenGL context is initialized | ||||
|         # first when an OpenGL widget is shown for the first time. How ugly. | ||||
|         return 0 if (! $self->init && $^O eq 'linux'); | ||||
|         # Don't use VBOs if anything fails. | ||||
|         $self->{use_VBOs} = 0; | ||||
|         if ($self->GetContext) { | ||||
|             $self->SetCurrent($self->GetContext); | ||||
|             Slic3r::GUI::_3DScene::_glew_init; | ||||
|             my @gl_version = split(/\./, glGetString(GL_VERSION)); | ||||
|             $self->{use_VBOs} = int($gl_version[0]) >= 2; | ||||
|             # print "UseVBOs $self OpenGL major: $gl_version[0], minor: $gl_version[1]. Use VBOs: ", $self->{use_VBOs}, "\n"; | ||||
|         } | ||||
|     } | ||||
|     return $self->{use_VBOs}; | ||||
| #============================================================================================================================== | ||||
|     return 0 if (! $self->init && $^O eq 'linux'); | ||||
|     return Slic3r::GUI::_3DScene::use_VBOs(); | ||||
|          | ||||
| #    if (! defined ($self->{use_VBOs})) { | ||||
| #        my $use_legacy = wxTheApp->{app_config}->get('use_legacy_opengl'); | ||||
| #        if ($use_legacy eq '1') { | ||||
| #            # Disable OpenGL 2.0 rendering. | ||||
| #            $self->{use_VBOs} = 0; | ||||
| #            # Don't enable the layer editing tool. | ||||
| #            $self->{layer_editing_enabled} = 0; | ||||
| #            # 2 means failed | ||||
| #            $self->{layer_editing_initialized} = 2; | ||||
| #            return 0; | ||||
| #        } | ||||
| #        # This is a special path for wxWidgets on GTK, where an OpenGL context is initialized | ||||
| #        # first when an OpenGL widget is shown for the first time. How ugly. | ||||
| #        return 0 if (! $self->init && $^O eq 'linux'); | ||||
| #        # Don't use VBOs if anything fails. | ||||
| #        $self->{use_VBOs} = 0; | ||||
| #        if ($self->GetContext) { | ||||
| #            $self->SetCurrent($self->GetContext); | ||||
| #            Slic3r::GUI::_3DScene::_glew_init; | ||||
| #            my @gl_version = split(/\./, glGetString(GL_VERSION)); | ||||
| #            $self->{use_VBOs} = int($gl_version[0]) >= 2; | ||||
| #            # print "UseVBOs $self OpenGL major: $gl_version[0], minor: $gl_version[1]. Use VBOs: ", $self->{use_VBOs}, "\n"; | ||||
| #        } | ||||
| #    } | ||||
| #    return $self->{use_VBOs}; | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| sub Resize { | ||||
|     my ($self, $x, $y) = @_; | ||||
|   | ||||
|     return unless $self->GetContext; | ||||
|     $self->_dirty(0); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_dirty($self, 0); | ||||
| #    $self->_dirty(0); | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     $self->SetCurrent($self->GetContext); | ||||
|     glViewport(0, 0, $x, $y); | ||||
|  | @ -1148,13 +1234,17 @@ sub InitGL { | |||
|     return unless $self->GetContext; | ||||
|     $self->init(1); | ||||
| 
 | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::init_gl; | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     # This is a special path for wxWidgets on GTK, where an OpenGL context is initialized | ||||
|     # first when an OpenGL widget is shown for the first time. How ugly. | ||||
|     # In that case the volumes are wainting to be moved to Vertex Buffer Objects | ||||
|     # after the OpenGL context is being initialized. | ||||
|     $self->volumes->finalize_geometry(1)  | ||||
|         if ($^O eq 'linux' && $self->UseVBOs); | ||||
| 
 | ||||
|                  | ||||
|     $self->zoom_to_bed; | ||||
|          | ||||
|     glClearColor(0, 0, 0, 1); | ||||
|  | @ -1236,7 +1326,10 @@ sub Render { | |||
|     my ($self, $dc) = @_; | ||||
|      | ||||
|     # prevent calling SetCurrent() when window is not shown yet | ||||
|     return unless $self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|     return unless Slic3r::GUI::_3DScene::is_shown_on_screen($self); | ||||
| #    return unless $self->IsShownOnScreen; | ||||
| #============================================================================================================================== | ||||
|     return unless my $context = $self->GetContext; | ||||
|     $self->SetCurrent($context); | ||||
|     $self->InitGL; | ||||
|  |  | |||
|  | @ -28,9 +28,9 @@ our $PRESETS_CHANGED_EVENT = Wx::NewEventType; | |||
| 
 | ||||
| sub new { | ||||
|     my ($class, %params) = @_; | ||||
|      | ||||
|          | ||||
|     my $self = $class->SUPER::new(undef, -1, $Slic3r::FORK_NAME . ' - ' . $Slic3r::VERSION, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE); | ||||
|     Slic3r::GUI::set_main_frame($self); | ||||
|         Slic3r::GUI::set_main_frame($self); | ||||
|     if ($^O eq 'MSWin32') { | ||||
|         # Load the icon either from the exe, or from the ico file. | ||||
|         my $iconfile = Slic3r::decode_path($FindBin::Bin) . '\slic3r.exe'; | ||||
|  | @ -39,7 +39,7 @@ sub new { | |||
|     } else { | ||||
|         $self->SetIcon(Wx::Icon->new(Slic3r::var("Slic3r_128px.png"), wxBITMAP_TYPE_PNG));         | ||||
|     } | ||||
|      | ||||
|          | ||||
|     # store input params | ||||
|     # If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden. | ||||
|     $self->{no_controller} = $params{no_controller}; | ||||
|  | @ -47,7 +47,7 @@ sub new { | |||
|     $self->{loaded} = 0; | ||||
|     $self->{lang_ch_event} = $params{lang_ch_event}; | ||||
|     $self->{preferences_event} = $params{preferences_event}; | ||||
| 
 | ||||
|      | ||||
|     # initialize tabpanel and menubar | ||||
|     $self->_init_tabpanel; | ||||
|     $self->_init_menubar; | ||||
|  | @ -63,7 +63,7 @@ sub new { | |||
|     $self->SetStatusBar($self->{statusbar}); | ||||
|      | ||||
|     $self->{loaded} = 1; | ||||
|      | ||||
|          | ||||
|     # initialize layout | ||||
|     { | ||||
|         my $sizer = Wx::BoxSizer->new(wxVERTICAL); | ||||
|  | @ -90,6 +90,9 @@ sub new { | |||
|         # Save the slic3r.ini. Usually the ini file is saved from "on idle" callback, | ||||
|         # but in rare cases it may not have been called yet. | ||||
|         wxTheApp->{app_config}->save; | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::remove_all_canvases(); | ||||
| #============================================================================================================================== | ||||
|         # propagate event | ||||
|         $event->Skip; | ||||
|     }); | ||||
|  |  | |||
|  | @ -144,6 +144,9 @@ sub new { | |||
|         # Note that the window was already closed, so a pending update will not be executed. | ||||
|         $self->{already_closed} = 1; | ||||
|         $self->EndModal(wxID_OK); | ||||
| #=============================================================================================================================         | ||||
|         $self->{canvas}->Destroy; | ||||
| #=============================================================================================================================         | ||||
|         $self->Destroy(); | ||||
|     }); | ||||
| 
 | ||||
|  | @ -151,6 +154,9 @@ sub new { | |||
|         # Note that the window was already closed, so a pending update will not be executed. | ||||
|         $self->{already_closed} = 1; | ||||
|         $self->EndModal(wxID_CANCEL); | ||||
| #=============================================================================================================================         | ||||
|         $self->{canvas}->Destroy; | ||||
| #=============================================================================================================================         | ||||
|         $self->Destroy(); | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -511,6 +511,13 @@ sub CanClose { | |||
|     return ! Slic3r::GUI::catch_error($self); | ||||
| } | ||||
| 
 | ||||
| #=============================================================================================================================         | ||||
| sub Destroy { | ||||
|     my ($self) = @_; | ||||
|     $self->{canvas}->Destroy if ($self->{canvas}); | ||||
| } | ||||
| #=============================================================================================================================         | ||||
| 
 | ||||
| sub PartsChanged { | ||||
|     my ($self) = @_; | ||||
|     return $self->{parts_changed}; | ||||
|  |  | |||
|  | @ -36,6 +36,9 @@ sub new { | |||
|         wxTheApp->save_window_pos($self, "object_settings"); | ||||
|          | ||||
|         $self->EndModal(wxID_OK); | ||||
| #=============================================================================================================================         | ||||
|         $self->{parts}->Destroy; | ||||
| #=============================================================================================================================         | ||||
|         $self->Destroy; | ||||
|     }); | ||||
|      | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri