MyCurry/src/gamelib/constrained_position.hpp

49 lines
1.6 KiB
C++

/*
Copyright 2016, 2017 Michele "King_DuckZ" Santullo
This file is part of MyCurry.
MyCurry is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyCurry is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MyCurry. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "vector.hpp"
#include "constrained_value.hpp"
#include <boost/algorithm/clamp.hpp>
namespace curry {
namespace implem {
template <typename T, std::size_t... I>
inline
vwr::Vec<T> clamp_vector_components (const vwr::Vec<T>& parMin, const vwr::Vec<T>& parMax, const vwr::Vec<T>& parValue, vwr::bt::index_seq<I...>) {
return vwr::Vec<T>(boost::algorithm::clamp(parValue[I], parMin[I], parMax[I])...);
}
} //namespace implem
template <typename T>
class VectorConstrainer;
template <typename T>
class VectorConstrainer<vwr::Vec<T>> {
public:
vwr::Vec<T> operator() (const vwr::Vec<T>& parMin, const vwr::Vec<T>& parMax, const vwr::Vec<T>& parValue) {
return implem::clamp_vector_components(parMin, parMax, parValue, vwr::bt::index_range<0, vwr::Vec<T>::dimensions>());
}
};
template <typename T>
using ConstrainedPosition = ConstrainedValue<T, VectorConstrainer<T>>;
} //namespace curry