Page MenuHome
Paste P1197

Voxel Remesh Gaussian Filter
ActivePublic

Authored by Pablo Dobarro (pablodp606) on Dec 30 2019, 1:00 AM.
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 3edce6b3b52..b2bad4b0753 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -480,6 +480,7 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
if mesh.remesh_mode == 'VOXEL':
col.prop(mesh, "remesh_voxel_size")
col.prop(mesh, "remesh_voxel_adaptivity")
+ col.prop(mesh, "remesh_voxel_gaussian_strength")
col.prop(mesh, "use_remesh_fix_poles")
col.prop(mesh, "use_remesh_smooth_normals")
col.prop(mesh, "use_remesh_preserve_volume")
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index f0c4aaa9344..28aad034781 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -855,6 +855,7 @@ class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
props = row.operator("sculpt.sample_detail_size", text="", icon='EYEDROPPER')
props.mode = 'VOXEL'
col.prop(mesh, "remesh_voxel_adaptivity")
+ col.prop(mesh, "remesh_voxel_gaussian_strength")
col.prop(mesh, "use_remesh_fix_poles")
col.prop(mesh, "use_remesh_smooth_normals")
col.prop(mesh, "use_remesh_preserve_volume")
diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
index a12e94bd416..d8cc3f744a4 100644
--- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
+++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
@@ -44,7 +44,8 @@ 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,
float adaptivity,
- float isovalue);
+ float isovalue,
+ float filter_width);
struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh,
int target_faces,
int seed,
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index ba139c654d3..200cb5aa9d6 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -667,6 +667,7 @@ void BKE_mesh_copy_settings(Mesh *me_dst, const Mesh *me_src)
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_voxel_gaussian_strength = me_src->remesh_voxel_gaussian_strength;
me_dst->remesh_mode = me_src->remesh_mode;
/* Copy texture space. */
diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
index d616ff30787..51f49c361cf 100644
--- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c
+++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
@@ -298,7 +298,8 @@ Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(Mesh *mesh,
Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh,
float voxel_size,
float adaptivity,
- float isovalue)
+ float isovalue,
+ float filter_width)
{
Mesh *new_mesh = NULL;
#ifdef WITH_OPENVDB
@@ -306,6 +307,12 @@ Mesh *BKE_mesh_remesh_voxel_to_mesh_nomain(Mesh *mesh,
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);
+
+ /* Filters */
+ if (filter_width > 0.0f) {
+ OpenVDBLevelSet_filter(level_set, OPENVDB_LEVELSET_FILTER_GAUSSIAN, filter_width, 0.0f, OPENVDB_LEVELSET_THIRD_BIAS);
+ }
+
new_mesh = BKE_mesh_remesh_voxel_ovdb_volume_to_mesh_nomain(
level_set, (double)isovalue, (double)adaptivity, false);
OpenVDBLevelSet_free(level_set);
diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c
index bfe413ccb91..9a9b2356776 100644
--- a/source/blender/editors/object/object_remesh.c
+++ b/source/blender/editors/object/object_remesh.c
@@ -119,7 +119,7 @@ static int voxel_remesh_exec(bContext *C, wmOperator *op)
}
new_mesh = BKE_mesh_remesh_voxel_to_mesh_nomain(
- mesh, mesh->remesh_voxel_size, mesh->remesh_voxel_adaptivity, isovalue);
+ mesh, mesh->remesh_voxel_size, mesh->remesh_voxel_adaptivity, isovalue, mesh->remesh_voxel_gaussian_strength);
if (!new_mesh) {
BKE_report(op->reports, RPT_ERROR, "Voxel remesher failed to create mesh.");
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 86ea22690ee..41267e9e31a 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -195,8 +195,9 @@ typedef struct Mesh {
float remesh_voxel_size;
float remesh_voxel_adaptivity;
+ float remesh_voxel_gaussian_strength;
char remesh_mode;
- char _pad1[3];
+ char _pad1[7];
/** Deprecated multiresolution modeling data, only keep for loading old files. */
struct Multires *mr DNA_DEPRECATED;
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 5890c3fe8a2..e7a7376a13d 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -3006,6 +3006,15 @@ static void rna_def_mesh(BlenderRNA *brna)
"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_voxel_gaussian_strength", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "remesh_voxel_gaussian_strength");
+ RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.01, 4);
+ RNA_def_property_ui_text(
+ prop,
+ "Gaussian Strength","Smooths the voxel representation before converting it back to a mesh");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
prop = RNA_def_property(srna, "use_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");