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