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);
|
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
|
} // 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_fill_brush(const Sculpt &sd, Object &object, Span<PBVHNode *> nodes);
|
||||||
void do_flatten_brush(const Sculpt &sd, Object &ob, 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_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);
|
void do_inflate_brush(const Sculpt &sd, Object &ob, Span<PBVHNode *> nodes);
|
||||||
/** A brush that modifies mask values instead of position. */
|
/** A brush that modifies mask values instead of position. */
|
||||||
void do_mask_brush(const Sculpt &sd, Object &object, Span<PBVHNode *> nodes);
|
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
|
/** \name Sculpt Brush Utilities
|
||||||
* \{ */
|
* \{ */
|
||||||
@ -3946,7 +3893,7 @@ static void do_brush_action(const Scene &scene,
|
|||||||
!ELEM(
|
!ELEM(
|
||||||
brush.sculpt_tool, SCULPT_TOOL_CLOTH, SCULPT_TOOL_DRAW_FACE_SETS, SCULPT_TOOL_BOUNDARY))
|
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) {
|
if (brush.deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM) {
|
||||||
|
Loading…
Reference in New Issue
Block a user