From 339cc2e951d0ec8d87e9c010f2fbf4ef0ae1205c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 31 May 2018 20:15:13 +0200 Subject: [PATCH 01/10] Some review findings. --- code/XFileImporter.cpp | 7 ++++++- code/XFileParser.cpp | 10 ++++++++-- tools/assimp_view/Display.cpp | 19 +++++++------------ tools/assimp_view/assimp_view.cpp | 3 +-- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/code/XFileImporter.cpp b/code/XFileImporter.cpp index fd28fbb79..d6d1e0078 100644 --- a/code/XFileImporter.cpp +++ b/code/XFileImporter.cpp @@ -332,6 +332,11 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec // collect vertex data for indices of this face for( unsigned int d = 0; d < df.mNumIndices; ++d ) { df.mIndices[d] = newIndex; + const unsigned int newIdx( pf.mIndices[ d ] ); + if ( newIdx > sourceMesh->mPositions.size() ) { + continue; + } + orgPoints[newIndex] = pf.mIndices[d]; // Position @@ -459,7 +464,7 @@ void XFileImporter::CreateAnimations( aiScene* pScene, const XFile::Scene* pData nbone->mNodeName.Set( bone->mBoneName); nanim->mChannels[b] = nbone; - // keyframes are given as combined transformation matrix keys + // key-frames are given as combined transformation matrix keys if( !bone->mTrafoKeys.empty() ) { nbone->mNumPositionKeys = (unsigned int)bone->mTrafoKeys.size(); diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index bda59ba59..01cbe80b9 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -471,7 +471,10 @@ void XFileParser::ParseDataObjectMesh( Mesh* pMesh) unsigned int numIndices = ReadInt(); Face& face = pMesh->mPosFaces[a]; for (unsigned int b = 0; b < numIndices; ++b) { - face.mIndices.push_back( ReadInt() ); + const int idx( ReadInt() ); + if ( idx <= numVertices ) { + face.mIndices.push_back( idx ); + } } TestForSeparator(); } @@ -1293,7 +1296,8 @@ unsigned int XFileParser::ReadBinDWord() { // ------------------------------------------------------------------------------------------------ unsigned int XFileParser::ReadInt() { - if( mIsBinaryFormat) +: +cd if( mIsBinaryFormat) { if( mBinaryNumCount == 0 && mEnd - mP >= 2) { @@ -1305,6 +1309,7 @@ unsigned int XFileParser::ReadInt() } --mBinaryNumCount; + const size_t len( mEnd - mP ); if ( mEnd - mP >= 4) { return ReadBinDWord(); } else { @@ -1340,6 +1345,7 @@ unsigned int XFileParser::ReadInt() } CheckForSeparator(); + return isNegative ? ((unsigned int) -int( number)) : number; } } diff --git a/tools/assimp_view/Display.cpp b/tools/assimp_view/Display.cpp index 7d986fa9c..4124822a5 100644 --- a/tools/assimp_view/Display.cpp +++ b/tools/assimp_view/Display.cpp @@ -362,9 +362,7 @@ int CDisplay::ReplaceCurrentTexture(const char* szPath) *tex = piTexture; m_pcCurrentTexture->piTexture = tex; - //if (!pcMesh->bSharedFX){ - pcMesh->piEffect->SetTexture(tex_string,piTexture); - //} + pcMesh->piEffect->SetTexture(tex_string,piTexture); } } @@ -562,7 +560,6 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, tvi.iImage = m_aiImageList[AI_VIEW_IMGLIST_MATERIAL]; tvi.iSelectedImage = m_aiImageList[AI_VIEW_IMGLIST_MATERIAL]; tvi.lParam = (LPARAM)10; - //tvi.state = TVIS_EXPANDED | TVIS_EXPANDEDONCE ; sNew.itemex = tvi; sNew.hInsertAfter = TVI_LAST; @@ -629,7 +626,7 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, return 1; } //------------------------------------------------------------------------------- -// Expand all elements in the treeview +// Expand all elements in the tree-view int CDisplay::ExpandTree() { // expand all materials @@ -779,7 +776,7 @@ int CDisplay::OnRender() // Now render the log display in the upper right corner of the window CLogDisplay::Instance().OnRender(); - // present the backbuffer + // present the back-buffer g_piDevice->EndScene(); g_piDevice->Present(NULL,NULL,NULL,NULL); @@ -1593,7 +1590,7 @@ int CDisplay::HandleInput() return 1; } //------------------------------------------------------------------------------- -// Process input for an empty scen view to allow for skybox rotations +// Process input for an empty scene view to allow for sky-box rotations int CDisplay::HandleInputEmptyScene() { if(CBackgroundPainter::TEXTURE_CUBE == CBackgroundPainter::Instance().GetMode()) @@ -2035,7 +2032,7 @@ int CDisplay::RenderNode (aiNode* piNode,const aiMatrix4x4& piMatrix, g_piDevice->SetVertexDeclaration( gDefaultVertexDecl); if (g_sOptions.bNoAlphaBlending) { - // manually disable alphablending + // manually disable alpha-blending g_piDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); } @@ -2199,9 +2196,6 @@ int CDisplay::RenderTextureView() // it might be that there is no texture ... if (!m_pcCurrentTexture->piTexture) { - // FIX: no such log message. it would be repeated to often - //CLogDisplay::Instance().AddEntry("Unable to display texture. Image is unreachable.", - // D3DCOLOR_ARGB(0xFF,0xFF,0,0)); return 0; } @@ -2296,5 +2290,6 @@ int CDisplay::RenderTextureView() // do we need to draw UV coordinates? return 1; } -}; + +} diff --git a/tools/assimp_view/assimp_view.cpp b/tools/assimp_view/assimp_view.cpp index e68b20a00..2798a9980 100644 --- a/tools/assimp_view/assimp_view.cpp +++ b/tools/assimp_view/assimp_view.cpp @@ -178,7 +178,6 @@ DWORD WINAPI LoadThreadProc(LPVOID lpParameter) // get the end time of zje operation, calculate delta t double fEnd = (double)timeGetTime(); g_fLoadTime = (float)((fEnd - fCur) / 1000); -// char szTemp[128]; g_bLoadingFinished = true; // check whether the loading process has failed ... @@ -202,7 +201,7 @@ DWORD WINAPI LoadThreadProc(LPVOID lpParameter) //------------------------------------------------------------------------------- int LoadAsset(void) { - // set the world and world rotation matrices to the identuty + // set the world and world rotation matrices to the identity g_mWorldRotate = aiMatrix4x4(); g_mWorld = aiMatrix4x4(); From 2188703f55ce294d8b3136516626d1f240fd184c Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 13 Jun 2018 10:46:30 +0800 Subject: [PATCH 02/10] fix build for independent build dir --- tools/assimp_cmd/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/assimp_cmd/CMakeLists.txt b/tools/assimp_cmd/CMakeLists.txt index 4a1a73d7c..ae38b5f11 100644 --- a/tools/assimp_cmd/CMakeLists.txt +++ b/tools/assimp_cmd/CMakeLists.txt @@ -42,6 +42,7 @@ cmake_minimum_required( VERSION 2.6 ) INCLUDE_DIRECTORIES( ${Assimp_SOURCE_DIR}/include ${Assimp_SOURCE_DIR}/code + ${Assimp_BINARY_DIR}/tools/assimp_cmd ) LINK_DIRECTORIES( ${Assimp_BINARY_DIR} ${Assimp_BINARY_DIR}/lib ) From 0b02b92701fdec3f94648b95a4e0fd763b167d10 Mon Sep 17 00:00:00 2001 From: Max Vollmer Date: Fri, 15 Jun 2018 15:46:38 +0200 Subject: [PATCH 03/10] Some FBX files have Null/LimbNode attributes with an empty Properties70 element, where the Element is not NULL, but it's Compound is. The code only checked if the Element itself is NULL, thus causing a DeadlyImportError when trying to instantiate a PropertyTable for an Element that doesn't have a Compound. --- code/FBXDocumentUtil.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBXDocumentUtil.cpp b/code/FBXDocumentUtil.cpp index b7de8d91d..6f1e18e42 100644 --- a/code/FBXDocumentUtil.cpp +++ b/code/FBXDocumentUtil.cpp @@ -115,7 +115,7 @@ std::shared_ptr GetPropertyTable(const Document& doc, } } - if(!Properties70) { + if(!Properties70 || !Properties70->Compound()) { if(!no_warn) { DOMWarning("property table (Properties70) not found",&element); } From a03ab068beef7dc557342b1a89af80dcffbe9206 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 16 Jun 2018 09:10:30 +0200 Subject: [PATCH 04/10] Update XFileParser.cpp Fix typo. --- code/XFileParser.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 01cbe80b9..3c8a83b85 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -1296,8 +1296,7 @@ unsigned int XFileParser::ReadBinDWord() { // ------------------------------------------------------------------------------------------------ unsigned int XFileParser::ReadInt() { -: -cd if( mIsBinaryFormat) + if( mIsBinaryFormat) { if( mBinaryNumCount == 0 && mEnd - mP >= 2) { From d416fe874e9422219a239bcba6afeb72a06c23cb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 16 Jun 2018 10:32:43 +0200 Subject: [PATCH 05/10] Update XFileParser.cpp Fix compiler warnings. --- code/XFileParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/XFileParser.cpp b/code/XFileParser.cpp index 86074e256..e7bf8518c 100644 --- a/code/XFileParser.cpp +++ b/code/XFileParser.cpp @@ -472,7 +472,7 @@ void XFileParser::ParseDataObjectMesh( Mesh* pMesh) Face& face = pMesh->mPosFaces[a]; for (unsigned int b = 0; b < numIndices; ++b) { const int idx( ReadInt() ); - if ( idx <= numVertices ) { + if ( static_cast( idx ) <= numVertices ) { face.mIndices.push_back( idx ); } } @@ -1309,7 +1309,7 @@ unsigned int XFileParser::ReadInt() --mBinaryNumCount; const size_t len( mEnd - mP ); - if ( mEnd - mP >= 4) { + if ( len >= 4) { return ReadBinDWord(); } else { mP = mEnd; From 41bf572af624127772ec705eb4937539a87cfe0b Mon Sep 17 00:00:00 2001 From: CwTCwT Date: Sat, 16 Jun 2018 15:08:19 +0200 Subject: [PATCH 06/10] issue_2016 only add material uv mappings if set, ignore when no uvmapping set removed unneccessary pad_i1 field (to prevent unnecessary field read exceptions) --- code/BlenderLoader.cpp | 5 +- code/BlenderScene.cpp | 1 - code/BlenderScene.h | 1 - test/CMakeLists.txt | 1 + test/models/BLEND/test_279.blend | Bin 0 -> 470140 bytes test/unit/utBlenderWork.cpp | 82 +++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 test/models/BLEND/test_279.blend create mode 100644 test/unit/utBlenderWork.cpp diff --git a/code/BlenderLoader.cpp b/code/BlenderLoader.cpp index 30aafc705..a141eccfd 100644 --- a/code/BlenderLoader.cpp +++ b/code/BlenderLoader.cpp @@ -1045,7 +1045,10 @@ void BlenderImporter::ConvertMesh(const Scene& /*in*/, const Object* /*obj*/, co } } } - matTexUvMappings.insert(std::make_pair(m, texuv)); + if (texuv.size()) + { + matTexUvMappings.insert(std::make_pair(m, texuv)); + } } // collect texture coordinates, they're stored in a separate per-face buffer diff --git a/code/BlenderScene.cpp b/code/BlenderScene.cpp index abad7affc..ad2d6fbba 100644 --- a/code/BlenderScene.cpp +++ b/code/BlenderScene.cpp @@ -800,7 +800,6 @@ template <> void Structure::Convert( ) const { ReadFieldArray(dest.typemap, "typemap", db); - ReadField(dest.pad_i1, "pad_i1", db); ReadField(dest.totlayer, "totlayer", db); ReadField(dest.maxlayer, "maxlayer", db); ReadField(dest.totsize, "totsize", db); diff --git a/code/BlenderScene.h b/code/BlenderScene.h index b52ec20b5..b74d7b198 100644 --- a/code/BlenderScene.h +++ b/code/BlenderScene.h @@ -432,7 +432,6 @@ CustomData 208 struct CustomData : ElemBase { vector > layers; int typemap[42]; // CD_NUMTYPES - int pad_i1; int totlayer; int maxlayer; int totsize; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7c5ff3706..d92b52b5a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -106,6 +106,7 @@ SET( IMPORTERS unit/utBlendImportAreaLight.cpp unit/utBlenderImportExport.cpp unit/utBlendImportMaterials.cpp + unit/utBlenderWork.cpp unit/utBVHImportExport.cpp unit/utColladaExportCamera.cpp unit/utColladaExportLight.cpp diff --git a/test/models/BLEND/test_279.blend b/test/models/BLEND/test_279.blend new file mode 100644 index 0000000000000000000000000000000000000000..78d35485eae02c0cb98969b538e98caef613e5e8 GIT binary patch literal 470140 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

O!0&Wk6_emNMX7Udv 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 +#include +#include +#include + +using namespace ::Assimp; + +class BlenderWorkTest : public ::testing::Test { +public: + virtual void SetUp() + { + im = new Assimp::Importer(); + } + + virtual void TearDown() + { + delete im; + } + +protected: + + Assimp::Importer* im; +}; + +TEST_F(BlenderWorkTest,work_279) { + const aiScene* pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/test_279.blend", aiProcess_ValidateDataStructure); + ASSERT_TRUE(pTest != NULL); + + // material has 2 diffuse textures + ASSERT_TRUE(pTest->HasMaterials()); + ASSERT_TRUE(pTest->HasMeshes()); + ASSERT_TRUE(pTest->mMeshes[0]->mNumVertices > 0); + EXPECT_EQ(1, pTest->mNumMaterials); +} + + + + + From a96587d551c2e2e2b369118d57ba91b52162ecbc Mon Sep 17 00:00:00 2001 From: CwTCwT Date: Sat, 16 Jun 2018 15:30:22 +0200 Subject: [PATCH 07/10] applied coding conventions added check against the known faces --- code/BlenderLoader.cpp | 3 +-- test/unit/utBlenderWork.cpp | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/BlenderLoader.cpp b/code/BlenderLoader.cpp index a141eccfd..d24fad180 100644 --- a/code/BlenderLoader.cpp +++ b/code/BlenderLoader.cpp @@ -1045,8 +1045,7 @@ void BlenderImporter::ConvertMesh(const Scene& /*in*/, const Object* /*obj*/, co } } } - if (texuv.size()) - { + if (texuv.size()) { matTexUvMappings.insert(std::make_pair(m, texuv)); } } diff --git a/test/unit/utBlenderWork.cpp b/test/unit/utBlenderWork.cpp index b0212b1d3..a17764673 100644 --- a/test/unit/utBlenderWork.cpp +++ b/test/unit/utBlenderWork.cpp @@ -73,6 +73,7 @@ TEST_F(BlenderWorkTest,work_279) { ASSERT_TRUE(pTest->HasMaterials()); ASSERT_TRUE(pTest->HasMeshes()); ASSERT_TRUE(pTest->mMeshes[0]->mNumVertices > 0); + ASSERT_EQ(44, pTest->mMeshes[0]->mNumFaces); EXPECT_EQ(1, pTest->mNumMaterials); } From e5fa1798f6ed700dcd08145aa87d57f4b86424d2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 17 Jun 2018 20:37:09 +0200 Subject: [PATCH 08/10] closes https://github.com/assimp/assimp/issues/2019: fix the qt-viewer without export. --- code/ColladaHelper.h | 7 ++-- code/ColladaLoader.cpp | 48 +++++++++++++-------------- code/ColladaParser.cpp | 28 ++++++++-------- tools/assimp_qt_viewer/glview.cpp | 11 +++--- tools/assimp_qt_viewer/mainwindow.cpp | 44 +++++++++++------------- tools/assimp_qt_viewer/mainwindow.hpp | 2 +- 6 files changed, 67 insertions(+), 73 deletions(-) diff --git a/code/ColladaHelper.h b/code/ColladaHelper.h index 0c90a42e6..fe6674b93 100644 --- a/code/ColladaHelper.h +++ b/code/ColladaHelper.h @@ -272,12 +272,13 @@ struct Node /** Node instances at this node */ std::vector mNodeInstances; - /** Rootnodes: Name of primary camera, if any */ + /** Root-nodes: Name of primary camera, if any */ std::string mPrimaryCamera; //! Constructor. Begin with a zero parent - Node() { - mParent = NULL; + Node() + : mParent( nullptr ){ + // empty } //! Destructor: delete all children subsequently diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 54178295c..d86985a29 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -181,26 +181,27 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I // ... then fill the materials with the now adjusted settings FillMaterials(parser, pScene); - // Apply unitsize scale calculation - pScene->mRootNode->mTransformation *= aiMatrix4x4(parser.mUnitSize, 0, 0, 0, - 0, parser.mUnitSize, 0, 0, - 0, 0, parser.mUnitSize, 0, - 0, 0, 0, 1); - if( !ignoreUpDirection ) { - // Convert to Y_UP, if different orientation - if( parser.mUpDirection == ColladaParser::UP_X) - pScene->mRootNode->mTransformation *= aiMatrix4x4( - 0, -1, 0, 0, - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); - else if( parser.mUpDirection == ColladaParser::UP_Z) - pScene->mRootNode->mTransformation *= aiMatrix4x4( - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, 0, - 0, 0, 0, 1); - } + // Apply unitsize scale calculation + pScene->mRootNode->mTransformation *= aiMatrix4x4(parser.mUnitSize, 0, 0, 0, + 0, parser.mUnitSize, 0, 0, + 0, 0, parser.mUnitSize, 0, + 0, 0, 0, 1); + if( !ignoreUpDirection ) { + // Convert to Y_UP, if different orientation + if( parser.mUpDirection == ColladaParser::UP_X) + pScene->mRootNode->mTransformation *= aiMatrix4x4( + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + else if( parser.mUpDirection == ColladaParser::UP_Z) + pScene->mRootNode->mTransformation *= aiMatrix4x4( + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, -1, 0, 0, + 0, 0, 0, 1); + } + // store all meshes StoreSceneMeshes( pScene); @@ -740,10 +741,6 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: // create bones if given if( pSrcController && pSrcController->mType == Collada::Skin) { - // refuse if the vertex count does not match -// if( pSrcController->mWeightCounts.size() != dstMesh->mNumVertices) -// throw DeadlyImportError( "Joint Controller vertex count does not match mesh vertex count"); - // resolve references - joint names const Collada::Accessor& jointNamesAcc = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, pSrcController->mJointNameSource); const Collada::Data& jointNames = pParser.ResolveLibraryReference( pParser.mDataLibrary, jointNamesAcc.mSource); @@ -971,7 +968,8 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars for( size_t b = a+1; b < mAnims.size(); ++b) { aiAnimation* other = mAnims[b]; - if( other->mNumChannels == 1 && other->mDuration == templateAnim->mDuration && other->mTicksPerSecond == templateAnim->mTicksPerSecond ) + if( other->mNumChannels == 1 && other->mDuration == templateAnim->mDuration && + other->mTicksPerSecond == templateAnim->mTicksPerSecond ) collectedAnimIndices.push_back( b); } diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp index fc283ff8c..052cd51c4 100644 --- a/code/ColladaParser.cpp +++ b/code/ColladaParser.cpp @@ -68,7 +68,7 @@ using namespace Assimp::Formatter; // Constructor to be privately used by Importer ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile) : mFileName( pFile ) - , mReader( NULL ) + , mReader( nullptr ) , mDataLibrary() , mAccessorLibrary() , mMeshLibrary() @@ -79,20 +79,20 @@ ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile) , mLightLibrary() , mCameraLibrary() , mControllerLibrary() - , mRootNode( NULL ) + , mRootNode( nullptr ) , mAnims() , mUnitSize( 1.0f ) , mUpDirection( UP_Y ) , mFormat(FV_1_5_n ) // We assume the newest file format by default { // validate io-handler instance - if ( NULL == pIOHandler ) { + if (nullptr == pIOHandler ) { throw DeadlyImportError("IOSystem is NULL." ); } // open the file std::unique_ptr file( pIOHandler->Open(pFile ) ); - if (file.get() == NULL) { + if (file.get() == nullptr) { throw DeadlyImportError( "Failed to open file " + pFile + "." ); } @@ -363,17 +363,17 @@ void ColladaParser::ReadAnimationClipLibrary() void ColladaParser::PostProcessControllers() { - for (ControllerLibrary::iterator it = mControllerLibrary.begin(); it != mControllerLibrary.end(); ++it) - { - std::string meshId = it->second.mMeshId; - ControllerLibrary::iterator findItr = mControllerLibrary.find(meshId); - while(findItr != mControllerLibrary.end()) { - meshId = findItr->second.mMeshId; - findItr = mControllerLibrary.find(meshId); - } + std::string meshId; + for (ControllerLibrary::iterator it = mControllerLibrary.begin(); it != mControllerLibrary.end(); ++it) { + meshId = it->second.mMeshId; + ControllerLibrary::iterator findItr = mControllerLibrary.find(meshId); + while(findItr != mControllerLibrary.end()) { + meshId = findItr->second.mMeshId; + findItr = mControllerLibrary.find(meshId); + } - it->second.mMeshId = meshId; - } + it->second.mMeshId = meshId; + } } // ------------------------------------------------------------------------------------------------ diff --git a/tools/assimp_qt_viewer/glview.cpp b/tools/assimp_qt_viewer/glview.cpp index 85dbbbae1..fd12b8e7f 100644 --- a/tools/assimp_qt_viewer/glview.cpp +++ b/tools/assimp_qt_viewer/glview.cpp @@ -1261,9 +1261,10 @@ void CGLView::Camera_Set(const size_t pCameraNumber) gluLookAt(hcam.Position.x, hcam.Position.y, hcam.Position.z, hcam.Target.x, hcam.Target.y, hcam.Target.z, up.x, up.y, up.z); } -void CGLView::Camera_RotateScene(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) -{ -auto deg2rad = [](const GLfloat pDegree) -> GLfloat { return pDegree * M_PI / 180.0; }; +void CGLView::Camera_RotateScene(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) { + auto deg2rad = [](const GLfloat pDegree) -> GLfloat { + return pDegree * AI_MATH_PI / 180.0; + }; aiMatrix4x4 mat_rot; @@ -1276,7 +1277,7 @@ auto deg2rad = [](const GLfloat pDegree) -> GLfloat { return pDegree * M_PI / 18 void CGLView::Camera_Rotate(const GLfloat pAngle_X, const GLfloat pAngle_Y, const GLfloat pAngle_Z, const aiMatrix4x4* pMatrix_Rotation_Initial) { -auto deg2rad = [](const GLfloat pDegree) -> GLfloat { return pDegree * M_PI / 180.0; }; + auto deg2rad = [](const GLfloat pDegree) -> GLfloat { return pDegree * AI_MATH_PI / 180.0; }; aiMatrix4x4 mat_rot; @@ -1289,7 +1290,7 @@ auto deg2rad = [](const GLfloat pDegree) -> GLfloat { return pDegree * M_PI / 18 void CGLView::Camera_Translate(const GLfloat pTranslate_X, const GLfloat pTranslate_Y, const GLfloat pTranslate_Z) { -aiVector3D vect_tr(pTranslate_X, pTranslate_Y, pTranslate_Z); + aiVector3D vect_tr(pTranslate_X, pTranslate_Y, pTranslate_Z); vect_tr *= mHelper_Camera.Rotation_AroundCamera; mHelper_Camera.Translation_ToScene += vect_tr; diff --git a/tools/assimp_qt_viewer/mainwindow.cpp b/tools/assimp_qt_viewer/mainwindow.cpp index 85a70ba6b..57140b304 100644 --- a/tools/assimp_qt_viewer/mainwindow.cpp +++ b/tools/assimp_qt_viewer/mainwindow.cpp @@ -132,9 +132,8 @@ void MainWindow::LogError(const QString& pMessage) void MainWindow::mousePressEvent(QMouseEvent* pEvent) { -const QPoint ms_pt = pEvent->pos(); - -__unused aiVector3D temp_v3; + const QPoint ms_pt = pEvent->pos(); + aiVector3D temp_v3; // Check if GLView is pointed. if(childAt(ms_pt) == mGLView) @@ -305,30 +304,32 @@ void MainWindow::SceneObject_LightSource(const QString& pName) ui->lstLight->selectAll(); } -void MainWindow::on_butOpenFile_clicked() -{ -aiString filter_temp; -QString filename, filter; +void MainWindow::on_butOpenFile_clicked() { + aiString filter_temp; + mImporter.GetExtensionList( filter_temp ); - mImporter.GetExtensionList(filter_temp); - filter = filter_temp.C_Str(); + QString filename, filter; + filter = filter_temp.C_Str(); filter.replace(';', ' '); filter.append(" ;; All (*.*)"); filename = QFileDialog::getOpenFileName(this, "Choose the file", "", filter); - if(!filename.isEmpty()) ImportFile(filename); + if (!filename.isEmpty()) { + ImportFile( filename ); + } } void MainWindow::on_butExport_clicked() { -using namespace Assimp; + using namespace Assimp; -QString filename, filter, format_id; -Exporter exporter; -QTime time_begin; -aiReturn rv; -QStringList exportersList; -QMap exportersMap; +#ifndef ASSIMP_BUILD_NO_EXPORT + QString filename, filter, format_id; + Exporter exporter; + QTime time_begin; + aiReturn rv; + QStringList exportersList; + QMap exportersMap; if(mScene == nullptr) @@ -373,6 +374,7 @@ QMap exportersMap; LogError(errorMessage); QMessageBox::critical(this, "Export error", errorMessage); } +#endif } void MainWindow::on_cbxLighting_clicked(bool pChecked) @@ -382,11 +384,7 @@ void MainWindow::on_cbxLighting_clicked(bool pChecked) else mGLView->Lighting_Disable(); -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else mGLView->update(); -#endif // ASSIMP_QT4_VIEWER } void MainWindow::on_lstLight_itemSelectionChanged() @@ -438,9 +436,5 @@ void MainWindow::on_cbxDrawAxes_clicked(bool checked) void MainWindow::on_cbxTextures_clicked(bool checked) { mGLView->Enable_Textures(checked); -#if ASSIMP_QT4_VIEWER - mGLView->updateGL(); -#else mGLView->update(); -#endif // ASSIMP_QT4_VIEWER } diff --git a/tools/assimp_qt_viewer/mainwindow.hpp b/tools/assimp_qt_viewer/mainwindow.hpp index e0d17181d..dd8f25332 100644 --- a/tools/assimp_qt_viewer/mainwindow.hpp +++ b/tools/assimp_qt_viewer/mainwindow.hpp @@ -6,7 +6,7 @@ #pragma once // Header files, Qt. -#if ASSIMP_QT4_VIEWER +#if defined ASSIMP_QT4_VIEWER # include #else # include From cc08c192480f8b29e212b59827b3f09d41a30930 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 18 Jun 2018 21:19:54 +0200 Subject: [PATCH 09/10] closes https://github.com/assimp/assimp/issues/2024: make code more readable. --- code/PlyLoader.cpp | 424 +++++++++++++++++++++------------------------ 1 file changed, 201 insertions(+), 223 deletions(-) diff --git a/code/PlyLoader.cpp b/code/PlyLoader.cpp index 1bdd6e694..7e55e6c3e 100644 --- a/code/PlyLoader.cpp +++ b/code/PlyLoader.cpp @@ -55,7 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -using namespace Assimp; +using namespace ::Assimp; static const aiImporterDesc desc = { "Stanford Polygon Library (PLY) Importer", @@ -73,22 +73,20 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Internal stuff -namespace -{ - // ------------------------------------------------------------------------------------------------ - // Checks that property index is within range - template - const T &GetProperty(const std::vector &props, int idx) - { - if (static_cast(idx) >= props.size()) { - throw DeadlyImportError("Invalid .ply file: Property index is out of range."); +namespace { + // ------------------------------------------------------------------------------------------------ + // Checks that property index is within range + template + inline + const T &GetProperty(const std::vector &props, int idx) { + if (static_cast(idx) >= props.size()) { + throw DeadlyImportError("Invalid .ply file: Property index is out of range."); + } + + return props[idx]; } - - return props[idx]; - } } - // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer PLYImporter::PLYImporter() @@ -129,7 +127,7 @@ const aiImporterDesc* PLYImporter::GetInfo() const { // ------------------------------------------------------------------------------------------------ static bool isBigEndian(const char* szMe) { - ai_assert(NULL != szMe); + ai_assert(nullptr != szMe); // binary_little_endian // binary_big_endian @@ -150,7 +148,7 @@ static bool isBigEndian(const char* szMe) { // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { - static const std::string mode = "rb"; + const std::string mode = "rb"; std::unique_ptr fileStream(pIOHandler->Open(pFile, mode)); if (!fileStream.get()) { throw DeadlyImportError("Failed to open file " + pFile + "."); @@ -184,7 +182,7 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy char* szMe = (char*)&this->mBuffer[0]; SkipSpacesAndLineEnd(szMe, (const char**)&szMe); - // determine the format of the file data and construct the aimesh + // determine the format of the file data and construct the aiMesh PLY::DOM sPlyDom; this->pcDOM = &sPlyDom; @@ -192,7 +190,7 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy if (TokenMatch(szMe, "ascii", 5)) { SkipLine(szMe, (const char**)&szMe); if (!PLY::DOM::ParseInstance(streamedBuffer, &sPlyDom, this)) { - if (mGeneratedMesh != NULL) { + if (mGeneratedMesh != nullptr) { delete(mGeneratedMesh); mGeneratedMesh = nullptr; } @@ -206,7 +204,7 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy // skip the line, parse the rest of the header and build the DOM if (!PLY::DOM::ParseInstanceBinary(streamedBuffer, &sPlyDom, this, bIsBE)) { - if (mGeneratedMesh != NULL) { + if (mGeneratedMesh != nullptr) { delete(mGeneratedMesh); mGeneratedMesh = nullptr; } @@ -215,7 +213,7 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy throw DeadlyImportError("Invalid .ply file: Unable to build DOM (#2)"); } } else { - if (mGeneratedMesh != NULL) { + if (mGeneratedMesh != nullptr) { delete(mGeneratedMesh); mGeneratedMesh = nullptr; } @@ -225,7 +223,7 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy } } else { AI_DEBUG_INVALIDATE_PTR(this->mBuffer); - if (mGeneratedMesh != NULL) { + if (mGeneratedMesh != nullptr) { delete(mGeneratedMesh); mGeneratedMesh = nullptr; } @@ -237,13 +235,13 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy //free the file buffer streamedBuffer.close(); - if (mGeneratedMesh == NULL) { + if (mGeneratedMesh == nullptr) { throw DeadlyImportError("Invalid .ply file: Unable to extract mesh data "); } // if no face list is existing we assume that the vertex // list is containing a list of points - bool pointsOnly = mGeneratedMesh->mFaces == NULL ? true : false; + bool pointsOnly = mGeneratedMesh->mFaces == nullptr ? true : false; if (pointsOnly) { mGeneratedMesh->mPrimitiveTypes = aiPrimitiveType::aiPrimitiveType_POINT; } @@ -277,8 +275,8 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy } void PLYImporter::LoadVertex(const PLY::Element* pcElement, const PLY::ElementInstance* instElement, unsigned int pos) { - ai_assert(NULL != pcElement); - ai_assert(NULL != instElement); + ai_assert(nullptr != pcElement); + ai_assert(nullptr != instElement); ai_uint aiPositions[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; PLY::EDataType aiTypes[3] = { EDT_Char, EDT_Char, EDT_Char }; @@ -416,7 +414,7 @@ void PLYImporter::LoadVertex(const PLY::Element* pcElement, const PLY::ElementIn haveColor = true; } - // assume 1.0 for the alpha channel ifit is not set + // assume 1.0 for the alpha channel if it is not set if (0xFFFFFFFF == aiColors[3]) { cOut.a = 1.0; } else { @@ -481,225 +479,205 @@ void PLYImporter::LoadVertex(const PLY::Element* pcElement, const PLY::ElementIn // ------------------------------------------------------------------------------------------------ // Convert a color component to [0...1] ai_real PLYImporter::NormalizeColorValue(PLY::PropertyInstance::ValueUnion val, PLY::EDataType eType) { - switch (eType) - { - case EDT_Float: - return val.fFloat; - case EDT_Double: - return (ai_real)val.fDouble; + switch (eType) { + case EDT_Float: + return val.fFloat; + case EDT_Double: + return (ai_real)val.fDouble; + case EDT_UChar: + return (ai_real)val.iUInt / (ai_real)0xFF; + case EDT_Char: + return (ai_real)(val.iInt + (0xFF / 2)) / (ai_real)0xFF; + case EDT_UShort: + return (ai_real)val.iUInt / (ai_real)0xFFFF; + case EDT_Short: + return (ai_real)(val.iInt + (0xFFFF / 2)) / (ai_real)0xFFFF; + case EDT_UInt: + return (ai_real)val.iUInt / (ai_real)0xFFFF; + case EDT_Int: + return ((ai_real)val.iInt / (ai_real)0xFF) + 0.5f; + default: + break; + } - case EDT_UChar: - return (ai_real)val.iUInt / (ai_real)0xFF; - case EDT_Char: - return (ai_real)(val.iInt + (0xFF / 2)) / (ai_real)0xFF; - case EDT_UShort: - return (ai_real)val.iUInt / (ai_real)0xFFFF; - case EDT_Short: - return (ai_real)(val.iInt + (0xFFFF / 2)) / (ai_real)0xFFFF; - case EDT_UInt: - return (ai_real)val.iUInt / (ai_real)0xFFFF; - case EDT_Int: - return ((ai_real)val.iInt / (ai_real)0xFF) + 0.5f; - default:; - }; - return 0.0f; + return 0.0f; } // ------------------------------------------------------------------------------------------------ // Try to extract proper faces from the PLY DOM -void PLYImporter::LoadFace(const PLY::Element* pcElement, const PLY::ElementInstance* instElement, unsigned int pos) -{ - ai_assert(NULL != pcElement); - ai_assert(NULL != instElement); +void PLYImporter::LoadFace(const PLY::Element* pcElement, const PLY::ElementInstance* instElement, + unsigned int pos) { + ai_assert(nullptr != pcElement); + ai_assert(nullptr != instElement); - if (mGeneratedMesh == NULL) - throw DeadlyImportError("Invalid .ply file: Vertices should be declared before faces"); - - bool bOne = false; - - // index of the vertex index list - unsigned int iProperty = 0xFFFFFFFF; - PLY::EDataType eType = EDT_Char; - bool bIsTriStrip = false; - - // index of the material index property - //unsigned int iMaterialIndex = 0xFFFFFFFF; - //PLY::EDataType eType2 = EDT_Char; - - // texture coordinates - unsigned int iTextureCoord = 0xFFFFFFFF; - PLY::EDataType eType3 = EDT_Char; - - // face = unique number of vertex indices - if (PLY::EEST_Face == pcElement->eSemantic) - { - unsigned int _a = 0; - for (std::vector::const_iterator a = pcElement->alProperties.begin(); - a != pcElement->alProperties.end(); ++a, ++_a) - { - if (PLY::EST_VertexIndex == (*a).Semantic) - { - // must be a dynamic list! - if (!(*a).bIsList) - continue; - - iProperty = _a; - bOne = true; - eType = (*a).eType; - } - /*else if (PLY::EST_MaterialIndex == (*a).Semantic) - { - if ((*a).bIsList) - continue; - iMaterialIndex = _a; - bOne = true; - eType2 = (*a).eType; - }*/ - else if (PLY::EST_TextureCoordinates == (*a).Semantic) - { - // must be a dynamic list! - if (!(*a).bIsList) - continue; - iTextureCoord = _a; - bOne = true; - eType3 = (*a).eType; - } - } - } - // triangle strip - // TODO: triangle strip and material index support??? - else if (PLY::EEST_TriStrip == pcElement->eSemantic) - { - unsigned int _a = 0; - for (std::vector::const_iterator a = pcElement->alProperties.begin(); - a != pcElement->alProperties.end(); ++a, ++_a) - { - // must be a dynamic list! - if (!(*a).bIsList) - continue; - iProperty = _a; - bOne = true; - bIsTriStrip = true; - eType = (*a).eType; - break; - } - } - - // check whether we have at least one per-face information set - if (bOne) - { - if (mGeneratedMesh->mFaces == NULL) - { - mGeneratedMesh->mNumFaces = pcElement->NumOccur; - mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces]; + if (mGeneratedMesh == nullptr) { + throw DeadlyImportError("Invalid .ply file: Vertices should be declared before faces"); } - if (!bIsTriStrip) - { - // parse the list of vertex indices - if (0xFFFFFFFF != iProperty) - { - const unsigned int iNum = (unsigned int)GetProperty(instElement->alProperties, iProperty).avList.size(); - mGeneratedMesh->mFaces[pos].mNumIndices = iNum; - mGeneratedMesh->mFaces[pos].mIndices = new unsigned int[iNum]; + bool bOne = false; - std::vector::const_iterator p = - GetProperty(instElement->alProperties, iProperty).avList.begin(); + // index of the vertex index list + unsigned int iProperty = 0xFFFFFFFF; + PLY::EDataType eType = EDT_Char; + bool bIsTriStrip = false; - for (unsigned int a = 0; a < iNum; ++a, ++p) - { - mGeneratedMesh->mFaces[pos].mIndices[a] = PLY::PropertyInstance::ConvertTo(*p, eType); - } - } + // index of the material index property + //unsigned int iMaterialIndex = 0xFFFFFFFF; + //PLY::EDataType eType2 = EDT_Char; - // parse the material index - // cannot be handled without processing the whole file first - /*if (0xFFFFFFFF != iMaterialIndex) - { - mGeneratedMesh->mFaces[pos]. = PLY::PropertyInstance::ConvertTo( - GetProperty(instElement->alProperties, iMaterialIndex).avList.front(), eType2); - }*/ + // texture coordinates + unsigned int iTextureCoord = 0xFFFFFFFF; + PLY::EDataType eType3 = EDT_Char; - if (0xFFFFFFFF != iTextureCoord) - { - const unsigned int iNum = (unsigned int)GetProperty(instElement->alProperties, iTextureCoord).avList.size(); + // face = unique number of vertex indices + if (PLY::EEST_Face == pcElement->eSemantic) { + unsigned int _a = 0; + for (std::vector::const_iterator a = pcElement->alProperties.begin(); + a != pcElement->alProperties.end(); ++a, ++_a) { + if (PLY::EST_VertexIndex == (*a).Semantic) { + // must be a dynamic list! + if (!(*a).bIsList) { + continue; + } - //should be 6 coords - std::vector::const_iterator p = - GetProperty(instElement->alProperties, iTextureCoord).avList.begin(); - - if ((iNum / 3) == 2) // X Y coord - { - for (unsigned int a = 0; a < iNum; ++a, ++p) - { - unsigned int vindex = mGeneratedMesh->mFaces[pos].mIndices[a / 2]; - if (vindex < mGeneratedMesh->mNumVertices) - { - if (mGeneratedMesh->mTextureCoords[0] == NULL) - { - mGeneratedMesh->mNumUVComponents[0] = 2; - mGeneratedMesh->mTextureCoords[0] = new aiVector3D[mGeneratedMesh->mNumVertices]; - } - - if (a % 2 == 0) - mGeneratedMesh->mTextureCoords[0][vindex].x = PLY::PropertyInstance::ConvertTo(*p, eType3); - else - mGeneratedMesh->mTextureCoords[0][vindex].y = PLY::PropertyInstance::ConvertTo(*p, eType3); - - mGeneratedMesh->mTextureCoords[0][vindex].z = 0; + iProperty = _a; + bOne = true; + eType = (*a).eType; + } else if (PLY::EST_TextureCoordinates == (*a).Semantic) { + // must be a dynamic list! + if (!(*a).bIsList) { + continue; + } + iTextureCoord = _a; + bOne = true; + eType3 = (*a).eType; } - } } - } } - else // triangle strips - { - // normally we have only one triangle strip instance where - // a value of -1 indicates a restart of the strip - bool flip = false; - const std::vector& quak = GetProperty(instElement->alProperties, iProperty).avList; - //pvOut->reserve(pvOut->size() + quak.size() + (quak.size()>>2u)); //Limits memory consumption - - int aiTable[2] = { -1, -1 }; - for (std::vector::const_iterator a = quak.begin(); a != quak.end(); ++a) { - const int p = PLY::PropertyInstance::ConvertTo(*a, eType); - - if (-1 == p) { - // restart the strip ... - aiTable[0] = aiTable[1] = -1; - flip = false; - continue; + // triangle strip + // TODO: triangle strip and material index support??? + else if (PLY::EEST_TriStrip == pcElement->eSemantic) { + unsigned int _a = 0; + for (std::vector::const_iterator a = pcElement->alProperties.begin(); + a != pcElement->alProperties.end(); ++a, ++_a) { + // must be a dynamic list! + if (!(*a).bIsList) { + continue; + } + iProperty = _a; + bOne = true; + bIsTriStrip = true; + eType = (*a).eType; + break; } - if (-1 == aiTable[0]) { - aiTable[0] = p; - continue; - } - if (-1 == aiTable[1]) { - aiTable[1] = p; - continue; + } + + // check whether we have at least one per-face information set + if (bOne) { + if (mGeneratedMesh->mFaces == nullptr) { + mGeneratedMesh->mNumFaces = pcElement->NumOccur; + mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces]; } - if (mGeneratedMesh->mFaces == NULL) + if (!bIsTriStrip) { + // parse the list of vertex indices + if (0xFFFFFFFF != iProperty) { + const unsigned int iNum = (unsigned int)GetProperty(instElement->alProperties, iProperty).avList.size(); + mGeneratedMesh->mFaces[pos].mNumIndices = iNum; + mGeneratedMesh->mFaces[pos].mIndices = new unsigned int[iNum]; + + std::vector::const_iterator p = + GetProperty(instElement->alProperties, iProperty).avList.begin(); + + for (unsigned int a = 0; a < iNum; ++a, ++p) { + mGeneratedMesh->mFaces[pos].mIndices[a] = PLY::PropertyInstance::ConvertTo(*p, eType); + } + } + + // parse the material index + // cannot be handled without processing the whole file first + /*if (0xFFFFFFFF != iMaterialIndex) { - mGeneratedMesh->mNumFaces = pcElement->NumOccur; - mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces]; + mGeneratedMesh->mFaces[pos]. = PLY::PropertyInstance::ConvertTo( + GetProperty(instElement->alProperties, iMaterialIndex).avList.front(), eType2); + }*/ + + if (0xFFFFFFFF != iTextureCoord) { + const unsigned int iNum = (unsigned int)GetProperty(instElement->alProperties, iTextureCoord).avList.size(); + + //should be 6 coords + std::vector::const_iterator p = + GetProperty(instElement->alProperties, iTextureCoord).avList.begin(); + + if ((iNum / 3) == 2) // X Y coord + { + for (unsigned int a = 0; a < iNum; ++a, ++p) { + unsigned int vindex = mGeneratedMesh->mFaces[pos].mIndices[a / 2]; + if (vindex < mGeneratedMesh->mNumVertices) { + if (mGeneratedMesh->mTextureCoords[0] == nullptr ) { + mGeneratedMesh->mNumUVComponents[0] = 2; + mGeneratedMesh->mTextureCoords[0] = new aiVector3D[mGeneratedMesh->mNumVertices]; + } + + if (a % 2 == 0) { + mGeneratedMesh->mTextureCoords[0][vindex].x = PLY::PropertyInstance::ConvertTo(*p, eType3); + } else { + mGeneratedMesh->mTextureCoords[0][vindex].y = PLY::PropertyInstance::ConvertTo(*p, eType3); + } + + mGeneratedMesh->mTextureCoords[0][vindex].z = 0; + } + } + } + } + } else { // triangle strips + // normally we have only one triangle strip instance where + // a value of -1 indicates a restart of the strip + bool flip = false; + const std::vector& quak = GetProperty(instElement->alProperties, iProperty).avList; + //pvOut->reserve(pvOut->size() + quak.size() + (quak.size()>>2u)); //Limits memory consumption + + int aiTable[2] = { -1, -1 }; + for (std::vector::const_iterator a = quak.begin(); a != quak.end(); ++a) { + const int p = PLY::PropertyInstance::ConvertTo(*a, eType); + + if (-1 == p) { + // restart the strip ... + aiTable[0] = aiTable[1] = -1; + flip = false; + continue; + } + if (-1 == aiTable[0]) { + aiTable[0] = p; + continue; + } + if (-1 == aiTable[1]) { + aiTable[1] = p; + continue; + } + + if (mGeneratedMesh->mFaces == nullptr) { + mGeneratedMesh->mNumFaces = pcElement->NumOccur; + mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces]; + } + + mGeneratedMesh->mFaces[pos].mNumIndices = 3; + mGeneratedMesh->mFaces[pos].mIndices = new unsigned int[3]; + mGeneratedMesh->mFaces[pos].mIndices[0] = aiTable[0]; + mGeneratedMesh->mFaces[pos].mIndices[1] = aiTable[1]; + mGeneratedMesh->mFaces[pos].mIndices[2] = p; + + // every second pass swap the indices. + flip = !flip; + if ( flip ) { + std::swap(mGeneratedMesh->mFaces[pos].mIndices[0], mGeneratedMesh->mFaces[pos].mIndices[1]); + } + + aiTable[0] = aiTable[1]; + aiTable[1] = p; + } } - - mGeneratedMesh->mFaces[pos].mNumIndices = 3; - mGeneratedMesh->mFaces[pos].mIndices = new unsigned int[3]; - mGeneratedMesh->mFaces[pos].mIndices[0] = aiTable[0]; - mGeneratedMesh->mFaces[pos].mIndices[1] = aiTable[1]; - mGeneratedMesh->mFaces[pos].mIndices[2] = p; - - if ((flip = !flip)) { - std::swap(mGeneratedMesh->mFaces[pos].mIndices[0], mGeneratedMesh->mFaces[pos].mIndices[1]); - } - - aiTable[0] = aiTable[1]; - aiTable[1] = p; - } } - } } // ------------------------------------------------------------------------------------------------ From 64ab3e27fcaad0ab2de384f0fc2fdaf09fc5e54f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 18 Jun 2018 22:16:50 +0200 Subject: [PATCH 10/10] Fix missing model error in Irr-instancing closes https://github.com/assimp/assimp/issues/2011: add reference to free model. --- test/models/IRR/instancing.irr | Bin 74296 -> 37155 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/models/IRR/instancing.irr b/test/models/IRR/instancing.irr index f39ee1939836f882145c9875766984be65252b34..6687f4fdb26853adc430d02d77ccf88aca93af83 100644 GIT binary patch literal 37155 zcmeHQ-EP}96ux$WzJrnL#CBrm$AG$`S=*t&`hzA|i{1pZO(pDP$)Kbx-K*_lkF-}9 zWyv}uWzuqr4zuwkKw+o+C?4|Ye23@o=byj+4xT^EqwYPIsYv2y2gkj^!SkPa#oAYM}@6^8s-Fp`0>WfU0?4a8(i-|a^ z%DkD?C612k|DPsNBEzc4i}^(GIQv!H-l-a@>IS{R^5?MY`&3mJ^o@2F4Udxk;7Rf(T5}znd;bDn&Z(~Z#)`ajE9Ha;iz{p zJU$tZ54%Ta=e@yjG&mj5v#hEaOv|gPJz#bScbq?`ovc{;}2ObdDWTM|3XhK?&kqE-IolN1?$ z6*H$P&@JVc%RCG@sYz}8%}OuX^!JcWxot4qO@5u+T5a&O`CTICEE0e6@&hTM2XiTu z>EcYj7Lj_LNmJZSG7+RDZ4sm`Z4sn3Zp5{82;!05!jLHKF(gcT42k2xyog1bWHMQZ zsXa8?pjye)cvdT^8Ys718fjK0>62s&P1#C2bu*3Fd~qZBg0oCBCF|iNT4lbrgOiMp zf|IabxJ8^DWe*JRP5ogFnkCwrRG|Y zz4hpl#mHo2J(va$5wC26B0AXy)k>;H3*B<9r#h0zOExBxl$=@+Es6FhILY`ZI0@^8 z?+;U+st|`3ycd+XsZ z3qwZMg8@_0a-Q{p5*jWqSGlN;M($B?8bmLAf0z(!N>wwlUZZ|kOjb6GFrb~*{0pikOw=S1vok$p7qX$qqBjs<*Nnu)?$9-0W?ZO z9ss)mXtTj`?*MsLYjzq`uC}=%gF=Yd4Ul0sfU!`-T(L-+;$AUfB1jwCBFNuwiy*(> zjj$pJB#0-1U|~p<_81bTJ%+^bU=ZC{`3J7>1PzxrzTkq>$UO>9gXo3tPjmx$0OSGa zmDF5RWXzEmuy^A2c}f#FVy>xfBgP(>;^y{pgckZ+z4(2 zH-Z~o%uJ4em)IM#$eqsv)SCp51~AVa`cWqXVLL!^CRY^~$Du$t6i7S0%btWGxKU4* z+yQr_0dUkovEHkZs34!leyh6qslJ(=)Zs2YJoOMuK1%p$8a5uo}h7tFL6bNpt?$Ch) z_ZSBbX#k`F3U{ww1>-m)fg*)kNiFz^lMgJy#>odb`2Z&$?9s^wJIj9A*u zn1vyQZ;v6>Z;v5yJebBDt(8O#R4bVps8&)nP;R-fRj%GD=ROrE=nE-t(kYM2JA?lP DL}puh literal 74296 zcmeHQYj4~(7UkD2(Em{QbK}}^(mFueB5B%1fb9ddv0e0w;n-u>tslX7oK5@V+ny_q zR-$xB&TuFr$Q}%oi6sp$buW2&&wYr0{rS{=>E604cj-QIZ`{ny-L1QDH}2Yf?zY^n z+jcwn{?dKnK6L+ZPjPLI&k^oA!QIz5{1v2?a@A#m(e!IMS z?ao2*8uwq}9;5Z$^8Z^+Pma-}yXBQR`g4Qd*_BU%)-KS(V$jY@ciP*`SqY=+`Seg+1fK{R{s)cfTzA5VpM2@Ms5o@}G~v2I6q#38y$u3LFw1!_#Thkvqo;W5$?oi=(qTVpZCMLu#J)ZiTe+ZQ}$Uy@e70ZTLBecC+qIM4XT8?H2B&Sl z+Ke@=!h8Q1JZX>h+COO4rjusA+UVo$ce;noEaUwd#@DEt7ba~xMoTOwR*YPJ2axZh@Ny@g)9Lodx9=v!BZ!8LCSh5hgJ!!cT!K{xyg ziFuvcx4QhgvpOyIJe=>Vx4B1nv}v13P??*1@z;p2Q#QlcW?0c5AD@wTh4di&9;X@gpzeCIOW~DSs=nwS2 ze}-woGCI%Ey0^8=5}3Phn!ioDbE*?dxRj#7bV+R*Ot;jg!E{XtjYIH#J&BabJxzy6 zWePe>GE>lD(kY|!40_9KDno?k#dwXsPO`IRDq8jAlz*;zvdYsckyi{6^ere`yN)3< zW-W!b$`Pb`iF>bb_Yr$6& z!jxmLvM^=euOm$9<6!OT&F7IYWf(d2mJa7t8tXAzxD2nP>9AF63OdZboq`UtWXtH} z@lZV(BSz_SH+cSr zp(bHUA7|xQ4aegld^KH6l&w~qw#l^Frfo7E#oOdIoN%LXV;T_&HwrhJ z-kihxYMLd?1+i!q&&;#clk1!`o~wsR(sY=HFT+`BI!xqyxgd2x>zM<9j|A`w7S;li;?P{C(A68(rXH^d{Uf0I?{qbsmhsbla%7GnJ z2<)ORV4uYDa}^4z1!${#a(VP|iz60oS1o||;;R+N&ETON+ADRUz6p1V)bN| zr&S^^`QPM!8^5c>A|1k$oy|9WZMkXz-v8Qi)dKY2N+e9#=@((j{>X^?!{ZTn<#Z^g zLpdGZ*H@CGQV*vHQ*Nf$^Ej`btn##kDW|J$XL1bv^r{7DW9WKcS>Nxp>if!63-Erv zuZ&}-P3tk6!s8=EKDc&O_c)ky zN%a6j92Cz6O6MTdd)GsnPCegFnhuL2m-(yGbV_mo_*l;89n_Oio>o0MH*%*7$uL#2{#Hiw(p0GulcG6 zP(6U&O*Y=somsjI?G514cuu%6g}L+iO0mceqY5_)H;!?m>H&s%FuBb8+VueA>VYx- z$n{Cp0B!cNssU6D5YN_9HNY9!d&JOeY#&Qi0~mK=`&b^hUz(i(v^#*`mp9Zshry1S zEMBB)096Alni+IX_705e@f0eQ2TmS1dEn%M>sNuM^o2ZdpF{VS=~{Wfirxe-2u9{ylQsaIZ`=XE=(y*DNLzq0L3VG@Fq>Jk5|v!XEDl6+hjS2o3_dF zLN{%btvjtYbug&Tz%-@uo93GbDEmu5+ZyWUJT%*c%Us?xDLrpo0M{psbEzWG(K;N@F8o%2>23%{R6Z zlgJ_x5LaXKok>g8HyK=AHQBw{28d2mr)R`Rb zk2;%)<Q3iHn9o4&&QF`|g=!L9As`_>LH+AW{rt{MAtk~N_irRfBwKXwNB zB%Jf%ObhcP4#E4k&~F}ZvQ=!;Hd((nZIfxUP1|HTinqz_UBx05i)_~(K0<^Wg&R#5 z&mGe>3!JwVdmWvV#y?D(m*Jl@9j4)@pu@EO6m*z$%IM_rRXrKyY1NZco>o0sZYaLPls4~+N(pM7U} z@BZvQzISoW&fD1sPP+r-YXrtNLd-*|dVmn`svbb~0On8XKI6G$ahjO7O1lFXcT^9c zdH`k_^0^dRY@t3r4E&GG-s5d@4~u+o^1;amr+R>PZ>&@f3ez?6!EI@OPN&@ghWlR2 z2WM8uP_OnQr&D?WnWYulR8vytdb0G{^FBD$1E?OLUB9*4TsY5D*oj3cy83eM4$z-f z!jxTZnDOOy&A7Ab0aOpLZmvQKi}4ue`uPwk8r+JiOM}}=>(fZ*TQE&umYswbyBt$MP`(<+gd@;X#wt{QXg4xkvNb_W>dGMQ&-bv(^h zAK^yf#%srRZZC-(sUAS}0H%*r4-m^qyxgd2q$ f$GEYi9>9Kc0i8Za4gW3jNNr@z+!xN)Iy?RbNw-+_