Cleanup: deduplicate retrieving data from context in curves brushes
This commit is contained in:
parent
5c6053ccb1
commit
3b51d9065c
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue