support for enable_if and other template metaprogramming techniques), for Clang (related to static const template class member initialisation) and for GCC (related to forward declaration of non-int enum classes).undefined
@@ -100,7 +100,7 @@ liblolcore_sources = \ | |||||
mesh/mesh.cpp mesh/mesh.h \ | mesh/mesh.cpp mesh/mesh.h \ | ||||
mesh/primitive.cpp mesh/primitive.h \ | mesh/primitive.cpp mesh/primitive.h \ | ||||
\ | \ | ||||
sys/init.cpp sys/timer.cpp sys/file.cpp \ | |||||
sys/init.cpp sys/timer.cpp sys/file.cpp sys/hacks.cpp \ | |||||
sys/thread.cpp sys/threadbase.h \ | sys/thread.cpp sys/threadbase.h \ | ||||
\ | \ | ||||
image/image.cpp image/image-private.h image/kernel.cpp image/pixel.cpp \ | image/image.cpp image/image-private.h image/kernel.cpp image/pixel.cpp \ | ||||
@@ -1,12 +1,14 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// Lol Engine | |||||
// | // | ||||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||||
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
// 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. | |||||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
// © 2013—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
@@ -66,7 +68,7 @@ void DrawInner(TREE *tree, array<TBB, vec4> &boxes, | |||||
} | } | ||||
//-- | //-- | ||||
template <typename TE> | |||||
template <typename TE, typename TV = void> | |||||
void Draw(Quadtree<TE>* tree, vec4 color) | void Draw(Quadtree<TE>* tree, vec4 color) | ||||
{ | { | ||||
array<box2, vec4> boxes; | array<box2, vec4> boxes; | ||||
@@ -97,7 +99,7 @@ void Draw(Quadtree<TE>* tree, vec4 color) | |||||
} | } | ||||
} | } | ||||
//-- | //-- | ||||
template <typename TE> | |||||
template <typename TE, typename TV = void> | |||||
void Draw(Octree<TE>* tree, vec4 color) | void Draw(Octree<TE>* tree, vec4 color) | ||||
{ | { | ||||
array<box3, vec4> boxes; | array<box3, vec4> boxes; | ||||
@@ -1,12 +1,14 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// Lol Engine | |||||
// | // | ||||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||||
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
// 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. | |||||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
// © 2013—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
@@ -27,7 +29,7 @@ template <typename TE> class PortalSet; | |||||
//-- | //-- | ||||
namespace Debug { | namespace Debug { | ||||
template <typename TE> | |||||
template <typename TE, typename TV = void> | |||||
void Draw(PortalDoor<TE>& port, vec4 color) | void Draw(PortalDoor<TE>& port, vec4 color) | ||||
{ | { | ||||
vec3 points[4]; port.GetPoints(points); | vec3 points[4]; port.GetPoints(points); | ||||
@@ -18,12 +18,6 @@ | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
enum class SortAlgorithm : uint8_t | |||||
{ | |||||
QuickSwap, | |||||
Bubble, | |||||
}; | |||||
template<typename T, typename ARRAY> | template<typename T, typename ARRAY> | ||||
void array_base<T, ARRAY>::Shuffle() | void array_base<T, ARRAY>::Shuffle() | ||||
{ | { | ||||
@@ -33,6 +33,16 @@ namespace lol | |||||
static ptrdiff_t const INDEX_NONE = -1; | static ptrdiff_t const INDEX_NONE = -1; | ||||
/* | |||||
* Sorting algorithm list | |||||
*/ | |||||
enum class SortAlgorithm : uint8_t | |||||
{ | |||||
QuickSwap, | |||||
Bubble, | |||||
}; | |||||
/* | /* | ||||
* The base array type. | * The base array type. | ||||
* | * | ||||
@@ -383,7 +393,7 @@ public: | |||||
} | } | ||||
void Shuffle(); | void Shuffle(); | ||||
void Sort(enum class SortAlgorithm : uint8_t); | |||||
void Sort(SortAlgorithm algorithm); | |||||
void SortQuickSwap(ptrdiff_t start, ptrdiff_t stop); | void SortQuickSwap(ptrdiff_t start, ptrdiff_t stop); | ||||
/* TODO: remove these legacy functions one day */ | /* TODO: remove these legacy functions one day */ | ||||
@@ -31,6 +31,20 @@ namespace lol | |||||
/* Avoid issues with NaCl headers */ | /* Avoid issues with NaCl headers */ | ||||
#undef log2 | #undef log2 | ||||
template<unsigned int N, typename T> | |||||
class bigint_digits | |||||
{ | |||||
protected: | |||||
T m_digits[N]; | |||||
}; | |||||
template<typename T> | |||||
class bigint_digits<0, T> | |||||
{ | |||||
protected: | |||||
static T const m_digits[1]; | |||||
}; | |||||
/* | /* | ||||
* A bigint stores its digits in an array of integers. The MSB of the | * A bigint stores its digits in an array of integers. The MSB of the | ||||
* integers are unused. The highest used bit is the sign bit. | * integers are unused. The highest used bit is the sign bit. | ||||
@@ -39,7 +53,7 @@ namespace lol | |||||
*/ | */ | ||||
template<unsigned int N = 16, typename T = uint32_t> | template<unsigned int N = 16, typename T = uint32_t> | ||||
class bigint | |||||
class bigint : public bigint_digits<N, T> | |||||
{ | { | ||||
static int const bits_per_digit = sizeof(T) * 8 - 1; | static int const bits_per_digit = sizeof(T) * 8 - 1; | ||||
static T const digit_mask = ~((T)1 << bits_per_digit); | static T const digit_mask = ~((T)1 << bits_per_digit); | ||||
@@ -190,9 +204,9 @@ public: | |||||
* and pad missing digits if one of the two operands is shorter. | * and pad missing digits if one of the two operands is shorter. | ||||
*/ | */ | ||||
template<unsigned int M> | template<unsigned int M> | ||||
bigint<(N > M) ? N : M, T> operator +(bigint<M,T> const &x) const | |||||
bigint<((N > M) ? N : M), T> operator +(bigint<M,T> const &x) const | |||||
{ | { | ||||
bigint<(N > M) ? N : M, T> ret; | |||||
bigint<((N > M) ? N : M), T> ret; | |||||
T padding = is_negative() ? digit_mask : (T)0; | T padding = is_negative() ? digit_mask : (T)0; | ||||
T x_padding = x.is_negative() ? digit_mask : (T)0; | T x_padding = x.is_negative() ? digit_mask : (T)0; | ||||
T carry(0); | T carry(0); | ||||
@@ -213,7 +227,7 @@ public: | |||||
* FIXME: this could be factored with operator+(). | * FIXME: this could be factored with operator+(). | ||||
*/ | */ | ||||
template<unsigned int M> | template<unsigned int M> | ||||
bigint<(N > M) ? N : M, T> operator -(bigint<M,T> const &x) const | |||||
bigint<((N > M) ? N : M), T> operator -(bigint<M,T> const &x) const | |||||
{ | { | ||||
bigint<(N > M) ? N : M, T> ret; | bigint<(N > M) ? N : M, T> ret; | ||||
T padding = is_negative() ? digit_mask : (T)0; | T padding = is_negative() ? digit_mask : (T)0; | ||||
@@ -359,7 +373,7 @@ private: | |||||
} | } | ||||
template<unsigned int M> | template<unsigned int M> | ||||
typename std::enable_if<(N == M && N >= 64), bigint<N + M, T>> | |||||
typename std::enable_if<(N == M) && (N >= 64), bigint<N + M, T>> | |||||
::type inline multiply(bigint<M,T> const &b) const | ::type inline multiply(bigint<M,T> const &b) const | ||||
{ | { | ||||
bigint<2 * N, T> ret, tmp(0); | bigint<2 * N, T> ret, tmp(0); | ||||
@@ -379,8 +393,8 @@ private: | |||||
return ret + tmp; | return ret + tmp; | ||||
} | } | ||||
template<unsigned int M> | |||||
typename std::enable_if<(N == M && N == 1), bigint<N + M, T>> | |||||
template<unsigned int M, int = 0> | |||||
typename std::enable_if<(N == M) && (N == 1), bigint<N + M, T>> | |||||
::type inline multiply(bigint<M,T> const &b) const | ::type inline multiply(bigint<M,T> const &b) const | ||||
{ | { | ||||
bigint<2, T> ret; | bigint<2, T> ret; | ||||
@@ -404,8 +418,6 @@ private: | |||||
ret |= m_digits[digit_index + 1] << (bits_per_digit - bit_index); | ret |= m_digits[digit_index + 1] << (bits_per_digit - bit_index); | ||||
return ret; | return ret; | ||||
} | } | ||||
T m_digits[N]; | |||||
}; | }; | ||||
/* | /* | ||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// Lol Engine | |||||
// | // | ||||
// Copyright: (c) 2010-2014 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. | |||||
// Copyright © 2010-2015 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
@@ -531,7 +533,7 @@ void lu_decomposition(mat_t<T, N, N> const &m, mat_t<T, N, N> & L, mat_t<T, N, N | |||||
} | } | ||||
else /* if (i >= j) */ | else /* if (i >= j) */ | ||||
{ | { | ||||
L[i][j] = i == j ? 1 : 0; | |||||
L[i][j] = i == j ? T(1) : T(0); | |||||
U[i][j] = (m[i][j] - sum) / L[j][j]; | U[i][j] = (m[i][j] - sum) / L[j][j]; | ||||
} | } | ||||
} | } | ||||
@@ -697,6 +699,17 @@ outer(mat_t<T, COLS1, ROWS1> const &a, mat_t<T, COLS2, ROWS2> const &b) | |||||
return ret; | return ret; | ||||
} | } | ||||
/* | |||||
* Constants | |||||
*/ | |||||
template<typename T> | |||||
mat_t<T,2,2> const mat_t<T,2,2>::identity = mat_t<T,2,2>((T)1); | |||||
template<typename T> | |||||
mat_t<T,3,3> const mat_t<T,3,3>::identity = mat_t<T,3,3>((T)1); | |||||
template<typename T> | |||||
mat_t<T,4,4> const mat_t<T,4,4>::identity = mat_t<T,4,4>((T)1); | |||||
#if !LOL_FEATURE_CXX11_CONSTEXPR | #if !LOL_FEATURE_CXX11_CONSTEXPR | ||||
#undef constexpr | #undef constexpr | ||||
#endif | #endif | ||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// Lol Engine | |||||
// | // | ||||
// Copyright: (c) 2010-2014 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. | |||||
// Copyright © 2010-2015 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
@@ -123,10 +125,17 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||||
/* Explicit constructor that takes exactly N arguments thanks to SFINAE. */ | /* Explicit constructor that takes exactly N arguments thanks to SFINAE. */ | ||||
template<typename... ARGS> | template<typename... ARGS> | ||||
explicit inline vec_t(typename std::enable_if<sizeof...(ARGS) == N - 1, T> | |||||
::type const &x, ARGS... args) | |||||
explicit inline vec_t(typename std::enable_if<(sizeof...(ARGS) == N - 1) && (N > 1), T> | |||||
::type const &X, ARGS... args) | |||||
{ | |||||
internal_init(m_data, X, args...); | |||||
} | |||||
/* Various explicit constructors */ | |||||
explicit inline vec_t(T const &X) | |||||
{ | { | ||||
internal_init(m_data, x, args...); | |||||
for (auto &value : m_data) | |||||
value = X; | |||||
} | } | ||||
/* Explicit constructor for type conversion */ | /* Explicit constructor for type conversion */ | ||||
@@ -134,7 +143,7 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||||
explicit inline vec_t(vec_t<U, N> const &v) | explicit inline vec_t(vec_t<U, N> const &v) | ||||
{ | { | ||||
for (int i = 0; i < N; ++i) | for (int i = 0; i < N; ++i) | ||||
m_data[i] = (T)v[i]; | |||||
m_data[i] = T(v[i]); | |||||
} | } | ||||
/* Factory for base axis vectors, e.g. [1,0,0,…,0] */ | /* Factory for base axis vectors, e.g. [1,0,0,…,0] */ | ||||
@@ -142,8 +151,8 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||||
{ | { | ||||
ASSERT(i >= 0); | ASSERT(i >= 0); | ||||
ASSERT(i < N); | ASSERT(i < N); | ||||
vec_t<T, N> ret((T)0); | |||||
ret[i] = (T)1; | |||||
vec_t<T, N> ret(T(0)); | |||||
ret[i] = T(1); | |||||
return ret; | return ret; | ||||
} | } | ||||
@@ -154,20 +163,15 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||||
auto l = list.begin(); | auto l = list.begin(); | ||||
for (int i = 0; i < count && l != list.end(); ++i, ++l) | for (int i = 0; i < count && l != list.end(); ++i, ++l) | ||||
m_data[i] = *l; | m_data[i] = *l; | ||||
for (int i = list.size(); i < count; ++i) | |||||
m_data[i] = (T)0; | |||||
} | |||||
/* Various explicit constructors */ | |||||
explicit inline vec_t(T X) | |||||
{ | |||||
for (int i = 0; i < N; ++i) | |||||
m_data[i] = X; | |||||
for (int i = (int)list.size(); i < count; ++i) | |||||
m_data[i] = T(0); | |||||
} | } | ||||
inline T& operator[](size_t n) { return m_data[n]; } | inline T& operator[](size_t n) { return m_data[n]; } | ||||
inline T const& operator[](size_t n) const { return m_data[n]; } | inline T const& operator[](size_t n) const { return m_data[n]; } | ||||
static const vec_t<T,N> zero; | |||||
private: | private: | ||||
template<typename... ARGS> | template<typename... ARGS> | ||||
static inline void internal_init(T *data, T const &x, ARGS... args) | static inline void internal_init(T *data, T const &x, ARGS... args) | ||||
@@ -228,7 +232,7 @@ struct vec_t<T,2> | |||||
/* Explicit constructor for type conversion */ | /* Explicit constructor for type conversion */ | ||||
template<typename U, int SWIZZLE> | template<typename U, int SWIZZLE> | ||||
explicit inline constexpr vec_t(vec_t<U, 2, SWIZZLE> const &v) | explicit inline constexpr vec_t(vec_t<U, 2, SWIZZLE> const &v) | ||||
: x(v[0]), y(v[1]) {} | |||||
: x(T(v[0])), y(T(v[1])) {} | |||||
/* Constructor for initializer_list. We need these ugly | /* Constructor for initializer_list. We need these ugly | ||||
* loops until C++ lets us initialize m_data directly. */ | * loops until C++ lets us initialize m_data directly. */ | ||||
@@ -237,8 +241,8 @@ struct vec_t<T,2> | |||||
auto l = list.begin(); | auto l = list.begin(); | ||||
for (int i = 0; i < count && l != list.end(); ++i, ++l) | for (int i = 0; i < count && l != list.end(); ++i, ++l) | ||||
m_data[i] = *l; | m_data[i] = *l; | ||||
for (int i = list.size(); i < count; ++i) | |||||
m_data[i] = (T)0; | |||||
for (int i = (int)list.size(); i < count; ++i) | |||||
m_data[i] = T(0); | |||||
} | } | ||||
/* Various explicit constructors */ | /* Various explicit constructors */ | ||||
@@ -252,7 +256,7 @@ struct vec_t<T,2> | |||||
{ | { | ||||
ASSERT(i >= 0); | ASSERT(i >= 0); | ||||
ASSERT(i < 2); | ASSERT(i < 2); | ||||
return vec_t<T,2>((T)(i == 0), (T)(i == 1)); | |||||
return vec_t<T,2>(T(i == 0), T(i == 1)); | |||||
} | } | ||||
LOL_COMMON_MEMBER_OPS(x) | LOL_COMMON_MEMBER_OPS(x) | ||||
@@ -343,7 +347,7 @@ struct vec_t<T,3> | |||||
/* Explicit constructor for type conversion */ | /* Explicit constructor for type conversion */ | ||||
template<typename U, int SWIZZLE> | template<typename U, int SWIZZLE> | ||||
explicit inline constexpr vec_t(vec_t<U, 3, SWIZZLE> const &v) | explicit inline constexpr vec_t(vec_t<U, 3, SWIZZLE> const &v) | ||||
: x(v[0]), y(v[1]), z(v[2]) {} | |||||
: x(T(v[0])), y(T(v[1])), z(T(v[2])) {} | |||||
/* Constructor for initializer_list. We need these ugly | /* Constructor for initializer_list. We need these ugly | ||||
* loops until C++ lets us initialize m_data directly. */ | * loops until C++ lets us initialize m_data directly. */ | ||||
@@ -352,8 +356,8 @@ struct vec_t<T,3> | |||||
auto l = list.begin(); | auto l = list.begin(); | ||||
for (int i = 0; i < count && l != list.end(); ++i, ++l) | for (int i = 0; i < count && l != list.end(); ++i, ++l) | ||||
m_data[i] = *l; | m_data[i] = *l; | ||||
for (int i = list.size(); i < count; ++i) | |||||
m_data[i] = (T)0; | |||||
for (int i = (int)list.size(); i < count; ++i) | |||||
m_data[i] = T(0); | |||||
} | } | ||||
/* Various explicit constructors */ | /* Various explicit constructors */ | ||||
@@ -371,7 +375,7 @@ struct vec_t<T,3> | |||||
{ | { | ||||
ASSERT(i >= 0); | ASSERT(i >= 0); | ||||
ASSERT(i < 3); | ASSERT(i < 3); | ||||
return vec_t<T,3>((T)(i == 0), (T)(i == 1), (T)(i == 2)); | |||||
return vec_t<T,3>(T(i == 0), T(i == 1), T(i == 2)); | |||||
} | } | ||||
LOL_COMMON_MEMBER_OPS(x) | LOL_COMMON_MEMBER_OPS(x) | ||||
@@ -402,8 +406,8 @@ struct vec_t<T,3> | |||||
friend inline type orthogonal(type const &a) | friend inline type orthogonal(type const &a) | ||||
{ | { | ||||
return lol::abs(a.x) > lol::abs(a.z) | return lol::abs(a.x) > lol::abs(a.z) | ||||
? type(-a.y, a.x, (T)0) | |||||
: type((T)0, -a.z, a.y); | |||||
? type(-a.y, a.x, T(0)) | |||||
: type(T(0), -a.z, a.y); | |||||
} | } | ||||
/* Return a vector that is orthonormal to “a” */ | /* Return a vector that is orthonormal to “a” */ | ||||
@@ -589,7 +593,7 @@ struct vec_t<T,4> | |||||
/* Explicit constructor for type conversion */ | /* Explicit constructor for type conversion */ | ||||
template<typename U, int SWIZZLE> | template<typename U, int SWIZZLE> | ||||
explicit inline constexpr vec_t(vec_t<U, 4, SWIZZLE> const &v) | explicit inline constexpr vec_t(vec_t<U, 4, SWIZZLE> const &v) | ||||
: x(v[0]), y(v[1]), z(v[2]), w(v[3]) {} | |||||
: x(T(v[0])), y(T(v[1])), z(T(v[2])), w(T(v[3])) {} | |||||
/* Constructor for initializer_list. We need these ugly | /* Constructor for initializer_list. We need these ugly | ||||
* loops until C++ lets us initialize m_data directly. */ | * loops until C++ lets us initialize m_data directly. */ | ||||
@@ -598,8 +602,8 @@ struct vec_t<T,4> | |||||
auto l = list.begin(); | auto l = list.begin(); | ||||
for (int i = 0; i < count && l != list.end(); ++i, ++l) | for (int i = 0; i < count && l != list.end(); ++i, ++l) | ||||
m_data[i] = *l; | m_data[i] = *l; | ||||
for (int i = list.size(); i < count; ++i) | |||||
m_data[i] = (T)0; | |||||
for (int i = (int)list.size(); i < count; ++i) | |||||
m_data[i] = T(0); | |||||
} | } | ||||
/* Various explicit constructors */ | /* Various explicit constructors */ | ||||
@@ -625,7 +629,7 @@ struct vec_t<T,4> | |||||
{ | { | ||||
ASSERT(i >= 0); | ASSERT(i >= 0); | ||||
ASSERT(i < 4); | ASSERT(i < 4); | ||||
return vec_t<T,4>((T)(i == 0), (T)(i == 1), (T)(i == 2), (T)(i == 3)); | |||||
return vec_t<T,4>(T(i == 0), T(i == 1), T(i == 2), T(i == 3)); | |||||
} | } | ||||
LOL_COMMON_MEMBER_OPS(x) | LOL_COMMON_MEMBER_OPS(x) | ||||
@@ -1142,7 +1146,7 @@ template<typename T, int N, int SWIZZLE> | |||||
static inline T length(vec_t<T,N,SWIZZLE> const &a) | static inline T length(vec_t<T,N,SWIZZLE> const &a) | ||||
{ | { | ||||
/* FIXME: this is not very nice */ | /* FIXME: this is not very nice */ | ||||
return (T)sqrt((double)sqlength(a)); | |||||
return T(sqrt((double)sqlength(a))); | |||||
} | } | ||||
template<typename T, int N, int SWIZZLE1, int SWIZZLE2> | template<typename T, int N, int SWIZZLE1, int SWIZZLE2> | ||||
@@ -1184,7 +1188,7 @@ static inline vec_t<T,N> saturate(vec_t<T,N,SWIZZLE> const &a) | |||||
template<typename T, int N, int SWIZZLE> | template<typename T, int N, int SWIZZLE> | ||||
static inline vec_t<T,N> normalize(vec_t<T,N,SWIZZLE> const &a) | static inline vec_t<T,N> normalize(vec_t<T,N,SWIZZLE> const &a) | ||||
{ | { | ||||
T norm = (T)length(a); | |||||
T norm = T(length(a)); | |||||
return norm ? a / norm : vec_t<T,N>(T(0)); | return norm ? a / norm : vec_t<T,N>(T(0)); | ||||
} | } | ||||
@@ -1272,6 +1276,40 @@ inline vec_const_iter<T,N,SWIZZLE> end(vec_t<T,N,SWIZZLE> const &a) | |||||
return vec_const_iter<T,N,SWIZZLE>(a, N); | return vec_const_iter<T,N,SWIZZLE>(a, N); | ||||
} | } | ||||
/* | |||||
* Constants | |||||
*/ | |||||
template<typename T, int N> | |||||
vec_t<T,N> const vec_t<T,N>::zero = vec_t<T,N>(T(0)); | |||||
template<typename T> | |||||
vec_t<T,2> const vec_t<T,2>::zero = vec_t<T,2>(T(0)); | |||||
template<typename T> | |||||
vec_t<T,3> const vec_t<T,3>::zero = vec_t<T,3>(T(0)); | |||||
template<typename T> | |||||
vec_t<T,4> const vec_t<T,4>::zero = vec_t<T,4>(T(0)); | |||||
template<typename T> | |||||
vec_t<T,2> const vec_t<T,2>::axis_x = vec_t<T,2>(T(1), T(0)); | |||||
template<typename T> | |||||
vec_t<T,2> const vec_t<T,2>::axis_y = vec_t<T,2>(T(0), T(1)); | |||||
template<typename T> | |||||
vec_t<T,3> const vec_t<T,3>::axis_x = vec_t<T,3>(T(1), T(0), T(0)); | |||||
template<typename T> | |||||
vec_t<T,3> const vec_t<T,3>::axis_y = vec_t<T,3>(T(0), T(1), T(0)); | |||||
template<typename T> | |||||
vec_t<T,3> const vec_t<T,3>::axis_z = vec_t<T,3>(T(0), T(0), T(1)); | |||||
template<typename T> | |||||
vec_t<T,4> const vec_t<T,4>::axis_x = vec_t<T,4>(T(1), T(0), T(0), T(0)); | |||||
template<typename T> | |||||
vec_t<T,4> const vec_t<T,4>::axis_y = vec_t<T,4>(T(0), T(1), T(0), T(0)); | |||||
template<typename T> | |||||
vec_t<T,4> const vec_t<T,4>::axis_z = vec_t<T,4>(T(0), T(0), T(1), T(0)); | |||||
template<typename T> | |||||
vec_t<T,4> const vec_t<T,4>::axis_w = vec_t<T,4>(T(0), T(0), T(0), T(1)); | |||||
#if !LOL_FEATURE_CXX11_CONSTEXPR | #if !LOL_FEATURE_CXX11_CONSTEXPR | ||||
#undef constexpr | #undef constexpr | ||||
#endif | #endif | ||||
@@ -212,6 +212,7 @@ | |||||
<ClCompile Include="scene.cpp" /> | <ClCompile Include="scene.cpp" /> | ||||
<ClCompile Include="sprite.cpp" /> | <ClCompile Include="sprite.cpp" /> | ||||
<ClCompile Include="sys\file.cpp" /> | <ClCompile Include="sys\file.cpp" /> | ||||
<ClCompile Include="sys\hacks.cpp" /> | |||||
<ClCompile Include="sys\init.cpp" /> | <ClCompile Include="sys\init.cpp" /> | ||||
<ClCompile Include="sys\thread.cpp" /> | <ClCompile Include="sys\thread.cpp" /> | ||||
<ClCompile Include="sys\timer.cpp" /> | <ClCompile Include="sys\timer.cpp" /> | ||||
@@ -297,6 +297,9 @@ | |||||
<ClCompile Include="easymesh\csgbsp.cpp"> | <ClCompile Include="easymesh\csgbsp.cpp"> | ||||
<Filter>easymesh</Filter> | <Filter>easymesh</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="sys\hacks.cpp"> | |||||
<Filter>sys</Filter> | |||||
</ClCompile> | |||||
<ClCompile Include="sys\init.cpp"> | <ClCompile Include="sys\init.cpp"> | ||||
<Filter>sys</Filter> | <Filter>sys</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
@@ -1,75 +1,21 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// 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. | |||||
// Copyright © 2010-2015 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
namespace lol { | namespace lol { | ||||
#define LOL_VEC_2_CONST(T, name, a, b) \ | |||||
template<> \ | |||||
vec_t<T,2> const vec_t<T,2>::name = vec_t<T,2>((T)a, (T)b); | |||||
#define LOL_VEC_3_CONST(T, name, a, b, c) \ | |||||
template<> \ | |||||
vec_t<T,3> const vec_t<T,3>::name = vec_t<T,3>((T)a, (T)b, (T)c); | |||||
#define LOL_VEC_4_CONST(T, name, a, b, c, d) \ | |||||
template<> \ | |||||
vec_t<T,4> const vec_t<T,4>::name = vec_t<T,4>((T)a, (T)b, (T)c, (T)d); | |||||
#define LOL_MAT_CONST(T, name, a) \ | |||||
template<> \ | |||||
mat_t<T,2,2> const mat_t<T,2,2>::name = mat_t<T,2,2>((T)a); \ | |||||
\ | |||||
template<> \ | |||||
mat_t<T,3,3> const mat_t<T,3,3>::name = mat_t<T,3,3>((T)a); \ | |||||
\ | |||||
template<> \ | |||||
mat_t<T,4,4> const mat_t<T,4,4>::name = mat_t<T,4,4>((T)a); | |||||
#define LOL_ALL_CONST_INNER(T) \ | |||||
LOL_VEC_2_CONST(T, zero, 0, 0) \ | |||||
LOL_VEC_2_CONST(T, axis_x, 1, 0) \ | |||||
LOL_VEC_2_CONST(T, axis_y, 0, 1) \ | |||||
\ | |||||
LOL_VEC_3_CONST(T, zero, 0, 0, 0) \ | |||||
LOL_VEC_3_CONST(T, axis_x, 1, 0, 0) \ | |||||
LOL_VEC_3_CONST(T, axis_y, 0, 1, 0) \ | |||||
LOL_VEC_3_CONST(T, axis_z, 0, 0, 1) \ | |||||
\ | |||||
LOL_VEC_4_CONST(T, zero, 0, 0, 0, 0) \ | |||||
LOL_VEC_4_CONST(T, axis_x, 1, 0, 0, 0) \ | |||||
LOL_VEC_4_CONST(T, axis_y, 0, 1, 0, 0) \ | |||||
LOL_VEC_4_CONST(T, axis_z, 0, 0, 1, 0) \ | |||||
LOL_VEC_4_CONST(T, axis_w, 0, 0, 0, 1) \ | |||||
\ | |||||
LOL_MAT_CONST(T, identity, 1) | |||||
#if LOL_FEATURE_CXX11_UNRESTRICTED_UNIONS | |||||
LOL_ALL_CONST_INNER(half) | |||||
#endif | |||||
LOL_ALL_CONST_INNER(float) | |||||
LOL_ALL_CONST_INNER(double) | |||||
LOL_ALL_CONST_INNER(ldouble) | |||||
#if LOL_FEATURE_CXX11_UNRESTRICTED_UNIONS | |||||
LOL_ALL_CONST_INNER(real) | |||||
#endif | |||||
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) | |||||
// There is nothing here for now. | |||||
extern int unused_file_constants_cpp; | |||||
}; /* namespace lol */ | }; /* namespace lol */ | ||||
@@ -0,0 +1,42 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright © 2010-2015 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | |||||
#include <lol/engine-internal.h> | |||||
/* | |||||
* VS 2015 hack: the CRT was fully rewritten, and functions such | |||||
* as _iob_func() and fprintf() have disappeared. Since we link with | |||||
* libSDL which uses these versions, we need to provide them. | |||||
*/ | |||||
#if _MSC_VER >= 1900 | |||||
#include <cstdio> | |||||
extern "C" { | |||||
void *__imp___iob_func(void) | |||||
{ | |||||
return NULL; | |||||
} | |||||
int __imp_fprintf(FILE *stream, char const *fmt, ...) | |||||
{ | |||||
va_list va; | |||||
va_start(va, fmt); | |||||
int ret = vfprintf(stream, fmt, va); | |||||
va_end(va); | |||||
return ret; | |||||
} | |||||
} | |||||
#endif | |||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// Lol Engine | |||||
// | // | ||||
// Copyright: (c) 2010-2011 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. | |||||
// Copyright © 2010-2015 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// This library is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
@@ -324,6 +326,7 @@ public: | |||||
public: \ | public: \ | ||||
lol_unit_helper_test_##N() \ | lol_unit_helper_test_##N() \ | ||||
{ \ | { \ | ||||
(void)lol_unit_helper_name(nullptr); \ | |||||
AddTestCase(this, #N, \ | AddTestCase(this, #N, \ | ||||
(void (FixtureClass::*)()) &FixtureClass::N); \ | (void (FixtureClass::*)()) &FixtureClass::N); \ | ||||
} \ | } \ | ||||