Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / nla_private.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 /** \file blender/blenkernel/nla_private.h
21  *  \ingroup bke
22  */
23
24
25 #ifndef __NLA_PRIVATE_H__
26 #define __NLA_PRIVATE_H__
27
28 struct Depsgraph;
29
30 #include "RNA_types.h"
31 #include "BLI_bitmap.h"
32 #include "BLI_ghash.h"
33
34 /* --------------- NLA Evaluation DataTypes ----------------------- */
35
36 /* used for list of strips to accumulate at current time */
37 typedef struct NlaEvalStrip {
38         struct NlaEvalStrip *next, *prev;
39
40         NlaTrack *track;            /* track that this strip belongs to */
41         NlaStrip *strip;            /* strip that's being used */
42
43         short track_index;          /* the index of the track within the list */
44         short strip_mode;           /* which end of the strip are we looking at */
45
46         float strip_time;           /* time at which which strip is being evaluated */
47 } NlaEvalStrip;
48
49 /* NlaEvalStrip->strip_mode */
50 enum eNlaEvalStrip_StripMode {
51         /* standard evaluation */
52         NES_TIME_BEFORE = -1,
53         NES_TIME_WITHIN,
54         NES_TIME_AFTER,
55
56         /* transition-strip evaluations */
57         NES_TIME_TRANSITION_START,
58         NES_TIME_TRANSITION_END,
59 };
60
61 struct NlaEvalChannel;
62 struct NlaEvalData;
63
64 /* Unique channel key for GHash. */
65 typedef struct NlaEvalChannelKey {
66         struct PointerRNA ptr;
67         struct PropertyRNA *prop;
68 } NlaEvalChannelKey;
69
70 /* Bitmask of array indices touched by actions. */
71 typedef struct NlaValidMask {
72         BLI_bitmap *ptr;
73         BLI_bitmap buffer[sizeof(uint64_t) / sizeof(BLI_bitmap)];
74 } NlaValidMask;
75
76 /* Set of property values for blending. */
77 typedef struct NlaEvalChannelSnapshot {
78         struct NlaEvalChannel *channel;
79
80         int length;              /* Number of values in the property. */
81         bool is_base;            /* Base snapshot of the channel. */
82
83         float values[];          /* Item values. */
84         /* Memory over-allocated to provide space for values. */
85 } NlaEvalChannelSnapshot;
86
87 /* NlaEvalChannel->mix_mode */
88 enum eNlaEvalChannel_MixMode {
89         NEC_MIX_ADD,
90         NEC_MIX_MULTIPLY,
91         NEC_MIX_QUATERNION,
92         NEC_MIX_AXIS_ANGLE,
93 };
94
95 /* Temp channel for accumulating data from NLA for a single property.
96  * Handles array properties as a unit to allow intelligent blending. */
97 typedef struct NlaEvalChannel {
98         struct NlaEvalChannel *next, *prev;
99         struct NlaEvalData *owner;
100
101         /* Original RNA path string and property key. */
102         const char *rna_path;
103         NlaEvalChannelKey key;
104
105         int index;
106         bool is_array;
107         bool in_blend;
108         char mix_mode;
109
110         struct NlaEvalChannel *next_blend;
111         NlaEvalChannelSnapshot *blend_snapshot;
112
113         /* Mask of array items controlled by NLA. */
114         NlaValidMask valid;
115
116         /* Base set of values. */
117         NlaEvalChannelSnapshot base_snapshot;
118         /* Memory over-allocated to provide space for base_snapshot.values. */
119 } NlaEvalChannel;
120
121 /* Set of values for all channels. */
122 typedef struct NlaEvalSnapshot {
123         /* Snapshot this one defaults to. */
124         struct NlaEvalSnapshot *base;
125
126         int size;
127         NlaEvalChannelSnapshot **channels;
128 } NlaEvalSnapshot;
129
130 /* Set of all channels covered by NLA. */
131 typedef struct NlaEvalData {
132         ListBase channels;
133
134         /* Mapping of paths and NlaEvalChannelKeys to channels. */
135         GHash *path_hash;
136         GHash *key_hash;
137
138         /* Base snapshot. */
139         int num_channels;
140         NlaEvalSnapshot base_snapshot;
141
142         /* Evaluation result shapshot. */
143         NlaEvalSnapshot eval_snapshot;
144 } NlaEvalData;
145
146 /* Information about the currently edited strip and ones below it for keyframing. */
147 typedef struct NlaKeyframingContext {
148         struct NlaKeyframingContext *next, *prev;
149
150         /* AnimData for which this context was built. */
151         struct AnimData *adt;
152
153         /* Data of the currently edited strip (copy, or fake strip for the main action). */
154         NlaStrip strip;
155         NlaEvalStrip *eval_strip;
156
157         /* Evaluated NLA stack below the current strip. */
158         NlaEvalData nla_channels;
159 } NlaKeyframingContext;
160
161 /* --------------- NLA Functions (not to be used as a proper API) ----------------------- */
162
163 /* convert from strip time <-> global time */
164 float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
165
166 /* --------------- NLA Evaluation (very-private stuff) ----------------------- */
167 /* these functions are only defined here to avoid problems with the order in which they get defined... */
168
169 NlaEvalStrip *nlastrips_ctime_get_strip(struct Depsgraph *depsgraph, ListBase *list, ListBase *strips, short index, float ctime);
170 void nlastrip_evaluate(struct Depsgraph *depsgraph, PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot);
171 void nladata_flush_channels(struct Depsgraph *depsgraph, PointerRNA *ptr, NlaEvalData *channels, NlaEvalSnapshot *snapshot);
172
173 #endif  /* __NLA_PRIVATE_H__ */