Cleanup: code-style, duplicate header
[blender-staging.git] / source / blender / makesrna / intern / rna_smoke.c
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  * Contributor(s): Daniel Genrich
19  *                 Blender Foundation
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 /** \file blender/makesrna/intern/rna_smoke.c
25  *  \ingroup RNA
26  */
27
28
29 #include <stdlib.h>
30 #include <limits.h>
31
32 #include "RNA_define.h"
33 #include "RNA_enum_types.h"
34
35 #include "rna_internal.h"
36
37 #include "BKE_modifier.h"
38 #include "BKE_smoke.h"
39 #include "BKE_pointcache.h"
40
41 #include "BLI_threads.h"
42
43 #include "DNA_modifier_types.h"
44 #include "DNA_object_force.h"
45 #include "DNA_object_types.h"
46 #include "DNA_scene_types.h"
47 #include "DNA_smoke_types.h"
48
49 #include "WM_types.h"
50
51
52 #ifdef RNA_RUNTIME
53
54 #include "BKE_context.h"
55 #include "BKE_depsgraph.h"
56 #include "BKE_particle.h"
57 #include "BKE_texture.h"
58
59 #include "smoke_API.h"
60
61
62 static void rna_Smoke_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
63 {
64         DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
65 }
66
67 static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
68 {
69         rna_Smoke_update(bmain, scene, ptr);
70         DAG_relations_tag_update(bmain);
71 }
72
73 static void rna_Smoke_resetCache(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
74 {
75         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
76         if (settings->smd && settings->smd->domain)
77                 settings->point_cache[0]->flag |= PTCACHE_OUTDATED;
78         DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
79 }
80
81 static void rna_Smoke_cachetype_set(struct PointerRNA *ptr, int value)
82 {
83         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
84         Object *ob = (Object *)ptr->id.data;
85
86         if (value != settings->cache_file_format) {
87                 /* Clear old caches. */
88                 PTCacheID id;
89                 BKE_ptcache_id_from_smoke(&id, ob, settings->smd);
90                 BKE_ptcache_id_clear(&id, PTCACHE_CLEAR_ALL, 0);
91
92                 settings->cache_file_format = value;
93         }
94 }
95
96 static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
97 {
98         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
99
100         smokeModifier_reset(settings->smd);
101         rna_Smoke_resetCache(bmain, scene, ptr);
102
103         rna_Smoke_update(bmain, scene, ptr);
104 }
105
106 static void rna_Smoke_reset_dependency(Main *bmain, Scene *scene, PointerRNA *ptr)
107 {
108         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
109
110         smokeModifier_reset(settings->smd);
111
112         if (settings->smd && settings->smd->domain)
113                 settings->smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
114
115         rna_Smoke_dependency_update(bmain, scene, ptr);
116 }
117
118 static char *rna_SmokeDomainSettings_path(PointerRNA *ptr)
119 {
120         SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
121         ModifierData *md = (ModifierData *)settings->smd;
122         char name_esc[sizeof(md->name) * 2];
123
124         BLI_strescape(name_esc, md->name, sizeof(name_esc));
125         return BLI_sprintfN("modifiers[\"%s\"].domain_settings", name_esc);
126 }
127
128 static char *rna_SmokeFlowSettings_path(PointerRNA *ptr)
129 {
130         SmokeFlowSettings *settings = (SmokeFlowSettings *)ptr->data;
131         ModifierData *md = (ModifierData *)settings->smd;
132         char name_esc[sizeof(md->name) * 2];
133
134         BLI_strescape(name_esc, md->name, sizeof(name_esc));
135         return BLI_sprintfN("modifiers[\"%s\"].flow_settings", name_esc);
136 }
137
138 static char *rna_SmokeCollSettings_path(PointerRNA *ptr)
139 {
140         SmokeCollSettings *settings = (SmokeCollSettings *)ptr->data;
141         ModifierData *md = (ModifierData *)settings->smd;
142         char name_esc[sizeof(md->name) * 2];
143
144         BLI_strescape(name_esc, md->name, sizeof(name_esc));
145         return BLI_sprintfN("modifiers[\"%s\"].coll_settings", name_esc);
146 }
147
148 static int rna_SmokeModifier_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
149 {
150 #ifdef WITH_SMOKE
151         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
152         float *density = NULL;
153         int size = 0;
154
155         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt) {
156                 /* high resolution smoke */
157                 int res[3];
158
159                 smoke_turbulence_get_res(sds->wt, res);
160                 size = res[0] * res[1] * res[2];
161
162                 density = smoke_turbulence_get_density(sds->wt);
163         }
164         else if (sds->fluid) {
165                 /* regular resolution */
166                 size = sds->res[0] * sds->res[1] * sds->res[2];
167                 density = smoke_get_density(sds->fluid);
168         }
169
170         length[0] = (density) ? size : 0;
171 #else
172         (void)ptr;
173         length[0] = 0;
174 #endif
175         return length[0];
176 }
177
178 static int rna_SmokeModifier_color_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
179 {
180         rna_SmokeModifier_grid_get_length(ptr, length);
181
182         length[0] *= 4;
183         return length[0];
184 }
185
186 static int rna_SmokeModifier_velocity_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
187 {
188 #ifdef WITH_SMOKE
189         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
190         float *vx = NULL;
191         float *vy = NULL;
192         float *vz = NULL;
193         int size = 0;
194
195         /* Velocity data is always low-resolution. */
196         if (sds->fluid) {
197                 size = 3 * sds->res[0] * sds->res[1] * sds->res[2];
198                 vx = smoke_get_velocity_x(sds->fluid);
199                 vy = smoke_get_velocity_y(sds->fluid);
200                 vz = smoke_get_velocity_z(sds->fluid);
201         }
202
203         length[0] = (vx && vy && vz) ? size : 0;
204 #else
205         (void)ptr;
206         length[0] = 0;
207 #endif
208         return length[0];
209 }
210
211 static int rna_SmokeModifier_heat_grid_get_length(
212         PointerRNA *ptr,
213         int length[RNA_MAX_ARRAY_DIMENSION])
214 {
215 #ifdef WITH_SMOKE
216         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
217         float *heat = NULL;
218         int size = 0;
219
220         /* Heat data is always low-resolution. */
221         if (sds->fluid) {
222                 size = sds->res[0] * sds->res[1] * sds->res[2];
223                 heat = smoke_get_heat(sds->fluid);
224         }
225
226         length[0] = (heat) ? size : 0;
227 #else
228         (void)ptr;
229         length[0] = 0;
230 #endif
231         return length[0];
232 }
233
234 static void rna_SmokeModifier_density_grid_get(PointerRNA *ptr, float *values)
235 {
236 #ifdef WITH_SMOKE
237         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
238         int length[RNA_MAX_ARRAY_DIMENSION];
239         int size = rna_SmokeModifier_grid_get_length(ptr, length);
240         float *density;
241
242         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
243         
244         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt)
245                 density = smoke_turbulence_get_density(sds->wt);
246         else
247                 density = smoke_get_density(sds->fluid);
248
249         memcpy(values, density, size * sizeof(float));
250
251         BLI_rw_mutex_unlock(sds->fluid_mutex);
252 #else
253         UNUSED_VARS(ptr, values);
254 #endif
255 }
256
257 static void rna_SmokeModifier_velocity_grid_get(PointerRNA *ptr, float *values)
258 {
259 #ifdef WITH_SMOKE
260         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
261         int length[RNA_MAX_ARRAY_DIMENSION];
262         int size = rna_SmokeModifier_velocity_grid_get_length(ptr, length);
263         float *vx, *vy, *vz;
264         int i;
265
266         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
267
268         vx = smoke_get_velocity_x(sds->fluid);
269         vy = smoke_get_velocity_y(sds->fluid);
270         vz = smoke_get_velocity_z(sds->fluid);
271
272         for (i = 0; i < size; i += 3) {
273                 *(values++) = *(vx++);
274                 *(values++) = *(vy++);
275                 *(values++) = *(vz++);
276         }
277
278         BLI_rw_mutex_unlock(sds->fluid_mutex);
279 #else
280         UNUSED_VARS(ptr, values);
281 #endif
282 }
283
284 static void rna_SmokeModifier_color_grid_get(PointerRNA *ptr, float *values)
285 {
286 #ifdef WITH_SMOKE
287         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
288
289         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
290
291         if (sds->flags & MOD_SMOKE_HIGHRES) {
292                 if (smoke_turbulence_has_colors(sds->wt))
293                         smoke_turbulence_get_rgba(sds->wt, values, 0);
294                 else
295                         smoke_turbulence_get_rgba_from_density(sds->wt, sds->active_color, values, 0);
296         }
297         else {
298                 if (smoke_has_colors(sds->fluid))
299                         smoke_get_rgba(sds->fluid, values, 0);
300                 else
301                         smoke_get_rgba_from_density(sds->fluid, sds->active_color, values, 0);
302         }
303
304         BLI_rw_mutex_unlock(sds->fluid_mutex);
305 #else
306         UNUSED_VARS(ptr, values);
307 #endif
308 }
309
310 static void rna_SmokeModifier_flame_grid_get(PointerRNA *ptr, float *values)
311 {
312 #ifdef WITH_SMOKE
313         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
314         int length[RNA_MAX_ARRAY_DIMENSION];
315         int size = rna_SmokeModifier_grid_get_length(ptr, length);
316         float *flame;
317
318         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
319         
320         if (sds->flags & MOD_SMOKE_HIGHRES && sds->wt)
321                 flame = smoke_turbulence_get_flame(sds->wt);
322         else
323                 flame = smoke_get_flame(sds->fluid);
324         
325         if (flame)
326                 memcpy(values, flame, size * sizeof(float));
327         else
328                 memset(values, 0, size * sizeof(float));
329
330         BLI_rw_mutex_unlock(sds->fluid_mutex);
331 #else
332         UNUSED_VARS(ptr, values);
333 #endif
334 }
335
336 static void rna_SmokeModifier_heat_grid_get(PointerRNA *ptr, float *values)
337 {
338 #ifdef WITH_SMOKE
339         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
340         int length[RNA_MAX_ARRAY_DIMENSION];
341         int size = rna_SmokeModifier_heat_grid_get_length(ptr, length);
342         float *heat;
343
344         BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
345
346         heat = smoke_get_heat(sds->fluid);
347
348         if (heat != NULL) {
349                 /* scale heat values from -2.0-2.0 to -1.0-1.0. */
350                 for (int i = 0; i < size; i++) {
351                         values[i] = heat[i] * 0.5f;
352                 }
353         }
354         else {
355                 memset(values, 0, size * sizeof(float));
356         }
357
358         BLI_rw_mutex_unlock(sds->fluid_mutex);
359 #else
360         UNUSED_VARS(ptr, values);
361 #endif
362 }
363
364 static void rna_SmokeFlow_density_vgroup_get(PointerRNA *ptr, char *value)
365 {
366         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
367         rna_object_vgroup_name_index_get(ptr, value, flow->vgroup_density);
368 }
369
370 static int rna_SmokeFlow_density_vgroup_length(PointerRNA *ptr)
371 {
372         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
373         return rna_object_vgroup_name_index_length(ptr, flow->vgroup_density);
374 }
375
376 static void rna_SmokeFlow_density_vgroup_set(PointerRNA *ptr, const char *value)
377 {
378         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
379         rna_object_vgroup_name_index_set(ptr, value, &flow->vgroup_density);
380 }
381
382 static void rna_SmokeFlow_uvlayer_set(PointerRNA *ptr, const char *value)
383 {
384         SmokeFlowSettings *flow = (SmokeFlowSettings *)ptr->data;
385         rna_object_uvlayer_name_set(ptr, value, flow->uvlayer_name, sizeof(flow->uvlayer_name));
386 }
387
388 static void rna_Smoke_use_color_ramp_set(PointerRNA *ptr, int value)
389 {
390         SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
391
392         sds->use_coba = value;
393
394         if (value && sds->coba == NULL) {
395                 sds->coba = add_colorband(false);
396         }
397 }
398
399 #else
400
401 static void rna_def_smoke_domain_settings(BlenderRNA *brna)
402 {
403         StructRNA *srna;
404         PropertyRNA *prop;
405
406         static EnumPropertyItem prop_noise_type_items[] = {
407                 {MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""},
408 #ifdef WITH_FFTW3
409                 {MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""},
410 #endif
411                 /*  {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */
412                 {0, NULL, 0, NULL, NULL}
413         };
414
415         static EnumPropertyItem prop_compression_items[] = {
416                 { VDB_COMPRESSION_ZIP, "ZIP", 0, "Zip", "Effective but slow compression" },
417 #ifdef WITH_OPENVDB_BLOSC
418                 { VDB_COMPRESSION_BLOSC, "BLOSC", 0, "Blosc", "Multithreaded compression, similar in size and quality as 'Zip'" },
419 #endif
420                 { VDB_COMPRESSION_NONE, "NONE", 0, "None", "Do not use any compression" },
421                 { 0, NULL, 0, NULL, NULL }
422         };
423
424         static EnumPropertyItem smoke_cache_comp_items[] = {
425                 {SM_CACHE_LIGHT, "CACHELIGHT", 0, "Light", "Fast but not so effective compression"},
426                 {SM_CACHE_HEAVY, "CACHEHEAVY", 0, "Heavy", "Effective but slow compression"},
427                 {0, NULL, 0, NULL, NULL}
428         };
429
430         static EnumPropertyItem smoke_highres_sampling_items[] = {
431                 {SM_HRES_FULLSAMPLE, "FULLSAMPLE", 0, "Full Sample", ""},
432                 {SM_HRES_LINEAR, "LINEAR", 0, "Linear", ""},
433                 {SM_HRES_NEAREST, "NEAREST", 0, "Nearest", ""},
434                 {0, NULL, 0, NULL, NULL}
435         };
436
437         static EnumPropertyItem smoke_data_depth_items[] = {
438                 {16, "16", 0, "Float (Half)", "Half float (16 bit data)"},
439                 {0,  "32", 0, "Float (Full)", "Full float (32 bit data)"},  /* default */
440                 {0, NULL, 0, NULL, NULL},
441         };
442
443         static EnumPropertyItem smoke_domain_colli_items[] = {
444                 {SM_BORDER_OPEN, "BORDEROPEN", 0, "Open", "Smoke doesn't collide with any border"},
445                 {SM_BORDER_VERTICAL, "BORDERVERTICAL", 0, "Vertically Open",
446                  "Smoke doesn't collide with top and bottom sides"},
447                 {SM_BORDER_CLOSED, "BORDERCLOSED", 0, "Collide All", "Smoke collides with every side"},
448                 {0, NULL, 0, NULL, NULL}
449         };
450
451         static EnumPropertyItem cache_file_type_items[] = {
452                 {PTCACHE_FILE_PTCACHE, "POINTCACHE", 0, "Point Cache", "Blender specific point cache file format"},
453 #ifdef WITH_OPENVDB
454                 {PTCACHE_FILE_OPENVDB, "OPENVDB", 0, "OpenVDB", "OpenVDB file format"},
455 #endif
456                 {0, NULL, 0, NULL, NULL}
457         };
458
459         static EnumPropertyItem smoke_view_items[] = {
460             {MOD_SMOKE_SLICE_VIEW_ALIGNED, "VIEW_ALIGNED", 0, "View", "Slice volume parallel to the view plane"},
461             {MOD_SMOKE_SLICE_AXIS_ALIGNED, "AXIS_ALIGNED", 0, "Axis", "Slice volume parallel to the major axis"},
462             {0, NULL, 0, NULL, NULL}
463         };
464
465         static EnumPropertyItem axis_slice_method_items[] = {
466             {AXIS_SLICE_FULL, "FULL", 0, "Full", "Slice the whole domain object"},
467             {AXIS_SLICE_SINGLE, "SINGLE", 0, "Single", "Perform a single slice of the domain object"},
468             {0, NULL, 0, NULL, NULL}
469         };
470
471         static EnumPropertyItem axis_slice_position_items[] = {
472             {SLICE_AXIS_AUTO, "AUTO", 0, "Auto", "Adjust slice direction according to the view direction"},
473             {SLICE_AXIS_X, "X", 0, "X", "Slice along the X axis"},
474             {SLICE_AXIS_Y, "Y", 0, "Y", "Slice along the Y axis"},
475             {SLICE_AXIS_Z, "Z", 0, "Z", "Slice along the Z axis"},
476             {0, NULL, 0, NULL, NULL}
477         };
478
479         static EnumPropertyItem vector_draw_items[] = {
480             {VECTOR_DRAW_NEEDLE, "NEEDLE", 0, "Needle", "Draw vectors as needles"},
481             {VECTOR_DRAW_STREAMLINE, "STREAMLINE", 0, "Streamlines", "Draw vectors as streamlines"},
482             {0, NULL, 0, NULL, NULL}
483         };
484
485         srna = RNA_def_struct(brna, "SmokeDomainSettings", NULL);
486         RNA_def_struct_ui_text(srna, "Domain Settings", "Smoke domain settings");
487         RNA_def_struct_sdna(srna, "SmokeDomainSettings");
488         RNA_def_struct_path_func(srna, "rna_SmokeDomainSettings_path");
489
490         prop = RNA_def_property(srna, "resolution_max", PROP_INT, PROP_NONE);
491         RNA_def_property_int_sdna(prop, NULL, "maxres");
492         RNA_def_property_range(prop, 6, 512);
493         RNA_def_property_ui_range(prop, 24, 512, 2, -1);
494         RNA_def_property_ui_text(prop, "Max Res", "Maximal resolution used in the fluid domain");
495         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
496         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
497
498         prop = RNA_def_property(srna, "amplify", PROP_INT, PROP_NONE);
499         RNA_def_property_int_sdna(prop, NULL, "amplify");
500         RNA_def_property_range(prop, 1, 10);
501         RNA_def_property_ui_range(prop, 1, 10, 1, -1);
502         RNA_def_property_ui_text(prop, "Amplification", "Enhance the resolution of smoke by this factor using noise");
503         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
504         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
505
506         prop = RNA_def_property(srna, "use_high_resolution", PROP_BOOLEAN, PROP_NONE);
507         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES);
508         RNA_def_property_ui_text(prop, "High res", "Enable high resolution (using amplification)");
509         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
510         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
511
512         prop = RNA_def_property(srna, "show_high_resolution", PROP_BOOLEAN, PROP_NONE);
513         RNA_def_property_boolean_sdna(prop, NULL, "viewsettings", MOD_SMOKE_VIEW_SHOWBIG);
514         RNA_def_property_ui_text(prop, "Show High Resolution", "Show high resolution (using amplification)");
515         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
516
517         prop = RNA_def_property(srna, "noise_type", PROP_ENUM, PROP_NONE);
518         RNA_def_property_enum_sdna(prop, NULL, "noise");
519         RNA_def_property_enum_items(prop, prop_noise_type_items);
520         RNA_def_property_ui_text(prop, "Noise Method", "Noise method which is used for creating the high resolution");
521         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
522         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
523
524         prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
525         RNA_def_property_float_sdna(prop, NULL, "alpha");
526         RNA_def_property_range(prop, -5.0, 5.0);
527         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
528         RNA_def_property_ui_text(prop, "Density",
529                                  "How much density affects smoke motion (higher value results in faster rising smoke)");
530         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
531
532         prop = RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
533         RNA_def_property_float_sdna(prop, NULL, "beta");
534         RNA_def_property_range(prop, -5.0, 5.0);
535         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
536         RNA_def_property_ui_text(prop, "Heat",
537                                  "How much heat affects smoke motion (higher value results in faster rising smoke)");
538         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
539
540         prop = RNA_def_property(srna, "collision_group", PROP_POINTER, PROP_NONE);
541         RNA_def_property_pointer_sdna(prop, NULL, "coll_group");
542         RNA_def_property_struct_type(prop, "Group");
543         RNA_def_property_flag(prop, PROP_EDITABLE);
544         RNA_def_property_ui_text(prop, "Collision Group", "Limit collisions to this group");
545         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset_dependency");
546
547         prop = RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE);
548         RNA_def_property_pointer_sdna(prop, NULL, "fluid_group");
549         RNA_def_property_struct_type(prop, "Group");
550         RNA_def_property_flag(prop, PROP_EDITABLE);
551         RNA_def_property_ui_text(prop, "Fluid Group", "Limit fluid objects to this group");
552         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset_dependency");
553
554         prop = RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
555         RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
556         RNA_def_property_struct_type(prop, "Group");
557         RNA_def_property_flag(prop, PROP_EDITABLE);
558         RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this group");
559         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset_dependency");
560
561         prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
562         RNA_def_property_float_sdna(prop, NULL, "strength");
563         RNA_def_property_range(prop, 0.0, 10.0);
564         RNA_def_property_ui_range(prop, 0.0, 10.0, 1, 2);
565         RNA_def_property_ui_text(prop, "Strength", "Strength of noise");
566         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
567
568         prop = RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
569         RNA_def_property_int_sdna(prop, NULL, "diss_speed");
570         RNA_def_property_range(prop, 1.0, 10000.0);
571         RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, -1);
572         RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
573         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
574
575         prop = RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
576         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
577         RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time");
578         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
579
580         prop = RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
581         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
582         RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
583         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
584
585         prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
586         RNA_def_property_flag(prop, PROP_NEVER_NULL);
587         RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
588         RNA_def_property_ui_text(prop, "Point Cache", "");
589
590         prop = RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
591         RNA_def_property_enum_sdna(prop, NULL, "cache_comp");
592         RNA_def_property_enum_items(prop, smoke_cache_comp_items);
593         RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
594
595         prop = RNA_def_property(srna, "openvdb_cache_compress_type", PROP_ENUM, PROP_NONE);
596         RNA_def_property_enum_sdna(prop, NULL, "openvdb_comp");
597         RNA_def_property_enum_items(prop, prop_compression_items);
598         RNA_def_property_ui_text(prop, "Compression", "Compression method to be used");
599
600         prop = RNA_def_property(srna, "data_depth", PROP_ENUM, PROP_NONE);
601         RNA_def_property_enum_bitflag_sdna(prop, NULL, "data_depth");
602         RNA_def_property_enum_items(prop, smoke_data_depth_items);
603         RNA_def_property_ui_text(prop, "Data Depth",
604                                  "Bit depth for writing all scalar (including vector) "
605                                  "lower values reduce file size");
606         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
607
608         prop = RNA_def_property(srna, "collision_extents", PROP_ENUM, PROP_NONE);
609         RNA_def_property_enum_sdna(prop, NULL, "border_collisions");
610         RNA_def_property_enum_items(prop, smoke_domain_colli_items);
611         RNA_def_property_ui_text(prop, "Border Collisions",
612                                  "Select which domain border will be treated as collision object");
613         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
614
615         prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
616         RNA_def_property_struct_type(prop, "EffectorWeights");
617         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
618         RNA_def_property_ui_text(prop, "Effector Weights", "");
619
620         prop = RNA_def_property(srna, "highres_sampling", PROP_ENUM, PROP_NONE);
621         RNA_def_property_enum_items(prop, smoke_highres_sampling_items);
622         RNA_def_property_ui_text(prop, "Emitter", "Method for sampling the high resolution flow");
623         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
624
625         prop = RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
626         RNA_def_property_float_sdna(prop, NULL, "time_scale");
627         RNA_def_property_range(prop, 0.2, 1.5);
628         RNA_def_property_ui_range(prop, 0.2, 1.5, 0.02, 5);
629         RNA_def_property_ui_text(prop, "Time Scale", "Adjust simulation speed");
630         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
631
632         prop = RNA_def_property(srna, "vorticity", PROP_FLOAT, PROP_NONE);
633         RNA_def_property_float_sdna(prop, NULL, "vorticity");
634         RNA_def_property_range(prop, 0.01, 4.0);
635         RNA_def_property_ui_range(prop, 0.01, 4.0, 0.02, 5);
636         RNA_def_property_ui_text(prop, "Vorticity", "Amount of turbulence/rotation in fluid");
637         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
638
639         prop = RNA_def_property(srna, "density_grid", PROP_FLOAT, PROP_NONE);
640         RNA_def_property_array(prop, 32);
641         RNA_def_property_flag(prop, PROP_DYNAMIC);
642         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
643         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_grid_get_length");
644         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_density_grid_get", NULL, NULL);
645         RNA_def_property_ui_text(prop, "Density Grid", "Smoke density grid");
646
647         prop = RNA_def_property(srna, "velocity_grid", PROP_FLOAT, PROP_NONE);
648         RNA_def_property_array(prop, 32);
649         RNA_def_property_flag(prop, PROP_DYNAMIC);
650         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
651         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_velocity_grid_get_length");
652         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_velocity_grid_get", NULL, NULL);
653         RNA_def_property_ui_text(prop, "Velocity Grid", "Smoke velocity grid");
654
655         prop = RNA_def_property(srna, "flame_grid", PROP_FLOAT, PROP_NONE);
656         RNA_def_property_array(prop, 32);
657         RNA_def_property_flag(prop, PROP_DYNAMIC);
658         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
659         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_grid_get_length");
660         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_flame_grid_get", NULL, NULL);
661         RNA_def_property_ui_text(prop, "Flame Grid", "Smoke flame grid");
662
663         prop = RNA_def_property(srna, "color_grid", PROP_FLOAT, PROP_NONE);
664         RNA_def_property_array(prop, 32);
665         RNA_def_property_flag(prop, PROP_DYNAMIC);
666         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
667         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_color_grid_get_length");
668         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_color_grid_get", NULL, NULL);
669         RNA_def_property_ui_text(prop, "Color Grid", "Smoke color grid");
670
671         prop = RNA_def_property(srna, "heat_grid", PROP_FLOAT, PROP_NONE);
672         RNA_def_property_array(prop, 32);
673         RNA_def_property_flag(prop, PROP_DYNAMIC);
674         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
675         RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_heat_grid_get_length");
676         RNA_def_property_float_funcs(prop, "rna_SmokeModifier_heat_grid_get", NULL, NULL);
677         RNA_def_property_ui_text(prop, "Heat Grid", "Smoke heat grid");
678
679         prop = RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_XYZ); /* can change each frame when using adaptive domain */
680         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
681         RNA_def_property_ui_text(prop, "cell_size", "Cell Size");
682
683         prop = RNA_def_property(srna, "start_point", PROP_FLOAT, PROP_XYZ); /* can change each frame when using adaptive domain */
684         RNA_def_property_float_sdna(prop, NULL, "p0");
685         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
686         RNA_def_property_ui_text(prop, "p0", "Start point");
687
688         prop = RNA_def_property(srna, "domain_resolution", PROP_INT, PROP_XYZ); /* can change each frame when using adaptive domain */
689         RNA_def_property_int_sdna(prop, NULL, "res");
690         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
691         RNA_def_property_ui_text(prop, "res", "Smoke Grid Resolution");
692
693         prop = RNA_def_property(srna, "burning_rate", PROP_FLOAT, PROP_NONE);
694         RNA_def_property_range(prop, 0.01, 4.0);
695         RNA_def_property_ui_range(prop, 0.01, 2.0, 1.0, 5);
696         RNA_def_property_ui_text(prop, "Speed", "Speed of the burning reaction (use larger values for smaller flame)");
697         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
698
699         prop = RNA_def_property(srna, "flame_smoke", PROP_FLOAT, PROP_NONE);
700         RNA_def_property_range(prop, 0.0, 8.0);
701         RNA_def_property_ui_range(prop, 0.0, 4.0, 1.0, 5);
702         RNA_def_property_ui_text(prop, "Smoke", "Amount of smoke created by burning fuel");
703         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
704
705         prop = RNA_def_property(srna, "flame_vorticity", PROP_FLOAT, PROP_NONE);
706         RNA_def_property_range(prop, 0.0, 2.0);
707         RNA_def_property_ui_range(prop, 0.0, 1.0, 1.0, 5);
708         RNA_def_property_ui_text(prop, "Vorticity", "Additional vorticity for the flames");
709         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
710
711         prop = RNA_def_property(srna, "flame_ignition", PROP_FLOAT, PROP_NONE);
712         RNA_def_property_range(prop, 0.5, 5.0);
713         RNA_def_property_ui_range(prop, 0.5, 2.5, 1.0, 5);
714         RNA_def_property_ui_text(prop, "Ignition", "Minimum temperature of flames");
715         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
716
717         prop = RNA_def_property(srna, "flame_max_temp", PROP_FLOAT, PROP_NONE);
718         RNA_def_property_range(prop, 1.0, 10.0);
719         RNA_def_property_ui_range(prop, 1.0, 5.0, 1.0, 5);
720         RNA_def_property_ui_text(prop, "Maximum", "Maximum temperature of flames");
721         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
722
723         prop = RNA_def_property(srna, "flame_smoke_color", PROP_FLOAT, PROP_COLOR_GAMMA);
724         RNA_def_property_array(prop, 3);
725         RNA_def_property_ui_text(prop, "Smoke Color", "Color of smoke emitted from burning fuel");
726         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
727
728         prop = RNA_def_property(srna, "use_adaptive_domain", PROP_BOOLEAN, PROP_NONE);
729         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_ADAPTIVE_DOMAIN);
730         RNA_def_property_ui_text(prop, "Adaptive Domain", "Adapt simulation resolution and size to fluid");
731         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
732         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
733
734         prop = RNA_def_property(srna, "additional_res", PROP_INT, PROP_NONE);
735         RNA_def_property_int_sdna(prop, NULL, "adapt_res");
736         RNA_def_property_range(prop, 0, 512);
737         RNA_def_property_ui_range(prop, 0, 512, 2, -1);
738         RNA_def_property_ui_text(prop, "Additional", "Maximum number of additional cells");
739         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
740
741         prop = RNA_def_property(srna, "adapt_margin", PROP_INT, PROP_NONE);
742         RNA_def_property_int_sdna(prop, NULL, "adapt_margin");
743         RNA_def_property_range(prop, 2, 24);
744         RNA_def_property_ui_range(prop, 2, 24, 2, -1);
745         RNA_def_property_ui_text(prop, "Margin", "Margin added around fluid to minimize boundary interference");
746         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
747
748         prop = RNA_def_property(srna, "adapt_threshold", PROP_FLOAT, PROP_NONE);
749         RNA_def_property_range(prop, 0.01, 0.5);
750         RNA_def_property_ui_range(prop, 0.01, 0.5, 1.0, 5);
751         RNA_def_property_ui_text(prop, "Threshold",
752                                  "Maximum amount of fluid cell can contain before it is considered empty");
753         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
754
755         prop = RNA_def_property(srna, "cache_file_format", PROP_ENUM, PROP_NONE);
756         RNA_def_property_enum_sdna(prop, NULL, "cache_file_format");
757         RNA_def_property_enum_items(prop, cache_file_type_items);
758         RNA_def_property_enum_funcs(prop, NULL, "rna_Smoke_cachetype_set", NULL);
759         RNA_def_property_ui_text(prop, "File Format", "Select the file format to be used for caching");
760         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_resetCache");
761
762         /* display settings */
763
764         prop = RNA_def_property(srna, "slice_method", PROP_ENUM, PROP_NONE);
765         RNA_def_property_enum_sdna(prop, NULL, "slice_method");
766         RNA_def_property_enum_items(prop, smoke_view_items);
767         RNA_def_property_ui_text(prop, "View Method", "How to slice the volume for viewport rendering");
768         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
769
770         prop = RNA_def_property(srna, "axis_slice_method", PROP_ENUM, PROP_NONE);
771         RNA_def_property_enum_sdna(prop, NULL, "axis_slice_method");
772         RNA_def_property_enum_items(prop, axis_slice_method_items);
773         RNA_def_property_ui_text(prop, "Method", "");
774         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
775
776         prop = RNA_def_property(srna, "slice_axis", PROP_ENUM, PROP_NONE);
777         RNA_def_property_enum_sdna(prop, NULL, "slice_axis");
778         RNA_def_property_enum_items(prop, axis_slice_position_items);
779         RNA_def_property_ui_text(prop, "Axis", "");
780         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
781
782         prop = RNA_def_property(srna, "slice_per_voxel", PROP_FLOAT, PROP_NONE);
783         RNA_def_property_float_sdna(prop, NULL, "slice_per_voxel");
784         RNA_def_property_range(prop, 0.0, 100.0);
785         RNA_def_property_ui_range(prop, 0.0, 5.0, 0.1, 1);
786         RNA_def_property_ui_text(prop, "Slice Per Voxel",
787                                  "How many slices per voxel should be generated");
788         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
789
790         prop = RNA_def_property(srna, "slice_depth", PROP_FLOAT, PROP_NONE);
791         RNA_def_property_float_sdna(prop, NULL, "slice_depth");
792         RNA_def_property_range(prop, 0.0, 1.0);
793         RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 3);
794         RNA_def_property_ui_text(prop, "Position", "Position of the slice");
795         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
796
797         prop = RNA_def_property(srna, "display_thickness", PROP_FLOAT, PROP_NONE);
798         RNA_def_property_float_sdna(prop, NULL, "display_thickness");
799         RNA_def_property_range(prop, 0.001, 1000.0);
800         RNA_def_property_ui_range(prop, 0.1, 100.0, 0.1, 3);
801         RNA_def_property_ui_text(prop, "Thickness", "Thickness of smoke drawing in the viewport");
802         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
803
804         prop = RNA_def_property(srna, "draw_velocity", PROP_BOOLEAN, PROP_NONE);
805         RNA_def_property_boolean_sdna(prop, NULL, "draw_velocity", 0);
806         RNA_def_property_ui_text(prop, "Draw Velocity", "Toggle visualization of the velocity field as needles");
807         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
808
809         prop = RNA_def_property(srna, "vector_draw_type", PROP_ENUM, PROP_NONE);
810         RNA_def_property_enum_sdna(prop, NULL, "vector_draw_type");
811         RNA_def_property_enum_items(prop, vector_draw_items);
812         RNA_def_property_ui_text(prop, "Draw Type", "");
813         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
814
815         prop = RNA_def_property(srna, "vector_scale", PROP_FLOAT, PROP_NONE);
816         RNA_def_property_float_sdna(prop, NULL, "vector_scale");
817         RNA_def_property_range(prop, 0.0, 1000.0);
818         RNA_def_property_ui_range(prop, 0.0, 100.0, 0.1, 3);
819         RNA_def_property_ui_text(prop, "Scale", "Multiplier for scaling the vectors");
820         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
821
822         /* --------- Color mapping. --------- */
823
824         prop = RNA_def_property(srna, "use_color_ramp", PROP_BOOLEAN, PROP_NONE);
825         RNA_def_property_boolean_sdna(prop, NULL, "use_coba", 0);
826         RNA_def_property_boolean_funcs(prop, NULL, "rna_Smoke_use_color_ramp_set");
827         RNA_def_property_ui_text(prop, "Use Color Ramp",
828                                  "Render a simulation field while mapping its voxels values to the colors of a ramp");
829         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
830
831         static EnumPropertyItem coba_field_items[] = {
832             {FLUID_FIELD_COLOR_R, "COLOR_R", 0, "Red", "Red component of the color field"},
833             {FLUID_FIELD_COLOR_G, "COLOR_G", 0, "Green", "Green component of the color field"},
834             {FLUID_FIELD_COLOR_B, "COLOR_B", 0, "Blue", "Blue component of the color field"},
835             {FLUID_FIELD_DENSITY, "DENSITY", 0, "Density", "Quantity of soot in the fluid"},
836             {FLUID_FIELD_FLAME, "FLAME", 0, "Flame", "Flame field"},
837             {FLUID_FIELD_FUEL, "FUEL", 0, "Fuel", "Fuel field"},
838             {FLUID_FIELD_HEAT, "HEAT", 0, "Heat", "Temperature of the fluid"},
839             {FLUID_FIELD_VELOCITY_X, "VELOCITY_X", 0, "X Velocity", "X component of the velocity field"},
840             {FLUID_FIELD_VELOCITY_Y, "VELOCITY_Y", 0, "Y Velocity", "Y component of the velocity field"},
841             {FLUID_FIELD_VELOCITY_Z, "VELOCITY_Z", 0, "Z Velocity", "Z component of the velocity field"},
842             {0, NULL, 0, NULL, NULL}
843         };
844
845         prop = RNA_def_property(srna, "coba_field", PROP_ENUM, PROP_NONE);
846         RNA_def_property_enum_sdna(prop, NULL, "coba_field");
847         RNA_def_property_enum_items(prop, coba_field_items);
848         RNA_def_property_ui_text(prop, "Field", "Simulation field to color map");
849         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
850
851         prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NEVER_NULL);
852         RNA_def_property_pointer_sdna(prop, NULL, "coba");
853         RNA_def_property_struct_type(prop, "ColorRamp");
854         RNA_def_property_ui_text(prop, "Color Ramp", "");
855         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
856 }
857
858 static void rna_def_smoke_flow_settings(BlenderRNA *brna)
859 {
860         StructRNA *srna;
861         PropertyRNA *prop;
862
863         static EnumPropertyItem smoke_flow_types[] = {
864                 {MOD_SMOKE_FLOW_TYPE_OUTFLOW, "OUTFLOW", 0, "Outflow", "Delete smoke from simulation"},
865                 {MOD_SMOKE_FLOW_TYPE_SMOKE, "SMOKE", 0, "Smoke", "Add smoke"},
866                 {MOD_SMOKE_FLOW_TYPE_SMOKEFIRE, "BOTH", 0, "Fire + Smoke", "Add fire and smoke"},
867                 {MOD_SMOKE_FLOW_TYPE_FIRE, "FIRE", 0, "Fire", "Add fire"},
868                 {0, NULL, 0, NULL, NULL}
869         };
870
871         static EnumPropertyItem smoke_flow_sources[] = {
872                 {MOD_SMOKE_FLOW_SOURCE_PARTICLES, "PARTICLES", ICON_PARTICLES, "Particle System", "Emit smoke from particles"},
873                 {MOD_SMOKE_FLOW_SOURCE_MESH, "MESH", ICON_META_CUBE, "Mesh", "Emit smoke from mesh surface or volume"},
874                 {0, NULL, 0, NULL, NULL}
875         };
876
877         static EnumPropertyItem smoke_flow_texture_types[] = {
878                 {MOD_SMOKE_FLOW_TEXTURE_MAP_AUTO, "AUTO", 0, "Generated", "Generated coordinates centered to flow object"},
879                 {MOD_SMOKE_FLOW_TEXTURE_MAP_UV, "UV", 0, "UV", "Use UV layer for texture coordinates"},
880                 {0, NULL, 0, NULL, NULL}
881         };
882
883         srna = RNA_def_struct(brna, "SmokeFlowSettings", NULL);
884         RNA_def_struct_ui_text(srna, "Flow Settings", "Smoke flow settings");
885         RNA_def_struct_sdna(srna, "SmokeFlowSettings");
886         RNA_def_struct_path_func(srna, "rna_SmokeFlowSettings_path");
887
888         prop = RNA_def_property(srna, "density", PROP_FLOAT, PROP_NONE);
889         RNA_def_property_float_sdna(prop, NULL, "density");
890         RNA_def_property_range(prop, 0.0, 1);
891         RNA_def_property_ui_range(prop, 0.0, 1.0, 1.0, 4);
892         RNA_def_property_ui_text(prop, "Density", "");
893         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
894
895         prop = RNA_def_property(srna, "smoke_color", PROP_FLOAT, PROP_COLOR_GAMMA);
896         RNA_def_property_float_sdna(prop, NULL, "color");
897         RNA_def_property_array(prop, 3);
898         RNA_def_property_ui_text(prop, "Smoke Color", "Color of smoke");
899         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
900
901         prop = RNA_def_property(srna, "fuel_amount", PROP_FLOAT, PROP_NONE);
902         RNA_def_property_range(prop, 0.0, 10);
903         RNA_def_property_ui_range(prop, 0.0, 5.0, 1.0, 4);
904         RNA_def_property_ui_text(prop, "Flame Rate", "");
905         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
906
907         prop = RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE);
908         RNA_def_property_float_sdna(prop, NULL, "temp");
909         RNA_def_property_range(prop, -10, 10);
910         RNA_def_property_ui_range(prop, -10, 10, 1, 1);
911         RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambient temperature");
912         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
913         
914         prop = RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
915         RNA_def_property_pointer_sdna(prop, NULL, "psys");
916         RNA_def_property_struct_type(prop, "ParticleSystem");
917         RNA_def_property_flag(prop, PROP_EDITABLE);
918         RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
919         RNA_def_property_update(prop, 0, "rna_Smoke_reset_dependency");
920
921         prop = RNA_def_property(srna, "smoke_flow_type", PROP_ENUM, PROP_NONE);
922         RNA_def_property_enum_sdna(prop, NULL, "type");
923         RNA_def_property_enum_items(prop, smoke_flow_types);
924         RNA_def_property_ui_text(prop, "Flow Type", "Change how flow affects the simulation");
925         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
926
927         prop = RNA_def_property(srna, "smoke_flow_source", PROP_ENUM, PROP_NONE);
928         RNA_def_property_enum_sdna(prop, NULL, "source");
929         RNA_def_property_enum_items(prop, smoke_flow_sources);
930         RNA_def_property_ui_text(prop, "Source", "Change how smoke is emitted");
931         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
932
933         prop = RNA_def_property(srna, "use_absolute", PROP_BOOLEAN, PROP_NONE);
934         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_ABSOLUTE);
935         RNA_def_property_ui_text(prop, "Absolute Density", "Only allow given density value in emitter area");
936         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
937
938         prop = RNA_def_property(srna, "use_initial_velocity", PROP_BOOLEAN, PROP_NONE);
939         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_INITVELOCITY);
940         RNA_def_property_ui_text(prop, "Initial Velocity", "Smoke has some initial velocity when it is emitted");
941         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
942
943         prop = RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
944         RNA_def_property_float_sdna(prop, NULL, "vel_multi");
945         RNA_def_property_range(prop, -100.0, 100.0);
946         RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
947         RNA_def_property_ui_text(prop, "Source", "Multiplier of source velocity passed to smoke");
948         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
949
950         prop = RNA_def_property(srna, "velocity_normal", PROP_FLOAT, PROP_NONE);
951         RNA_def_property_float_sdna(prop, NULL, "vel_normal");
952         RNA_def_property_range(prop, -100.0, 100.0);
953         RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
954         RNA_def_property_ui_text(prop, "Normal", "Amount of normal directional velocity");
955         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
956
957         prop = RNA_def_property(srna, "velocity_random", PROP_FLOAT, PROP_NONE);
958         RNA_def_property_float_sdna(prop, NULL, "vel_random");
959         RNA_def_property_range(prop, 0.0, 10.0);
960         RNA_def_property_ui_range(prop, 0.0, 2.0, 0.05, 5);
961         RNA_def_property_ui_text(prop, "Random", "Amount of random velocity");
962         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
963
964         prop = RNA_def_property(srna, "volume_density", PROP_FLOAT, PROP_NONE);
965         RNA_def_property_range(prop, 0.0, 1.0);
966         RNA_def_property_ui_range(prop, 0.0, 1.0, 0.05, 5);
967         RNA_def_property_ui_text(prop, "Volume", "Factor for smoke emitted from inside the mesh volume");
968         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
969
970         prop = RNA_def_property(srna, "surface_distance", PROP_FLOAT, PROP_NONE);
971         RNA_def_property_range(prop, 0.0, 10.0);
972         RNA_def_property_ui_range(prop, 0.5, 5.0, 0.05, 5);
973         RNA_def_property_ui_text(prop, "Surface", "Maximum distance from mesh surface to emit smoke");
974         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
975
976         prop = RNA_def_property(srna, "particle_size", PROP_FLOAT, PROP_NONE);
977         RNA_def_property_range(prop, 0.1, 20.0);
978         RNA_def_property_ui_range(prop, 0.5, 5.0, 0.05, 5);
979         RNA_def_property_ui_text(prop, "Size", "Particle size in simulation cells");
980         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
981
982         prop = RNA_def_property(srna, "use_particle_size", PROP_BOOLEAN, PROP_NONE);
983         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_USE_PART_SIZE);
984         RNA_def_property_ui_text(prop, "Set Size", "Set particle size in simulation cells or use nearest cell");
985         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
986
987         prop = RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE);
988         RNA_def_property_range(prop, 0, 50);
989         RNA_def_property_ui_range(prop, 0, 10, 1, -1);
990         RNA_def_property_ui_text(prop, "Subframes", "Number of additional samples to take between frames to improve quality of fast moving flows");
991         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
992
993         prop = RNA_def_property(srna, "density_vertex_group", PROP_STRING, PROP_NONE);
994         RNA_def_property_string_funcs(prop, "rna_SmokeFlow_density_vgroup_get",
995                                       "rna_SmokeFlow_density_vgroup_length",
996                                       "rna_SmokeFlow_density_vgroup_set");
997         RNA_def_property_ui_text(prop, "Vertex Group",
998                                  "Name of vertex group which determines surface emission rate");
999         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1000
1001         prop = RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
1002         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_TEXTUREEMIT);
1003         RNA_def_property_ui_text(prop, "Use Texture", "Use a texture to control emission strength");
1004         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1005
1006         prop = RNA_def_property(srna, "texture_map_type", PROP_ENUM, PROP_NONE);
1007         RNA_def_property_enum_sdna(prop, NULL, "texture_type");
1008         RNA_def_property_enum_items(prop, smoke_flow_texture_types);
1009         RNA_def_property_ui_text(prop, "Mapping", "Texture mapping type");
1010         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1011
1012         prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
1013         RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
1014         RNA_def_property_ui_text(prop, "UV Map", "UV map name");
1015         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SmokeFlow_uvlayer_set");
1016         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1017
1018         prop = RNA_def_property(srna, "noise_texture", PROP_POINTER, PROP_NONE);
1019         RNA_def_property_flag(prop, PROP_EDITABLE);
1020         RNA_def_property_ui_text(prop, "Texture", "Texture that controls emission strength");
1021         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1022
1023         prop = RNA_def_property(srna, "texture_size", PROP_FLOAT, PROP_NONE);
1024         RNA_def_property_range(prop, 0.01, 10.0);
1025         RNA_def_property_ui_range(prop, 0.1, 5.0, 0.05, 5);
1026         RNA_def_property_ui_text(prop, "Size", "Size of texture mapping");
1027         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1028
1029         prop = RNA_def_property(srna, "texture_offset", PROP_FLOAT, PROP_NONE);
1030         RNA_def_property_range(prop, 0.0, 200.0);
1031         RNA_def_property_ui_range(prop, 0.0, 100.0, 0.05, 5);
1032         RNA_def_property_ui_text(prop, "Offset", "Z-offset of texture mapping");
1033         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1034 }
1035
1036 static void rna_def_smoke_coll_settings(BlenderRNA *brna)
1037 {
1038         static EnumPropertyItem smoke_coll_type_items[] = {
1039                 {SM_COLL_STATIC, "COLLSTATIC", 0, "Static", "Non moving obstacle"},
1040                 {SM_COLL_RIGID, "COLLRIGID", 0, "Rigid", "Rigid obstacle"},
1041                 {SM_COLL_ANIMATED, "COLLANIMATED", 0, "Animated", "Animated obstacle"},
1042                 {0, NULL, 0, NULL, NULL}
1043         };
1044
1045         StructRNA *srna;
1046         PropertyRNA *prop;
1047
1048         srna = RNA_def_struct(brna, "SmokeCollSettings", NULL);
1049         RNA_def_struct_ui_text(srna, "Collision Settings", "Smoke collision settings");
1050         RNA_def_struct_sdna(srna, "SmokeCollSettings");
1051         RNA_def_struct_path_func(srna, "rna_SmokeCollSettings_path");
1052
1053         prop = RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE);
1054         RNA_def_property_enum_sdna(prop, NULL, "type");
1055         RNA_def_property_enum_items(prop, smoke_coll_type_items);
1056         RNA_def_property_ui_text(prop, "Collision type", "Collision type");
1057         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Smoke_reset");
1058 }
1059
1060 void RNA_def_smoke(BlenderRNA *brna)
1061 {
1062         rna_def_smoke_domain_settings(brna);
1063         rna_def_smoke_flow_settings(brna);
1064         rna_def_smoke_coll_settings(brna);
1065 }
1066
1067 #endif