Browse Source

Added iround and uround to GTC_integer, fast round on positive values

Christophe Riccio 9 years ago
parent
commit
86c58b8b8b
4 changed files with 51 additions and 2 deletions
  1. 13 0
      glm/gtc/integer.hpp
  2. 18 1
      glm/gtc/integer.inl
  3. 1 1
      readme.md
  4. 19 0
      test/gtc/gtc_integer.cpp

+ 13 - 0
glm/gtc/integer.hpp

@@ -99,6 +99,19 @@ namespace glm
 	template <typename T, precision P, template <typename, precision> class vecType>
 	GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, vecType<T, P> const & y);
 
+	/// Returns a value equal to the nearest integer to x.
+	/// The fraction 0.5 will round in a direction chosen by the
+	/// implementation, presumably the direction that is fastest.
+	/// 
+	/// @param x The values of the argument must be greater or equal to zero.
+	/// @tparam T floating point scalar types.
+	/// @tparam vecType vector types.
+	/// 
+	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a>
+	/// @see gtc_integer
+	template <typename T, precision P, template <typename, precision> class vecType>
+	GLM_FUNC_DECL vecType<int, P> iround(vecType<T, P> const & x);
+
 	/// Returns a value equal to the nearest integer to x.
 	/// The fraction 0.5 will round in a direction chosen by the
 	/// implementation, presumably the direction that is fastest.

+ 18 - 1
glm/gtc/integer.inl

@@ -62,11 +62,28 @@ namespace detail
 		};
 #	endif//GLM_HAS_BITSCAN_WINDOWS
 }//namespace detail
+	template <typename genType>
+	GLM_FUNC_QUALIFIER int iround(genType x)
+	{
+		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'iround' only accept floating-point inputs");
+		assert(static_cast<genType>(0.0) <= x);
+
+		return static_cast<int>(x + static_cast<genType>(0.5));
+	}
+
+	template <typename T, precision P, template <typename, precision> class vecType>
+	GLM_FUNC_QUALIFIER vecType<int, P> iround(vecType<T, P> const& x)
+	{
+		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'iround' only accept floating-point inputs");
+		assert(all(lessThanEqual(vecType<T, P>(0), x)));
+
+		return vecType<int, P>(x + static_cast<T>(0.5));
+	}
 
 	template <typename genType>
 	GLM_FUNC_QUALIFIER uint uround(genType x)
 	{
-		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'round' only accept floating-point inputs");
+		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'uround' only accept floating-point inputs");
 		assert(static_cast<genType>(0.0) <= x);
 
 		return static_cast<uint>(x + static_cast<genType>(0.5));

+ 1 - 1
readme.md

@@ -61,7 +61,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate)
 - Added 16bit pack and unpack to GTC_packing
 - Added 8bit pack and unpack to GTC_packing
 - Added missing bvec* && and || operators
-- Added uround to GTC_integer, fast round on positive values
+- Added iround and uround to GTC_integer, fast round on positive values
 
 ##### Improvements:
 - Improved GTC_random linearRand documentation

+ 19 - 0
test/gtc/gtc_integer.cpp

@@ -210,6 +210,24 @@ namespace log2_
 	}
 }//namespace log2_
 
+namespace iround
+{
+	int test()
+	{
+		int Error = 0;
+
+		for(float f = 0.0f; f < 3.1f; f += 0.05f)
+		{
+			int RoundFast = glm::iround(f);
+			int RoundSTD = glm::round(f);
+			Error += RoundFast == RoundSTD ? 0 : 1;
+			assert(!Error);
+		}
+
+		return Error;
+	}
+}//namespace iround
+
 namespace uround
 {
 	int test()
@@ -233,6 +251,7 @@ int main()
 	int Error(0);
 
 	Error += ::log2_::test();
+	Error += ::iround::test();
 	Error += ::uround::test();
 
 #	ifdef NDEBUG