diff --git a/CMakeLists.txt b/CMakeLists.txt index 93d9325b..c37f8268 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ enable_testing() add_definitions(-D_CRT_SECURE_NO_WARNINGS) if(CMAKE_COMPILER_IS_GNUCXX) - #add_definitions(/Za) + add_definitions(/Za) #add_definitions(-pedantic) #add_definitions(-S) #add_definitions(-s) diff --git a/glm/core/_swizzle.hpp b/glm/core/_swizzle.hpp index 331fdcc3..54db67a1 100644 --- a/glm/core/_swizzle.hpp +++ b/glm/core/_swizzle.hpp @@ -29,6 +29,8 @@ #ifndef glm_core_swizzle #define glm_core_swizzle +#include "_swizzle_func.hpp" + namespace glm { enum comp diff --git a/glm/core/_swizzle_func.hpp b/glm/core/_swizzle_func.hpp index a0a6dee9..0275980a 100644 --- a/glm/core/_swizzle_func.hpp +++ b/glm/core/_swizzle_func.hpp @@ -30,20 +30,38 @@ #define glm_core_swizzle_func #define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ + SWIZZLED_TYPE A ## B() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ + SWIZZLED_TYPE A ## B ## C() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ + SWIZZLED_TYPE A ## B ## C ## D() CONST \ + { \ + return SWIZZLED_TYPE(this->A, this->B, this->C, this->D); \ + } + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ template \ SWIZZLED_TYPE CLASS_TYPE::A ## B() CONST \ { \ return SWIZZLED_TYPE(this->A, this->B); \ } -#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ +#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ template \ SWIZZLED_TYPE CLASS_TYPE::A ## B ## C() CONST \ { \ return SWIZZLED_TYPE(this->A, this->B, this->B); \ } -#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ +#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ template \ SWIZZLED_TYPE CLASS_TYPE::A ## B ## C ## D() CONST \ { \ @@ -252,7 +270,7 @@ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ diff --git a/glm/core/setup.hpp b/glm/core/setup.hpp index 488f2f28..535d3f00 100644 --- a/glm/core/setup.hpp +++ b/glm/core/setup.hpp @@ -308,12 +308,18 @@ #define GLM_LANG_CXX 0 #define GLM_LANG_CXX98 1 -#define GLM_LANG_CXX0X 2 -#define GLM_LANG_CXXMS 3 -#define GLM_LANG_CXXGNU 4 +#define GLM_LANG_CXX03 2 +#define GLM_LANG_CXX0X 3 +#define GLM_LANG_CXX11 4 +#define GLM_LANG_CXXMS 5 +#define GLM_LANG_CXXGNU 6 #if(defined(GLM_FORCE_CXX98)) # define GLM_LANG GLM_LANG_CXX98 +#elif(defined(GLM_FORCE_CXX03)) +# define GLM_LANG GLM_LANG_CXX03 +#elif(defined(GLM_FORCE_CXX11)) +# define GLM_LANG GLM_LANG_CXX11 #elif(((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC) && defined(__GXX_EXPERIMENTAL_CXX0X__)) // -std=c++0x or -std=gnu++0x # define GLM_LANG GLM_LANG_CXX0X #elif(GLM_COMPILER == GLM_COMPILER_VC2010) //_MSC_EXTENSIONS for MS language extensions @@ -330,8 +336,12 @@ # define GLM_MESSAGE_LANG_DISPLAYED # if(GLM_LANG == GLM_LANG_CXX98) # pragma message("GLM: C++98") +# elif(GLM_LANG == GLM_LANG_CXX03) +# pragma message("GLM: C++03") # elif(GLM_LANG == GLM_LANG_CXX0X) # pragma message("GLM: C++0x") +# elif(GLM_LANG == GLM_LANG_CXX11) +# pragma message("GLM: C++11") # endif//GLM_MODEL #endif//GLM_MESSAGE diff --git a/glm/core/type_vec2.hpp b/glm/core/type_vec2.hpp index f7714891..67750657 100644 --- a/glm/core/type_vec2.hpp +++ b/glm/core/type_vec2.hpp @@ -84,6 +84,10 @@ namespace detail # else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES) union {value_type x, r, s;}; union {value_type y, g, t;}; + + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC2(T, detail::ref2, detail::vec2) + GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, detail::vec4, detail::vec2, detail::vec3, detail::vec4) # endif//GLM_COMPONENT ////////////////////////////////////// diff --git a/glm/core/type_vec3.hpp b/glm/core/type_vec3.hpp index 43cdcf40..da954137 100644 --- a/glm/core/type_vec3.hpp +++ b/glm/core/type_vec3.hpp @@ -85,6 +85,10 @@ namespace detail union {value_type x, r, s;}; union {value_type y, g, t;}; union {value_type z, b, p;}; + + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, detail::ref3, detail::vec2, detail::vec3) + GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, detail::vec4, detail::vec2, detail::vec3, detail::vec4) # endif//GLM_COMPONENT ////////////////////////////////////// diff --git a/glm/core/type_vec4.hpp b/glm/core/type_vec4.hpp index bb50e7e1..f2b6daff 100644 --- a/glm/core/type_vec4.hpp +++ b/glm/core/type_vec4.hpp @@ -86,6 +86,10 @@ namespace detail union {value_type y, g, t;}; union {value_type z, b, p;}; union {value_type w, a, q;}; + + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, detail::ref4, detail::vec2, detail::vec3, detail::vec4) + GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, detail::vec4, detail::vec2, detail::vec3, detail::vec4) # endif//GLM_COMPONENT ////////////////////////////////////// diff --git a/glm/glm.hpp b/glm/glm.hpp index 79e1d878..382b1a42 100644 --- a/glm/glm.hpp +++ b/glm/glm.hpp @@ -80,6 +80,8 @@ #ifndef glm_glm #define glm_glm +#define GLM_FORCE_CXX98 + #include #include #include diff --git a/test/core/CMakeLists.txt b/test/core/CMakeLists.txt index 0abc8607..2528da85 100644 --- a/test/core/CMakeLists.txt +++ b/test/core/CMakeLists.txt @@ -24,6 +24,7 @@ glmCreateTestGTC(core_func_noise) glmCreateTestGTC(core_func_packing) glmCreateTestGTC(core_func_trigonometric) glmCreateTestGTC(core_func_vector_relational) +glmCreateTestGTC(core_func_swizzle) glmCreateTestGTC(core_setup_message) glmCreateTestGTC(core_setup_precision) diff --git a/test/core/core_func_swizzle.cpp b/test/core/core_func_swizzle.cpp new file mode 100644 index 00000000..3512aaba --- /dev/null +++ b/test/core/core_func_swizzle.cpp @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-10-16 +// Updated : 2011-10-16 +// Licence : This source is under MIT License +// File : test/core/core_func_swizzle.cpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#define GLM_FORCE_CXX98 +#include + +int test_vec4_swizzle() +{ + int Error = 0; + + glm::ivec4 A(1, 2, 3, 4); + glm::ivec4 B = A.xyzw(); + + Error += A == B ? 0 : 1; + + return Error; +} + +int main() +{ + int Error = 0; + + Error += test_vec4_swizzle(); + + return Error; +} + + +