From faea2eccccf20b4115227268ace599dd00c59574 Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Sun, 10 May 2015 23:50:18 +0200 Subject: [PATCH 01/32] OBJ: Support spaces in material names, fixes #545. Adding test file. --- code/ObjFileMtlImporter.cpp | 23 ++++--- code/ObjFileParser.cpp | 2 +- test/models/OBJ/space_in_material_name.mtl | 13 ++++ test/models/OBJ/space_in_material_name.obj | 77 ++++++++++++++++++++++ 4 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 test/models/OBJ/space_in_material_name.mtl create mode 100644 test/models/OBJ/space_in_material_name.obj diff --git a/code/ObjFileMtlImporter.cpp b/code/ObjFileMtlImporter.cpp index 80d0416d3..244027036 100644 --- a/code/ObjFileMtlImporter.cpp +++ b/code/ObjFileMtlImporter.cpp @@ -263,16 +263,21 @@ void ObjFileMtlImporter::createMaterial() } std::vector token; - const unsigned int numToken = tokenize( line, token, " " ); - std::string name( "" ); - if ( numToken == 1 ) { - name = AI_DEFAULT_MATERIAL_NAME; - } else { - name = token[ 1 ]; - } + const unsigned int numToken = tokenize( line, token, " \t" ); + std::string name( "" ); + if ( numToken == 1 ) { + name = AI_DEFAULT_MATERIAL_NAME; + } else { + // skip newmtl and all following white spaces + std::size_t first_ws_pos = line.find_first_of(" \t"); + std::size_t first_non_ws_pos = line.find_first_not_of(" \t", first_ws_pos); + if (first_non_ws_pos != std::string::npos) { + name = line.substr(first_non_ws_pos); + } + } - std::map::iterator it = m_pModel->m_MaterialMap.find( name ); - if ( m_pModel->m_MaterialMap.end() == it) { + std::map::iterator it = m_pModel->m_MaterialMap.find( name ); + if ( m_pModel->m_MaterialMap.end() == it) { // New Material created m_pModel->m_pCurrentMaterial = new ObjFile::Material(); m_pModel->m_pCurrentMaterial->MaterialName.Set( name ); diff --git a/code/ObjFileParser.cpp b/code/ObjFileParser.cpp index 9c5982861..a185ff249 100644 --- a/code/ObjFileParser.cpp +++ b/code/ObjFileParser.cpp @@ -469,7 +469,7 @@ void ObjFileParser::getMaterialDesc() return; char *pStart = &(*m_DataIt); - while( m_DataIt != m_DataItEnd && !IsSpaceOrNewLine( *m_DataIt ) ) { + while( m_DataIt != m_DataItEnd && !IsLineEnd( *m_DataIt ) ) { ++m_DataIt; } diff --git a/test/models/OBJ/space_in_material_name.mtl b/test/models/OBJ/space_in_material_name.mtl new file mode 100644 index 000000000..2f210fd48 --- /dev/null +++ b/test/models/OBJ/space_in_material_name.mtl @@ -0,0 +1,13 @@ + +# Example for github issue #545: spaces in material names. + +newmtl Hard Shiny Plastic White +Ka 0 0 0 +Kd 0.141176 0.184314 0.411765 +Ks 0 0 0 +Ni 1 +Ns 400 +Tf 1 1 1 +d 1 + + diff --git a/test/models/OBJ/space_in_material_name.obj b/test/models/OBJ/space_in_material_name.obj new file mode 100644 index 000000000..d5824e113 --- /dev/null +++ b/test/models/OBJ/space_in_material_name.obj @@ -0,0 +1,77 @@ +#### +# +# OBJ File Generated by LightWave3D +# LightWave3D OBJ Export v2.3 +# +#### +o concave_test.obj +mtllib space_in_material_name.mtl +g default +v -1.146 1.6575 2.348 +v -1.146 1.67177 2.49285 +v -1.146 1.67177 2.20315 +v -1.146 1.7125 2.35 +v -1.146 1.71402 2.63214 +v -1.146 1.71402 2.06386 +v -1.146 1.72571 2.48412 +v -1.146 1.72571 2.21588 +v -1.146 1.76483 2.61309 +v -1.146 1.76483 2.08691 +v -1.146 1.78263 2.76051 +v -1.146 1.78263 1.93549 +v -1.146 1.82836 2.73195 +v -1.146 1.82836 1.96805 +v -1.146 1.87497 2.87303 +v -1.146 1.87497 1.82297 +v -1.146 1.91386 2.83614 +v -1.146 1.91386 1.86386 +v -1.146 1.98749 2.96537 +v -1.146 1.98749 1.73063 +v -1.146 2.01805 2.92164 +v -1.146 2.01805 1.77836 +v -1.146 2.11586 3.03398 +v -1.146 2.11586 1.66202 +v -1.146 2.13691 2.98517 +v -1.146 2.13691 1.71483 +v -1.146 2.25515 3.07623 +v -1.146 2.25515 1.61977 +v -1.146 2.26588 3.02429 +v -1.146 2.26588 1.67571 +v -1.146 2.4 3.0905 +v -1.146 2.4 3.0375 +v -1.146 2.4 1.6625 +v -1.146 2.4 1.6055 +v -1.146 2.53412 3.02429 +v -1.146 2.53412 1.67571 +v -1.146 2.54485 3.07623 +v -1.146 2.54485 1.61977 +v -1.146 2.66309 2.98517 +v -1.146 2.66309 1.71483 +v -1.146 2.68414 3.03398 +v -1.146 2.68414 1.66202 +v -1.146 2.78195 2.92164 +v -1.146 2.78195 1.77836 +v -1.146 2.81251 2.96537 +v -1.146 2.81251 1.73063 +v -1.146 2.88614 2.83614 +v -1.146 2.88614 1.86386 +v -1.146 2.92503 2.87303 +v -1.146 2.92503 1.82297 +v -1.146 2.97164 2.73195 +v -1.146 2.97164 1.96805 +v -1.146 3.01737 2.76051 +v -1.146 3.01737 1.93549 +v -1.146 3.03517 2.61309 +v -1.146 3.03517 2.08691 +v -1.146 3.07429 2.48412 +v -1.146 3.07429 2.21588 +v -1.146 3.08598 2.63214 +v -1.146 3.08598 2.06386 +v -1.146 3.0875 2.35 +v -1.146 3.12823 2.49285 +v -1.146 3.12823 2.20315 +v -1.146 3.1425 2.348 +vn 1 0 -0 +usemtl Hard Shiny Plastic White +s 1 +f 27//1 23//1 19//1 15//1 11//1 5//1 2//1 1//1 3//1 6//1 12//1 16//1 20//1 24//1 28//1 34//1 38//1 42//1 46//1 50//1 54//1 60//1 63//1 64//1 62//1 59//1 53//1 49//1 45//1 41//1 37//1 31//1 32//1 35//1 39//1 43//1 47//1 51//1 55//1 57//1 61//1 58//1 56//1 52//1 48//1 44//1 40//1 36//1 33//1 30//1 26//1 22//1 18//1 14//1 10//1 8//1 4//1 7//1 9//1 13//1 17//1 21//1 25//1 29//1 32//1 31//1 From 7771ce5db2ca6b7dad4a5755a76674a1e7d5b58a Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Tue, 12 May 2015 20:59:54 +0200 Subject: [PATCH 02/32] Update regression db. --- test/regression/db.zip | Bin 1467844 -> 1470745 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/regression/db.zip b/test/regression/db.zip index d1a4edf7632a5d765696128f191a10855771b876..ee68fc8cdf83b5c3975770a8dafe257fe206e332 100644 GIT binary patch delta 130159 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%0AIn<0EJi9-Y`OWgWt4Z{D-$~ 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 GfBhe=xZvvm delta 127121 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%0A+1q$&TLK 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

xuS@50GTDtJdvCsM`r96^?i}PJ!MQ1~y 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 ViFz4tpL~0HQo#bH9+ktt{tv2v4zmCN From 0fe8e739c3fcfbf690821145498e9bbaeb24a519 Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Tue, 12 May 2015 21:51:27 +0200 Subject: [PATCH 03/32] Use "wb" when writing binary STL exports, fixes #556. --- code/STLExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/STLExporter.cpp b/code/STLExporter.cpp index 1bc631ef7..13684fecc 100644 --- a/code/STLExporter.cpp +++ b/code/STLExporter.cpp @@ -75,7 +75,7 @@ void ExportSceneSTLBinary(const char* pFile,IOSystem* pIOSystem, const aiScene* STLExporter exporter(pFile, pScene, true); // we're still here - export successfully completed. Write the file. - boost::scoped_ptr outfile (pIOSystem->Open(pFile,"wt")); + boost::scoped_ptr outfile (pIOSystem->Open(pFile,"wb")); if(outfile == NULL) { throw DeadlyExportError("could not open output .stl file: " + std::string(pFile)); } From af54bf4c423a591b90be1af32b55036f6c9dd939 Mon Sep 17 00:00:00 2001 From: wise86Android Date: Sat, 16 May 2015 12:28:49 +0200 Subject: [PATCH 04/32] test fail, fix file path --- test/unit/utImporter.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index c7094229a..164c51bff 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -1,7 +1,7 @@ #include "UnitTestPCH.h" - + #include "../../include/assimp/postprocess.h" -#include "../../include/assimp/scene.h" +#include "../../include/assimp/scene.h" #include #include @@ -219,13 +219,13 @@ TEST_F(ImporterTest, testMultipleReads) aiProcess_OptimizeMeshes | aiProcess_OptimizeGraph; - EXPECT_TRUE(pImp->ReadFile("../../test/models/X/test.x",flags)); + EXPECT_TRUE(pImp->ReadFile("../test/models/X/test.x",flags)); //EXPECT_TRUE(pImp->ReadFile("../../test/models/X/dwarf.x",flags)); # is in nonbsd - EXPECT_TRUE(pImp->ReadFile("../../test/models/X/Testwuson.X",flags)); - EXPECT_TRUE(pImp->ReadFile("../../test/models/X/anim_test.x",flags)); + EXPECT_TRUE(pImp->ReadFile("../test/models/X/Testwuson.X",flags)); + EXPECT_TRUE(pImp->ReadFile("../test/models/X/anim_test.x",flags)); //EXPECT_TRUE(pImp->ReadFile("../../test/models/X/dwarf.x",flags)); # is in nonbsd - EXPECT_TRUE(pImp->ReadFile("../../test/models/X/anim_test.x",flags)); - EXPECT_TRUE(pImp->ReadFile("../../test/models/X/BCN_Epileptic.X",flags)); + EXPECT_TRUE(pImp->ReadFile("../test/models/X/anim_test.x",flags)); + EXPECT_TRUE(pImp->ReadFile("../test/models/X/BCN_Epileptic.X",flags)); //EXPECT_TRUE(pImp->ReadFile("../../test/models/X/dwarf.x",flags)); # is in nonbsd } From 98b234020b45ee7adbd09e41b52d75ce1f01fd39 Mon Sep 17 00:00:00 2001 From: shin_mbpr_late2013 Date: Sat, 16 May 2015 23:27:55 +0900 Subject: [PATCH 05/32] Fixed AssBin loader. File reads were used in ai_assert. The function has side effects, so it should not be used in an assert. Fixed AddGTest.cmake. There was an issue regarding Xcode project file. The path of libgtest.a was incorrectly set. --- cmake-modules/AddGTest.cmake | 4 ++-- code/AssbinLoader.cpp | 37 +++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/cmake-modules/AddGTest.cmake b/cmake-modules/AddGTest.cmake index 5257148c9..c106cc303 100644 --- a/cmake-modules/AddGTest.cmake +++ b/cmake-modules/AddGTest.cmake @@ -11,8 +11,8 @@ if (MSVC) set(RELEASE_LIB_DIR ReleaseLibs) set(DEBUG_LIB_DIR DebugLibs) else() - set(RELEASE_LIB_DIR "") - set(DEBUG_LIB_DIR "") + set(RELEASE_LIB_DIR "Release") + set(DEBUG_LIB_DIR "Debug") endif() set(GTEST_CMAKE_ARGS diff --git a/code/AssbinLoader.cpp b/code/AssbinLoader.cpp index 6818929fb..8788adbd7 100644 --- a/code/AssbinLoader.cpp +++ b/code/AssbinLoader.cpp @@ -51,8 +51,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "AssbinLoader.h" #include "assbin_chunks.h" #include "MemoryIOWrapper.h" -#include "../include/assimp/mesh.h" -#include "../include/assimp/anim.h" +#include "../include/assimp/mesh.h" +#include "../include/assimp/anim.h" #include "../include/assimp/scene.h" #include @@ -199,7 +199,8 @@ template void ReadBounds( IOStream * stream, T* /*p*/, unsigned int void AssbinImporter::ReadBinaryNode( IOStream * stream, aiNode** node ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AINODE); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AINODE); /*uint32_t size =*/ Read(stream); *node = new aiNode(); @@ -230,7 +231,8 @@ void AssbinImporter::ReadBinaryNode( IOStream * stream, aiNode** node ) // ----------------------------------------------------------------------------------- void AssbinImporter::ReadBinaryBone( IOStream * stream, aiBone* b ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AIBONE ); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AIBONE); /*uint32_t size =*/ Read(stream); b->mName = Read(stream); @@ -253,7 +255,8 @@ void AssbinImporter::ReadBinaryBone( IOStream * stream, aiBone* b ) void AssbinImporter::ReadBinaryMesh( IOStream * stream, aiMesh* mesh ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AIMESH); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AIMESH); /*uint32_t size =*/ Read(stream); mesh->mPrimitiveTypes = Read(stream); @@ -377,7 +380,8 @@ void AssbinImporter::ReadBinaryMesh( IOStream * stream, aiMesh* mesh ) void AssbinImporter::ReadBinaryMaterialProperty(IOStream * stream, aiMaterialProperty* prop) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AIMATERIALPROPERTY); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AIMATERIALPROPERTY); /*uint32_t size =*/ Read(stream); prop->mKey = Read(stream); @@ -393,7 +397,8 @@ void AssbinImporter::ReadBinaryMaterialProperty(IOStream * stream, aiMaterialPro // ----------------------------------------------------------------------------------- void AssbinImporter::ReadBinaryMaterial(IOStream * stream, aiMaterial* mat) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AIMATERIAL); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AIMATERIAL); /*uint32_t size =*/ Read(stream); mat->mNumAllocated = mat->mNumProperties = Read(stream); @@ -414,7 +419,8 @@ void AssbinImporter::ReadBinaryMaterial(IOStream * stream, aiMaterial* mat) // ----------------------------------------------------------------------------------- void AssbinImporter::ReadBinaryNodeAnim(IOStream * stream, aiNodeAnim* nd) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AINODEANIM); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AINODEANIM); /*uint32_t size =*/ Read(stream); nd->mNodeName = Read(stream); @@ -462,7 +468,8 @@ void AssbinImporter::ReadBinaryNodeAnim(IOStream * stream, aiNodeAnim* nd) // ----------------------------------------------------------------------------------- void AssbinImporter::ReadBinaryAnim( IOStream * stream, aiAnimation* anim ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AIANIMATION); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AIANIMATION); /*uint32_t size =*/ Read(stream); anim->mName = Read (stream); @@ -482,7 +489,8 @@ void AssbinImporter::ReadBinaryAnim( IOStream * stream, aiAnimation* anim ) void AssbinImporter::ReadBinaryTexture(IOStream * stream, aiTexture* tex) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AITEXTURE); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AITEXTURE); /*uint32_t size =*/ Read(stream); tex->mWidth = Read(stream); @@ -505,7 +513,8 @@ void AssbinImporter::ReadBinaryTexture(IOStream * stream, aiTexture* tex) // ----------------------------------------------------------------------------------- void AssbinImporter::ReadBinaryLight( IOStream * stream, aiLight* l ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AILIGHT); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AILIGHT); /*uint32_t size =*/ Read(stream); l->mName = Read(stream); @@ -531,7 +540,8 @@ void AssbinImporter::ReadBinaryLight( IOStream * stream, aiLight* l ) // ----------------------------------------------------------------------------------- void AssbinImporter::ReadBinaryCamera( IOStream * stream, aiCamera* cam ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AICAMERA); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AICAMERA); /*uint32_t size =*/ Read(stream); cam->mName = Read(stream); @@ -546,7 +556,8 @@ void AssbinImporter::ReadBinaryCamera( IOStream * stream, aiCamera* cam ) void AssbinImporter::ReadBinaryScene( IOStream * stream, aiScene* scene ) { - ai_assert( Read(stream) == ASSBIN_CHUNK_AISCENE); + uint32_t chunkID = Read(stream); + ai_assert(chunkID == ASSBIN_CHUNK_AISCENE); /*uint32_t size =*/ Read(stream); scene->mFlags = Read(stream); From 6c01bcff538a72261a900c91fea0fd07bb0f2217 Mon Sep 17 00:00:00 2001 From: shin_mbpr_late2013 Date: Sun, 17 May 2015 00:36:19 +0900 Subject: [PATCH 06/32] Reverted AddGTest.cmake. Changes to the file caused CI build broken. --- cmake-modules/AddGTest.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake-modules/AddGTest.cmake b/cmake-modules/AddGTest.cmake index c106cc303..5257148c9 100644 --- a/cmake-modules/AddGTest.cmake +++ b/cmake-modules/AddGTest.cmake @@ -11,8 +11,8 @@ if (MSVC) set(RELEASE_LIB_DIR ReleaseLibs) set(DEBUG_LIB_DIR DebugLibs) else() - set(RELEASE_LIB_DIR "Release") - set(DEBUG_LIB_DIR "Debug") + set(RELEASE_LIB_DIR "") + set(DEBUG_LIB_DIR "") endif() set(GTEST_CMAKE_ARGS From fb4eb83e84119ab42bae5ad2ad6c7430868fcc0a Mon Sep 17 00:00:00 2001 From: wise86Android Date: Sun, 17 May 2015 20:54:45 +0200 Subject: [PATCH 07/32] add the ability to export cameras information in a collada file --- code/ColladaExporter.cpp | 64 +++++++++++++++++++++-- code/ColladaExporter.h | 5 ++ test/CMakeLists.txt | 1 + test/models/Collada/cameras.dae | 93 +++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 test/models/Collada/cameras.dae diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index 078ac0a56..c5d904c07 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -127,6 +127,7 @@ void ColladaExporter::WriteFile() WriteTextures(); WriteHeader(); + WriteCamerasLibrary(); WriteMaterials(); WriteGeometryLibrary(); @@ -286,6 +287,61 @@ void ColladaExporter::WriteTextures() { } } +// ------------------------------------------------------------------------------------------------ +// Write the embedded textures +void ColladaExporter::WriteCamerasLibrary() { + if(mScene->HasCameras()) { + + mOutput << startstr << "" << endstr; + PushTag(); + + for( size_t a = 0; a < mScene->mNumCameras; ++a) + WriteCamera( a); + + PopTag(); + mOutput << startstr << "" << endstr; + + } +} + +void ColladaExporter::WriteCamera(size_t pIndex){ + + const aiCamera *cam = mScene->mCameras[pIndex]; + const std::string idstrEscaped = XMLEscape(cam->mName.C_Str()); + + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << endstr; + PushTag(); + //assimp doesn't support the import of orthographic cameras! se we write + //always perspective + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << ""<< + AI_RAD_TO_DEG(cam->mHorizontalFOV) + <<"" << endstr; + mOutput << startstr << "" + << cam->mAspect + << "" << endstr; + mOutput << startstr << "" + << cam->mClipPlaneNear + << "" << endstr; + mOutput << startstr << "" + << cam->mClipPlaneFar + << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + PopTag(); + mOutput << startstr << "" << endstr; + +} + // ------------------------------------------------------------------------------------------------ // Reads a single surface entry from the given material keys void ColladaExporter::ReadMaterialSurface( Surface& poSurface, const aiMaterial* pSrcMat, aiTextureType pTexture, const char* pKey, size_t pType, size_t pIndex) @@ -847,6 +903,9 @@ void ColladaExporter::WriteNode(aiNode* pNode) mOutput << mat.d1 << " " << mat.d2 << " " << mat.d3 << " " << mat.d4; mOutput << "" << endstr; + if(pNode->mNumMeshes==0){ + mOutput << startstr <<"" << endstr; + }else // instance every geometry for( size_t a = 0; a < pNode->mNumMeshes; ++a ) { @@ -854,9 +913,8 @@ void ColladaExporter::WriteNode(aiNode* pNode) // do not instanciate mesh if empty. I wonder how this could happen if( mesh->mNumFaces == 0 || mesh->mNumVertices == 0 ) continue; - - mOutput << startstr << "mMeshes[a])) << "\">" << endstr; - PushTag(); + mOutput << startstr << "mMeshes[a])) << "\">" << endstr; + PushTag(); mOutput << startstr << "" << endstr; PushTag(); mOutput << startstr << "" << endstr; diff --git a/code/ColladaExporter.h b/code/ColladaExporter.h index 9456508ce..4ded0d13d 100644 --- a/code/ColladaExporter.h +++ b/code/ColladaExporter.h @@ -83,6 +83,11 @@ protected: /// Writes the material setup void WriteMaterials(); + /// Writes the cameras library + void WriteCamerasLibrary(); + + void WriteCamera(size_t pIndex); + /// Writes the geometry library void WriteGeometryLibrary(); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f4b67bad6..9053f66d8 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -40,6 +40,7 @@ SET( TEST_SRCS unit/utTriangulate.cpp unit/utVertexTriangleAdjacency.cpp unit/utNoBoostTest.cpp + unit/utColladaExportCamera.cpp ) SOURCE_GROUP( tests FILES ${TEST_SRCS} ) diff --git a/test/models/Collada/cameras.dae b/test/models/Collada/cameras.dae new file mode 100644 index 000000000..d514b0f3d --- /dev/null +++ b/test/models/Collada/cameras.dae @@ -0,0 +1,93 @@ + + + + + Blender User + Blender 2.74.0 commit date:2015-03-31, commit time:13:39, hash:000dfc0 + + 2015-05-17T19:24:51 + 2015-05-17T19:24:51 + + Z_UP + + + + + + + 49.13434 + 1.777778 + 0.1 + 100 + + + + + + 0 + 0 + 0 + + + + + + + + 3 + 1.777778 + 0.1 + 100 + + + + + + 0 + 0 + 0 + + + + + + + + 29.86284 + 1.777778 + 0.1 + 50 + + + + + + 0 + 0 + 0 + + + + + + + + + + 7.54979e-8 0 1 10 0 1 0 0 -1 0 7.54979e-8 0 0 0 0 1 + + + + 7.54979e-8 0 -1 -10 0 1 0 0 1 0 7.54979e-8 0 0 0 0 1 + + + + 3.09086e-8 -1 1.58933e-8 0 -3.09086e-8 1.58933e-8 1 5 -1 -3.09086e-8 -3.09086e-8 0 0 0 0 1 + + + + + + + + From 08499dbd0b722089b3dcfbd95c0ce5882a1b20c2 Mon Sep 17 00:00:00 2001 From: wise86Android Date: Sun, 17 May 2015 21:25:47 +0200 Subject: [PATCH 08/32] add test file --- test/unit/utColladaExportCamera.cpp | 80 +++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 test/unit/utColladaExportCamera.cpp diff --git a/test/unit/utColladaExportCamera.cpp b/test/unit/utColladaExportCamera.cpp new file mode 100644 index 000000000..c647684b6 --- /dev/null +++ b/test/unit/utColladaExportCamera.cpp @@ -0,0 +1,80 @@ +/* + * ColladaCameraExporter.cpp + * + * Created on: May 17, 2015 + * Author: wise + */ + + +#include "UnitTestPCH.h" + +#include +#include +#include +#include + +#ifndef ASSIMP_BUILD_NO_EXPORT + +class ColladaExportCamera : public ::testing::Test { +public: + + virtual void SetUp() + { + ex = new Assimp::Exporter(); + im = new Assimp::Importer(); + + } + + virtual void TearDown() + { + delete ex; + delete im; + } + +protected: + + + Assimp::Exporter* ex; + Assimp::Importer* im; +}; + +// ------------------------------------------------------------------------------------------------ +TEST_F(ColladaExportCamera, testExportCamera) +{ + const char* file = "cameraExp.dae"; + + const aiScene* pTest = im->ReadFile("../test/models/Collada/cameras.dae",0); + ASSERT_TRUE(pTest!=NULL); + ASSERT_TRUE(pTest->HasCameras()); + + + EXPECT_EQ(AI_SUCCESS,ex->Export(pTest,"collada",file)); + + const aiScene* imported = im->ReadFile(file,0); + + ASSERT_TRUE(imported!=NULL); + + EXPECT_TRUE(imported->HasCameras()); + EXPECT_EQ(pTest->mNumCameras,imported->mNumCameras); + + for(size_t i=0; i< pTest->mNumCameras;i++){ + + const aiCamera *orig = pTest->mCameras[i]; + const aiCamera *read = imported->mCameras[i]; + + EXPECT_TRUE(orig->mName==read->mName); + EXPECT_FLOAT_EQ(orig->mHorizontalFOV,read->mHorizontalFOV); + EXPECT_FLOAT_EQ(orig->mClipPlaneNear,read->mClipPlaneNear); + EXPECT_FLOAT_EQ(orig->mClipPlaneFar,read->mClipPlaneFar); + + EXPECT_FLOAT_EQ(orig->mPosition.x,read->mPosition.x); + EXPECT_FLOAT_EQ(orig->mPosition.y,read->mPosition.y); + EXPECT_FLOAT_EQ(orig->mPosition.z,read->mPosition.z); + } + +} + + +#endif + + From c014bb977c290a578131b39d31de8bbdab68424f Mon Sep 17 00:00:00 2001 From: Andy Maloney Date: Sat, 16 May 2015 15:13:22 -0400 Subject: [PATCH 09/32] - add missing initialization of several class members - prefer check for empty() over check for size() in OptimizeGraph (empty() is guaranteed to be constant time, size() is not) - fix a couple of incorrect indentations --- code/BaseImporter.cpp | 4 +++- code/ColladaExporter.h | 7 +++++-- code/ColladaHelper.h | 26 ++++++++++++++++++-------- code/ColladaLoader.cpp | 5 ++++- code/FindInvalidDataProcess.cpp | 1 + code/OptimizeGraph.cpp | 8 ++++++-- code/OptimizeMeshes.cpp | 8 +++++--- 7 files changed, 42 insertions(+), 17 deletions(-) diff --git a/code/BaseImporter.cpp b/code/BaseImporter.cpp index 1bb0a1cee..38de47432 100644 --- a/code/BaseImporter.cpp +++ b/code/BaseImporter.cpp @@ -480,7 +480,9 @@ namespace Assimp struct Assimp::BatchData { BatchData() - : next_id(0xffff) + : pIOSystem() + , pImporter() + , next_id(0xffff) {} // IO system to be used for all imports diff --git a/code/ColladaExporter.h b/code/ColladaExporter.h index 9456508ce..7ba32f9ea 100644 --- a/code/ColladaExporter.h +++ b/code/ColladaExporter.h @@ -144,8 +144,11 @@ protected: struct Property { bool exist; - float value; - Property() { exist = false; } + float value; + Property() + : exist(false) + , value(0.0f) + {} }; // summarize a material in an convinient way. diff --git a/code/ColladaHelper.h b/code/ColladaHelper.h index 71ccd2dfc..8a4e38d53 100644 --- a/code/ColladaHelper.h +++ b/code/ColladaHelper.h @@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include "../include/assimp/types.h" +#include "../include/assimp/light.h" #include "../include/assimp/mesh.h" #include "../include/assimp/material.h" @@ -134,7 +134,8 @@ struct Camera struct Light { Light() - : mAttConstant (1.f) + : mType (aiLightSource_UNDEFINED) + , mAttConstant (1.f) , mAttLinear (0.f) , mAttQuadratic (0.f) , mFalloffAngle (180.f) @@ -172,13 +173,14 @@ struct Light struct InputSemanticMapEntry { InputSemanticMapEntry() - : mSet (0) + : mSet(0) + , mType(IT_Invalid) {} //! Index of set, optional unsigned int mSet; - //! Name of referenced vertex input + //! Type of referenced vertex input InputType mType; }; @@ -235,7 +237,7 @@ struct Node { std::string mName; std::string mID; - std::string mSID; + std::string mSID; Node* mParent; std::vector mChildren; @@ -384,8 +386,8 @@ struct Controller // accessor URL of the joint names std::string mJointNameSource; - ///< The bind shape matrix, as array of floats. I'm not sure what this matrix actually describes, but it can't be ignored in all cases - float mBindShapeMatrix[16]; + ///< The bind shape matrix, as array of floats. I'm not sure what this matrix actually describes, but it can't be ignored in all cases + float mBindShapeMatrix[16]; // accessor URL of the joint inverse bind matrices std::string mJointOffsetMatrixSource; @@ -609,7 +611,15 @@ struct ChannelEntry 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; } + ChannelEntry() + : mChannel() + , mTransformIndex() + , mSubElement() + , mTimeAccessor() + , mTimeData() + , mValueAccessor() + , mValueData() + {} }; } // end of namespace Collada diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 735eede18..b2d4d4869 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -81,7 +81,10 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer ColladaLoader::ColladaLoader() -: noSkeletonMesh(), ignoreUpDirection(false), mNodeNameCounter() + : noSkeletonMesh() + , ignoreUpDirection(false) + , invertTransparency(false) + , mNodeNameCounter() {} // ------------------------------------------------------------------------------------------------ diff --git a/code/FindInvalidDataProcess.cpp b/code/FindInvalidDataProcess.cpp index 450c5f873..e82aedc36 100644 --- a/code/FindInvalidDataProcess.cpp +++ b/code/FindInvalidDataProcess.cpp @@ -58,6 +58,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer FindInvalidDataProcess::FindInvalidDataProcess() + : configEpsilon(0.0f) { // nothing to do here } diff --git a/code/OptimizeGraph.cpp b/code/OptimizeGraph.cpp index d418655bf..25dca7923 100644 --- a/code/OptimizeGraph.cpp +++ b/code/OptimizeGraph.cpp @@ -71,6 +71,10 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer OptimizeGraphProcess::OptimizeGraphProcess() + : mScene() + , nodes_in() + , nodes_out() + , count_merged() {} // ------------------------------------------------------------------------------------------------ @@ -122,7 +126,7 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list& no ++it; } - if (nd->mNumMeshes || child_nodes.size()) { + if (nd->mNumMeshes || !child_nodes.empty()) { nodes.push_back(nd); } else { @@ -172,7 +176,7 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode* nd, std::list& no } ++it; } - if (join_master && join.size()) { + if (join_master && !join.empty()) { join_master->mName.length = sprintf(join_master->mName.data,"$MergedNode_%i",count_merged++); unsigned int out_meshes = 0; diff --git a/code/OptimizeMeshes.cpp b/code/OptimizeMeshes.cpp index cbd5ea693..1e33f7356 100644 --- a/code/OptimizeMeshes.cpp +++ b/code/OptimizeMeshes.cpp @@ -60,9 +60,11 @@ static const unsigned int DeadBeef = 0xdeadbeef; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer OptimizeMeshesProcess::OptimizeMeshesProcess() -: pts (false) -, max_verts( NotSet ) -, max_faces( NotSet ) { + : mScene() + , mesh() + , pts(false) + , max_verts( NotSet ) + , max_faces( NotSet ) { // empty } From bf4a73e42e089601e132f6086c495a49fbe06bd5 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 19:42:07 -0600 Subject: [PATCH 10/32] Refactor: Remove unused member variable --- code/OptimizeMeshes.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/OptimizeMeshes.h b/code/OptimizeMeshes.h index 88e81629c..38c06e221 100644 --- a/code/OptimizeMeshes.h +++ b/code/OptimizeMeshes.h @@ -164,9 +164,6 @@ private: //! Per mesh info std::vector meshes; - //! Next output mesh - aiMesh* mesh; - //! Output meshes std::vector output; From 63520d562a4d2e6e2ebe50591deaac17dd52bb56 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 19:42:30 -0600 Subject: [PATCH 11/32] Refactor: Initialize members in declaration order; prefer initialization over assignment --- code/StepExporter.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/StepExporter.cpp b/code/StepExporter.cpp index 0ce273313..65e165afb 100644 --- a/code/StepExporter.cpp +++ b/code/StepExporter.cpp @@ -152,7 +152,7 @@ namespace { // ------------------------------------------------------------------------------------------------ // Constructor for a specific scene to export -StepExporter::StepExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file, const ExportProperties* pProperties) : mIOSystem(pIOSystem), mPath(path), mFile(file), mProperties(pProperties) +StepExporter::StepExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file, const ExportProperties* pProperties) : mProperties(pProperties), mIOSystem(pIOSystem), mFile(file), mPath(path), mScene(pScene), endstr(";\n") { CollectTrafos(pScene->mRootNode, trafos); CollectMeshes(pScene->mRootNode, meshes); @@ -160,11 +160,6 @@ StepExporter::StepExporter(const aiScene* pScene, IOSystem* pIOSystem, const std // make sure that all formatting happens using the standard, C locale and not the user's current locale mOutput.imbue( std::locale("C") ); - mScene = pScene; - - // set up strings - endstr = ";\n"; - // start writing WriteFile(); } From fbf90a28ffb2aace358c25d06d7eed65ccadce39 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 19:46:01 -0600 Subject: [PATCH 12/32] Fixed: Ensure variable is always initialized before use --- code/3DSExporter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/3DSExporter.cpp b/code/3DSExporter.cpp index b16a3b2c7..1bd341c78 100644 --- a/code/3DSExporter.cpp +++ b/code/3DSExporter.cpp @@ -47,9 +47,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SceneCombiner.h" #include "SplitLargeMeshes.h" #include "StringComparison.h" -#include "../include/assimp/IOSystem.hpp" -#include "../include/assimp/DefaultLogger.hpp" -#include "../include/assimp/Exporter.hpp" +#include "../include/assimp/IOSystem.hpp" +#include "../include/assimp/DefaultLogger.hpp" +#include "../include/assimp/Exporter.hpp" #include using namespace Assimp; @@ -324,6 +324,7 @@ void Discreet3DSExporter::WriteMaterials() break; default: + shading_mode_out = Discreet3DS::Flat; ai_assert(false); }; writer.PutU2(static_cast(shading_mode_out)); From 8c94e51e90971c8bed5cb2a35292215fa7232633 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 19:47:13 -0600 Subject: [PATCH 13/32] Refactor: Delete unused functions --- code/StepExporter.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/code/StepExporter.cpp b/code/StepExporter.cpp index 65e165afb..845396780 100644 --- a/code/StepExporter.cpp +++ b/code/StepExporter.cpp @@ -115,21 +115,6 @@ void ExportSceneStep(const char* pFile,IOSystem* pIOSystem, const aiScene* pScen namespace { - inline uint64_t toIndexHash(int32_t id1, int32_t id2) - { - // dont wonder that -1/-1 -> hash=-1 - uint64_t hash = (uint32_t) id1; - hash = (hash << 32); - hash += (uint32_t) id2; - return hash; - } - - inline void fromIndexHash(uint64_t hash, int32_t &id1, int32_t &id2) - { - id1 = (hash & 0xFFFFFFFF00000000) >> 32; - id2 = (hash & 0xFFFFFFFF); - } - // Collect world transformations for each node void CollectTrafos(const aiNode* node, std::map& trafos) { const aiMatrix4x4& parent = node->mParent ? trafos[node->mParent] : aiMatrix4x4(); From d25c36960a1e49dba2e204e08c68b74a6f372988 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 19:56:01 -0600 Subject: [PATCH 14/32] Refactor: Initialize all POD members --- code/OpenGEXImporter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index fde5e3d45..be82db84f 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include #include static const aiImporterDesc desc = { @@ -183,12 +184,11 @@ USE_ODDLPARSER_NS //------------------------------------------------------------------------------------------------ OpenGEXImporter::VertexContainer::VertexContainer() : m_numVerts( 0 ) -, m_vertices() +, m_vertices(NULL) , m_numNormals( 0 ) -, m_normals() -, m_textureCoords() -, m_numUVComps() { - // empty +, m_normals(NULL) { + std::fill(&m_numUVComps[0], &m_numUVComps[AI_MAX_NUMBER_OF_TEXTURECOORDS], 0U); + std::fill(&m_textureCoords[0], &m_textureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS], static_cast(NULL)); } //------------------------------------------------------------------------------------------------ From 6ae97976482522a49669d996a3406c7e29a39ce2 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:01:51 -0600 Subject: [PATCH 15/32] Refactor: Initialize members in declaration order; initialize POD arrays --- code/OpenGEXImporter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index be82db84f..5b8209ed7 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -215,9 +215,9 @@ OpenGEXImporter::RefInfo::~RefInfo() { //------------------------------------------------------------------------------------------------ OpenGEXImporter::OpenGEXImporter() -: m_meshCache() -, m_root( NULL ) +: m_root( NULL ) , m_nodeChildMap() +, m_meshCache() , m_mesh2refMap() , m_ctx( NULL ) , m_currentNode( NULL ) @@ -226,7 +226,7 @@ OpenGEXImporter::OpenGEXImporter() , m_tokenType( Grammar::NoneType ) , m_nodeStack() , m_unresolvedRefStack() { - // empty + std::fill(&m_metrics[0], &m_metrics[MetricInfo::Max], MetricInfo()); } //------------------------------------------------------------------------------------------------ From 2de6dd49732579adbd24b4216308eee5ebaad207 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:02:58 -0600 Subject: [PATCH 16/32] Refactor: Delete unused variable --- code/OpenGEXImporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index 5b8209ed7..a568f925e 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -665,7 +665,6 @@ void OpenGEXImporter::handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene } const size_t numItems( countDataArrayListItems( vaList ) ); - Value *next( vaList->m_dataList ); if( Position == attribType ) { m_currentVertices.m_numVerts = numItems; m_currentVertices.m_vertices = new aiVector3D[ numItems ]; From 79c916daf4cd44f433c37d883a51990ea21a5a55 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:05:05 -0600 Subject: [PATCH 17/32] Refactor: Remove unused variable --- code/PlyExporter.cpp | 15 +++++++-------- code/PlyExporter.h | 1 - 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/code/PlyExporter.cpp b/code/PlyExporter.cpp index 0a4c94a48..12e59f2b6 100644 --- a/code/PlyExporter.cpp +++ b/code/PlyExporter.cpp @@ -43,14 +43,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #if !defined(ASSIMP_BUILD_NO_EXPORT) && !defined(ASSIMP_BUILD_NO_PLY_EXPORTER) #include "PlyExporter.h" -#include +#include #include -#include "Exceptional.h" -#include "../include/assimp/scene.h" -#include "../include/assimp/version.h" -#include "../include/assimp/IOSystem.hpp" +#include "Exceptional.h" +#include "../include/assimp/scene.h" +#include "../include/assimp/version.h" +#include "../include/assimp/IOSystem.hpp" #include "../include/assimp/Exporter.hpp" -#include "qnan.h" +#include "qnan.h" using namespace Assimp; @@ -96,8 +96,7 @@ void ExportScenePlyBinary(const char* pFile, IOSystem* pIOSystem, const aiScene* // ------------------------------------------------------------------------------------------------ PlyExporter::PlyExporter(const char* _filename, const aiScene* pScene, bool binary) : filename(_filename) -, pScene(pScene) -, endl("\n") +, endl("\n") { // make sure that all formatting happens using the standard, C locale and not the user's current locale const std::locale& l = std::locale("C"); diff --git a/code/PlyExporter.h b/code/PlyExporter.h index ec20903d7..64649d7cc 100644 --- a/code/PlyExporter.h +++ b/code/PlyExporter.h @@ -78,7 +78,6 @@ private: private: const std::string filename; - const aiScene* const pScene; // obviously, this endl() doesn't flush() the stream const std::string endl; From 7b3fa5ebc2b1c2ad8266f0d920a379f1d666bd20 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:22:31 -0600 Subject: [PATCH 18/32] Refactor: Delete unused forward decls, delete unused function --- code/IFCLoader.cpp | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/code/IFCLoader.cpp b/code/IFCLoader.cpp index 34f176c89..8ffefcb91 100644 --- a/code/IFCLoader.cpp +++ b/code/IFCLoader.cpp @@ -60,9 +60,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "StreamReader.h" #include "MemoryIOWrapper.h" -#include "../include/assimp/scene.h" -#include "../include/assimp/Importer.hpp" - +#include "../include/assimp/scene.h" +#include "../include/assimp/Importer.hpp" + namespace Assimp { template<> const std::string LogFunctions::log_prefix = "IFC: "; @@ -93,8 +93,6 @@ namespace { void SetUnits(ConversionData& conv); void SetCoordinateSpace(ConversionData& conv); void ProcessSpatialStructures(ConversionData& conv); -aiNode* ProcessSpatialStructure(aiNode* parent, const IfcProduct& el ,ConversionData& conv); -void ProcessProductRepresentation(const IfcProduct& el, aiNode* nd, ConversionData& conv); void MakeTreeRelative(ConversionData& conv); void ConvertUnit(const EXPRESS::DataType& dt,ConversionData& conv); @@ -421,16 +419,6 @@ void ResolveObjectPlacement(aiMatrix4x4& m, const IfcObjectPlacement& place, Con } } -// ------------------------------------------------------------------------------------------------ -void GetAbsTransform(aiMatrix4x4& out, const aiNode* nd, ConversionData& conv) -{ - aiMatrix4x4 t; - if (nd->mParent) { - GetAbsTransform(t,nd->mParent,conv); - } - out = t*nd->mTransformation; -} - // ------------------------------------------------------------------------------------------------ bool ProcessMappedItem(const IfcMappedItem& mapped, aiNode* nd_src, std::vector< aiNode* >& subnodes_src, unsigned int matid, ConversionData& conv) { @@ -682,14 +670,14 @@ aiNode* ProcessSpatialStructure(aiNode* parent, const IfcProduct& el, Conversion // skip over space and annotation nodes - usually, these have no meaning in Assimp's context bool skipGeometry = false; if(conv.settings.skipSpaceRepresentations) { - if(const IfcSpace* const space = el.ToPtr()) { + if(el.ToPtr()) { IFCImporter::LogDebug("skipping IfcSpace entity due to importer settings"); skipGeometry = true; } } if(conv.settings.skipAnnotations) { - if(const IfcAnnotation* const ann = el.ToPtr()) { + if(el.ToPtr()) { IFCImporter::LogDebug("skipping IfcAnnotation entity due to importer settings"); return NULL; } @@ -764,7 +752,7 @@ aiNode* ProcessSpatialStructure(aiNode* parent, const IfcProduct& el, Conversion continue; } BOOST_FOREACH(const IfcProduct& pro, cont->RelatedElements) { - if(const IfcOpeningElement* const open = pro.ToPtr()) { + if(pro.ToPtr()) { // IfcOpeningElement is handled below. Sadly we can't use it here as is: // The docs say that opening elements are USUALLY attached to building storey, // but we want them for the building elements to which they belong. From 5bb09377cb24557a2dc9f3ba1191d220c8e6a090 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:40:35 -0600 Subject: [PATCH 19/32] Refactor: Delete unused variable --- code/IFCProfile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/IFCProfile.cpp b/code/IFCProfile.cpp index 42d090d9d..9e70c2ac1 100644 --- a/code/IFCProfile.cpp +++ b/code/IFCProfile.cpp @@ -114,7 +114,7 @@ void ProcessParametrizedProfile(const IfcParameterizedProfileDef& def, TempMesh& meshout.vertcnt.push_back(4); } else if( const IfcCircleProfileDef* const circle = def.ToPtr()) { - if( const IfcCircleHollowProfileDef* const hollow = def.ToPtr()) { + if(def.ToPtr()) { // TODO } const size_t segments = 32; From 814ef32dce482176797e142548f2583d76ea8d1f Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:43:25 -0600 Subject: [PATCH 20/32] Refactor: Delete unused fields --- code/IFCCurve.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/code/IFCCurve.cpp b/code/IFCCurve.cpp index 0625ea631..aca350fc9 100644 --- a/code/IFCCurve.cpp +++ b/code/IFCCurve.cpp @@ -173,7 +173,6 @@ public: // -------------------------------------------------- Line(const IfcLine& entity, ConversionData& conv) : Curve(entity,conv) - , entity(entity) { ConvertCartesianPoint(p,entity.Pnt); ConvertVector(v,entity.Dir); @@ -221,7 +220,6 @@ public: } private: - const IfcLine& entity; IfcVector3 p,v; }; @@ -238,7 +236,6 @@ public: // -------------------------------------------------- CompositeCurve(const IfcCompositeCurve& entity, ConversionData& conv) : BoundedCurve(entity,conv) - , entity(entity) , total() { curves.reserve(entity.Segments.size()); @@ -331,7 +328,6 @@ public: } private: - const IfcCompositeCurve& entity; std::vector< CurveEntry > curves; IfcFloat total; @@ -349,8 +345,6 @@ public: // -------------------------------------------------- TrimmedCurve(const IfcTrimmedCurve& entity, ConversionData& conv) : BoundedCurve(entity,conv) - , entity(entity) - , ok() { base = boost::shared_ptr(Curve::Convert(entity.BasisCurve,conv)); @@ -448,11 +442,9 @@ private: private: - const IfcTrimmedCurve& entity; ParamRange range; IfcFloat maxval; bool agree_sense; - bool ok; boost::shared_ptr base; }; @@ -469,7 +461,6 @@ public: // -------------------------------------------------- PolyLine(const IfcPolyline& entity, ConversionData& conv) : BoundedCurve(entity,conv) - , entity(entity) { points.reserve(entity.Points.size()); @@ -507,7 +498,6 @@ public: } private: - const IfcPolyline& entity; std::vector points; }; From a34adb84502c2f9b4c25dedeaccf5a5e6f14f7b2 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:45:16 -0600 Subject: [PATCH 21/32] Refactor: Delete unused functions --- code/STEPFileReader.cpp | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/code/STEPFileReader.cpp b/code/STEPFileReader.cpp index 113ab50a1..d7780e317 100644 --- a/code/STEPFileReader.cpp +++ b/code/STEPFileReader.cpp @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "STEPFileReader.h" #include "STEPFileEncoding.h" #include "TinyFormatter.h" -#include "fast_atof.h" +#include "fast_atof.h" #include @@ -55,28 +55,6 @@ namespace EXPRESS = STEP::EXPRESS; #include -// ------------------------------------------------------------------------------------------------ -// From http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring - -// trim from start -static inline std::string <rim(std::string &s) { - s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1( std::ptr_fun(Assimp::IsSpace)))); - return s; -} - -// trim from end -static inline std::string &rtrim(std::string &s) { - s.erase(std::find_if(s.rbegin(), s.rend(), std::not1( std::ptr_fun(Assimp::IsSpace))).base(),s.end()); - return s; -} -// trim from both ends -static inline std::string &trim(std::string &s) { - return ltrim(rtrim(s)); -} - - - - // ------------------------------------------------------------------------------------------------ std::string AddLineNumber(const std::string& s,uint64_t line /*= LINE_NOT_SPECIFIED*/, const std::string& prefix = "") { From 4a5e9352d6cc134c6ec936bc9103c99dcd472c78 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:46:56 -0600 Subject: [PATCH 22/32] Refactor: Delete unused functions --- code/FBXParser.cpp | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/code/FBXParser.cpp b/code/FBXParser.cpp index f77c24a8d..4e4668902 100644 --- a/code/FBXParser.cpp +++ b/code/FBXParser.cpp @@ -86,27 +86,6 @@ namespace { } - // ------------------------------------------------------------------------------------------------ - // print warning, do return - void ParseWarning(const std::string& message, const Token& token) - { - if(DefaultLogger::get()) { - DefaultLogger::get()->warn(Util::AddTokenText("FBX-Parser",message,&token)); - } - } - - // ------------------------------------------------------------------------------------------------ -/* void ParseWarning(const std::string& message, const Element* element = NULL) - { - if(element) { - ParseWarning(message,element->KeyToken()); - return; - } - if(DefaultLogger::get()) { - DefaultLogger::get()->warn("FBX-Parser: " + message); - } - } -*/ // ------------------------------------------------------------------------------------------------ void ParseError(const std::string& message, TokenPtr token) { From cac87071214ba21e1cfce00f896e41066d0d8f89 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:48:04 -0600 Subject: [PATCH 23/32] Refactor: Delete unused field --- code/STLExporter.cpp | 17 ++++++++--------- code/STLExporter.h | 1 - 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/code/STLExporter.cpp b/code/STLExporter.cpp index 13684fecc..f1ac8a53c 100644 --- a/code/STLExporter.cpp +++ b/code/STLExporter.cpp @@ -43,13 +43,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #if !defined(ASSIMP_BUILD_NO_EXPORT) && !defined(ASSIMP_BUILD_NO_STL_EXPORTER) #include "STLExporter.h" -#include "../include/assimp/version.h" -#include "../include/assimp/IOSystem.hpp" -#include "../include/assimp/scene.h" -#include "../include/assimp/Exporter.hpp" -#include -#include "Exceptional.h" -#include "ByteSwapper.h" +#include "../include/assimp/version.h" +#include "../include/assimp/IOSystem.hpp" +#include "../include/assimp/scene.h" +#include "../include/assimp/Exporter.hpp" +#include +#include "Exceptional.h" +#include "ByteSwapper.h" using namespace Assimp; namespace Assimp { @@ -89,8 +89,7 @@ void ExportSceneSTLBinary(const char* pFile,IOSystem* pIOSystem, const aiScene* // ------------------------------------------------------------------------------------------------ STLExporter :: STLExporter(const char* _filename, const aiScene* pScene, bool binary) : filename(_filename) -, pScene(pScene) -, endl("\n") +, endl("\n") { // make sure that all formatting happens using the standard, C locale and not the user's current locale const std::locale& l = std::locale("C"); diff --git a/code/STLExporter.h b/code/STLExporter.h index 3284650c3..de7fce43e 100644 --- a/code/STLExporter.h +++ b/code/STLExporter.h @@ -75,7 +75,6 @@ private: private: const std::string filename; - const aiScene* const pScene; // this endl() doesn't flush() the stream const std::string endl; From 9cbef8cba35762ab0cabf6717883d8c6d8704a21 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 17 May 2015 20:50:58 -0600 Subject: [PATCH 24/32] Refactor: Initialize members in declaration order; prefer initialization over assignment --- code/XFileExporter.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/XFileExporter.cpp b/code/XFileExporter.cpp index 276b309dd..278bf12a8 100644 --- a/code/XFileExporter.cpp +++ b/code/XFileExporter.cpp @@ -95,17 +95,18 @@ void ExportSceneXFile(const char* pFile,IOSystem* pIOSystem, const aiScene* pSce // ------------------------------------------------------------------------------------------------ // Constructor for a specific scene to export -XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file, const ExportProperties* pProperties) : mIOSystem(pIOSystem), mPath(path), mFile(file), mProperties(pProperties) +XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file, const ExportProperties* pProperties) + : mProperties(pProperties), + mIOSystem(pIOSystem), + mPath(path), + mFile(file), + mScene(pScene), + mSceneOwned(false), + endstr("\n") { // make sure that all formatting happens using the standard, C locale and not the user's current locale mOutput.imbue( std::locale("C") ); - mScene = pScene; - mSceneOwned = false; - - // set up strings - endstr = "\n"; - // start writing WriteFile(); } From 28cc934bb937c8430a73752c19e0eee0e501981f Mon Sep 17 00:00:00 2001 From: Andy Maloney Date: Mon, 18 May 2015 09:51:09 -0400 Subject: [PATCH 25/32] Fix overlapping merges --- code/OptimizeMeshes.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/OptimizeMeshes.cpp b/code/OptimizeMeshes.cpp index 1e33f7356..870369315 100644 --- a/code/OptimizeMeshes.cpp +++ b/code/OptimizeMeshes.cpp @@ -61,7 +61,6 @@ static const unsigned int DeadBeef = 0xdeadbeef; // Constructor to be privately used by Importer OptimizeMeshesProcess::OptimizeMeshesProcess() : mScene() - , mesh() , pts(false) , max_verts( NotSet ) , max_faces( NotSet ) { From 2c194f629a93f6809efd75591f7b6a791277efaa Mon Sep 17 00:00:00 2001 From: wise86Android Date: Tue, 19 May 2015 21:57:51 +0200 Subject: [PATCH 26/32] fix macro for be uesed with expression --- code/ColladaExporter.cpp | 140 ++++++++++- code/ColladaExporter.h | 12 + include/assimp/defs.h | 6 +- test/CMakeLists.txt | 1 + test/models/Collada/lights.dae | 380 +++++++++++++++++++++++++++++ test/unit/utColladaExportLight.cpp | 81 ++++++ 6 files changed, 616 insertions(+), 4 deletions(-) create mode 100644 test/models/Collada/lights.dae create mode 100644 test/unit/utColladaExportLight.cpp diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index c5d904c07..ba3530491 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -51,7 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "XMLTools.h" #include "../include/assimp/IOSystem.hpp" #include "../include/assimp/Exporter.hpp" -#include "../include/assimp/scene.h" +#include "../include/assimp/scene.h" #include "Exceptional.h" @@ -128,6 +128,7 @@ void ColladaExporter::WriteFile() WriteHeader(); WriteCamerasLibrary(); + WriteLightsLibrary(); WriteMaterials(); WriteGeometryLibrary(); @@ -342,6 +343,143 @@ void ColladaExporter::WriteCamera(size_t pIndex){ } + +// ------------------------------------------------------------------------------------------------ +// Write the embedded textures +void ColladaExporter::WriteLightsLibrary() { + if(mScene->HasLights()) { + + mOutput << startstr << "" << endstr; + PushTag(); + + for( size_t a = 0; a < mScene->mNumLights; ++a) + WriteLight( a); + + PopTag(); + mOutput << startstr << "" << endstr; + + } +} + +void ColladaExporter::WriteLight(size_t pIndex){ + + const aiLight *light = mScene->mLights[pIndex]; + const std::string idstrEscaped = XMLEscape(light->mName.C_Str()); + + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" << endstr; + PushTag(); + switch(light->mType){ + case aiLightSource_AMBIENT: + WriteAmbienttLight(light); + break; + case aiLightSource_DIRECTIONAL: + WriteDirectionalLight(light); + break; + case aiLightSource_POINT: + WritePointLight(light); + break; + case aiLightSource_SPOT: + WriteSpotLight(light); + break; + case aiLightSource_UNDEFINED: + case _aiLightSource_Force32Bit: + break; + } + PopTag(); + mOutput << startstr << "" << endstr; + + PopTag(); + mOutput << startstr << "" << endstr; + +} + +void ColladaExporter::WritePointLight(const aiLight *const light){ + const aiColor3D &color= light->mColorDiffuse; + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" + << color.r<<" "<" << endstr; + mOutput << startstr << "" + << light->mAttenuationConstant + <<"" << endstr; + mOutput << startstr << "" + << light->mAttenuationLinear + <<"" << endstr; + mOutput << startstr << "" + << light->mAttenuationQuadratic + <<"" << endstr; + + PopTag(); + mOutput << startstr << "" << endstr; + +} +void ColladaExporter::WriteDirectionalLight(const aiLight *const light){ + const aiColor3D &color= light->mColorDiffuse; + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" + << color.r<<" "<" << endstr; + + PopTag(); + mOutput << startstr << "" << endstr; + +} +void ColladaExporter::WriteSpotLight(const aiLight *const light){ + /* + 1 1 1 + 1 + 0 + 0.001599967 + 45 + 0.15 + + */ + const aiColor3D &color= light->mColorDiffuse; + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" + << color.r<<" "<" << endstr; + mOutput << startstr << "" + << light->mAttenuationConstant + <<"" << endstr; + mOutput << startstr << "" + << light->mAttenuationLinear + <<"" << endstr; + mOutput << startstr << "" + << light->mAttenuationQuadratic + <<"" << endstr; +/* mOutput << startstr << "" + << light-> + <<"" << endstr; + mOutput << startstr << "" + << light->mAttenuationLinear + <<"" << endstr; +*/ + + PopTag(); + mOutput << startstr << "" << endstr; + +} + +void ColladaExporter::WriteAmbienttLight(const aiLight *const light){ + + const aiColor3D &color= light->mColorAmbient; + mOutput << startstr << "" << endstr; + PushTag(); + mOutput << startstr << "" + << color.r<<" "<" << endstr; + + PopTag(); + mOutput << startstr << "" << endstr; +} + // ------------------------------------------------------------------------------------------------ // Reads a single surface entry from the given material keys void ColladaExporter::ReadMaterialSurface( Surface& poSurface, const aiMaterial* pSrcMat, aiTextureType pTexture, const char* pKey, size_t pType, size_t pIndex) diff --git a/code/ColladaExporter.h b/code/ColladaExporter.h index 4ded0d13d..73dc497fa 100644 --- a/code/ColladaExporter.h +++ b/code/ColladaExporter.h @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../include/assimp/ai_assert.h" #include "../include/assimp/material.h" #include "../include/assimp/mesh.h" +#include "../include/assimp/light.h" #include "../include/assimp/Exporter.hpp" #include #include @@ -86,8 +87,19 @@ protected: /// Writes the cameras library void WriteCamerasLibrary(); + // Write a camera entry void WriteCamera(size_t pIndex); + /// Writes the cameras library + void WriteLightsLibrary(); + + // Write a camera entry + void WriteLight(size_t pIndex); + void WritePointLight(const aiLight *const light); + void WriteDirectionalLight(const aiLight *const light); + void WriteSpotLight(const aiLight *const light); + void WriteAmbienttLight(const aiLight *const light); + /// Writes the geometry library void WriteGeometryLibrary(); diff --git a/include/assimp/defs.h b/include/assimp/defs.h index 6b8ac3416..c21b3cf2b 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -209,7 +209,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #if (defined(__BORLANDC__) || defined (__BCPLUSPLUS__)) #error Currently, Borland is unsupported. Feel free to port Assimp. -// "W8059 Packgröße der Struktur geändert" +// "W8059 Packgr��e der Struktur ge�ndert" #endif ////////////////////////////////////////////////////////////////////////// @@ -257,8 +257,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_MATH_HALF_PI_F (AI_MATH_PI_F * 0.5f) /* Tiny macro to convert from radians to degrees and back */ -#define AI_DEG_TO_RAD(x) (x*0.0174532925f) -#define AI_RAD_TO_DEG(x) (x*57.2957795f) +#define AI_DEG_TO_RAD(x) ((x)*0.0174532925f) +#define AI_RAD_TO_DEG(x) ((x)*57.2957795f) /* Support for big-endian builds */ #if defined(__BYTE_ORDER__) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9053f66d8..287f51698 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -41,6 +41,7 @@ SET( TEST_SRCS unit/utVertexTriangleAdjacency.cpp unit/utNoBoostTest.cpp unit/utColladaExportCamera.cpp + unit/utColladaExportLight.cpp ) SOURCE_GROUP( tests FILES ${TEST_SRCS} ) diff --git a/test/models/Collada/lights.dae b/test/models/Collada/lights.dae new file mode 100644 index 000000000..9e040aac6 --- /dev/null +++ b/test/models/Collada/lights.dae @@ -0,0 +1,380 @@ + + + + + Blender User + Blender 2.74.0 commit date:2015-03-31, commit time:13:39, hash:000dfc0 + + 2015-05-17T21:55:44 + 2015-05-17T21:55:44 + + Z_UP + + + + + + 1 1 1 + 1 + 0 + 0.00111109 + + + + + 0.000999987 + 1 + 0.1 + 0.1 + 1 + 1 + 1 + 2 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 2880 + 2 + 30.002 + 1.000799 + 0.04999995 + 29.99998 + 1 + 2 + 0 + 0 + 1 + 1 + 1 + 1 + 8192 + 1 + 1 + 0 + 1 + 1 + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 3 + 0.15 + 75 + 1 + 1 + 0 + 1 + 1 + 0 + + + + + + + 1 1 1 + + + + + 0.000999987 + 0 + 0.1 + 0.1 + 0.1 + 1 + 1 + 2 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 512 + 2 + 40 + 0.5 + 0.04999995 + 25 + 1 + 2 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 3 + 0 + 0 + 0 + 0 + 2 + 1 + 1 + 1 + 3 + 0.15 + 45 + 1 + 1 + 0 + 1 + 1 + 1 + + + + + + + 1 1 1 + 1 + 0 + 0.001599967 + 45 + 0.15 + + + + + 0.000999987 + 0 + 0.1 + 0.1 + 0.1 + 1 + 1 + 2 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 512 + 2 + 40 + 0.5 + 0.04999995 + 25 + 1 + 2 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 3 + 0 + 0 + 0 + 0 + 2 + 1 + 1 + 1 + 3 + 0.15 + 45 + 1 + 1 + 0 + 1 + 1 + 2 + + + + + + + 1 1 1 + + + + + 0.000999987 + 0 + 0.1 + 0.1 + 0.1 + 1 + 1 + 2 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 512 + 2 + 40 + 0.5 + 0.04999995 + 25 + 1 + 2 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 3 + 0 + 0 + 0 + 0 + 2 + 1 + 1 + 1 + 3 + 0.15 + 45 + 1 + 1 + 0 + 1 + 1 + 3 + + + + + + + 1 1 1 + 1 + 0 + 0.001599967 + + + + + 0.000999987 + 0 + 0.1 + 0.1 + 0.1 + 1 + 1 + 2 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 512 + 2 + 40 + 0.5 + 0.04999995 + 25 + 1 + 2 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 3 + 0 + 0 + 0 + 0 + 2 + 1 + 1 + 1 + 3 + 0.15 + 45 + 1 + 1 + 0 + 1 + 1 + 4 + + + + + + + + + + 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 + + + + 1 0 0 7.076701 0 1 0 -5.572294 0 0 1 5.147222 0 0 0 1 + + + + 1 0 0 8.888217 0 1 0 -5.016863 0 0 1 5.336025 0 0 0 1 + + + + 1 0 0 7.326984 0 1 0 -4.602942 0 0 1 5.554852 0 0 0 1 + + + + 1 0 0 8.063721 0 1 0 -4.19857 0 0 1 5.273283 0 0 0 1 + + + + + + + + \ No newline at end of file diff --git a/test/unit/utColladaExportLight.cpp b/test/unit/utColladaExportLight.cpp new file mode 100644 index 000000000..044770be3 --- /dev/null +++ b/test/unit/utColladaExportLight.cpp @@ -0,0 +1,81 @@ +/* + * ColladaCameraExporter.cpp + * + * Created on: May 17, 2015 + * Author: wise + */ + + +#include "UnitTestPCH.h" + +#include +#include +#include +#include + +#ifndef ASSIMP_BUILD_NO_EXPORT + +class ColladaExportLight : public ::testing::Test { +public: + + virtual void SetUp() + { + ex = new Assimp::Exporter(); + im = new Assimp::Importer(); + + } + + virtual void TearDown() + { + delete ex; + delete im; + } + +protected: + + + Assimp::Exporter* ex; + Assimp::Importer* im; +}; + +// ------------------------------------------------------------------------------------------------ +TEST_F(ColladaExportLight, testExportLight) +{ + const char* file = "cameraExp.dae"; + + const aiScene* pTest = im->ReadFile("../test/models/Collada/lights.dae",0); + ASSERT_TRUE(pTest!=NULL); + ASSERT_TRUE(pTest->HasLights()); + + + EXPECT_EQ(AI_SUCCESS,ex->Export(pTest,"collada",file)); + EXPECT_EQ(AI_SUCCESS,ex->Export(pTest,"collada","/home/wise/lightsExp.dae")); + + const aiScene* imported = im->ReadFile(file,0); + + ASSERT_TRUE(imported!=NULL); + + EXPECT_TRUE(imported->HasLights()); + EXPECT_EQ(pTest->mNumLights,imported->mNumLights); +/* + for(size_t i=0; i< pTest->mNumCameras;i++){ + + const aiCamera *orig = pTest->mCameras[i]; + const aiCamera *read = imported->mCameras[i]; + + EXPECT_TRUE(orig->mName==read->mName); + EXPECT_FLOAT_EQ(orig->mHorizontalFOV,read->mHorizontalFOV); + EXPECT_FLOAT_EQ(orig->mClipPlaneNear,read->mClipPlaneNear); + EXPECT_FLOAT_EQ(orig->mClipPlaneFar,read->mClipPlaneFar); + + EXPECT_FLOAT_EQ(orig->mPosition.x,read->mPosition.x); + EXPECT_FLOAT_EQ(orig->mPosition.y,read->mPosition.y); + EXPECT_FLOAT_EQ(orig->mPosition.z,read->mPosition.z); + } +*/ +} + + +#endif + + From b1d085b6a9acc719a0ac044148bb359d66226bd6 Mon Sep 17 00:00:00 2001 From: wise86Android Date: Tue, 19 May 2015 23:08:31 +0200 Subject: [PATCH 27/32] fix the foruma for compute the mAngleOuterCone values --- code/ColladaLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 735eede18..86c40d9c2 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -346,8 +346,8 @@ void ColladaLoader::BuildLightsForNode( const ColladaParser& pParser, const Coll { // Need to rely on falloff_exponent. I don't know how to interpret it, so I need to guess .... // epsilon chosen to be 0.1 - out->mAngleOuterCone = AI_DEG_TO_RAD (std::acos(std::pow(0.1f,1.f/srcLight->mFalloffExponent))+ - srcLight->mFalloffAngle); + out->mAngleOuterCone = std::acos(std::pow(0.1f,1.f/srcLight->mFalloffExponent))+ + out->mAngleInnerCone; } else { out->mAngleOuterCone = out->mAngleInnerCone + AI_DEG_TO_RAD( srcLight->mPenumbraAngle ); From 5ad6179bc531210df148c9031a616a0f976ef989 Mon Sep 17 00:00:00 2001 From: wise86Android Date: Tue, 19 May 2015 23:15:18 +0200 Subject: [PATCH 28/32] export the light in the collada file --- code/ColladaExporter.cpp | 41 ++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index ba3530491..0f9bdc868 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -454,13 +454,24 @@ void ColladaExporter::WriteSpotLight(const aiLight *const light){ mOutput << startstr << "" << light->mAttenuationQuadratic <<"" << endstr; -/* mOutput << startstr << "" - << light-> - <<"" << endstr; - mOutput << startstr << "" - << light->mAttenuationLinear - <<"" << endstr; -*/ + /* + out->mAngleOuterCone = AI_DEG_TO_RAD (std::acos(std::pow(0.1f,1.f/srcLight->mFalloffExponent))+ + srcLight->mFalloffAngle); + */ + + const float fallOffAngle = AI_RAD_TO_DEG(light->mAngleInnerCone); + mOutput << startstr <<"" + << fallOffAngle + <<"" << endstr; + double temp = light->mAngleOuterCone-light->mAngleInnerCone; + + temp = std::cos(temp); + temp = std::log(temp)/std::log(0.1); + temp = 1/temp; + mOutput << startstr << "" + << temp + <<"" << endstr; + PopTag(); mOutput << startstr << "" << endstr; @@ -1042,7 +1053,21 @@ void ColladaExporter::WriteNode(aiNode* pNode) mOutput << "" << endstr; if(pNode->mNumMeshes==0){ - mOutput << startstr <<"" << endstr; + //check if it is a camera node + for(size_t i=0; imNumCameras; i++){ + if(mScene->mCameras[i]->mName == pNode->mName){ + mOutput << startstr <<"" << endstr; + break; + } + } + //check if it is a light node + for(size_t i=0; imNumLights; i++){ + if(mScene->mLights[i]->mName == pNode->mName){ + mOutput << startstr <<"" << endstr; + break; + } + } + }else // instance every geometry for( size_t a = 0; a < pNode->mNumMeshes; ++a ) From 26b3328f3b8e1a96b27ada67519824afdd6336d0 Mon Sep 17 00:00:00 2001 From: wise86Android Date: Sat, 23 May 2015 11:03:56 +0200 Subject: [PATCH 29/32] fix xml syntax + more deap test --- code/ColladaExporter.cpp | 14 +++---------- test/unit/utColladaExportLight.cpp | 33 ++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index 0f9bdc868..bcd4518e4 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -430,15 +430,7 @@ void ColladaExporter::WriteDirectionalLight(const aiLight *const light){ } void ColladaExporter::WriteSpotLight(const aiLight *const light){ - /* - 1 1 1 - 1 - 0 - 0.001599967 - 45 - 0.15 - - */ + const aiColor3D &color= light->mColorDiffuse; mOutput << startstr << "" << endstr; PushTag(); @@ -1056,14 +1048,14 @@ void ColladaExporter::WriteNode(aiNode* pNode) //check if it is a camera node for(size_t i=0; imNumCameras; i++){ if(mScene->mCameras[i]->mName == pNode->mName){ - mOutput << startstr <<"" << endstr; + mOutput << startstr <<"" << endstr; break; } } //check if it is a light node for(size_t i=0; imNumLights; i++){ if(mScene->mLights[i]->mName == pNode->mName){ - mOutput << startstr <<"" << endstr; + mOutput << startstr <<"" << endstr; break; } } diff --git a/test/unit/utColladaExportLight.cpp b/test/unit/utColladaExportLight.cpp index 044770be3..510be7ee2 100644 --- a/test/unit/utColladaExportLight.cpp +++ b/test/unit/utColladaExportLight.cpp @@ -57,22 +57,33 @@ TEST_F(ColladaExportLight, testExportLight) EXPECT_TRUE(imported->HasLights()); EXPECT_EQ(pTest->mNumLights,imported->mNumLights); -/* - for(size_t i=0; i< pTest->mNumCameras;i++){ - const aiCamera *orig = pTest->mCameras[i]; - const aiCamera *read = imported->mCameras[i]; + for(size_t i=0; i< pTest->mNumLights;i++){ + + const aiLight *orig = pTest->mLights[i]; + const aiLight *read = imported->mLights[i]; EXPECT_TRUE(orig->mName==read->mName); - EXPECT_FLOAT_EQ(orig->mHorizontalFOV,read->mHorizontalFOV); - EXPECT_FLOAT_EQ(orig->mClipPlaneNear,read->mClipPlaneNear); - EXPECT_FLOAT_EQ(orig->mClipPlaneFar,read->mClipPlaneFar); + EXPECT_EQ(orig->mType,read->mType); + EXPECT_FLOAT_EQ(orig->mAttenuationConstant,read->mAttenuationConstant); + EXPECT_FLOAT_EQ(orig->mAttenuationLinear,read->mAttenuationLinear); + EXPECT_FLOAT_EQ(orig->mAttenuationQuadratic,read->mAttenuationQuadratic); - EXPECT_FLOAT_EQ(orig->mPosition.x,read->mPosition.x); - EXPECT_FLOAT_EQ(orig->mPosition.y,read->mPosition.y); - EXPECT_FLOAT_EQ(orig->mPosition.z,read->mPosition.z); + EXPECT_FLOAT_EQ(orig->mColorAmbient.r,read->mColorAmbient.r); + EXPECT_FLOAT_EQ(orig->mColorAmbient.g,read->mColorAmbient.g); + EXPECT_FLOAT_EQ(orig->mColorAmbient.b,read->mColorAmbient.b); + + EXPECT_FLOAT_EQ(orig->mColorDiffuse.r,read->mColorDiffuse.r); + EXPECT_FLOAT_EQ(orig->mColorDiffuse.g,read->mColorDiffuse.g); + EXPECT_FLOAT_EQ(orig->mColorDiffuse.b,read->mColorDiffuse.b); + + EXPECT_FLOAT_EQ(orig->mColorSpecular.r,read->mColorSpecular.r); + EXPECT_FLOAT_EQ(orig->mColorSpecular.g,read->mColorSpecular.g); + EXPECT_FLOAT_EQ(orig->mColorSpecular.b,read->mColorSpecular.b); + + EXPECT_NEAR(orig->mAngleInnerCone,read->mAngleInnerCone,0.001); + EXPECT_NEAR(orig->mAngleOuterCone,read->mAngleOuterCone,0.001); } -*/ } From ef306d5666b5f8a362370b23fa3fe4b3345dd31a Mon Sep 17 00:00:00 2001 From: Jared Duke Date: Sat, 23 May 2015 13:46:35 -0700 Subject: [PATCH 30/32] Fix issue with CMAKE_CXX_FLAGS initialization Append the necessary flags to CMAKE_CXX_FLAGS, rather than replacing the previous values. It's critical that that flags are preserved to ensure proper and consistent compilation. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9829cd306..50159bb2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,9 +62,9 @@ if( CMAKE_COMPILER_IS_MINGW ) endif() if((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT CMAKE_COMPILER_IS_MINGW) - set(CMAKE_CXX_FLAGS "-fPIC") # this is a very important switch and some libraries seem now to have it.... + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") # this is a very important switch and some libraries seem now to have it.... # hide all not-exported symbols - set(CMAKE_CXX_FLAGS "-fvisibility=hidden -Wall" ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Wall" ) elseif(MSVC) # enable multi-core compilation with MSVC add_definitions(/MP) From 4cbce374b684c751530ac9a0dbcfcc69c6252677 Mon Sep 17 00:00:00 2001 From: Andy Maloney Date: Sun, 24 May 2015 11:48:15 -0400 Subject: [PATCH 31/32] Code Cleanups - add initializers to classes - fix %i/%u for unsigned ints - remove unused vars - pass by reference --- code/ColladaExporter.cpp | 4 ---- code/ColladaLoader.cpp | 2 +- code/ColladaLoader.h | 2 +- code/ComputeUVMappingProcess.cpp | 2 +- code/FixNormalsStep.cpp | 2 +- code/ImproveCacheLocality.cpp | 6 +++--- code/RemoveVCProcess.cpp | 4 +++- code/SortByPTypeProcess.cpp | 10 +++++----- code/TextureTransform.cpp | 3 ++- code/ValidateDataStructure.cpp | 6 +++--- include/assimp/Exporter.hpp | 9 ++++++++- 11 files changed, 28 insertions(+), 22 deletions(-) diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index bcd4518e4..6c87c3de8 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -167,8 +167,6 @@ void ColladaExporter::WriteHeader() std::time_t date = std::time(NULL); std::strftime(date_str, date_nb_chars, "%Y-%m-%dT%H:%M:%S", std::localtime(&date)); - std::string scene_name = mScene->mRootNode->mName.C_Str(); - aiVector3D scaling; aiQuaternion rotation; aiVector3D position; @@ -622,8 +620,6 @@ void ColladaExporter::WriteMaterials() { materials.resize( mScene->mNumMaterials); - std::set material_names; - /// collect all materials from the scene size_t numTextures = 0; for( size_t a = 0; a < mScene->mNumMaterials; ++a ) diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 833e428ac..3a981b538 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -919,7 +919,7 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars // ------------------------------------------------------------------------------------------------ // Constructs the animations for the given source anim -void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string pPrefix) +void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string &pPrefix) { std::string animName = pPrefix.empty() ? pSrcAnim->mName : pPrefix + "_" + pSrcAnim->mName; diff --git a/code/ColladaLoader.h b/code/ColladaLoader.h index 4ff0a667d..5e1098727 100644 --- a/code/ColladaLoader.h +++ b/code/ColladaLoader.h @@ -155,7 +155,7 @@ protected: * @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); + 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); diff --git a/code/ComputeUVMappingProcess.cpp b/code/ComputeUVMappingProcess.cpp index 172268b66..3ed8f9a9e 100644 --- a/code/ComputeUVMappingProcess.cpp +++ b/code/ComputeUVMappingProcess.cpp @@ -412,7 +412,7 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) { if (!DefaultLogger::isNullLogger()) { - sprintf(buffer, "Found non-UV mapped texture (%s,%i). Mapping type: %s", + sprintf(buffer, "Found non-UV mapped texture (%s,%u). Mapping type: %s", TextureTypeToString((aiTextureType)prop->mSemantic),prop->mIndex, MappingTypeToString(mapping)); diff --git a/code/FixNormalsStep.cpp b/code/FixNormalsStep.cpp index d3d53ac15..608a145e0 100644 --- a/code/FixNormalsStep.cpp +++ b/code/FixNormalsStep.cpp @@ -158,7 +158,7 @@ bool FixInfacingNormalsProcess::ProcessMesh( aiMesh* pcMesh, unsigned int index) if (!DefaultLogger::isNullLogger()) { char buffer[128]; // should be sufficiently large - ::sprintf(buffer,"Mesh %i: Normals are facing inwards (or the mesh is planar)",index); + ::sprintf(buffer,"Mesh %u: Normals are facing inwards (or the mesh is planar)",index); DefaultLogger::get()->info(buffer); } diff --git a/code/ImproveCacheLocality.cpp b/code/ImproveCacheLocality.cpp index 81617cc49..0f2ecc13a 100644 --- a/code/ImproveCacheLocality.cpp +++ b/code/ImproveCacheLocality.cpp @@ -110,7 +110,7 @@ void ImproveCacheLocalityProcess::Execute( aiScene* pScene) } if (!DefaultLogger::isNullLogger()) { char szBuff[128]; // should be sufficiently large in every case - ::sprintf(szBuff,"Cache relevant are %i meshes (%i faces). Average output ACMR is %f", + ::sprintf(szBuff,"Cache relevant are %u meshes (%u faces). Average output ACMR is %f", numm,numf,out/numf); DefaultLogger::get()->info(szBuff); @@ -182,7 +182,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh // the JoinIdenticalVertices process has not been executed on this // mesh, otherwise this value would normally be at least minimally // smaller than 3.0 ... - sprintf(szBuff,"Mesh %i: Not suitable for vcache optimization",meshNum); + sprintf(szBuff,"Mesh %u: Not suitable for vcache optimization",meshNum); DefaultLogger::get()->warn(szBuff); return 0.f; } @@ -361,7 +361,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh if ( DefaultLogger::get()->getLogSeverity() == Logger::VERBOSE) { char szBuff[128]; // should be sufficiently large in every case - ::sprintf(szBuff,"Mesh %i | ACMR in: %f out: %f | ~%.1f%%",meshNum,fACMR,fACMR2, + ::sprintf(szBuff,"Mesh %u | ACMR in: %f out: %f | ~%.1f%%",meshNum,fACMR,fACMR2, ((fACMR - fACMR2) / fACMR) * 100.f); DefaultLogger::get()->debug(szBuff); } diff --git a/code/RemoveVCProcess.cpp b/code/RemoveVCProcess.cpp index 2b551bacf..9fe4e8de2 100644 --- a/code/RemoveVCProcess.cpp +++ b/code/RemoveVCProcess.cpp @@ -54,7 +54,9 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -RemoveVCProcess::RemoveVCProcess() +RemoveVCProcess::RemoveVCProcess() : + configDeleteFlags() + , mScene() {} // ------------------------------------------------------------------------------------------------ diff --git a/code/SortByPTypeProcess.cpp b/code/SortByPTypeProcess.cpp index 096b3fcf1..34bb830fd 100644 --- a/code/SortByPTypeProcess.cpp +++ b/code/SortByPTypeProcess.cpp @@ -397,11 +397,11 @@ void SortByPTypeProcess::Execute( aiScene* pScene) if (!DefaultLogger::isNullLogger()) { char buffer[1024]; - ::sprintf(buffer,"Points: %i%s, Lines: %i%s, Triangles: %i%s, Polygons: %i%s (Meshes, X = removed)", - aiNumMeshesPerPType[0], (configRemoveMeshes & aiPrimitiveType_POINT ? "X" : ""), - aiNumMeshesPerPType[1], (configRemoveMeshes & aiPrimitiveType_LINE ? "X" : ""), - aiNumMeshesPerPType[2], (configRemoveMeshes & aiPrimitiveType_TRIANGLE ? "X" : ""), - aiNumMeshesPerPType[3], (configRemoveMeshes & aiPrimitiveType_POLYGON ? "X" : "")); + ::sprintf(buffer,"Points: %u%s, Lines: %u%s, Triangles: %u%s, Polygons: %u%s (Meshes, X = removed)", + aiNumMeshesPerPType[0], ((configRemoveMeshes & aiPrimitiveType_POINT) ? "X" : ""), + aiNumMeshesPerPType[1], ((configRemoveMeshes & aiPrimitiveType_LINE) ? "X" : ""), + aiNumMeshesPerPType[2], ((configRemoveMeshes & aiPrimitiveType_TRIANGLE) ? "X" : ""), + aiNumMeshesPerPType[3], ((configRemoveMeshes & aiPrimitiveType_POLYGON) ? "X" : "")); DefaultLogger::get()->info(buffer); DefaultLogger::get()->debug("SortByPTypeProcess finished"); } diff --git a/code/TextureTransform.cpp b/code/TextureTransform.cpp index 98e1becb9..29257404d 100644 --- a/code/TextureTransform.cpp +++ b/code/TextureTransform.cpp @@ -54,7 +54,8 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -TextureTransformStep::TextureTransformStep() +TextureTransformStep::TextureTransformStep() : + configFlags() { // nothing to do here } diff --git a/code/ValidateDataStructure.cpp b/code/ValidateDataStructure.cpp index 98d16be5e..2a2e1a0d6 100644 --- a/code/ValidateDataStructure.cpp +++ b/code/ValidateDataStructure.cpp @@ -60,7 +60,8 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -ValidateDSProcess::ValidateDSProcess() +ValidateDSProcess::ValidateDSProcess() : + mScene() {} // ------------------------------------------------------------------------------------------------ @@ -690,8 +691,7 @@ void ValidateDSProcess::Validate( const aiMaterial* pMaterial) if (aiPTI_String == prop->mType) { // FIX: strings are now stored in a less expensive way, but we can't use the // validation routine for 'normal' aiStrings - uint32_t len; - if (prop->mDataLength < 5 || prop->mDataLength < 4 + (len=*reinterpret_cast(prop->mData)) + 1) { + if (prop->mDataLength < 5 || prop->mDataLength < 4 + (*reinterpret_cast(prop->mData)) + 1) { ReportError("aiMaterial::mProperties[%i].mDataLength is " "too small to contain a string (%i, needed: %i)", i,prop->mDataLength,sizeof(aiString)); diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index fb890129e..4e5a1131a 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -109,7 +109,14 @@ public: mEnforcePP = pEnforcePP; } - ExportFormatEntry() : mExportFunction(), mEnforcePP() {} + ExportFormatEntry() : + mExportFunction() + , mEnforcePP() + { + mDescription.id = NULL; + mDescription.description = NULL; + mDescription.fileExtension = NULL; + } }; From de6f0f2a7d810c8e4cae8e28d77b2a9c312f27c9 Mon Sep 17 00:00:00 2001 From: Jaime Machado Neto Date: Tue, 26 May 2015 08:40:43 -0300 Subject: [PATCH 32/32] Creating the functionality to list all Importer descriptions and the number of importers available. --- code/Assimp.cpp | 15 +++++++++++++++ include/assimp/cimport.h | 14 ++++++++++++++ include/assimp/importerdesc.h | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/code/Assimp.cpp b/code/Assimp.cpp index f8df73415..ec5fd7ab7 100644 --- a/code/Assimp.cpp +++ b/code/Assimp.cpp @@ -423,6 +423,21 @@ const char* aiGetErrorString() return gLastErrorString.c_str(); } +// ----------------------------------------------------------------------------------------------- +// Return the description of a importer given its index +const aiImporterDesc* aiGetImportFormatDescription( size_t pIndex) +{ + return Importer().GetImporterInfo(pIndex); +} + +// ----------------------------------------------------------------------------------------------- +// Return the number of importers +size_t aiGetImportFormatCount(void) +{ + return Importer().GetImporterCount(); +} + + // ------------------------------------------------------------------------------------------------ // Returns the error text of the last failed import process. aiBool aiIsExtensionSupported(const char* szExtension) diff --git a/include/assimp/cimport.h b/include/assimp/cimport.h index 6e85882d1..3dc95c00b 100644 --- a/include/assimp/cimport.h +++ b/include/assimp/cimport.h @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_ASSIMP_H_INC #define AI_ASSIMP_H_INC #include "types.h" +#include #ifdef __cplusplus extern "C" { @@ -539,7 +540,20 @@ ASSIMP_API void aiIdentityMatrix3( ASSIMP_API void aiIdentityMatrix4( C_STRUCT aiMatrix4x4* mat); +// -------------------------------------------------------------------------------- +/** Returns the number of import file formats available in the current Assimp build. + * Use aiGetImportFormatDescription() to retrieve infos of a specific import format. + */ +ASSIMP_API size_t aiGetImportFormatCount(void); +// -------------------------------------------------------------------------------- +/** Returns a description of the nth import file format. Use #aiGetImportFormatCount() + * to learn how many import formats are supported. + * @param pIndex Index of the import format to retrieve information for. Valid range is + * 0 to #aiGetImportFormatCount() + * @return A description of that specific import format. NULL if pIndex is out of range. + */ +ASSIMP_API const C_STRUCT aiImporterDesc* aiGetImportFormatDescription( size_t pIndex); #ifdef __cplusplus } #endif diff --git a/include/assimp/importerdesc.h b/include/assimp/importerdesc.h index e61112a17..a7bbb4da1 100644 --- a/include/assimp/importerdesc.h +++ b/include/assimp/importerdesc.h @@ -138,6 +138,6 @@ Will return a NULL-pointer if no assigned importer desc. was found for the given \param extension [in] The extension to look for \return A pointer showing to the ImporterDesc, \see aiImporterDesc. */ -ASSIMP_API C_STRUCT const aiImporterDesc* aiGetImporterDesc( const char *extension ); +ASSIMP_API const C_STRUCT aiImporterDesc* aiGetImporterDesc( const char *extension ); #endif