2.5 - Animation Editors - common drawing stuff
[blender-staging.git] / source / blender / editors / animation / anim_filter.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Joshua Leung
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 /* This file defines the system for filtering data into a form suitable for
30  * use by the Animation Editors, thus acting as a means by which the Animation 
31  * Editors maintain a level of abstraction from the data they actually manipulate.
32  * Thus, they only need to check on the type of the data they're manipulating, and
33  * NOT worry about various layers of context/hierarchy checks.
34  *
35  * While this is primarily used for the Action/Dopesheet Editor (and its accessory modes),
36  * the IPO Editor also uses this for it's channel list and for determining which curves
37  * are being edited.
38  *
39  * -- Joshua Leung, Dec 2008
40  */
41
42 #include <string.h>
43 #include <stdio.h>
44
45 #include "DNA_listBase.h"
46 #include "DNA_ID.h"
47 #include "DNA_action_types.h"
48 #include "DNA_camera_types.h"
49 #include "DNA_curve_types.h"
50 #include "DNA_ipo_types.h"
51 #include "DNA_lattice_types.h"
52 #include "DNA_key_types.h"
53 #include "DNA_mesh_types.h"
54 #include "DNA_object_types.h"
55 #include "DNA_space_types.h"
56 #include "DNA_scene_types.h"
57 #include "DNA_screen_types.h"
58 #include "DNA_windowmanager_types.h"
59
60 #include "MEM_guardedalloc.h"
61
62 #include "BLI_blenlib.h"
63
64 #include "BKE_context.h"
65 #include "BKE_global.h"
66 #include "BKE_screen.h"
67 #include "BKE_utildefines.h"
68
69 #include "ED_anim_api.h"
70 #include "ED_types.h"
71 #include "ED_util.h"
72
73 #include "WM_api.h"
74 #include "WM_types.h"
75
76 #include "BIF_gl.h"
77 #include "BIF_glutil.h"
78
79 #include "UI_interface.h"
80 #include "UI_resources.h"
81 #include "UI_view2d.h"
82
83 /* ************************************************************ */
84 /* Blender Context <-> Animation Context mapping */
85
86 /* ----------- Private Stuff - Action Editor ------------- */
87
88 /* Get shapekey data being edited (for Action Editor -> ShapeKey mode) */
89 /* Note: there's a similar function in key.c (ob_get_key) */
90 Key *actedit_get_shapekeys (const bContext *C, SpaceAction *saction) 
91 {
92     Scene *scene= CTX_data_scene(C);
93     Object *ob;
94     Key *key;
95         
96     ob = OBACT;  // XXX er...
97     if (ob == NULL) 
98                 return NULL;
99         
100         /* pinning is not available in 'ShapeKey' mode... */
101         //if (saction->pin) return NULL;
102         
103         /* shapekey data is stored with geometry data */
104         switch (ob->type) {
105                 case OB_MESH:
106                         key= ((Mesh *)ob->data)->key;
107                         break;
108                         
109                 case OB_LATTICE:
110                         key= ((Lattice *)ob->data)->key;
111                         break;
112                         
113                 case OB_CURVE:
114                 case OB_SURF:
115                         key= ((Curve *)ob->data)->key;
116                         break;
117                         
118                 default:
119                         return NULL;
120         }
121         
122         if (key) {
123                 if (key->type == KEY_RELATIVE)
124                         return key;
125         }
126         
127     return NULL;
128 }
129
130 /* Get data being edited in Action Editor (depending on current 'mode') */
131 static void *actedit_get_context (const bContext *C, SpaceAction *saction, short *datatype)
132 {
133         Scene *scene= CTX_data_scene(C);
134         
135         /* sync settings with current view status, then return appropriate data */
136         switch (saction->mode) {
137                 case SACTCONT_ACTION: /* 'Action Editor' */
138                         /* if not pinned, sync with active object */
139                         if (saction->pin == 0) {
140                                 if (OBACT)
141                                         saction->action = OBACT->action;
142                                 else
143                                         saction->action= NULL;
144                         }
145                                 
146                         *datatype= ANIMCONT_ACTION;
147                         return saction->action;
148                         
149                 case SACTCONT_SHAPEKEY: /* 'ShapeKey Editor' */
150                         *datatype= ANIMCONT_SHAPEKEY;
151                         return actedit_get_shapekeys(C, saction);
152                         
153                 case SACTCONT_GPENCIL: /* Grease Pencil */ // XXX review how this mode is handled...
154                         *datatype=ANIMCONT_GPENCIL;
155                         return CTX_wm_screen(C); // FIXME: add that dopesheet type thing here!
156                         break;
157                         
158                 case SACTCONT_DOPESHEET: /* DopeSheet */
159                         /* update scene-pointer (no need to check for pinning yet, as not implemented) */
160                         saction->ads.source= (ID *)scene;
161                         
162                         *datatype= ANIMCONT_DOPESHEET;
163                         return &saction->ads;
164                 
165                 default: /* unhandled yet */
166                         *datatype= ANIMCONT_NONE;
167                         return NULL;
168         }
169 }
170
171 /* ----------- Private Stuff - IPO Editor ------------- */
172
173 /* Get data being edited in IPO Editor (depending on current 'mode') */
174 static void *ipoedit_get_context (const bContext *C, SpaceIpo *sipo, short *datatype)
175 {
176         // XXX FIXME...
177         return NULL;
178 }
179
180 /* ----------- Public API --------------- */
181
182 /* Obtain current anim-data context from Blender Context info */
183 void *ANIM_animdata_get_context (const bContext *C, short *datatype)
184 {
185         ScrArea *sa= CTX_wm_area(C);
186         
187         /* set datatype to 'None' for convenience */
188         if (datatype == NULL) return NULL;
189         *datatype= ANIMCONT_NONE;
190         if (sa == NULL) return NULL; /* highly unlikely to happen, but still! */
191         
192         /* context depends on editor we are currently in */
193         switch (sa->spacetype) {
194                 case SPACE_ACTION:
195                 {
196                         SpaceAction *saction= (SpaceAction *)CTX_wm_space_data(C);
197                         return actedit_get_context(C, saction, datatype);
198                 }
199                         break;
200                         
201                 case SPACE_IPO:
202                 {
203                         SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
204                         return ipoedit_get_context(C, sipo, datatype);
205                 }
206                         break;
207         }
208         
209         /* nothing appropriate */
210         return NULL;
211 }
212
213 /* ************************************************************ */
214 /* Blender Data <-- Filter --> Channels to be operated on */
215
216 /* ----------- 'Private' Stuff --------------- */
217
218
219 /* ----------- Public API --------------- */
220
221 /* This function filters the active data source to leave only the desired
222  * data types. 'Public' api call.
223  *      *act_data: is a pointer to a ListBase, to which the filtered animation channels
224  *              will be placed for use.
225  *      filter_mode: how should the data be filtered - bitmapping accessed flags
226  */
227 void ANIM_animdata_filter (ListBase *anim_data, int filter_mode, void *data, short datatype)
228 {
229         /* only filter data if there's somewhere to put it */
230         if (data && anim_data) {
231                 bAnimListElem *ale, *next;
232                 
233                 /* firstly filter the data */
234                 switch (datatype) {
235                         case ANIMCONT_ACTION:
236                                 //animdata_filter_action(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE);
237                                 break;
238                         case ANIMCONT_SHAPEKEY:
239                                 //animdata_filter_shapekey(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE);
240                                 break;
241                         case ANIMCONT_GPENCIL:
242                                 //animdata_filter_gpencil(anim_data, data, filter_mode);
243                                 break;
244                         case ANIMCONT_DOPESHEET:
245                                 //animdata_filter_dopesheet(anim_data, data, filter_mode);
246                                 break;
247                 }
248                         
249                 /* remove any weedy entries */
250                 // XXX this is weedy code!
251                 for (ale= anim_data->first; ale; ale= next) {
252                         next= ale->next;
253                         
254                         if (ale->type == ANIMTYPE_NONE)
255                                 BLI_freelinkN(anim_data, ale);
256                         
257                         if (filter_mode & ALEFILTER_IPOKEYS) {
258                                 if (ale->datatype != ALE_IPO)
259                                         BLI_freelinkN(anim_data, ale);
260                                 else if (ale->key_data == NULL)
261                                         BLI_freelinkN(anim_data, ale);
262                         }
263                 }
264         }
265 }
266
267 /* ************************************************************ */