3DScene set_viewport_from_scene method moved to c++

This commit is contained in:
Enrico Turri 2018-05-29 15:36:09 +02:00
parent df14a3c399
commit 2f773a89df
9 changed files with 135 additions and 119 deletions

View File

@ -790,31 +790,19 @@ sub mouse_event {
# $self->volumes->erase; # $self->volumes->erase;
# $self->_dirty(1); # $self->_dirty(1);
#} #}
#============================================================================================================================== #
## Setup camera to view all objects.
# Setup camera to view all objects. #sub set_viewport_from_scene {
sub set_viewport_from_scene { # my ($self, $scene) = @_;
my ($self, $scene) = @_; #
#==============================================================================================================================
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->_sphi($scene->_sphi);
# $self->_stheta($scene->_stheta); # $self->_stheta($scene->_stheta);
# $self->_camera_target($scene->_camera_target); # $self->_camera_target($scene->_camera_target);
# $self->_zoom($scene->_zoom); # $self->_zoom($scene->_zoom);
#============================================================================================================================== # $self->_quat($scene->_quat);
$self->_quat($scene->_quat);
#==============================================================================================================================
Slic3r::GUI::_3DScene::set_dirty($self, 1);
# $self->_dirty(1); # $self->_dirty(1);
#============================================================================================================================== #}
} #
#==============================================================================================================================
## Set the camera to a default orientation, ## Set the camera to a default orientation,
## zoom to volumes. ## zoom to volumes.
#sub select_view { #sub select_view {
@ -851,104 +839,89 @@ sub set_viewport_from_scene {
# $self->Refresh; # $self->Refresh;
# } # }
#} #}
#============================================================================================================================== #
#sub get_zoom_to_bounding_box_factor {
sub get_zoom_to_bounding_box_factor { # my ($self, $bb) = @_;
my ($self, $bb) = @_; # my $max_bb_size = max(@{ $bb->size });
my $max_bb_size = max(@{ $bb->size }); # return undef if ($max_bb_size == 0);
return undef if ($max_bb_size == 0); #
# # project the bbox vertices on a plane perpendicular to the camera forward axis
# project the bbox vertices on a plane perpendicular to the camera forward axis # # then calculates the vertices coordinate on this plane along the camera xy axes
# then calculates the vertices coordinate on this plane along the camera xy axes #
# # we need the view matrix, we let opengl calculate it (same as done in render sub)
# we need the view matrix, we let opengl calculate it (same as done in render sub) # glMatrixMode(GL_MODELVIEW);
glMatrixMode(GL_MODELVIEW); # glLoadIdentity();
glLoadIdentity(); #
# if (!TURNTABLE_MODE) {
if (!TURNTABLE_MODE) { # # Shift the perspective camera.
# Shift the perspective camera.
#==============================================================================================================================
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); # my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance);
#============================================================================================================================== # glTranslatef(@$camera_pos);
glTranslatef(@$camera_pos); # }
} #
# if (TURNTABLE_MODE) {
if (TURNTABLE_MODE) { # # Turntable mode is enabled by default.
# Turntable mode is enabled by default.
#==============================================================================================================================
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->_stheta, 1, 0, 0); # pitch
# glRotatef($self->_sphi, 0, 0, 1); # yaw # glRotatef($self->_sphi, 0, 0, 1); # yaw
#============================================================================================================================== # } else {
} else { # # Shift the perspective camera.
# Shift the perspective camera.
#==============================================================================================================================
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); # my $camera_pos = Slic3r::Pointf3->new(0,0,-$self->_camera_distance);
#============================================================================================================================== # glTranslatef(@$camera_pos);
glTranslatef(@$camera_pos); # my @rotmat = quat_to_rotmatrix($self->quat);
my @rotmat = quat_to_rotmatrix($self->quat); # glMultMatrixd_p(@rotmat[0..15]);
glMultMatrixd_p(@rotmat[0..15]); # }
}
#==============================================================================================================================
glTranslatef(@{ Slic3r::GUI::_3DScene::get_camera_target($self)->negative });
# glTranslatef(@{ $self->_camera_target->negative }); # glTranslatef(@{ $self->_camera_target->negative });
#============================================================================================================================== #
# # get the view matrix back from opengl
# get the view matrix back from opengl # my @matrix = glGetFloatv_p(GL_MODELVIEW_MATRIX);
my @matrix = glGetFloatv_p(GL_MODELVIEW_MATRIX); #
# # camera axes
# camera axes # my $right = Slic3r::Pointf3->new($matrix[0], $matrix[4], $matrix[8]);
my $right = Slic3r::Pointf3->new($matrix[0], $matrix[4], $matrix[8]); # my $up = Slic3r::Pointf3->new($matrix[1], $matrix[5], $matrix[9]);
my $up = Slic3r::Pointf3->new($matrix[1], $matrix[5], $matrix[9]); # my $forward = Slic3r::Pointf3->new($matrix[2], $matrix[6], $matrix[10]);
my $forward = Slic3r::Pointf3->new($matrix[2], $matrix[6], $matrix[10]); #
# my $bb_min = $bb->min_point();
my $bb_min = $bb->min_point(); # my $bb_max = $bb->max_point();
my $bb_max = $bb->max_point(); # my $bb_center = $bb->center();
my $bb_center = $bb->center(); #
# # bbox vertices in world space
# bbox vertices in world space # my @vertices = ();
my @vertices = (); # push(@vertices, $bb_min);
push(@vertices, $bb_min); # push(@vertices, Slic3r::Pointf3->new($bb_max->x(), $bb_min->y(), $bb_min->z()));
push(@vertices, Slic3r::Pointf3->new($bb_max->x(), $bb_min->y(), $bb_min->z())); # push(@vertices, Slic3r::Pointf3->new($bb_max->x(), $bb_max->y(), $bb_min->z()));
push(@vertices, Slic3r::Pointf3->new($bb_max->x(), $bb_max->y(), $bb_min->z())); # push(@vertices, Slic3r::Pointf3->new($bb_min->x(), $bb_max->y(), $bb_min->z()));
push(@vertices, Slic3r::Pointf3->new($bb_min->x(), $bb_max->y(), $bb_min->z())); # push(@vertices, Slic3r::Pointf3->new($bb_min->x(), $bb_min->y(), $bb_max->z()));
push(@vertices, Slic3r::Pointf3->new($bb_min->x(), $bb_min->y(), $bb_max->z())); # push(@vertices, Slic3r::Pointf3->new($bb_max->x(), $bb_min->y(), $bb_max->z()));
push(@vertices, Slic3r::Pointf3->new($bb_max->x(), $bb_min->y(), $bb_max->z())); # push(@vertices, $bb_max);
push(@vertices, $bb_max); # push(@vertices, Slic3r::Pointf3->new($bb_min->x(), $bb_max->y(), $bb_max->z()));
push(@vertices, Slic3r::Pointf3->new($bb_min->x(), $bb_max->y(), $bb_max->z())); #
# my $max_x = 0.0;
my $max_x = 0.0; # my $max_y = 0.0;
my $max_y = 0.0; #
# # margin factor to give some empty space around the bbox
# margin factor to give some empty space around the bbox # my $margin_factor = 1.25;
my $margin_factor = 1.25; #
# foreach my $v (@vertices) {
foreach my $v (@vertices) { # # project vertex on the plane perpendicular to camera forward axis
# project vertex on the plane perpendicular to camera forward axis # my $pos = Slic3r::Pointf3->new($v->x() - $bb_center->x(), $v->y() - $bb_center->y(), $v->z() - $bb_center->z());
my $pos = Slic3r::Pointf3->new($v->x() - $bb_center->x(), $v->y() - $bb_center->y(), $v->z() - $bb_center->z()); # my $proj_on_normal = $pos->x() * $forward->x() + $pos->y() * $forward->y() + $pos->z() * $forward->z();
my $proj_on_normal = $pos->x() * $forward->x() + $pos->y() * $forward->y() + $pos->z() * $forward->z(); # my $proj_on_plane = Slic3r::Pointf3->new($pos->x() - $proj_on_normal * $forward->x(), $pos->y() - $proj_on_normal * $forward->y(), $pos->z() - $proj_on_normal * $forward->z());
my $proj_on_plane = Slic3r::Pointf3->new($pos->x() - $proj_on_normal * $forward->x(), $pos->y() - $proj_on_normal * $forward->y(), $pos->z() - $proj_on_normal * $forward->z()); #
# # calculates vertex coordinate along camera xy axes
# calculates vertex coordinate along camera xy axes # my $x_on_plane = $proj_on_plane->x() * $right->x() + $proj_on_plane->y() * $right->y() + $proj_on_plane->z() * $right->z();
my $x_on_plane = $proj_on_plane->x() * $right->x() + $proj_on_plane->y() * $right->y() + $proj_on_plane->z() * $right->z(); # my $y_on_plane = $proj_on_plane->x() * $up->x() + $proj_on_plane->y() * $up->y() + $proj_on_plane->z() * $up->z();
my $y_on_plane = $proj_on_plane->x() * $up->x() + $proj_on_plane->y() * $up->y() + $proj_on_plane->z() * $up->z(); #
# $max_x = max($max_x, $margin_factor * 2 * abs($x_on_plane));
$max_x = max($max_x, $margin_factor * 2 * abs($x_on_plane)); # $max_y = max($max_y, $margin_factor * 2 * abs($y_on_plane));
$max_y = max($max_y, $margin_factor * 2 * abs($y_on_plane)); # }
} #
# return undef if (($max_x == 0) || ($max_y == 0));
return undef if (($max_x == 0) || ($max_y == 0)); #
# my ($cw, $ch) = $self->GetSizeWH;
my ($cw, $ch) = $self->GetSizeWH; # my $min_ratio = min($cw / $max_x, $ch / $max_y);
my $min_ratio = min($cw / $max_x, $ch / $max_y); #
# return $min_ratio;
return $min_ratio; #}
} #
#==============================================================================================================================
#sub zoom_to_bounding_box { #sub zoom_to_bounding_box {
# my ($self, $bb) = @_; # my ($self, $bb) = @_;
# # Calculate the zoom factor needed to adjust viewport to bounding box. # # Calculate the zoom factor needed to adjust viewport to bounding box.

View File

@ -142,10 +142,13 @@ sub new {
} }
}); });
$self->{canvas3D}->on_viewport_changed(sub { $self->{canvas3D}->on_viewport_changed(sub {
$self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D}); #==============================================================================================================================
Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D});
# $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D});
#==============================================================================================================================
}); });
#============================================================================================================================== #==============================================================================================================================
Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{canvas3D}, sub { $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D}); }); Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{canvas3D}, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D}); });
#============================================================================================================================== #==============================================================================================================================
} }
@ -161,10 +164,13 @@ sub new {
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});
$self->{preview3D}->canvas->on_viewport_changed(sub { $self->{preview3D}->canvas->on_viewport_changed(sub {
$self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas); #==============================================================================================================================
Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas);
# $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas);
#==============================================================================================================================
}); });
#============================================================================================================================== #==============================================================================================================================
Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { $self->{canvas3D}->set_viewport_from_scene($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'));
$self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1; $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1;
@ -2235,15 +2241,17 @@ sub select_view {
if ($page eq L('Preview')) { if ($page eq L('Preview')) {
#============================================================================================================================== #==============================================================================================================================
Slic3r::GUI::_3DScene::select_view($self->{preview3D}->canvas, $direction); Slic3r::GUI::_3DScene::select_view($self->{preview3D}->canvas, $direction);
Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas);
# $self->{preview3D}->canvas->select_view($direction); # $self->{preview3D}->canvas->select_view($direction);
# $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas);
#============================================================================================================================== #==============================================================================================================================
$self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas);
} else { } else {
#============================================================================================================================== #==============================================================================================================================
Slic3r::GUI::_3DScene::select_view($self->{canvas3D}, $direction); Slic3r::GUI::_3DScene::select_view($self->{canvas3D}, $direction);
Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{preview3D}->canvas, $self->{canvas3D});
# $self->{canvas3D}->select_view($direction); # $self->{canvas3D}->select_view($direction);
# $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D});
#============================================================================================================================== #==============================================================================================================================
$self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D});
} }
} }

View File

@ -2105,6 +2105,11 @@ void _3DScene::select_view(wxGLCanvas* canvas, const std::string& direction)
s_canvas_mgr.select_view(canvas, direction); s_canvas_mgr.select_view(canvas, direction);
} }
void _3DScene::set_viewport_from_scene(wxGLCanvas* canvas, wxGLCanvas* other)
{
s_canvas_mgr.set_viewport_from_scene(canvas, other);
}
void _3DScene::update_volumes_colors_by_extruder(wxGLCanvas* canvas) void _3DScene::update_volumes_colors_by_extruder(wxGLCanvas* canvas)
{ {
s_canvas_mgr.update_volumes_colors_by_extruder(canvas); s_canvas_mgr.update_volumes_colors_by_extruder(canvas);

View File

@ -644,6 +644,7 @@ public:
static void zoom_to_bed(wxGLCanvas* canvas); static void zoom_to_bed(wxGLCanvas* canvas);
static void zoom_to_volumes(wxGLCanvas* canvas); static void zoom_to_volumes(wxGLCanvas* canvas);
static void select_view(wxGLCanvas* canvas, const std::string& direction); static void select_view(wxGLCanvas* canvas, const std::string& direction);
static void set_viewport_from_scene(wxGLCanvas* canvas, wxGLCanvas* other);
static void update_volumes_colors_by_extruder(wxGLCanvas* canvas); static void update_volumes_colors_by_extruder(wxGLCanvas* canvas);

View File

@ -1520,6 +1520,15 @@ void GLCanvas3D::select_view(const std::string& direction)
} }
} }
void GLCanvas3D::set_viewport_from_scene(const GLCanvas3D& other)
{
set_camera_phi(other.get_camera_phi());
set_camera_theta(other.get_camera_theta());
set_camera_target(other.get_camera_target());
set_camera_zoom(other.get_camera_zoom());
set_dirty(true);
}
void GLCanvas3D::update_volumes_colors_by_extruder() void GLCanvas3D::update_volumes_colors_by_extruder()
{ {
if ((m_volumes == nullptr) || (m_config == nullptr)) if ((m_volumes == nullptr) || (m_config == nullptr))

View File

@ -427,6 +427,7 @@ public:
void zoom_to_bed(); void zoom_to_bed();
void zoom_to_volumes(); void zoom_to_volumes();
void select_view(const std::string& direction); void select_view(const std::string& direction);
void set_viewport_from_scene(const GLCanvas3D& other);
void update_volumes_colors_by_extruder(); void update_volumes_colors_by_extruder();

View File

@ -597,6 +597,17 @@ void GLCanvas3DManager::select_view(wxGLCanvas* canvas, const std::string& direc
it->second->select_view(direction); it->second->select_view(direction);
} }
void GLCanvas3DManager::set_viewport_from_scene(wxGLCanvas* canvas, wxGLCanvas* other)
{
CanvasesMap::iterator it = _get_canvas(canvas);
if (it != m_canvases.end())
{
CanvasesMap::iterator other_it = _get_canvas(other);
if (other_it != m_canvases.end())
it->second->set_viewport_from_scene(*other_it->second);
}
}
void GLCanvas3DManager::update_volumes_colors_by_extruder(wxGLCanvas* canvas) void GLCanvas3DManager::update_volumes_colors_by_extruder(wxGLCanvas* canvas)
{ {
CanvasesMap::const_iterator it = _get_canvas(canvas); CanvasesMap::const_iterator it = _get_canvas(canvas);

View File

@ -144,6 +144,7 @@ public:
void zoom_to_bed(wxGLCanvas* canvas); void zoom_to_bed(wxGLCanvas* canvas);
void zoom_to_volumes(wxGLCanvas* canvas); void zoom_to_volumes(wxGLCanvas* canvas);
void select_view(wxGLCanvas* canvas, const std::string& direction); void select_view(wxGLCanvas* canvas, const std::string& direction);
void set_viewport_from_scene(wxGLCanvas* canvas, wxGLCanvas* other);
void update_volumes_colors_by_extruder(wxGLCanvas* canvas); void update_volumes_colors_by_extruder(wxGLCanvas* canvas);

View File

@ -717,6 +717,13 @@ select_view(canvas, direction)
CODE: CODE:
_3DScene::select_view((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), direction); _3DScene::select_view((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), direction);
void
set_viewport_from_scene(canvas, other)
SV *canvas;
SV *other;
CODE:
_3DScene::set_viewport_from_scene((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), (wxGLCanvas*)wxPli_sv_2_object(aTHX_ other, "Wx::GLCanvas"));
void void
update_volumes_colors_by_extruder(canvas) update_volumes_colors_by_extruder(canvas)
SV *canvas; SV *canvas;