doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / blender / makesrna / intern / rna_smoke.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Daniel Genrich
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26 #include <limits.h>
27
28 #include "RNA_define.h"
29
30 #include "rna_internal.h"
31
32 #include "BKE_modifier.h"
33 #include "BKE_smoke.h"
34
35 #include "DNA_modifier_types.h"
36 #include "DNA_object_force.h"
37 #include "DNA_object_types.h"
38 #include "DNA_scene_types.h"
39 #include "DNA_smoke_types.h"
40
41 #include "WM_types.h"
42
43
44 #ifdef RNA_RUNTIME
45
46 #include "BKE_context.h"
47 #include "BKE_depsgraph.h"
48 #include "BKE_particle.h"
49
50
51 static void rna_Smoke_update(Main *bmain, Scene *scene, PointerRNA *ptr)
52 {
53         DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
54 }
55
56 static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
57 {
58         rna_Smoke_update(bmain, scene, ptr);
59         DAG_scene_sort(bmain, scene);
60 }
61
62 static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
63 {
64         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
65
66         smokeModifier_reset(settings->smd);
67
68         if(settings->smd && settings->smd->domain)
69                 settings->point_cache[0]->flag |= PTCACHE_OUTDATED;
70
71         rna_Smoke_update(bmain, scene, ptr);
72 }
73
74 static void rna_Smoke_reset_dependancy(Main *bmain, Scene *scene, PointerRNA *ptr)
75 {
76         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
77
78         smokeModifier_reset(settings->smd);
79
80         if(settings->smd && settings->smd->domain)
81                 settings->smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
82
83         rna_Smoke_dependency_update(bmain, scene, ptr);
84 }
85
86 static char *rna_SmokeDomainSettings_path(PointerRNA *ptr)
87 {
88         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
89         ModifierData *md= (ModifierData *)settings->smd;
90
91         return BLI_sprintfN("modifiers[\"%s\"].domain_settings", md->name);
92 }
93
94 static char *rna_SmokeFlowSettings_path(PointerRNA *ptr)
95 {
96         SmokeFlowSettings *settings = (SmokeFlowSettings*)ptr->data;
97         ModifierData *md= (ModifierData *)settings->smd;
98
99         return BLI_sprintfN("modifiers[\"%s\"].flow_settings", md->name);
100 }
101
102 static char *rna_SmokeCollSettings_path(PointerRNA *ptr)
103 {
104         SmokeCollSettings *settings = (SmokeCollSettings*)ptr->data;
105         ModifierData *md= (ModifierData *)settings->smd;
106
107         return BLI_sprintfN("modifiers[\"%s\"].coll_settings", md->name);
108 }
109
110 #else
111
112 static void rna_def_smoke_domain_settings(BlenderRNA *brna)
113 {
114         StructRNA *srna;
115         PropertyRNA *prop;
116
117         static EnumPropertyItem prop_noise_type_items[] = {
118                                 {MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""},
119 #if FFTW3 == 1
120                                 {MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""}, 
121 #endif
122                         /*      {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */
123                                 {0, NULL, 0, NULL, NULL}};
124
125         static EnumPropertyItem smoke_cache_comp_items[] = {
126                 {SM_CACHE_LIGHT, "CACHELIGHT", 0, "Light", "Fast but not so effective compression"},
127                 {SM_CACHE_HEAVY, "CACHEHEAVY", 0, "Heavy", "Effective but slow compression"},
128                 {0, NULL, 0, NULL, NULL}};
129
130         static EnumPropertyItem smoke_domain_colli_items[] = {
131                 {SM_BORDER_OPEN, "BORDEROPEN", 0, "Open", "Smoke doesn't collide with any border"},
132                 {SM_BORDER_VERTICAL, "BORDERVERTICAL", 0, "Vertically Open", "Smoke doesn't collide with top and bottom sides"},
133                 {SM_BORDER_CLOSED, "BORDERCLOSED", 0, "Collide All", "Smoke collides with every side"},
134                 {0, NULL, 0, NULL, NULL}};
135
136         srna = RNA_def_struct(brna, "SmokeDomainSettings", NULL);
137         RNA_def_struct_ui_text(srna, "Domain Settings", "Smoke domain settings");
138         RNA_def_struct_sdna(srna, "SmokeDomainSettings");
139         RNA_def_struct_path_func(srna, "rna_SmokeDomainSettings_path");
140
141         prop= RNA_def_property(srna, "resolution_max", PROP_INT, PROP_NONE);
142         RNA_def_property_int_sdna(prop, NULL, "maxres");
143         RNA_def_property_range(prop, 24, 512);
144         RNA_def_property_ui_range(prop, 24, 512, 2, 0);
145         RNA_def_property_ui_text(prop, "Max Res", "Maximal resolution used in the fluid domain");
146         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
147
148         prop= RNA_def_property(srna, "amplify", PROP_INT, PROP_NONE);
149         RNA_def_property_int_sdna(prop, NULL, "amplify");
150         RNA_def_property_range(prop, 1, 10);
151         RNA_def_property_ui_range(prop, 1, 10, 1, 0);
152         RNA_def_property_ui_text(prop, "Amplification", "Enhance the resolution of smoke by this factor using noise");
153         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
154
155         prop= RNA_def_property(srna, "use_high_resolution", PROP_BOOLEAN, PROP_NONE);
156         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES);
157         RNA_def_property_ui_text(prop, "High res", "Enable high resolution (using amplification)");
158         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
159
160         prop= RNA_def_property(srna, "show_high_resolution", PROP_BOOLEAN, PROP_NONE);
161         RNA_def_property_boolean_sdna(prop, NULL, "viewsettings", MOD_SMOKE_VIEW_SHOWBIG);
162         RNA_def_property_ui_text(prop, "Show High Resolution", "Show high resolution (using amplification)");
163         RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
164
165         prop= RNA_def_property(srna, "noise_type", PROP_ENUM, PROP_NONE);
166         RNA_def_property_enum_sdna(prop, NULL, "noise");
167         RNA_def_property_enum_items(prop, prop_noise_type_items);
168         RNA_def_property_ui_text(prop, "Noise Method", "Noise method which is used for creating the high resolution");
169         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
170
171         prop= RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
172         RNA_def_property_float_sdna(prop, NULL, "alpha");
173         RNA_def_property_range(prop, -5.0, 5.0);
174         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
175         RNA_def_property_ui_text(prop, "Density", "How much density effects smoke motion, higher value results in faster rising smoke");
176         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
177
178         prop= RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
179         RNA_def_property_float_sdna(prop, NULL, "beta");
180         RNA_def_property_range(prop, -5.0, 5.0);
181         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
182         RNA_def_property_ui_text(prop, "Heat", "How much heat effects smoke motion, higher value results in faster rising smoke");
183         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
184
185         prop= RNA_def_property(srna, "collision_group", PROP_POINTER, PROP_NONE);
186         RNA_def_property_pointer_sdna(prop, NULL, "coll_group");
187         RNA_def_property_struct_type(prop, "Group");
188         RNA_def_property_flag(prop, PROP_EDITABLE);
189         RNA_def_property_ui_text(prop, "Collision Group", "Limit collisions to this group");
190         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
191
192         prop= RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE);
193         RNA_def_property_pointer_sdna(prop, NULL, "fluid_group");
194         RNA_def_property_struct_type(prop, "Group");
195         RNA_def_property_flag(prop, PROP_EDITABLE);
196         RNA_def_property_ui_text(prop, "Fluid Group", "Limit fluid objects to this group");
197         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
198
199         prop= RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
200         RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
201         RNA_def_property_struct_type(prop, "Group");
202         RNA_def_property_flag(prop, PROP_EDITABLE);
203         RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this group");
204         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
205
206         prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
207         RNA_def_property_float_sdna(prop, NULL, "strength");
208         RNA_def_property_range(prop, 0.0, 10.0);
209         RNA_def_property_ui_range(prop, 0.0, 10.0, 1, 2);
210         RNA_def_property_ui_text(prop, "Strength", "Strength of wavelet noise");
211         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
212
213         prop= RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
214         RNA_def_property_int_sdna(prop, NULL, "diss_speed");
215         RNA_def_property_range(prop, 1.0, 10000.0);
216         RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, 0);
217         RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
218         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
219
220         prop= RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
221         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
222         RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time");
223         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
224
225         prop= RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
226         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
227         RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
228         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
229
230         prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
231         RNA_def_property_flag(prop, PROP_NEVER_NULL);
232         RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
233         RNA_def_property_ui_text(prop, "Point Cache", "");
234
235         prop= RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
236         RNA_def_property_enum_sdna(prop, NULL, "cache_comp");
237         RNA_def_property_enum_items(prop, smoke_cache_comp_items);
238         RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
239         RNA_def_property_update(prop, 0, NULL);
240
241         prop= RNA_def_property(srna, "collision_extents", PROP_ENUM, PROP_NONE);
242         RNA_def_property_enum_sdna(prop, NULL, "border_collisions");
243         RNA_def_property_enum_items(prop, smoke_domain_colli_items);
244         RNA_def_property_ui_text(prop, "Border Collisions", "Selects which domain border will be treated as collision object.");
245         RNA_def_property_update(prop, 0, NULL);
246
247         prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
248         RNA_def_property_struct_type(prop, "EffectorWeights");
249         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
250         RNA_def_property_ui_text(prop, "Effector Weights", "");
251
252         prop= RNA_def_property(srna, "smooth_emitter", PROP_BOOLEAN, PROP_NONE);
253         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGH_SMOOTH);
254         RNA_def_property_ui_text(prop, "Smooth Emitter", "Smoothens emitted smoke to avoid blockiness.");
255         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
256
257         prop= RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
258         RNA_def_property_float_sdna(prop, NULL, "time_scale");
259         RNA_def_property_range(prop, 0.2, 1.5);
260         RNA_def_property_ui_range(prop, 0.2, 1.5, 0.02, 5);
261         RNA_def_property_ui_text(prop, "Time Scale", "Adjust simulation speed.");
262         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
263
264         prop= RNA_def_property(srna, "vorticity", PROP_FLOAT, PROP_NONE);
265         RNA_def_property_float_sdna(prop, NULL, "vorticity");
266         RNA_def_property_range(prop, 0.01, 4.0);
267         RNA_def_property_ui_range(prop, 0.01, 4.0, 0.02, 5);
268         RNA_def_property_ui_text(prop, "Vorticity", "Amount of turbulence/rotation in fluid.");
269         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
270
271 }
272
273 static void rna_def_smoke_flow_settings(BlenderRNA *brna)
274 {
275         StructRNA *srna;
276         PropertyRNA *prop;
277
278         srna = RNA_def_struct(brna, "SmokeFlowSettings", NULL);
279         RNA_def_struct_ui_text(srna, "Flow Settings", "Smoke flow settings");
280         RNA_def_struct_sdna(srna, "SmokeFlowSettings");
281         RNA_def_struct_path_func(srna, "rna_SmokeFlowSettings_path");
282
283         prop= RNA_def_property(srna, "density", PROP_FLOAT, PROP_NONE);
284         RNA_def_property_float_sdna(prop, NULL, "density");
285         RNA_def_property_range(prop, 0.001, 1);
286         RNA_def_property_ui_range(prop, 0.001, 1.0, 1.0, 4);
287         RNA_def_property_ui_text(prop, "Density", "");
288         RNA_def_property_update(prop, 0, NULL); // NC_OBJECT|ND_MODIFIER
289
290         prop= RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE);
291         RNA_def_property_float_sdna(prop, NULL, "temp");
292         RNA_def_property_range(prop, -10, 10);
293         RNA_def_property_ui_range(prop, -10, 10, 1, 1);
294         RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambient temperature");
295         RNA_def_property_update(prop, 0, NULL);
296         
297         prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
298         RNA_def_property_pointer_sdna(prop, NULL, "psys");
299         RNA_def_property_struct_type(prop, "ParticleSystem");
300         RNA_def_property_flag(prop, PROP_EDITABLE);
301         RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object");
302         RNA_def_property_update(prop, 0, "rna_Smoke_reset_dependancy");
303
304         prop= RNA_def_property(srna, "use_outflow", PROP_BOOLEAN, PROP_NONE);
305         RNA_def_property_boolean_sdna(prop, NULL, "type", MOD_SMOKE_FLOW_TYPE_OUTFLOW);
306         RNA_def_property_ui_text(prop, "Outflow", "Deletes smoke from simulation");
307         RNA_def_property_update(prop, 0, NULL);
308
309         prop= RNA_def_property(srna, "use_absolute", PROP_BOOLEAN, PROP_NONE);
310         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_ABSOLUTE);
311         RNA_def_property_ui_text(prop, "Absolute Density", "Only allows given density value in emitter area.");
312         RNA_def_property_update(prop, 0, NULL);
313
314         prop= RNA_def_property(srna, "initial_velocity", PROP_BOOLEAN, PROP_NONE);
315         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_FLOW_INITVELOCITY);
316         RNA_def_property_ui_text(prop, "Initial Velocity", "Smoke inherits it's velocity from the emitter particle");
317         RNA_def_property_update(prop, 0, NULL);
318
319         prop= RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
320         RNA_def_property_float_sdna(prop, NULL, "vel_multi");
321         RNA_def_property_range(prop, -2.0, 2.0);
322         RNA_def_property_ui_range(prop, -2.0, 2.0, 0.05, 5);
323         RNA_def_property_ui_text(prop, "Multiplier", "Multiplier to adjust velocity passed to smoke");
324         RNA_def_property_update(prop, 0, NULL);
325 }
326
327 static void rna_def_smoke_coll_settings(BlenderRNA *brna)
328 {
329         StructRNA *srna;
330
331         srna = RNA_def_struct(brna, "SmokeCollSettings", NULL);
332         RNA_def_struct_ui_text(srna, "Collision Settings", "Smoke collision settings");
333         RNA_def_struct_sdna(srna, "SmokeCollSettings");
334         RNA_def_struct_path_func(srna, "rna_SmokeCollSettings_path");
335 }
336
337 void RNA_def_smoke(BlenderRNA *brna)
338 {
339         rna_def_smoke_domain_settings(brna);
340         rna_def_smoke_flow_settings(brna);
341         rna_def_smoke_coll_settings(brna);
342 }
343
344 #endif
345