header cleanup (no functional changes)
[blender.git] / source / blender / blenkernel / BKE_pointcache.h
1 /*
2  * $Id:
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software  Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2006 Blender Foundation.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): Campbell Barton <ideasman42@gmail.com>
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef BKE_POINTCACHE_H
31 #define BKE_POINTCACHE_H
32
33 /** \file BKE_pointcache.h
34  *  \ingroup bke
35  */
36
37 #include "DNA_ID.h"
38 #include "DNA_object_force.h"
39 #include "DNA_boid_types.h"
40 #include <stdio.h> /* for FILE */
41
42 /* Point cache clearing option, for BKE_ptcache_id_clear, before
43  * and after are non inclusive (they wont remove the cfra) */
44 #define PTCACHE_CLEAR_ALL               0
45 #define PTCACHE_CLEAR_FRAME             1
46 #define PTCACHE_CLEAR_BEFORE    2
47 #define PTCACHE_CLEAR_AFTER             3
48
49 /* Point cache reset options */
50 #define PTCACHE_RESET_DEPSGRAPH         0
51 #define PTCACHE_RESET_BAKED                     1
52 #define PTCACHE_RESET_OUTDATED          2
53 /* #define PTCACHE_RESET_FREE                   3 */ /*UNUSED*/
54
55 /* Add the blendfile name after blendcache_ */
56 #define PTCACHE_EXT ".bphys"
57 #define PTCACHE_PATH "blendcache_"
58
59 /* File open options, for BKE_ptcache_file_open */
60 #define PTCACHE_FILE_READ       0
61 #define PTCACHE_FILE_WRITE      1
62 #define PTCACHE_FILE_UPDATE     2
63
64 /* PTCacheID types */
65 #define PTCACHE_TYPE_SOFTBODY                   0
66 #define PTCACHE_TYPE_PARTICLES                  1
67 #define PTCACHE_TYPE_CLOTH                              2
68 #define PTCACHE_TYPE_SMOKE_DOMAIN               3
69 #define PTCACHE_TYPE_SMOKE_HIGHRES              4
70
71 /* high bits reserved for flags that need to be stored in file */
72 #define PTCACHE_TYPEFLAG_COMPRESS               (1<<16)
73 #define PTCACHE_TYPEFLAG_EXTRADATA              (1<<17)
74
75 #define PTCACHE_TYPEFLAG_TYPEMASK                       0x0000FFFF
76 #define PTCACHE_TYPEFLAG_FLAGMASK                       0xFFFF0000
77
78 /* PTCache read return code */
79 #define PTCACHE_READ_EXACT                              1
80 #define PTCACHE_READ_INTERPOLATED               2
81 #define PTCACHE_READ_OLD                                3
82
83 /* Structs */
84 struct ClothModifierData;
85 struct ListBase;
86 struct Main;
87 struct Object;
88 struct ParticleKey;
89 struct ParticleSystem;
90 struct PointCache;
91 struct Scene;
92 struct SmokeModifierData;
93 struct SoftBody;
94
95 /* temp structure for read/write */
96 typedef struct PTCacheData {
97         unsigned int index;
98         float loc[3];
99         float vel[3];
100         float rot[4];
101         float ave[3];
102         float size;
103         float times[3];
104         struct BoidData boids;
105 } PTCacheData;
106
107 typedef struct PTCacheFile {
108         FILE *fp;
109
110         int frame, old_format;
111         unsigned int totpoint, type;
112         unsigned int data_types, flag;
113
114         struct PTCacheData data;
115         void *cur[BPHYS_TOT_DATA];
116 } PTCacheFile;
117
118 #define PTCACHE_VEL_PER_SEC             1
119
120 typedef struct PTCacheID {
121         struct PTCacheID *next, *prev;
122
123         struct Scene *scene;
124         struct Object *ob;
125         void *calldata;
126         unsigned int type;
127         unsigned int stack_index;
128         unsigned int flag;
129
130         /* flags defined in DNA_object_force.h */
131         unsigned int data_types, info_types;
132
133         /* copies point data to cache data */
134         int (*write_point)(int index, void *calldata, void **data, int cfra);
135         /* copies cache cata to point data */
136         void (*read_point)(int index, void *calldata, void **data, float cfra, float *old_data);
137         /* interpolated between previously read point data and cache data */
138         void (*interpolate_point)(int index, void *calldata, void **data, float cfra, float cfra1, float cfra2, float *old_data);
139
140         /* copies point data to cache data */
141         int (*write_stream)(PTCacheFile *pf, void *calldata);
142         /* copies cache cata to point data */
143         void (*read_stream)(PTCacheFile *pf, void *calldata);
144
145         /* copies custom extradata to cache data */
146         void (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
147         /* copies custom extradata to cache data */
148         void (*read_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra);
149         /* copies custom extradata to cache data */
150         void (*interpolate_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra, float cfra1, float cfra2);
151
152         /* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */
153         int (*totpoint)(void *calldata, int cfra);
154         /* number of points written for current cache frame */
155         int (*totwrite)(void *calldata, int cfra);
156
157         int (*write_header)(PTCacheFile *pf);
158         int (*read_header)(PTCacheFile *pf);
159
160         struct PointCache *cache;
161         /* used for setting the current cache from ptcaches list */
162         struct PointCache **cache_ptr;
163         struct ListBase *ptcaches;
164 } PTCacheID;
165
166 typedef struct PTCacheBaker {
167         struct Main *main;
168         struct Scene *scene;
169         int bake;
170         int render;
171         int anim_init;
172         int quick_step;
173         struct PTCacheID *pid;
174         int (*break_test)(void *data);
175         void *break_data;
176         void (*progressbar)(void *data, int num);
177         void (*progressend)(void *data);
178         void *progresscontext;
179 } PTCacheBaker;
180
181 /* PTCacheEditKey->flag */
182 #define PEK_SELECT              1
183 #define PEK_TAG                 2
184 #define PEK_HIDE                4
185 #define PEK_USE_WCO             8
186
187 typedef struct PTCacheEditKey{
188         float *co;
189         float *vel;
190         float *rot;
191         float *time;
192
193         float world_co[3];
194         float ftime;
195         float length;
196         short flag;
197 } PTCacheEditKey;
198
199 /* PTCacheEditPoint->flag */
200 #define PEP_TAG                         1
201 #define PEP_EDIT_RECALC         2
202 #define PEP_TRANSFORM           4
203 #define PEP_HIDE                        8
204
205 typedef struct PTCacheEditPoint {
206         struct PTCacheEditKey *keys;
207         int totkey;
208         short flag;
209 } PTCacheEditPoint;
210
211 typedef struct PTCacheUndo {
212         struct PTCacheUndo *next, *prev;
213         struct PTCacheEditPoint *points;
214
215         /* particles stuff */
216         struct ParticleData *particles;
217         struct KDTree *emitter_field;
218         float *emitter_cosnos;
219         int psys_flag;
220
221         /* cache stuff */
222         struct ListBase mem_cache;
223
224         int totpoint;
225         char name[64];
226 } PTCacheUndo;
227
228 typedef struct PTCacheEdit {
229         ListBase undo;
230         struct PTCacheUndo *curundo;
231         PTCacheEditPoint *points;
232
233         struct PTCacheID pid;
234
235         /* particles stuff */
236         struct ParticleSystem *psys;
237         struct ParticleData *particles;
238         struct KDTree *emitter_field;
239         float *emitter_cosnos; /* localspace face centers and normals (average of its verts), from the derived mesh */
240         int *mirror_cache;
241
242         struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
243         ListBase pathcachebufs;
244
245         int totpoint, totframes, totcached, edited;
246
247         unsigned char sel_col[3];
248         unsigned char nosel_col[3];
249 } PTCacheEdit;
250
251 /* Particle functions */
252 void BKE_ptcache_make_particle_key(struct ParticleKey *key, int index, void **data, float time);
253
254 /**************** Creating ID's ****************************/
255 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
256 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
257 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
258 void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
259
260 void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
261
262 /***************** Global funcs ****************************/
263 void BKE_ptcache_remove(void);
264
265 /************ ID specific functions ************************/
266 void    BKE_ptcache_id_clear(PTCacheID *id, int mode, unsigned int cfra);
267 int             BKE_ptcache_id_exist(PTCacheID *id, int cfra);
268 int             BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
269 void    BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
270 int             BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
271
272 void BKE_ptcache_update_info(PTCacheID *pid);
273
274 /*********** General cache reading/writing ******************/
275
276 /* Size of cache data type. */
277 int             BKE_ptcache_data_size(int data_type);
278
279 /* Is point with indes in memory cache */
280 int BKE_ptcache_mem_index_find(struct PTCacheMem *pm, unsigned int index);
281
282 /* Memory cache read/write helpers. */
283 void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
284 void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
285 int  BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
286
287 /* Copy a specific data type from cache data to point data. */
288 void    BKE_ptcache_data_get(void **data, int type, int index, void *to);
289
290 /* Copy a specific data type from point data to cache data. */
291 void    BKE_ptcache_data_set(void **data, int type, void *from);
292
293 /* Main cache reading call. */
294 int             BKE_ptcache_read(PTCacheID *pid, float cfra);
295
296 /* Main cache writing call. */
297 int             BKE_ptcache_write(PTCacheID *pid, unsigned int cfra);
298
299 /****************** Continue physics ***************/
300 void BKE_ptcache_set_continue_physics(struct Main *bmain, struct Scene *scene, int enable);
301 int BKE_ptcache_get_continue_physics(void);
302
303 /******************* Allocate & free ***************/
304 struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
305 void BKE_ptcache_free_mem(struct ListBase *mem_cache);
306 void BKE_ptcache_free(struct PointCache *cache);
307 void BKE_ptcache_free_list(struct ListBase *ptcaches);
308 struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct ListBase *ptcaches_old);
309
310 /********************** Baking *********************/
311
312 /* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
313 void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
314
315 /* Bake cache or simulate to current frame with settings defined in the baker. */
316 void BKE_ptcache_bake(struct PTCacheBaker* baker);
317
318 /* Convert disk cache to memory cache. */
319 void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
320
321 /* Convert memory cache to disk cache. */
322 void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
323
324 /* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
325 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
326
327 /* Rename all disk cache files with a new name. Doesn't touch the actual content of the files. */
328 void BKE_ptcache_disk_cache_rename(struct PTCacheID *pid, char *from, char *to);
329
330 /* Loads simulation from external (disk) cache files. */
331 void BKE_ptcache_load_external(struct PTCacheID *pid);
332
333 /* Set correct flags after successful simulation step */
334 void BKE_ptcache_validate(struct PointCache *cache, int framenr);
335
336 /* Set correct flags after unsuccessful simulation step */
337 void BKE_ptcache_invalidate(struct PointCache *cache);
338
339 #endif