CTX_wm_reports needs to return NULL when wm.manager is NULL (this happens in backgrou...
[blender.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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
59 /* PTCacheID types */
60 #define PTCACHE_TYPE_SOFTBODY                   0
61 #define PTCACHE_TYPE_PARTICLES                  1
62 #define PTCACHE_TYPE_CLOTH                              2
63 #define PTCACHE_TYPE_SMOKE_DOMAIN_LOW   3
64 #define PTCACHE_TYPE_SMOKE_DOMAIN_HIGH  4
65
66 /* PTCache read return code */
67 #define PTCACHE_READ_EXACT                              1
68 #define PTCACHE_READ_INTERPOLATED               2
69 #define PTCACHE_READ_OLD                                3
70
71 /* Structs */
72 struct Object;
73 struct Scene;
74 struct SoftBody;
75 struct ParticleSystem;
76 struct ParticleKey;
77 struct ClothModifierData;
78 struct PointCache;
79 struct ListBase;
80
81 /* temp structure for read/write */
82 typedef struct PTCacheData {
83         int index;
84         float loc[3];
85         float vel[3];
86         float rot[4];
87         float ave[3];
88         float size;
89         float times[3];
90         struct BoidData boids;
91 } PTCacheData;
92
93 typedef struct PTCacheFile {
94         FILE *fp;
95
96         int totpoint, type;
97         unsigned int data_types;
98
99         struct PTCacheData data;
100         void *cur[BPHYS_TOT_DATA];
101 } PTCacheFile;
102
103 typedef struct PTCacheID {
104         struct PTCacheID *next, *prev;
105
106         struct Scene *scene;
107         struct Object *ob;
108         void *calldata;
109         int type;
110         int stack_index;
111
112         /* flags defined in DNA_object_force.h */
113         unsigned int data_types, info_types;
114
115         /* copies point data to cache data */
116         int (*write_elem)(int index, void *calldata, void **data);
117         /* copies point data to cache data */
118         int (*write_stream)(PTCacheFile *pf, void *calldata);
119         /* copies cache cata to point data */
120         void (*read_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float *old_data);
121         /* copies cache cata to point data */
122         void (*read_stream)(PTCacheFile *pf, void *calldata);
123         /* interpolated between previously read point data and cache data */
124         void (*interpolate_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data);
125
126         /* total number of simulated points */
127         int (*totpoint)(void *calldata);
128         /* number of points written for current cache frame (currently not used) */
129         int (*totwrite)(void *calldata);
130
131         int (*write_header)(PTCacheFile *pf);
132         int (*read_header)(PTCacheFile *pf);
133
134         struct PointCache *cache;
135         /* used for setting the current cache from ptcaches list */
136         struct PointCache **cache_ptr;
137         struct ListBase *ptcaches;
138 } PTCacheID;
139
140 typedef struct PTCacheBaker {
141         struct Scene *scene;
142         int bake;
143         int render;
144         int anim_init;
145         int quick_step;
146         struct PTCacheID *pid;
147         int (*break_test)(void *data);
148         void *break_data;
149         void (*progressbar)(void *data, int num);
150         void *progresscontext;
151 } PTCacheBaker;
152
153 /* Particle functions */
154 void BKE_ptcache_make_particle_key(struct ParticleKey *key, int index, void **data, float time);
155
156 /**************** Creating ID's ****************************/
157 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
158 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
159 void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
160 void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd, int num);
161
162 void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob);
163
164 /***************** Global funcs ****************************/
165 void BKE_ptcache_remove(void);
166
167 /************ ID specific functions ************************/
168 void    BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra);
169 int             BKE_ptcache_id_exist(PTCacheID *id, int cfra);
170 int             BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
171 void    BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
172 int             BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
173
174 void BKE_ptcache_update_info(PTCacheID *pid);
175
176 /*********** General cache reading/writing ******************/
177
178 /* Size of cache data type. */
179 int             BKE_ptcache_data_size(int data_type);
180
181 /* Copy a specific data type from cache data to point data. */
182 void    BKE_ptcache_data_get(void **data, int type, int index, void *to);
183
184 /* Copy a specific data type from point data to cache data. */
185 void    BKE_ptcache_data_set(void **data, int type, void *from);
186
187 /* Main cache reading call. */
188 int             BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec);
189
190 /* Main cache writing call. */
191 int             BKE_ptcache_write_cache(PTCacheID *pid, int cfra);
192
193 /****************** Continue physics ***************/
194 void BKE_ptcache_set_continue_physics(struct Scene *scene, int enable);
195 int BKE_ptcache_get_continue_physics(void);
196
197 /******************* Allocate & free ***************/
198 struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
199 void BKE_ptache_free_mem(struct PointCache *cache);
200 void BKE_ptcache_free(struct PointCache *cache);
201 void BKE_ptcache_free_list(struct ListBase *ptcaches);
202 struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct ListBase *ptcaches_old);
203
204 /********************** Baking *********************/
205
206 /* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
207 void BKE_ptcache_quick_cache_all(struct Scene *scene);
208
209 /* Bake cache or simulate to current frame with settings defined in the baker. */
210 void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
211
212 /* Convert disk cache to memory cache. */
213 void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
214
215 /* Convert memory cache to disk cache. */
216 void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
217
218 /* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
219 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
220
221 /* Loads simulation from external (disk) cache files. */
222 void BKE_ptcache_load_external(struct PTCacheID *pid);
223
224 #endif