[Bf-blender-cvs] [447425ad991] temp-sculpt-normals-masking: Merge branch 'master' into temp-sculpt-normals-masking
Joseph Eagar
noreply at git.blender.org
Sat Jul 30 20:31:34 CEST 2022
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. @@
More information about the Bf-blender-cvs
mailing list