97f6b902c46c034b16b4e4459edc3123bd89706a
[blender-staging.git] / source / blender / makesrna / intern / rna_brush.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Blender Foundation (2008), Juho Veps�l�inen
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/makesrna/intern/rna_brush.c
26  *  \ingroup RNA
27  */
28
29
30 #include <stdlib.h>
31 #include <assert.h>
32
33 #include "RNA_define.h"
34
35 #include "rna_internal.h"
36
37 #include "DNA_brush_types.h"
38 #include "DNA_texture_types.h"
39 #include "DNA_scene_types.h"
40 #include "DNA_object_types.h"
41
42 #include "BLI_math.h"
43
44 #include "IMB_imbuf.h"
45
46 #include "WM_types.h"
47
48 static EnumPropertyItem prop_direction_items[]= {
49         {0, "ADD", 0, "Add", "Add effect of brush"},
50         {BRUSH_DIR_IN, "SUBTRACT", 0, "Subtract", "Subtract effect of brush"},
51         {0, NULL, 0, NULL, NULL}};
52
53 EnumPropertyItem brush_sculpt_tool_items[] = {
54         {SCULPT_TOOL_BLOB, "BLOB", ICON_BRUSH_BLOB, "Blob", ""},
55         {SCULPT_TOOL_CLAY, "CLAY", ICON_BRUSH_CLAY, "Clay", ""},
56         {SCULPT_TOOL_CREASE, "CREASE",ICON_BRUSH_CREASE, "Crease", ""},
57         {SCULPT_TOOL_DRAW, "DRAW", ICON_BRUSH_SCULPT_DRAW, "Draw", ""},
58         {SCULPT_TOOL_FILL, "FILL", ICON_BRUSH_FILL, "Fill", ""},
59         {SCULPT_TOOL_FLATTEN, "FLATTEN", ICON_BRUSH_FLATTEN, "Flatten", ""},
60         {SCULPT_TOOL_GRAB, "GRAB", ICON_BRUSH_GRAB, "Grab", ""},
61         {SCULPT_TOOL_INFLATE, "INFLATE", ICON_BRUSH_INFLATE, "Inflate", ""},
62         {SCULPT_TOOL_LAYER, "LAYER", ICON_BRUSH_LAYER, "Layer", ""},
63         {SCULPT_TOOL_NUDGE, "NUDGE", ICON_BRUSH_NUDGE, "Nudge", ""},
64         {SCULPT_TOOL_PINCH, "PINCH", ICON_BRUSH_PINCH, "Pinch", ""},
65         {SCULPT_TOOL_ROTATE, "ROTATE", ICON_BRUSH_ROTATE, "Rotate", ""},
66         {SCULPT_TOOL_SCRAPE, "SCRAPE", ICON_BRUSH_SCRAPE, "Scrape", ""},
67         {SCULPT_TOOL_SMOOTH, "SMOOTH", ICON_BRUSH_SMOOTH, "Smooth", ""},
68         {SCULPT_TOOL_SNAKE_HOOK, "SNAKE_HOOK", ICON_BRUSH_SNAKE_HOOK, "Snake Hook", ""},
69         {SCULPT_TOOL_THUMB, "THUMB", ICON_BRUSH_THUMB, "Thumb", ""},
70         {0, NULL, 0, NULL, NULL}};
71
72
73 EnumPropertyItem brush_vertex_tool_items[] = {
74         {0, "MIX", ICON_BRUSH_MIX, "Mix", "Use mix blending mode while painting"},
75         {1, "ADD", ICON_BRUSH_ADD, "Add", "Use add blending mode while painting"},
76         {2, "SUB", ICON_BRUSH_SUBTRACT, "Subtract", "Use subtract blending mode while painting"},
77         {3, "MUL", ICON_BRUSH_MULTIPLY, "Multiply", "Use multiply blending mode while painting"},
78         {4, "BLUR", ICON_BRUSH_BLUR, "Blur", "Blur the color with surrounding values"},
79         {5, "LIGHTEN", ICON_BRUSH_LIGHTEN, "Lighten", "Use lighten blending mode while painting"},
80         {6, "DARKEN", ICON_BRUSH_DARKEN, "Darken", "Use darken blending mode while painting"},
81         {0, NULL, 0, NULL, NULL}};
82         
83 EnumPropertyItem brush_image_tool_items[] = {
84         {PAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_TEXDRAW, "Draw", ""},
85         {PAINT_TOOL_SOFTEN, "SOFTEN", ICON_BRUSH_SOFTEN, "Soften", ""},
86         {PAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_SMEAR, "Smear", ""},
87         {PAINT_TOOL_CLONE, "CLONE", ICON_BRUSH_CLONE, "Clone", ""},
88         {0, NULL, 0, NULL, NULL}};
89
90 #ifdef RNA_RUNTIME
91
92 #include "MEM_guardedalloc.h"
93
94 #include "DNA_object_types.h"
95
96 #include "RNA_access.h"
97
98 #include "BKE_texture.h"
99 #include "BKE_brush.h"
100 #include "BKE_icons.h"
101 #include "BKE_paint.h"
102
103 #include "WM_api.h"
104
105 static void rna_Brush_reset_icon(Brush *br, const char *UNUSED(type))
106 {
107         ID *id = &br->id;
108
109         if(br->flag & BRUSH_CUSTOM_ICON)
110                 return;
111
112         if(id->icon_id >= BIFICONID_LAST) {
113                 BKE_icon_delete(id);
114                 BKE_previewimg_free_id(id);
115         }
116
117         id->icon_id = 0;
118 }
119
120 static void rna_Brush_update(Main *bmain, Scene *scene, PointerRNA *ptr)
121 {
122         Brush *br= (Brush*)ptr->data;
123         WM_main_add_notifier(NC_BRUSH|NA_EDITED, br);
124         //WM_main_add_notifier(NC_SPACE|ND_SPACE_VIEW3D, NULL);
125 }
126
127 static void rna_Brush_sculpt_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
128 {
129         Brush *br= (Brush*)ptr->data;
130         rna_Brush_reset_icon(br, "sculpt");
131         rna_Brush_update(bmain, scene, ptr);
132 }
133  
134 static void rna_Brush_vertex_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
135 {
136         Brush *br= (Brush*)ptr->data;
137         rna_Brush_reset_icon(br, "vertex_paint");
138         rna_Brush_update(bmain, scene, ptr);
139 }
140  
141 static void rna_Brush_imagepaint_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
142 {
143         Brush *br= (Brush*)ptr->data;
144         rna_Brush_reset_icon(br, "image_paint");
145         rna_Brush_update(bmain, scene, ptr);
146 }
147
148 static void rna_Brush_icon_update(Main *bmain, Scene *scene, PointerRNA *ptr)
149 {
150         Brush *br= (Brush*)ptr->data;
151
152         if(br->icon_imbuf) {
153                 IMB_freeImBuf(br->icon_imbuf);
154                 br->icon_imbuf= NULL;
155         }
156
157         br->id.icon_id = 0;
158
159         if(br->flag & BRUSH_CUSTOM_ICON) {
160                 BKE_previewimg_get(&br->id);
161                 BKE_icon_changed(BKE_icon_getid(&br->id));
162         }
163
164         WM_main_add_notifier(NC_BRUSH|NA_EDITED, br);
165 }
166
167 static void rna_Brush_set_size(PointerRNA *ptr, int value)
168 {
169         Brush* me = (Brush*)(ptr->data);
170
171         // set unprojected radius, so they remain consistent
172         double size= (double)brush_size(me);
173         float unprojected_radius = 0.0f;
174         assert(size != 0); // paranoia: sanity checks during load and rna make sure we don't divide by zero here
175         unprojected_radius= (float)(brush_unprojected_radius(me) * (double)value / size);
176         brush_set_unprojected_radius(me, unprojected_radius);
177
178         brush_set_size(me, value);
179 }
180
181 static int rna_Brush_get_size(PointerRNA *ptr)
182 {
183         Brush* me = (Brush*)(ptr->data);
184         return brush_size(me);
185 }
186
187 static void rna_Brush_set_use_locked_size(PointerRNA *ptr, int value)
188 {
189         Brush* me = (Brush*)(ptr->data);
190         brush_set_use_locked_size(me, value);
191 }
192
193 static int rna_Brush_get_use_locked_size(PointerRNA *ptr)
194 {
195         Brush* me = (Brush*)(ptr->data);
196         return brush_use_locked_size(me);
197 }
198
199 static void rna_Brush_set_use_size_pressure(PointerRNA *ptr, int value)
200 {
201         Brush* me = (Brush*)(ptr->data);
202         brush_set_use_size_pressure(me, value);
203 }
204
205 static int rna_Brush_get_use_size_pressure(PointerRNA *ptr)
206 {
207         Brush* me = (Brush*)(ptr->data);
208         return brush_use_size_pressure(me);
209 }
210
211 static void rna_Brush_set_use_alpha_pressure(PointerRNA *ptr, int value)
212 {
213         Brush* me = (Brush*)(ptr->data);
214         brush_set_use_alpha_pressure(me, value);
215 }
216
217 static int rna_Brush_get_use_alpha_pressure(PointerRNA *ptr)
218 {
219         Brush* me = (Brush*)(ptr->data);
220         return brush_use_alpha_pressure(me);
221 }
222
223 static void rna_Brush_set_unprojected_radius(PointerRNA *ptr, float value)
224 {
225         Brush* me = (Brush*)(ptr->data);
226
227         // set size, so they remain consistent
228         double unprojected_radius= (double)brush_unprojected_radius(me);
229         int size = 0;
230         assert(unprojected_radius != 0); // paranoia: sanity checks during load and rna make sure we don't divide by zero here
231         size= (int)((double)brush_size(me) * (double)value / unprojected_radius);
232         brush_set_size(me, size);
233
234         brush_set_unprojected_radius(me, value);
235 }
236
237 static float rna_Brush_get_unprojected_radius(PointerRNA *ptr)
238 {
239         Brush* me = (Brush*)(ptr->data);
240         return brush_unprojected_radius(me);
241 }
242
243 static void rna_Brush_set_alpha(PointerRNA *ptr, float value)
244 {
245         Brush* me = (Brush*)(ptr->data);
246         brush_set_alpha(me, value);
247 }
248
249 static float rna_Brush_get_alpha(PointerRNA *ptr)
250 {
251         Brush* me = (Brush*)(ptr->data);
252         return brush_alpha(me);
253 }
254
255 static EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free)
256 {
257         static EnumPropertyItem prop_default_items[]= {
258                 {0, NULL, 0, NULL, NULL}};
259
260         static EnumPropertyItem prop_flatten_contrast_items[]= {
261                 {0, "FLATTEN", 0, "Flatten", "Add effect of brush"},
262                 {BRUSH_DIR_IN, "CONTRAST", 0, "Contrast", "Subtract effect of brush"},
263                 {0, NULL, 0, NULL, NULL}};
264
265         static EnumPropertyItem prop_fill_deepen_items[]= {
266                 {0, "FILL", 0, "Fill", "Add effect of brush"},
267                 {BRUSH_DIR_IN, "DEEPEN", 0, "Deepen", "Subtract effect of brush"},
268                 {0, NULL, 0, NULL, NULL}};
269
270         static EnumPropertyItem prop_scrape_peaks_items[]= {
271                 {0, "SCRAPE", 0, "Scrape", "Add effect of brush"},
272                 {BRUSH_DIR_IN, "PEAKS", 0, "Peaks", "Subtract effect of brush"},
273                 {0, NULL, 0, NULL, NULL}};
274
275         static EnumPropertyItem prop_pinch_magnify_items[]= {
276                 {0, "PINCH", 0, "Pinch", "Add effect of brush"},
277                 {BRUSH_DIR_IN, "MAGNIFY", 0, "Magnify", "Subtract effect of brush"},
278                 {0, NULL, 0, NULL, NULL}};
279
280         static EnumPropertyItem prop_inflate_deflate_items[]= {
281                 {0, "INFLATE", 0, "Inflate", "Add effect of brush"},
282                 {BRUSH_DIR_IN, "DEFLATE", 0, "Deflate", "Subtract effect of brush"},
283                 {0, NULL, 0, NULL, NULL}};
284
285         Brush *me= (Brush*)(ptr->data);
286
287         switch (me->sculpt_tool) {
288                 case SCULPT_TOOL_DRAW:
289                 case SCULPT_TOOL_CREASE:
290                 case SCULPT_TOOL_BLOB:
291                 case SCULPT_TOOL_LAYER:
292                 case SCULPT_TOOL_CLAY:
293                         return prop_direction_items;
294
295                 case SCULPT_TOOL_FLATTEN:
296                         return prop_flatten_contrast_items;
297
298                 case SCULPT_TOOL_FILL:
299                         return prop_fill_deepen_items;
300
301                 case SCULPT_TOOL_SCRAPE:
302                         return prop_scrape_peaks_items;
303
304                 case SCULPT_TOOL_PINCH:
305                         return prop_pinch_magnify_items;
306
307                 case SCULPT_TOOL_INFLATE:
308                         return prop_inflate_deflate_items;
309
310                 default:
311                         return prop_default_items;
312         }
313 }
314
315 #else
316
317 static void rna_def_brush_texture_slot(BlenderRNA *brna)
318 {
319         StructRNA *srna;
320         PropertyRNA *prop;
321
322         static EnumPropertyItem prop_map_mode_items[] = {
323                 {MTEX_MAP_MODE_FIXED, "FIXED", 0, "Fixed", ""},
324                 {MTEX_MAP_MODE_TILED, "TILED", 0, "Tiled", ""},
325                 {MTEX_MAP_MODE_3D, "3D", 0, "3D", ""},
326                 {0, NULL, 0, NULL, NULL}};
327
328         srna= RNA_def_struct(brna, "BrushTextureSlot", "TextureSlot");
329         RNA_def_struct_sdna(srna, "MTex");
330         RNA_def_struct_ui_text(srna, "Brush Texture Slot", "Texture slot for textures in a Brush datablock");
331
332         prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
333         RNA_def_property_float_sdna(prop, NULL, "rot");
334         RNA_def_property_range(prop, 0, M_PI*2);
335         RNA_def_property_ui_text(prop, "Angle", "Defines brush texture rotation");
336         RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
337
338         prop= RNA_def_property(srna, "map_mode", PROP_ENUM, PROP_NONE);
339         RNA_def_property_enum_sdna(prop, NULL, "brush_map_mode");
340         RNA_def_property_enum_items(prop, prop_map_mode_items);
341         RNA_def_property_ui_text(prop, "Mode", "");
342         RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
343 }
344
345 static void rna_def_brush(BlenderRNA *brna)
346 {
347         StructRNA *srna;
348         PropertyRNA *prop;
349         
350         static EnumPropertyItem prop_blend_items[] = {
351                 {IMB_BLEND_MIX, "MIX", 0, "Mix", "Use mix blending mode while painting"},
352                 {IMB_BLEND_ADD, "ADD", 0, "Add", "Use add blending mode while painting"},
353                 {IMB_BLEND_SUB, "SUB", 0, "Subtract", "Use subtract blending mode while painting"},
354                 {IMB_BLEND_MUL, "MUL", 0, "Multiply", "Use multiply blending mode while painting"},
355                 {IMB_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting"},
356                 {IMB_BLEND_DARKEN, "DARKEN", 0, "Darken", "Use darken blending mode while painting"},
357                 {IMB_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting"},
358                 {IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
359                 {0, NULL, 0, NULL, NULL}};
360         
361         static EnumPropertyItem brush_stroke_method_items[] = {
362                 {0, "DOTS", 0, "Dots", "Apply paint on each mouse move step"},
363                 {BRUSH_RESTORE_MESH, "DRAG_DOT", 0, "Drag Dot", "Allows a single dot to be carefully positioned"},
364                 {BRUSH_SPACE, "SPACE", 0, "Space", "Limit brush application to the distance specified by spacing"},
365                 {BRUSH_ANCHORED, "ANCHORED", 0, "Anchored", "Keep the brush anchored to the initial location"},
366                 {BRUSH_AIRBRUSH, "AIRBRUSH", 0, "Airbrush", "Keep applying paint effect while holding mouse (spray)"},
367                 {0, NULL, 0, NULL, NULL}};
368
369         static EnumPropertyItem texture_angle_source_items[] = {
370                 {0, "USER", 0, "User", "Rotate the brush texture by given angle"},
371                 {BRUSH_RAKE, "RAKE", 0, "Rake", "Rotate the brush texture to match the stroke direction"},
372                 {BRUSH_RANDOM_ROTATION, "RANDOM", 0, "Random", "Rotate the brush texture at random"},
373                 {0, NULL, 0, NULL, NULL}};
374
375         static EnumPropertyItem texture_angle_source_no_random_items[] = {
376                 {0, "USER", 0, "User", "Rotate the brush texture by given angle"},
377                 {BRUSH_RAKE, "RAKE", 0, "Rake", "Rotate the brush texture to match the stroke direction"},
378                 {0, NULL, 0, NULL, NULL}};
379
380         static EnumPropertyItem brush_sculpt_plane_items[] = {
381                 {SCULPT_DISP_DIR_AREA, "AREA", 0, "Area Plane", ""},
382                 {SCULPT_DISP_DIR_VIEW, "VIEW", 0, "View Plane", ""},
383                 {SCULPT_DISP_DIR_X, "X", 0, "X Plane", ""},
384                 {SCULPT_DISP_DIR_Y, "Y", 0, "Y Plane", ""},
385                 {SCULPT_DISP_DIR_Z, "Z", 0, "Z Plane", ""},
386                 {0, NULL, 0, NULL, NULL}};
387
388         srna= RNA_def_struct(brna, "Brush", "ID");
389         RNA_def_struct_ui_text(srna, "Brush", "Brush datablock for storing brush settings for painting and sculpting");
390         RNA_def_struct_ui_icon(srna, ICON_BRUSH_DATA);
391
392         /* enums */
393         prop= RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
394         RNA_def_property_enum_items(prop, prop_blend_items);
395         RNA_def_property_ui_text(prop, "Blending mode", "Brush blending mode");
396         RNA_def_property_update(prop, 0, "rna_Brush_update");
397
398         prop= RNA_def_property(srna, "sculpt_tool", PROP_ENUM, PROP_NONE);
399         RNA_def_property_enum_items(prop, brush_sculpt_tool_items);
400         RNA_def_property_ui_text(prop, "Sculpt Tool", "");
401         RNA_def_property_update(prop, 0, "rna_Brush_sculpt_tool_update");
402
403         prop= RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE);
404         RNA_def_property_enum_sdna(prop, NULL, "vertexpaint_tool");
405         RNA_def_property_enum_items(prop, brush_vertex_tool_items);
406         RNA_def_property_ui_text(prop, "Vertex/Weight Paint Tool", "");
407         RNA_def_property_update(prop, 0, "rna_Brush_vertex_tool_update");
408         
409         prop= RNA_def_property(srna, "image_tool", PROP_ENUM, PROP_NONE);
410         RNA_def_property_enum_sdna(prop, NULL, "imagepaint_tool");
411         RNA_def_property_enum_items(prop, brush_image_tool_items);
412         RNA_def_property_ui_text(prop, "Image Paint Tool", "");
413         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_imagepaint_tool_update");
414
415         prop= RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
416         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
417         RNA_def_property_enum_items(prop, prop_direction_items);
418         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Brush_direction_itemf");
419         RNA_def_property_ui_text(prop, "Direction", "");
420         RNA_def_property_update(prop, 0, "rna_Brush_update");
421
422         prop= RNA_def_property(srna, "stroke_method", PROP_ENUM, PROP_NONE);
423         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
424         RNA_def_property_enum_items(prop, brush_stroke_method_items);
425         RNA_def_property_ui_text(prop, "Stroke Method", "");
426         RNA_def_property_update(prop, 0, "rna_Brush_update");
427
428         prop= RNA_def_property(srna, "texture_angle_source_random", PROP_ENUM, PROP_NONE);
429         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
430         RNA_def_property_enum_items(prop, texture_angle_source_items);
431         RNA_def_property_ui_text(prop, "Texture Angle Source", "");
432         RNA_def_property_update(prop, 0, "rna_Brush_update");
433
434         prop= RNA_def_property(srna, "texture_angle_source_no_random", PROP_ENUM, PROP_NONE);
435         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
436         RNA_def_property_enum_items(prop, texture_angle_source_no_random_items);
437         RNA_def_property_ui_text(prop, "Texture Angle Source", "");
438         RNA_def_property_update(prop, 0, "rna_Brush_update");
439
440         prop= RNA_def_property(srna, "sculpt_plane", PROP_ENUM, PROP_NONE);
441         RNA_def_property_enum_items(prop, brush_sculpt_plane_items);
442         RNA_def_property_ui_text(prop, "Sculpt Plane", "");
443         RNA_def_property_update(prop, 0, "rna_Brush_update");
444         
445         /* number values */
446         prop= RNA_def_property(srna, "size", PROP_INT, PROP_DISTANCE);
447         RNA_def_property_int_funcs(prop, "rna_Brush_get_size", "rna_Brush_set_size", NULL);
448         RNA_def_property_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS*10);
449         RNA_def_property_ui_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS, 1, 0);
450         RNA_def_property_ui_text(prop, "Radius", "Radius of the brush in pixels");
451         RNA_def_property_update(prop, 0, "rna_Brush_update");
452         
453         prop= RNA_def_property(srna, "unprojected_radius", PROP_FLOAT, PROP_DISTANCE);
454         RNA_def_property_float_funcs(prop, "rna_Brush_get_unprojected_radius", "rna_Brush_set_unprojected_radius", NULL);
455         RNA_def_property_range(prop, 0.001, FLT_MAX);
456         RNA_def_property_ui_range(prop, 0.001, 1, 0, 0);
457         RNA_def_property_ui_text(prop, "Unprojected Radius", "Radius of brush in Blender units");
458         RNA_def_property_update(prop, 0, "rna_Brush_update");
459
460         prop= RNA_def_property(srna, "jitter", PROP_FLOAT, PROP_NONE);
461         RNA_def_property_float_sdna(prop, NULL, "jitter");
462         RNA_def_property_range(prop, 0.0f, 1.0f);
463         RNA_def_property_ui_text(prop, "Jitter", "Jitter the position of the brush while painting");
464         RNA_def_property_update(prop, 0, "rna_Brush_update");
465
466         prop= RNA_def_property(srna, "spacing", PROP_INT, PROP_PERCENTAGE);
467         RNA_def_property_int_sdna(prop, NULL, "spacing");
468         RNA_def_property_range(prop, 1, 1000);
469         RNA_def_property_ui_range(prop, 1, 500, 5, 0);
470         RNA_def_property_ui_text(prop, "Spacing", "Spacing between brush daubs as a percentage of brush diameter");
471         RNA_def_property_update(prop, 0, "rna_Brush_update");
472
473         prop= RNA_def_property(srna, "smooth_stroke_radius", PROP_INT, PROP_DISTANCE);
474         RNA_def_property_range(prop, 10, 200);
475         RNA_def_property_ui_text(prop, "Smooth Stroke Radius", "Minimum distance from last point before stroke continues");
476         RNA_def_property_update(prop, 0, "rna_Brush_update");
477
478         prop= RNA_def_property(srna, "smooth_stroke_factor", PROP_FLOAT, PROP_FACTOR);
479         RNA_def_property_range(prop, 0.5, 0.99);
480         RNA_def_property_ui_text(prop, "Smooth Stroke Factor", "Higher values give a smoother stroke");
481         RNA_def_property_update(prop, 0, "rna_Brush_update");
482         
483         prop= RNA_def_property(srna, "rate", PROP_FLOAT, PROP_NONE);
484         RNA_def_property_float_sdna(prop, NULL, "rate");
485         RNA_def_property_range(prop, 0.0001f , 10000.0f);
486         RNA_def_property_ui_range(prop, 0.01f, 1.0f, 1, 3);
487         RNA_def_property_ui_text(prop, "Rate", "Interval between paints for Airbrush");
488         RNA_def_property_update(prop, 0, "rna_Brush_update");
489         
490         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
491         RNA_def_property_range(prop, 0.0, 1.0);
492         RNA_def_property_float_sdna(prop, NULL, "rgb");
493         RNA_def_property_ui_text(prop, "Color", "");
494         RNA_def_property_update(prop, 0, "rna_Brush_update");
495         
496         prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_FACTOR);
497         RNA_def_property_float_sdna(prop, NULL, "alpha");
498         RNA_def_property_float_funcs(prop, "rna_Brush_get_alpha", "rna_Brush_set_alpha", NULL);
499         RNA_def_property_float_default(prop, 0.5f);
500         RNA_def_property_range(prop, 0.0f, 10.0f);
501         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 0.001);
502         RNA_def_property_ui_text(prop, "Strength", "How powerful the effect of the brush is when applied");
503         RNA_def_property_update(prop, 0, "rna_Brush_update");
504
505         prop= RNA_def_property(srna, "plane_offset", PROP_FLOAT, PROP_DISTANCE);
506         RNA_def_property_float_sdna(prop, NULL, "plane_offset");
507         RNA_def_property_float_default(prop, 0);
508         RNA_def_property_range(prop, -2.0f, 2.0f);
509         RNA_def_property_ui_range(prop, -0.5f, 0.5f, 0.001, 0.001);
510         RNA_def_property_ui_text(prop, "Plane Offset", "Adjusts plane on which the brush acts towards or away from the object surface");
511         RNA_def_property_update(prop, 0, "rna_Brush_update");
512
513         prop= RNA_def_property(srna, "plane_trim", PROP_FLOAT, PROP_DISTANCE);
514         RNA_def_property_float_sdna(prop, NULL, "plane_trim");
515         RNA_def_property_float_default(prop, 0.5f);
516         RNA_def_property_range(prop, 0, 1.0f);
517         RNA_def_property_ui_text(prop, "Plane Trim", "If a vertex is further from offset plane than this then it is not affected");
518         RNA_def_property_update(prop, 0, "rna_Brush_update");
519
520         prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
521         RNA_def_property_float_sdna(prop, NULL, "height");
522         RNA_def_property_float_default(prop, 0.5f);
523         RNA_def_property_range(prop, 0, 1.0f);
524         RNA_def_property_ui_text(prop, "Brush Height", "Affectable height of brush (layer height for layer tool, i.e.)");
525         RNA_def_property_update(prop, 0, "rna_Brush_update");
526
527         prop= RNA_def_property(srna, "texture_sample_bias", PROP_FLOAT, PROP_DISTANCE);
528         RNA_def_property_float_sdna(prop, NULL, "texture_sample_bias");
529         RNA_def_property_float_default(prop, 0);
530         RNA_def_property_range(prop, -1, 1);
531         RNA_def_property_ui_text(prop, "Texture Sample Bias", "Value added to texture samples");
532         RNA_def_property_update(prop, 0, "rna_Brush_update");
533
534         prop= RNA_def_property(srna, "normal_weight", PROP_FLOAT, PROP_FACTOR);
535         RNA_def_property_float_sdna(prop, NULL, "normal_weight");
536         RNA_def_property_float_default(prop, 0);
537         RNA_def_property_range(prop, 0.0f, 1.0f);
538         RNA_def_property_ui_text(prop, "Normal Weight", "How much grab will pull vertexes out of surface during a grab");
539         RNA_def_property_update(prop, 0, "rna_Brush_update");
540
541         prop= RNA_def_property(srna, "crease_pinch_factor", PROP_FLOAT, PROP_FACTOR);
542         RNA_def_property_float_sdna(prop, NULL, "crease_pinch_factor");
543         RNA_def_property_float_default(prop, 2.0f/3.0f);
544         RNA_def_property_range(prop, 0.0f, 1.0f);
545         RNA_def_property_ui_text(prop, "Crease Brush Pinch Factor", "How much the crease brush pinches");
546         RNA_def_property_update(prop, 0, "rna_Brush_update");
547
548         prop= RNA_def_property(srna, "auto_smooth_factor", PROP_FLOAT, PROP_FACTOR);
549         RNA_def_property_float_sdna(prop, NULL, "autosmooth_factor");
550         RNA_def_property_float_default(prop, 0);
551         RNA_def_property_range(prop, 0.0f, 1.0f);
552         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 0.001);
553         RNA_def_property_ui_text(prop, "Autosmooth", "Amount of smoothing to automatically apply to each stroke");
554         RNA_def_property_update(prop, 0, "rna_Brush_update");
555
556         /* flag */
557         prop= RNA_def_property(srna, "use_airbrush", PROP_BOOLEAN, PROP_NONE);
558         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_AIRBRUSH);
559         RNA_def_property_ui_text(prop, "Airbrush", "Keep applying paint effect while holding mouse (spray)");
560         RNA_def_property_update(prop, 0, "rna_Brush_update");
561         
562         prop= RNA_def_property(srna, "use_original_normal", PROP_BOOLEAN, PROP_NONE);
563         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ORIGINAL_NORMAL);
564         RNA_def_property_ui_text(prop, "Original Normal", "When locked keep using normal of surface where stroke was initiated");
565         RNA_def_property_update(prop, 0, "rna_Brush_update");
566         
567         prop= RNA_def_property(srna, "use_wrap", PROP_BOOLEAN, PROP_NONE);
568         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_TORUS);
569         RNA_def_property_ui_text(prop, "Wrap", "Enable torus wrapping while painting");
570         RNA_def_property_update(prop, 0, "rna_Brush_update");
571         
572         prop= RNA_def_property(srna, "use_pressure_strength", PROP_BOOLEAN, PROP_NONE);
573         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ALPHA_PRESSURE);
574         RNA_def_property_boolean_funcs(prop, "rna_Brush_get_use_alpha_pressure", "rna_Brush_set_use_alpha_pressure");
575         RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
576         RNA_def_property_ui_text(prop, "Strength Pressure", "Enable tablet pressure sensitivity for strength");
577         RNA_def_property_update(prop, 0, "rna_Brush_update");
578         
579         prop= RNA_def_property(srna, "use_offset_pressure", PROP_BOOLEAN, PROP_NONE);
580         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_OFFSET_PRESSURE);
581         RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
582         RNA_def_property_ui_text(prop, "Plane Offset Pressure", "Enable tablet pressure sensitivity for offset");
583         RNA_def_property_update(prop, 0, "rna_Brush_update");
584
585         prop= RNA_def_property(srna, "use_pressure_size", PROP_BOOLEAN, PROP_NONE);
586         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SIZE_PRESSURE);
587         RNA_def_property_boolean_funcs(prop, "rna_Brush_get_use_size_pressure", "rna_Brush_set_use_size_pressure");
588         RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
589         RNA_def_property_ui_text(prop, "Size Pressure", "Enable tablet pressure sensitivity for size");
590         RNA_def_property_update(prop, 0, "rna_Brush_update");
591         
592         prop= RNA_def_property(srna, "use_pressure_jitter", PROP_BOOLEAN, PROP_NONE);
593         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_JITTER_PRESSURE);
594         RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
595         RNA_def_property_ui_text(prop, "Jitter Pressure", "Enable tablet pressure sensitivity for jitter");
596         RNA_def_property_update(prop, 0, "rna_Brush_update");
597
598         prop= RNA_def_property(srna, "use_pressure_spacing", PROP_BOOLEAN, PROP_NONE);
599         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACING_PRESSURE);
600         RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
601         RNA_def_property_ui_text(prop, "Spacing Pressure", "Enable tablet pressure sensitivity for spacing");
602         RNA_def_property_update(prop, 0, "rna_Brush_update");
603
604         prop= RNA_def_property(srna, "use_inverse_smooth_pressure", PROP_BOOLEAN, PROP_NONE);
605         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_INVERSE_SMOOTH_PRESSURE);
606         RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
607         RNA_def_property_ui_text(prop, "Inverse Smooth Pressure", "Lighter pressure causes more smoothing to be applied");
608         RNA_def_property_update(prop, 0, "rna_Brush_update");
609         
610         prop= RNA_def_property(srna, "use_rake", PROP_BOOLEAN, PROP_NONE);
611         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RAKE);
612         RNA_def_property_ui_text(prop, "Rake", "Rotate the brush texture to match the stroke direction");
613         RNA_def_property_update(prop, 0, "rna_Brush_update");
614
615         prop= RNA_def_property(srna, "use_random_rotation", PROP_BOOLEAN, PROP_NONE);
616         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RANDOM_ROTATION);
617         RNA_def_property_ui_text(prop, "Random Rotation", "Rotate the brush texture at random");
618         RNA_def_property_update(prop, 0, "rna_Brush_update");
619
620         prop= RNA_def_property(srna, "use_plane_trim", PROP_BOOLEAN, PROP_NONE);
621         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_PLANE_TRIM);
622         RNA_def_property_ui_text(prop, "Use Plane Trim", "Enable Plane Trim");
623         RNA_def_property_update(prop, 0, "rna_Brush_update");
624
625         prop= RNA_def_property(srna, "use_frontface", PROP_BOOLEAN, PROP_NONE);
626         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FRONTFACE);
627         RNA_def_property_ui_text(prop, "Use Front-Face", "Brush only affects vertexes that face the viewer");
628         RNA_def_property_update(prop, 0, "rna_Brush_update");
629
630         prop= RNA_def_property(srna, "use_anchor", PROP_BOOLEAN, PROP_NONE);
631         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ANCHORED);
632         RNA_def_property_ui_text(prop, "Anchored", "Keep the brush anchored to the initial location");
633         RNA_def_property_update(prop, 0, "rna_Brush_update");
634
635         prop= RNA_def_property(srna, "use_space", PROP_BOOLEAN, PROP_NONE);
636         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACE);
637         RNA_def_property_ui_text(prop, "Space", "Limit brush application to the distance specified by spacing");
638         RNA_def_property_update(prop, 0, "rna_Brush_update");
639
640         prop= RNA_def_property(srna, "use_smooth_stroke", PROP_BOOLEAN, PROP_NONE);
641         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SMOOTH_STROKE);
642         RNA_def_property_ui_text(prop, "Smooth Stroke", "Brush lags behind mouse and follows a smoother path");
643         RNA_def_property_update(prop, 0, "rna_Brush_update");
644
645         prop= RNA_def_property(srna, "use_persistent", PROP_BOOLEAN, PROP_NONE);
646         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_PERSISTENT);
647         RNA_def_property_ui_text(prop, "Persistent", "Sculpts on a persistent layer of the mesh");
648         RNA_def_property_update(prop, 0, "rna_Brush_update");
649
650         prop= RNA_def_property(srna, "use_accumulate", PROP_BOOLEAN, PROP_NONE);
651         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ACCUMULATE);
652         RNA_def_property_ui_text(prop, "Accumulate", "Accumulate stroke dabs on top of each other");
653         RNA_def_property_update(prop, 0, "rna_Brush_update");
654         
655         prop= RNA_def_property(srna, "use_space_atten", PROP_BOOLEAN, PROP_NONE);
656         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACE_ATTEN);
657         RNA_def_property_ui_text(prop, "Use Automatic Strength Adjustment", "Automatically adjusts strength to give consistent results for different spacings");
658         RNA_def_property_update(prop, 0, "rna_Brush_update");
659
660         /* adaptive space is not implemented yet */
661         prop= RNA_def_property(srna, "use_adaptive_space", PROP_BOOLEAN, PROP_NONE);
662         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ADAPTIVE_SPACE);
663         RNA_def_property_ui_text(prop, "Adaptive Spacing", "Space daubs according to surface orientation instead of screen space");
664         RNA_def_property_update(prop, 0, "rna_Brush_update");
665
666         prop= RNA_def_property(srna, "use_locked_size", PROP_BOOLEAN, PROP_NONE);
667         RNA_def_property_boolean_funcs(prop, "rna_Brush_get_use_locked_size", "rna_Brush_set_use_locked_size");
668         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_LOCK_SIZE);
669         RNA_def_property_ui_text(prop, "Use Blender Units", "When locked brush stays same size relative to object; when unlocked brush size is given in pixels");
670         RNA_def_property_update(prop, 0, "rna_Brush_update");
671
672         prop= RNA_def_property(srna, "use_texture_overlay", PROP_BOOLEAN, PROP_NONE);
673         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_TEXTURE_OVERLAY);
674         RNA_def_property_ui_text(prop, "Use Texture Overlay", "Show texture in viewport");
675         RNA_def_property_update(prop, 0, "rna_Brush_update");
676
677         prop= RNA_def_property(srna, "use_edge_to_edge", PROP_BOOLEAN, PROP_NONE);
678         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_EDGE_TO_EDGE);
679         RNA_def_property_ui_text(prop, "Edge-to-edge", "Drag anchor brush from edge-to-edge");
680         RNA_def_property_update(prop, 0, "rna_Brush_update");
681
682         prop= RNA_def_property(srna, "use_restore_mesh", PROP_BOOLEAN, PROP_NONE);
683         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RESTORE_MESH);
684         RNA_def_property_ui_text(prop, "Restore Mesh", "Allows a single dot to be carefully positioned");
685         RNA_def_property_update(prop, 0, "rna_Brush_update");
686
687         prop= RNA_def_property(srna, "use_fixed_texture", PROP_BOOLEAN, PROP_NONE);
688         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FIXED_TEX);
689         RNA_def_property_ui_text(prop, "Fixed Texture", "Keep texture origin in fixed position");
690         RNA_def_property_update(prop, 0, "rna_Brush_update");
691         
692         /* only for projection paint, TODO, other paint modes */
693         prop= RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
694         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BRUSH_LOCK_ALPHA);
695         RNA_def_property_ui_text(prop, "Alpha", "When this is disabled, lock alpha while painting");
696         RNA_def_property_update(prop, 0, "rna_Brush_update");
697
698         prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
699         RNA_def_property_flag(prop, PROP_NEVER_NULL);
700         RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve");
701         RNA_def_property_update(prop, 0, "rna_Brush_update");
702
703         /* paint mode flags */
704         prop= RNA_def_property(srna, "use_paint_sculpt", PROP_BOOLEAN, PROP_NONE);
705         RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_SCULPT);
706         RNA_def_property_ui_text(prop, "Use Sculpt", "Use this brush in sculpt mode");
707
708         prop= RNA_def_property(srna, "use_paint_vertex", PROP_BOOLEAN, PROP_NONE);
709         RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_VERTEX_PAINT);
710         RNA_def_property_ui_text(prop, "Use Vertex", "Use this brush in vertex paint mode");
711
712         prop= RNA_def_property(srna, "use_paint_weight", PROP_BOOLEAN, PROP_NONE);
713         RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_WEIGHT_PAINT);
714         RNA_def_property_ui_text(prop, "Use Weight", "Use this brush in weight paint mode");    
715
716         prop= RNA_def_property(srna, "use_paint_image", PROP_BOOLEAN, PROP_NONE);
717         RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_TEXTURE_PAINT);
718         RNA_def_property_ui_text(prop, "Use Texture", "Use this brush in texture paint mode");  
719
720         /* texture */
721         prop= RNA_def_property(srna, "texture_slot", PROP_POINTER, PROP_NONE);
722         RNA_def_property_struct_type(prop, "BrushTextureSlot");
723         RNA_def_property_pointer_sdna(prop, NULL, "mtex");
724         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
725         RNA_def_property_ui_text(prop, "Texture Slot", "");
726         
727         prop= RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
728         RNA_def_property_pointer_sdna(prop, NULL, "mtex.tex");
729         RNA_def_property_flag(prop, PROP_EDITABLE);
730         RNA_def_property_ui_text(prop, "Texture", "");
731         RNA_def_property_update(prop, NC_TEXTURE, "rna_Brush_update");
732
733         prop= RNA_def_property(srna, "texture_overlay_alpha", PROP_INT, PROP_PERCENTAGE);
734         RNA_def_property_int_sdna(prop, NULL, "texture_overlay_alpha");
735         RNA_def_property_range(prop, 1, 100);
736         RNA_def_property_ui_text(prop, "Texture Overlay Alpha", "");
737         RNA_def_property_update(prop, 0, "rna_Brush_update");
738
739         prop= RNA_def_property(srna, "cursor_color_add", PROP_FLOAT, PROP_COLOR);
740         RNA_def_property_float_sdna(prop, NULL, "add_col");
741         RNA_def_property_array(prop, 3);
742         RNA_def_property_ui_text(prop, "Add Color", "Color of cursor when adding");
743         RNA_def_property_update(prop, 0, "rna_Brush_update");
744
745         prop= RNA_def_property(srna, "cursor_color_subtract", PROP_FLOAT, PROP_COLOR);
746         RNA_def_property_float_sdna(prop, NULL, "sub_col");
747         RNA_def_property_array(prop, 3);
748         RNA_def_property_ui_text(prop, "Subtract Color", "Color of cursor when subtracting");
749         RNA_def_property_update(prop, 0, "rna_Brush_update");
750
751         prop= RNA_def_property(srna, "use_custom_icon", PROP_BOOLEAN, PROP_NONE);
752         RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_CUSTOM_ICON);
753         RNA_def_property_ui_text(prop, "Custom Icon", "Set the brush icon from an image file");
754         RNA_def_property_update(prop, 0, "rna_Brush_icon_update");
755
756         prop= RNA_def_property(srna, "icon_filepath", PROP_STRING, PROP_FILEPATH);
757         RNA_def_property_string_sdna(prop, NULL, "icon_filepath");
758         RNA_def_property_ui_text(prop, "Brush Icon Filepath", "File path to brush icon");
759         RNA_def_property_update(prop, 0, "rna_Brush_icon_update");
760
761         /* clone tool */
762         prop= RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE);
763         RNA_def_property_pointer_sdna(prop, NULL, "clone.image");
764         RNA_def_property_flag(prop, PROP_EDITABLE);
765         RNA_def_property_ui_text(prop, "Clone Image", "Image for clone tool");
766         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_update");
767         
768         prop= RNA_def_property(srna, "clone_alpha", PROP_FLOAT, PROP_NONE);
769         RNA_def_property_float_sdna(prop, NULL, "clone.alpha");
770         RNA_def_property_range(prop, 0.0f, 1.0f);
771         RNA_def_property_ui_text(prop, "Clone Alpha", "Opacity of clone image display");
772         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_update");
773
774         prop= RNA_def_property(srna, "clone_offset", PROP_FLOAT, PROP_XYZ);
775         RNA_def_property_float_sdna(prop, NULL, "clone.offset");
776         RNA_def_property_ui_text(prop, "Clone Offset", "");
777         RNA_def_property_ui_range(prop, -1.0f , 1.0f, 10.0f, 3);
778         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_update");
779 }
780
781
782 /* A brush stroke is a list of changes to the brush that
783  * can occur during a stroke
784  *
785  *  o 3D location of the brush
786  *  o 2D mouse location
787  *  o Tablet pressure
788  *  o Direction flip
789  *  o Tool switch
790  *  o Time
791  */
792 static void rna_def_operator_stroke_element(BlenderRNA *brna)
793 {
794         StructRNA *srna;
795         PropertyRNA *prop;
796
797         srna= RNA_def_struct(brna, "OperatorStrokeElement", "PropertyGroup");
798         RNA_def_struct_ui_text(srna, "Operator Stroke Element", "");
799
800         prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
801         RNA_def_property_flag(prop, PROP_IDPROPERTY);
802         RNA_def_property_array(prop, 3);
803         RNA_def_property_ui_text(prop, "Location", "");
804
805         prop= RNA_def_property(srna, "mouse", PROP_FLOAT, PROP_XYZ);
806         RNA_def_property_flag(prop, PROP_IDPROPERTY);
807         RNA_def_property_array(prop, 2);
808         RNA_def_property_ui_text(prop, "Mouse", "");
809
810         prop= RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_NONE);
811         RNA_def_property_flag(prop, PROP_IDPROPERTY);
812         RNA_def_property_range(prop, 0.0f, 1.0f);
813         RNA_def_property_ui_text(prop, "Pressure", "Tablet pressure");
814
815         prop= RNA_def_property(srna, "pen_flip", PROP_BOOLEAN, PROP_NONE);
816         RNA_def_property_flag(prop, PROP_IDPROPERTY);
817         RNA_def_property_ui_text(prop, "Flip", "");
818
819         // used in uv painting
820         prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_UNSIGNED);
821         RNA_def_property_flag(prop, PROP_IDPROPERTY);
822         RNA_def_property_ui_text(prop, "Time", "");
823         
824         /* used for Grease Pencil sketching sessions */
825         prop= RNA_def_property(srna, "is_start", PROP_BOOLEAN, PROP_NONE);
826         RNA_def_property_flag(prop, PROP_IDPROPERTY);
827         RNA_def_property_ui_text(prop, "Is Stroke Start", "");
828
829         /* XXX: Tool (this will be for pressing a modifier key for a different brush,
830                         e.g. switching to a Smooth brush in the middle of the stroke */
831
832         // XXX: i don't think blender currently supports the ability to properly do a remappable modifier in the middle of a stroke
833 }
834
835 void RNA_def_brush(BlenderRNA *brna)
836 {
837         rna_def_brush(brna);
838         rna_def_brush_texture_slot(brna);
839         rna_def_operator_stroke_element(brna);
840 }
841
842 #endif