30#include "RNA_prototypes.hh"
43 : region_(®ion), view3d_(&view3d)
45 layer_space_to_world_space_ = (layer !=
nullptr) ? layer->to_world_space(eval_object) :
46 eval_object.object_to_world();
47 world_space_to_layer_space_ =
math::invert(layer_space_to_world_space_);
49 switch (scene.toolsettings->gp_sculpt.lock_axis) {
55 placement_normal_ =
float3(0, 1, 0);
59 placement_normal_ =
float3(1, 0, 0);
63 placement_normal_ =
float3(0, 0, 1);
67 placement_normal_ = scene.cursor.matrix<
float3x3>() *
float3(0, 0, 1);
80 const char align_flag = scene.toolsettings->gpencil_v3d_align;
84 surface_offset_ = 0.0f;
85 placement_loc_ =
float3(scene.cursor.location);
90 use_project_only_selected_ =
true;
92 surface_offset_ = scene.toolsettings->gpencil_surface_offset;
94 placement_loc_ = layer_space_to_world_space_.
location();
98 surface_offset_ = 0.0f;
100 placement_loc_ = layer_space_to_world_space_.
location();
104 surface_offset_ = 0.0f;
105 placement_loc_ = layer_space_to_world_space_.
location();
110 surface_offset_ = 0.0f;
111 placement_loc_ =
float3(0.0f);
122 const Object &eval_object,
125 const float surface_offset,
129 depth_cache_(view_depths),
130 surface_offset_(surface_offset)
132 layer_space_to_world_space_ = (layer !=
nullptr) ? layer->to_world_space(eval_object) :
133 eval_object.object_to_world();
134 world_space_to_layer_space_ =
math::invert(layer_space_to_world_space_);
136 switch (reproject_mode) {
142 placement_normal_ =
float3(0, 1, 0);
146 placement_normal_ =
float3(1, 0, 0);
150 placement_normal_ =
float3(0, 0, 1);
154 placement_normal_ = scene.cursor.matrix<
float3x3>() *
float3(0, 0, 1);
169 switch (reproject_mode) {
172 surface_offset_ = 0.0f;
173 placement_loc_ =
float3(scene.cursor.location);
177 surface_offset_ = 0.0f;
178 placement_loc_ = layer_space_to_world_space_.
location();
182 placement_loc_ = layer_space_to_world_space_.
location();
186 surface_offset_ = 0.0f;
187 placement_loc_ = layer_space_to_world_space_.
location();
198 region_ = other.region_;
199 view3d_ = other.view3d_;
201 depth_ = other.depth_;
202 plane_ = other.plane_;
204 if (other.depth_cache_ !=
nullptr) {
208 use_project_only_selected_ = other.use_project_only_selected_;
210 surface_offset_ = other.surface_offset_;
212 placement_loc_ = other.placement_loc_;
213 placement_normal_ = other.placement_normal_;
214 placement_plane_ = other.placement_plane_;
216 layer_space_to_world_space_ = other.layer_space_to_world_space_;
217 world_space_to_layer_space_ = other.world_space_to_layer_space_;
222 region_ = other.region_;
223 view3d_ = other.view3d_;
225 depth_ = other.depth_;
226 plane_ = other.plane_;
228 std::swap(depth_cache_, other.depth_cache_);
229 use_project_only_selected_ = other.use_project_only_selected_;
231 surface_offset_ = other.surface_offset_;
233 placement_loc_ = other.placement_loc_;
234 placement_normal_ = other.placement_normal_;
235 placement_plane_ = other.placement_plane_;
237 layer_space_to_world_space_ = other.layer_space_to_world_space_;
238 world_space_to_layer_space_ = other.world_space_to_layer_space_;
243 if (
this == &other) {
246 std::destroy_at(
this);
253 if (
this == &other) {
256 std::destroy_at(
this);
263 if (depth_cache_ !=
nullptr) {
283 if (use_project_only_selected_) {
301 placement_loc_ = origin;
305 placement_loc_ = layer_space_to_world_space_.
location();
310float3 DrawingPlacement::project_depth(
const float2 co)
const
318 proj_point -= view_normal * surface_offset_;
332 proj_point = this->project_depth(co);
348 for (const int i : range) {
349 dst[i] = this->project(src[i]);
358 if (depth_ == DrawingPlacementDepth::Surface) {
366 proj_point = this->project_depth(co);
382 if (plane_ == DrawingPlacementPlane::View) {
386 plane = placement_plane_;
391 proj_point = ray_co + ray_no * lambda;
403 for (const int i : range) {
404 dst[i] = this->reproject(src[i]);
411 return layer_space_to_world_space_;
415 const int center_frame,
420 if (falloff_curve ==
nullptr) {
425 if (frame_number > center_frame) {
426 const float frame_factor = 0.5f *
float(center_frame - min_frame) / (frame_number - min_frame);
430 if (frame_number < center_frame) {
431 const float frame_factor = 0.5f *
float(center_frame - frame_number) /
432 (max_frame - frame_number);
440 const int current_frame)
443 int frame_min = current_frame;
444 int frame_max = current_frame;
446 for (
const int layer_i : layers.index_range()) {
447 const Layer &layer = *layers[layer_i];
448 if (!layer.is_editable()) {
451 for (
const auto [frame_number, frame] : layer.frames().items()) {
452 if (frame_number != current_frame && frame.is_selected()) {
453 frame_min =
math::min(frame_min, frame_number);
454 frame_max =
math::max(frame_max, frame_number);
458 return std::pair<int, int>(frame_min, frame_max);
463 const int frame_number,
464 const int frame_index,
465 const int current_frame,
466 const int current_frame_index,
467 const int last_frame,
468 const int last_frame_index,
469 const bool use_multi_frame_editing,
470 const bool do_onion_skinning,
471 const bool is_before_first,
474 if (use_multi_frame_editing) {
475 if (frame.is_selected()) {
476 if (do_onion_skinning) {
477 return (frame_number < current_frame) ? -1 : 1;
483 if (do_onion_skinning && layer.use_onion_skinning()) {
485 if (onion_settings.
filter != 0 && (onion_settings.
filter & (1 << frame.
type)) == 0) {
495 delta = frame_number - current_frame;
498 delta = frame_index - current_frame_index;
501 if (is_before_first) {
514 shift = last_frame_index;
516 delta += (delta < 0) ? (shift + 1) : -(shift + 1);
535 const int current_frame,
536 const bool use_multi_frame_editing,
537 const bool do_onion_skinning)
541 const Span<int> sorted_keys = layer.sorted_keys();
545 const int current_frame_index = std::max(layer.sorted_keys_index_at(current_frame), 0);
546 const int last_frame = sorted_keys.
last();
548 const bool is_before_first = (current_frame < sorted_keys.
first());
549 const std::optional<int> current_start_frame = layer.start_frame_at(current_frame);
550 for (
const int frame_i : sorted_keys.
index_range()) {
551 const int frame_number = sorted_keys[frame_i];
552 if (current_start_frame && *current_start_frame == frame_number) {
564 use_multi_frame_editing,
568 if (!frame_id.has_value()) {
573 frame_numbers.
append({frame_number, *frame_id});
576 frame_numbers.
append({current_frame, 0});
578 return frame_numbers.
as_span();
583 const int current_frame,
584 const bool use_multi_frame_editing)
589 if (use_multi_frame_editing) {
590 const Drawing *current_drawing = grease_pencil.get_drawing_at(layer, current_frame);
591 for (
const auto [frame_number, frame] : layer.frames().items()) {
592 if (!frame.is_selected()) {
595 frame_numbers.
append(frame_number);
596 added_drawings.
add(grease_pencil.get_drawing_at(layer, frame_number));
598 if (added_drawings.
contains(current_drawing)) {
599 return frame_numbers.
as_span();
603 frame_numbers.
append(current_frame);
604 return frame_numbers.
as_span();
611 const int current_frame = scene.r.cfra;
613 const bool use_multi_frame_editing = (toolsettings->
gpencil_flags &
618 for (
const int layer_i : layers.index_range()) {
619 const Layer &layer = *layers[layer_i];
620 if (!layer.is_editable()) {
624 grease_pencil, layer, current_frame, use_multi_frame_editing);
625 for (
const int frame_number : frame_numbers) {
626 if (
Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) {
627 editable_drawings.
append({*drawing, layer_i, frame_number, 1.0f});
632 return editable_drawings;
639 const int current_frame = scene.r.cfra;
641 const bool use_multi_frame_editing = (toolsettings->
gpencil_flags &
643 const bool use_multi_frame_falloff = use_multi_frame_editing &&
647 std::pair<int, int> minmax_frame;
648 if (use_multi_frame_falloff) {
651 center_frame =
math::clamp(current_frame, minmax_frame.first, minmax_frame.second);
656 for (
const int layer_i : layers.index_range()) {
657 const Layer &layer = *layers[layer_i];
658 if (!layer.is_editable()) {
662 grease_pencil, layer, current_frame, use_multi_frame_editing);
663 for (
const int frame_number : frame_numbers) {
664 if (
Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) {
665 const float falloff = use_multi_frame_falloff ?
672 editable_drawings.
append({*drawing, layer_i, frame_number, falloff});
677 return editable_drawings;
684 int current_frame = scene.r.cfra;
686 const bool use_multi_frame_editing = (toolsettings->
gpencil_flags &
688 const bool use_multi_frame_falloff = use_multi_frame_editing &&
691 if (use_multi_frame_falloff) {
697 int frame_min = current_frame, frame_max = current_frame;
699 if (use_multi_frame_editing) {
700 for (
const int layer_i : layers.index_range()) {
701 const Layer &layer = *layers[layer_i];
702 if (!layer.is_editable()) {
705 for (
const auto [frame_number, frame] : layer.frames().items()) {
706 if (frame_number != current_frame && frame.is_selected()) {
707 selected_frames.
add(frame_number);
708 frame_min =
math::min(frame_min, frame_number);
709 frame_max =
math::max(frame_max, frame_number);
714 selected_frames.
add(current_frame);
718 if (use_multi_frame_falloff) {
720 for (
const int frame_number : selected_frames) {
730 for (
const int layer_i : layers.index_range()) {
731 const Layer &layer = *layers[layer_i];
732 if (!layer.is_editable()) {
736 if (use_multi_frame_editing) {
737 for (
const auto [frame_number, frame] : layer.frames().items()) {
738 Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number);
739 if (!frame.is_selected() || drawing ==
nullptr || added_drawings.
contains(drawing)) {
742 const int frame_group = selected_frames.
index_of(frame_number);
743 drawings_grouped_per_frame[frame_group].append(
744 {*drawing, layer_i, frame_number, falloff_per_selected_frame[frame_group]});
745 added_drawings.
add_new(drawing);
750 Drawing *current_drawing = grease_pencil.get_drawing_at(layer, current_frame);
751 if (current_drawing !=
nullptr && !added_drawings.
contains(current_drawing)) {
752 const int frame_group = selected_frames.
index_of(current_frame);
753 drawings_grouped_per_frame[frame_group].append(
754 {*current_drawing, layer_i, current_frame, falloff_per_selected_frame[frame_group]});
755 added_drawings.
add_new(current_drawing);
759 return drawings_grouped_per_frame;
768 const int current_frame = scene.r.cfra;
770 const bool use_multi_frame_editing = (toolsettings->
gpencil_flags &
772 const int layer_index = *grease_pencil.get_layer_index(layer);
776 grease_pencil, layer, current_frame, use_multi_frame_editing);
777 for (
const int frame_number : frame_numbers) {
778 if (
Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) {
779 editable_drawings.
append({*drawing, layer_index, frame_number, 1.0f});
783 return editable_drawings;
792 const int current_frame = scene.r.cfra;
794 const bool use_multi_frame_editing = (toolsettings->
gpencil_flags &
796 const bool use_multi_frame_falloff = use_multi_frame_editing &&
799 const int layer_index = *grease_pencil.get_layer_index(layer);
801 std::pair<int, int> minmax_frame;
802 if (use_multi_frame_falloff) {
805 center_frame =
math::clamp(current_frame, minmax_frame.first, minmax_frame.second);
810 grease_pencil, layer, current_frame, use_multi_frame_editing);
811 for (
const int frame_number : frame_numbers) {
812 if (
Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, frame_number)) {
813 const float falloff = use_multi_frame_falloff ?
820 editable_drawings.
append({*drawing, layer_index, frame_number, falloff});
824 return editable_drawings;
829 const bool do_onion_skinning)
832 const int current_frame = scene.r.cfra;
834 const bool use_multi_frame_editing = (toolsettings->
gpencil_flags &
839 for (
const int layer_i : layers.index_range()) {
840 const Layer &layer = *layers[layer_i];
841 if (!layer.is_visible()) {
845 grease_pencil, layer, current_frame, use_multi_frame_editing, do_onion_skinning);
846 for (
const auto &[frame_number, onion_id] : frames) {
847 if (
const Drawing *drawing = grease_pencil.get_drawing_at(layer, frame_number)) {
848 visible_drawings.
append({*drawing, layer_i, frame_number, onion_id});
853 return visible_drawings;
860 for (
const int mat_i :
IndexRange(
object.totcol)) {
863 if (material !=
nullptr && material->gp_style !=
nullptr &&
867 editable_material_indices.
add_new(mat_i);
870 return editable_material_indices;
877 for (
const int mat_i :
IndexRange(
object.totcol)) {
879 if (material !=
nullptr && material->gp_style !=
nullptr &&
882 hidden_material_indices.
add_new(mat_i);
885 return hidden_material_indices;
892 for (
const int mat_i :
IndexRange(
object.totcol)) {
894 if (material !=
nullptr && material->gp_style !=
nullptr &&
897 fill_material_indices.
add_new(mat_i);
900 return fill_material_indices;
910 const IndexRange curves_range = curves.curves_range();
912 if (
object.totcol == 0) {
920 if (layer.ignore_locked_materials()) {
926 if (editable_material_indices.
is_empty()) {
934 if (editable_material_indices.
contains(0)) {
942 return editable_material_indices.
contains(materials[curve_i]);
953 object, drawing, layer_index, memory);
959 const IndexRange curves_range = curves.curves_range();
966 if (editable_strokes.
contains(0) && fill_material_indices.contains(0)) {
973 const int material_index = materials[curve_i];
974 return fill_material_indices.contains(material_index);
988 if (editable_material_indices.
is_empty()) {
999 if (editable_material_indices.
contains(0)) {
1000 return curves_range;
1007 const int material_index = materials[curve_i];
1008 if (material_index == mat_i) {
1009 return editable_material_indices.
contains(material_index);
1021 const IndexRange points_range = curves.points_range();
1023 if (
object.totcol == 0) {
1031 if (layer.ignore_locked_materials()) {
1037 if (editable_material_indices.
is_empty()) {
1046 if (editable_material_indices.
contains(0)) {
1047 return points_range;
1054 return editable_material_indices.
contains(materials[point_i]);
1083 if (hidden_material_indices.
is_empty()) {
1092 const VArray<int> materials = *attributes.lookup_or_default<
int>(
1096 const int material_index = materials[curve_i];
1097 return !hidden_material_indices.
contains(material_index);
1108 if (hidden_material_indices.
is_empty()) {
1113 const IndexRange points_range = curves.points_range();
1117 const VArray<int> materials = *attributes.lookup_or_default<
int>(
1119 if (
const std::optional<int> single_material = materials.get_if_single()) {
1120 if (!hidden_material_indices.
contains(*single_material)) {
1121 return points_range;
1129 const int material_index = materials[point_i];
1130 return !hidden_material_indices.
contains(material_index);
1136 const int layer_index,
1145 const Array<int> point_to_curve_map = curves.point_to_curve_map();
1148 const VArray<bool> selected_point = *curves.attributes().lookup_or_default<
bool>(
1150 const VArray<bool> selected_left = *curves.attributes().lookup_or_default<
bool>(
1152 const VArray<bool> selected_right = *curves.attributes().lookup_or_default<
bool>(
1156 object, drawing, layer_index, memory);
1159 curves.points_range(),
GrainSize(4096), memory, [&](
const int64_t point_i) {
1160 const bool is_selected = selected_point[point_i] || selected_left[point_i] ||
1161 selected_right[point_i];
1163 return is_selected && is_bezier;
1171 const int layer_index,
1177 object, drawing, layer_index, memory);
1181 object, drawing, layer_index, memory);
1195 object, drawing, layer_index, memory);
1210 object, drawing, layer_index, memory);
1237 object, drawing, layer_index, memory);
1241 object, drawing, layer_index, memory);
1250 const bool keep_caps)
1256 int dst_points_num = 0;
1258 dst_points_num += src_transfer_data.
size();
1260 if (dst_points_num == 0) {
1272 Array<int> src_pivot_point(src_curves_num, -1);
1273 Array<int> dst_interm_curves_offsets(src_curves_num + 1, 0);
1276 const IndexRange src_points = src_points_by_curve[src_curve];
1278 for (
const int src_point : src_points) {
1279 for (
const PointTransferData &dst_point_transfer : src_to_dst_points[src_point]) {
1280 if (dst_point_transfer.is_src_point) {
1281 dst_transfer_data[++dst_point] = dst_point_transfer;
1286 dst_transfer_data[++dst_point] = dst_point_transfer;
1291 if (src_cyclic[src_curve] && dst_point_transfer.is_cut) {
1292 src_pivot_point[src_curve] = dst_point;
1300 dst_interm_curves_offsets[src_curve + 1] = dst_point + 1;
1306 for (const int src_curve : src_curves) {
1307 const int pivot_point = src_pivot_point[src_curve];
1309 if (pivot_point == -1) {
1311 src_now_cyclic[src_curve] = src_cyclic[src_curve];
1319 src_now_cyclic[src_curve] = false;
1321 const int dst_interm_first = dst_interm_curves_offsets[src_curve];
1322 const int dst_interm_last = dst_interm_curves_offsets[src_curve + 1];
1323 std::rotate(dst_transfer_data.begin() + dst_interm_first,
1324 dst_transfer_data.begin() + pivot_point,
1325 dst_transfer_data.begin() + dst_interm_last);
1332 dst_curves_offset.
append(0);
1333 for (
int src_curve : src.curves_range()) {
1334 const IndexRange dst_points(dst_interm_curves_offsets[src_curve],
1335 dst_interm_curves_offsets[src_curve + 1] -
1336 dst_interm_curves_offsets[src_curve]);
1337 int length_of_current = 0;
1339 for (
int dst_point : dst_points) {
1341 if ((length_of_current > 0) && dst_transfer_data[dst_point].is_cut) {
1343 dst_curves_offset.append(dst_point);
1344 dst_to_src_curve.
append(src_curve);
1345 length_of_current = 0;
1347 ++length_of_current;
1350 if (length_of_current != 0) {
1352 dst_curves_offset.append(dst_points.one_after_last());
1353 dst_to_src_curve.
append(src_curve);
1356 const int dst_curves_num = dst_curves_offset.size() - 1;
1357 if (dst_curves_num == 0) {
1359 return dst_transfer_data;
1363 dst.resize(dst_points_num, dst_curves_num);
1365 const OffsetIndices<int> dst_points_by_curve = dst.points_by_curve();
1378 if (src_cyclic.get_if_single().value_or(
true)) {
1380 src_now_cyclic.as_span(), dst_to_src_curve.
as_span(), dst.cyclic_for_write());
1383 dst.update_curve_types();
1393 for (const int dst_curve : dst_curves) {
1394 const IndexRange dst_curve_points = dst_points_by_curve[dst_curve];
1395 const PointTransferData &start_point_transfer =
1396 dst_transfer_data[dst_curve_points.first()];
1397 const PointTransferData &end_point_transfer = dst_transfer_data[dst_curve_points.last()];
1399 if (start_point_transfer.is_cut) {
1400 dst_start_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT;
1404 if (!end_point_transfer.is_src_end_point()) {
1405 dst_end_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT;
1411 dst_end_caps.finish();
1419 using T = decltype(dummy);
1420 auto src_attr = attribute.src.typed<T>();
1421 auto dst_attr = attribute.dst.span.typed<T>();
1423 threading::parallel_for(dst.points_range(), 4096, [&](const IndexRange dst_points) {
1424 for (const int dst_point : dst_points) {
1425 const PointTransferData &point_transfer = dst_transfer_data[dst_point];
1426 if (point_transfer.is_src_point) {
1427 dst_attr[dst_point] = src_attr[point_transfer.src_point];
1430 dst_attr[dst_point] = bke::attribute_math::mix2<T>(
1431 point_transfer.factor,
1432 src_attr[point_transfer.src_point],
1433 src_attr[point_transfer.src_next_point]);
1438 attribute.dst.finish();
1442 return dst_transfer_data;
1449 const float pixel_radius)
1479 const float pressure,
1495 float opacity = brush->
alpha;
1504 const bool use_duplicate_previous_key)
1513 if (!grease_pencil.has_active_layer()) {
1520 if (brush ==
nullptr) {
1526 if (!active_layer.is_editable()) {
1532 bool inserted_keyframe =
false;
1534 *scene, grease_pencil, active_layer, use_duplicate_previous_key, inserted_keyframe))
1539 if (inserted_keyframe) {
1555 switch (scene->toolsettings->gp_sculpt.lock_axis) {
1561 u_dir =
float3(1.0f, 0.0f, 0.0f);
1562 v_dir =
float3(0.0f, 0.0f, 1.0f);
1565 u_dir =
float3(0.0f, 1.0f, 0.0f);
1566 v_dir =
float3(0.0f, 0.0f, 1.0f);
1569 u_dir =
float3(1.0f, 0.0f, 0.0f);
1570 v_dir =
float3(0.0f, 1.0f, 0.0f);
1574 u_dir = mat *
float3(1.0f, 0.0f, 0.0f);
1575 v_dir = mat *
float3(0.0f, 1.0f, 0.0f);
1576 origin =
float3(scene->cursor.location);
1590 if (grease_pencil ==
nullptr) {
1593 grease_pencil =
static_cast<GreasePencil *
>(
object->data);
1596 return grease_pencil;
bool BKE_brush_use_alpha_pressure(const Brush *brush)
bool BKE_brush_use_size_pressure(const Brush *brush)
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Low-level operations for grease pencil.
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
const Brush * BKE_paint_brush_for_read(const Paint *paint)
Paint * BKE_paint_get_active_from_context(const bContext *C)
void BKE_report(ReportList *reports, eReportType type, const char *message)
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
bool isect_ray_plane_v3(const float ray_origin[3], const float ray_direction[3], const float plane[4], float *r_lambda, bool clip)
@ GP_ONION_SKINNING_MODE_ABSOLUTE
@ GP_ONION_SKINNING_MODE_SELECTED
@ GP_ONION_SKINNING_MODE_RELATIVE
@ GP_ONION_SKINNING_SHOW_LOOP
Object is a sort of wrapper for general info.
@ GP_SCULPT_SETT_FLAG_FRAME_FALLOFF
@ GP_PROJECT_DEPTH_STROKE
@ GP_PROJECT_DEPTH_ONLY_SELECTED
@ GP_USE_MULTI_FRAME_EDITING
bool ED_view3d_depth_read_cached(const ViewDepths *vd, const int mval[2], int margin, float *r_depth)
void ED_view3d_win_to_3d(const View3D *v3d, const ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
void ED_view3d_depth_override(Depsgraph *depsgraph, ARegion *region, View3D *v3d, Object *obact, eV3DDepthOverrideMode mode, ViewDepths **r_depths)
void ED_view3d_win_to_delta(const ARegion *region, const float xy_delta[2], float zfac, float r_out[3])
float ED_view3d_calc_zfac(const RegionView3D *rv3d, const float co[3])
void ED_view3d_depths_free(ViewDepths *depths)
@ V3D_DEPTH_SELECTED_ONLY
bool ED_view3d_win_to_3d_on_plane(const ARegion *region, const float plane[4], const float mval[2], bool do_clip, float r_out[3])
void ED_view3d_win_to_vector(const ARegion *region, const float mval[2], float r_out[3])
bool ED_view3d_depth_unproject_v3(const ARegion *region, const int mval[2], double depth, float r_location_world[3])
eV3DProjStatus ED_view3d_project_float_global(const ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
constexpr int64_t last(const int64_t n=0) const
bool contains(const Key &key) const
void add_new(const Key &key)
constexpr const T & first() const
constexpr const T & last(const int64_t n=0) const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
int64_t index_of(const Key &key) const
void add_new(const Key &key)
bool contains(const Key &key) const
void append(const T &value)
Span< T > as_span() const
OffsetIndices< int > points_by_curve() const
IndexRange curves_range() const
IndexRange points_range() const
void resize(int points_num, int curves_num)
VArray< bool > cyclic() const
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
const bke::CurvesGeometry & strokes() const
DrawingPlacement & operator=(const DrawingPlacement &other)
bool use_project_to_surface() const
void set_origin_to_nearest_stroke(float2 co)
void cache_viewport_depths(Depsgraph *depsgraph, ARegion *region, View3D *view3d)
float3 project(float2 co) const
bool use_project_to_nearest_stroke() const
DrawingPlacement()=default
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_intersection(const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
bool contains(int64_t query_index) const
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void *(* MEM_dupallocN)(const void *vmemh)
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
void convert_to_static_type(const CPPType &cpp_type, const Func &func)
Vector< AttributeTransferData > retrieve_attributes_for_transfer(const AttributeAccessor src_attributes, MutableAttributeAccessor dst_attributes, AttrDomainMask domain_mask, const AttributeFilter &attribute_filter={})
auto attribute_filter_from_skip_ref(const Span< StringRef > skip)
void gather_attributes(AttributeAccessor src_attributes, AttrDomain src_domain, AttrDomain dst_domain, const AttributeFilter &attribute_filter, const IndexMask &selection, MutableAttributeAccessor dst_attributes)
IndexMask retrieve_selected_curves(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
IndexMask retrieve_selected_points(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
IndexMask retrieve_editable_and_selected_elements(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, const bke::AttrDomain selection_domain, IndexMaskMemory &memory)
IndexMask retrieve_editable_and_selected_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
int grease_pencil_draw_operator_invoke(bContext *C, wmOperator *op, const bool use_duplicate_previous_key)
static Array< int > get_editable_frames_for_layer(const GreasePencil &grease_pencil, const bke::greasepencil::Layer &layer, const int current_frame, const bool use_multi_frame_editing)
static std::optional< int > get_frame_id(const bke::greasepencil::Layer &layer, const GreasePencilFrame &frame, const int frame_number, const int frame_index, const int current_frame, const int current_frame_index, const int last_frame, const int last_frame_index, const bool use_multi_frame_editing, const bool do_onion_skinning, const bool is_before_first, const GreasePencilOnionSkinningSettings onion_settings)
IndexMask retrieve_editable_points(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
bool ensure_active_keyframe(const Scene &scene, GreasePencil &grease_pencil, bke::greasepencil::Layer &layer, const bool duplicate_previous_key, bool &r_inserted_keyframe)
GreasePencil * from_context(bContext &C)
IndexMask retrieve_editable_fill_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
float opacity_from_input_sample(const float pressure, const Brush *brush, const BrushGpencilSettings *settings)
IndexMask retrieve_editable_elements(Object &object, const MutableDrawingInfo &info, const bke::AttrDomain selection_domain, IndexMaskMemory &memory)
IndexMask retrieve_visible_bezier_handle_points(Object &object, const bke::greasepencil::Drawing &drawing, const int layer_index, IndexMaskMemory &memory)
static float get_multi_frame_falloff(const int frame_number, const int center_frame, const int min_frame, const int max_frame, const CurveMapping *falloff_curve)
bke::CurvesGeometry fill_strokes(const ViewContext &view_context, const Brush &brush, const Scene &scene, const bke::greasepencil::Layer &layer, const VArray< bool > &boundary_layers, Span< DrawingInfo > src_drawings, bool invert, const std::optional< float > alpha_threshold, const float2 &fill_point, const ExtensionData &extensions, FillToolFitMethod fit_method, int stroke_material_index, bool keep_images)
IndexMask retrieve_visible_points(Object &object, const bke::greasepencil::Drawing &drawing, IndexMaskMemory &memory)
Vector< DrawingInfo > retrieve_visible_drawings(const Scene &scene, const GreasePencil &grease_pencil, const bool do_onion_skinning)
float radius_from_input_sample(const RegionView3D *rv3d, const ARegion *region, const Brush *brush, const float pressure, const float3 location, const float4x4 to_world, const BrushGpencilSettings *settings)
IndexMask retrieve_editable_strokes_by_material(Object &object, const bke::greasepencil::Drawing &drawing, const int mat_i, IndexMaskMemory &memory)
IndexMask retrieve_editable_and_selected_fill_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
static std::pair< int, int > get_minmax_selected_frame_numbers(const GreasePencil &grease_pencil, const int current_frame)
static float pixel_radius_to_world_space_radius(const RegionView3D *rv3d, const ARegion *region, const float3 center, const float4x4 to_world, const float pixel_radius)
static float brush_radius_at_location(const RegionView3D *rv3d, const ARegion *region, const Brush *brush, const float3 location, const float4x4 to_world)
static Array< std::pair< int, int > > get_visible_frames_for_layer(const GreasePencil &grease_pencil, const bke::greasepencil::Layer &layer, const int current_frame, const bool use_multi_frame_editing, const bool do_onion_skinning)
Array< PointTransferData > compute_topology_change(const bke::CurvesGeometry &src, bke::CurvesGeometry &dst, const Span< Vector< PointTransferData > > src_to_dst_points, const bool keep_caps)
IndexMask retrieve_editable_and_selected_points(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
static VectorSet< int > get_editable_material_indices(Object &object)
static VectorSet< int > get_fill_material_indices(Object &object)
static VectorSet< int > get_hidden_material_indices(Object &object)
Vector< MutableDrawingInfo > retrieve_editable_drawings_from_layer(const Scene &scene, GreasePencil &grease_pencil, const blender::bke::greasepencil::Layer &layer)
IndexMask retrieve_visible_strokes(Object &object, const bke::greasepencil::Drawing &drawing, IndexMaskMemory &memory)
Vector< MutableDrawingInfo > retrieve_editable_drawings_from_layer_with_falloff(const Scene &scene, GreasePencil &grease_pencil, const blender::bke::greasepencil::Layer &layer)
IndexMask retrieve_visible_bezier_handle_elements(Object &object, const bke::greasepencil::Drawing &drawing, const int layer_index, const bke::AttrDomain selection_domain, IndexMaskMemory &memory)
Vector< MutableDrawingInfo > retrieve_editable_drawings_with_falloff(const Scene &scene, GreasePencil &grease_pencil)
IndexMask retrieve_editable_strokes(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
Vector< MutableDrawingInfo > retrieve_editable_drawings(const Scene &scene, GreasePencil &grease_pencil)
float4x2 calculate_texture_space(const Scene *scene, const ARegion *region, const float2 &mouse, const DrawingPlacement &placement)
Array< Vector< MutableDrawingInfo > > retrieve_editable_drawings_grouped_per_frame(const Scene &scene, GreasePencil &grease_pencil)
constexpr double inv_sqrt3
MatBase< T, NumCol, NumRow > transpose(const MatBase< T, NumRow, NumCol > &mat)
T clamp(const T &a, const T &min, const T &max)
T safe_divide(const T &a, const T &b)
T length(const VecBase< T, Size > &a)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
T min(const T &a, const T &b)
CartesianBasis invert(const CartesianBasis &basis)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
T max(const T &a, const T &b)
VecBase< T, 3 > transform_direction(const MatBase< T, 3, 3 > &mat, const VecBase< T, 3 > &direction)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
MatBase< float, 2, 4 > float2x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
struct CurveMapping * cur_falloff
int16_t num_frames_before
GreasePencilOnionSkinningSettings onion_skinning_settings
bke::greasepencil::Drawing & drawing
struct ReportList * reports
void WM_event_add_notifier(const bContext *C, uint type, void *reference)