mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	Camera data moved to c++ - WIP
This commit is contained in:
		
							parent
							
								
									32063cbe23
								
							
						
					
					
						commit
						1fd59144c7
					
				
					 8 changed files with 190 additions and 50 deletions
				
			
		|  | @ -46,7 +46,6 @@ __PACKAGE__->mk_accessors( qw(_quat init | |||
|                               on_move | ||||
|                               on_model_update | ||||
|                               volumes | ||||
|                               _sphi _stheta | ||||
|                               cutting_plane_z | ||||
|                               cut_lines_vertices | ||||
|                               bed_shape | ||||
|  | @ -66,11 +65,6 @@ __PACKAGE__->mk_accessors( qw(_quat init | |||
| 
 | ||||
|                               _layer_height_edited | ||||
| 
 | ||||
|                               _camera_type | ||||
|                               _camera_target | ||||
|                               _camera_distance | ||||
|                               _zoom | ||||
|                                | ||||
|                               _legend_enabled | ||||
|                               _warning_enabled | ||||
|                               _apply_zoom_to_volumes_filter | ||||
|  | @ -197,9 +191,15 @@ sub new { | |||
|     $self->{can_multisample} = $can_multisample; | ||||
|     $self->background(1); | ||||
|     $self->_quat((0, 0, 0, 1)); | ||||
|     $self->_stheta(45); | ||||
|     $self->_sphi(45); | ||||
|     $self->_zoom(1); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_camera_theta($self, 45.0); | ||||
|     Slic3r::GUI::_3DScene::set_camera_phi($self, 45.0); | ||||
|     Slic3r::GUI::_3DScene::set_camera_zoom($self, 1.0); | ||||
| 
 | ||||
| #    $self->_stheta(45); | ||||
| #    $self->_sphi(45); | ||||
| #    $self->_zoom(1); | ||||
| #============================================================================================================================== | ||||
|     $self->_legend_enabled(0); | ||||
|     $self->_warning_enabled(0); | ||||
|     $self->use_plain_shader(0); | ||||
|  | @ -210,10 +210,16 @@ sub new { | |||
|     $self->volumes(Slic3r::GUI::_3DScene::GLVolume::Collection->new); | ||||
| 
 | ||||
|     # 3D point in model space | ||||
|     $self->_camera_type('ortho'); | ||||
| #    $self->_camera_type('perspective'); | ||||
|     $self->_camera_target(Slic3r::Pointf3->new(0,0,0)); | ||||
|     $self->_camera_distance(0.); | ||||
| #============================================================================================================================== | ||||
| #    $self->_camera_type('ortho'); | ||||
| ##    $self->_camera_type('perspective'); | ||||
| #============================================================================================================================== | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_camera_target($self, Slic3r::Pointf3->new(0,0,0)); | ||||
|     Slic3r::GUI::_3DScene::set_camera_distance($self, 0.0); | ||||
| #    $self->_camera_target(Slic3r::Pointf3->new(0,0,0)); | ||||
| #    $self->_camera_distance(0.); | ||||
| #============================================================================================================================== | ||||
| 
 | ||||
|     $self->layer_editing_enabled(0); | ||||
|     $self->{layer_height_edit_band_width} = 2.; | ||||
|  | @ -383,7 +389,11 @@ sub _variable_layer_thickness_bar_rect_screen { | |||
| sub _variable_layer_thickness_bar_rect_viewport { | ||||
|     my ($self) = @_; | ||||
|     my ($cw, $ch) = $self->GetSizeWH; | ||||
|     return ((0.5*$cw-VARIABLE_LAYER_THICKNESS_BAR_WIDTH)/$self->_zoom, (-0.5*$ch+VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT)/$self->_zoom, $cw/(2*$self->_zoom), $ch/(2*$self->_zoom)); | ||||
| #============================================================================================================================== | ||||
|     my $zoom = Slic3r::GUI::_3DScene::get_camera_zoom($self); | ||||
|     return ((0.5*$cw-VARIABLE_LAYER_THICKNESS_BAR_WIDTH)/$zoom, (-0.5*$ch+VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT)/$zoom, $cw/(2*$zoom), $ch/(2*$zoom)); | ||||
| #    return ((0.5*$cw-VARIABLE_LAYER_THICKNESS_BAR_WIDTH)/$self->_zoom, (-0.5*$ch+VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT)/$self->_zoom, $cw/(2*$self->_zoom), $ch/(2*$self->_zoom)); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| # Returns an array with (left, top, right, bottom) of the variable layer thickness bar on the screen. | ||||
|  | @ -396,7 +406,11 @@ sub _variable_layer_thickness_reset_rect_screen { | |||
| sub _variable_layer_thickness_reset_rect_viewport { | ||||
|     my ($self) = @_; | ||||
|     my ($cw, $ch) = $self->GetSizeWH; | ||||
|     return ((0.5*$cw-VARIABLE_LAYER_THICKNESS_BAR_WIDTH)/$self->_zoom, -$ch/(2*$self->_zoom), $cw/(2*$self->_zoom), (-0.5*$ch+VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT)/$self->_zoom); | ||||
| #============================================================================================================================== | ||||
|     my $zoom = Slic3r::GUI::_3DScene::get_camera_zoom($self); | ||||
|     return ((0.5*$cw-VARIABLE_LAYER_THICKNESS_BAR_WIDTH)/$zoom, -$ch/(2*$zoom), $cw/(2*$zoom), (-0.5*$ch+VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT)/$zoom); | ||||
| #    return ((0.5*$cw-VARIABLE_LAYER_THICKNESS_BAR_WIDTH)/$self->_zoom, -$ch/(2*$self->_zoom), $cw/(2*$self->_zoom), (-0.5*$ch+VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT)/$self->_zoom); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| sub _variable_layer_thickness_bar_rect_mouse_inside { | ||||
|  | @ -570,10 +584,17 @@ sub mouse_event { | |||
|                 my $orig = $self->_drag_start_pos; | ||||
|                 if (TURNTABLE_MODE) { | ||||
|                     # Turntable mode is enabled by default. | ||||
|                     $self->_sphi($self->_sphi + ($pos->x - $orig->x) * TRACKBALLSIZE); | ||||
|                     $self->_stheta($self->_stheta - ($pos->y - $orig->y) * TRACKBALLSIZE);        #- | ||||
|                     $self->_stheta(GIMBALL_LOCK_THETA_MAX) if $self->_stheta > GIMBALL_LOCK_THETA_MAX; | ||||
|                     $self->_stheta(0) if $self->_stheta < 0; | ||||
| #============================================================================================================================== | ||||
|                     Slic3r::GUI::_3DScene::set_camera_phi($self, Slic3r::GUI::_3DScene::get_camera_phi($self) + ($pos->x - $orig->x) * TRACKBALLSIZE); | ||||
|                     Slic3r::GUI::_3DScene::set_camera_theta($self, Slic3r::GUI::_3DScene::get_camera_theta($self) - ($pos->y - $orig->y) * TRACKBALLSIZE); | ||||
|                     Slic3r::GUI::_3DScene::set_camera_theta($self, GIMBALL_LOCK_THETA_MAX) if Slic3r::GUI::_3DScene::get_camera_theta($self) > GIMBALL_LOCK_THETA_MAX; | ||||
|                     Slic3r::GUI::_3DScene::set_camera_theta($self, 0) if Slic3r::GUI::_3DScene::get_camera_theta($self) < 0; | ||||
|                                         | ||||
| #                    $self->_sphi($self->_sphi + ($pos->x - $orig->x) * TRACKBALLSIZE); | ||||
| #                    $self->_stheta($self->_stheta - ($pos->y - $orig->y) * TRACKBALLSIZE);        #- | ||||
| #                    $self->_stheta(GIMBALL_LOCK_THETA_MAX) if $self->_stheta > GIMBALL_LOCK_THETA_MAX; | ||||
| #                    $self->_stheta(0) if $self->_stheta < 0; | ||||
| #============================================================================================================================== | ||||
|                 } else { | ||||
|                     my $size = $self->GetClientSize; | ||||
|                     my @quat = trackball( | ||||
|  | @ -595,7 +616,12 @@ sub mouse_event { | |||
|                 # get point in model space at Z = 0 | ||||
|                 my $cur_pos = $self->mouse_to_3d($e->GetX, $e->GetY, 0); | ||||
|                 my $orig    = $self->mouse_to_3d($self->_drag_start_xy->x, $self->_drag_start_xy->y, 0); | ||||
|                 $self->_camera_target->translate(@{$orig->vector_to($cur_pos)->negative}); | ||||
| #============================================================================================================================== | ||||
|                 my $camera_target = Slic3r::GUI::_3DScene::get_camera_target($self); | ||||
|                 $camera_target->translate(@{$orig->vector_to($cur_pos)->negative}); | ||||
|                 Slic3r::GUI::_3DScene::set_camera_target($self, $camera_target); | ||||
| #                $self->_camera_target->translate(@{$orig->vector_to($cur_pos)->negative}); | ||||
| #============================================================================================================================== | ||||
|                 $self->on_viewport_changed->() if $self->on_viewport_changed; | ||||
|                 $self->Refresh; | ||||
|                 $self->Update; | ||||
|  | @ -662,12 +688,18 @@ sub mouse_wheel_event { | |||
|     my $zoom = $e->GetWheelRotation() / $e->GetWheelDelta(); | ||||
|     $zoom = max(min($zoom, 4), -4); | ||||
|     $zoom /= 10; | ||||
|     $zoom = $self->_zoom / (1-$zoom); | ||||
| #============================================================================================================================== | ||||
|     $zoom = Slic3r::GUI::_3DScene::get_camera_zoom($self) / (1-$zoom); | ||||
| #    $zoom = $self->_zoom / (1-$zoom); | ||||
| #============================================================================================================================== | ||||
|     # Don't allow to zoom too far outside the scene. | ||||
|     my $zoom_min = $self->get_zoom_to_bounding_box_factor($self->max_bounding_box); | ||||
|     $zoom_min *= 0.4 if defined $zoom_min; | ||||
|     $zoom = $zoom_min if defined $zoom_min && $zoom < $zoom_min; | ||||
|     $self->_zoom($zoom); | ||||
| #============================================================================================================================== | ||||
|     $zoom = Slic3r::GUI::_3DScene::set_camera_zoom($self, $zoom); | ||||
| #    $self->_zoom($zoom); | ||||
| #============================================================================================================================== | ||||
|      | ||||
| #    # In order to zoom around the mouse point we need to translate | ||||
| #    # the camera target | ||||
|  | @ -712,10 +744,17 @@ sub reset_objects { | |||
| sub set_viewport_from_scene { | ||||
|     my ($self, $scene) = @_; | ||||
|      | ||||
|     $self->_sphi($scene->_sphi); | ||||
|     $self->_stheta($scene->_stheta); | ||||
|     $self->_camera_target($scene->_camera_target); | ||||
|     $self->_zoom($scene->_zoom); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_camera_phi($self, Slic3r::GUI::_3DScene::get_camera_phi($scene)); | ||||
|     Slic3r::GUI::_3DScene::set_camera_theta($self, Slic3r::GUI::_3DScene::get_camera_theta($scene)); | ||||
|     Slic3r::GUI::_3DScene::set_camera_target($self, Slic3r::GUI::_3DScene::get_camera_target($scene)); | ||||
|     Slic3r::GUI::_3DScene::set_camera_zoom($self, Slic3r::GUI::_3DScene::get_camera_zoom($scene)); | ||||
|      | ||||
| #    $self->_sphi($scene->_sphi); | ||||
| #    $self->_stheta($scene->_stheta); | ||||
| #    $self->_camera_target($scene->_camera_target); | ||||
| #    $self->_zoom($scene->_zoom); | ||||
| #============================================================================================================================== | ||||
|     $self->_quat($scene->_quat); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_dirty($self, 1); | ||||
|  | @ -749,11 +788,19 @@ sub select_view { | |||
|     } | ||||
|     my $bb = $self->volumes_bounding_box; | ||||
|     if (! $bb->empty) { | ||||
|         $self->_sphi($dirvec->[0]); | ||||
|         $self->_stheta($dirvec->[1]); | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::set_camera_phi($self, $dirvec->[0]); | ||||
|         Slic3r::GUI::_3DScene::set_camera_theta($self, $dirvec->[1]); | ||||
|         # Avoid gimball lock. | ||||
|         $self->_stheta(GIMBALL_LOCK_THETA_MAX) if $self->_stheta > GIMBALL_LOCK_THETA_MAX; | ||||
|         $self->_stheta(0) if $self->_stheta < 0; | ||||
|         Slic3r::GUI::_3DScene::set_camera_theta($self, GIMBALL_LOCK_THETA_MAX) if Slic3r::GUI::_3DScene::get_camera_theta($self) > GIMBALL_LOCK_THETA_MAX; | ||||
|         Slic3r::GUI::_3DScene::set_camera_theta($self, 0) if Slic3r::GUI::_3DScene::get_camera_theta($self) < 0; | ||||
|          | ||||
| #        $self->_sphi($dirvec->[0]); | ||||
| #        $self->_stheta($dirvec->[1]); | ||||
| #        # Avoid gimball lock. | ||||
| #        $self->_stheta(GIMBALL_LOCK_THETA_MAX) if $self->_stheta > GIMBALL_LOCK_THETA_MAX; | ||||
| #        $self->_stheta(0) if $self->_stheta < 0; | ||||
| #============================================================================================================================== | ||||
|         # View everything. | ||||
|         $self->zoom_to_bounding_box($bb); | ||||
|         $self->on_viewport_changed->() if $self->on_viewport_changed; | ||||
|  | @ -775,22 +822,35 @@ sub get_zoom_to_bounding_box_factor { | |||
| 
 | ||||
|     if (!TURNTABLE_MODE) { | ||||
|         # Shift the perspective camera. | ||||
|         my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance); | ||||
| #============================================================================================================================== | ||||
|         my $camera_pos = Slic3r::Pointf3->new(0,0,-Slic3r::GUI::_3DScene::get_camera_distance($self)); | ||||
| #        my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance); | ||||
| #============================================================================================================================== | ||||
|         glTranslatef(@$camera_pos); | ||||
|     } | ||||
|      | ||||
|     if (TURNTABLE_MODE) { | ||||
|         # Turntable mode is enabled by default. | ||||
|         glRotatef(-$self->_stheta, 1, 0, 0); # pitch | ||||
|         glRotatef($self->_sphi, 0, 0, 1);    # yaw | ||||
| #==============================================================================================================================         | ||||
|         glRotatef(-Slic3r::GUI::_3DScene::get_camera_theta($self), 1, 0, 0); # pitch | ||||
|         glRotatef(Slic3r::GUI::_3DScene::get_camera_phi($self), 0, 0, 1);    # yaw | ||||
| #        glRotatef(-$self->_stheta, 1, 0, 0); # pitch | ||||
| #        glRotatef($self->_sphi, 0, 0, 1);    # yaw | ||||
| #============================================================================================================================== | ||||
|     } else { | ||||
|         # Shift the perspective camera. | ||||
|         my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance); | ||||
| #============================================================================================================================== | ||||
|         my $camera_pos = Slic3r::Pointf3->new(0,0,-Slic3r::GUI::_3DScene::get_camera_distance($self)); | ||||
| #        my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance); | ||||
| #============================================================================================================================== | ||||
|         glTranslatef(@$camera_pos); | ||||
|         my @rotmat = quat_to_rotmatrix($self->quat); | ||||
|         glMultMatrixd_p(@rotmat[0..15]); | ||||
|     }     | ||||
|     glTranslatef(@{ $self->_camera_target->negative }); | ||||
| #============================================================================================================================== | ||||
|     glTranslatef(@{ Slic3r::GUI::_3DScene::get_camera_target($self)->negative }); | ||||
| #    glTranslatef(@{ $self->_camera_target->negative }); | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     # get the view matrix back from opengl | ||||
|     my @matrix = glGetFloatv_p(GL_MODELVIEW_MATRIX); | ||||
|  | @ -848,9 +908,15 @@ sub zoom_to_bounding_box { | |||
|     # Calculate the zoom factor needed to adjust viewport to bounding box. | ||||
|     my $zoom = $self->get_zoom_to_bounding_box_factor($bb); | ||||
|     if (defined $zoom) { | ||||
|         $self->_zoom($zoom); | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::set_camera_zoom($self, $zoom); | ||||
| #        $self->_zoom($zoom); | ||||
| #============================================================================================================================== | ||||
|         # center view around bounding box center | ||||
|         $self->_camera_target($bb->center); | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::set_camera_target($self, $bb->center); | ||||
| #        $self->_camera_target($bb->center); | ||||
| #============================================================================================================================== | ||||
|         $self->on_viewport_changed->() if $self->on_viewport_changed; | ||||
| #============================================================================================================================== | ||||
|         $self->Resize($self->GetSizeWH) if Slic3r::GUI::_3DScene::is_shown_on_screen($self); | ||||
|  | @ -1193,12 +1259,21 @@ sub Resize { | |||
|     $self->SetCurrent($self->GetContext); | ||||
|     glViewport(0, 0, $x, $y); | ||||
|   | ||||
|     $x /= $self->_zoom; | ||||
|     $y /= $self->_zoom; | ||||
| #============================================================================================================================== | ||||
|     my $zoom = Slic3r::GUI::_3DScene::get_camera_zoom($self); | ||||
|     $x /= $zoom; | ||||
|     $y /= $zoom; | ||||
| #    $x /= $self->_zoom; | ||||
| #    $y /= $self->_zoom; | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     glMatrixMode(GL_PROJECTION); | ||||
|     glLoadIdentity(); | ||||
|     if ($self->_camera_type eq 'ortho') { | ||||
| #============================================================================================================================== | ||||
|     my $camera_type = Slic3r::GUI::_3DScene::get_camera_type_as_string($self); | ||||
|     if ($camera_type eq 'ortho') { | ||||
| #    if ($self->_camera_type eq 'ortho') { | ||||
| #==============================================================================================================================     | ||||
|         #FIXME setting the size of the box 10x larger than necessary | ||||
|         # is only a workaround for an incorrectly set camera. | ||||
|         # This workaround harms Z-buffer accuracy! | ||||
|  | @ -1209,12 +1284,18 @@ sub Resize { | |||
|             -$depth, $depth, | ||||
|         ); | ||||
|     } else { | ||||
|         die "Invalid camera type: ", $self->_camera_type, "\n" if ($self->_camera_type ne 'perspective'); | ||||
| #============================================================================================================================== | ||||
|         die "Invalid camera type: ", $camera_type, "\n" if ($camera_type ne 'perspective'); | ||||
| #        die "Invalid camera type: ", $self->_camera_type, "\n" if ($self->_camera_type ne 'perspective'); | ||||
| #============================================================================================================================== | ||||
|         my $bbox_r = $self->max_bounding_box->radius(); | ||||
|         my $fov = PI * 45. / 180.; | ||||
|         my $fov_tan = tan(0.5 * $fov); | ||||
|         my $cam_distance = 0.5 * $bbox_r / $fov_tan; | ||||
|         $self->_camera_distance($cam_distance); | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::set_camera_distance($self, $cam_distance); | ||||
| #        $self->_camera_distance($cam_distance); | ||||
| #============================================================================================================================== | ||||
|         my $nr = $cam_distance - $bbox_r * 1.1; | ||||
|         my $fr = $cam_distance + $bbox_r * 1.1; | ||||
|         $nr = 1 if ($nr < 1); | ||||
|  | @ -1344,19 +1425,29 @@ sub Render { | |||
| 
 | ||||
|     if (!TURNTABLE_MODE) { | ||||
|         # Shift the perspective camera. | ||||
|         my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance); | ||||
| #============================================================================================================================== | ||||
|         my $camera_pos = Slic3r::Pointf3->new(0,0,-Slic3r::GUI::_3DScene::get_camera_distance($self)); | ||||
| #        my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance); | ||||
| #============================================================================================================================== | ||||
|         glTranslatef(@$camera_pos); | ||||
|     } | ||||
|      | ||||
|     if (TURNTABLE_MODE) { | ||||
|         # Turntable mode is enabled by default. | ||||
|         glRotatef(-$self->_stheta, 1, 0, 0); # pitch | ||||
|         glRotatef($self->_sphi, 0, 0, 1);    # yaw | ||||
| #==============================================================================================================================         | ||||
|         glRotatef(-Slic3r::GUI::_3DScene::get_camera_theta($self), 1, 0, 0); # pitch | ||||
|         glRotatef(Slic3r::GUI::_3DScene::get_camera_phi($self), 0, 0, 1);    # yaw | ||||
| #        glRotatef(-$self->_stheta, 1, 0, 0); # pitch | ||||
| #        glRotatef($self->_sphi, 0, 0, 1);    # yaw | ||||
| #==============================================================================================================================         | ||||
|     } else { | ||||
|         my @rotmat = quat_to_rotmatrix($self->quat); | ||||
|         glMultMatrixd_p(@rotmat[0..15]); | ||||
|     } | ||||
|     glTranslatef(@{ $self->_camera_target->negative }); | ||||
| #============================================================================================================================== | ||||
|     glTranslatef(@{ Slic3r::GUI::_3DScene::get_camera_target($self)->negative }); | ||||
| #    glTranslatef(@{ $self->_camera_target->negative }); | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     # light from above | ||||
|     glLightfv_p(GL_LIGHT0, GL_POSITION, -0.5, -0.5, 1, 0); | ||||
|  | @ -1745,8 +1836,14 @@ sub draw_active_object_annotations { | |||
| 
 | ||||
|     # Paint the tooltip. | ||||
|     if ($self->_variable_layer_thickness_load_overlay_image) { | ||||
|         my $gap = 10/$self->_zoom; | ||||
|         my ($l, $r, $b, $t) = ($bar_left - $self->{layer_preview_annotation}->{width}/$self->_zoom - $gap, $bar_left - $gap, $reset_bottom + $self->{layer_preview_annotation}->{height}/$self->_zoom + $gap, $reset_bottom + $gap); | ||||
| #============================================================================================================================== | ||||
|         my $zoom = Slic3r::GUI::_3DScene::get_camera_zoom($self); | ||||
|         my $gap = 10/$zoom; | ||||
|         my ($l, $r, $b, $t) = ($bar_left - $self->{layer_preview_annotation}->{width}/$zoom - $gap, $bar_left - $gap, $reset_bottom + $self->{layer_preview_annotation}->{height}/$zoom + $gap, $reset_bottom + $gap); | ||||
|      | ||||
| #        my $gap = 10/$self->_zoom; | ||||
| #        my ($l, $r, $b, $t) = ($bar_left - $self->{layer_preview_annotation}->{width}/$self->_zoom - $gap, $bar_left - $gap, $reset_bottom + $self->{layer_preview_annotation}->{height}/$self->_zoom + $gap, $reset_bottom + $gap); | ||||
| #============================================================================================================================== | ||||
|         $self->_render_image($self->{layer_preview_annotation}, $l, $r, $t, $b); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri