diff options
author | over0219 <over0219@umn.edu> | 2020-06-09 01:50:36 +0300 |
---|---|---|
committer | over0219 <over0219@umn.edu> | 2020-06-09 01:50:36 +0300 |
commit | 5128d86a6f587bd49eaf2207c7b1d5c67b1ff728 (patch) | |
tree | 5fcca6ad874b5d7606337636195e3674ab200641 | |
parent | b86af3ecb70dd2f38e1f7c84af15a0b82662d81d (diff) |
added tetgen
-rw-r--r-- | intern/tetgen/tetgen_api.h | 1 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_data_mesh.py | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh_remesh_voxel.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_remesh_voxel.c | 18 | ||||
-rw-r--r-- | source/blender/editors/object/object_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_remesh.c | 49 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_mesh_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_mesh.c | 1 |
9 files changed, 76 insertions, 2 deletions
diff --git a/intern/tetgen/tetgen_api.h b/intern/tetgen/tetgen_api.h index 1757b2d4ce9..6531d48cdb2 100644 --- a/intern/tetgen/tetgen_api.h +++ b/intern/tetgen/tetgen_api.h @@ -18,7 +18,6 @@ typedef struct TetGenRemeshData { int out_totverts; int out_totfacets; int out_tottets; - } TetGenRemeshData; void init_tetgenremeshdata(TetGenRemeshData *data); diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index 425c94dfdcd..ccf66360ad0 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -484,8 +484,11 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel): col.prop(mesh, "use_remesh_preserve_paint_mask", text="Paint Mask") col.prop(mesh, "use_remesh_preserve_sculpt_face_sets", text="Face Sets") col.operator("object.voxel_remesh", text="Voxel Remesh") - else: + elif mesh.remesh_mode == 'QUAD': col.operator("object.quadriflow_remesh", text="QuadriFlow Remesh") + else: + col.operator("object.tetgen_remesh", text="Tetrahedralize") + class DATA_PT_customdata(MeshButtonsPanel, Panel): diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h index b63f9a9814b..15569406680 100644 --- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h +++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h @@ -57,6 +57,7 @@ struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh, bool adaptive_scale, void *update_cb, void *update_cb_data); +struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh); /* Data reprojection functions */ void BKE_mesh_remesh_reproject_paint_mask(struct Mesh *target, struct Mesh *source); diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c index 2b279e3d87c..c3423c682c9 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c @@ -332,6 +332,11 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh) } BKE_mesh_calc_edges(mesh, false, false); BKE_mesh_calc_normals(mesh); + +// mesh->tottet = tg.out_tottets; +// mesh->mtet = (unsigned int *)MEM_malloc_arrayN(tg.out_tottets*4, sizeof(unsigned int), "remesh_output_tets"); +// memcpy(mesh->mtet,tg.out_tets,tg.out_tottets*4*sizeof(unsigned int)); + } // end success if (tg.out_verts) @@ -347,6 +352,19 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh) } #endif +struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh) +{ + #ifdef WITH_TETGEN + Mesh *new_mesh = BKE_mesh_remesh_tetgen(mesh); + return new_mesh; + #else + UNUSED_VARS(mesh, + tets, + tottets); + #endif + return NULL; +} + Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(Mesh *mesh, int target_faces, int seed, diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index d7a7b4ca110..da89e88193e 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -295,6 +295,7 @@ void TRANSFORM_OT_vertex_random(struct wmOperatorType *ot); void OBJECT_OT_voxel_remesh(struct wmOperatorType *ot); void OBJECT_OT_voxel_size_edit(struct wmOperatorType *ot); void OBJECT_OT_quadriflow_remesh(struct wmOperatorType *ot); +void OBJECT_OT_tetgen_remesh(struct wmOperatorType *ot); /* object_transfer_data.c */ void OBJECT_OT_data_transfer(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 819b6c18a44..f1c1cc6997a 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -270,6 +270,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_voxel_size_edit); WM_operatortype_append(OBJECT_OT_quadriflow_remesh); + WM_operatortype_append(OBJECT_OT_tetgen_remesh); } void ED_operatormacros_object(void) diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c index 22869748b22..10e41ebe946 100644 --- a/source/blender/editors/object/object_remesh.c +++ b/source/blender/editors/object/object_remesh.c @@ -1181,4 +1181,53 @@ void OBJECT_OT_quadriflow_remesh(wmOperatorType *ot) 255); } +static int tetgen_remesh_exec(bContext *C, wmOperator *op) +{ + Object *ob = CTX_data_active_object(C); + + Mesh *mesh = ob->data; + Mesh *new_mesh = NULL; + + new_mesh = BKE_mesh_remesh_tetgen_to_mesh_nomain(mesh); + + if (!new_mesh) { + BKE_report(op->reports, RPT_ERROR, "TetGen remesher failed to create mesh"); + return OPERATOR_CANCELLED; + } + + BKE_mesh_nomain_to_mesh(new_mesh, mesh, ob, &CD_MASK_MESH, true); + + if (mesh->flag & ME_REMESH_SMOOTH_NORMALS) { + BKE_mesh_smooth_flag_set(ob->data, true); + } + + if (ob->mode == OB_MODE_SCULPT) { + ED_sculpt_undo_geometry_end(ob); + } + + BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL); + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_tetgen_remesh(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "TetGen Remesh"; + ot->description = + "Create a new tet mesh using the surface data of the current mesh. All data " + "layers will be lost"; + ot->idname = "OBJECT_OT_tetgen_remesh"; + + /* api callbacks */ + ot->poll = object_remesh_poll; + ot->exec = tetgen_remesh_exec; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + +} + /** \} */ diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 029352f3d85..28fb22cd508 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -305,6 +305,7 @@ enum { enum { REMESH_VOXEL = 0, REMESH_QUAD = 1, + REMESH_TET = 2, }; /* Subsurf Type */ diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 54539924fde..c0b3a4e4216 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -58,6 +58,7 @@ const EnumPropertyItem rna_enum_mesh_delimit_mode_items[] = { static const EnumPropertyItem rna_enum_mesh_remesh_mode_items[] = { {REMESH_VOXEL, "VOXEL", 0, "Voxel", "Use the voxel remesher"}, {REMESH_QUAD, "QUAD", 0, "Quad", "Use the quad remesher"}, + {REMESH_TET, "TET", 0, "Tet", "Use the tetrahedralize remesher"}, {0, NULL, 0, NULL, NULL}, }; |