mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	3DScene bed variables moved to c++
This commit is contained in:
		
							parent
							
								
									43784f3409
								
							
						
					
					
						commit
						2b4829a4b9
					
				
					 12 changed files with 425 additions and 167 deletions
				
			
		|  | @ -48,10 +48,6 @@ __PACKAGE__->mk_accessors( qw(_quat init | |||
|                               volumes | ||||
|                               cutting_plane_z | ||||
|                               cut_lines_vertices | ||||
|                               bed_shape | ||||
|                               bed_triangles | ||||
|                               bed_grid_lines | ||||
|                               bed_polygon | ||||
|                               background | ||||
|                               _mouse_pos | ||||
|                               _hover_volume_idx | ||||
|  | @ -124,14 +120,16 @@ use constant SELECTED_COLOR => [0,1,0,1]; | |||
| # For mesh selection: Mouse hovers over the object, but object not selected yet - dark green. | ||||
| use constant HOVER_COLOR    => [0.4,0.9,0,1]; | ||||
| 
 | ||||
| # phi / theta angles to orient the camera. | ||||
| use constant VIEW_DEFAULT    => [45.0,45.0]; | ||||
| use constant VIEW_LEFT       => [90.0,90.0]; | ||||
| use constant VIEW_RIGHT      => [-90.0,90.0]; | ||||
| use constant VIEW_TOP        => [0.0,0.0]; | ||||
| use constant VIEW_BOTTOM     => [0.0,180.0]; | ||||
| use constant VIEW_FRONT      => [0.0,90.0]; | ||||
| use constant VIEW_REAR       => [180.0,90.0]; | ||||
| #============================================================================================================================== | ||||
| ## phi / theta angles to orient the camera. | ||||
| #use constant VIEW_DEFAULT    => [45.0,45.0]; | ||||
| #use constant VIEW_LEFT       => [90.0,90.0]; | ||||
| #use constant VIEW_RIGHT      => [-90.0,90.0]; | ||||
| #use constant VIEW_TOP        => [0.0,0.0]; | ||||
| #use constant VIEW_BOTTOM     => [0.0,180.0]; | ||||
| #use constant VIEW_FRONT      => [0.0,90.0]; | ||||
| #use constant VIEW_REAR       => [180.0,90.0]; | ||||
| #============================================================================================================================== | ||||
| 
 | ||||
| use constant MANIPULATION_IDLE          => 0; | ||||
| use constant MANIPULATION_DRAGGING      => 1; | ||||
|  | @ -547,17 +545,21 @@ sub mouse_event { | |||
|                 $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. | ||||
|         { | ||||
|             $cur_pos->translate(@{$self->_drag_volume_center_offset}); | ||||
|             my $cur_pos2 = Slic3r::Point->new(scale($cur_pos->x), scale($cur_pos->y)); | ||||
|             if (! $self->bed_polygon->contains_point($cur_pos2)) { | ||||
|                 my $ip = $self->bed_polygon->point_projection($cur_pos2); | ||||
|                 $cur_pos->set_x(unscale($ip->x)); | ||||
|                 $cur_pos->set_y(unscale($ip->y)); | ||||
|             } | ||||
|             $cur_pos->translate(@{$self->_drag_volume_center_offset->negative}); | ||||
|         } | ||||
| #$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ | ||||
| #   >>>>>>>>>>>>>>>>>>>>>>>>>> TEMPORARY DISABLED DUE TO bed_polygon REMOVAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | ||||
| #  | ||||
| #        # Clip the new position, so the object center remains close to the bed. | ||||
| #        { | ||||
| #            $cur_pos->translate(@{$self->_drag_volume_center_offset}); | ||||
| #            my $cur_pos2 = Slic3r::Point->new(scale($cur_pos->x), scale($cur_pos->y)); | ||||
| #            if (! $self->bed_polygon->contains_point($cur_pos2)) { | ||||
| #                my $ip = $self->bed_polygon->point_projection($cur_pos2); | ||||
| #                $cur_pos->set_x(unscale($ip->x)); | ||||
| #                $cur_pos->set_y(unscale($ip->y)); | ||||
| #            } | ||||
| #            $cur_pos->translate(@{$self->_drag_volume_center_offset->negative}); | ||||
| #        } | ||||
| #$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ | ||||
|         # Calculate the translation vector. | ||||
|         my $vector = $self->_drag_start_pos->vector_to($cur_pos); | ||||
|         # Get the volume being dragged. | ||||
|  | @ -980,83 +982,76 @@ sub max_bounding_box { | |||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| # Used by ObjectCutDialog and ObjectPartsPanel to generate a rectangular ground plane | ||||
| # to support the scene objects. | ||||
| sub set_auto_bed_shape { | ||||
|     my ($self, $bed_shape) = @_; | ||||
|      | ||||
|     # draw a default square bed around object center | ||||
|     my $max_size = max(@{ $self->volumes_bounding_box->size }); | ||||
|     my $center = $self->volumes_bounding_box->center; | ||||
|     $self->set_bed_shape([ | ||||
|         [ $center->x - $max_size, $center->y - $max_size ],  #-- | ||||
|         [ $center->x + $max_size, $center->y - $max_size ],  #-- | ||||
|         [ $center->x + $max_size, $center->y + $max_size ],  #++ | ||||
|         [ $center->x - $max_size, $center->y + $max_size ],  #++ | ||||
|     ]); | ||||
|     # Set the origin for painting of the coordinate system axes. | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_bed_origin($self, Slic3r::Pointf->new(@$center[X,Y])); | ||||
| ## Used by ObjectCutDialog and ObjectPartsPanel to generate a rectangular ground plane | ||||
| ## to support the scene objects. | ||||
| #sub set_auto_bed_shape { | ||||
| #    my ($self, $bed_shape) = @_; | ||||
| #     | ||||
| #    # draw a default square bed around object center | ||||
| #    my $max_size = max(@{ $self->volumes_bounding_box->size }); | ||||
| #    my $center = $self->volumes_bounding_box->center; | ||||
| #    $self->set_bed_shape([ | ||||
| #        [ $center->x - $max_size, $center->y - $max_size ],  #-- | ||||
| #        [ $center->x + $max_size, $center->y - $max_size ],  #-- | ||||
| #        [ $center->x + $max_size, $center->y + $max_size ],  #++ | ||||
| #        [ $center->x - $max_size, $center->y + $max_size ],  #++ | ||||
| #    ]); | ||||
| #    # Set the origin for painting of the coordinate system axes. | ||||
| #    $self->origin(Slic3r::Pointf->new(@$center[X,Y])); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| # Set the bed shape to a single closed 2D polygon (array of two element arrays), | ||||
| # triangulate the bed and store the triangles into $self->bed_triangles, | ||||
| # fills the $self->bed_grid_lines and sets $self->origin. | ||||
| # Sets $self->bed_polygon to limit the object placement. | ||||
| sub set_bed_shape { | ||||
|     my ($self, $bed_shape) = @_; | ||||
|      | ||||
|     $self->bed_shape($bed_shape); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_bed_shape($self, $bed_shape); | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     # triangulate bed | ||||
|     my $expolygon = Slic3r::ExPolygon->new([ map [map scale($_), @$_], @$bed_shape ]); | ||||
|     my $bed_bb = $expolygon->bounding_box; | ||||
|      | ||||
|     { | ||||
|         my @points = (); | ||||
|         foreach my $triangle (@{ $expolygon->triangulate }) { | ||||
|             push @points, map {+ unscale($_->x), unscale($_->y), GROUND_Z } @$triangle; | ||||
|         } | ||||
|         $self->bed_triangles(OpenGL::Array->new_list(GL_FLOAT, @points)); | ||||
|     } | ||||
|      | ||||
|     { | ||||
|         my @polylines = (); | ||||
|         for (my $x = $bed_bb->x_min; $x <= $bed_bb->x_max; $x += scale 10) { | ||||
|             push @polylines, Slic3r::Polyline->new([$x,$bed_bb->y_min], [$x,$bed_bb->y_max]); | ||||
|         } | ||||
|         for (my $y = $bed_bb->y_min; $y <= $bed_bb->y_max; $y += scale 10) { | ||||
|             push @polylines, Slic3r::Polyline->new([$bed_bb->x_min,$y], [$bed_bb->x_max,$y]); | ||||
|         } | ||||
|         # clip with a slightly grown expolygon because our lines lay on the contours and | ||||
|         # may get erroneously clipped | ||||
|         my @lines = map Slic3r::Line->new(@$_[0,-1]), | ||||
|             @{intersection_pl(\@polylines, [ @{$expolygon->offset(+scaled_epsilon)} ])}; | ||||
|          | ||||
|         # append bed contours | ||||
|         push @lines, map @{$_->lines}, @$expolygon; | ||||
|          | ||||
|         my @points = (); | ||||
|         foreach my $line (@lines) { | ||||
|             push @points, map {+ unscale($_->x), unscale($_->y), GROUND_Z } @$line;  #)) | ||||
|         } | ||||
|         $self->bed_grid_lines(OpenGL::Array->new_list(GL_FLOAT, @points)); | ||||
|     } | ||||
|      | ||||
|     # Set the origin for painting of the coordinate system axes. | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_bed_origin($self, Slic3r::Pointf->new(0,0)); | ||||
| #} | ||||
| # | ||||
| ## Set the bed shape to a single closed 2D polygon (array of two element arrays), | ||||
| ## triangulate the bed and store the triangles into $self->bed_triangles, | ||||
| ## fills the $self->bed_grid_lines and sets $self->origin. | ||||
| ## Sets $self->bed_polygon to limit the object placement. | ||||
| #sub set_bed_shape { | ||||
| #    my ($self, $bed_shape) = @_; | ||||
| #     | ||||
| #    $self->bed_shape($bed_shape); | ||||
| #     | ||||
| #    # triangulate bed | ||||
| #    my $expolygon = Slic3r::ExPolygon->new([ map [map scale($_), @$_], @$bed_shape ]); | ||||
| #    my $bed_bb = $expolygon->bounding_box; | ||||
| #     | ||||
| #    { | ||||
| #        my @points = (); | ||||
| #        foreach my $triangle (@{ $expolygon->triangulate }) { | ||||
| #            push @points, map {+ unscale($_->x), unscale($_->y), GROUND_Z } @$triangle; | ||||
| #        } | ||||
| #        $self->bed_triangles(OpenGL::Array->new_list(GL_FLOAT, @points)); | ||||
| #    } | ||||
| #     | ||||
| #    { | ||||
| #        my @polylines = (); | ||||
| #        for (my $x = $bed_bb->x_min; $x <= $bed_bb->x_max; $x += scale 10) { | ||||
| #            push @polylines, Slic3r::Polyline->new([$x,$bed_bb->y_min], [$x,$bed_bb->y_max]); | ||||
| #        } | ||||
| #        for (my $y = $bed_bb->y_min; $y <= $bed_bb->y_max; $y += scale 10) { | ||||
| #            push @polylines, Slic3r::Polyline->new([$bed_bb->x_min,$y], [$bed_bb->x_max,$y]); | ||||
| #        } | ||||
| #        # clip with a slightly grown expolygon because our lines lay on the contours and | ||||
| #        # may get erroneously clipped | ||||
| #        my @lines = map Slic3r::Line->new(@$_[0,-1]), | ||||
| #            @{intersection_pl(\@polylines, [ @{$expolygon->offset(+scaled_epsilon)} ])}; | ||||
| #         | ||||
| #        # append bed contours | ||||
| #        push @lines, map @{$_->lines}, @$expolygon; | ||||
| #         | ||||
| #        my @points = (); | ||||
| #        foreach my $line (@lines) { | ||||
| #            push @points, map {+ unscale($_->x), unscale($_->y), GROUND_Z } @$line;  #)) | ||||
| #        } | ||||
| #        $self->bed_grid_lines(OpenGL::Array->new_list(GL_FLOAT, @points)); | ||||
| #    } | ||||
| #     | ||||
| #    # Set the origin for painting of the coordinate system axes. | ||||
| #    $self->origin(Slic3r::Pointf->new(0,0)); | ||||
| # | ||||
| #    $self->bed_polygon(offset_ex([$expolygon->contour], $bed_bb->radius * 1.7, JT_ROUND, scale(0.5))->[0]->contour->clone); | ||||
| #} | ||||
| #============================================================================================================================== | ||||
| 
 | ||||
|     $self->bed_polygon(offset_ex([$expolygon->contour], $bed_bb->radius * 1.7, JT_ROUND, scale(0.5))->[0]->contour->clone); | ||||
| } | ||||
| 
 | ||||
| sub deselect_volumes { | ||||
|     my ($self) = @_; | ||||
|     $_->set_selected(0) for @{$self->volumes}; | ||||
|  | @ -1518,33 +1513,37 @@ sub Render { | |||
|      | ||||
|     # draw ground | ||||
|     my $ground_z = GROUND_Z; | ||||
|     if ($self->bed_triangles) { | ||||
|         glDisable(GL_DEPTH_TEST); | ||||
|          | ||||
|         glEnable(GL_BLEND); | ||||
|         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
|          | ||||
|         glEnableClientState(GL_VERTEX_ARRAY); | ||||
|         glColor4f(0.8, 0.6, 0.5, 0.4); | ||||
|         glNormal3d(0,0,1); | ||||
|         glVertexPointer_c(3, GL_FLOAT, 0, $self->bed_triangles->ptr()); | ||||
|         glDrawArrays(GL_TRIANGLES, 0, $self->bed_triangles->elements / 3); | ||||
|         glDisableClientState(GL_VERTEX_ARRAY); | ||||
|          | ||||
|         # we need depth test for grid, otherwise it would disappear when looking | ||||
|         # the object from below | ||||
|         glEnable(GL_DEPTH_TEST); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::render($self); | ||||
|      | ||||
|         # draw grid | ||||
|         glLineWidth(3); | ||||
|         glColor4f(0.2, 0.2, 0.2, 0.4); | ||||
|         glEnableClientState(GL_VERTEX_ARRAY); | ||||
|         glVertexPointer_c(3, GL_FLOAT, 0, $self->bed_grid_lines->ptr()); | ||||
|         glDrawArrays(GL_LINES, 0, $self->bed_grid_lines->elements / 3); | ||||
|         glDisableClientState(GL_VERTEX_ARRAY); | ||||
|          | ||||
|         glDisable(GL_BLEND); | ||||
|     } | ||||
| #    if ($self->bed_triangles) { | ||||
| #        glDisable(GL_DEPTH_TEST); | ||||
| #         | ||||
| #        glEnable(GL_BLEND); | ||||
| #        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
| #         | ||||
| #        glEnableClientState(GL_VERTEX_ARRAY); | ||||
| #        glColor4f(0.8, 0.6, 0.5, 0.4); | ||||
| #        glNormal3d(0,0,1); | ||||
| #        glVertexPointer_c(3, GL_FLOAT, 0, $self->bed_triangles->ptr()); | ||||
| #        glDrawArrays(GL_TRIANGLES, 0, $self->bed_triangles->elements / 3); | ||||
| #        glDisableClientState(GL_VERTEX_ARRAY); | ||||
| #         | ||||
| #        # we need depth test for grid, otherwise it would disappear when looking | ||||
| #        # the object from below | ||||
| #        glEnable(GL_DEPTH_TEST); | ||||
| #     | ||||
| #        # draw grid | ||||
| #        glLineWidth(3); | ||||
| #        glColor4f(0.2, 0.2, 0.2, 0.4); | ||||
| #        glEnableClientState(GL_VERTEX_ARRAY); | ||||
| #        glVertexPointer_c(3, GL_FLOAT, 0, $self->bed_grid_lines->ptr()); | ||||
| #        glDrawArrays(GL_LINES, 0, $self->bed_grid_lines->elements / 3); | ||||
| #        glDisableClientState(GL_VERTEX_ARRAY); | ||||
| #         | ||||
| #        glDisable(GL_BLEND); | ||||
| #    } | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     my $volumes_bb = $self->volumes_bounding_box; | ||||
|      | ||||
|  |  | |||
|  | @ -255,7 +255,10 @@ sub reload_scene { | |||
| 
 | ||||
| sub update_bed_size { | ||||
|     my ($self) = @_; | ||||
|     $self->set_bed_shape($self->{config}->bed_shape); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_bed_shape($self, $self->{config}->bed_shape); | ||||
| #    $self->set_bed_shape($self->{config}->bed_shape); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| # Called by the Platter wxNotebook when this page is activated. | ||||
|  |  | |||
|  | @ -474,7 +474,10 @@ sub set_z_idx_high | |||
| 
 | ||||
| sub set_bed_shape { | ||||
|     my ($self, $bed_shape) = @_; | ||||
|     $self->canvas->set_bed_shape($bed_shape); | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::set_bed_shape($self->canvas, $bed_shape); | ||||
| #    $self->canvas->set_bed_shape($bed_shape); | ||||
| #============================================================================================================================== | ||||
| } | ||||
| 
 | ||||
| sub set_number_extruders { | ||||
|  |  | |||
|  | @ -113,7 +113,10 @@ sub new { | |||
|     if ($Slic3r::GUI::have_OpenGL) { | ||||
|         $canvas = $self->{canvas} = Slic3r::GUI::3DScene->new($self); | ||||
|         $canvas->load_object($self->{model_object}, undef, undef, [0]); | ||||
|         $canvas->set_auto_bed_shape; | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); | ||||
| #        $canvas->set_auto_bed_shape; | ||||
| #============================================================================================================================== | ||||
|         $canvas->SetSize([500,500]); | ||||
|         $canvas->SetMinSize($canvas->GetSize); | ||||
|     } | ||||
|  |  | |||
|  | @ -160,7 +160,10 @@ sub new { | |||
|         }); | ||||
|          | ||||
|         $canvas->load_object($self->{model_object}, undef, undef, [0]); | ||||
|         $canvas->set_auto_bed_shape; | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); | ||||
| #        $canvas->set_auto_bed_shape; | ||||
| #============================================================================================================================== | ||||
|         $canvas->SetSize([500,700]); | ||||
|         $canvas->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config}); | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri