Commit: 73da0bdf64ca94355d425fadd873aeec087160d9
Author: Pablo Dobarro
Date:   Fri Apr 12 16:49:51 2019 +0200
Branches: sculpt-mode-features
https://developer.blender.org/rB73da0bdf64ca94355d425fadd873aeec087160d9

Voxel remesher: Reproject mask option

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

M       release/scripts/startup/bl_ui/properties_data_mesh.py
M       source/blender/blenkernel/BKE_remesh.h
M       source/blender/blenkernel/intern/remesh_voxel.c
M       source/blender/editors/object/object_edit.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 bf2a1d00d20..8c9e46e7b7f 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -472,6 +472,7 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
         col.prop(mesh, "voxel_size")
         col.prop(mesh, "smooth_normals")
         col.prop(mesh, "reproject_vertex_paint")
+        col.prop(mesh, "reproject_paint_mask")
         col.operator("object.remesh", text="Remesh")
 
 
diff --git a/source/blender/blenkernel/BKE_remesh.h 
b/source/blender/blenkernel/BKE_remesh.h
index d3ea0a1c928..a58e7baae9a 100644
--- a/source/blender/blenkernel/BKE_remesh.h
+++ b/source/blender/blenkernel/BKE_remesh.h
@@ -34,7 +34,9 @@ Mesh *BKE_remesh_voxel_ovdb_volume_to_mesh_nomain(struct 
OpenVDBLevelSet *level_
 
 /* MVertCol based Reprojection for remesh operator */
 void BKE_remesh_voxel_init_empty_vertex_color_layer(Mesh *mesh);
+void BKE_remesh_voxel_reproject(Mesh *target, Mesh *source, const int flag);
 void BKE_remesh_voxel_reproject_vertex_paint(Mesh *target, Mesh *source);
+void BKE_remesh_voxel_reproject_paint_mask(Mesh *target, Mesh *source);
 
 /* MLoopCol remapping based Reprojection for remesh modifier */
 MLoopCol* BKE_remesh_remap_loop_vertex_color_layer(Mesh *mesh);
diff --git a/source/blender/blenkernel/intern/remesh_voxel.c 
b/source/blender/blenkernel/intern/remesh_voxel.c
index f79bb783238..479a6891a88 100644
--- a/source/blender/blenkernel/intern/remesh_voxel.c
+++ b/source/blender/blenkernel/intern/remesh_voxel.c
@@ -163,6 +163,89 @@ void BKE_remesh_voxel_reproject_vertex_paint(Mesh *target, 
Mesh *source)
        free_bvhtree_from_mesh(&bvhtree);
 }
 
+void BKE_remesh_voxel_reproject_paint_mask(Mesh *target, Mesh *source)
+{
+       BVHTreeFromMesh bvhtree = {NULL};
+       BKE_bvhtree_from_mesh_get(&bvhtree, source, BVHTREE_FROM_VERTS, 2);
+       MVert *target_verts =  CustomData_get_layer(&target->vdata, CD_MVERT);
+
+       float *target_mask;
+       if (CustomData_has_layer(&target->vdata, CD_PAINT_MASK)) {
+               target_mask = CustomData_get_layer(&target->vdata, 
CD_PAINT_MASK);
+       }
+       else {
+               target_mask = CustomData_add_layer(&target->vdata, 
CD_PAINT_MASK, CD_CALLOC, NULL, target->totvert);
+       }
+
+       float *source_mask;
+       if (CustomData_has_layer(&source->vdata, CD_PAINT_MASK)) {
+               source_mask = CustomData_get_layer(&source->vdata, 
CD_PAINT_MASK);
+       }
+       else {
+               source_mask = CustomData_add_layer(&source->vdata, 
CD_PAINT_MASK, CD_CALLOC, NULL, source->totvert);
+       }
+
+       for(int i = 0; i < target->totvert; i++) {
+               float from_co[3];
+               BVHTreeNearest nearest;
+               nearest.index = -1;
+               nearest.dist_sq = FLT_MAX;
+               copy_v3_v3(from_co, target_verts[i].co);
+               BLI_bvhtree_find_nearest(bvhtree.tree, from_co, &nearest, 
bvhtree.nearest_callback, &bvhtree);
+               if (nearest.index != -1) {
+                       target_mask[i] = source_mask[nearest.index];
+               }
+       }
+       free_bvhtree_from_mesh(&bvhtree);
+}
+
+void BKE_remesh_voxel_reproject(Mesh *target, Mesh *source, const int flag)
+{
+       BVHTreeFromMesh bvhtree = {NULL};
+       BKE_bvhtree_from_mesh_get(&bvhtree, source, BVHTREE_FROM_VERTS, 2);
+       MVert *target_verts =  CustomData_get_layer(&target->vdata, CD_MVERT);
+
+       MVertCol *target_color = CustomData_get_layer(&target->vdata, 
CD_MVERTCOL);
+       MVertCol *source_color  = CustomData_get_layer(&source->vdata, 
CD_MVERTCOL);
+
+       float *target_mask;
+       if (CustomData_has_layer(&target->vdata, CD_PAINT_MASK)) {
+               target_mask = CustomData_get_layer(&target->vdata, 
CD_PAINT_MASK);
+       }
+       else {
+               target_mask = CustomData_add_layer(&target->vdata, 
CD_PAINT_MASK, CD_CALLOC, NULL, target->totvert);
+       }
+
+       float *source_mask;
+       if (CustomData_has_layer(&source->vdata, CD_PAINT_MASK)) {
+               source_mask = CustomData_get_layer(&source->vdata, 
CD_PAINT_MASK);
+       }
+       else {
+               source_mask = CustomData_add_layer(&source->vdata, 
CD_PAINT_MASK, CD_CALLOC, NULL, source->totvert);
+       }
+
+       for(int i = 0; i < target->totvert; i++) {
+               float from_co[3];
+               BVHTreeNearest nearest;
+               nearest.index = -1;
+               nearest.dist_sq = FLT_MAX;
+               copy_v3_v3(from_co, target_verts[i].co);
+               BLI_bvhtree_find_nearest(bvhtree.tree, from_co, &nearest, 
bvhtree.nearest_callback, &bvhtree);
+               if (nearest.index != -1) {
+                       if (flag & ME_REMESH_REPROJECT_VERTEX_PAINT) {
+                               target_color[i].r = 
source_color[nearest.index].r;
+                               target_color[i].g = 
source_color[nearest.index].g;
+                               target_color[i].b = 
source_color[nearest.index].b;
+                               target_color[i].a = 
source_color[nearest.index].a;
+                       }
+                       if (flag & ME_REMESH_REPROJECT_PAINT_MASK) {
+                               target_mask[i] = source_mask[nearest.index];
+                       }
+               }
+       }
+       free_bvhtree_from_mesh(&bvhtree);
+}
+
 /*caller needs to free returned data */
 MLoopCol* BKE_remesh_remap_loop_vertex_color_layer(Mesh *mesh)
 {
diff --git a/source/blender/editors/object/object_edit.c 
b/source/blender/editors/object/object_edit.c
index d87327f0277..ccc088713af 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1797,7 +1797,8 @@ static int remesh_exec(bContext *C, wmOperator *op)
                OpenVDBTransform_free(xform);
 
                Mesh *objMesh_copy;
-               if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_PAINT) {
+               if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_PAINT ||
+                       mesh->flag & ME_REMESH_REPROJECT_PAINT_MASK) {
                        objMesh_copy = BKE_mesh_new_nomain_from_template(mesh, 
mesh->totvert, 0, 0, 0, 0);
                        CustomData_copy(&mesh->vdata, &objMesh_copy->vdata, 
CD_MASK_MESH.vmask, CD_DUPLICATE, mesh->totvert);
                        for(int i = 0; i < mesh->totvert; i++) {
@@ -1809,8 +1810,9 @@ static int remesh_exec(bContext *C, wmOperator *op)
 
                BKE_remesh_voxel_init_empty_vertex_color_layer(mesh);
 
-               if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_PAINT) {
-                       BKE_remesh_voxel_reproject_vertex_paint(mesh, 
objMesh_copy);
+               if (mesh->flag & ME_REMESH_REPROJECT_VERTEX_PAINT ||
+                       mesh->flag & ME_REMESH_REPROJECT_PAINT_MASK) {
+                       BKE_remesh_voxel_reproject(mesh, objMesh_copy, 
mesh->flag);
                        BKE_mesh_free(objMesh_copy);
                }
 
diff --git a/source/blender/makesdna/DNA_mesh_types.h 
b/source/blender/makesdna/DNA_mesh_types.h
index b8096358a24..843dbb48dd6 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -248,6 +248,7 @@ enum {
        ME_SCULPT_DYNAMIC_TOPOLOGY = 1 << 10,
        ME_REMESH_SMOOTH_NORMALS   = 1 << 11,
        ME_REMESH_REPROJECT_VERTEX_PAINT   = 1 << 12,
+       ME_REMESH_REPROJECT_PAINT_MASK   = 1 << 13,
 };
 
 /* me->cd_flag */
diff --git a/source/blender/makesrna/intern/rna_mesh.c 
b/source/blender/makesrna/intern/rna_mesh.c
index 22456c583a6..24e412a789e 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -2754,6 +2754,13 @@ static void rna_def_mesh(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Reproject Vertex Paint",
                                 "Keep the current vertex paint on the new 
mesh");
        RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+       prop = RNA_def_property(srna, "reproject_paint_mask", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", 
ME_REMESH_REPROJECT_PAINT_MASK);
+       RNA_def_property_boolean_default(prop, false);
+       RNA_def_property_ui_text(prop, "Reproject Mask",
+                                "Keep the current mask on the new mesh");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
        /* End remesher */
 
        prop = RNA_def_property(srna, "use_auto_smooth", PROP_BOOLEAN, 
PROP_NONE);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to