mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-25 15:44:12 -06:00
Fixed panning issues when the camera is parallel to the bed plane.
This commit is contained in:
parent
8b5f7f0fb2
commit
fe409a76a6
1 changed files with 13 additions and 17 deletions
|
@ -341,6 +341,7 @@ sub mouse_event {
|
||||||
if ($e->Entering && &Wx::wxMSW) {
|
if ($e->Entering && &Wx::wxMSW) {
|
||||||
# wxMSW needs focus in order to catch mouse wheel events
|
# wxMSW needs focus in order to catch mouse wheel events
|
||||||
$self->SetFocus;
|
$self->SetFocus;
|
||||||
|
$self->_drag_start_xy(undef);
|
||||||
} elsif ($e->LeftDClick) {
|
} elsif ($e->LeftDClick) {
|
||||||
if ($object_idx_selected != -1 && $self->_variable_layer_thickness_bar_rect_mouse_inside($e)) {
|
if ($object_idx_selected != -1 && $self->_variable_layer_thickness_bar_rect_mouse_inside($e)) {
|
||||||
} elsif ($self->on_double_click) {
|
} elsif ($self->on_double_click) {
|
||||||
|
@ -390,6 +391,8 @@ sub mouse_event {
|
||||||
|
|
||||||
if ($volume_idx != -1) {
|
if ($volume_idx != -1) {
|
||||||
if ($e->LeftDown && $self->enable_moving) {
|
if ($e->LeftDown && $self->enable_moving) {
|
||||||
|
# The mouse_to_3d gets the Z coordinate from the Z buffer at the screen coordinate $pos->x,y,
|
||||||
|
# an converts the screen space coordinate to unscaled object space.
|
||||||
my $pos3d = $self->mouse_to_3d(@$pos);
|
my $pos3d = $self->mouse_to_3d(@$pos);
|
||||||
# Only accept the initial position, if it is inside the volume bounding box.
|
# Only accept the initial position, if it is inside the volume bounding box.
|
||||||
my $volume_bbox = $self->volumes->[$volume_idx]->transformed_bounding_box;
|
my $volume_bbox = $self->volumes->[$volume_idx]->transformed_bounding_box;
|
||||||
|
@ -411,7 +414,10 @@ sub mouse_event {
|
||||||
}
|
}
|
||||||
} elsif ($e->Dragging && $e->LeftIsDown && ! $self->_layer_height_edited && defined($self->_drag_volume_idx)) {
|
} elsif ($e->Dragging && $e->LeftIsDown && ! $self->_layer_height_edited && defined($self->_drag_volume_idx)) {
|
||||||
# Get new position at the same Z of the initial click point.
|
# Get new position at the same Z of the initial click point.
|
||||||
my $cur_pos = $self->mouse_ray($e->GetX, $e->GetY)->intersect_plane($self->_drag_start_pos->z);
|
my $cur_pos = Slic3r::Linef3->new(
|
||||||
|
$self->mouse_to_3d($e->GetX, $e->GetY, 0),
|
||||||
|
$self->mouse_to_3d($e->GetX, $e->GetY, 1))
|
||||||
|
->intersect_plane($self->_drag_start_pos->z);
|
||||||
# Clip the new position, so the object center remains close to the bed.
|
# Clip the new position, so the object center remains close to the bed.
|
||||||
{
|
{
|
||||||
$cur_pos->translate(@{$self->_drag_volume_center_offset});
|
$cur_pos->translate(@{$self->_drag_volume_center_offset});
|
||||||
|
@ -466,15 +472,12 @@ sub mouse_event {
|
||||||
}
|
}
|
||||||
$self->_drag_start_pos($pos);
|
$self->_drag_start_pos($pos);
|
||||||
} elsif ($e->MiddleIsDown || $e->RightIsDown) {
|
} elsif ($e->MiddleIsDown || $e->RightIsDown) {
|
||||||
# if dragging over blank area with right button, translate
|
# If dragging over blank area with right button, pan.
|
||||||
|
|
||||||
if (defined $self->_drag_start_xy) {
|
if (defined $self->_drag_start_xy) {
|
||||||
# get point in model space at Z = 0
|
# get point in model space at Z = 0
|
||||||
my $cur_pos = $self->mouse_ray($e->GetX, $e->GetY)->intersect_plane(0);
|
my $cur_pos = $self->mouse_to_3d($e->GetX, $e->GetY, 0);
|
||||||
my $orig = $self->mouse_ray(@{$self->_drag_start_xy})->intersect_plane(0);
|
my $orig = $self->mouse_to_3d($self->_drag_start_xy->x, $self->_drag_start_xy->y, 0);
|
||||||
$self->_camera_target->translate(
|
$self->_camera_target->translate(@{$orig->vector_to($cur_pos)->negative});
|
||||||
@{$orig->vector_to($cur_pos)->negative},
|
|
||||||
);
|
|
||||||
$self->on_viewport_changed->() if $self->on_viewport_changed;
|
$self->on_viewport_changed->() if $self->on_viewport_changed;
|
||||||
$self->Refresh;
|
$self->Refresh;
|
||||||
$self->Update;
|
$self->Update;
|
||||||
|
@ -888,6 +891,8 @@ sub mulquats {
|
||||||
@$q1[3] * @$rq[3] - @$q1[0] * @$rq[0] - @$q1[1] * @$rq[1] - @$q1[2] * @$rq[2])
|
@$q1[3] * @$rq[3] - @$q1[0] * @$rq[0] - @$q1[1] * @$rq[1] - @$q1[2] * @$rq[2])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Convert the screen space coordinate to an object space coordinate.
|
||||||
|
# If the Z screen space coordinate is not provided, a depth buffer value is substituted.
|
||||||
sub mouse_to_3d {
|
sub mouse_to_3d {
|
||||||
my ($self, $x, $y, $z) = @_;
|
my ($self, $x, $y, $z) = @_;
|
||||||
|
|
||||||
|
@ -901,15 +906,6 @@ sub mouse_to_3d {
|
||||||
return Slic3r::Pointf3->new(@projected);
|
return Slic3r::Pointf3->new(@projected);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub mouse_ray {
|
|
||||||
my ($self, $x, $y) = @_;
|
|
||||||
|
|
||||||
return Slic3r::Linef3->new(
|
|
||||||
$self->mouse_to_3d($x, $y, 0),
|
|
||||||
$self->mouse_to_3d($x, $y, 1),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub GetContext {
|
sub GetContext {
|
||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue