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