42#include "RNA_prototypes.hh"
85 N_(
"Standard transitions between keyframes")),
90 "Straight-line interpolation between A and B (i.e. no ease in/out)"},
95 "Custom interpolation defined using a curve map"},
99 N_(
"Predefined inertial transitions, useful for motion graphics "
100 "(from least to most \"dramatic\")")),
105 "Sinusoidal easing (weakest, almost linear but with a slight curvature)"},
114 "Exponential easing (dramatic)"},
119 "Circular easing (strongest and most dynamic)"},
122 N_(
"Simple physics-inspired easing effects")),
127 "Cubic easing with overshoot and settle"},
132 "Exponentially decaying parabolic bounce, like when objects collide"},
137 "Exponentially decaying sine wave, like an elastic band"},
139 {0,
nullptr, 0,
nullptr,
nullptr},
143 {int(InterpolateFlipMode::None),
"NONE", 0,
"No Flip",
""},
144 {int(InterpolateFlipMode::Flip),
"FLIP", 0,
"Flip",
""},
145 {int(InterpolateFlipMode::FlipAuto),
"AUTO", 0,
"Automatic",
""},
146 {0,
nullptr, 0,
nullptr,
nullptr},
150 {int(InterpolateLayerMode::Active),
"ACTIVE", 0,
"Active",
""},
151 {int(InterpolateLayerMode::All),
"ALL", 0,
"All Layers",
""},
152 {0,
nullptr, 0,
nullptr,
nullptr},
210 SortedKeysIterator next_key_it = std::next(prev_key_it);
215 if (!frame || frame->is_end()) {
224 for (; next_key_it != sorted_keys.
end(); ++next_key_it) {
225 if (is_valid_keyframe(*next_key_it)) {
229 for (; prev_key_it != sorted_keys.
begin(); --prev_key_it) {
230 if (is_valid_keyframe(*prev_key_it)) {
234 if (next_key_it == sorted_keys.
end() || !is_valid_keyframe(*prev_key_it)) {
238 return std::make_pair(*prev_key_it, *next_key_it);
244 const int current_frame,
245 const bool exclude_breakdowns,
246 const bool only_selected,
252 layer, current_frame, exclude_breakdowns);
259 const Drawing &from_drawing = *grease_pencil.get_drawing_at(layer, interval->first);
260 const Drawing &to_drawing = *grease_pencil.get_drawing_at(layer, interval->second);
290 if (from_selection.
size() > to_selection.
size()) {
291 from_selection = from_selection.
slice(0, to_selection.
size());
293 else if (to_selection.
size() > from_selection.
size()) {
294 to_selection = to_selection.
slice(0, from_selection.
size());
307 to_curves[from_segment[
i]] = to_segment[
i];
321 const int current_frame = scene.
r.
cfra;
325 if (!grease_pencil.has_active_layer()) {
329 const Layer &active_layer = *grease_pencil.get_active_layer();
340 data->active_layer_index = *grease_pencil.get_layer_index(active_layer);
344 switch (layer_mode) {
345 case InterpolateLayerMode::Active:
348 case InterpolateLayerMode::All:
350 grease_pencil.layers().index_range(),
352 data->layer_mask_memory,
353 [&](
const int layer_index) { return grease_pencil.layer(layer_index).is_editable(); });
357 bool found_mapping =
false;
358 data->layer_data.reinitialize(grease_pencil.layers().size());
359 data->layer_mask.foreach_index([&](
const int layer_index) {
360 const Layer &layer = grease_pencil.layer(layer_index);
367 data->exclude_breakdowns,
370 found_mapping = found_mapping || has_curve_mapping;
374 if (!found_mapping) {
380 active_layer, current_frame,
data->exclude_breakdowns);
381 data->init_factor = active_layer_interval ?
382 float(current_frame - active_layer_interval->first) /
383 (active_layer_interval->second - active_layer_interval->first + 1) :
395 int prev_from_frame = INT_MIN;
396 int prev_to_frame = INT_MIN;
397 int current_count = 0;
398 for (
const int pair_index : order) {
399 const int from_frame = curve_pairs.
from_frames[pair_index];
400 const int to_frame = curve_pairs.
to_frames[pair_index];
401 if (from_frame != prev_from_frame || to_frame != prev_to_frame) {
403 if (current_count > 0) {
404 pair_offsets.
append(current_count);
410 if (current_count > 0) {
411 pair_offsets.
append(current_count);
428 if (from_positions.
size() < 2 || to_positions.
size() < 2) {
432 constexpr float min_angle =
DEG2RADF(15);
435 const float3 &from_last = from_positions.
last();
443 .radian() < min_angle)
459 return math::dot(from_last - from_first, to_last - to_first) < 0.0f;
465 const float mix_factor,
481 std::sort(sorted_pairs.
begin(), sorted_pairs.
end(), [&](
const int a,
const int b) {
482 const int from_frame_a = curve_pairs.from_frames[a];
483 const int to_frame_a = curve_pairs.to_frames[a];
484 const int from_frame_b = curve_pairs.from_frames[b];
485 const int to_frame_b = curve_pairs.to_frames[b];
486 return from_frame_a < from_frame_b ||
487 (from_frame_a == from_frame_b && to_frame_a < to_frame_b);
503 for (
const int pair_range_i : curves_by_pair.
index_range()) {
504 const IndexRange pair_range = curves_by_pair[pair_range_i];
507 const int first_pair_index = sorted_pairs[pair_range.
first()];
508 const int from_frame = curve_pairs.
from_frames[first_pair_index];
509 const int to_frame = curve_pairs.
to_frames[first_pair_index];
510 const Drawing *from_drawing = grease_pencil.get_drawing_at(layer, from_frame);
511 const Drawing *to_drawing = grease_pencil.get_drawing_at(layer, to_frame);
512 if (!from_drawing || !to_drawing) {
520 for (
const int sorted_index : pair_range) {
521 const int pair_index = sorted_pairs[sorted_index];
522 const int from_curve = curve_pairs.
from_curves[pair_index];
523 const int to_curve = curve_pairs.
to_curves[pair_index];
526 bool curve_flip =
false;
527 if (from_curve < 0 && to_curve < 0) {
530 else if (from_curve < 0) {
531 const IndexRange to_points = to_points_by_curve[to_curve];
532 curve_size = to_points.
size();
535 else if (to_curve < 0) {
536 const IndexRange from_points = from_points_by_curve[from_curve];
537 curve_size = from_points.
size();
541 const IndexRange from_points = from_points_by_curve[from_curve];
542 const IndexRange to_points = to_points_by_curve[to_curve];
544 curve_size = std::max(from_points.
size(), to_points.
size());
546 case InterpolateFlipMode::None:
549 case InterpolateFlipMode::Flip:
552 case InterpolateFlipMode::FlipAuto: {
554 to_positions.
slice(to_points));
560 dst_curve_offsets[pair_index] = curve_size;
561 dst_curve_flip[pair_index] = curve_flip;
566 const int dst_point_num = dst_points_by_curve.
total_size();
570 if (dst_curve_num > 0) {
583 Array<int> from_sample_indices(dst_point_num);
589 for (
const int pair_range_i : curves_by_pair.
index_range()) {
590 const IndexRange pair_range = curves_by_pair[pair_range_i];
594 sorted_pairs.
as_span().slice(pair_range), memory);
598 const int first_pair_index = sorted_pairs[pair_range.
first()];
599 const int from_frame = curve_pairs.
from_frames[first_pair_index];
600 const int to_frame = curve_pairs.
to_frames[first_pair_index];
601 const Drawing *from_drawing = grease_pencil.get_drawing_at(layer, from_frame);
602 const Drawing *to_drawing = grease_pencil.get_drawing_at(layer, to_frame);
603 if (!from_drawing || !to_drawing) {
612 const int pair_index = sorted_pairs[pair_range[
i]];
613 const IndexRange dst_points = dst_points_by_curve[pair_index];
615 to_indices[
i] = curve_pairs.
to_curves[pair_index];
617 const int from_curve = curve_pairs.
from_curves[pair_index];
618 const int to_curve = curve_pairs.
to_curves[pair_index];
624 from_sample_factors.
fill(0.0f);
627 if (from_curve < 0) {
630 to_sample_factors.
fill(0.0f);
634 const IndexRange from_points = from_points_by_curve[from_curve];
635 const IndexRange to_points = to_points_by_curve[to_curve];
636 if (from_points.
size() >= to_points.
size()) {
643 to_curves_cyclic[to_curve],
644 dst_curve_flip[pair_index],
653 from_curves_cyclic[from_curve],
654 dst_curve_flip[pair_index],
658 to_sample_factors.
fill(0.0f);
697 status = msg + std::string(str_ofs);
705 &
C,
IFACE_(
"ESC/RMB to cancel, Enter/LMB to confirm, WHEEL/MOVE to adjust factor"));
711 const int frame_number)
715 const std::optional<int> start_frame = layer.
start_frame_at(frame_number);
716 if (start_frame && *start_frame == frame_number) {
717 return grease_pencil.get_editable_drawing_at(layer, frame_number);
726 const int frame_number)
736 return grease_pencil.insert_frame(layer, frame_number, 0, keyframe_type);
746 const int current_frame = scene.
r.
cfra;
751 opdata.layer_mask.foreach_index([&](
const int layer_index) {
752 Layer &layer = grease_pencil.layer(layer_index);
757 if (dst_drawing ==
nullptr) {
761 const float mix_factor = opdata.init_factor + opdata.shift;
763 grease_pencil, layer, layer_data.
curve_pairs, mix_factor, flip_mode);
765 if (opdata.smooth_factor > 0.0f && opdata.smooth_steps > 0) {
771 interpolated_curves.
cyclic(),
773 opdata.smooth_factor,
802 const int current_frame = scene.
r.
cfra;
806 opdata.layer_mask.foreach_index([&](
const int layer_index) {
807 Layer &layer = grease_pencil.layer(layer_index);
812 Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, current_frame);
822 grease_pencil.remove_frames(layer, {current_frame});
840 const int current_frame = scene.
r.
cfra;
845 data.layer_mask.foreach_index([&](
const int layer_index) {
846 Layer &layer = grease_pencil.layer(layer_index);
932 switch (event->
type) {
973 const float mouse_pos =
event->mval[0];
974 const float factor = std::clamp(
1007 ot->name =
"Grease Pencil Interpolation";
1008 ot->idname =
"GREASE_PENCIL_OT_interpolate";
1009 ot->description =
"Interpolate Grease Pencil strokes between frames";
1025 "Bias factor for which frame has more influence on the interpolated strokes",
1034 "Layers included in the interpolation");
1037 "exclude_breakdowns",
1039 "Exclude Breakdowns",
1040 "Exclude existing Breakdowns keyframes as interpolation extremes");
1046 "Use only selected strokes for interpolating");
1051 int(InterpolateFlipMode::FlipAuto),
1053 "Invert destination stroke to match start and end with source stroke");
1061 "Number of times to smooth newly created strokes",
1071 "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise",
1085 const float back_easing,
1086 const float amplitude,
1091 constexpr float begin = 0.0f;
1092 constexpr float change = 1.0f;
1093 constexpr float duration = 1.0f;
1262 const int current_frame = scene.
r.
cfra;
1280 Layer &layer = grease_pencil.layer(layer_index);
1289 const int frame_range_size = interval->second - interval->first + 1;
1292 for (
int cframe = interval->first +
step; cframe < interval->second; cframe +=
step) {
1295 if (dst_drawing ==
nullptr) {
1299 const float base_factor =
float(cframe - interval->first) /
1300 std::max(frame_range_size - 1, 1);
1302 easing, type, back_easing, amplitude, period, *ipo_settings.
custom_ipo, base_factor);
1313 interpolated_curves.
cyclic(),
1346 row = &layout->
row(
true);
1349 row = &layout->
row(
true);
1353 row = &layout->
row(
true);
1357 row = &layout->
row(
true);
1360 row = &layout->
row(
true);
1363 row = &layout->
row(
true);
1370 row = &layout->
row(
true);
1380 layout, &gpsettings_ptr,
"interpolation_curve", 0,
false,
true,
true,
false,
false);
1383 row = &layout->
row(
false);
1386 row = &layout->
row(
false);
1390 row = &layout->
row(
false);
1392 row = &layout->
row(
false);
1402 ot->name =
"Interpolate Sequence";
1403 ot->idname =
"GREASE_PENCIL_OT_interpolate_sequence";
1405 ot->description =
"Generate 'in-betweens' to smoothly interpolate between Grease Pencil frames";
1417 "Number of frames between generated interpolated frames",
1426 "Layers included in the interpolation");
1429 "exclude_breakdowns",
1431 "Exclude Breakdowns",
1432 "Exclude existing Breakdowns keyframes as interpolation extremes");
1438 "Use only selected strokes for interpolating");
1443 int(InterpolateFlipMode::FlipAuto),
1445 "Invert destination stroke to match start and end with source stroke");
1453 "Number of times to smooth newly created strokes",
1463 "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise",
1472 "Interpolation method to use the next time 'Interpolate Sequence' is run");
1481 "Which ends of the segment between the preceding and following Grease Pencil frames "
1482 "easing interpolation is applied to");
1491 "Amount of overshoot for 'back' easing",
1502 "Amount to boost elastic bounces for 'elastic' easing",
1512 "Time between bounces for elastic easing",
1542 {0,
nullptr, 0,
nullptr,
nullptr},
@ CTX_MODE_EDIT_GPENCIL_LEGACY
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
Low-level operations for curves.
Low-level operations for grease pencil.
#define BLI_assert_unreachable()
float BLI_easing_sine_ease_in(float time, float begin, float change, float duration)
float BLI_easing_back_ease_out(float time, float begin, float change, float duration, float overshoot)
float BLI_easing_bounce_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_quint_ease_out(float time, float begin, float change, float duration)
float BLI_easing_quart_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_circ_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_quart_ease_out(float time, float begin, float change, float duration)
float BLI_easing_bounce_ease_in(float time, float begin, float change, float duration)
float BLI_easing_circ_ease_in(float time, float begin, float change, float duration)
float BLI_easing_expo_ease_in(float time, float begin, float change, float duration)
float BLI_easing_expo_ease_out(float time, float begin, float change, float duration)
float BLI_easing_elastic_ease_in(float time, float begin, float change, float duration, float amplitude, float period)
float BLI_easing_quad_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_elastic_ease_out(float time, float begin, float change, float duration, float amplitude, float period)
float BLI_easing_cubic_ease_in(float time, float begin, float change, float duration)
float BLI_easing_elastic_ease_in_out(float time, float begin, float change, float duration, float amplitude, float period)
float BLI_easing_quint_ease_in(float time, float begin, float change, float duration)
float BLI_easing_sine_ease_out(float time, float begin, float change, float duration)
float BLI_easing_bounce_ease_out(float time, float begin, float change, float duration)
float BLI_easing_quad_ease_in(float time, float begin, float change, float duration)
float BLI_easing_quad_ease_out(float time, float begin, float change, float duration)
float BLI_easing_circ_ease_out(float time, float begin, float change, float duration)
float BLI_easing_cubic_ease_out(float time, float begin, float change, float duration)
float BLI_easing_back_ease_in(float time, float begin, float change, float duration, float overshoot)
float BLI_easing_quint_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_expo_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_quart_ease_in(float time, float begin, float change, float duration)
float BLI_easing_back_ease_in_out(float time, float begin, float change, float duration, float overshoot)
float BLI_easing_cubic_ease_in_out(float time, float begin, float change, float duration)
float BLI_easing_sine_ease_in_out(float time, float begin, float change, float duration)
int isect_seg_seg_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
#define ISECT_LINE_LINE_CROSS
#define CTX_N_(context, msgid)
#define BLT_I18NCONTEXT_ID_GPENCIL
void DEG_id_tag_update(ID *id, unsigned int flags)
void ED_interpolatetool_modal_keymap(wmKeyConfig *keyconf)
void ED_operatortypes_grease_pencil_interpolate()
void ED_area_status_text(ScrArea *area, const char *str)
void ED_workspace_status_text(bContext *C, const char *str)
Read Guarded memory(de)allocation.
#define RNA_ENUM_ITEM_HEADING(name, description)
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, int type, bool levels, bool brush, bool neg_slope, bool tone, bool presets)
BMesh const char void * data
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr void copy_from(Span< T > values) const
Span< T > as_span() const
MutableSpan< T > as_mutable_span()
void fill(const T &value) const
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_indices(Span< T > indices, IndexMaskMemory &memory)
static void foreach_segment_zipped(Span< IndexMask > masks, FunctionRef< bool(Span< IndexMaskSegment > segments)> fn)
constexpr int64_t first() const
constexpr int64_t size() const
constexpr bool is_empty() const
static constexpr IndexRange from_single(const int64_t index)
constexpr IndexRange index_range() const
const int * SortedKeysIterator
constexpr void fill(const T &value) const
IndexRange index_range() const
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T & first() const
constexpr int64_t size() const
constexpr const T & last(const int64_t n=0) const
constexpr const T * end() const
constexpr const T * begin() const
static VArray from_single(T value, const int64_t size)
void append(const T &value)
void resize(const int64_t new_size)
MutableSpan< T > as_mutable_span()
void append_n_times(const T &value, const int64_t n)
MutableSpan< float3 > positions_for_write()
OffsetIndices< int > points_by_curve() const
IndexRange curves_range() const
Span< float3 > positions() const
void tag_positions_changed()
MutableSpan< int > offsets_for_write()
VArray< bool > cyclic() const
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
void tag_topology_changed()
SortedKeysIterator sorted_keys_iterator_at(int frame_number) const
const GreasePencilFrame * frame_at(const int frame_number) const
bool has_drawing_at(const int frame_number) const
std::optional< int > start_frame_at(int frame_number) const
Span< FramesMapKeyT > sorted_keys() const
IndexMask slice(IndexRange range) const
void foreach_index(Fn &&fn) const
IndexRange index_range() const
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
void fill_index_range(MutableSpan< T > span, const T start=0)
static bool has_anything_selected(const Span< Curves * > curves_ids)
IndexMask retrieve_selected_curves(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
bool active_grease_pencil_poll(bContext *C)
static float grease_pencil_interpolate_sequence_easing_calc(const eBezTriple_Easing easing, const InterpolationType type, const float back_easing, const float amplitude, const float period, const CurveMapping &custom_ipo, const float time)
static void grease_pencil_interpolate_exit(bContext &C, wmOperator &op)
static bool find_curve_mapping_from_index(const GreasePencil &grease_pencil, const bke::greasepencil::Layer &layer, const int current_frame, const bool exclude_breakdowns, const bool only_selected, InterpolationPairs &pairs)
static bke::CurvesGeometry interpolate_between_curves(const GreasePencil &grease_pencil, const bke::greasepencil::Layer &layer, const InterpolationPairs &curve_pairs, const float mix_factor, const InterpolateFlipMode flip_mode)
InterpolateToolModalEvent
static void grease_pencil_interpolate_cancel(bContext *C, wmOperator *op)
constexpr float interpolate_factor_min
static wmOperatorStatus grease_pencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent *)
static void grease_pencil_interpolate_status_indicators(bContext &C, const InterpolateOpData &opdata)
static wmOperatorStatus grease_pencil_interpolate_sequence_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem grease_pencil_interpolate_layer_items[]
static bool grease_pencil_interpolate_init(const bContext &C, wmOperator &op)
static const EnumPropertyItem grease_pencil_interpolate_flip_mode_items[]
static bool compute_auto_flip(const Span< float3 > from_positions, const Span< float3 > to_positions)
static const EnumPropertyItem grease_pencil_interpolation_type_items[]
static void grease_pencil_interpolate_sequence_ui(bContext *C, wmOperator *op)
static wmOperatorStatus grease_pencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent *event)
static bke::greasepencil::Drawing * get_drawing_at_exact_frame(GreasePencil &grease_pencil, bke::greasepencil::Layer &layer, const int frame_number)
constexpr float interpolate_factor_max
static bool grease_pencil_interpolate_poll(bContext *C)
static void grease_pencil_interpolate_update(bContext &C, const wmOperator &op)
static void GREASE_PENCIL_OT_interpolate_sequence(wmOperatorType *ot)
static std::optional< FramesMapKeyIntervalT > find_frames_interval(const bke::greasepencil::Layer &layer, const int frame_number, const bool exclude_breakdowns)
static void grease_pencil_interpolate_restore(bContext &C, wmOperator &op)
static void GREASE_PENCIL_OT_interpolate(wmOperatorType *ot)
std::pair< int, int > FramesMapKeyIntervalT
static Vector< int > find_curve_pair_offsets(const InterpolationPairs &curve_pairs, const Span< int > order)
static bke::greasepencil::Drawing * ensure_drawing_at_exact_frame(GreasePencil &grease_pencil, bke::greasepencil::Layer &layer, InterpolateOpData::LayerData &layer_data, const int frame_number)
void interpolate_curves_with_samples(const bke::CurvesGeometry &from_curves, const bke::CurvesGeometry &to_curves, Span< int > from_curve_indices, Span< int > to_curve_indices, Span< int > from_sample_indices, Span< int > to_sample_indices, Span< float > from_sample_factors, Span< float > to_sample_factors, const IndexMask &dst_curve_mask, float mix_factor, bke::CurvesGeometry &dst_curves, IndexMaskMemory &memory)
void sample_curve_padded(const Span< float3 > positions, bool cyclic, MutableSpan< int > r_indices, MutableSpan< float > r_factors)
void smooth_curve_attribute(const IndexMask &curves_to_smooth, const OffsetIndices< int > points_by_curve, const VArray< bool > &point_selection, const VArray< bool > &cyclic, int iterations, float influence, bool smooth_ends, bool keep_shape, GMutableSpan attribute_data)
AngleRadianBase< T > angle_between(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
OffsetIndices< int > accumulate_counts_to_offsets(MutableSpan< int > counts_to_offsets, int start_offset=0)
VecBase< float, 3 > float3
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float_factor(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
const EnumPropertyItem rna_enum_beztriple_interpolation_easing_items[]
ListBase vertex_group_names
struct CurveMapping * custom_ipo
ListBase vertex_group_names
struct ToolSettings * toolsettings
InterpolationPairs curve_pairs
std::optional< bke::CurvesGeometry > orig_curves
IndexMaskMemory layer_mask_memory
InterpolateFlipMode flipmode
static InterpolateOpData * from_operator(const bContext &C, const wmOperator &op)
Array< LayerData > layer_data
Vector< int > from_frames
Vector< int > from_curves
void use_property_decorate_set(bool is_sep)
uiLayout & column(bool align)
uiLayout & row(bool align)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))