Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorover0219 <over0219@umn.edu>2020-06-08 22:38:27 +0300
committerover0219 <over0219@umn.edu>2020-06-08 22:38:27 +0300
commitb86af3ecb70dd2f38e1f7c84af15a0b82662d81d (patch)
treeeab99c4c4cbb4874469b2df592db79041ce30ff6 /source
parent9ceb298156044e616bcea97b3c82f1c416ec4385 (diff)
added tetgen
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/CMakeLists.txt10
-rw-r--r--source/blender/blenkernel/intern/mesh_remesh_voxel.c87
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,