43#include "RNA_prototypes.hh"
85 N_(
"Standard transitions between keyframes")),
86 {
int(InterpolationType::Linear),
90 "Straight-line interpolation between A and B (i.e. no ease in/out)"},
91 {
int(InterpolationType::CurveMap),
95 "Custom interpolation defined using a curve map"},
99 N_(
"Predefined inertial transitions, useful for motion graphics "
100 "(from least to most \"dramatic\")")),
101 {
int(InterpolationType::Sine),
105 "Sinusoidal easing (weakest, almost linear but with a slight curvature)"},
106 {
int(InterpolationType::Quadratic),
"QUAD", ICON_IPO_QUAD,
"Quadratic",
"Quadratic easing"},
107 {
int(InterpolationType::Cubic),
"CUBIC", ICON_IPO_CUBIC,
"Cubic",
"Cubic easing"},
108 {
int(InterpolationType::Quartic),
"QUART", ICON_IPO_QUART,
"Quartic",
"Quartic easing"},
109 {
int(InterpolationType::Quintic),
"QUINT", ICON_IPO_QUINT,
"Quintic",
"Quintic easing"},
110 {
int(InterpolationType::Exponential),
114 "Exponential easing (dramatic)"},
115 {
int(InterpolationType::Circular),
119 "Circular easing (strongest and most dynamic)"},
122 N_(
"Simple physics-inspired easing effects")),
123 {
int(InterpolationType::Back),
127 "Cubic easing with overshoot and settle"},
128 {
int(InterpolationType::Bounce),
132 "Exponentially decaying parabolic bounce, like when objects collide"},
133 {
int(InterpolationType::Elastic),
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);
275 const int pairs_num = std::min(from_selection.
size(), to_selection.
size());
285 from_selection.
slice(0, pairs_num)
287 to_selection.
slice(0, pairs_num)
299 const int current_frame = scene.
r.
cfra;
304 const Layer &active_layer = *grease_pencil.get_active_layer();
315 data->active_layer_index = *grease_pencil.get_layer_index(active_layer);
319 switch (layer_mode) {
320 case InterpolateLayerMode::Active:
323 case InterpolateLayerMode::All:
325 grease_pencil.layers().index_range(),
327 data->layer_mask_memory,
328 [&](
const int layer_index) { return grease_pencil.layer(layer_index).is_editable(); });
332 bool found_mapping =
false;
333 data->layer_data.reinitialize(grease_pencil.layers().size());
334 data->layer_mask.foreach_index([&](
const int layer_index) {
335 const Layer &layer = grease_pencil.layer(layer_index);
342 data->exclude_breakdowns,
345 found_mapping = found_mapping || has_curve_mapping;
349 if (!found_mapping) {
355 active_layer, current_frame,
data->exclude_breakdowns);
356 data->init_factor = active_layer_interval ?
357 float(current_frame - active_layer_interval->first) /
358 (active_layer_interval->second - active_layer_interval->first + 1) :
366 if (from_positions.
size() < 2 || to_positions.
size() < 2) {
370 constexpr float min_angle =
DEG2RADF(15);
373 const float3 &from_last = from_positions.
last();
381 .radian() < min_angle)
397 return math::dot(from_last - from_first, to_last - to_first) < 0.0f;
403 const float mix_factor,
419 std::sort(sorted_pairs.
begin(), sorted_pairs.
end(), [&](
const int a,
const int b) {
420 const int from_frame_a = curve_pairs.from_frames[a];
421 const int to_frame_a = curve_pairs.to_frames[a];
422 const int from_frame_b = curve_pairs.from_frames[b];
423 const int to_frame_b = curve_pairs.to_frames[b];
424 return from_frame_a < from_frame_b ||
425 (from_frame_a == from_frame_b && to_frame_a < to_frame_b);
431 int prev_from_frame = INT_MIN;
432 int prev_to_frame = INT_MIN;
433 int current_count = 0;
434 for (
const int sorted_index :
IndexRange(dst_curve_num)) {
435 const int pair_index = sorted_pairs[sorted_index];
436 const int from_frame = curve_pairs.
from_frames[pair_index];
437 const int to_frame = curve_pairs.
to_frames[pair_index];
438 if (from_frame != prev_from_frame || to_frame != prev_to_frame) {
440 if (current_count > 0) {
441 pair_offsets.
append(current_count);
447 if (current_count > 0) {
448 pair_offsets.
append(current_count);
469 for (
const int pair_range_i : curves_by_pair.
index_range()) {
470 const IndexRange pair_range = curves_by_pair[pair_range_i];
473 const int first_pair_index = sorted_pairs[pair_range.
first()];
474 const int from_frame = curve_pairs.
from_frames[first_pair_index];
475 const int to_frame = curve_pairs.
to_frames[first_pair_index];
476 const Drawing *from_drawing = grease_pencil.get_drawing_at(layer, from_frame);
477 const Drawing *to_drawing = grease_pencil.get_drawing_at(layer, to_frame);
478 if (!from_drawing || !to_drawing) {
486 for (
const int sorted_index : pair_range) {
487 const int pair_index = sorted_pairs[sorted_index];
488 const int from_curve = curve_pairs.
from_curves[pair_index];
489 const int to_curve = curve_pairs.
to_curves[pair_index];
490 const IndexRange from_points = from_points_by_curve[from_curve];
491 const IndexRange to_points = to_points_by_curve[to_curve];
493 dst_curve_offsets[pair_index] = std::max(from_points.
size(), to_points.
size());
495 case InterpolateFlipMode::None:
496 dst_curve_flip[pair_index] =
false;
498 case InterpolateFlipMode::Flip:
499 dst_curve_flip[pair_index] =
true;
501 case InterpolateFlipMode::FlipAuto: {
503 to_positions.
slice(to_points));
511 const int dst_point_num = dst_points_by_curve.
total_size();
515 if (dst_curve_num > 0) {
526 Array<int> sorted_from_curve_indices(dst_curve_num);
527 Array<int> sorted_to_curve_indices(dst_curve_num);
529 for (
const int pair_range_i : curves_by_pair.
index_range()) {
530 const IndexRange pair_range = curves_by_pair[pair_range_i];
531 const int first_pair_index = sorted_pairs[pair_range.
first()];
532 const int from_frame = curve_pairs.
from_frames[first_pair_index];
533 const int to_frame = curve_pairs.
to_frames[first_pair_index];
534 const Drawing *from_drawing = grease_pencil.get_drawing_at(layer, from_frame);
535 const Drawing *to_drawing = grease_pencil.get_drawing_at(layer, to_frame);
536 if (!from_drawing || !to_drawing) {
546 sorted_pairs.
as_span().slice(pair_range), selection_memory);
550 for (
const int i : pair_range) {
551 const int pair_index = sorted_pairs[i];
552 sorted_from_curve_indices[i] = std::clamp(
554 sorted_to_curve_indices[i] = std::clamp(
555 curve_pairs.
to_curves[pair_index], 0,
int(to_curves.
last()));
588 status = msg + std::string(str_ofs);
591 status = msg + std::to_string(
int((opdata.
init_factor + opdata.
shift) * 100.0f)) +
" %";
596 &
C,
IFACE_(
"ESC/RMB to cancel, Enter/LMB to confirm, WHEEL/MOVE to adjust factor"));
602 const int frame_number)
606 const std::optional<int> start_frame = layer.
start_frame_at(frame_number);
607 if (start_frame && *start_frame == frame_number) {
608 return grease_pencil.get_editable_drawing_at(layer, frame_number);
617 const int frame_number)
627 return grease_pencil.insert_frame(layer, frame_number, 0, keyframe_type);
637 const int current_frame = scene.
r.
cfra;
642 opdata.layer_mask.foreach_index([&](
const int layer_index) {
643 Layer &layer = grease_pencil.layer(layer_index);
648 if (dst_drawing ==
nullptr) {
652 const float mix_factor = opdata.init_factor + opdata.shift;
654 grease_pencil, layer, layer_data.
curve_pairs, mix_factor, flip_mode);
656 if (opdata.smooth_factor > 0.0f && opdata.smooth_steps > 0) {
662 interpolated_curves.
cyclic(),
664 opdata.smooth_factor,
693 const int current_frame = scene.
r.
cfra;
697 opdata.layer_mask.foreach_index([&](
const int layer_index) {
698 Layer &layer = grease_pencil.layer(layer_index);
703 Drawing *drawing = grease_pencil.get_editable_drawing_at(layer, current_frame);
713 grease_pencil.remove_frames(layer, {current_frame});
731 const int current_frame = scene.
r.
cfra;
736 data.layer_mask.foreach_index([&](
const int layer_index) {
737 Layer &layer = grease_pencil.layer(layer_index);
819 switch (event->
type) {
860 const float mouse_pos =
event->mval[0];
861 const float factor = std::clamp(
894 ot->name =
"Grease Pencil Interpolation";
895 ot->idname =
"GREASE_PENCIL_OT_interpolate";
896 ot->description =
"Interpolate grease pencil strokes between frames";
912 "Bias factor for which frame has more influence on the interpolated strokes",
921 "Layers included in the interpolation");
924 "exclude_breakdowns",
926 "Exclude Breakdowns",
927 "Exclude existing Breakdowns keyframes as interpolation extremes");
933 "Use only selected strokes for interpolating");
938 int(InterpolateFlipMode::FlipAuto),
940 "Invert destination stroke to match start and end with source stroke");
948 "Number of times to smooth newly created strokes",
958 "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise",
972 const float back_easing,
973 const float amplitude,
978 constexpr float begin = 0.0f;
979 constexpr float change = 1.0f;
980 constexpr float duration = 1.0f;
983 case InterpolationType::Linear:
986 case InterpolationType::CurveMap:
989 case InterpolationType::Back:
1003 case InterpolationType::Bounce:
1017 case InterpolationType::Circular:
1031 case InterpolationType::Cubic:
1045 case InterpolationType::Elastic:
1059 case InterpolationType::Exponential:
1073 case InterpolationType::Quadratic:
1087 case InterpolationType::Quartic:
1101 case InterpolationType::Quintic:
1115 case InterpolationType::Sine:
1149 const int current_frame = scene.
r.
cfra;
1167 Layer &layer = grease_pencil.layer(layer_index);
1176 const int frame_range_size = interval->second - interval->first + 1;
1179 for (
int cframe = interval->first + step; cframe < interval->second; cframe += step) {
1182 if (dst_drawing ==
nullptr) {
1186 const float base_factor =
float(cframe - interval->first) /
1187 std::max(frame_range_size - 1, 1);
1189 easing, type, back_easing, amplitude, period, *ipo_settings.
custom_ipo, base_factor);
1200 interpolated_curves.
cyclic(),
1257 if (type == InterpolationType::CurveMap) {
1264 layout, &gpsettings_ptr,
"interpolation_curve", 0,
false,
true,
true,
false);
1266 else if (type != InterpolationType::Linear) {
1269 if (type == InterpolationType::Back) {
1273 else if (type == InterpolationType::Elastic) {
1286 ot->name =
"Interpolate Sequence";
1287 ot->idname =
"GREASE_PENCIL_OT_interpolate_sequence";
1289 ot->description =
"Generate 'in-betweens' to smoothly interpolate between Grease Pencil frames";
1301 "Number of frames between generated interpolated frames",
1310 "Layers included in the interpolation");
1313 "exclude_breakdowns",
1315 "Exclude Breakdowns",
1316 "Exclude existing Breakdowns keyframes as interpolation extremes");
1321 int(InterpolateFlipMode::FlipAuto),
1323 "Invert destination stroke to match start and end with source stroke");
1331 "Number of times to smooth newly created strokes",
1341 "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise",
1350 "Interpolation method to use the next time 'Interpolate Sequence' is run");
1359 "Which ends of the segment between the preceding and following grease pencil frames "
1360 "easing interpolation is applied to");
1369 "Amount of overshoot for 'back' easing",
1379 "Amount to boost elastic bounces for 'elastic' easing",
1389 "Time between bounces for elastic easing",
1419 {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.
General operations, lookup, etc. for materials.
#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, const char *propname, int type, bool levels, bool brush, bool neg_slope, bool tone)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
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()
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_indices(Span< T > indices, IndexMaskMemory &memory)
constexpr int64_t first() const
constexpr int64_t last(const int64_t n=0) const
constexpr int64_t size() const
constexpr bool is_empty() const
static constexpr IndexRange from_single(const int64_t index)
const int * SortedKeysIterator
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 ForSingle(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
void to_indices(MutableSpan< T > r_indices) const
IndexMask slice(IndexRange range) const
void foreach_index(Fn &&fn) const
IndexRange index_range() const
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
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 int grease_pencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent *event)
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 void grease_pencil_interpolate_status_indicators(bContext &C, const InterpolateOpData &opdata)
static const EnumPropertyItem grease_pencil_interpolate_layer_items[]
static bool grease_pencil_interpolate_init(const bContext &C, wmOperator &op)
static int grease_pencil_interpolate_sequence_exec(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 int grease_pencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent *)
static const EnumPropertyItem grease_pencil_interpolation_type_items[]
static void grease_pencil_interpolate_sequence_ui(bContext *C, wmOperator *op)
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 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(const bke::CurvesGeometry &from_curves, const bke::CurvesGeometry &to_curves, Span< int > from_curve_indices, Span< int > to_curve_indices, const IndexMask &dst_curve_mask, Span< bool > dst_curve_flip_direction, const float mix_factor, bke::CurvesGeometry &dst_curves)
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(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 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 *))