Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / nla_private.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Joshua Leung (full recode)
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/blenkernel/nla_private.h
29  *  \ingroup bke
30  */
31
32
33 #ifndef __NLA_PRIVATE_H__
34 #define __NLA_PRIVATE_H__
35
36 struct Depsgraph;
37
38 #include "RNA_types.h"
39
40 /* --------------- NLA Evaluation DataTypes ----------------------- */
41
42 /* used for list of strips to accumulate at current time */
43 typedef struct NlaEvalStrip {
44         struct NlaEvalStrip *next, *prev;
45
46         NlaTrack *track;            /* track that this strip belongs to */
47         NlaStrip *strip;            /* strip that's being used */
48
49         short track_index;          /* the index of the track within the list */
50         short strip_mode;           /* which end of the strip are we looking at */
51
52         float strip_time;           /* time at which which strip is being evaluated */
53 } NlaEvalStrip;
54
55 /* NlaEvalStrip->strip_mode */
56 enum eNlaEvalStrip_StripMode {
57         /* standard evaluation */
58         NES_TIME_BEFORE = -1,
59         NES_TIME_WITHIN,
60         NES_TIME_AFTER,
61
62         /* transition-strip evaluations */
63         NES_TIME_TRANSITION_START,
64         NES_TIME_TRANSITION_END,
65 };
66
67
68 /* temp channel for accumulating data from NLA (avoids needing to clear all values first) */
69 // TODO: maybe this will be used as the 'cache' stuff needed for editable values too?
70 typedef struct NlaEvalChannel {
71         struct NlaEvalChannel *next, *prev;
72
73         /* RNA reference to use with pointer and index */
74         PathResolvedRNA rna;
75
76         /* Original parameters used to look up the reference for write_orig_anim_rna */
77         const char *rna_path;
78
79         float value;            /* value of this channel */
80 } NlaEvalChannel;
81
82 /* Information about the currently edited strip and ones below it for keyframing. */
83 typedef struct NlaKeyframingContext {
84         struct NlaKeyframingContext *next, *prev;
85
86         /* AnimData for which this context was built. */
87         struct AnimData *adt;
88
89         /* Data of the currently edited strip (copy, or fake strip for the main action). */
90         NlaStrip strip;
91         NlaEvalStrip *eval_strip;
92
93         /* Evaluated NLA stack below the current strip. */
94         ListBase nla_channels;
95 } NlaKeyframingContext;
96
97 /* --------------- NLA Functions (not to be used as a proper API) ----------------------- */
98
99 /* convert from strip time <-> global time */
100 float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
101
102 /* --------------- NLA Evaluation (very-private stuff) ----------------------- */
103 /* these functions are only defined here to avoid problems with the order in which they get defined... */
104
105 NlaEvalStrip *nlastrips_ctime_get_strip(struct Depsgraph *depsgraph, ListBase *list, ListBase *strips, short index, float ctime);
106 void nlastrip_evaluate(struct Depsgraph *depsgraph, PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes);
107 void nladata_flush_channels(struct Depsgraph *depsgraph, PointerRNA *ptr, ListBase *channels);
108
109 #endif  /* __NLA_PRIVATE_H__ */