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