49#include <fmt/format.h>
58#define OPERATOR_DATA_FILTER \
59 (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_FCURVESONLY | \
60 ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS)
104 void (*segment_function)(
FCurve *fcu,
108 ListBase anim_data = {
nullptr,
nullptr};
117 segment_function(fcu, segment, factor);
137 status.item(str_ofs, ICON_NONE);
150 ListBase anim_data = {
nullptr,
nullptr};
160 if (fcu->
bezt ==
nullptr) {
171 copy->bezt = bezts_copy;
187 ListBase anim_data = {
nullptr,
nullptr};
205 if (fcu->
bezt ==
nullptr) {
219 link_bezt = link_bezt->
next;
249 if (gso ==
nullptr) {
283 ListBase anim_data = {
nullptr,
nullptr};
302 fmt::format(
"{} ({})",
309 switch (event->
type) {
349 if (has_numinput ==
false) {
365 value = value / 100.0f;
434 ListBase anim_data = {
nullptr,
nullptr};
464 status.item(str_ofs, ICON_NONE);
485 const float error_sq_max =
FLT_MAX;
503 return invoke_result;
528 error_sq_max *= error_sq_max;
533 if (factor == 0.0f || error_sq_max == 0.0f) {
568 "Decimate F-Curves by specifying how much they can deviate from the original curve");
580 "Use a percentage to specify how many keyframes you want to remove"},
585 "Use an error margin to specify how much the curve is allowed to deviate from the original "
587 {0,
nullptr, 0,
nullptr,
nullptr},
593 ot->name =
"Decimate Keyframes";
594 ot->idname =
"GRAPH_OT_decimate";
596 "Decimate F-Curves by removing keyframes that influence the curve shape the least";
615 "Which mode to use for decimation");
623 "The ratio of keyframes to remove",
627 "remove_error_margin",
632 "How much the new decimated curve is allowed to deviate from the original",
668 return invoke_result;
678 return invoke_result;
702 ot->name =
"Blend to Neighbor";
703 ot->idname =
"GRAPH_OT_blend_to_neighbor";
704 ot->description =
"Blend selected keyframes to their left or right neighbor";
721 "The blend factor with 0 being the current frame",
755 return invoke_result;
765 return invoke_result;
789 ot->name =
"Breakdown";
790 ot->idname =
"GRAPH_OT_breakdown";
791 ot->description =
"Move selected keyframes to an inbetween position relative to adjacent keys";
808 "Favor either the left or the right key",
821 ListBase anim_data = {
nullptr,
nullptr};
829 if (fcu ==
nullptr || fcu->
bezt ==
nullptr || fcu->
totvert == 0) {
862 return invoke_result;
871 return invoke_result;
895 ot->name =
"Blend to Default Value";
896 ot->idname =
"GRAPH_OT_blend_to_default";
897 ot->description =
"Blend selected keys to their default value from their current position";
914 "How much to blend to the default value",
926 ListBase anim_data = {
nullptr,
nullptr};
956 status.item(str_ofs, ICON_NONE);
962 status.item(
IFACE_(
"Modify Sharpness"), ICON_EVENT_TAB);
965 status.item(
IFACE_(
"Modify Curve Bend"), ICON_EVENT_TAB);
999 switch (event->
type) {
1035 return invoke_result;
1047 return invoke_result;
1071 ot->name =
"Ease Keyframes";
1072 ot->idname =
"GRAPH_OT_ease";
1073 ot->description =
"Align keyframes on a ease-in or ease-out curve";
1090 "Defines if the keys should be aligned on an ease-in or ease-out curve",
1100 "Higher values make the change more abrupt",
1139 return invoke_result;
1149 return invoke_result;
1174 ot->name =
"Blend Offset Keyframes";
1175 ot->idname =
"GRAPH_OT_blend_offset";
1176 ot->description =
"Shift selected keys to the value of the neighboring keys as a block";
1193 "Control which key to offset towards and how far",
1232 return invoke_result;
1243 return invoke_result;
1268 ot->name =
"Blend to Ease Keyframes";
1269 ot->idname =
"GRAPH_OT_blend_to_ease";
1270 ot->description =
"Blends keyframes from current state to an ease-in or ease-out curve";
1287 "Favor either original data or ease curve",
1300 ListBase anim_data = {
nullptr,
nullptr};
1302 bool all_segments_valid =
true;
1318 if (!all_segments_valid) {
1321 ac->
reports,
RPT_WARNING,
"You need at least 2 keys to the right side of the selection");
1325 ac->
reports,
RPT_WARNING,
"You need at least 2 keys to the left side of the selection");
1356 return invoke_result;
1367 return invoke_result;
1393 ot->name =
"Match Slope";
1394 ot->idname =
"GRAPH_OT_match_slope";
1395 ot->description =
"Blend selected keys to the slope of neighboring ones";
1412 "Defines which keys to use as slope and how much to blend towards them",
1449 return invoke_result;
1462 return invoke_result;
1487 ot->name =
"Time Offset Keyframes";
1488 ot->idname =
"GRAPH_OT_time_offset";
1489 ot->description =
"Shifts the value of selected keys in time";
1506 "How far in frames to offset the animation",
1522 "Shear the keys using the left key as reference"},
1527 "Shear the keys using the right key as reference"},
1528 {0,
nullptr, 0,
nullptr,
nullptr},
1533 ListBase anim_data = {
nullptr,
nullptr};
1562 status.item(str_ofs, ICON_NONE);
1567 fmt::format(
"{} ({})",
1595 switch (event->
type) {
1617 return invoke_result;
1629 return invoke_result;
1655 ot->name =
"Shear Keyframes";
1656 ot->idname =
"GRAPH_OT_shear";
1658 "Affect the value of the keys linearly, keeping the same relationship between them using "
1659 "either the left or the right key as reference";
1676 "The amount of shear to apply",
1685 "Which end of the segment to use as a reference to shear from");
1715 return invoke_result;
1725 return invoke_result;
1750 ot->name =
"Scale Average Keyframes";
1751 ot->idname =
"GRAPH_OT_scale_average";
1752 ot->description =
"Scale selected key values by their combined average";
1769 "The scale factor applied to the curve segments",
1805 "Smooth FCurve original values");
1806 for (
int i = 0;
i < segment->length;
i++) {
1807 original_y_values[
i] = fcu->
bezt[
i + segment->start_index].
vec[1][1];
1809 return original_y_values;
1813 const int filter_width,
1817 const int kernel_size = filter_width + 1;
1820 operator_data->
kernel = kernel;
1822 ListBase anim_data = {
nullptr,
nullptr};
1826 ListBase segment_links = {
nullptr,
nullptr};
1832 segment_link->
fcu = fcu;
1833 segment_link->
segment = segment;
1836 BezTriple right_bezt = fcu->
bezt[segment->start_index + segment->length - 1];
1837 const int sample_count = int(right_bezt.
vec[1][0] - left_bezt.
vec[1][0]) +
1838 (filter_width * 2 + 1);
1841 fcu, left_bezt.
vec[1][0] - filter_width, 1, samples, sample_count);
1842 segment_link->
samples = samples;
1859 MEM_freeN(segment_link->original_y_values);
1886 segment->original_y_values,
1888 segment->sample_count,
1907 return invoke_result;
1924 return invoke_result;
1930 const int filter_width)
1932 ListBase anim_data = {
nullptr,
nullptr};
1942 BezTriple right_bezt = fcu->
bezt[segment->start_index + segment->length - 1];
1943 const int sample_count = int(right_bezt.
vec[1][0] - left_bezt.
vec[1][0]) +
1944 (filter_width * 2 + 1);
1948 fcu, left_bezt.
vec[1][0] - filter_width, 1, samples, sample_count);
1950 fcu, segment, original_y_values, samples, sample_count, factor, filter_width, kernel);
1972 const int kernel_size = filter_width + 1;
1989 ot->name =
"Gaussian Smooth";
1990 ot->idname =
"GRAPH_OT_gaussian_smooth";
1991 ot->description =
"Smooth the curve using a Gaussian filter";
2008 "How much to blend to the default value",
2018 "The shape of the gaussian distribution, lower values make it sharper",
2028 "How far to each side the operator will average the key values",
2046 const int filter_order,
2047 const int samples_per_frame)
2051 const int sample_count = (int(right_bezt->
vec[1][0] - left_bezt->
vec[1][0]) + 1 +
2052 (filter_order * 2)) *
2055 return sample_count;
2059 const int filter_order,
2060 const int samples_per_frame)
2066 ListBase anim_data = {
nullptr,
nullptr};
2070 ListBase segment_links = {
nullptr,
nullptr};
2078 segment_link->
fcu = fcu;
2079 segment_link->
segment = segment;
2081 BezTriple right_bezt = fcu->
bezt[segment->start_index + segment->length - 1];
2083 &right_bezt, &left_bezt, filter_order, samples_per_frame);
2086 fcu, left_bezt.
vec[1][0] - filter_order, samples_per_frame, samples, sample_count);
2087 segment_link->
samples = samples;
2126 const int samples_per_frame =
RNA_int_get(op->
ptr,
"samples_per_frame");
2127 const float sampling_frequency = frame_rate * samples_per_frame;
2133 cutoff_frequency, sampling_frequency, operator_data->
coefficients);
2139 segment->sample_count,
2159 return invoke_result;
2167 const int samples_per_frame =
RNA_int_get(op->
ptr,
"samples_per_frame");
2173 const float sampling_frequency = frame_rate * samples_per_frame;
2182 return invoke_result;
2187 const int blend_in_out,
2188 float cutoff_frequency,
2189 const int filter_order,
2190 const int samples_per_frame)
2192 ListBase anim_data = {
nullptr,
nullptr};
2199 const float sampling_frequency = frame_rate * samples_per_frame;
2201 cutoff_frequency =
min_ff(cutoff_frequency, sampling_frequency / 2);
2210 BezTriple right_bezt = fcu->
bezt[segment->start_index + segment->length - 1];
2212 &right_bezt, &left_bezt, filter_order, samples_per_frame);
2215 fcu, left_bezt.
vec[1][0] - filter_order, samples_per_frame, samples, sample_count);
2217 fcu, segment, samples, sample_count, factor, blend_in_out, samples_per_frame, bw_coeff);
2240 const int samples_per_frame =
RNA_int_get(op->
ptr,
"samples_per_frame");
2243 &ac,
blend, blend_in_out, cutoff_frequency, filter_order, samples_per_frame);
2254 ot->name =
"Butterworth Smooth";
2255 ot->idname =
"GRAPH_OT_butterworth_smooth";
2256 ot->description =
"Smooth an F-Curve while maintaining the general shape of the curve";
2272 "Frequency Cutoff (Hz)",
2273 "Lower values give a smoother curve",
2283 "Higher values produce a harder frequency cutoff",
2288 "samples_per_frame",
2292 "Samples per Frame",
2293 "How many samples to calculate per frame, helps with subframe data",
2303 "How much to blend to the smoothed curve",
2313 "Linearly blend the smooth data to the border frames of the selection",
2346 return invoke_result;
2356 return invoke_result;
2381 ot->name =
"Push Pull Keyframes";
2382 ot->idname =
"GRAPH_OT_push_pull";
2383 ot->description =
"Exaggerate or minimize the value of the selected keys";
2400 "Control how far to push or pull the keys",
2413 {0,
nullptr, 0,
nullptr,
nullptr},
2420 ListBase anim_data = {
nullptr,
nullptr};
2451 status.item(str_ofs, ICON_NONE);
2458 status.item(fmt::format(
"{} ({})",
2488 switch (event->
type) {
2527 return invoke_result;
2553 ot->name =
"Scale from Neighbor";
2554 ot->idname =
"GRAPH_OT_scale_from_neighbor";
2556 "Increase or decrease the value of selected keys in relationship to the neighboring one";
2573 "The factor to scale keys with",
2582 "Which end of the segment to use as a reference to scale from");
Functions to modify FCurves.
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float min_ff(float a, float b)
void DEG_id_tag_update(ID *id, unsigned int flags)
#define ANIM_UPDATE_DEFAULT
void ED_area_status_text(ScrArea *area, const char *str)
void ED_slider_init(tSlider *slider, const wmEvent *event)
void ED_slider_allow_overshoot_set(tSlider *slider, bool lower, bool upper)
SliderMode ED_slider_mode_get(const tSlider *slider)
void ED_slider_unit_set(tSlider *slider, const char *unit)
void ED_slider_mode_set(tSlider *slider, SliderMode mode)
void ED_slider_property_label_set(tSlider *slider, const char *property_label)
void ED_slider_destroy(bContext *C, tSlider *slider)
void ED_slider_increment_step_set(tSlider *slider, float increment_step)
tSlider * ED_slider_create(bContext *C)
bool ED_slider_modal(tSlider *slider, const wmEvent *event)
void ED_slider_status_get(const tSlider *slider, WorkspaceStatus &status)
void ED_slider_factor_bounds_set(tSlider *slider, float factor_bound_lower, float factor_bound_upper)
float ED_slider_factor_get(const tSlider *slider)
void ED_slider_factor_set(tSlider *slider, float factor)
Read Guarded memory(de)allocation.
void ANIM_animdata_freelist(ListBase *anim_data)
void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data)
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, void *data, const eAnimCont_Types datatype)
BMesh const char void * data
bool graphop_editable_keyframes_poll(bContext *C)
static wmOperatorStatus breakdown_exec(bContext *C, wmOperator *op)
static void blend_offset_modal_update(bContext *C, wmOperator *op)
static const EnumPropertyItem scale_anchor_items[]
static wmOperatorStatus match_slope_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus scale_average_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus push_pull_exec(bContext *C, wmOperator *op)
void GRAPH_OT_butterworth_smooth(wmOperatorType *ot)
static void match_slope_modal_update(bContext *C, wmOperator *op)
static void match_slope_graph_keys(bAnimContext *ac, const float factor)
static bool decimate_poll_property(const bContext *, wmOperator *op, const PropertyRNA *prop)
static void reset_bezts(tGraphSliderOp *gso)
static wmOperatorStatus time_offset_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void blend_to_ease_modal_update(bContext *C, wmOperator *op)
static void btw_smooth_allocate_operator_data(tGraphSliderOp *gso, const int filter_order, const int samples_per_frame)
static wmOperatorStatus shear_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus blend_to_default_exec(bContext *C, wmOperator *op)
static void ease_modal_update(bContext *C, wmOperator *op)
void GRAPH_OT_time_offset(wmOperatorType *ot)
static void gaussian_smooth_free_operator_data(void *operator_data)
void GRAPH_OT_blend_to_neighbor(wmOperatorType *ot)
static wmOperatorStatus graph_slider_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void blend_to_ease_draw_status_header(bContext *C, tGraphSliderOp *gso)
void GRAPH_OT_blend_to_ease(wmOperatorType *ot)
static std::string decimate_get_description(bContext *, wmOperatorType *, PointerRNA *ptr)
static const EnumPropertyItem decimate_mode_items[]
static void common_draw_status_header(bContext *C, tGraphSliderOp *gso)
static wmOperatorStatus shear_exec(bContext *C, wmOperator *op)
static wmOperatorStatus scale_average_exec(bContext *C, wmOperator *op)
static wmOperatorStatus scale_from_neighbor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void scale_from_neighbor_draw_status_header(bContext *C, wmOperator *op)
static wmOperatorStatus gaussian_smooth_exec(bContext *C, wmOperator *op)
static void ease_graph_keys(bAnimContext *ac, const float factor, const float width)
static void blend_to_default_modal_update(bContext *C, wmOperator *op)
static void push_pull_modal_update(bContext *C, wmOperator *op)
static void shear_modal_update(bContext *C, wmOperator *op)
static wmOperatorStatus btw_smooth_exec(bContext *C, wmOperator *op)
static wmOperatorStatus breakdown_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void scale_average_graph_keys(bAnimContext *ac, const float factor)
static wmOperatorStatus match_slope_exec(bContext *C, wmOperator *op)
static wmOperatorStatus btw_smooth_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static const EnumPropertyItem shear_direction_items[]
static void btw_smooth_modal_update(bContext *C, wmOperator *op)
#define OPERATOR_DATA_FILTER
static wmOperatorStatus blend_to_ease_exec(bContext *C, wmOperator *op)
void GRAPH_OT_gaussian_smooth(wmOperatorType *ot)
static wmOperatorStatus gaussian_smooth_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void GRAPH_OT_blend_offset(wmOperatorType *ot)
static void decimate_modal_update(bContext *C, wmOperator *op)
static void shear_graph_keys(bAnimContext *ac, const float factor, tShearDirection direction)
static void apply_fcu_segment_function(bAnimContext *ac, const float factor, void(*segment_function)(FCurve *fcu, FCurveSegment *segment, const float factor))
static wmOperatorStatus graph_slider_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void scale_average_modal_update(bContext *C, wmOperator *op)
static wmOperatorStatus ease_exec(bContext *C, wmOperator *op)
static int btw_calculate_sample_count(const BezTriple *right_bezt, const BezTriple *left_bezt, const int filter_order, const int samples_per_frame)
void GRAPH_OT_breakdown(wmOperatorType *ot)
static wmOperatorStatus decimate_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static float slider_factor_get_and_remember(wmOperator *op)
static void blend_to_default_graph_keys(bAnimContext *ac, const float factor)
static float * back_up_key_y_values(const FCurveSegment *segment, const FCurve *fcu)
static wmOperatorStatus push_pull_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void match_slope_draw_status_header(bContext *C, tGraphSliderOp *gso)
static void time_offset_modal_update(bContext *C, wmOperator *op)
static wmOperatorStatus decimate_exec(bContext *C, wmOperator *op)
static void breakdown_modal_update(bContext *C, wmOperator *op)
static void blend_offset_graph_keys(bAnimContext *ac, const float factor)
void GRAPH_OT_push_pull(wmOperatorType *ot)
static void shear_draw_status_header(bContext *C, tGraphSliderOp *gso, tShearDirection direction)
static wmOperatorStatus scale_from_neighbor_exec(bContext *C, wmOperator *op)
static void gaussian_smooth_allocate_operator_data(tGraphSliderOp *gso, const int filter_width, const float sigma)
static void btw_smooth_graph_keys(bAnimContext *ac, const float factor, const int blend_in_out, float cutoff_frequency, const int filter_order, const int samples_per_frame)
static void blend_to_neighbor_graph_keys(bAnimContext *ac, const float factor)
static wmOperatorStatus blend_offset_exec(bContext *C, wmOperator *op)
static void blend_to_neighbor_modal_update(bContext *C, wmOperator *op)
void GRAPH_OT_scale_average(wmOperatorType *ot)
static wmOperatorStatus time_offset_exec(bContext *C, wmOperator *op)
static wmOperatorStatus blend_to_ease_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void GRAPH_OT_match_slope(wmOperatorType *ot)
static void gaussian_smooth_modal_update(bContext *C, wmOperator *op)
static wmOperatorStatus blend_to_default_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void decimate_graph_keys(bAnimContext *ac, float factor, float error_sq_max)
void GRAPH_OT_decimate(wmOperatorType *ot)
void GRAPH_OT_ease(wmOperatorType *ot)
static void ease_draw_status_header(bContext *C, wmOperator *op)
static void breakdown_graph_keys(bAnimContext *ac, float factor)
static wmOperatorStatus ease_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void blend_offset_draw_status_header(bContext *C, tGraphSliderOp *gso)
static void blend_to_ease_graph_keys(bAnimContext *ac, const float factor)
static wmOperatorStatus ease_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus shear_modal(bContext *C, wmOperator *op, const wmEvent *event)
void GRAPH_OT_scale_from_neighbor(wmOperatorType *ot)
void GRAPH_OT_shear(wmOperatorType *ot)
static wmOperatorStatus blend_to_neighbor_exec(bContext *C, wmOperator *op)
void GRAPH_OT_blend_to_default(wmOperatorType *ot)
static void graph_slider_exit(bContext *C, wmOperator *op)
static wmOperatorStatus blend_offset_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void push_pull_graph_keys(bAnimContext *ac, const float factor)
static void store_original_bezt_arrays(tGraphSliderOp *gso)
static void time_offset_draw_status_header(bContext *C, tGraphSliderOp *gso)
static void update_depsgraph(tGraphSliderOp *gso)
static void decimate_draw_status(bContext *C, tGraphSliderOp *gso)
static void scale_from_neighbor_modal_update(bContext *C, wmOperator *op)
static wmOperatorStatus blend_to_neighbor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void btw_smooth_free_operator_data(void *operator_data)
static void time_offset_graph_keys(bAnimContext *ac, const float factor)
static void scale_from_neighbor_graph_keys(bAnimContext *ac, const float factor, const FCurveSegmentAnchor anchor)
static void gaussian_smooth_graph_keys(bAnimContext *ac, const float factor, double *kernel, const int filter_width)
static wmOperatorStatus scale_from_neighbor_modal(bContext *C, wmOperator *op, const wmEvent *event)
void smooth_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float *original_values, float *samples, const int sample_count, const float factor, const int kernel_size, const double *kernel)
void ED_anim_calculate_butterworth_coefficients(const float cutoff_frequency, const float sampling_frequency, ButterworthCoefficients *bw_coeff)
void butterworth_smooth_fcurve_segment(FCurve *fcu, FCurveSegment *segment, float *samples, const int sample_count, const float factor, const int blend_in_out, const int sample_rate, ButterworthCoefficients *bw_coeff)
bool decimate_fcurve(bAnimListElem *ale, float remove_ratio, float error_sq_max)
void breakdown_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
void ease_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor, const float width)
ButterworthCoefficients * ED_anim_allocate_butterworth_coefficients(const int filter_order)
void time_offset_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float frame_offset)
void ED_ANIM_get_1d_gauss_kernel(const float sigma, const int kernel_size, double *r_kernel)
void scale_average_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
void blend_offset_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
void shear_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor, tShearDirection direction)
void blend_to_ease_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
bool match_slope_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
void push_pull_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
void blend_to_default_fcurve(PointerRNA *id_ptr, FCurve *fcu, const float factor)
ListBase find_fcurve_segments(FCurve *fcu)
void scale_from_fcurve_segment_neighbor(FCurve *fcu, FCurveSegment *segment, const float factor, const FCurveSegmentAnchor anchor)
void blend_to_neighbor_fcurve_segment(FCurve *fcu, FCurveSegment *segment, const float factor)
void ED_anim_free_butterworth_coefficients(ButterworthCoefficients *bw_coeff)
void * MEM_mallocN(size_t len, const char *str)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void sample_fcurve_segment(const FCurve *fcu, float start_frame, float sample_rate, float *samples, int sample_count)
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
const char * RNA_property_ui_name(const PropertyRNA *prop, const PointerRNA *ptr)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
int RNA_enum_get(PointerRNA *ptr, const char *name)
const char * RNA_property_identifier(const PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
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_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)
ButterworthCoefficients * coefficients
float * original_y_values
tFCurveSegmentLink * prev
tFCurveSegmentLink * next
PropertyRNA * factor_prop
void(* modal_update)(bContext *, wmOperator *)
void(* free_operator_data)(void *operator_data)
struct ReportList * reports
struct wmOperatorType * type
static int blend(const Tex *tex, const float texvec[3], TexResult *texres)
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)
#define ISKEYMODIFIER(event_type)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)