[#34013] [video sequence editor] Offset and crop of strips are wrong
[blender.git] / source / blender / blenkernel / BKE_sketch.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  * Contributor(s): none yet.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22 #ifndef __BKE_SKETCH_H__
23 #define __BKE_SKETCH_H__
24
25 /** \file BKE_sketch.h
26  *  \ingroup bke
27  */
28
29 typedef enum SK_PType {
30         PT_CONTINUOUS,
31         PT_EXACT,
32 } SK_PType;
33
34 typedef enum SK_PMode {
35         PT_SNAP,
36         PT_PROJECT,
37 } SK_PMode;
38
39 typedef struct SK_Point {
40         float p[3];
41         short p2d[2];
42         float no[3];
43         float size;
44         SK_PType type;
45         SK_PMode mode;
46 } SK_Point;
47
48 typedef struct SK_Stroke {
49         struct SK_Stroke *next, *prev;
50
51         SK_Point *points;
52         int nb_points;
53         int buf_size;
54         int selected;
55 } SK_Stroke;
56
57 #define SK_OVERDRAW_LIMIT   5
58
59 typedef struct SK_Overdraw {
60         SK_Stroke *target;
61         int start, end;
62         int count;
63 } SK_Overdraw;
64
65 #define SK_Stroke_BUFFER_INIT_SIZE 20
66
67 typedef struct SK_DrawData {
68         int mval[2];
69         int previous_mval[2];
70         SK_PType type;
71 } SK_DrawData;
72
73 typedef struct SK_Intersection {
74         struct SK_Intersection *next, *prev;
75         SK_Stroke *stroke;
76         int        before;
77         int        after;
78         int        gesture_index;
79         float      p[3];
80         float      lambda;       /* used for sorting intersection points */
81 } SK_Intersection;
82
83 typedef struct SK_Sketch {
84         ListBase   strokes;
85         ListBase   depth_peels;
86         SK_Stroke *active_stroke;
87         SK_Stroke *gesture;
88         SK_Point   next_point;
89         SK_Overdraw over;
90 } SK_Sketch;
91
92
93 typedef struct SK_Gesture {
94         SK_Stroke   *stk;
95         SK_Stroke   *segments;
96
97         ListBase     intersections;
98         ListBase     self_intersections;
99
100         int          nb_self_intersections;
101         int          nb_intersections;
102         int          nb_segments;
103 } SK_Gesture;
104
105
106 /************************************************/
107
108 void freeSketch(SK_Sketch *sketch);
109 SK_Sketch *createSketch(void);
110
111 void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk);
112
113 void sk_freeStroke(SK_Stroke *stk);
114 SK_Stroke *sk_createStroke(void);
115
116 SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
117
118 void sk_allocStrokeBuffer(SK_Stroke *stk);
119 void sk_shrinkStrokeBuffer(SK_Stroke *stk);
120 void sk_growStrokeBuffer(SK_Stroke *stk);
121 void sk_growStrokeBufferN(SK_Stroke *stk, int n);
122
123 void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n);
124 void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n);
125 void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt);
126 void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end);
127
128 void sk_trimStroke(SK_Stroke *stk, int start, int end);
129 void sk_straightenStroke(SK_Stroke * stk, int start, int end, float p_start[3], float p_end[3]);
130 void sk_polygonizeStroke(SK_Stroke *stk, int start, int end);
131 void sk_flattenStroke(SK_Stroke *stk, int start, int end);
132 void sk_reverseStroke(SK_Stroke *stk);
133
134 void sk_filterLastContinuousStroke(SK_Stroke *stk);
135 void sk_filterStroke(SK_Stroke *stk, int start, int end);
136
137 void sk_initPoint(SK_Point *pt, SK_DrawData *dd, const float no[3]);
138 void sk_copyPoint(SK_Point *dst, SK_Point *src);
139
140 int sk_stroke_filtermval(SK_DrawData *dd);
141 void sk_endContinuousStroke(SK_Stroke *stk);
142
143 void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk);
144
145 void sk_initDrawData(SK_DrawData *dd, const int mval[2]);
146
147 void sk_deleteSelectedStrokes(SK_Sketch *sketch);
148 void sk_selectAllSketch(SK_Sketch *sketch, int mode);
149
150 #endif