Browse Source

Added uround to GTC_integer, fast round on positive values

Christophe Riccio 9 years ago
parent
commit
c853df1638
5 changed files with 52 additions and 1 deletions
  1. 13 0
      glm/gtc/integer.hpp
  2. 18 0
      glm/gtc/integer.inl
  3. 1 0
      readme.md
  4. 1 1
      test/core/core_func_common.cpp
  5. 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<uint, P> uround(vecType<T, P> const & x);
+
 	/// @}
 } //namespace glm
 

+ 18 - 0
glm/gtc/integer.inl

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

+ 1 - 0
readme.md

@@ -61,6 +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
 
 ##### Improvements:
 - Improved GTC_random linearRand documentation

+ 1 - 1
test/core/core_func_common.cpp

@@ -599,7 +599,7 @@ namespace round_
 	int test()
 	{
 		int Error = 0;
-	
+
 		{
 			float A = glm::round(0.0f);
 			Error += A == 0.0f ? 0 : 1;

+ 19 - 0
test/gtc/gtc_integer.cpp

@@ -210,11 +210,30 @@ namespace log2_
 	}
 }//namespace log2_
 
+namespace uround
+{
+	int test()
+	{
+		int Error = 0;
+
+		for(float f = 0.0f; f < 3.1f; f += 0.05f)
+		{
+			int RoundFast = glm::uround(f);
+			int RoundSTD = std::round(f);
+			Error += RoundFast == RoundSTD ? 0 : 1;
+			assert(!Error);
+		}
+
+		return Error;
+	}
+}//namespace uround
+
 int main()
 {
 	int Error(0);
 
 	Error += ::log2_::test();
+	Error += ::uround::test();
 
 #	ifdef NDEBUG
 		std::size_t const Samples(1000);