Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/editors/space_nla/nla_edit.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/editors/space_nla/nla_edit.c')
-rw-r--r--source/blender/editors/space_nla/nla_edit.c3996
1 files changed, 2023 insertions, 1973 deletions
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index 1d21619fbd1..79c2242cd01 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -21,7 +21,6 @@
* \ingroup spnla
*/
-
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -66,8 +65,8 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "nla_intern.h" // own include
-#include "nla_private.h" // FIXME... maybe this shouldn't be included?
+#include "nla_intern.h" // own include
+#include "nla_private.h" // FIXME... maybe this shouldn't be included?
/* *********************************************** */
/* Utilities exported to other places... */
@@ -75,23 +74,23 @@
/* Perform validation for blending/extend settings */
void ED_nla_postop_refresh(bAnimContext *ac)
{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- short filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT);
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ short filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT);
- /* get blocks to work on */
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+ /* get blocks to work on */
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
- for (ale = anim_data.first; ale; ale = ale->next) {
- /* performing auto-blending, extend-mode validation, etc. */
- BKE_nla_validate_state(ale->data);
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ /* performing auto-blending, extend-mode validation, etc. */
+ BKE_nla_validate_state(ale->data);
- ale->update |= ANIM_UPDATE_DEPS;
- }
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
- /* free temp memory */
- ANIM_animdata_update(ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
+ /* free temp memory */
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* *********************************************** */
@@ -104,92 +103,96 @@ void ED_nla_postop_refresh(bAnimContext *ac)
static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- const bool do_solo = RNA_boolean_get(op->ptr, "isolate_action");
- bool ok = false;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the AnimData blocks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* if no blocks, popup error? */
- if (BLI_listbase_is_empty(&anim_data)) {
- BKE_report(op->reports, RPT_ERROR, "No AnimData blocks to enter tweak mode for");
- return OPERATOR_CANCELLED;
- }
-
- /* for each AnimData block with NLA-data, try setting it in tweak-mode */
- for (ale = anim_data.first; ale; ale = ale->next) {
- AnimData *adt = ale->data;
-
- /* try entering tweakmode if valid */
- ok |= BKE_nla_tweakmode_enter(adt);
-
- /* mark the active track as being "solo"? */
- if (do_solo && adt->actstrip) {
- NlaTrack *nlt = BKE_nlatrack_find_tweaked(adt);
-
- if (nlt && !(nlt->flag & NLATRACK_SOLO)) {
- BKE_nlatrack_solo_toggle(adt, nlt);
- }
- }
-
- ale->update |= ANIM_UPDATE_DEPS;
- }
-
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* if we managed to enter tweakmode on at least one AnimData block,
- * set the flag for this in the active scene and send notifiers
- */
- if (ac.scene && ok) {
- /* set editing flag */
- ac.scene->flag |= SCE_NLA_EDIT_ON;
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA_ACTCHANGE, NULL);
- }
- else {
- BKE_report(op->reports, RPT_ERROR, "No active strip(s) to enter tweak mode on");
- return OPERATOR_CANCELLED;
- }
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ const bool do_solo = RNA_boolean_get(op->ptr, "isolate_action");
+ bool ok = false;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the AnimData blocks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* if no blocks, popup error? */
+ if (BLI_listbase_is_empty(&anim_data)) {
+ BKE_report(op->reports, RPT_ERROR, "No AnimData blocks to enter tweak mode for");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* for each AnimData block with NLA-data, try setting it in tweak-mode */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ AnimData *adt = ale->data;
+
+ /* try entering tweakmode if valid */
+ ok |= BKE_nla_tweakmode_enter(adt);
+
+ /* mark the active track as being "solo"? */
+ if (do_solo && adt->actstrip) {
+ NlaTrack *nlt = BKE_nlatrack_find_tweaked(adt);
+
+ if (nlt && !(nlt->flag & NLATRACK_SOLO)) {
+ BKE_nlatrack_solo_toggle(adt, nlt);
+ }
+ }
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* if we managed to enter tweakmode on at least one AnimData block,
+ * set the flag for this in the active scene and send notifiers
+ */
+ if (ac.scene && ok) {
+ /* set editing flag */
+ ac.scene->flag |= SCE_NLA_EDIT_ON;
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA_ACTCHANGE, NULL);
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "No active strip(s) to enter tweak mode on");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_tweakmode_enter(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
- /* identifiers */
- ot->name = "Enter Tweak Mode";
- ot->idname = "NLA_OT_tweakmode_enter";
- ot->description = "Enter tweaking mode for the action referenced by the active strip to edit its keyframes";
-
- /* api callbacks */
- ot->exec = nlaedit_enable_tweakmode_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- prop = RNA_def_boolean(ot->srna, "isolate_action", 0, "Isolate Action",
- "Enable 'solo' on the NLA Track containing the active strip, "
- "to edit it without seeing the effects of the NLA stack");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name = "Enter Tweak Mode";
+ ot->idname = "NLA_OT_tweakmode_enter";
+ ot->description =
+ "Enter tweaking mode for the action referenced by the active strip to edit its keyframes";
+
+ /* api callbacks */
+ ot->exec = nlaedit_enable_tweakmode_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ prop = RNA_def_boolean(ot->srna,
+ "isolate_action",
+ 0,
+ "Isolate Action",
+ "Enable 'solo' on the NLA Track containing the active strip, "
+ "to edit it without seeing the effects of the NLA stack");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/* ------------- */
@@ -197,99 +200,100 @@ void NLA_OT_tweakmode_enter(wmOperatorType *ot)
/* NLA Editor internal API function for exiting tweakmode */
bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo)
{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* get a list of the AnimData blocks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* if no blocks, popup error? */
- if (BLI_listbase_is_empty(&anim_data)) {
- BKE_report(ac->reports, RPT_ERROR, "No AnimData blocks in tweak mode to exit from");
- return false;
- }
-
- /* for each AnimData block with NLA-data, try exitting tweak-mode */
- for (ale = anim_data.first; ale; ale = ale->next) {
- AnimData *adt = ale->data;
-
- /* clear solo flags */
- if ((do_solo) & (adt->flag & ADT_NLA_SOLO_TRACK) &&
- (adt->flag & ADT_NLA_EDIT_ON))
- {
- BKE_nlatrack_solo_toggle(adt, NULL);
- }
-
- /* to be sure that we're doing everything right, just exit tweakmode... */
- BKE_nla_tweakmode_exit(adt);
-
- ale->update |= ANIM_UPDATE_DEPS;
- }
-
- /* free temp data */
- ANIM_animdata_update(ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* if we managed to enter tweakmode on at least one AnimData block,
- * set the flag for this in the active scene and send notifiers
- */
- if (ac->scene) {
- /* clear editing flag */
- ac->scene->flag &= ~SCE_NLA_EDIT_ON;
-
- /* set notifier that things have changed */
- WM_main_add_notifier(NC_ANIMATION | ND_NLA_ACTCHANGE, NULL);
- }
-
- /* done */
- return true;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get a list of the AnimData blocks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* if no blocks, popup error? */
+ if (BLI_listbase_is_empty(&anim_data)) {
+ BKE_report(ac->reports, RPT_ERROR, "No AnimData blocks in tweak mode to exit from");
+ return false;
+ }
+
+ /* for each AnimData block with NLA-data, try exitting tweak-mode */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ AnimData *adt = ale->data;
+
+ /* clear solo flags */
+ if ((do_solo) & (adt->flag & ADT_NLA_SOLO_TRACK) && (adt->flag & ADT_NLA_EDIT_ON)) {
+ BKE_nlatrack_solo_toggle(adt, NULL);
+ }
+
+ /* to be sure that we're doing everything right, just exit tweakmode... */
+ BKE_nla_tweakmode_exit(adt);
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+
+ /* free temp data */
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* if we managed to enter tweakmode on at least one AnimData block,
+ * set the flag for this in the active scene and send notifiers
+ */
+ if (ac->scene) {
+ /* clear editing flag */
+ ac->scene->flag &= ~SCE_NLA_EDIT_ON;
+
+ /* set notifier that things have changed */
+ WM_main_add_notifier(NC_ANIMATION | ND_NLA_ACTCHANGE, NULL);
+ }
+
+ /* done */
+ return true;
}
/* exit tweakmode operator callback */
static int nlaedit_disable_tweakmode_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
+ bAnimContext ac;
- const bool do_solo = RNA_boolean_get(op->ptr, "isolate_action");
- bool ok = false;
+ const bool do_solo = RNA_boolean_get(op->ptr, "isolate_action");
+ bool ok = false;
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
- /* perform operation */
- ok = nlaedit_disable_tweakmode(&ac, do_solo);
+ /* perform operation */
+ ok = nlaedit_disable_tweakmode(&ac, do_solo);
- /* success? */
- if (ok)
- return OPERATOR_FINISHED;
- else
- return OPERATOR_CANCELLED;
+ /* success? */
+ if (ok)
+ return OPERATOR_FINISHED;
+ else
+ return OPERATOR_CANCELLED;
}
void NLA_OT_tweakmode_exit(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
- /* identifiers */
- ot->name = "Exit Tweak Mode";
- ot->idname = "NLA_OT_tweakmode_exit";
- ot->description = "Exit tweaking mode for the action referenced by the active strip";
-
- /* api callbacks */
- ot->exec = nlaedit_disable_tweakmode_exec;
- ot->poll = nlaop_poll_tweakmode_on;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- prop = RNA_def_boolean(ot->srna, "isolate_action", 0, "Isolate Action",
- "Disable 'solo' on any of the NLA Tracks after exiting tweak mode "
- "to get things back to normal");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name = "Exit Tweak Mode";
+ ot->idname = "NLA_OT_tweakmode_exit";
+ ot->description = "Exit tweaking mode for the action referenced by the active strip";
+
+ /* api callbacks */
+ ot->exec = nlaedit_disable_tweakmode_exec;
+ ot->poll = nlaop_poll_tweakmode_on;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ prop = RNA_def_boolean(ot->srna,
+ "isolate_action",
+ 0,
+ "Isolate Action",
+ "Disable 'solo' on any of the NLA Tracks after exiting tweak mode "
+ "to get things back to normal");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/* *********************************************** */
@@ -300,98 +304,98 @@ void NLA_OT_tweakmode_exit(wmOperatorType *ot)
/* Get the min/max strip extents */
static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const bool only_sel)
{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
- bool found_bounds = false;
-
- /* get data to filter */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_NODUPLIS);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* set large values to try to override */
- *min = 999999999.0f;
- *max = -999999999.0f;
-
- /* check if any channels to set range with */
- if (anim_data.first) {
- /* go through channels, finding max extents */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* only consider selected strips? */
- if ((only_sel == false) || (strip->flag & NLASTRIP_FLAG_SELECT)) {
- /* extend range if appropriate */
- *min = min_ff(*min, strip->start);
- *max = max_ff(*max, strip->end);
-
- found_bounds = true;
- }
- }
- }
-
- /* free memory */
- ANIM_animdata_freelist(&anim_data);
- }
-
- /* set default range if nothing happened */
- if (found_bounds == false) {
- if (ac->scene) {
- *min = (float)ac->scene->r.sfra;
- *max = (float)ac->scene->r.efra;
- }
- else {
- *min = -5;
- *max = 100;
- }
- }
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ bool found_bounds = false;
+
+ /* get data to filter */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_NODUPLIS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* set large values to try to override */
+ *min = 999999999.0f;
+ *max = -999999999.0f;
+
+ /* check if any channels to set range with */
+ if (anim_data.first) {
+ /* go through channels, finding max extents */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* only consider selected strips? */
+ if ((only_sel == false) || (strip->flag & NLASTRIP_FLAG_SELECT)) {
+ /* extend range if appropriate */
+ *min = min_ff(*min, strip->start);
+ *max = max_ff(*max, strip->end);
+
+ found_bounds = true;
+ }
+ }
+ }
+
+ /* free memory */
+ ANIM_animdata_freelist(&anim_data);
+ }
+
+ /* set default range if nothing happened */
+ if (found_bounds == false) {
+ if (ac->scene) {
+ *min = (float)ac->scene->r.sfra;
+ *max = (float)ac->scene->r.efra;
+ }
+ else {
+ *min = -5;
+ *max = 100;
+ }
+ }
}
/* ****************** Automatic Preview-Range Operator ****************** */
static int nlaedit_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
- Scene *scene;
- float min, max;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- if (ac.scene == NULL)
- return OPERATOR_CANCELLED;
- else
- scene = ac.scene;
-
- /* set the range directly */
- get_nlastrip_extents(&ac, &min, &max, true);
- scene->r.flag |= SCER_PRV_RANGE;
- scene->r.psfra = round_fl_to_int(min);
- scene->r.pefra = round_fl_to_int(max);
-
- /* set notifier that things have changed */
- // XXX err... there's nothing for frame ranges yet, but this should do fine too
- WM_event_add_notifier(C, NC_SCENE | ND_FRAME, ac.scene);
-
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+ Scene *scene;
+ float min, max;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ if (ac.scene == NULL)
+ return OPERATOR_CANCELLED;
+ else
+ scene = ac.scene;
+
+ /* set the range directly */
+ get_nlastrip_extents(&ac, &min, &max, true);
+ scene->r.flag |= SCER_PRV_RANGE;
+ scene->r.psfra = round_fl_to_int(min);
+ scene->r.pefra = round_fl_to_int(max);
+
+ /* set notifier that things have changed */
+ // XXX err... there's nothing for frame ranges yet, but this should do fine too
+ WM_event_add_notifier(C, NC_SCENE | ND_FRAME, ac.scene);
+
+ return OPERATOR_FINISHED;
}
void NLA_OT_previewrange_set(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Auto-Set Preview Range";
- ot->idname = "NLA_OT_previewrange_set";
- ot->description = "Automatically set Preview Range based on range of keyframes";
+ /* identifiers */
+ ot->name = "Auto-Set Preview Range";
+ ot->idname = "NLA_OT_previewrange_set";
+ ot->description = "Automatically set Preview Range based on range of keyframes";
- /* api callbacks */
- ot->exec = nlaedit_previewrange_exec;
- ot->poll = ED_operator_nla_active;
+ /* api callbacks */
+ ot->exec = nlaedit_previewrange_exec;
+ ot->poll = ED_operator_nla_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ****************** View-All Operator ****************** */
@@ -405,170 +409,169 @@ void NLA_OT_previewrange_set(wmOperatorType *ot)
*/
static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, float *max)
{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- SpaceNla *snla = (SpaceNla *)ac->sl;
- const float half_height = NLACHANNEL_HEIGHT_HALF(snla);
- /* NOTE: not bool, since we want prioritise individual channels over expanders */
- short found = 0;
- float y;
-
- /* get all items - we need to do it this way */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* loop through all channels, finding the first one that's selected */
- y = (float)NLACHANNEL_FIRST;
-
- for (ale = anim_data.first; ale; ale = ale->next) {
- const bAnimChannelType *acf = ANIM_channel_get_typeinfo(ale);
-
- /* must be selected... */
- if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) &&
- ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT))
- {
- /* update best estimate */
- *min = (float)(y - half_height);
- *max = (float)(y + half_height);
-
- /* is this high enough priority yet? */
- found = acf->channel_role;
-
- /* only stop our search when we've found an actual channel
- * - datablock expanders get less priority so that we don't abort prematurely
- */
- if (found == ACHANNEL_ROLE_CHANNEL) {
- break;
- }
- }
-
- /* adjust y-position for next one */
- y -= NLACHANNEL_STEP(snla);
- }
-
- /* free all temp data */
- ANIM_animdata_freelist(&anim_data);
-
- return (found != 0);
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ SpaceNla *snla = (SpaceNla *)ac->sl;
+ const float half_height = NLACHANNEL_HEIGHT_HALF(snla);
+ /* NOTE: not bool, since we want prioritise individual channels over expanders */
+ short found = 0;
+ float y;
+
+ /* get all items - we need to do it this way */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* loop through all channels, finding the first one that's selected */
+ y = (float)NLACHANNEL_FIRST;
+
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ const bAnimChannelType *acf = ANIM_channel_get_typeinfo(ale);
+
+ /* must be selected... */
+ if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) &&
+ ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) {
+ /* update best estimate */
+ *min = (float)(y - half_height);
+ *max = (float)(y + half_height);
+
+ /* is this high enough priority yet? */
+ found = acf->channel_role;
+
+ /* only stop our search when we've found an actual channel
+ * - datablock expanders get less priority so that we don't abort prematurely
+ */
+ if (found == ACHANNEL_ROLE_CHANNEL) {
+ break;
+ }
+ }
+
+ /* adjust y-position for next one */
+ y -= NLACHANNEL_STEP(snla);
+ }
+
+ /* free all temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ return (found != 0);
}
static int nlaedit_viewall(bContext *C, const bool only_sel)
{
- bAnimContext ac;
- View2D *v2d;
- float extra;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
- v2d = &ac.ar->v2d;
-
- /* set the horizontal range, with an extra offset so that the extreme keys will be in view */
- get_nlastrip_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, only_sel);
-
- extra = 0.1f * BLI_rctf_size_x(&v2d->cur);
- v2d->cur.xmin -= extra;
- v2d->cur.xmax += extra;
-
- /* set vertical range */
- if (only_sel == false) {
- /* view all -> the summary channel is usually the shows everything,
- * and resides right at the top... */
- v2d->cur.ymax = 0.0f;
- v2d->cur.ymin = (float)-BLI_rcti_size_y(&v2d->mask);
- }
- else {
- /* locate first selected channel (or the active one), and frame those */
- float ymin = v2d->cur.ymin;
- float ymax = v2d->cur.ymax;
-
- if (nla_channels_get_selected_extents(&ac, &ymin, &ymax)) {
- /* recenter the view so that this range is in the middle */
- float ymid = (ymax - ymin) / 2.0f + ymin;
- float x_center;
-
- UI_view2d_center_get(v2d, &x_center, NULL);
- UI_view2d_center_set(v2d, x_center, ymid);
- }
- }
-
- /* do View2D syncing */
- UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
-
- /* just redraw this view */
- ED_area_tag_redraw(CTX_wm_area(C));
-
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+ View2D *v2d;
+ float extra;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+ v2d = &ac.ar->v2d;
+
+ /* set the horizontal range, with an extra offset so that the extreme keys will be in view */
+ get_nlastrip_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, only_sel);
+
+ extra = 0.1f * BLI_rctf_size_x(&v2d->cur);
+ v2d->cur.xmin -= extra;
+ v2d->cur.xmax += extra;
+
+ /* set vertical range */
+ if (only_sel == false) {
+ /* view all -> the summary channel is usually the shows everything,
+ * and resides right at the top... */
+ v2d->cur.ymax = 0.0f;
+ v2d->cur.ymin = (float)-BLI_rcti_size_y(&v2d->mask);
+ }
+ else {
+ /* locate first selected channel (or the active one), and frame those */
+ float ymin = v2d->cur.ymin;
+ float ymax = v2d->cur.ymax;
+
+ if (nla_channels_get_selected_extents(&ac, &ymin, &ymax)) {
+ /* recenter the view so that this range is in the middle */
+ float ymid = (ymax - ymin) / 2.0f + ymin;
+ float x_center;
+
+ UI_view2d_center_get(v2d, &x_center, NULL);
+ UI_view2d_center_set(v2d, x_center, ymid);
+ }
+ }
+
+ /* do View2D syncing */
+ UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
+
+ /* just redraw this view */
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
}
/* ......... */
static int nlaedit_viewall_exec(bContext *C, wmOperator *UNUSED(op))
{
- /* whole range */
- return nlaedit_viewall(C, false);
+ /* whole range */
+ return nlaedit_viewall(C, false);
}
static int nlaedit_viewsel_exec(bContext *C, wmOperator *UNUSED(op))
{
- /* only selected */
- return nlaedit_viewall(C, true);
+ /* only selected */
+ return nlaedit_viewall(C, true);
}
void NLA_OT_view_all(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "View All";
- ot->idname = "NLA_OT_view_all";
- ot->description = "Reset viewable area to show full strips range";
+ /* identifiers */
+ ot->name = "View All";
+ ot->idname = "NLA_OT_view_all";
+ ot->description = "Reset viewable area to show full strips range";
- /* api callbacks */
- ot->exec = nlaedit_viewall_exec;
- ot->poll = ED_operator_nla_active;
+ /* api callbacks */
+ ot->exec = nlaedit_viewall_exec;
+ ot->poll = ED_operator_nla_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
void NLA_OT_view_selected(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "View Selected";
- ot->idname = "NLA_OT_view_selected";
- ot->description = "Reset viewable area to show selected strips range";
+ /* identifiers */
+ ot->name = "View Selected";
+ ot->idname = "NLA_OT_view_selected";
+ ot->description = "Reset viewable area to show selected strips range";
- /* api callbacks */
- ot->exec = nlaedit_viewsel_exec;
- ot->poll = ED_operator_nla_active;
+ /* api callbacks */
+ ot->exec = nlaedit_viewsel_exec;
+ ot->poll = ED_operator_nla_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* *********************************************** */
static int nlaedit_viewframe_exec(bContext *C, wmOperator *op)
{
- const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
- ANIM_center_frame(C, smooth_viewtx);
- return OPERATOR_FINISHED;
+ const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
+ ANIM_center_frame(C, smooth_viewtx);
+ return OPERATOR_FINISHED;
}
void NLA_OT_view_frame(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "View Frame";
- ot->idname = "NLA_OT_view_frame";
- ot->description = "Reset viewable area to show range around current frame";
+ /* identifiers */
+ ot->name = "View Frame";
+ ot->idname = "NLA_OT_view_frame";
+ ot->description = "Reset viewable area to show range around current frame";
- /* api callbacks */
- ot->exec = nlaedit_viewframe_exec;
- ot->poll = ED_operator_nla_active;
+ /* api callbacks */
+ ot->exec = nlaedit_viewframe_exec;
+ ot->poll = ED_operator_nla_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* *********************************************** */
@@ -578,138 +581,144 @@ void NLA_OT_view_frame(wmOperatorType *ot)
/* Add a new Action-Clip strip to the active track
* (or the active block if no space in the track) */
-
/* add the specified action as new strip */
static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
- Scene *scene;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- size_t items;
- int filter;
-
- bAction *act;
-
- float cfra;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- scene = ac.scene;
- cfra = (float)CFRA;
-
- /* get action to use */
- act = BLI_findlink(&CTX_data_main(C)->actions, RNA_enum_get(op->ptr, "action"));
-
- if (act == NULL) {
- BKE_report(op->reports, RPT_ERROR, "No valid action to add");
- //printf("Add strip - actname = '%s'\n", actname);
- return OPERATOR_CANCELLED;
- }
- else if (act->idroot == 0) {
- /* hopefully in this case (i.e. library of userless actions),
- * the user knows what they're doing... */
- BKE_reportf(op->reports, RPT_WARNING,
- "Action '%s' does not specify what data-blocks it can be used on "
- "(try setting the 'ID Root Type' setting from the data-blocks editor "
- "for this action to avoid future problems)",
- act->id.name + 2);
- }
-
- /* add tracks to empty but selected animdata blocks so that strips can be added to those directly
- * without having to manually add tracks first
- */
- nlaedit_add_tracks_empty(&ac);
-
- /* get a list of the editable tracks being shown in the NLA
- * - this is limited to active ones for now, but could be expanded to
- */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ACTIVE | ANIMFILTER_FOREDIT);
- items = ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- if (items == 0) {
- BKE_report(op->reports, RPT_ERROR,
- "No active track(s) to add strip to, select an existing track or add one before trying again");
- return OPERATOR_CANCELLED;
- }
-
- /* for every active track,
- * try to add strip to free space in track or to the top of the stack if no space */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- AnimData *adt = ale->adt;
- NlaStrip *strip = NULL;
-
- /* sanity check: only apply actions of the right type for this ID
- * NOTE: in the case that this hasn't been set, we've already warned the user about this already
- */
- if ((act->idroot) && (act->idroot != GS(ale->id->name))) {
- BKE_reportf(op->reports, RPT_ERROR,
- "Could not add action '%s' as it cannot be used relative to ID-blocks of type '%s'",
- act->id.name + 2, ale->id->name);
- continue;
- }
-
- /* create a new strip, and offset it to start on the current frame */
- strip = BKE_nlastrip_new(act);
-
- strip->end += (cfra - strip->start);
- strip->start = cfra;
-
- /* firstly try adding strip to our current track, but if that fails, add to a new track */
- if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
- /* trying to add to the current failed (no space),
- * so add a new track to the stack, and add to that...
- */
- nlt = BKE_nlatrack_add(adt, NULL);
- BKE_nlatrack_add_strip(nlt, strip);
- }
-
- /* auto-name it */
- BKE_nlastrip_validate_name(adt, strip);
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- DEG_relations_tag_update(ac.bmain);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+ Scene *scene;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ size_t items;
+ int filter;
+
+ bAction *act;
+
+ float cfra;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ scene = ac.scene;
+ cfra = (float)CFRA;
+
+ /* get action to use */
+ act = BLI_findlink(&CTX_data_main(C)->actions, RNA_enum_get(op->ptr, "action"));
+
+ if (act == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No valid action to add");
+ //printf("Add strip - actname = '%s'\n", actname);
+ return OPERATOR_CANCELLED;
+ }
+ else if (act->idroot == 0) {
+ /* hopefully in this case (i.e. library of userless actions),
+ * the user knows what they're doing... */
+ BKE_reportf(op->reports,
+ RPT_WARNING,
+ "Action '%s' does not specify what data-blocks it can be used on "
+ "(try setting the 'ID Root Type' setting from the data-blocks editor "
+ "for this action to avoid future problems)",
+ act->id.name + 2);
+ }
+
+ /* add tracks to empty but selected animdata blocks so that strips can be added to those directly
+ * without having to manually add tracks first
+ */
+ nlaedit_add_tracks_empty(&ac);
+
+ /* get a list of the editable tracks being shown in the NLA
+ * - this is limited to active ones for now, but could be expanded to
+ */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ACTIVE | ANIMFILTER_FOREDIT);
+ items = ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ if (items == 0) {
+ BKE_report(op->reports,
+ RPT_ERROR,
+ "No active track(s) to add strip to, select an existing track or add one before "
+ "trying again");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* for every active track,
+ * try to add strip to free space in track or to the top of the stack if no space */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ AnimData *adt = ale->adt;
+ NlaStrip *strip = NULL;
+
+ /* sanity check: only apply actions of the right type for this ID
+ * NOTE: in the case that this hasn't been set, we've already warned the user about this already
+ */
+ if ((act->idroot) && (act->idroot != GS(ale->id->name))) {
+ BKE_reportf(
+ op->reports,
+ RPT_ERROR,
+ "Could not add action '%s' as it cannot be used relative to ID-blocks of type '%s'",
+ act->id.name + 2,
+ ale->id->name);
+ continue;
+ }
+
+ /* create a new strip, and offset it to start on the current frame */
+ strip = BKE_nlastrip_new(act);
+
+ strip->end += (cfra - strip->start);
+ strip->start = cfra;
+
+ /* firstly try adding strip to our current track, but if that fails, add to a new track */
+ if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+ /* trying to add to the current failed (no space),
+ * so add a new track to the stack, and add to that...
+ */
+ nlt = BKE_nlatrack_add(adt, NULL);
+ BKE_nlatrack_add_strip(nlt, strip);
+ }
+
+ /* auto-name it */
+ BKE_nlastrip_validate_name(adt, strip);
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ DEG_relations_tag_update(ac.bmain);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_actionclip_add(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
- /* identifiers */
- ot->name = "Add Action Strip";
- ot->idname = "NLA_OT_actionclip_add";
- ot->description = "Add an Action-Clip strip (i.e. an NLA Strip referencing an Action) to the active track";
-
- /* api callbacks */
- ot->invoke = WM_enum_search_invoke;
- ot->exec = nlaedit_add_actionclip_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* props */
- // TODO: this would be nicer as an ID-pointer...
- prop = RNA_def_enum(ot->srna, "action", DummyRNA_NULL_items, 0, "Action", "");
- RNA_def_enum_funcs(prop, RNA_action_itemf);
- RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE);
- ot->prop = prop;
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name = "Add Action Strip";
+ ot->idname = "NLA_OT_actionclip_add";
+ ot->description =
+ "Add an Action-Clip strip (i.e. an NLA Strip referencing an Action) to the active track";
+
+ /* api callbacks */
+ ot->invoke = WM_enum_search_invoke;
+ ot->exec = nlaedit_add_actionclip_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* props */
+ // TODO: this would be nicer as an ID-pointer...
+ prop = RNA_def_enum(ot->srna, "action", DummyRNA_NULL_items, 0, "Action", "");
+ RNA_def_enum_funcs(prop, RNA_action_itemf);
+ RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE);
+ ot->prop = prop;
}
/* ******************** Add Transition Operator ***************************** */
@@ -717,117 +726,119 @@ void NLA_OT_actionclip_add(wmOperatorType *ot)
static int nlaedit_add_transition_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- bool done = false;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each track, find pairs of strips to add transitions to */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- AnimData *adt = ale->adt;
- NlaStrip *s1, *s2;
-
- /* get initial pair of strips */
- if (ELEM(nlt->strips.first, NULL, nlt->strips.last))
- continue;
- s1 = nlt->strips.first;
- s2 = s1->next;
-
- /* loop over strips */
- for (; s1 && s2; s1 = s2, s2 = s2->next) {
- NlaStrip *strip;
-
- /* check if both are selected */
- if (ELEM(0, (s1->flag & NLASTRIP_FLAG_SELECT), (s2->flag & NLASTRIP_FLAG_SELECT)))
- continue;
- /* check if there's space between the two */
- if (IS_EQF(s1->end, s2->start))
- continue;
- /* make sure neither one is a transition
- * - although this is impossible to create with the standard tools,
- * the user may have altered the settings
- */
- if (ELEM(NLASTRIP_TYPE_TRANSITION, s1->type, s2->type))
- continue;
- /* also make sure neither one is a soundclip */
- if (ELEM(NLASTRIP_TYPE_SOUND, s1->type, s2->type))
- continue;
-
- /* allocate new strip */
- strip = MEM_callocN(sizeof(NlaStrip), "NlaStrip");
- BLI_insertlinkafter(&nlt->strips, s1, strip);
-
- /* set the type */
- strip->type = NLASTRIP_TYPE_TRANSITION;
-
- /* generic settings
- * - selected flag to highlight this to the user
- * - auto-blends to ensure that blend in/out values are automatically
- * determined by overlaps of strips
- */
- strip->flag = NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_AUTO_BLENDS;
-
- /* range is simply defined as the endpoints of the adjacent strips */
- strip->start = s1->end;
- strip->end = s2->start;
-
- /* scale and repeat aren't of any use, but shouldn't ever be 0 */
- strip->scale = 1.0f;
- strip->repeat = 1.0f;
-
- /* auto-name it */
- BKE_nlastrip_validate_name(adt, strip);
-
- /* make note of this */
- done = true;
- }
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* was anything added? */
- if (done) {
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
- }
- else {
- BKE_report(op->reports, RPT_ERROR, "Needs at least a pair of adjacent selected strips with a gap between them");
- return OPERATOR_CANCELLED;
- }
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ bool done = false;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each track, find pairs of strips to add transitions to */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ AnimData *adt = ale->adt;
+ NlaStrip *s1, *s2;
+
+ /* get initial pair of strips */
+ if (ELEM(nlt->strips.first, NULL, nlt->strips.last))
+ continue;
+ s1 = nlt->strips.first;
+ s2 = s1->next;
+
+ /* loop over strips */
+ for (; s1 && s2; s1 = s2, s2 = s2->next) {
+ NlaStrip *strip;
+
+ /* check if both are selected */
+ if (ELEM(0, (s1->flag & NLASTRIP_FLAG_SELECT), (s2->flag & NLASTRIP_FLAG_SELECT)))
+ continue;
+ /* check if there's space between the two */
+ if (IS_EQF(s1->end, s2->start))
+ continue;
+ /* make sure neither one is a transition
+ * - although this is impossible to create with the standard tools,
+ * the user may have altered the settings
+ */
+ if (ELEM(NLASTRIP_TYPE_TRANSITION, s1->type, s2->type))
+ continue;
+ /* also make sure neither one is a soundclip */
+ if (ELEM(NLASTRIP_TYPE_SOUND, s1->type, s2->type))
+ continue;
+
+ /* allocate new strip */
+ strip = MEM_callocN(sizeof(NlaStrip), "NlaStrip");
+ BLI_insertlinkafter(&nlt->strips, s1, strip);
+
+ /* set the type */
+ strip->type = NLASTRIP_TYPE_TRANSITION;
+
+ /* generic settings
+ * - selected flag to highlight this to the user
+ * - auto-blends to ensure that blend in/out values are automatically
+ * determined by overlaps of strips
+ */
+ strip->flag = NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_AUTO_BLENDS;
+
+ /* range is simply defined as the endpoints of the adjacent strips */
+ strip->start = s1->end;
+ strip->end = s2->start;
+
+ /* scale and repeat aren't of any use, but shouldn't ever be 0 */
+ strip->scale = 1.0f;
+ strip->repeat = 1.0f;
+
+ /* auto-name it */
+ BKE_nlastrip_validate_name(adt, strip);
+
+ /* make note of this */
+ done = true;
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* was anything added? */
+ if (done) {
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+ }
+ else {
+ BKE_report(op->reports,
+ RPT_ERROR,
+ "Needs at least a pair of adjacent selected strips with a gap between them");
+ return OPERATOR_CANCELLED;
+ }
}
void NLA_OT_transition_add(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Add Transition";
- ot->idname = "NLA_OT_transition_add";
- ot->description = "Add a transition strip between two adjacent selected strips";
+ /* identifiers */
+ ot->name = "Add Transition";
+ ot->idname = "NLA_OT_transition_add";
+ ot->description = "Add a transition strip between two adjacent selected strips";
- /* api callbacks */
- ot->exec = nlaedit_add_transition_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_add_transition_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Add Sound Clip Operator ***************************** */
@@ -835,84 +846,85 @@ void NLA_OT_transition_add(wmOperatorType *ot)
static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
+ bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
- Scene *scene;
- int cfra;
+ Scene *scene;
+ int cfra;
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
- scene = ac.scene;
- cfra = CFRA;
+ scene = ac.scene;
+ cfra = CFRA;
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_SEL |
+ ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- /* for each track, add sound clips if it belongs to a speaker */
- // TODO: what happens if there aren't any tracks... well that's a more general problem for later
- for (ale = anim_data.first; ale; ale = ale->next) {
- Object *ob = (Object *)ale->id; /* may not be object until we actually check! */
+ /* for each track, add sound clips if it belongs to a speaker */
+ // TODO: what happens if there aren't any tracks... well that's a more general problem for later
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ Object *ob = (Object *)ale->id; /* may not be object until we actually check! */
- AnimData *adt = ale->adt;
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
+ AnimData *adt = ale->adt;
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
- /* does this belong to speaker - assumed to live on Object level only */
- if ((GS(ale->id->name) != ID_OB) || (ob->type != OB_SPEAKER))
- continue;
+ /* does this belong to speaker - assumed to live on Object level only */
+ if ((GS(ale->id->name) != ID_OB) || (ob->type != OB_SPEAKER))
+ continue;
- /* create a new strip, and offset it to start on the current frame */
- strip = BKE_nla_add_soundstrip(ac.scene, ob->data);
+ /* create a new strip, and offset it to start on the current frame */
+ strip = BKE_nla_add_soundstrip(ac.scene, ob->data);
- strip->start += cfra;
- strip->end += cfra;
+ strip->start += cfra;
+ strip->end += cfra;
- /* firstly try adding strip to our current track, but if that fails, add to a new track */
- if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
- /* trying to add to the current failed (no space),
- * so add a new track to the stack, and add to that...
- */
- nlt = BKE_nlatrack_add(adt, NULL);
- BKE_nlatrack_add_strip(nlt, strip);
- }
+ /* firstly try adding strip to our current track, but if that fails, add to a new track */
+ if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+ /* trying to add to the current failed (no space),
+ * so add a new track to the stack, and add to that...
+ */
+ nlt = BKE_nlatrack_add(adt, NULL);
+ BKE_nlatrack_add_strip(nlt, strip);
+ }
- /* auto-name it */
- BKE_nlastrip_validate_name(adt, strip);
- }
+ /* auto-name it */
+ BKE_nlastrip_validate_name(adt, strip);
+ }
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
- /* done */
- return OPERATOR_FINISHED;
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_soundclip_add(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Add Sound Clip";
- ot->idname = "NLA_OT_soundclip_add";
- ot->description = "Add a strip for controlling when speaker plays its sound clip";
+ /* identifiers */
+ ot->name = "Add Sound Clip";
+ ot->idname = "NLA_OT_soundclip_add";
+ ot->description = "Add a strip for controlling when speaker plays its sound clip";
- /* api callbacks */
- ot->exec = nlaedit_add_sound_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_add_sound_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Add Meta-Strip Operator ***************************** */
@@ -921,63 +933,63 @@ void NLA_OT_soundclip_add(wmOperatorType *ot)
/* add the specified action as new strip */
static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
+ bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- /* for each track, find pairs of strips to add transitions to */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- AnimData *adt = ale->adt;
- NlaStrip *strip;
+ /* for each track, find pairs of strips to add transitions to */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ AnimData *adt = ale->adt;
+ NlaStrip *strip;
- /* create meta-strips from the continuous chains of selected strips */
- BKE_nlastrips_make_metas(&nlt->strips, 0);
+ /* create meta-strips from the continuous chains of selected strips */
+ BKE_nlastrips_make_metas(&nlt->strips, 0);
- /* name the metas */
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* auto-name this strip if selected (that means it is a meta) */
- if (strip->flag & NLASTRIP_FLAG_SELECT)
- BKE_nlastrip_validate_name(adt, strip);
- }
+ /* name the metas */
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* auto-name this strip if selected (that means it is a meta) */
+ if (strip->flag & NLASTRIP_FLAG_SELECT)
+ BKE_nlastrip_validate_name(adt, strip);
+ }
- ale->update |= ANIM_UPDATE_DEPS;
- }
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
- /* done */
- return OPERATOR_FINISHED;
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_meta_add(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Add Meta-Strips";
- ot->idname = "NLA_OT_meta_add";
- ot->description = "Add new meta-strips incorporating the selected strips";
+ /* identifiers */
+ ot->name = "Add Meta-Strips";
+ ot->idname = "NLA_OT_meta_add";
+ ot->description = "Add new meta-strips incorporating the selected strips";
- /* api callbacks */
- ot->exec = nlaedit_add_meta_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_add_meta_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Remove Meta-Strip Operator ***************************** */
@@ -985,54 +997,54 @@ void NLA_OT_meta_add(wmOperatorType *ot)
static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
+ bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- /* for each track, find pairs of strips to add transitions to */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
+ /* for each track, find pairs of strips to add transitions to */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
- /* clear all selected meta-strips, regardless of whether they are temporary or not */
- BKE_nlastrips_clear_metas(&nlt->strips, 1, 0);
+ /* clear all selected meta-strips, regardless of whether they are temporary or not */
+ BKE_nlastrips_clear_metas(&nlt->strips, 1, 0);
- ale->update |= ANIM_UPDATE_DEPS;
- }
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
- /* done */
- return OPERATOR_FINISHED;
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_meta_remove(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Remove Meta-Strips";
- ot->idname = "NLA_OT_meta_remove";
- ot->description = "Separate out the strips held by the selected meta-strips";
+ /* identifiers */
+ ot->name = "Remove Meta-Strips";
+ ot->idname = "NLA_OT_meta_remove";
+ ot->description = "Separate out the strips held by the selected meta-strips";
- /* api callbacks */
- ot->exec = nlaedit_remove_meta_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_remove_meta_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Duplicate Strips Operator ************************** */
@@ -1042,113 +1054,118 @@ void NLA_OT_meta_remove(wmOperatorType *ot)
static int nlaedit_duplicate_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- bool linked = RNA_boolean_get(op->ptr, "linked");
- bool done = false;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* duplicate strips in tracks starting from the last one so that we're
- * less likely to duplicate strips we just duplicated...
- */
- for (ale = anim_data.last; ale; ale = ale->prev) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- AnimData *adt = ale->adt;
- NlaStrip *strip, *nstrip, *next;
- NlaTrack *track;
-
- for (strip = nlt->strips.first; strip; strip = next) {
- next = strip->next;
-
- /* if selected, split the strip at its midpoint */
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* make a copy (assume that this is possible) */
- nstrip = BKE_nlastrip_copy(ac.bmain, strip, linked, 0);
-
- /* in case there's no space in the track above,
- * or we haven't got a reference to it yet, try adding */
- if (BKE_nlatrack_add_strip(nlt->next, nstrip) == 0) {
- /* need to add a new track above the one above the current one
- * - if the current one is the last one, nlt->next will be NULL, which defaults to adding
- * at the top of the stack anyway...
- */
- track = BKE_nlatrack_add(adt, nlt->next);
- BKE_nlatrack_add_strip(track, nstrip);
- }
-
- /* deselect the original and the active flag */
- strip->flag &= ~(NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_ACTIVE);
-
- /* auto-name newly created strip */
- BKE_nlastrip_validate_name(adt, nstrip);
-
- done = true;
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- if (done) {
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- if (!linked) {
- DEG_relations_tag_update(ac.bmain);
- }
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
- }
- else
- return OPERATOR_CANCELLED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ bool linked = RNA_boolean_get(op->ptr, "linked");
+ bool done = false;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* duplicate strips in tracks starting from the last one so that we're
+ * less likely to duplicate strips we just duplicated...
+ */
+ for (ale = anim_data.last; ale; ale = ale->prev) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ AnimData *adt = ale->adt;
+ NlaStrip *strip, *nstrip, *next;
+ NlaTrack *track;
+
+ for (strip = nlt->strips.first; strip; strip = next) {
+ next = strip->next;
+
+ /* if selected, split the strip at its midpoint */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* make a copy (assume that this is possible) */
+ nstrip = BKE_nlastrip_copy(ac.bmain, strip, linked, 0);
+
+ /* in case there's no space in the track above,
+ * or we haven't got a reference to it yet, try adding */
+ if (BKE_nlatrack_add_strip(nlt->next, nstrip) == 0) {
+ /* need to add a new track above the one above the current one
+ * - if the current one is the last one, nlt->next will be NULL, which defaults to adding
+ * at the top of the stack anyway...
+ */
+ track = BKE_nlatrack_add(adt, nlt->next);
+ BKE_nlatrack_add_strip(track, nstrip);
+ }
+
+ /* deselect the original and the active flag */
+ strip->flag &= ~(NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_ACTIVE);
+
+ /* auto-name newly created strip */
+ BKE_nlastrip_validate_name(adt, nstrip);
+
+ done = true;
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ if (done) {
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ if (!linked) {
+ DEG_relations_tag_update(ac.bmain);
+ }
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+ }
+ else
+ return OPERATOR_CANCELLED;
}
static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- nlaedit_duplicate_exec(C, op);
+ nlaedit_duplicate_exec(C, op);
- RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+ RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
+ WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void NLA_OT_duplicate(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Duplicate Strips";
- ot->idname = "NLA_OT_duplicate";
- ot->description = "Duplicate selected NLA-Strips, adding the new strips in new tracks above the originals";
-
- /* api callbacks */
- ot->invoke = nlaedit_duplicate_invoke;
- ot->exec = nlaedit_duplicate_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* own properties */
- ot->prop = RNA_def_boolean(ot->srna, "linked", false, "Linked", "When duplicating strips, assign new copies of the actions they use");
-
- /* to give to transform */
- RNA_def_enum(ot->srna, "mode", rna_enum_transform_mode_types, TFM_TRANSLATION, "Mode", "");
+ /* identifiers */
+ ot->name = "Duplicate Strips";
+ ot->idname = "NLA_OT_duplicate";
+ ot->description =
+ "Duplicate selected NLA-Strips, adding the new strips in new tracks above the originals";
+
+ /* api callbacks */
+ ot->invoke = nlaedit_duplicate_invoke;
+ ot->exec = nlaedit_duplicate_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* own properties */
+ ot->prop = RNA_def_boolean(ot->srna,
+ "linked",
+ false,
+ "Linked",
+ "When duplicating strips, assign new copies of the actions they use");
+
+ /* to give to transform */
+ RNA_def_enum(ot->srna, "mode", rna_enum_transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/* ******************** Delete Strips Operator ***************************** */
@@ -1156,72 +1173,72 @@ void NLA_OT_duplicate(wmOperatorType *ot)
static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
+ bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- /* for each NLA-Track, delete all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip, *nstrip;
+ /* for each NLA-Track, delete all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip, *nstrip;
- for (strip = nlt->strips.first; strip; strip = nstrip) {
- nstrip = strip->next;
+ for (strip = nlt->strips.first; strip; strip = nstrip) {
+ nstrip = strip->next;
- /* if selected, delete */
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* if a strip either side of this was a transition, delete those too */
- if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION))
- BKE_nlastrip_free(&nlt->strips, strip->prev, true);
- if ((nstrip) && (nstrip->type == NLASTRIP_TYPE_TRANSITION)) {
- nstrip = nstrip->next;
- BKE_nlastrip_free(&nlt->strips, strip->next, true);
- }
+ /* if selected, delete */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* if a strip either side of this was a transition, delete those too */
+ if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION))
+ BKE_nlastrip_free(&nlt->strips, strip->prev, true);
+ if ((nstrip) && (nstrip->type == NLASTRIP_TYPE_TRANSITION)) {
+ nstrip = nstrip->next;
+ BKE_nlastrip_free(&nlt->strips, strip->next, true);
+ }
- /* finally, delete this strip */
- BKE_nlastrip_free(&nlt->strips, strip, true);
- }
- }
- }
+ /* finally, delete this strip */
+ BKE_nlastrip_free(&nlt->strips, strip, true);
+ }
+ }
+ }
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
- DEG_relations_tag_update(ac.bmain);
+ DEG_relations_tag_update(ac.bmain);
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
- /* done */
- return OPERATOR_FINISHED;
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_delete(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Delete Strips";
- ot->idname = "NLA_OT_delete";
- ot->description = "Delete selected strips";
+ /* identifiers */
+ ot->name = "Delete Strips";
+ ot->idname = "NLA_OT_delete";
+ ot->description = "Delete selected strips";
- /* api callbacks */
- ot->exec = nlaedit_delete_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_delete_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Split Strips Operator ***************************** */
@@ -1231,142 +1248,143 @@ void NLA_OT_delete(wmOperatorType *ot)
// - variable-length splits?
/* split a given Action-Clip strip */
-static void nlaedit_split_strip_actclip(Main *bmain, AnimData *adt, NlaTrack *nlt, NlaStrip *strip, float cfra)
+static void nlaedit_split_strip_actclip(
+ Main *bmain, AnimData *adt, NlaTrack *nlt, NlaStrip *strip, float cfra)
{
- NlaStrip *nstrip;
- float splitframe, splitaframe;
-
- /* calculate the frames to do the splitting at
- * - use current frame if within extents of strip
- */
- if ((cfra > strip->start) && (cfra < strip->end)) {
- /* use the current frame */
- splitframe = cfra;
- splitaframe = nlastrip_get_frame(strip, cfra, NLATIME_CONVERT_UNMAP);
- }
- else {
- /* split in the middle */
- float len;
-
- /* strip extents */
- len = strip->end - strip->start;
- if (IS_EQF(len, 0.0f))
- return;
- else
- splitframe = strip->start + (len / 2.0f);
-
- /* action range */
- len = strip->actend - strip->actstart;
- if (IS_EQF(len, 0.0f))
- splitaframe = strip->actend;
- else
- splitaframe = strip->actstart + (len / 2.0f);
- }
-
- /* make a copy (assume that this is possible) and append
- * it immediately after the current strip
- */
- nstrip = BKE_nlastrip_copy(bmain, strip, true, 0);
- BLI_insertlinkafter(&nlt->strips, strip, nstrip);
-
- /* Set the endpoint of the first strip and the start of the new strip
- * to the split-frame values calculated above.
- */
- strip->end = splitframe;
- nstrip->start = splitframe;
-
- if ((splitaframe > strip->actstart) && (splitaframe < strip->actend)) {
- /* only do this if we're splitting down the middle... */
- strip->actend = splitaframe;
- nstrip->actstart = splitaframe;
- }
-
- /* clear the active flag from the copy */
- nstrip->flag &= ~NLASTRIP_FLAG_ACTIVE;
-
- /* auto-name the new strip */
- BKE_nlastrip_validate_name(adt, nstrip);
+ NlaStrip *nstrip;
+ float splitframe, splitaframe;
+
+ /* calculate the frames to do the splitting at
+ * - use current frame if within extents of strip
+ */
+ if ((cfra > strip->start) && (cfra < strip->end)) {
+ /* use the current frame */
+ splitframe = cfra;
+ splitaframe = nlastrip_get_frame(strip, cfra, NLATIME_CONVERT_UNMAP);
+ }
+ else {
+ /* split in the middle */
+ float len;
+
+ /* strip extents */
+ len = strip->end - strip->start;
+ if (IS_EQF(len, 0.0f))
+ return;
+ else
+ splitframe = strip->start + (len / 2.0f);
+
+ /* action range */
+ len = strip->actend - strip->actstart;
+ if (IS_EQF(len, 0.0f))
+ splitaframe = strip->actend;
+ else
+ splitaframe = strip->actstart + (len / 2.0f);
+ }
+
+ /* make a copy (assume that this is possible) and append
+ * it immediately after the current strip
+ */
+ nstrip = BKE_nlastrip_copy(bmain, strip, true, 0);
+ BLI_insertlinkafter(&nlt->strips, strip, nstrip);
+
+ /* Set the endpoint of the first strip and the start of the new strip
+ * to the split-frame values calculated above.
+ */
+ strip->end = splitframe;
+ nstrip->start = splitframe;
+
+ if ((splitaframe > strip->actstart) && (splitaframe < strip->actend)) {
+ /* only do this if we're splitting down the middle... */
+ strip->actend = splitaframe;
+ nstrip->actstart = splitaframe;
+ }
+
+ /* clear the active flag from the copy */
+ nstrip->flag &= ~NLASTRIP_FLAG_ACTIVE;
+
+ /* auto-name the new strip */
+ BKE_nlastrip_validate_name(adt, nstrip);
}
/* split a given Meta strip */
static void nlaedit_split_strip_meta(NlaTrack *nlt, NlaStrip *strip)
{
- /* simply ungroup it for now... */
- BKE_nlastrips_clear_metastrip(&nlt->strips, strip);
+ /* simply ungroup it for now... */
+ BKE_nlastrips_clear_metastrip(&nlt->strips, strip);
}
/* ----- */
static int nlaedit_split_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each NLA-Track, split all selected strips into two strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- AnimData *adt = ale->adt;
- NlaStrip *strip, *next;
-
- for (strip = nlt->strips.first; strip; strip = next) {
- next = strip->next;
-
- /* if selected, split the strip at its midpoint */
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* splitting method depends on the type of strip */
- switch (strip->type) {
- case NLASTRIP_TYPE_CLIP: /* action-clip */
- nlaedit_split_strip_actclip(ac.bmain, adt, nlt, strip, (float)ac.scene->r.cfra);
- break;
-
- case NLASTRIP_TYPE_META: /* meta-strips need special handling */
- nlaedit_split_strip_meta(nlt, strip);
- break;
-
- default: /* for things like Transitions, do not split! */
- break;
- }
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each NLA-Track, split all selected strips into two strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ AnimData *adt = ale->adt;
+ NlaStrip *strip, *next;
+
+ for (strip = nlt->strips.first; strip; strip = next) {
+ next = strip->next;
+
+ /* if selected, split the strip at its midpoint */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* splitting method depends on the type of strip */
+ switch (strip->type) {
+ case NLASTRIP_TYPE_CLIP: /* action-clip */
+ nlaedit_split_strip_actclip(ac.bmain, adt, nlt, strip, (float)ac.scene->r.cfra);
+ break;
+
+ case NLASTRIP_TYPE_META: /* meta-strips need special handling */
+ nlaedit_split_strip_meta(nlt, strip);
+ break;
+
+ default: /* for things like Transitions, do not split! */
+ break;
+ }
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_split(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Split Strips";
- ot->idname = "NLA_OT_split";
- ot->description = "Split selected strips at their midpoints";
+ /* identifiers */
+ ot->name = "Split Strips";
+ ot->idname = "NLA_OT_split";
+ ot->description = "Split selected strips at their midpoints";
- /* api callbacks */
- ot->exec = nlaedit_split_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_split_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* *********************************************** */
@@ -1377,62 +1395,62 @@ void NLA_OT_split(wmOperatorType *ot)
static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* go over all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- /* for every selected strip, toggle muting */
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* just flip the mute flag for now */
- // TODO: have a pre-pass to check if mute all or unmute all?
- strip->flag ^= NLASTRIP_FLAG_MUTED;
-
- /* tag AnimData to get recalculated */
- ale->update |= ANIM_UPDATE_DEPS;
- }
- }
- }
-
- /* cleanup */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* go over all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* for every selected strip, toggle muting */
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* just flip the mute flag for now */
+ // TODO: have a pre-pass to check if mute all or unmute all?
+ strip->flag ^= NLASTRIP_FLAG_MUTED;
+
+ /* tag AnimData to get recalculated */
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+ }
+ }
+
+ /* cleanup */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_mute_toggle(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Toggle Muting";
- ot->idname = "NLA_OT_mute_toggle";
- ot->description = "Mute or un-mute selected strips";
+ /* identifiers */
+ ot->name = "Toggle Muting";
+ ot->idname = "NLA_OT_mute_toggle";
+ ot->description = "Mute or un-mute selected strips";
- /* api callbacks */
- ot->exec = nlaedit_toggle_mute_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_toggle_mute_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Swap Strips Operator ************************** */
@@ -1440,160 +1458,167 @@ void NLA_OT_mute_toggle(wmOperatorType *ot)
static int nlaedit_swap_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* consider each track in turn */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
-
- NlaStrip *strip, *stripN = NULL;
- NlaStrip *sa = NULL, *sb = NULL;
-
- /* make temporary metastrips so that entire islands of selections can be moved around */
- BKE_nlastrips_make_metas(&nlt->strips, 1);
-
- /* special case: if there is only 1 island (i.e. temp meta BUT NOT unselected/normal/normal-meta strips) left after this,
- * and this island has two strips inside it, then we should be able to just swap these still...
- */
- if (BLI_listbase_is_empty(&nlt->strips) == false) {
- NlaStrip *mstrip = (NlaStrip *)nlt->strips.first;
-
- if ((mstrip->flag & NLASTRIP_FLAG_TEMP_META) &&
- (BLI_listbase_count_at_most(&mstrip->strips, 3) == 2))
- {
- /* remove this temp meta, so that we can see the strips inside */
- BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
- }
- }
-
- /* get two selected strips only (these will be metas due to prev step) to operate on
- * - only allow swapping 2, as with more the context becomes unclear
- */
- for (strip = nlt->strips.first; strip; strip = stripN) {
- stripN = strip->next;
-
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* first or second strip? */
- if (sa == NULL) {
- /* store as first */
- sa = strip;
- }
- else if (sb == NULL) {
- /* store as second */
- sb = strip;
- }
- else {
- /* too many selected */
- break;
- }
- }
- }
-
- if (strip) {
- /* too many selected warning */
- BKE_reportf(op->reports, RPT_WARNING,
- "Too many clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected",
- nlt->name);
- }
- else if (sa == NULL) {
- /* no warning as this is just a common case,
- * and it may get annoying when doing multiple tracks */
- }
- else if (sb == NULL) {
- /* too few selected warning */
- BKE_reportf(op->reports, RPT_WARNING,
- "Too few clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected",
- nlt->name);
- }
- else {
- float nsa[2], nsb[2];
-
- /* remove these strips from the track,
- * so that we can test if they can fit in the proposed places */
- BLI_remlink(&nlt->strips, sa);
- BLI_remlink(&nlt->strips, sb);
-
- /* calculate new extents for strips */
- /* a --> b */
- nsa[0] = sb->start;
- nsa[1] = sb->start + (sa->end - sa->start);
- /* b --> a */
- nsb[0] = sa->start;
- nsb[1] = sa->start + (sb->end - sb->start);
-
- /* check if the track has room for the strips to be swapped */
- if (BKE_nlastrips_has_space(&nlt->strips, nsa[0], nsa[1]) &&
- BKE_nlastrips_has_space(&nlt->strips, nsb[0], nsb[1]))
- {
- /* set new extents for strips then */
- sa->start = nsa[0];
- sa->end = nsa[1];
- BKE_nlameta_flush_transforms(sa);
-
- sb->start = nsb[0];
- sb->end = nsb[1];
- BKE_nlameta_flush_transforms(sb);
- }
- else {
- /* not enough room to swap, so show message */
- if ((sa->flag & NLASTRIP_FLAG_TEMP_META) || (sb->flag & NLASTRIP_FLAG_TEMP_META)) {
- BKE_report(op->reports, RPT_WARNING,
- "Cannot swap selected strips as they will not be able to fit in their new places");
- }
- else {
- BKE_reportf(op->reports, RPT_WARNING,
- "Cannot swap '%s' and '%s' as one or both will not be able to fit in their new places",
- sa->name, sb->name);
- }
- }
-
- /* add strips back to track now */
- BKE_nlatrack_add_strip(nlt, sa);
- BKE_nlatrack_add_strip(nlt, sb);
- }
-
- /* clear (temp) metastrips */
- BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* consider each track in turn */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+
+ NlaStrip *strip, *stripN = NULL;
+ NlaStrip *sa = NULL, *sb = NULL;
+
+ /* make temporary metastrips so that entire islands of selections can be moved around */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
+ /* special case: if there is only 1 island (i.e. temp meta BUT NOT unselected/normal/normal-meta strips) left after this,
+ * and this island has two strips inside it, then we should be able to just swap these still...
+ */
+ if (BLI_listbase_is_empty(&nlt->strips) == false) {
+ NlaStrip *mstrip = (NlaStrip *)nlt->strips.first;
+
+ if ((mstrip->flag & NLASTRIP_FLAG_TEMP_META) &&
+ (BLI_listbase_count_at_most(&mstrip->strips, 3) == 2)) {
+ /* remove this temp meta, so that we can see the strips inside */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+ }
+
+ /* get two selected strips only (these will be metas due to prev step) to operate on
+ * - only allow swapping 2, as with more the context becomes unclear
+ */
+ for (strip = nlt->strips.first; strip; strip = stripN) {
+ stripN = strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* first or second strip? */
+ if (sa == NULL) {
+ /* store as first */
+ sa = strip;
+ }
+ else if (sb == NULL) {
+ /* store as second */
+ sb = strip;
+ }
+ else {
+ /* too many selected */
+ break;
+ }
+ }
+ }
+
+ if (strip) {
+ /* too many selected warning */
+ BKE_reportf(
+ op->reports,
+ RPT_WARNING,
+ "Too many clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected",
+ nlt->name);
+ }
+ else if (sa == NULL) {
+ /* no warning as this is just a common case,
+ * and it may get annoying when doing multiple tracks */
+ }
+ else if (sb == NULL) {
+ /* too few selected warning */
+ BKE_reportf(
+ op->reports,
+ RPT_WARNING,
+ "Too few clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected",
+ nlt->name);
+ }
+ else {
+ float nsa[2], nsb[2];
+
+ /* remove these strips from the track,
+ * so that we can test if they can fit in the proposed places */
+ BLI_remlink(&nlt->strips, sa);
+ BLI_remlink(&nlt->strips, sb);
+
+ /* calculate new extents for strips */
+ /* a --> b */
+ nsa[0] = sb->start;
+ nsa[1] = sb->start + (sa->end - sa->start);
+ /* b --> a */
+ nsb[0] = sa->start;
+ nsb[1] = sa->start + (sb->end - sb->start);
+
+ /* check if the track has room for the strips to be swapped */
+ if (BKE_nlastrips_has_space(&nlt->strips, nsa[0], nsa[1]) &&
+ BKE_nlastrips_has_space(&nlt->strips, nsb[0], nsb[1])) {
+ /* set new extents for strips then */
+ sa->start = nsa[0];
+ sa->end = nsa[1];
+ BKE_nlameta_flush_transforms(sa);
+
+ sb->start = nsb[0];
+ sb->end = nsb[1];
+ BKE_nlameta_flush_transforms(sb);
+ }
+ else {
+ /* not enough room to swap, so show message */
+ if ((sa->flag & NLASTRIP_FLAG_TEMP_META) || (sb->flag & NLASTRIP_FLAG_TEMP_META)) {
+ BKE_report(
+ op->reports,
+ RPT_WARNING,
+ "Cannot swap selected strips as they will not be able to fit in their new places");
+ }
+ else {
+ BKE_reportf(op->reports,
+ RPT_WARNING,
+ "Cannot swap '%s' and '%s' as one or both will not be able to fit in their "
+ "new places",
+ sa->name,
+ sb->name);
+ }
+ }
+
+ /* add strips back to track now */
+ BKE_nlatrack_add_strip(nlt, sa);
+ BKE_nlatrack_add_strip(nlt, sb);
+ }
+
+ /* clear (temp) metastrips */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_swap(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Swap Strips";
- ot->idname = "NLA_OT_swap";
- ot->description = "Swap order of selected strips within tracks";
+ /* identifiers */
+ ot->name = "Swap Strips";
+ ot->idname = "NLA_OT_swap";
+ ot->description = "Swap order of selected strips within tracks";
- /* api callbacks */
- ot->exec = nlaedit_swap_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_swap_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Move Strips Up Operator ************************** */
@@ -1601,74 +1626,74 @@ void NLA_OT_swap(wmOperatorType *ot)
static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* since we're potentially moving strips from lower tracks to higher tracks, we should
- * loop over the tracks in reverse order to avoid moving earlier strips up multiple tracks
- */
- for (ale = anim_data.last; ale; ale = ale->prev) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaTrack *nltn = nlt->next;
- NlaStrip *strip, *stripn;
-
- /* if this track has no tracks after it, skip for now... */
- if (nltn == NULL)
- continue;
-
- /* for every selected strip, try to move */
- for (strip = nlt->strips.first; strip; strip = stripn) {
- stripn = strip->next;
-
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* check if the track above has room for this strip */
- if (BKE_nlatrack_has_space(nltn, strip->start, strip->end)) {
- /* remove from its current track, and add to the one above
- * (it 'should' work, so no need to worry) */
- BLI_remlink(&nlt->strips, strip);
- BKE_nlatrack_add_strip(nltn, strip);
- }
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* since we're potentially moving strips from lower tracks to higher tracks, we should
+ * loop over the tracks in reverse order to avoid moving earlier strips up multiple tracks
+ */
+ for (ale = anim_data.last; ale; ale = ale->prev) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaTrack *nltn = nlt->next;
+ NlaStrip *strip, *stripn;
+
+ /* if this track has no tracks after it, skip for now... */
+ if (nltn == NULL)
+ continue;
+
+ /* for every selected strip, try to move */
+ for (strip = nlt->strips.first; strip; strip = stripn) {
+ stripn = strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* check if the track above has room for this strip */
+ if (BKE_nlatrack_has_space(nltn, strip->start, strip->end)) {
+ /* remove from its current track, and add to the one above
+ * (it 'should' work, so no need to worry) */
+ BLI_remlink(&nlt->strips, strip);
+ BKE_nlatrack_add_strip(nltn, strip);
+ }
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_move_up(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Move Strips Up";
- ot->idname = "NLA_OT_move_up";
- ot->description = "Move selected strips up a track if there's room";
+ /* identifiers */
+ ot->name = "Move Strips Up";
+ ot->idname = "NLA_OT_move_up";
+ ot->description = "Move selected strips up a track if there's room";
- /* api callbacks */
- ot->exec = nlaedit_move_up_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_move_up_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Move Strips Down Operator ************************** */
@@ -1676,74 +1701,74 @@ void NLA_OT_move_up(wmOperatorType *ot)
static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* loop through the tracks in normal order, since we're pushing strips down,
- * strips won't get operated on twice
- */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaTrack *nltp = nlt->prev;
- NlaStrip *strip, *stripn;
-
- /* if this track has no tracks before it, skip for now... */
- if (nltp == NULL)
- continue;
-
- /* for every selected strip, try to move */
- for (strip = nlt->strips.first; strip; strip = stripn) {
- stripn = strip->next;
-
- if (strip->flag & NLASTRIP_FLAG_SELECT) {
- /* check if the track below has room for this strip */
- if (BKE_nlatrack_has_space(nltp, strip->start, strip->end)) {
- /* remove from its current track, and add to the one above
- * (it 'should' work, so no need to worry) */
- BLI_remlink(&nlt->strips, strip);
- BKE_nlatrack_add_strip(nltp, strip);
- }
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* loop through the tracks in normal order, since we're pushing strips down,
+ * strips won't get operated on twice
+ */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaTrack *nltp = nlt->prev;
+ NlaStrip *strip, *stripn;
+
+ /* if this track has no tracks before it, skip for now... */
+ if (nltp == NULL)
+ continue;
+
+ /* for every selected strip, try to move */
+ for (strip = nlt->strips.first; strip; strip = stripn) {
+ stripn = strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* check if the track below has room for this strip */
+ if (BKE_nlatrack_has_space(nltp, strip->start, strip->end)) {
+ /* remove from its current track, and add to the one above
+ * (it 'should' work, so no need to worry) */
+ BLI_remlink(&nlt->strips, strip);
+ BKE_nlatrack_add_strip(nltp, strip);
+ }
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_move_down(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Move Strips Down";
- ot->idname = "NLA_OT_move_down";
- ot->description = "Move selected strips down a track if there's room";
+ /* identifiers */
+ ot->name = "Move Strips Down";
+ ot->idname = "NLA_OT_move_down";
+ ot->description = "Move selected strips down a track if there's room";
- /* api callbacks */
- ot->exec = nlaedit_move_down_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_move_down_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Sync Action Length Operator ***************************** */
@@ -1751,81 +1776,87 @@ void NLA_OT_move_down(wmOperatorType *ot)
static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
- const bool active_only = RNA_boolean_get(op->ptr, "active");
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- if (active_only) filter |= ANIMFILTER_ACTIVE;
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each NLA-Track, apply scale of all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* strip selection/active status check */
- if (active_only) {
- if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
- continue;
- }
- else {
- if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0)
- continue;
- }
-
- /* must be action-clip only (transitions don't have scale) */
- if (strip->type == NLASTRIP_TYPE_CLIP) {
- if (strip->act == NULL)
- continue;
-
- /* recalculate the length of the action */
- calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
-
- /* adjust the strip extents in response to this */
- BKE_nlastrip_recalculate_bounds(strip);
-
- ale->update |= ANIM_UPDATE_DEPS;
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ const bool active_only = RNA_boolean_get(op->ptr, "active");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ if (active_only)
+ filter |= ANIMFILTER_ACTIVE;
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each NLA-Track, apply scale of all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* strip selection/active status check */
+ if (active_only) {
+ if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
+ continue;
+ }
+ else {
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0)
+ continue;
+ }
+
+ /* must be action-clip only (transitions don't have scale) */
+ if (strip->type == NLASTRIP_TYPE_CLIP) {
+ if (strip->act == NULL)
+ continue;
+
+ /* recalculate the length of the action */
+ calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
+
+ /* adjust the strip extents in response to this */
+ BKE_nlastrip_recalculate_bounds(strip);
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_action_sync_length(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Sync Action Length";
- ot->idname = "NLA_OT_action_sync_length";
- ot->description = "Synchronize the length of the referenced Action with the length used in the strip";
-
- /* api callbacks */
- ot->exec = nlaedit_sync_actlen_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- ot->prop = RNA_def_boolean(ot->srna, "active", 1, "Active Strip Only", "Only sync the active length for the active strip");
+ /* identifiers */
+ ot->name = "Sync Action Length";
+ ot->idname = "NLA_OT_action_sync_length";
+ ot->description =
+ "Synchronize the length of the referenced Action with the length used in the strip";
+
+ /* api callbacks */
+ ot->exec = nlaedit_sync_actlen_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop = RNA_def_boolean(ot->srna,
+ "active",
+ 1,
+ "Active Strip Only",
+ "Only sync the active length for the active strip");
}
/* ******************** Make Single User ********************************* */
@@ -1833,83 +1864,83 @@ void NLA_OT_action_sync_length(wmOperatorType *ot)
static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op))
{
- Main *bmain = CTX_data_main(C);
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
- bool copied = false;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* Ensure that each action used only has a single user
- * - This is done in reverse order so that the original strips are
- * likely to still get to keep their action
- */
- for (ale = anim_data.last; ale; ale = ale->prev) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.last; strip; strip = strip->prev) {
- /* must be action-clip only (as only these have actions) */
- if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
- if (strip->act == NULL)
- continue;
-
- /* multi-user? */
- if (ID_REAL_USERS(strip->act) > 1) {
- /* make a new copy of the action for us to use (it will have 1 user already) */
- bAction *new_action = BKE_action_copy(bmain, strip->act);
-
- /* decrement user count of our existing action */
- id_us_min(&strip->act->id);
-
- /* switch to the new copy */
- strip->act = new_action;
-
- ale->update |= ANIM_UPDATE_DEPS;
- copied = true;
- }
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- if (copied) {
- DEG_relations_tag_update(ac.bmain);
- }
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ Main *bmain = CTX_data_main(C);
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ bool copied = false;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* Ensure that each action used only has a single user
+ * - This is done in reverse order so that the original strips are
+ * likely to still get to keep their action
+ */
+ for (ale = anim_data.last; ale; ale = ale->prev) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.last; strip; strip = strip->prev) {
+ /* must be action-clip only (as only these have actions) */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
+ if (strip->act == NULL)
+ continue;
+
+ /* multi-user? */
+ if (ID_REAL_USERS(strip->act) > 1) {
+ /* make a new copy of the action for us to use (it will have 1 user already) */
+ bAction *new_action = BKE_action_copy(bmain, strip->act);
+
+ /* decrement user count of our existing action */
+ id_us_min(&strip->act->id);
+
+ /* switch to the new copy */
+ strip->act = new_action;
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ copied = true;
+ }
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ if (copied) {
+ DEG_relations_tag_update(ac.bmain);
+ }
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_make_single_user(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Make Single User";
- ot->idname = "NLA_OT_make_single_user";
- ot->description = "Ensure that each action is only used once in the set of strips selected";
-
- /* api callbacks */
- ot->invoke = WM_operator_confirm;
- ot->exec = nlaedit_make_single_user_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* identifiers */
+ ot->name = "Make Single User";
+ ot->idname = "NLA_OT_make_single_user";
+ ot->description = "Ensure that each action is only used once in the set of strips selected";
+
+ /* api callbacks */
+ ot->invoke = WM_operator_confirm;
+ ot->exec = nlaedit_make_single_user_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Apply Scale Operator ***************************** */
@@ -1918,108 +1949,109 @@ void NLA_OT_make_single_user(wmOperatorType *ot)
/* apply scaling to keyframe */
static short bezt_apply_nlamapping(KeyframeEditData *ked, BezTriple *bezt)
{
- /* NLA-strip which has this scaling is stored in ked->data */
- NlaStrip *strip = (NlaStrip *)ked->data;
+ /* NLA-strip which has this scaling is stored in ked->data */
+ NlaStrip *strip = (NlaStrip *)ked->data;
- /* adjust all the times */
- bezt->vec[0][0] = nlastrip_get_frame(strip, bezt->vec[0][0], NLATIME_CONVERT_MAP);
- bezt->vec[1][0] = nlastrip_get_frame(strip, bezt->vec[1][0], NLATIME_CONVERT_MAP);
- bezt->vec[2][0] = nlastrip_get_frame(strip, bezt->vec[2][0], NLATIME_CONVERT_MAP);
+ /* adjust all the times */
+ bezt->vec[0][0] = nlastrip_get_frame(strip, bezt->vec[0][0], NLATIME_CONVERT_MAP);
+ bezt->vec[1][0] = nlastrip_get_frame(strip, bezt->vec[1][0], NLATIME_CONVERT_MAP);
+ bezt->vec[2][0] = nlastrip_get_frame(strip, bezt->vec[2][0], NLATIME_CONVERT_MAP);
- /* nothing to return or else we exit */
- return 0;
+ /* nothing to return or else we exit */
+ return 0;
}
static int nlaedit_apply_scale_exec(bContext *C, wmOperator *UNUSED(op))
{
- Main *bmain = CTX_data_main(C);
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
- bool copied = false;
-
- KeyframeEditData ked = {{NULL}};
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each NLA-Track, apply scale of all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* strip must be selected, and must be action-clip only
- * (transitions don't have scale) */
- if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
- /* if the referenced action is used by other strips,
- * make this strip use its own copy */
- if (strip->act == NULL)
- continue;
- if (strip->act->id.us > 1) {
- /* make a copy of the Action to work on */
- bAction *act = BKE_action_copy(bmain, strip->act);
-
- /* set this as the new referenced action,
- * decrementing the users of the old one */
- id_us_min(&strip->act->id);
- strip->act = act;
-
- copied = true;
- }
-
- /* setup iterator, and iterate over all the keyframes in the action,
- * applying this scaling */
- ked.data = strip;
- ANIM_animchanneldata_keyframes_loop(&ked, ac.ads, strip->act, ALE_ACT, NULL, bezt_apply_nlamapping, calchandles_fcurve);
-
- /* clear scale of strip now that it has been applied,
- * and recalculate the extents of the action now that it has been scaled
- * but leave everything else alone
- */
- strip->scale = 1.0f;
- calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
-
- ale->update |= ANIM_UPDATE_DEPS;
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- if (copied) {
- DEG_relations_tag_update(ac.bmain);
- }
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ Main *bmain = CTX_data_main(C);
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ bool copied = false;
+
+ KeyframeEditData ked = {{NULL}};
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each NLA-Track, apply scale of all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* strip must be selected, and must be action-clip only
+ * (transitions don't have scale) */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
+ /* if the referenced action is used by other strips,
+ * make this strip use its own copy */
+ if (strip->act == NULL)
+ continue;
+ if (strip->act->id.us > 1) {
+ /* make a copy of the Action to work on */
+ bAction *act = BKE_action_copy(bmain, strip->act);
+
+ /* set this as the new referenced action,
+ * decrementing the users of the old one */
+ id_us_min(&strip->act->id);
+ strip->act = act;
+
+ copied = true;
+ }
+
+ /* setup iterator, and iterate over all the keyframes in the action,
+ * applying this scaling */
+ ked.data = strip;
+ ANIM_animchanneldata_keyframes_loop(
+ &ked, ac.ads, strip->act, ALE_ACT, NULL, bezt_apply_nlamapping, calchandles_fcurve);
+
+ /* clear scale of strip now that it has been applied,
+ * and recalculate the extents of the action now that it has been scaled
+ * but leave everything else alone
+ */
+ strip->scale = 1.0f;
+ calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ if (copied) {
+ DEG_relations_tag_update(ac.bmain);
+ }
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_apply_scale(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Apply Scale";
- ot->idname = "NLA_OT_apply_scale";
- ot->description = "Apply scaling of selected strips to their referenced Actions";
+ /* identifiers */
+ ot->name = "Apply Scale";
+ ot->idname = "NLA_OT_apply_scale";
+ ot->description = "Apply scaling of selected strips to their referenced Actions";
- /* api callbacks */
- ot->exec = nlaedit_apply_scale_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_apply_scale_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Clear Scale Operator ***************************** */
@@ -2027,63 +2059,63 @@ void NLA_OT_apply_scale(wmOperatorType *ot)
static int nlaedit_clear_scale_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAnimContext ac;
+ bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- /* for each NLA-Track, reset scale of all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
+ /* for each NLA-Track, reset scale of all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* strip must be selected, and must be action-clip only
- * (transitions don't have scale) */
- if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
- PointerRNA strip_ptr;
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* strip must be selected, and must be action-clip only
+ * (transitions don't have scale) */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
+ PointerRNA strip_ptr;
- RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
- RNA_float_set(&strip_ptr, "scale", 1.0f);
- }
- }
- }
+ RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
+ RNA_float_set(&strip_ptr, "scale", 1.0f);
+ }
+ }
+ }
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
- /* done */
- return OPERATOR_FINISHED;
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_clear_scale(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Clear Scale";
- ot->idname = "NLA_OT_clear_scale";
- ot->description = "Reset scaling of selected strips";
+ /* identifiers */
+ ot->name = "Clear Scale";
+ ot->idname = "NLA_OT_clear_scale";
+ ot->description = "Reset scaling of selected strips";
- /* api callbacks */
- ot->exec = nlaedit_clear_scale_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nlaedit_clear_scale_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* ******************** Snap Strips Operator ************************** */
@@ -2091,149 +2123,153 @@ void NLA_OT_clear_scale(wmOperatorType *ot)
/* defines for snap keyframes tool */
static const EnumPropertyItem prop_nlaedit_snap_types[] = {
- {NLAEDIT_SNAP_CFRA, "CFRA", 0, "Current Frame", ""},
- {NLAEDIT_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
- {NLAEDIT_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry?
- {NLAEDIT_SNAP_NEAREST_MARKER, "NEAREST_MARKER", 0, "Nearest Marker", ""},
- {0, NULL, 0, NULL, NULL},
+ {NLAEDIT_SNAP_CFRA, "CFRA", 0, "Current Frame", ""},
+ {NLAEDIT_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
+ {NLAEDIT_SNAP_NEAREST_SECOND,
+ "NEAREST_SECOND",
+ 0,
+ "Nearest Second",
+ ""}, // XXX as single entry?
+ {NLAEDIT_SNAP_NEAREST_MARKER, "NEAREST_MARKER", 0, "Nearest Marker", ""},
+ {0, NULL, 0, NULL, NULL},
};
static int nlaedit_snap_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- Scene *scene;
- int mode = RNA_enum_get(op->ptr, "type");
- float secf;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* get some necessary vars */
- scene = ac.scene;
- secf = (float)FPS;
-
- /* since we may add tracks, perform this in reverse order */
- for (ale = anim_data.last; ale; ale = ale->prev) {
- ListBase tmp_strips = {NULL, NULL};
- AnimData *adt = ale->adt;
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip, *stripn;
- NlaTrack *track;
-
- /* create meta-strips from the continuous chains of selected strips */
- BKE_nlastrips_make_metas(&nlt->strips, 1);
-
- /* apply the snapping to all the temp meta-strips, then put them in a separate list to be added
- * back to the original only if they still fit
- */
- for (strip = nlt->strips.first; strip; strip = stripn) {
- stripn = strip->next;
-
- if (strip->flag & NLASTRIP_FLAG_TEMP_META) {
- float start, end;
-
- /* get the existing end-points */
- start = strip->start;
- end = strip->end;
-
- /* calculate new start position based on snapping mode */
- switch (mode) {
- case NLAEDIT_SNAP_CFRA: /* to current frame */
- strip->start = (float)CFRA;
- break;
- case NLAEDIT_SNAP_NEAREST_FRAME: /* to nearest frame */
- strip->start = floorf(start + 0.5f);
- break;
- case NLAEDIT_SNAP_NEAREST_SECOND: /* to nearest second */
- strip->start = floorf(start / secf + 0.5f) * secf;
- break;
- case NLAEDIT_SNAP_NEAREST_MARKER: /* to nearest marker */
- strip->start = (float)ED_markers_find_nearest_marker_time(ac.markers, start);
- break;
- default: /* just in case... no snapping */
- strip->start = start;
- break;
- }
-
- /* get new endpoint based on start-point (and old length) */
- strip->end = strip->start + (end - start);
-
- /* apply transforms to meta-strip to its children */
- BKE_nlameta_flush_transforms(strip);
-
- /* remove strip from track, and add to the temp buffer */
- BLI_remlink(&nlt->strips, strip);
- BLI_addtail(&tmp_strips, strip);
- }
- }
-
- /* try adding each meta-strip back to the track one at a time, to make sure they'll fit */
- for (strip = tmp_strips.first; strip; strip = stripn) {
- stripn = strip->next;
-
- /* remove from temp-strips list */
- BLI_remlink(&tmp_strips, strip);
-
- /* in case there's no space in the current track, try adding */
- if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
- /* need to add a new track above the current one */
- track = BKE_nlatrack_add(adt, nlt);
- BKE_nlatrack_add_strip(track, strip);
-
- /* clear temp meta-strips on this new track,
- * as we may not be able to get back to it */
- BKE_nlastrips_clear_metas(&track->strips, 0, 1);
- }
- }
-
- /* remove the meta-strips now that we're done */
- BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
-
- /* tag for recalculating the animation */
- ale->update |= ANIM_UPDATE_DEPS;
- }
-
- /* cleanup */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ Scene *scene;
+ int mode = RNA_enum_get(op->ptr, "type");
+ float secf;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* get some necessary vars */
+ scene = ac.scene;
+ secf = (float)FPS;
+
+ /* since we may add tracks, perform this in reverse order */
+ for (ale = anim_data.last; ale; ale = ale->prev) {
+ ListBase tmp_strips = {NULL, NULL};
+ AnimData *adt = ale->adt;
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip, *stripn;
+ NlaTrack *track;
+
+ /* create meta-strips from the continuous chains of selected strips */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
+ /* apply the snapping to all the temp meta-strips, then put them in a separate list to be added
+ * back to the original only if they still fit
+ */
+ for (strip = nlt->strips.first; strip; strip = stripn) {
+ stripn = strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_TEMP_META) {
+ float start, end;
+
+ /* get the existing end-points */
+ start = strip->start;
+ end = strip->end;
+
+ /* calculate new start position based on snapping mode */
+ switch (mode) {
+ case NLAEDIT_SNAP_CFRA: /* to current frame */
+ strip->start = (float)CFRA;
+ break;
+ case NLAEDIT_SNAP_NEAREST_FRAME: /* to nearest frame */
+ strip->start = floorf(start + 0.5f);
+ break;
+ case NLAEDIT_SNAP_NEAREST_SECOND: /* to nearest second */
+ strip->start = floorf(start / secf + 0.5f) * secf;
+ break;
+ case NLAEDIT_SNAP_NEAREST_MARKER: /* to nearest marker */
+ strip->start = (float)ED_markers_find_nearest_marker_time(ac.markers, start);
+ break;
+ default: /* just in case... no snapping */
+ strip->start = start;
+ break;
+ }
+
+ /* get new endpoint based on start-point (and old length) */
+ strip->end = strip->start + (end - start);
+
+ /* apply transforms to meta-strip to its children */
+ BKE_nlameta_flush_transforms(strip);
+
+ /* remove strip from track, and add to the temp buffer */
+ BLI_remlink(&nlt->strips, strip);
+ BLI_addtail(&tmp_strips, strip);
+ }
+ }
+
+ /* try adding each meta-strip back to the track one at a time, to make sure they'll fit */
+ for (strip = tmp_strips.first; strip; strip = stripn) {
+ stripn = strip->next;
+
+ /* remove from temp-strips list */
+ BLI_remlink(&tmp_strips, strip);
+
+ /* in case there's no space in the current track, try adding */
+ if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+ /* need to add a new track above the current one */
+ track = BKE_nlatrack_add(adt, nlt);
+ BKE_nlatrack_add_strip(track, strip);
+
+ /* clear temp meta-strips on this new track,
+ * as we may not be able to get back to it */
+ BKE_nlastrips_clear_metas(&track->strips, 0, 1);
+ }
+ }
+
+ /* remove the meta-strips now that we're done */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+
+ /* tag for recalculating the animation */
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+
+ /* cleanup */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_snap(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Snap Strips";
- ot->idname = "NLA_OT_snap";
- ot->description = "Move start of strips to specified time";
+ /* identifiers */
+ ot->name = "Snap Strips";
+ ot->idname = "NLA_OT_snap";
+ ot->description = "Move start of strips to specified time";
- /* api callbacks */
- ot->invoke = WM_menu_invoke;
- ot->exec = nlaedit_snap_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->invoke = WM_menu_invoke;
+ ot->exec = nlaedit_snap_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- /* properties */
- ot->prop = RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", "");
+ /* properties */
+ ot->prop = RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", "");
}
/* *********************************************** */
@@ -2241,275 +2277,289 @@ void NLA_OT_snap(wmOperatorType *ot)
/* ******************** Add F-Modifier Operator *********************** */
-static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
+static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C,
+ PointerRNA *UNUSED(ptr),
+ PropertyRNA *UNUSED(prop),
+ bool *r_free)
{
- EnumPropertyItem *item = NULL;
- int totitem = 0;
- int i = 0;
-
- if (C == NULL) {
- return rna_enum_fmodifier_type_items;
- }
-
- /* start from 1 to skip the 'Invalid' modifier type */
- for (i = 1; i < FMODIFIER_NUM_TYPES; i++) {
- const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(i);
- int index;
-
- /* check if modifier is valid for this context */
- if (fmi == NULL)
- continue;
- if (i == FMODIFIER_TYPE_CYCLES) /* we already have repeat... */
- continue;
-
- index = RNA_enum_from_value(rna_enum_fmodifier_type_items, fmi->type);
- if (index != -1) { /* Not all types are implemented yet... */
- RNA_enum_item_add(&item, &totitem, &rna_enum_fmodifier_type_items[index]);
- }
- }
-
- RNA_enum_item_end(&item, &totitem);
- *r_free = true;
-
- return item;
+ EnumPropertyItem *item = NULL;
+ int totitem = 0;
+ int i = 0;
+
+ if (C == NULL) {
+ return rna_enum_fmodifier_type_items;
+ }
+
+ /* start from 1 to skip the 'Invalid' modifier type */
+ for (i = 1; i < FMODIFIER_NUM_TYPES; i++) {
+ const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(i);
+ int index;
+
+ /* check if modifier is valid for this context */
+ if (fmi == NULL)
+ continue;
+ if (i == FMODIFIER_TYPE_CYCLES) /* we already have repeat... */
+ continue;
+
+ index = RNA_enum_from_value(rna_enum_fmodifier_type_items, fmi->type);
+ if (index != -1) { /* Not all types are implemented yet... */
+ RNA_enum_item_add(&item, &totitem, &rna_enum_fmodifier_type_items[index]);
+ }
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *r_free = true;
+
+ return item;
}
-
static int nla_fmodifier_add_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- FModifier *fcm;
- int type = RNA_enum_get(op->ptr, "type");
- const bool active_only = RNA_boolean_get(op->ptr, "only_active");
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each NLA-Track, add the specified modifier to all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* can F-Modifier be added to the current strip? */
- if (active_only) {
- /* if not active, cannot add since we're only adding to active strip */
- if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
- continue;
- }
- else {
- /* strip must be selected, since we're not just doing active */
- if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0)
- continue;
- }
-
- /* sound clips are not affected by FModifiers */
- if (strip->type == NLASTRIP_TYPE_SOUND)
- continue;
-
- /* add F-Modifier of specified type to selected, and make it the active one */
- fcm = add_fmodifier(&strip->modifiers, type, NULL);
-
- if (fcm) {
- set_active_fmodifier(&strip->modifiers, fcm);
- ale->update |= ANIM_UPDATE_DEPS;
- }
- else {
- BKE_reportf(op->reports, RPT_ERROR,
- "Modifier could not be added to (%s : %s) (see console for details)",
- nlt->name, strip->name);
- }
- }
- }
-
- /* free temp data */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ FModifier *fcm;
+ int type = RNA_enum_get(op->ptr, "type");
+ const bool active_only = RNA_boolean_get(op->ptr, "only_active");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each NLA-Track, add the specified modifier to all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* can F-Modifier be added to the current strip? */
+ if (active_only) {
+ /* if not active, cannot add since we're only adding to active strip */
+ if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
+ continue;
+ }
+ else {
+ /* strip must be selected, since we're not just doing active */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0)
+ continue;
+ }
+
+ /* sound clips are not affected by FModifiers */
+ if (strip->type == NLASTRIP_TYPE_SOUND)
+ continue;
+
+ /* add F-Modifier of specified type to selected, and make it the active one */
+ fcm = add_fmodifier(&strip->modifiers, type, NULL);
+
+ if (fcm) {
+ set_active_fmodifier(&strip->modifiers, fcm);
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+ else {
+ BKE_reportf(op->reports,
+ RPT_ERROR,
+ "Modifier could not be added to (%s : %s) (see console for details)",
+ nlt->name,
+ strip->name);
+ }
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
void NLA_OT_fmodifier_add(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Add F-Modifier";
- ot->idname = "NLA_OT_fmodifier_add";
- ot->description = "Add F-Modifier to the active/selected NLA-Strips";
-
- /* api callbacks */
- ot->invoke = WM_menu_invoke;
- ot->exec = nla_fmodifier_add_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* id-props */
- ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_fmodifier_type_items, 0, "Type", "");
- RNA_def_enum_funcs(ot->prop, nla_fmodifier_itemf);
-
- RNA_def_boolean(ot->srna, "only_active", true, "Only Active", "Only add a F-Modifier of the specified type to the active strip");
+ /* identifiers */
+ ot->name = "Add F-Modifier";
+ ot->idname = "NLA_OT_fmodifier_add";
+ ot->description = "Add F-Modifier to the active/selected NLA-Strips";
+
+ /* api callbacks */
+ ot->invoke = WM_menu_invoke;
+ ot->exec = nla_fmodifier_add_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* id-props */
+ ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_fmodifier_type_items, 0, "Type", "");
+ RNA_def_enum_funcs(ot->prop, nla_fmodifier_itemf);
+
+ RNA_def_boolean(ot->srna,
+ "only_active",
+ true,
+ "Only Active",
+ "Only add a F-Modifier of the specified type to the active strip");
}
/* ******************** Copy F-Modifiers Operator *********************** */
static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
- bool ok = false;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* clear buffer first */
- ANIM_fmodifiers_copybuf_free();
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each NLA-Track, add the specified modifier to all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* only add F-Modifier if on active strip? */
- if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
- continue;
-
- // TODO: when 'active' vs 'all' boolean is added, change last param!
- ok |= ANIM_fmodifiers_copy_to_buf(&strip->modifiers, 0);
- }
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* successful or not? */
- if (ok == 0) {
- BKE_report(op->reports, RPT_ERROR, "No F-Modifiers available to be copied");
- return OPERATOR_CANCELLED;
- }
- else {
- /* no updates needed - copy is non-destructive operation */
- return OPERATOR_FINISHED;
- }
+ bAnimContext ac;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ bool ok = false;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* clear buffer first */
+ ANIM_fmodifiers_copybuf_free();
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each NLA-Track, add the specified modifier to all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* only add F-Modifier if on active strip? */
+ if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
+ continue;
+
+ // TODO: when 'active' vs 'all' boolean is added, change last param!
+ ok |= ANIM_fmodifiers_copy_to_buf(&strip->modifiers, 0);
+ }
+ }
+
+ /* free temp data */
+ ANIM_animdata_freelist(&anim_data);
+
+ /* successful or not? */
+ if (ok == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No F-Modifiers available to be copied");
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ /* no updates needed - copy is non-destructive operation */
+ return OPERATOR_FINISHED;
+ }
}
void NLA_OT_fmodifier_copy(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Copy F-Modifiers";
- ot->idname = "NLA_OT_fmodifier_copy";
- ot->description = "Copy the F-Modifier(s) of the active NLA-Strip";
+ /* identifiers */
+ ot->name = "Copy F-Modifiers";
+ ot->idname = "NLA_OT_fmodifier_copy";
+ ot->description = "Copy the F-Modifier(s) of the active NLA-Strip";
- /* api callbacks */
- ot->exec = nla_fmodifier_copy_exec;
- ot->poll = nlaop_poll_tweakmode_off;
+ /* api callbacks */
+ ot->exec = nla_fmodifier_copy_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- /* id-props */
- //ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All F-Modifiers", "Copy all the F-Modifiers, instead of just the active one");
+ /* id-props */
+ //ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All F-Modifiers", "Copy all the F-Modifiers, instead of just the active one");
}
/* ******************** Paste F-Modifiers Operator *********************** */
static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op)
{
- bAnimContext ac;
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter, ok = 0;
-
- const bool active_only = RNA_boolean_get(op->ptr, "only_active");
- const bool replace = RNA_boolean_get(op->ptr, "replace");
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each NLA-Track, add the specified modifier to all selected strips */
- for (ale = anim_data.first; ale; ale = ale->next) {
- NlaTrack *nlt = (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- for (strip = nlt->strips.first; strip; strip = strip->next) {
- /* can F-Modifier be added to the current strip? */
- if (active_only) {
- /* if not active, cannot add since we're only adding to active strip */
- if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
- continue;
- }
- else {
- /* strip must be selected, since we're not just doing active */
- if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0)
- continue;
- }
-
- /* paste FModifiers from buffer */
- ok += ANIM_fmodifiers_paste_from_buf(&strip->modifiers, replace, NULL);
- ale->update |= ANIM_UPDATE_DEPS;
- }
- }
-
- /* clean up */
- ANIM_animdata_update(&ac, &anim_data);
- ANIM_animdata_freelist(&anim_data);
-
- /* successful or not? */
- if (ok) {
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
- return OPERATOR_FINISHED;
- }
- else {
- BKE_report(op->reports, RPT_ERROR, "No F-Modifiers to paste");
- return OPERATOR_CANCELLED;
- }
+ bAnimContext ac;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter, ok = 0;
+
+ const bool active_only = RNA_boolean_get(op->ptr, "only_active");
+ const bool replace = RNA_boolean_get(op->ptr, "replace");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT |
+ ANIMFILTER_NODUPLIS);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each NLA-Track, add the specified modifier to all selected strips */
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ NlaTrack *nlt = (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip = nlt->strips.first; strip; strip = strip->next) {
+ /* can F-Modifier be added to the current strip? */
+ if (active_only) {
+ /* if not active, cannot add since we're only adding to active strip */
+ if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0)
+ continue;
+ }
+ else {
+ /* strip must be selected, since we're not just doing active */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0)
+ continue;
+ }
+
+ /* paste FModifiers from buffer */
+ ok += ANIM_fmodifiers_paste_from_buf(&strip->modifiers, replace, NULL);
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+ }
+
+ /* clean up */
+ ANIM_animdata_update(&ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ /* successful or not? */
+ if (ok) {
+ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "No F-Modifiers to paste");
+ return OPERATOR_CANCELLED;
+ }
}
void NLA_OT_fmodifier_paste(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Paste F-Modifiers";
- ot->idname = "NLA_OT_fmodifier_paste";
- ot->description = "Add copied F-Modifiers to the selected NLA-Strips";
-
- /* api callbacks */
- ot->exec = nla_fmodifier_paste_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_boolean(ot->srna, "only_active", true, "Only Active", "Only paste F-Modifiers on active strip");
- RNA_def_boolean(ot->srna, "replace", false, "Replace Existing",
- "Replace existing F-Modifiers, instead of just appending to the end of the existing list");
+ /* identifiers */
+ ot->name = "Paste F-Modifiers";
+ ot->idname = "NLA_OT_fmodifier_paste";
+ ot->description = "Add copied F-Modifiers to the selected NLA-Strips";
+
+ /* api callbacks */
+ ot->exec = nla_fmodifier_paste_exec;
+ ot->poll = nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(
+ ot->srna, "only_active", true, "Only Active", "Only paste F-Modifiers on active strip");
+ RNA_def_boolean(
+ ot->srna,
+ "replace",
+ false,
+ "Replace Existing",
+ "Replace existing F-Modifiers, instead of just appending to the end of the existing list");
}
/* *********************************************** */