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