diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2015-12-30 19:04:34 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2015-12-30 19:26:51 +0300 |
commit | cf2005d942ec7fd6dfffa96aaf74790ab7c5ee0c (patch) | |
tree | 3a29f1068d15cca7cfd34cb86ab1987932c218c8 | |
parent | f5c978074cf2398531c4d10661235f6083bb47a5 (diff) |
Fix T47081: laplacian smooth edit mode tool crash.
-rw-r--r-- | intern/eigen/intern/linear_solver.cc | 12 | ||||
-rw-r--r-- | intern/eigen/intern/linear_solver.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_smooth_laplacian.c | 1 |
3 files changed, 14 insertions, 0 deletions
diff --git a/intern/eigen/intern/linear_solver.cc b/intern/eigen/intern/linear_solver.cc index 181b278b9c0..0fc4d39309b 100644 --- a/intern/eigen/intern/linear_solver.cc +++ b/intern/eigen/intern/linear_solver.cc @@ -156,6 +156,14 @@ void EIG_linear_solver_variable_lock(LinearSolver *solver, int index) } } +void EIG_linear_solver_variable_unlock(LinearSolver *solver, int index) +{ + if (solver->variable[index].locked) { + assert(solver->state == LinearSolver::STATE_VARIABLES_CONSTRUCT); + solver->variable[index].locked = false; + } +} + static void linear_solver_variables_to_vector(LinearSolver *solver) { int num_rhs = solver->num_rhs; @@ -269,6 +277,10 @@ void EIG_linear_solver_right_hand_side_add(LinearSolver *solver, int rhs, int in bool EIG_linear_solver_solve(LinearSolver *solver) { + /* nothing to solve, perhaps all variables were locked */ + if (solver->m == 0 || solver->n == 0) + return true; + bool result = true; assert(solver->state != LinearSolver::STATE_VARIABLES_CONSTRUCT); diff --git a/intern/eigen/intern/linear_solver.h b/intern/eigen/intern/linear_solver.h index 2dbea4d6f68..8f07e24e9a6 100644 --- a/intern/eigen/intern/linear_solver.h +++ b/intern/eigen/intern/linear_solver.h @@ -51,6 +51,7 @@ void EIG_linear_solver_delete(LinearSolver *solver); void EIG_linear_solver_variable_set(LinearSolver *solver, int rhs, int index, double value); double EIG_linear_solver_variable_get(LinearSolver *solver, int rhs, int index); void EIG_linear_solver_variable_lock(LinearSolver *solver, int index); +void EIG_linear_solver_variable_unlock(LinearSolver *solver, int index); /* Matrix (A) and right hand side (b) */ diff --git a/source/blender/bmesh/operators/bmo_smooth_laplacian.c b/source/blender/bmesh/operators/bmo_smooth_laplacian.c index 95ff3eb4858..1a83bafc074 100644 --- a/source/blender/bmesh/operators/bmo_smooth_laplacian.c +++ b/source/blender/bmesh/operators/bmo_smooth_laplacian.c @@ -505,6 +505,7 @@ void bmo_smooth_laplacian_vert_exec(BMesh *bm, BMOperator *op) } BMO_ITER (v, &siter, op->slots_in, "verts", BM_VERT) { m_vertex_id = BM_elem_index_get(v); + EIG_linear_solver_variable_unlock(sys->context, m_vertex_id); EIG_linear_solver_variable_set(sys->context, 0, m_vertex_id, v->co[0]); EIG_linear_solver_variable_set(sys->context, 1, m_vertex_id, v->co[1]); EIG_linear_solver_variable_set(sys->context, 2, m_vertex_id, v->co[2]); |