SCULPT_calc_principle_curvatures now has option to use
slower but more accurate BLI_eigen_solve_selfadjoint_m3 solver.
This commit is contained in:
parent
237ac342c9
commit
fdc6fb2c53
|
@ -140,7 +140,7 @@ bool schedule_non_checked_node(CyclesSolverState *state)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool check_relation_can_murder(Relation *relation)
|
||||
bool check_relation_can_murder(Relation *relation)
|
||||
{
|
||||
if (relation->flag & RELATION_FLAG_GODMODE) {
|
||||
return false;
|
||||
|
|
|
@ -3353,7 +3353,7 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata,
|
|||
// const bool update_curvature = node->flag & PBVH_UpdateCurvatureDir;
|
||||
const bool update_curvature = BKE_pbvh_curvature_update_get(node);
|
||||
|
||||
SCULPT_curvature_begin(ss, node);
|
||||
SCULPT_curvature_begin(ss, node, false);
|
||||
|
||||
PBVHVertexIter vd;
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
|
@ -3371,7 +3371,7 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata,
|
|||
float avg[3], val[3];
|
||||
|
||||
if (use_curvature) {
|
||||
SCULPT_curvature_dir_get(ss, vd.vertex, direction2);
|
||||
SCULPT_curvature_dir_get(ss, vd.vertex, direction2, false);
|
||||
// SculptCurvatureData cdata;
|
||||
// SCULPT_calc_principle_curvatures(ss, vd.vertex, &cdata);
|
||||
// copy_v3_v3(direction2, cdata.principle[0]);
|
||||
|
@ -9757,6 +9757,10 @@ void SCULPT_connected_components_ensure(Object *ob)
|
|||
for (int i = 0; i < totvert; i++) {
|
||||
SculptVertRef vertex = BKE_pbvh_table_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
if (!SCULPT_vertex_visible_get(ss, vertex)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ss->vertex_info.connected_component[i] == SCULPT_TOPOLOGY_ID_NONE) {
|
||||
SculptFloodFill flood;
|
||||
SCULPT_floodfill_init(ss, &flood);
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "BLI_hash.h"
|
||||
#include "BLI_math.h"
|
||||
#include "BLI_math_color_blend.h"
|
||||
#include "BLI_math_solvers.h"
|
||||
#include "BLI_task.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
|
@ -138,7 +139,8 @@ BLI_INLINE void normal_covariance(float mat[3][3], float no[3])
|
|||
|
||||
bool SCULPT_calc_principle_curvatures(SculptSession *ss,
|
||||
SculptVertRef vertex,
|
||||
SculptCurvatureData *out)
|
||||
SculptCurvatureData *out,
|
||||
bool useAccurateSolver)
|
||||
{
|
||||
SculptVertexNeighborIter ni;
|
||||
float nmat[3][3], nmat2[3][3];
|
||||
|
@ -159,7 +161,7 @@ bool SCULPT_calc_principle_curvatures(SculptSession *ss,
|
|||
}
|
||||
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
|
||||
|
||||
if (true || !BLI_eigen_solve_selfadjoint_m3(nmat, out->ks, out->principle)) {
|
||||
if (!useAccurateSolver || !BLI_eigen_solve_selfadjoint_m3(nmat, out->ks, out->principle)) {
|
||||
// do simple power solve in one direction
|
||||
|
||||
float t[3];
|
||||
|
@ -192,11 +194,14 @@ bool SCULPT_calc_principle_curvatures(SculptSession *ss,
|
|||
return true;
|
||||
}
|
||||
|
||||
void SCULPT_curvature_dir_get(SculptSession *ss, SculptVertRef v, float dir[3])
|
||||
void SCULPT_curvature_dir_get(SculptSession *ss,
|
||||
SculptVertRef v,
|
||||
float dir[3],
|
||||
bool useAccurateSolver)
|
||||
{
|
||||
if (BKE_pbvh_type(ss->pbvh) != PBVH_BMESH) {
|
||||
SculptCurvatureData curv;
|
||||
SCULPT_calc_principle_curvatures(ss, v, &curv);
|
||||
SCULPT_calc_principle_curvatures(ss, v, &curv, useAccurateSolver);
|
||||
|
||||
copy_v3_v3(dir, curv.principle[0]);
|
||||
return;
|
||||
|
@ -208,7 +213,7 @@ void SCULPT_curvature_dir_get(SculptSession *ss, SculptVertRef v, float dir[3])
|
|||
copy_v3_v3(dir, mv->curvature_dir);
|
||||
}
|
||||
|
||||
void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node)
|
||||
void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node, bool useAccurateSolver)
|
||||
{
|
||||
if (BKE_pbvh_type(ss->pbvh) != PBVH_BMESH) {
|
||||
// caching only happens for bmesh for now
|
||||
|
@ -225,7 +230,7 @@ void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node)
|
|||
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, v);
|
||||
|
||||
SculptCurvatureData curv;
|
||||
SCULPT_calc_principle_curvatures(ss, vi.vertex, &curv);
|
||||
SCULPT_calc_principle_curvatures(ss, vi.vertex, &curv, useAccurateSolver);
|
||||
|
||||
copy_v3_v3(mv->curvature_dir, curv.principle[0]);
|
||||
}
|
||||
|
|
|
@ -1435,12 +1435,21 @@ typedef struct SculptCurvatureData {
|
|||
float principle[3][3]; // normalized
|
||||
} SculptCurvatureData;
|
||||
|
||||
/*
|
||||
If useAccurateSolver is false, a faster but less accurate
|
||||
power solver will be used. If true then BLI_eigen_solve_selfadjoint_m3
|
||||
will be called.
|
||||
*/
|
||||
bool SCULPT_calc_principle_curvatures(SculptSession *ss,
|
||||
SculptVertRef vertex,
|
||||
SculptCurvatureData *out);
|
||||
SculptCurvatureData *out,
|
||||
bool useAccurateSolver);
|
||||
|
||||
void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node);
|
||||
void SCULPT_curvature_dir_get(SculptSession *ss, SculptVertRef v, float dir[3]);
|
||||
void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node, bool useAccurateSolver);
|
||||
void SCULPT_curvature_dir_get(SculptSession *ss,
|
||||
SculptVertRef v,
|
||||
float dir[3],
|
||||
bool useAccurateSolver);
|
||||
|
||||
/*
|
||||
Ensure a named temporary layer exists, creating it if necassary.
|
||||
|
|
Loading…
Reference in New Issue