1 /* 2 * vec3.h 3 * Created by Clemens Unterkofler on 1/20/09. 4 * for Aleph One 5 * 6 * http://www.gnu.org/licenses/gpl.html 7 */ 8 9 #ifndef _VEC3__H 10 #define _VEC3__H 11 12 #include "OGL_Headers.h" 13 #include <cfloat> 14 #include <cmath> 15 16 const GLfloat kThreshhold = FLT_MIN * 10.0; 17 18 struct vec4 { 19 GLfloat _d[4]; 20 vec4vec421 vec4() {} vec4vec422 vec4(const GLfloat& x, const GLfloat& y, const GLfloat& z, const GLfloat& w) { 23 _d[0] = x; _d[1] = y; _d[2] = z; _d[3] = w; 24 } 25 pvec426 GLfloat* p() { return _d; } pvec427 const GLfloat* p() const { return _d; } 28 GLfloat operator[] (unsigned i) const { return _d[i]; } 29 GLfloat& operator[] (unsigned i) { return _d[i]; } 30 }; 31 32 struct vec3 : public vec4 { 33 vec3vec334 vec3() {} vec3vec335 vec3(const GLfloat& x, const GLfloat& y, const GLfloat& z) : vec4(x, y, z, 0.0) {} vec3vec336 vec3(const GLfloat* f) : vec4(f[0], f[1], f[2], 0.0) {} 37 38 bool operator == (const vec3& v) const { 39 return (std::abs(_d[0] - v[0]) + std::abs(_d[1] - v[1]) + std::abs(_d[2] - v[2])) < kThreshhold; 40 } 41 dotvec342 GLfloat dot(const vec3& v) const { 43 return _d[0]*v[0] + _d[1]*v[1] + _d[2]*v[2]; 44 } 45 crossvec346 vec3 cross(const vec3& v) const { 47 return vec3(_d[1] * v[2] - _d[2] * v[1], 48 _d[2] * v[0] - _d[0] * v[2], 49 _d[0] * v[1] - _d[1] * v[0]); 50 } 51 52 vec3 operator * (const GLfloat& f) const { 53 return vec3(_d[0] * f, _d[1] * f, _d[2] * f); 54 } 55 56 vec3 operator - (const vec3& v) const { 57 return vec3(_d[0] - v[0], _d[1] - v[1], _d[2] - v[2]); 58 } 59 60 vec3 operator + (const vec3& v) const { 61 return vec3(_d[0] + v[0], _d[1] + v[1], _d[2] + v[2]); 62 } 63 lengthvec364 GLfloat length() const { 65 return std::sqrt(dot(*this)); 66 } 67 normvec368 vec3 norm() const { 69 return (*this) * (1.0 / length()); 70 } 71 copyvec372 void copy(GLfloat * v) { 73 v[0] = _d[0]; v[1] = _d[1]; v[2] = _d[2]; 74 } 75 }; 76 77 struct vertex3 : public vec4 { 78 vertex3vertex379 vertex3() {} vertex3vertex380 vertex3(const GLfloat& x, const GLfloat& y, const GLfloat& z) : vec4(x, y, z, 1.0) {} vertex3vertex381 vertex3(const GLfloat* f) : vec4(f[0], f[1], f[2], 1.0) {} 82 83 vec3 operator - (const vertex3& v) const { 84 return vec3(_d[0] - v[0], _d[1] - v[1], _d[2] - v[2]); 85 } 86 }; 87 88 struct vertex2 : public vec4 { 89 vertex2vertex290 vertex2() {} vertex2vertex291 vertex2(const vec4& v) : vec4(v) {} vertex2vertex292 vertex2(const GLfloat& x, const GLfloat& y) : vec4(x, y, 0.0, 1.0) {} vertex2vertex293 vertex2(const GLfloat* f) : vec4(f[0], f[1], 0.0, 1.0) {} 94 }; 95 96 struct mat4 { 97 98 GLfloat _d[4][4]; 99 mat4mat4100 mat4(GLenum em) { 101 glGetFloatv(em, &(_d[0][0]) ); 102 } 103 104 vec4 operator *(const vec4& v) const { 105 return vec4(_d[0][0]*v[0] + _d[0][1]*v[1] + _d[0][1]*v[2] + _d[0][1]*v[3], 106 _d[1][0]*v[0] + _d[1][1]*v[1] + _d[1][1]*v[2] + _d[1][1]*v[3], 107 _d[2][0]*v[0] + _d[2][1]*v[1] + _d[2][1]*v[2] + _d[2][1]*v[3], 108 _d[3][0]*v[0] + _d[3][1]*v[1] + _d[3][1]*v[2] + _d[3][1]*v[3] ); 109 } 110 glSetmat4111 void glSet(GLenum em) { 112 GLenum old; 113 glGetIntegerv(GL_MATRIX_MODE, (GLint*)&old); 114 glPushAttrib(GL_MATRIX_MODE); 115 glMatrixMode(em); 116 glLoadMatrixf(&(_d[0][0])); 117 glMatrixMode(old); 118 } 119 }; 120 121 #endif 122