Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / include / BIF_glutil.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) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * Contributor(s): Blender Foundation 2002-2008
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file BIF_glutil.h
27  *  \ingroup editorui
28  */
29
30 #ifndef __BIF_GLUTIL_H__
31 #define __BIF_GLUTIL_H__
32
33 struct rcti;
34 struct rctf;
35
36 struct ImBuf;
37 struct bContext;
38 struct ColorManagedViewSettings;
39 struct ColorManagedDisplaySettings;
40
41 /* A few functions defined here are being DEPRECATED for Blender 2.8
42  *
43  * Do not use them in new code, and you are encouraged to
44  * convert existing code to draw without these.
45  *
46  * These will be deleted before we ship 2.8!
47  * - merwin
48  */
49
50 /**
51  * Returns a float value as obtained by glGetFloatv.
52  * The param must cause only one value to be gotten from GL.
53  */
54 float glaGetOneFloat(int param);
55 int glaGetOneInt(int param);
56
57 /**
58  * Functions like glRasterPos2i, except ensures that the resulting
59  * raster position is valid. \a known_good_x and \a known_good_y
60  * should be coordinates of a point known to be within the current
61  * view frustum.
62  * \attention This routine should be used when the distance of \a x
63  * and \a y away from the known good point is small (ie. for small icons
64  * and for bitmap characters), when drawing large+zoomed images it is
65  * possible for overflow to occur, the glaDrawPixelsSafe routine should
66  * be used instead.
67  */
68 void glaRasterPosSafe2f(float x, float y, float known_good_x, float known_good_y);
69
70 typedef struct IMMDrawPixelsTexState {
71         struct GPUShader *shader;
72         unsigned int pos;
73         unsigned int texco;
74         bool do_shader_unbind;
75 } IMMDrawPixelsTexState;
76
77 /* To be used before calling immDrawPixelsTex
78  * Default shader is GPU_SHADER_2D_IMAGE_COLOR
79  * Returns a shader to be able to set uniforms */
80 IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin);
81
82 /**
83  * immDrawPixelsTex - Functions like a limited glDrawPixels, but actually draws the
84  * image using textures, which can be tremendously faster on low-end
85  * cards, and also avoids problems with the raster position being
86  * clipped when offscreen. Pixel unpacking parameters and
87  * the glPixelZoom values are _not_ respected.
88  *
89  * \attention Use immDrawPixelsTexSetup before calling this function.
90  *
91  * \attention This routine makes many assumptions: the rect data
92  * is expected to be in RGBA byte or float format, and the
93  * modelview and projection matrices are assumed to define a
94  * 1-to-1 mapping to screen space.
95  */
96 void immDrawPixelsTex(IMMDrawPixelsTexState *state,
97                       float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect,
98                       float xzoom, float yzoom, float color[4]);
99 void immDrawPixelsTex_clipping(IMMDrawPixelsTexState *state,
100                                float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect,
101                                float clip_min_x, float clip_min_y, float clip_max_x, float clip_max_y,
102                                float xzoom, float yzoom, float color[4]);
103 void immDrawPixelsTexScaled(IMMDrawPixelsTexState *state,
104                             float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect, float scaleX, float scaleY,
105                             float xzoom, float yzoom, float color[4]);
106 void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
107                                      float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect, float scaleX, float scaleY,
108                                      float clip_min_x, float clip_min_y, float clip_max_x, float clip_max_y,
109                                      float xzoom, float yzoom, float color[4]);
110 /* 2D Drawing Assistance */
111
112 /** Define a 2D area (viewport, scissor, matrices) for OpenGL rendering.
113  *
114  * glaDefine2DArea and glaBegin2DDraw set up an OpenGL state appropriate
115  * for drawing using both vertex (Vertex, etc) and raster (RasterPos, Rect)
116  * commands. All coordinates should be at integer positions. There is little
117  * to no reason to use glVertex2f etc. functions during 2D rendering, and
118  * thus no reason to +-0.5 the coordinates or perform other silly
119  * tricks.
120  *
121  * \param screen_rect The screen rectangle to be defined for 2D drawing.
122  */
123 void glaDefine2DArea(struct rcti *screen_rect);
124
125 /* TODO(merwin): put the following 2D code to use, or build new 2D code inspired & informd by it */
126
127 #if 0  /* UNUSED */
128
129 typedef struct gla2DDrawInfo gla2DDrawInfo;
130
131 gla2DDrawInfo *glaBegin2DDraw(struct rcti *screen_rect, struct rctf *world_rect);
132 void gla2DDrawTranslatePt(gla2DDrawInfo *di, float wo_x, float wo_y, int *r_sc_x, int *r_sc_y);
133 void gla2DDrawTranslatePtv(gla2DDrawInfo *di, float world[2], int r_screen[2]);
134
135 void glaEnd2DDraw(gla2DDrawInfo *di);
136
137 /** Adjust the transformation mapping of a 2d area */
138 void gla2DGetMap(gla2DDrawInfo *di, struct rctf *rect);
139 void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect);
140
141 #endif /* UNUSED */
142
143 void set_inverted_drawing(int enable);
144 void setlinestyle(int nr);
145
146 /* own working polygon offset */
147 void bglPolygonOffset(float viewdist, float dist);
148
149 /* **** Color management helper functions for GLSL display/transform ***** */
150
151 /* Draw imbuf on a screen, preferably using GLSL display transform */
152 void glaDrawImBuf_glsl(struct ImBuf *ibuf, float x, float y, int zoomfilter,
153                        struct ColorManagedViewSettings *view_settings,
154                        struct ColorManagedDisplaySettings *display_settings,
155                        float zoom_x, float zoom_y);
156 void glaDrawImBuf_glsl_clipping(struct ImBuf *ibuf, float x, float y, int zoomfilter,
157                                 struct ColorManagedViewSettings *view_settings,
158                                 struct ColorManagedDisplaySettings *display_settings,
159                                 float clip_min_x, float clip_min_y,
160                                 float clip_max_x, float clip_max_y,
161                                 float zoom_x, float zoom_y);
162
163
164 /* Draw imbuf on a screen, preferably using GLSL display transform */
165 void glaDrawImBuf_glsl_ctx(const struct bContext *C, struct ImBuf *ibuf, float x, float y, int zoomfilter,
166                            float zoom_x, float zoom_y);
167 void glaDrawImBuf_glsl_ctx_clipping(const struct bContext *C,
168                                     struct ImBuf *ibuf,
169                                     float x, float y,
170                                     int zoomfilter,
171                                     float clip_min_x, float clip_min_y,
172                                     float clip_max_x, float clip_max_y,
173                                     float zoom_x, float zoom_y);
174
175 void immDrawBorderCorners(unsigned int pos, const struct rcti *border, float zoomx, float zoomy);
176
177 #endif /* __BIF_GLUTIL_H__ */