Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_dynamicpaint.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): Miika Hämäläinen
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_dynamicpaint.c
24  *  \ingroup RNA
25  */
26
27 #include <stdlib.h>
28 #include <limits.h>
29
30 #include "BLI_math_base.h"
31
32 #include "BKE_modifier.h"
33 #include "BKE_dynamicpaint.h"
34
35 #include "DNA_dynamicpaint_types.h"
36 #include "DNA_modifier_types.h"
37 #include "DNA_object_force.h"
38 #include "DNA_object_types.h"
39 #include "DNA_scene_types.h"
40
41 #include "RNA_define.h"
42 #include "RNA_enum_types.h"
43
44 #include "rna_internal.h"
45
46 #include "WM_types.h"
47
48 EnumPropertyItem rna_enum_prop_dynamicpaint_type_items[] = {
49         {MOD_DYNAMICPAINT_TYPE_CANVAS, "CANVAS", 0, "Canvas", ""},
50         {MOD_DYNAMICPAINT_TYPE_BRUSH, "BRUSH", 0, "Brush", ""},
51         {0, NULL, 0, NULL, NULL}
52 };
53
54
55 #ifdef RNA_RUNTIME
56
57 #include "BKE_context.h"
58 #include "BKE_particle.h"
59
60 #include "DEG_depsgraph.h"
61 #include "DEG_depsgraph_build.h"
62
63 static char *rna_DynamicPaintCanvasSettings_path(PointerRNA *ptr)
64 {
65         DynamicPaintCanvasSettings *settings = (DynamicPaintCanvasSettings *)ptr->data;
66         ModifierData *md = (ModifierData *)settings->pmd;
67         char name_esc[sizeof(md->name) * 2];
68
69         BLI_strescape(name_esc, md->name, sizeof(name_esc));
70         return BLI_sprintfN("modifiers[\"%s\"].canvas_settings", name_esc);
71 }
72
73 static char *rna_DynamicPaintBrushSettings_path(PointerRNA *ptr)
74 {
75         DynamicPaintBrushSettings *settings = (DynamicPaintBrushSettings *)ptr->data;
76         ModifierData *md = (ModifierData *)settings->pmd;
77         char name_esc[sizeof(md->name) * 2];
78
79         BLI_strescape(name_esc, md->name, sizeof(name_esc));
80         return BLI_sprintfN("modifiers[\"%s\"].brush_settings", name_esc);
81 }
82
83 static char *rna_DynamicPaintSurface_path(PointerRNA *ptr)
84 {
85         DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
86         ModifierData *md = (ModifierData *)surface->canvas->pmd;
87         char name_esc[sizeof(md->name) * 2];
88         char name_esc_surface[sizeof(surface->name) * 2];
89
90         BLI_strescape(name_esc, md->name, sizeof(name_esc));
91         BLI_strescape(name_esc_surface, surface->name, sizeof(name_esc_surface));
92         return BLI_sprintfN("modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"]", name_esc, name_esc_surface);
93 }
94
95
96 /*
97  *      Surfaces
98  */
99
100 static void rna_DynamicPaint_redoModifier(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
101 {
102         DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
103 }
104
105 static void rna_DynamicPaintSurfaces_updateFrames(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
106 {
107         dynamicPaint_cacheUpdateFrames((DynamicPaintSurface *)ptr->data);
108 }
109
110 static void rna_DynamicPaintSurface_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
111 {
112         dynamicPaint_resetSurface(scene, (DynamicPaintSurface *)ptr->data);
113         rna_DynamicPaint_redoModifier(bmain, scene, ptr);
114 }
115
116 static void rna_DynamicPaintSurface_initialcolortype(Main *bmain, Scene *scene, PointerRNA *ptr)
117 {
118         DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
119
120         surface->init_layername[0] = '\0';
121         dynamicPaint_clearSurface(scene, surface);
122         rna_DynamicPaint_redoModifier(bmain, scene, ptr);
123 }
124
125 static void rna_DynamicPaintSurface_changePreview(Main *bmain, Scene *scene, PointerRNA *ptr)
126 {
127         DynamicPaintSurface *act_surface = (DynamicPaintSurface *)ptr->data;
128         DynamicPaintSurface *surface = act_surface->canvas->surfaces.first;
129
130         /* since only one color surface can show preview at time
131          *  disable preview on other surfaces*/
132         for (; surface; surface = surface->next) {
133                 if (surface != act_surface)
134                         surface->flags &= ~MOD_DPAINT_PREVIEW;
135         }
136         rna_DynamicPaint_redoModifier(bmain, scene, ptr);
137 }
138
139 static void rna_DynamicPaintSurface_uniqueName(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
140 {
141         dynamicPaintSurface_setUniqueName((DynamicPaintSurface *)ptr->data, ((DynamicPaintSurface *)ptr->data)->name);
142 }
143
144
145 static void rna_DynamicPaintSurface_changeType(Main *bmain, Scene *scene, PointerRNA *ptr)
146 {
147         dynamicPaintSurface_updateType((DynamicPaintSurface *)ptr->data);
148         dynamicPaint_resetSurface(scene, (DynamicPaintSurface *)ptr->data);
149         rna_DynamicPaintSurface_reset(bmain, scene, ptr);
150 }
151
152 static void rna_DynamicPaintSurfaces_changeFormat(Main *bmain, Scene *scene, PointerRNA *ptr)
153 {
154         DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
155
156         surface->type = MOD_DPAINT_SURFACE_T_PAINT;
157         dynamicPaintSurface_updateType((DynamicPaintSurface *)ptr->data);
158         rna_DynamicPaintSurface_reset(bmain, scene, ptr);
159 }
160
161 static void rna_DynamicPaint_reset_dependency(Main *bmain, Scene *scene, PointerRNA *ptr)
162 {
163         rna_DynamicPaintSurface_reset(bmain, scene, ptr);
164         DEG_relations_tag_update(bmain);
165 }
166
167 static PointerRNA rna_PaintSurface_active_get(PointerRNA *ptr)
168 {
169         DynamicPaintCanvasSettings *canvas = (DynamicPaintCanvasSettings *)ptr->data;
170         DynamicPaintSurface *surface = canvas->surfaces.first;
171         int id = 0;
172
173         for (; surface; surface = surface->next) {
174                 if (id == canvas->active_sur)
175                         return rna_pointer_inherit_refine(ptr, &RNA_DynamicPaintSurface, surface);
176                 id++;
177         }
178         return rna_pointer_inherit_refine(ptr, &RNA_DynamicPaintSurface, NULL);
179 }
180
181 static void rna_DynamicPaint_surfaces_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
182 {
183         DynamicPaintCanvasSettings *canvas = (DynamicPaintCanvasSettings *)ptr->data;
184         /*rna_iterator_array_begin(iter, (void *)canvas->surfaces, sizeof(PaintSurface), canvas->totsur, 0, 0); */
185         rna_iterator_listbase_begin(iter, &canvas->surfaces, NULL);
186 }
187
188 static int rna_Surface_active_point_index_get(PointerRNA *ptr)
189 {
190         DynamicPaintCanvasSettings *canvas = (DynamicPaintCanvasSettings *)ptr->data;
191         return canvas->active_sur;
192 }
193
194 static void rna_Surface_active_point_index_set(struct PointerRNA *ptr, int value)
195 {
196         DynamicPaintCanvasSettings *canvas = (DynamicPaintCanvasSettings *)ptr->data;
197         canvas->active_sur = value;
198         return;
199 }
200
201 static void rna_Surface_active_point_range(PointerRNA *ptr, int *min, int *max,
202                                            int *UNUSED(softmin), int *UNUSED(softmax))
203 {
204         DynamicPaintCanvasSettings *canvas = (DynamicPaintCanvasSettings *)ptr->data;
205
206         *min = 0;
207         *max = BLI_listbase_count(&canvas->surfaces) - 1;
208 }
209
210 /* uvlayer */
211 static void rna_DynamicPaint_uvlayer_set(PointerRNA *ptr, const char *value)
212 {
213         DynamicPaintCanvasSettings *canvas = ((DynamicPaintSurface *)ptr->data)->canvas;
214         DynamicPaintSurface *surface = canvas->surfaces.first;
215         int id = 0;
216
217         for (; surface; surface = surface->next) {
218                 if (id == canvas->active_sur) {
219                         rna_object_uvlayer_name_set(ptr, value, surface->uvlayer_name, sizeof(surface->uvlayer_name));
220                         return;
221                 }
222                 id++;
223         }
224 }
225
226 /* is point cache used */
227 static int rna_DynamicPaint_is_cache_user_get(PointerRNA *ptr)
228 {
229         DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
230
231         return (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) ?  1 : 0;
232 }
233
234 /* is some 3D view preview available */
235 static int rna_DynamicPaint_use_color_preview_get(PointerRNA *ptr)
236 {
237         DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
238
239         return dynamicPaint_surfaceHasColorPreview(surface);
240 }
241
242 /* does output layer exist*/
243 static int rna_DynamicPaint_is_output_exists(DynamicPaintSurface *surface, Object *ob, int index)
244 {
245         return dynamicPaint_outputLayerExists(surface, ob, index);
246 }
247
248
249 static EnumPropertyItem *rna_DynamicPaint_surface_type_itemf(
250         bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
251 {
252         DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
253
254         EnumPropertyItem *item = NULL;
255         EnumPropertyItem tmp = {0, "", 0, "", ""};
256         int totitem = 0;
257
258         /* Paint type - available for all formats */
259         tmp.value = MOD_DPAINT_SURFACE_T_PAINT;
260         tmp.identifier = "PAINT";
261         tmp.name = "Paint";
262         tmp.icon = ICON_TPAINT_HLT;
263         RNA_enum_item_add(&item, &totitem, &tmp);
264
265         /* Displace */
266         if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX ||
267             surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
268         {
269                 tmp.value = MOD_DPAINT_SURFACE_T_DISPLACE;
270                 tmp.identifier = "DISPLACE";
271                 tmp.name = "Displace";
272                 tmp.icon = ICON_MOD_DISPLACE;
273                 RNA_enum_item_add(&item, &totitem, &tmp);
274         }
275
276         /* Weight */
277         if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
278                 tmp.value = MOD_DPAINT_SURFACE_T_WEIGHT;
279                 tmp.identifier = "WEIGHT";
280                 tmp.name = "Weight";
281                 tmp.icon = ICON_MOD_VERTEX_WEIGHT;
282                 RNA_enum_item_add(&item, &totitem, &tmp);
283         }
284
285         /* Height waves */
286         {
287                 tmp.value = MOD_DPAINT_SURFACE_T_WAVE;
288                 tmp.identifier = "WAVE";
289                 tmp.name = "Waves";
290                 tmp.icon = ICON_MOD_WAVE;
291                 RNA_enum_item_add(&item, &totitem, &tmp);
292         }
293
294         RNA_enum_item_end(&item, &totitem);
295         *r_free = true;
296
297         return item;
298 }
299
300 #else
301
302 /* canvas.canvas_surfaces */
303 static void rna_def_canvas_surfaces(BlenderRNA *brna, PropertyRNA *cprop)
304 {
305         StructRNA *srna;
306         PropertyRNA *prop;
307
308         RNA_def_property_srna(cprop, "DynamicPaintSurfaces");
309         srna = RNA_def_struct(brna, "DynamicPaintSurfaces", NULL);
310         RNA_def_struct_sdna(srna, "DynamicPaintCanvasSettings");
311         RNA_def_struct_ui_text(srna, "Canvas Surfaces", "Collection of Dynamic Paint Canvas surfaces");
312
313         prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
314         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
315         RNA_def_property_int_funcs(prop, "rna_Surface_active_point_index_get", "rna_Surface_active_point_index_set",
316                                    "rna_Surface_active_point_range");
317         RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
318
319         prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
320         RNA_def_property_struct_type(prop, "DynamicPaintSurface");
321         RNA_def_property_pointer_funcs(prop, "rna_PaintSurface_active_get", NULL, NULL, NULL);
322         RNA_def_property_ui_text(prop, "Active Surface", "Active Dynamic Paint surface being displayed");
323         RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
324 }
325
326
327 static void rna_def_canvas_surface(BlenderRNA *brna)
328 {
329         StructRNA *srna;
330         PropertyRNA *prop;
331         PropertyRNA *parm;
332         FunctionRNA *func;
333
334         /*  Surface format */
335         static EnumPropertyItem prop_dynamicpaint_surface_format[] = {
336                 /*{MOD_DPAINT_SURFACE_F_PTEX, "PTEX", ICON_TEXTURE_SHADED, "Ptex", ""}, */
337                 {MOD_DPAINT_SURFACE_F_VERTEX, "VERTEX", ICON_OUTLINER_DATA_MESH, "Vertex", ""},
338                 {MOD_DPAINT_SURFACE_F_IMAGESEQ, "IMAGE", ICON_FILE_IMAGE, "Image Sequence", ""},
339                 {0, NULL, 0, NULL, NULL}
340         };
341
342         /*  Surface type - generated dynamically based on surface format */
343         static EnumPropertyItem prop_dynamicpaint_surface_type[] = {
344                 {MOD_DPAINT_SURFACE_T_PAINT, "PAINT", 0, "Paint", ""},
345                 {0, NULL, 0, NULL, NULL}
346         };
347
348         /*  Surface output preview. currently only paint has multiple outputs */
349         static EnumPropertyItem prop_dynamicpaint_surface_preview[] = {
350                 {MOD_DPAINT_SURFACE_PREV_PAINT, "PAINT", 0, "Paint", ""},
351                 {MOD_DPAINT_SURFACE_PREV_WETMAP, "WETMAP", 0, "Wetmap", ""},
352                 {0, NULL, 0, NULL, NULL}
353         };
354
355         /*  Initial color setting */
356         static EnumPropertyItem prop_dynamicpaint_init_color_type[] = {
357                 {MOD_DPAINT_INITIAL_NONE, "NONE", 0, "None", ""},
358                 {MOD_DPAINT_INITIAL_COLOR, "COLOR", ICON_COLOR, "Color", ""},
359                 {MOD_DPAINT_INITIAL_TEXTURE, "TEXTURE", ICON_TEXTURE, "UV Texture", ""},
360                 {MOD_DPAINT_INITIAL_VERTEXCOLOR, "VERTEX_COLOR", ICON_GROUP_VCOL, "Vertex Color", ""},
361                 {0, NULL, 0, NULL, NULL}
362         };
363
364         /*  Effect type
365          *   Only used by ui to view per effect settings */
366         static EnumPropertyItem prop_dynamicpaint_effecttype[] = {
367                 {1, "SPREAD", 0, "Spread", ""},
368                 {2, "DRIP", 0, "Drip", ""},
369                 {3, "SHRINK", 0, "Shrink", ""},
370                 {0, NULL, 0, NULL, NULL}
371         };
372
373         /* Displacemap file format */
374         static EnumPropertyItem prop_dynamicpaint_image_fileformat[] = {
375                 {MOD_DPAINT_IMGFORMAT_PNG, "PNG", 0, "PNG", ""},
376 #ifdef WITH_OPENEXR
377                 {MOD_DPAINT_IMGFORMAT_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
378 #endif
379                 {0, NULL, 0, NULL, NULL}
380         };
381
382         /* Displacemap type */
383         static EnumPropertyItem prop_dynamicpaint_displace_type[] = {
384                 {MOD_DPAINT_DISP_DISPLACE, "DISPLACE", 0, "Displacement", ""},
385                 {MOD_DPAINT_DISP_DEPTH, "DEPTH", 0, "Depth", ""},
386                 {0, NULL, 0, NULL, NULL}
387         };
388
389
390
391         /* Surface */
392         srna = RNA_def_struct(brna, "DynamicPaintSurface", NULL);
393         RNA_def_struct_sdna(srna, "DynamicPaintSurface");
394         RNA_def_struct_ui_text(srna, "Paint Surface", "A canvas surface layer");
395         RNA_def_struct_path_func(srna, "rna_DynamicPaintSurface_path");
396
397         prop = RNA_def_property(srna, "surface_format", PROP_ENUM, PROP_NONE);
398         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
399         RNA_def_property_enum_sdna(prop, NULL, "format");
400         RNA_def_property_enum_items(prop, prop_dynamicpaint_surface_format);
401         RNA_def_property_ui_text(prop, "Format", "Surface Format");
402         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurfaces_changeFormat");
403
404         prop = RNA_def_property(srna, "surface_type", PROP_ENUM, PROP_NONE);
405         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
406         RNA_def_property_enum_sdna(prop, NULL, "type");
407         RNA_def_property_enum_items(prop, prop_dynamicpaint_surface_type);
408         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DynamicPaint_surface_type_itemf");
409         RNA_def_property_ui_text(prop, "Surface Type", "Surface Type");
410         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_changeType");
411
412         prop = RNA_def_property(srna, "is_active", PROP_BOOLEAN, PROP_NONE);
413         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ACTIVE);
414         RNA_def_property_ui_text(prop, "Is Active", "Toggle whether surface is processed or ignored");
415         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
416
417         prop = RNA_def_property(srna, "show_preview", PROP_BOOLEAN, PROP_NONE);
418         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PREVIEW);
419         RNA_def_property_ui_text(prop, "Show Preview", "Display surface preview in 3D-views");
420         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_changePreview");
421
422         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
423         RNA_def_property_ui_text(prop, "Name", "Surface name");
424         RNA_def_property_update(prop, NC_OBJECT, "rna_DynamicPaintSurface_uniqueName");
425         RNA_def_struct_name_property(srna, prop);
426
427         prop = RNA_def_property(srna, "brush_group", PROP_POINTER, PROP_NONE);
428         RNA_def_property_struct_type(prop, "Group");
429         RNA_def_property_flag(prop, PROP_EDITABLE);
430         RNA_def_property_ui_text(prop, "Brush Group", "Only use brush objects from this group");
431         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_reset_dependency");
432
433
434         /*
435          *   Paint, wet and displace
436          */
437
438         prop = RNA_def_property(srna, "use_dissolve", PROP_BOOLEAN, PROP_NONE);
439         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISSOLVE);
440         RNA_def_property_ui_text(prop, "Dissolve", "Enable to make surface changes disappear over time");
441         
442         prop = RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
443         RNA_def_property_int_sdna(prop, NULL, "diss_speed");
444         RNA_def_property_range(prop, 1.0, 10000.0);
445         RNA_def_property_ui_range(prop, 1.0, 10000.0, 5, -1);
446         RNA_def_property_ui_text(prop, "Dissolve Speed", "Approximately in how many frames should dissolve happen");
447
448         prop = RNA_def_property(srna, "use_drying", PROP_BOOLEAN, PROP_NONE);
449         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_USE_DRYING);
450         RNA_def_property_ui_text(prop, "Dry", "Enable to make surface wetness dry over time");
451         
452         prop = RNA_def_property(srna, "dry_speed", PROP_INT, PROP_NONE);
453         RNA_def_property_range(prop, 1.0, 10000.0);
454         RNA_def_property_ui_range(prop, 1.0, 10000.0, 5, -1);
455         RNA_def_property_ui_text(prop, "Dry Speed", "Approximately in how many frames should drying happen");
456         
457         /*
458          *   Simulation settings
459          */
460         prop = RNA_def_property(srna, "image_resolution", PROP_INT, PROP_NONE);
461         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
462         RNA_def_property_range(prop, 16.0, 4096.0);
463         RNA_def_property_ui_range(prop, 16.0, 4096.0, 1, -1);
464         RNA_def_property_ui_text(prop, "Resolution", "Output image resolution");
465         
466         prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
467         RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
468         RNA_def_property_ui_text(prop, "UV Map", "UV map name");
469         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DynamicPaint_uvlayer_set");
470         
471         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
472         RNA_def_property_int_sdna(prop, NULL, "start_frame");
473         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
474         RNA_def_property_range(prop, 1.0, MAXFRAMEF);
475         RNA_def_property_ui_range(prop, 1.0, 9999, 1, -1);
476         RNA_def_property_ui_text(prop, "Start Frame", "Simulation start frame");
477         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurfaces_updateFrames");
478         
479         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
480         RNA_def_property_int_sdna(prop, NULL, "end_frame");
481         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
482         RNA_def_property_range(prop, 1.0, MAXFRAMEF);
483         RNA_def_property_ui_range(prop, 1.0, 9999.0, 1, -1);
484         RNA_def_property_ui_text(prop, "End Frame", "Simulation end frame");
485         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurfaces_updateFrames");
486         
487         prop = RNA_def_property(srna, "frame_substeps", PROP_INT, PROP_NONE);
488         RNA_def_property_int_sdna(prop, NULL, "substeps");
489         RNA_def_property_range(prop, 0.0, 20.0);
490         RNA_def_property_ui_range(prop, 0.0, 10, 1, -1);
491         RNA_def_property_ui_text(prop, "Sub-Steps", "Do extra frames between scene frames to ensure smooth motion");
492         
493         prop = RNA_def_property(srna, "use_antialiasing", PROP_BOOLEAN, PROP_NONE);
494         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
495         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ANTIALIAS);
496         RNA_def_property_ui_text(prop, "Anti-aliasing", "Use 5x multisampling to smooth paint edges");
497         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
498
499         prop = RNA_def_property(srna, "brush_influence_scale", PROP_FLOAT, PROP_FACTOR);
500         RNA_def_property_float_sdna(prop, NULL, "influence_scale");
501         RNA_def_property_range(prop, 0.0, 1.0);
502         RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2);
503         RNA_def_property_ui_text(prop, "Influence Scale", "Adjust influence brush objects have on this surface");
504         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
505
506         prop = RNA_def_property(srna, "brush_radius_scale", PROP_FLOAT, PROP_FACTOR);
507         RNA_def_property_float_sdna(prop, NULL, "radius_scale");
508         RNA_def_property_range(prop, 0.0, 10.0);
509         RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2);
510         RNA_def_property_ui_text(prop, "Radius Scale", "Adjust radius of proximity brushes or particles for this surface");
511         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
512
513         /*
514          *      Initial Color
515          */
516
517         prop = RNA_def_property(srna, "init_color_type", PROP_ENUM, PROP_NONE);
518         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
519         RNA_def_property_enum_items(prop, prop_dynamicpaint_init_color_type);
520         RNA_def_property_ui_text(prop, "Initial Color", "");
521         RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_DRAW | ND_MODIFIER, "rna_DynamicPaintSurface_initialcolortype");
522
523         prop = RNA_def_property(srna, "init_color", PROP_FLOAT, PROP_COLOR_GAMMA);
524         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
525         RNA_def_property_array(prop, 4);
526         RNA_def_property_ui_text(prop, "Color", "Initial color of the surface");
527         RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_DRAW | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
528
529         prop = RNA_def_property(srna, "init_texture", PROP_POINTER, PROP_NONE);
530         RNA_def_property_flag(prop, PROP_EDITABLE);
531         RNA_def_property_ui_text(prop, "Texture", "");
532         RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_DRAW | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
533
534         prop = RNA_def_property(srna, "init_layername", PROP_STRING, PROP_NONE);
535         RNA_def_property_ui_text(prop, "Data Layer", "");
536         RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_DRAW | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
537
538         /*
539          *   Effect Settings
540          */
541         prop = RNA_def_property(srna, "effect_ui", PROP_ENUM, PROP_NONE);
542         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
543         RNA_def_property_enum_items(prop, prop_dynamicpaint_effecttype);
544         RNA_def_property_ui_text(prop, "Effect Type", "");
545         
546         prop = RNA_def_property(srna, "use_dry_log", PROP_BOOLEAN, PROP_NONE);
547         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DRY_LOG);
548         RNA_def_property_ui_text(prop, "Slow", "Use logarithmic drying (makes high values to dry faster than low values)");
549
550         prop = RNA_def_property(srna, "use_dissolve_log", PROP_BOOLEAN, PROP_NONE);
551         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISSOLVE_LOG);
552         RNA_def_property_ui_text(prop, "Slow",
553                                  "Use logarithmic dissolve (makes high values to fade faster than low values)");
554         
555         prop = RNA_def_property(srna, "use_spread", PROP_BOOLEAN, PROP_NONE);
556         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
557         RNA_def_property_boolean_sdna(prop, NULL, "effect", MOD_DPAINT_EFFECT_DO_SPREAD);
558         RNA_def_property_ui_text(prop, "Use Spread", "Process spread effect (spread wet paint around surface)");
559         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
560         
561         prop = RNA_def_property(srna, "spread_speed", PROP_FLOAT, PROP_NONE);
562         RNA_def_property_float_sdna(prop, NULL, "spread_speed");
563         RNA_def_property_range(prop, 0.001, 10.0);
564         RNA_def_property_ui_range(prop, 0.01, 5.0, 1, 2);
565         RNA_def_property_ui_text(prop, "Spread Speed", "How fast spread effect moves on the canvas surface");
566
567         prop = RNA_def_property(srna, "color_dry_threshold", PROP_FLOAT, PROP_FACTOR);
568         RNA_def_property_float_sdna(prop, NULL, "color_dry_threshold");
569         RNA_def_property_range(prop, 0.0, 1.0);
570         RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2);
571         RNA_def_property_ui_text(prop, "Color Dry", "The wetness level when colors start to shift to the background");
572
573         prop = RNA_def_property(srna, "color_spread_speed", PROP_FLOAT, PROP_NONE);
574         RNA_def_property_float_sdna(prop, NULL, "color_spread_speed");
575         RNA_def_property_range(prop, 0.0, 2.0);
576         RNA_def_property_ui_range(prop, 0.0, 2.0, 1, 2);
577         RNA_def_property_ui_text(prop, "Color Spread", "How fast colors get mixed within wet paint");
578         
579         prop = RNA_def_property(srna, "use_drip", PROP_BOOLEAN, PROP_NONE);
580         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
581         RNA_def_property_boolean_sdna(prop, NULL, "effect", MOD_DPAINT_EFFECT_DO_DRIP);
582         RNA_def_property_ui_text(prop, "Use Drip", "Process drip effect (drip wet paint to gravity direction)");
583         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
584         
585         prop = RNA_def_property(srna, "use_shrink", PROP_BOOLEAN, PROP_NONE);
586         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
587         RNA_def_property_boolean_sdna(prop, NULL, "effect", MOD_DPAINT_EFFECT_DO_SHRINK);
588         RNA_def_property_ui_text(prop, "Use Shrink", "Process shrink effect (shrink paint areas)");
589         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
590         
591         prop = RNA_def_property(srna, "shrink_speed", PROP_FLOAT, PROP_NONE);
592         RNA_def_property_float_sdna(prop, NULL, "shrink_speed");
593         RNA_def_property_range(prop, 0.001, 10.0);
594         RNA_def_property_ui_range(prop, 0.01, 5.0, 1, 2);
595         RNA_def_property_ui_text(prop, "Shrink Speed", "How fast shrink effect moves on the canvas surface");
596
597         prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
598         RNA_def_property_struct_type(prop, "EffectorWeights");
599         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
600         RNA_def_property_ui_text(prop, "Effector Weights", "");
601
602         prop = RNA_def_property(srna, "drip_velocity", PROP_FLOAT, PROP_NONE);
603         RNA_def_property_float_sdna(prop, NULL, "drip_vel");
604         RNA_def_property_range(prop, -200.0f, 200.0f);
605         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
606         RNA_def_property_ui_text(prop, "Velocity", "How much surface velocity affects dripping");
607
608         prop = RNA_def_property(srna, "drip_acceleration", PROP_FLOAT, PROP_NONE);
609         RNA_def_property_float_sdna(prop, NULL, "drip_acc");
610         RNA_def_property_range(prop, -200.0f, 200.0f);
611         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
612         RNA_def_property_ui_text(prop, "Acceleration", "How much surface acceleration affects dripping");
613
614         /*
615          *   Output settings
616          */
617         prop = RNA_def_property(srna, "use_premultiply", PROP_BOOLEAN, PROP_NONE);
618         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
619         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_MULALPHA);
620         RNA_def_property_ui_text(prop, "Premultiply alpha", "Multiply color by alpha (recommended for Blender input)");
621         
622         prop = RNA_def_property(srna, "image_output_path", PROP_STRING, PROP_DIRPATH);
623         RNA_def_property_string_sdna(prop, NULL, "image_output_path");
624         RNA_def_property_ui_text(prop, "Output Path", "Directory to save the textures");
625
626         /* output for primary surface data */
627         prop = RNA_def_property(srna, "output_name_a", PROP_STRING, PROP_NONE);
628         RNA_def_property_string_sdna(prop, NULL, "output_name");
629         RNA_def_property_ui_text(prop, "Output Name", "Name used to save output from this surface");
630
631         prop = RNA_def_property(srna, "use_output_a", PROP_BOOLEAN, PROP_NONE);
632         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT1);
633         RNA_def_property_ui_text(prop, "Use Output", "Save this output layer");
634
635         /* output for secondary sufrace data */
636         prop = RNA_def_property(srna, "output_name_b", PROP_STRING, PROP_NONE);
637         RNA_def_property_string_sdna(prop, NULL, "output_name2");
638         RNA_def_property_ui_text(prop, "Output Name", "Name used to save output from this surface");
639
640         prop = RNA_def_property(srna, "use_output_b", PROP_BOOLEAN, PROP_NONE);
641         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT2);
642         RNA_def_property_ui_text(prop, "Use Output", "Save this output layer");
643
644         prop = RNA_def_property(srna, "preview_id", PROP_ENUM, PROP_NONE);
645         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
646         RNA_def_property_enum_sdna(prop, NULL, "preview_id");
647         RNA_def_property_enum_items(prop, prop_dynamicpaint_surface_preview);
648         RNA_def_property_ui_text(prop, "Preview", "");
649         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
650
651         /* to check if output name exists */
652         func = RNA_def_function(srna, "output_exists", "rna_DynamicPaint_is_output_exists");
653         RNA_def_function_ui_description(func, "Checks if surface output layer of given name exists");
654         parm = RNA_def_pointer(func, "object", "Object", "", "");
655         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
656         parm = RNA_def_int(func, "index", 0, 0, 1, "Index", "", 0, 1);
657         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
658         /* return type */
659         parm = RNA_def_boolean(func, "exists", 0, "", "");
660         RNA_def_function_return(func, parm);
661         
662         prop = RNA_def_property(srna, "depth_clamp", PROP_FLOAT, PROP_NONE);
663         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
664         RNA_def_property_range(prop, 0.00, 50.0);
665         RNA_def_property_ui_range(prop, 0.00, 5.0, 1, 2);
666         RNA_def_property_ui_text(prop, "Max Displace",
667                                  "Maximum level of depth intersection in object space (use 0.0 to disable)");
668         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
669
670         prop = RNA_def_property(srna, "displace_factor", PROP_FLOAT, PROP_NONE);
671         RNA_def_property_float_sdna(prop, NULL, "disp_factor");
672         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
673         RNA_def_property_range(prop, -50.0, 50.0);
674         RNA_def_property_ui_range(prop, -5.0, 5.0, 1, 2);
675         RNA_def_property_ui_text(prop, "Displace Factor", "Strength of displace when applied to the mesh");
676         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
677         
678         prop = RNA_def_property(srna, "image_fileformat", PROP_ENUM, PROP_NONE);
679         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
680         RNA_def_property_enum_items(prop, prop_dynamicpaint_image_fileformat);
681         RNA_def_property_ui_text(prop, "File Format", "");
682         
683         prop = RNA_def_property(srna, "displace_type", PROP_ENUM, PROP_NONE);
684         RNA_def_property_enum_sdna(prop, NULL, "disp_type");
685         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
686         RNA_def_property_enum_items(prop, prop_dynamicpaint_displace_type);
687         RNA_def_property_ui_text(prop, "Data Type", "");
688
689         prop = RNA_def_property(srna, "use_incremental_displace", PROP_BOOLEAN, PROP_NONE);
690         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
691         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISP_INCREMENTAL);
692         RNA_def_property_ui_text(prop, "Incremental", "New displace is added cumulatively on top of existing");
693         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaintSurface_reset");
694
695         /* wave simulator settings */
696         prop = RNA_def_property(srna, "wave_damping", PROP_FLOAT, PROP_NONE);
697         RNA_def_property_range(prop, 0.0, 1.0);
698         RNA_def_property_ui_range(prop, 0.01, 1.0, 1, 2);
699         RNA_def_property_ui_text(prop, "Damping", "Wave damping factor");
700
701         prop = RNA_def_property(srna, "wave_speed", PROP_FLOAT, PROP_NONE);
702         RNA_def_property_range(prop, 0.01, 5.0);
703         RNA_def_property_ui_range(prop, 0.20, 4.0, 1, 2);
704         RNA_def_property_ui_text(prop, "Speed", "Wave propagation speed");
705
706         prop = RNA_def_property(srna, "wave_timescale", PROP_FLOAT, PROP_NONE);
707         RNA_def_property_range(prop, 0.01, 3.0);
708         RNA_def_property_ui_range(prop, 0.01, 1.5, 1, 2);
709         RNA_def_property_ui_text(prop, "Timescale", "Wave time scaling factor");
710
711         prop = RNA_def_property(srna, "wave_spring", PROP_FLOAT, PROP_NONE);
712         RNA_def_property_range(prop, 0.0, 1.0);
713         RNA_def_property_ui_range(prop, 0.01, 1.0, 1, 2);
714         RNA_def_property_ui_text(prop, "Spring", "Spring force that pulls water level back to zero");
715
716         prop = RNA_def_property(srna, "wave_smoothness", PROP_FLOAT, PROP_NONE);
717         RNA_def_property_range(prop, 0.0, 10.0);
718         RNA_def_property_ui_range(prop, 0.1, 5.0, 1, 2);
719         RNA_def_property_ui_text(prop, "Smoothness", "Limit maximum steepness of wave slope between simulation points "
720                                                      "(use higher values for smoother waves at expense of reduced detail)");
721
722         prop = RNA_def_property(srna, "use_wave_open_border", PROP_BOOLEAN, PROP_NONE);
723         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_WAVE_OPEN_BORDERS);
724         RNA_def_property_ui_text(prop, "Open Borders", "Pass waves through mesh edges");
725
726         
727         /* cache */
728         prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
729         RNA_def_property_flag(prop, PROP_NEVER_NULL);
730         RNA_def_property_pointer_sdna(prop, NULL, "pointcache");
731         RNA_def_property_ui_text(prop, "Point Cache", "");
732
733         /* is cache used */
734         prop = RNA_def_property(srna, "is_cache_user", PROP_BOOLEAN, PROP_NONE);
735         RNA_def_property_boolean_funcs(prop, "rna_DynamicPaint_is_cache_user_get", NULL);
736         RNA_def_property_ui_text(prop, "Use Cache", "");
737         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
738
739         /* whether this surface has preview data for 3D view */
740         RNA_define_verify_sdna(false);
741         prop = RNA_def_property(srna, "use_color_preview", PROP_BOOLEAN, PROP_NONE);
742         RNA_def_property_boolean_funcs(prop, "rna_DynamicPaint_use_color_preview_get", NULL);
743         RNA_def_property_ui_text(prop, "Use Color Preview", "Whether this surface has some color preview for 3D view");
744         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
745         RNA_define_verify_sdna(true);
746 }
747
748 static void rna_def_dynamic_paint_canvas_settings(BlenderRNA *brna)
749 {
750         StructRNA *srna;
751         PropertyRNA *prop;
752
753         srna = RNA_def_struct(brna, "DynamicPaintCanvasSettings", NULL);
754         RNA_def_struct_ui_text(srna, "Canvas Settings", "Dynamic Paint canvas settings");
755         RNA_def_struct_sdna(srna, "DynamicPaintCanvasSettings");
756         RNA_def_struct_path_func(srna, "rna_DynamicPaintCanvasSettings_path");
757
758         /*
759          *      Surface Slots
760          */
761         prop = RNA_def_property(srna, "canvas_surfaces", PROP_COLLECTION, PROP_NONE);
762         RNA_def_property_collection_funcs(prop, "rna_DynamicPaint_surfaces_begin", "rna_iterator_listbase_next",
763                                           "rna_iterator_listbase_end", "rna_iterator_listbase_get",
764                                           NULL, NULL, NULL, NULL);
765         RNA_def_property_struct_type(prop, "DynamicPaintSurface");
766         RNA_def_property_ui_text(prop, "Paint Surface List", "Paint surface list");
767         rna_def_canvas_surfaces(brna, prop);
768 }
769
770 static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
771 {
772         StructRNA *srna;
773         PropertyRNA *prop;
774
775         /* paint collision type */
776         static EnumPropertyItem prop_dynamicpaint_collisiontype[] = {
777                 {MOD_DPAINT_COL_PSYS, "PARTICLE_SYSTEM", ICON_PARTICLES, "Particle System", ""},
778                 {MOD_DPAINT_COL_POINT, "POINT", ICON_META_EMPTY, "Object Center", ""},
779                 {MOD_DPAINT_COL_DIST, "DISTANCE", ICON_META_EMPTY, "Proximity", ""},
780                 {MOD_DPAINT_COL_VOLDIST, "VOLUME_DISTANCE", ICON_META_CUBE, "Mesh Volume + Proximity", ""},
781                 {MOD_DPAINT_COL_VOLUME, "VOLUME", ICON_MESH_CUBE, "Mesh Volume", ""},
782                 {0, NULL, 0, NULL, NULL}
783         };
784
785         static EnumPropertyItem prop_dynamicpaint_prox_falloff[] = {
786                 {MOD_DPAINT_PRFALL_SMOOTH, "SMOOTH", ICON_SPHERECURVE, "Smooth", ""},
787                 {MOD_DPAINT_PRFALL_CONSTANT, "CONSTANT", ICON_NOCURVE, "Constant", ""},
788                 {MOD_DPAINT_PRFALL_RAMP, "RAMP", ICON_COLOR, "Color Ramp", ""},
789                 {0, NULL, 0, NULL, NULL}
790         };
791
792         static EnumPropertyItem prop_dynamicpaint_brush_wave_type[] = {
793                 {MOD_DPAINT_WAVEB_CHANGE, "CHANGE", 0, "Depth Change", ""},
794                 {MOD_DPAINT_WAVEB_DEPTH, "DEPTH", 0, "Obstacle", ""},
795                 {MOD_DPAINT_WAVEB_FORCE, "FORCE", 0, "Force", ""},
796                 {MOD_DPAINT_WAVEB_REFLECT, "REFLECT", 0, "Reflect Only", ""},
797                 {0, NULL, 0, NULL, NULL}
798         };
799
800         static EnumPropertyItem prop_dynamicpaint_brush_ray_dir[] = {
801                 {MOD_DPAINT_RAY_CANVAS, "CANVAS", 0, "Canvas Normal", ""},
802                 {MOD_DPAINT_RAY_BRUSH_AVG, "BRUSH", 0, "Brush Normal", ""},
803                 {MOD_DPAINT_RAY_ZPLUS, "Z_AXIS", 0, "Z-Axis", ""},
804                 {0, NULL, 0, NULL, NULL}
805         };
806
807         srna = RNA_def_struct(brna, "DynamicPaintBrushSettings", NULL);
808         RNA_def_struct_ui_text(srna, "Brush Settings", "Brush settings");
809         RNA_def_struct_sdna(srna, "DynamicPaintBrushSettings");
810         RNA_def_struct_path_func(srna, "rna_DynamicPaintBrushSettings_path");
811
812         /*
813          *   Paint
814          */
815         prop = RNA_def_property(srna, "paint_color", PROP_FLOAT, PROP_COLOR_GAMMA);
816         RNA_def_property_float_sdna(prop, NULL, "r");
817         RNA_def_property_array(prop, 3);
818         RNA_def_property_ui_text(prop, "Paint Color", "Color of the paint");
819         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
820
821         prop = RNA_def_property(srna, "paint_alpha", PROP_FLOAT, PROP_NONE);
822         RNA_def_property_float_sdna(prop, NULL, "alpha");
823         RNA_def_property_range(prop, 0.0, 1.0);
824         RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
825         RNA_def_property_ui_text(prop, "Paint Alpha", "Paint alpha");
826         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
827         
828         prop = RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
829         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_USE_MATERIAL);
830         RNA_def_property_ui_text(prop, "Use object material", "Use object material to define color and influence");
831         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
832
833         prop = RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
834         RNA_def_property_pointer_sdna(prop, NULL, "mat");
835         RNA_def_property_ui_text(prop, "Material",
836                                  "Material to use (if not defined, material linked to the mesh is used)");
837         RNA_def_property_flag(prop, PROP_EDITABLE);
838         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
839         
840         prop = RNA_def_property(srna, "use_absolute_alpha", PROP_BOOLEAN, PROP_NONE);
841         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ABS_ALPHA);
842         RNA_def_property_ui_text(prop, "Absolute Alpha",
843                                  "Only increase alpha value if paint alpha is higher than existing");
844         
845         prop = RNA_def_property(srna, "paint_wetness", PROP_FLOAT, PROP_NONE);
846         RNA_def_property_float_sdna(prop, NULL, "wetness");
847         RNA_def_property_range(prop, 0.0, 1.0);
848         RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
849         RNA_def_property_ui_text(prop, "Paint Wetness",
850                                  "Paint wetness, visible in wetmap (some effects only affect wet paint)");
851         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
852         
853         prop = RNA_def_property(srna, "use_paint_erase", PROP_BOOLEAN, PROP_NONE);
854         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ERASE);
855         RNA_def_property_ui_text(prop, "Erase Paint", "Erase / remove paint instead of adding it");
856         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
857
858         prop = RNA_def_property(srna, "wave_type", PROP_ENUM, PROP_NONE);
859         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
860         RNA_def_property_enum_items(prop, prop_dynamicpaint_brush_wave_type);
861         RNA_def_property_ui_text(prop, "Wave Type", "");
862
863         prop = RNA_def_property(srna, "wave_factor", PROP_FLOAT, PROP_NONE);
864         RNA_def_property_range(prop, -2.0, 2.0);
865         RNA_def_property_ui_range(prop, -1.0, 1.0, 5, 2);
866         RNA_def_property_ui_text(prop, "Factor", "Multiplier for wave influence of this brush");
867
868         prop = RNA_def_property(srna, "wave_clamp", PROP_FLOAT, PROP_NONE);
869         RNA_def_property_range(prop, 0.00, 50.0);
870         RNA_def_property_ui_range(prop, 0.00, 5.0, 1, 2);
871         RNA_def_property_ui_text(prop, "Clamp Waves",
872                                  "Maximum level of surface intersection used to influence waves (use 0.0 to disable)");
873
874         prop = RNA_def_property(srna, "use_smudge", PROP_BOOLEAN, PROP_NONE);
875         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DO_SMUDGE);
876         RNA_def_property_ui_text(prop, "Do Smudge", "Make this brush to smudge existing paint as it moves");
877
878         prop = RNA_def_property(srna, "smudge_strength", PROP_FLOAT, PROP_NONE);
879         RNA_def_property_range(prop, 0.0, 1.0);
880         RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
881         RNA_def_property_ui_text(prop, "Smudge Strength", "Smudge effect strength");
882
883         prop = RNA_def_property(srna, "velocity_max", PROP_FLOAT, PROP_NONE);
884         RNA_def_property_float_sdna(prop, NULL, "max_velocity");
885         RNA_def_property_range(prop, 0.0001, 10.0);
886         RNA_def_property_ui_range(prop, 0.1, 2.0, 5, 2);
887         RNA_def_property_ui_text(prop, "Max Velocity",
888                                  "Velocity considered as maximum influence (Blender units per frame)");
889
890         prop = RNA_def_property(srna, "use_velocity_alpha", PROP_BOOLEAN, PROP_NONE);
891         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_ALPHA);
892         RNA_def_property_ui_text(prop, "Multiply Alpha", "Multiply brush influence by velocity color ramp alpha");
893         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
894
895         prop = RNA_def_property(srna, "use_velocity_depth", PROP_BOOLEAN, PROP_NONE);
896         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_DEPTH);
897         RNA_def_property_ui_text(prop, "Multiply Depth",
898                                  "Multiply brush intersection depth (displace, waves) by velocity ramp alpha");
899         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
900
901         prop = RNA_def_property(srna, "use_velocity_color", PROP_BOOLEAN, PROP_NONE);
902         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_COLOR);
903         RNA_def_property_ui_text(prop, "Replace Color", "Replace brush color by velocity color ramp");
904         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
905         
906         /*
907          *   Paint Area / Collision
908          */
909         prop = RNA_def_property(srna, "paint_source", PROP_ENUM, PROP_NONE);
910         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
911         RNA_def_property_enum_sdna(prop, NULL, "collision");
912         RNA_def_property_enum_items(prop, prop_dynamicpaint_collisiontype);
913         RNA_def_property_ui_text(prop, "Paint Source", "");
914         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
915         
916         prop = RNA_def_property(srna, "paint_distance", PROP_FLOAT, PROP_NONE);
917         RNA_def_property_float_sdna(prop, NULL, "paint_distance");
918         RNA_def_property_range(prop, 0.0, 500.0);
919         RNA_def_property_ui_range(prop, 0.0, 500.0, 10, 3);
920         RNA_def_property_ui_text(prop, "Proximity Distance",
921                                  "Maximum distance from brush to mesh surface to affect paint");
922         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
923         
924         prop = RNA_def_property(srna, "use_proximity_ramp_alpha", PROP_BOOLEAN, PROP_NONE);
925         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_RAMP_ALPHA);
926         RNA_def_property_ui_text(prop, "Only Use Alpha", "Only read color ramp alpha");
927         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
928         
929         prop = RNA_def_property(srna, "proximity_falloff", PROP_ENUM, PROP_NONE);
930         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
931         RNA_def_property_enum_sdna(prop, NULL, "proximity_falloff");
932         RNA_def_property_enum_items(prop, prop_dynamicpaint_prox_falloff);
933         RNA_def_property_ui_text(prop, "Falloff", "Proximity falloff type");
934         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
935         
936         prop = RNA_def_property(srna, "use_proximity_project", PROP_BOOLEAN, PROP_NONE);
937         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PROX_PROJECT);
938         RNA_def_property_ui_text(prop, "Project",
939                                  "Brush is projected to canvas from defined direction within brush proximity");
940         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
941
942         prop = RNA_def_property(srna, "ray_direction", PROP_ENUM, PROP_NONE);
943         RNA_def_property_enum_sdna(prop, NULL, "ray_dir");
944         RNA_def_property_enum_items(prop, prop_dynamicpaint_brush_ray_dir);
945         RNA_def_property_ui_text(prop, "Ray Direction",
946                                  "Ray direction to use for projection (if brush object is located in that direction "
947                                  "it's painted)");
948         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
949
950         prop = RNA_def_property(srna, "invert_proximity", PROP_BOOLEAN, PROP_NONE);
951         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_INVERSE_PROX);
952         RNA_def_property_ui_text(prop, "Inner Proximity", "Proximity falloff is applied inside the volume");
953         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
954
955         prop = RNA_def_property(srna, "use_negative_volume", PROP_BOOLEAN, PROP_NONE);
956         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_NEGATE_VOLUME);
957         RNA_def_property_ui_text(prop, "Negate Volume", "Negate influence inside the volume");
958         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
959         
960
961         /*
962          *   Particle
963          */
964         prop = RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
965         RNA_def_property_pointer_sdna(prop, NULL, "psys");
966         RNA_def_property_struct_type(prop, "ParticleSystem");
967         RNA_def_property_flag(prop, PROP_EDITABLE);
968         RNA_def_property_ui_text(prop, "Particle Systems", "The particle system to paint with");
969         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_reset_dependency");
970
971         
972         prop = RNA_def_property(srna, "use_particle_radius", PROP_BOOLEAN, PROP_NONE);
973         RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PART_RAD);
974         RNA_def_property_ui_text(prop, "Use Particle Radius", "Use radius from particle settings");
975         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
976         
977         prop = RNA_def_property(srna, "solid_radius", PROP_FLOAT, PROP_NONE);
978         RNA_def_property_float_sdna(prop, NULL, "particle_radius");
979         RNA_def_property_range(prop, 0.01, 10.0);
980         RNA_def_property_ui_range(prop, 0.01, 2.0, 5, 3);
981         RNA_def_property_ui_text(prop, "Solid Radius", "Radius that will be painted solid");
982         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
983
984         prop = RNA_def_property(srna, "smooth_radius", PROP_FLOAT, PROP_NONE);
985         RNA_def_property_float_sdna(prop, NULL, "particle_smooth");
986         RNA_def_property_range(prop, 0.0, 10.0);
987         RNA_def_property_ui_range(prop, 0.0, 1.0, 5, -1);
988         RNA_def_property_ui_text(prop, "Smooth Radius", "Smooth falloff added after solid radius");
989         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
990         
991
992         /*
993          * Color ramps
994          */
995         prop = RNA_def_property(srna, "paint_ramp", PROP_POINTER, PROP_NONE);
996         RNA_def_property_pointer_sdna(prop, NULL, "paint_ramp");
997         RNA_def_property_struct_type(prop, "ColorRamp");
998         RNA_def_property_ui_text(prop, "Paint Color Ramp", "Color ramp used to define proximity falloff");
999         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
1000
1001         prop = RNA_def_property(srna, "velocity_ramp", PROP_POINTER, PROP_NONE);
1002         RNA_def_property_pointer_sdna(prop, NULL, "vel_ramp");
1003         RNA_def_property_struct_type(prop, "ColorRamp");
1004         RNA_def_property_ui_text(prop, "Velocity Color Ramp", "Color ramp used to define brush velocity effect");
1005         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
1006 }
1007
1008 void RNA_def_dynamic_paint(BlenderRNA *brna)
1009 {
1010         rna_def_dynamic_paint_canvas_settings(brna);
1011         rna_def_dynamic_paint_brush_settings(brna);
1012         rna_def_canvas_surface(brna);
1013 }
1014
1015 #endif