1 /// @ref gtx 2 /// @file glm/gtx/scalar_multiplication.hpp 3 /// @author Joshua Moerman 4 /// 5 /// @brief Enables scalar multiplication for all types 6 /// 7 /// Since GLSL is very strict about types, the following (often used) combinations do not work: 8 /// double * vec4 9 /// int * vec4 10 /// vec4 / int 11 /// So we'll fix that! Of course "float * vec4" should remain the same (hence the enable_if magic) 12 13 #pragma once 14 15 #include "../detail/setup.hpp" 16 17 #if !GLM_HAS_TEMPLATE_ALIASES && !(GLM_COMPILER & GLM_COMPILER_GCC) 18 # error "GLM_GTX_scalar_multiplication requires C++11 support or alias templates and if not support for GCC" 19 #endif 20 21 #include "../vec2.hpp" 22 #include "../vec3.hpp" 23 #include "../vec4.hpp" 24 #include "../mat2x2.hpp" 25 #include <type_traits> 26 27 namespace glm 28 { 29 template <typename T, typename Vec> 30 using return_type_scalar_multiplication = typename std::enable_if< 31 !std::is_same<T, float>::value // T may not be a float 32 && std::is_arithmetic<T>::value, Vec // But it may be an int or double (no vec3 or mat3, ...) 33 >::type; 34 35 #define GLM_IMPLEMENT_SCAL_MULT(Vec) \ 36 template <typename T> \ 37 return_type_scalar_multiplication<T, Vec> \ 38 operator*(T const & s, Vec rh){ \ 39 return rh *= static_cast<float>(s); \ 40 } \ 41 \ 42 template <typename T> \ 43 return_type_scalar_multiplication<T, Vec> \ 44 operator*(Vec lh, T const & s){ \ 45 return lh *= static_cast<float>(s); \ 46 } \ 47 \ 48 template <typename T> \ 49 return_type_scalar_multiplication<T, Vec> \ 50 operator/(Vec lh, T const & s){ \ 51 return lh *= 1.0f / s; \ 52 } 53 54 GLM_IMPLEMENT_SCAL_MULT(vec2) 55 GLM_IMPLEMENT_SCAL_MULT(vec3) 56 GLM_IMPLEMENT_SCAL_MULT(vec4) 57 58 GLM_IMPLEMENT_SCAL_MULT(mat2) 59 GLM_IMPLEMENT_SCAL_MULT(mat2x3) 60 GLM_IMPLEMENT_SCAL_MULT(mat2x4) 61 GLM_IMPLEMENT_SCAL_MULT(mat3x2) 62 GLM_IMPLEMENT_SCAL_MULT(mat3) 63 GLM_IMPLEMENT_SCAL_MULT(mat3x4) 64 GLM_IMPLEMENT_SCAL_MULT(mat4x2) 65 GLM_IMPLEMENT_SCAL_MULT(mat4x3) 66 GLM_IMPLEMENT_SCAL_MULT(mat4) 67 68 #undef GLM_IMPLEMENT_SCAL_MULT 69 } // namespace glm 70