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:
parent
82136bb36e
commit
c372318165
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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, \
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue