[Bf-blender-cvs] [0e94c8258ec] quadriflow: Make quadriflow not freeze blender while it is processing
Sebastian Parborg
noreply at git.blender.org
Wed Sep 11 16:02:48 CEST 2019
Commit: 0e94c8258ecdcd2802c3eeb12d2f6c5c356f94de
Author: Sebastian Parborg
Date: Wed Sep 11 16:03:13 2019 +0200
Branches: quadriflow
https://developer.blender.org/rB0e94c8258ecdcd2802c3eeb12d2f6c5c356f94de
Make quadriflow not freeze blender while it is processing
===================================================================
M intern/quadriflow/quadriflow_capi.cpp
M intern/quadriflow/quadriflow_capi.hpp
M release/scripts/startup/bl_ui/properties_data_mesh.py
M source/blender/blenkernel/BKE_mesh_remesh_voxel.h
M source/blender/blenkernel/intern/mesh_remesh_voxel.c
M source/blender/blenloader/intern/versioning_280.c
M source/blender/editors/object/object_remesh.c
M source/blender/makesdna/DNA_mesh_types.h
M source/blender/makesrna/intern/rna_mesh.c
M source/blender/windowmanager/WM_api.h
===================================================================
diff --git a/intern/quadriflow/quadriflow_capi.cpp b/intern/quadriflow/quadriflow_capi.cpp
index 3d3aac2e4f4..302c7a0ae30 100644
--- a/intern/quadriflow/quadriflow_capi.cpp
+++ b/intern/quadriflow/quadriflow_capi.cpp
@@ -61,7 +61,18 @@ struct ObjVertexHash : std::unary_function<ObjVertex, size_t> {
typedef std::unordered_map<ObjVertex, uint32_t, ObjVertexHash> VertexMap;
-void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd)
+static int check_if_canceled(float progress,
+ void (*update_cb)(void *, float progress, int *cancel),
+ void *update_cb_data)
+{
+ int cancel = 0;
+ update_cb(update_cb_data, progress, &cancel);
+ return cancel;
+}
+
+void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
+ void (*update_cb)(void *, float progress, int *cancel),
+ void *update_cb_data)
{
Parametrizer field;
VertexMap vertexMap;
@@ -88,6 +99,10 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd)
field.hierarchy.rng_seed = qrd->rng_seed;
}
+ if (check_if_canceled(0.0f, update_cb, update_cb_data) != 0) {
+ return;
+ }
+
/* Copy mesh to quadriflow data structures. */
std::vector<Vector3d> positions;
std::vector<uint32_t> indices;
@@ -130,10 +145,18 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd)
field.V.col(i) = positions.at(vertices[i].p);
}
+ if (check_if_canceled(0.1f, update_cb, update_cb_data)) {
+ return;
+ }
+
/* Start processing the input mesh data */
field.NormalizeMesh();
field.Initialize(faces);
+ if (check_if_canceled(0.2f, update_cb, update_cb_data)) {
+ return;
+ }
+
/* Setup mesh boundary constraints if needed */
if (field.flag_preserve_boundary) {
Hierarchy &mRes = field.hierarchy;
@@ -160,19 +183,36 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd)
Optimizer::optimize_orientations(field.hierarchy);
field.ComputeOrientationSingularities();
+ if (check_if_canceled(0.3f, update_cb, update_cb_data)) {
+ return;
+ }
+
if (field.flag_adaptive_scale == 1) {
field.EstimateSlope();
}
+ if (check_if_canceled(0.4f, update_cb, update_cb_data)) {
+ return;
+ }
+
Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
field.flag_adaptive_scale = 1;
Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
field.ComputePositionSingularities();
+
+ if (check_if_canceled(0.5f, update_cb, update_cb_data)) {
+ return;
+ }
+
/* Compute the final quad geomtry using a maxflow solver */
field.ComputeIndexMap();
+ if (check_if_canceled(0.9f, update_cb, update_cb_data)) {
+ return;
+ }
+
/* Get the output mesh data */
qrd->out_totverts = field.O_compact.size();
qrd->out_totfaces = field.F_compact.size();
diff --git a/intern/quadriflow/quadriflow_capi.hpp b/intern/quadriflow/quadriflow_capi.hpp
index 0c6ae1d20e2..c31fd6eff95 100644
--- a/intern/quadriflow/quadriflow_capi.hpp
+++ b/intern/quadriflow/quadriflow_capi.hpp
@@ -43,7 +43,9 @@ typedef struct QuadriflowRemeshData {
int rng_seed;
} QuadriflowRemeshData;
-void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd);
+void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
+ void (*update_cb)(void *, float progress, int *cancel),
+ void *update_cb_data);
#ifdef __cplusplus
}
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 74869c2c812..8031690970d 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -467,16 +467,18 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
- col = layout.column()
+ row = layout.row()
mesh = context.mesh
- col.prop(mesh, "remesh_voxel_size")
- col.prop(mesh, "remesh_smooth_normals")
- col.prop(mesh, "remesh_preserve_paint_mask")
- col.operator("object.voxel_remesh", text="Voxel Remesh")
-
- col.separator()
- col.operator("object.quadriflow_remesh", text="QuadriFlow Remesh")
+ row.prop(mesh, "remesh_mode", text="Mode")
+ col = layout.column()
+ if (mesh.remesh_mode == 'VOXEL'):
+ col.prop(mesh, "remesh_voxel_size")
+ col.prop(mesh, "remesh_smooth_normals")
+ col.prop(mesh, "remesh_preserve_paint_mask")
+ col.operator("object.voxel_remesh", text="Voxel Remesh")
+ else:
+ col.operator("object.quadriflow_remesh", text="QuadriFlow Remesh")
class DATA_PT_customdata(MeshButtonsPanel, Panel):
bl_label = "Geometry Data"
diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
index 302bae0b5d8..6b275e11cf7 100644
--- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
+++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h
@@ -44,7 +44,9 @@ struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh,
int seed,
bool preserve_sharp,
bool preserve_boundary,
- bool adaptive_scale);
+ bool adaptive_scale,
+ void *update_cb,
+ void *update_cb_data);
/* Data reprojection functions */
void BKE_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 22fbdd35dfb..48ccca8213d 100644
--- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c
+++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
@@ -156,7 +156,9 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh,
int seed,
bool preserve_sharp,
bool preserve_boundary,
- bool adaptive_scale)
+ bool adaptive_scale,
+ void *update_cb,
+ void *update_cb_data)
{
/* Ensure that the triangulated mesh data is up to data */
BKE_mesh_runtime_looptri_recalc(input_mesh);
@@ -204,8 +206,19 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh,
qrd.aggresive_sat = 0;
qrd.rng_seed = seed;
+ qrd.out_faces = NULL;
+
/* Run the remesher */
- QFLOW_quadriflow_remesh(&qrd);
+ QFLOW_quadriflow_remesh(&qrd, update_cb, update_cb_data);
+
+ MEM_freeN(verts);
+ MEM_freeN(faces);
+ MEM_freeN(verttri);
+
+ if (qrd.out_faces == NULL) {
+ /* The remeshing was canceled */
+ return NULL;
+ }
/* Construct the new output mesh */
Mesh *mesh = BKE_mesh_new_nomain(
@@ -230,10 +243,6 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh,
BKE_mesh_calc_edges(mesh, false, false);
BKE_mesh_calc_normals(mesh);
- MEM_freeN(verts);
- MEM_freeN(faces);
- MEM_freeN(verttri);
-
MEM_freeN(qrd.out_faces);
MEM_freeN(qrd.out_verts);
@@ -246,17 +255,32 @@ Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(Mesh *mesh,
int seed,
bool preserve_sharp,
bool preserve_boundary,
- bool adaptive_scale)
+ bool adaptive_scale,
+ void *update_cb,
+ void *update_cb_data)
{
Mesh *new_mesh = NULL;
#ifdef WITH_QUADRIFLOW
if (target_faces <= 0) {
target_faces = -1;
}
- new_mesh = BKE_mesh_remesh_quadriflow(
- mesh, target_faces, seed, preserve_sharp, preserve_boundary, adaptive_scale);
+ new_mesh = BKE_mesh_remesh_quadriflow(mesh,
+ target_faces,
+ seed,
+ preserve_sharp,
+ preserve_boundary,
+ adaptive_scale,
+ update_cb,
+ update_cb_data);
#else
- UNUSED_VARS(mesh, target_faces, seed, preserve_sharp, adaptive_scale);
+ UNUSED_VARS(mesh,
+ target_faces,
+ seed,
+ preserve_sharp,
+ preserve_boundary,
+ adaptive_scale,
+ update_cb,
+ update_cb_data);
#endif
return new_mesh;
}
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index d06da062d49..11e45c5395b 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -3844,5 +3844,8 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
/* Versioning code until next subversion bump goes here. */
+ for (Mesh *mesh = bmain->meshes.first; mesh; mesh = mesh->id.next) {
+ mesh->remesh_mode = REMESH_VOXEL;
+ }
}
}
diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c
index 3899b93b3c2..a2615ffb660 100644
--- a/source/blender/editors/object/object_remesh.c
+++ b/source/blender/editors/object/object_remesh.c
@@ -88,7 +88,6 @@ static bool object_remesh_poll(bContext *C)
static int voxel_remesh_exec(bContext *C, wmOperator *op)
{
Object *ob = CTX_data_active_object(C);
- Main *bmain = CTX_data_main(C);
Mesh *mesh = ob->data;
Mesh *new_mesh;
@@ -134,7 +133,6 @@ static int voxel_remesh_exec(bCon
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list