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