82 const bool include_handles,
86 const bool fcu_selection_only =
false;
88 fcu, fcu_selection_only, include_handles, range, r_bounds);
99 r_bounds->
ymin = (r_bounds->
ymin + offset) * unit_fac;
100 r_bounds->
ymax = (r_bounds->
ymax + offset) * unit_fac;
102 const float min_height = 0.01f;
104 if (height < min_height) {
105 r_bounds->
ymin -= (min_height - height) / 2;
106 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;
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;
192 fcu, ac->
sl, ac->
scene, ale->
id, include_handles, range, r_bounds);
244 ListBase anim_data = {
nullptr,
nullptr};
256 if (channel_type != ale->
type) {
341 switch (channel_type) {
389 if (ale && ale->
adt) {
462 return grease_pencil->is_layer_active(
496 const bool change_active)
526 ListBase anim_data = {
nullptr,
nullptr};
655 switch (selectmode) {
657 selectable_thing.set_selected(!selectable_thing.is_selected());
660 selectable_thing.set_selected(
true);
673 selectable_thing.set_selected(
false);
693 Scene *scene =
static_cast<Scene *
>(ale->data);
791 Layer *layer =
static_cast<Layer *
>(ale->data);
849 const int matchLevel)
874 int prevLevel = matchLevel;
879 if (acf ==
nullptr) {
888 if (level == prevLevel) {
893 if (level > prevLevel) {
895 if (prevLevel == 0) {
920 const int matchLevel)
927 if (acf ==
nullptr) {
939 if (level > matchLevel) {
963 if (
ELEM(
nullptr, anim_data, anim_data->
first)) {
974 if ((ale->data == ale_setting->
data) && (ale->type == ale_setting->
type)) {
978 if (ale->id == ale_setting->
id) {
984 if (match ==
nullptr) {
985 printf(
"ERROR: no channel matching the one changed was found\n");
991 if (acf ==
nullptr) {
992 printf(
"ERROR: no channel info for the changed channel\n");
1011 if (!window_region) {
1015 ListBase anim_data = {
nullptr,
nullptr};
1026 const bool include_handles =
false;
1034 rctf channel_bounds;
1036 ac, ale, frame_range, include_handles, &channel_bounds);
1126 {0,
nullptr, 0,
nullptr,
nullptr},
1307 const bool is_hidden)
1311 bool is_sel =
false, is_untouchable =
false;
1343 "rearrange_animchannel_add_to_islands(): don't know how to handle channels of type %d\n",
1350 (island ==
nullptr) ||
1366 if (is_untouchable) {
1406 ListBase anim_data = {
nullptr,
nullptr};
1415 if (ale->type != type) {
1432 *anim_data_visible = anim_data;
1442 ListBase islands = {
nullptr,
nullptr};
1443 Link *channel, *chanNext =
nullptr;
1452 for (channel =
static_cast<Link *
>(list->
first); channel; channel = chanNext) {
1454 const bool is_hidden =
1456 chanNext = channel->
next;
1469 (mode > 0) ? islands.
last : islands.
first);
1472 for (island = first; island; island = isn) {
1473 isn = (mode > 0) ? island->
prev : island->
next;
1476 if (rearrange_func(&islands, island)) {
1499 ListBase anim_data_visible = {
nullptr,
nullptr};
1507 if (rearrange_func ==
nullptr) {
1517 ListBase extracted_nonlocal_nla_tracks = {
nullptr,
nullptr};
1518 if (is_liboverride) {
1521 nla_track = nla_track->
next)
1527 if (nla_track !=
nullptr && nla_track->
prev !=
nullptr) {
1529 extracted_nonlocal_nla_tracks.
last = nla_track->
prev;
1532 nla_track->
prev =
nullptr;
1549 extracted_nonlocal_nla_tracks.
last);
1568 ListBase anim_data_visible = {
nullptr,
nullptr};
1570 if (rearrange_func ==
nullptr) {
1597 if (act ==
nullptr) {
1605 FCurve *
const group_fcurves_first =
static_cast<FCurve *
>(agrp->channels.first);
1606 FCurve *
const group_fcurves_last =
static_cast<FCurve *
>(agrp->channels.last);
1607 if (group_fcurves_first ==
nullptr) {
1618 group_fcurves_first->
prev->
next = group_fcurves_last->
next;
1621 if (group_fcurves_last == act->
curves.
last) {
1627 group_fcurves_last->
next->
prev = group_fcurves_first->
prev;
1631 group_fcurves_first->
prev = group_fcurves_last->
next =
nullptr;
1644 fcu->
prev =
nullptr;
1650 fcu->
next =
nullptr;
1671 const ListBase group_channels = agrp->channels;
1673 agrp->channels = group_channels;
1705 ListBase anim_data_selected_visible = {
nullptr,
nullptr};
1709 int total_moved = 0;
1717 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
1719 const int current_index = action.
slots().first_index_try(&slot);
1720 const int to_index = current_index - 1;
1742 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
1744 const int current_index = action.
slots().first_index_try(&slot);
1745 const int to_index = 0;
1746 if (current_index != to_index) {
1759 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
1761 const int current_index = action.
slots().first_index_try(&slot);
1762 const int to_index = current_index + 1;
1784 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
1786 const int current_index = action.
slots().first_index_try(&slot);
1787 const int to_index = action.
slots().size() - 1;
1788 if (current_index != to_index) {
1799 return total_moved > 0;
1824 ListBase anim_data_visible = {
nullptr,
nullptr};
1836 if (ale->adt && &ale->adt->action->wrap() != &action) {
1845 const int group_index = bag.
channel_groups().first_index_try(group);
1846 const int to_index = group_index - 1;
1864 if (ale->adt && &ale->adt->action->wrap() != &action) {
1880 if (ale->adt && &ale->adt->action->wrap() != &action) {
1889 const int group_index = bag.
channel_groups().first_index_try(group);
1890 const int to_index = group_index + 1;
1908 if (ale->adt && &ale->adt->action->wrap() != &action) {
1947 ListBase anim_data_visible = {
nullptr,
nullptr};
1964 FCurve *fcurve =
static_cast<FCurve *
>(fcurve_ale->data);
1966 return *fcurve->
grp;
1970 fcurve_ale->slot_handle);
1997 if (ale->adt && &ale->adt->action->wrap() != &action) {
2004 if (should_skip(*fcurve, group)) {
2009 const int fcurve_index = bag.
fcurves().first_index_try(fcurve);
2010 const int to_index = fcurve_index - 1;
2027 if (ale->adt && &ale->adt->action->wrap() != &action) {
2034 if (should_skip(*fcurve, group)) {
2046 if (ale->adt && &ale->adt->action->wrap() != &action) {
2053 if (should_skip(*fcurve, group)) {
2058 const int fcurve_index = bag.
fcurves().first_index_try(fcurve);
2059 const int to_index = fcurve_index + 1;
2078 if (ale->adt && &ale->adt->action->wrap() != &action) {
2085 if (should_skip(*fcurve, group)) {
2119 ListBase anim_data_visible = {
nullptr,
nullptr};
2125 if (rearrange_func ==
nullptr) {
2154 &agrp->channels, rearrange_func, mode,
ANIMTYPE_FCURVE, &anim_data_visible);
2172 ListBase anim_data_visible = {
nullptr,
nullptr};
2177 if (rearrange_func ==
nullptr) {
2206 ListBase anim_data = {
nullptr,
nullptr};
2216 Layer *layer =
static_cast<Layer *
>(ale->data);
2217 if (layer->is_selected()) {
2218 grease_pencil.move_node_top(layer->
as_node());
2225 Layer *layer =
static_cast<Layer *
>(ale->data);
2229 if (layer->is_selected()) {
2230 grease_pencil.move_node_up(layer->
as_node());
2235 if (layer->is_selected()) {
2236 grease_pencil.move_node_down(layer->
as_node());
2241 if (layer->is_selected()) {
2242 grease_pencil.move_node_bottom(layer->
as_node());
2258 ListBase anim_data = {
nullptr,
nullptr};
2264 if (rearrange_func ==
nullptr) {
2280 ListBase anim_data_visible = {
nullptr,
nullptr};
2330 printf(
"Mask does not supported for moving yet\n");
2337 ListBase anim_data = {
nullptr,
nullptr};
2376 printf(
"Animdata has no action\n");
2395 printf(
"Animdata has no action\n");
2416 ot->name =
"Move Channels";
2417 ot->idname =
"ANIM_OT_channels_move";
2418 ot->description =
"Rearrange selected animation channels";
2495 if (act ==
nullptr) {
2500 ListBase anim_data = {
nullptr,
nullptr};
2505 if (anim_data.
first ==
nullptr) {
2560 if (channelbag != last_channelbag) {
2561 last_channelbag = channelbag;
2587 ListBase anim_data = {
nullptr,
nullptr};
2613 ot->name =
"Group Channels";
2614 ot->idname =
"ANIM_OT_channels_group";
2615 ot->description =
"Add selected F-Curves to a new group";
2631 "Name of newly created group");
2646 ListBase anim_data = {
nullptr,
nullptr};
2665 if (fcu->
grp ==
nullptr) {
2670 if (!ale->adt || !ale->adt->action) {
2673 bAction *act = ale->adt->action;
2706 ot->name =
"Ungroup Channels";
2707 ot->idname =
"ANIM_OT_channels_ungroup";
2708 ot->description =
"Remove selected F-Curves from their current groups";
2731 if (adt !=
nullptr) {
2733 if (adt->
action !=
nullptr) {
2758 ListBase anim_data = {
nullptr,
nullptr};
2761 bool must_skip_groups =
false;
2762 bool has_skipped_group =
false;
2766 switch (ale->type) {
2771 "fcurve_owner_id should be an Action");
2774 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
2783 must_skip_groups =
true;
2788 if (must_skip_groups) {
2791 has_skipped_group =
true;
2800 if (adt ==
nullptr || adt->
action ==
nullptr) {
2844 for (
int i = 0;
i < fcurve_range_length;
i++) {
2904 return has_skipped_group;
2910 ListBase anim_data = {
nullptr,
nullptr};
2941 switch (ale->type) {
2949 "Expecting only driver F-Curves in the drivers editor");
2950 if (ale->fcurve_owner_id &&
GS(ale->fcurve_owner_id->name) ==
ID_AC) {
2955 reinterpret_cast<bAction *
>(ale->fcurve_owner_id)->
wrap();
2981 printf(
"ERROR: Trying to delete NLA Control Curve for unknown property '%s'\n",
3005 scene->
gpd =
nullptr;
3015 Layer *layer =
static_cast<Layer *
>(ale->data);
3016 grease_pencil->remove_layer(*layer);
3089 ot->name =
"Delete Channels";
3090 ot->idname =
"ANIM_OT_channels_delete";
3091 ot->description =
"Delete all selected animation channels";
3113 {0,
nullptr, 0,
nullptr,
nullptr},
3121 {0,
nullptr, 0,
nullptr,
nullptr},
3140 ListBase anim_data = {
nullptr,
nullptr};
3141 ListBase all_data = {
nullptr,
nullptr};
3254 ot->name =
"Enable Channel Setting";
3255 ot->idname =
"ANIM_OT_channels_setting_enable";
3256 ot->description =
"Enable specified setting on all selected animation channels";
3280 ot->name =
"Disable Channel Setting";
3281 ot->idname =
"ANIM_OT_channels_setting_disable";
3282 ot->description =
"Disable specified setting on all selected animation channels";
3306 ot->name =
"Toggle Channel Setting";
3307 ot->idname =
"ANIM_OT_channels_setting_toggle";
3308 ot->description =
"Toggle specified setting on all selected animation channels";
3332 ot->name =
"Toggle Channel Editability";
3333 ot->idname =
"ANIM_OT_channels_editable_toggle";
3334 ot->description =
"Toggle editability of selected channels";
3362 bool onlysel =
true;
3386 ot->name =
"Expand Channels";
3387 ot->idname =
"ANIM_OT_channels_expand";
3388 ot->description =
"Expand (open) all selected expandable animation channels";
3399 ot->srna,
"all",
true,
"All",
"Expand all channels (not just selected ones)");
3411 bool onlysel =
true;
3435 ot->name =
"Collapse Channels";
3436 ot->idname =
"ANIM_OT_channels_collapse";
3437 ot->description =
"Collapse (close) all selected expandable animation channels";
3448 ot->srna,
"all",
true,
"All",
"Collapse all channels (not just selected ones)");
3472 ListBase anim_data = {
nullptr,
nullptr};
3491 bool nla_empty =
false;
3492 bool drivers_empty =
false;
3495 BLI_assert((
id !=
nullptr) && (adt !=
nullptr));
3510 action_empty =
true;
3520 if (nlt->strips.first) {
3527 if (nlt->strips.first ==
nullptr) {
3538 if (action_empty && nla_empty && drivers_empty) {
3556 ot->name =
"Remove Empty Animation Data";
3557 ot->idname =
"ANIM_OT_channels_clean_empty";
3558 ot->description =
"Delete all empty animation data containers from visible data-blocks";
3596 ListBase anim_data = {
nullptr,
nullptr};
3637 ot->name =
"Revive Disabled F-Curves";
3638 ot->idname =
"ANIM_OT_channels_fcurves_enable";
3639 ot->description =
"Clear 'disabled' tag from all F-Curves to get broken F-Curves working again";
3660 if (area ==
nullptr) {
3714 ot->name =
"Filter Channels";
3715 ot->idname =
"ANIM_OT_channels_select_filter";
3717 "Start entering text which filters the set of channels shown to only include those with "
3770 ot->name =
"Select All";
3771 ot->idname =
"ANIM_OT_channels_select_all";
3772 ot->description =
"Toggle selection of all animation channels";
3793 ListBase anim_data = {
nullptr,
nullptr};
3830 if (ymax >= rectf.
ymin && ymin <= rectf.
ymax) {
3836 switch (ale->type) {
3855 Slot *slot =
static_cast<Slot *
>(ale->data);
3919 short selectmode = 0;
3954 ot->name =
"Box Select";
3955 ot->idname =
"ANIM_OT_channels_select_box";
3956 ot->description =
"Select all animation channels within the specified region";
3983 ListBase anim_data = {
nullptr,
nullptr};
3987 bool success =
false;
4000 if (ale ==
nullptr) {
4003 printf(
"Error: animation channel (index = %d) not found in rename_anim_channels()\n",
4018 if (ale->
id !=
nullptr) {
4026 switch (ale->
type) {
4104 return channel_index;
4134 ot->name =
"Rename Channel";
4135 ot->idname =
"ANIM_OT_channels_rename";
4136 ot->description =
"Rename animation channel under mouse";
4152 const short selectmode)
4178 bool is_active_found =
false;
4181 if (ale->type != type) {
4185 if (is_active_found) {
4191 return is_active_found;
4198 bool in_selection_range =
false;
4203 if (ale->type != cursor_elem->
type) {
4207 const bool is_cursor_elem = (ale->data == cursor_elem->
data);
4212 if (is_active_elem || is_cursor_elem) {
4215 in_selection_range = !in_selection_range;
4220 else if (in_selection_range) {
4228 if (is_active_elem && is_cursor_elem) {
4241 const short selectmode)
4273 if (
b->object->adt) {
4301 const short selectmode)
4303 if (ale->
adt ==
nullptr) {
4332 const short selectmode,
4350 ob =
reinterpret_cast<Object *
>(ale->
id);
4373 else if (selectmode == -1) {
4435 const short selectmode,
4475 "fcurve_owner_id of an Action Slot should be an Action");
4483 switch (selectmode) {
4508 const short selectmode)
4543 const short selectmode,
4615 const short selectmode,
4623 layer->set_selected(!layer->is_selected());
4631 layer->set_selected(
true);
4636 grease_pencil->set_active_layer(layer);
4661 const short selectmode)
4681 const int channel_index,
4684 ListBase anim_data = {
nullptr,
nullptr};
4687 int notifierFlags = 0;
4701 if (ale ==
nullptr) {
4704 printf(
"Error: animation channel (index = %d) not found in mouse_anim_channels()\n",
4730 switch (ale->
type) {
4799 printf(
"Error: Invalid channel type in mouse_anim_channels()\n");
4808 return notifierFlags;
4826 int notifierFlags = 0;
4881 ot->name =
"Mouse Click on Channels";
4882 ot->idname =
"ANIM_OT_channels_click";
4883 ot->description =
"Handle mouse clicks over animation channels";
4903 "Selection of active channel to clicked channel");
4907 prop =
RNA_def_boolean(
ot->srna,
"children_only",
false,
"Select Children Only",
"");
4913 ListBase anim_data = {
nullptr,
nullptr};
4916 bool success =
false;
4929 if (ale ==
nullptr) {
4932 printf(
"Error: animation channel (index = %d) not found in rename_anim_channels()\n",
4947 success = (fcu !=
nullptr);
4952 if (fcu && fcu->
bezt) {
4962 if (fcu_inner !=
nullptr && fcu_inner->
bezt !=
nullptr) {
4964 bezt->
f2 = bezt->
f1 = bezt->
f3 = 0;
5012 ot->name =
"Select Channel Keyframes";
5013 ot->idname =
"ANIM_OT_channel_select_keys";
5014 ot->description =
"Select all keyframes of channel under mouse";
5022 prop =
RNA_def_boolean(
ot->srna,
"extend",
false,
"Extend",
"Extend selection");
5035 r_range[0] = scene->
r.
psfra;
5036 r_range[1] = scene->
r.
pefra;
5039 r_range[0] = scene->
r.
sfra;
5040 r_range[1] = scene->
r.
efra;
5054 if (!window_region) {
5058 ListBase anim_data = {
nullptr,
nullptr};
5064 if (anim_data_length == 0) {
5081 bool valid_bounds =
false;
5083 rctf channel_bounds;
5085 &ac, ale, range, include_handles, &channel_bounds);
5088 valid_bounds =
true;
5092 if (!valid_bounds) {
5121 ot->name =
"Frame Selected Channels";
5122 ot->idname =
"ANIM_OT_channels_view_selected";
5123 ot->description =
"Reset viewable area to show the selected channels";
5135 "Include handles of keyframes when calculating extents");
5138 "use_preview_range",
5140 "Use Preview Range",
5141 "Ignore frames outside of the preview range");
5156 if (!window_region) {
5160 ListBase anim_data = {
nullptr,
nullptr};
5169 if (ale ==
nullptr) {
5183 if (!found_bounds) {
5207 ot->name =
"Frame Channel Under Cursor";
5208 ot->idname =
"ANIM_OT_channel_view_pick";
5209 ot->description =
"Reset viewable area to show the channel under the cursor";
5221 "Include handles of keyframes when calculating extents");
5224 "use_preview_range",
5226 "Use Preview Range",
5227 "Ignore frames outside of the preview range");
5231 {
BEZT_IPO_BEZ,
"BEZIER", 0,
"Bézier",
"New keys will be Bézier"},
5232 {
BEZT_IPO_LIN,
"LIN", 0,
"Linear",
"New keys will be linear"},
5233 {
BEZT_IPO_CONST,
"CONST", 0,
"Constant",
"New keys will be constant"},
5234 {0,
nullptr, 0,
nullptr,
nullptr},
5247 ListBase anim_data = {
nullptr,
nullptr};
5253 if (anim_data_length == 0) {
5265 frame_range[1] = std::max(frame_range[1], frame_range[0]);
5267 if (frame_range[0] == 0 && frame_range[1] == 0) {
5272 frame_range = {scene->
r.
sfra, scene->
r.
efra};
5280 const int interpolation_type =
RNA_enum_get(op->
ptr,
"interpolation_type");
5294 if (!bake_modifiers) {
5303 fcu->
bezt, nla_mapped_range[1], fcu->
totvert, &replace);
5312 if (bake_modifiers) {
5316 int modifier_index = 0;
5318 modifier->flag = modifier_flags[modifier_index];
5325 if (key->
vec[1][0] < nla_mapped_range[0]) {
5328 if (key->
vec[1][0] > nla_mapped_range[1]) {
5332 key->
ipo = interpolation_type;
5345 ot->name =
"Bake Channels";
5346 ot->idname =
"ANIM_OT_channels_bake";
5348 "Create keyframes following the current shape of F-Curves of selected channels";
5362 "The range in which to create new keys",
5372 "At which interval to add keys",
5377 "remove_outside_range",
5379 "Remove Outside Range",
5380 "Removes keys outside the given range, leaving only the newly baked");
5383 "interpolation_type",
5386 "Interpolation Type",
5387 "Choose the interpolation type with which new keys will be added");
5393 "Bake Modifiers into keyframes and delete them after");
5406 ListBase anim_data = {
nullptr,
nullptr};
5412 if (anim_data_length == 0) {
5423 bAction *owning_action =
reinterpret_cast<bAction *
>(ale->fcurve_owner_id);
5424 slots.
append({
reinterpret_cast<Slot *
>(ale->data), owning_action});
5428 if (slots.
size() == 0) {
5437 if (slots.
size() == 1) {
5439 SNPRINTF(actname,
DATA_(
"%sAction"), slots[0].first->identifier + 2);
5440 target_action = &
action_add(*bmain, actname);
5447 layer.strip_add(*target_action, Strip::Type::Keyframe);
5449 for (std::pair<Slot *, bAction *> &slot_data : slots) {
5450 Action &source_action = slot_data.second->wrap();
5451 move_slot(*bmain, *slot_data.first, source_action, *target_action);
5465 if (!space_action) {
5468 if (!space_action->
action) {
5472 if (!space_action->
action->wrap().is_action_layered()) {
5481 ot->name =
"Move Slots to new Action";
5482 ot->idname =
"ANIM_OT_slot_channels_move_to_new_action";
5483 ot->description =
"Move the selected slots into a newly created action";
5503 int created_actions = 0;
5511 layer.strip_add(target_action, Strip::Type::Keyframe);
5512 move_slot(*bmain, *slot, *action, target_action);
5518 "Separated %s into %i new actions",
5532 if (!active_object) {
5550 ot->name =
"Separate Slots";
5551 ot->idname =
"ANIM_OT_separate_slots";
5553 "Move all slots of the action on the active object into newly created, separate actions. "
5554 "All users of those slots will be reassigned to the new actions. The current action won't "
5555 "be deleted but will be empty and might end up having zero users";
5594 ListBase anim_data = {
nullptr,
nullptr};
5613 ListBase anim_data = {
nullptr,
nullptr};
5625 filtered_fcurves.
add(fcu,
true);
5628 int hidden_fcurve_count = fcurves.
size();
5629 for (
FCurve *fcu : fcurves) {
5630 if (filtered_fcurves.
contains(fcu)) {
5631 hidden_fcurve_count--;
5635 return hidden_fcurve_count;
5644 if (anim_data ==
nullptr) {
5655 anim_data, path->c_str(),
i,
nullptr,
nullptr);
5656 if (fcurve !=
nullptr) {
5663 anim_data, path->c_str(), index,
nullptr,
nullptr);
5664 if (fcurve !=
nullptr) {
5687 if (anim_data ==
nullptr) {
5691 float frame_range[2];
5693 float mapped_frame_range[2];
5699 const bool include_handles =
false;
5701 for (
FCurve *fcurve : fcurves) {
5705 fcurve, space_link, scene,
id, include_handles, mapped_frame_range, &fcu_bounds);
5720 const bool whole_array,
5721 int *r_filtered_fcurve_count)
5729 for (
const PointerRNA &selected : selection) {
5730 ID *selected_id = selected.owner_id;
5738 &selected, id_to_prop_path.
c_str(), &resolved_ptr, &resolved_prop);
5744 resolved_ptr = selected;
5745 resolved_prop = prop;
5748 selected_id, &resolved_ptr, resolved_prop, whole_array, index);
5779 } wm_context_prev = {
nullptr}, wm_context_temp = {
nullptr};
5782 std::optional<std::string> id_to_prop_path;
5784 C, &button_ptr, button_prop, &selection, &path_from_id, &id_to_prop_path);
5787 C, &wm_context_temp.win, &wm_context_temp.area, &wm_context_temp.region))
5819 int filtered_fcurve_count = 0;
5820 if (selected_list_success && !selection.
is_empty()) {
5824 id_to_prop_path.value_or(
""),
5827 &filtered_fcurve_count);
5835 button_ptr.
owner_id, &button_ptr, button_prop, whole_array, index);
5843 if (filtered_fcurve_count > 0) {
5846 "One or more F-Curves are not visible due to filter settings");
5854 ARegion *region = wm_context_temp.region;
5855 ScrArea *area = wm_context_temp.area;
5877 ot->name =
"View In Graph Editor";
5878 ot->idname =
"ANIM_OT_view_curve_in_graph_editor";
5879 ot->description =
"Frame the property under the cursor in the Graph Editor";
5888 "Frame the whole array property instead of only the index under the cursor");
5894 "Hides all F-Curves other than the ones being framed");
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, eNlaTime_ConvertModes mode)
bool BKE_nlatrack_is_nonlocal_in_liboverride(const ID *id, const NlaTrack *nlt)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(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(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 SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_ANIMATION_NO_FLUSH
@ NLASTRIP_FLAG_USR_INFLUENCE
@ ADT_NLA_SKEYS_COLLAPSED
@ NLATRACK_OVERRIDELIBRARY_LOCAL
@ 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()
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)
const bAnimChannelType * ANIM_channel_get_typeinfo(const bAnimListElem *ale)
static bool slot_channels_move_to_new_action_poll(bContext *C)
static bool get_gpencil_bounds(bGPDlayer *gpl, const float range[2], rctf *r_bounds)
static wmOperatorStatus animchannels_select_filter_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int click_select_channel_grease_pencil_datablock(bAnimListElem *ale)
static void rearrange_gpencil_channels(bAnimContext *ac, eRearrangeAnimChan_Mode mode)
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 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 wmOperatorStatus animchannels_ungroup_exec(bContext *C, wmOperator *)
@ REORDER_ISLAND_UNTOUCHABLE
@ REORDER_ISLAND_SELECTED
static bool animchannel_has_active_of_type(bAnimContext *ac, const eAnim_ChannelType type)
static bool get_normalized_fcurve_bounds(FCurve *fcu, SpaceLink *space_link, Scene *scene, ID *id, const bool include_handles, const float range[2], rctf *r_bounds)
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 bool animchannels_delete_containers(const bContext *C, bAnimContext *ac)
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 void rearrange_animchannels_filter_visible(ListBase *anim_data_visible, bAnimContext *ac, const eAnim_ChannelType type, const eAnimFilter_Flags additional_filters=eAnimFilter_Flags(0))
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 wmOperatorStatus animchannels_delete_exec(bContext *C, wmOperator *)
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 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 wmOperatorStatus animchannels_channel_select_keys_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus animchannels_box_select_exec(bContext *C, wmOperator *op)
static wmOperatorStatus view_curve_in_graph_editor_exec(bContext *C, wmOperator *op)
static wmOperatorStatus animchannels_setflag_exec(bContext *C, wmOperator *op)
static wmOperatorStatus animchannels_rearrange_exec(bContext *C, wmOperator *op)
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 wmOperatorStatus animchannels_select_filter_modal(bContext *C, wmOperator *, const wmEvent *)
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 void rearrange_driver_channels(bAnimContext *ac, AnimData *adt, eRearrangeAnimChan_Mode mode)
static int click_select_channel_grease_pencil_layer_group(bContext *C, bAnimListElem *ale)
static void rearrange_animchannel_flatten_islands(ListBase *islands, ListBase *srcList)
static const EnumPropertyItem prop_animchannel_settings_types[]
static void ANIM_OT_slot_channels_move_to_new_action(wmOperatorType *ot)
bool ANIM_is_active_channel(bAnimListElem *ale)
static bool animedit_poll_channels_active(bContext *C)
static void ANIM_OT_separate_slots(wmOperatorType *ot)
static bool rearrange_layered_action_slots(bAnimContext *ac, const eRearrangeAnimChan_Mode mode)
static ListBase anim_channels_for_selection(bAnimContext *ac)
static wmOperatorStatus animchannels_group_exec(bContext *C, wmOperator *op)
static void ANIM_OT_channels_expand(wmOperatorType *ot)
static wmOperatorStatus separate_slots_exec(bContext *C, wmOperator *op)
static wmOperatorStatus animchannels_selectall_exec(bContext *C, wmOperator *op)
static void ANIM_OT_channels_rename(wmOperatorType *ot)
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 wmOperatorStatus animchannels_clean_empty_exec(bContext *C, wmOperator *)
static bool separate_slots_poll(bContext *C)
static void animchannel_select_range(bAnimContext *ac, bAnimListElem *cursor_elem)
static wmOperatorStatus graphkeys_channel_view_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void animchannels_group_channels(bAnimContext *ac, bAnimListElem *adt_ref, const char name[])
static wmOperatorStatus slot_channels_move_to_new_action_exec(bContext *C, wmOperator *op)
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 wmOperatorStatus channels_bake_exec(bContext *C, wmOperator *op)
static bool rearrange_island_top(ListBase *list, tReorderChannelIsland *island)
static wmOperatorStatus animchannels_mouseclick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
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 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 rearrange_layered_action_channel_groups(bAnimContext *ac, blender::animrig::Action &action, const eRearrangeAnimChan_Mode mode)
static wmOperatorStatus graphkeys_view_selected_channels_exec(bContext *C, wmOperator *op)
static void ANIM_OT_channels_move(wmOperatorType *ot)
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 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 wmOperatorStatus animchannels_expand_exec(bContext *C, wmOperator *op)
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 wmOperatorStatus animchannels_collapse_exec(bContext *C, wmOperator *op)
static eAnimChannels_SetFlag anim_channels_selection_flag_for_toggle(const ListBase anim_data)
static wmOperatorStatus animchannels_enable_exec(bContext *C, wmOperator *)
static int click_select_channel_scene(bAnimListElem *ale, const short selectmode)
static wmOperatorStatus animchannels_rename_invoke(bContext *C, wmOperator *, const wmEvent *event)
static const EnumPropertyItem prop_animchannel_setflag_types[]
void ED_operatortypes_animchannels()
@ REARRANGE_ANIMCHAN_DOWN
@ REARRANGE_ANIMCHAN_BOTTOM
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_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)
float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short flag, float *r_offset)
float ANIM_nla_tweakedit_remap(bAnimListElem *ale, const float cframe, const eNlaTime_ConvertModes mode)
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)
BMesh const char void * data
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
const TreeNode & as_node() const
Span< FramesMapKeyT > sorted_keys() const
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
void slot_move_to_index(Slot &slot, int to_slot_index)
bool is_action_legacy() const
bool is_action_layered() const
blender::Span< const Slot * > slots() const
bool slot_remove(Slot &slot_to_remove)
Layer & layer_add(std::optional< StringRefNull > name)
const FCurve * fcurve(int64_t index) const
void fcurve_move_to_index(FCurve &fcurve, int to_fcurve_index)
bool fcurve_assign_to_channel_group(FCurve &fcurve, bActionGroup &to_group)
bActionGroup & channel_group_create(StringRefNull name)
bool fcurve_remove(FCurve &fcurve_to_remove)
const bActionGroup * channel_group(int64_t index) const
blender::Span< const FCurve * > fcurves() const
void channel_group_move_to_index(bActionGroup &group, int to_group_index)
blender::Span< const bActionGroup * > channel_groups() const
void set_selected(bool selected)
void set_expanded(bool expanded)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float length(VecOp< float, D >) RET
#define ID_IS_EDITABLE(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void * MEM_callocN(size_t len, const char *str)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool action_treat_as_legacy(const bAction &action)
bool action_fcurve_remove(Action &action, FCurve &fcu)
void animdata_fcurve_delete(AnimData *adt, FCurve *fcu)
Action & action_add(Main &bmain, StringRefNull name)
const animrig::Channelbag * channelbag_for_action_slot(const Action &action, slot_handle_t slot_handle)
void bake_fcurve(FCurve *fcu, blender::int2 range, float step, BakeCurveRemove remove_existing)
Span< FCurve * > fcurves_for_action_slot(Action &action, slot_handle_t slot_handle)
Action * get_action(ID &animated_id)
void move_slot(Main &bmain, Slot &slot, Action &from_action, Action &to_action)
void base_select(Base *base, eObjectSelect_Mode mode)
void base_activate_with_mode_exit_if_needed(bContext *C, Base *base)
VecBase< int32_t, 2 > int2
float wrap(float value, float max, float min)
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 * channelbag
short(* get_offset)(bAnimContext *ac, bAnimListElem *ale)
bool(* name_prop)(bAnimListElem *ale, PointerRNA *r_ptr, PropertyRNA **r_prop)
tReorderChannelIsland * prev
tReorderChannelIsland * next
struct ReportList * reports
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)
wmOperatorStatus WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_invoke(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 *))
wmOperatorStatus WM_operator_flag_only_pass_through_on_press(wmOperatorStatus retval, const wmEvent *event)
wmOperatorStatus WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)
int WM_operator_smooth_viewtx_get(const wmOperator *op)
wmOperatorStatus WM_operator_props_popup(bContext *C, wmOperator *op, const wmEvent *)
bScreen * WM_window_get_active_screen(const wmWindow *win)