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/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 \ | |||
\ | |||
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 | |||
@@ -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) | |||
{ | |||
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) | |||
{ | |||
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 | |||
@@ -27,7 +29,7 @@ template <typename TE> class PortalSet; | |||
//-- | |||
namespace Debug { | |||
template <typename TE> | |||
template <typename TE, typename TV = void> | |||
void Draw(PortalDoor<TE>& port, vec4 color) | |||
{ | |||
vec3 points[4]; port.GetPoints(points); | |||
@@ -18,12 +18,6 @@ | |||
namespace lol | |||
{ | |||
enum class SortAlgorithm : uint8_t | |||
{ | |||
QuickSwap, | |||
Bubble, | |||
}; | |||
template<typename T, typename ARRAY> | |||
void array_base<T, ARRAY>::Shuffle() | |||
{ | |||
@@ -33,6 +33,16 @@ namespace lol | |||
static ptrdiff_t const INDEX_NONE = -1; | |||
/* | |||
* Sorting algorithm list | |||
*/ | |||
enum class SortAlgorithm : uint8_t | |||
{ | |||
QuickSwap, | |||
Bubble, | |||
}; | |||
/* | |||
* The base array type. | |||
* | |||
@@ -383,7 +393,7 @@ public: | |||
} | |||
void Shuffle(); | |||
void Sort(enum class SortAlgorithm : uint8_t); | |||
void Sort(SortAlgorithm algorithm); | |||
void SortQuickSwap(ptrdiff_t start, ptrdiff_t stop); | |||
/* TODO: remove these legacy functions one day */ | |||
@@ -31,6 +31,20 @@ namespace lol | |||
/* Avoid issues with NaCl headers */ | |||
#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 | |||
* 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> | |||
class bigint | |||
class bigint : public bigint_digits<N, T> | |||
{ | |||
static int const bits_per_digit = sizeof(T) * 8 - 1; | |||
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. | |||
*/ | |||
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 x_padding = x.is_negative() ? digit_mask : (T)0; | |||
T carry(0); | |||
@@ -213,7 +227,7 @@ public: | |||
* FIXME: this could be factored with operator+(). | |||
*/ | |||
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; | |||
T padding = is_negative() ? digit_mask : (T)0; | |||
@@ -359,7 +373,7 @@ private: | |||
} | |||
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 | |||
{ | |||
bigint<2 * N, T> ret, tmp(0); | |||
@@ -379,8 +393,8 @@ private: | |||
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 | |||
{ | |||
bigint<2, T> ret; | |||
@@ -404,8 +418,6 @@ private: | |||
ret |= m_digits[digit_index + 1] << (bits_per_digit - bit_index); | |||
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 | |||
@@ -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) */ | |||
{ | |||
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]; | |||
} | |||
} | |||
@@ -697,6 +699,17 @@ outer(mat_t<T, COLS1, ROWS1> const &a, mat_t<T, COLS2, ROWS2> const &b) | |||
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 | |||
#undef constexpr | |||
#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 | |||
@@ -123,10 +125,17 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||
/* Explicit constructor that takes exactly N arguments thanks to SFINAE. */ | |||
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 */ | |||
@@ -134,7 +143,7 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||
explicit inline vec_t(vec_t<U, N> const &v) | |||
{ | |||
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] */ | |||
@@ -142,8 +151,8 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||
{ | |||
ASSERT(i >= 0); | |||
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; | |||
} | |||
@@ -154,20 +163,15 @@ struct vec_t<T, N, FULL_SWIZZLE> | |||
auto l = list.begin(); | |||
for (int i = 0; i < count && l != list.end(); ++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 const& operator[](size_t n) const { return m_data[n]; } | |||
static const vec_t<T,N> zero; | |||
private: | |||
template<typename... 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 */ | |||
template<typename U, int SWIZZLE> | |||
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 | |||
* loops until C++ lets us initialize m_data directly. */ | |||
@@ -237,8 +241,8 @@ struct vec_t<T,2> | |||
auto l = list.begin(); | |||
for (int i = 0; i < count && l != list.end(); ++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 */ | |||
@@ -252,7 +256,7 @@ struct vec_t<T,2> | |||
{ | |||
ASSERT(i >= 0); | |||
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) | |||
@@ -343,7 +347,7 @@ struct vec_t<T,3> | |||
/* Explicit constructor for type conversion */ | |||
template<typename U, int SWIZZLE> | |||
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 | |||
* loops until C++ lets us initialize m_data directly. */ | |||
@@ -352,8 +356,8 @@ struct vec_t<T,3> | |||
auto l = list.begin(); | |||
for (int i = 0; i < count && l != list.end(); ++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 */ | |||
@@ -371,7 +375,7 @@ struct vec_t<T,3> | |||
{ | |||
ASSERT(i >= 0); | |||
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) | |||
@@ -402,8 +406,8 @@ struct vec_t<T,3> | |||
friend inline type orthogonal(type const &a) | |||
{ | |||
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” */ | |||
@@ -589,7 +593,7 @@ struct vec_t<T,4> | |||
/* Explicit constructor for type conversion */ | |||
template<typename U, int SWIZZLE> | |||
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 | |||
* loops until C++ lets us initialize m_data directly. */ | |||
@@ -598,8 +602,8 @@ struct vec_t<T,4> | |||
auto l = list.begin(); | |||
for (int i = 0; i < count && l != list.end(); ++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 */ | |||
@@ -625,7 +629,7 @@ struct vec_t<T,4> | |||
{ | |||
ASSERT(i >= 0); | |||
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) | |||
@@ -1142,7 +1146,7 @@ template<typename T, int N, int SWIZZLE> | |||
static inline T length(vec_t<T,N,SWIZZLE> const &a) | |||
{ | |||
/* 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> | |||
@@ -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> | |||
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)); | |||
} | |||
@@ -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); | |||
} | |||
/* | |||
* 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 | |||
#undef constexpr | |||
#endif | |||
@@ -212,6 +212,7 @@ | |||
<ClCompile Include="scene.cpp" /> | |||
<ClCompile Include="sprite.cpp" /> | |||
<ClCompile Include="sys\file.cpp" /> | |||
<ClCompile Include="sys\hacks.cpp" /> | |||
<ClCompile Include="sys\init.cpp" /> | |||
<ClCompile Include="sys\thread.cpp" /> | |||
<ClCompile Include="sys\timer.cpp" /> | |||
@@ -297,6 +297,9 @@ | |||
<ClCompile Include="easymesh\csgbsp.cpp"> | |||
<Filter>easymesh</Filter> | |||
</ClCompile> | |||
<ClCompile Include="sys\hacks.cpp"> | |||
<Filter>sys</Filter> | |||
</ClCompile> | |||
<ClCompile Include="sys\init.cpp"> | |||
<Filter>sys</Filter> | |||
</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> | |||
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 */ | |||
@@ -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 | |||
@@ -324,6 +326,7 @@ public: | |||
public: \ | |||
lol_unit_helper_test_##N() \ | |||
{ \ | |||
(void)lol_unit_helper_name(nullptr); \ | |||
AddTestCase(this, #N, \ | |||
(void (FixtureClass::*)()) &FixtureClass::N); \ | |||
} \ | |||