GP: Primitive: Fix flickering when using a noise brush
[blender.git] / source / blender / editors / include / ED_gpencil.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2008, Blender Foundation
19  * This is a new part of Blender
20  *
21  * Contributor(s): Joshua Leung
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file ED_gpencil.h
27  *  \ingroup editors
28  */
29
30 #ifndef __ED_GPENCIL_H__
31 #define __ED_GPENCIL_H__
32
33 struct ID;
34 struct ListBase;
35 struct PointerRNA;
36 struct rcti;
37
38 struct bGPdata;
39 struct bGPDlayer;
40 struct bGPDframe;
41 struct bGPDstroke;
42 struct bGPDspoint;
43 struct Brush;
44
45 struct Main;
46 struct bContext;
47 struct EvaluationContext;
48 struct Depsgraph;
49 struct ScrArea;
50 struct ARegion;
51 struct RegionView3D;
52 struct ReportList;
53 struct Scene;
54 struct ToolSettings;
55 struct ViewLayer;
56 struct View3D;
57
58 struct Object;
59 struct Material;
60
61 struct bAnimContext;
62 struct KeyframeEditData;
63
64 struct wmKeyConfig;
65 struct wmOperator;
66 struct wmWindow;
67 struct wmWindowManager;
68
69 /* ------------- Grease-Pencil Runtime Data ---------------- */
70
71 /* Temporary 'Stroke Point' data (2D / screen-space)
72  *
73  * Used as part of the 'stroke cache' used during drawing of new strokes
74  */
75 typedef struct tGPspoint {
76         float x, y;             /* x and y coordinates of cursor (in relative to area) */
77         float pressure;         /* pressure of tablet at this point */
78         float strength;         /* pressure of tablet at this point for alpha factor */
79         float time;             /* Time relative to stroke start (used when converting to path) */
80         float uv_fac;           /* factor of uv along the stroke */
81         float uv_rot;           /* uv rotation for dor mode */
82         float rnd[2];           /* rnd value */
83         bool rnd_dirty;         /* rnd flag */
84 } tGPspoint;
85
86 /* used to sort by zdepth gpencil objects in viewport */
87 /* TODO: this could be a system parameter in userprefs screen */
88 #define GP_CACHE_BLOCK_SIZE 16
89 typedef struct tGPencilSort {
90         struct Base *base;
91         float zdepth;
92 } tGPencilSort;
93
94 /* ----------- Grease Pencil Tools/Context ------------- */
95
96 /* Context-dependent */
97 struct bGPdata **ED_gpencil_data_get_pointers(const struct bContext *C, struct PointerRNA *r_ptr);
98
99 struct bGPdata  *ED_gpencil_data_get_active(const struct bContext *C);
100 struct bGPdata  *ED_gpencil_data_get_active_evaluated(const struct bContext *C);
101
102 /* Context independent (i.e. each required part is passed in instead) */
103 struct bGPdata **ED_gpencil_data_get_pointers_direct(
104         struct ID *screen_id,
105         struct ScrArea *sa,
106         struct Scene *scene,
107         struct Object *ob,
108         struct PointerRNA *r_ptr);
109 struct bGPdata *ED_gpencil_data_get_active_direct(
110         struct ID *screen_id,
111         struct ScrArea *sa,
112         struct Scene *scene,
113         struct Object *ob);
114
115 bool ED_gpencil_data_owner_is_annotation(struct PointerRNA *owner_ptr);
116
117 /* 3D View */
118 struct bGPdata  *ED_gpencil_data_get_active_v3d(struct ViewLayer *view_layer, struct View3D *v3d);
119
120 bool ED_gpencil_has_keyframe_v3d(struct Scene *scene, struct Object *ob, int cfra);
121
122 /* ----------- Stroke Editing Utilities ---------------- */
123
124 bool ED_gpencil_stroke_can_use_direct(const struct ScrArea *sa, const struct bGPDstroke *gps);
125 bool ED_gpencil_stroke_can_use(const struct bContext *C, const struct bGPDstroke *gps);
126 bool ED_gpencil_stroke_color_use(struct Object *ob, const struct bGPDlayer *gpl, const struct bGPDstroke *gps);
127
128 /* ----------- Grease Pencil Operators ----------------- */
129
130 void ED_keymap_gpencil(struct wmKeyConfig *keyconf);
131
132 void ED_operatortypes_gpencil(void);
133 void ED_operatormacros_gpencil(void);
134
135 /* ------------- Copy-Paste Buffers -------------------- */
136
137 /* Strokes copybuf */
138 void ED_gpencil_strokes_copybuf_free(void);
139
140
141 /* ------------ Grease-Pencil Drawing API ------------------ */
142 /* drawgpencil.c */
143
144 void ED_gpencil_draw_2dimage(const struct bContext *C);
145 void ED_gpencil_draw_view2d(const struct bContext *C, bool onlyv2d);
146 void ED_gpencil_draw_view3d(
147         struct wmWindowManager *wm,
148         struct Scene *scene,
149         struct ViewLayer *view_layer,
150         struct Depsgraph *depsgraph,
151         struct View3D *v3d,
152         struct ARegion *ar,
153         bool only3d);
154 void ED_gpencil_draw_view3d_annotations(
155         struct Scene *scene, struct Depsgraph *depsgraph,
156         struct View3D *v3d, struct ARegion *ar,
157         bool only3d);
158 void ED_gpencil_draw_view3d_object(
159         struct wmWindowManager *wm,
160         struct Scene *scene,
161         struct Depsgraph *depsgraph,
162         struct Object *ob,
163         struct View3D *v3d,
164         struct ARegion *ar,
165         bool only3d);
166 void ED_gpencil_draw_ex(
167         struct ViewLayer *view_layer, struct RegionView3D *rv3d, struct Scene *scene,
168         struct bGPdata *gpd, int winx, int winy,
169         const int cfra, const char spacetype);
170
171 /* ----------- Grease-Pencil AnimEdit API ------------------ */
172 bool  ED_gplayer_frames_looper(struct bGPDlayer *gpl, struct Scene *scene,
173                                short (*gpf_cb)(struct bGPDframe *, struct Scene *));
174 void ED_gplayer_make_cfra_list(struct bGPDlayer *gpl, ListBase *elems, bool onlysel);
175
176 bool  ED_gplayer_frame_select_check(struct bGPDlayer *gpl);
177 void  ED_gplayer_frame_select_set(struct bGPDlayer *gpl, short mode);
178 void  ED_gplayer_frames_select_box(struct bGPDlayer *gpl, float min, float max, short select_mode);
179 void  ED_gplayer_frames_select_region(struct KeyframeEditData *ked, struct bGPDlayer *gpl, short tool, short select_mode);
180 void  ED_gpencil_select_frames(struct bGPDlayer *gpl, short select_mode);
181 void  ED_gpencil_select_frame(struct bGPDlayer *gpl, int selx, short select_mode);
182
183 bool  ED_gplayer_frames_delete(struct bGPDlayer *gpl);
184 void  ED_gplayer_frames_duplicate(struct bGPDlayer *gpl);
185
186 void ED_gplayer_frames_keytype_set(struct bGPDlayer *gpl, short type);
187
188 void  ED_gplayer_snap_frames(struct bGPDlayer *gpl, struct Scene *scene, short mode);
189 void  ED_gplayer_mirror_frames(struct bGPDlayer *gpl, struct Scene *scene, short mode);
190
191 void ED_gpencil_anim_copybuf_free(void);
192 bool ED_gpencil_anim_copybuf_copy(struct bAnimContext *ac);
193 bool ED_gpencil_anim_copybuf_paste(struct bAnimContext *ac, const short copy_mode);
194
195
196 /* ------------ Grease-Pencil Undo System ------------------ */
197 int ED_gpencil_session_active(void);
198 int ED_undo_gpencil_step(struct bContext *C, int step, const char *name);
199
200 /* ------------ Grease-Pencil Armature weights ------------------ */
201 bool ED_gpencil_add_armature_weights(
202         const struct bContext *C, struct ReportList *reports,
203         struct Object *ob, struct Object *ob_arm, int mode);
204
205 /* keep this aligned with gpencil_armature enum */
206 #define GP_PAR_ARMATURE_NAME     0
207 #define GP_PAR_ARMATURE_AUTO     1
208
209 /* ------------ Transformation Utilities ------------ */
210
211 /* get difference matrix */
212 void ED_gpencil_parent_location(
213         const struct Depsgraph *depsgraph, struct Object *obact, struct bGPdata *gpd,
214         struct bGPDlayer *gpl, float diff_mat[4][4]);
215 /* reset parent matrix for all layers */
216 void ED_gpencil_reset_layers_parent(struct Depsgraph *depsgraph, struct Object *obact, struct bGPdata *gpd);
217
218 /* cursor utilities */
219 void ED_gpencil_brush_draw_eraser(struct Brush *brush, int x, int y);
220
221 /* ----------- Add Primitive Utilities -------------- */
222
223 void ED_gpencil_create_monkey(struct bContext *C, float mat[4][4]);
224 void ED_gpencil_create_stroke(struct bContext *C, float mat[4][4]);
225
226 /* ------------ Object Utilities ------------ */
227 struct Object *ED_gpencil_add_object(
228         struct bContext *C, struct Scene *scene, const float loc[3], unsigned short local_view_bits);
229 void ED_gpencil_add_defaults(struct bContext *C);
230 /* set object modes */
231 void ED_gpencil_setup_modes(struct bContext *C, struct bGPdata *gpd, int newmode);
232
233 void ED_gp_project_stroke_to_plane(
234         const struct Object *ob, const struct RegionView3D *rv3d,
235         struct bGPDstroke *gps, const float origin[3], const int axis);
236 void ED_gp_project_point_to_plane(
237         const struct Object *ob, const struct RegionView3D *rv3d,
238         const float origin[3], const int axis, struct bGPDspoint *pt);
239 void ED_gp_get_drawing_reference(
240         const struct Scene *scene, const struct Object *ob,
241         struct bGPDlayer *gpl, char align_flag, float vec[3]);
242
243 /* set sculpt cursor */
244 void ED_gpencil_toggle_brush_cursor(struct bContext *C, bool enable, void *customdata);
245
246 /* vertex groups */
247 void ED_gpencil_vgroup_assign(struct bContext *C, struct Object *ob, float weight);
248 void ED_gpencil_vgroup_remove(struct bContext *C, struct Object *ob);
249 void ED_gpencil_vgroup_select(struct bContext *C, struct Object *ob);
250 void ED_gpencil_vgroup_deselect(struct bContext *C, struct Object *ob);
251
252 /* join objects */
253 int ED_gpencil_join_objects_exec(struct bContext *C, struct wmOperator *op);
254
255 /* texture coordinate utilities */
256 void ED_gpencil_tpoint_to_point(struct ARegion *ar, float origin[3], const struct tGPspoint *tpt, struct bGPDspoint *pt);
257 void ED_gpencil_calc_stroke_uv(struct Object *ob, struct bGPDstroke *gps);
258 void ED_gpencil_update_color_uv(struct Main *bmain, struct Material *mat);
259
260 #endif /*  __ED_GPENCIL_H__ */