75faaf85d142cc44b07ceb9925988183854b8dab
[blender.git] / source / blender / editors / include / ED_keyframes_edit.h
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 #ifndef ED_KEYFRAMES_EDIT_H
30 #define ED_KEYFRAMES_EDIT_H
31
32 struct bAnimContext;
33 struct Ipo;
34 struct IpoCurve;
35 struct BezTriple;
36 struct Scene;
37
38 /* ************************************************ */
39 /* Common Macros and Defines */
40
41 /* --------- BezTriple Selection ------------- */
42
43 #define BEZSELECTED(bezt) ((bezt->f2 & SELECT) || (bezt->f1 & SELECT) || (bezt->f3 & SELECT))
44
45 #define BEZ_SEL(bezt)           { (bezt)->f1 |=  SELECT; (bezt)->f2 |=  SELECT; (bezt)->f3 |=  SELECT; }
46 #define BEZ_DESEL(bezt)         { (bezt)->f1 &= ~SELECT; (bezt)->f2 &= ~SELECT; (bezt)->f3 &= ~SELECT; }
47 #define BEZ_INVSEL(bezt)        { (bezt)->f1 ^=  SELECT; (bezt)->f2 ^=  SELECT; (bezt)->f3 ^=  SELECT; }
48
49 /* --------- Tool Flags ------------ */
50
51 /* bezt validation */
52 typedef enum eEditKeyframes_Validate {
53         BEZT_OK_FRAME   = 1,
54         BEZT_OK_FRAMERANGE,
55         BEZT_OK_SELECTED,
56         BEZT_OK_VALUE,
57 } eEditKeyframes_Validate;
58
59 /* ------------ */
60
61 /* select tools */
62 typedef enum eEditKeyframes_Select {
63         SELECT_REPLACE  =       (1<<0),
64         SELECT_ADD              =       (1<<1),
65         SELECT_SUBTRACT =       (1<<2),
66         SELECT_INVERT   =       (1<<4),
67 } eEditKeyframes_Select;
68
69 /* snapping tools */
70 typedef enum eEditKeyframes_Snap {
71         SNAP_KEYS_CURFRAME = 1,
72         SNAP_KEYS_NEARFRAME,
73         SNAP_KEYS_NEARSEC,
74         SNAP_KEYS_NEARMARKER,
75 } eEditKeyframes_Snap;
76
77 /* mirroring tools */
78 typedef enum eEditKeyframes_Mirror {
79         MIRROR_KEYS_CURFRAME = 1,
80         MIRROR_KEYS_YAXIS,
81         MIRROR_KEYS_XAXIS,
82         MIRROR_KEYS_MARKER,
83 } eEditKeyframes_Mirror;
84
85 /* ************************************************ */
86 /* Non-Destuctive Editing API (keyframes_edit.c) */
87
88 /* --- Generic Properties for Bezier Edit Tools ----- */
89
90 // XXX maybe a union would be more compact?
91 typedef struct BeztEditData {
92         ListBase list;                          /* temp list for storing custom list of data to check */
93         struct Scene *scene;            /* pointer to current scene - many tools need access to cfra/etc.  */
94         void *data;                                     /* pointer to custom data - not that useful? */
95         float f1, f2;                           /* storage of times/values as 'decimals' */
96         int i1, i2;                                     /* storage of times/values as 'whole' numbers */
97 } BeztEditData;
98
99 /* ------- Function Pointer Typedefs ---------------- */
100
101         /* callback function that refreshes the IPO curve after use */
102 typedef void (*IcuEditFunc)(struct IpoCurve *icu);
103         /* callback function that operates on the given BezTriple */
104 typedef short (*BeztEditFunc)(BeztEditData *bed, struct BezTriple *bezt);
105
106 /* ---------------- Looping API --------------------- */
107
108 /* functions for looping over keyframes */
109 short icu_keys_bezier_loop(BeztEditData *bed, struct IpoCurve *icu, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, IcuEditFunc icu_cb);
110 short ipo_keys_bezier_loop(BeztEditData *bed, struct Ipo *ipo, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, IcuEditFunc icu_cb);
111
112 /* functions for making sure all keyframes are in good order */
113 void ANIM_editkeyframes_refresh(struct bAnimContext *ac);
114
115 /* ----------- BezTriple Callback Getters ---------- */
116
117 /* accessories */
118 BeztEditFunc ANIM_editkeyframes_ok(short mode);
119
120 /* edit */
121 BeztEditFunc ANIM_editkeyframes_snap(short mode);
122 BeztEditFunc ANIM_editkeyframes_mirror(short mode);
123 BeztEditFunc ANIM_editkeyframes_select(short mode);
124 BeztEditFunc ANIM_editkeyframes_handles(short mode);
125 BeztEditFunc ANIM_editkeyframes_ipo(short mode);
126
127 /* ---------- IpoCurve Callbacks ------------ */
128
129 void ANIM_editkeyframes_ipocurve_ipotype(struct IpoCurve *icu);
130
131 /* ************************************************ */
132 /* Destructive Editing API (keyframes_general.c) */
133
134 void delete_icu_key(struct IpoCurve *icu, int index, short do_recalc);
135 void delete_ipo_keys(struct Ipo *ipo);
136 void duplicate_ipo_keys(struct Ipo *ipo);
137
138 void clean_ipo_curve(struct IpoCurve *icu, float thresh);
139 void smooth_ipo_curve(struct IpoCurve *icu, short mode);
140
141 /* ************************************************ */
142
143 // XXX all of these funcs should be depreceated or at least renamed!
144
145 /* in keyframes_edit.c */
146 short is_ipo_key_selected(struct Ipo *ipo);
147 void set_ipo_key_selection(struct Ipo *ipo, short sel);
148
149 void setexprap_ipoloop(struct Ipo *ipo, short code);
150
151
152 /* ************************************************ */
153
154 #endif /* ED_KEYFRAMES_EDIT_H */