//
// Lol Engine
//
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
//   This program is free software; you can redistribute it and/or
//   modify it under the terms of the Do What The Fuck You Want To
//   Public License, Version 2, as published by Sam Hocevar. See
//   http://www.wtfpl.net/ for more details.
//

#if defined HAVE_CONFIG_H
#   include "config.h"
#endif

#include "core.h"

namespace lol {

#define LOL_VEC_2_CONST(type, name, a, b) \
    template<> \
    Vec2<type> const Vec2<type>::name = Vec2<type>((type)a, (type)b);

#define LOL_VEC_3_CONST(type, name, a, b, c) \
    template<> \
    Vec3<type> const Vec3<type>::name = Vec3<type>((type)a, (type)b, (type)c);

#define LOL_VEC_4_CONST(type, name, a, b, c, d) \
    template<> \
    Vec4<type> const Vec4<type>::name = Vec4<type>((type)a, (type)b, (type)c, (type)d);

#define LOL_MAT_CONST(type, name, a) \
    template<> \
    Mat2<type> const Mat2<type>::name = Mat2<type>((type)a); \
    \
    template<> \
    Mat3<type> const Mat3<type>::name = Mat3<type>((type)a); \
    \
    template<> \
    Mat4<type> const Mat4<type>::name = Mat4<type>((type)a);

#define LOL_ALL_CONST_INNER(type) \
    LOL_VEC_2_CONST(type, zero,     0, 0) \
    LOL_VEC_2_CONST(type, axis_x,   1, 0) \
    LOL_VEC_2_CONST(type, axis_y,   0, 1) \
    \
    LOL_VEC_3_CONST(type, zero,     0, 0, 0) \
    LOL_VEC_3_CONST(type, axis_x,   1, 0, 0) \
    LOL_VEC_3_CONST(type, axis_y,   0, 1, 0) \
    LOL_VEC_3_CONST(type, axis_z,   0, 0, 1) \
    \
    LOL_VEC_4_CONST(type, zero,     0, 0, 0, 0) \
    LOL_VEC_4_CONST(type, axis_x,   1, 0, 0, 0) \
    LOL_VEC_4_CONST(type, axis_y,   0, 1, 0, 0) \
    LOL_VEC_4_CONST(type, axis_z,   0, 0, 1, 0) \
    LOL_VEC_4_CONST(type, axis_w,   0, 0, 0, 1) \
    \
    LOL_MAT_CONST(type, identity, 1)

LOL_ALL_CONST_INNER(half)
LOL_ALL_CONST_INNER(float)
LOL_ALL_CONST_INNER(double)
LOL_ALL_CONST_INNER(ldouble)
LOL_ALL_CONST_INNER(real)

LOL_ALL_CONST_INNER(int8_t)
LOL_ALL_CONST_INNER(uint8_t)
LOL_ALL_CONST_INNER(int16_t)
LOL_ALL_CONST_INNER(uint16_t)
LOL_ALL_CONST_INNER(int32_t)
LOL_ALL_CONST_INNER(uint32_t)
LOL_ALL_CONST_INNER(int64_t)
LOL_ALL_CONST_INNER(uint64_t)

}; /* namespace lol */