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
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);
|
|
|