You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

164 lines
5.0 KiB

/******************************************************************************\
| OpenGL 4 Example Code. |
| Accompanies written series "Anton's OpenGL 4 Tutorials" |
| Email: anton at antongerdelan dot net |
| First version 27 Jan 2014 |
| Copyright Dr Anton Gerdelan, Trinity College Dublin, Ireland. |
| See individual libraries' separate legal notices |
|******************************************************************************|
| Commonly-used maths structures and functions |
| Simple-as-possible. No disgusting templates. |
| Structs vec3, mat4, versor. just hold arrays of floats called "v","m","q", |
| respectively. So, for example, to get values from a mat4 do: my_mat.m |
| A versor is the proper name for a unit quaternion. |
| This is C++ because it's sort-of convenient to be able to use maths operators|
\******************************************************************************/
#pragma once
// const used to convert degrees into radians
#define TWO_PI 2.0 * M_PI
#define ONE_DEG_IN_RAD (2.0 * M_PI) / 360.0 // 0.017444444
#define ONE_RAD_IN_DEG 57.2957795
struct vec2;
struct vec3;
struct vec4;
struct versor;
struct vec2 {
vec2 ();
vec2 (float x, float y);
float v[2];
};
struct vec3 {
vec3 ();
// create from 3 scalars
vec3 (float x, float y, float z);
// create from vec2 and a scalar
vec3 (const vec2& vv, float z);
// create from truncated vec4
vec3 (const vec4& vv);
// add vector to vector
vec3 operator+ (const vec3& rhs);
// add scalar to vector
vec3 operator+ (float rhs);
// because user's expect this too
vec3& operator+= (const vec3& rhs);
// subtract vector from vector
vec3 operator- (const vec3& rhs);
// add vector to vector
vec3 operator- (float rhs);
// because users expect this too
vec3& operator-= (const vec3& rhs);
// multiply with scalar
vec3 operator* (float rhs);
// because users expect this too
vec3& operator*= (float rhs);
// divide vector by scalar
vec3 operator/ (float rhs);
// because users expect this too
vec3& operator= (const vec3& rhs);
// internal data
float v[3];
};
struct vec4 {
vec4 ();
vec4 (float x, float y, float z, float w);
vec4 (const vec2& vv, float z, float w);
vec4 (const vec3& vv, float w);
float v[4];
};
struct vec2u {
unsigned v[2];
};
/* stored like this:
0 3 6
1 4 7
2 5 8 */
struct mat3 {
mat3 ();
// note! this is entering components in ROW-major order
mat3 (float a, float b, float c,
float d, float e, float f,
float g, float h, float i);
float m[9];
};
/* stored like this:
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15*/
struct mat4 {
mat4 ();
// note! this is entering components in ROW-major order
mat4 (float a, float b, float c, float d,
float e, float f, float g, float h,
float i, float j, float k, float l,
float mm, float n, float o, float p);
vec4 operator* (const vec4& rhs);
mat4 operator* (const mat4& rhs);
mat4& operator= (const mat4& rhs);
float m[16];
};
struct versor {
versor ();
versor operator/ (float rhs);
versor operator* (float rhs);
versor operator* (const versor& rhs);
versor operator+ (const versor& rhs);
float q[4];
};
void print (const vec2& v);
void print (const vec3& v);
void print (const vec4& v);
void print (const mat3& m);
void print (const mat4& m);
// floating point functions
int signum(const float& f);
float intbound(const float& s, const float& ds);
float mod(const float& value, const float& modulus);
// vector functions
float length (const vec3& v);
float length2 (const vec3& v);
vec3 normalise (const vec3& v);
float dot (const vec3& a, const vec3& b);
vec3 cross (const vec3& a, const vec3& b);
float get_squared_dist (vec3 from, vec3 to);
float direction_to_heading (vec3 d);
vec3 heading_to_direction (float degrees);
// matrix functions
mat3 zero_mat3 ();
mat3 identity_mat3 ();
mat4 zero_mat4 ();
mat4 identity_mat4 ();
float determinant (const mat4& mm);
mat4 inverse (const mat4& mm);
mat4 transpose (const mat4& mm);
// affine functions
mat4 translate (const mat4& m, const vec3& v);
mat4 rotate_x_deg (const mat4& m, float deg);
mat4 rotate_y_deg (const mat4& m, float deg);
mat4 rotate_z_deg (const mat4& m, float deg);
mat4 scale (const mat4& m, const vec3& v);
// camera functions
mat4 look_at (const vec3& cam_pos, vec3 targ_pos, const vec3& up);
mat4 perspective (float fovy, float aspect, float near, float far);
// quaternion functions
versor quat_from_axis_rad (float radians, float x, float y, float z);
versor quat_from_axis_deg (float degrees, float x, float y, float z);
mat4 quat_to_mat4 (const versor& q);
float dot (const versor& q, const versor& r);
versor slerp (const versor& q, const versor& r);
// stupid overloading wouldn't let me use const
versor normalise (versor& q);
void print (const versor& q);
versor slerp (versor& q, versor& r, float t);