80 const bool include_handles,
84 const bool fcu_selection_only =
false;
86 fcu, fcu_selection_only, include_handles, range, r_bounds);
97 r_bounds->
ymin = (r_bounds->
ymin + offset) * unit_fac;
98 r_bounds->
ymax = (r_bounds->
ymax + offset) * unit_fac;
100 const float min_height = 0.01f;
102 if (height < min_height) {
103 r_bounds->
ymin -= (min_height - height) / 2;
104 r_bounds->
ymax += (min_height - height) / 2;
114 bool found_start =
false;
118 if (gpf->framenum < range[0]) {
121 if (gpf->framenum > range[1]) {
125 start_frame = gpf->framenum;
128 end_frame = gpf->framenum;
130 r_bounds->
xmin = start_frame;
131 r_bounds->
xmax = end_frame;
139 const float range[2],
143 const Layer &layer = gplayer->wrap();
145 bool found_start =
false;
149 for (
const FramesMapKeyT key : layer.sorted_keys()) {
150 if (key < range[0]) {
153 if (key > range[1]) {
163 r_bounds->
xmin = start_frame;
164 r_bounds->
xmax = end_frame;
173 const float range[2],
174 const bool include_handles,
177 bool found_bounds =
false;
193 fcu, anim_data, ac->
sl, ac->
scene, ale->
id, include_handles, range, r_bounds);
241 ListBase anim_data = {
nullptr,
nullptr};
253 if (channel_type != ale->
type) {
338 switch (channel_type) {
385 if (ale && ale->
adt) {
457 return grease_pencil->is_layer_active(
492 const bool change_active)
522 ListBase anim_data = {
nullptr,
nullptr};
651 switch (selectmode) {
653 selectable_thing.set_selected(!selectable_thing.is_selected());
656 selectable_thing.set_selected(
true);
669 selectable_thing.set_selected(
false);
717 agrp->
flag &= ~AGRP_ACTIVE;
729 fcu->
flag &= ~FCURVE_ACTIVE;
743 nlt->
flag &= ~NLATRACK_ACTIVE;
779 ale->adt->flag &= ~ADT_UI_ACTIVE;
786 Layer *layer =
static_cast<Layer *
>(ale->data);
845 const int matchLevel)
870 int prevLevel = matchLevel;
875 if (acf ==
nullptr) {
884 if (level == prevLevel) {
889 if (level > prevLevel) {
891 if (prevLevel == 0) {
916 const int matchLevel)
923 if (acf ==
nullptr) {
935 if (level > matchLevel) {
959 if (
ELEM(
nullptr, anim_data, anim_data->
first)) {
970 if ((ale->data == ale_setting->
data) && (ale->type == ale_setting->
type)) {
974 if (ale->id == ale_setting->
id) {
980 if (match ==
nullptr) {
981 printf(
"ERROR: no channel matching the one changed was found\n");
987 if (acf ==
nullptr) {
988 printf(
"ERROR: no channel info for the changed channel\n");
1007 if (!window_region) {
1011 ListBase anim_data = {
nullptr,
nullptr};
1022 const bool include_handles =
false;
1030 rctf channel_bounds;
1032 ac, ale, frame_range, include_handles, &channel_bounds);
1122 {0,
nullptr, 0,
nullptr,
nullptr},
1303 const bool is_hidden)
1307 bool is_sel =
false, is_untouchable =
false;
1339 "rearrange_animchannel_add_to_islands(): don't know how to handle channels of type %d\n",
1346 (island ==
nullptr) ||
1363 if (is_untouchable) {
1401 ListBase anim_data = {
nullptr,
nullptr};
1410 if (ale->type != type) {
1427 *anim_data_visible = anim_data;
1437 ListBase islands = {
nullptr,
nullptr};
1438 Link *channel, *chanNext =
nullptr;
1447 for (channel =
static_cast<Link *
>(list->first); channel; channel = chanNext) {
1449 const bool is_hidden =
1451 chanNext = channel->
next;
1462 if (islands.first != islands.last) {
1464 (mode > 0) ? islands.last : islands.first);
1467 for (island = first; island; island = isn) {
1468 isn = (mode > 0) ? island->
prev : island->
next;
1471 if (rearrange_func(&islands, island)) {
1494 ListBase anim_data_visible = {
nullptr,
nullptr};
1502 if (rearrange_func ==
nullptr) {
1512 ListBase extracted_nonlocal_nla_tracks = {
nullptr,
nullptr};
1513 if (is_liboverride) {
1516 nla_track = nla_track->
next)
1522 if (nla_track !=
nullptr && nla_track->
prev !=
nullptr) {
1524 extracted_nonlocal_nla_tracks.
last = nla_track->
prev;
1527 nla_track->
prev =
nullptr;
1544 extracted_nonlocal_nla_tracks.
last);
1563 ListBase anim_data_visible = {
nullptr,
nullptr};
1565 if (rearrange_func ==
nullptr) {
1592 if (act ==
nullptr) {
1600 FCurve *
const group_fcurves_first =
static_cast<FCurve *
>(agrp->channels.first);
1601 FCurve *
const group_fcurves_last =
static_cast<FCurve *
>(agrp->channels.last);
1602 if (group_fcurves_first ==
nullptr) {
1613 group_fcurves_first->
prev->
next = group_fcurves_last->
next;
1616 if (group_fcurves_last == act->
curves.
last) {
1622 group_fcurves_last->
next->
prev = group_fcurves_first->
prev;
1626 group_fcurves_first->
prev = group_fcurves_last->
next =
nullptr;
1638 fcu->
prev =
nullptr;
1644 fcu->
next =
nullptr;
1665 const ListBase group_channels = agrp->channels;
1667 agrp->channels = group_channels;
1670 agrp->flag &= ~AGRP_MOVED;
1708 ListBase anim_data_visible = {
nullptr,
nullptr};
1726 const int group_index = bag.
channel_groups().first_index_try(group);
1727 const int to_index = group_index - 1;
1764 const int group_index = bag.
channel_groups().first_index_try(group);
1765 const int to_index = group_index + 1;
1819 ListBase anim_data_visible = {
nullptr,
nullptr};
1838 return *fcurve->
grp;
1842 fcurve_ale->slot_handle);
1847 group.fcurve_range_start = 0;
1852 group.fcurve_range_length = bag->
fcurves().size() - group.fcurve_range_start;
1873 if (should_skip(*fcurve, group)) {
1878 const int fcurve_index = bag.
fcurves().first_index_try(fcurve);
1879 const int to_index = fcurve_index - 1;
1885 if (to_index < group.fcurve_range_start ||
SEL_FCU(bag.
fcurve(to_index))) {
1900 if (should_skip(*fcurve, group)) {
1905 bag.
fcurve_move(*fcurve, group.fcurve_range_start);
1916 if (should_skip(*fcurve, group)) {
1921 const int fcurve_index = bag.
fcurves().first_index_try(fcurve);
1922 const int to_index = fcurve_index + 1;
1928 if (to_index >= group.fcurve_range_start + group.fcurve_range_length ||
1945 if (should_skip(*fcurve, group)) {
1950 bag.
fcurve_move(*fcurve, group.fcurve_range_start + group.fcurve_range_length - 1);
1973 ListBase anim_data_visible = {
nullptr,
nullptr};
1979 if (rearrange_func ==
nullptr) {
2008 &agrp->channels, rearrange_func, mode,
ANIMTYPE_FCURVE, &anim_data_visible);
2026 ListBase anim_data_visible = {
nullptr,
nullptr};
2031 if (rearrange_func ==
nullptr) {
2060 ListBase anim_data = {
nullptr,
nullptr};
2070 Layer *layer =
static_cast<Layer *
>(ale->data);
2071 if (layer->is_selected()) {
2072 grease_pencil.move_node_top(layer->as_node());
2079 Layer *layer =
static_cast<Layer *
>(ale->data);
2083 if (layer->is_selected()) {
2084 grease_pencil.move_node_up(layer->as_node());
2089 if (layer->is_selected()) {
2090 grease_pencil.move_node_down(layer->as_node());
2095 if (layer->is_selected()) {
2096 grease_pencil.move_node_bottom(layer->as_node());
2111 ListBase anim_data = {
nullptr,
nullptr};
2117 if (rearrange_func ==
nullptr) {
2133 ListBase anim_data_visible = {
nullptr,
nullptr};
2183 printf(
"Mask does not supported for moving yet\n");
2190 ListBase anim_data = {
nullptr,
nullptr};
2223 printf(
"Animdata has no action\n");
2240 printf(
"Animdata has no action\n");
2261 ot->
name =
"Move Channels";
2262 ot->
idname =
"ANIM_OT_channels_move";
2301 switch (area->spacetype) {
2340 if (act ==
nullptr) {
2345 ListBase anim_data = {
nullptr,
nullptr};
2350 if (anim_data.
first ==
nullptr) {
2405 if (channelbag != last_channelbag) {
2406 last_channelbag = channelbag;
2432 ListBase anim_data = {
nullptr,
nullptr};
2458 ot->
name =
"Group Channels";
2459 ot->
idname =
"ANIM_OT_channels_group";
2476 "Name of newly created group");
2491 ListBase anim_data = {
nullptr,
nullptr};
2510 if (fcu->
grp ==
nullptr) {
2515 if (!ale->adt || !ale->adt->action) {
2518 bAction *act = ale->adt->action;
2551 ot->
name =
"Ungroup Channels";
2552 ot->
idname =
"ANIM_OT_channels_ungroup";
2553 ot->
description =
"Remove selected F-Curves from their current groups";
2576 if (adt !=
nullptr) {
2578 if (adt->
action !=
nullptr) {
2592 ListBase anim_data = {
nullptr,
nullptr};
2618 switch (ale->type) {
2623 "fcurve_owner_id should be an Action");
2626 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
2640 if (adt ==
nullptr || adt->
action ==
nullptr) {
2684 for (
int i = 0; i < fcurve_range_length; i++) {
2754 switch (ale->type) {
2771 strip->
flag &= ~NLASTRIP_FLAG_USR_TIME;
2774 strip->
flag &= ~NLASTRIP_FLAG_USR_INFLUENCE;
2777 printf(
"ERROR: Trying to delete NLA Control Curve for unknown property '%s'\n",
2801 scene->gpd =
nullptr;
2811 Layer *layer =
static_cast<Layer *
>(ale->data);
2812 grease_pencil->remove_layer(*layer);
2885 ot->
name =
"Delete Channels";
2886 ot->
idname =
"ANIM_OT_channels_delete";
2909 {0,
nullptr, 0,
nullptr,
nullptr},
2917 {0,
nullptr, 0,
nullptr,
nullptr},
2936 ListBase anim_data = {
nullptr,
nullptr};
2937 ListBase all_data = {
nullptr,
nullptr};
3050 ot->
name =
"Enable Channel Setting";
3051 ot->
idname =
"ANIM_OT_channels_setting_enable";
3052 ot->
description =
"Enable specified setting on all selected animation channels";
3076 ot->
name =
"Disable Channel Setting";
3077 ot->
idname =
"ANIM_OT_channels_setting_disable";
3078 ot->
description =
"Disable specified setting on all selected animation channels";
3102 ot->
name =
"Toggle Channel Setting";
3103 ot->
idname =
"ANIM_OT_channels_setting_toggle";
3104 ot->
description =
"Toggle specified setting on all selected animation channels";
3128 ot->
name =
"Toggle Channel Editability";
3129 ot->
idname =
"ANIM_OT_channels_editable_toggle";
3130 ot->
description =
"Toggle editability of selected channels";
3158 bool onlysel =
true;
3182 ot->
name =
"Expand Channels";
3183 ot->
idname =
"ANIM_OT_channels_expand";
3184 ot->
description =
"Expand (open) all selected expandable animation channels";
3195 ot->
srna,
"all",
true,
"All",
"Expand all channels (not just selected ones)");
3207 bool onlysel =
true;
3231 ot->
name =
"Collapse Channels";
3232 ot->
idname =
"ANIM_OT_channels_collapse";
3233 ot->
description =
"Collapse (close) all selected expandable animation channels";
3244 ot->
srna,
"all",
true,
"All",
"Collapse all channels (not just selected ones)");
3268 ListBase anim_data = {
nullptr,
nullptr};
3286 bool action_empty =
false;
3287 bool nla_empty =
false;
3288 bool drivers_empty =
false;
3291 BLI_assert((
id !=
nullptr) && (adt !=
nullptr));
3298 action_empty =
true;
3311 if (nlt->strips.first) {
3318 if (nlt->strips.first ==
nullptr) {
3329 if (action_empty && nla_empty && drivers_empty) {
3347 ot->
name =
"Remove Empty Animation Data";
3348 ot->
idname =
"ANIM_OT_channels_clean_empty";
3349 ot->
description =
"Delete all empty animation data containers from visible data-blocks";
3387 ListBase anim_data = {
nullptr,
nullptr};
3405 fcu->
flag &= ~FCURVE_DISABLED;
3428 ot->
name =
"Revive Disabled F-Curves";
3429 ot->
idname =
"ANIM_OT_channels_fcurves_enable";
3430 ot->
description =
"Clear 'disabled' tag from all F-Curves to get broken F-Curves working again";
3451 if (area ==
nullptr) {
3505 ot->
name =
"Filter Channels";
3506 ot->
idname =
"ANIM_OT_channels_select_filter";
3508 "Start entering text which filters the set of channels shown to only include those with "
3562 ot->
idname =
"ANIM_OT_channels_select_all";
3563 ot->
description =
"Toggle selection of all animation channels";
3584 ListBase anim_data = {
nullptr,
nullptr};
3626 if (ymax >= rectf.
ymin && ymin <= rectf.
ymax) {
3632 switch (ale->type) {
3637 agrp->
flag &= ~AGRP_ACTIVE;
3651 Slot *slot =
static_cast<Slot *
>(ale->data);
3715 short selectmode = 0;
3751 ot->
idname =
"ANIM_OT_channels_select_box";
3752 ot->
description =
"Select all animation channels within the specified region";
3779 ListBase anim_data = {
nullptr,
nullptr};
3783 bool success =
false;
3796 if (ale ==
nullptr) {
3799 printf(
"Error: animation channel (index = %d) not found in rename_anim_channels()\n",
3814 if (ale->
id !=
nullptr) {
3822 switch (ale->
type) {
3900 return channel_index;
3928 ot->
name =
"Rename Channel";
3929 ot->
idname =
"ANIM_OT_channels_rename";
3946 const short selectmode)
3972 bool is_active_found =
false;
3975 if (ale->type != type) {
3979 if (is_active_found) {
3985 return is_active_found;
3992 bool in_selection_range =
false;
3997 if (ale->type != cursor_elem->
type) {
4001 const bool is_cursor_elem = (ale->data == cursor_elem->
data);
4006 if (is_active_elem || is_cursor_elem) {
4009 in_selection_range = !in_selection_range;
4014 else if (in_selection_range) {
4022 if (is_active_elem && is_cursor_elem) {
4035 const short selectmode)
4050 object::base_select(base, object::BA_INVERT);
4066 object::base_select(
b, object::BA_DESELECT);
4067 if (
b->object->adt) {
4073 object::base_select(base, object::BA_SELECT);
4083 object::base_activate_with_mode_exit_if_needed(C, base);
4095 const short selectmode)
4097 if (ale->
adt ==
nullptr) {
4126 const short selectmode,
4167 else if (selectmode == -1) {
4229 const short selectmode,
4269 "fcurve_owner_id of an Action Slot should be an Action");
4277 switch (selectmode) {
4302 const short selectmode)
4350 const short selectmode,
4420 const short selectmode,
4424 Layer *layer =
static_cast<Layer *
>(ale->
data);
4428 layer->set_selected(!layer->is_selected());
4436 layer->set_selected(
true);
4441 grease_pencil->set_active_layer(layer);
4466 const short selectmode)
4486 const int channel_index,
4489 ListBase anim_data = {
nullptr,
nullptr};
4492 int notifierFlags = 0;
4506 if (ale ==
nullptr) {
4509 printf(
"Error: animation channel (index = %d) not found in mouse_anim_channels()\n",
4535 switch (ale->
type) {
4606 printf(
"Error: Invalid channel type in mouse_anim_channels()\n");
4615 return notifierFlags;
4631 int notifierFlags = 0;
4686 ot->
name =
"Mouse Click on Channels";
4687 ot->
idname =
"ANIM_OT_channels_click";
4688 ot->
description =
"Handle mouse clicks over animation channels";
4708 "Selection of active channel to clicked channel");
4718 ListBase anim_data = {
nullptr,
nullptr};
4721 bool success =
false;
4734 if (ale ==
nullptr) {
4737 printf(
"Error: animation channel (index = %d) not found in rename_anim_channels()\n",
4752 success = (fcu !=
nullptr);
4757 if (fcu && fcu->
bezt) {
4767 if (fcu_inner !=
nullptr && fcu_inner->
bezt !=
nullptr) {
4768 for (i = 0, bezt = fcu_inner->
bezt; i < fcu_inner->
totvert; i++, bezt++) {
4769 bezt->
f2 = bezt->
f1 = bezt->
f3 = 0;
4777 for (i = 0, bezt = fcu->
bezt; i < fcu->
totvert; i++, bezt++) {
4817 ot->
name =
"Select Channel Keyframes";
4818 ot->
idname =
"ANIM_OT_channel_select_keys";
4819 ot->
description =
"Select all keyframes of channel under mouse";
4840 r_range[0] = scene->r.psfra;
4841 r_range[1] = scene->r.pefra;
4844 r_range[0] = scene->r.sfra;
4845 r_range[1] = scene->r.efra;
4859 if (!window_region) {
4863 ListBase anim_data = {
nullptr,
nullptr};
4869 if (anim_data_length == 0) {
4886 bool valid_bounds =
false;
4888 rctf channel_bounds;
4890 &ac, ale, range, include_handles, &channel_bounds);
4893 valid_bounds =
true;
4897 if (!valid_bounds) {
4926 ot->
name =
"Frame Selected Channels";
4927 ot->
idname =
"ANIM_OT_channels_view_selected";
4928 ot->
description =
"Reset viewable area to show the selected channels";
4940 "Include handles of keyframes when calculating extents");
4943 "use_preview_range",
4945 "Use Preview Range",
4946 "Ignore frames outside of the preview range");
4959 if (!window_region) {
4963 ListBase anim_data = {
nullptr,
nullptr};
4972 if (ale ==
nullptr) {
4986 if (!found_bounds) {
5010 ot->
name =
"Frame Channel Under Cursor";
5011 ot->
idname =
"ANIM_OT_channel_view_pick";
5012 ot->
description =
"Reset viewable area to show the channel under the cursor";
5024 "Include handles of keyframes when calculating extents");
5027 "use_preview_range",
5029 "Use Preview Range",
5030 "Ignore frames outside of the preview range");
5034 {
BEZT_IPO_BEZ,
"BEZIER", 0,
"Bézier",
"New keys will be Bézier"},
5035 {
BEZT_IPO_LIN,
"LIN", 0,
"Linear",
"New keys will be linear"},
5036 {
BEZT_IPO_CONST,
"CONST", 0,
"Constant",
"New keys will be constant"},
5037 {0,
nullptr, 0,
nullptr,
nullptr},
5050 ListBase anim_data = {
nullptr,
nullptr};
5056 if (anim_data_length == 0) {
5068 if (frame_range[1] < frame_range[0]) {
5069 frame_range[1] = frame_range[0];
5072 if (frame_range[0] == 0 && frame_range[1] == 0) {
5074 frame_range = {scene->r.psfra, scene->r.pefra};
5077 frame_range = {scene->r.sfra, scene->r.efra};
5083 const BakeCurveRemove remove_existing = remove_outside_range ? BakeCurveRemove::ALL :
5084 BakeCurveRemove::IN_RANGE;
5085 const int interpolation_type =
RNA_enum_get(op->
ptr,
"interpolation_type");
5099 if (!bake_modifiers) {
5101 modifier_flags.
append(modifier->flag);
5108 fcu->
bezt, nla_mapped_range[1], fcu->
totvert, &replace);
5115 bake_fcurve(fcu, nla_mapped_range, step, remove_existing);
5117 if (bake_modifiers) {
5121 int modifier_index = 0;
5123 modifier->flag = modifier_flags[modifier_index];
5128 for (
int i = 0; i < fcu->
totvert; i++) {
5130 if (key->
vec[1][0] < nla_mapped_range[0]) {
5133 if (key->
vec[1][0] > nla_mapped_range[1]) {
5134 fcu->
bezt[
max_ii(i - 1, 0)].
ipo = segment_end_interpolation;
5137 key->
ipo = interpolation_type;
5150 ot->
name =
"Bake Channels";
5151 ot->
idname =
"ANIM_OT_channels_bake";
5153 "Create keyframes following the current shape of F-Curves of selected channels";
5167 "The range in which to create new keys",
5177 "At which interval to add keys",
5182 "remove_outside_range",
5184 "Remove Outside Range",
5185 "Removes keys outside the given range, leaving only the newly baked");
5188 "interpolation_type",
5191 "Interpolation Type",
5192 "Choose the interpolation type with which new keys will be added");
5198 "Bake Modifiers into keyframes and delete them after");
5201#ifdef WITH_ANIM_BAKLAVA
5213 ListBase anim_data = {
nullptr,
nullptr};
5219 if (anim_data_length == 0) {
5230 bAction *owning_action =
reinterpret_cast<bAction *
>(ale->fcurve_owner_id);
5231 slots.
append({
reinterpret_cast<Slot *
>(ale->data), owning_action});
5235 if (slots.
size() == 0) {
5244 if (slots.
size() == 1) {
5246 SNPRINTF(actname,
DATA_(
"%sAction"), slots[0].first->name + 2);
5247 target_action = &
action_add(*bmain, actname);
5253 Layer &layer = target_action->
layer_add(std::nullopt);
5254 layer.
strip_add(*target_action, Strip::Type::Keyframe);
5256 for (std::pair<Slot *, bAction *> &slot_data : slots) {
5257 Action &source_action = slot_data.second->wrap();
5258 move_slot(*bmain, *slot_data.first, source_action, *target_action);
5269static bool slot_channels_move_to_new_action_poll(
bContext *C)
5272 if (!space_action) {
5275 if (!space_action->
action) {
5279 if (!space_action->
action->wrap().is_action_layered()) {
5288 ot->
name =
"Move Slots to new Action";
5289 ot->
idname =
"ANIM_OT_slot_channels_move_to_new_action";
5290 ot->
description =
"Move the selected slots into a newly created action";
5292 ot->
exec = slot_channels_move_to_new_action_exec;
5293 ot->
poll = slot_channels_move_to_new_action_poll;
5315 Layer &layer = target_action.
layer_add(std::nullopt);
5316 layer.
strip_add(target_action, Strip::Type::Keyframe);
5317 move_slot(*bmain, *slot, *action, target_action);
5328static bool separate_slots_poll(
bContext *C)
5331 if (!active_object) {
5349 ot->
name =
"Separate Slots";
5350 ot->
idname =
"ANIM_OT_separate_slots";
5352 "Move all slots of the action on the active object into newly created, separate actions. "
5353 "All users of those slots will be reassigned to the new actions. The current action won't "
5354 "be deleted but will be empty and might end up having zero users";
5356 ot->
exec = separate_slots_exec;
5357 ot->
poll = separate_slots_poll;
5395 ListBase anim_data = {
nullptr,
nullptr};
5402 fcu->
flag &= ~FCURVE_SELECTED;
5403 fcu->
flag &= ~FCURVE_ACTIVE;
5405 fcu->
flag &= ~FCURVE_VISIBLE;
5414 ListBase anim_data = {
nullptr,
nullptr};
5426 filtered_fcurves.
add(fcu,
true);
5429 int hidden_fcurve_count = fcurves.
size();
5430 for (
FCurve *fcu : fcurves) {
5431 if (filtered_fcurves.
contains(fcu)) {
5432 hidden_fcurve_count--;
5436 return hidden_fcurve_count;
5445 if (anim_data ==
nullptr) {
5446 return Vector<FCurve *>();
5454 for (
int i = 0; i <
length; i++) {
5456 anim_data, path->c_str(), i,
nullptr,
nullptr);
5457 if (fcurve !=
nullptr) {
5464 anim_data, path->c_str(), index,
nullptr,
nullptr);
5465 if (fcurve !=
nullptr) {
5488 if (anim_data ==
nullptr) {
5492 float frame_range[2];
5494 float mapped_frame_range[2];
5500 const bool include_handles =
false;
5502 for (
FCurve *fcurve : fcurves) {
5527 const bool whole_array,
5528 int *r_filtered_fcurve_count)
5537 ID *selected_id = selected.owner_id;
5545 &selected, id_to_prop_path.
c_str(), &resolved_ptr, &resolved_prop);
5551 resolved_ptr = selected;
5552 resolved_prop = prop;
5555 selected_id, &resolved_ptr, resolved_prop, whole_array, index);
5586 } wm_context_prev = {
nullptr}, wm_context_temp = {
nullptr};
5589 std::optional<std::string> id_to_prop_path;
5591 C, &button_ptr, button_prop, &selection, &path_from_id, &id_to_prop_path);
5594 C, &wm_context_temp.win, &wm_context_temp.area, &wm_context_temp.region))
5626 int filtered_fcurve_count = 0;
5627 if (selected_list_success && !selection.is_empty()) {
5631 id_to_prop_path.value_or(
""),
5634 &filtered_fcurve_count);
5642 button_ptr.
owner_id, &button_ptr, button_prop, whole_array, index);
5650 if (filtered_fcurve_count > 0) {
5659 ARegion *region = wm_context_temp.region;
5660 ScrArea *area = wm_context_temp.area;
5682 ot->
name =
"View In Graph Editor";
5683 ot->
idname =
"ANIM_OT_view_curve_in_graph_editor";
5684 ot->
description =
"Frame the property under the cursor in the Graph Editor";
5693 "Frame the whole array property instead of only the index under the cursor");
5699 "Hides all F-Curves other than the ones being framed");
5746#ifdef WITH_ANIM_BAKLAVA
Functions and classes to work with Actions.
Functions for backward compatibility with the legacy Action API.
Functions to work with AnimData.
Functions to modify FCurves.
Blender kernel action and pose functionality.
void action_groups_add_channel(bAction *act, bActionGroup *agrp, FCurve *fcurve)
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void action_groups_remove_channel(bAction *act, FCurve *fcu)
bActionGroup * action_groups_add_new(bAction *act, const char name[])
bool BKE_animdata_id_is_animated(const ID *id)
AnimData * BKE_animdata_from_id(const ID *id)
void BKE_animdata_free(ID *id, bool do_id_user)
SpaceAction * CTX_wm_space_action(const bContext *C)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
SpaceLink * CTX_wm_space_data(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
void CTX_wm_window_set(bContext *C, wmWindow *win)
Main * CTX_data_main(const bContext *C)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
wmMsgBus * CTX_wm_message_bus(const bContext *C)
int BKE_fcurve_bezt_binarysearch_index(const BezTriple array[], float frame, int arraylen, bool *r_replace)
FCurve * BKE_animadata_fcurve_find_by_rna_path(AnimData *animdata, const char *rna_path, const int rna_index, bAction **r_action, bool *r_driven)
void free_fmodifiers(ListBase *modifiers)
void BKE_fcurve_free(FCurve *fcu)
bool BKE_fcurve_calc_bounds(const FCurve *fcu, bool selected_keys_only, bool include_handles, const float frame_range[2], rctf *r_bounds)
void BKE_gpencil_layer_active_set(struct bGPdata *gpd, struct bGPDlayer *active)
void BKE_gpencil_free_data(struct bGPdata *gpd, bool free_all)
void BKE_gpencil_layer_delete(struct bGPdata *gpd, struct bGPDlayer *gpl)
void BKE_gpencil_layer_autolock_set(struct bGPdata *gpd, bool unlock)
Low-level operations for grease pencil.
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL()
void BKE_mask_layer_remove(struct Mask *mask, struct MaskLayer *masklay)
float BKE_nla_tweakedit_remap(AnimData *adt, float cframe, short mode)
bool BKE_nlatrack_is_nonlocal_in_liboverride(const ID *id, const NlaTrack *nlt)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
void BLI_rctf_union(struct rctf *rct_a, const struct rctf *rct_b)
bool BLI_rctf_is_valid(const struct rctf *rect)
void BLI_rctf_pad_y(struct rctf *rect, float boundary_size, float pad_min, float pad_max)
void BLI_rctf_scale(rctf *rect, float scale)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_id_tag_update_ex(Main *bmain, ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_ANIMATION_NO_FLUSH
#define ID_IS_EDITABLE(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
@ ADT_NLA_SKEYS_COLLAPSED
@ NLATRACK_OVERRIDELIBRARY_LOCAL
@ GP_LAYER_TREE_NODE_EXPANDED
@ GP_LAYER_TREE_NODE_SELECT
@ GREASE_PENCIL_ANIM_CHANNEL_EXPANDED
Object is a sort of wrapper for general info.
#define BASE_SELECTABLE(v3d, base)
@ ACHANNEL_SETFLAG_TOGGLE
@ ACHANNEL_SETFLAG_EXTEND_RANGE
@ ACHANNEL_SETFLAG_INVERT
@ ANIMTYPE_SPECIALDATA__UNUSED
@ ANIMTYPE_GREASE_PENCIL_DATABLOCK
@ ANIMTYPE_GREASE_PENCIL_LAYER
@ ANIMTYPE_FILLACT_LAYERED
@ ANIMTYPE_GREASE_PENCIL_LAYER_GROUP
#define NLATRACK_FIRST_TOP(ac)
#define EXPANDED_AGRP(ac, agrp)
@ ALE_GREASE_PENCIL_GROUP
#define NLATRACK_STEP(snla)
@ ACHANNEL_SETTING_ALWAYS_VISIBLE
@ ACHANNEL_SETTING_PROTECT
@ ACHANNEL_SETTING_VISIBLE
@ ACHANNEL_SETTING_EXPAND
@ ACHANNEL_SETTING_SELECT
#define ACHANNEL_SET_FLAG(channel, smode, sflag)
#define EXPANDED_DRVD(adt)
#define NLATRACK_NAMEWIDTH
@ ANIMFILTER_DATA_VISIBLE
@ ANIMFILTER_CURVE_VISIBLE
@ ANIMFILTER_LIST_VISIBLE
@ ANIMFILTER_LIST_CHANNELS
void ED_area_tag_redraw(ScrArea *area)
bool ED_operator_graphedit_active(bContext *C)
bool ED_operator_action_active(bContext *C)
void ED_region_toggle_hidden(bContext *C, ARegion *region)
void ED_region_tag_redraw(ARegion *region)
Read Guarded memory(de)allocation.
bool UI_textbutton_activate_rna(const bContext *C, ARegion *region, const void *rna_poin_data, const char *rna_prop_id)
uiBut * UI_context_active_but_prop_get(const bContext *C, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
bool UI_context_copy_to_selected_list(bContext *C, PointerRNA *ptr, PropertyRNA *prop, blender::Vector< PointerRNA > *r_lb, bool *r_use_path_from_id, std::optional< std::string > *r_path)
void UI_view2d_smooth_view(const bContext *C, ARegion *region, const rctf *cur, int smooth_viewtx)
#define UI_MARKER_MARGIN_Y
#define V2D_SCROLL_HANDLE_HEIGHT
#define UI_TIME_SCRUB_MARGIN_Y
void UI_view2d_listview_view_to_cell(float columnwidth, float rowheight, float startx, float starty, float viewx, float viewy, int *r_column, int *r_row)
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
#define ND_SPACE_PROPERTIES
void ANIM_channel_setting_set(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting, eAnimChannels_SetFlag mode)
float ANIM_UI_get_channel_name_width()
const bAnimChannelType * ANIM_channel_get_typeinfo(bAnimListElem *ale)
float ANIM_UI_get_channel_step()
float ANIM_UI_get_first_channel_top(View2D *v2d)
short ANIM_channel_setting_get(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting)
static int animchannels_expand_exec(bContext *C, wmOperator *op)
static int animchannels_collapse_exec(bContext *C, wmOperator *op)
static bool get_gpencil_bounds(bGPDlayer *gpl, const float range[2], rctf *r_bounds)
static int click_select_channel_grease_pencil_datablock(bAnimListElem *ale)
static int click_select_channel_grease_pencil_layer_group(bAnimListElem *ale)
static void rearrange_gpencil_channels(bAnimContext *ac, eRearrangeAnimChan_Mode mode)
static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
static void anim_flush_channel_setting_down(bAnimContext *ac, const eAnimChannel_Settings setting, const eAnimChannels_SetFlag mode, bAnimListElem *const match, const int matchLevel)
void ANIM_flush_setting_anim_channels(bAnimContext *ac, ListBase *anim_data, bAnimListElem *ale_setting, eAnimChannel_Settings setting, eAnimChannels_SetFlag mode)
static void box_select_anim_channels(bAnimContext *ac, const rcti &rect, short selectmode)
void ANIM_anim_channels_select_set(bAnimContext *ac, eAnimChannels_SetFlag sel)
static void add_region_padding(bContext *C, ARegion *region, rctf *bounds)
static int graphkeys_view_selected_channels_exec(bContext *C, wmOperator *op)
static bool animchannels_enable_poll(bContext *C)
static void join_groups_action_temp(bAction *act)
static void tag_update_animation_element(bAnimListElem *ale)
static void ANIM_OT_channel_select_keys(wmOperatorType *ot)
static int view_curve_in_graph_editor_exec(bContext *C, wmOperator *op)
@ REORDER_ISLAND_UNTOUCHABLE
@ REORDER_ISLAND_SELECTED
static bool animchannel_has_active_of_type(bAnimContext *ac, const eAnim_ChannelType type)
void ED_keymap_animchannels(wmKeyConfig *keyconf)
static void split_groups_action_temp(bAction *act, bActionGroup *tgrp)
static bool animchannels_select_filter_poll(bContext *C)
static const EnumPropertyItem prop_animchannel_rearrange_types[]
static int animchannels_select_filter_invoke(bContext *C, wmOperator *op, const wmEvent *)
static void setflag_anim_channels(bAnimContext *ac, eAnimChannel_Settings setting, eAnimChannels_SetFlag mode, bool onlysel, bool flush)
static void get_view_range(Scene *scene, const bool use_preview_range, float r_range[2])
static int graphkeys_channel_view_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void ANIM_OT_channels_clean_empty(wmOperatorType *ot)
static bool rearrange_island_bottom(ListBase *list, tReorderChannelIsland *island)
static void rearrange_animchannel_add_to_islands(ListBase *islands, ListBase *srcList, Link *channel, eAnim_ChannelType type, const bool is_hidden)
static void select_pchan_for_action_group(bAnimContext *ac, bActionGroup *agrp, bAnimListElem *ale, const bool change_active)
static bool rearrange_island_up(ListBase *list, tReorderChannelIsland *island)
bool(*)(ListBase *list, tReorderChannelIsland *island) AnimChanRearrangeFp
static int animchannels_group_exec(bContext *C, wmOperator *op)
static void rearrange_nla_tracks(bAnimContext *ac, AnimData *adt, eRearrangeAnimChan_Mode mode)
static bool select_anim_channel_keys(bAnimContext *ac, int channel_index, bool extend)
static bool get_channel_bounds(bAnimContext *ac, bAnimListElem *ale, const float range[2], const bool include_handles, rctf *r_bounds)
static int click_select_channel_maskdatablock(bAnimListElem *ale)
static int click_select_channel_object(bContext *C, bAnimContext *ac, bAnimListElem *ale, const short selectmode)
static void anim_flush_channel_setting_up(bAnimContext *ac, const eAnimChannel_Settings setting, const eAnimChannels_SetFlag mode, bAnimListElem *const match, const int matchLevel)
static void ANIM_OT_channels_delete(wmOperatorType *ot)
static int animchannels_channel_get(bAnimContext *ac, const int mval[2])
static rctf calculate_fcurve_bounds_and_unhide(SpaceLink *space_link, Scene *scene, ID *id, const blender::Span< FCurve * > fcurves)
void ANIM_frame_channel_y_extents(bContext *C, bAnimContext *ac)
static int click_select_channel_action_slot(bAnimContext *ac, bAnimListElem *ale, short selectmode)
static int click_select_channel_group(bAnimContext *ac, bAnimListElem *ale, const short selectmode, const int filter)
static int animchannels_enable_exec(bContext *C, wmOperator *)
static void rearrange_driver_channels(bAnimContext *ac, AnimData *adt, eRearrangeAnimChan_Mode mode)
static void rearrange_animchannel_flatten_islands(ListBase *islands, ListBase *srcList)
static int animchannels_delete_exec(bContext *C, wmOperator *)
static const EnumPropertyItem prop_animchannel_settings_types[]
bool ANIM_is_active_channel(bAnimListElem *ale)
static bool animedit_poll_channels_active(bContext *C)
static ListBase anim_channels_for_selection(bAnimContext *ac)
static void ANIM_OT_channels_expand(wmOperatorType *ot)
static void ANIM_OT_channels_rename(wmOperatorType *ot)
static int animchannels_select_filter_modal(bContext *C, wmOperator *, const wmEvent *)
static void deselect_all_fcurves(bAnimContext *ac, const bool hide)
static int click_select_channel_shapekey(bAnimContext *ac, bAnimListElem *ale, const short selectmode)
static void ANIM_OT_view_curve_in_graph_editor(wmOperatorType *ot)
static bool animedit_poll_channels_nla_tweakmode_off(bContext *C)
void ANIM_set_active_channel(bAnimContext *ac, void *data, eAnimCont_Types datatype, eAnimFilter_Flags filter, void *channel_data, eAnim_ChannelType channel_type)
static void animchannel_select_range(bAnimContext *ac, bAnimListElem *cursor_elem)
static int click_select_channel_gpdatablock(bAnimListElem *ale)
static void animchannels_group_channels(bAnimContext *ac, bAnimListElem *adt_ref, const char name[])
static bool rename_anim_channels(bAnimContext *ac, int channel_index)
static int click_select_channel_nlacontrols(bAnimListElem *ale)
static bool rearrange_island_down(ListBase *list, tReorderChannelIsland *island)
static void ANIM_OT_channels_select_box(wmOperatorType *ot)
static void ANIM_OT_channels_editable_toggle(wmOperatorType *ot)
static blender::Vector< FCurve * > get_fcurves_of_property(ID *id, PointerRNA *ptr, PropertyRNA *prop, const bool whole_array, const int index)
static bool rearrange_island_top(ListBase *list, tReorderChannelIsland *island)
static int channels_bake_exec(bContext *C, wmOperator *op)
static int animchannels_selectall_exec(bContext *C, wmOperator *op)
static void ANIM_OT_channels_fcurves_enable(wmOperatorType *ot)
static void ANIM_OT_channels_ungroup(wmOperatorType *ot)
static void rearrange_action_channels(bAnimContext *ac, bAction *act, eRearrangeAnimChan_Mode mode)
static void ANIM_OT_channels_view_selected(wmOperatorType *ot)
static int click_select_channel_gplayer(bContext *C, bAnimContext *ac, bAnimListElem *ale, const short selectmode, const int filter)
static void rearrange_layered_action_channel_groups(bAnimContext *ac, const eRearrangeAnimChan_Mode mode)
static bool rearrange_animchannel_islands(ListBase *list, AnimChanRearrangeFp rearrange_func, eRearrangeAnimChan_Mode mode, eAnim_ChannelType type, ListBase *anim_data_visible)
static void ANIM_OT_channels_setting_enable(wmOperatorType *ot)
static int click_select_channel_grease_pencil_layer(bContext *C, bAnimContext *ac, bAnimListElem *ale, const short selectmode, const int)
static const EnumPropertyItem channel_bake_key_options[]
static int mouse_anim_channels(bContext *C, bAnimContext *ac, const int channel_index, short selectmode)
static void ANIM_OT_channels_setting_toggle(wmOperatorType *ot)
static bool context_find_graph_editor(bContext *C, wmWindow **r_win, ScrArea **r_area, ARegion **r_region)
static bool animchannels_grouping_poll(bContext *C)
static void ANIM_OT_channels_move(wmOperatorType *ot)
static int animchannels_channel_select_keys_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static AnimChanRearrangeFp rearrange_get_mode_func(eRearrangeAnimChan_Mode mode)
static bool channel_view_poll(bContext *C)
void ANIM_anim_channels_select_toggle(bAnimContext *ac)
static void rearrange_nla_control_channels(bAnimContext *ac, AnimData *adt, eRearrangeAnimChan_Mode mode)
static AnimChanRearrangeFp rearrange_gpencil_get_mode_func(eRearrangeAnimChan_Mode mode)
static rctf calculate_selection_fcurve_bounds(bAnimContext *ac, blender::Span< PointerRNA > selection, PropertyRNA *prop, const blender::StringRefNull id_to_prop_path, const int index, const bool whole_array, int *r_filtered_fcurve_count)
static bool rearrange_island_ok(tReorderChannelIsland *island)
static int animchannels_ungroup_exec(bContext *C, wmOperator *)
static void ANIM_OT_channels_bake(wmOperatorType *ot)
static void ANIM_OT_channels_group(wmOperatorType *ot)
static void rearrange_layered_action_fcurves(bAnimContext *ac, blender::animrig::Action &action, const eRearrangeAnimChan_Mode mode)
static void ANIM_OT_channels_select_filter(wmOperatorType *ot)
static int click_select_channel_dummy(bAnimContext *ac, bAnimListElem *ale, const short selectmode)
static bool get_grease_pencil_layer_bounds(const GreasePencilLayer *gplayer, const float range[2], rctf *r_bounds)
static void anim_channels_select_set(bAnimContext *ac, const ListBase anim_data, eAnimChannels_SetFlag sel)
static int count_fcurves_hidden_by_filter(bAnimContext *ac, const blender::Span< FCurve * > fcurves)
static void templated_selection_state_update(T &selectable_thing, const eAnimChannels_SetFlag selectmode)
static void ANIM_OT_channels_setting_disable(wmOperatorType *ot)
static void ANIM_OT_channels_click(wmOperatorType *ot)
static eAnimChannels_SetFlag anim_channels_selection_flag_for_toggle(const ListBase anim_data)
static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int animchannels_clean_empty_exec(bContext *C, wmOperator *)
static int animchannels_box_select_exec(bContext *C, wmOperator *op)
static int click_select_channel_scene(bAnimListElem *ale, const short selectmode)
static const EnumPropertyItem prop_animchannel_setflag_types[]
static bool get_normalized_fcurve_bounds(FCurve *fcu, AnimData *anim_data, SpaceLink *space_link, Scene *scene, ID *id, const bool include_handles, const float range[2], rctf *r_bounds)
void ED_operatortypes_animchannels()
static int animchannels_setflag_exec(bContext *C, wmOperator *op)
@ REARRANGE_ANIMCHAN_DOWN
@ REARRANGE_ANIMCHAN_BOTTOM
static int animchannels_rename_invoke(bContext *C, wmOperator *, const wmEvent *event)
static int click_select_channel_masklayer(bAnimContext *ac, bAnimListElem *ale, const short selectmode)
static int click_select_channel_fcurve(bAnimContext *ac, bAnimListElem *ale, const short selectmode, const int filter)
static void ANIM_OT_channel_view_pick(wmOperatorType *ot)
static void rearrange_animchannels_filter_visible(ListBase *anim_data_visible, bAnimContext *ac, eAnim_ChannelType type)
static void rearrange_grease_pencil_channels(bAnimContext *ac, eRearrangeAnimChan_Mode mode)
static void ANIM_OT_channels_collapse(wmOperatorType *ot)
static void ANIM_OT_channels_select_all(wmOperatorType *ot)
void ANIM_animdata_freelist(ListBase *anim_data)
void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data)
short ANIM_get_normalization_flags(SpaceLink *space_link)
AnimData * ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale)
float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short flag, float *r_offset)
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)
ListBase * ED_context_get_markers(const bContext *C)
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
bool add(const Key &key, const Value &value)
bool contains(const Key &key) const
constexpr int64_t size() const
constexpr bool is_empty() const
constexpr const char * c_str() const
void append(const T &value)
void slot_active_set(slot_handle_t slot_handle)
const Slot * slot(int64_t index) const
bool is_action_layered() const
bool slot_remove(Slot &slot_to_remove)
Layer & layer_add(std::optional< StringRefNull > name)
void fcurve_move(FCurve &fcurve, int to_fcurve_index)
bActionGroup & channel_group_create(StringRefNull name)
const bActionGroup * channel_group(int64_t index) const
void channel_group_move(bActionGroup &group, int to_group_index)
const FCurve * fcurve(int64_t index) const
bool fcurve_assign_to_channel_group(FCurve &fcurve, bActionGroup &to_group)
blender::Span< const bActionGroup * > channel_groups() const
blender::Span< const FCurve * > fcurves() const
bool fcurve_remove(FCurve &fcurve_to_remove)
Strip & strip_add(Action &owning_action, Strip::Type strip_type)
void set_selected(bool selected)
local_group_size(16, 16) .push_constant(Type b
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
DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
void *(* MEM_callocN)(size_t len, const char *str)
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
bool action_treat_as_legacy(const bAction &action)
Action & action_add(Main &bmain, StringRefNull name)
Action * get_action(ID &animated_id)
void move_slot(Main &bmain, Slot &slot, Action &from_action, Action &to_action)
void animdata_fcurve_delete(bAnimContext *ac, AnimData *adt, FCurve *fcu)
float wrap(float value, float max, float min)
GPU_SHADER_INTERFACE_INFO(overlay_edit_curve_handle_iface, "vert").flat(Type pos vertex_in(1, Type::UINT, "data") .vertex_out(overlay_edit_curve_handle_iface) .geometry_layout(PrimitiveIn Frequency::GEOMETRY storage_buf(1, Qualifier::READ, "uint", "data[]", Frequency::GEOMETRY) .push_constant(Type Frequency::GEOMETRY selection[]
bool ED_pose_deselect_all(Object *ob, int select_mode, const bool ignore_visibility)
void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select, bool change_active)
void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
bool RNA_property_array_check(PropertyRNA *prop)
void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
float RNA_float_get(PointerRNA *ptr, const char *name)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_int_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int 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_flag(PropertyRNA *prop, PropertyFlag flag)
std::optional< std::string > RNA_path_from_ID_to_property(const PointerRNA *ptr, PropertyRNA *prop)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
GreasePencilLayerTreeNode base
struct ActionChannelBag * channel_bag
short(* get_offset)(bAnimContext *ac, bAnimListElem *ale)
bool(* name_prop)(bAnimListElem *ale, PointerRNA *r_ptr, PropertyRNA **r_prop)
tReorderChannelIsland * prev
tReorderChannelIsland * next
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
void(* cancel)(bContext *C, wmOperator *op)
void WM_report(eReportType type, const char *message)
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_gesture_box_cancel(bContext *C, wmOperator *op)
int WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
int WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)
void WM_operator_properties_border_to_rcti(wmOperator *op, rcti *r_rect)
void WM_operator_properties_gesture_box_select(wmOperatorType *ot)
void WM_operator_properties_select_all(wmOperatorType *ot)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
int WM_operator_flag_only_pass_through_on_press(int retval, const wmEvent *event)
int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)
int WM_operator_smooth_viewtx_get(const wmOperator *op)
int WM_operator_props_popup(bContext *C, wmOperator *op, const wmEvent *)
bScreen * WM_window_get_active_screen(const wmWindow *win)