Finished curvature rake.

This commit is contained in:
Joseph Eagar 2021-04-01 13:07:10 -07:00
parent cfa6753518
commit 0dc09668ce
10 changed files with 101 additions and 13 deletions

View File

@ -574,6 +574,8 @@ def brush_settings(layout, context, brush, popover=False):
context.sculpt_object.use_dynamic_topology_sculpting
):
layout.prop(brush, "topology_rake_factor", slider=True)
layout.prop(brush, "use_curvature_rake")
layout.prop(brush.dyntopo, "disabled", text="Disable Dyntopo");
# normal_weight

View File

@ -174,7 +174,8 @@ typedef enum {
PBVH_UpdateTopology = 1 << 13,
PBVH_UpdateColor = 1 << 14,
PBVH_Delete = 1 << 15
PBVH_Delete = 1 << 15,
PBVH_UpdateCurvatureDir = 1<<16
} PBVHNodeFlags;
typedef struct PBVHFrustumPlanes {
@ -653,6 +654,9 @@ void BKE_pbvh_set_flat_vcol_shading(PBVH *pbvh, bool value);
void SCULPT_update_flat_vcol_shading(struct Object *ob, struct Scene *scene);
void BKE_pbvh_curvature_update_set(PBVHNode *node, bool state);
bool BKE_pbvh_curvature_update_get(PBVHNode *node);
#ifdef __cplusplus
}
#endif

View File

@ -1823,7 +1823,7 @@ BMesh *BKE_pbvh_get_bmesh(PBVH *pbvh)
void BKE_pbvh_node_mark_update(PBVHNode *node)
{
node->flag |= PBVH_UpdateNormals | PBVH_UpdateBB | PBVH_UpdateOriginalBB |
PBVH_UpdateDrawBuffers | PBVH_UpdateRedraw;
PBVH_UpdateDrawBuffers | PBVH_UpdateRedraw | PBVH_UpdateCurvatureDir;
}
void BKE_pbvh_node_mark_update_mask(PBVHNode *node)
@ -1839,12 +1839,13 @@ void BKE_pbvh_node_mark_update_color(PBVHNode *node)
void BKE_pbvh_node_mark_update_visibility(PBVHNode *node)
{
node->flag |= PBVH_UpdateVisibility | PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers |
PBVH_UpdateRedraw;
PBVH_UpdateRedraw | PBVH_UpdateCurvatureDir;
}
void BKE_pbvh_node_mark_rebuild_draw(PBVHNode *node)
{
node->flag |= PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers | PBVH_UpdateRedraw;
node->flag |= PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers | PBVH_UpdateRedraw |
PBVH_UpdateCurvatureDir;
}
void BKE_pbvh_node_mark_redraw(PBVHNode *node)
@ -1854,7 +1855,23 @@ void BKE_pbvh_node_mark_redraw(PBVHNode *node)
void BKE_pbvh_node_mark_normals_update(PBVHNode *node)
{
node->flag |= PBVH_UpdateNormals;
node->flag |= PBVH_UpdateNormals | PBVH_UpdateCurvatureDir;
}
void BKE_pbvh_node_mark_curvature_update(PBVHNode *node) {
node->flag |= PBVH_UpdateCurvatureDir;
}
void BKE_pbvh_curvature_update_set(PBVHNode *node, bool state) {
if (state) {
node->flag |= PBVH_UpdateCurvatureDir;
} else {
node->flag &= ~PBVH_UpdateCurvatureDir;
}
}
bool BKE_pbvh_curvature_update_get(PBVHNode *node) {
return node->flag & PBVH_UpdateCurvatureDir;
}
void BKE_pbvh_node_fully_hidden_set(PBVHNode *node, int fully_hidden)

View File

@ -310,7 +310,7 @@ static void pbvh_bmesh_node_finalize(PBVH *pbvh,
BKE_pbvh_node_mark_rebuild_draw(n);
BKE_pbvh_node_fully_hidden_set(n, !has_visible);
n->flag |= PBVH_UpdateNormals | PBVH_UpdateTopology;
n->flag |= PBVH_UpdateNormals | PBVH_UpdateTopology | PBVH_UpdateCurvatureDir;
if (add_orco) {
BKE_pbvh_bmesh_node_save_ortri(pbvh->bm, n);
@ -2839,6 +2839,8 @@ static void pbvh_update_normals_task_cb(void *__restrict userdata,
UpdateNormalsTaskData *data = (UpdateNormalsTaskData *)userdata;
PBVHNode *node = data->nodes[n];
node->flag |= PBVH_UpdateCurvatureDir;
TGSET_ITER (f, node->bm_faces) {
BM_face_normal_update(f);
}
@ -3092,7 +3094,7 @@ static void pbvh_bmesh_create_nodes_fast_recursive(
BKE_pbvh_node_mark_rebuild_draw(n);
BKE_pbvh_node_fully_hidden_set(n, !has_visible);
n->flag |= PBVH_UpdateNormals;
n->flag |= PBVH_UpdateNormals|PBVH_UpdateCurvatureDir;
}
}
@ -3232,6 +3234,7 @@ bool BKE_pbvh_bmesh_update_topology_nodes(PBVH *pbvh,
}
if (node->flag & PBVH_Leaf) {
node->flag |= PBVH_UpdateCurvatureDir;
undopush(node, searchdata);
BKE_pbvh_node_mark_topology_update(pbvh->nodes + i);

View File

@ -3257,6 +3257,7 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata,
SculptSession *ss = data->ob->sculpt;
Sculpt *sd = data->sd;
const Brush *brush = data->brush;
PBVHNode *node = data->nodes[n];
float direction[3];
copy_v3_v3(direction, ss->cache->grab_delta_symmetry);
@ -3279,8 +3280,14 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata,
ss, &test, data->brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(tls);
const bool use_curvature = ss->cache->brush->flag2 & BRUSH_CURVATURE_RAKE;
//const bool update_curvature = node->flag & PBVH_UpdateCurvatureDir;
const bool update_curvature = BKE_pbvh_curvature_update_get(node);
SCULPT_curvature_begin(ss, node);
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
continue;
}
@ -3294,10 +3301,14 @@ static void do_topology_rake_bmesh_task_cb_ex(void *__restrict userdata,
float avg[3], val[3];
// SculptCurvatureData cdata;
// SCULPT_calc_principle_curvatures(ss, vd.vertex, &cdata);
// copy_v3_v3(direction2, cdata.principle[0]);
copy_v3_v3(direction2, direction);
if (use_curvature) {
SCULPT_curvature_dir_get(ss, vd.vertex, direction2);
//SculptCurvatureData cdata;
//SCULPT_calc_principle_curvatures(ss, vd.vertex, &cdata);
//copy_v3_v3(direction2, cdata.principle[0]);
} else {
copy_v3_v3(direction2, direction);
}
SCULPT_bmesh_four_neighbor_average(avg, direction2, vd.bm_vert);

View File

@ -160,7 +160,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)) {
//do simple power solve in one direction
// do simple power solve in one direction
float t[3];
float t2[3];
@ -191,3 +191,44 @@ bool SCULPT_calc_principle_curvatures(SculptSession *ss,
return true;
}
void SCULPT_curvature_dir_get(SculptSession *ss, SculptVertRef v, float dir[3])
{
if (BKE_pbvh_type(ss->pbvh) != PBVH_BMESH) {
SculptCurvatureData curv;
SCULPT_calc_principle_curvatures(ss, v, &curv);
copy_v3_v3(dir, curv.principle[0]);
return;
}
BMVert *bv = (BMVert *)v.i;
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, bv);
copy_v3_v3(dir, mv->curvature_dir);
}
void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node)
{
if (BKE_pbvh_type(ss->pbvh) != PBVH_BMESH) {
// caching only happens for bmesh for now
return;
}
if (BKE_pbvh_curvature_update_get(node)) {
PBVHVertexIter vi;
BKE_pbvh_curvature_update_set(node, false);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vi, PBVH_ITER_UNIQUE) {
BMVert *v = (BMVert *)vi.vertex.i;
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, v);
SculptCurvatureData curv;
SCULPT_calc_principle_curvatures(ss, vi.vertex, &curv);
copy_v3_v3(mv->curvature_dir, curv.principle[0]);
}
BKE_pbvh_vertex_iter_end;
}
}

View File

@ -1422,3 +1422,5 @@ bool SCULPT_calc_principle_curvatures(SculptSession *ss,
SculptVertRef vertex,
SculptCurvatureData *out);
void SCULPT_curvature_begin(SculptSession *ss, struct PBVHNode *node);
void SCULPT_curvature_dir_get(SculptSession *ss, SculptVertRef v, float dir[3]);

View File

@ -409,6 +409,7 @@ typedef enum eBrushFlags2 {
BRUSH_CLOTH_USE_COLLISION = (1 << 6),
BRUSH_AREA_RADIUS_PRESSURE = (1 << 7),
BRUSH_GRAB_SILHOUETTE = (1 << 8),
BRUSH_CURVATURE_RAKE = (1 << 9)
} eBrushFlags2;
typedef enum {

View File

@ -535,6 +535,7 @@ typedef struct MDynTopoVert {
float origcolor[4];
float origmask;
float curvature_dir[3];
} MDynTopoVert;
/*MDynTopoVert->flag*/

View File

@ -3156,6 +3156,12 @@ static void rna_def_brush(BlenderRNA *brna)
prop, "Grab Silhouette", "Grabs trying to automask the silhouette of the object");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "use_curvature_rake", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", BRUSH_CURVATURE_RAKE);
RNA_def_property_ui_text(
prop, "Curvature Rake", "Topology rake follows curvature instead of brush direction");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "use_paint_antialiasing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "sampling_flag", BRUSH_PAINT_ANTIALIASING);
RNA_def_property_ui_text(prop, "Anti-Aliasing", "Smooths the edges of the strokes");