Sculpt: Use new "offset brush" implementation for brush gravity
Part of #118145.
This commit is contained in:
parent
993361c2f0
commit
b4c5334af7
@ -253,4 +253,14 @@ void do_nudge_brush(const Sculpt &sd, Object &object, Span<PBVHNode *> nodes)
|
||||
offset_positions(sd, object, offset * ss.cache->bstrength, nodes);
|
||||
}
|
||||
|
||||
void do_gravity_brush(const Sculpt &sd, Object &object, Span<PBVHNode *> nodes)
|
||||
{
|
||||
const SculptSession &ss = *object.sculpt;
|
||||
|
||||
const float3 offset = ss.cache->gravity_direction * -ss.cache->radius_squared * ss.cache->scale *
|
||||
sd.gravity_factor;
|
||||
|
||||
offset_positions(sd, object, offset, nodes);
|
||||
}
|
||||
|
||||
} // namespace blender::ed::sculpt_paint
|
||||
|
@ -34,6 +34,7 @@ void do_elastic_deform_brush(const Sculpt &sd, Object &object, Span<PBVHNode *>
|
||||
void do_fill_brush(const Sculpt &sd, Object &object, Span<PBVHNode *> nodes);
|
||||
void do_flatten_brush(const Sculpt &sd, Object &ob, Span<PBVHNode *> nodes);
|
||||
void do_grab_brush(const Sculpt &sd, Object &ob, Span<PBVHNode *> nodes);
|
||||
void do_gravity_brush(const Sculpt &sd, Object &ob, Span<PBVHNode *> nodes);
|
||||
void do_inflate_brush(const Sculpt &sd, Object &ob, Span<PBVHNode *> nodes);
|
||||
/** A brush that modifies mask values instead of position. */
|
||||
void do_mask_brush(const Sculpt &sd, Object &object, Span<PBVHNode *> nodes);
|
||||
|
@ -3442,59 +3442,6 @@ float SCULPT_brush_plane_offset_get(const Sculpt &sd, const SculptSession &ss)
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Sculpt Gravity Brush
|
||||
* \{ */
|
||||
|
||||
static void do_gravity_task(SculptSession &ss,
|
||||
const Brush &brush,
|
||||
const float *offset,
|
||||
PBVHNode *node)
|
||||
{
|
||||
PBVHVertexIter vd;
|
||||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss.pbvh, *node).co;
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
ss, test, brush.falloff_shape);
|
||||
const int thread_id = BLI_task_parallel_thread_id(nullptr);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (*ss.pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
if (!sculpt_brush_test_sq_fn(test, vd.co)) {
|
||||
continue;
|
||||
}
|
||||
const float fade = SCULPT_brush_strength_factor(
|
||||
ss, brush, vd.co, sqrtf(test.dist), vd.no, vd.fno, vd.mask, vd.vertex, thread_id, nullptr);
|
||||
|
||||
mul_v3_v3fl(proxy[vd.i], offset, fade);
|
||||
}
|
||||
BKE_pbvh_vertex_iter_end;
|
||||
}
|
||||
|
||||
static void do_gravity(const Sculpt &sd, Object &ob, Span<PBVHNode *> nodes, float bstrength)
|
||||
{
|
||||
using namespace blender;
|
||||
SculptSession &ss = *ob.sculpt;
|
||||
const Brush &brush = *BKE_paint_brush_for_read(&sd.paint);
|
||||
|
||||
float offset[3];
|
||||
float gravity_vector[3];
|
||||
|
||||
mul_v3_v3fl(gravity_vector, ss.cache->gravity_direction, -ss.cache->radius_squared);
|
||||
|
||||
/* Offset with as much as possible factored in already. */
|
||||
mul_v3_v3v3(offset, gravity_vector, ss.cache->scale);
|
||||
mul_v3_fl(offset, bstrength);
|
||||
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (const int i : range) {
|
||||
do_gravity_task(ss, brush, offset, nodes[i]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Sculpt Brush Utilities
|
||||
* \{ */
|
||||
@ -3946,7 +3893,7 @@ static void do_brush_action(const Scene &scene,
|
||||
!ELEM(
|
||||
brush.sculpt_tool, SCULPT_TOOL_CLOTH, SCULPT_TOOL_DRAW_FACE_SETS, SCULPT_TOOL_BOUNDARY))
|
||||
{
|
||||
do_gravity(sd, ob, nodes, sd.gravity_factor);
|
||||
do_gravity_brush(sd, ob, nodes);
|
||||
}
|
||||
|
||||
if (brush.deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) {
|
||||
|
Loading…
Reference in New Issue
Block a user