Merge branch 'master' into blender2.8
[blender.git] / source / blender / gpu / GPU_matrix.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) 2012 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Alexandr Kuznetsov, Jason Wilkins, Mike Erwin
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file source/blender/gpu/GPU_matrix.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_MATRIX_H__
33 #define __GPU_MATRIX_H__
34
35 #include "BLI_sys_types.h"
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 struct Gwn_ShaderInterface;
42
43 void gpuMatrixReset(void); /* to Identity transform & empty stack */
44
45 /* ModelView Matrix (2D or 3D) */
46
47 void gpuPushMatrix(void); /* TODO: PushCopy vs PushIdentity? */
48 void gpuPopMatrix(void);
49
50 void gpuLoadIdentity(void);
51
52 void gpuScaleUniform(float factor);
53
54
55 /* 3D ModelView Matrix */
56
57 void gpuLoadMatrix(const float m[4][4]);
58 void gpuMultMatrix(const float m[4][4]);
59
60 void gpuTranslate3f(float x, float y, float z);
61 void gpuTranslate3fv(const float vec[3]);
62 void gpuScale3f(float x, float y, float z);
63 void gpuScale3fv(const float vec[3]);
64 void gpuRotate3f(float deg, float x, float y, float z); /* axis of rotation should be a unit vector */
65 void gpuRotate3fv(float deg, const float axis[3]); /* axis of rotation should be a unit vector */
66 void gpuRotateAxis(float deg, char axis); /* TODO: enum for axis? */
67
68 void gpuLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ);
69 /* TODO: variant that takes eye[3], center[3], up[3] */
70
71
72 /* 2D ModelView Matrix */
73
74 void gpuTranslate2f(float x, float y);
75 void gpuTranslate2fv(const float vec[2]);
76 void gpuScale2f(float x, float y);
77 void gpuScale2fv(const float vec[2]);
78 void gpuRotate2D(float deg);
79
80 /* Projection Matrix (2D or 3D) */
81
82 void gpuPushProjectionMatrix(void);
83 void gpuPopProjectionMatrix(void);
84
85 /* 3D Projection Matrix */
86
87 void gpuLoadIdentityProjectionMatrix(void);
88 void gpuLoadProjectionMatrix(const float m[4][4]);
89
90 void gpuOrtho(float left, float right, float bottom, float top, float near, float far);
91 void gpuFrustum(float left, float right, float bottom, float top, float near, float far);
92 void gpuPerspective(float fovy, float aspect, float near, float far);
93
94 /* 3D Projection between Window and World Space */
95
96 void gpuProject(const float world[3], const float model[4][4], const float proj[4][4], const int view[4], float win[3]);
97 bool gpuUnProject(const float win[3], const float model[4][4], const float proj[4][4], const int view[4], float world[3]);
98
99 /* 2D Projection Matrix */
100
101 void gpuOrtho2D(float left, float right, float bottom, float top);
102
103
104 /* functions to get matrix values */
105 const float (*gpuGetModelViewMatrix(float m[4][4]))[4];
106 const float (*gpuGetProjectionMatrix(float m[4][4]))[4];
107 const float (*gpuGetModelViewProjectionMatrix(float m[4][4]))[4];
108
109 const float (*gpuGetNormalMatrix(float m[3][3]))[3];
110 const float (*gpuGetNormalMatrixInverse(float m[3][3]))[3];
111
112
113 /* set uniform values for currently bound shader */
114 void gpuBindMatrices(const struct Gwn_ShaderInterface *);
115 bool gpuMatricesDirty(void); /* since last bind */
116
117
118 /* Python API needs to be able to inspect the stack so errors raise exceptions instead of crashing. */
119 #ifdef USE_GPU_PY_MATRIX_API
120 int GPU_matrix_stack_level_get_model_view(void);
121 int GPU_matrix_stack_level_get_projection(void);
122 /* static assert ensures this doesn't change! */
123 #define GPU_PY_MATRIX_STACK_LEN 31
124 #endif  /* USE_GPU_PY_MATRIX_API */
125
126
127 #ifdef __cplusplus
128 }
129 #endif
130
131 #ifndef SUPPRESS_GENERIC_MATRIX_API
132
133 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
134 #define _GPU_MAT3_CONST_CAST(x) (_Generic((x), \
135         void *:       (const float (*)[3])(x), \
136         float *:      (const float (*)[3])(x), \
137         float [9]:    (const float (*)[3])(x), \
138         float (*)[4]: (const float (*)[3])(x), \
139         float [4][4]: (const float (*)[3])(x), \
140         const void *:       (const float (*)[3])(x), \
141         const float *:      (const float (*)[3])(x), \
142         const float [9]:    (const float (*)[3])(x), \
143         const float (*)[3]: (const float (*)[3])(x), \
144         const float [3][3]: (const float (*)[3])(x)) \
145 )
146 #define _GPU_MAT3_CAST(x) (_Generic((x), \
147         void *:       (float (*)[3])(x), \
148         float *:      (float (*)[3])(x), \
149         float [9]:    (float (*)[3])(x), \
150         float (*)[3]: (float (*)[3])(x), \
151         float [3][3]: (float (*)[3])(x)) \
152 )
153 #define _GPU_MAT4_CONST_CAST(x) (_Generic((x), \
154         void *:       (const float (*)[4])(x), \
155         float *:      (const float (*)[4])(x), \
156         float [16]:   (const float (*)[4])(x), \
157         float (*)[4]: (const float (*)[4])(x), \
158         float [4][4]: (const float (*)[4])(x), \
159         const void *:       (const float (*)[4])(x), \
160         const float *:      (const float (*)[4])(x), \
161         const float [16]:   (const float (*)[4])(x), \
162         const float (*)[4]: (const float (*)[4])(x), \
163         const float [4][4]: (const float (*)[4])(x)) \
164 )
165 #define _GPU_MAT4_CAST(x) (_Generic((x), \
166         void *:       (float (*)[4])(x), \
167         float *:      (float (*)[4])(x), \
168         float [16]:   (float (*)[4])(x), \
169         float (*)[4]: (float (*)[4])(x), \
170         float [4][4]: (float (*)[4])(x)) \
171 )
172 #else
173 #  define _GPU_MAT3_CONST_CAST(x) (const float (*)[3])(x)
174 #  define _GPU_MAT3_CAST(x)             (float (*)[3])(x)
175 #  define _GPU_MAT4_CONST_CAST(x) (const float (*)[4])(x)
176 #  define _GPU_MAT4_CAST(x)             (float (*)[4])(x)
177 #endif  /* C11 */
178
179 /* make matrix inputs generic, to avoid warnings */
180 #  define gpuMultMatrix(x)  gpuMultMatrix(_GPU_MAT4_CONST_CAST(x))
181 #  define gpuLoadMatrix(x)  gpuLoadMatrix(_GPU_MAT4_CONST_CAST(x))
182 #  define gpuLoadProjectionMatrix(x)  gpuLoadProjectionMatrix(_GPU_MAT4_CONST_CAST(x))
183 #  define gpuGetModelViewMatrix(x)  gpuGetModelViewMatrix(_GPU_MAT4_CAST(x))
184 #  define gpuGetProjectionMatrix(x)  gpuGetProjectionMatrix(_GPU_MAT4_CAST(x))
185 #  define gpuGetModelViewProjectionMatrix(x)  gpuGetModelViewProjectionMatrix(_GPU_MAT4_CAST(x))
186 #  define gpuGetNormalMatrix(x)  gpuGetNormalMatrix(_GPU_MAT3_CAST(x))
187 #  define gpuGetNormalMatrixInverse(x)  gpuGetNormalMatrixInverse(_GPU_MAT3_CAST(x))
188 #endif /* SUPPRESS_GENERIC_MATRIX_API */
189
190 #endif /* __GPU_MATRIX_H__ */