diff options
author | over0219 <over0219@umn.edu> | 2020-06-08 22:38:27 +0300 |
---|---|---|
committer | over0219 <over0219@umn.edu> | 2020-06-08 22:38:27 +0300 |
commit | b86af3ecb70dd2f38e1f7c84af15a0b82662d81d (patch) | |
tree | eab99c4c4cbb4874469b2df592db79041ce30ff6 /source | |
parent | 9ceb298156044e616bcea97b3c82f1c416ec4385 (diff) |
added tetgen
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_remesh_voxel.c | 87 |
2 files changed, 97 insertions, 0 deletions
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index ffe0d16dbc1..e7724cd344f 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -675,6 +675,16 @@ if(WITH_QUADRIFLOW) add_definitions(-DWITH_QUADRIFLOW) endif() +if(WITH_TETGEN) + list(APPEND INC + ../../../intern/tetgen + ) + list(APPEND LIB + bf_intern_tetgen + ) + add_definitions(-DWITH_TETGEN) +endif() + if(WITH_XR_OPENXR) add_definitions(-DWITH_XR_OPENXR) endif() diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c index 3daf9f2752e..2b279e3d87c 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c @@ -56,6 +56,10 @@ # include "quadriflow_capi.hpp" #endif +#ifdef WITH_TETGEN +# include "tetgen_api.h" +#endif + #ifdef WITH_OPENVDB struct OpenVDBLevelSet *BKE_mesh_remesh_voxel_ovdb_mesh_to_level_set_create( Mesh *mesh, struct OpenVDBTransform *transform) @@ -260,6 +264,89 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh, } #endif +#ifdef WITH_TETGEN +static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh) +{ + // Ensure that the triangulated mesh data is up to data + BKE_mesh_runtime_looptri_recalc(input_mesh); + const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(input_mesh); + + // Gather the required data + MVertTri *verttri = MEM_callocN(sizeof(*verttri) * BKE_mesh_runtime_looptri_len(input_mesh), + "remesh_looptri"); + BKE_mesh_runtime_verttri_from_looptri( + verttri, input_mesh->mloop, looptri, BKE_mesh_runtime_looptri_len(input_mesh)); + + unsigned int totfaces = BKE_mesh_runtime_looptri_len(input_mesh); + unsigned int totverts = input_mesh->totvert; + float *verts = (float *)MEM_malloc_arrayN(totverts * 3, sizeof(float), "remesh_input_verts"); + unsigned int *faces = (unsigned int *)MEM_malloc_arrayN( + totfaces * 3, sizeof(unsigned int), "remesh_intput_faces"); + + for (unsigned int i = 0; i < totverts; i++) { + MVert *mvert = &input_mesh->mvert[i]; + verts[i * 3] = mvert->co[0]; + verts[i * 3 + 1] = mvert->co[1]; + verts[i * 3 + 2] = mvert->co[2]; + } + + for (unsigned int i = 0; i < totfaces; i++) { + MVertTri *vt = &verttri[i]; + faces[i * 3] = vt->tri[0]; + faces[i * 3 + 1] = vt->tri[1]; + faces[i * 3 + 2] = vt->tri[2]; + } + + // Call the tetgen remesher + TetGenRemeshData tg; + init_tetgenremeshdata(&tg); + tg.in_totfaces = totfaces; + tg.in_totverts = totverts; + tg.in_verts = verts; + tg.in_faces = faces; + bool success = tetgen_resmesh(&tg); + + MEM_freeN(verts); + MEM_freeN(faces); + MEM_freeN(verttri); + + Mesh *mesh = NULL; + if (success) + { + // Construct the new output mesh + mesh = BKE_mesh_new_nomain( + tg.out_totverts, 0, 0, (tg.out_totfacets * 3), tg.out_totfacets); + + for (int i = 0; i < tg.out_totverts; i++) { + copy_v3_v3(mesh->mvert[i].co, &tg.out_verts[i * 3]); + } + + MPoly *mp = mesh->mpoly; + MLoop *ml = mesh->mloop; + for (int i = 0; i < tg.out_totfacets; i++, mp++, ml += 3) { + mp->loopstart = (int)(ml - mesh->mloop); + mp->totloop = 3; + ml[0].v = tg.out_facets[i * 3]; + ml[1].v = tg.out_facets[i * 3 + 1]; + ml[2].v = tg.out_facets[i * 3 + 2]; + } + BKE_mesh_calc_edges(mesh, false, false); + BKE_mesh_calc_normals(mesh); + } // end success + + if (tg.out_verts) + MEM_freeN(tg.out_verts); + + if (tg.out_facets) + MEM_freeN(tg.out_facets); + + if (tg.out_tets) + MEM_freeN(tg.out_tets); + + return mesh; +} +#endif + Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(Mesh *mesh, int target_faces, int seed, |