5fec1528e376de9f236f93f80328ba8ad015dea5
[blender.git] / source / blender / makesdna / DNA_brush_types.h
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  * The Original Code is Copyright (C) 2005 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_BRUSH_TYPES_H__
25 #define __DNA_BRUSH_TYPES_H__
26
27
28 #include "DNA_ID.h"
29 #include "DNA_texture_types.h" /* for MTex */
30 #include "DNA_curve_types.h"
31
32 //#ifndef MAX_MTEX // XXX Not used?
33 //#define MAX_MTEX      18
34 //#endif
35
36 struct CurveMapping;
37 struct Image;
38 struct MTex;
39 struct Material;
40
41 typedef struct BrushClone {
42         /** Image for clone tool. */
43         struct Image *image;
44         /** Offset of clone image from canvas. */
45         float offset[2];
46         /** Transparency for drawing of clone image. */
47         float alpha;
48         char _pad[4];
49 } BrushClone;
50
51
52 typedef struct BrushGpencilSettings {
53         /** Amount of smoothing to apply to newly created strokes. */
54         float draw_smoothfac;
55         /** Amount of sensitivity to apply to newly created strokes. */
56         float draw_sensitivity;
57         /** Amount of alpha strength to apply to newly created strokes. */
58         float draw_strength;
59         /** Amount of jitter to apply to newly created strokes. */
60         float draw_jitter;
61         /** Angle when the brush has full thickness. */
62         float draw_angle;
63         /** Factor to apply when angle change (only 90 degrees). */
64         float draw_angle_factor;
65         /** Factor of randomness for pressure. */
66         float draw_random_press;
67         /** Factor of strength for strength. */
68         float draw_random_strength;
69         /** Factor of randomness for subdivision. */
70         float draw_random_sub;
71         /** Number of times to apply smooth factor to new strokes. */
72         short draw_smoothlvl;
73         /** Number of times to subdivide new strokes. */
74         short draw_subdivide;
75         short _pad;
76
77         /** Number of times to apply thickness smooth factor to new strokes. */
78         short thick_smoothlvl;
79         /** Amount of thickness smoothing to apply to newly created strokes. */
80         float thick_smoothfac;
81
82         /** Factor for transparency. */
83         float fill_threshold;
84         /** Number of pixel to consider the leak is too small (x 2). */
85         short fill_leak;
86         char _pad1[6];
87
88         /** Number of simplify steps. */
89         int   fill_simplylvl;
90         /** Type of control lines drawing mode. */
91         int   fill_draw_mode;
92         /** Icon identifier. */
93         int   icon_id;
94
95         /** Maximum distance before generate new point for very fast mouse movements. */
96         int   input_samples;
97         /** Random factor for UV rotation. */
98         float uv_random;
99         /** Moved to 'Brush.gpencil_tool'. */
100         int   brush_type DNA_DEPRECATED;
101         /** Soft, hard or stroke. */
102         int   eraser_mode;
103         /** Smooth while drawing factor. */
104         float active_smooth;
105         /** Factor to apply to strength for soft eraser. */
106         float era_strength_f;
107         /** Factor to apply to thickness for soft eraser. */
108         float era_thickness_f;
109         /** Internal grease pencil drawing flags. */
110         int flag;
111
112         struct CurveMapping *curve_sensitivity;
113         struct CurveMapping *curve_strength;
114         struct CurveMapping *curve_jitter;
115
116         /* optional link of material to replace default in context */
117         /** Material. */
118         struct Material *material;
119 } BrushGpencilSettings;
120
121 /* BrushGpencilSettings->gp_flag */
122 typedef enum eGPDbrush_Flag {
123         /* brush use pressure */
124         GP_BRUSH_USE_PRESSURE = (1 << 0),
125         /* brush use pressure for alpha factor */
126         GP_BRUSH_USE_STENGTH_PRESSURE = (1 << 1),
127         /* brush use pressure for alpha factor */
128         GP_BRUSH_USE_JITTER_PRESSURE = (1 << 2),
129         /* enable screen cursor */
130         GP_BRUSH_ENABLE_CURSOR = (1 << 5),
131         /* fill hide transparent */
132         GP_BRUSH_FILL_HIDE = (1 << 6),
133         /* show fill help lines */
134         GP_BRUSH_FILL_SHOW_HELPLINES = (1 << 7),
135         /* lazy mouse */
136         GP_BRUSH_STABILIZE_MOUSE = (1 << 8),
137         /* lazy mouse override (internal only) */
138         GP_BRUSH_STABILIZE_MOUSE_TEMP = (1 << 9),
139         /* default eraser brush for quick switch */
140         GP_BRUSH_DEFAULT_ERASER = (1 << 10),
141         /* settings group */
142         GP_BRUSH_GROUP_SETTINGS = (1 << 11),
143         /* Random settings group */
144         GP_BRUSH_GROUP_RANDOM = (1 << 12),
145         /* Keep material assigned to brush */
146         GP_BRUSH_MATERIAL_PINNED = (1 << 13),
147         /* Do not show fill color while drawing (no lasso mode) */
148         GP_BRUSH_DISSABLE_LASSO = (1 << 14),
149         /* Do not erase strokes oLcluded */
150         GP_BRUSH_OCCLUDE_ERASER = (1 << 15),
151         /* Post process trim stroke */
152         GP_BRUSH_TRIM_STROKE = (1 << 16),
153 } eGPDbrush_Flag;
154
155 /* BrushGpencilSettings->gp_fill_draw_mode */
156 typedef enum eGP_FillDrawModes {
157         GP_FILL_DMODE_BOTH = 0,
158         GP_FILL_DMODE_STROKE = 1,
159         GP_FILL_DMODE_CONTROL = 2,
160 } eGP_FillDrawModes;
161
162 /* BrushGpencilSettings->gp_eraser_mode */
163 typedef enum eGP_BrushEraserMode {
164         GP_BRUSH_ERASER_SOFT = 0,
165         GP_BRUSH_ERASER_HARD = 1,
166         GP_BRUSH_ERASER_STROKE = 2,
167 } eGP_BrushEraserMode;
168
169 /* BrushGpencilSettings default brush icons */
170 typedef enum eGP_BrushIcons {
171         GP_BRUSH_ICON_PENCIL = 1,
172         GP_BRUSH_ICON_PEN = 2,
173         GP_BRUSH_ICON_INK = 3,
174         GP_BRUSH_ICON_INKNOISE = 4,
175         GP_BRUSH_ICON_BLOCK = 5,
176         GP_BRUSH_ICON_MARKER = 6,
177         GP_BRUSH_ICON_FILL = 7,
178         GP_BRUSH_ICON_ERASE_SOFT = 8,
179         GP_BRUSH_ICON_ERASE_HARD = 9,
180         GP_BRUSH_ICON_ERASE_STROKE = 10,
181 } eGP_BrushIcons;
182
183 typedef struct Brush {
184         ID id;
185
186         struct BrushClone clone;
187         /** Falloff curve. */
188         struct CurveMapping *curve;
189         struct MTex mtex;
190         struct MTex mask_mtex;
191
192         struct Brush *toggle_brush;
193
194         struct ImBuf *icon_imbuf;
195         PreviewImage *preview;
196         /** Color gradient. */
197         struct ColorBand *gradient;
198         struct PaintCurve *paint_curve;
199
200         /** 1024 = FILE_MAX. */
201         char icon_filepath[1024];
202
203         float normal_weight;
204         /** Rake actual data (not texture), used for sculpt. */
205         float rake_factor;
206
207         /** Blend mode. */
208         short blend;
209         /** #eObjectMode: to see if the brush is compatible, use for display only. */
210         short ob_mode;
211         /** Brush weight. */
212         float weight;
213         /** Brush diameter. */
214         int size;
215         /** General purpose flag. */
216         int flag;
217         /** Pressure influence for mask. */
218         int mask_pressure;
219         /** Jitter the position of the brush. */
220         float jitter;
221         /** Absolute jitter in pixels. */
222         int jitter_absolute;
223         int overlay_flags;
224         /** Spacing of paint operations. */
225         int spacing;
226         /** Turning radius (in pixels) for smooth stroke. */
227         int smooth_stroke_radius;
228         /** Higher values limit fast changes in the stroke direction. */
229         float smooth_stroke_factor;
230         /** Paint operations / second (airbrush). */
231         float rate;
232
233         /** Color. */
234         float rgb[3];
235         /** Opacity. */
236         float alpha;
237
238         /** Background color. */
239         float secondary_rgb[3];
240
241         /** The direction of movement for sculpt vertices. */
242         int sculpt_plane;
243
244         /** Offset for plane brushes (clay, flatten, fill, scrape). */
245         float plane_offset;
246
247         int gradient_spacing;
248         /** Source for stroke color gradient application. */
249         char gradient_stroke_mode;
250         /** Source for fill tool color gradient application. */
251         char gradient_fill_mode;
252
253         char _pad;
254         /** Projection shape (sphere, circle). */
255         char falloff_shape;
256         float falloff_angle;
257
258         /** Active sculpt tool. */
259         char sculpt_tool;
260         /** Active vertex paint. */
261         char vertexpaint_tool;
262         /** Active weight paint. */
263         char weightpaint_tool;
264         /** Active image paint tool. */
265         char imagepaint_tool;
266         /** Enum eBrushMaskTool, only used if sculpt_tool is SCULPT_TOOL_MASK. */
267         char mask_tool;
268         /** Active grease pencil tool. */
269         char gpencil_tool;
270         char _pad0[2];
271
272         float autosmooth_factor;
273
274         float topology_rake_factor;
275
276         float crease_pinch_factor;
277
278         float plane_trim;
279         /** Affectable height of brush (layer height for layer tool, i.e.). */
280         float height;
281
282         float texture_sample_bias;
283
284         /* overlay */
285         int texture_overlay_alpha;
286         int mask_overlay_alpha;
287         int cursor_overlay_alpha;
288
289         float unprojected_radius;
290
291         /* soften/sharpen */
292         float sharp_threshold;
293         int blur_kernel_radius;
294         int blur_mode;
295
296         /* fill tool */
297         float fill_threshold;
298
299         float add_col[3];
300         float sub_col[3];
301
302         float stencil_pos[2];
303         float stencil_dimension[2];
304
305         float mask_stencil_pos[2];
306         float mask_stencil_dimension[2];
307
308         struct BrushGpencilSettings *gpencil_settings;
309
310 } Brush;
311 typedef struct PaletteColor {
312         struct PaletteColor *next, *prev;
313         /* two values, one to store rgb, other to store values for sculpt/weight */
314         float rgb[3];
315         float value;
316 } PaletteColor;
317
318 typedef struct Palette {
319         ID id;
320
321         /* pointer to individual colours */
322         ListBase colors;
323
324         int active_color;
325         char _pad[4];
326 } Palette;
327
328 typedef struct PaintCurvePoint {
329         /** Bezier handle. */
330         BezTriple bez;
331         /** Pressure on that point. */
332         float pressure;
333 } PaintCurvePoint;
334
335 typedef struct PaintCurve {
336         ID id;
337         /** Points of curve. */
338         PaintCurvePoint *points;
339         int tot_points;
340         /** Index where next point will be added. */
341         int add_index;
342 } PaintCurve;
343
344 /* Brush.gradient_source */
345 typedef enum eBrushGradientSourceStroke {
346         BRUSH_GRADIENT_PRESSURE = 0, /* gradient from pressure */
347         BRUSH_GRADIENT_SPACING_REPEAT = 1, /* gradient from spacing */
348         BRUSH_GRADIENT_SPACING_CLAMP = 2 /* gradient from spacing */
349 } eBrushGradientSourceStroke;
350
351 typedef enum eBrushGradientSourceFill {
352         BRUSH_GRADIENT_LINEAR = 0, /* gradient from pressure */
353         BRUSH_GRADIENT_RADIAL = 1 /* gradient from spacing */
354 } eBrushGradientSourceFill;
355
356 /* Brush.flag */
357 typedef enum eBrushFlags {
358         BRUSH_AIRBRUSH = (1 << 0),
359         BRUSH_FLAG_UNUSED_1 = (1 << 1),  /* cleared */
360         BRUSH_ALPHA_PRESSURE = (1 << 2),
361         BRUSH_SIZE_PRESSURE = (1 << 3),
362         BRUSH_JITTER_PRESSURE = (1 << 4),
363         BRUSH_SPACING_PRESSURE = (1 << 5),
364         BRUSH_FLAG_UNUSED_6 = (1 << 6),  /* cleared */
365         BRUSH_FLAG_UNUSED_7 = (1 << 7),  /* cleared */
366         BRUSH_ANCHORED = (1 << 8),
367         BRUSH_DIR_IN = (1 << 9),
368         BRUSH_SPACE = (1 << 10),
369         BRUSH_SMOOTH_STROKE = (1 << 11),
370         BRUSH_PERSISTENT = (1 << 12),
371         BRUSH_ACCUMULATE = (1 << 13),
372         BRUSH_LOCK_ALPHA = (1 << 14),
373         BRUSH_ORIGINAL_NORMAL = (1 << 15),
374         BRUSH_OFFSET_PRESSURE = (1 << 16),
375         BRUSH_FLAG_UNUSED_17 = (1 << 17),  /* cleared */
376         BRUSH_SPACE_ATTEN = (1 << 18),
377         BRUSH_ADAPTIVE_SPACE = (1 << 19),
378         BRUSH_LOCK_SIZE = (1 << 20),
379         BRUSH_USE_GRADIENT = (1 << 21),
380         BRUSH_EDGE_TO_EDGE = (1 << 22),
381         BRUSH_DRAG_DOT = (1 << 23),
382         BRUSH_INVERSE_SMOOTH_PRESSURE = (1 << 24),
383         BRUSH_FRONTFACE_FALLOFF = (1 << 25),
384         BRUSH_PLANE_TRIM = (1 << 26),
385         BRUSH_FRONTFACE = (1 << 27),
386         BRUSH_CUSTOM_ICON = (1 << 28),
387         BRUSH_LINE = (1 << 29),
388         BRUSH_ABSOLUTE_JITTER = (1 << 30),
389         BRUSH_CURVE = (1u << 31),
390 } eBrushFlags;
391
392 typedef enum {
393         BRUSH_MASK_PRESSURE_RAMP = (1 << 1),
394         BRUSH_MASK_PRESSURE_CUTOFF = (1 << 2),
395 } BrushMaskPressureFlags;
396
397 /* Brush.overlay_flags */
398 typedef enum eOverlayFlags {
399         BRUSH_OVERLAY_CURSOR = (1),
400         BRUSH_OVERLAY_PRIMARY = (1 << 1),
401         BRUSH_OVERLAY_SECONDARY = (1 << 2),
402         BRUSH_OVERLAY_CURSOR_OVERRIDE_ON_STROKE = (1 << 3),
403         BRUSH_OVERLAY_PRIMARY_OVERRIDE_ON_STROKE = (1 << 4),
404         BRUSH_OVERLAY_SECONDARY_OVERRIDE_ON_STROKE = (1 << 5),
405 } eOverlayFlags;
406
407 #define BRUSH_OVERLAY_OVERRIDE_MASK (BRUSH_OVERLAY_CURSOR_OVERRIDE_ON_STROKE | \
408                                                                          BRUSH_OVERLAY_PRIMARY_OVERRIDE_ON_STROKE | \
409                                                                          BRUSH_OVERLAY_SECONDARY_OVERRIDE_ON_STROKE)
410
411 /* Brush.sculpt_tool */
412 typedef enum eBrushSculptTool {
413         SCULPT_TOOL_DRAW = 1,
414         SCULPT_TOOL_SMOOTH = 2,
415         SCULPT_TOOL_PINCH = 3,
416         SCULPT_TOOL_INFLATE = 4,
417         SCULPT_TOOL_GRAB = 5,
418         SCULPT_TOOL_LAYER = 6,
419         SCULPT_TOOL_FLATTEN = 7,
420         SCULPT_TOOL_CLAY = 8,
421         SCULPT_TOOL_FILL = 9,
422         SCULPT_TOOL_SCRAPE = 10,
423         SCULPT_TOOL_NUDGE = 11,
424         SCULPT_TOOL_THUMB = 12,
425         SCULPT_TOOL_SNAKE_HOOK = 13,
426         SCULPT_TOOL_ROTATE = 14,
427         SCULPT_TOOL_SIMPLIFY = 15,
428         SCULPT_TOOL_CREASE = 16,
429         SCULPT_TOOL_BLOB = 17,
430         SCULPT_TOOL_CLAY_STRIPS = 18,
431         SCULPT_TOOL_MASK = 19,
432 } eBrushSculptTool;
433
434 /** When #BRUSH_ACCUMULATE is used */
435 #define SCULPT_TOOL_HAS_ACCUMULATE(t) ELEM(t, \
436         SCULPT_TOOL_DRAW, \
437         SCULPT_TOOL_CREASE, \
438         SCULPT_TOOL_BLOB, \
439         SCULPT_TOOL_LAYER, \
440         SCULPT_TOOL_INFLATE, \
441         SCULPT_TOOL_CLAY, \
442         SCULPT_TOOL_CLAY_STRIPS, \
443         SCULPT_TOOL_ROTATE, \
444         SCULPT_TOOL_FLATTEN \
445         )
446
447 #define SCULPT_TOOL_HAS_NORMAL_WEIGHT(t) ELEM(t, \
448         SCULPT_TOOL_GRAB, \
449         SCULPT_TOOL_SNAKE_HOOK \
450         )
451
452 #define SCULPT_TOOL_HAS_RAKE(t) ELEM(t, \
453         SCULPT_TOOL_SNAKE_HOOK \
454         )
455
456 #define SCULPT_TOOL_HAS_DYNTOPO(t) (ELEM(t, \
457         /* These brushes, as currently coded, cannot support dynamic topology */ \
458         SCULPT_TOOL_GRAB, \
459         SCULPT_TOOL_ROTATE, \
460         SCULPT_TOOL_THUMB, \
461         SCULPT_TOOL_LAYER, \
462         \
463         /* These brushes could handle dynamic topology, \
464          * but user feedback indicates it's better not to */ \
465         SCULPT_TOOL_SMOOTH, \
466         SCULPT_TOOL_MASK \
467         ) == 0)
468
469 #define SCULPT_TOOL_HAS_TOPOLOGY_RAKE(t) (ELEM(t, \
470         /* These brushes, as currently coded, cannot support topology rake. */ \
471         SCULPT_TOOL_GRAB, \
472         SCULPT_TOOL_ROTATE, \
473         SCULPT_TOOL_THUMB, \
474         SCULPT_TOOL_MASK \
475         ) == 0)
476
477 /* ImagePaintSettings.tool */
478 typedef enum eBrushImagePaintTool {
479         PAINT_TOOL_DRAW = 0,
480         PAINT_TOOL_SOFTEN = 1,
481         PAINT_TOOL_SMEAR = 2,
482         PAINT_TOOL_CLONE = 3,
483         PAINT_TOOL_FILL = 4,
484         PAINT_TOOL_MASK = 5,
485 } eBrushImagePaintTool;
486
487 typedef enum eBrushVertexPaintTool {
488         VPAINT_TOOL_DRAW = 0,
489         VPAINT_TOOL_BLUR = 1,
490         VPAINT_TOOL_AVERAGE = 2,
491         VPAINT_TOOL_SMEAR = 3,
492 } eBrushVertexPaintTool;
493
494 typedef enum eBrushWeightPaintTool {
495         WPAINT_TOOL_DRAW = 0,
496         WPAINT_TOOL_BLUR = 1,
497         WPAINT_TOOL_AVERAGE = 2,
498         WPAINT_TOOL_SMEAR = 3,
499 } eBrushWeightPaintTool;
500
501 /* BrushGpencilSettings->brush type */
502 typedef enum eBrushGPaintTool {
503         GPAINT_TOOL_DRAW = 0,
504         GPAINT_TOOL_FILL = 1,
505         GPAINT_TOOL_ERASE = 2,
506 } eBrushGPaintTool;
507
508
509 /* direction that the brush displaces along */
510 enum {
511         SCULPT_DISP_DIR_AREA = 0,
512         SCULPT_DISP_DIR_VIEW = 1,
513         SCULPT_DISP_DIR_X = 2,
514         SCULPT_DISP_DIR_Y = 3,
515         SCULPT_DISP_DIR_Z = 4,
516 };
517
518 typedef enum {
519         BRUSH_MASK_DRAW = 0,
520         BRUSH_MASK_SMOOTH = 1,
521 } BrushMaskTool;
522
523 /* blur kernel types, Brush.blur_mode */
524 typedef enum eBlurKernelType {
525         KERNEL_GAUSSIAN,
526         KERNEL_BOX
527 } eBlurKernelType;
528
529 /* Brush.falloff_shape */
530 enum {
531         PAINT_FALLOFF_SHAPE_SPHERE = 0,
532         PAINT_FALLOFF_SHAPE_TUBE = 1,
533 };
534
535 #define MAX_BRUSH_PIXEL_RADIUS 500
536 #define GP_MAX_BRUSH_PIXEL_RADIUS 1000
537
538 #endif  /* __DNA_BRUSH_TYPES_H__ */