Blender V5.0
curves_sculpt_intern.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include <optional>
8
9#include "paint_intern.hh"
10
11#include "BLI_vector.hh"
12
13#include "BKE_attribute.hh"
14#include "BKE_crazyspace.hh"
15#include "BKE_curves.hh"
16#include "DNA_brush_types.h"
17#include "DNA_scene_types.h"
18
19#include "ED_curves.hh"
20
21struct ARegion;
22struct RegionView3D;
23struct Depsgraph;
24struct View3D;
25struct Object;
26struct Brush;
27struct Scene;
28
29namespace blender::bke {
30struct BVHTreeFromMesh;
31}
32
33struct ReportList;
34
36
37using bke::CurvesGeometry;
38using bke::CurvesSurfaceTransforms;
39
46
47float brush_radius_factor(const Brush &brush, const StrokeExtension &stroke_extension);
48float brush_radius_get(const Paint &paint,
49 const Brush &brush,
50 const StrokeExtension &stroke_extension);
51
52float brush_strength_factor(const Brush &brush, const StrokeExtension &stroke_extension);
53float brush_strength_get(const Paint &paint,
54 const Brush &brush,
55 const StrokeExtension &stroke_extension);
56
61 public:
62 virtual ~CurvesSculptStrokeOperation() = default;
63 virtual void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) = 0;
64};
65
66std::unique_ptr<CurvesSculptStrokeOperation> new_add_operation();
67std::unique_ptr<CurvesSculptStrokeOperation> new_comb_operation();
68std::unique_ptr<CurvesSculptStrokeOperation> new_delete_operation();
69std::unique_ptr<CurvesSculptStrokeOperation> new_snake_hook_operation();
70std::unique_ptr<CurvesSculptStrokeOperation> new_grow_shrink_operation(
71 const BrushStrokeMode brush_mode, const bContext &C);
72std::unique_ptr<CurvesSculptStrokeOperation> new_selection_paint_operation(
73 const BrushStrokeMode brush_mode, const bContext &C);
74std::unique_ptr<CurvesSculptStrokeOperation> new_pinch_operation(const BrushStrokeMode brush_mode,
75 const bContext &C);
76std::unique_ptr<CurvesSculptStrokeOperation> new_smooth_operation();
77std::unique_ptr<CurvesSculptStrokeOperation> new_puff_operation();
78std::unique_ptr<CurvesSculptStrokeOperation> new_density_operation(
79 const BrushStrokeMode brush_mode, const bContext &C, const StrokeExtension &stroke_start);
80std::unique_ptr<CurvesSculptStrokeOperation> new_slide_operation();
81
86
90std::optional<CurvesBrush3D> sample_curves_3d_brush(const Depsgraph &depsgraph,
91 const ARegion &region,
92 const View3D &v3d,
93 const RegionView3D &rv3d,
94 const Object &curves_object,
95 const float2 &brush_pos_re,
96 const float brush_radius_re);
97
102void remember_stroke_position(CurvesSculpt &curves_sculpt, const float3 &brush_position_wo);
103
105
107
118
123 MutableSpan<float3> positions,
124 const float3 &new_last_position);
125
127 public:
128 const Depsgraph *depsgraph = nullptr;
129 Scene *scene = nullptr;
130 ARegion *region = nullptr;
131 const View3D *v3d = nullptr;
132 RegionView3D *rv3d = nullptr;
133
135};
136
137std::optional<CurvesBrush3D> sample_curves_surface_3d_brush(
138 const Depsgraph &depsgraph,
139 const ARegion &region,
140 const View3D &v3d,
141 const CurvesSurfaceTransforms &transforms,
142 const bke::BVHTreeFromMesh &surface_bvh,
143 const float2 &brush_pos_re,
144 const float brush_radius_re);
145
147 const float3 &brush_position,
148 const float old_radius);
149
155void report_invalid_uv_map(ReportList *reports);
156
162 private:
163 bool use_surface_collision_;
164 float surface_collision_distance_;
165 Array<float3> start_positions_;
166 Array<float> segment_lengths_;
167
168 public:
170 const IndexMask &curve_selection,
171 const bool use_surface_collision,
172 const float surface_collision_distance);
173
175 const IndexMask &curve_selection,
176 const Mesh *surface,
177 const CurvesSurfaceTransforms &transforms);
178
180 {
181 return segment_lengths_;
182 }
183};
184
187
188} // namespace blender::ed::sculpt_paint
Low-level operations for curves.
eCurvesSymmetryType
#define C
Definition RandGen.cpp:29
BPy_StructRNA * depsgraph
void initialize()
virtual void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)=0
bool curves_sculpt_poll(bContext *C)
std::unique_ptr< CurvesSculptStrokeOperation > new_add_operation()
std::unique_ptr< CurvesSculptStrokeOperation > new_pinch_operation(const BrushStrokeMode brush_mode, const bContext &C)
void report_invalid_uv_map(ReportList *reports)
std::unique_ptr< CurvesSculptStrokeOperation > new_comb_operation()
float brush_strength_get(const Paint &paint, const Brush &brush, const StrokeExtension &stroke_extension)
void report_empty_evaluated_surface(ReportList *reports)
std::optional< CurvesBrush3D > sample_curves_3d_brush(const Depsgraph &depsgraph, const ARegion &region, const View3D &v3d, const RegionView3D &rv3d, const Object &curves_object, const float2 &brush_pos_re, const float brush_radius_re)
bke::SpanAttributeWriter< float > float_selection_ensure(Curves &curves_id)
void report_missing_uv_map_on_original_surface(ReportList *reports)
std::unique_ptr< CurvesSculptStrokeOperation > new_snake_hook_operation()
std::unique_ptr< CurvesSculptStrokeOperation > new_grow_shrink_operation(const BrushStrokeMode brush_mode, const bContext &C)
bool curves_sculpt_poll_view3d(bContext *C)
void remember_stroke_position(CurvesSculpt &curves_sculpt, const float3 &brush_position_wo)
void report_missing_uv_map_on_evaluated_surface(ReportList *reports)
std::unique_ptr< CurvesSculptStrokeOperation > new_smooth_operation()
std::unique_ptr< CurvesSculptStrokeOperation > new_delete_operation()
void report_missing_surface(ReportList *reports)
std::optional< CurvesBrush3D > sample_curves_surface_3d_brush(const Depsgraph &depsgraph, const ARegion &region, const View3D &v3d, const CurvesSurfaceTransforms &transforms, const bke::BVHTreeFromMesh &surface_bvh, const float2 &brush_pos_re, const float brush_radius_re)
float brush_radius_get(const Paint &paint, const Brush &brush, const StrokeExtension &stroke_extension)
std::unique_ptr< CurvesSculptStrokeOperation > new_selection_paint_operation(const BrushStrokeMode brush_mode, const bContext &C)
void report_empty_original_surface(ReportList *reports)
Vector< float4x4 > get_symmetry_brush_transforms(const eCurvesSymmetryType symmetry)
std::unique_ptr< CurvesSculptStrokeOperation > new_slide_operation()
std::unique_ptr< CurvesSculptStrokeOperation > new_puff_operation()
float brush_strength_factor(const Brush &brush, const StrokeExtension &stroke_extension)
float brush_radius_factor(const Brush &brush, const StrokeExtension &stroke_extension)
std::unique_ptr< CurvesSculptStrokeOperation > new_density_operation(const BrushStrokeMode brush_mode, const bContext &C, const StrokeExtension &stroke_start)
void move_last_point_and_resample(MoveAndResampleBuffers &buffer, MutableSpan< float3 > positions, const float3 &new_last_position)
float transform_brush_radius(const float4x4 &transform, const float3 &brush_position, const float old_radius)
MatBase< float, 4, 4 > float4x4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
BrushStrokeMode
void solve_step(bke::CurvesGeometry &curves, const IndexMask &curve_selection, const Mesh *surface, const CurvesSurfaceTransforms &transforms)