/////////////////////////////////////////////////////////////////////////////////// /// OpenGL Mathematics (glm.g-truc.net) /// /// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) /// Permission is hereby granted, free of charge, to any person obtaining a copy /// of this software and associated documentation files (the "Software"), to deal /// in the Software without restriction, including without limitation the rights /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell /// copies of the Software, and to permit persons to whom the Software is /// furnished to do so, subject to the following conditions: /// /// The above copyright notice and this permission notice shall be included in /// all copies or substantial portions of the Software. /// /// Restrictions: /// By making use of the Software for military purposes, you choose to make /// a Bunny unhappy. /// /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN /// THE SOFTWARE. /// /// @ref core /// @file glm/detail/_vectorize.hpp /// @date 2011-10-14 / 2011-10-14 /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// #pragma once #include "type_vec1.hpp" #include "type_vec2.hpp" #include "type_vec3.hpp" #include "type_vec4.hpp" namespace glm{ namespace detail { template class vecType> struct functor1{}; template struct functor1 { GLM_FUNC_QUALIFIER static tvec1 call(R (*Func) (T x), tvec1 const & v) { return tvec1(Func(v.x)); } }; template struct functor1 { GLM_FUNC_QUALIFIER static tvec2 call(R (*Func) (T x), tvec2 const & v) { return tvec2(Func(v.x), Func(v.y)); } }; template struct functor1 { GLM_FUNC_QUALIFIER static tvec3 call(R (*Func) (T x), tvec3 const & v) { return tvec3(Func(v.x), Func(v.y), Func(v.z)); } }; template struct functor1 { GLM_FUNC_QUALIFIER static tvec4 call(R (*Func) (T x), tvec4 const & v) { return tvec4(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); } }; template class vecType> struct functor2{}; template struct functor2 { GLM_FUNC_QUALIFIER static tvec1 call(T (*Func) (T x, T y), tvec1 const & a, tvec1 const & b) { return tvec1(Func(a.x, b.x)); } }; template struct functor2 { GLM_FUNC_QUALIFIER static tvec2 call(T (*Func) (T x, T y), tvec2 const & a, tvec2 const & b) { return tvec2(Func(a.x, b.x), Func(a.y, b.y)); } }; template struct functor2 { GLM_FUNC_QUALIFIER static tvec3 call(T (*Func) (T x, T y), tvec3 const & a, tvec3 const & b) { return tvec3(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); } }; template struct functor2 { GLM_FUNC_QUALIFIER static tvec4 call(T (*Func) (T x, T y), tvec4 const & a, tvec4 const & b) { return tvec4(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); } }; template class vecType> struct functor2_vec_sca{}; template struct functor2_vec_sca { GLM_FUNC_QUALIFIER static tvec1 call(T (*Func) (T x, T y), tvec1 const & a, T b) { return tvec1(Func(a.x, b)); } }; template struct functor2_vec_sca { GLM_FUNC_QUALIFIER static tvec2 call(T (*Func) (T x, T y), tvec2 const & a, T b) { return tvec2(Func(a.x, b), Func(a.y, b)); } }; template struct functor2_vec_sca { GLM_FUNC_QUALIFIER static tvec3 call(T (*Func) (T x, T y), tvec3 const & a, T b) { return tvec3(Func(a.x, b), Func(a.y, b), Func(a.z, b)); } }; template struct functor2_vec_sca { GLM_FUNC_QUALIFIER static tvec4 call(T (*Func) (T x, T y), tvec4 const & a, T b) { return tvec4(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); } }; }//namespace detail }//namespace glm