mirror of
https://github.com/g-truc/glm.git
synced 2024-11-23 09:14:34 +00:00
Merge branch 'GTC_integer'
This commit is contained in:
commit
f98f2b107a
BIN
doc/glm.docx
BIN
doc/glm.docx
Binary file not shown.
BIN
doc/glm.pdf
BIN
doc/glm.pdf
Binary file not shown.
@ -156,16 +156,20 @@ namespace detail
|
|||||||
GLM_FUNC_QUALIFIER genFIType sign(genFIType x)
|
GLM_FUNC_QUALIFIER genFIType sign(genFIType x)
|
||||||
{
|
{
|
||||||
GLM_STATIC_ASSERT(
|
GLM_STATIC_ASSERT(
|
||||||
std::numeric_limits<genFIType>::is_iec559 ||
|
std::numeric_limits<genFIType>::is_iec559 || (std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer),
|
||||||
(std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), "'sign' only accept signed inputs");
|
"'sign' only accept signed inputs");
|
||||||
|
|
||||||
return genFIType(genFIType(0) < x) - (x < genFIType(0));
|
return static_cast<genFIType>(static_cast<genFIType>(0) < x) - static_cast<genFIType>(x < static_cast<genFIType>(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, precision P, template <typename, precision> class vecType>
|
template <typename T, precision P, template <typename, precision> class vecType>
|
||||||
GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x)
|
GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x)
|
||||||
{
|
{
|
||||||
return detail::functor1<T, T, P, vecType>::call(sign, x);
|
GLM_STATIC_ASSERT(
|
||||||
|
std::numeric_limits<T>::is_iec559 || (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer),
|
||||||
|
"'sign' only accept signed inputs");
|
||||||
|
|
||||||
|
return vecType<T, P>(glm::lessThan(vecType<T, P>(0), x)) - vecType<T, P>(glm::lessThan(x, vecType<T, P>(0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// floor
|
// floor
|
||||||
|
65
glm/gtc/integer.hpp
Normal file
65
glm/gtc/integer.hpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// OpenGL Mathematics (glm.g-truc.net)
|
||||||
|
///
|
||||||
|
/// Copyright (c) 2005 - 2014 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.
|
||||||
|
///
|
||||||
|
/// 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 gtc_integer
|
||||||
|
/// @file glm/gtc/integer.hpp
|
||||||
|
/// @date 2014-11-17 / 2014-11-17
|
||||||
|
/// @author Christophe Riccio
|
||||||
|
///
|
||||||
|
/// @see core (dependence)
|
||||||
|
/// @see gtc_integer (dependence)
|
||||||
|
///
|
||||||
|
/// @defgroup gtc_integer GLM_GTC_integer
|
||||||
|
/// @ingroup gtc
|
||||||
|
///
|
||||||
|
/// @brief Allow to perform bit operations on integer values
|
||||||
|
///
|
||||||
|
/// <glm/gtc/integer.hpp> need to be included to use these functionalities.
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Dependencies
|
||||||
|
#include "../detail/setup.hpp"
|
||||||
|
#include "../detail/precision.hpp"
|
||||||
|
#include "../detail/func_integer.hpp"
|
||||||
|
#include "../detail/func_exponential.hpp"
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||||
|
# pragma message("GLM: GLM_GTC_integer extension included")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace glm
|
||||||
|
{
|
||||||
|
/// @addtogroup gtc_integer
|
||||||
|
/// @{
|
||||||
|
|
||||||
|
/// Returns the log2 of x. Can be reliably using to compute mipmap count from the texture size.
|
||||||
|
/// From GLM_GTC_integer extension.
|
||||||
|
template <typename genIUType>
|
||||||
|
GLM_FUNC_DECL genIUType log2(genIUType x);
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
} //namespace glm
|
||||||
|
|
||||||
|
#include "integer.inl"
|
47
glm/gtc/integer.inl
Normal file
47
glm/gtc/integer.inl
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// OpenGL Mathematics (glm.g-truc.net)
|
||||||
|
///
|
||||||
|
/// Copyright (c) 2005 - 2014 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.
|
||||||
|
///
|
||||||
|
/// 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 gtc_integer
|
||||||
|
/// @file glm/gtc/integer.inl
|
||||||
|
/// @date 2014-11-17 / 2014-11-17
|
||||||
|
/// @author Christophe Riccio
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
namespace glm{
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||||
|
{
|
||||||
|
return 31u - findMSB(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct compute_log2<false>
|
||||||
|
{
|
||||||
|
template <typename T>
|
||||||
|
GLM_FUNC_QUALIFIER T operator() (T const & Value) const
|
||||||
|
{
|
||||||
|
return Value <= static_cast<T>(1) ? T(0) : T(32) - nlz(Value - T(1));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}//namespace detail
|
||||||
|
}//namespace glm
|
@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
// Dependency:
|
// Dependency:
|
||||||
#include "../glm.hpp"
|
#include "../glm.hpp"
|
||||||
|
#include "../gtc/integer.hpp"
|
||||||
|
|
||||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||||
# pragma message("GLM: GLM_GTX_integer extension included")
|
# pragma message("GLM: GLM_GTX_integer extension included")
|
||||||
@ -57,11 +58,6 @@ namespace glm
|
|||||||
//! From GLM_GTX_integer extension.
|
//! From GLM_GTX_integer extension.
|
||||||
GLM_FUNC_DECL int sqrt(int x);
|
GLM_FUNC_DECL int sqrt(int x);
|
||||||
|
|
||||||
//! Returns the log2 of x. Can be reliably using to compute mipmap count from the texture size.
|
|
||||||
//! From GLM_GTX_integer extension.
|
|
||||||
template <typename genIUType>
|
|
||||||
GLM_FUNC_DECL genIUType log2(genIUType x);
|
|
||||||
|
|
||||||
//! Returns the floor log2 of x.
|
//! Returns the floor log2 of x.
|
||||||
//! From GLM_GTX_integer extension.
|
//! From GLM_GTX_integer extension.
|
||||||
GLM_FUNC_DECL unsigned int floor_log2(unsigned int x);
|
GLM_FUNC_DECL unsigned int floor_log2(unsigned int x);
|
||||||
|
@ -53,21 +53,7 @@ namespace detail
|
|||||||
x += (x >> 16);
|
x += (x >> 16);
|
||||||
return(x & 0x0000003f);
|
return(x & 0x0000003f);
|
||||||
}
|
}
|
||||||
|
}//namespace detail
|
||||||
template <>
|
|
||||||
struct compute_log2<false>
|
|
||||||
{
|
|
||||||
template <typename T>
|
|
||||||
GLM_FUNC_QUALIFIER T operator() (T const & Value) const
|
|
||||||
{
|
|
||||||
#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))
|
|
||||||
return Value <= static_cast<T>(1) ? T(0) : T(32) - nlz(Value - T(1));
|
|
||||||
#else
|
|
||||||
return T(32) - nlz(Value - T(1));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}//namespace _detail
|
|
||||||
|
|
||||||
// Henry Gordon Dietz: http://aggregate.org/MAGIC/
|
// Henry Gordon Dietz: http://aggregate.org/MAGIC/
|
||||||
/*
|
/*
|
||||||
|
@ -55,7 +55,7 @@ Features:
|
|||||||
- Added GLM_FORCE_NO_CTOR_INIT
|
- Added GLM_FORCE_NO_CTOR_INIT
|
||||||
- Added 'uninitialize' to explicitly not initialize a GLM type
|
- Added 'uninitialize' to explicitly not initialize a GLM type
|
||||||
- Added GTC_bitfield extension, promoted GTX_bit
|
- Added GTC_bitfield extension, promoted GTX_bit
|
||||||
- Added GTC_integer extension, promoted GTX_bit
|
- Added GTC_integer extension, promoted GTX_bit and GTX_integer
|
||||||
- Added GTC_round extension, promoted GTX_bit
|
- Added GTC_round extension, promoted GTX_bit
|
||||||
- Added GLM_FORCE_EXPLICIT_CTOR to require explicit type conversions #269
|
- Added GLM_FORCE_EXPLICIT_CTOR to require explicit type conversions #269
|
||||||
|
|
||||||
|
@ -855,6 +855,12 @@ namespace sign
|
|||||||
|
|
||||||
int Error = 0;
|
int Error = 0;
|
||||||
|
|
||||||
|
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)
|
||||||
|
{
|
||||||
|
glm::int32 Result = glm::sign(Data[i].Value);
|
||||||
|
Error += Data[i].Return == Result ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)
|
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)
|
||||||
{
|
{
|
||||||
glm::int32 Result = sign_cmp(Data[i].Value);
|
glm::int32 Result = sign_cmp(Data[i].Value);
|
||||||
@ -888,11 +894,36 @@ namespace sign
|
|||||||
return Error;
|
return Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test_i32vec4()
|
||||||
|
{
|
||||||
|
type<glm::i32vec4> const Data[] =
|
||||||
|
{
|
||||||
|
{glm::i32vec4( 1), glm::i32vec4( 1)},
|
||||||
|
{glm::i32vec4( 0), glm::i32vec4( 0)},
|
||||||
|
{glm::i32vec4( 2), glm::i32vec4( 1)},
|
||||||
|
{glm::i32vec4( 3), glm::i32vec4( 1)},
|
||||||
|
{glm::i32vec4(-1), glm::i32vec4(-1)},
|
||||||
|
{glm::i32vec4(-2), glm::i32vec4(-1)},
|
||||||
|
{glm::i32vec4(-3), glm::i32vec4(-1)}
|
||||||
|
};
|
||||||
|
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
|
for(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::i32vec4>); ++i)
|
||||||
|
{
|
||||||
|
glm::i32vec4 Result = glm::sign(Data[i].Value);
|
||||||
|
Error += glm::all(glm::equal(Data[i].Return, Result)) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
|
||||||
int test()
|
int test()
|
||||||
{
|
{
|
||||||
int Error = 0;
|
int Error = 0;
|
||||||
|
|
||||||
Error += test_int32();
|
Error += test_int32();
|
||||||
|
Error += test_i32vec4();
|
||||||
|
|
||||||
return Error;
|
return Error;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
glmCreateTestGTC(gtc_bitfield)
|
glmCreateTestGTC(gtc_bitfield)
|
||||||
glmCreateTestGTC(gtc_constants)
|
glmCreateTestGTC(gtc_constants)
|
||||||
glmCreateTestGTC(gtc_epsilon)
|
glmCreateTestGTC(gtc_epsilon)
|
||||||
|
glmCreateTestGTC(gtc_integer)
|
||||||
glmCreateTestGTC(gtc_matrix_access)
|
glmCreateTestGTC(gtc_matrix_access)
|
||||||
glmCreateTestGTC(gtc_matrix_integer)
|
glmCreateTestGTC(gtc_matrix_integer)
|
||||||
glmCreateTestGTC(gtc_matrix_inverse)
|
glmCreateTestGTC(gtc_matrix_inverse)
|
||||||
|
68
test/gtc/gtc_integer.cpp
Normal file
68
test/gtc/gtc_integer.cpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Created : 2014-11-17
|
||||||
|
// Updated : 2014-11-17
|
||||||
|
// Licence : This source is under MIT licence
|
||||||
|
// File : test/gtc/integer.cpp
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <glm/gtc/integer.hpp>
|
||||||
|
#include <glm/gtc/type_precision.hpp>
|
||||||
|
#include <glm/gtc/vec1.hpp>
|
||||||
|
#include <glm/vector_relational.hpp>
|
||||||
|
#include <glm/vec2.hpp>
|
||||||
|
#include <glm/vec3.hpp>
|
||||||
|
#include <glm/vec4.hpp>
|
||||||
|
#include <ctime>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace log2_
|
||||||
|
{
|
||||||
|
int test()
|
||||||
|
{
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
|
int A0(glm::log2(10.f));
|
||||||
|
glm::ivec1 B0(glm::log2(glm::vec1(10.f)));
|
||||||
|
glm::ivec2 C0(glm::log2(glm::vec2(10.f)));
|
||||||
|
glm::ivec3 D0(glm::log2(glm::vec3(10.f)));
|
||||||
|
glm::ivec4 E0(glm::log2(glm::vec4(10.f)));
|
||||||
|
|
||||||
|
int A1 = glm::log2(int(10.f));
|
||||||
|
glm::ivec1 B1 = glm::log2(glm::ivec1(10.f));
|
||||||
|
glm::ivec2 C1 = glm::log2(glm::ivec2(10.f));
|
||||||
|
glm::ivec3 D1 = glm::log2(glm::ivec3(10.f));
|
||||||
|
glm::ivec4 E1 = glm::log2(glm::ivec4(10.f));
|
||||||
|
|
||||||
|
Error += A0 == A1 ? 0 : 1;
|
||||||
|
Error += glm::all(glm::equal(B0, B1)) ? 0 : 1;
|
||||||
|
Error += glm::all(glm::equal(C0, C1)) ? 0 : 1;
|
||||||
|
Error += glm::all(glm::equal(D0, D1)) ? 0 : 1;
|
||||||
|
Error += glm::all(glm::equal(E0, E1)) ? 0 : 1;
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int perf()
|
||||||
|
{
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
}//namespace log2_
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int Error(0);
|
||||||
|
|
||||||
|
Error += ::log2_::test();
|
||||||
|
|
||||||
|
# ifdef GLM_TEST_ENABLE_PERF
|
||||||
|
Error += ::log2_::perf();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user