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