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