Cleanup: deduplicate retrieving data from context in curves brushes

This commit is contained in:
Jacques Lucke 2022-06-03 13:39:31 +02:00
parent 5c6053ccb1
commit 3b51d9065c
8 changed files with 176 additions and 156 deletions

View File

@ -85,10 +85,7 @@ static void initialize_straight_curve_positions(const float3 &p1,
*/
struct AddOperationExecutor {
AddOperation *self_ = nullptr;
const Depsgraph *depsgraph_ = nullptr;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
CurvesSculptCommonContext ctx_;
Object *object_ = nullptr;
Curves *curves_id_ = nullptr;
@ -143,14 +140,14 @@ struct AddOperationExecutor {
static constexpr int max_neighbors = 5;
using NeighborsVector = Vector<NeighborInfo, max_neighbors>;
AddOperationExecutor(const bContext &C) : ctx_(C)
{
}
void execute(AddOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
{
self_ = &self;
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&C);
region_ = CTX_wm_region(&C);
v3d_ = CTX_wm_view3d(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
@ -176,10 +173,10 @@ struct AddOperationExecutor {
reinterpret_cast<const float3 *>(CustomData_get_layer(&surface_->ldata, CD_NORMAL)),
surface_->totloop};
curves_sculpt_ = scene_->toolsettings->curves_sculpt;
curves_sculpt_ = ctx_.scene->toolsettings->curves_sculpt;
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
brush_settings_ = brush_->curves_sculpt_settings;
brush_radius_re_ = brush_radius_get(*scene_, *brush_, stroke_extension);
brush_radius_re_ = brush_radius_get(*ctx_.scene, *brush_, stroke_extension);
brush_pos_re_ = stroke_extension.mouse_position;
use_front_face_ = brush_->flag & BRUSH_FRONTFACE;
@ -256,7 +253,7 @@ struct AddOperationExecutor {
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id);
ED_region_tag_redraw(region_);
ED_region_tag_redraw(ctx_.region);
}
float3 get_bary_coords(const Mesh &mesh, const MLoopTri &looptri, const float3 position) const
@ -276,7 +273,7 @@ struct AddOperationExecutor {
{
float3 ray_start_wo, ray_end_wo;
ED_view3d_win_to_segment_clipped(
depsgraph_, region_, v3d_, brush_pos_re_, ray_start_wo, ray_end_wo, true);
ctx_.depsgraph, ctx_.region, ctx_.v3d, brush_pos_re_, ray_start_wo, ray_end_wo, true);
const float3 ray_start_su = world_to_surface_mat_ * ray_start_wo;
const float3 ray_end_su = world_to_surface_mat_ * ray_end_wo;
@ -352,7 +349,7 @@ struct AddOperationExecutor {
float3 ray_start_wo, ray_end_wo;
ED_view3d_win_to_segment_clipped(
depsgraph_, region_, v3d_, pos_re, ray_start_wo, ray_end_wo, true);
ctx_.depsgraph, ctx_.region, ctx_.v3d, pos_re, ray_start_wo, ray_end_wo, true);
const float3 ray_start_su = brush_transform * (world_to_surface_mat_ * ray_start_wo);
const float3 ray_end_su = brush_transform * (world_to_surface_mat_ * ray_end_wo);
const float3 ray_direction_su = math::normalize(ray_end_su - ray_start_su);
@ -400,17 +397,22 @@ struct AddOperationExecutor {
{
/* Find ray that starts in the center of the brush. */
float3 brush_ray_start_wo, brush_ray_end_wo;
ED_view3d_win_to_segment_clipped(
depsgraph_, region_, v3d_, brush_pos_re_, brush_ray_start_wo, brush_ray_end_wo, true);
ED_view3d_win_to_segment_clipped(ctx_.depsgraph,
ctx_.region,
ctx_.v3d,
brush_pos_re_,
brush_ray_start_wo,
brush_ray_end_wo,
true);
const float3 brush_ray_start_su = world_to_surface_mat_ * brush_ray_start_wo;
const float3 brush_ray_end_su = world_to_surface_mat_ * brush_ray_end_wo;
/* Find ray that starts on the boundary of the brush. That is used to compute the brush radius
* in 3D. */
float3 brush_radius_ray_start_wo, brush_radius_ray_end_wo;
ED_view3d_win_to_segment_clipped(depsgraph_,
region_,
v3d_,
ED_view3d_win_to_segment_clipped(ctx_.depsgraph,
ctx_.region,
ctx_.v3d,
brush_pos_re_ + float2(brush_radius_re_, 0),
brush_radius_ray_start_wo,
brush_radius_ray_end_wo,
@ -895,7 +897,7 @@ struct AddOperationExecutor {
void AddOperation::on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)
{
AddOperationExecutor executor;
AddOperationExecutor executor{C};
executor.execute(*this, C, stroke_extension);
}

View File

@ -277,4 +277,13 @@ Vector<float4x4> get_symmetry_brush_transforms(const eCurvesSymmetryType symmetr
return matrices;
}
CurvesSculptCommonContext::CurvesSculptCommonContext(const bContext &C)
{
this->depsgraph = CTX_data_depsgraph_pointer(&C);
this->scene = CTX_data_scene(&C);
this->region = CTX_wm_region(&C);
this->v3d = CTX_wm_view3d(&C);
this->rv3d = CTX_wm_region_view3d(&C);
}
} // namespace blender::ed::sculpt_paint

View File

@ -78,11 +78,7 @@ class CombOperation : public CurvesSculptStrokeOperation {
*/
struct CombOperationExecutor {
CombOperation *self_ = nullptr;
const Depsgraph *depsgraph_ = nullptr;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
const RegionView3D *rv3d_ = nullptr;
CurvesSculptCommonContext ctx_;
const CurvesSculpt *curves_sculpt_ = nullptr;
const Brush *brush_ = nullptr;
@ -116,24 +112,23 @@ struct CombOperationExecutor {
BVHTreeFromMesh surface_bvh_;
CombOperationExecutor(const bContext &C) : ctx_(C)
{
}
void execute(CombOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
{
self_ = &self;
BLI_SCOPED_DEFER([&]() { self_->brush_pos_last_re_ = stroke_extension.mouse_position; });
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&C);
region_ = CTX_wm_region(&C);
v3d_ = CTX_wm_view3d(&C);
rv3d_ = CTX_wm_region_view3d(&C);
curves_sculpt_ = scene_->toolsettings->curves_sculpt;
curves_sculpt_ = ctx_.scene->toolsettings->curves_sculpt;
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
brush_radius_base_re_ = BKE_brush_size_get(scene_, brush_);
brush_radius_base_re_ = BKE_brush_size_get(ctx_.scene, brush_);
brush_radius_factor_ = brush_radius_factor(*brush_, stroke_extension);
brush_strength_ = brush_strength_get(*scene_, *brush_, stroke_extension);
brush_strength_ = brush_strength_get(*ctx_.scene, *brush_, stroke_extension);
curves_to_world_mat_ = object_->obmat;
world_to_curves_mat_ = curves_to_world_mat_.inverted();
@ -196,7 +191,7 @@ struct CombOperationExecutor {
curves_->tag_positions_changed();
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id);
ED_region_tag_redraw(region_);
ED_region_tag_redraw(ctx_.region);
}
/**
@ -219,7 +214,7 @@ struct CombOperationExecutor {
MutableSpan<float3> positions_cu = curves_->positions_for_write();
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
const float brush_radius_re = brush_radius_base_re_ * brush_radius_factor_;
const float brush_radius_sq_re = pow2f(brush_radius_re);
@ -234,7 +229,7 @@ struct CombOperationExecutor {
/* Find the position of the point in screen space. */
float2 old_pos_re;
ED_view3d_project_float_v2_m4(region_, old_pos_cu, old_pos_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, old_pos_cu, old_pos_re, projection.values);
const float distance_to_brush_sq_re = dist_squared_to_line_segment_v2(
old_pos_re, brush_pos_prev_re_, brush_pos_re_);
@ -254,8 +249,11 @@ struct CombOperationExecutor {
*/
const float2 new_position_re = old_pos_re + brush_pos_diff_re_ * weight;
float3 new_position_wo;
ED_view3d_win_to_3d(
v3d_, region_, curves_to_world_mat_ * old_pos_cu, new_position_re, new_position_wo);
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * old_pos_cu,
new_position_re,
new_position_wo);
const float3 new_position_cu = brush_transform *
(world_to_curves_mat_ * new_position_wo);
positions_cu[point_i] = new_position_cu;
@ -275,16 +273,16 @@ struct CombOperationExecutor {
void comb_spherical_with_symmetry(EnumerableThreadSpecific<Vector<int>> &r_changed_curves)
{
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
float3 brush_start_wo, brush_end_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_prev_re_,
brush_start_wo);
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_re_,
brush_end_wo);
@ -352,8 +350,13 @@ struct CombOperationExecutor {
*/
void initialize_spherical_brush_reference_point()
{
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_base_re_);
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(*ctx_.depsgraph,
*ctx_.region,
*ctx_.v3d,
*ctx_.rv3d,
*object_,
brush_pos_re_,
brush_radius_base_re_);
if (brush_3d.has_value()) {
self_->brush_3d_ = *brush_3d;
}
@ -407,7 +410,7 @@ struct CombOperationExecutor {
void CombOperation::on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)
{
CombOperationExecutor executor;
CombOperationExecutor executor{C};
executor.execute(*this, C, stroke_extension);
}

View File

@ -60,11 +60,7 @@ class DeleteOperation : public CurvesSculptStrokeOperation {
struct DeleteOperationExecutor {
DeleteOperation *self_ = nullptr;
const Depsgraph *depsgraph_ = nullptr;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
const RegionView3D *rv3d_ = nullptr;
CurvesSculptCommonContext ctx_;
Object *object_ = nullptr;
Curves *curves_id_ = nullptr;
@ -83,16 +79,14 @@ struct DeleteOperationExecutor {
float4x4 curves_to_world_mat_;
float4x4 world_to_curves_mat_;
DeleteOperationExecutor(const bContext &C) : ctx_(C)
{
}
void execute(DeleteOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
{
self_ = &self;
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&C);
region_ = CTX_wm_region(&C);
v3d_ = CTX_wm_view3d(&C);
rv3d_ = CTX_wm_region_view3d(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
@ -100,9 +94,9 @@ struct DeleteOperationExecutor {
selected_curve_indices_.clear();
curve_selection_ = retrieve_selected_curves(*curves_id_, selected_curve_indices_);
curves_sculpt_ = scene_->toolsettings->curves_sculpt;
curves_sculpt_ = ctx_.scene->toolsettings->curves_sculpt;
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
brush_radius_base_re_ = BKE_brush_size_get(scene_, brush_);
brush_radius_base_re_ = BKE_brush_size_get(ctx_.scene, brush_);
brush_radius_factor_ = brush_radius_factor(*brush_, stroke_extension);
brush_pos_re_ = stroke_extension.mouse_position;
@ -140,7 +134,7 @@ struct DeleteOperationExecutor {
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id);
ED_region_tag_redraw(region_);
ED_region_tag_redraw(ctx_.region);
}
void delete_projected_with_symmetry(MutableSpan<bool> curves_to_delete)
@ -157,7 +151,7 @@ struct DeleteOperationExecutor {
const float4x4 brush_transform_inv = brush_transform.inverted();
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
Span<float3> positions_cu = curves_->positions();
@ -170,7 +164,7 @@ struct DeleteOperationExecutor {
if (points.size() == 1) {
const float3 pos_cu = brush_transform_inv * positions_cu[points.first()];
float2 pos_re;
ED_view3d_project_float_v2_m4(region_, pos_cu, pos_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, pos_cu, pos_re, projection.values);
if (math::distance_squared(brush_pos_re_, pos_re) <= brush_radius_sq_re) {
curves_to_delete[curve_i] = true;
@ -183,8 +177,8 @@ struct DeleteOperationExecutor {
const float3 pos2_cu = brush_transform_inv * positions_cu[segment_i + 1];
float2 pos1_re, pos2_re;
ED_view3d_project_float_v2_m4(region_, pos1_cu, pos1_re, projection.values);
ED_view3d_project_float_v2_m4(region_, pos2_cu, pos2_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, pos1_cu, pos1_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, pos2_cu, pos2_re, projection.values);
const float dist_sq_re = dist_squared_to_line_segment_v2(
brush_pos_re_, pos1_re, pos2_re);
@ -200,11 +194,11 @@ struct DeleteOperationExecutor {
void delete_spherical_with_symmetry(MutableSpan<bool> curves_to_delete)
{
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
float3 brush_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_re_,
brush_wo);
@ -255,8 +249,13 @@ struct DeleteOperationExecutor {
void initialize_spherical_brush_reference_point()
{
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_base_re_);
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(*ctx_.depsgraph,
*ctx_.region,
*ctx_.v3d,
*ctx_.rv3d,
*object_,
brush_pos_re_,
brush_radius_base_re_);
if (brush_3d.has_value()) {
self_->brush_3d_ = *brush_3d;
}
@ -266,7 +265,7 @@ struct DeleteOperationExecutor {
void DeleteOperation::on_stroke_extended(const bContext &C,
const StrokeExtension &stroke_extension)
{
DeleteOperationExecutor executor;
DeleteOperationExecutor executor{C};
executor.execute(*this, C, stroke_extension);
}

View File

@ -270,11 +270,7 @@ class CurvesEffectOperation : public CurvesSculptStrokeOperation {
*/
struct CurvesEffectOperationExecutor {
CurvesEffectOperation *self_ = nullptr;
const Depsgraph *depsgraph_ = nullptr;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
const RegionView3D *rv3d_ = nullptr;
CurvesSculptCommonContext ctx_;
Object *object_ = nullptr;
Curves *curves_id_ = nullptr;
@ -302,6 +298,10 @@ struct CurvesEffectOperationExecutor {
Vector<float> move_distances_cu;
};
CurvesEffectOperationExecutor(const bContext &C) : ctx_(C)
{
}
void execute(CurvesEffectOperation &self,
const bContext &C,
const StrokeExtension &stroke_extension)
@ -309,12 +309,7 @@ struct CurvesEffectOperationExecutor {
BLI_SCOPED_DEFER([&]() { self.last_mouse_position_ = stroke_extension.mouse_position; });
self_ = &self;
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&C);
region_ = CTX_wm_region(&C);
v3d_ = CTX_wm_view3d(&C);
rv3d_ = CTX_wm_region_view3d(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
@ -325,13 +320,13 @@ struct CurvesEffectOperationExecutor {
curve_selection_factors_ = get_curves_selection(*curves_id_);
curve_selection_ = retrieve_selected_curves(*curves_id_, selected_curve_indices_);
const CurvesSculpt &curves_sculpt = *scene_->toolsettings->curves_sculpt;
const CurvesSculpt &curves_sculpt = *ctx_.scene->toolsettings->curves_sculpt;
brush_ = BKE_paint_brush_for_read(&curves_sculpt.paint);
brush_strength_ = brush_strength_get(*scene_, *brush_, stroke_extension);
brush_strength_ = brush_strength_get(*ctx_.scene, *brush_, stroke_extension);
brush_radius_base_re_ = BKE_brush_size_get(scene_, brush_);
brush_radius_base_re_ = BKE_brush_size_get(ctx_.scene, brush_);
brush_radius_factor_ = brush_radius_factor(*brush_, stroke_extension);
brush_strength_ = brush_strength_get(*scene_, *brush_, stroke_extension);
brush_strength_ = brush_strength_get(*ctx_.scene, *brush_, stroke_extension);
falloff_shape_ = eBrushFalloffShape(brush_->falloff_shape);
@ -344,10 +339,10 @@ struct CurvesEffectOperationExecutor {
if (stroke_extension.is_first) {
if (falloff_shape_ == PAINT_FALLOFF_SHAPE_SPHERE) {
if (std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
*depsgraph_,
*region_,
*v3d_,
*rv3d_,
*ctx_.depsgraph,
*ctx_.region,
*ctx_.v3d,
*ctx_.rv3d,
*object_,
stroke_extension.mouse_position,
brush_radius_base_re_)) {
@ -376,7 +371,7 @@ struct CurvesEffectOperationExecutor {
curves_->tag_positions_changed();
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id);
ED_region_tag_redraw(region_);
ED_region_tag_redraw(ctx_.region);
}
void gather_influences_projected(
@ -385,7 +380,7 @@ struct CurvesEffectOperationExecutor {
const Span<float3> positions_cu = curves_->positions();
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
const Vector<float4x4> symmetry_brush_transforms = get_symmetry_brush_transforms(
eCurvesSymmetryType(curves_id_->symmetry));
@ -412,8 +407,8 @@ struct CurvesEffectOperationExecutor {
const float3 p2_cu = brush_transform_inv * positions_cu[segment_i + 1];
float2 p1_re, p2_re;
ED_view3d_project_float_v2_m4(region_, p1_cu, p1_re, projection.values);
ED_view3d_project_float_v2_m4(region_, p2_cu, p2_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, p1_cu, p1_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, p2_cu, p2_re, projection.values);
float2 closest_on_brush_re;
float2 closest_on_segment_re;
@ -441,13 +436,13 @@ struct CurvesEffectOperationExecutor {
p1_cu, p2_cu, lambda_on_segment);
float3 brush_start_pos_wo, brush_end_pos_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * closest_on_segment_cu,
brush_pos_start_re_,
brush_start_pos_wo);
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * closest_on_segment_cu,
brush_pos_end_re_,
brush_end_pos_wo);
@ -473,13 +468,13 @@ struct CurvesEffectOperationExecutor {
const Span<float3> positions_cu = curves_->positions();
float3 brush_pos_start_wo, brush_pos_end_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_start_re_,
brush_pos_start_wo);
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_end_re_,
brush_pos_end_wo);
@ -547,7 +542,7 @@ struct CurvesEffectOperationExecutor {
void CurvesEffectOperation::on_stroke_extended(const bContext &C,
const StrokeExtension &stroke_extension)
{
CurvesEffectOperationExecutor executor;
CurvesEffectOperationExecutor executor{C};
executor.execute(*this, C, stroke_extension);
}

View File

@ -95,4 +95,15 @@ VArray<float> get_point_selection(const Curves &curves_id);
*/
IndexMask retrieve_selected_curves(const Curves &curves_id, Vector<int64_t> &r_indices);
class CurvesSculptCommonContext {
public:
const Depsgraph *depsgraph = nullptr;
const Scene *scene = nullptr;
ARegion *region = nullptr;
const View3D *v3d = nullptr;
const RegionView3D *rv3d = nullptr;
CurvesSculptCommonContext(const bContext &C);
};
} // namespace blender::ed::sculpt_paint

View File

@ -51,12 +51,7 @@ class SelectionPaintOperation : public CurvesSculptStrokeOperation {
struct SelectionPaintOperationExecutor {
SelectionPaintOperation *self_ = nullptr;
const bContext *C_ = nullptr;
const Depsgraph *depsgraph_ = nullptr;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
const RegionView3D *rv3d_ = nullptr;
CurvesSculptCommonContext ctx_;
Object *object_ = nullptr;
Curves *curves_id_ = nullptr;
@ -74,26 +69,25 @@ struct SelectionPaintOperationExecutor {
float4x4 curves_to_world_mat_;
float4x4 world_to_curves_mat_;
SelectionPaintOperationExecutor(const bContext &C) : ctx_(C)
{
}
void execute(SelectionPaintOperation &self,
const bContext &C,
const StrokeExtension &stroke_extension)
{
self_ = &self;
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&C);
region_ = CTX_wm_region(&C);
v3d_ = CTX_wm_view3d(&C);
rv3d_ = CTX_wm_region_view3d(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_id_->flag |= CV_SCULPT_SELECTION_ENABLED;
brush_ = BKE_paint_brush_for_read(&scene_->toolsettings->curves_sculpt->paint);
brush_radius_base_re_ = BKE_brush_size_get(scene_, brush_);
brush_ = BKE_paint_brush_for_read(&ctx_.scene->toolsettings->curves_sculpt->paint);
brush_radius_base_re_ = BKE_brush_size_get(ctx_.scene, brush_);
brush_radius_factor_ = brush_radius_factor(*brush_, stroke_extension);
brush_strength_ = BKE_brush_alpha_get(scene_, brush_);
brush_strength_ = BKE_brush_alpha_get(ctx_.scene, brush_);
brush_pos_re_ = stroke_extension.mouse_position;
@ -145,7 +139,7 @@ struct SelectionPaintOperationExecutor {
* selection is handled as a generic attribute for now. */
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id);
ED_region_tag_redraw(region_);
ED_region_tag_redraw(ctx_.region);
}
void paint_point_selection_projected_with_symmetry(MutableSpan<float> selection)
@ -163,7 +157,7 @@ struct SelectionPaintOperationExecutor {
const float4x4 brush_transform_inv = brush_transform.inverted();
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
Span<float3> positions_cu = curves_->positions();
@ -176,7 +170,7 @@ struct SelectionPaintOperationExecutor {
/* Find the position of the point in screen space. */
float2 pos_re;
ED_view3d_project_float_v2_m4(region_, pos_cu, pos_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, pos_cu, pos_re, projection.values);
const float distance_to_brush_sq_re = math::distance_squared(pos_re, brush_pos_re_);
if (distance_to_brush_sq_re > brush_radius_sq_re) {
@ -199,11 +193,11 @@ struct SelectionPaintOperationExecutor {
void paint_point_selection_spherical_with_symmetry(MutableSpan<float> selection)
{
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
float3 brush_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_re_,
brush_wo);
@ -264,7 +258,7 @@ struct SelectionPaintOperationExecutor {
const float4x4 brush_transform_inv = brush_transform.inverted();
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
const float brush_radius_re = brush_radius_base_re_ * brush_radius_factor_;
const float brush_radius_sq_re = pow2f(brush_radius_re);
@ -283,8 +277,8 @@ struct SelectionPaintOperationExecutor {
float2 pos1_re;
float2 pos2_re;
ED_view3d_project_float_v2_m4(region_, pos1_cu, pos1_re, projection.values);
ED_view3d_project_float_v2_m4(region_, pos2_cu, pos2_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, pos1_cu, pos1_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, pos2_cu, pos2_re, projection.values);
const float distance_sq_re = dist_squared_to_line_segment_v2(
brush_pos_re_, pos1_re, pos2_re);
@ -307,11 +301,11 @@ struct SelectionPaintOperationExecutor {
void paint_curve_selection_spherical_with_symmetry(MutableSpan<float> selection)
{
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
float3 brush_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_re_,
brush_wo);
@ -364,8 +358,13 @@ struct SelectionPaintOperationExecutor {
void initialize_spherical_brush_reference_point()
{
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_base_re_);
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(*ctx_.depsgraph,
*ctx_.region,
*ctx_.v3d,
*ctx_.rv3d,
*object_,
brush_pos_re_,
brush_radius_base_re_);
if (brush_3d.has_value()) {
self_->brush_3d_ = *brush_3d;
}
@ -375,7 +374,7 @@ struct SelectionPaintOperationExecutor {
void SelectionPaintOperation::on_stroke_extended(const bContext &C,
const StrokeExtension &stroke_extension)
{
SelectionPaintOperationExecutor executor;
SelectionPaintOperationExecutor executor{C};
executor.execute(*this, C, stroke_extension);
}

View File

@ -72,11 +72,7 @@ class SnakeHookOperation : public CurvesSculptStrokeOperation {
*/
struct SnakeHookOperatorExecutor {
SnakeHookOperation *self_ = nullptr;
const Depsgraph *depsgraph_ = nullptr;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
const RegionView3D *rv3d_ = nullptr;
CurvesSculptCommonContext ctx_;
const CurvesSculpt *curves_sculpt_ = nullptr;
const Brush *brush_ = nullptr;
@ -101,6 +97,10 @@ struct SnakeHookOperatorExecutor {
float2 brush_pos_re_;
float2 brush_pos_diff_re_;
SnakeHookOperatorExecutor(const bContext &C) : ctx_(C)
{
}
void execute(SnakeHookOperation &self,
const bContext &C,
const StrokeExtension &stroke_extension)
@ -108,20 +108,14 @@ struct SnakeHookOperatorExecutor {
BLI_SCOPED_DEFER([&]() { self.last_mouse_position_re_ = stroke_extension.mouse_position; });
self_ = &self;
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&C);
region_ = CTX_wm_region(&C);
v3d_ = CTX_wm_view3d(&C);
rv3d_ = CTX_wm_region_view3d(&C);
curves_sculpt_ = scene_->toolsettings->curves_sculpt;
curves_sculpt_ = ctx_.scene->toolsettings->curves_sculpt;
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
brush_radius_base_re_ = BKE_brush_size_get(scene_, brush_);
brush_radius_base_re_ = BKE_brush_size_get(ctx_.scene, brush_);
brush_radius_factor_ = brush_radius_factor(*brush_, stroke_extension);
brush_strength_ = brush_strength_get(*scene_, *brush_, stroke_extension);
brush_strength_ = brush_strength_get(*ctx_.scene, *brush_, stroke_extension);
falloff_shape_ = static_cast<eBrushFalloffShape>(brush_->falloff_shape);
@ -143,8 +137,13 @@ struct SnakeHookOperatorExecutor {
if (stroke_extension.is_first) {
if (falloff_shape_ == PAINT_FALLOFF_SHAPE_SPHERE) {
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_base_re_);
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(*ctx_.depsgraph,
*ctx_.region,
*ctx_.v3d,
*ctx_.rv3d,
*object_,
brush_pos_re_,
brush_radius_base_re_);
if (brush_3d.has_value()) {
self_->brush_3d_ = *brush_3d;
}
@ -165,7 +164,7 @@ struct SnakeHookOperatorExecutor {
curves_->tag_positions_changed();
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id);
ED_region_tag_redraw(region_);
ED_region_tag_redraw(ctx_.region);
}
void projected_snake_hook_with_symmetry()
@ -184,7 +183,7 @@ struct SnakeHookOperatorExecutor {
MutableSpan<float3> positions_cu = curves_->positions_for_write();
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
const float brush_radius_re = brush_radius_base_re_ * brush_radius_factor_;
const float brush_radius_sq_re = pow2f(brush_radius_re);
@ -196,7 +195,7 @@ struct SnakeHookOperatorExecutor {
const float3 old_pos_cu = brush_transform_inv * positions_cu[last_point_i];
float2 old_pos_re;
ED_view3d_project_float_v2_m4(region_, old_pos_cu, old_pos_re, projection.values);
ED_view3d_project_float_v2_m4(ctx_.region, old_pos_cu, old_pos_re, projection.values);
const float distance_to_brush_sq_re = math::distance_squared(old_pos_re,
brush_pos_prev_re_);
@ -210,8 +209,11 @@ struct SnakeHookOperatorExecutor {
const float2 new_position_re = old_pos_re + brush_pos_diff_re_ * weight;
float3 new_position_wo;
ED_view3d_win_to_3d(
v3d_, region_, curves_to_world_mat_ * old_pos_cu, new_position_re, new_position_wo);
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * old_pos_cu,
new_position_re,
new_position_wo);
const float3 new_position_cu = brush_transform * (world_to_curves_mat_ * new_position_wo);
this->move_last_point_and_resample(positions_cu.slice(points), new_position_cu);
@ -222,16 +224,16 @@ struct SnakeHookOperatorExecutor {
void spherical_snake_hook_with_symmetry()
{
float4x4 projection;
ED_view3d_ob_project_mat_get(rv3d_, object_, projection.values);
ED_view3d_ob_project_mat_get(ctx_.rv3d, object_, projection.values);
float3 brush_start_wo, brush_end_wo;
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_prev_re_,
brush_start_wo);
ED_view3d_win_to_3d(v3d_,
region_,
ED_view3d_win_to_3d(ctx_.v3d,
ctx_.region,
curves_to_world_mat_ * self_->brush_3d_.position_cu,
brush_pos_re_,
brush_end_wo);
@ -317,7 +319,7 @@ struct SnakeHookOperatorExecutor {
void SnakeHookOperation::on_stroke_extended(const bContext &C,
const StrokeExtension &stroke_extension)
{
SnakeHookOperatorExecutor executor;
SnakeHookOperatorExecutor executor{C};
executor.execute(*this, C, stroke_extension);
}