mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	SLA support gizmo does not use Grabber class anymore
This commit is contained in:
		
							parent
							
								
									fab3025107
								
							
						
					
					
						commit
						9dff44a8ad
					
				
					 5 changed files with 41 additions and 64 deletions
				
			
		|  | @ -71,7 +71,6 @@ public: | |||
|         int m_face_id = -1; | ||||
|         const EigenMesh3D& m_mesh; | ||||
|         Vec3d m_dir; | ||||
|         Vec3d m_source; | ||||
|         inline hit_result(const EigenMesh3D& em): m_mesh(em) {} | ||||
|         friend class EigenMesh3D; | ||||
|     public: | ||||
|  |  | |||
|  | @ -163,7 +163,6 @@ EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const | |||
|     hit_result ret(*this); | ||||
|     ret.m_t = double(hit.t); | ||||
|     ret.m_dir = dir; | ||||
|     ret.m_source = s; | ||||
|     if(!std::isinf(hit.t) && !std::isnan(hit.t)) ret.m_face_id = hit.id; | ||||
| 
 | ||||
|     return ret; | ||||
|  |  | |||
|  | @ -3411,7 +3411,7 @@ void GLCanvas3D::Gizmos::delete_current_grabber(bool delete_all) | |||
| 
 | ||||
|     GizmosMap::const_iterator it = m_gizmos.find(SlaSupports); | ||||
|     if (it != m_gizmos.end()) | ||||
|         reinterpret_cast<GLGizmoSlaSupports*>(it->second)->delete_current_grabber(delete_all); | ||||
|         reinterpret_cast<GLGizmoSlaSupports*>(it->second)->delete_current_point(delete_all); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::Gizmos::render_current_gizmo(const GLCanvas3D::Selection& selection) const | ||||
|  |  | |||
|  | @ -1799,7 +1799,8 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const G | |||
|                 } | ||||
|             } | ||||
|         } | ||||
|         m_editing_mode_cache = m_model_object->sla_support_points; // make a copy of ModelObject's support points
 | ||||
|         if (m_old_model_object != m_model_object) | ||||
|             m_editing_mode_cache = m_model_object->sla_support_points; // make a copy of ModelObject's support points
 | ||||
|         if (m_state == On) { | ||||
|             m_parent.toggle_model_objects_visibility(false); | ||||
|             m_parent.toggle_model_objects_visibility(true, m_model_object); | ||||
|  | @ -1812,21 +1813,7 @@ void GLGizmoSlaSupports::on_render(const GLCanvas3D::Selection& selection) const | |||
|     ::glEnable(GL_BLEND); | ||||
|     ::glEnable(GL_DEPTH_TEST); | ||||
| 
 | ||||
|     for (unsigned int i=0; i<m_grabbers.size(); ++i) { | ||||
|         bool supports_new_island = m_lock_unique_islands && m_editing_mode_cache[i].is_new_island; | ||||
|         Grabber& g = m_grabbers[i]; | ||||
|         if (m_editing_mode) { | ||||
|             g.color[0] = supports_new_island ? 0.f : 1.f; | ||||
|             g.color[1] = 0.f; | ||||
|             g.color[2] = supports_new_island ? 1.f : 0.f; | ||||
|         } | ||||
|         else { | ||||
|             for (unsigned char i=0; i<3; ++i) g.color[i] = 0.5f; | ||||
|         } | ||||
|              | ||||
|     } | ||||
| 
 | ||||
|     render_grabbers(selection, false); | ||||
|     render_points(selection, false); | ||||
| 
 | ||||
| #if !ENABLE_IMGUI | ||||
|     render_tooltip_texture(); | ||||
|  | @ -1838,15 +1825,11 @@ void GLGizmoSlaSupports::on_render(const GLCanvas3D::Selection& selection) const | |||
| void GLGizmoSlaSupports::on_render_for_picking(const GLCanvas3D::Selection& selection) const | ||||
| { | ||||
|     ::glEnable(GL_DEPTH_TEST); | ||||
|     for (unsigned int i=0; i<m_grabbers.size(); ++i) { | ||||
|         m_grabbers[i].color[0] = 1.0f; | ||||
|         m_grabbers[i].color[1] = 1.0f; | ||||
|         m_grabbers[i].color[2] = picking_color_component(i); | ||||
|     } | ||||
|     render_grabbers(selection, true); | ||||
| 
 | ||||
|     render_points(selection, true); | ||||
| } | ||||
| 
 | ||||
| void GLGizmoSlaSupports::render_grabbers(const GLCanvas3D::Selection& selection, bool picking) const | ||||
| void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, bool picking) const | ||||
| { | ||||
|     if (m_quadric == nullptr) | ||||
|         return; | ||||
|  | @ -1867,26 +1850,42 @@ void GLGizmoSlaSupports::render_grabbers(const GLCanvas3D::Selection& selection, | |||
|         ::glEnable(GL_LIGHTING); | ||||
| 
 | ||||
|     float render_color[3]; | ||||
|     for (int i = 0; i < (int)m_grabbers.size(); ++i) | ||||
|     for (int i = 0; i < (int)m_editing_mode_cache.size(); ++i) | ||||
|     { | ||||
|         const Vec3f& point_pos = m_editing_mode_cache[i].pos; | ||||
|         // first precalculate the grabber position in world coordinates, so that the grabber
 | ||||
|         // is not scaled with the object (as it would be if rendered with current gl matrix).
 | ||||
|         Eigen::Matrix<GLfloat, 4, 4> glmatrix; | ||||
|         Eigen::Matrix<GLfloat, 4, 4, Eigen::DontAlign> glmatrix; | ||||
|         glGetFloatv (GL_MODELVIEW_MATRIX, glmatrix.data()); | ||||
|         Eigen::Matrix<float, 4, 1> grabber_pos; | ||||
|         Eigen::Matrix<float, 4, 1, Eigen::DontAlign> point_pos_4d; | ||||
|         for (int j=0; j<3; ++j) | ||||
|             grabber_pos(j) = m_grabbers[i].center(j); | ||||
|         grabber_pos[3] = 1.f; | ||||
|         Eigen::Matrix<float, 4, 1> grabber_world_position = glmatrix * grabber_pos; | ||||
|             point_pos_4d(j) = point_pos(j); | ||||
|         point_pos_4d[3] = 1.f; | ||||
|         Eigen::Matrix<float, 4, 1, Eigen::DontAlign> grabber_world_position = glmatrix * point_pos_4d; | ||||
| 
 | ||||
|         if (!picking && (m_hover_id == i)) | ||||
|         if (!picking && (m_hover_id == i)) // point is in hover state
 | ||||
|         { | ||||
|             render_color[0] = 1.0f - m_grabbers[i].color[0]; | ||||
|             render_color[1] = 1.0f - m_grabbers[i].color[1]; | ||||
|             render_color[2] = 1.0f - m_grabbers[i].color[2]; | ||||
|             render_color[0] = 0.f; | ||||
|             render_color[1] = 1.0f; | ||||
|             render_color[2] = 1.0f; | ||||
|         } | ||||
|         else { | ||||
|             if (picking) { | ||||
|                 render_color[0] = 1.0f; | ||||
|                 render_color[1] = 1.0f; | ||||
|                 render_color[2] = picking_color_component(i); | ||||
|             } | ||||
|             else { // normal rendering
 | ||||
|                 bool supports_new_island = m_lock_unique_islands && m_editing_mode_cache[i].is_new_island; | ||||
|                 if (m_editing_mode) { | ||||
|                     render_color[0] = supports_new_island ? 0.f : 1.f; | ||||
|                     render_color[1] = 0.f; | ||||
|                     render_color[2] = supports_new_island ? 1.f : 0.f; | ||||
|                 } | ||||
|                 else | ||||
|                     for (unsigned char i=0; i<3; ++i) render_color[i] = 0.5f; | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|             ::memcpy((void*)render_color, (const void*)m_grabbers[i].color, 3 * sizeof(float)); | ||||
| 
 | ||||
|         ::glColor3fv(render_color); | ||||
|         ::glPushMatrix(); | ||||
|  | @ -1939,14 +1938,8 @@ void GLGizmoSlaSupports::update_mesh() | |||
|     m_AABB = igl::AABB<Eigen::MatrixXf,3>(); | ||||
|     m_AABB.init(m_V, m_F); | ||||
| 
 | ||||
|     // we'll now reload Grabbers (selection might have changed):
 | ||||
|     m_grabbers.clear(); | ||||
|     // we'll now reload support points (selection might have changed):
 | ||||
|     m_editing_mode_cache = m_model_object->sla_support_points; | ||||
| 
 | ||||
|     for (const sla::SupportPoint& point : m_editing_mode_cache) { | ||||
|         m_grabbers.push_back(Grabber()); | ||||
|         m_grabbers.back().center = point.pos.cast<double>(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| Vec3f GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) | ||||
|  | @ -2007,13 +2000,10 @@ void GLGizmoSlaSupports::clicked_on_object(const Vec2d& mouse_position) | |||
| 
 | ||||
|     Vec3f new_pos; | ||||
|     try { | ||||
|         new_pos = unproject_on_mesh(mouse_position); // this can throw - we don't want to create a new grabber in that case
 | ||||
|         new_pos = unproject_on_mesh(mouse_position); // this can throw - we don't want to create a new point in that case
 | ||||
|     } | ||||
|     catch (...) { return; } | ||||
| 
 | ||||
|     m_grabbers.push_back(Grabber()); | ||||
|     m_grabbers.back().center = new_pos.cast<double>(); | ||||
|      | ||||
|     m_editing_mode_cache.emplace_back(new_pos, m_new_point_head_diameter, false); | ||||
| 
 | ||||
|     // This should trigger the support generation
 | ||||
|  | @ -2022,13 +2012,12 @@ void GLGizmoSlaSupports::clicked_on_object(const Vec2d& mouse_position) | |||
|     m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); | ||||
| } | ||||
| 
 | ||||
| void GLGizmoSlaSupports::delete_current_grabber(bool delete_all) | ||||
| void GLGizmoSlaSupports::delete_current_point(bool delete_all) | ||||
| { | ||||
|     if (!m_editing_mode && !delete_all) | ||||
|         return; | ||||
| 
 | ||||
|     if (delete_all) { | ||||
|         m_grabbers.clear(); | ||||
|         m_editing_mode_cache.clear(); | ||||
| 
 | ||||
|         // This should trigger the support generation
 | ||||
|  | @ -2037,7 +2026,6 @@ void GLGizmoSlaSupports::delete_current_grabber(bool delete_all) | |||
|     else | ||||
|         if (m_hover_id != -1) { | ||||
|             if (!m_editing_mode_cache[m_hover_id].is_new_island || !m_lock_unique_islands) { | ||||
|                 m_grabbers.erase(m_grabbers.begin() + m_hover_id); | ||||
|                 m_editing_mode_cache.erase(m_editing_mode_cache.begin() + m_hover_id); | ||||
|                 m_hover_id = -1; | ||||
| 
 | ||||
|  | @ -2056,7 +2044,6 @@ void GLGizmoSlaSupports::on_update(const UpdateData& data, const GLCanvas3D::Sel | |||
|             new_pos = unproject_on_mesh(Vec2d((*data.mouse_pos)(0), (*data.mouse_pos)(1))); | ||||
|         } | ||||
|         catch (...) { return; } | ||||
|         m_grabbers[m_hover_id].center = new_pos.cast<double>(); | ||||
|         m_editing_mode_cache[m_hover_id].pos = new_pos; | ||||
|         m_editing_mode_cache[m_hover_id].is_new_island = false; | ||||
|         // Do not update immediately, wait until the mouse is released.
 | ||||
|  | @ -2161,13 +2148,6 @@ RENDER_AGAIN: | |||
|         if (discard_changes) { | ||||
|             m_editing_mode_cache = m_model_object->sla_support_points; | ||||
|             m_editing_mode = false; | ||||
| 
 | ||||
|             m_grabbers.clear(); | ||||
|             for (const sla::SupportPoint& point : m_editing_mode_cache) { | ||||
|                 m_grabbers.push_back(Grabber()); | ||||
|                 m_grabbers.back().center = point.pos.cast<double>(); | ||||
|             } | ||||
| 
 | ||||
|             force_refresh = true; | ||||
|         } | ||||
|     } | ||||
|  | @ -2183,7 +2163,6 @@ RENDER_AGAIN: | |||
|         force_refresh |= generate; | ||||
|         if (generate) { | ||||
|             m_model_object->sla_support_points.clear(); | ||||
|             m_grabbers.clear(); | ||||
|             m_editing_mode_cache.clear(); | ||||
|             wxGetApp().plater()->reslice(); | ||||
|         } | ||||
|  | @ -2206,7 +2185,7 @@ RENDER_AGAIN: | |||
|     if (remove_all_points) { | ||||
|         force_refresh = false; | ||||
|         m_parent.reload_scene(true); | ||||
|         delete_current_grabber(true); | ||||
|         delete_current_point(true); | ||||
|         if (first_run) { | ||||
|             first_run = false; | ||||
|             goto RENDER_AGAIN; | ||||
|  |  | |||
|  | @ -464,7 +464,7 @@ public: | |||
|     virtual ~GLGizmoSlaSupports(); | ||||
|     void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); | ||||
|     void clicked_on_object(const Vec2d& mouse_position); | ||||
|     void delete_current_grabber(bool delete_all); | ||||
|     void delete_current_point(bool delete_all); | ||||
| 
 | ||||
| private: | ||||
|     bool on_init(); | ||||
|  | @ -472,7 +472,7 @@ private: | |||
|     virtual void on_render(const GLCanvas3D::Selection& selection) const; | ||||
|     virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; | ||||
| 
 | ||||
|     void render_grabbers(const GLCanvas3D::Selection& selection, bool picking = false) const; | ||||
|     void render_points(const GLCanvas3D::Selection& selection, bool picking = false) const; | ||||
|     bool is_mesh_update_necessary() const; | ||||
|     void update_mesh(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lukas Matena
						Lukas Matena