mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	Merge branch 'lh_mm_segmentation'
This commit is contained in:
		
						commit
						dc4afb5bfc
					
				
					 5 changed files with 39 additions and 26 deletions
				
			
		|  | @ -178,12 +178,12 @@ void TriangleSelector::select_patch(const Vec3f& hit, int facet_start, | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_start, float seed_fill_angle) | ||||
| void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_start, float seed_fill_angle, bool force_reselection) | ||||
| { | ||||
|     assert(facet_start < m_orig_size_indices); | ||||
| 
 | ||||
|     // Recompute seed fill only if the cursor is pointing on facet unselected by seed fill.
 | ||||
|     if (int start_facet_idx = select_unsplit_triangle(hit, facet_start); start_facet_idx >= 0 && m_triangles[start_facet_idx].is_selected_by_seed_fill()) | ||||
|     if (int start_facet_idx = select_unsplit_triangle(hit, facet_start); start_facet_idx >= 0 && m_triangles[start_facet_idx].is_selected_by_seed_fill() && !force_reselection) | ||||
|         return; | ||||
| 
 | ||||
|     this->seed_fill_unselect_all_triangles(); | ||||
|  | @ -278,7 +278,7 @@ void TriangleSelector::append_touching_subtriangles(int itriangle, int vertexi, | |||
|         return; | ||||
| 
 | ||||
|     auto process_subtriangle = [this, &itriangle, &vertexi, &vertexj, &touching_subtriangles_out](const int subtriangle_idx, Partition partition) -> void { | ||||
|         assert(subtriangle_idx == -1); | ||||
|         assert(subtriangle_idx != -1); | ||||
|         if (!m_triangles[subtriangle_idx].is_split()) | ||||
|             touching_subtriangles_out.emplace_back(subtriangle_idx); | ||||
|         else if (int midpoint = this->triangle_midpoint(itriangle, vertexi, vertexj); midpoint != -1) | ||||
|  | @ -312,7 +312,7 @@ void TriangleSelector::bucket_fill_select_triangles(const Vec3f& hit, int facet_ | |||
|     } | ||||
| 
 | ||||
|     auto get_all_touching_triangles = [this](int facet_idx, const Vec3i &neighbors, const Vec3i &neighbors_propagated) -> std::vector<int> { | ||||
|         assert(facet_idx != -1 && facet_idx < m_triangles.size()); | ||||
|         assert(facet_idx != -1 && facet_idx < int(m_triangles.size())); | ||||
|         assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors)); | ||||
|         std::vector<int> touching_triangles; | ||||
|         Vec3i            vertices = {m_triangles[facet_idx].verts_idxs[0], m_triangles[facet_idx].verts_idxs[1], m_triangles[facet_idx].verts_idxs[2]}; | ||||
|  |  | |||
|  | @ -49,7 +49,8 @@ public: | |||
| 
 | ||||
|     void seed_fill_select_triangles(const Vec3f &hit,               // point where to start
 | ||||
|                                     int          facet_start,       // facet of the original mesh (unsplit) that the hit point belongs to
 | ||||
|                                     float        seed_fill_angle);  // the maximal angle between two facets to be painted by the same color
 | ||||
|                                     float        seed_fill_angle,   // the maximal angle between two facets to be painted by the same color
 | ||||
|                                     bool         force_reselection = false); // force reselection of the triangle mesh even in cases that mouse is pointing on the selected triangle
 | ||||
| 
 | ||||
|     void bucket_fill_select_triangles(const Vec3f &hit,             // point where to start
 | ||||
|                                     int          facet_start,       // facet of the original mesh (unsplit) that the hit point belongs to
 | ||||
|  |  | |||
|  | @ -322,8 +322,15 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott | |||
|     ImGui::AlignTextToFramePadding(); | ||||
|     ImGui::SameLine(tool_type_offset + m_imgui->scaled(0.f)); | ||||
|     ImGui::PushItemWidth(tool_type_radio_brush); | ||||
|     if (m_imgui->radio_button(m_desc["tool_brush"], m_tool_type == GLGizmoMmuSegmentation::ToolType::BRUSH)) | ||||
|     if (m_imgui->radio_button(m_desc["tool_brush"], m_tool_type == GLGizmoMmuSegmentation::ToolType::BRUSH)) { | ||||
|         m_tool_type = GLGizmoMmuSegmentation::ToolType::BRUSH; | ||||
|         for (auto &triangle_selector : m_triangle_selectors) { | ||||
|             triangle_selector->seed_fill_unselect_all_triangles(); | ||||
|             triangle_selector->request_update_render_data(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     if (ImGui::IsItemHovered()) { | ||||
|         ImGui::BeginTooltip(); | ||||
|  | @ -334,24 +341,6 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott | |||
|     } | ||||
| 
 | ||||
|     ImGui::SameLine(tool_type_offset + tool_type_radio_brush + m_imgui->scaled(0.f)); | ||||
|     ImGui::PushItemWidth(tool_type_radio_bucket_fill); | ||||
|     if (m_imgui->radio_button(m_desc["tool_bucket_fill"], m_tool_type == GLGizmoMmuSegmentation::ToolType::BUCKET_FILL)) { | ||||
|         m_tool_type = GLGizmoMmuSegmentation::ToolType::BUCKET_FILL; | ||||
|         for (auto &triangle_selector : m_triangle_selectors) { | ||||
|             triangle_selector->seed_fill_unselect_all_triangles(); | ||||
|             triangle_selector->request_update_render_data(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (ImGui::IsItemHovered()) { | ||||
|         ImGui::BeginTooltip(); | ||||
|         ImGui::PushTextWrapPos(max_tooltip_width); | ||||
|         ImGui::TextUnformatted(_L("Paints neighboring facets that have the same color.").ToUTF8().data()); | ||||
|         ImGui::PopTextWrapPos(); | ||||
|         ImGui::EndTooltip(); | ||||
|     } | ||||
| 
 | ||||
|     ImGui::SameLine(tool_type_offset + tool_type_radio_brush + tool_type_radio_bucket_fill + m_imgui->scaled(0.f)); | ||||
|     ImGui::PushItemWidth(tool_type_radio_seed_fill); | ||||
|     if (m_imgui->radio_button(m_desc["tool_seed_fill"], m_tool_type == GLGizmoMmuSegmentation::ToolType::SEED_FILL)) { | ||||
|         m_tool_type = GLGizmoMmuSegmentation::ToolType::SEED_FILL; | ||||
|  | @ -369,6 +358,24 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott | |||
|         ImGui::EndTooltip(); | ||||
|     } | ||||
| 
 | ||||
|     ImGui::SameLine(tool_type_offset + tool_type_radio_brush + tool_type_radio_seed_fill + m_imgui->scaled(0.f)); | ||||
|     ImGui::PushItemWidth(tool_type_radio_bucket_fill); | ||||
|     if (m_imgui->radio_button(m_desc["tool_bucket_fill"], m_tool_type == GLGizmoMmuSegmentation::ToolType::BUCKET_FILL)) { | ||||
|         m_tool_type = GLGizmoMmuSegmentation::ToolType::BUCKET_FILL; | ||||
|         for (auto &triangle_selector : m_triangle_selectors) { | ||||
|             triangle_selector->seed_fill_unselect_all_triangles(); | ||||
|             triangle_selector->request_update_render_data(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (ImGui::IsItemHovered()) { | ||||
|         ImGui::BeginTooltip(); | ||||
|         ImGui::PushTextWrapPos(max_tooltip_width); | ||||
|         ImGui::TextUnformatted(_L("Paints neighboring facets that have the same color.").ToUTF8().data()); | ||||
|         ImGui::PopTextWrapPos(); | ||||
|         ImGui::EndTooltip(); | ||||
|     } | ||||
| 
 | ||||
|     ImGui::Separator(); | ||||
| 
 | ||||
|     if(m_tool_type == ToolType::BRUSH) { | ||||
|  |  | |||
|  | @ -283,7 +283,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous | |||
|             return true; | ||||
|         } | ||||
|         else if (alt_down) { | ||||
|             if (m_tool_type == ToolType::BRUSH) { | ||||
|             if (m_tool_type == ToolType::BRUSH && (m_cursor_type == TriangleSelector::CursorType::SPHERE || m_cursor_type == TriangleSelector::CursorType::CIRCLE)) { | ||||
|                 m_cursor_radius = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_cursor_radius - CursorRadiusStep, CursorRadiusMin) | ||||
|                                                                               : std::min(m_cursor_radius + CursorRadiusStep, CursorRadiusMax); | ||||
|                 m_parent.set_as_dirty(); | ||||
|  | @ -292,6 +292,11 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous | |||
|                 m_seed_fill_angle = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_seed_fill_angle - SeedFillAngleStep, SeedFillAngleMin) | ||||
|                                                                                 : std::min(m_seed_fill_angle + SeedFillAngleStep, SeedFillAngleMax); | ||||
|                 m_parent.set_as_dirty(); | ||||
|                 if (m_rr.mesh_id != -1) { | ||||
|                     m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), m_seed_fill_angle, true); | ||||
|                     m_triangle_selectors[m_rr.mesh_id]->request_update_render_data(); | ||||
|                     m_seed_fill_last_mesh_id = m_rr.mesh_id; | ||||
|                 } | ||||
|                 return true; | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -114,7 +114,7 @@ protected: | |||
| 
 | ||||
|     bool     m_triangle_splitting_enabled = true; | ||||
|     ToolType m_tool_type                  = ToolType::BRUSH; | ||||
|     float    m_seed_fill_angle            = 0.f; | ||||
|     float    m_seed_fill_angle            = 30.f; | ||||
| 
 | ||||
|     static constexpr float SeedFillAngleMin  = 0.0f; | ||||
|     static constexpr float SeedFillAngleMax  = 90.f; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lukáš Hejl
						Lukáš Hejl