Blender V4.3
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_math_vector.hh"
12#include "BLI_vector.hh"
13#include "BLI_virtual_array.hh"
14
15#include "BKE_attribute.hh"
16#include "BKE_crazyspace.hh"
17#include "BKE_curves.hh"
18
19#include "ED_curves.hh"
20#include "ED_curves_sculpt.hh"
21
22struct ARegion;
23struct RegionView3D;
24struct Depsgraph;
25struct View3D;
26struct Object;
27struct Brush;
28struct Scene;
29struct BVHTreeFromMesh;
30struct ReportList;
31
33
34using bke::CurvesGeometry;
35using bke::CurvesSurfaceTransforms;
36
43
44float brush_radius_factor(const Brush &brush, const StrokeExtension &stroke_extension);
45float brush_radius_get(const Scene &scene,
46 const Brush &brush,
47 const StrokeExtension &stroke_extension);
48
49float brush_strength_factor(const Brush &brush, const StrokeExtension &stroke_extension);
50float brush_strength_get(const Scene &scene,
51 const Brush &brush,
52 const StrokeExtension &stroke_extension);
53
58 public:
59 virtual ~CurvesSculptStrokeOperation() = default;
60 virtual void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension) = 0;
61};
62
63std::unique_ptr<CurvesSculptStrokeOperation> new_add_operation();
64std::unique_ptr<CurvesSculptStrokeOperation> new_comb_operation();
65std::unique_ptr<CurvesSculptStrokeOperation> new_delete_operation();
66std::unique_ptr<CurvesSculptStrokeOperation> new_snake_hook_operation();
67std::unique_ptr<CurvesSculptStrokeOperation> new_grow_shrink_operation(
68 const BrushStrokeMode brush_mode, const bContext &C);
69std::unique_ptr<CurvesSculptStrokeOperation> new_selection_paint_operation(
70 const BrushStrokeMode brush_mode, const bContext &C);
71std::unique_ptr<CurvesSculptStrokeOperation> new_pinch_operation(const BrushStrokeMode brush_mode,
72 const bContext &C);
73std::unique_ptr<CurvesSculptStrokeOperation> new_smooth_operation();
74std::unique_ptr<CurvesSculptStrokeOperation> new_puff_operation();
75std::unique_ptr<CurvesSculptStrokeOperation> new_density_operation(
76 const BrushStrokeMode brush_mode, const bContext &C, const StrokeExtension &stroke_start);
77std::unique_ptr<CurvesSculptStrokeOperation> new_slide_operation();
78
83
87std::optional<CurvesBrush3D> sample_curves_3d_brush(const Depsgraph &depsgraph,
88 const ARegion &region,
89 const View3D &v3d,
90 const RegionView3D &rv3d,
91 const Object &curves_object,
92 const float2 &brush_pos_re,
93 const float brush_radius_re);
94
96
98
109
114 MutableSpan<float3> positions,
115 const float3 &new_last_position);
116
118 public:
119 const Depsgraph *depsgraph = nullptr;
120 const Scene *scene = nullptr;
121 ARegion *region = nullptr;
122 const View3D *v3d = nullptr;
123 RegionView3D *rv3d = nullptr;
124
126};
127
128std::optional<CurvesBrush3D> sample_curves_surface_3d_brush(
129 const Depsgraph &depsgraph,
130 const ARegion &region,
131 const View3D &v3d,
132 const CurvesSurfaceTransforms &transforms,
133 const BVHTreeFromMesh &surface_bvh,
134 const float2 &brush_pos_re,
135 const float brush_radius_re);
136
137float transform_brush_radius(const float4x4 &transform,
138 const float3 &brush_position,
139 const float old_radius);
140
146void report_invalid_uv_map(ReportList *reports);
147
153 private:
154 bool use_surface_collision_;
155 Array<float3> start_positions_;
156 Array<float> segment_lengths_;
157
158 public:
159 void initialize(const bke::CurvesGeometry &curves,
160 const IndexMask &curve_selection,
161 const bool use_surface_collision);
162
163 void solve_step(bke::CurvesGeometry &curves,
164 const IndexMask &curve_selection,
165 const Mesh *surface,
166 const CurvesSurfaceTransforms &transforms);
167
169 {
170 return segment_lengths_;
171 }
172};
173
176
177} // namespace blender::ed::sculpt_paint
Low-level operations for curves.
eCurvesSymmetryType
void initialize()
virtual void on_stroke_extended(const bContext &C, const StrokeExtension &stroke_extension)=0
const Depsgraph * depsgraph
bool curves_sculpt_poll(bContext *C)
std::unique_ptr< CurvesSculptStrokeOperation > new_add_operation()
std::optional< CurvesBrush3D > sample_curves_surface_3d_brush(const Depsgraph &depsgraph, const ARegion &region, const View3D &v3d, const CurvesSurfaceTransforms &transforms, const BVHTreeFromMesh &surface_bvh, const float2 &brush_pos_re, const float brush_radius_re)
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()
void report_empty_evaluated_surface(ReportList *reports)
float brush_radius_get(const Scene &scene, const Brush &brush, const StrokeExtension &stroke_extension)
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 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::unique_ptr< CurvesSculptStrokeOperation > new_selection_paint_operation(const BrushStrokeMode brush_mode, const bContext &C)
void report_empty_original_surface(ReportList *reports)
float brush_strength_get(const Scene &scene, const Brush &brush, const StrokeExtension &stroke_extension)
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)
BrushStrokeMode
void solve_step(bke::CurvesGeometry &curves, const IndexMask &curve_selection, const Mesh *surface, const CurvesSurfaceTransforms &transforms)