Commit: 447425ad991b99b3dcc7fba501c42027b9a80cdd Author: Joseph Eagar Date: Sat Jul 30 11:18:40 2022 -0700 Branches: temp-sculpt-normals-masking https://developer.blender.org/rB447425ad991b99b3dcc7fba501c42027b9a80cdd
Merge branch 'master' into temp-sculpt-normals-masking =================================================================== =================================================================== diff --cc source/blender/editors/sculpt_paint/sculpt.c index c28b426051d,2366089cefb..3f978c19e47 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@@ -2361,13 -2397,12 +2397,13 @@@ static float brush_strength(const Sculp float SCULPT_brush_strength_factor(SculptSession *ss, const Brush *br, const float brush_point[3], - const float len, + float len, const float vno[3], const float fno[3], - const float mask, - const int vertex_index, + float mask, + const PBVHVertRef vertex, - int thread_id) + const int thread_id, + AutomaskingNodeData *automask_data) { StrokeCache *cache = ss->cache; const Scene *scene = cache->vc->scene; @@@ -2451,7 -2486,7 +2487,7 @@@ avg *= 1.0f - mask; /* Auto-masking. */ - avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex_index, automask_data); - avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex); ++ avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex, automask_data); return avg; } @@@ -3040,9 -3075,8 +3076,9 @@@ static void do_gravity_task_cb_ex(void vd.no, vd.fno, vd.mask ? *vd.mask : 0.0f, - vd.index, + vd.vertex, - thread_id); + thread_id, + NULL); mul_v3_v3fl(proxy[vd.i], offset, fade); @@@ -5913,69 -5962,4 +5964,68 @@@ void SCULPT_fake_neighbors_free(Object sculpt_pose_fake_neighbors_free(ss); } +void SCULPT_automasking_node_begin(Object *ob, + const SculptSession *ss, + AutomaskingCache *automasking, + AutomaskingNodeData *node_data, + PBVHNode *node) +{ + if (!automasking) { + memset(node_data, 0, sizeof(*node_data)); + return; + } + + node_data->node = node; + node_data->have_orig_data = automasking->settings.flags & + (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL); + + if (node_data->have_orig_data) { + SCULPT_orig_vert_data_init(&node_data->orig_data, ob, node, SCULPT_UNDO_COORDS); + } + else { + memset(&node_data->orig_data, 0, sizeof(node_data->orig_data)); + } +} + +void SCULPT_automasking_node_update(SculptSession *ss, + AutomaskingNodeData *automask_data, + PBVHVertexIter *vd) +{ + if (automask_data->have_orig_data) { + SCULPT_orig_vert_data_update(&automask_data->orig_data, vd); + } +} + - bool SCULPT_vertex_is_occluded(SculptSession *ss, int vertex, bool original) ++bool SCULPT_vertex_is_occluded(SculptSession *ss, PBVHVertRef vertex, bool original) +{ + float ray_start[3], ray_end[3], ray_normal[3], face_normal[3]; + float co[3]; + + copy_v3_v3(co, SCULPT_vertex_co_get(ss, vertex)); + float mouse[2]; + + ED_view3d_project_float_v2_m4(ss->cache->vc->region, co, mouse, ss->cache->projection_mat); + - int depth = SCULPT_raycast_init( - ss->cache->vc, mouse, ray_end, ray_start, ray_normal, original); ++ int depth = SCULPT_raycast_init(ss->cache->vc, mouse, ray_end, ray_start, ray_normal, original); + + negate_v3(ray_normal); + + copy_v3_v3(ray_start, SCULPT_vertex_co_get(ss, vertex)); + madd_v3_v3fl(ray_start, ray_normal, 0.002); + + SculptRaycastData srd = {0}; + srd.original = original; + srd.ss = ss; + srd.hit = false; + srd.ray_start = ray_start; + srd.ray_normal = ray_normal; + srd.depth = depth; + srd.face_normal = face_normal; + + isect_ray_tri_watertight_v3_precalc(&srd.isect_precalc, ray_normal); + BKE_pbvh_raycast(ss->pbvh, sculpt_raycast_cb, &srd, ray_start, ray_normal, srd.original); + + return srd.hit; +} + /** \} */ diff --cc source/blender/editors/sculpt_paint/sculpt_automasking.cc index 6b64af8a977,a9fe8cc4b2f..004fba98b68 --- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc +++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc @@@ -107,51 -98,6 +107,51 @@@ static int sculpt_automasking_mode_effe return sculpt->automasking_flags; } +bool SCULPT_automasking_needs_normal(const SculptSession *ss, + const Sculpt *sculpt, + const Brush *brush) +{ + int flags = sculpt_automasking_mode_effective_bits(sculpt, brush); + + return flags & (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL); +} + +static float sculpt_automasking_normal_calc(AutomaskingCache *automasking, + SculptSession *ss, - int vertex, ++ PBVHVertRef vertex, + const float normal[3], + float limit_lower, + float limit_upper, + AutomaskingNodeData *automask_data) +{ + float normal_v[3]; + + if (automask_data->orig_data.no) { + copy_v3_v3(normal_v, automask_data->orig_data.no); + } + else { + SCULPT_vertex_normal_get(ss, vertex, normal_v); + } + + float angle = saacos(dot_v3v3(normal, normal_v)); + + /* note that limit is pre-divided by M_PI */ + + if (angle > limit_lower && angle < limit_upper) { + float t = 1.0f - (angle - limit_lower) / (limit_upper - limit_lower); + + /* smoothstep */ + t = t * t * (3.0 - 2.0 * t); + + return t; + } + else if (angle > limit_upper) { + return 0.0f; + } + + return 1.0f; +} + static bool SCULPT_automasking_needs_factors_cache(const Sculpt *sd, const Brush *brush) { @@@ -169,71 -114,9 +169,73 @@@ return false; } +static float automasking_brush_normal_factor(AutomaskingCache *automasking, + SculptSession *ss, - int vertex, ++ PBVHVertRef vertex, + AutomaskingNodeData *automask_data) +{ + float falloff = automasking->settings.start_normal_falloff * M_PI; + float initial_normal[3]; + + if (ss->cache) { + copy_v3_v3(initial_normal, ss->cache->initial_normal); + } + else { + copy_v3_v3(initial_normal, ss->filter_cache->initial_normal); + } + + return sculpt_automasking_normal_calc(automasking, + ss, + vertex, + initial_normal, + automasking->settings.start_normal_limit - falloff * 0.5f, + automasking->settings.start_normal_limit + falloff * 0.5f, + automask_data); +} + +static float automasking_view_normal_factor(AutomaskingCache *automasking, + SculptSession *ss, - int vertex, ++ PBVHVertRef vertex, + AutomaskingNodeData *automask_data) +{ + float falloff = automasking->settings.view_normal_falloff * M_PI; + + float view_normal[3]; + + if (ss->cache) { + copy_v3_v3(view_normal, ss->cache->view_normal); + } + else { + copy_v3_v3(view_normal, ss->filter_cache->view_normal); + } + + return sculpt_automasking_normal_calc(automasking, + ss, + vertex, + view_normal, + automasking->settings.view_normal_limit, + automasking->settings.view_normal_limit + falloff, + automask_data); +} + +static float automasking_view_occlusion_factor(AutomaskingCache *automasking, + SculptSession *ss, - int vertex, ++ PBVHVertRef vertex, + AutomaskingNodeData *automask_data) +{ - if (!automasking->occluded[vertex]) { - automasking->occluded[vertex] = SCULPT_vertex_is_occluded(ss, vertex, true) ? 2 : 1; ++ int index = BKE_pbvh_vertex_to_index(ss->pbvh, vertex); ++ ++ if (!automasking->occluded[index]) { ++ automasking->occluded[index] = SCULPT_vertex_is_occluded(ss, vertex, true) ? 2 : 1; + } + - return automasking->occluded[vertex] == 2; ++ return automasking->occluded[index] == 2; +} + float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession *ss, - int vert, - PBVHVertRef vert) ++ PBVHVertRef vert, + AutomaskingNodeData *automask_data) { if (!automasking) { return 1.0f; @@@ -243,14 -128,9 +247,14 @@@ * automasking information can't be computed in real time per vertex and needs to be * initialized for the whole mesh when the stroke star @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs