Keymap: use tab key for indent or auto-complete
[blender.git] / source / blender / blenkernel / BKE_animsys.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
17  * All rights reserved.
18  */
19
20 #ifndef __BKE_ANIMSYS_H__
21 #define __BKE_ANIMSYS_H__
22
23 /** \file
24  * \ingroup bke
25  */
26
27 struct AnimData;
28 struct Depsgraph;
29 struct FCurve;
30 struct ID;
31 struct KS_Path;
32 struct KeyingSet;
33 struct ListBase;
34 struct Main;
35 struct NlaKeyframingContext;
36 struct PointerRNA;
37 struct PropertyRNA;
38 struct ReportList;
39 struct Scene;
40 struct bAction;
41 struct bActionGroup;
42 struct bContext;
43
44 /* ************************************* */
45 /* AnimData API */
46
47 /* Check if the given ID-block can have AnimData */
48 bool id_type_can_have_animdata(const short id_type);
49 bool id_can_have_animdata(const struct ID *id);
50
51 /* Get AnimData from the given ID-block */
52 struct AnimData *BKE_animdata_from_id(struct ID *id);
53
54 /* Add AnimData to the given ID-block */
55 struct AnimData *BKE_animdata_add_id(struct ID *id);
56
57 /* Set active action used by AnimData from the given ID-block */
58 bool BKE_animdata_set_action(struct ReportList *reports, struct ID *id, struct bAction *act);
59
60 /* Free AnimData */
61 void BKE_animdata_free(struct ID *id, const bool do_id_user);
62
63 /* Copy AnimData */
64 struct AnimData *BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, const int flag);
65
66 /* Copy AnimData */
67 bool BKE_animdata_copy_id(struct Main *bmain,
68                           struct ID *id_to,
69                           struct ID *id_from,
70                           const int flag);
71
72 /* Copy AnimData Actions */
73 void BKE_animdata_copy_id_action(struct Main *bmain, struct ID *id, const bool set_newid);
74
75 /* Merge copies of data from source AnimData block */
76 typedef enum eAnimData_MergeCopy_Modes {
77   /* Keep destination action */
78   ADT_MERGECOPY_KEEP_DST = 0,
79
80   /* Use src action (make a new copy) */
81   ADT_MERGECOPY_SRC_COPY = 1,
82
83   /* Use src action (but just reference the existing version) */
84   ADT_MERGECOPY_SRC_REF = 2,
85 } eAnimData_MergeCopy_Modes;
86
87 void BKE_animdata_merge_copy(struct Main *bmain,
88                              struct ID *dst_id,
89                              struct ID *src_id,
90                              eAnimData_MergeCopy_Modes action_mode,
91                              bool fix_drivers);
92
93 /* ************************************* */
94 /* KeyingSets API */
95
96 /* Used to create a new 'custom' KeyingSet for the user,
97  * that will be automatically added to the stack */
98 struct KeyingSet *BKE_keyingset_add(
99     struct ListBase *list, const char idname[], const char name[], short flag, short keyingflag);
100
101 /* Add a path to a KeyingSet */
102 struct KS_Path *BKE_keyingset_add_path(struct KeyingSet *ks,
103                                        struct ID *id,
104                                        const char group_name[],
105                                        const char rna_path[],
106                                        int array_index,
107                                        short flag,
108                                        short groupmode);
109
110 /* Find the destination matching the criteria given */
111 struct KS_Path *BKE_keyingset_find_path(struct KeyingSet *ks,
112                                         struct ID *id,
113                                         const char group_name[],
114                                         const char rna_path[],
115                                         int array_index,
116                                         int group_mode);
117
118 /* Copy all KeyingSets in the given list */
119 void BKE_keyingsets_copy(struct ListBase *newlist, const struct ListBase *list);
120
121 /* Free the given Keying Set path */
122 void BKE_keyingset_free_path(struct KeyingSet *ks, struct KS_Path *ksp);
123
124 /* Free data for KeyingSet but not set itself */
125 void BKE_keyingset_free(struct KeyingSet *ks);
126
127 /* Free all the KeyingSets in the given list */
128 void BKE_keyingsets_free(struct ListBase *list);
129
130 /* ************************************* */
131 /* Path Fixing API */
132
133 /* Get a "fixed" version of the given path (oldPath) */
134 char *BKE_animsys_fix_rna_path_rename(struct ID *owner_id,
135                                       char *old_path,
136                                       const char *prefix,
137                                       const char *oldName,
138                                       const char *newName,
139                                       int oldSubscript,
140                                       int newSubscript,
141                                       bool verify_paths);
142
143 /* Fix all the paths for the given ID + Action */
144 void BKE_action_fix_paths_rename(struct ID *owner_id,
145                                  struct bAction *act,
146                                  const char *prefix,
147                                  const char *oldName,
148                                  const char *newName,
149                                  int oldSubscript,
150                                  int newSubscript,
151                                  bool verify_paths);
152
153 /* Fix all the paths for the given ID+AnimData */
154 void BKE_animdata_fix_paths_rename(struct ID *owner_id,
155                                    struct AnimData *adt,
156                                    struct ID *ref_id,
157                                    const char *prefix,
158                                    const char *oldName,
159                                    const char *newName,
160                                    int oldSubscript,
161                                    int newSubscript,
162                                    bool verify_paths);
163
164 /* Fix all the paths for the entire database... */
165 void BKE_animdata_fix_paths_rename_all(struct ID *ref_id,
166                                        const char *prefix,
167                                        const char *oldName,
168                                        const char *newName);
169
170 /* Fix the path after removing elements that are not ID (e.g., node).
171  * Return true if any animation data was affected. */
172 bool BKE_animdata_fix_paths_remove(struct ID *id, const char *path);
173
174 /* -------------------------------------- */
175
176 /* Move animation data from src to destination if it's paths are based on basepaths */
177 void BKE_animdata_separate_by_basepath(struct Main *bmain,
178                                        struct ID *srcID,
179                                        struct ID *dstID,
180                                        struct ListBase *basepaths);
181
182 /* Move F-Curves from src to destination if it's path is based on basepath */
183 void action_move_fcurves_by_basepath(struct bAction *srcAct,
184                                      struct bAction *dstAct,
185                                      const char basepath[]);
186
187 char *BKE_animdata_driver_path_hack(struct bContext *C,
188                                     struct PointerRNA *ptr,
189                                     struct PropertyRNA *prop,
190                                     char *base_path);
191
192 /* ************************************* */
193 /* Batch AnimData API */
194
195 /* Define for callback looper used in BKE_animdata_main_cb */
196 typedef void (*ID_AnimData_Edit_Callback)(struct ID *id, struct AnimData *adt, void *user_data);
197
198 /* Define for callback looper used in BKE_fcurves_main_cb */
199 typedef void (*ID_FCurve_Edit_Callback)(struct ID *id, struct FCurve *fcu, void *user_data);
200
201 /* Loop over all datablocks applying callback */
202 void BKE_animdata_main_cb(struct Main *bmain, ID_AnimData_Edit_Callback func, void *user_data);
203
204 /* Loop over all datablocks applying callback to all its F-Curves */
205 void BKE_fcurves_main_cb(struct Main *bmain, ID_FCurve_Edit_Callback func, void *user_data);
206
207 /* Look over all f-curves of a given ID. */
208 void BKE_fcurves_id_cb(struct ID *id, ID_FCurve_Edit_Callback func, void *user_data);
209
210 /* ************************************* */
211 // TODO: overrides, remapping, and path-finding api's
212
213 /* ------------ NLA Keyframing --------------- */
214
215 typedef struct NlaKeyframingContext NlaKeyframingContext;
216
217 struct NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context(struct ListBase *cache,
218                                                                     struct PointerRNA *ptr,
219                                                                     struct AnimData *adt,
220                                                                     float ctime,
221                                                                     const bool flush_to_original);
222 bool BKE_animsys_nla_remap_keyframe_values(struct NlaKeyframingContext *context,
223                                            struct PointerRNA *prop_ptr,
224                                            struct PropertyRNA *prop,
225                                            float *values,
226                                            int count,
227                                            int index,
228                                            bool *r_force_all);
229 void BKE_animsys_free_nla_keyframing_context_cache(struct ListBase *cache);
230
231 /* ************************************* */
232 /* Evaluation API */
233
234 /* ------------- Main API -------------------- */
235 /* In general, these ones should be called to do all animation evaluation */
236
237 /* Flags for recalc parameter, indicating which part to recalculate. */
238 typedef enum eAnimData_Recalc {
239   ADT_RECALC_DRIVERS = (1 << 0),
240   ADT_RECALC_ANIM = (1 << 1),
241   ADT_RECALC_ALL = (ADT_RECALC_DRIVERS | ADT_RECALC_ANIM),
242 } eAnimData_Recalc;
243
244 /* Evaluation loop for evaluating animation data  */
245 void BKE_animsys_evaluate_animdata(struct Scene *scene,
246                                    struct ID *id,
247                                    struct AnimData *adt,
248                                    float ctime,
249                                    short recalc,
250                                    const bool flush_to_original);
251
252 /* Evaluation of all ID-blocks with Animation Data blocks - Animation Data Only */
253 void BKE_animsys_evaluate_all_animation(struct Main *main,
254                                         struct Depsgraph *depsgraph,
255                                         struct Scene *scene,
256                                         float ctime);
257
258 /* TODO(sergey): This is mainly a temp public function. */
259 bool BKE_animsys_execute_fcurve(struct PointerRNA *ptr, struct FCurve *fcu, float curval);
260
261 /* ------------ Specialized API --------------- */
262 /* There are a few special tools which require these following functions. They are NOT to be used
263  * for standard animation evaluation UNDER ANY CIRCUMSTANCES!
264  *
265  * i.e. Pose Library (PoseLib) uses some of these for selectively applying poses, but
266  *      Particles/Sequencer performing funky time manipulation is not ok.
267  */
268
269 /* Evaluate Action (F-Curve Bag) */
270 void animsys_evaluate_action(struct PointerRNA *ptr,
271                              struct bAction *act,
272                              float ctime,
273                              const bool flush_to_original);
274
275 /* Evaluate Action Group */
276 void animsys_evaluate_action_group(struct PointerRNA *ptr,
277                                    struct bAction *act,
278                                    struct bActionGroup *agrp,
279                                    float ctime);
280
281 /* ************************************* */
282
283 /* ------------ Evaluation API --------------- */
284
285 struct Depsgraph;
286
287 void BKE_animsys_eval_animdata(struct Depsgraph *depsgraph, struct ID *id);
288 void BKE_animsys_eval_driver(struct Depsgraph *depsgraph,
289                              struct ID *id,
290                              int driver_index,
291                              struct FCurve *fcu_orig);
292
293 void BKE_animsys_update_driver_array(struct ID *id);
294
295 /* ************************************* */
296
297 #endif /* __BKE_ANIMSYS_H__*/