@@ -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_targ et ( $ 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_th eta ( $ 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 ) ;
}