From 12070a1d5237a75570ce0de34057d4fd964615af Mon Sep 17 00:00:00 2001 From: ulfjorensen Date: Tue, 18 Aug 2009 16:17:27 +0000 Subject: [PATCH] Bugfix: made various internal structures namespace-local to avoid strange linker issues in case of name conflict git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@466 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- code/Assimp.cpp | 46 ++++++++++++++++++++---------------- code/BaseImporter.cpp | 44 ++++++++++++++++------------------ code/ColladaHelper.h | 17 +++++++++++++ code/ColladaLoader.cpp | 33 +++++++------------------- code/JoinVerticesProcess.cpp | 30 +++++++++++++---------- code/JoinVerticesProcess.h | 5 ++-- 6 files changed, 91 insertions(+), 84 deletions(-) diff --git a/code/Assimp.cpp b/code/Assimp.cpp index 0de80fcf3..10c9d9d08 100644 --- a/code/Assimp.cpp +++ b/code/Assimp.cpp @@ -55,34 +55,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif // ------------------------------------------------------------------------------------------------ using namespace Assimp; -/** Stores the importer objects for all active import processes */ -typedef std::map ImporterMap; -/** Stores the LogStream objects for all active C log streams */ -struct mpred { - bool operator () (const aiLogStream& s0, const aiLogStream& s1) const { - return s0.callback LogStreamMap; +namespace Assimp +{ + /** Stores the importer objects for all active import processes */ + typedef std::map ImporterMap; -/** Stores the LogStream objects allocated by #aiGetPredefinedLogStream */ -typedef std::list PredefLogStreamMap; + /** Stores the LogStream objects for all active C log streams */ + struct mpred { + bool operator () (const aiLogStream& s0, const aiLogStream& s1) const { + return s0.callback LogStreamMap; -/** Local storage of all active import processes */ -static ImporterMap gActiveImports; + /** Stores the LogStream objects allocated by #aiGetPredefinedLogStream */ + typedef std::list PredefLogStreamMap; -/** Local storage of all active log streams */ -static LogStreamMap gActiveLogStreams; + /** Local storage of all active import processes */ + static ImporterMap gActiveImports; -/** Local storage of LogStreams allocated by #aiGetPredefinedLogStream */ -static PredefLogStreamMap gPredefinedStreams; + /** Local storage of all active log streams */ + static LogStreamMap gActiveLogStreams; -/** Error message of the last failed import process */ -static std::string gLastErrorString; + /** Local storage of LogStreams allocated by #aiGetPredefinedLogStream */ + static PredefLogStreamMap gPredefinedStreams; -/** Verbose logging active or not? */ -static aiBool gVerboseLogging = false; + /** Error message of the last failed import process */ + static std::string gLastErrorString; + + /** Verbose logging active or not? */ + static aiBool gVerboseLogging = false; +} /** Configuration properties */ static ImporterPimpl::IntPropertyMap gIntProperties; diff --git a/code/BaseImporter.cpp b/code/BaseImporter.cpp index 6f850c948..56925531e 100644 --- a/code/BaseImporter.cpp +++ b/code/BaseImporter.cpp @@ -238,33 +238,31 @@ void BaseImporter::SetupProperties(const Importer* pImp) } // ------------------------------------------------------------------------------------------------ -// Represents an import request -struct LoadRequest +namespace Assimp { - LoadRequest(const std::string& _file, unsigned int _flags,const BatchLoader::PropertyMap* _map, unsigned int _id) - : file (_file) - , flags (_flags) - , refCnt (1) - , scene (NULL) - , loaded (false) - , id (_id) + // Represents an import request + struct LoadRequest { - if (_map) - map = *_map; - } + LoadRequest(const std::string& _file, unsigned int _flags,const BatchLoader::PropertyMap* _map, unsigned int _id) + : file(_file), flags(_flags), refCnt(1),scene(NULL), loaded(false), id(_id) + { + if (_map) + map = *_map; + } - const std::string file; - unsigned int flags; - unsigned int refCnt; - aiScene* scene; - bool loaded; - BatchLoader::PropertyMap map; - unsigned int id; + const std::string file; + unsigned int flags; + unsigned int refCnt; + aiScene* scene; + bool loaded; + BatchLoader::PropertyMap map; + unsigned int id; - bool operator== (const std::string& f) { - return file == f; - } -}; + bool operator== (const std::string& f) { + return file == f; + } + }; +} // ------------------------------------------------------------------------------------------------ // BatchLoader::pimpl data structure diff --git a/code/ColladaHelper.h b/code/ColladaHelper.h index 1d3485ea1..d5bee24fa 100644 --- a/code/ColladaHelper.h +++ b/code/ColladaHelper.h @@ -572,6 +572,23 @@ struct Animation } }; +/** Description of a collada animation channel which has been determined to affect the current node */ +struct ChannelEntry +{ + const Collada::AnimationChannel* mChannel; ///> the source channel + std::string mTransformId; // the ID of the transformation step of the node which is influenced + size_t mTransformIndex; // Index into the node's transform chain to apply the channel to + size_t mSubElement; // starting index inside the transform data + + // resolved data references + const Collada::Accessor* mTimeAccessor; ///> Collada accessor to the time values + const Collada::Data* mTimeData; ///> Source data array for the time values + const Collada::Accessor* mValueAccessor; ///> Collada accessor to the key value values + const Collada::Data* mValueData; ///> Source datat array for the key value values + + ChannelEntry() { mChannel = NULL; mSubElement = 0; } +}; + } // end of namespace Collada } // end of namespace Assimp diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 50e20ee9c..ffb1a3df4 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -796,23 +796,6 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars CreateAnimation( pScene, pParser, pSrcAnim, animName); } -/** Description of a collada animation channel which has been determined to affect the current node */ -struct ChannelEntry -{ - const Collada::AnimationChannel* mChannel; ///> the source channel - std::string mTransformId; // the ID of the transformation step of the node which is influenced - size_t mTransformIndex; // Index into the node's transform chain to apply the channel to - size_t mSubElement; // starting index inside the transform data - - // resolved data references - const Collada::Accessor* mTimeAccessor; ///> Collada accessor to the time values - const Collada::Data* mTimeData; ///> Source data array for the time values - const Collada::Accessor* mValueAccessor; ///> Collada accessor to the key value values - const Collada::Data* mValueData; ///> Source datat array for the key value values - - ChannelEntry() { mChannel = NULL; mSubElement = 0; } -}; - // ------------------------------------------------------------------------------------------------ // Constructs the animation for the given source anim void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string& pName) @@ -825,7 +808,7 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars for( std::vector::const_iterator nit = nodes.begin(); nit != nodes.end(); ++nit) { // find all the collada anim channels which refer to the current node - std::vector entries; + std::vector entries; std::string nodeName = (*nit)->mName.data; // find the collada node corresponding to the aiNode @@ -839,7 +822,7 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars cit != pSrcAnim->mChannels.end(); ++cit) { const Collada::AnimationChannel& srcChannel = *cit; - ChannelEntry entry; + Collada::ChannelEntry entry; // we except the animation target to be of type "nodeName/transformID.subElement". Ignore all others // find the slash that separates the node name - there should be only one @@ -897,9 +880,9 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars // resolve the data pointers for all anim channels. Find the minimum time while we're at it float startTime = 1e20f, endTime = -1e20f; - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) { - ChannelEntry& e = *it; + Collada::ChannelEntry& e = *it; e.mTimeAccessor = &pParser.ResolveLibraryReference( pParser.mAccessorLibrary, e.mChannel->mSourceTimes); e.mTimeData = &pParser.ResolveLibraryReference( pParser.mDataLibrary, e.mTimeAccessor->mSource); e.mValueAccessor = &pParser.ResolveLibraryReference( pParser.mAccessorLibrary, e.mChannel->mSourceValues); @@ -923,9 +906,9 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars std::vector resultTrafos; while( 1) { - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) { - ChannelEntry& e = *it; + Collada::ChannelEntry& e = *it; // find the keyframe behind the current point in time size_t pos = 0; @@ -973,9 +956,9 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars // find next point in time to evaluate. That's the closest frame larger than the current in any channel float nextTime = 1e20f; - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) { - ChannelEntry& e = *it; + Collada::ChannelEntry& e = *it; // find the next time value larger than the current size_t pos = 0; diff --git a/code/JoinVerticesProcess.cpp b/code/JoinVerticesProcess.cpp index 2814fa071..22f935ff3 100644 --- a/code/JoinVerticesProcess.cpp +++ b/code/JoinVerticesProcess.cpp @@ -51,15 +51,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -// Data structure to keep a vertex in an interlaced format -struct Vertex +namespace Assimp { - aiVector3D mPosition; - aiVector3D mNormal; - aiVector3D mTangent, mBitangent; - aiColor4D mColors [AI_MAX_NUMBER_OF_COLOR_SETS]; - aiVector3D mTexCoords [AI_MAX_NUMBER_OF_TEXTURECOORDS]; -}; + // Data structure to keep a vertex in an interlaced format + struct Vertex + { + aiVector3D mPosition; + aiVector3D mNormal; + aiVector3D mTangent, mBitangent; + aiColor4D mColors [AI_MAX_NUMBER_OF_COLOR_SETS]; + aiVector3D mTexCoords [AI_MAX_NUMBER_OF_TEXTURECOORDS]; + }; +} // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer @@ -97,15 +100,16 @@ void JoinVerticesProcess::Execute( aiScene* pScene) // execute the step int iNumVertices = 0; - for( unsigned int a = 0; a < pScene->mNumMeshes; a++) { + for( unsigned int a = 0; a < pScene->mNumMeshes; a++) iNumVertices += ProcessMesh( pScene->mMeshes[a],a); - } // if logging is active, print detailed statistics if (!DefaultLogger::isNullLogger()) { - if (iNumOldVertices == iNumVertices)DefaultLogger::get()->debug("JoinVerticesProcess finished "); - else + if (iNumOldVertices == iNumVertices) + { + DefaultLogger::get()->debug("JoinVerticesProcess finished "); + } else { char szBuff[128]; // should be sufficiently large in every case sprintf(szBuff,"JoinVerticesProcess finished | Verts in: %i out: %i | ~%.1f%%", @@ -413,4 +417,4 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) return pMesh->mNumVertices; } -#endif // !! ASSIMP_BUILD_NO_JOINVERTICES_PROCESS \ No newline at end of file +#endif // !! ASSIMP_BUILD_NO_JOINVERTICES_PROCESS diff --git a/code/JoinVerticesProcess.h b/code/JoinVerticesProcess.h index 5bb73babe..cb8ee9fa6 100644 --- a/code/JoinVerticesProcess.h +++ b/code/JoinVerticesProcess.h @@ -47,11 +47,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../include/aiTypes.h" struct aiMesh; -class JoinVerticesTest; namespace Assimp { +class JoinVerticesTest; + // --------------------------------------------------------------------------- /** The JoinVerticesProcess unites identical vertices in all imported meshes. * By default the importer returns meshes where each face addressed its own @@ -63,7 +64,7 @@ namespace Assimp class ASSIMP_API JoinVerticesProcess : public BaseProcess { friend class Importer; - friend class ::JoinVerticesTest; + friend class JoinVerticesTest; protected: /** Constructor to be privately used by Importer */