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_type_h__GUARD
#define FS_HEADER__fs_math_type_h__GUARD

#include "fs_config.h"

#include <utility> // std::pair

namespace fs { namespace math {

struct color3
{
    uint8_t r, g, b;
};

struct color4
{
    uint8_t r, g, b, a;
};

template <typename T>
struct vec2
{
    T x, y;

    vec2 & operator += (const vec2 &v) FS_NOEXCEPT;
    vec2 & operator += (T t) FS_NOEXCEPT;
    vec2 & operator -= (const vec2 &v) FS_NOEXCEPT;
    vec2 & operator -= (T t) FS_NOEXCEPT;
    vec2 & operator *= (const vec2 &v) FS_NOEXCEPT;
    vec2 & operator *= (T t) FS_NOEXCEPT;
    vec2 & operator /= (const vec2 &v) FS_NOEXCEPT;
    vec2 & operator /= (T t) FS_NOEXCEPT;

    const T & operator [] (int i) const FS_NOEXCEPT;
    T & operator [] (int i) FS_NOEXCEPT;
};

using vec2_f = vec2<float>;

template <typename T>
struct vec3
{
    T x, y, z;

    vec3 & operator += (const vec3 &v) FS_NOEXCEPT;
    vec3 & operator += (T t) FS_NOEXCEPT;
    vec3 & operator -= (const vec3 &v) FS_NOEXCEPT;
    vec3 & operator -= (T t) FS_NOEXCEPT;
    vec3 & operator *= (const vec3 &v) FS_NOEXCEPT;
    vec3 & operator *= (T t) FS_NOEXCEPT;
    vec3 & operator /= (const vec3 &v) FS_NOEXCEPT;
    vec3 & operator /= (T t) FS_NOEXCEPT;

    const T & operator [] (int i) const FS_NOEXCEPT;
    T & operator [] (int i) FS_NOEXCEPT;
};

using vec3_f = vec3<float>;

template <typename T>
struct vec4
{
    T x, y, z, w;

    vec4 & operator += (const vec4 &v) FS_NOEXCEPT;
    vec4 & operator += (T t) FS_NOEXCEPT;
    vec4 & operator -= (const vec4 &v) FS_NOEXCEPT;
    vec4 & operator -= (T t) FS_NOEXCEPT;
    vec4 & operator *= (const vec4 &v) FS_NOEXCEPT;
    vec4 & operator *= (T t) FS_NOEXCEPT;
    vec4 & operator /= (const vec4 &v) FS_NOEXCEPT;
    vec4 & operator /= (T t) FS_NOEXCEPT;

    const T & operator [] (int i) const FS_NOEXCEPT;
    T & operator [] (int i) FS_NOEXCEPT;
};

using vec4_f = vec4<float>;

template <typename T>
struct mat4
{
    vec4<T> cx, cy, cz, cw; // columns

    const T & operator [] (int i) const FS_NOEXCEPT;
    T & operator [] (int i) FS_NOEXCEPT;
};

using mat4_f = mat4<float>;

}} // namespace fs::math

#endif // FS_HEADER__fs_math_type_h__GUARD