2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2008-12-22 08:13:25 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2008-12-22 08:13:25 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): Joshua Leung
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2011-02-27 20:29:51 +00:00
|
|
|
/** \file blender/editors/space_action/action_draw.c
|
|
|
|
* \ingroup spaction
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2008-12-22 08:13:25 +00:00
|
|
|
/* System includes ----------------------------------------------------- */
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <float.h>
|
|
|
|
|
|
|
|
#include "BLI_blenlib.h"
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BLI_utildefines.h"
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* Types --------------------------------------------------------------- */
|
|
|
|
|
2009-01-20 11:07:42 +00:00
|
|
|
#include "DNA_anim_types.h"
|
2008-12-22 08:13:25 +00:00
|
|
|
#include "DNA_screen_types.h"
|
|
|
|
|
|
|
|
#include "BKE_action.h"
|
|
|
|
#include "BKE_context.h"
|
2011-01-07 19:18:31 +00:00
|
|
|
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* Everything from source (BIF, BDR, BSE) ------------------------------ */
|
|
|
|
|
|
|
|
#include "BIF_gl.h"
|
|
|
|
|
|
|
|
#include "UI_interface.h"
|
|
|
|
#include "UI_resources.h"
|
|
|
|
#include "UI_view2d.h"
|
|
|
|
|
|
|
|
#include "ED_anim_api.h"
|
|
|
|
#include "ED_keyframes_draw.h"
|
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
#include "action_intern.h"
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2008-12-22 09:43:54 +00:00
|
|
|
/* ************************************************************************* */
|
|
|
|
/* Channel List */
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* left hand part */
|
2010-10-16 08:03:28 +00:00
|
|
|
void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
|
2008-12-22 08:13:25 +00:00
|
|
|
{
|
|
|
|
ListBase anim_data = {NULL, NULL};
|
|
|
|
bAnimListElem *ale;
|
|
|
|
int filter;
|
2009-01-01 00:18:23 +00:00
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
View2D *v2d = &ar->v2d;
|
|
|
|
float y = 0.0f;
|
2011-06-21 04:01:51 +00:00
|
|
|
size_t items;
|
|
|
|
int height;
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* build list of channels to draw */
|
2012-05-08 16:02:13 +00:00
|
|
|
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
|
|
|
|
items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
|
2.5 - Action Editor: All Keyframe Selection Tools Ported
User Notes (for using tools whose behaviour has changed):
* Mouse Selection Tools:
1) Click on keyframe to modify its selection. Holding the 'Shift' modifier when doing so, will result in keyframe selection being toggled instead of replacing existing selections.
2) Click on either side of the current frame indicator while holding the 'Alt' modifier. This will select only all the keyframes on the relevant side of the current frame indicator.
3) Click on a keyframe while holding the 'Ctrl' modifier. This will select all the keyframes that fall on that frame.
* Borderselect Tools
1) BKEY selects all the keyframes within the specified range (as per normal)
2) ALT-BKEY will select either all the keyframes in the frame-range specified or the channel range specified, depending on which axis of the select region was larger. This method is prejudiced towards frame-range selection.
Code Notes:
* Finished porting over all of the remaining keyframe selection tools, and recoded the ported ones to make them easier to use (after running into some technical limitations)
* Simplified the way to check if 'animation context' is valid by moving a necessary check into that function.
* Refactored internal keyframe-looping tools to reduce the amount of code needed per tool to edit keyframes, removing a lot of the unnecessary bulk. Now, the ipo/icu_keys_bezier_loop functions recieve a few more arguments (1st arg is pointer to generic customdata, and another defines a validation callback which makes it easier to reuse some of the select callbacks).
* Added 'totrect' adjustment for number of channels being shown in Action Editor, so that scrolling will be limited to where there is data (and also so that scroller displays more relevant context info).
For this to work, filtering channels now returns the number of channels extracted. This may come into use for other tools if there's such a need.
* I still need to port over some code for markers, which is required for some of the tools which use them. For now, those tools do nothing.
* Grease-Pencil editing mode in Action Editor is currently non-functional (code is commented out due to missing dependencies). This is currently pending the re-implementation of Grease Pencil in 2.5
2008-12-26 10:55:07 +00:00
|
|
|
|
2012-12-26 13:05:39 +00:00
|
|
|
height = ((items * ACHANNEL_STEP) + (ACHANNEL_HEIGHT));
|
2012-09-15 11:48:20 +00:00
|
|
|
if (height > BLI_rcti_size_y(&v2d->mask)) {
|
2.5 - Action Editor: All Keyframe Selection Tools Ported
User Notes (for using tools whose behaviour has changed):
* Mouse Selection Tools:
1) Click on keyframe to modify its selection. Holding the 'Shift' modifier when doing so, will result in keyframe selection being toggled instead of replacing existing selections.
2) Click on either side of the current frame indicator while holding the 'Alt' modifier. This will select only all the keyframes on the relevant side of the current frame indicator.
3) Click on a keyframe while holding the 'Ctrl' modifier. This will select all the keyframes that fall on that frame.
* Borderselect Tools
1) BKEY selects all the keyframes within the specified range (as per normal)
2) ALT-BKEY will select either all the keyframes in the frame-range specified or the channel range specified, depending on which axis of the select region was larger. This method is prejudiced towards frame-range selection.
Code Notes:
* Finished porting over all of the remaining keyframe selection tools, and recoded the ported ones to make them easier to use (after running into some technical limitations)
* Simplified the way to check if 'animation context' is valid by moving a necessary check into that function.
* Refactored internal keyframe-looping tools to reduce the amount of code needed per tool to edit keyframes, removing a lot of the unnecessary bulk. Now, the ipo/icu_keys_bezier_loop functions recieve a few more arguments (1st arg is pointer to generic customdata, and another defines a validation callback which makes it easier to reuse some of the select callbacks).
* Added 'totrect' adjustment for number of channels being shown in Action Editor, so that scrolling will be limited to where there is data (and also so that scroller displays more relevant context info).
For this to work, filtering channels now returns the number of channels extracted. This may come into use for other tools if there's such a need.
* I still need to port over some code for markers, which is required for some of the tools which use them. For now, those tools do nothing.
* Grease-Pencil editing mode in Action Editor is currently non-functional (code is commented out due to missing dependencies). This is currently pending the re-implementation of Grease Pencil in 2.5
2008-12-26 10:55:07 +00:00
|
|
|
/* don't use totrect set, as the width stays the same
|
|
|
|
* (NOTE: this is ok here, the configuration is pretty straightforward)
|
|
|
|
*/
|
2012-03-24 02:51:46 +00:00
|
|
|
v2d->tot.ymin = (float)(-height);
|
2.5 - Action Editor: All Keyframe Selection Tools Ported
User Notes (for using tools whose behaviour has changed):
* Mouse Selection Tools:
1) Click on keyframe to modify its selection. Holding the 'Shift' modifier when doing so, will result in keyframe selection being toggled instead of replacing existing selections.
2) Click on either side of the current frame indicator while holding the 'Alt' modifier. This will select only all the keyframes on the relevant side of the current frame indicator.
3) Click on a keyframe while holding the 'Ctrl' modifier. This will select all the keyframes that fall on that frame.
* Borderselect Tools
1) BKEY selects all the keyframes within the specified range (as per normal)
2) ALT-BKEY will select either all the keyframes in the frame-range specified or the channel range specified, depending on which axis of the select region was larger. This method is prejudiced towards frame-range selection.
Code Notes:
* Finished porting over all of the remaining keyframe selection tools, and recoded the ported ones to make them easier to use (after running into some technical limitations)
* Simplified the way to check if 'animation context' is valid by moving a necessary check into that function.
* Refactored internal keyframe-looping tools to reduce the amount of code needed per tool to edit keyframes, removing a lot of the unnecessary bulk. Now, the ipo/icu_keys_bezier_loop functions recieve a few more arguments (1st arg is pointer to generic customdata, and another defines a validation callback which makes it easier to reuse some of the select callbacks).
* Added 'totrect' adjustment for number of channels being shown in Action Editor, so that scrolling will be limited to where there is data (and also so that scroller displays more relevant context info).
For this to work, filtering channels now returns the number of channels extracted. This may come into use for other tools if there's such a need.
* I still need to port over some code for markers, which is required for some of the tools which use them. For now, those tools do nothing.
* Grease-Pencil editing mode in Action Editor is currently non-functional (code is commented out due to missing dependencies). This is currently pending the re-implementation of Grease Pencil in 2.5
2008-12-26 10:55:07 +00:00
|
|
|
}
|
2010-10-16 05:07:33 +00:00
|
|
|
/* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */
|
|
|
|
UI_view2d_sync(NULL, ac->sa, v2d, V2D_LOCK_COPY);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2012-10-21 05:46:41 +00:00
|
|
|
/* loop through channels, and set up drawing depending on their type */
|
2012-05-08 16:02:13 +00:00
|
|
|
{ /* first pass: just the standard GL-drawing for backdrop + text */
|
|
|
|
y = (float)ACHANNEL_FIRST;
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
for (ale = anim_data.first; ale; ale = ale->next) {
|
|
|
|
float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
|
|
|
|
float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
|
2009-08-16 02:21:43 +00:00
|
|
|
|
|
|
|
/* check if visible */
|
2012-05-08 16:02:13 +00:00
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
|
2009-08-16 02:21:43 +00:00
|
|
|
{
|
|
|
|
/* draw all channels using standard channel-drawing API */
|
|
|
|
ANIM_channel_draw(ac, ale, yminc, ymaxc);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
y -= ACHANNEL_STEP;
|
|
|
|
}
|
|
|
|
}
|
2012-05-08 16:02:13 +00:00
|
|
|
{ /* second pass: widgets */
|
2014-11-09 21:20:40 +01:00
|
|
|
uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
|
Animation channels can now be renamed by Ctrl-Clicking on them, as in
the Outliner
Channels which can be renamed include:
- Scenes, Objects, World, Material, Texture, etc. (i.e. "ID-blocks",
or the dark and light blue channels)
- Action Groups (green channels)
- Action expanders (i.e. "CubeAction", "WorldAction", etc.)
- Grease Pencil stuff
Channels which CANNOT be renamed, as they mostly use hardcoded values
or otherwise include:
- Drivers expander
- FCurves (they don't technically have a "name"; what is shown is just
a user-friendly representation of their rna_paths)
2011-08-03 01:22:31 +00:00
|
|
|
size_t channel_index = 0;
|
2009-08-16 02:21:43 +00:00
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
y = (float)ACHANNEL_FIRST;
|
2009-08-16 02:21:43 +00:00
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
for (ale = anim_data.first; ale; ale = ale->next) {
|
|
|
|
float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
|
|
|
|
float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
|
2009-08-16 02:21:43 +00:00
|
|
|
|
|
|
|
/* check if visible */
|
2012-05-08 16:02:13 +00:00
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
|
2009-08-16 02:21:43 +00:00
|
|
|
{
|
|
|
|
/* draw all channels using standard channel-drawing API */
|
Animation channels can now be renamed by Ctrl-Clicking on them, as in
the Outliner
Channels which can be renamed include:
- Scenes, Objects, World, Material, Texture, etc. (i.e. "ID-blocks",
or the dark and light blue channels)
- Action Groups (green channels)
- Action expanders (i.e. "CubeAction", "WorldAction", etc.)
- Grease Pencil stuff
Channels which CANNOT be renamed, as they mostly use hardcoded values
or otherwise include:
- Drivers expander
- FCurves (they don't technically have a "name"; what is shown is just
a user-friendly representation of their rna_paths)
2011-08-03 01:22:31 +00:00
|
|
|
ANIM_channel_draw_widgets(C, ac, ale, block, yminc, ymaxc, channel_index);
|
2009-08-16 02:21:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* adjust y-position for next one */
|
|
|
|
y -= ACHANNEL_STEP;
|
Animation channels can now be renamed by Ctrl-Clicking on them, as in
the Outliner
Channels which can be renamed include:
- Scenes, Objects, World, Material, Texture, etc. (i.e. "ID-blocks",
or the dark and light blue channels)
- Action Groups (green channels)
- Action expanders (i.e. "CubeAction", "WorldAction", etc.)
- Grease Pencil stuff
Channels which CANNOT be renamed, as they mostly use hardcoded values
or otherwise include:
- Drivers expander
- FCurves (they don't technically have a "name"; what is shown is just
a user-friendly representation of their rna_paths)
2011-08-03 01:22:31 +00:00
|
|
|
channel_index++;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
|
2014-11-09 21:20:40 +01:00
|
|
|
UI_block_end(C, block);
|
|
|
|
UI_block_draw(C, block);
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* free tempolary channels */
|
2014-05-19 00:24:45 +10:00
|
|
|
ANIM_animdata_freelist(&anim_data);
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
|
2008-12-22 09:43:54 +00:00
|
|
|
/* ************************************************************************* */
|
|
|
|
/* Keyframes */
|
|
|
|
|
2009-07-09 13:14:51 +00:00
|
|
|
/* extra padding for lengths (to go under scrollers) */
|
2012-05-08 16:02:13 +00:00
|
|
|
#define EXTRA_SCROLL_PAD 100.0f
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2008-12-22 09:43:54 +00:00
|
|
|
/* draw keyframes in each channel */
|
|
|
|
void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
|
2008-12-22 08:13:25 +00:00
|
|
|
{
|
|
|
|
ListBase anim_data = {NULL, NULL};
|
|
|
|
bAnimListElem *ale;
|
|
|
|
int filter;
|
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
View2D *v2d = &ar->v2d;
|
|
|
|
bDopeSheet *ads = &saction->ads;
|
|
|
|
AnimData *adt = NULL;
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2009-07-09 13:14:51 +00:00
|
|
|
float act_start, act_end, y;
|
2011-06-21 04:01:51 +00:00
|
|
|
size_t items;
|
|
|
|
int height;
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2010-12-20 03:59:22 +00:00
|
|
|
unsigned char col1[3], col2[3];
|
|
|
|
unsigned char col1a[3], col2a[3];
|
|
|
|
unsigned char col1b[3], col2b[3];
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* get theme colors */
|
2.5
Summary of ain features:
- Themes and Styles are now editable.
- CTRL+U "Save user defaults" now goes to new .B25.blend, so you
can use 2.4x and 2.5x next to each other. If B25 doesn't exist, it
reads the regular .B.blend
- Press Tkey in 3d window for (unfinished) toolbar WIP. It now only
shows the last operator, if appropriate.
Nkey properties moved to the other side.
A lot of work was done on removing old themes for good and properly
getting it work with the 2.5 region system. Here's some notes;
- Buttons now all have a complete set of colors, based on button classifications
(See outliner -> user prefs -> Interface
- Theme colors have been extended with basic colors for region types.
Currently colors are defined for Window, Header, List/Channels and
for Button/Tool views.
The screen manager handles this btw, so a TH_BACK will always pick the
right backdrop color.
- Menu backdrops are in in Button theme colors. Floating Panels will be in
the per-space type Themes.
- Styles were added in RNA too, but only for the font settings now.
Only Panel font, widget font and widget-label work now. The 'group label'
will be for templates mostly.
Style settings will be expanded with spacing defaults, label conventions,
etc.
- Label text colors are stored in per-space Theme too, to make sure they fit.
Same goes for Panel title color.
Note that 'shadow' for fonts can conflict with text colors; shadow color is
currently stored in Style... shadow code needs a bit of work still.
2009-04-27 13:44:11 +00:00
|
|
|
UI_GetThemeColor3ubv(TH_BACK, col2);
|
2008-12-22 08:13:25 +00:00
|
|
|
UI_GetThemeColor3ubv(TH_HILITE, col1);
|
2009-07-09 13:14:51 +00:00
|
|
|
|
2008-12-22 08:13:25 +00:00
|
|
|
UI_GetThemeColor3ubv(TH_GROUP, col2a);
|
|
|
|
UI_GetThemeColor3ubv(TH_GROUP_ACTIVE, col1a);
|
|
|
|
|
|
|
|
UI_GetThemeColor3ubv(TH_DOPESHEET_CHANNELOB, col1b);
|
|
|
|
UI_GetThemeColor3ubv(TH_DOPESHEET_CHANNELSUBOB, col2b);
|
|
|
|
|
|
|
|
/* set view-mapping rect (only used for x-axis), for NLA-scaling mapping with less calculation */
|
|
|
|
|
|
|
|
/* if in NLA there's a strip active, map the view */
|
2008-12-22 09:43:54 +00:00
|
|
|
if (ac->datatype == ANIMCONT_ACTION) {
|
2012-10-26 04:14:10 +00:00
|
|
|
/* adt = ANIM_nla_mapping_get(ac, NULL); */ /* UNUSED */
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* start and end of action itself */
|
2009-07-09 13:14:51 +00:00
|
|
|
calc_action_range(ac->data, &act_start, &act_end, 0);
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* build list of channels to draw */
|
2012-05-08 16:02:13 +00:00
|
|
|
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
|
|
|
|
items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
|
2.5 - Action Editor: All Keyframe Selection Tools Ported
User Notes (for using tools whose behaviour has changed):
* Mouse Selection Tools:
1) Click on keyframe to modify its selection. Holding the 'Shift' modifier when doing so, will result in keyframe selection being toggled instead of replacing existing selections.
2) Click on either side of the current frame indicator while holding the 'Alt' modifier. This will select only all the keyframes on the relevant side of the current frame indicator.
3) Click on a keyframe while holding the 'Ctrl' modifier. This will select all the keyframes that fall on that frame.
* Borderselect Tools
1) BKEY selects all the keyframes within the specified range (as per normal)
2) ALT-BKEY will select either all the keyframes in the frame-range specified or the channel range specified, depending on which axis of the select region was larger. This method is prejudiced towards frame-range selection.
Code Notes:
* Finished porting over all of the remaining keyframe selection tools, and recoded the ported ones to make them easier to use (after running into some technical limitations)
* Simplified the way to check if 'animation context' is valid by moving a necessary check into that function.
* Refactored internal keyframe-looping tools to reduce the amount of code needed per tool to edit keyframes, removing a lot of the unnecessary bulk. Now, the ipo/icu_keys_bezier_loop functions recieve a few more arguments (1st arg is pointer to generic customdata, and another defines a validation callback which makes it easier to reuse some of the select callbacks).
* Added 'totrect' adjustment for number of channels being shown in Action Editor, so that scrolling will be limited to where there is data (and also so that scroller displays more relevant context info).
For this to work, filtering channels now returns the number of channels extracted. This may come into use for other tools if there's such a need.
* I still need to port over some code for markers, which is required for some of the tools which use them. For now, those tools do nothing.
* Grease-Pencil editing mode in Action Editor is currently non-functional (code is commented out due to missing dependencies). This is currently pending the re-implementation of Grease Pencil in 2.5
2008-12-26 10:55:07 +00:00
|
|
|
|
2012-12-26 13:05:39 +00:00
|
|
|
height = ((items * ACHANNEL_STEP) + (ACHANNEL_HEIGHT));
|
2009-02-19 17:13:04 +00:00
|
|
|
/* don't use totrect set, as the width stays the same
|
|
|
|
* (NOTE: this is ok here, the configuration is pretty straightforward)
|
|
|
|
*/
|
2012-03-24 02:51:46 +00:00
|
|
|
v2d->tot.ymin = (float)(-height);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* first backdrop strips */
|
2012-05-08 16:02:13 +00:00
|
|
|
y = (float)(-ACHANNEL_HEIGHT);
|
2008-12-22 08:13:25 +00:00
|
|
|
glEnable(GL_BLEND);
|
2008-12-22 09:43:54 +00:00
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
for (ale = anim_data.first; ale; ale = ale->next) {
|
|
|
|
const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
|
|
|
|
const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* check if visible */
|
2012-05-08 16:02:13 +00:00
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
|
2008-12-22 08:13:25 +00:00
|
|
|
{
|
2012-05-08 16:02:13 +00:00
|
|
|
bAnimChannelType *acf = ANIM_channel_get_typeinfo(ale);
|
|
|
|
int sel = 0;
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* determine if any need to draw channel */
|
|
|
|
if (ale->datatype != ALE_NONE) {
|
|
|
|
/* determine if channel is selected */
|
2009-08-24 04:31:13 +00:00
|
|
|
if (acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT))
|
2012-05-08 16:02:13 +00:00
|
|
|
sel = ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2014-07-20 01:30:29 +10:00
|
|
|
if (ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET, ANIMCONT_SHAPEKEY)) {
|
2008-12-22 08:13:25 +00:00
|
|
|
switch (ale->type) {
|
2009-10-13 11:21:02 +00:00
|
|
|
case ANIMTYPE_SUMMARY:
|
|
|
|
{
|
2012-06-04 01:17:37 +00:00
|
|
|
/* reddish color from NLA */
|
|
|
|
UI_ThemeColor4(TH_ANIM_ACTIVE);
|
2013-07-19 15:23:42 +00:00
|
|
|
break;
|
2009-10-13 11:21:02 +00:00
|
|
|
}
|
2009-02-13 06:33:07 +00:00
|
|
|
case ANIMTYPE_SCENE:
|
2008-12-22 08:13:25 +00:00
|
|
|
case ANIMTYPE_OBJECT:
|
|
|
|
{
|
|
|
|
if (sel) glColor4ub(col1b[0], col1b[1], col1b[2], 0x45);
|
|
|
|
else glColor4ub(col1b[0], col1b[1], col1b[2], 0x22);
|
2013-07-19 15:23:42 +00:00
|
|
|
break;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
2009-01-22 10:53:22 +00:00
|
|
|
case ANIMTYPE_FILLACTD:
|
2008-12-22 08:13:25 +00:00
|
|
|
case ANIMTYPE_DSSKEY:
|
2009-02-13 06:33:07 +00:00
|
|
|
case ANIMTYPE_DSWOR:
|
2008-12-22 08:13:25 +00:00
|
|
|
{
|
|
|
|
if (sel) glColor4ub(col2b[0], col2b[1], col2b[2], 0x45);
|
|
|
|
else glColor4ub(col2b[0], col2b[1], col2b[2], 0x22);
|
2013-07-19 15:23:42 +00:00
|
|
|
break;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
case ANIMTYPE_GROUP:
|
|
|
|
{
|
|
|
|
if (sel) glColor4ub(col1a[0], col1a[1], col1a[2], 0x22);
|
|
|
|
else glColor4ub(col2a[0], col2a[1], col2a[2], 0x22);
|
2013-07-19 15:23:42 +00:00
|
|
|
break;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
|
|
|
|
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
|
2013-07-19 15:23:42 +00:00
|
|
|
break;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* draw region twice: firstly backdrop, then the current range */
|
2012-05-08 16:02:13 +00:00
|
|
|
glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD, (float)y + ACHANNEL_HEIGHT_HALF);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2008-12-22 09:43:54 +00:00
|
|
|
if (ac->datatype == ANIMCONT_ACTION)
|
2012-05-08 16:02:13 +00:00
|
|
|
glRectf(act_start, (float)y - ACHANNEL_HEIGHT_HALF, act_end, (float)y + ACHANNEL_HEIGHT_HALF);
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
2008-12-22 09:43:54 +00:00
|
|
|
else if (ac->datatype == ANIMCONT_GPENCIL) {
|
2008-12-22 08:13:25 +00:00
|
|
|
/* frames less than one get less saturated background */
|
|
|
|
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
|
|
|
|
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
|
2012-05-08 16:02:13 +00:00
|
|
|
glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
2012-06-08 14:31:38 +00:00
|
|
|
/* frames one and higher get a saturated background */
|
|
|
|
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);
|
|
|
|
else glColor4ub(col2[0], col2[1], col2[2], 0x44);
|
|
|
|
glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD, (float)y + ACHANNEL_HEIGHT_HALF);
|
|
|
|
}
|
|
|
|
else if (ac->datatype == ANIMCONT_MASK) {
|
|
|
|
/* TODO --- this is a copy of gpencil */
|
|
|
|
/* frames less than one get less saturated background */
|
|
|
|
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
|
|
|
|
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
|
|
|
|
glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF);
|
|
|
|
|
2008-12-22 08:13:25 +00:00
|
|
|
/* frames one and higher get a saturated background */
|
|
|
|
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);
|
|
|
|
else glColor4ub(col2[0], col2[1], col2[2], 0x44);
|
2012-05-08 16:02:13 +00:00
|
|
|
glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD, (float)y + ACHANNEL_HEIGHT_HALF);
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Increment the step */
|
|
|
|
y -= ACHANNEL_STEP;
|
2012-10-21 05:46:41 +00:00
|
|
|
}
|
2008-12-22 08:13:25 +00:00
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
|
|
|
/* Draw keyframes
|
|
|
|
* 1) Only channels that are visible in the Action Editor get drawn/evaluated.
|
2012-03-02 16:05:54 +00:00
|
|
|
* This is to try to optimize this for heavier data sets
|
2008-12-22 08:13:25 +00:00
|
|
|
* 2) Keyframes which are out of view horizontally are disregarded
|
|
|
|
*/
|
2012-05-08 16:02:13 +00:00
|
|
|
y = (float)(-ACHANNEL_HEIGHT);
|
2008-12-22 09:43:54 +00:00
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
for (ale = anim_data.first; ale; ale = ale->next) {
|
|
|
|
const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
|
|
|
|
const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* check if visible */
|
2012-05-08 16:02:13 +00:00
|
|
|
if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
|
|
|
|
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
|
2008-12-22 08:13:25 +00:00
|
|
|
{
|
|
|
|
/* check if anything to show for this channel */
|
|
|
|
if (ale->datatype != ALE_NONE) {
|
2012-05-08 16:02:13 +00:00
|
|
|
adt = ANIM_nla_mapping_get(ac, ale);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* draw 'keyframes' for each specific datatype */
|
|
|
|
switch (ale->datatype) {
|
2009-10-13 11:21:02 +00:00
|
|
|
case ALE_ALL:
|
|
|
|
draw_summary_channel(v2d, ale->data, y);
|
|
|
|
break;
|
2009-02-13 06:33:07 +00:00
|
|
|
case ALE_SCE:
|
2009-07-09 13:14:51 +00:00
|
|
|
draw_scene_channel(v2d, ads, ale->key_data, y);
|
2009-02-13 06:33:07 +00:00
|
|
|
break;
|
2008-12-22 08:13:25 +00:00
|
|
|
case ALE_OB:
|
2009-07-09 13:14:51 +00:00
|
|
|
draw_object_channel(v2d, ads, ale->key_data, y);
|
2008-12-22 08:13:25 +00:00
|
|
|
break;
|
|
|
|
case ALE_ACT:
|
2009-07-09 13:14:51 +00:00
|
|
|
draw_action_channel(v2d, adt, ale->key_data, y);
|
2008-12-22 08:13:25 +00:00
|
|
|
break;
|
|
|
|
case ALE_GROUP:
|
2009-07-09 13:14:51 +00:00
|
|
|
draw_agroup_channel(v2d, adt, ale->data, y);
|
2008-12-22 08:13:25 +00:00
|
|
|
break;
|
2009-01-20 11:07:42 +00:00
|
|
|
case ALE_FCURVE:
|
2009-07-09 13:14:51 +00:00
|
|
|
draw_fcurve_channel(v2d, adt, ale->key_data, y);
|
2008-12-22 08:13:25 +00:00
|
|
|
break;
|
|
|
|
case ALE_GPFRAME:
|
2009-07-09 13:14:51 +00:00
|
|
|
draw_gpl_channel(v2d, ads, ale->data, y);
|
2008-12-22 08:13:25 +00:00
|
|
|
break;
|
2012-06-08 14:31:38 +00:00
|
|
|
case ALE_MASKLAY:
|
|
|
|
draw_masklay_channel(v2d, ads, ale->data, y);
|
|
|
|
break;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-08 16:02:13 +00:00
|
|
|
y -= ACHANNEL_STEP;
|
2008-12-22 08:13:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* free tempolary channels used for drawing */
|
2014-05-19 00:24:45 +10:00
|
|
|
ANIM_animdata_freelist(&anim_data);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
/* black line marking 'current frame' for Time-Slide transform mode */
|
|
|
|
if (saction->flag & SACTION_MOVING) {
|
2009-07-09 13:14:51 +00:00
|
|
|
glColor3f(0.0f, 0.0f, 0.0f);
|
2008-12-22 08:13:25 +00:00
|
|
|
|
|
|
|
glBegin(GL_LINES);
|
2012-05-08 16:02:13 +00:00
|
|
|
glVertex2f(saction->timeslide, v2d->cur.ymin - EXTRA_SCROLL_PAD);
|
|
|
|
glVertex2f(saction->timeslide, v2d->cur.ymax);
|
2008-12-22 08:13:25 +00:00
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
}
|