Miroslaw K. / Mbed 2 deprecated 3DDemo

Dependencies:   BSP_DISCO_F746NG Graphics mbed

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?

UserRevisionLine numberNew 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 }