Fix: First item in File Browser can't be renamed
[blender.git] / source / blender / makesrna / intern / rna_brush.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include <stdlib.h>
22 #include <assert.h>
23
24 #include "DNA_brush_types.h"
25 #include "DNA_texture_types.h"
26 #include "DNA_scene_types.h"
27 #include "DNA_object_types.h"
28 #include "DNA_workspace_types.h"
29 #include "DNA_gpencil_types.h"
30
31 #include "BLI_math.h"
32
33 #include "RNA_define.h"
34 #include "RNA_enum_types.h"
35
36 #include "rna_internal.h"
37
38 #include "IMB_imbuf.h"
39
40 #include "WM_types.h"
41
42 static const EnumPropertyItem prop_direction_items[] = {
43     {0, "ADD", ICON_ADD, "Add", "Add effect of brush"},
44     {BRUSH_DIR_IN, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"},
45     {0, NULL, 0, NULL, NULL},
46 };
47
48 static const EnumPropertyItem sculpt_stroke_method_items[] = {
49     {0, "DOTS", 0, "Dots", "Apply paint on each mouse move step"},
50     {BRUSH_DRAG_DOT, "DRAG_DOT", 0, "Drag Dot", "Allows a single dot to be carefully positioned"},
51     {BRUSH_SPACE,
52      "SPACE",
53      0,
54      "Space",
55      "Limit brush application to the distance specified by spacing"},
56     {BRUSH_AIRBRUSH,
57      "AIRBRUSH",
58      0,
59      "Airbrush",
60      "Keep applying paint effect while holding mouse (spray)"},
61     {BRUSH_ANCHORED, "ANCHORED", 0, "Anchored", "Keep the brush anchored to the initial location"},
62     {BRUSH_LINE, "LINE", 0, "Line", "Draw a line with dabs separated according to spacing"},
63     {BRUSH_CURVE,
64      "CURVE",
65      0,
66      "Curve",
67      "Define the stroke curve with a bezier curve (dabs are separated according to spacing)"},
68     {0, NULL, 0, NULL, NULL},
69 };
70
71 const EnumPropertyItem rna_enum_brush_sculpt_tool_items[] = {
72     {SCULPT_TOOL_DRAW, "DRAW", ICON_BRUSH_SCULPT_DRAW, "Draw", ""},
73     {SCULPT_TOOL_DRAW_SHARP, "DRAW_SHARP", ICON_BRUSH_SCULPT_DRAW, "Draw Sharp", ""},
74     {SCULPT_TOOL_CLAY, "CLAY", ICON_BRUSH_CLAY, "Clay", ""},
75     {SCULPT_TOOL_CLAY_STRIPS, "CLAY_STRIPS", ICON_BRUSH_CLAY_STRIPS, "Clay Strips", ""},
76     {SCULPT_TOOL_LAYER, "LAYER", ICON_BRUSH_LAYER, "Layer", ""},
77     {SCULPT_TOOL_INFLATE, "INFLATE", ICON_BRUSH_INFLATE, "Inflate", ""},
78     {SCULPT_TOOL_BLOB, "BLOB", ICON_BRUSH_BLOB, "Blob", ""},
79     {SCULPT_TOOL_CREASE, "CREASE", ICON_BRUSH_CREASE, "Crease", ""},
80     {0, "", 0, NULL, NULL},
81     {SCULPT_TOOL_SMOOTH, "SMOOTH", ICON_BRUSH_SMOOTH, "Smooth", ""},
82     {SCULPT_TOOL_FLATTEN, "FLATTEN", ICON_BRUSH_FLATTEN, "Flatten", ""},
83     {SCULPT_TOOL_FILL, "FILL", ICON_BRUSH_FILL, "Fill", ""},
84     {SCULPT_TOOL_SCRAPE, "SCRAPE", ICON_BRUSH_SCRAPE, "Scrape", ""},
85     {SCULPT_TOOL_PINCH, "PINCH", ICON_BRUSH_PINCH, "Pinch", ""},
86     {0, "", 0, NULL, NULL},
87     {SCULPT_TOOL_GRAB, "GRAB", ICON_BRUSH_GRAB, "Grab", ""},
88     {SCULPT_TOOL_ELASTIC_DEFORM, "ELASTIC_DEFORM", ICON_BRUSH_GRAB, "Elastic Deform", ""},
89     {SCULPT_TOOL_SNAKE_HOOK, "SNAKE_HOOK", ICON_BRUSH_SNAKE_HOOK, "Snake Hook", ""},
90     {SCULPT_TOOL_THUMB, "THUMB", ICON_BRUSH_THUMB, "Thumb", ""},
91     {SCULPT_TOOL_POSE, "POSE", ICON_BRUSH_GRAB, "Pose", ""},
92     {SCULPT_TOOL_NUDGE, "NUDGE", ICON_BRUSH_NUDGE, "Nudge", ""},
93     {SCULPT_TOOL_ROTATE, "ROTATE", ICON_BRUSH_ROTATE, "Rotate", ""},
94     {0, "", 0, NULL, NULL},
95     {SCULPT_TOOL_SIMPLIFY, "SIMPLIFY", ICON_BRUSH_DATA, "Simplify", ""},
96     {SCULPT_TOOL_MASK, "MASK", ICON_BRUSH_MASK, "Mask", ""},
97     {0, NULL, 0, NULL, NULL},
98 };
99
100 const EnumPropertyItem rna_enum_brush_uv_sculpt_tool_items[] = {
101     {UV_SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", "Grab UVs"},
102     {UV_SCULPT_TOOL_RELAX, "RELAX", 0, "Relax", "Relax UVs"},
103     {UV_SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", "Pinch UVs"},
104     {0, NULL, 0, NULL, NULL},
105 };
106
107 const EnumPropertyItem rna_enum_brush_vertex_tool_items[] = {
108     {VPAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_MIX, "Draw", ""},
109     {VPAINT_TOOL_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", ""},
110     {VPAINT_TOOL_AVERAGE, "AVERAGE", ICON_BRUSH_BLUR, "Average", ""},
111     {VPAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_BLUR, "Smear", ""},
112     {0, NULL, 0, NULL, NULL},
113 };
114
115 const EnumPropertyItem rna_enum_brush_weight_tool_items[] = {
116     {WPAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_MIX, "Draw", ""},
117     {WPAINT_TOOL_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", ""},
118     {WPAINT_TOOL_AVERAGE, "AVERAGE", ICON_BRUSH_BLUR, "Average", ""},
119     {WPAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_BLUR, "Smear", ""},
120     {0, NULL, 0, NULL, NULL},
121 };
122
123 const EnumPropertyItem rna_enum_brush_image_tool_items[] = {
124     {PAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_TEXDRAW, "Draw", ""},
125     {PAINT_TOOL_SOFTEN, "SOFTEN", ICON_BRUSH_SOFTEN, "Soften", ""},
126     {PAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_SMEAR, "Smear", ""},
127     {PAINT_TOOL_CLONE, "CLONE", ICON_BRUSH_CLONE, "Clone", ""},
128     {PAINT_TOOL_FILL, "FILL", ICON_BRUSH_TEXFILL, "Fill", ""},
129     {PAINT_TOOL_MASK, "MASK", ICON_BRUSH_TEXMASK, "Mask", ""},
130     {0, NULL, 0, NULL, NULL},
131 };
132
133 const EnumPropertyItem rna_enum_brush_gpencil_types_items[] = {
134     {GPAINT_TOOL_DRAW,
135      "DRAW",
136      ICON_STROKE,
137      "Draw",
138      "The brush is of type used for drawing strokes"},
139     {GPAINT_TOOL_FILL, "FILL", ICON_COLOR, "Fill", "The brush is of type used for filling areas"},
140     {GPAINT_TOOL_ERASE,
141      "ERASE",
142      ICON_PANEL_CLOSE,
143      "Erase",
144      "The brush is used for erasing strokes"},
145     {0, NULL, 0, NULL, NULL},
146 };
147
148 #ifndef RNA_RUNTIME
149 static EnumPropertyItem rna_enum_gpencil_brush_eraser_modes_items[] = {
150     {GP_BRUSH_ERASER_SOFT, "SOFT", 0, "Soft", "Use soft eraser"},
151     {GP_BRUSH_ERASER_HARD, "HARD", 0, "Hard", "Use hard eraser"},
152     {GP_BRUSH_ERASER_STROKE, "STROKE", 0, "Stroke", "Use stroke eraser"},
153     {0, NULL, 0, NULL, NULL},
154 };
155
156 static EnumPropertyItem rna_enum_gpencil_fill_draw_modes_items[] = {
157     {GP_FILL_DMODE_BOTH,
158      "BOTH",
159      0,
160      "Default",
161      "Use both visible strokes and edit lines as fill boundary limits"},
162     {GP_FILL_DMODE_STROKE, "STROKE", 0, "Strokes", "Use visible strokes as fill boundary limits"},
163     {GP_FILL_DMODE_CONTROL, "CONTROL", 0, "Edit Lines", "Use edit lines as fill boundary limits"},
164     {0, NULL, 0, NULL, NULL}};
165
166 static EnumPropertyItem rna_enum_gpencil_brush_icons_items[] = {
167     {GP_BRUSH_ICON_PENCIL, "PENCIL", ICON_GPBRUSH_PENCIL, "Pencil", ""},
168     {GP_BRUSH_ICON_PEN, "PEN", ICON_GPBRUSH_PEN, "Pen", ""},
169     {GP_BRUSH_ICON_INK, "INK", ICON_GPBRUSH_INK, "Ink", ""},
170     {GP_BRUSH_ICON_INKNOISE, "INKNOISE", ICON_GPBRUSH_INKNOISE, "Ink Noise", ""},
171     {GP_BRUSH_ICON_BLOCK, "BLOCK", ICON_GPBRUSH_BLOCK, "Block", ""},
172     {GP_BRUSH_ICON_MARKER, "MARKER", ICON_GPBRUSH_MARKER, "Marker", ""},
173     {GP_BRUSH_ICON_AIRBRUSH, "AIRBRUSH", ICON_GPBRUSH_AIRBRUSH, "Airbrush", ""},
174     {GP_BRUSH_ICON_CHISEL, "CHISEL", ICON_GPBRUSH_CHISEL, "Chisel", ""},
175     {GP_BRUSH_ICON_FILL, "FILL", ICON_GPBRUSH_FILL, "Fill", ""},
176     {GP_BRUSH_ICON_ERASE_SOFT, "SOFT", ICON_GPBRUSH_ERASE_SOFT, "Eraser Soft", ""},
177     {GP_BRUSH_ICON_ERASE_HARD, "HARD", ICON_GPBRUSH_ERASE_HARD, "Eraser Hard", ""},
178     {GP_BRUSH_ICON_ERASE_STROKE, "STROKE", ICON_GPBRUSH_ERASE_STROKE, "Eraser Stroke", ""},
179     {0, NULL, 0, NULL, NULL},
180 };
181 #endif
182
183 #ifdef RNA_RUNTIME
184
185 #  include "MEM_guardedalloc.h"
186
187 #  include "RNA_access.h"
188
189 #  include "BKE_colorband.h"
190 #  include "BKE_brush.h"
191 #  include "BKE_icons.h"
192 #  include "BKE_gpencil.h"
193 #  include "BKE_paint.h"
194 #  include "BKE_material.h"
195
196 #  include "WM_api.h"
197
198 static bool rna_BrushCapabilitiesSculpt_has_accumulate_get(PointerRNA *ptr)
199 {
200   Brush *br = (Brush *)ptr->data;
201   return SCULPT_TOOL_HAS_ACCUMULATE(br->sculpt_tool);
202 }
203
204 static bool rna_BrushCapabilitiesSculpt_has_topology_rake_get(PointerRNA *ptr)
205 {
206   Brush *br = (Brush *)ptr->data;
207   return SCULPT_TOOL_HAS_TOPOLOGY_RAKE(br->sculpt_tool);
208 }
209
210 static bool rna_BrushCapabilitiesSculpt_has_auto_smooth_get(PointerRNA *ptr)
211 {
212   Brush *br = (Brush *)ptr->data;
213   return !ELEM(br->sculpt_tool, SCULPT_TOOL_MASK, SCULPT_TOOL_SMOOTH);
214 }
215
216 static bool rna_BrushCapabilitiesSculpt_has_height_get(PointerRNA *ptr)
217 {
218   Brush *br = (Brush *)ptr->data;
219   return br->sculpt_tool == SCULPT_TOOL_LAYER;
220 }
221
222 static bool rna_BrushCapabilitiesSculpt_has_jitter_get(PointerRNA *ptr)
223 {
224   Brush *br = (Brush *)ptr->data;
225   return (!(br->flag & BRUSH_ANCHORED) && !(br->flag & BRUSH_DRAG_DOT) &&
226           !ELEM(br->sculpt_tool,
227                 SCULPT_TOOL_GRAB,
228                 SCULPT_TOOL_ROTATE,
229                 SCULPT_TOOL_SNAKE_HOOK,
230                 SCULPT_TOOL_THUMB));
231 }
232
233 static bool rna_BrushCapabilitiesSculpt_has_normal_weight_get(PointerRNA *ptr)
234 {
235   Brush *br = (Brush *)ptr->data;
236   return SCULPT_TOOL_HAS_NORMAL_WEIGHT(br->sculpt_tool);
237 }
238
239 static bool rna_BrushCapabilitiesSculpt_has_rake_factor_get(PointerRNA *ptr)
240 {
241   Brush *br = (Brush *)ptr->data;
242   return SCULPT_TOOL_HAS_RAKE(br->sculpt_tool);
243 }
244
245 static bool rna_BrushCapabilities_has_overlay_get(PointerRNA *ptr)
246 {
247   Brush *br = (Brush *)ptr->data;
248   return ELEM(
249       br->mtex.brush_map_mode, MTEX_MAP_MODE_VIEW, MTEX_MAP_MODE_TILED, MTEX_MAP_MODE_STENCIL);
250 }
251
252 static bool rna_BrushCapabilitiesSculpt_has_persistence_get(PointerRNA *ptr)
253 {
254   Brush *br = (Brush *)ptr->data;
255   return br->sculpt_tool == SCULPT_TOOL_LAYER;
256 }
257
258 static bool rna_BrushCapabilitiesSculpt_has_pinch_factor_get(PointerRNA *ptr)
259 {
260   Brush *br = (Brush *)ptr->data;
261   return ELEM(br->sculpt_tool, SCULPT_TOOL_BLOB, SCULPT_TOOL_CREASE, SCULPT_TOOL_SNAKE_HOOK);
262 }
263
264 static bool rna_BrushCapabilitiesSculpt_has_plane_offset_get(PointerRNA *ptr)
265 {
266   Brush *br = (Brush *)ptr->data;
267   return ELEM(br->sculpt_tool,
268               SCULPT_TOOL_CLAY,
269               SCULPT_TOOL_CLAY_STRIPS,
270               SCULPT_TOOL_FILL,
271               SCULPT_TOOL_FLATTEN,
272               SCULPT_TOOL_SCRAPE);
273 }
274
275 static bool rna_BrushCapabilitiesSculpt_has_random_texture_angle_get(PointerRNA *ptr)
276 {
277   Brush *br = (Brush *)ptr->data;
278   return (!ELEM(br->sculpt_tool,
279                 SCULPT_TOOL_GRAB,
280                 SCULPT_TOOL_ROTATE,
281                 SCULPT_TOOL_SNAKE_HOOK,
282                 SCULPT_TOOL_THUMB));
283 }
284
285 static bool rna_TextureCapabilities_has_random_texture_angle_get(PointerRNA *ptr)
286 {
287   MTex *mtex = (MTex *)ptr->data;
288   return ELEM(mtex->brush_map_mode, MTEX_MAP_MODE_VIEW, MTEX_MAP_MODE_AREA, MTEX_MAP_MODE_RANDOM);
289 }
290
291 static bool rna_BrushCapabilities_has_random_texture_angle_get(PointerRNA *ptr)
292 {
293   Brush *br = (Brush *)ptr->data;
294   return !(br->flag & BRUSH_ANCHORED);
295 }
296
297 static bool rna_BrushCapabilitiesSculpt_has_sculpt_plane_get(PointerRNA *ptr)
298 {
299   Brush *br = (Brush *)ptr->data;
300   return !ELEM(br->sculpt_tool,
301                SCULPT_TOOL_INFLATE,
302                SCULPT_TOOL_MASK,
303                SCULPT_TOOL_PINCH,
304                SCULPT_TOOL_SMOOTH);
305 }
306
307 static bool rna_BrushCapabilitiesSculpt_has_secondary_color_get(PointerRNA *ptr)
308 {
309   Brush *br = (Brush *)ptr->data;
310   return BKE_brush_sculpt_has_secondary_color(br);
311 }
312
313 static bool rna_BrushCapabilitiesSculpt_has_smooth_stroke_get(PointerRNA *ptr)
314 {
315   Brush *br = (Brush *)ptr->data;
316   return (!(br->flag & BRUSH_ANCHORED) && !(br->flag & BRUSH_DRAG_DOT) &&
317           !(br->flag & BRUSH_LINE) && !(br->flag & BRUSH_CURVE) &&
318           !ELEM(br->sculpt_tool,
319                 SCULPT_TOOL_GRAB,
320                 SCULPT_TOOL_ROTATE,
321                 SCULPT_TOOL_SNAKE_HOOK,
322                 SCULPT_TOOL_THUMB));
323 }
324
325 static bool rna_BrushCapabilities_has_smooth_stroke_get(PointerRNA *ptr)
326 {
327   Brush *br = (Brush *)ptr->data;
328   return (!(br->flag & BRUSH_ANCHORED) && !(br->flag & BRUSH_DRAG_DOT) &&
329           !(br->flag & BRUSH_LINE) && !(br->flag & BRUSH_CURVE));
330 }
331
332 static bool rna_BrushCapabilitiesSculpt_has_space_attenuation_get(PointerRNA *ptr)
333 {
334   Brush *br = (Brush *)ptr->data;
335   return ((br->flag & (BRUSH_SPACE | BRUSH_LINE | BRUSH_CURVE)) && !ELEM(br->sculpt_tool,
336                                                                          SCULPT_TOOL_GRAB,
337                                                                          SCULPT_TOOL_ROTATE,
338                                                                          SCULPT_TOOL_SMOOTH,
339                                                                          SCULPT_TOOL_SNAKE_HOOK));
340 }
341
342 static bool rna_BrushCapabilitiesImagePaint_has_space_attenuation_get(PointerRNA *ptr)
343 {
344   Brush *br = (Brush *)ptr->data;
345   return (br->flag & (BRUSH_SPACE | BRUSH_LINE | BRUSH_CURVE)) &&
346          br->imagepaint_tool != PAINT_TOOL_FILL;
347 }
348
349 static bool rna_BrushCapabilitiesImagePaint_has_color_get(PointerRNA *ptr)
350 {
351   Brush *br = (Brush *)ptr->data;
352   return ELEM(br->imagepaint_tool, PAINT_TOOL_DRAW, PAINT_TOOL_FILL);
353 }
354
355 static bool rna_BrushCapabilitiesVertexPaint_has_color_get(PointerRNA *ptr)
356 {
357   Brush *br = (Brush *)ptr->data;
358   return ELEM(br->vertexpaint_tool, VPAINT_TOOL_DRAW);
359 }
360
361 static bool rna_BrushCapabilitiesWeightPaint_has_weight_get(PointerRNA *ptr)
362 {
363   Brush *br = (Brush *)ptr->data;
364   return ELEM(br->weightpaint_tool, WPAINT_TOOL_DRAW);
365 }
366
367 static bool rna_BrushCapabilities_has_spacing_get(PointerRNA *ptr)
368 {
369   Brush *br = (Brush *)ptr->data;
370   return (!(br->flag & BRUSH_ANCHORED));
371 }
372
373 static bool rna_BrushCapabilitiesSculpt_has_strength_pressure_get(PointerRNA *ptr)
374 {
375   Brush *br = (Brush *)ptr->data;
376   return !ELEM(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK);
377 }
378
379 static bool rna_TextureCapabilities_has_texture_angle_get(PointerRNA *ptr)
380 {
381   MTex *mtex = (MTex *)ptr->data;
382   return mtex->brush_map_mode != MTEX_MAP_MODE_3D;
383 }
384
385 static bool rna_BrushCapabilitiesSculpt_has_direction_get(PointerRNA *ptr)
386 {
387   Brush *br = (Brush *)ptr->data;
388   return !ELEM(br->sculpt_tool,
389                SCULPT_TOOL_DRAW,
390                SCULPT_TOOL_DRAW_SHARP,
391                SCULPT_TOOL_CLAY,
392                SCULPT_TOOL_CLAY_STRIPS,
393                SCULPT_TOOL_LAYER,
394                SCULPT_TOOL_INFLATE,
395                SCULPT_TOOL_BLOB,
396                SCULPT_TOOL_CREASE,
397                SCULPT_TOOL_FLATTEN,
398                SCULPT_TOOL_FILL,
399                SCULPT_TOOL_SCRAPE,
400                SCULPT_TOOL_CLAY,
401                SCULPT_TOOL_PINCH,
402                SCULPT_TOOL_MASK);
403 }
404
405 static bool rna_BrushCapabilitiesSculpt_has_gravity_get(PointerRNA *ptr)
406 {
407   Brush *br = (Brush *)ptr->data;
408   return !ELEM(br->sculpt_tool, SCULPT_TOOL_MASK, SCULPT_TOOL_SMOOTH);
409 }
410
411 static bool rna_TextureCapabilities_has_texture_angle_source_get(PointerRNA *ptr)
412 {
413   MTex *mtex = (MTex *)ptr->data;
414   return ELEM(mtex->brush_map_mode, MTEX_MAP_MODE_VIEW, MTEX_MAP_MODE_AREA, MTEX_MAP_MODE_RANDOM);
415 }
416
417 static bool rna_BrushCapabilitiesImagePaint_has_accumulate_get(PointerRNA *ptr)
418 {
419   /* only support for draw tool */
420   Brush *br = (Brush *)ptr->data;
421
422   return ((br->flag & BRUSH_AIRBRUSH) || (br->flag & BRUSH_DRAG_DOT) ||
423           (br->flag & BRUSH_ANCHORED) || (br->imagepaint_tool == PAINT_TOOL_SOFTEN) ||
424           (br->imagepaint_tool == PAINT_TOOL_SMEAR) || (br->imagepaint_tool == PAINT_TOOL_FILL) ||
425           (br->mtex.tex && !ELEM(br->mtex.brush_map_mode,
426                                  MTEX_MAP_MODE_TILED,
427                                  MTEX_MAP_MODE_STENCIL,
428                                  MTEX_MAP_MODE_3D))) ?
429              false :
430              true;
431 }
432
433 static bool rna_BrushCapabilitiesImagePaint_has_radius_get(PointerRNA *ptr)
434 {
435   /* only support for draw tool */
436   Brush *br = (Brush *)ptr->data;
437
438   return (br->imagepaint_tool != PAINT_TOOL_FILL);
439 }
440
441 static PointerRNA rna_Sculpt_tool_capabilities_get(PointerRNA *ptr)
442 {
443   return rna_pointer_inherit_refine(ptr, &RNA_BrushCapabilitiesSculpt, ptr->owner_id);
444 }
445
446 static PointerRNA rna_Imapaint_tool_capabilities_get(PointerRNA *ptr)
447 {
448   return rna_pointer_inherit_refine(ptr, &RNA_BrushCapabilitiesImagePaint, ptr->owner_id);
449 }
450
451 static PointerRNA rna_Vertexpaint_tool_capabilities_get(PointerRNA *ptr)
452 {
453   return rna_pointer_inherit_refine(ptr, &RNA_BrushCapabilitiesVertexPaint, ptr->owner_id);
454 }
455
456 static PointerRNA rna_Weightpaint_tool_capabilities_get(PointerRNA *ptr)
457 {
458   return rna_pointer_inherit_refine(ptr, &RNA_BrushCapabilitiesWeightPaint, ptr->owner_id);
459 }
460
461 static PointerRNA rna_Brush_capabilities_get(PointerRNA *ptr)
462 {
463   return rna_pointer_inherit_refine(ptr, &RNA_BrushCapabilities, ptr->owner_id);
464 }
465
466 static void rna_Brush_reset_icon(Brush *br)
467 {
468   ID *id = &br->id;
469
470   if (br->flag & BRUSH_CUSTOM_ICON) {
471     return;
472   }
473
474   if (id->icon_id >= BIFICONID_LAST) {
475     BKE_icon_id_delete(id);
476     BKE_previewimg_id_free(id);
477   }
478
479   id->icon_id = 0;
480 }
481
482 static void rna_Brush_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
483 {
484   Brush *br = (Brush *)ptr->data;
485   WM_main_add_notifier(NC_BRUSH | NA_EDITED, br);
486   /*WM_main_add_notifier(NC_SPACE|ND_SPACE_VIEW3D, NULL); */
487 }
488
489 static void rna_Brush_material_update(bContext *UNUSED(C), PointerRNA *UNUSED(ptr))
490 {
491   /* number of material users changed */
492   WM_main_add_notifier(NC_SPACE | ND_SPACE_PROPERTIES, NULL);
493 }
494
495 static void rna_Brush_main_tex_update(bContext *C, PointerRNA *ptr)
496 {
497   Main *bmain = CTX_data_main(C);
498   Scene *scene = CTX_data_scene(C);
499   ViewLayer *view_layer = CTX_data_view_layer(C);
500   Brush *br = (Brush *)ptr->data;
501   BKE_paint_invalidate_overlay_tex(scene, view_layer, br->mtex.tex);
502   rna_Brush_update(bmain, scene, ptr);
503 }
504
505 static void rna_Brush_secondary_tex_update(bContext *C, PointerRNA *ptr)
506 {
507   Main *bmain = CTX_data_main(C);
508   Scene *scene = CTX_data_scene(C);
509   ViewLayer *view_layer = CTX_data_view_layer(C);
510   Brush *br = (Brush *)ptr->data;
511   BKE_paint_invalidate_overlay_tex(scene, view_layer, br->mask_mtex.tex);
512   rna_Brush_update(bmain, scene, ptr);
513 }
514
515 static void rna_Brush_size_update(Main *bmain, Scene *scene, PointerRNA *ptr)
516 {
517   BKE_paint_invalidate_overlay_all();
518   rna_Brush_update(bmain, scene, ptr);
519 }
520
521 static void rna_Brush_update_and_reset_icon(Main *bmain, Scene *scene, PointerRNA *ptr)
522 {
523   Brush *br = ptr->data;
524   rna_Brush_reset_icon(br);
525   rna_Brush_update(bmain, scene, ptr);
526 }
527
528 static void rna_Brush_stroke_update(Main *bmain, Scene *scene, PointerRNA *ptr)
529 {
530   WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, scene);
531   rna_Brush_update(bmain, scene, ptr);
532 }
533
534 static void rna_Brush_icon_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
535 {
536   Brush *br = (Brush *)ptr->data;
537
538   if (br->icon_imbuf) {
539     IMB_freeImBuf(br->icon_imbuf);
540     br->icon_imbuf = NULL;
541   }
542
543   br->id.icon_id = 0;
544
545   if (br->flag & BRUSH_CUSTOM_ICON) {
546     BKE_icon_changed(BKE_icon_id_ensure(&br->id));
547   }
548
549   WM_main_add_notifier(NC_BRUSH | NA_EDITED, br);
550 }
551
552 static void rna_TextureSlot_brush_angle_update(bContext *C, PointerRNA *ptr)
553 {
554   Scene *scene = CTX_data_scene(C);
555   MTex *mtex = ptr->data;
556   /* skip invalidation of overlay for stencil mode */
557   if (mtex->mapping != MTEX_MAP_MODE_STENCIL) {
558     ViewLayer *view_layer = CTX_data_view_layer(C);
559     BKE_paint_invalidate_overlay_tex(scene, view_layer, mtex->tex);
560   }
561
562   rna_TextureSlot_update(C, ptr);
563 }
564
565 static void rna_Brush_set_size(PointerRNA *ptr, int value)
566 {
567   Brush *brush = ptr->data;
568
569   /* scale unprojected radius so it stays consistent with brush size */
570   BKE_brush_scale_unprojected_radius(&brush->unprojected_radius, value, brush->size);
571   brush->size = value;
572 }
573
574 static void rna_Brush_use_gradient_set(PointerRNA *ptr, bool value)
575 {
576   Brush *br = (Brush *)ptr->data;
577
578   if (value) {
579     br->flag |= BRUSH_USE_GRADIENT;
580   }
581   else {
582     br->flag &= ~BRUSH_USE_GRADIENT;
583   }
584
585   if ((br->flag & BRUSH_USE_GRADIENT) && br->gradient == NULL) {
586     br->gradient = BKE_colorband_add(true);
587   }
588 }
589
590 static void rna_Brush_set_unprojected_radius(PointerRNA *ptr, float value)
591 {
592   Brush *brush = ptr->data;
593
594   /* scale brush size so it stays consistent with unprojected_radius */
595   BKE_brush_scale_size(&brush->size, value, brush->unprojected_radius);
596   brush->unprojected_radius = value;
597 }
598
599 static const EnumPropertyItem *rna_Brush_direction_itemf(bContext *C,
600                                                          PointerRNA *ptr,
601                                                          PropertyRNA *UNUSED(prop),
602                                                          bool *UNUSED(r_free))
603 {
604   ePaintMode mode = BKE_paintmode_get_active_from_context(C);
605
606   static const EnumPropertyItem prop_default_items[] = {
607       {0, NULL, 0, NULL, NULL},
608   };
609
610   /* sculpt mode */
611   static const EnumPropertyItem prop_flatten_contrast_items[] = {
612       {BRUSH_DIR_IN, "CONTRAST", ICON_ADD, "Contrast", "Subtract effect of brush"},
613       {0, "FLATTEN", ICON_REMOVE, "Flatten", "Add effect of brush"},
614       {0, NULL, 0, NULL, NULL},
615   };
616
617   static const EnumPropertyItem prop_fill_deepen_items[] = {
618       {0, "FILL", ICON_ADD, "Fill", "Add effect of brush"},
619       {BRUSH_DIR_IN, "DEEPEN", ICON_REMOVE, "Deepen", "Subtract effect of brush"},
620       {0, NULL, 0, NULL, NULL},
621   };
622
623   static const EnumPropertyItem prop_scrape_peaks_items[] = {
624       {0, "SCRAPE", ICON_ADD, "Scrape", "Add effect of brush"},
625       {BRUSH_DIR_IN, "PEAKS", ICON_REMOVE, "Peaks", "Subtract effect of brush"},
626       {0, NULL, 0, NULL, NULL},
627   };
628
629   static const EnumPropertyItem prop_pinch_magnify_items[] = {
630       {BRUSH_DIR_IN, "MAGNIFY", ICON_ADD, "Magnify", "Subtract effect of brush"},
631       {0, "PINCH", ICON_REMOVE, "Pinch", "Add effect of brush"},
632       {0, NULL, 0, NULL, NULL},
633   };
634
635   static const EnumPropertyItem prop_inflate_deflate_items[] = {
636       {0, "INFLATE", ICON_ADD, "Inflate", "Add effect of brush"},
637       {BRUSH_DIR_IN, "DEFLATE", ICON_REMOVE, "Deflate", "Subtract effect of brush"},
638       {0, NULL, 0, NULL, NULL},
639   };
640
641   /* texture paint mode */
642   static const EnumPropertyItem prop_soften_sharpen_items[] = {
643       {BRUSH_DIR_IN, "SHARPEN", ICON_ADD, "Sharpen", "Sharpen effect of brush"},
644       {0, "SOFTEN", ICON_REMOVE, "Soften", "Blur effect of brush"},
645       {0, NULL, 0, NULL, NULL},
646   };
647
648   Brush *me = (Brush *)(ptr->data);
649
650   switch (mode) {
651     case PAINT_MODE_SCULPT:
652       switch (me->sculpt_tool) {
653         case SCULPT_TOOL_DRAW:
654         case SCULPT_TOOL_DRAW_SHARP:
655         case SCULPT_TOOL_CREASE:
656         case SCULPT_TOOL_BLOB:
657         case SCULPT_TOOL_LAYER:
658         case SCULPT_TOOL_CLAY:
659         case SCULPT_TOOL_CLAY_STRIPS:
660           return prop_direction_items;
661
662         case SCULPT_TOOL_MASK:
663           switch ((BrushMaskTool)me->mask_tool) {
664             case BRUSH_MASK_DRAW:
665               return prop_direction_items;
666
667             case BRUSH_MASK_SMOOTH:
668               return prop_default_items;
669
670             default:
671               return prop_default_items;
672           }
673
674         case SCULPT_TOOL_FLATTEN:
675           return prop_flatten_contrast_items;
676
677         case SCULPT_TOOL_FILL:
678           return prop_fill_deepen_items;
679
680         case SCULPT_TOOL_SCRAPE:
681           return prop_scrape_peaks_items;
682
683         case SCULPT_TOOL_PINCH:
684           return prop_pinch_magnify_items;
685
686         case SCULPT_TOOL_INFLATE:
687           return prop_inflate_deflate_items;
688
689         default:
690           return prop_default_items;
691       }
692
693     case PAINT_MODE_TEXTURE_2D:
694     case PAINT_MODE_TEXTURE_3D:
695       switch (me->imagepaint_tool) {
696         case PAINT_TOOL_SOFTEN:
697           return prop_soften_sharpen_items;
698
699         default:
700           return prop_default_items;
701       }
702
703     default:
704       return prop_default_items;
705   }
706 }
707
708 static const EnumPropertyItem *rna_Brush_stroke_itemf(bContext *C,
709                                                       PointerRNA *UNUSED(ptr),
710                                                       PropertyRNA *UNUSED(prop),
711                                                       bool *UNUSED(r_free))
712 {
713   ePaintMode mode = BKE_paintmode_get_active_from_context(C);
714
715   static const EnumPropertyItem brush_stroke_method_items[] = {
716       {0, "DOTS", 0, "Dots", "Apply paint on each mouse move step"},
717       {BRUSH_SPACE,
718        "SPACE",
719        0,
720        "Space",
721        "Limit brush application to the distance specified by spacing"},
722       {BRUSH_AIRBRUSH,
723        "AIRBRUSH",
724        0,
725        "Airbrush",
726        "Keep applying paint effect while holding mouse (spray)"},
727       {BRUSH_LINE, "LINE", 0, "Line", "Drag a line with dabs separated according to spacing"},
728       {BRUSH_CURVE,
729        "CURVE",
730        0,
731        "Curve",
732        "Define the stroke curve with a bezier curve. Dabs are separated according to spacing"},
733       {0, NULL, 0, NULL, NULL},
734   };
735
736   switch (mode) {
737     case PAINT_MODE_SCULPT:
738     case PAINT_MODE_TEXTURE_2D:
739     case PAINT_MODE_TEXTURE_3D:
740       return sculpt_stroke_method_items;
741
742     default:
743       return brush_stroke_method_items;
744   }
745 }
746
747 /* Grease Pencil Drawing Brushes Settings */
748 static char *rna_BrushGpencilSettings_path(PointerRNA *UNUSED(ptr))
749 {
750   return BLI_strdup("tool_settings.gpencil_paint.brush.gpencil_settings");
751 }
752
753 static void rna_BrushGpencilSettings_default_eraser_update(Main *bmain,
754                                                            Scene *scene,
755                                                            PointerRNA *UNUSED(ptr))
756 {
757   ToolSettings *ts = scene->toolsettings;
758   Paint *paint = &ts->gp_paint->paint;
759   Brush *brush_cur = paint->brush;
760
761   /* disable default eraser in all brushes */
762   for (Brush *brush = bmain->brushes.first; brush; brush = brush->id.next) {
763     if ((brush != brush_cur) && (brush->ob_mode == OB_MODE_PAINT_GPENCIL) &&
764         (brush->gpencil_tool == GPAINT_TOOL_ERASE)) {
765       brush->gpencil_settings->flag &= ~GP_BRUSH_DEFAULT_ERASER;
766     }
767   }
768 }
769
770 static void rna_BrushGpencilSettings_use_material_pin_update(bContext *C, PointerRNA *ptr)
771 {
772   ViewLayer *view_layer = CTX_data_view_layer(C);
773   Object *ob = OBACT(view_layer);
774   Brush *brush = (Brush *)ptr->owner_id;
775
776   if (brush->gpencil_settings->flag & GP_BRUSH_MATERIAL_PINNED) {
777     Material *material = give_current_material(ob, ob->actcol);
778     BKE_gpencil_brush_material_set(brush, material);
779   }
780   else {
781     BKE_gpencil_brush_material_set(brush, NULL);
782   }
783
784   /* number of material users changed */
785   WM_event_add_notifier(C, NC_SPACE | ND_SPACE_PROPERTIES, NULL);
786 }
787
788 static void rna_BrushGpencilSettings_eraser_mode_update(Main *UNUSED(bmain),
789                                                         Scene *scene,
790                                                         PointerRNA *UNUSED(ptr))
791 {
792   ToolSettings *ts = scene->toolsettings;
793   Paint *paint = &ts->gp_paint->paint;
794   Brush *brush = paint->brush;
795
796   /* set eraser icon */
797   if ((brush) && (brush->gpencil_tool == GPAINT_TOOL_ERASE)) {
798     switch (brush->gpencil_settings->eraser_mode) {
799       case GP_BRUSH_ERASER_SOFT:
800         brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_SOFT;
801         break;
802       case GP_BRUSH_ERASER_HARD:
803         brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_HARD;
804         break;
805       case GP_BRUSH_ERASER_STROKE:
806         brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_STROKE;
807         break;
808       default:
809         brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_SOFT;
810         break;
811     }
812   }
813 }
814
815 static bool rna_BrushGpencilSettings_material_poll(PointerRNA *UNUSED(ptr), PointerRNA value)
816 {
817   Material *ma = (Material *)value.data;
818
819   /* GP materials only */
820   return (ma->gp_style != NULL);
821 }
822
823 #else
824
825 static void rna_def_brush_texture_slot(BlenderRNA *brna)
826 {
827   StructRNA *srna;
828   PropertyRNA *prop;
829
830   static const EnumPropertyItem prop_map_mode_items[] = {
831       {MTEX_MAP_MODE_VIEW, "VIEW_PLANE", 0, "View Plane", ""},
832       {MTEX_MAP_MODE_AREA, "AREA_PLANE", 0, "Area Plane", ""},
833       {MTEX_MAP_MODE_TILED, "TILED", 0, "Tiled", ""},
834       {MTEX_MAP_MODE_3D, "3D", 0, "3D", ""},
835       {MTEX_MAP_MODE_RANDOM, "RANDOM", 0, "Random", ""},
836       {MTEX_MAP_MODE_STENCIL, "STENCIL", 0, "Stencil", ""},
837       {0, NULL, 0, NULL, NULL},
838   };
839
840   static const EnumPropertyItem prop_tex_paint_map_mode_items[] = {
841       {MTEX_MAP_MODE_VIEW, "VIEW_PLANE", 0, "View Plane", ""},
842       {MTEX_MAP_MODE_TILED, "TILED", 0, "Tiled", ""},
843       {MTEX_MAP_MODE_3D, "3D", 0, "3D", ""},
844       {MTEX_MAP_MODE_RANDOM, "RANDOM", 0, "Random", ""},
845       {MTEX_MAP_MODE_STENCIL, "STENCIL", 0, "Stencil", ""},
846       {0, NULL, 0, NULL, NULL},
847   };
848
849   static const EnumPropertyItem prop_mask_paint_map_mode_items[] = {
850       {MTEX_MAP_MODE_VIEW, "VIEW_PLANE", 0, "View Plane", ""},
851       {MTEX_MAP_MODE_TILED, "TILED", 0, "Tiled", ""},
852       {MTEX_MAP_MODE_RANDOM, "RANDOM", 0, "Random", ""},
853       {MTEX_MAP_MODE_STENCIL, "STENCIL", 0, "Stencil", ""},
854       {0, NULL, 0, NULL, NULL},
855   };
856
857 #  define TEXTURE_CAPABILITY(prop_name_, ui_name_) \
858     prop = RNA_def_property(srna, #prop_name_, PROP_BOOLEAN, PROP_NONE); \
859     RNA_def_property_clear_flag(prop, PROP_EDITABLE); \
860     RNA_def_property_boolean_funcs(prop, "rna_TextureCapabilities_" #prop_name_ "_get", NULL); \
861     RNA_def_property_ui_text(prop, ui_name_, NULL)
862
863   srna = RNA_def_struct(brna, "BrushTextureSlot", "TextureSlot");
864   RNA_def_struct_sdna(srna, "MTex");
865   RNA_def_struct_ui_text(
866       srna, "Brush Texture Slot", "Texture slot for textures in a Brush data-block");
867
868   prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
869   RNA_def_property_float_sdna(prop, NULL, "rot");
870   RNA_def_property_range(prop, 0, M_PI * 2);
871   RNA_def_property_ui_text(prop, "Angle", "Brush texture rotation");
872   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
873   RNA_def_property_update(prop, 0, "rna_TextureSlot_brush_angle_update");
874
875   prop = RNA_def_property(srna, "map_mode", PROP_ENUM, PROP_NONE);
876   RNA_def_property_enum_sdna(prop, NULL, "brush_map_mode");
877   RNA_def_property_enum_items(prop, prop_map_mode_items);
878   RNA_def_property_ui_text(prop, "Mode", "");
879   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
880   RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
881
882   prop = RNA_def_property(srna, "tex_paint_map_mode", PROP_ENUM, PROP_NONE);
883   RNA_def_property_enum_sdna(prop, NULL, "brush_map_mode");
884   RNA_def_property_enum_items(prop, prop_tex_paint_map_mode_items);
885   RNA_def_property_ui_text(prop, "Mode", "");
886   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
887   RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
888
889   prop = RNA_def_property(srna, "mask_map_mode", PROP_ENUM, PROP_NONE);
890   RNA_def_property_enum_sdna(prop, NULL, "brush_map_mode");
891   RNA_def_property_enum_items(prop, prop_mask_paint_map_mode_items);
892   RNA_def_property_ui_text(prop, "Mode", "");
893   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
894   RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
895
896   prop = RNA_def_property(srna, "use_rake", PROP_BOOLEAN, PROP_NONE);
897   RNA_def_property_boolean_sdna(prop, NULL, "brush_angle_mode", MTEX_ANGLE_RAKE);
898   RNA_def_property_ui_text(prop, "Rake", "");
899   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
900   RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
901
902   prop = RNA_def_property(srna, "use_random", PROP_BOOLEAN, PROP_NONE);
903   RNA_def_property_boolean_sdna(prop, NULL, "brush_angle_mode", MTEX_ANGLE_RANDOM);
904   RNA_def_property_ui_text(prop, "Random", "");
905   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
906   RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
907
908   prop = RNA_def_property(srna, "random_angle", PROP_FLOAT, PROP_ANGLE);
909   RNA_def_property_range(prop, 0, M_PI * 2);
910   RNA_def_property_ui_text(prop, "Random Angle", "Brush texture random angle");
911   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
912   RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
913
914   TEXTURE_CAPABILITY(has_texture_angle_source, "Has Texture Angle Source");
915   TEXTURE_CAPABILITY(has_random_texture_angle, "Has Random Texture Angle");
916   TEXTURE_CAPABILITY(has_texture_angle, "Has Texture Angle Source");
917 }
918
919 static void rna_def_sculpt_capabilities(BlenderRNA *brna)
920 {
921   StructRNA *srna;
922   PropertyRNA *prop;
923
924   srna = RNA_def_struct(brna, "BrushCapabilitiesSculpt", NULL);
925   RNA_def_struct_sdna(srna, "Brush");
926   RNA_def_struct_nested(brna, srna, "Brush");
927   RNA_def_struct_ui_text(srna,
928                          "Sculpt Capabilities",
929                          "Read-only indications of which brush operations "
930                          "are supported by the current sculpt tool");
931
932 #  define SCULPT_TOOL_CAPABILITY(prop_name_, ui_name_) \
933     prop = RNA_def_property(srna, #prop_name_, PROP_BOOLEAN, PROP_NONE); \
934     RNA_def_property_clear_flag(prop, PROP_EDITABLE); \
935     RNA_def_property_boolean_funcs( \
936         prop, "rna_BrushCapabilitiesSculpt_" #prop_name_ "_get", NULL); \
937     RNA_def_property_ui_text(prop, ui_name_, NULL)
938
939   SCULPT_TOOL_CAPABILITY(has_accumulate, "Has Accumulate");
940   SCULPT_TOOL_CAPABILITY(has_auto_smooth, "Has Auto Smooth");
941   SCULPT_TOOL_CAPABILITY(has_topology_rake, "Has Topology Rake");
942   SCULPT_TOOL_CAPABILITY(has_height, "Has Height");
943   SCULPT_TOOL_CAPABILITY(has_jitter, "Has Jitter");
944   SCULPT_TOOL_CAPABILITY(has_normal_weight, "Has Crease/Pinch Factor");
945   SCULPT_TOOL_CAPABILITY(has_rake_factor, "Has Rake Factor");
946   SCULPT_TOOL_CAPABILITY(has_persistence, "Has Persistence");
947   SCULPT_TOOL_CAPABILITY(has_pinch_factor, "Has Pinch Factor");
948   SCULPT_TOOL_CAPABILITY(has_plane_offset, "Has Plane Offset");
949   SCULPT_TOOL_CAPABILITY(has_random_texture_angle, "Has Random Texture Angle");
950   SCULPT_TOOL_CAPABILITY(has_sculpt_plane, "Has Sculpt Plane");
951   SCULPT_TOOL_CAPABILITY(has_secondary_color, "Has Secondary Color");
952   SCULPT_TOOL_CAPABILITY(has_smooth_stroke, "Has Smooth Stroke");
953   SCULPT_TOOL_CAPABILITY(has_space_attenuation, "Has Space Attenuation");
954   SCULPT_TOOL_CAPABILITY(has_strength_pressure, "Has Strength Pressure");
955   SCULPT_TOOL_CAPABILITY(has_direction, "Has Direction");
956   SCULPT_TOOL_CAPABILITY(has_gravity, "Has Gravity");
957
958 #  undef SCULPT_CAPABILITY
959 }
960
961 static void rna_def_brush_capabilities(BlenderRNA *brna)
962 {
963   StructRNA *srna;
964   PropertyRNA *prop;
965
966   srna = RNA_def_struct(brna, "BrushCapabilities", NULL);
967   RNA_def_struct_sdna(srna, "Brush");
968   RNA_def_struct_nested(brna, srna, "Brush");
969   RNA_def_struct_ui_text(
970       srna, "Brush Capabilities", "Read-only indications of supported operations");
971
972 #  define BRUSH_CAPABILITY(prop_name_, ui_name_) \
973     prop = RNA_def_property(srna, #prop_name_, PROP_BOOLEAN, PROP_NONE); \
974     RNA_def_property_clear_flag(prop, PROP_EDITABLE); \
975     RNA_def_property_boolean_funcs(prop, "rna_BrushCapabilities_" #prop_name_ "_get", NULL); \
976     RNA_def_property_ui_text(prop, ui_name_, NULL)
977
978   BRUSH_CAPABILITY(has_overlay, "Has Overlay");
979   BRUSH_CAPABILITY(has_random_texture_angle, "Has Random Texture Angle");
980   BRUSH_CAPABILITY(has_spacing, "Has Spacing");
981   BRUSH_CAPABILITY(has_smooth_stroke, "Has Smooth Stroke");
982
983 #  undef BRUSH_CAPABILITY
984 }
985
986 static void rna_def_image_paint_capabilities(BlenderRNA *brna)
987 {
988   StructRNA *srna;
989   PropertyRNA *prop;
990
991   srna = RNA_def_struct(brna, "BrushCapabilitiesImagePaint", NULL);
992   RNA_def_struct_sdna(srna, "Brush");
993   RNA_def_struct_nested(brna, srna, "Brush");
994   RNA_def_struct_ui_text(
995       srna, "Image Paint Capabilities", "Read-only indications of supported operations");
996
997 #  define IMAPAINT_TOOL_CAPABILITY(prop_name_, ui_name_) \
998     prop = RNA_def_property(srna, #prop_name_, PROP_BOOLEAN, PROP_NONE); \
999     RNA_def_property_clear_flag(prop, PROP_EDITABLE); \
1000     RNA_def_property_boolean_funcs( \
1001         prop, "rna_BrushCapabilitiesImagePaint_" #prop_name_ "_get", NULL); \
1002     RNA_def_property_ui_text(prop, ui_name_, NULL)
1003
1004   IMAPAINT_TOOL_CAPABILITY(has_accumulate, "Has Accumulate");
1005   IMAPAINT_TOOL_CAPABILITY(has_space_attenuation, "Has Space Attenuation");
1006   IMAPAINT_TOOL_CAPABILITY(has_radius, "Has Radius");
1007   IMAPAINT_TOOL_CAPABILITY(has_color, "Has Color");
1008
1009 #  undef IMAPAINT_TOOL_CAPABILITY
1010 }
1011
1012 static void rna_def_vertex_paint_capabilities(BlenderRNA *brna)
1013 {
1014   StructRNA *srna;
1015   PropertyRNA *prop;
1016
1017   srna = RNA_def_struct(brna, "BrushCapabilitiesVertexPaint", NULL);
1018   RNA_def_struct_sdna(srna, "Brush");
1019   RNA_def_struct_nested(brna, srna, "Brush");
1020   RNA_def_struct_ui_text(
1021       srna, "Vertex Paint Capabilities", "Read-only indications of supported operations");
1022
1023 #  define VPAINT_TOOL_CAPABILITY(prop_name_, ui_name_) \
1024     prop = RNA_def_property(srna, #prop_name_, PROP_BOOLEAN, PROP_NONE); \
1025     RNA_def_property_clear_flag(prop, PROP_EDITABLE); \
1026     RNA_def_property_boolean_funcs( \
1027         prop, "rna_BrushCapabilitiesVertexPaint_" #prop_name_ "_get", NULL); \
1028     RNA_def_property_ui_text(prop, ui_name_, NULL)
1029
1030   VPAINT_TOOL_CAPABILITY(has_color, "Has Color");
1031
1032 #  undef VPAINT_TOOL_CAPABILITY
1033 }
1034
1035 static void rna_def_weight_paint_capabilities(BlenderRNA *brna)
1036 {
1037   StructRNA *srna;
1038   PropertyRNA *prop;
1039
1040   srna = RNA_def_struct(brna, "BrushCapabilitiesWeightPaint", NULL);
1041   RNA_def_struct_sdna(srna, "Brush");
1042   RNA_def_struct_nested(brna, srna, "Brush");
1043   RNA_def_struct_ui_text(
1044       srna, "Weight Paint Capabilities", "Read-only indications of supported operations");
1045
1046 #  define WPAINT_TOOL_CAPABILITY(prop_name_, ui_name_) \
1047     prop = RNA_def_property(srna, #prop_name_, PROP_BOOLEAN, PROP_NONE); \
1048     RNA_def_property_clear_flag(prop, PROP_EDITABLE); \
1049     RNA_def_property_boolean_funcs( \
1050         prop, "rna_BrushCapabilitiesWeightPaint_" #prop_name_ "_get", NULL); \
1051     RNA_def_property_ui_text(prop, ui_name_, NULL)
1052
1053   WPAINT_TOOL_CAPABILITY(has_weight, "Has Weight");
1054
1055 #  undef WPAINT_TOOL_CAPABILITY
1056 }
1057
1058 static void rna_def_gpencil_options(BlenderRNA *brna)
1059 {
1060   StructRNA *srna;
1061   PropertyRNA *prop;
1062
1063   srna = RNA_def_struct(brna, "BrushGpencilSettings", NULL);
1064   RNA_def_struct_sdna(srna, "BrushGpencilSettings");
1065   RNA_def_struct_path_func(srna, "rna_BrushGpencilSettings_path");
1066   RNA_def_struct_ui_text(srna, "Grease Pencil Brush Settings", "Settings for grease pencil brush");
1067
1068   /* Sensitivity factor for new strokes */
1069   prop = RNA_def_property(srna, "pen_sensitivity_factor", PROP_FLOAT, PROP_NONE);
1070   RNA_def_property_float_sdna(prop, NULL, "draw_sensitivity");
1071   RNA_def_property_range(prop, 0.1f, 3.0f);
1072   RNA_def_property_ui_text(prop, "Sensitivity", "Pressure sensitivity factor for new strokes");
1073   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1074   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1075
1076   /* Strength factor for new strokes */
1077   prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_FACTOR);
1078   RNA_def_property_float_sdna(prop, NULL, "draw_strength");
1079   RNA_def_property_range(prop, 0.0f, 1.0f);
1080   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
1081   RNA_def_property_ui_text(
1082       prop, "Strength", "Color strength for new strokes (affect alpha factor of color)");
1083   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1084   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1085
1086   /* Jitter factor for new strokes */
1087   prop = RNA_def_property(srna, "pen_jitter", PROP_FLOAT, PROP_FACTOR);
1088   RNA_def_property_float_sdna(prop, NULL, "draw_jitter");
1089   RNA_def_property_range(prop, 0.0f, 1.0f);
1090   RNA_def_property_ui_text(prop, "Jitter", "Jitter factor for new strokes");
1091   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1092   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1093
1094   /* Randomnes factor for pressure */
1095   prop = RNA_def_property(srna, "random_pressure", PROP_FLOAT, PROP_FACTOR);
1096   RNA_def_property_float_sdna(prop, NULL, "draw_random_press");
1097   RNA_def_property_range(prop, 0.0f, 1.0f);
1098   RNA_def_property_ui_text(
1099       prop, "Pressure Randomness", "Randomness factor for pressure in new strokes");
1100   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1101   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1102
1103   /* Randomnes factor for strength */
1104   prop = RNA_def_property(srna, "random_strength", PROP_FLOAT, PROP_FACTOR);
1105   RNA_def_property_float_sdna(prop, NULL, "draw_random_strength");
1106   RNA_def_property_range(prop, 0.0f, 1.0f);
1107   RNA_def_property_ui_text(
1108       prop, "Strength Randomness", "Randomness factor strength in new strokes");
1109   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1110   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1111
1112   /* Randomnes factor for subdivision */
1113   prop = RNA_def_property(srna, "random_subdiv", PROP_FLOAT, PROP_FACTOR);
1114   RNA_def_property_float_sdna(prop, NULL, "draw_random_sub");
1115   RNA_def_property_range(prop, 0.0f, 1.0f);
1116   RNA_def_property_ui_text(
1117       prop, "Random Subdivision", "Randomness factor for new strokes after subdivision");
1118   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1119   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1120
1121   /* Angle when brush is full size */
1122   prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
1123   RNA_def_property_float_sdna(prop, NULL, "draw_angle");
1124   RNA_def_property_range(prop, -M_PI_2, M_PI_2);
1125   RNA_def_property_ui_text(prop,
1126                            "Angle",
1127                            "Direction of the stroke at which brush gives maximal thickness "
1128                            "(0° for horizontal)");
1129   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1130   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1131
1132   /* Factor to change brush size depending of angle */
1133   prop = RNA_def_property(srna, "angle_factor", PROP_FLOAT, PROP_FACTOR);
1134   RNA_def_property_float_sdna(prop, NULL, "draw_angle_factor");
1135   RNA_def_property_range(prop, 0.0f, 1.0f);
1136   RNA_def_property_ui_text(
1137       prop,
1138       "Angle Factor",
1139       "Reduce brush thickness by this factor when stroke is perpendicular to 'Angle' direction");
1140   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1141   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1142
1143   /* Smoothing factor for new strokes */
1144   prop = RNA_def_property(srna, "pen_smooth_factor", PROP_FLOAT, PROP_NONE);
1145   RNA_def_property_float_sdna(prop, NULL, "draw_smoothfac");
1146   RNA_def_property_range(prop, 0.0, 2.0f);
1147   RNA_def_property_ui_text(
1148       prop,
1149       "Smooth",
1150       "Amount of smoothing to apply after finish newly created strokes, to reduce jitter/noise");
1151   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1152   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1153
1154   /* Iterations of the Smoothing factor */
1155   prop = RNA_def_property(srna, "pen_smooth_steps", PROP_INT, PROP_NONE);
1156   RNA_def_property_int_sdna(prop, NULL, "draw_smoothlvl");
1157   RNA_def_property_range(prop, 1, 3);
1158   RNA_def_property_ui_text(prop, "Iterations", "Number of times to smooth newly created strokes");
1159   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1160   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1161
1162   /* Thickness smoothing factor for new strokes */
1163   prop = RNA_def_property(srna, "pen_thick_smooth_factor", PROP_FLOAT, PROP_NONE);
1164   RNA_def_property_float_sdna(prop, NULL, "thick_smoothfac");
1165   RNA_def_property_range(prop, 0.0, 2.0f);
1166   RNA_def_property_ui_text(prop,
1167                            "Smooth Thickness",
1168                            "Amount of thickness smoothing to apply after finish newly created "
1169                            "strokes, to reduce jitter/noise");
1170   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1171   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1172
1173   /* Thickness iterations of the Smoothing factor */
1174   prop = RNA_def_property(srna, "pen_thick_smooth_steps", PROP_INT, PROP_NONE);
1175   RNA_def_property_int_sdna(prop, NULL, "thick_smoothlvl");
1176   RNA_def_property_range(prop, 1, 3);
1177   RNA_def_property_ui_text(prop,
1178                            "Iterations Thickness",
1179                            "Number of times to smooth thickness for newly created strokes");
1180   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1181   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1182
1183   /* Subdivision level for new strokes */
1184   prop = RNA_def_property(srna, "pen_subdivision_steps", PROP_INT, PROP_NONE);
1185   RNA_def_property_int_sdna(prop, NULL, "draw_subdivide");
1186   RNA_def_property_range(prop, 0, 3);
1187   RNA_def_property_ui_text(
1188       prop,
1189       "Subdivision Steps",
1190       "Number of times to subdivide newly created strokes, for less jagged strokes");
1191   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1192   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1193
1194   /* Simplify factor */
1195   prop = RNA_def_property(srna, "simplify_factor", PROP_FLOAT, PROP_NONE);
1196   RNA_def_property_float_sdna(prop, NULL, "simplify_f");
1197   RNA_def_property_range(prop, 0, 100.0);
1198   RNA_def_property_ui_range(prop, 0, 100.0, 1.0f, 3);
1199   RNA_def_property_ui_text(prop, "Simplify", "Factor of Simplify using adaptive algorithm");
1200   RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
1201
1202   /* Curves for pressure */
1203   prop = RNA_def_property(srna, "curve_sensitivity", PROP_POINTER, PROP_NONE);
1204   RNA_def_property_pointer_sdna(prop, NULL, "curve_sensitivity");
1205   RNA_def_property_struct_type(prop, "CurveMapping");
1206   RNA_def_property_ui_text(prop, "Curve Sensitivity", "Curve used for the sensitivity");
1207   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1208   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1209
1210   prop = RNA_def_property(srna, "curve_strength", PROP_POINTER, PROP_NONE);
1211   RNA_def_property_pointer_sdna(prop, NULL, "curve_strength");
1212   RNA_def_property_struct_type(prop, "CurveMapping");
1213   RNA_def_property_ui_text(prop, "Curve Strength", "Curve used for the strength");
1214   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1215   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1216
1217   prop = RNA_def_property(srna, "curve_jitter", PROP_POINTER, PROP_NONE);
1218   RNA_def_property_pointer_sdna(prop, NULL, "curve_jitter");
1219   RNA_def_property_struct_type(prop, "CurveMapping");
1220   RNA_def_property_ui_text(prop, "Curve Jitter", "Curve used for the jitter effect");
1221   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1222   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1223
1224   /* fill threshold for transparence */
1225   prop = RNA_def_property(srna, "fill_threshold", PROP_FLOAT, PROP_FACTOR);
1226   RNA_def_property_float_sdna(prop, NULL, "fill_threshold");
1227   RNA_def_property_range(prop, 0.0f, 1.0f);
1228   RNA_def_property_ui_text(
1229       prop, "Threshold", "Threshold to consider color transparent for filling");
1230   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1231   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1232
1233   /* fill leak size */
1234   prop = RNA_def_property(srna, "fill_leak", PROP_INT, PROP_PIXEL);
1235   RNA_def_property_int_sdna(prop, NULL, "fill_leak");
1236   RNA_def_property_range(prop, 0, 100);
1237   RNA_def_property_ui_text(prop, "Leak Size", "Size in pixels to consider the leak closed");
1238   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1239   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1240
1241   /* fill factor size */
1242   prop = RNA_def_property(srna, "fill_factor", PROP_INT, PROP_NONE);
1243   RNA_def_property_int_sdna(prop, NULL, "fill_factor");
1244   RNA_def_property_range(prop, 1, 8);
1245   RNA_def_property_ui_text(
1246       prop,
1247       "Resolution",
1248       "Multiplier for fill resolution, higher resolution is more accurate but slower");
1249   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1250   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1251
1252   /* fill simplify steps */
1253   prop = RNA_def_property(srna, "fill_simplify_level", PROP_INT, PROP_NONE);
1254   RNA_def_property_int_sdna(prop, NULL, "fill_simplylvl");
1255   RNA_def_property_range(prop, 0, 10);
1256   RNA_def_property_ui_text(
1257       prop, "Simplify", "Number of simplify steps (large values reduce fill accuracy)");
1258   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1259   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1260
1261   prop = RNA_def_property(srna, "uv_random", PROP_FLOAT, PROP_FACTOR);
1262   RNA_def_property_float_sdna(prop, NULL, "uv_random");
1263   RNA_def_property_range(prop, 0.0, 1.0);
1264   RNA_def_property_ui_text(prop, "UV Random", "Random factor for autogenerated UV rotation");
1265   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1266   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1267
1268   /* gradient control */
1269   prop = RNA_def_property(srna, "gradient_factor", PROP_FLOAT, PROP_FACTOR);
1270   RNA_def_property_float_sdna(prop, NULL, "gradient_f");
1271   RNA_def_property_range(prop, 0.001f, 1.0f);
1272   RNA_def_property_float_default(prop, 1.0f);
1273   RNA_def_property_ui_text(prop,
1274                            "Border Opacity Factor",
1275                            "Amount of gradient for Dot and Box strokes (set to 1 for full solid)");
1276   RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
1277
1278   /* gradient shape ratio */
1279   prop = RNA_def_property(srna, "gradient_shape", PROP_FLOAT, PROP_XYZ);
1280   RNA_def_property_float_sdna(prop, NULL, "gradient_s");
1281   RNA_def_property_array(prop, 2);
1282   RNA_def_property_range(prop, 0.01f, 1.0f);
1283   RNA_def_property_float_default(prop, 1.0f);
1284   RNA_def_property_ui_text(prop, "Aspect Ratio", "");
1285   RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
1286
1287   prop = RNA_def_property(srna, "input_samples", PROP_INT, PROP_NONE);
1288   RNA_def_property_int_sdna(prop, NULL, "input_samples");
1289   RNA_def_property_range(prop, 0, GP_MAX_INPUT_SAMPLES);
1290   RNA_def_property_ui_text(
1291       prop,
1292       "Input Samples",
1293       "Generate intermediate points for very fast mouse movements. Set to 0 to disable");
1294   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1295   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1296
1297   /* active smooth factor while drawing */
1298   prop = RNA_def_property(srna, "active_smooth_factor", PROP_FLOAT, PROP_FACTOR);
1299   RNA_def_property_float_sdna(prop, NULL, "active_smooth");
1300   RNA_def_property_range(prop, 0.0f, 1.0f);
1301   RNA_def_property_ui_text(prop, "Active Smooth", "Amount of smoothing while drawing");
1302   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1303   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1304
1305   prop = RNA_def_property(srna, "eraser_strength_factor", PROP_FLOAT, PROP_PERCENTAGE);
1306   RNA_def_property_float_sdna(prop, NULL, "era_strength_f");
1307   RNA_def_property_range(prop, 0.0, 100.0);
1308   RNA_def_property_ui_range(prop, 0.0, 100.0, 10, 1);
1309   RNA_def_property_ui_text(prop, "Affect Stroke Strength", "Amount of erasing for strength");
1310   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1311   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1312
1313   prop = RNA_def_property(srna, "eraser_thickness_factor", PROP_FLOAT, PROP_PERCENTAGE);
1314   RNA_def_property_float_sdna(prop, NULL, "era_thickness_f");
1315   RNA_def_property_range(prop, 0.0, 100.0);
1316   RNA_def_property_ui_range(prop, 0.0, 100.0, 10, 1);
1317   RNA_def_property_ui_text(prop, "Affect Stroke Thickness", "Amount of erasing for thickness");
1318   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1319   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1320
1321   /* brush standard icon */
1322   prop = RNA_def_property(srna, "gp_icon", PROP_ENUM, PROP_NONE);
1323   RNA_def_property_enum_sdna(prop, NULL, "icon_id");
1324   RNA_def_property_enum_items(prop, rna_enum_gpencil_brush_icons_items);
1325   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1326   RNA_def_property_ui_text(prop, "Grease Pencil Icon", "");
1327
1328   /* Flags */
1329   prop = RNA_def_property(srna, "use_pressure", PROP_BOOLEAN, PROP_NONE);
1330   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_PRESSURE);
1331   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
1332   RNA_def_property_ui_text(prop, "Use Pressure", "Use tablet pressure");
1333   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1334   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1335
1336   prop = RNA_def_property(srna, "use_strength_pressure", PROP_BOOLEAN, PROP_NONE);
1337   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_STENGTH_PRESSURE);
1338   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
1339   RNA_def_property_ui_text(
1340       prop, "Use Pressure Strength", "Use tablet pressure for color strength");
1341   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1342   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1343
1344   prop = RNA_def_property(srna, "use_jitter_pressure", PROP_BOOLEAN, PROP_NONE);
1345   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_USE_JITTER_PRESSURE);
1346   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
1347   RNA_def_property_ui_text(prop, "Use Pressure Jitter", "Use tablet pressure for jitter");
1348   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1349   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
1350
1351   prop = RNA_def_property(srna, "use_settings_stabilizer", PROP_BOOLEAN, PROP_NONE);
1352   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_STABILIZE_MOUSE);
1353   RNA_def_property_boolean_default(prop, true);
1354   RNA_def_property_ui_text(prop,
1355                            "Use Stabilizer",
1356                            "Draw lines with a delay to allow smooth strokes. Press Shift key to "
1357                            "override while drawing");
1358   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1359
1360   prop = RNA_def_property(srna, "use_cursor", PROP_BOOLEAN, PROP_NONE);
1361   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_ENABLE_CURSOR);
1362   RNA_def_property_boolean_default(prop, true);
1363   RNA_def_property_ui_text(prop, "Enable Cursor", "Enable cursor on screen");
1364   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1365
1366   prop = RNA_def_property(srna, "eraser_mode", PROP_ENUM, PROP_NONE);
1367   RNA_def_property_enum_sdna(prop, NULL, "eraser_mode");
1368   RNA_def_property_enum_items(prop, rna_enum_gpencil_brush_eraser_modes_items);
1369   RNA_def_property_ui_text(prop, "Mode", "Eraser Mode");
1370   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1371   RNA_def_property_update(
1372       prop, NC_GPENCIL | ND_DATA, "rna_BrushGpencilSettings_eraser_mode_update");
1373
1374   prop = RNA_def_property(srna, "fill_draw_mode", PROP_ENUM, PROP_NONE);
1375   RNA_def_property_enum_sdna(prop, NULL, "fill_draw_mode");
1376   RNA_def_property_enum_items(prop, rna_enum_gpencil_fill_draw_modes_items);
1377   RNA_def_property_ui_text(prop, "Mode", "Mode to draw boundary limits");
1378   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1379
1380   prop = RNA_def_property(srna, "trim", PROP_BOOLEAN, PROP_NONE);
1381   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_TRIM_STROKE);
1382   RNA_def_property_boolean_default(prop, false);
1383   RNA_def_property_ui_text(prop, "Trim Stroke Ends", "Trim intersecting stroke ends");
1384   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1385
1386   /* Material */
1387   prop = RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
1388   RNA_def_property_struct_type(prop, "Material");
1389   RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_BrushGpencilSettings_material_poll");
1390   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK | PROP_CONTEXT_UPDATE);
1391   RNA_def_property_ui_text(prop, "Material", "Material used for strokes drawn using this brush");
1392   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1393   RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_Brush_material_update");
1394
1395   prop = RNA_def_property(srna, "show_fill_boundary", PROP_BOOLEAN, PROP_NONE);
1396   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_SHOW_HELPLINES);
1397   RNA_def_property_boolean_default(prop, true);
1398   RNA_def_property_ui_text(prop, "Show Lines", "Show help lines for filling to see boundaries");
1399   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1400
1401   prop = RNA_def_property(srna, "show_fill", PROP_BOOLEAN, PROP_NONE);
1402   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_FILL_HIDE);
1403   RNA_def_property_boolean_default(prop, true);
1404   RNA_def_property_ui_text(
1405       prop, "Show Fill", "Show transparent lines to use as boundary for filling");
1406   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1407
1408   prop = RNA_def_property(srna, "use_default_eraser", PROP_BOOLEAN, PROP_NONE);
1409   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_DEFAULT_ERASER);
1410   RNA_def_property_boolean_default(prop, true);
1411   RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
1412   RNA_def_property_ui_text(
1413       prop, "Default Eraser", "Use this brush when enable eraser with fast switch key");
1414   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1415   RNA_def_property_update(
1416       prop, NC_GPENCIL | ND_DATA, "rna_BrushGpencilSettings_default_eraser_update");
1417
1418   prop = RNA_def_property(srna, "use_settings_postprocess", PROP_BOOLEAN, PROP_NONE);
1419   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_GROUP_SETTINGS);
1420   RNA_def_property_ui_text(
1421       prop, "Use Post-Process Settings", "Additional post processing options for new strokes");
1422   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1423
1424   prop = RNA_def_property(srna, "use_settings_random", PROP_BOOLEAN, PROP_NONE);
1425   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_GROUP_RANDOM);
1426   RNA_def_property_ui_text(prop, "Random Settings", "Random brush settings");
1427   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1428
1429   prop = RNA_def_property(srna, "use_material_pin", PROP_BOOLEAN, PROP_NONE);
1430   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_MATERIAL_PINNED);
1431   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
1432   RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
1433   RNA_def_property_ui_text(prop, "Pin Material", "Keep material assigned to brush");
1434   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1435   RNA_def_property_update(
1436       prop, NC_GPENCIL | ND_DATA, "rna_BrushGpencilSettings_use_material_pin_update");
1437
1438   prop = RNA_def_property(srna, "show_lasso", PROP_BOOLEAN, PROP_NONE);
1439   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_DISSABLE_LASSO);
1440   RNA_def_property_ui_text(prop, "Show Lasso", "Do not draw fill color while drawing the stroke");
1441   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1442
1443   prop = RNA_def_property(srna, "use_occlude_eraser", PROP_BOOLEAN, PROP_NONE);
1444   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_OCCLUDE_ERASER);
1445   RNA_def_property_ui_text(prop, "Occlude Eraser", "Erase only strokes visible and not occluded");
1446   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1447 }
1448
1449 static void rna_def_brush(BlenderRNA *brna)
1450 {
1451   StructRNA *srna;
1452   PropertyRNA *prop;
1453
1454   static const EnumPropertyItem prop_blend_items[] = {
1455       {IMB_BLEND_MIX, "MIX", 0, "Mix", "Use Mix blending mode while painting"},
1456       {0, "", ICON_NONE, NULL, NULL},
1457       {IMB_BLEND_DARKEN, "DARKEN", 0, "Darken", "Use Darken blending mode while painting"},
1458       {IMB_BLEND_MUL, "MUL", 0, "Multiply", "Use Multiply blending mode while painting"},
1459       {IMB_BLEND_COLORBURN,
1460        "COLORBURN",
1461        0,
1462        "Color Burn",
1463        "Use Color Burn blending mode while painting"},
1464       {IMB_BLEND_LINEARBURN,
1465        "LINEARBURN",
1466        0,
1467        "Linear Burn",
1468        "Use Linear Burn blending mode while painting"},
1469       {0, "", ICON_NONE, NULL, NULL},
1470       {IMB_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", "Use Lighten blending mode while painting"},
1471       {IMB_BLEND_SCREEN, "SCREEN", 0, "Screen", "Use Screen blending mode while painting"},
1472       {IMB_BLEND_COLORDODGE,
1473        "COLORDODGE",
1474        0,
1475        "Color Dodge",
1476        "Use Color Dodge blending mode while painting"},
1477       {IMB_BLEND_ADD, "ADD", 0, "Add", "Use Add blending mode while painting"},
1478       {0, "", ICON_NONE, NULL, NULL},
1479       {IMB_BLEND_OVERLAY, "OVERLAY", 0, "Overlay", "Use Overlay blending mode while painting"},
1480       {IMB_BLEND_SOFTLIGHT,
1481        "SOFTLIGHT",
1482        0,
1483        "Soft Light",
1484        "Use Soft Light blending mode while painting"},
1485       {IMB_BLEND_HARDLIGHT,
1486        "HARDLIGHT",
1487        0,
1488        "Hard Light",
1489        "Use Hard Light blending mode while painting"},
1490       {IMB_BLEND_VIVIDLIGHT,
1491        "VIVIDLIGHT",
1492        0,
1493        "Vivid Light",
1494        "Use Vivid Light blending mode while painting"},
1495       {IMB_BLEND_LINEARLIGHT,
1496        "LINEARLIGHT",
1497        0,
1498        "Linear Light",
1499        "Use Linear Light blending mode while painting"},
1500       {IMB_BLEND_PINLIGHT,
1501        "PINLIGHT",
1502        0,
1503        "Pin Light",
1504        "Use Pin Light blending mode while painting"},
1505       {0, "", ICON_NONE, NULL, NULL},
1506       {IMB_BLEND_DIFFERENCE,
1507        "DIFFERENCE",
1508        0,
1509        "Difference",
1510        "Use Difference blending mode while painting"},
1511       {IMB_BLEND_EXCLUSION,
1512        "EXCLUSION",
1513        0,
1514        "Exclusion",
1515        "Use Exclusion blending mode while painting"},
1516       {IMB_BLEND_SUB, "SUB", 0, "Subtract", "Use Subtract blending mode while painting"},
1517       {0, "", ICON_NONE, NULL, NULL},
1518       {IMB_BLEND_HUE, "HUE", 0, "Hue", "Use Hue blending mode while painting"},
1519       {IMB_BLEND_SATURATION,
1520        "SATURATION",
1521        0,
1522        "Saturation",
1523        "Use Saturation blending mode while painting"},
1524       {IMB_BLEND_COLOR, "COLOR", 0, "Color", "Use Color blending mode while painting"},
1525       {IMB_BLEND_LUMINOSITY, "LUMINOSITY", 0, "Value", "Use Value blending mode while painting"},
1526       {0, "", ICON_NONE, NULL, NULL},
1527       {IMB_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting"},
1528       {IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
1529       {0, NULL, 0, NULL, NULL},
1530   };
1531
1532   static const EnumPropertyItem brush_sculpt_plane_items[] = {
1533       {SCULPT_DISP_DIR_AREA, "AREA", 0, "Area Plane", ""},
1534       {SCULPT_DISP_DIR_VIEW, "VIEW", 0, "View Plane", ""},
1535       {SCULPT_DISP_DIR_X, "X", 0, "X Plane", ""},
1536       {SCULPT_DISP_DIR_Y, "Y", 0, "Y Plane", ""},
1537       {SCULPT_DISP_DIR_Z, "Z", 0, "Z Plane", ""},
1538       {0, NULL, 0, NULL, NULL},
1539   };
1540
1541   static const EnumPropertyItem brush_mask_tool_items[] = {
1542       {BRUSH_MASK_DRAW, "DRAW", 0, "Draw", ""},
1543       {BRUSH_MASK_SMOOTH, "SMOOTH", 0, "Smooth", ""},
1544       {0, NULL, 0, NULL, NULL},
1545   };
1546
1547   static const EnumPropertyItem brush_blur_mode_items[] = {
1548       {KERNEL_BOX, "BOX", 0, "Box", ""},
1549       {KERNEL_GAUSSIAN, "GAUSSIAN", 0, "Gaussian", ""},
1550       {0, NULL, 0, NULL, NULL},
1551   };
1552
1553   static const EnumPropertyItem brush_gradient_items[] = {
1554       {BRUSH_GRADIENT_PRESSURE, "PRESSURE", 0, "Pressure", ""},
1555       {BRUSH_GRADIENT_SPACING_REPEAT, "SPACING_REPEAT", 0, "Repeat", ""},
1556       {BRUSH_GRADIENT_SPACING_CLAMP, "SPACING_CLAMP", 0, "Clamp", ""},
1557       {0, NULL, 0, NULL, NULL},
1558   };
1559
1560   static const EnumPropertyItem brush_gradient_fill_items[] = {
1561       {BRUSH_GRADIENT_LINEAR, "LINEAR", 0, "Linear", ""},
1562       {BRUSH_GRADIENT_RADIAL, "RADIAL", 0, "Radial", ""},
1563       {0, NULL, 0, NULL, NULL},
1564   };
1565
1566   static const EnumPropertyItem brush_mask_pressure_items[] = {
1567       {0, "NONE", 0, "Off", ""},
1568       {BRUSH_MASK_PRESSURE_RAMP, "RAMP", ICON_STYLUS_PRESSURE, "Ramp", ""},
1569       {BRUSH_MASK_PRESSURE_CUTOFF, "CUTOFF", ICON_STYLUS_PRESSURE, "Cutoff", ""},
1570       {0, NULL, 0, NULL, NULL},
1571   };
1572
1573   static const EnumPropertyItem brush_size_unit_items[] = {
1574       {0, "VIEW", 0, "View", "Measure brush size relative to the view"},
1575       {BRUSH_LOCK_SIZE, "SCENE", 0, "Scene", "Measure brush size relative to the scene"},
1576       {0, NULL, 0, NULL, NULL},
1577   };
1578
1579   static const EnumPropertyItem color_gradient_items[] = {
1580       {0, "COLOR", 0, "Color", "Paint with a single color"},
1581       {BRUSH_USE_GRADIENT, "GRADIENT", 0, "Gradient", "Paint with a gradient"},
1582       {0, NULL, 0, NULL, NULL},
1583   };
1584
1585   static const EnumPropertyItem brush_spacing_unit_items[] = {
1586       {0, "VIEW", 0, "View", "Calculate brush spacing relative to the view"},
1587       {BRUSH_SCENE_SPACING,
1588        "SCENE",
1589        0,
1590        "Scene",
1591        "Calculate brush spacing relative to the scene using the stroke location"},
1592       {0, NULL, 0, NULL, NULL},
1593   };
1594
1595   static const EnumPropertyItem brush_curve_preset_items[] = {
1596       {BRUSH_CURVE_CUSTOM, "CUSTOM", ICON_RNDCURVE, "Custom", ""},
1597       {BRUSH_CURVE_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
1598       {BRUSH_CURVE_SPHERE, "SPHERE", ICON_SPHERECURVE, "Sphere", ""},
1599       {BRUSH_CURVE_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
1600       {BRUSH_CURVE_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
1601       {BRUSH_CURVE_LIN, "LIN", ICON_LINCURVE, "Linear", ""},
1602       {BRUSH_CURVE_POW4, "POW4", ICON_SHARPCURVE, "Sharper", ""},
1603       {BRUSH_CURVE_INVSQUARE, "INVSQUARE", ICON_INVERSESQUARECURVE, "Inverse square", ""},
1604       {BRUSH_CURVE_CONSTANT, "CONSTANT", ICON_NOCURVE, "Constant", ""},
1605       {0, NULL, 0, NULL, NULL},
1606   };
1607
1608   static const EnumPropertyItem brush_elastic_deform_type_items[] = {
1609       {BRUSH_ELASTIC_DEFORM_GRAB, "GRAB", 0, "Grab", ""},
1610       {BRUSH_ELASTIC_DEFORM_GRAB_BISCALE, "GRAB_BISCALE", 0, "Bi-scale Grab", ""},
1611       {BRUSH_ELASTIC_DEFORM_GRAB_TRISCALE, "GRAB_TRISCALE", 0, "Tri-scale Grab", ""},
1612       {BRUSH_ELASTIC_DEFORM_SCALE, "SCALE", 0, "Scale", ""},
1613       {BRUSH_ELASTIC_DEFORM_TWIST, "TWIST", 0, "Twist", ""},
1614       {0, NULL, 0, NULL, NULL},
1615   };
1616
1617   srna = RNA_def_struct(brna, "Brush", "ID");
1618   RNA_def_struct_ui_text(
1619       srna, "Brush", "Brush data-block for storing brush settings for painting and sculpting");
1620   RNA_def_struct_ui_icon(srna, ICON_BRUSH_DATA);
1621
1622   /* enums */
1623   prop = RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
1624   RNA_def_property_enum_items(prop, prop_blend_items);
1625   RNA_def_property_ui_text(prop, "Blending Mode", "Brush blending mode");
1626   RNA_def_property_update(prop, 0, "rna_Brush_update");
1627
1628   /**
1629    * Begin per-mode tool properties.
1630    *
1631    * keep in sync with #BKE_paint_get_tool_prop_id_from_paintmode
1632    */
1633   prop = RNA_def_property(srna, "sculpt_tool", PROP_ENUM, PROP_NONE);
1634   RNA_def_property_enum_items(prop, rna_enum_brush_sculpt_tool_items);
1635   RNA_def_property_ui_text(prop, "Sculpt Tool", "");
1636   RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
1637
1638   prop = RNA_def_property(srna, "uv_sculpt_tool", PROP_ENUM, PROP_NONE);
1639   RNA_def_property_enum_items(prop, rna_enum_brush_uv_sculpt_tool_items);
1640   RNA_def_property_ui_text(prop, "Sculpt Tool", "");
1641   RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
1642
1643   prop = RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE);
1644   RNA_def_property_enum_sdna(prop, NULL, "vertexpaint_tool");
1645   RNA_def_property_enum_items(prop, rna_enum_brush_vertex_tool_items);
1646   RNA_def_property_ui_text(prop, "Vertex Paint Tool", "");
1647   RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
1648
1649   prop = RNA_def_property(srna, "weight_tool", PROP_ENUM, PROP_NONE);
1650   RNA_def_property_enum_sdna(prop, NULL, "weightpaint_tool");
1651   RNA_def_property_enum_items(prop, rna_enum_brush_weight_tool_items);
1652   RNA_def_property_ui_text(prop, "Weight Paint Tool", "");
1653   RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
1654
1655   prop = RNA_def_property(srna, "image_tool", PROP_ENUM, PROP_NONE);
1656   RNA_def_property_enum_sdna(prop, NULL, "imagepaint_tool");
1657   RNA_def_property_enum_items(prop, rna_enum_brush_image_tool_items);
1658   RNA_def_property_ui_text(prop, "Image Paint Tool", "");
1659   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, "rna_Brush_update_and_reset_icon");
1660
1661   prop = RNA_def_property(srna, "gpencil_tool", PROP_ENUM, PROP_NONE);
1662   RNA_def_property_enum_sdna(prop, NULL, "gpencil_tool");
1663   RNA_def_property_enum_items(prop, rna_enum_brush_gpencil_types_items);
1664   RNA_def_property_ui_text(prop, "Type", "Category of the brush");
1665   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1666   /** End per mode tool properties. */
1667
1668   prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
1669   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
1670   RNA_def_property_enum_items(prop, prop_direction_items);
1671   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Brush_direction_itemf");
1672   RNA_def_property_ui_text(prop, "Direction", "");
1673   RNA_def_property_update(prop, 0, "rna_Brush_update");
1674
1675   prop = RNA_def_property(srna, "stroke_method", PROP_ENUM, PROP_NONE);
1676   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
1677   RNA_def_property_enum_items(prop, sculpt_stroke_method_items);
1678   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Brush_stroke_itemf");
1679   RNA_def_property_ui_text(prop, "Stroke Method", "");
1680   RNA_def_property_update(prop, 0, "rna_Brush_stroke_update");
1681
1682   prop = RNA_def_property(srna, "sculpt_plane", PROP_ENUM, PROP_NONE);
1683   RNA_def_property_enum_items(prop, brush_sculpt_plane_items);
1684   RNA_def_property_ui_text(prop, "Sculpt Plane", "");
1685   RNA_def_property_update(prop, 0, "rna_Brush_update");
1686
1687   prop = RNA_def_property(srna, "mask_tool", PROP_ENUM, PROP_NONE);
1688   RNA_def_property_enum_items(prop, brush_mask_tool_items);
1689   RNA_def_property_ui_text(prop, "Mask Tool", "");
1690   RNA_def_property_update(prop, 0, "rna_Brush_update");
1691
1692   prop = RNA_def_property(srna, "curve_preset", PROP_ENUM, PROP_NONE);
1693   RNA_def_property_enum_items(prop, brush_curve_preset_items);
1694   RNA_def_property_ui_text(prop, "Curve Preset", "");
1695   RNA_def_property_update(prop, 0, "rna_Brush_update");
1696
1697   prop = RNA_def_property(srna, "elastic_deform_type", PROP_ENUM, PROP_NONE);
1698   RNA_def_property_enum_items(prop, brush_elastic_deform_type_items);
1699   RNA_def_property_ui_text(prop, "Deformation", "Deformation type that is used in the brush");
1700   RNA_def_property_update(prop, 0, "rna_Brush_update");
1701
1702   /* number values */
1703   prop = RNA_def_property(srna, "size", PROP_INT, PROP_PIXEL);
1704   RNA_def_property_int_funcs(prop, NULL, "rna_Brush_set_size", NULL);
1705   RNA_def_property_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS * 10);
1706   RNA_def_property_ui_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS, 1, -1);
1707   RNA_def_property_ui_text(prop, "Radius", "Radius of the brush in pixels");
1708   RNA_def_property_update(prop, 0, "rna_Brush_size_update");
1709
1710   prop = RNA_def_property(srna, "unprojected_radius", PROP_FLOAT, PROP_DISTANCE);
1711   RNA_def_property_float_funcs(prop, NULL, "rna_Brush_set_unprojected_radius", NULL);
1712   RNA_def_property_range(prop, 0.001, FLT_MAX);
1713   RNA_def_property_ui_range(prop, 0.001, 1, 1, -1);
1714   RNA_def_property_ui_text(prop, "Unprojected Radius", "Radius of brush in Blender units");
1715   RNA_def_property_update(prop, 0, "rna_Brush_size_update");
1716
1717   prop = RNA_def_property(srna, "jitter", PROP_FLOAT, PROP_NONE);
1718   RNA_def_property_float_sdna(prop, NULL, "jitter");
1719   RNA_def_property_range(prop, 0.0f, 1000.0f);
1720   RNA_def_property_ui_range(prop, 0.0f, 2.0f, 0.1, 4);
1721   RNA_def_property_ui_text(prop, "Jitter", "Jitter the position of the brush while painting");
1722   RNA_def_property_update(prop, 0, "rna_Brush_update");
1723
1724   prop = RNA_def_property(srna, "jitter_absolute", PROP_INT, PROP_PIXEL);
1725   RNA_def_property_int_sdna(prop, NULL, "jitter_absolute");
1726   RNA_def_property_range(prop, 0, 1000000);
1727   RNA_def_property_ui_text(
1728       prop, "Jitter", "Jitter the position of the brush in pixels while painting");
1729   RNA_def_property_update(prop, 0, "rna_Brush_update");
1730
1731   prop = RNA_def_property(srna, "spacing", PROP_INT, PROP_PERCENTAGE);
1732   RNA_def_property_int_sdna(prop, NULL, "spacing");
1733   RNA_def_property_range(prop, 1, 1000);
1734   RNA_def_property_ui_range(prop, 1, 500, 5, -1);
1735   RNA_def_property_ui_text(
1736       prop, "Spacing", "Spacing between brush daubs as a percentage of brush diameter");
1737   RNA_def_property_update(prop, 0, "rna_Brush_update");
1738
1739   prop = RNA_def_property(srna, "grad_spacing", PROP_INT, PROP_PIXEL);
1740   RNA_def_property_int_sdna(prop, NULL, "gradient_spacing");
1741   RNA_def_property_range(prop, 1, 10000);
1742   RNA_def_property_ui_range(prop, 1, 10000, 5, -1);
1743   RNA_def_property_ui_text(
1744       prop, "Gradient Spacing", "Spacing before brush gradient goes full circle");
1745   RNA_def_property_update(prop, 0, "rna_Brush_update");
1746
1747   prop = RNA_def_property(srna, "smooth_stroke_radius", PROP_INT, PROP_PIXEL);
1748   RNA_def_property_range(prop, 10, 200);
1749   RNA_def_property_ui_text(
1750       prop, "Smooth Stroke Radius", "Minimum distance from last point before stroke continues");
1751   RNA_def_property_update(prop, 0, "rna_Brush_update");
1752
1753   prop = RNA_def_property(srna, "smooth_stroke_factor", PROP_FLOAT, PROP_FACTOR);
1754   RNA_def_property_range(prop, 0.5, 0.99);
1755   RNA_def_property_ui_text(prop, "Smooth Stroke Factor", "Higher values give a smoother stroke");
1756   RNA_def_property_update(prop, 0, "rna_Brush_update");
1757
1758   prop = RNA_def_property(srna, "rate", PROP_FLOAT, PROP_NONE);
1759   RNA_def_property_float_sdna(prop, NULL, "rate");
1760   RNA_def_property_range(prop, 0.0001f, 10000.0f);
1761   RNA_def_property_ui_range(prop, 0.01f, 1.0f, 1, 3);
1762   RNA_def_property_ui_text(prop, "Rate", "Interval between paints for Airbrush");
1763   RNA_def_property_update(prop, 0, "rna_Brush_update");
1764
1765   prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
1766   RNA_def_property_range(prop, 0.0, 1.0);
1767   RNA_def_property_float_sdna(prop, NULL, "rgb");
1768   RNA_def_property_ui_text(prop, "Color", "");
1769   RNA_def_property_update(prop, 0, "rna_Brush_update");
1770
1771   prop = RNA_def_property(srna, "secondary_color", PROP_FLOAT, PROP_COLOR_GAMMA);
1772   RNA_def_property_range(prop, 0.0, 1.0);
1773   RNA_def_property_float_sdna(prop, NULL, "secondary_rgb");
1774   RNA_def_property_ui_text(prop, "Secondary Color", "");
1775   RNA_def_property_update(prop, 0, "rna_Brush_update");
1776
1777   prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_FACTOR);
1778   RNA_def_property_range(prop, 0.0f, 1.0f);
1779   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
1780   RNA_def_property_ui_text(prop, "Weight", "Vertex weight when brush is applied");
1781   RNA_def_property_update(prop, 0, "rna_Brush_update");
1782
1783   prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_FACTOR);
1784   RNA_def_property_float_sdna(prop, NULL, "alpha");
1785   RNA_def_property_range(prop, 0.0f, 10.0f);
1786   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
1787   RNA_def_property_ui_text(
1788       prop, "Strength", "How powerful the effect of the brush is when applied");
1789   RNA_def_property_update(prop, 0, "rna_Brush_update");
1790
1791   prop = RNA_def_property(srna, "plane_offset", PROP_FLOAT, PROP_DISTANCE);
1792   RNA_def_property_float_sdna(prop, NULL, "plane_offset");
1793   RNA_def_property_float_default(prop, 0);
1794   RNA_def_property_range(prop, -2.0f, 2.0f);
1795   RNA_def_property_ui_range(prop, -0.5f, 0.5f, 0.001, 3);
1796   RNA_def_property_ui_text(
1797       prop,
1798       "Plane Offset",
1799       "Adjust plane on which the brush acts towards or away from the object surface");
1800   RNA_def_property_update(prop, 0, "rna_Brush_update");
1801
1802   prop = RNA_def_property(srna, "plane_trim", PROP_FLOAT, PROP_DISTANCE);
1803   RNA_def_property_float_sdna(prop, NULL, "plane_trim");
1804   RNA_def_property_range(prop, 0, 1.0f);
1805   RNA_def_property_ui_text(
1806       prop,
1807       "Plane Trim",
1808       "If a vertex is further away from offset plane than this, then it is not affected");
1809   RNA_def_property_update(prop, 0, "rna_Brush_update");
1810
1811   prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
1812   RNA_def_property_float_sdna(prop, NULL, "height");
1813   RNA_def_property_float_default(prop, 0.5f);
1814   RNA_def_property_range(prop, 0, 1.0f);
1815   RNA_def_property_ui_text(
1816       prop, "Brush Height", "Affectable height of brush (layer height for layer tool, i.e.)");
1817   RNA_def_property_update(prop, 0, "rna_Brush_update");
1818
1819   prop = RNA_def_property(srna, "texture_sample_bias", PROP_FLOAT, PROP_DISTANCE);
1820   RNA_def_property_float_sdna(prop, NULL, "texture_sample_bias");
1821   RNA_def_property_float_default(prop, 0);
1822   RNA_def_property_range(prop, -1, 1);
1823   RNA_def_property_ui_text(prop, "Texture Sample Bias", "Value added to texture samples");
1824   RNA_def_property_update(prop, 0, "rna_Brush_update");
1825
1826   prop = RNA_def_property(srna, "normal_weight", PROP_FLOAT, PROP_FACTOR);
1827   RNA_def_property_float_sdna(prop, NULL, "normal_weight");
1828   RNA_def_property_float_default(prop, 0);
1829   RNA_def_property_range(prop, 0.0f, 1.0f);
1830   RNA_def_property_ui_text(
1831       prop, "Normal Weight", "How much grab will pull vertexes out of surface during a grab");
1832   RNA_def_property_update(prop, 0, "rna_Brush_update");
1833
1834   prop = RNA_def_property(srna, "elastic_deform_volume_preservation", PROP_FLOAT, PROP_NONE);
1835   RNA_def_property_float_sdna(prop, NULL, "elastic_deform_volume_preservation");
1836   RNA_def_property_range(prop, 0.0f, 0.9f);
1837   RNA_def_property_ui_range(prop, 0.0f, 0.9f, 0.01f, 3);
1838   RNA_def_property_ui_text(prop,
1839                            "Volume Preservation",
1840                            "Poisson ratio for elastic deformation. Higher values preserve volume "
1841                            "more, but also lead to more bulging");
1842   RNA_def_property_update(prop, 0, "rna_Brush_update");
1843
1844   prop = RNA_def_property(srna, "rake_factor", PROP_FLOAT, PROP_FACTOR);
1845   RNA_def_property_float_sdna(prop, NULL, "rake_factor");
1846   RNA_def_property_float_default(prop, 0);
1847   RNA_def_property_range(prop, 0.0f, 10.0f);
1848   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
1849   RNA_def_property_ui_text(prop, "Rake", "How much grab will follow cursor rotation");
1850   RNA_def_property_update(prop, 0, "rna_Brush_update");
1851
1852   prop = RNA_def_property(srna, "crease_pinch_factor", PROP_FLOAT, PROP_FACTOR);
1853   RNA_def_property_float_sdna(prop, NULL, "crease_pinch_factor");
1854   RNA_def_property_range(prop, 0.0f, 1.0f);
1855   RNA_def_property_ui_text(prop, "Crease Brush Pinch Factor", "How much the crease brush pinches");
1856   RNA_def_property_update(prop, 0, "rna_Brush_update");
1857
1858   prop = RNA_def_property(srna, "pose_offset", PROP_FLOAT, PROP_FACTOR);
1859   RNA_def_property_float_sdna(prop, NULL, "pose_offset");
1860   RNA_def_property_range(prop, 0.0f, 2.0f);
1861   RNA_def_property_ui_text(
1862       prop, "Pose Origin Offset", "Offset of the pose origin in relation to the brush radius");
1863   RNA_def_property_update(prop, 0, "rna_Brush_update");
1864
1865   prop = RNA_def_property(srna, "auto_smooth_factor", PROP_FLOAT, PROP_FACTOR);
1866   RNA_def_property_float_sdna(prop, NULL, "autosmooth_factor");
1867   RNA_def_property_float_default(prop, 0);
1868   RNA_def_property_range(prop, 0.0f, 1.0f);
1869   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
1870   RNA_def_property_ui_text(
1871       prop, "Autosmooth", "Amount of smoothing to automatically apply to each stroke");
1872   RNA_def_property_update(prop, 0, "rna_Brush_update");
1873
1874   prop = RNA_def_property(srna, "topology_rake_factor", PROP_FLOAT, PROP_FACTOR);
1875   RNA_def_property_float_sdna(prop, NULL, "topology_rake_factor");
1876   RNA_def_property_float_default(prop, 0);
1877   RNA_def_property_range(prop, 0.0f, 1.0f);
1878   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
1879   RNA_def_property_ui_text(prop,
1880                            "Topology Rake",
1881                            "Automatically align edges to the brush direction to "
1882                            "generate cleaner topology and define sharp features. "
1883                            "Best used on low-poly meshes as it has a performance impact");
1884   RNA_def_property_update(prop, 0, "rna_Brush_update");
1885
1886   prop = RNA_def_property(srna, "normal_radius_factor", PROP_FLOAT, PROP_FACTOR);
1887   RNA_def_property_float_sdna(prop, NULL, "normal_radius_factor");
1888   RNA_def_property_range(prop, 0.0f, 2.0f);
1889   RNA_def_property_ui_range(prop, 0.0f, 2.0f, 0.001, 3);
1890   RNA_def_property_ui_text(prop,
1891                            "Normal Radius",
1892                            "Ratio between the brush radius and the radius that is going to be "
1893                            "used to sample the normal");
1894   RNA_def_property_update(prop, 0, "rna_Brush_update");
1895
1896   prop = RNA_def_property(srna, "stencil_pos", PROP_FLOAT, PROP_XYZ);
1897   RNA_def_property_float_sdna(prop, NULL, "stencil_pos");
1898   RNA_def_property_array(prop, 2);
1899   RNA_def_property_ui_text(prop, "Stencil Position", "Position of stencil in viewport");
1900   RNA_def_property_update(prop, 0, "rna_Brush_update");
1901
1902   prop = RNA_def_property(srna, "stencil_dimension", PROP_FLOAT, PROP_XYZ);
1903   RNA_def_property_float_sdna(prop, NULL, "stencil_dimension");
1904   RNA_def_property_array(prop, 2);
1905   RNA_def_property_ui_text(prop, "Stencil Dimensions", "Dimensions of stencil in viewport");
1906   RNA_def_property_update(prop, 0, "rna_Brush_update");
1907
1908   prop = RNA_def_property(srna, "mask_stencil_pos", PROP_FLOAT, PROP_XYZ);
1909   RNA_def_property_float_sdna(prop, NULL, "mask_stencil_pos");
1910   RNA_def_property_array(prop, 2);
1911   RNA_def_property_ui_text(prop, "Mask Stencil Position", "Position of mask stencil in viewport");
1912   RNA_def_property_update(prop, 0, "rna_Brush_update");
1913
1914   prop = RNA_def_property(srna, "mask_stencil_dimension", PROP_FLOAT, PROP_XYZ);
1915   RNA_def_property_float_sdna(prop, NULL, "mask_stencil_dimension");
1916   RNA_def_property_array(prop, 2);
1917   RNA_def_property_ui_text(
1918       prop, "Mask Stencil Dimensions", "Dimensions of mask stencil in viewport");
1919   RNA_def_property_update(prop, 0, "rna_Brush_update");
1920
1921   prop = RNA_def_property(srna, "sharp_threshold", PROP_FLOAT, PROP_NONE);
1922   RNA_def_property_range(prop, 0.0, 100.0);
1923   RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 3);
1924   RNA_def_property_float_sdna(prop, NULL, "sharp_threshold");
1925   RNA_def_property_ui_text(
1926       prop, "Sharp Threshold", "Threshold below which, no sharpening is done");
1927   RNA_def_property_update(prop, 0, "rna_Brush_update");
1928
1929   prop = RNA_def_property(srna, "fill_threshold", PROP_FLOAT, PROP_NONE);
1930   RNA_def_property_range(prop, 0.0, 100.0);
1931   RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 3);
1932   RNA_def_property_float_sdna(prop, NULL, "fill_threshold");
1933   RNA_def_property_ui_text(
1934       prop, "Fill Threshold", "Threshold above which filling is not propagated");
1935   RNA_def_property_update(prop, 0, "rna_Brush_update");
1936
1937   prop = RNA_def_property(srna, "blur_kernel_radius", PROP_INT, PROP_NONE);
1938   RNA_def_property_int_sdna(prop, NULL, "blur_kernel_radius");
1939   RNA_def_property_range(prop, 1, 10000);
1940   RNA_def_property_ui_range(prop, 1, 50, 1, -1);
1941   RNA_def_property_ui_text(
1942       prop, "Kernel Radius", "Radius of kernel used for soften and sharpen in pixels");
1943   RNA_def_property_update(prop, 0, "rna_Brush_update");
1944
1945   prop = RNA_def_property(srna, "blur_mode", PROP_ENUM, PROP_NONE);
1946   RNA_def_property_enum_items(prop, brush_blur_mode_items);
1947   RNA_def_property_ui_text(prop, "Blur Mode", "");
1948   RNA_def_property_update(prop, 0, "rna_Brush_update");
1949
1950   prop = RNA_def_property(srna, "falloff_angle", PROP_FLOAT, PROP_ANGLE);
1951   RNA_def_property_float_sdna(prop, NULL, "falloff_angle");
1952   RNA_def_property_range(prop, 0, M_PI / 2);
1953   RNA_def_property_ui_text(
1954       prop,
1955       "Falloff Angle",
1956       "Paint most on faces pointing towards the view according to this angle");
1957   RNA_def_property_update(prop, 0, "rna_Brush_update");
1958
1959   /* flag */
1960   /* This is an enum but its unlikely we add other shapes, so expose as a boolean. */
1961   prop = RNA_def_property(srna, "use_projected", PROP_BOOLEAN, PROP_NONE);
1962   RNA_def_property_boolean_sdna(prop, NULL, "falloff_shape", BRUSH_AIRBRUSH);
1963   RNA_def_property_ui_text(
1964       prop, "2D Falloff", "Apply brush influence in 2D circle instead of a sphere");
1965   RNA_def_property_update(prop, 0, "rna_Brush_update");
1966
1967   prop = RNA_def_property(srna, "use_airbrush", PROP_BOOLEAN, PROP_NONE);
1968   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_AIRBRUSH);
1969   RNA_def_property_ui_text(
1970       prop, "Airbrush", "Keep applying paint effect while holding mouse (spray)");
1971   RNA_def_property_update(prop, 0, "rna_Brush_update");
1972
1973   prop = RNA_def_property(srna, "use_original_normal", PROP_BOOLEAN, PROP_NONE);
1974   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ORIGINAL_NORMAL);
1975   RNA_def_property_ui_text(prop,
1976                            "Original Normal",
1977                            "When locked keep using normal of surface where stroke was initiated");
1978   RNA_def_property_update(prop, 0, "rna_Brush_update");
1979
1980   prop = RNA_def_property(srna, "use_original_plane", PROP_BOOLEAN, PROP_NONE);
1981   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ORIGINAL_PLANE);
1982   RNA_def_property_ui_text(
1983       prop,
1984       "Original Plane",
1985       "When locked keep using the plane origin of surface where stroke was initiated");
1986   RNA_def_property_update(prop, 0, "rna_Brush_update");
1987
1988   prop = RNA_def_property(srna, "use_automasking_topology", PROP_BOOLEAN, PROP_NONE);
1989   RNA_def_property_boolean_sdna(prop, NULL, "automasking_flags", BRUSH_AUTOMASKING_TOPOLOGY);
1990   RNA_def_property_ui_text(prop,
1991                            "Topology Automasking",
1992                            "Affect only vertices connected to the active vertex under the brush");
1993   RNA_def_property_update(prop, 0, "rna_Brush_update");
1994
1995   prop = RNA_def_property(srna, "use_scene_spacing", PROP_ENUM, PROP_NONE);
1996   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
1997   RNA_def_property_enum_items(prop, brush_spacing_unit_items);
1998   RNA_def_property_ui_text(
1999       prop, "Spacing Distance", "Calculate the brush spacing using view or scene distance");
2000   RNA_def_property_update(prop, 0, "rna_Brush_update");
2001
2002   prop = RNA_def_property(srna, "use_grab_active_vertex", PROP_BOOLEAN, PROP_NONE);
2003   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_GRAB_ACTIVE_VERTEX);
2004   RNA_def_property_ui_text(
2005       prop,
2006       "Grab Active Vertex",
2007       "Apply the maximum grab strength to the active vertex instead of the cursor location");
2008   RNA_def_property_update(prop, 0, "rna_Brush_update");
2009
2010   prop = RNA_def_property(srna, "use_pressure_strength", PROP_BOOLEAN, PROP_NONE);
2011   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ALPHA_PRESSURE);
2012   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
2013   RNA_def_property_ui_text(
2014       prop, "Strength Pressure", "Enable tablet pressure sensitivity for strength");
2015   RNA_def_property_update(prop, 0, "rna_Brush_update");
2016
2017   prop = RNA_def_property(srna, "use_offset_pressure", PROP_BOOLEAN, PROP_NONE);
2018   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_OFFSET_PRESSURE);
2019   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
2020   RNA_def_property_ui_text(
2021       prop, "Plane Offset Pressure", "Enable tablet pressure sensitivity for offset");
2022   RNA_def_property_update(prop, 0, "rna_Brush_update");
2023
2024   prop = RNA_def_property(srna, "use_pressure_size", PROP_BOOLEAN, PROP_NONE);
2025   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SIZE_PRESSURE);
2026   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
2027   RNA_def_property_ui_text(prop, "Size Pressure", "Enable tablet pressure sensitivity for size");
2028   RNA_def_property_update(prop, 0, "rna_Brush_update");
2029
2030   prop = RNA_def_property(srna, "use_pressure_jitter", PROP_BOOLEAN, PROP_NONE);
2031   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_JITTER_PRESSURE);
2032   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
2033   RNA_def_property_ui_text(
2034       prop, "Jitter Pressure", "Enable tablet pressure sensitivity for jitter");
2035   RNA_def_property_update(prop, 0, "rna_Brush_update");
2036
2037   prop = RNA_def_property(srna, "use_pressure_spacing", PROP_BOOLEAN, PROP_NONE);
2038   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACING_PRESSURE);
2039   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
2040   RNA_def_property_ui_text(
2041       prop, "Spacing Pressure", "Enable tablet pressure sensitivity for spacing");
2042   RNA_def_property_update(prop, 0, "rna_Brush_update");
2043
2044   prop = RNA_def_property(srna, "use_pressure_masking", PROP_ENUM, PROP_NONE);
2045   RNA_def_property_enum_sdna(prop, NULL, "mask_pressure");
2046   RNA_def_property_enum_items(prop, brush_mask_pressure_items);
2047   RNA_def_property_ui_text(
2048       prop, "Mask Pressure Mode", "Pen pressure makes texture influence smaller");
2049   RNA_def_property_update(prop, 0, "rna_Brush_update");
2050
2051   prop = RNA_def_property(srna, "use_inverse_smooth_pressure", PROP_BOOLEAN, PROP_NONE);
2052   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_INVERSE_SMOOTH_PRESSURE);
2053   RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
2054   RNA_def_property_ui_text(
2055       prop, "Inverse Smooth Pressure", "Lighter pressure causes more smoothing to be applied");
2056   RNA_def_property_update(prop, 0, "rna_Brush_update");
2057
2058   prop = RNA_def_property(srna, "use_relative_jitter", PROP_BOOLEAN, PROP_NONE);
2059   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BRUSH_ABSOLUTE_JITTER);
2060   RNA_def_property_ui_icon(prop, ICON_UNLOCKED, true);
2061   RNA_def_property_ui_text(
2062       prop, "Absolute Jitter", "Jittering happens in screen space, not relative to brush size");
2063   RNA_def_property_update(prop, 0, "rna_Brush_update");
2064
2065   prop = RNA_def_property(srna, "use_plane_trim", PROP_BOOLEAN, PROP_NONE);
2066   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_PLANE_TRIM);
2067   RNA_def_property_ui_text(prop, "Use Plane Trim", "Enable Plane Trim");
2068   RNA_def_property_update(prop, 0, "rna_Brush_update");
2069
2070   prop = RNA_def_property(srna, "use_frontface", PROP_BOOLEAN, PROP_NONE);
2071   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FRONTFACE);
2072   RNA_def_property_ui_text(
2073       prop, "Use Front-Face", "Brush only affects vertexes that face the viewer");
2074   RNA_def_property_update(prop, 0, "rna_Brush_update");
2075
2076   prop = RNA_def_property(srna, "use_frontface_falloff", PROP_BOOLEAN, PROP_NONE);
2077   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FRONTFACE_FALLOFF);
2078   RNA_def_property_ui_text(
2079       prop, "Use Front-Face Falloff", "Blend brush influence by how much they face the front");
2080   RNA_def_property_update(prop, 0, "rna_Brush_update");
2081
2082   prop = RNA_def_property(srna, "use_anchor", PROP_BOOLEAN, PROP_NONE);
2083   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ANCHORED);
2084   RNA_def_property_ui_text(prop, "Anchored", "Keep the brush anchored to the initial location");
2085   RNA_def_property_update(prop, 0, "rna_Brush_update");
2086
2087   prop = RNA_def_property(srna, "use_space", PROP_BOOLEAN, PROP_NONE);
2088   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACE);
2089   RNA_def_property_ui_text(
2090       prop, "Space", "Limit brush application to the distance specified by spacing");
2091   RNA_def_property_update(prop, 0, "rna_Brush_update");
2092
2093   prop = RNA_def_property(srna, "use_line", PROP_BOOLEAN, PROP_NONE);
2094   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_LINE);
2095   RNA_def_property_ui_text(prop, "Line", "Draw a line with dabs separated according to spacing");
2096   RNA_def_property_update(prop, 0, "rna_Brush_update");
2097
2098   prop = RNA_def_property(srna, "use_curve", PROP_BOOLEAN, PROP_NONE);
2099   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_CURVE);
2100   RNA_def_property_ui_text(
2101       prop,
2102       "Curve",
2103       "Define the stroke curve with a bezier curve. Dabs are separated according to spacing");
2104   RNA_def_property_update(prop, 0, "rna_Brush_update");
2105
2106   prop = RNA_def_property(srna, "use_smooth_stroke", PROP_BOOLEAN, PROP_NONE);
2107   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SMOOTH_STROKE);
2108   RNA_def_property_ui_text(
2109       prop, "Smooth Stroke", "Brush lags behind mouse and follows a smoother path");
2110   RNA_def_property_update(prop, 0, "rna_Brush_update");
2111
2112   prop = RNA_def_property(srna, "use_persistent", PROP_BOOLEAN, PROP_NONE);
2113   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_PERSISTENT);
2114   RNA_def_property_ui_text(prop, "Persistent", "Sculpt on a persistent layer of the mesh");
2115   RNA_def_property_update(prop, 0, "rna_Brush_update");
2116
2117   prop = RNA_def_property(srna, "use_accumulate", PROP_BOOLEAN, PROP_NONE);
2118   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ACCUMULATE);
2119   RNA_def_property_ui_text(prop, "Accumulate", "Accumulate stroke daubs on top of each other");
2120   RNA_def_property_update(prop, 0, "rna_Brush_update");
2121
2122   prop = RNA_def_property(srna, "use_space_attenuation", PROP_BOOLEAN, PROP_NONE);
2123   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACE_ATTEN);
2124   RNA_def_property_ui_text(
2125       prop,
2126       "Adjust Strength for Spacing",
2127       "Automatically adjust strength to give consistent results for different spacings");
2128   RNA_def_property_update(prop, 0, "rna_Brush_update");
2129
2130   /* adaptive space is not implemented yet */
2131   prop = RNA_def_property(srna, "use_adaptive_space", PROP_BOOLEAN, PROP_NONE);
2132   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ADAPTIVE_SPACE);
2133   RNA_def_property_ui_text(prop,
2134                            "Adaptive Spacing",
2135                            "Space daubs according to surface orientation instead of screen space");
2136   RNA_def_property_update(prop, 0, "rna_Brush_update");
2137
2138   prop = RNA_def_property(srna, "use_locked_size", PROP_ENUM, PROP_NONE); /* as an enum */
2139   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
2140   RNA_def_property_enum_items(prop, brush_size_unit_items);
2141   RNA_def_property_ui_text(
2142       prop, "Radius Unit", "Measure brush size relative to the view or the scene");
2143   RNA_def_property_update(prop, 0, "rna_Brush_update");
2144
2145   prop = RNA_def_property(srna, "color_type", PROP_ENUM, PROP_NONE); /* as an enum */
2146   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
2147   RNA_def_property_enum_items(prop, color_gradient_items);
2148   RNA_def_property_enum_funcs(prop, NULL, "rna_Brush_use_gradient_set", NULL);
2149   RNA_def_property_ui_text(prop, "Color Type", "Use single color or gradient when painting");
2150   RNA_def_property_update(prop, 0, "rna_Brush_update");
2151
2152   prop = RNA_def_property(srna, "use_edge_to_edge", PROP_BOOLEAN, PROP_NONE);
2153   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_EDGE_TO_EDGE);
2154   RNA_def_property_ui_text(prop, "Edge-to-edge", "Drag anchor brush from edge-to-edge");
2155   RNA_def_property_update(prop, 0, "rna_Brush_update");
2156
2157   prop = RNA_def_property(srna, "use_restore_mesh", PROP_BOOLEAN, PROP_NONE);
2158   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_DRAG_DOT);
2159   RNA_def_property_ui_text(prop, "Restore Mesh", "Allow a single dot to be carefully positioned");
2160   RNA_def_property_update(prop, 0, "rna_Brush_update");
2161
2162   /* only for projection paint & vertex paint, TODO, other paint modes */
2163   prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
2164   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BRUSH_LOCK_ALPHA);
2165   RNA_def_property_ui_text(
2166       prop, "Affect Alpha", "When this is disabled, lock alpha while painting");
2167   RNA_def_property_update(prop, 0, "rna_Brush_update");
2168
2169   prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
2170   RNA_def_property_flag(prop, PROP_NEVER_NULL);
2171   RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve");
2172   RNA_def_property_update(prop, 0, "rna_Brush_update");
2173
2174   prop = RNA_def_property(srna, "paint_curve", PROP_POINTER, PROP_NONE);
2175   RNA_def_property_flag(prop, PROP_EDITABLE);
2176   RNA_def_property_ui_text(prop, "Paint Curve", "Active Paint Curve");
2177   RNA_def_property_update(prop, 0, "rna_Brush_update");
2178
2179   prop = RNA_def_property(srna, "gradient", PROP_POINTER, PROP_NEVER_NULL);
2180   RNA_def_property_pointer_sdna(prop, NULL, "gradient");
2181   RNA_def_property_struct_type(prop, "ColorRamp");
2182   RNA_def_property_ui_text(prop, "Gradient", "");
2183   RNA_def_property_update(prop, 0, "rna_Brush_update");
2184
2185   /* gradient source */
2186   prop = RNA_def_property(srna, "gradient_stroke_mode", PROP_ENUM, PROP_NONE);
2187   RNA_def_property_enum_items(prop, brush_gradient_items);
2188   RNA_def_property_ui_text(prop, "Gradient Stroke Mode", "");
2189   RNA_def_property_update(prop, 0, "rna_Brush_update");
2190
2191   prop = RNA_def_property(srna, "gradient_fill_mode", PROP_ENUM, PROP_NONE);
2192   RNA_def_property_enum_items(prop, brush_gradient_fill_items);
2193   RNA_def_property_ui_text(prop, "Gradient Fill Mode", "");
2194   RNA_def_property_update(prop, 0, "rna_Brush_update");
2195
2196   /* overlay flags */
2197   prop = RNA_def_property(srna, "use_primary_overlay", PROP_BOOLEAN, PROP_NONE);
2198   RNA_def_property_boolean_sdna(prop, NULL, "overlay_flags", BRUSH_OVERLAY_PRIMARY);
2199   RNA_def_property_ui_text(prop, "Use Texture Overlay", "Show texture in viewport");
2200   RNA_def_property_update(prop, 0, "rna_Brush_update");
2201
2202   prop = RNA_def_property(srna, "use_secondary_overlay", PROP_BOOLEAN, PROP_NONE);
2203   RNA_def_property_boolean_sdna(prop, NULL, "overlay_flags", BRUSH_OVERLAY_SECONDARY);
2204   RNA_def_property_ui_text(prop, "Use Texture Overlay", "Show texture in viewport");
2205   RNA_def_property_update(prop, 0, "rna_Brush_update");
2206
2207   prop = RNA_def_property(srna, "use_cursor_overlay", PROP_BOOLEAN, PROP_NONE);
2208   RNA_def_property_boolean_sdna(prop, NULL, "overlay_flags", BRUSH_OVERLAY_CURSOR);
2209   RNA_def_property_ui_text(prop, "Use Cursor Overlay", "Show cursor in viewport");
2210   RNA_def_property_update(prop, 0, "rna_Brush_update");
2211
2212   prop = RNA_def_property(srna, "use_cursor_overlay_override", PROP_BOOLEAN, PROP_NONE);
2213   RNA_def_property_boolean_sdna(
2214       prop, NULL, "overlay_flags", BRUSH_OVERLAY_CURSOR_OVERRIDE_ON_STROKE);
2215   RNA_def_property_ui_text(prop, "Override Overlay", "Don't show overlay during a stroke");
2216   RNA_def_property_update(prop, 0, "rna_Brush_update");
2217
2218   prop = RNA_def_property(srna, "use_primary_overlay_override", PROP_BOOLEAN, PROP_NONE);
2219   RNA_def_property_boolean_sdna(
2220       prop, NULL, "overlay_flags", BRUSH_OVERLAY_PRIMARY_OVERRIDE_ON_STROKE);
2221   RNA_def_property_ui_text(prop, "Override Overlay", "Don't show overlay during a stroke");
2222   RNA_def_property_update(prop, 0, "rna_Brush_update");
2223
2224   prop = RNA_def_property(srna, "use_secondary_overlay_override", PROP_BOOLEAN, PROP_NONE);
2225   RNA_def_property_boolean_sdna(
2226       prop, NULL, "overlay_flags", BRUSH_OVERLAY_SECONDARY_OVERRIDE_ON_STROKE);
2227   RNA_def_property_ui_text(prop, "Override Overlay", "Don't show overlay during a stroke");
2228   RNA_def_property_update(prop, 0, "rna_Brush_update");
2229
2230   /* paint mode flags */
2231   prop = RNA_def_property(srna, "use_paint_sculpt", PROP_BOOLEAN, PROP_NONE);
2232   RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_SCULPT);
2233   RNA_def_property_ui_text(prop, "Use Sculpt", "Use this brush in sculpt mode");
2234
2235   prop = RNA_def_property(srna, "use_paint_uv_sculpt", PROP_BOOLEAN, PROP_NONE);
2236   RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_EDIT);
2237   RNA_def_property_ui_text(prop, "Use UV Sculpt", "Use this brush in UV sculpt mode");
2238
2239   prop = RNA_def_property(srna, "use_paint_vertex", PROP_BOOLEAN, PROP_NONE);
2240   RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_VERTEX_PAINT);
2241   RNA_def_property_ui_text(prop, "Use Vertex", "Use this brush in vertex paint mode");
2242
2243   prop = RNA_def_property(srna, "use_paint_weight", PROP_BOOLEAN, PROP_NONE);
2244   RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_WEIGHT_PAINT);
2245   RNA_def_property_ui_text(prop, "Use Weight", "Use this brush in weight paint mode");
2246
2247   prop = RNA_def_property(srna, "use_paint_image", PROP_BOOLEAN, PROP_NONE);
2248   RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_TEXTURE_PAINT);
2249   RNA_def_property_ui_text(prop, "Use Texture", "Use this brush in texture paint mode");
2250
2251   prop = RNA_def_property(srna, "use_paint_grease_pencil", PROP_BOOLEAN, PROP_NONE);
2252   RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_PAINT_GPENCIL);
2253   RNA_def_property_ui_text(prop, "Use Sculpt", "Use this brush in grease pencil drawing mode");
2254
2255   /* texture */
2256   prop = RNA_def_property(srna, "texture_slot", PROP_POINTER, PROP_NONE);
2257   RNA_def_property_struct_type(prop, "BrushTextureSlot");
2258   RNA_def_property_pointer_sdna(prop, NULL, "mtex");
2259   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2260   RNA_def_property_ui_text(prop, "Texture Slot", "");
2261
2262   prop = RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
2263   RNA_def_property_pointer_sdna(prop, NULL, "mtex.tex");
2264   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_CONTEXT_UPDATE);
2265   RNA_def_property_ui_text(prop, "Texture", "");
2266   RNA_def_property_update(prop, NC_TEXTURE, "rna_Brush_main_tex_update");
2267
2268   prop = RNA_def_property(srna, "mask_texture_slot", PROP_POINTER, PROP_NONE);
2269   RNA_def_property_struct_type(prop, "BrushTextureSlot");
2270   RNA_def_property_pointer_sdna(prop, NULL, "mask_mtex");
2271   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2272   RNA_def_property_ui_text(prop, "Mask Texture Slot", "");
2273
2274   prop = RNA_def_property(srna, "mask_texture", PROP_POINTER, PROP_NONE);
2275   RNA_def_property_pointer_sdna(prop, NULL, "mask_mtex.tex");
2276   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_CONTEXT_UPDATE);
2277   RNA_def_property_ui_text(prop, "Mask Texture", "");
2278   RNA_def_property_update(prop, NC_TEXTURE, "rna_Brush_secondary_tex_update");
2279
2280   prop = RNA_def_property(srna, "texture_overlay_alpha", PROP_INT, PROP_PERCENTAGE);
2281   RNA_def_property_int_sdna(prop, NULL, "texture_overlay_alpha");
2282   RNA_def_property_range(prop, 0, 100);
2283   RNA_def_property_ui_text(prop, "Texture Overlay Alpha", "");
2284   RNA_def_property_update(prop, 0, "rna_Brush_update");
2285
2286   prop = RNA_def_property(srna, "mask_overlay_alpha", PROP_INT, PROP_PERCENTAGE);
2287   RNA_def_property_int_sdna(prop, NULL, "mask_overlay_alpha");
2288   RNA_def_property_range(prop, 0, 100);
2289   RNA_def_property_ui_text(prop, "Mask Texture Overlay Alpha", "");
2290   RNA_def_property_update(prop, 0, "rna_Brush_update");
2291
2292   prop = RNA_def_property(srna, "cursor_overlay_alpha", PROP_INT, PROP_PERCENTAGE);
2293   RNA_def_property_int_sdna(prop, NULL, "cursor_overlay_alpha");
2294   RNA_def_property_range(prop, 0, 100);
2295   RNA_def_property_ui_text(prop, "Mask Texture Overlay Alpha", "");
2296   RNA_def_property_update(prop, 0, "rna_Brush_update");
2297
2298   prop = RNA_def_property(srna, "cursor_color_add", PROP_FLOAT, PROP_COLOR);
2299   RNA_def_property_float_sdna(prop, NULL, "add_col");
2300   RNA_def_property_array(prop, 3);
2301   RNA_def_property_ui_text(prop, "Add Color", "Color of cursor when adding");
2302   RNA_def_property_update(prop, 0, "rna_Brush_update");
2303
2304   prop = RNA_def_property(srna, "cursor_color_subtract", PROP_FLOAT, PROP_COLOR);
2305   RNA_def_property_float_sdna(prop, NULL, "sub_col");
2306   RNA_def_property_array(prop, 3);
2307   RNA_def_property_ui_text(prop, "Subtract Color", "Color of cursor when subtracting");
2308   RNA_def_property_update(prop, 0, "rna_Brush_update");
2309
2310   prop = RNA_def_property(srna, "use_custom_icon", PROP_BOOLEAN, PROP_NONE);
2311   RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_CUSTOM_ICON);
2312   RNA_def_property_ui_text(prop, "Custom Icon", "Set the brush icon from an image file");
2313   RNA_def_property_update(prop, 0, "rna_Brush_icon_update");
2314
2315   prop = RNA_def_property(srna, "icon_filepath", PROP_STRING, PROP_FILEPATH);
2316   RNA_def_property_string_sdna(prop, NULL, "icon_filepath");
2317   RNA_def_property_ui_text(prop, "Brush Icon Filepath", "File path to brush icon");
2318   RNA_def_property_update(prop, 0, "rna_Brush_icon_update");
2319
2320   /* clone tool */
2321   prop = RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE);
2322   RNA_def_property_pointer_sdna(prop, NULL, "clone.image");
2323   RNA_def_property_flag(prop, PROP_EDITABLE);
2324   RNA_def_property_ui_text(prop, "Clone Image", "Image for clone tool");
2325   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, "rna_Brush_update");
2326
2327   prop = RNA_def_property(srna, "clone_alpha", PROP_FLOAT, PROP_FACTOR);
2328   RNA_def_property_float_sdna(prop, NULL, "clone.alpha");
2329   RNA_def_property_range(prop, 0.0f, 1.0f);
2330   RNA_def_property_ui_text(prop, "Clone Alpha", "Opacity of clone image display");
2331   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, "rna_Brush_update");
2332
2333   prop = RNA_def_property(srna, "clone_offset", PROP_FLOAT, PROP_XYZ);
2334   RNA_def_property_float_sdna(prop, NULL, "clone.offset");
2335   RNA_def_property_ui_text(prop, "Clone Offset", "");
2336   RNA_def_property_ui_range(prop, -1.0f, 1.0f, 10.0f, 3);
2337   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, "rna_Brush_update");
2338
2339   prop = RNA_def_property(srna, "brush_capabilities", PROP_POINTER, PROP_NONE);
2340   RNA_def_property_flag(prop, PROP_NEVER_NULL);
2341   RNA_def_property_struct_type(prop, "BrushCapabilities");
2342   RNA_def_property_pointer_funcs(prop, "rna_Brush_capabilities_get", NULL, NULL, NULL);
2343   RNA_def_property_ui_text(prop, "Brush Capabilities", "Brush's capabilities");
2344
2345   /* brush capabilities (mode-dependent) */
2346   prop = RNA_def_property(srna, "sculpt_capabilities", PROP_POINTER, PROP_NONE);
2347   RNA_def_property_flag(prop, PROP_NEVER_NULL);
2348   RNA_def_property_struct_type(prop, "BrushCapabilitiesSculpt");
2349   RNA_def_property_pointer_funcs(prop, "rna_Sculpt_tool_capabilities_get", NULL, NULL, NULL);
2350   RNA_def_property_ui_text(prop, "Sculpt Capabilities", "");
2351
2352   prop = RNA_def_property(srna, "image_paint_capabilities", PROP_POINTER, PROP_NONE);
2353   RNA_def_property_flag(prop, PROP_NEVER_NULL);
2354   RNA_def_property_struct_type(prop, "BrushCapabilitiesImagePaint");
2355   RNA_def_property_pointer_funcs(prop, "rna_Imapaint_tool_capabilities_get", NULL, NULL, NULL);
2356   RNA_def_property_ui_text(prop, "Image Paint Capabilities", "");
2357
2358   prop = RNA_def_property(srna, "vertex_paint_capabilities", PROP_POINTER, PROP_NONE);
2359   RNA_def_property_flag(prop, PROP_NEVER_NULL);
2360   RNA_def_property_struct_type(prop, "BrushCapabilitiesVertexPaint");
2361   RNA_def_property_pointer_funcs(prop, "rna_Vertexpaint_tool_capabilities_get", NULL, NULL, NULL);
2362   RNA_def_property_ui_text(prop, "Vertex Paint Capabilities", "");
2363
2364   prop = RNA_def_property(srna, "weight_paint_capabilities", PROP_POINTER, PROP_NONE);
2365   RNA_def_property_flag(prop, PROP_NEVER_NULL);
2366   RNA_def_property_struct_type(prop, "BrushCapabilitiesWeightPaint");
2367   RNA_def_property_pointer_funcs(prop, "rna_Weightpaint_tool_capabilities_get", NULL, NULL, NULL);
2368   RNA_def_property_ui_text(prop, "Weight Paint Capabilities", "");
2369
2370   prop = RNA_def_property(srna, "gpencil_settings", PROP_POINTER, PROP_NONE);
2371   RNA_def_property_struct_type(prop, "BrushGpencilSettings");
2372   RNA_def_property_pointer_sdna(prop, NULL, "gpencil_settings");
2373   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2374   RNA_def_property_ui_text(prop, "Gpencil Settings", "");
2375 }
2376
2377 /**
2378  * A brush stroke is a list of changes to the brush that
2379  * can occur during a stroke
2380  *
2381  * - 3D location of the brush
2382  * - 2D mouse location
2383  * - Tablet pressure
2384  * - Direction flip
2385  * - Tool switch
2386  * - Time
2387  */
2388 static void rna_def_operator_stroke_element(BlenderRNA *brna)
2389 {
2390   StructRNA *srna;
2391   PropertyRNA *prop;
2392
2393   srna = RNA_def_struct(brna, "OperatorStrokeElement", "PropertyGroup");
2394   RNA_def_struct_ui_text(srna, "Operator Stroke Element", "");
2395
2396   prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
2397   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2398   RNA_def_property_array(prop, 3);
2399   RNA_def_property_ui_text(prop, "Location", "");
2400
2401   prop = RNA_def_property(srna, "mouse", PROP_FLOAT, PROP_XYZ);
2402   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2403   RNA_def_property_array(prop, 2);
2404   RNA_def_property_ui_text(prop, "Mouse", "");
2405
2406   prop = RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_FACTOR);
2407   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2408   RNA_def_property_range(prop, 0.0f, 1.0f);
2409   RNA_def_property_ui_text(prop, "Pressure", "Tablet pressure");
2410
2411   prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
2412   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2413   RNA_def_property_range(prop, 0.0f, FLT_MAX);
2414   RNA_def_property_ui_text(prop, "Brush Size", "Brush size in screen space");
2415
2416   prop = RNA_def_property(srna, "pen_flip", PROP_BOOLEAN, PROP_NONE);
2417   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2418   RNA_def_property_ui_text(prop, "Flip", "");
2419
2420   /* used in uv painting */
2421   prop = RNA_def_property(srna, "time", PROP_FLOAT, PROP_UNSIGNED);
2422   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2423   RNA_def_property_ui_text(prop, "Time", "");
2424
2425   /* used for Grease Pencil sketching sessions */
2426   prop = RNA_def_property(srna, "is_start", PROP_BOOLEAN, PROP_NONE);
2427   RNA_def_property_flag(prop, PROP_IDPROPERTY);
2428   RNA_def_property_ui_text(prop, "Is Stroke Start", "");
2429
2430   /* XXX: Tool (this will be for pressing a modifier key for a different brush,
2431    *      e.g. switching to a Smooth brush in the middle of the stroke */
2432
2433   /* XXX: i don't think blender currently supports the ability to properly do a remappable modifier
2434    *      in the middle of a stroke */
2435 }
2436
2437 void RNA_def_brush(BlenderRNA *brna)
2438 {
2439   rna_def_brush(brna);
2440   rna_def_brush_capabilities(brna);
2441   rna_def_sculpt_capabilities(brna);
2442   rna_def_image_paint_capabilities(brna);
2443   rna_def_vertex_paint_capabilities(brna);
2444   rna_def_weight_paint_capabilities(brna);
2445   rna_def_gpencil_options(brna);
2446   rna_def_brush_texture_slot(brna);
2447   rna_def_operator_stroke_element(brna);
2448 }
2449
2450 #endif