Animation: Remove depsgraph argument from a lot of API
[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
21  * \ingroup bke
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
167  * in which they get defined. */
168
169 NlaEvalStrip *nlastrips_ctime_get_strip(
170     ListBase *list, ListBase *strips, short index, float ctime, const bool flush_to_original);
171 void nlastrip_evaluate(PointerRNA *ptr,
172                        NlaEvalData *channels,
173                        ListBase *modifiers,
174                        NlaEvalStrip *nes,
175                        NlaEvalSnapshot *snapshot,
176                        const bool flush_to_original);
177 void nladata_flush_channels(PointerRNA *ptr,
178                             NlaEvalData *channels,
179                             NlaEvalSnapshot *snapshot,
180                             const bool flush_to_original);
181
182 #endif /* __NLA_PRIVATE_H__ */