Cleanup: Use const in curves sculpt code
This makes it much clearer what data is supposed to be modified and what data is just used to influence the operation. The new `BKE_paint_brush_for_read` function isn't great design, but it can be removed or renamed if similar changes are applied to more places. Also pass pointers explicitly to `sample_curves_3d_brush` rather than reusing the `bContext`. This makes it clearer what data the function actually needs. Differential Revision: https://developer.blender.org/D14967
This commit is contained in:
parent
3ad5510427
commit
ed62b65474
|
@ -180,6 +180,7 @@ struct Paint *BKE_paint_get_active_from_context(const struct bContext *C);
|
|||
ePaintMode BKE_paintmode_get_active_from_context(const struct bContext *C);
|
||||
ePaintMode BKE_paintmode_get_from_tool(const struct bToolRef *tref);
|
||||
struct Brush *BKE_paint_brush(struct Paint *paint);
|
||||
const struct Brush *BKE_paint_brush_for_read(const struct Paint *p);
|
||||
void BKE_paint_brush_set(struct Paint *paint, struct Brush *br);
|
||||
struct Palette *BKE_paint_palette(struct Paint *paint);
|
||||
void BKE_paint_palette_set(struct Paint *p, struct Palette *palette);
|
||||
|
|
|
@ -605,6 +605,11 @@ ePaintMode BKE_paintmode_get_from_tool(const struct bToolRef *tref)
|
|||
}
|
||||
|
||||
Brush *BKE_paint_brush(Paint *p)
|
||||
{
|
||||
return (Brush *)BKE_paint_brush_for_read((const Paint *)p);
|
||||
}
|
||||
|
||||
const Brush *BKE_paint_brush_for_read(const Paint *p)
|
||||
{
|
||||
return p ? p->brush : NULL;
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@ class AddOperation : public CurvesSculptStrokeOperation {
|
|||
}
|
||||
}
|
||||
|
||||
void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) override;
|
||||
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override;
|
||||
};
|
||||
|
||||
static void initialize_straight_curve_positions(const float3 &p1,
|
||||
|
@ -85,11 +85,12 @@ static void initialize_straight_curve_positions(const float3 &p1,
|
|||
*/
|
||||
struct AddOperationExecutor {
|
||||
AddOperation *self_ = nullptr;
|
||||
Depsgraph *depsgraph_ = nullptr;
|
||||
Scene *scene_ = nullptr;
|
||||
Object *object_ = nullptr;
|
||||
const Depsgraph *depsgraph_ = nullptr;
|
||||
const Scene *scene_ = nullptr;
|
||||
ARegion *region_ = nullptr;
|
||||
View3D *v3d_ = nullptr;
|
||||
const View3D *v3d_ = nullptr;
|
||||
|
||||
Object *object_ = nullptr;
|
||||
Curves *curves_id_ = nullptr;
|
||||
CurvesGeometry *curves_ = nullptr;
|
||||
|
||||
|
@ -98,9 +99,9 @@ struct AddOperationExecutor {
|
|||
Span<MLoopTri> surface_looptris_;
|
||||
Span<float3> corner_normals_su_;
|
||||
|
||||
CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
Brush *brush_ = nullptr;
|
||||
BrushCurvesSculptSettings *brush_settings_ = nullptr;
|
||||
const CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
const Brush *brush_ = nullptr;
|
||||
const BrushCurvesSculptSettings *brush_settings_ = nullptr;
|
||||
|
||||
float brush_radius_re_;
|
||||
float2 brush_pos_re_;
|
||||
|
@ -142,14 +143,14 @@ struct AddOperationExecutor {
|
|||
static constexpr int max_neighbors = 5;
|
||||
using NeighborsVector = Vector<NeighborInfo, max_neighbors>;
|
||||
|
||||
void execute(AddOperation &self, bContext *C, const StrokeExtension &stroke_extension)
|
||||
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);
|
||||
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,7 +177,7 @@ struct AddOperationExecutor {
|
|||
surface_->totloop};
|
||||
|
||||
curves_sculpt_ = scene_->toolsettings->curves_sculpt;
|
||||
brush_ = BKE_paint_brush(&curves_sculpt_->paint);
|
||||
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
|
||||
brush_settings_ = brush_->curves_sculpt_settings;
|
||||
brush_radius_re_ = BKE_brush_size_get(scene_, brush_);
|
||||
brush_pos_re_ = stroke_extension.mouse_position;
|
||||
|
@ -864,17 +865,18 @@ struct AddOperationExecutor {
|
|||
}
|
||||
};
|
||||
|
||||
void AddOperation::on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension)
|
||||
void AddOperation::on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)
|
||||
{
|
||||
AddOperationExecutor executor;
|
||||
executor.execute(*this, C, stroke_extension);
|
||||
}
|
||||
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_add_operation(bContext &C, ReportList *reports)
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_add_operation(const bContext &C,
|
||||
ReportList *reports)
|
||||
{
|
||||
Object &ob_active = *CTX_data_active_object(&C);
|
||||
const Object &ob_active = *CTX_data_active_object(&C);
|
||||
BLI_assert(ob_active.type == OB_CURVES);
|
||||
Curves &curves_id = *static_cast<Curves *>(ob_active.data);
|
||||
const Curves &curves_id = *static_cast<Curves *>(ob_active.data);
|
||||
if (curves_id.surface == nullptr || curves_id.surface->type != OB_MESH) {
|
||||
BKE_report(reports, RPT_WARNING, "Can not use Add brush when there is no surface mesh");
|
||||
return {};
|
||||
|
|
|
@ -141,23 +141,21 @@ static std::optional<float3> find_curves_brush_position(const CurvesGeometry &cu
|
|||
return best_candidate.position_cu;
|
||||
}
|
||||
|
||||
std::optional<CurvesBrush3D> sample_curves_3d_brush(bContext &C,
|
||||
Object &curves_object,
|
||||
std::optional<CurvesBrush3D> sample_curves_3d_brush(const Depsgraph &depsgraph,
|
||||
const ARegion ®ion,
|
||||
const View3D &v3d,
|
||||
const RegionView3D &rv3d,
|
||||
const Object &curves_object,
|
||||
const float2 &brush_pos_re,
|
||||
const float brush_radius_re)
|
||||
{
|
||||
const Depsgraph *depsgraph = CTX_data_depsgraph_pointer(&C);
|
||||
const ARegion *region = CTX_wm_region(&C);
|
||||
const View3D *v3d = CTX_wm_view3d(&C);
|
||||
const RegionView3D *rv3d = CTX_wm_region_view3d(&C);
|
||||
|
||||
const Curves &curves_id = *static_cast<Curves *>(curves_object.data);
|
||||
const CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
|
||||
const Object *surface_object = curves_id.surface;
|
||||
|
||||
float3 center_ray_start_wo, center_ray_end_wo;
|
||||
ED_view3d_win_to_segment_clipped(
|
||||
depsgraph, region, v3d, brush_pos_re, center_ray_start_wo, center_ray_end_wo, true);
|
||||
&depsgraph, ®ion, &v3d, brush_pos_re, center_ray_start_wo, center_ray_end_wo, true);
|
||||
|
||||
/* Shorten ray when the surface object is hit. */
|
||||
if (surface_object != nullptr) {
|
||||
|
@ -205,8 +203,8 @@ std::optional<CurvesBrush3D> sample_curves_3d_brush(bContext &C,
|
|||
center_ray_start_cu,
|
||||
center_ray_end_cu,
|
||||
brush_radius_re,
|
||||
*region,
|
||||
*rv3d,
|
||||
region,
|
||||
rv3d,
|
||||
curves_object);
|
||||
if (!brush_position_optional_cu.has_value()) {
|
||||
/* Nothing found. */
|
||||
|
@ -216,9 +214,9 @@ std::optional<CurvesBrush3D> sample_curves_3d_brush(bContext &C,
|
|||
|
||||
/* Determine the 3D brush radius. */
|
||||
float3 radius_ray_start_wo, radius_ray_end_wo;
|
||||
ED_view3d_win_to_segment_clipped(depsgraph,
|
||||
region,
|
||||
v3d,
|
||||
ED_view3d_win_to_segment_clipped(&depsgraph,
|
||||
®ion,
|
||||
&v3d,
|
||||
brush_pos_re + float2(brush_radius_re, 0.0f),
|
||||
radius_ray_start_wo,
|
||||
radius_ray_end_wo,
|
||||
|
|
|
@ -69,7 +69,7 @@ class CombOperation : public CurvesSculptStrokeOperation {
|
|||
friend struct CombOperationExecutor;
|
||||
|
||||
public:
|
||||
void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) override;
|
||||
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -78,21 +78,20 @@ class CombOperation : public CurvesSculptStrokeOperation {
|
|||
*/
|
||||
struct CombOperationExecutor {
|
||||
CombOperation *self_ = nullptr;
|
||||
bContext *C_ = nullptr;
|
||||
Depsgraph *depsgraph_ = nullptr;
|
||||
Scene *scene_ = nullptr;
|
||||
Object *object_ = nullptr;
|
||||
const Depsgraph *depsgraph_ = nullptr;
|
||||
const Scene *scene_ = nullptr;
|
||||
ARegion *region_ = nullptr;
|
||||
View3D *v3d_ = nullptr;
|
||||
RegionView3D *rv3d_ = nullptr;
|
||||
const View3D *v3d_ = nullptr;
|
||||
const RegionView3D *rv3d_ = nullptr;
|
||||
|
||||
CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
Brush *brush_ = nullptr;
|
||||
const CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
const Brush *brush_ = nullptr;
|
||||
float brush_radius_re_;
|
||||
float brush_strength_;
|
||||
|
||||
eBrushFalloffShape falloff_shape_;
|
||||
|
||||
Object *object_ = nullptr;
|
||||
Curves *curves_id_ = nullptr;
|
||||
CurvesGeometry *curves_ = nullptr;
|
||||
|
||||
|
@ -112,22 +111,21 @@ struct CombOperationExecutor {
|
|||
|
||||
BVHTreeFromMesh surface_bvh_;
|
||||
|
||||
void execute(CombOperation &self, bContext *C, const StrokeExtension &stroke_extension)
|
||||
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; });
|
||||
|
||||
C_ = C;
|
||||
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);
|
||||
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;
|
||||
brush_ = BKE_paint_brush(&curves_sculpt_->paint);
|
||||
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
|
||||
brush_radius_re_ = BKE_brush_size_get(scene_, brush_);
|
||||
brush_strength_ = BKE_brush_alpha_get(scene_, brush_);
|
||||
|
||||
|
@ -344,7 +342,7 @@ struct CombOperationExecutor {
|
|||
void initialize_spherical_brush_reference_point()
|
||||
{
|
||||
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
|
||||
*C_, *object_, brush_pos_re_, brush_radius_re_);
|
||||
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_re_);
|
||||
if (brush_3d.has_value()) {
|
||||
self_->brush_3d_ = *brush_3d;
|
||||
}
|
||||
|
@ -396,7 +394,7 @@ struct CombOperationExecutor {
|
|||
}
|
||||
};
|
||||
|
||||
void CombOperation::on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension)
|
||||
void CombOperation::on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)
|
||||
{
|
||||
CombOperationExecutor executor;
|
||||
executor.execute(*this, C, stroke_extension);
|
||||
|
|
|
@ -57,24 +57,23 @@ class DeleteOperation : public CurvesSculptStrokeOperation {
|
|||
friend struct DeleteOperationExecutor;
|
||||
|
||||
public:
|
||||
void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) override;
|
||||
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override;
|
||||
};
|
||||
|
||||
struct DeleteOperationExecutor {
|
||||
DeleteOperation *self_ = nullptr;
|
||||
bContext *C_ = nullptr;
|
||||
Depsgraph *depsgraph_ = nullptr;
|
||||
Scene *scene_ = nullptr;
|
||||
Object *object_ = nullptr;
|
||||
const Depsgraph *depsgraph_ = nullptr;
|
||||
const Scene *scene_ = nullptr;
|
||||
ARegion *region_ = nullptr;
|
||||
View3D *v3d_ = nullptr;
|
||||
RegionView3D *rv3d_ = nullptr;
|
||||
const View3D *v3d_ = nullptr;
|
||||
const RegionView3D *rv3d_ = nullptr;
|
||||
|
||||
Object *object_ = nullptr;
|
||||
Curves *curves_id_ = nullptr;
|
||||
CurvesGeometry *curves_ = nullptr;
|
||||
|
||||
CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
Brush *brush_ = nullptr;
|
||||
const CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
const Brush *brush_ = nullptr;
|
||||
float brush_radius_re_;
|
||||
|
||||
float2 brush_pos_re_;
|
||||
|
@ -83,24 +82,23 @@ struct DeleteOperationExecutor {
|
|||
float4x4 curves_to_world_mat_;
|
||||
float4x4 world_to_curves_mat_;
|
||||
|
||||
void execute(DeleteOperation &self, bContext *C, const StrokeExtension &stroke_extension)
|
||||
void execute(DeleteOperation &self, const bContext &C, const StrokeExtension &stroke_extension)
|
||||
{
|
||||
BLI_SCOPED_DEFER([&]() { self.brush_pos_prev_re_ = stroke_extension.mouse_position; });
|
||||
|
||||
self_ = &self;
|
||||
C_ = C;
|
||||
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);
|
||||
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_sculpt_ = scene_->toolsettings->curves_sculpt;
|
||||
brush_ = BKE_paint_brush(&curves_sculpt_->paint);
|
||||
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
|
||||
brush_radius_re_ = BKE_brush_size_get(scene_, brush_);
|
||||
|
||||
brush_pos_re_ = stroke_extension.mouse_position;
|
||||
|
@ -248,14 +246,15 @@ struct DeleteOperationExecutor {
|
|||
void initialize_spherical_brush_reference_point()
|
||||
{
|
||||
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
|
||||
*C_, *object_, brush_pos_re_, brush_radius_re_);
|
||||
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_re_);
|
||||
if (brush_3d.has_value()) {
|
||||
self_->brush_3d_ = *brush_3d;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void DeleteOperation::on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension)
|
||||
void DeleteOperation::on_stroke_extended(const bContext &C,
|
||||
const StrokeExtension &stroke_extension)
|
||||
{
|
||||
DeleteOperationExecutor executor;
|
||||
executor.execute(*this, C, stroke_extension);
|
||||
|
|
|
@ -70,10 +70,10 @@ class CurvesEffect {
|
|||
*/
|
||||
class ShrinkCurvesEffect : public CurvesEffect {
|
||||
private:
|
||||
Brush &brush_;
|
||||
const Brush &brush_;
|
||||
|
||||
public:
|
||||
ShrinkCurvesEffect(Brush &brush) : brush_(brush)
|
||||
ShrinkCurvesEffect(const Brush &brush) : brush_(brush)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -205,10 +205,10 @@ class ExtrapolateCurvesEffect : public CurvesEffect {
|
|||
class ScaleCurvesEffect : public CurvesEffect {
|
||||
private:
|
||||
bool scale_up_;
|
||||
Brush &brush_;
|
||||
const Brush &brush_;
|
||||
|
||||
public:
|
||||
ScaleCurvesEffect(bool scale_up, Brush &brush) : scale_up_(scale_up), brush_(brush)
|
||||
ScaleCurvesEffect(bool scale_up, const Brush &brush) : scale_up_(scale_up), brush_(brush)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -263,7 +263,7 @@ class CurvesEffectOperation : public CurvesSculptStrokeOperation {
|
|||
{
|
||||
}
|
||||
|
||||
void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) override;
|
||||
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -272,17 +272,17 @@ class CurvesEffectOperation : public CurvesSculptStrokeOperation {
|
|||
*/
|
||||
struct CurvesEffectOperationExecutor {
|
||||
CurvesEffectOperation *self_ = nullptr;
|
||||
Depsgraph *depsgraph_ = nullptr;
|
||||
Scene *scene_ = nullptr;
|
||||
Object *object_ = nullptr;
|
||||
const Depsgraph *depsgraph_ = nullptr;
|
||||
const Scene *scene_ = nullptr;
|
||||
ARegion *region_ = nullptr;
|
||||
View3D *v3d_ = nullptr;
|
||||
RegionView3D *rv3d_ = nullptr;
|
||||
const View3D *v3d_ = nullptr;
|
||||
const RegionView3D *rv3d_ = nullptr;
|
||||
|
||||
Object *object_ = nullptr;
|
||||
Curves *curves_id_ = nullptr;
|
||||
CurvesGeometry *curves_ = nullptr;
|
||||
|
||||
Brush *brush_ = nullptr;
|
||||
const Brush *brush_ = nullptr;
|
||||
float brush_radius_re_;
|
||||
float brush_radius_sq_re_;
|
||||
float brush_strength_;
|
||||
|
@ -299,17 +299,19 @@ struct CurvesEffectOperationExecutor {
|
|||
Vector<float> move_distances_cu;
|
||||
};
|
||||
|
||||
void execute(CurvesEffectOperation &self, bContext *C, const StrokeExtension &stroke_extension)
|
||||
void execute(CurvesEffectOperation &self,
|
||||
const bContext &C,
|
||||
const StrokeExtension &stroke_extension)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
|
@ -317,8 +319,8 @@ struct CurvesEffectOperationExecutor {
|
|||
return;
|
||||
}
|
||||
|
||||
CurvesSculpt &curves_sculpt = *scene_->toolsettings->curves_sculpt;
|
||||
brush_ = BKE_paint_brush(&curves_sculpt.paint);
|
||||
const CurvesSculpt &curves_sculpt = *scene_->toolsettings->curves_sculpt;
|
||||
brush_ = BKE_paint_brush_for_read(&curves_sculpt.paint);
|
||||
brush_radius_re_ = BKE_brush_size_get(scene_, brush_);
|
||||
brush_strength_ = BKE_brush_alpha_get(scene_, brush_);
|
||||
brush_radius_sq_re_ = pow2f(brush_radius_re_);
|
||||
|
@ -333,7 +335,13 @@ struct CurvesEffectOperationExecutor {
|
|||
if (stroke_extension.is_first) {
|
||||
if (falloff_shape_ == PAINT_FALLOFF_SHAPE_SPHERE) {
|
||||
if (std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
|
||||
*C, *object_, stroke_extension.mouse_position, brush_radius_re_)) {
|
||||
*depsgraph_,
|
||||
*region_,
|
||||
*v3d_,
|
||||
*rv3d_,
|
||||
*object_,
|
||||
stroke_extension.mouse_position,
|
||||
brush_radius_re_)) {
|
||||
self.brush_3d_ = *brush_3d;
|
||||
}
|
||||
}
|
||||
|
@ -520,7 +528,7 @@ struct CurvesEffectOperationExecutor {
|
|||
}
|
||||
};
|
||||
|
||||
void CurvesEffectOperation::on_stroke_extended(bContext *C,
|
||||
void CurvesEffectOperation::on_stroke_extended(const bContext &C,
|
||||
const StrokeExtension &stroke_extension)
|
||||
{
|
||||
CurvesEffectOperationExecutor executor;
|
||||
|
@ -528,10 +536,10 @@ void CurvesEffectOperation::on_stroke_extended(bContext *C,
|
|||
}
|
||||
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_grow_shrink_operation(
|
||||
const BrushStrokeMode brush_mode, bContext *C)
|
||||
const BrushStrokeMode brush_mode, const bContext &C)
|
||||
{
|
||||
Scene &scene = *CTX_data_scene(C);
|
||||
Brush &brush = *BKE_paint_brush(&scene.toolsettings->curves_sculpt->paint);
|
||||
const Scene &scene = *CTX_data_scene(&C);
|
||||
const Brush &brush = *BKE_paint_brush_for_read(&scene.toolsettings->curves_sculpt->paint);
|
||||
const bool use_scale_uniform = brush.curves_sculpt_settings->flag &
|
||||
BRUSH_CURVES_SCULPT_FLAG_SCALE_UNIFORM;
|
||||
const bool use_grow = (brush_mode == BRUSH_STROKE_INVERT) == ((brush.flag & BRUSH_DIR_IN) != 0);
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
|
||||
struct ARegion;
|
||||
struct RegionView3D;
|
||||
struct Depsgraph;
|
||||
struct View3D;
|
||||
struct Object;
|
||||
|
||||
namespace blender::ed::sculpt_paint {
|
||||
|
@ -30,15 +32,16 @@ struct StrokeExtension {
|
|||
class CurvesSculptStrokeOperation {
|
||||
public:
|
||||
virtual ~CurvesSculptStrokeOperation() = default;
|
||||
virtual void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) = 0;
|
||||
virtual void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) = 0;
|
||||
};
|
||||
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_add_operation(bContext &C, ReportList *reports);
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_add_operation(const bContext &C,
|
||||
ReportList *reports);
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_comb_operation();
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_delete_operation();
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_snake_hook_operation();
|
||||
std::unique_ptr<CurvesSculptStrokeOperation> new_grow_shrink_operation(
|
||||
const BrushStrokeMode brush_mode, bContext *C);
|
||||
const BrushStrokeMode brush_mode, const bContext &C);
|
||||
|
||||
struct CurvesBrush3D {
|
||||
float3 position_cu;
|
||||
|
@ -48,10 +51,13 @@ struct CurvesBrush3D {
|
|||
/**
|
||||
* Find 3d brush position based on cursor position for curves sculpting.
|
||||
*/
|
||||
std::optional<CurvesBrush3D> sample_curves_3d_brush(bContext &C,
|
||||
Object &curves_object,
|
||||
std::optional<CurvesBrush3D> sample_curves_3d_brush(const Depsgraph &depsgraph,
|
||||
const ARegion ®ion,
|
||||
const View3D &v3d,
|
||||
const RegionView3D &rv3d,
|
||||
const Object &curves_object,
|
||||
const float2 &brush_pos_re,
|
||||
float brush_radius_re);
|
||||
const float brush_radius_re);
|
||||
|
||||
Vector<float4x4> get_symmetry_brush_transforms(eCurvesSymmetryType symmetry);
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ static std::unique_ptr<CurvesSculptStrokeOperation> start_brush_operation(bConte
|
|||
case CURVES_SCULPT_TOOL_ADD:
|
||||
return new_add_operation(C, op.reports);
|
||||
case CURVES_SCULPT_TOOL_GROW_SHRINK:
|
||||
return new_grow_shrink_operation(mode, &C);
|
||||
return new_grow_shrink_operation(mode, C);
|
||||
}
|
||||
BLI_assert_unreachable();
|
||||
return {};
|
||||
|
@ -138,7 +138,7 @@ static void stroke_update_step(bContext *C,
|
|||
}
|
||||
|
||||
if (op_data->operation) {
|
||||
op_data->operation->on_stroke_extended(C, stroke_extension);
|
||||
op_data->operation->on_stroke_extended(*C, stroke_extension);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ class SnakeHookOperation : public CurvesSculptStrokeOperation {
|
|||
friend struct SnakeHookOperatorExecutor;
|
||||
|
||||
public:
|
||||
void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) override;
|
||||
void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -72,19 +72,19 @@ class SnakeHookOperation : public CurvesSculptStrokeOperation {
|
|||
*/
|
||||
struct SnakeHookOperatorExecutor {
|
||||
SnakeHookOperation *self_ = nullptr;
|
||||
bContext *C_ = nullptr;
|
||||
Scene *scene_ = nullptr;
|
||||
Object *object_ = nullptr;
|
||||
const Depsgraph *depsgraph_ = nullptr;
|
||||
const Scene *scene_ = nullptr;
|
||||
ARegion *region_ = nullptr;
|
||||
View3D *v3d_ = nullptr;
|
||||
RegionView3D *rv3d_ = nullptr;
|
||||
const View3D *v3d_ = nullptr;
|
||||
const RegionView3D *rv3d_ = nullptr;
|
||||
|
||||
CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
Brush *brush_ = nullptr;
|
||||
const CurvesSculpt *curves_sculpt_ = nullptr;
|
||||
const Brush *brush_ = nullptr;
|
||||
float brush_radius_re_;
|
||||
float brush_strength_;
|
||||
eBrushFalloffShape falloff_shape_;
|
||||
|
||||
Object *object_ = nullptr;
|
||||
Curves *curves_id_ = nullptr;
|
||||
CurvesGeometry *curves_ = nullptr;
|
||||
|
||||
|
@ -95,20 +95,23 @@ struct SnakeHookOperatorExecutor {
|
|||
float2 brush_pos_re_;
|
||||
float2 brush_pos_diff_re_;
|
||||
|
||||
void execute(SnakeHookOperation &self, bContext *C, const StrokeExtension &stroke_extension)
|
||||
void execute(SnakeHookOperation &self,
|
||||
const bContext &C,
|
||||
const StrokeExtension &stroke_extension)
|
||||
{
|
||||
BLI_SCOPED_DEFER([&]() { self.last_mouse_position_re_ = stroke_extension.mouse_position; });
|
||||
|
||||
self_ = &self;
|
||||
C_ = 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);
|
||||
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;
|
||||
brush_ = BKE_paint_brush(&curves_sculpt_->paint);
|
||||
brush_ = BKE_paint_brush_for_read(&curves_sculpt_->paint);
|
||||
brush_radius_re_ = BKE_brush_size_get(scene_, brush_);
|
||||
brush_strength_ = BKE_brush_alpha_get(scene_, brush_);
|
||||
falloff_shape_ = static_cast<eBrushFalloffShape>(brush_->falloff_shape);
|
||||
|
@ -129,7 +132,7 @@ struct SnakeHookOperatorExecutor {
|
|||
if (stroke_extension.is_first) {
|
||||
if (falloff_shape_ == PAINT_FALLOFF_SHAPE_SPHERE) {
|
||||
std::optional<CurvesBrush3D> brush_3d = sample_curves_3d_brush(
|
||||
*C_, *object_, brush_pos_re_, brush_radius_re_);
|
||||
*depsgraph_, *region_, *v3d_, *rv3d_, *object_, brush_pos_re_, brush_radius_re_);
|
||||
if (brush_3d.has_value()) {
|
||||
self_->brush_3d_ = *brush_3d;
|
||||
}
|
||||
|
@ -295,7 +298,8 @@ struct SnakeHookOperatorExecutor {
|
|||
}
|
||||
};
|
||||
|
||||
void SnakeHookOperation::on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension)
|
||||
void SnakeHookOperation::on_stroke_extended(const bContext &C,
|
||||
const StrokeExtension &stroke_extension)
|
||||
{
|
||||
SnakeHookOperatorExecutor executor;
|
||||
executor.execute(*this, C, stroke_extension);
|
||||
|
|
Loading…
Reference in New Issue