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