diff options
| author | Marijn Tamis <[email protected]> | 2018-05-03 18:22:48 +0200 |
|---|---|---|
| committer | Marijn Tamis <[email protected]> | 2018-05-03 18:22:48 +0200 |
| commit | ca32c59a58d37c1822e185a2d5f3d0d3e8943593 (patch) | |
| tree | b06b9eec03f34344ef8fc31aa147b2714d3962ee /NvCloth/samples/external/assimp-4.1.0/code/ColladaLoader.h | |
| parent | Forced rename of platform folders in cmake dir. Git didn't pick this up before. (diff) | |
| download | nvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.tar.xz nvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.zip | |
NvCloth 1.1.4 Release. (24070740)
Diffstat (limited to 'NvCloth/samples/external/assimp-4.1.0/code/ColladaLoader.h')
| -rw-r--r-- | NvCloth/samples/external/assimp-4.1.0/code/ColladaLoader.h | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/NvCloth/samples/external/assimp-4.1.0/code/ColladaLoader.h b/NvCloth/samples/external/assimp-4.1.0/code/ColladaLoader.h new file mode 100644 index 0000000..8388ab0 --- /dev/null +++ b/NvCloth/samples/external/assimp-4.1.0/code/ColladaLoader.h @@ -0,0 +1,257 @@ +/** Defines the collada loader class */ + +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2017, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- +*/ + +#ifndef AI_COLLADALOADER_H_INC +#define AI_COLLADALOADER_H_INC + +#include "BaseImporter.h" +#include "ColladaParser.h" + +struct aiNode; +struct aiCamera; +struct aiLight; +struct aiTexture; +struct aiAnimation; + +namespace Assimp +{ + +struct ColladaMeshIndex +{ + std::string mMeshID; + size_t mSubMesh; + std::string mMaterial; + ColladaMeshIndex( const std::string& pMeshID, size_t pSubMesh, const std::string& pMaterial) + : mMeshID( pMeshID), mSubMesh( pSubMesh), mMaterial( pMaterial) + { } + + bool operator < (const ColladaMeshIndex& p) const + { + if( mMeshID == p.mMeshID) + { + if( mSubMesh == p.mSubMesh) + return mMaterial < p.mMaterial; + else + return mSubMesh < p.mSubMesh; + } else + { + return mMeshID < p.mMeshID; + } + } +}; + +/** Loader class to read Collada scenes. Collada is over-engineered to death, with every new iteration bringing + * more useless stuff, so I limited the data to what I think is useful for games. +*/ +class ColladaLoader : public BaseImporter +{ +public: + ColladaLoader(); + ~ColladaLoader(); + + +public: + /** Returns whether the class can handle the format of the given file. + * See BaseImporter::CanRead() for details. */ + bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const; + +protected: + /** Return importer meta information. + * See #BaseImporter::GetInfo for the details + */ + const aiImporterDesc* GetInfo () const; + + void SetupProperties(const Importer* pImp); + + /** Imports the given file into the given scene structure. + * See BaseImporter::InternReadFile() for details + */ + void InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler); + + /** Recursively constructs a scene node for the given parser node and returns it. */ + aiNode* BuildHierarchy( const ColladaParser& pParser, const Collada::Node* pNode); + + /** Resolve node instances */ + void ResolveNodeInstances( const ColladaParser& pParser, const Collada::Node* pNode, + std::vector<const Collada::Node*>& resolved); + + /** Builds meshes for the given node and references them */ + void BuildMeshesForNode( const ColladaParser& pParser, const Collada::Node* pNode, + aiNode* pTarget); + + aiMesh *findMesh(std::string meshid); + + /** Creates a mesh for the given ColladaMesh face subset and returns the newly created mesh */ + aiMesh* CreateMesh( const ColladaParser& pParser, const Collada::Mesh* pSrcMesh, const Collada::SubMesh& pSubMesh, + const Collada::Controller* pSrcController, size_t pStartVertex, size_t pStartFace); + + /** Builds cameras for the given node and references them */ + void BuildCamerasForNode( const ColladaParser& pParser, const Collada::Node* pNode, + aiNode* pTarget); + + /** Builds lights for the given node and references them */ + void BuildLightsForNode( const ColladaParser& pParser, const Collada::Node* pNode, + aiNode* pTarget); + + /** Stores all meshes in the given scene */ + void StoreSceneMeshes( aiScene* pScene); + + /** Stores all materials in the given scene */ + void StoreSceneMaterials( aiScene* pScene); + + /** Stores all lights in the given scene */ + void StoreSceneLights( aiScene* pScene); + + /** Stores all cameras in the given scene */ + void StoreSceneCameras( aiScene* pScene); + + /** Stores all textures in the given scene */ + void StoreSceneTextures( aiScene* pScene); + + /** Stores all animations + * @param pScene target scene to store the anims + */ + void StoreAnimations( aiScene* pScene, const ColladaParser& pParser); + + /** Stores all animations for the given source anim and its nested child animations + * @param pScene target scene to store the anims + * @param pSrcAnim the source animation to process + * @param pPrefix Prefix to the name in case of nested animations + */ + void StoreAnimations( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string& pPrefix); + + /** Constructs the animation for the given source anim */ + void CreateAnimation( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string& pName); + + /** Constructs materials from the collada material definitions */ + void BuildMaterials( ColladaParser& pParser, aiScene* pScene); + + /** Fill materials from the collada material definitions */ + void FillMaterials( const ColladaParser& pParser, aiScene* pScene); + + /** Resolve UV channel mappings*/ + void ApplyVertexToEffectSemanticMapping(Collada::Sampler& sampler, + const Collada::SemanticMappingTable& table); + + /** Add a texture and all of its sampling properties to a material*/ + void AddTexture ( aiMaterial& mat, const ColladaParser& pParser, + const Collada::Effect& effect, + const Collada::Sampler& sampler, + aiTextureType type, unsigned int idx = 0); + + /** Resolves the texture name for the given effect texture entry */ + aiString FindFilenameForEffectTexture( const ColladaParser& pParser, + const Collada::Effect& pEffect, const std::string& pName); + + /** Converts a path read from a collada file to the usual representation */ + void ConvertPath( aiString& ss); + + /** Reads a float value from an accessor and its data array. + * @param pAccessor The accessor to use for reading + * @param pData The data array to read from + * @param pIndex The index of the element to retrieve + * @param pOffset Offset into the element, for multipart elements such as vectors or matrices + * @return the specified value + */ + ai_real ReadFloat( const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex, size_t pOffset) const; + + /** Reads a string value from an accessor and its data array. + * @param pAccessor The accessor to use for reading + * @param pData The data array to read from + * @param pIndex The index of the element to retrieve + * @return the specified value + */ + const std::string& ReadString( const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex) const; + + /** Recursively collects all nodes into the given array */ + void CollectNodes( const aiNode* pNode, std::vector<const aiNode*>& poNodes) const; + + /** Finds a node in the collada scene by the given name */ + const Collada::Node* FindNode( const Collada::Node* pNode, const std::string& pName) const; + /** Finds a node in the collada scene by the given SID */ + const Collada::Node* FindNodeBySID( const Collada::Node* pNode, const std::string& pSID) const; + + /** Finds a proper name for a node derived from the collada-node's properties */ + std::string FindNameForNode( const Collada::Node* pNode); + +protected: + /** Filename, for a verbose error message */ + std::string mFileName; + + /** Which mesh-material compound was stored under which mesh ID */ + std::map<ColladaMeshIndex, size_t> mMeshIndexByID; + + /** Which material was stored under which index in the scene */ + std::map<std::string, size_t> mMaterialIndexByName; + + /** Accumulated meshes for the target scene */ + std::vector<aiMesh*> mMeshes; + + /** Accumulated morph target meshes */ + std::vector<aiMesh*> mTargetMeshes; + + /** Temporary material list */ + std::vector<std::pair<Collada::Effect*, aiMaterial*> > newMats; + + /** Temporary camera list */ + std::vector<aiCamera*> mCameras; + + /** Temporary light list */ + std::vector<aiLight*> mLights; + + /** Temporary texture list */ + std::vector<aiTexture*> mTextures; + + /** Accumulated animations for the target scene */ + std::vector<aiAnimation*> mAnims; + + bool noSkeletonMesh; + bool ignoreUpDirection; + + /** Used by FindNameForNode() to generate unique node names */ + unsigned int mNodeNameCounter; +}; + +} // end of namespace Assimp + +#endif // AI_COLLADALOADER_H_INC |