Physically based defaults for Eevee Bloom and Shutter
[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 /* NlaEvalChannel->mix_mode */
96 enum eNlaEvalChannel_MixMode {
97         NEC_MIX_ADD,
98         NEC_MIX_MULTIPLY,
99         NEC_MIX_QUATERNION,
100         NEC_MIX_AXIS_ANGLE,
101 };
102
103 /* Temp channel for accumulating data from NLA for a single property.
104  * Handles array properties as a unit to allow intelligent blending. */
105 typedef struct NlaEvalChannel {
106         struct NlaEvalChannel *next, *prev;
107         struct NlaEvalData *owner;
108
109         /* Original RNA path string and property key. */
110         const char *rna_path;
111         NlaEvalChannelKey key;
112
113         int index;
114         bool is_array;
115         bool in_blend;
116         char mix_mode;
117
118         struct NlaEvalChannel *next_blend;
119         NlaEvalChannelSnapshot *blend_snapshot;
120
121         /* Mask of array items controlled by NLA. */
122         NlaValidMask valid;
123
124         /* Base set of values. */
125         NlaEvalChannelSnapshot base_snapshot;
126         /* Memory over-allocated to provide space for base_snapshot.values. */
127 } NlaEvalChannel;
128
129 /* Set of values for all channels. */
130 typedef struct NlaEvalSnapshot {
131         /* Snapshot this one defaults to. */
132         struct NlaEvalSnapshot *base;
133
134         int size;
135         NlaEvalChannelSnapshot **channels;
136 } NlaEvalSnapshot;
137
138 /* Set of all channels covered by NLA. */
139 typedef struct NlaEvalData {
140         ListBase channels;
141
142         /* Mapping of paths and NlaEvalChannelKeys to channels. */
143         GHash *path_hash;
144         GHash *key_hash;
145
146         /* Base snapshot. */
147         int num_channels;
148         NlaEvalSnapshot base_snapshot;
149
150         /* Evaluation result shapshot. */
151         NlaEvalSnapshot eval_snapshot;
152 } NlaEvalData;
153
154 /* Information about the currently edited strip and ones below it for keyframing. */
155 typedef struct NlaKeyframingContext {
156         struct NlaKeyframingContext *next, *prev;
157
158         /* AnimData for which this context was built. */
159         struct AnimData *adt;
160
161         /* Data of the currently edited strip (copy, or fake strip for the main action). */
162         NlaStrip strip;
163         NlaEvalStrip *eval_strip;
164
165         /* Evaluated NLA stack below the current strip. */
166         NlaEvalData nla_channels;
167 } NlaKeyframingContext;
168
169 /* --------------- NLA Functions (not to be used as a proper API) ----------------------- */
170
171 /* convert from strip time <-> global time */
172 float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
173
174 /* --------------- NLA Evaluation (very-private stuff) ----------------------- */
175 /* these functions are only defined here to avoid problems with the order in which they get defined... */
176
177 NlaEvalStrip *nlastrips_ctime_get_strip(struct Depsgraph *depsgraph, ListBase *list, ListBase *strips, short index, float ctime);
178 void nlastrip_evaluate(struct Depsgraph *depsgraph, PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot);
179 void nladata_flush_channels(struct Depsgraph *depsgraph, PointerRNA *ptr, NlaEvalData *channels, NlaEvalSnapshot *snapshot);
180
181 #endif  /* __NLA_PRIVATE_H__ */