diff options
author | Pablo Dobarro <pablodp606@gmail.com> | 2019-10-07 19:33:28 +0300 |
---|---|---|
committer | Pablo Dobarro <pablodp606@gmail.com> | 2019-10-08 16:58:16 +0300 |
commit | abc36cad833943c0629238bb5a62aaa4ba5679ad (patch) | |
tree | 100ccbcd59d232d66bc115f043cdea895d4ba88e /source | |
parent | 31a45666857b0b8a8b3a55ad0db5f6025711d9d4 (diff) |
Sculpt: Fix projection artifacts by changing the voxel remesh isovalue
This should fix most of the shrinkwrap artifacts when the preserve volume option is active. After this commit the default voxel remehser settings should not fail in the default cube.
Reviewed By: zeddb
Differential Revision: https://developer.blender.org/D6010
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh_remesh_voxel.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_remesh_voxel.c | 13 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/shrinkwrap.c | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_remesh.c | 7 |
4 files changed, 20 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h index cc4a3a01892..86c094b8a6d 100644 --- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h +++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h @@ -43,7 +43,8 @@ struct Mesh *BKE_mesh_remesh_voxel_ovdb_volume_to_mesh_nomain(struct OpenVDBLeve struct Mesh *BKE_mesh_remesh_voxel_fix_poles(struct Mesh *mesh); struct Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(struct Mesh *mesh, float voxel_size, - float adaptivity); + float adaptivity, + float isovalue); struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh, int target_faces, int seed, diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c index 8419a72f97e..b93fe157f2a 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c @@ -295,7 +295,10 @@ Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(Mesh *mesh, return new_mesh; } -Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh, float voxel_size, float adaptivity) +Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh, + float voxel_size, + float adaptivity, + float isovalue) { Mesh *new_mesh = NULL; #ifdef WITH_OPENVDB @@ -304,7 +307,7 @@ Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh, float voxel_size, float a OpenVDBTransform_create_linear_transform(xform, (double)voxel_size); level_set = BKE_mesh_remesh_voxel_ovdb_mesh_to_level_set_create(mesh, xform); new_mesh = BKE_mesh_remesh_voxel_ovdb_volume_to_mesh_nomain( - level_set, 0.0, (float)adaptivity, false); + level_set, (double)isovalue, (double)adaptivity, false); OpenVDBLevelSet_free(level_set); OpenVDBTransform_free(xform); #else @@ -444,6 +447,12 @@ struct Mesh *BKE_mesh_remesh_voxel_fix_poles(struct Mesh *mesh) } BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false); + BM_mesh_elem_hflag_enable_all(bm, BM_FACE, BM_ELEM_TAG, false); + BMO_op_callf(bm, + (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), + "recalc_face_normals faces=%hf", + BM_ELEM_TAG); + BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); Mesh *result = BKE_mesh_from_bmesh_nomain(bm, (&(struct BMeshToMeshParams){ diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 797ae0f0a8a..28f552cec2e 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -1516,6 +1516,7 @@ void BKE_shrinkwrap_remesh_target_project(Mesh *src_me, Mesh *target_me, Object ssmd.shrinkType = MOD_SHRINKWRAP_TARGET_PROJECT; ssmd.shrinkMode = MOD_SHRINKWRAP_ON_SURFACE; ssmd.keepDist = 0.0f; + ssmd.projLimit = target_me->remesh_voxel_size; float(*vertexCos)[3] = BKE_mesh_vert_coords_alloc(src_me, &totvert); diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c index a395a7013fe..35762c5861e 100644 --- a/source/blender/editors/object/object_remesh.c +++ b/source/blender/editors/object/object_remesh.c @@ -117,8 +117,13 @@ static int voxel_remesh_exec(bContext *C, wmOperator *op) ED_sculpt_undo_geometry_begin(ob); } + float isovalue = 0.0f; + if (mesh->flag & ME_REMESH_REPROJECT_VOLUME) { + isovalue = mesh->remesh_voxel_size * 0.3f; + } + new_mesh = BKE_mesh_remesh_voxel_to_mesh_nomain( - mesh, mesh->remesh_voxel_size, mesh->remesh_voxel_adaptivity); + mesh, mesh->remesh_voxel_size, mesh->remesh_voxel_adaptivity, isovalue); if (!new_mesh) { return OPERATOR_CANCELLED; |