Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BSP_DISCO_F746NG Graphics mbed
Models/ArduinoGL.cpp@3:aca7fe2d44b3, 2016-11-11 (annotated)
- Committer:
- karpent
- Date:
- Fri Nov 11 17:06:53 2016 +0000
- Revision:
- 3:aca7fe2d44b3
- Parent:
- 1:4a5e329e617b
New 3d models added
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| karpent | 0:8acbce46eede | 1 | /* |
| karpent | 0:8acbce46eede | 2 | ArduinoGL.h - OpenGL subset for Arduino. |
| karpent | 0:8acbce46eede | 3 | Created by Fabio de Albuquerque Dela Antonio |
| karpent | 0:8acbce46eede | 4 | fabio914 at gmail.com |
| karpent | 0:8acbce46eede | 5 | */ |
| karpent | 0:8acbce46eede | 6 | |
| karpent | 0:8acbce46eede | 7 | #include "ArduinoGL.h" |
| karpent | 0:8acbce46eede | 8 | |
| karpent | 1:4a5e329e617b | 9 | Display* renderer = NULL; |
| karpent | 1:4a5e329e617b | 10 | //Canvas * glCanvas = NULL; |
| karpent | 0:8acbce46eede | 11 | GLDrawMode glDrawMode = GL_NONE; |
| karpent | 0:8acbce46eede | 12 | |
| karpent | 0:8acbce46eede | 13 | GLVertex glVertices[MAX_VERTICES]; |
| karpent | 0:8acbce46eede | 14 | unsigned glVerticesCount = 0; |
| karpent | 0:8acbce46eede | 15 | |
| karpent | 0:8acbce46eede | 16 | GLMatrixMode glmatrixMode = GL_PROJECTION; |
| karpent | 0:8acbce46eede | 17 | float glMatrices[2][16]; |
| karpent | 0:8acbce46eede | 18 | float glMatrixStack[MAX_MATRICES][16]; |
| karpent | 0:8acbce46eede | 19 | unsigned glMatrixStackTop = 0; |
| karpent | 0:8acbce46eede | 20 | |
| karpent | 0:8acbce46eede | 21 | // Point size |
| karpent | 0:8acbce46eede | 22 | unsigned glPointLength = 1; |
| karpent | 0:8acbce46eede | 23 | |
| karpent | 0:8acbce46eede | 24 | /* Aux functions */ |
| karpent | 0:8acbce46eede | 25 | void copyMatrix(float * dest, float * src) |
| karpent | 0:8acbce46eede | 26 | { |
| karpent | 0:8acbce46eede | 27 | for(int i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 28 | dest[i] = src[i]; |
| karpent | 0:8acbce46eede | 29 | } |
| karpent | 0:8acbce46eede | 30 | |
| karpent | 0:8acbce46eede | 31 | void multMatrix(float * dest, float * src1, float * src2) |
| karpent | 0:8acbce46eede | 32 | { |
| karpent | 0:8acbce46eede | 33 | int i, j, k; |
| karpent | 0:8acbce46eede | 34 | float m[16]; |
| karpent | 0:8acbce46eede | 35 | |
| karpent | 0:8acbce46eede | 36 | for(i = 0; i < 4; i++) |
| karpent | 0:8acbce46eede | 37 | for(j = 0; j < 4; j++) { |
| karpent | 0:8acbce46eede | 38 | |
| karpent | 0:8acbce46eede | 39 | m[i + j * 4] = 0.0; |
| karpent | 0:8acbce46eede | 40 | |
| karpent | 0:8acbce46eede | 41 | for(k = 0; k < 4; k++) |
| karpent | 0:8acbce46eede | 42 | m[i + j * 4] += src1[i + k * 4] * src2[k + j * 4]; |
| karpent | 0:8acbce46eede | 43 | } |
| karpent | 0:8acbce46eede | 44 | |
| karpent | 0:8acbce46eede | 45 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 46 | dest[i] = m[i]; |
| karpent | 0:8acbce46eede | 47 | } |
| karpent | 0:8acbce46eede | 48 | |
| karpent | 0:8acbce46eede | 49 | void pushMatrix(float * m) |
| karpent | 0:8acbce46eede | 50 | { |
| karpent | 0:8acbce46eede | 51 | if(glMatrixStackTop < MAX_MATRICES) { |
| karpent | 0:8acbce46eede | 52 | copyMatrix(glMatrixStack[glMatrixStackTop], m); |
| karpent | 0:8acbce46eede | 53 | glMatrixStackTop++; |
| karpent | 0:8acbce46eede | 54 | } |
| karpent | 0:8acbce46eede | 55 | } |
| karpent | 0:8acbce46eede | 56 | |
| karpent | 0:8acbce46eede | 57 | void popMatrix(void) |
| karpent | 0:8acbce46eede | 58 | { |
| karpent | 0:8acbce46eede | 59 | if(glMatrixStackTop > 0) { |
| karpent | 0:8acbce46eede | 60 | glMatrixStackTop--; |
| karpent | 0:8acbce46eede | 61 | } |
| karpent | 0:8acbce46eede | 62 | } |
| karpent | 0:8acbce46eede | 63 | |
| karpent | 0:8acbce46eede | 64 | GLVertex multVertex(float * m, GLVertex v) |
| karpent | 0:8acbce46eede | 65 | { |
| karpent | 0:8acbce46eede | 66 | GLVertex ret; |
| karpent | 0:8acbce46eede | 67 | |
| karpent | 0:8acbce46eede | 68 | ret.x = m[0] * v.x + m[4] * v.y + m[8] * v.z + m[12] * v.w; |
| karpent | 0:8acbce46eede | 69 | ret.y = m[1] * v.x + m[5] * v.y + m[9] * v.z + m[13] * v.w; |
| karpent | 0:8acbce46eede | 70 | ret.z = m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14] * v.w; |
| karpent | 0:8acbce46eede | 71 | ret.w = m[3] * v.x + m[7] * v.y + m[11] * v.z + m[15] * v.w; |
| karpent | 0:8acbce46eede | 72 | |
| karpent | 0:8acbce46eede | 73 | return ret; |
| karpent | 0:8acbce46eede | 74 | } |
| karpent | 0:8acbce46eede | 75 | |
| karpent | 0:8acbce46eede | 76 | void normVector3(float * dest, float * src) |
| karpent | 0:8acbce46eede | 77 | { |
| karpent | 0:8acbce46eede | 78 | float norm; |
| karpent | 0:8acbce46eede | 79 | register int i; |
| karpent | 0:8acbce46eede | 80 | |
| karpent | 0:8acbce46eede | 81 | norm = sqrt(src[0] * src[0] + src[1] * src[1] + src[2] * src[2]); |
| karpent | 0:8acbce46eede | 82 | |
| karpent | 0:8acbce46eede | 83 | for(i = 0; i < 3; i++) |
| karpent | 0:8acbce46eede | 84 | dest[i] = src[i]/norm; |
| karpent | 0:8acbce46eede | 85 | } |
| karpent | 0:8acbce46eede | 86 | |
| karpent | 0:8acbce46eede | 87 | void crossVector3(float * dest, float * src1, float * src2) |
| karpent | 0:8acbce46eede | 88 | { |
| karpent | 0:8acbce46eede | 89 | float ret[3]; |
| karpent | 0:8acbce46eede | 90 | register int i; |
| karpent | 0:8acbce46eede | 91 | |
| karpent | 0:8acbce46eede | 92 | ret[0] = src1[1] * src2[2] - src1[2] * src2[1]; |
| karpent | 0:8acbce46eede | 93 | ret[1] = src1[2] * src2[0] - src1[0] * src2[2]; |
| karpent | 0:8acbce46eede | 94 | ret[2] = src1[0] * src2[1] - src1[1] * src2[0]; |
| karpent | 0:8acbce46eede | 95 | |
| karpent | 0:8acbce46eede | 96 | for(i = 0; i < 3; i++) |
| karpent | 0:8acbce46eede | 97 | dest[i] = ret[i]; |
| karpent | 0:8acbce46eede | 98 | } |
| karpent | 0:8acbce46eede | 99 | |
| karpent | 0:8acbce46eede | 100 | /* Matrices */ |
| karpent | 0:8acbce46eede | 101 | |
| karpent | 0:8acbce46eede | 102 | void glMatrixMode(GLMatrixMode mode) |
| karpent | 0:8acbce46eede | 103 | { |
| karpent | 0:8acbce46eede | 104 | if(mode == GL_MODELVIEW || mode == GL_PROJECTION) |
| karpent | 0:8acbce46eede | 105 | glmatrixMode = mode; |
| karpent | 0:8acbce46eede | 106 | } |
| karpent | 0:8acbce46eede | 107 | |
| karpent | 0:8acbce46eede | 108 | void glMultMatrixf(float * m) |
| karpent | 0:8acbce46eede | 109 | { |
| karpent | 0:8acbce46eede | 110 | multMatrix(glMatrices[glmatrixMode], glMatrices[glmatrixMode], m); |
| karpent | 0:8acbce46eede | 111 | } |
| karpent | 0:8acbce46eede | 112 | |
| karpent | 0:8acbce46eede | 113 | void glLoadMatrixf(float * m) |
| karpent | 0:8acbce46eede | 114 | { |
| karpent | 0:8acbce46eede | 115 | copyMatrix(glMatrices[glmatrixMode], m); |
| karpent | 0:8acbce46eede | 116 | } |
| karpent | 0:8acbce46eede | 117 | |
| karpent | 0:8acbce46eede | 118 | void glLoadIdentity(void) |
| karpent | 0:8acbce46eede | 119 | { |
| karpent | 0:8acbce46eede | 120 | float m[16]; |
| karpent | 0:8acbce46eede | 121 | int i; |
| karpent | 0:8acbce46eede | 122 | |
| karpent | 0:8acbce46eede | 123 | for(i = 0; i < 16; i++) |
| karpent | 1:4a5e329e617b | 124 | { |
| karpent | 1:4a5e329e617b | 125 | m[i] = (i % 5 == 0) ? 1.0 : 0.0; |
| karpent | 1:4a5e329e617b | 126 | } |
| karpent | 0:8acbce46eede | 127 | |
| karpent | 0:8acbce46eede | 128 | glLoadMatrixf(m); |
| karpent | 0:8acbce46eede | 129 | } |
| karpent | 0:8acbce46eede | 130 | |
| karpent | 0:8acbce46eede | 131 | void glPushMatrix(void) |
| karpent | 0:8acbce46eede | 132 | { |
| karpent | 0:8acbce46eede | 133 | pushMatrix(glMatrices[glmatrixMode]); |
| karpent | 0:8acbce46eede | 134 | } |
| karpent | 0:8acbce46eede | 135 | |
| karpent | 0:8acbce46eede | 136 | void glPopMatrix(void) |
| karpent | 0:8acbce46eede | 137 | { |
| karpent | 0:8acbce46eede | 138 | popMatrix(); |
| karpent | 0:8acbce46eede | 139 | } |
| karpent | 0:8acbce46eede | 140 | |
| karpent | 0:8acbce46eede | 141 | void glOrtho(float left, float right, float bottom, float top, float zNear, float zFar) |
| karpent | 0:8acbce46eede | 142 | { |
| karpent | 0:8acbce46eede | 143 | |
| karpent | 0:8acbce46eede | 144 | float tx = -(right + left)/(right - left); |
| karpent | 0:8acbce46eede | 145 | float ty = -(top + bottom)/(top - bottom); |
| karpent | 0:8acbce46eede | 146 | float tz = -(zFar + zNear)/(zFar - zNear); |
| karpent | 0:8acbce46eede | 147 | |
| karpent | 0:8acbce46eede | 148 | float m[16]; |
| karpent | 0:8acbce46eede | 149 | int i; |
| karpent | 0:8acbce46eede | 150 | |
| karpent | 0:8acbce46eede | 151 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 152 | m[i] = 0.0; |
| karpent | 0:8acbce46eede | 153 | |
| karpent | 0:8acbce46eede | 154 | m[0] = 2.0f/(right - left); |
| karpent | 0:8acbce46eede | 155 | m[5] = 2.0f/(top - bottom); |
| karpent | 0:8acbce46eede | 156 | m[10] = -2.0/(zFar - zNear); |
| karpent | 0:8acbce46eede | 157 | m[12] = tx; |
| karpent | 0:8acbce46eede | 158 | m[13] = ty; |
| karpent | 0:8acbce46eede | 159 | m[14] = tz; |
| karpent | 0:8acbce46eede | 160 | m[15] = 1.0; |
| karpent | 0:8acbce46eede | 161 | |
| karpent | 0:8acbce46eede | 162 | glMultMatrixf(m); |
| karpent | 0:8acbce46eede | 163 | } |
| karpent | 0:8acbce46eede | 164 | |
| karpent | 0:8acbce46eede | 165 | void gluOrtho2D(float left, float right, float bottom, float top) |
| karpent | 0:8acbce46eede | 166 | { |
| karpent | 0:8acbce46eede | 167 | glOrtho(left, right, bottom, top, -1.0, 1.0); |
| karpent | 0:8acbce46eede | 168 | } |
| karpent | 0:8acbce46eede | 169 | |
| karpent | 0:8acbce46eede | 170 | void glFrustum(float left, float right, float bottom, float top, float zNear, float zFar) |
| karpent | 0:8acbce46eede | 171 | { |
| karpent | 0:8acbce46eede | 172 | |
| karpent | 0:8acbce46eede | 173 | float A = (right + left)/(right - left); |
| karpent | 0:8acbce46eede | 174 | float B = (top + bottom)/(top - bottom); |
| karpent | 0:8acbce46eede | 175 | float C = -(zFar + zNear)/(zFar - zNear); |
| karpent | 0:8acbce46eede | 176 | float D = -(2.0f * zFar * zNear)/(zFar - zNear); |
| karpent | 0:8acbce46eede | 177 | |
| karpent | 0:8acbce46eede | 178 | float m[16]; |
| karpent | 0:8acbce46eede | 179 | int i; |
| karpent | 0:8acbce46eede | 180 | |
| karpent | 0:8acbce46eede | 181 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 182 | m[i] = 0.0; |
| karpent | 0:8acbce46eede | 183 | |
| karpent | 0:8acbce46eede | 184 | m[0] = (2.0f * zNear)/(right - left); |
| karpent | 0:8acbce46eede | 185 | m[5] = (2.0f * zNear)/(top - bottom); |
| karpent | 0:8acbce46eede | 186 | m[8] = A; |
| karpent | 0:8acbce46eede | 187 | m[9] = B; |
| karpent | 0:8acbce46eede | 188 | m[10] = C; |
| karpent | 0:8acbce46eede | 189 | m[11] = -1.0; |
| karpent | 0:8acbce46eede | 190 | m[14] = D; |
| karpent | 0:8acbce46eede | 191 | |
| karpent | 0:8acbce46eede | 192 | glMultMatrixf(m); |
| karpent | 0:8acbce46eede | 193 | } |
| karpent | 0:8acbce46eede | 194 | |
| karpent | 0:8acbce46eede | 195 | void gluPerspective(float fovy, float aspect, float zNear, float zFar) |
| karpent | 0:8acbce46eede | 196 | { |
| karpent | 0:8acbce46eede | 197 | |
| karpent | 0:8acbce46eede | 198 | float aux = tan((fovy/2.0f) * DEG2RAD); |
| karpent | 0:8acbce46eede | 199 | float top = zNear * aux; |
| karpent | 0:8acbce46eede | 200 | float bottom = -top; |
| karpent | 0:8acbce46eede | 201 | float right = zNear * aspect * aux; |
| karpent | 0:8acbce46eede | 202 | float left = -right; |
| karpent | 0:8acbce46eede | 203 | |
| karpent | 0:8acbce46eede | 204 | glFrustum(left, right, bottom, top, zNear, zFar); |
| karpent | 0:8acbce46eede | 205 | } |
| karpent | 0:8acbce46eede | 206 | |
| karpent | 0:8acbce46eede | 207 | void glRotatef(float angle, float x, float y, float z) |
| karpent | 0:8acbce46eede | 208 | { |
| karpent | 0:8acbce46eede | 209 | |
| karpent | 0:8acbce46eede | 210 | float c = cos(DEG2RAD * angle), s = sin(DEG2RAD * angle); |
| karpent | 0:8acbce46eede | 211 | float nx, ny, nz, norm; |
| karpent | 0:8acbce46eede | 212 | |
| karpent | 0:8acbce46eede | 213 | norm = sqrt(x*x + y*y + z*z); |
| karpent | 0:8acbce46eede | 214 | |
| karpent | 0:8acbce46eede | 215 | if(norm == 0) |
| karpent | 0:8acbce46eede | 216 | return; |
| karpent | 0:8acbce46eede | 217 | |
| karpent | 0:8acbce46eede | 218 | nx = x/norm; |
| karpent | 0:8acbce46eede | 219 | ny = y/norm; |
| karpent | 0:8acbce46eede | 220 | nz = z/norm; |
| karpent | 0:8acbce46eede | 221 | |
| karpent | 0:8acbce46eede | 222 | float m[16]; |
| karpent | 0:8acbce46eede | 223 | int i; |
| karpent | 0:8acbce46eede | 224 | |
| karpent | 0:8acbce46eede | 225 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 226 | m[i] = 0.0; |
| karpent | 0:8acbce46eede | 227 | |
| karpent | 0:8acbce46eede | 228 | m[0] = nx*nx*(1.0f - c) + c; |
| karpent | 0:8acbce46eede | 229 | m[1] = ny*nx*(1.0f - c) + nz*s; |
| karpent | 0:8acbce46eede | 230 | m[2] = nx*nz*(1.0f - c) - ny*s; |
| karpent | 0:8acbce46eede | 231 | m[4] = nx*ny*(1.0f - c) - nz*s; |
| karpent | 0:8acbce46eede | 232 | m[5] = ny*ny*(1.0f - c) + c; |
| karpent | 0:8acbce46eede | 233 | m[6] = ny*nz*(1.0f - c) + nx*s; |
| karpent | 0:8acbce46eede | 234 | m[8] = nx*nz*(1.0f - c) + ny*s; |
| karpent | 0:8acbce46eede | 235 | m[9] = ny*nz*(1.0f - c) - nx*s; |
| karpent | 0:8acbce46eede | 236 | m[10] = nz*nz*(1.0f - c) + c; |
| karpent | 0:8acbce46eede | 237 | m[15] = 1.0; |
| karpent | 0:8acbce46eede | 238 | |
| karpent | 0:8acbce46eede | 239 | glMultMatrixf(m); |
| karpent | 0:8acbce46eede | 240 | } |
| karpent | 0:8acbce46eede | 241 | |
| karpent | 0:8acbce46eede | 242 | void glTranslatef(float x, float y, float z) |
| karpent | 0:8acbce46eede | 243 | { |
| karpent | 0:8acbce46eede | 244 | |
| karpent | 0:8acbce46eede | 245 | float m[16]; |
| karpent | 0:8acbce46eede | 246 | int i; |
| karpent | 0:8acbce46eede | 247 | |
| karpent | 0:8acbce46eede | 248 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 249 | m[i] = 0.0; |
| karpent | 0:8acbce46eede | 250 | |
| karpent | 0:8acbce46eede | 251 | m[0] = 1.0; |
| karpent | 0:8acbce46eede | 252 | m[5] = 1.0; |
| karpent | 0:8acbce46eede | 253 | m[10] = 1.0; |
| karpent | 0:8acbce46eede | 254 | m[12] = x; |
| karpent | 0:8acbce46eede | 255 | m[13] = y; |
| karpent | 0:8acbce46eede | 256 | m[14] = z; |
| karpent | 0:8acbce46eede | 257 | m[15] = 1.0; |
| karpent | 0:8acbce46eede | 258 | |
| karpent | 0:8acbce46eede | 259 | glMultMatrixf(m); |
| karpent | 0:8acbce46eede | 260 | } |
| karpent | 0:8acbce46eede | 261 | |
| karpent | 0:8acbce46eede | 262 | void glScalef(float x, float y, float z) |
| karpent | 0:8acbce46eede | 263 | { |
| karpent | 0:8acbce46eede | 264 | |
| karpent | 0:8acbce46eede | 265 | float m[16]; |
| karpent | 0:8acbce46eede | 266 | int i; |
| karpent | 0:8acbce46eede | 267 | |
| karpent | 0:8acbce46eede | 268 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 269 | m[i] = 0.0; |
| karpent | 0:8acbce46eede | 270 | |
| karpent | 0:8acbce46eede | 271 | m[0] = x; |
| karpent | 0:8acbce46eede | 272 | m[5] = y; |
| karpent | 0:8acbce46eede | 273 | m[10] = z; |
| karpent | 0:8acbce46eede | 274 | m[15] = 1.0; |
| karpent | 0:8acbce46eede | 275 | |
| karpent | 0:8acbce46eede | 276 | glMultMatrixf(m); |
| karpent | 0:8acbce46eede | 277 | } |
| karpent | 0:8acbce46eede | 278 | |
| karpent | 0:8acbce46eede | 279 | void gluLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) |
| karpent | 0:8acbce46eede | 280 | { |
| karpent | 0:8acbce46eede | 281 | |
| karpent | 0:8acbce46eede | 282 | float dir[3], up[3]; |
| karpent | 0:8acbce46eede | 283 | |
| karpent | 0:8acbce46eede | 284 | dir[0] = centerX - eyeX; |
| karpent | 0:8acbce46eede | 285 | dir[1] = centerY - eyeY; |
| karpent | 0:8acbce46eede | 286 | dir[2] = centerZ - eyeZ; |
| karpent | 0:8acbce46eede | 287 | |
| karpent | 0:8acbce46eede | 288 | up[0] = upX; |
| karpent | 0:8acbce46eede | 289 | up[1] = upY; |
| karpent | 0:8acbce46eede | 290 | up[2] = upZ; |
| karpent | 0:8acbce46eede | 291 | |
| karpent | 0:8acbce46eede | 292 | float n[3], u[3], v[3]; |
| karpent | 0:8acbce46eede | 293 | |
| karpent | 0:8acbce46eede | 294 | normVector3(n, dir); |
| karpent | 0:8acbce46eede | 295 | |
| karpent | 0:8acbce46eede | 296 | crossVector3(u, n, up); |
| karpent | 0:8acbce46eede | 297 | normVector3(u, u); |
| karpent | 0:8acbce46eede | 298 | |
| karpent | 0:8acbce46eede | 299 | crossVector3(v, u, n); |
| karpent | 0:8acbce46eede | 300 | |
| karpent | 0:8acbce46eede | 301 | float m[16]; |
| karpent | 0:8acbce46eede | 302 | int i; |
| karpent | 0:8acbce46eede | 303 | |
| karpent | 0:8acbce46eede | 304 | for(i = 0; i < 16; i++) |
| karpent | 0:8acbce46eede | 305 | m[i] = 0.0; |
| karpent | 0:8acbce46eede | 306 | |
| karpent | 0:8acbce46eede | 307 | m[0] = u[0]; |
| karpent | 0:8acbce46eede | 308 | m[1] = v[0]; |
| karpent | 0:8acbce46eede | 309 | m[2] = -n[0]; |
| karpent | 0:8acbce46eede | 310 | |
| karpent | 0:8acbce46eede | 311 | m[4] = u[1]; |
| karpent | 0:8acbce46eede | 312 | m[5] = v[1]; |
| karpent | 0:8acbce46eede | 313 | m[6] = -n[1]; |
| karpent | 0:8acbce46eede | 314 | |
| karpent | 0:8acbce46eede | 315 | m[8] = u[2]; |
| karpent | 0:8acbce46eede | 316 | m[9] = v[2]; |
| karpent | 0:8acbce46eede | 317 | m[10] = -n[2]; |
| karpent | 0:8acbce46eede | 318 | |
| karpent | 0:8acbce46eede | 319 | m[15] = 1.0; |
| karpent | 0:8acbce46eede | 320 | |
| karpent | 0:8acbce46eede | 321 | glMultMatrixf(m); |
| karpent | 0:8acbce46eede | 322 | glTranslatef(-eyeX, -eyeY, -eyeZ); |
| karpent | 0:8acbce46eede | 323 | } |
| karpent | 0:8acbce46eede | 324 | |
| karpent | 0:8acbce46eede | 325 | /* Vertices */ |
| karpent | 0:8acbce46eede | 326 | |
| karpent | 0:8acbce46eede | 327 | void glVertex4fv(float * v) |
| karpent | 0:8acbce46eede | 328 | { |
| karpent | 0:8acbce46eede | 329 | glVertex4f(v[0], v[1], v[2], v[3]); |
| karpent | 0:8acbce46eede | 330 | } |
| karpent | 0:8acbce46eede | 331 | |
| karpent | 0:8acbce46eede | 332 | void glVertex4f(float x, float y, float z, float w) |
| karpent | 0:8acbce46eede | 333 | { |
| karpent | 0:8acbce46eede | 334 | |
| karpent | 0:8acbce46eede | 335 | GLVertex v; |
| karpent | 0:8acbce46eede | 336 | |
| karpent | 0:8acbce46eede | 337 | v.x = x; |
| karpent | 0:8acbce46eede | 338 | v.y = y; |
| karpent | 0:8acbce46eede | 339 | v.z = z; |
| karpent | 0:8acbce46eede | 340 | v.w = w; |
| karpent | 0:8acbce46eede | 341 | |
| karpent | 0:8acbce46eede | 342 | if(glVerticesCount < MAX_VERTICES) { |
| karpent | 0:8acbce46eede | 343 | |
| karpent | 0:8acbce46eede | 344 | glVertices[glVerticesCount] = v; |
| karpent | 0:8acbce46eede | 345 | glVerticesCount++; |
| karpent | 0:8acbce46eede | 346 | } |
| karpent | 0:8acbce46eede | 347 | } |
| karpent | 0:8acbce46eede | 348 | |
| karpent | 0:8acbce46eede | 349 | void glVertex3fv(float * v) |
| karpent | 0:8acbce46eede | 350 | { |
| karpent | 0:8acbce46eede | 351 | glVertex3f(v[0], v[1], v[2]); |
| karpent | 0:8acbce46eede | 352 | } |
| karpent | 0:8acbce46eede | 353 | |
| karpent | 0:8acbce46eede | 354 | void glVertex3f(float x, float y, float z) |
| karpent | 0:8acbce46eede | 355 | { |
| karpent | 0:8acbce46eede | 356 | glVertex4f(x, y, z, 1.0); |
| karpent | 0:8acbce46eede | 357 | } |
| karpent | 0:8acbce46eede | 358 | |
| karpent | 0:8acbce46eede | 359 | /* OpenGL */ |
| karpent | 0:8acbce46eede | 360 | |
| karpent | 1:4a5e329e617b | 361 | void glUseCanvas(Display * c) |
| karpent | 0:8acbce46eede | 362 | { |
| karpent | 1:4a5e329e617b | 363 | renderer = c; |
| karpent | 0:8acbce46eede | 364 | } |
| karpent | 0:8acbce46eede | 365 | |
| karpent | 0:8acbce46eede | 366 | void glClear(int mask) |
| karpent | 0:8acbce46eede | 367 | { |
| karpent | 0:8acbce46eede | 368 | |
| karpent | 0:8acbce46eede | 369 | if(mask & GL_COLOR_BUFFER_BIT) { |
| karpent | 0:8acbce46eede | 370 | |
| karpent | 1:4a5e329e617b | 371 | if(renderer != NULL) { |
| karpent | 1:4a5e329e617b | 372 | renderer->Clear(); |
| karpent | 0:8acbce46eede | 373 | } |
| karpent | 0:8acbce46eede | 374 | } |
| karpent | 0:8acbce46eede | 375 | } |
| karpent | 0:8acbce46eede | 376 | |
| karpent | 0:8acbce46eede | 377 | void glPointSize(unsigned size) |
| karpent | 0:8acbce46eede | 378 | { |
| karpent | 0:8acbce46eede | 379 | glPointLength = size; |
| karpent | 0:8acbce46eede | 380 | } |
| karpent | 0:8acbce46eede | 381 | |
| karpent | 0:8acbce46eede | 382 | // Reset frame data |
| karpent | 0:8acbce46eede | 383 | void glBegin(GLDrawMode mode) |
| karpent | 0:8acbce46eede | 384 | { |
| karpent | 0:8acbce46eede | 385 | glDrawMode = mode; |
| karpent | 0:8acbce46eede | 386 | glVerticesCount = 0; |
| karpent | 0:8acbce46eede | 387 | } |
| karpent | 0:8acbce46eede | 388 | |
| karpent | 0:8acbce46eede | 389 | // Render frame to current buffer |
| karpent | 0:8acbce46eede | 390 | void glEnd(void) |
| karpent | 0:8acbce46eede | 391 | { |
| karpent | 0:8acbce46eede | 392 | |
| karpent | 1:4a5e329e617b | 393 | if(renderer == NULL || glDrawMode == GL_NONE) |
| karpent | 0:8acbce46eede | 394 | return; |
| karpent | 0:8acbce46eede | 395 | |
| karpent | 0:8acbce46eede | 396 | float modelviewProjection[16]; |
| karpent | 0:8acbce46eede | 397 | multMatrix(modelviewProjection, glMatrices[GL_PROJECTION], glMatrices[GL_MODELVIEW]); |
| karpent | 0:8acbce46eede | 398 | |
| karpent | 1:4a5e329e617b | 399 | int frameWidth = renderer->DisplayWidth(); |
| karpent | 1:4a5e329e617b | 400 | int frameHeight = renderer->DisplayHeight(); |
| karpent | 0:8acbce46eede | 401 | |
| karpent | 0:8acbce46eede | 402 | for(int i = 0; i < glVerticesCount; i++) { |
| karpent | 0:8acbce46eede | 403 | |
| karpent | 0:8acbce46eede | 404 | GLVertex aux = multVertex(modelviewProjection, glVertices[i]); |
| karpent | 0:8acbce46eede | 405 | |
| karpent | 0:8acbce46eede | 406 | aux.x = aux.x/aux.w; |
| karpent | 0:8acbce46eede | 407 | aux.y = aux.y/aux.w; |
| karpent | 0:8acbce46eede | 408 | aux.z = aux.z/aux.w; |
| karpent | 0:8acbce46eede | 409 | |
| karpent | 0:8acbce46eede | 410 | glVertices[i] = aux; |
| karpent | 0:8acbce46eede | 411 | } |
| karpent | 0:8acbce46eede | 412 | |
| karpent | 0:8acbce46eede | 413 | if(glDrawMode == GL_POINTS) { |
| karpent | 0:8acbce46eede | 414 | |
| karpent | 0:8acbce46eede | 415 | for(int i = 0; i < glVerticesCount; i++) { |
| karpent | 0:8acbce46eede | 416 | |
| karpent | 0:8acbce46eede | 417 | GLVertex * aux = &(glVertices[i]); |
| karpent | 0:8acbce46eede | 418 | |
| karpent | 0:8acbce46eede | 419 | if(!(glVertices[i].x >= -1.0f && glVertices[i].x <= 1.0f)) |
| karpent | 0:8acbce46eede | 420 | continue; |
| karpent | 0:8acbce46eede | 421 | |
| karpent | 0:8acbce46eede | 422 | if(!(glVertices[i].y >= -1.0f && glVertices[i].y <= 1.0f)) |
| karpent | 0:8acbce46eede | 423 | continue; |
| karpent | 0:8acbce46eede | 424 | |
| karpent | 0:8acbce46eede | 425 | if(!(glVertices[i].z >= -1.0f && glVertices[i].z <= 1.0f)) |
| karpent | 0:8acbce46eede | 426 | continue; |
| karpent | 0:8acbce46eede | 427 | |
| karpent | 0:8acbce46eede | 428 | int px = (((aux->x + 1.0f)/2.0f) * (frameWidth - 1)); |
| karpent | 0:8acbce46eede | 429 | int py = ((1.0f - ((aux->y + 1.0f)/2.0f)) * (frameHeight - 1)); |
| karpent | 0:8acbce46eede | 430 | |
| karpent | 0:8acbce46eede | 431 | for(int x = (px - glPointLength/2.0f); x <= (px + glPointLength/2.0f); x++) |
| karpent | 0:8acbce46eede | 432 | for(int y = (py - glPointLength/2.0); y <= (py + glPointLength/2.0); y++) |
| karpent | 1:4a5e329e617b | 433 | renderer->DrawPoint(x, y, HIGH); |
| karpent | 0:8acbce46eede | 434 | } |
| karpent | 0:8acbce46eede | 435 | } |
| karpent | 0:8acbce46eede | 436 | |
| karpent | 0:8acbce46eede | 437 | else if(glDrawMode == GL_POLYGON) { |
| karpent | 0:8acbce46eede | 438 | |
| karpent | 0:8acbce46eede | 439 | /* TODO Improve! */ |
| karpent | 0:8acbce46eede | 440 | if(glVerticesCount < 2) |
| karpent | 0:8acbce46eede | 441 | return; |
| karpent | 0:8acbce46eede | 442 | |
| karpent | 0:8acbce46eede | 443 | int px[MAX_VERTICES], py[MAX_VERTICES]; |
| karpent | 0:8acbce46eede | 444 | |
| karpent | 0:8acbce46eede | 445 | for(int i = 0; i < glVerticesCount; i++) { |
| karpent | 0:8acbce46eede | 446 | |
| karpent | 0:8acbce46eede | 447 | if(!(glVertices[i].z >= -1.0f && glVertices[i].z <= 1.0f)) |
| karpent | 0:8acbce46eede | 448 | return; |
| karpent | 0:8acbce46eede | 449 | |
| karpent | 0:8acbce46eede | 450 | GLVertex * aux = &(glVertices[i]); |
| karpent | 0:8acbce46eede | 451 | |
| karpent | 0:8acbce46eede | 452 | px[i] = (((aux->x + 1.0f)/2.0f) * (frameWidth - 1)); |
| karpent | 0:8acbce46eede | 453 | py[i] = ((1.0f - ((aux->y + 1.0f)/2.0f)) * (frameHeight - 1)); |
| karpent | 0:8acbce46eede | 454 | } |
| karpent | 0:8acbce46eede | 455 | |
| karpent | 0:8acbce46eede | 456 | for(int i = 0; i < glVerticesCount; i++) { |
| karpent | 0:8acbce46eede | 457 | |
| karpent | 0:8acbce46eede | 458 | int next = (i + 1 == glVerticesCount) ? 0:(i + 1); |
| karpent | 1:4a5e329e617b | 459 | renderer->DrawLine(px[i], py[i], px[next], py[next]); |
| karpent | 0:8acbce46eede | 460 | } |
| karpent | 0:8acbce46eede | 461 | } |
| karpent | 0:8acbce46eede | 462 | |
| karpent | 0:8acbce46eede | 463 | else if(glDrawMode == GL_TRIANGLE_STRIP) { |
| karpent | 0:8acbce46eede | 464 | |
| karpent | 0:8acbce46eede | 465 | /* TODO Improve! */ |
| karpent | 0:8acbce46eede | 466 | if(glVerticesCount < 3) |
| karpent | 0:8acbce46eede | 467 | return; |
| karpent | 0:8acbce46eede | 468 | |
| karpent | 0:8acbce46eede | 469 | int px[MAX_VERTICES], py[MAX_VERTICES]; |
| karpent | 0:8acbce46eede | 470 | |
| karpent | 0:8acbce46eede | 471 | for(int i = 0; i < glVerticesCount; i++) { |
| karpent | 0:8acbce46eede | 472 | |
| karpent | 0:8acbce46eede | 473 | if(!(glVertices[i].z >= -1.0f && glVertices[i].z <= 1.0f)) |
| karpent | 0:8acbce46eede | 474 | return; |
| karpent | 0:8acbce46eede | 475 | |
| karpent | 0:8acbce46eede | 476 | GLVertex * aux = &(glVertices[i]); |
| karpent | 0:8acbce46eede | 477 | |
| karpent | 0:8acbce46eede | 478 | px[i] = (((aux->x + 1.0f)/2.0f) * (frameWidth - 1)); |
| karpent | 0:8acbce46eede | 479 | py[i] = ((1.0f - ((aux->y + 1.0f)/2.0f)) * (frameHeight - 1)); |
| karpent | 0:8acbce46eede | 480 | } |
| karpent | 0:8acbce46eede | 481 | |
| karpent | 0:8acbce46eede | 482 | for(int i = 0; i < glVerticesCount - 2; i++) { |
| karpent | 0:8acbce46eede | 483 | |
| karpent | 1:4a5e329e617b | 484 | renderer->DrawLine(px[i], py[i], px[i + 1], py[i + 1]); |
| karpent | 1:4a5e329e617b | 485 | renderer->DrawLine(px[i], py[i], px[i + 2], py[i + 2]); |
| karpent | 1:4a5e329e617b | 486 | renderer->DrawLine(px[i + 1], py[i + 1], px[i + 2], py[i + 2]); |
| karpent | 0:8acbce46eede | 487 | |
| karpent | 0:8acbce46eede | 488 | } |
| karpent | 0:8acbce46eede | 489 | } |
| karpent | 0:8acbce46eede | 490 | } |