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