Smoke:
[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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 #include "RNA_types.h"
30
31 #include "rna_internal.h"
32
33 #include "BKE_modifier.h"
34 #include "BKE_smoke.h"
35
36 #include "DNA_modifier_types.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 #include "ED_object.h"
51
52 static void rna_Smoke_update(bContext *C, PointerRNA *ptr)
53 {
54         DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
55 }
56
57 static void rna_Smoke_dependency_update(bContext *C, PointerRNA *ptr)
58 {
59         rna_Smoke_update(C, ptr);
60     DAG_scene_sort(CTX_data_scene(C));
61 }
62
63 static void rna_Smoke_reset(bContext *C, PointerRNA *ptr)
64 {
65         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
66
67         smokeModifier_reset(settings->smd);
68
69         rna_Smoke_update(C, ptr);
70 }
71
72 static void rna_Smoke_reset_dependancy(bContext *C, PointerRNA *ptr)
73 {
74         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
75
76         smokeModifier_reset(settings->smd);
77
78         rna_Smoke_dependency_update(C, ptr);
79 }
80
81 static void rna_Smoke_enable_HR(bContext *C, PointerRNA *ptr)
82 {
83         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
84         Object *ob = (Object*)ptr->id.data;
85
86         if(settings->flags & MOD_SMOKE_HIGHRES)
87                 BLI_addtail(&ob->modifiers, modifier_new(eModifierType_SmokeHR));
88         else
89         {
90                 ModifierData *tmd = modifiers_findByType(ob, eModifierType_SmokeHR);
91                 if(tmd) {
92                         BLI_remlink(&ob->modifiers, tmd);
93                         modifier_free(tmd);
94                 }
95         }
96 }
97
98 static void rna_Smoke_redraw(bContext *C, PointerRNA *ptr)
99 {
100         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
101
102         // settings->flags |= MOD_SMOKE_VIEW_REDRAWNICE;
103 }
104
105 static char *rna_SmokeDomainSettings_path(PointerRNA *ptr)
106 {
107         SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
108         ModifierData *md= (ModifierData *)settings->smd;
109
110         return BLI_sprintfN("modifiers[%s].domain_settings", md->name);
111 }
112
113 static char *rna_SmokeFlowSettings_path(PointerRNA *ptr)
114 {
115         SmokeFlowSettings *settings = (SmokeFlowSettings*)ptr->data;
116         ModifierData *md= (ModifierData *)settings->smd;
117
118         return BLI_sprintfN("modifiers[%s].flow_settings", md->name);
119 }
120
121 static char *rna_SmokeCollSettings_path(PointerRNA *ptr)
122 {
123         SmokeCollSettings *settings = (SmokeCollSettings*)ptr->data;
124         ModifierData *md= (ModifierData *)settings->smd;
125
126         return BLI_sprintfN("modifiers[%s].coll_settings", md->name);
127 }
128
129 #else
130
131 static void rna_def_smoke_domain_settings(BlenderRNA *brna)
132 {
133         StructRNA *srna;
134         PropertyRNA *prop;
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, "maxres", 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, "alpha", PROP_FLOAT, PROP_NONE);
149         RNA_def_property_float_sdna(prop, NULL, "alpha");
150         RNA_def_property_range(prop, -5.0, 5.0);
151         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
152         RNA_def_property_ui_text(prop, "Gravity", "Higher value results in sinking smoke");
153         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
154
155         prop= RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
156         RNA_def_property_float_sdna(prop, NULL, "beta");
157         RNA_def_property_range(prop, -5.0, 5.0);
158         RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
159         RNA_def_property_ui_text(prop, "Heat", "Higher value results in faster rising smoke.");
160         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
161
162         prop= RNA_def_property(srna, "coll_group", PROP_POINTER, PROP_NONE);
163         RNA_def_property_pointer_sdna(prop, NULL, "coll_group");
164         RNA_def_property_struct_type(prop, "Group");
165         RNA_def_property_flag(prop, PROP_EDITABLE);
166         RNA_def_property_ui_text(prop, "Collision Group", "Limit collisions to this group.");
167         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
168
169         prop= RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE);
170         RNA_def_property_pointer_sdna(prop, NULL, "fluid_group");
171         RNA_def_property_struct_type(prop, "Group");
172         RNA_def_property_flag(prop, PROP_EDITABLE);
173         RNA_def_property_ui_text(prop, "Fluid Group", "Limit fluid objects to this group.");
174         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
175
176         prop= RNA_def_property(srna, "eff_group", PROP_POINTER, PROP_NONE);
177         RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
178         RNA_def_property_struct_type(prop, "Group");
179         RNA_def_property_flag(prop, PROP_EDITABLE);
180         RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this group.");
181         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
182
183         prop= RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
184         RNA_def_property_int_sdna(prop, NULL, "diss_speed");
185         RNA_def_property_range(prop, 1.0, 100.0);
186         RNA_def_property_ui_range(prop, 1.0, 1000.0, 1, 0);
187         RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
188         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
189
190         prop= RNA_def_property(srna, "highres", PROP_BOOLEAN, PROP_NONE);
191         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES);
192         RNA_def_property_ui_text(prop, "High Resolution Smoke", "Enable high resolution smoke");
193         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_enable_HR");
194
195         prop= RNA_def_property(srna, "dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
196         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
197         RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time.");
198         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
199
200         prop= RNA_def_property(srna, "dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
201         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
202         RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
203         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
204
205         prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NEVER_NULL);
206         RNA_def_property_pointer_sdna(prop, NULL, "point_cache");
207         RNA_def_property_struct_type(prop, "PointCache");
208         RNA_def_property_ui_text(prop, "Point Cache", "");
209 }
210
211 static void rna_def_smoke_flow_settings(BlenderRNA *brna)
212 {
213         StructRNA *srna;
214         PropertyRNA *prop;
215
216         srna = RNA_def_struct(brna, "SmokeFlowSettings", NULL);
217         RNA_def_struct_ui_text(srna, "Flow Settings", "Smoke flow settings.");
218         RNA_def_struct_sdna(srna, "SmokeFlowSettings");
219         RNA_def_struct_path_func(srna, "rna_SmokeFlowSettings_path");
220
221         prop= RNA_def_property(srna, "density", PROP_FLOAT, PROP_NONE);
222         RNA_def_property_float_sdna(prop, NULL, "density");
223         RNA_def_property_range(prop, 0.001, 1);
224         RNA_def_property_ui_range(prop, 0.001, 1.0, 1.0, 4);
225         RNA_def_property_ui_text(prop, "Density", "");
226         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
227
228         prop= RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE);
229         RNA_def_property_float_sdna(prop, NULL, "temp");
230         RNA_def_property_range(prop, -10, 10);
231         RNA_def_property_ui_range(prop, -10, 10, 1, 1);
232         RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambientt temperature.");
233         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
234         
235         prop= RNA_def_property(srna, "psys", PROP_POINTER, PROP_NONE);
236         RNA_def_property_pointer_sdna(prop, NULL, "psys");
237         RNA_def_property_struct_type(prop, "ParticleSystem");
238         RNA_def_property_flag(prop, PROP_EDITABLE);
239         RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object.");
240         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
241
242         prop= RNA_def_property(srna, "outflow", PROP_BOOLEAN, PROP_NONE);
243         RNA_def_property_boolean_sdna(prop, NULL, "type", MOD_SMOKE_FLOW_TYPE_OUTFLOW);
244         RNA_def_property_ui_text(prop, "Outflow", "Deletes smoke from simulation");
245         RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
246 }
247
248 static void rna_def_smoke_coll_settings(BlenderRNA *brna)
249 {
250         StructRNA *srna;
251
252         srna = RNA_def_struct(brna, "SmokeCollSettings", NULL);
253         RNA_def_struct_ui_text(srna, "Collision Settings", "Smoke collision settings.");
254         RNA_def_struct_sdna(srna, "SmokeCollSettings");
255         RNA_def_struct_path_func(srna, "rna_SmokeCollSettings_path");
256 }
257
258 void RNA_def_smoke(BlenderRNA *brna)
259 {
260         rna_def_smoke_domain_settings(brna);
261         rna_def_smoke_flow_settings(brna);
262         rna_def_smoke_coll_settings(brna);
263 }
264
265 #endif
266