From 2f7e3dcdcc082d01b0409affae6f6f36b54a1ada Mon Sep 17 00:00:00 2001 From: Chris Russ Date: Fri, 15 Jul 2016 12:53:49 +1000 Subject: [PATCH] Basic changes to introduce optional double precision --- code/Importer.h | 2 +- code/SceneCombiner.cpp | 5 ++- code/SpatialSort.cpp | 23 ++++++------- code/SpatialSort.h | 8 ++--- code/Vertex.h | 68 ++++++++++++++++++------------------- code/qnan.h | 55 ++++++++++++++++++++++++++---- include/assimp/Exporter.hpp | 8 ++--- include/assimp/anim.h | 12 +++---- include/assimp/color4.h | 5 +-- include/assimp/defs.h | 15 +++++--- include/assimp/material.h | 7 ++-- include/assimp/matrix3x3.h | 9 ++--- include/assimp/matrix4x4.h | 11 +++--- include/assimp/metadata.h | 11 +++--- include/assimp/quaternion.h | 6 ++-- include/assimp/types.h | 18 +++++----- include/assimp/vector2.h | 5 +-- include/assimp/vector3.h | 5 +-- 18 files changed, 167 insertions(+), 106 deletions(-) diff --git a/code/Importer.h b/code/Importer.h index 750b9bbbd..a35fb80d9 100644 --- a/code/Importer.h +++ b/code/Importer.h @@ -75,7 +75,7 @@ public: // typedefs for our four configuration maps. // We don't need more, so there is no need for a generic solution typedef std::map IntPropertyMap; - typedef std::map FloatPropertyMap; + typedef std::map FloatPropertyMap; typedef std::map StringPropertyMap; typedef std::map MatrixPropertyMap; diff --git a/code/SceneCombiner.cpp b/code/SceneCombiner.cpp index b39adbf78..51541a34b 100644 --- a/code/SceneCombiner.cpp +++ b/code/SceneCombiner.cpp @@ -1132,7 +1132,7 @@ void SceneCombiner::Copy( aiAnimation** _dest, const aiAnimation* src ) { ai_assert( NULL != _dest ); ai_assert( NULL != src ); - + aiAnimation* dest = *_dest = new aiAnimation(); // get a flat copy @@ -1246,6 +1246,9 @@ void SceneCombiner::Copy (aiMetadata** _dest, const aiMetadata* src) case AI_FLOAT: out.mData = new float(*static_cast(in.mData)); break; + case AI_DOUBLE: + out.mData = new double(*static_cast(in.mData)); + break; case AI_AISTRING: out.mData = new aiString(*static_cast(in.mData)); break; diff --git a/code/SpatialSort.cpp b/code/SpatialSort.cpp index c4e4ef2d5..ca6055e84 100644 --- a/code/SpatialSort.cpp +++ b/code/SpatialSort.cpp @@ -107,7 +107,7 @@ void SpatialSort::Append( const aiVector3D* pPositions, unsigned int pNumPositio const aiVector3D* vec = reinterpret_cast (tempPointer + a * pElementOffset); // store position by index and distance - float distance = *vec * mPlaneNormal; + ai_real distance = *vec * mPlaneNormal; mPositions.push_back( Entry( a+initial, *vec, distance)); } @@ -120,10 +120,10 @@ void SpatialSort::Append( const aiVector3D* pPositions, unsigned int pNumPositio // ------------------------------------------------------------------------------------------------ // Returns an iterator for all positions close to the given position. void SpatialSort::FindPositions( const aiVector3D& pPosition, - float pRadius, std::vector& poResults) const + ai_real pRadius, std::vector& poResults) const { - const float dist = pPosition * mPlaneNormal; - const float minDist = dist - pRadius, maxDist = dist + pRadius; + const ai_real dist = pPosition * mPlaneNormal; + const ai_real minDist = dist - pRadius, maxDist = dist + pRadius; // clear the array in this strange fashion because a simple clear() would also deallocate // the array which we want to avoid @@ -160,7 +160,7 @@ void SpatialSort::FindPositions( const aiVector3D& pPosition, // Mow start iterating from there until the first position lays outside of the distance range. // Add all positions inside the distance range within the given radius to the result aray std::vector::const_iterator it = mPositions.begin() + index; - const float pSquared = pRadius*pRadius; + const ai_real pSquared = pRadius*pRadius; while( it->mDistance < maxDist) { if( (it->mPosition - pPosition).SquareLength() < pSquared) @@ -186,19 +186,19 @@ namespace { // -------------------------------------------------------------------------------------------- // Converts the bit pattern of a floating-point number to its signed integer representation. - BinFloat ToBinary( const float & pValue) { + BinFloat ToBinary( const ai_real & pValue) { // If this assertion fails, signed int is not big enough to store a float on your platform. // Please correct the declaration of BinFloat a few lines above - but do it in a portable, // #ifdef'd manner! - static_assert( sizeof(BinFloat) >= sizeof(float), "sizeof(BinFloat) >= sizeof(float)"); + static_assert( sizeof(BinFloat) >= sizeof(ai_real), "sizeof(BinFloat) >= sizeof(ai_real)"); #if defined( _MSC_VER) // If this assertion fails, Visual C++ has finally moved to ILP64. This means that this // code has just become legacy code! Find out the current value of _MSC_VER and modify // the #if above so it evaluates false on the current and all upcoming VC versions (or // on the current platform, if LP64 or LLP64 are still used on other platforms). - static_assert( sizeof(BinFloat) == sizeof(float), "sizeof(BinFloat) == sizeof(float)"); + static_assert( sizeof(BinFloat) == sizeof(ai_real), "sizeof(BinFloat) == sizeof(ai_real)"); // This works best on Visual C++, but other compilers have their problems with it. const BinFloat binValue = reinterpret_cast(pValue); @@ -206,7 +206,7 @@ namespace { // On many compilers, reinterpreting a float address as an integer causes aliasing // problems. This is an ugly but more or less safe way of doing it. union { - float asFloat; + ai_real asFloat; BinFloat asBin; } conversion; conversion.asBin = 0; // zero empty space in case sizeof(BinFloat) > sizeof(float) @@ -311,10 +311,10 @@ void SpatialSort::FindIdenticalPositions( const aiVector3D& pPosition, unsigned int SpatialSort::GenerateMappingTable(std::vector& fill,float pRadius) const { fill.resize(mPositions.size(),UINT_MAX); - float dist, maxDist; + ai_real dist, maxDist; unsigned int t=0; - const float pSquared = pRadius*pRadius; + const ai_real pSquared = pRadius*pRadius; for (size_t i = 0; i < mPositions.size();) { dist = mPositions[i].mPosition * mPlaneNormal; maxDist = dist + pRadius; @@ -339,4 +339,3 @@ unsigned int SpatialSort::GenerateMappingTable(std::vector& fill,f #endif return t; } - diff --git a/code/SpatialSort.h b/code/SpatialSort.h index b594fc6d1..367e0f6a6 100644 --- a/code/SpatialSort.h +++ b/code/SpatialSort.h @@ -117,7 +117,7 @@ public: * @param poResults The container to store the indices of the found positions. * Will be emptied by the call so it may contain anything. * @return An iterator to iterate over all vertices in the given area.*/ - void FindPositions( const aiVector3D& pPosition, float pRadius, + void FindPositions( const aiVector3D& pPosition, ai_real pRadius, std::vector& poResults) const; // ------------------------------------------------------------------------------------ @@ -139,7 +139,7 @@ public: * be counted in. * @return Number of unique vertices (n). */ unsigned int GenerateMappingTable(std::vector& fill, - float pRadius) const; + ai_real pRadius) const; protected: /** Normal of the sorting plane, normalized. The center is always at (0, 0, 0) */ @@ -151,10 +151,10 @@ protected: { unsigned int mIndex; ///< The vertex referred by this entry aiVector3D mPosition; ///< Position - float mDistance; ///< Distance of this vertex to the sorting plane + ai_real mDistance; ///< Distance of this vertex to the sorting plane Entry() { /** intentionally not initialized.*/ } - Entry( unsigned int pIndex, const aiVector3D& pPosition, float pDistance) + Entry( unsigned int pIndex, const aiVector3D& pPosition, ai_real pDistance) : mIndex( pIndex), mPosition( pPosition), mDistance( pDistance) { } diff --git a/code/Vertex.h b/code/Vertex.h index 5e2cf6986..88840eab7 100644 --- a/code/Vertex.h +++ b/code/Vertex.h @@ -94,15 +94,15 @@ class Vertex friend Vertex operator + (const Vertex&,const Vertex&); friend Vertex operator - (const Vertex&,const Vertex&); -// friend Vertex operator + (const Vertex&,float); -// friend Vertex operator - (const Vertex&,float); - friend Vertex operator * (const Vertex&,float); - friend Vertex operator / (const Vertex&,float); +// friend Vertex operator + (const Vertex&,ai_real); +// friend Vertex operator - (const Vertex&,ai_real); + friend Vertex operator * (const Vertex&,ai_real); + friend Vertex operator / (const Vertex&,ai_real); -// friend Vertex operator + (float, const Vertex&); -// friend Vertex operator - (float, const Vertex&); - friend Vertex operator * (float, const Vertex&); -// friend Vertex operator / (float, const Vertex&); +// friend Vertex operator + (ai_real, const Vertex&); +// friend Vertex operator - (ai_real, const Vertex&); + friend Vertex operator * (ai_real, const Vertex&); +// friend Vertex operator / (ai_real, const Vertex&); public: @@ -146,22 +146,22 @@ public: /* - Vertex& operator += (float v) { + Vertex& operator += (ai_real v) { *this = *this+v; return *this; } - Vertex& operator -= (float v) { + Vertex& operator -= (ai_real v) { *this = *this-v; return *this; } */ - Vertex& operator *= (float v) { + Vertex& operator *= (ai_real v) { *this = *this*v; return *this; } - Vertex& operator /= (float v) { + Vertex& operator /= (ai_real v) { *this = *this/v; return *this; } @@ -217,40 +217,40 @@ private: // ---------------------------------------------------------------------------- /** This time binary arithmetics of v0 with a floating-point number */ - template