Voxel remesh: Enable adaptivity

This commit enables OpenVDB adaptivity in the voxel remesher. It can be useful to reduce the polygon count if you want to switch to dyntopo after using the voxel remesher workflow.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D5918
This commit is contained in:
Pablo Dobarro 2019-09-27 17:41:05 +02:00
parent 82136bb36e
commit c372318165
9 changed files with 26 additions and 6 deletions

View File

@ -476,6 +476,7 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
col = layout.column()
if (mesh.remesh_mode == 'VOXEL'):
col.prop(mesh, "remesh_voxel_size")
col.prop(mesh, "remesh_voxel_adaptivity")
col.prop(mesh, "remesh_fix_poles")
col.prop(mesh, "remesh_smooth_normals")
col.prop(mesh, "remesh_preserve_volume")

View File

@ -1235,6 +1235,7 @@ class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
col = layout.column()
mesh = context.active_object.data
col.prop(mesh, "remesh_voxel_size")
col.prop(mesh, "remesh_voxel_adaptivity")
col.prop(mesh, "remesh_fix_poles")
col.prop(mesh, "remesh_smooth_normals")
col.prop(mesh, "remesh_preserve_volume")

View File

@ -41,7 +41,9 @@ struct Mesh *BKE_mesh_remesh_voxel_ovdb_volume_to_mesh_nomain(struct OpenVDBLeve
#endif
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);
struct Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(struct Mesh *mesh,
float voxel_size,
float adaptivity);
struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh,
int target_faces,
int seed,

View File

@ -666,6 +666,7 @@ void BKE_mesh_copy_settings(Mesh *me_dst, const Mesh *me_src)
me_dst->flag = me_src->flag;
me_dst->smoothresh = me_src->smoothresh;
me_dst->remesh_voxel_size = me_src->remesh_voxel_size;
me_dst->remesh_voxel_adaptivity = me_src->remesh_voxel_adaptivity;
me_dst->remesh_mode = me_src->remesh_mode;
/* Copy texture space. */

View File

@ -295,7 +295,7 @@ 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)
Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh, float voxel_size, float adaptivity)
{
Mesh *new_mesh = NULL;
#ifdef WITH_OPENVDB
@ -303,7 +303,8 @@ Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh, float voxel_size)
struct OpenVDBTransform *xform = OpenVDBTransform_create();
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, 0.0, false);
new_mesh = BKE_mesh_remesh_voxel_ovdb_volume_to_mesh_nomain(
level_set, 0.0, (float)adaptivity, false);
OpenVDBLevelSet_free(level_set);
OpenVDBTransform_free(xform);
#else

View File

@ -111,13 +111,14 @@ static int voxel_remesh_exec(bContext *C, wmOperator *op)
ED_sculpt_undo_geometry_begin(ob);
}
new_mesh = BKE_mesh_remesh_voxel_to_mesh_nomain(mesh, mesh->remesh_voxel_size);
new_mesh = BKE_mesh_remesh_voxel_to_mesh_nomain(
mesh, mesh->remesh_voxel_size, mesh->remesh_voxel_adaptivity);
if (!new_mesh) {
return OPERATOR_CANCELLED;
}
if (mesh->flag & ME_REMESH_FIX_POLES) {
if (mesh->flag & ME_REMESH_FIX_POLES && mesh->remesh_voxel_adaptivity <= 0.0f) {
new_mesh = BKE_mesh_remesh_voxel_fix_poles(new_mesh);
BKE_mesh_calc_normals(new_mesh);
}

View File

@ -34,6 +34,7 @@
.smoothresh = DEG2RADF(30), \
.texflag = ME_AUTOSPACE, \
.remesh_voxel_size = 0.1f, \
.remesh_voxel_adaptivity = 0.0f, \
.flag = ME_REMESH_FIX_POLES | ME_REMESH_REPROJECT_VOLUME, \
}

View File

@ -190,8 +190,9 @@ typedef struct Mesh {
short totcol;
float remesh_voxel_size;
float remesh_voxel_adaptivity;
char remesh_mode;
char _pad1[7];
char _pad1[3];
/** Deprecated multiresolution modeling data, only keep for loading old files. */
struct Multires *mr DNA_DEPRECATED;

View File

@ -2995,6 +2995,17 @@ static void rna_def_mesh(BlenderRNA *brna)
"values preserve finer details");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop = RNA_def_property(srna, "remesh_voxel_adaptivity", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "remesh_voxel_adaptivity");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.01, 4);
RNA_def_property_ui_text(
prop,
"Adaptivity",
"Reduces the final face count by simplifying geometry where detail is not needed, "
"generating triangles. A value greater than 0 disables Fix Poles");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop = RNA_def_property(srna, "remesh_smooth_normals", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_REMESH_SMOOTH_NORMALS);
RNA_def_property_ui_text(prop, "Smooth Normals", "Smooth the normals of the remesher result");