[Bf-blender-cvs] [5234e23c2cc] sculpt-dev: Voxel Remesher: Option to preserver material slots

Pablo Dobarro noreply at git.blender.org
Mon Mar 8 17:44:50 CET 2021


Commit: 5234e23c2ccbbcb2c60afa4c175d8f41af26598f
Author: Pablo Dobarro
Date:   Mon Mar 8 17:37:47 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rB5234e23c2ccbbcb2c60afa4c175d8f41af26598f

Voxel Remesher: Option to preserver material slots

===================================================================

M	release/scripts/startup/bl_ui/properties_data_mesh.py
M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/blenkernel/BKE_mesh_remesh_voxel.h
M	source/blender/blenkernel/intern/mesh_remesh_voxel.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/object/object_remesh.c
M	source/blender/makesdna/DNA_mesh_types.h
M	source/blender/makesrna/intern/rna_mesh.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index a9d7b8d71f3..72b9ee71980 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -523,6 +523,7 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
             col.prop(mesh, "use_remesh_preserve_volume", text="Volume")
             col.prop(mesh, "use_remesh_preserve_paint_mask", text="Paint Mask")
             col.prop(mesh, "use_remesh_preserve_sculpt_face_sets", text="Face Sets")
+            col.prop(mesh, "use_remesh_preserve_materials", text="Materials")
             if context.preferences.experimental.use_sculpt_vertex_colors:
                 col.prop(mesh, "use_remesh_preserve_vertex_colors", text="Vertex Colors")
 
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 44a4a63bb9a..f825df66c4c 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -829,6 +829,7 @@ class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
         col.prop(mesh, "use_remesh_preserve_volume", text="Volume")
         col.prop(mesh, "use_remesh_preserve_paint_mask", text="Paint Mask")
         col.prop(mesh, "use_remesh_preserve_sculpt_face_sets", text="Face Sets")
+        col.prop(mesh, "use_remesh_preserve_materials", text="Materials")
         if context.preferences.experimental.use_sculpt_vertex_colors:
             col.prop(mesh, "use_remesh_preserve_vertex_colors", text="Vertex Colors")
 
diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
index 2265fa6e105..01ff7143109 100644
--- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
+++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
@@ -61,6 +61,7 @@ struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh,
 void BKE_mesh_remesh_reproject_paint_mask(struct Mesh *target, struct Mesh *source);
 void BKE_remesh_reproject_vertex_paint(struct Mesh *target, struct Mesh *source);
 void BKE_remesh_reproject_sculpt_face_sets(struct Mesh *target, struct Mesh *source);
+void BKE_remesh_reproject_materials(struct Mesh *target, struct Mesh *source);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
index 0a5aa360553..1bc0eaa8479 100644
--- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c
+++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
@@ -403,6 +403,34 @@ void BKE_remesh_reproject_sculpt_face_sets(Mesh *target, Mesh *source)
   free_bvhtree_from_mesh(&bvhtree);
 }
 
+void BKE_remesh_reproject_materials(Mesh *target, Mesh *source)
+{
+  BVHTreeFromMesh bvhtree = {
+      .nearest_callback = NULL,
+  };
+
+  const MPoly *target_polys = CustomData_get_layer(&target->pdata, CD_MPOLY);
+  const MVert *target_verts = CustomData_get_layer(&target->vdata, CD_MVERT);
+  const MLoop *target_loops = CustomData_get_layer(&target->ldata, CD_MLOOP);
+
+  const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(source);
+  BKE_bvhtree_from_mesh_get(&bvhtree, source, BVHTREE_FROM_LOOPTRI, 2);
+
+  for (int i = 0; i < target->totpoly; i++) {
+    float from_co[3];
+    BVHTreeNearest nearest;
+    nearest.index = -1;
+    nearest.dist_sq = FLT_MAX;
+    const MPoly *mpoly = &target_polys[i];
+    BKE_mesh_calc_poly_center(mpoly, &target_loops[mpoly->loopstart], target_verts, from_co);
+    BLI_bvhtree_find_nearest(bvhtree.tree, from_co, &nearest, bvhtree.nearest_callback, &bvhtree);
+    if (nearest.index != -1) {
+      target->mpoly[i].mat_nr = source->mpoly[looptri[nearest.index].poly].mat_nr;
+    }
+  }
+  free_bvhtree_from_mesh(&bvhtree);
+}
+
 void BKE_remesh_reproject_vertex_paint(Mesh *target, Mesh *source)
 {
   BVHTreeFromMesh bvhtree = {
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 1ecaee10e6a..ec66a102a34 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -3501,8 +3501,9 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
     }
 
     for (Mesh *me = bmain->meshes.first; me; me = me->id.next) {
-      me->flag &= ~(ME_FLAG_UNUSED_0 | ME_FLAG_UNUSED_1 | ME_FLAG_UNUSED_3 | ME_FLAG_UNUSED_4 |
-                    ME_FLAG_UNUSED_6 | ME_FLAG_UNUSED_7 | ME_REMESH_REPROJECT_VERTEX_COLORS);
+      me->flag &= ~(ME_REMESH_REPROJECT_MATERIALS | ME_FLAG_UNUSED_1 | ME_FLAG_UNUSED_3 |
+                    ME_FLAG_UNUSED_4 | ME_FLAG_UNUSED_6 | ME_REMESH_REPROJECT_MATERIALS |
+                    ME_REMESH_REPROJECT_VERTEX_COLORS);
     }
 
     for (Material *mat = bmain->materials.first; mat; mat = mat->id.next) {
diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c
index 9ef2cce875f..42bd0f0d0ca 100644
--- a/source/blender/editors/object/object_remesh.c
+++ b/source/blender/editors/object/object_remesh.c
@@ -162,7 +162,8 @@ static int voxel_remesh_exec(bContext *C, wmOperator *op)
   }
 
   if (mesh->flag & ME_REMESH_REPROJECT_VOLUME || mesh->flag & ME_REMESH_REPROJECT_PAINT_MASK ||
-      mesh->flag & ME_REMESH_REPROJECT_SCULPT_FACE_SETS) {
+      mesh->flag & ME_REMESH_REPROJECT_SCULPT_FACE_SETS ||
+      mesh->flag & ME_REMESH_REPROJECT_MATERIALS) {
     BKE_mesh_runtime_clear_geometry(mesh);
   }
 
@@ -178,6 +179,10 @@ static int voxel_remesh_exec(bContext *C, wmOperator *op)
     BKE_remesh_reproject_sculpt_face_sets(new_mesh, mesh);
   }
 
+  if (mesh->flag & ME_REMESH_REPROJECT_MATERIALS) {
+    BKE_remesh_reproject_materials(new_mesh, mesh);
+  }
+
   if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_COLORS) {
     BKE_mesh_runtime_clear_geometry(mesh);
     BKE_remesh_reproject_vertex_paint(new_mesh, mesh);
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index c2337b28e54..bd75f4c9dae 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -288,7 +288,7 @@ enum {
   ME_FLAG_UNUSED_4 = 1 << 4,     /* cleared */
   ME_AUTOSMOOTH = 1 << 5,
   ME_FLAG_UNUSED_6 = 1 << 6, /* cleared */
-  ME_FLAG_UNUSED_7 = 1 << 7, /* cleared */
+  ME_REMESH_REPROJECT_MATERIALS = 1 << 7,
   ME_REMESH_REPROJECT_VERTEX_COLORS = 1 << 8,
   ME_DS_EXPAND = 1 << 9,
   ME_SCULPT_DYNAMIC_TOPOLOGY = 1 << 10,
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index ed1024116fb..7747d12ddba 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -3265,6 +3265,12 @@ static void rna_def_mesh(BlenderRNA *brna)
       prop, "Preserve Vertex Colors", "Keep the current vertex colors on the new mesh");
   RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
 
+  prop = RNA_def_property(srna, "use_remesh_preserve_materials", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_REMESH_REPROJECT_MATERIALS);
+  RNA_def_property_boolean_default(prop, false);
+  RNA_def_property_ui_text(prop, "Preserve Materials", "Keep the current material slots");
+  RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
   prop = RNA_def_property(srna, "remesh_mode", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_sdna(prop, NULL, "remesh_mode");
   RNA_def_property_enum_items(prop, rna_enum_mesh_remesh_mode_items);



More information about the Bf-blender-cvs mailing list