1. 4FIPS
  2. PHOTOS
  3. VIDEOS
  4. APPS
  5. CODE
  6. FORUMS
  7. ABOUT
/*
(c) 2004-14 Filip Stoklas, aka FipS, www.4FipS.com
THIS CODE IS FREE - LICENSED UNDER THE MIT LICENSE
*/

#ifndef FS_HEADER__fs_math_func_h__GUARD
#define FS_HEADER__fs_math_func_h__GUARD

#include "fs_math_type.h"

namespace fs { namespace math {

float sin(float x) FS_NOEXCEPT;
float cos(float x) FS_NOEXCEPT;
std::pair<float, float> sin_cos(float x) FS_NOEXCEPT;
float sqrt(float x) FS_NOEXCEPT;
template<typename T> T inv(T x) FS_NOEXCEPT;

// --- color3 ---

color3 color3_make(uint8_t r, uint8_t g, uint8_t b) FS_NOEXCEPT;

// --- color4 ---

color4 color4_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a) FS_NOEXCEPT;

// --- vec2 ---

template <typename T> vec2<T> vec2_make(T x, T y) FS_NOEXCEPT;

template <typename T> bool operator == (const vec2<T> &v1, const vec2<T> &v2) FS_NOEXCEPT;
template <typename T> bool operator != (const vec2<T> &v1, const vec2<T> &v2) FS_NOEXCEPT;

template <typename T> vec2<T> operator - (const vec2<T> &v) FS_NOEXCEPT;

template <typename T> vec2<T> operator + (const vec2<T> &v1, const vec2<T> &v2) FS_NOEXCEPT;
template <typename T> vec2<T> operator + (const vec2<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec2<T> operator + (T t, const vec2<T> &v) FS_NOEXCEPT;
template <typename T> vec2<T> operator - (const vec2<T> &v1, const vec2<T> &v2) FS_NOEXCEPT;
template <typename T> vec2<T> operator - (const vec2<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec2<T> operator - (T t, const vec2<T> &v) FS_NOEXCEPT;
template <typename T> vec2<T> operator * (const vec2<T> &v1, const vec2<T> &v2) FS_NOEXCEPT;
template <typename T> vec2<T> operator * (const vec2<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec2<T> operator * (T t, const vec2<T> &v) FS_NOEXCEPT;
template <typename T> vec2<T> operator / (const vec2<T> &v1, const vec2<T> &v2) FS_NOEXCEPT;
template <typename T> vec2<T> operator / (const vec2<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec2<T> operator / (T t, const vec2<T> &v) FS_NOEXCEPT;

// --- vec3 ---

template <typename T> vec3<T> vec3_make(T x, T y, T z) FS_NOEXCEPT;

template <typename T> bool operator == (const vec3<T> &v1, const vec3<T> &v2) FS_NOEXCEPT;
template <typename T> bool operator != (const vec3<T> &v1, const vec3<T> &v2) FS_NOEXCEPT;

template <typename T> vec3<T> operator - (const vec3<T> &v) FS_NOEXCEPT;

template <typename T> vec3<T> operator + (const vec3<T> &v1, const vec3<T> &v2) FS_NOEXCEPT;
template <typename T> vec3<T> operator + (const vec3<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec3<T> operator + (T t, const vec3<T> &v) FS_NOEXCEPT;
template <typename T> vec3<T> operator - (const vec3<T> &v1, const vec3<T> &v2) FS_NOEXCEPT;
template <typename T> vec3<T> operator - (const vec3<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec3<T> operator - (T t, const vec3<T> &v) FS_NOEXCEPT;
template <typename T> vec3<T> operator * (const vec3<T> &v1, const vec3<T> &v2) FS_NOEXCEPT;
template <typename T> vec3<T> operator * (const vec3<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec3<T> operator * (T t, const vec3<T> &v) FS_NOEXCEPT;
template <typename T> vec3<T> operator / (const vec3<T> &v1, const vec3<T> &v2) FS_NOEXCEPT;
template <typename T> vec3<T> operator / (const vec3<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec3<T> operator / (T t, const vec3<T> &v) FS_NOEXCEPT;

// --- vec4 ---

template <typename T> vec4<T> vec4_make(T x, T y, T z, T w) FS_NOEXCEPT;

template <typename T> bool operator == (const vec4<T> &v1, const vec4<T> &v2) FS_NOEXCEPT;
template <typename T> bool operator != (const vec4<T> &v1, const vec4<T> &v2) FS_NOEXCEPT;

template <typename T> vec4<T> operator - (const vec4<T> &v) FS_NOEXCEPT;

template <typename T> vec4<T> operator + (const vec4<T> &v1, const vec4<T> &v2) FS_NOEXCEPT;
template <typename T> vec4<T> operator + (const vec4<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec4<T> operator + (T t, const vec4<T> &v) FS_NOEXCEPT;
template <typename T> vec4<T> operator - (const vec4<T> &v1, const vec4<T> &v2) FS_NOEXCEPT;
template <typename T> vec4<T> operator - (const vec4<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec4<T> operator - (T t, const vec4<T> &v) FS_NOEXCEPT;
template <typename T> vec4<T> operator * (const vec4<T> &v1, const vec4<T> &v2) FS_NOEXCEPT;
template <typename T> vec4<T> operator * (const vec4<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec4<T> operator * (T t, const vec4<T> &v) FS_NOEXCEPT;
template <typename T> vec4<T> operator / (const vec4<T> &v1, const vec4<T> &v2) FS_NOEXCEPT;
template <typename T> vec4<T> operator / (const vec4<T> &v, T t) FS_NOEXCEPT;
template <typename T> vec4<T> operator / (T t, const vec4<T> &v) FS_NOEXCEPT;

// --- mat4 ---

template <typename T> mat4<T> mat4_make(
 T e11, T e12, T e13, T e14,
 T e21, T e22, T e23, T e24,
 T e31, T e32, T e33, T e34,
 T e41, T e42, T e43, T e44
) FS_NOEXCEPT;

template <typename T> mat4<T> mat4_make(
 const vec4<T> &cx,
 const vec4<T> &cy,
 const vec4<T> &cz,
 const vec4<T> &cw
) FS_NOEXCEPT;

template <typename T> mat4<T> mat4_make(T e) FS_NOEXCEPT;

template <typename T> bool operator == (const mat4<T> &m1, const mat4<T> &m2) FS_NOEXCEPT;
template <typename T> bool operator != (const mat4<T> &m1, const mat4<T> &m2) FS_NOEXCEPT;

template <typename T> mat4<T> operator * (const mat4<T> &m1, const mat4<T> &m2) FS_NOEXCEPT;
template <typename T> vec4<T> operator * (const mat4<T> &m, const vec4<T> &v) FS_NOEXCEPT;

template <typename T> mat4<T> mat4_make_xyz(T x, T y, T z) FS_NOEXCEPT;
template <typename T> mat4<T> mat4_make_scale(T sx, T sy, T sz) FS_NOEXCEPT;
template <typename T> mat4<T> mat4_make_rot_x(T rad) FS_NOEXCEPT;
template <typename T> mat4<T> mat4_make_rot_y(T rad) FS_NOEXCEPT;
template <typename T> mat4<T> mat4_make_rot_z(T rad) FS_NOEXCEPT;

// these functions follow the OpenGL conventions, see the OpenGL spec for more info:
template <typename T> mat4<T> mat4_make_ortho(T left, T right, T bottom, T top, T znear, T zfar) FS_NOEXCEPT;
template <typename T> mat4<T> mat4_make_frustum(T left, T right, T bottom, T top, T znear, T zfar) FS_NOEXCEPT;
template <typename T> mat4<T> mat4_make_perspective(T fovy_deg, T aspect, T znear, T zfar) FS_NOEXCEPT;

}} // namespace fs::math

#endif // FS_HEADER__fs_math_func_h__GUARD