Make image drawing code working with core profile
[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 } IMMDrawPixelsTexState;
75
76 /* To be used before calling immDrawPixelsTex
77  * Default shader is GPU_SHADER_2D_IMAGE_COLOR
78  * Returns a shader to be able to set uniforms */
79 IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin);
80
81 /**
82  * immDrawPixelsTex - Functions like a limited glDrawPixels, but actually draws the
83  * image using textures, which can be tremendously faster on low-end
84  * cards, and also avoids problems with the raster position being
85  * clipped when offscreen. Pixel unpacking parameters and
86  * the glPixelZoom values are _not_ respected.
87  *
88  * \attention Use immDrawPixelsTexSetup before calling this function.
89  *
90  * \attention This routine makes many assumptions: the rect data
91  * is expected to be in RGBA byte or float format, and the
92  * modelview and projection matrices are assumed to define a
93  * 1-to-1 mapping to screen space.
94  */
95 void immDrawPixelsTex(IMMDrawPixelsTexState *state,
96                       float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect,
97                       float xzoom, float yzoom, float color[4]);
98 void immDrawPixelsTex_clipping(IMMDrawPixelsTexState *state,
99                                float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect,
100                                float clip_min_x, float clip_min_y, float clip_max_x, float clip_max_y,
101                                float xzoom, float yzoom, float color[4]);
102 void immDrawPixelsTexScaled(IMMDrawPixelsTexState *state,
103                             float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect, float scaleX, float scaleY,
104                             float xzoom, float yzoom, float color[4]);
105 void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
106                                      float x, float y, int img_w, int img_h, int format, int type, int zoomfilter, void *rect, float scaleX, float scaleY,
107                                      float clip_min_x, float clip_min_y, float clip_max_x, float clip_max_y,
108                                      float xzoom, float yzoom, float color[4]);
109 /* 2D Drawing Assistance */
110
111 /** Define a 2D area (viewport, scissor, matrices) for OpenGL rendering.
112  *
113  * glaDefine2DArea and glaBegin2DDraw set up an OpenGL state appropriate
114  * for drawing using both vertex (Vertex, etc) and raster (RasterPos, Rect)
115  * commands. All coordinates should be at integer positions. There is little
116  * to no reason to use glVertex2f etc. functions during 2D rendering, and
117  * thus no reason to +-0.5 the coordinates or perform other silly
118  * tricks.
119  *
120  * \param screen_rect The screen rectangle to be defined for 2D drawing.
121  */
122 void glaDefine2DArea(struct rcti *screen_rect);
123
124 /* TODO(merwin): put the following 2D code to use, or build new 2D code inspired & informd by it */
125
126 #if 0  /* UNUSED */
127
128 typedef struct gla2DDrawInfo gla2DDrawInfo;
129
130 gla2DDrawInfo *glaBegin2DDraw(struct rcti *screen_rect, struct rctf *world_rect);
131 void gla2DDrawTranslatePt(gla2DDrawInfo *di, float wo_x, float wo_y, int *r_sc_x, int *r_sc_y);
132 void gla2DDrawTranslatePtv(gla2DDrawInfo *di, float world[2], int r_screen[2]);
133
134 void glaEnd2DDraw(gla2DDrawInfo *di);
135
136 /** Adjust the transformation mapping of a 2d area */
137 void gla2DGetMap(gla2DDrawInfo *di, struct rctf *rect);
138 void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect);
139
140 #endif /* UNUSED */
141
142 void set_inverted_drawing(int enable);
143 void setlinestyle(int nr);
144
145 /* own working polygon offset */
146 void bglPolygonOffset(float viewdist, float dist);
147
148 /* **** Color management helper functions for GLSL display/transform ***** */
149
150 /* Draw imbuf on a screen, preferably using GLSL display transform */
151 void glaDrawImBuf_glsl(struct ImBuf *ibuf, float x, float y, int zoomfilter,
152                        struct ColorManagedViewSettings *view_settings,
153                        struct ColorManagedDisplaySettings *display_settings,
154                        float zoom_x, float zoom_y);
155 void glaDrawImBuf_glsl_clipping(struct ImBuf *ibuf, float x, float y, int zoomfilter,
156                                 struct ColorManagedViewSettings *view_settings,
157                                 struct ColorManagedDisplaySettings *display_settings,
158                                 float clip_min_x, float clip_min_y,
159                                 float clip_max_x, float clip_max_y,
160                                 float zoom_x, float zoom_y);
161
162
163 /* Draw imbuf on a screen, preferably using GLSL display transform */
164 void glaDrawImBuf_glsl_ctx(const struct bContext *C, struct ImBuf *ibuf, float x, float y, int zoomfilter,
165                            float zoom_x, float zoom_y);
166 void glaDrawImBuf_glsl_ctx_clipping(const struct bContext *C,
167                                     struct ImBuf *ibuf,
168                                     float x, float y,
169                                     int zoomfilter,
170                                     float clip_min_x, float clip_min_y,
171                                     float clip_max_x, float clip_max_y,
172                                     float zoom_x, float zoom_y);
173
174 void immDrawBorderCorners(unsigned int pos, const struct rcti *border, float zoomx, float zoomy);
175
176 #endif /* __BIF_GLUTIL_H__ */