A 3d fps game made in OpenGL
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.
 
 
 
 
Symmetry/src/linmath.h

136 lines
4.1 KiB

#ifndef LINMATH_H
#define LINMATH_H
/*
Most code here is from Kazmath library(https://github.com/Kazade/kazmath) and
Linmath tutorials at http://www.euclideanspace.com/ with some minor changes and additions
of my own to make the code consistent. I only copied the necessary parts in the hope that
i'll make my own additions like SIMD etc later on.
*/
/* conversions */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#define EPSILON 0.0001
#define TO_RADIANS(degrees) ((degrees * M_PI) / 180.0)
#define TO_DEGREES(radians) ((radians * 180.0) / M_PI)
typedef struct vec2_t
{
float x;
float y;
} vec2;
typedef struct vec3_t
{
float x;
float y;
float z;
} vec3;
typedef struct vec4_t
{
float x;
float y;
float z;
float w;
} vec4;
typedef struct mat4_t
{
float mat[16];
} mat4;
typedef struct quat_t
{
float x;
float y;
float z;
float w;
} quat;
/* constants */
extern const vec3 UNIT_X;
extern const vec3 UNIT_Y;
extern const vec3 UNIT_Z;
extern const vec3 UNIT_X_NEG;
extern const vec3 UNIT_Y_NEG;
extern const vec3 UNIT_Z_NEG;
/* vec2 */
void vec2_fill(vec2* res, float x, float y);
void vec2_add(vec2* res, vec2* v1, vec2* v2);
void vec2_sub(vec2* res, vec2* v1, vec2* v2);
void vec2_assign(vec2* res, const vec2* val);
void vec2_mul(vec2* res, vec2* v1, vec2* v2);
float vec2_len(vec2* val);void vec2_norm(vec2* res, vec2* val);
/* vec3 */
void vec3_fill(vec3* res, float x, float y, float z);
void vec3_add(vec3* res, const vec3* v1, const vec3* v3);
void vec3_sub(vec3* res, const vec3* v1, const vec3* v3);
void vec3_assign(vec3* res, const vec3* val);
void vec3_cross(vec3* res, const vec3* v1, const vec3* v2);
void vec3_norm(vec3* res, vec3* val);
void vec3_mul(vec3* res, vec3* v1, vec3* v3);
void vec3_mul_mat4(vec3* res, vec3* val, mat4* mat);
void vec3_scale(vec3* res, const vec3* val, float s);
void vec3_transform_norm(vec3* res, const vec3* val, const mat4* mat);
int vec3_equals(vec3* v1, vec3* v2);
float vec3_len(vec3* val);
float vec3_dot(vec3* v1, vec3* v2);
/* vec4 */
int vec4_equals(vec4* v1, vec4* v2);
void vec4_fill(vec4* res, float x, float y, float z, float w);
void vec4_fill_vec3(vec4* res, const vec3* v, float w);
void vec4_transform_norm(vec4* res, const vec4* val, const mat4* mat);
void vec4_scale(vec4* res, const vec4* val, float s);
void vec4_mul_mat4(vec4* res, vec4* val, mat4* mat);
void vec4_mul(vec4* res, vec4* v1, vec4* v4);
void vec4_norm(vec4* res, vec4* val);
float vec4_len(vec4* val);
void vec4_assign(vec4* res, const vec4* val);
void vec4_sub(vec4* res, vec4* v1, vec4* v4);
void vec4_add(vec4* res, vec4* v1, vec4* v4);
/* mat4 */
void mat4_assign(mat4* res, const mat4* m);
void mat4_rot_z(mat4* res, float angle);
void mat4_rot_y(mat4* res, float angle);
void mat4_rot_x(mat4* res, const float angle);
void mat4_from_quat(mat4* res, const quat* q);
void mat4_scale(mat4* res, float x, float y, float z);
void mat4_ortho(mat4* res,
float left, float right,
float bottom, float top,
float nearz, float farz);
void mat4_perspective(mat4* res, float fov, float aspect, float nearz, float farz);
void mat4_lookat(mat4* res, const vec3* eye, const vec3* center, const vec3* up_vec);
void mat4_translate(mat4* res, float x, float y, float z);
void mat4_mul(mat4* res, const mat4* mat1, const mat4* mat2);
void mat4_identity(mat4* res);
void mat4_inverse(mat4* res, mat4* mat);
/* quat */
float quat_get_roll(const quat* q);
float quat_get_yaw(const quat* q);
float quat_get_pitch(const quat* q);
void quat_get_right(vec3* res, const quat* q);
void quat_get_up(vec3* res, const quat* q);
void quat_get_forward_lh(vec3* res, const quat* q);
void quat_get_forward_rh(vec3* res, const quat* q);
void quat_axis_angle(quat* res, const vec3* v, float angle);
void quat_norm(quat* res, const quat* val);
float quat_len(const quat* q);
float quat_len_sq(const quat* q);
void quat_mul(quat* res, const quat* q1, const quat* q2);
void quat_mul_vec3(vec3* res, const quat* q, const vec3* v);
void quat_assign(quat* res, const quat* val);
void quat_identity(quat* res);
void quat_fill(quat* res, float x, float y, float z, float w);
#endif