Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_smoke_types.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) 2006 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file \ingroup DNA
21  */
22
23 #ifndef __DNA_SMOKE_TYPES_H__
24 #define __DNA_SMOKE_TYPES_H__
25
26 /* flags */
27 enum {
28         MOD_SMOKE_HIGHRES = (1 << 1),  /* enable high resolution */
29         MOD_SMOKE_DISSOLVE = (1 << 2),  /* let smoke dissolve */
30         MOD_SMOKE_DISSOLVE_LOG = (1 << 3),  /* using 1/x for dissolve */
31
32 #ifdef DNA_DEPRECATED
33         MOD_SMOKE_HIGH_SMOOTH = (1 << 5),  /* -- Deprecated -- */
34 #endif
35         MOD_SMOKE_FILE_LOAD = (1 << 6),  /* flag for file load */
36         MOD_SMOKE_ADAPTIVE_DOMAIN = (1 << 7),
37 };
38
39 /* noise */
40 #define MOD_SMOKE_NOISEWAVE (1<<0)
41 #define MOD_SMOKE_NOISEFFT (1<<1)
42 #define MOD_SMOKE_NOISECURL (1<<2)
43 /* viewsettings */
44 #define MOD_SMOKE_VIEW_SHOWBIG (1<<0)
45
46 /* slice method */
47 enum {
48         MOD_SMOKE_SLICE_VIEW_ALIGNED = 0,
49         MOD_SMOKE_SLICE_AXIS_ALIGNED = 1,
50 };
51
52 /* axis aligned method */
53 enum {
54         AXIS_SLICE_FULL   = 0,
55         AXIS_SLICE_SINGLE = 1,
56 };
57
58 /* single slice direction */
59 enum {
60         SLICE_AXIS_AUTO = 0,
61         SLICE_AXIS_X    = 1,
62         SLICE_AXIS_Y    = 2,
63         SLICE_AXIS_Z    = 3,
64 };
65
66 /* axis aligned method */
67 enum {
68         VOLUME_INTERP_LINEAR   = 0,
69         VOLUME_INTERP_CUBIC    = 1,
70 };
71
72 enum {
73         VECTOR_DRAW_NEEDLE     = 0,
74         VECTOR_DRAW_STREAMLINE = 1,
75 };
76
77 enum {
78         FLUID_FIELD_DENSITY    = 0,
79         FLUID_FIELD_HEAT       = 1,
80         FLUID_FIELD_FUEL       = 2,
81         FLUID_FIELD_REACT      = 3,
82         FLUID_FIELD_FLAME      = 4,
83         FLUID_FIELD_VELOCITY_X = 5,
84         FLUID_FIELD_VELOCITY_Y = 6,
85         FLUID_FIELD_VELOCITY_Z = 7,
86         FLUID_FIELD_COLOR_R    = 8,
87         FLUID_FIELD_COLOR_G    = 9,
88         FLUID_FIELD_COLOR_B    = 10,
89         FLUID_FIELD_FORCE_X    = 11,
90         FLUID_FIELD_FORCE_Y    = 12,
91         FLUID_FIELD_FORCE_Z    = 13,
92 };
93
94 /* cache compression */
95 #define SM_CACHE_LIGHT          0
96 #define SM_CACHE_HEAVY          1
97
98 /* domain border collision */
99 #define SM_BORDER_OPEN          0
100 #define SM_BORDER_VERTICAL      1
101 #define SM_BORDER_CLOSED        2
102
103 /* collision types */
104 #define SM_COLL_STATIC          0
105 #define SM_COLL_RIGID           1
106 #define SM_COLL_ANIMATED        2
107
108 /* high resolution sampling types */
109 #define SM_HRES_NEAREST         0
110 #define SM_HRES_LINEAR          1
111 #define SM_HRES_FULLSAMPLE      2
112
113 /* smoke data fields (active_fields) */
114 #define SM_ACTIVE_HEAT          (1<<0)
115 #define SM_ACTIVE_FIRE          (1<<1)
116 #define SM_ACTIVE_COLORS        (1<<2)
117 #define SM_ACTIVE_COLOR_SET     (1<<3)
118
119 enum {
120         VDB_COMPRESSION_BLOSC = 0,
121         VDB_COMPRESSION_ZIP   = 1,
122         VDB_COMPRESSION_NONE  = 2,
123 };
124
125 typedef struct SmokeDomainSettings {
126         /** For fast RNA access. */
127         struct SmokeModifierData *smd;
128         struct FLUID_3D *fluid;
129         void *fluid_mutex;
130         struct Collection *fluid_group;
131         struct Collection *eff_group; // UNUSED
132         struct Collection *coll_group; // collision objects group
133         struct WTURBULENCE *wt; // WTURBULENCE object, if active
134         struct GPUTexture *tex;
135         struct GPUTexture *tex_wt;
136         struct GPUTexture *tex_shadow;
137         struct GPUTexture *tex_flame;
138         struct GPUTexture *tex_flame_coba;
139         struct GPUTexture *tex_coba;
140         struct GPUTexture *tex_field;
141         struct GPUTexture *tex_velocity_x;
142         struct GPUTexture *tex_velocity_y;
143         struct GPUTexture *tex_velocity_z;
144         float *shadow;
145
146         /* simulation data */
147         /** Start point of BB in local space (includes sub-cell shift for adaptive domain.)*/
148         float p0[3];
149         /** End point of BB in local space. */
150         float p1[3];
151         /** Difference from object center to grid start point. */
152         float dp0[3];
153         /** Size of simulation cell in local space. */
154         float cell_size[3];
155         /** Global size of domain axises. */
156         float global_size[3];
157         float prev_loc[3];
158         /** Current domain shift in simulation cells. */
159         int shift[3];
160         /** Exact domain shift. */
161         float shift_f[3];
162         /**
163          * How much object has shifted since previous smoke frame
164          * (used to "lock" domain while drawing).
165          */
166         float obj_shift_f[3];
167         /** Domain object imat. */
168         float imat[4][4];
169         /** Domain obmat. */
170         float obmat[4][4];
171         /** Low res fluid matrix. */
172         float fluidmat[4][4];
173         /** High res fluid matrix. */
174         float fluidmat_wt[4][4];
175
176         /** Initial "non-adapted" resolution. */
177         int base_res[3];
178         /** Cell min. */
179         int res_min[3];
180         /** Cell max. */
181         int res_max[3];
182         /** Data resolution (res_max-res_min). */
183         int res[3];
184         int total_cells;
185         /** 1.0f / res. */
186         float dx;
187         /** Largest domain size. */
188         float scale;
189
190         /* user settings */
191         int adapt_margin;
192         int adapt_res;
193         float adapt_threshold;
194
195         float alpha;
196         float beta;
197         /** Wavelet amplification. */
198         int amplify;
199         /** Longest axis on the BB gets this resolution assigned. */
200         int maxres;
201         /** Show up-res or low res, etc. */
202         int flags;
203         int viewsettings;
204         /** Noise type: wave, curl, anisotropic. */
205         short noise;
206         short diss_percent;
207         /** In frames. */
208         int diss_speed;
209         float strength;
210         int res_wt[3];
211         float dx_wt;
212         /* point cache options */
213         int cache_comp;
214         int cache_high_comp;
215         /* OpenVDB cache options */
216         int openvdb_comp;
217         char cache_file_format;
218         char data_depth;
219         char pad[2];
220
221         /* Smoke uses only one cache from now on (index [0]),
222          * but keeping the array for now for reading old files. */
223         /** Definition is in DNA_object_force_types.h. */
224         struct PointCache *point_cache[2];
225         struct ListBase ptcaches[2];
226         struct EffectorWeights *effector_weights;
227         /** How domain border collisions are handled. */
228         int border_collisions;
229         float time_scale;
230         float vorticity;
231         int active_fields;
232         /** Monitor color situation of simulation. */
233         float active_color[3];
234         int highres_sampling;
235
236         /* flame parameters */
237         float burning_rate, flame_smoke, flame_vorticity;
238         float flame_ignition, flame_max_temp;
239         float flame_smoke_color[3];
240
241         /* Display settings */
242         char slice_method, axis_slice_method;
243         char slice_axis, draw_velocity;
244         float slice_per_voxel;
245         float slice_depth;
246         float display_thickness;
247
248         struct ColorBand *coba;
249         float vector_scale;
250         char vector_draw_type;
251         char use_coba;
252         /** Simulation field used for the color mapping. */
253         char coba_field;
254         char interp_method;
255
256         float clipping;
257         float pad3;
258 } SmokeDomainSettings;
259
260
261 /* inflow / outflow */
262
263 /* type */
264 #define MOD_SMOKE_FLOW_TYPE_SMOKE 0
265 #define MOD_SMOKE_FLOW_TYPE_FIRE 1
266 #define MOD_SMOKE_FLOW_TYPE_OUTFLOW 2
267 #define MOD_SMOKE_FLOW_TYPE_SMOKEFIRE 3
268
269 /* flow source */
270 #define MOD_SMOKE_FLOW_SOURCE_PARTICLES 0
271 #define MOD_SMOKE_FLOW_SOURCE_MESH 1
272
273 /* flow texture type */
274 #define MOD_SMOKE_FLOW_TEXTURE_MAP_AUTO 0
275 #define MOD_SMOKE_FLOW_TEXTURE_MAP_UV 1
276
277 /* flags */
278 enum {
279         /**old style emission*/
280         MOD_SMOKE_FLOW_ABSOLUTE = (1 << 1),
281         /** passes particles speed to the smoke */
282         MOD_SMOKE_FLOW_INITVELOCITY = (1 << 2),
283         /** use texture to control emission speed */
284         MOD_SMOKE_FLOW_TEXTUREEMIT = (1 << 3),
285         /** use specific size for particles instead of closest cell */
286         MOD_SMOKE_FLOW_USE_PART_SIZE = (1 << 4),
287 };
288
289 typedef struct SmokeFlowSettings {
290         /** For fast RNA access. */
291         struct SmokeModifierData *smd;
292         struct Mesh *mesh;
293         struct ParticleSystem *psys;
294         struct Tex *noise_texture;
295
296         /* initial velocity */
297         /** Previous vertex positions in domain space. */
298         float *verts_old;
299         int numverts;
300         float vel_multi; // Multiplier for inherited velocity
301         float vel_normal;
302         float vel_random;
303         /* emission */
304         float density;
305         float color[3];
306         float fuel_amount;
307         /** Delta temperature (temp - ambient temp). */
308         float temp;
309         /** Density emitted within mesh volume. */
310         float volume_density;
311         /** Maximum emission distance from mesh surface. */
312         float surface_distance;
313         float particle_size;
314         int subframes;
315         /* texture control */
316         float texture_size;
317         float texture_offset;
318         int pad;
319         /** MAX_CUSTOMDATA_LAYER_NAME. */
320         char uvlayer_name[64];
321         short vgroup_density;
322
323         /** Smoke, flames, both, outflow. */
324         short type;
325         short source;
326         short texture_type;
327         /** Absolute emission et.c*/
328         int flags;
329 } SmokeFlowSettings;
330
331
332 // struct BVHTreeFromMesh *bvh;
333 // float mat[4][4];
334 // float mat_old[4][4];
335
336 /* collision objects (filled with smoke) */
337 typedef struct SmokeCollSettings {
338         /** For fast RNA access. */
339         struct SmokeModifierData *smd;
340         struct Mesh *mesh;
341         float *verts_old;
342         int numverts;
343         short type; // static = 0, rigid = 1, dynamic = 2
344         short pad;
345 } SmokeCollSettings;
346
347 #endif