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