Cleanup: deduplicate retrieving data from context in curves brushes

This commit is contained in:
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 { struct AddOperationExecutor {
AddOperation *self_ = nullptr; AddOperation *self_ = nullptr;
const Depsgraph *depsgraph_ = nullptr; CurvesSculptCommonContext ctx_;
const Scene *scene_ = nullptr;
ARegion *region_ = nullptr;
const View3D *v3d_ = nullptr;
Object *object_ = nullptr; Object *object_ = nullptr;
Curves *curves_id_ = nullptr; Curves *curves_id_ = nullptr;
@@ -143,14 +140,14 @@ struct AddOperationExecutor {
static constexpr int max_neighbors = 5; static constexpr int max_neighbors = 5;
using NeighborsVector = Vector<NeighborInfo, max_neighbors>; using NeighborsVector = Vector<NeighborInfo, max_neighbors>;
AddOperationExecutor(const bContext &C) : ctx_(C)
{
}
void execute(AddOperation &self, const bContext &C, const StrokeExtension &stroke_extension) void execute(AddOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
{ {
self_ = &self; self_ = &self;
depsgraph_ = CTX_data_depsgraph_pointer(&C);
scene_ = CTX_data_scene(&C);
object_ = CTX_data_active_object(&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_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry); curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
@@ -176,10 +173,10 @@ struct AddOperationExecutor {
reinterpret_cast<const float3 *>(CustomData_get_layer(&surface_->ldata, CD_NORMAL)), reinterpret_cast<const float3 *>(CustomData_get_layer(&surface_->ldata, CD_NORMAL)),
surface_->totloop}; 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_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
brush_settings_ = brush_->curves_sculpt_settings; 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; brush_pos_re_ = stroke_extension.mouse_position;
use_front_face_ = brush_->flag & BRUSH_FRONTFACE; use_front_face_ = brush_->flag & BRUSH_FRONTFACE;
@@ -256,7 +253,7 @@ struct AddOperationExecutor {
DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY); DEG_id_tag_update(&curves_id_->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, &curves_id_->id); 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 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; float3 ray_start_wo, ray_end_wo;
ED_view3d_win_to_segment_clipped( 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_start_su = world_to_surface_mat_ * ray_start_wo;
const float3 ray_end_su = world_to_surface_mat_ * ray_end_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; float3 ray_start_wo, ray_end_wo;
ED_view3d_win_to_segment_clipped( 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_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_end_su = brush_transform * (world_to_surface_mat_ * ray_end_wo);
const float3 ray_direction_su = math::normalize(ray_end_su - ray_start_su); 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. */ /* Find ray that starts in the center of the brush. */
float3 brush_ray_start_wo, brush_ray_end_wo; float3 brush_ray_start_wo, brush_ray_end_wo;
ED_view3d_win_to_segment_clipped( ED_view3d_win_to_segment_clipped(ctx_.depsgraph,
depsgraph_, region_, v3d_, brush_pos_re_, brush_ray_start_wo, brush_ray_end_wo, true); 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_start_su = world_to_surface_mat_ * brush_ray_start_wo;
const float3 brush_ray_end_su = world_to_surface_mat_ * brush_ray_end_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 /* Find ray that starts on the boundary of the brush. That is used to compute the brush radius
* in 3D. */ * in 3D. */
float3 brush_radius_ray_start_wo, brush_radius_ray_end_wo; float3 brush_radius_ray_start_wo, brush_radius_ray_end_wo;
ED_view3d_win_to_segment_clipped(depsgraph_, ED_view3d_win_to_segment_clipped(ctx_.depsgraph,
region_, ctx_.region,
v3d_, ctx_.v3d,
brush_pos_re_ + float2(brush_radius_re_, 0), brush_pos_re_ + float2(brush_radius_re_, 0),
brush_radius_ray_start_wo, brush_radius_ray_start_wo,
brush_radius_ray_end_wo, brush_radius_ray_end_wo,
@@ -895,7 +897,7 @@ struct AddOperationExecutor {
void AddOperation::on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) void AddOperation::on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)
{ {
AddOperationExecutor executor; AddOperationExecutor executor{C};
executor.execute(*this, C, stroke_extension); executor.execute(*this, C, stroke_extension);
} }

View File

@@ -277,4 +277,13 @@ Vector<float4x4> get_symmetry_brush_transforms(const eCurvesSymmetryType symmetr
return matrices; 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 } // namespace blender::ed::sculpt_paint

View File

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

View File

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

View File

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

View File

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

View File

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