Cleanup: deduplicate retrieving data from context in curves brushes
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user