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