Factorized float to uint and co function code.

This commit is contained in:
Christophe Riccio 2013-09-17 01:06:45 +02:00
parent 4707333a58
commit dddcbe58e6
16 changed files with 199 additions and 264 deletions

View File

@ -262,7 +262,7 @@ namespace glm
genTypeT const & y, genTypeT const & y,
genTypeU const & a); genTypeU const & a);
/// Returns 0.0 if x < edge, otherwise it returns 1.0. /// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType.
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
@ -271,10 +271,14 @@ namespace glm
genType const & edge, genType const & edge,
genType const & x); genType const & x);
template <typename genType> /// Returns 0.0 if x < edge, otherwise it returns 1.0.
GLM_FUNC_DECL genType step( ///
typename genType::T const & edge, /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a>
genType const & x); /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
template <template <typename, precision> class vecType, typename T, precision P>
GLM_FUNC_DECL vecType<T, P> step(
T const & edge,
vecType<T, P> const & x);
/// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and
/// performs smooth Hermite interpolation between 0 and 1 /// performs smooth Hermite interpolation between 0 and 1
@ -331,28 +335,38 @@ namespace glm
GLM_FUNC_DECL typename genType::bool_type isinf(genType const & x); GLM_FUNC_DECL typename genType::bool_type isinf(genType const & x);
/// Returns a signed integer value representing /// Returns a signed integer value representing
/// the encoding of a floating-point value. The floatingpoint /// the encoding of a floating-point value. The floating-point
/// value's bit-level representation is preserved. /// value's bit-level representation is preserved.
/// ///
/// @tparam genType Single-precision floating-point scalar or vector types.
/// @tparam genIType Signed integer scalar or vector types.
///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
template <typename genType, typename genIType> GLM_FUNC_DECL int floatBitsToInt(float const & v);
GLM_FUNC_DECL genIType floatBitsToInt(genType const & value);
/// Returns a signed integer value representing
/// the encoding of a floating-point value. The floatingpoint
/// value's bit-level representation is preserved.
///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
template <template <typename, precision> class vecType, precision P>
GLM_FUNC_DECL vecType<int, P> floatBitsToInt(vecType<float, P> const & v);
/// Returns a unsigned integer value representing /// Returns a unsigned integer value representing
/// the encoding of a floating-point value. The floatingpoint /// the encoding of a floating-point value. The floatingpoint
/// value's bit-level representation is preserved. /// value's bit-level representation is preserved.
/// ///
/// @tparam genType Single-precision floating-point scalar or vector types. /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a>
/// @tparam genUType Unsigned integer scalar or vector types. /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
GLM_FUNC_DECL uint floatBitsToUint(float const & v);
/// Returns a unsigned integer value representing
/// the encoding of a floating-point value. The floatingpoint
/// value's bit-level representation is preserved.
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
template <typename genType, typename genUType> template <template <typename, precision> class vecType, precision P>
GLM_FUNC_DECL genUType floatBitsToUint(genType const & value); GLM_FUNC_DECL vecType<uint, P> floatBitsToUint(vecType<float, P> const & v);
/// Returns a floating-point value corresponding to a signed /// Returns a floating-point value corresponding to a signed
/// integer encoding of a floating-point value. /// integer encoding of a floating-point value.
@ -360,15 +374,20 @@ namespace glm
/// resulting floating point value is unspecified. Otherwise, /// resulting floating point value is unspecified. Otherwise,
/// the bit-level representation is preserved. /// the bit-level representation is preserved.
/// ///
/// @tparam genType Single-precision floating-point scalar or vector types. /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a>
/// @tparam genIType Signed integer scalar or vector types. /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
GLM_FUNC_DECL float intBitsToFloat(int const & v);
/// Returns a floating-point value corresponding to a signed
/// integer encoding of a floating-point value.
/// If an inf or NaN is passed in, it will not signal, and the
/// resulting floating point value is unspecified. Otherwise,
/// the bit-level representation is preserved.
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
/// template <template <typename, precision> class vecType, precision P>
/// @todo Clarify this declaration, we don't need to actually specify the return type GLM_FUNC_DECL vecType<float, P> intBitsToFloat(vecType<int, P> const & v);
template <typename genType, typename genIType>
GLM_FUNC_DECL genType intBitsToFloat(genIType const & value);
/// Returns a floating-point value corresponding to a /// Returns a floating-point value corresponding to a
/// unsigned integer encoding of a floating-point value. /// unsigned integer encoding of a floating-point value.
@ -376,15 +395,20 @@ namespace glm
/// resulting floating point value is unspecified. Otherwise, /// resulting floating point value is unspecified. Otherwise,
/// the bit-level representation is preserved. /// the bit-level representation is preserved.
/// ///
/// @tparam genType Single-precision floating-point scalar or vector types. /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a>
/// @tparam genUType Unsigned integer scalar or vector types. /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
GLM_FUNC_DECL float uintBitsToFloat(uint const & v);
/// Returns a floating-point value corresponding to a
/// unsigned integer encoding of a floating-point value.
/// If an inf or NaN is passed in, it will not signal, and the
/// resulting floating point value is unspecified. Otherwise,
/// the bit-level representation is preserved.
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
/// template <template <typename, precision> class vecType, precision P>
/// @todo Clarify this declaration, we don't need to actually specify the return type GLM_FUNC_DECL vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v);
template <typename genType, typename genUType>
GLM_FUNC_DECL genType uintBitsToFloat(genUType const & value);
/// Computes and returns a * b + c. /// Computes and returns a * b + c.
/// ///

View File

@ -26,6 +26,10 @@
/// @author Christophe Riccio /// @author Christophe Riccio
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include "type_vec2.hpp"
#include "type_vec3.hpp"
#include "type_vec4.hpp"
#include "_vectorize.hpp"
#include <limits> #include <limits>
namespace glm{ namespace glm{
@ -708,113 +712,21 @@ namespace detail
genType const & x genType const & x
) )
{ {
GLM_STATIC_ASSERT( return mix(genType(1), genType(0), glm::lessThan(x, edge));
std::numeric_limits<genType>::is_iec559,
"'step' only accept floating-point inputs");
return x < edge ? static_cast<genType>(0) : static_cast<genType>(1);
} }
template <typename T, precision P> template <template <typename, precision> class vecType, typename T, precision P>
GLM_FUNC_QUALIFIER detail::tvec2<T, P> step GLM_FUNC_QUALIFIER vecType<T, P> step
( (
T const & edge, T const & edge,
detail::tvec2<T, P> const & x vecType<T, P> const & x
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(
std::numeric_limits<T>::is_iec559, std::numeric_limits<T>::is_iec559,
"'step' only accept floating-point inputs"); "'step' only accept floating-point inputs");
return detail::tvec2<T, P>( return mix(vecType<T, P>(1), vecType<T, P>(0), glm::lessThan(x, vecType<T, P>(edge)));
x.x < edge ? T(0) : T(1),
x.y < edge ? T(0) : T(1));
}
template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tvec3<T, P> step
(
T const & edge,
detail::tvec3<T, P> const & x
)
{
GLM_STATIC_ASSERT(
std::numeric_limits<T>::is_iec559,
"'step' only accept floating-point inputs");
return detail::tvec3<T, P>(
x.x < edge ? T(0) : T(1),
x.y < edge ? T(0) : T(1),
x.z < edge ? T(0) : T(1));
}
template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tvec4<T, P> step
(
T const & edge,
detail::tvec4<T, P> const & x
)
{
GLM_STATIC_ASSERT(
std::numeric_limits<T>::is_iec559,
"'step' only accept floating-point inputs");
return detail::tvec4<T, P>(
x.x < edge ? T(0) : T(1),
x.y < edge ? T(0) : T(1),
x.z < edge ? T(0) : T(1),
x.w < edge ? T(0) : T(1));
}
template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tvec2<T, P> step
(
detail::tvec2<T, P> const & edge,
detail::tvec2<T, P> const & x
)
{
GLM_STATIC_ASSERT(
std::numeric_limits<T>::is_iec559,
"'step' only accept floating-point inputs");
return detail::tvec2<T, P>(
x.x < edge.x ? T(0) : T(1),
x.y < edge.y ? T(0) : T(1));
}
template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tvec3<T, P> step
(
detail::tvec3<T, P> const & edge,
detail::tvec3<T, P> const & x
)
{
GLM_STATIC_ASSERT(
std::numeric_limits<T>::is_iec559,
"'step' only accept floating-point inputs");
return detail::tvec3<T, P>(
x.x < edge.x ? T(0) : T(1),
x.y < edge.y ? T(0) : T(1),
x.z < edge.z ? T(0) : T(1));
}
template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tvec4<T, P> step
(
detail::tvec4<T, P> const & edge,
detail::tvec4<T, P> const & x
)
{
GLM_STATIC_ASSERT(
std::numeric_limits<T>::is_iec559,
"'step' only accept floating-point inputs");
return detail::tvec4<T, P>(
x.x < edge.x ? T(0) : T(1),
x.y < edge.y ? T(0) : T(1),
x.z < edge.z ? T(0) : T(1),
x.w < edge.w ? T(0) : T(1));
} }
// smoothstep // smoothstep
@ -1090,28 +1002,10 @@ namespace detail
return *reinterpret_cast<int*>(const_cast<float*>(&v)); return *reinterpret_cast<int*>(const_cast<float*>(&v));
} }
GLM_FUNC_QUALIFIER detail::tvec2<int, defaultp> floatBitsToInt template <template <typename, precision> class vecType, precision P>
( GLM_FUNC_QUALIFIER vecType<int, P> floatBitsToInt(vecType<float, P> const & v)
detail::tvec2<float, defaultp> const & v
)
{ {
return *reinterpret_cast<detail::tvec2<int, defaultp>*>(const_cast<detail::tvec2<float, defaultp>*>(&v)); return *reinterpret_cast<vecType<int, P>*>(const_cast<vecType<float, P>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec3<int, defaultp> floatBitsToInt
(
detail::tvec3<float, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec3<int, defaultp>*>(const_cast<detail::tvec3<float, defaultp>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec4<int, defaultp> floatBitsToInt
(
detail::tvec4<float, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec4<int, defaultp>*>(const_cast<detail::tvec4<float, defaultp>*>(&v));
} }
GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & v) GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & v)
@ -1119,28 +1013,10 @@ namespace detail
return *reinterpret_cast<uint*>(const_cast<float*>(&v)); return *reinterpret_cast<uint*>(const_cast<float*>(&v));
} }
GLM_FUNC_QUALIFIER detail::tvec2<uint, defaultp> floatBitsToUint template <template <typename, precision> class vecType, precision P>
( GLM_FUNC_QUALIFIER vecType<uint, P> floatBitsToUint(vecType<float, P> const & v)
detail::tvec2<float, defaultp> const & v
)
{ {
return *reinterpret_cast<detail::tvec2<uint, defaultp>*>(const_cast<detail::tvec2<float, defaultp>*>(&v)); return *reinterpret_cast<vecType<uint, P>*>(const_cast<vecType<float, P>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec3<uint, defaultp> floatBitsToUint
(
detail::tvec3<float, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec3<uint, defaultp>*>(const_cast<detail::tvec3<float, defaultp>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec4<uint, defaultp> floatBitsToUint
(
detail::tvec4<float, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec4<uint, defaultp>*>(const_cast<detail::tvec4<float, defaultp>*>(&v));
} }
GLM_FUNC_QUALIFIER float intBitsToFloat(int const & v) GLM_FUNC_QUALIFIER float intBitsToFloat(int const & v)
@ -1148,28 +1024,10 @@ namespace detail
return *reinterpret_cast<float*>(const_cast<int*>(&v)); return *reinterpret_cast<float*>(const_cast<int*>(&v));
} }
GLM_FUNC_QUALIFIER detail::tvec2<float, defaultp> intBitsToFloat template <template <typename, precision> class vecType, precision P>
( GLM_FUNC_QUALIFIER vecType<float, P> intBitsToFloat(vecType<int, P> const & v)
detail::tvec2<int, defaultp> const & v
)
{ {
return *reinterpret_cast<detail::tvec2<float, defaultp>*>(const_cast<detail::tvec2<int, defaultp>*>(&v)); return *reinterpret_cast<vecType<float, P>*>(const_cast<vecType<int, P>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec3<float, defaultp> intBitsToFloat
(
detail::tvec3<int, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec3<float, defaultp>*>(const_cast<detail::tvec3<int, defaultp>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec4<float, defaultp> intBitsToFloat
(
detail::tvec4<int, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec4<float, defaultp>*>(const_cast<detail::tvec4<int, defaultp>*>(&v));
} }
GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & v) GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & v)
@ -1177,28 +1035,10 @@ namespace detail
return *reinterpret_cast<float*>(const_cast<uint*>(&v)); return *reinterpret_cast<float*>(const_cast<uint*>(&v));
} }
GLM_FUNC_QUALIFIER detail::tvec2<float, defaultp> uintBitsToFloat template <template <typename, precision> class vecType, precision P>
( GLM_FUNC_QUALIFIER vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v)
detail::tvec2<uint, defaultp> const & v
)
{ {
return *reinterpret_cast<detail::tvec2<float, defaultp>*>(const_cast<detail::tvec2<uint, defaultp>*>(&v)); return *reinterpret_cast<vecType<float, P>*>(const_cast<vecType<uint, P>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec3<float, defaultp> uintBitsToFloat
(
detail::tvec3<uint, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec3<float, defaultp>*>(const_cast<detail::tvec3<uint, defaultp>*>(&v));
}
GLM_FUNC_QUALIFIER detail::tvec4<float, defaultp> uintBitsToFloat
(
detail::tvec4<uint, defaultp> const & v
)
{
return *reinterpret_cast<detail::tvec4<float, defaultp>*>(const_cast<detail::tvec4<uint, defaultp>*>(&v));
} }
template <typename genType> template <typename genType>

View File

@ -36,6 +36,8 @@
#ifndef glm_core_func_geometric #ifndef glm_core_func_geometric
#define glm_core_func_geometric GLM_VERSION #define glm_core_func_geometric GLM_VERSION
#include "type_vec3.hpp"
namespace glm namespace glm
{ {
/// @addtogroup core_func_geometric /// @addtogroup core_func_geometric
@ -124,11 +126,11 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a>
template <typename genType> template <typename T, precision P, template <typename, precision> class vecType>
GLM_FUNC_DECL genType refract( GLM_FUNC_DECL vecType<T, P> refract(
genType const & I, vecType<T, P> const & I,
genType const & N, vecType<T, P> const & N,
typename genType::T const & eta); T const & eta);
/// @} /// @}
}//namespace glm }//namespace glm

View File

@ -26,6 +26,8 @@
/// @author Christophe Riccio /// @author Christophe Riccio
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include "type_vec2.hpp"
#include "type_vec4.hpp"
#include "type_float.hpp" #include "type_float.hpp"
namespace glm namespace glm

View File

@ -38,6 +38,8 @@
#ifndef glm_core_func_integer #ifndef glm_core_func_integer
#define glm_core_func_integer GLM_VERSION #define glm_core_func_integer GLM_VERSION
#include "setup.hpp"
namespace glm namespace glm
{ {
/// @addtogroup core_func_integer /// @addtogroup core_func_integer

View File

@ -26,6 +26,11 @@
/// @author Christophe Riccio /// @author Christophe Riccio
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include "type_vec2.hpp"
#include "type_vec3.hpp"
#include "type_vec4.hpp"
#include "type_int.hpp"
#include "_vectorize.hpp"
#if(GLM_ARCH != GLM_ARCH_PURE) #if(GLM_ARCH != GLM_ARCH_PURE)
#if(GLM_COMPILER & GLM_COMPILER_VC) #if(GLM_COMPILER & GLM_COMPILER_VC)
# include <intrin.h> # include <intrin.h>

View File

@ -38,6 +38,11 @@
#ifndef glm_core_func_noise #ifndef glm_core_func_noise
#define glm_core_func_noise GLM_VERSION #define glm_core_func_noise GLM_VERSION
#include "type_vec1.hpp"
#include "type_vec2.hpp"
#include "type_vec3.hpp"
#include "setup.hpp"
namespace glm namespace glm
{ {
/// @addtogroup core_func_noise /// @addtogroup core_func_noise

View File

@ -36,6 +36,9 @@
#ifndef GLM_CORE_func_packing #ifndef GLM_CORE_func_packing
#define GLM_CORE_func_packing GLM_VERSION #define GLM_CORE_func_packing GLM_VERSION
#include "type_vec2.hpp"
#include "type_vec4.hpp"
namespace glm namespace glm
{ {
/// @addtogroup core_func_packing /// @addtogroup core_func_packing
@ -52,7 +55,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml">GLSL packUnorm2x16 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml">GLSL packUnorm2x16 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL uint32 packUnorm2x16(vec2 const & v); GLM_FUNC_DECL uint packUnorm2x16(vec2 const & v);
/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.
/// Then, the results are packed into the returned 32-bit unsigned integer. /// Then, the results are packed into the returned 32-bit unsigned integer.
@ -65,7 +68,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml">GLSL packSnorm2x16 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml">GLSL packSnorm2x16 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL uint32 packSnorm2x16(vec2 const & v); GLM_FUNC_DECL uint packSnorm2x16(vec2 const & v);
/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.
/// Then, the results are packed into the returned 32-bit unsigned integer. /// Then, the results are packed into the returned 32-bit unsigned integer.
@ -78,7 +81,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL uint32 packUnorm4x8(vec4 const & v); GLM_FUNC_DECL uint packUnorm4x8(vec4 const & v);
/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.
/// Then, the results are packed into the returned 32-bit unsigned integer. /// Then, the results are packed into the returned 32-bit unsigned integer.
@ -91,7 +94,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL uint32 packSnorm4x8(vec4 const & v); GLM_FUNC_DECL uint packSnorm4x8(vec4 const & v);
/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers.
/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.
@ -104,7 +107,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL vec2 unpackUnorm2x16(uint32 const & p); GLM_FUNC_DECL vec2 unpackUnorm2x16(uint const & p);
/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers.
/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.
@ -117,7 +120,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm2x16 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm2x16 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL vec2 unpackSnorm2x16(uint32 const & p); GLM_FUNC_DECL vec2 unpackSnorm2x16(uint const & p);
/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers.
/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.
@ -130,7 +133,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL vec4 unpackUnorm4x8(uint32 const & p); GLM_FUNC_DECL vec4 unpackUnorm4x8(uint const & p);
/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers.
/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.
@ -143,7 +146,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL vec4 unpackSnorm4x8(uint32 const & p); GLM_FUNC_DECL vec4 unpackSnorm4x8(uint const & p);
/// Returns a double-precision value obtained by packing the components of v into a 64-bit value. /// Returns a double-precision value obtained by packing the components of v into a 64-bit value.
/// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified.
@ -172,7 +175,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL uint32 packHalf2x16(vec2 const & v); GLM_FUNC_DECL uint packHalf2x16(vec2 const & v);
/// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values,
/// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification,
@ -182,7 +185,7 @@ namespace glm
/// ///
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a>
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
GLM_FUNC_DECL vec2 unpackHalf2x16(uint32 const & v); GLM_FUNC_DECL vec2 unpackHalf2x16(uint const & v);
/// @} /// @}
}//namespace glm }//namespace glm
@ -190,4 +193,3 @@ namespace glm
#include "func_packing.inl" #include "func_packing.inl"
#endif//GLM_CORE_func_packing #endif//GLM_CORE_func_packing

View File

@ -26,57 +26,59 @@
/// @author Christophe Riccio /// @author Christophe Riccio
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include "func_common.hpp"
#include "type_half.hpp" #include "type_half.hpp"
#include "../fwd.hpp"
namespace glm namespace glm
{ {
GLM_FUNC_QUALIFIER uint32 packUnorm2x16(vec2 const & v) GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const & v)
{ {
u16vec2 Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); u16vec2 Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f));
return *reinterpret_cast<uint32*>(&Topack); return *reinterpret_cast<uint*>(&Topack);
} }
GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint32 const & p) GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint const & p)
{ {
vec2 Unpack(*reinterpret_cast<u16vec2*>(const_cast<uint32*>(&p))); vec2 Unpack(*reinterpret_cast<u16vec2*>(const_cast<uint*>(&p)));
return Unpack * float(1.5259021896696421759365224689097e-5); // 1.0 / 65535.0 return Unpack * float(1.5259021896696421759365224689097e-5); // 1.0 / 65535.0
} }
GLM_FUNC_QUALIFIER uint32 packSnorm2x16(vec2 const & v) GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const & v)
{ {
i16vec2 Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); i16vec2 Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f));
return *reinterpret_cast<uint32*>(&Topack); return *reinterpret_cast<uint32*>(&Topack);
} }
GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint32 const & p) GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint const & p)
{ {
vec2 Unpack(*reinterpret_cast<i16vec2*>(const_cast<uint32*>(&p))); vec2 Unpack(*reinterpret_cast<i16vec2*>(const_cast<uint*>(&p)));
return clamp( return clamp(
Unpack * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, Unpack * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f,
-1.0f, 1.0f); -1.0f, 1.0f);
} }
GLM_FUNC_QUALIFIER uint32 packUnorm4x8(vec4 const & v) GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const & v)
{ {
u8vec4 Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); u8vec4 Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f));
return *reinterpret_cast<uint32*>(&Topack); return *reinterpret_cast<uint*>(&Topack);
} }
GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint32 const & p) GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint const & p)
{ {
vec4 Unpack(*reinterpret_cast<u8vec4*>(const_cast<uint32*>(&p))); vec4 Unpack(*reinterpret_cast<u8vec4*>(const_cast<uint*>(&p)));
return Unpack * float(0.0039215686274509803921568627451); // 1 / 255 return Unpack * float(0.0039215686274509803921568627451); // 1 / 255
} }
GLM_FUNC_QUALIFIER uint32 packSnorm4x8(vec4 const & v) GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const & v)
{ {
i8vec4 Topack(round(clamp(v ,-1.0f, 1.0f) * 127.0f)); i8vec4 Topack(round(clamp(v ,-1.0f, 1.0f) * 127.0f));
return *reinterpret_cast<uint32*>(&Topack); return *reinterpret_cast<uint*>(&Topack);
} }
GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint32 const & p) GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint const & p)
{ {
vec4 Unpack(*reinterpret_cast<i8vec4*>(const_cast<uint32*>(&p))); vec4 Unpack(*reinterpret_cast<i8vec4*>(const_cast<uint*>(&p)));
return clamp( return clamp(
Unpack * 0.0078740157480315f, // 1.0f / 127.0f Unpack * 0.0078740157480315f, // 1.0f / 127.0f
-1.0f, 1.0f); -1.0f, 1.0f);

View File

@ -134,24 +134,6 @@ namespace detail
enum{ID = float_or_int_value::GLM_FLOAT}; enum{ID = float_or_int_value::GLM_FLOAT};
}; };
union uif32
{
GLM_FUNC_QUALIFIER uif32() :
i(0)
{}
GLM_FUNC_QUALIFIER uif32(float f) :
f(f)
{}
GLM_FUNC_QUALIFIER uif32(uint32 i) :
i(i)
{}
float f;
uint32 i;
};
union uif64 union uif64
{ {
GLM_FUNC_QUALIFIER uif64() : GLM_FUNC_QUALIFIER uif64() :

View File

@ -43,6 +43,24 @@ namespace detail
return f; return f;
} }
union uif32
{
GLM_FUNC_QUALIFIER uif32() :
i(0)
{}
GLM_FUNC_QUALIFIER uif32(float f) :
f(f)
{}
GLM_FUNC_QUALIFIER uif32(uint32 i) :
i(i)
{}
float f;
uint32 i;
};
GLM_FUNC_QUALIFIER float toFloat32(hdata value) GLM_FUNC_QUALIFIER float toFloat32(hdata value)
{ {
int s = (value >> 15) & 0x00000001; int s = (value >> 15) & 0x00000001;

View File

@ -10,7 +10,6 @@
//#include <boost/array.hpp> //#include <boost/array.hpp>
//#include <boost/date_time/posix_time/posix_time.hpp> //#include <boost/date_time/posix_time/posix_time.hpp>
//#include <boost/thread/thread.hpp> //#include <boost/thread/thread.hpp>
#include <glm/glm.hpp>
#include <glm/gtc/constants.hpp> #include <glm/gtc/constants.hpp>
#include <glm/gtc/epsilon.hpp> #include <glm/gtc/epsilon.hpp>
#include <cstdio> #include <cstdio>
@ -320,6 +319,57 @@ namespace test_mix
} }
}//namespace test_mix }//namespace test_mix
namespace test_step
{
template <typename EDGE, typename VEC>
struct test
{
EDGE edge;
VEC x;
VEC result;
};
test<float, glm::vec4> TestVec4Scalar [] =
{
{ 0.0f, glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(1.0f) },
{ 1.0f, glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(1.0f) },
{ 0.0f, glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f), glm::vec4(0.0f) }
};
test<glm::vec4, glm::vec4> TestVec4Vector [] =
{
{ glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f), glm::vec4(-2.0f, -3.0f, -4.0f, -5.0f), glm::vec4(0.0f) },
{ glm::vec4( 0.0f, 1.0f, 2.0f, 3.0f), glm::vec4( 1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(1.0f) },
{ glm::vec4( 2.0f, 3.0f, 4.0f, 5.0f), glm::vec4( 1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(0.0f) },
{ glm::vec4( 0.0f, 1.0f, 2.0f, 3.0f), glm::vec4(-1.0f,-2.0f,-3.0f,-4.0f), glm::vec4(0.0f) }
};
int run()
{
int Error = 0;
// vec4 and float
{
for (std::size_t i = 0; i < sizeof(TestVec4Scalar) / sizeof(test<float, glm::vec4>); ++i)
{
glm::vec4 Result = glm::step(TestVec4Scalar[i].edge, TestVec4Scalar[i].x);
Error += glm::all(glm::epsilonEqual(Result, TestVec4Scalar[i].result, glm::epsilon<float>())) ? 0 : 1;
}
}
// vec4 and vec4
{
for (std::size_t i = 0; i < sizeof(TestVec4Vector) / sizeof(test<glm::vec4, glm::vec4>); ++i)
{
glm::vec4 Result = glm::step(TestVec4Vector[i].edge, TestVec4Vector[i].x);
Error += glm::all(glm::epsilonEqual(Result, TestVec4Vector[i].result, glm::epsilon<float>())) ? 0 : 1;
}
}
return Error;
}
}//namespace test_step
int test_round() int test_round()
{ {
int Error = 0; int Error = 0;
@ -582,6 +632,7 @@ int main()
Error += test_modf(); Error += test_modf();
Error += test_floatBitsToInt(); Error += test_floatBitsToInt();
Error += test_floatBitsToUint(); Error += test_floatBitsToUint();
Error += test_step::run();
Error += test_mix::run(); Error += test_mix::run();
Error += test_round(); Error += test_round();
Error += test_roundEven(); Error += test_roundEven();

View File

@ -7,7 +7,7 @@
// File : test/core/func_geometric.cpp // File : test/core/func_geometric.cpp
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
#include <glm/glm.hpp> #include <glm/core/func_geometric.hpp>
#include <glm/gtc/epsilon.hpp> #include <glm/gtc/epsilon.hpp>
int test_reflect() int test_reflect()

View File

@ -7,7 +7,7 @@
// File : test/core/func_integer.cpp // File : test/core/func_integer.cpp
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
#include <glm/glm.hpp> #include <glm/core/func_integer.hpp>
#include <iostream> #include <iostream>
enum result enum result

View File

@ -7,7 +7,7 @@
// File : test/core/func_noise.cpp // File : test/core/func_noise.cpp
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
#include <glm/glm.hpp> #include <glm/core/func_noise.hpp>
int main() int main()
{ {

View File

@ -7,7 +7,7 @@
// File : test/core/func_packing.cpp // File : test/core/func_packing.cpp
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
#include <glm/glm.hpp> #include <glm/core/func_packing.hpp>
#include <glm/gtc/type_precision.hpp> #include <glm/gtc/type_precision.hpp>
#include <glm/gtc/epsilon.hpp> #include <glm/gtc/epsilon.hpp>
#include <vector> #include <vector>