void CMatrixGLES::Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { GLfloat modulous = sqrt((x*x)+(y*y)+(z*z)); if (modulous != 0.0) { x /= modulous; y /= modulous; z /= modulous; } GLfloat cosine = cos(angle); GLfloat sine = sin(angle); GLfloat cos1 = 1 - cosine; GLfloat a = (x*x*cos1) + cosine; GLfloat b = (x*y*cos1) - (z*sine); GLfloat c = (x*z*cos1) + (y*sine); GLfloat d = (y*x*cos1) + (z*sine); GLfloat e = (y*y*cos1) + cosine; GLfloat f = (y*z*cos1) - (x*sine); GLfloat g = (z*x*cos1) - (y*sine); GLfloat h = (z*y*cos1) + (x*sine); GLfloat i = (z*z*cos1) + cosine; GLfloat matrix[16] = { a, d, g, 0.0f, b, e, h, 0.0f, c, f, i, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; MultMatrixf(matrix); }
void CMatrixGLES::Scalef(GLfloat x, GLfloat y, GLfloat z) { GLfloat matrix[16] = { x, 0.0f, 0.0f, 0.0f, 0.0f, y, 0.0f, 0.0f, 0.0f, 0.0f, z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; MultMatrixf(matrix); }
void CMatrixGLES::Translatef(GLfloat x, GLfloat y, GLfloat z) { GLfloat matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, x, y, z, 1.0f}; MultMatrixf(matrix); }
static void MultMatrixd(const GLdouble m1[16]) { GLfloat m2[16]; int i; for (i = 0; i < 16; i++) m2[i] = (GLfloat) m1[i]; MultMatrixf(m2); }
// gluLookAt implementation taken from Mesa3D void CMatrixGLES::LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz) { GLfloat forward[3], side[3], up[3]; GLfloat m[4][4]; forward[0] = centerx - eyex; forward[1] = centery - eyey; forward[2] = centerz - eyez; up[0] = upx; up[1] = upy; up[2] = upz; GLfloat tmp = sqrt(forward[0]*forward[0] + forward[1]*forward[1] + forward[2]*forward[2]); if (tmp != 0.0) { forward[0] /= tmp; forward[1] /= tmp; forward[2] /= tmp; } side[0] = forward[1]*up[2] - forward[2]*up[1]; side[1] = forward[2]*up[0] - forward[0]*up[2]; side[2] = forward[0]*up[1] - forward[1]*up[0]; tmp = sqrt(side[0]*side[0] + side[1]*side[1] + side[2]*side[2]); if (tmp != 0.0) { side[0] /= tmp; side[1] /= tmp; side[2] /= tmp; } up[0] = side[1]*forward[2] - side[2]*forward[1]; up[1] = side[2]*forward[0] - side[0]*forward[2]; up[2] = side[0]*forward[1] - side[1]*forward[0]; m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; m[0][0] = side[0]; m[1][0] = side[1]; m[2][0] = side[2]; m[0][1] = up[0]; m[1][1] = up[1]; m[2][1] = up[2]; m[0][2] = -forward[0]; m[1][2] = -forward[1]; m[2][2] = -forward[2]; MultMatrixf(&m[0][0]); Translatef(-eyex, -eyey, -eyez); }
void CMatrixGLES::Ortho2D(GLfloat l, GLfloat r, GLfloat b, GLfloat t) { GLfloat u = 2.0f / (r - l); GLfloat v = 2.0f / (t - b); GLfloat x = - (r + l) / (r - l); GLfloat y = - (t + b) / (t - b); GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, 0.0f, v, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, x, y, 0.0f, 1.0f}; MultMatrixf(matrix); }
void CMatrixGLES::Frustum(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { GLfloat u = (2.0f * n) / (r - l); GLfloat v = (2.0f * n) / (t - b); GLfloat w = (r + l) / (r - l); GLfloat x = (t + b) / (t - b); GLfloat y = - (f + n) / (f - n); GLfloat z = - (2.0f * f * n) / (f - n); GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, 0.0f, v, 0.0f, 0.0f, w, x, y,-1.0f, 0.0f, 0.0f, z, 0.0f}; MultMatrixf(matrix); }
void CMatrixGLES::Ortho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { GLfloat u = 2.0f / (r - l); GLfloat v = 2.0f / (t - b); GLfloat w = -2.0f / (f - n); GLfloat x = - (r + l) / (r - l); GLfloat y = - (t + b) / (t - b); GLfloat z = - (f + n) / (f - n); GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, 0.0f, v, 0.0f, 0.0f, 0.0f, 0.0f, w, 0.0f, x, y, z, 1.0f}; MultMatrixf(matrix); }