Merge with 2.5 -r 21619:21756.
[blender.git] / source / blender / makesrna / intern / rna_fluidsim.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): Blender Foundation (2008).
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26
27 #include "RNA_define.h"
28 #include "RNA_types.h"
29
30 #include "rna_internal.h"
31
32 #include "DNA_object_fluidsim.h"
33
34 #include "WM_api.h"
35 #include "WM_types.h"
36
37 #ifdef RNA_RUNTIME
38
39 #include "MEM_guardedalloc.h"
40
41 #include "DNA_scene_types.h"
42 #include "DNA_particle_types.h"
43
44 #include "BKE_depsgraph.h"
45 #include "BKE_fluidsim.h"
46 #include "BKE_main.h"
47 #include "BKE_modifier.h"
48 #include "BKE_particle.h"
49 #include "BKE_pointcache.h"
50
51 static StructRNA* rna_FluidSettings_refine(struct PointerRNA *ptr)
52 {
53         FluidsimSettings *fss= (FluidsimSettings*)ptr->data;
54
55         switch(fss->type) {
56                 case OB_FLUIDSIM_DOMAIN:
57                         return &RNA_DomainFluidSettings;
58                 case OB_FLUIDSIM_FLUID:
59                         return &RNA_FluidFluidSettings;
60                 case OB_FLUIDSIM_OBSTACLE:
61                         return &RNA_ObstacleFluidSettings;
62                 case OB_FLUIDSIM_INFLOW:
63                         return &RNA_InflowFluidSettings;
64                 case OB_FLUIDSIM_OUTFLOW:
65                         return &RNA_OutflowFluidSettings;
66                 case OB_FLUIDSIM_PARTICLE:
67                         return &RNA_ParticleFluidSettings;
68                 case OB_FLUIDSIM_CONTROL:
69                         return &RNA_ControlFluidSettings;
70                 default:
71                         return &RNA_FluidSettings;
72         }
73 }
74
75 static void rna_FluidSettings_update_type(bContext *C, PointerRNA *ptr)
76 {
77         Main *bmain= CTX_data_main(C);
78         Scene *scene= CTX_data_scene(C);
79         Object *ob= (Object*)ptr->id.data;
80         FluidsimModifierData *fluidmd;
81         ParticleSystemModifierData *psmd;
82         ParticleSystem *psys;
83         ParticleSettings *part;
84         
85         fluidmd= (FluidsimModifierData*)modifiers_findByType(ob, eModifierType_Fluidsim);
86         fluidmd->fss->flag &= ~OB_FLUIDSIM_REVERSE; // clear flag
87
88         /* remove fluidsim particle system */
89         if(fluidmd->fss->type & OB_FLUIDSIM_PARTICLE) {
90                 for(psys=ob->particlesystem.first; psys; psys=psys->next)
91                         if(psys->part->type == PART_FLUID)
92                                 break;
93
94                 if(ob->type == OB_MESH && !psys) {
95                         /* add particle system */
96                         part= psys_new_settings("ParticleSettings", bmain);
97                         psys= MEM_callocN(sizeof(ParticleSystem), "particle_system");
98
99                         part->type= PART_FLUID;
100                         psys->part= part;
101                         psys->pointcache= BKE_ptcache_add();
102                         psys->flag |= PSYS_ENABLED;
103                         BLI_addtail(&ob->particlesystem,psys);
104
105                         /* add modifier */
106                         psmd= (ParticleSystemModifierData*)modifier_new(eModifierType_ParticleSystem);
107                         sprintf(psmd->modifier.name, "FluidParticleSystem" );
108                         psmd->psys= psys;
109                         BLI_addtail(&ob->modifiers, psmd);
110                 }
111         }
112         else {
113                 for(psys=ob->particlesystem.first; psys; psys=psys->next) {
114                         if(psys->part->type == PART_FLUID) {
115                                 /* clear modifier */
116                                 psmd= psys_get_modifier(ob, psys);
117                                 BLI_remlink(&ob->modifiers, psmd);
118                                 modifier_free((ModifierData *)psmd);
119
120                                 /* clear particle system */
121                                 BLI_remlink(&ob->particlesystem, psys);
122                                 psys_free(ob, psys);
123                         }
124                 }
125         }
126
127         DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
128         WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
129 }
130
131 static void rna_DomainFluidSettings_memory_estimate_get(PointerRNA *ptr, char *value)
132 {
133 #ifdef DISABLE_ELBEEM
134         value[0]= '\0';
135 #else
136         Object *ob= (Object*)ptr->id.data;
137         FluidsimSettings *fss= (FluidsimSettings*)ptr->data;
138
139         fluid_estimate_memory(ob, fss, value);
140 #endif
141 }
142
143 static int rna_DomainFluidSettings_memory_estimate_length(PointerRNA *ptr)
144 {
145         return 32;
146 }
147
148 #else
149
150 static void rna_def_fluidsim_slip(StructRNA *srna)
151 {
152         PropertyRNA *prop;
153
154         static EnumPropertyItem slip_items[] = {
155                 {OB_FSBND_NOSLIP, "NOSLIP", 0, "No Slip", "Obstacle causes zero normal and tangential velocity (=sticky). Default for all. Only option for moving objects."},
156                 {OB_FSBND_PARTSLIP, "PARTIALSLIP", 0, "Partial Slip", "Mix between no-slip and free-slip. Non moving objects only!"},
157                 {OB_FSBND_FREESLIP, "FREESLIP", 0, "Free Slip", "Obstacle only causes zero normal velocity (=not sticky). Non moving objects only!"},
158                 {0, NULL, 0, NULL, NULL}};
159
160         prop= RNA_def_property(srna, "slip_type", PROP_ENUM, PROP_NONE);
161         RNA_def_property_enum_bitflag_sdna(prop, NULL, "typeFlags");
162         RNA_def_property_enum_items(prop, slip_items);
163         RNA_def_property_ui_text(prop, "Slip Type", "");
164
165         prop= RNA_def_property(srna, "partial_slip_amount", PROP_FLOAT, PROP_NONE);
166         RNA_def_property_float_sdna(prop, NULL, "partSlipValue");
167         RNA_def_property_range(prop, 0.0f, 1.0f);
168         RNA_def_property_ui_text(prop, "Partial Slip Amount", "Amount of mixing between no- and free-slip, 0 is no slip and 1 is free slip.");
169 }
170
171 static void rna_def_fluidsim_domain(BlenderRNA *brna)
172 {
173         StructRNA *srna;
174         PropertyRNA *prop;
175
176         static EnumPropertyItem quality_items[] = {
177                 {OB_FSDOM_GEOM, "GEOMETRY", 0, "Geometry", "Display geometry."},
178                 {OB_FSDOM_PREVIEW, "PREVIEW", 0, "Preview", "Display preview quality results."},
179                 {OB_FSDOM_FINAL, "FINAL", 0, "Final", "Display final quality results."},
180                 {0, NULL, 0, NULL, NULL}};
181
182         static EnumPropertyItem viscosity_items[] = {
183                 {1, "MANUAL", 0, "Manual", "Manual viscosity settings."},
184                 {2, "WATER", 0, "Water", "Viscosity of 1.0 * 10^-6."},
185                 {3, "OIL", 0, "Oil", "Viscosity of 5.0 * 10^-5."},
186                 {4, "HONEY", 0, "Honey", "Viscosity of 2.0 * 10^-3."},
187                 {0, NULL, 0, NULL, NULL}};
188
189         srna= RNA_def_struct(brna, "DomainFluidSettings", "FluidSettings");
190         RNA_def_struct_sdna(srna, "FluidsimSettings");
191         RNA_def_struct_ui_text(srna, "Domain Fluid Simulation Settings", "Fluid simulation settings for the domain of a fluid simulation.");
192
193         /* standard settings */
194
195         prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE);
196         RNA_def_property_int_sdna(prop, NULL, "resolutionxyz");
197         RNA_def_property_range(prop, 1, 1024);
198         RNA_def_property_ui_text(prop, "Resolution", "Domain resolution in X,Y and Z direction.");
199
200         prop= RNA_def_property(srna, "preview_resolution", PROP_INT, PROP_NONE);
201         RNA_def_property_int_sdna(prop, NULL, "previewresxyz");
202         RNA_def_property_range(prop, 1, 100);
203         RNA_def_property_ui_text(prop, "Preview Resolution", "Preview resolution in X,Y and Z direction.");
204
205         prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_NONE);
206         RNA_def_property_float_sdna(prop, NULL, "animStart");
207         RNA_def_property_range(prop, 0, 100);
208         RNA_def_property_ui_text(prop, "Start Time", "Simulation time of the first blender frame.");
209
210         prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_NONE);
211         RNA_def_property_float_sdna(prop, NULL, "animEnd");
212         RNA_def_property_range(prop, 0, 100);
213         RNA_def_property_ui_text(prop, "End Time", "Simulation time of the last blender frame.");
214
215         prop= RNA_def_property(srna, "viewport_display_mode", PROP_ENUM, PROP_NONE);
216         RNA_def_property_enum_sdna(prop, NULL, "guiDisplayMode");
217         RNA_def_property_enum_items(prop, quality_items);
218         RNA_def_property_ui_text(prop, "Viewport Display Mode", "How to display the mesh in the viewport.");
219         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
220
221         prop= RNA_def_property(srna, "render_display_mode", PROP_ENUM, PROP_NONE);
222         RNA_def_property_enum_sdna(prop, NULL, "renderDisplayMode");
223         RNA_def_property_enum_items(prop, quality_items);
224         RNA_def_property_ui_text(prop, "Render Display Mode", "How to display the mesh for rendering.");
225
226         prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE);
227         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
228         RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse fluid frames.");
229
230         prop= RNA_def_property(srna, "path", PROP_STRING, PROP_DIRPATH);
231         RNA_def_property_string_maxlength(prop, 240);
232         RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
233         RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store baked fluid simulation files in.");
234         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
235
236         prop= RNA_def_property(srna, "memory_estimate", PROP_STRING, PROP_NONE);
237         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
238         RNA_def_property_string_funcs(prop, "rna_DomainFluidSettings_memory_estimate_get", "rna_DomainFluidSettings_memory_estimate_length", NULL);
239         RNA_def_property_ui_text(prop, "Memory Estimate", "Estimated amount of memory needed for baking the domain.");
240
241         /* advanced settings */
242
243         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_VECTOR);
244         RNA_def_property_float_sdna(prop, NULL, "gravx");
245         RNA_def_property_array(prop, 3);
246         RNA_def_property_range(prop, -1000.1, 1000.1);
247         RNA_def_property_ui_text(prop, "Gravity", "Gravity in X, Y and Z direction.");
248
249         prop= RNA_def_property(srna, "viscosity_preset", PROP_ENUM, PROP_NONE);
250         RNA_def_property_enum_sdna(prop, NULL, "viscosityMode");
251         RNA_def_property_enum_items(prop, viscosity_items);
252         RNA_def_property_ui_text(prop, "Viscosity Preset", "Set viscosity of the fluid to a preset value, or use manual input.");
253
254         prop= RNA_def_property(srna, "viscosity_base", PROP_FLOAT, PROP_NONE);
255         RNA_def_property_float_sdna(prop, NULL, "viscosityValue");
256         RNA_def_property_range(prop, 0, 10);
257         RNA_def_property_ui_text(prop, "Viscosity Base", "Viscosity setting: value that is multiplied by 10 to the power of (exponent*-1).");
258
259         prop= RNA_def_property(srna, "viscosity_exponent", PROP_INT, PROP_NONE);
260         RNA_def_property_int_sdna(prop, NULL, "viscosityExponent");
261         RNA_def_property_range(prop, 0, 10);
262         RNA_def_property_ui_text(prop, "Viscosity Exponent", "Negative exponent for the viscosity value (to simplify entering small values e.g. 5*10^-6.).");
263
264         prop= RNA_def_property(srna, "real_world_size", PROP_FLOAT, PROP_NONE);
265         RNA_def_property_float_sdna(prop, NULL, "realsize");
266         RNA_def_property_range(prop, 0.001, 10);
267         RNA_def_property_ui_text(prop, "Real World Size", "Size of the simulation domain in metres.");
268
269         prop= RNA_def_property(srna, "grid_levels", PROP_INT, PROP_NONE);
270         RNA_def_property_int_sdna(prop, NULL, "maxRefine");
271         RNA_def_property_range(prop, -1, 4);
272         RNA_def_property_ui_text(prop, "Grid Levels", "Number of coarsened grids to use (-1 for automatic).");
273
274         prop= RNA_def_property(srna, "compressibility", PROP_FLOAT, PROP_NONE);
275         RNA_def_property_float_sdna(prop, NULL, "gstar");
276         RNA_def_property_range(prop, 0.001, 0.1);
277         RNA_def_property_ui_text(prop, "Compressibility", "Allowed compressibility due to gravitational force for standing fluid. (directly affects simulation step size)");
278
279         /* domain boundary settings */
280
281         rna_def_fluidsim_slip(srna);
282
283         prop= RNA_def_property(srna, "surface_smoothing", PROP_FLOAT, PROP_NONE);
284         RNA_def_property_float_sdna(prop, NULL, "surfaceSmoothing");
285         RNA_def_property_range(prop, 0.0, 5.0);
286         RNA_def_property_ui_text(prop, "Surface Smoothing", "Amount of surface smoothing. A value of 0 is off, 1 is normal smoothing and more than 1 is extra smoothing.");
287
288         prop= RNA_def_property(srna, "surface_subdivisions", PROP_INT, PROP_NONE);
289         RNA_def_property_int_sdna(prop, NULL, "surfaceSubdivs");
290         RNA_def_property_range(prop, 0, 5);
291         RNA_def_property_ui_text(prop, "Surface Subdivisions", "Number of isosurface subdivisions. This is necessary for the inclusion of particles into the surface generation. Warning - can lead to longer computation times!");
292
293         prop= RNA_def_property(srna, "generate_speed_vectors", PROP_BOOLEAN, PROP_NONE);
294         RNA_def_property_boolean_negative_sdna(prop, NULL, "domainNovecgen", 0);
295         RNA_def_property_ui_text(prop, "Generate Speed Vectors", "Generate speed vectors for vector blur.");
296
297         /* particles */
298
299         prop= RNA_def_property(srna, "tracer_particles", PROP_INT, PROP_NONE);
300         RNA_def_property_int_sdna(prop, NULL, "generateTracers");
301         RNA_def_property_range(prop, 0, 10000);
302         RNA_def_property_ui_text(prop, "Tracer Particles", "Number of tracer particles to generate");
303
304         prop= RNA_def_property(srna, "generate_particles", PROP_FLOAT, PROP_NONE);
305         RNA_def_property_float_sdna(prop, NULL, "generateParticles");
306         RNA_def_property_range(prop, 0.0, 10.0);
307         RNA_def_property_ui_text(prop, "Generate Particles", "Amount of particles to generate (0=off, 1=normal, >1=more).");
308 }
309
310 static void rna_def_fluidsim_volume(StructRNA *srna)
311 {
312         PropertyRNA *prop;
313
314         static EnumPropertyItem volume_type_items[] = {
315                 {1, "VOLUME", 0, "Volume", "Use only the inner volume of the mesh."},
316                 {2, "SHELL", 0, "Shell", "Use only the outer shell of the mesh."},
317                 {3, "BOTH", 0, "Both", "Use both the inner volume and the outer shell of the mesh."},
318                 {0, NULL, 0, NULL, NULL}};
319
320         prop= RNA_def_property(srna, "volume_initialization", PROP_ENUM, PROP_NONE);
321         RNA_def_property_enum_bitflag_sdna(prop, NULL, "volumeInitType");
322         RNA_def_property_enum_items(prop, volume_type_items);
323         RNA_def_property_ui_text(prop, "Volume Initialization", "Volume initialization type.");
324
325         prop= RNA_def_property(srna, "export_animated_mesh", PROP_BOOLEAN, PROP_NONE);
326         RNA_def_property_boolean_sdna(prop, NULL, "domainNovecgen", 0);
327         RNA_def_property_ui_text(prop, "Export Animated Mesh", "Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it.");
328 }
329
330 static void rna_def_fluidsim_fluid(BlenderRNA *brna)
331 {
332         StructRNA *srna;
333         PropertyRNA *prop;
334
335         srna= RNA_def_struct(brna, "FluidFluidSettings", "FluidSettings");
336         RNA_def_struct_sdna(srna, "FluidsimSettings");
337         RNA_def_struct_ui_text(srna, "Fluid Fluid Simulation Settings", "Fluid simulation settings for the fluid in the simulation.");
338
339         rna_def_fluidsim_volume(srna);
340
341         prop= RNA_def_property(srna, "initial_velocity", PROP_FLOAT, PROP_VECTOR);
342         RNA_def_property_float_sdna(prop, NULL, "iniVelx");
343         RNA_def_property_array(prop, 3);
344         RNA_def_property_range(prop, -1000.1, 1000.1);
345         RNA_def_property_ui_text(prop, "Initial Velocity", "Initial velocity of fluid.");
346 }
347
348 static void rna_def_fluidsim_obstacle(BlenderRNA *brna)
349 {
350         StructRNA *srna;
351         PropertyRNA *prop;
352
353         srna= RNA_def_struct(brna, "ObstacleFluidSettings", "FluidSettings");
354         RNA_def_struct_sdna(srna, "FluidsimSettings");
355         RNA_def_struct_ui_text(srna, "Obstacle Fluid Simulation Settings", "Fluid simulation settings for obstacles in the simulation.");
356
357         rna_def_fluidsim_volume(srna);
358         rna_def_fluidsim_slip(srna);
359
360         prop= RNA_def_property(srna, "impact_factor", PROP_FLOAT, PROP_NONE);
361         RNA_def_property_float_sdna(prop, NULL, "surfaceSmoothing");
362         RNA_def_property_range(prop, -2.0, 10.0);
363         RNA_def_property_ui_text(prop, "Impact Factor", "This is an unphysical value for moving objects - it controls the impact an obstacle has on the fluid, =0 behaves a bit like outflow (deleting fluid), =1 is default, while >1 results in high forces. Can be used to tweak total mass.");
364 }
365
366 static void rna_def_fluidsim_inflow(BlenderRNA *brna)
367 {
368         StructRNA *srna;
369         PropertyRNA *prop;
370
371         srna= RNA_def_struct(brna, "InflowFluidSettings", "FluidSettings");
372         RNA_def_struct_sdna(srna, "FluidsimSettings");
373         RNA_def_struct_ui_text(srna, "Inflow Fluid Simulation Settings", "Fluid simulation settings for objects adding fluids in the simulation.");
374
375         rna_def_fluidsim_volume(srna);
376
377         prop= RNA_def_property(srna, "inflow_velocity", PROP_FLOAT, PROP_VECTOR);
378         RNA_def_property_float_sdna(prop, NULL, "iniVelx");
379         RNA_def_property_array(prop, 3);
380         RNA_def_property_range(prop, -1000.1, 1000.1);
381         RNA_def_property_ui_text(prop, "Inflow Velocity", "Initial velocity of fluid.");
382
383         prop= RNA_def_property(srna, "local_coordinates", PROP_BOOLEAN, PROP_NONE);
384         RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSINFLOW_LOCALCOORD);
385         RNA_def_property_ui_text(prop, "Local Coordinates", "Use local coordinates for inflow. (e.g. for rotating objects)");
386 }
387
388 static void rna_def_fluidsim_outflow(BlenderRNA *brna)
389 {
390         StructRNA *srna;
391
392         srna= RNA_def_struct(brna, "OutflowFluidSettings", "FluidSettings");
393         RNA_def_struct_sdna(srna, "FluidsimSettings");
394         RNA_def_struct_ui_text(srna, "Outflow Fluid Simulation Settings", "Fluid simulation settings for objects removing fluids from the simulation.");
395
396         rna_def_fluidsim_volume(srna);
397 }
398
399 static void rna_def_fluidsim_particle(BlenderRNA *brna)
400 {
401         StructRNA *srna;
402         PropertyRNA *prop;
403
404         srna= RNA_def_struct(brna, "ParticleFluidSettings", "FluidSettings");
405         RNA_def_struct_sdna(srna, "FluidsimSettings");
406         RNA_def_struct_ui_text(srna, "Particle Fluid Simulation Settings", "Fluid simulation settings for objects storing fluid particles generated by the simulation.");
407
408         prop= RNA_def_property(srna, "drops", PROP_BOOLEAN, PROP_NONE);
409         RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSPART_DROP);
410         RNA_def_property_ui_text(prop, "Drops", "Show drop particles.");
411
412         prop= RNA_def_property(srna, "floats", PROP_BOOLEAN, PROP_NONE);
413         RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSPART_FLOAT);
414         RNA_def_property_ui_text(prop, "Floats", "Show floating foam particles.");
415
416         prop= RNA_def_property(srna, "tracer", PROP_BOOLEAN, PROP_NONE);
417         RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSPART_TRACER);
418         RNA_def_property_ui_text(prop, "Tracer", "Show tracer particles.");
419
420         prop= RNA_def_property(srna, "particle_influence", PROP_FLOAT, PROP_NONE);
421         RNA_def_property_float_sdna(prop, NULL, "particleInfSize");
422         RNA_def_property_range(prop, 0.0, 2.0);
423         RNA_def_property_ui_text(prop, "Particle Influence", "Amount of particle size scaling: 0=off (all same size), 1=full (range 0.2-2.0), >1=stronger.");
424
425         prop= RNA_def_property(srna, "alpha_influence", PROP_FLOAT, PROP_NONE);
426         RNA_def_property_float_sdna(prop, NULL, "particleInfAlpha");
427         RNA_def_property_range(prop, 0.0, 2.0);
428         RNA_def_property_ui_text(prop, "Alpha Influence", "Amount of particle alpha change, inverse of size influence: 0=off (all same alpha), 1=full. (large particles get lower alphas, smaller ones higher values)");
429
430         prop= RNA_def_property(srna, "path", PROP_STRING, PROP_DIRPATH);
431         RNA_def_property_string_maxlength(prop, 240);
432         RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
433         RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store and load particles from.");
434         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
435 }
436
437 static void rna_def_fluidsim_control(BlenderRNA *brna)
438 {
439         StructRNA *srna;
440         PropertyRNA *prop;
441
442         srna= RNA_def_struct(brna, "ControlFluidSettings", "FluidSettings");
443         RNA_def_struct_sdna(srna, "FluidsimSettings");
444         RNA_def_struct_ui_text(srna, "Control Fluid Simulation Settings", "Fluid simulation settings for objects controlling the motion of fluid in the simulation.");
445
446         prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_NONE);
447         RNA_def_property_float_sdna(prop, NULL, "cpsTimeStart");
448         RNA_def_property_range(prop, 0.0, 100.0);
449         RNA_def_property_ui_text(prop, "Start Time", "Specifies time when the control particles are activated.");
450         
451         prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_NONE);
452         RNA_def_property_float_sdna(prop, NULL, "cpsTimeEnd");
453         RNA_def_property_range(prop, 0.0, 100.0);
454         RNA_def_property_ui_text(prop, "End Time", "Specifies time when the control particles are deactivated.");
455
456         prop= RNA_def_property(srna, "attraction_strength", PROP_FLOAT, PROP_NONE);
457         RNA_def_property_float_sdna(prop, NULL, "attractforceStrength");
458         RNA_def_property_range(prop, -10.0, 10.0);
459         RNA_def_property_ui_text(prop, "Attraction Strength", "Force strength for directional attraction towards the control object.");
460
461         prop= RNA_def_property(srna, "attraction_radius", PROP_FLOAT, PROP_NONE);
462         RNA_def_property_float_sdna(prop, NULL, "attractforceRadius");
463         RNA_def_property_range(prop, 0.0, 10.0);
464         RNA_def_property_ui_text(prop, "Attraction Radius", "Specifies the force field radius around the control object.");
465         
466         prop= RNA_def_property(srna, "velocity_strength", PROP_FLOAT, PROP_NONE);
467         RNA_def_property_float_sdna(prop, NULL, "velocityforceStrength");
468         RNA_def_property_range(prop, 0.0, 10.0);
469         RNA_def_property_ui_text(prop, "Velocity Strength", "Force strength of how much of the control object's velocity is influencing the fluid velocity.");
470
471         prop= RNA_def_property(srna, "velocity_radius", PROP_FLOAT, PROP_NONE);
472         RNA_def_property_float_sdna(prop, NULL, "velocityforceRadius");
473         RNA_def_property_range(prop, 0.0, 10.0);
474         RNA_def_property_ui_text(prop, "Velocity Radius", "Specifies the force field radius around the control object.");
475
476         prop= RNA_def_property(srna, "quality", PROP_FLOAT, PROP_NONE);
477         RNA_def_property_float_sdna(prop, NULL, "cpsQuality");
478         RNA_def_property_range(prop, 5.0, 100.0);
479         RNA_def_property_ui_text(prop, "Quality", "Specifies the quality which is used for object sampling. (higher = better but slower)");
480
481         prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE);
482         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
483         RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse control object movement.");
484 }
485
486 void RNA_def_fluidsim(BlenderRNA *brna)
487 {
488         StructRNA *srna;
489         PropertyRNA *prop;
490
491         static EnumPropertyItem prop_fluid_type_items[] = {
492                 {OB_FLUIDSIM_ENABLE, "NONE", 0, "None", ""},
493                 {OB_FLUIDSIM_DOMAIN, "DOMAIN", 0, "Domain", "Bounding box of this object represents the computational domain of the fluid simulation."},
494                 {OB_FLUIDSIM_FLUID, "FLUID", 0, "Fluid", "Object represents a volume of fluid in the simulation."},
495                 {OB_FLUIDSIM_OBSTACLE, "OBSTACLE", 0, "Obstacle", "Object is a fixed obstacle."},
496                 {OB_FLUIDSIM_INFLOW, "INFLOW", 0, "Inflow", "Object adds fluid to the simulation."},
497                 {OB_FLUIDSIM_OUTFLOW, "OUTFLOW", 0, "Outflow", "Object removes fluid from the simulation."},
498                 {OB_FLUIDSIM_PARTICLE, "PARTICLE", 0, "Particle", "Object is made a particle system to display particles generated by a fluidsim domain object."},
499                 {OB_FLUIDSIM_CONTROL, "CONTROL", 0, "Control", "Object is made a fluid control mesh, which influences the fluid."},
500                 {0, NULL, 0, NULL, NULL}};
501
502
503         srna= RNA_def_struct(brna, "FluidSettings", NULL);
504         RNA_def_struct_sdna(srna, "FluidsimSettings");
505         RNA_def_struct_refine_func(srna, "rna_FluidSettings_refine");
506         RNA_def_struct_ui_text(srna, "Fluid Simulation Settings", "Fluid simulation settings for an object taking part in the simulation.");
507
508         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
509         RNA_def_property_enum_bitflag_sdna(prop, NULL, "type");
510         RNA_def_property_enum_items(prop, prop_fluid_type_items);
511         RNA_def_property_ui_text(prop, "Type", "Type of participation in the fluid simulation.");
512         RNA_def_property_update(prop, 0, "rna_FluidSettings_update_type");
513
514         //prop= RNA_def_property(srna, "ipo", PROP_POINTER, PROP_NONE);
515         //RNA_def_property_ui_text(prop, "Ipo Curves", "Ipo curves used by fluid simulation settings.");
516
517         /* types */
518
519         rna_def_fluidsim_domain(brna);
520         rna_def_fluidsim_fluid(brna);
521         rna_def_fluidsim_obstacle(brna);
522         rna_def_fluidsim_inflow(brna);
523         rna_def_fluidsim_outflow(brna);
524         rna_def_fluidsim_particle(brna);
525         rna_def_fluidsim_control(brna);
526 }
527
528
529 #endif