mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Fixed selection and rendering in object settings dialog
This commit is contained in:
		
							parent
							
								
									7b1187992c
								
							
						
					
					
						commit
						7b4870d1cb
					
				
					 3 changed files with 45 additions and 12 deletions
				
			
		|  | @ -156,10 +156,9 @@ sub new { | ||||||
| #============================================================================================================================== | #============================================================================================================================== | ||||||
|         Slic3r::GUI::_3DScene::enable_picking($canvas, 1); |         Slic3r::GUI::_3DScene::enable_picking($canvas, 1); | ||||||
|         Slic3r::GUI::_3DScene::set_select_by($canvas, 'volume'); |         Slic3r::GUI::_3DScene::set_select_by($canvas, 'volume'); | ||||||
|         Slic3r::GUI::_3DScene::register_on_select_callback($canvas, sub { |         Slic3r::GUI::_3DScene::register_on_select_object_callback($canvas, sub { | ||||||
|             my ($volume_idx) = @_; |             my ($volume_idx) = @_; | ||||||
|             # convert scene volume to model object volume |             $self->reload_tree($volume_idx); | ||||||
|             $self->reload_tree(($volume_idx == -1) ? undef : $canvas->volumes->[$volume_idx]->volume_idx); |  | ||||||
|         }); |         }); | ||||||
|         Slic3r::GUI::_3DScene::load_model_object($canvas, $self->{model_object}, 0, [0]); |         Slic3r::GUI::_3DScene::load_model_object($canvas, $self->{model_object}, 0, [0]); | ||||||
|         Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); |         Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas); | ||||||
|  |  | ||||||
|  | @ -380,6 +380,16 @@ GLCanvas3D::Bed::Bed() | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool GLCanvas3D::Bed::is_prusa() const | ||||||
|  | { | ||||||
|  |     return (m_type == MK2) || (m_type == MK3); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool GLCanvas3D::Bed::is_custom() const | ||||||
|  | { | ||||||
|  |     return m_type == Custom; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const Pointfs& GLCanvas3D::Bed::get_shape() const | const Pointfs& GLCanvas3D::Bed::get_shape() const | ||||||
| { | { | ||||||
|     return m_shape; |     return m_shape; | ||||||
|  | @ -610,7 +620,7 @@ void GLCanvas3D::Bed::_render_custom() const | ||||||
|     if (triangles_vcount > 0) |     if (triangles_vcount > 0) | ||||||
|     { |     { | ||||||
|         ::glEnable(GL_LIGHTING); |         ::glEnable(GL_LIGHTING); | ||||||
|         ::glEnable(GL_DEPTH_TEST); |         ::glDisable(GL_DEPTH_TEST); | ||||||
| 
 | 
 | ||||||
|         ::glEnable(GL_BLEND); |         ::glEnable(GL_BLEND); | ||||||
|         ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |         ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||||
|  | @ -625,6 +635,8 @@ void GLCanvas3D::Bed::_render_custom() const | ||||||
|         // draw grid
 |         // draw grid
 | ||||||
|         unsigned int gridlines_vcount = m_gridlines.get_vertices_count(); |         unsigned int gridlines_vcount = m_gridlines.get_vertices_count(); | ||||||
| 
 | 
 | ||||||
|  |         // we need depth test for grid, otherwise it would disappear when looking the object from below
 | ||||||
|  |         ::glEnable(GL_DEPTH_TEST); | ||||||
|         ::glLineWidth(3.0f); |         ::glLineWidth(3.0f); | ||||||
|         ::glColor4f(0.2f, 0.2f, 0.2f, 0.4f); |         ::glColor4f(0.2f, 0.2f, 0.2f, 0.4f); | ||||||
|         ::glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)m_gridlines.get_vertices()); |         ::glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)m_gridlines.get_vertices()); | ||||||
|  | @ -1595,11 +1607,24 @@ void GLCanvas3D::render() | ||||||
|     GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; |     GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; | ||||||
|     ::glLightfv(GL_LIGHT0, GL_POSITION, position_top); |     ::glLightfv(GL_LIGHT0, GL_POSITION, position_top); | ||||||
| 
 | 
 | ||||||
|  |     float theta = m_camera.get_theta(); | ||||||
|  |     bool is_custom_bed = m_bed.is_custom(); | ||||||
|  | 
 | ||||||
|     _picking_pass(); |     _picking_pass(); | ||||||
|     _render_background(); |     _render_background(); | ||||||
|  |     // untextured bed needs to be rendered before objects
 | ||||||
|  |     if (is_custom_bed) | ||||||
|  |     { | ||||||
|  |         _render_bed(theta); | ||||||
|  |         _render_axes(); | ||||||
|  |     } | ||||||
|     _render_objects(); |     _render_objects(); | ||||||
|     _render_bed(m_camera.get_theta()); |     // textured bed needs to be rendered after objects
 | ||||||
|     _render_axes(); |     if (!is_custom_bed) | ||||||
|  |     { | ||||||
|  |         _render_bed(theta); | ||||||
|  |         _render_axes(); | ||||||
|  |     } | ||||||
|     _render_cutting_plane(); |     _render_cutting_plane(); | ||||||
|     _render_warning_texture(); |     _render_warning_texture(); | ||||||
|     _render_legend_texture(); |     _render_legend_texture(); | ||||||
|  | @ -2393,11 +2418,7 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) | ||||||
|     // Don't allow to zoom too far outside the scene.
 |     // Don't allow to zoom too far outside the scene.
 | ||||||
|     float zoom_min = _get_zoom_to_bounding_box_factor(_max_bounding_box()); |     float zoom_min = _get_zoom_to_bounding_box_factor(_max_bounding_box()); | ||||||
|     if (zoom_min > 0.0f) |     if (zoom_min > 0.0f) | ||||||
|     { |         zoom = std::max(zoom, zoom_min * 0.8f); | ||||||
|         zoom_min *= 0.4f; |  | ||||||
|         if (zoom < zoom_min) |  | ||||||
|             zoom = zoom_min; |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|     m_camera.zoom = zoom; |     m_camera.zoom = zoom; | ||||||
|     m_on_viewport_changed_callback.call(); |     m_on_viewport_changed_callback.call(); | ||||||
|  | @ -3946,8 +3967,18 @@ void GLCanvas3D::_on_move(const std::vector<int>& volume_idxs) | ||||||
| 
 | 
 | ||||||
| void GLCanvas3D::_on_select(int volume_idx) | void GLCanvas3D::_on_select(int volume_idx) | ||||||
| { | { | ||||||
|  |     int id = -1; | ||||||
|     if ((m_volumes != nullptr) && (volume_idx < (int)m_volumes->volumes.size())) |     if ((m_volumes != nullptr) && (volume_idx < (int)m_volumes->volumes.size())) | ||||||
|         m_on_select_object_callback.call((volume_idx == -1) ? -1 : m_volumes->volumes[volume_idx]->object_idx()); |     { | ||||||
|  |         if (volume_idx != -1) | ||||||
|  |         { | ||||||
|  |             if (m_select_by == "volume") | ||||||
|  |                 id = m_volumes->volumes[volume_idx]->volume_idx(); | ||||||
|  |             else if (m_select_by == "object") | ||||||
|  |                 id = m_volumes->volumes[volume_idx]->object_idx(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     m_on_select_object_callback.call(id); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::vector<float> GLCanvas3D::_parse_colors(const std::vector<std::string>& colors) | std::vector<float> GLCanvas3D::_parse_colors(const std::vector<std::string>& colors) | ||||||
|  |  | ||||||
|  | @ -189,6 +189,9 @@ public: | ||||||
|     public: |     public: | ||||||
|         Bed(); |         Bed(); | ||||||
| 
 | 
 | ||||||
|  |         bool is_prusa() const; | ||||||
|  |         bool is_custom() const; | ||||||
|  | 
 | ||||||
|         const Pointfs& get_shape() const; |         const Pointfs& get_shape() const; | ||||||
|         void set_shape(const Pointfs& shape); |         void set_shape(const Pointfs& shape); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri