Browse Source

Merge branch 'master' of github.com:assimp/assimp

Alexander Gessler 12 năm trước cách đây
mục cha
commit
07c1b2a68f

+ 3 - 0
code/ColladaExporter.cpp

@@ -58,6 +58,9 @@ void ExportSceneCollada(const char* pFile,IOSystem* pIOSystem, const aiScene* pS
 
 	// we're still here - export successfully completed. Write result to the given IOSYstem
 	boost::scoped_ptr<IOStream> outfile (pIOSystem->Open(pFile,"wt"));
+	if(outfile == NULL) {
+		throw DeadlyExportError("could not open output .dae file: " + std::string(pFile));
+	}
 
 	// XXX maybe use a small wrapper around IOStream that behaves like std::stringstream in order to avoid the extra copy.
 	outfile->Write( iDoTheExportThing.mOutput.str().c_str(), static_cast<size_t>(iDoTheExportThing.mOutput.tellp()),1);

+ 36 - 21
code/IFCLoader.cpp

@@ -192,29 +192,44 @@ void IFCImporter::InternReadFile( const std::string& pFile,
 		}
 
 		// search file (same name as the IFCZIP except for the file extension) and place file pointer there
-		if ( unzLocateFile( zip, fileName.c_str(), 0 ) == UNZ_OK )
-		{
-			// get file size, etc.
-			unz_file_info fileInfo;
-			unzGetCurrentFileInfo( zip , &fileInfo, 0, 0, 0, 0, 0, 0 );
-
-			uint8_t* buff = new uint8_t[fileInfo.uncompressed_size];
-
-			LogInfo("Decompressing IFCZIP file");
-
-			unzOpenCurrentFile( zip  );
-			const int ret = unzReadCurrentFile( zip, buff, fileInfo.uncompressed_size);
-			size_t filesize = fileInfo.uncompressed_size;
-			if ( ret < 0 || size_t(ret) != filesize )
-			{
-				delete[] buff;
-				ThrowException("Failed to decompress IFC ZIP file");
-			}
-			unzCloseCurrentFile( zip );
-			stream.reset(new MemoryIOStream(buff,fileInfo.uncompressed_size,true));
+		
+		if(UNZ_OK == unzGoToFirstFile(zip)) {
+			do {
+				//
+
+				// get file size, etc.
+				unz_file_info fileInfo;
+				char filename[256];
+				unzGetCurrentFileInfo( zip , &fileInfo, filename, sizeof(filename), 0, 0, 0, 0 );
+				
+				if (GetExtension(filename) != "ifc") {
+					continue;
+				}
+
+				uint8_t* buff = new uint8_t[fileInfo.uncompressed_size];
+
+				LogInfo("Decompressing IFCZIP file");
+
+				unzOpenCurrentFile( zip  );
+				const int ret = unzReadCurrentFile( zip, buff, fileInfo.uncompressed_size);
+				size_t filesize = fileInfo.uncompressed_size;
+				if ( ret < 0 || size_t(ret) != filesize )
+				{
+					delete[] buff;
+					ThrowException("Failed to decompress IFC ZIP file");
+				}
+				unzCloseCurrentFile( zip );
+				stream.reset(new MemoryIOStream(buff,fileInfo.uncompressed_size,true));
+				break;
+
+				if (unzGoToNextFile(zip) == UNZ_END_OF_LIST_OF_FILE) {
+					ThrowException("Found no IFC file member in IFCZIP file (1)");
+				}
+
+			} while(true);
 		}
 		else {
-			ThrowException("Found no IFC file member in IFCZIP file");
+			ThrowException("Found no IFC file member in IFCZIP file (2)");
 		}
 
 		unzClose(zip);

+ 6 - 0
code/ObjExporter.cpp

@@ -59,10 +59,16 @@ void ExportSceneObj(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene
 	// we're still here - export successfully completed. Write both the main OBJ file and the material script
 	{
 		boost::scoped_ptr<IOStream> outfile (pIOSystem->Open(pFile,"wt"));
+		if(outfile == NULL) {
+			throw DeadlyExportError("could not open output .obj file: " + std::string(pFile));
+		}
 		outfile->Write( exporter.mOutput.str().c_str(), static_cast<size_t>(exporter.mOutput.tellp()),1);
 	}
 	{
 		boost::scoped_ptr<IOStream> outfile (pIOSystem->Open(exporter.GetMaterialLibFileName(),"wt"));
+		if(outfile == NULL) {
+			throw DeadlyExportError("could not open output .mtl file: " + std::string(exporter.GetMaterialLibFileName()));
+		}
 		outfile->Write( exporter.mOutputMat.str().c_str(), static_cast<size_t>(exporter.mOutputMat.tellp()),1);
 	}
 }

+ 1 - 0
code/ObjFileData.h

@@ -283,6 +283,7 @@ struct Model
 		m_pCurrent(NULL),
 		m_pCurrentMaterial(NULL),
 		m_pDefaultMaterial(NULL),
+        m_pGroupFaceIDs(NULL),
 		m_strActiveGroup(""),
 		m_pCurrentMesh(NULL)
 	{

+ 3 - 9
code/ObjFileParser.cpp

@@ -528,18 +528,12 @@ int ObjFileParser::getMaterialIndex( const std::string &strMaterialName )
 //	Getter for a group name.  
 void ObjFileParser::getGroupName()
 {
-	// Get next word from data buffer
-	m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
-	m_DataIt = getNextWord<DataArrayIt>(m_DataIt, m_DataItEnd);
+	std::string strGroupName;
+   
+	m_DataIt = getName<DataArrayIt>(m_DataIt, m_DataItEnd, strGroupName);
 	if ( isEndOfBuffer( m_DataIt, m_DataItEnd ) )
 		return;
 
-	// Store the group name in the group library 
-	char *pStart = &(*m_DataIt);
-	while ( m_DataIt != m_DataItEnd && !isSeparator(*m_DataIt) )
-		m_DataIt++;
-	std::string strGroupName( pStart, &(*m_DataIt) );
-
 	// Change active group, if necessary
 	if ( m_pModel->m_strActiveGroup != strGroupName )
 	{

+ 4 - 0
code/PlyExporter.cpp

@@ -57,6 +57,10 @@ void ExportScenePly(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene
 
 	// we're still here - export successfully completed. Write the file.
 	boost::scoped_ptr<IOStream> outfile (pIOSystem->Open(pFile,"wt"));
+	if(outfile == NULL) {
+		throw DeadlyExportError("could not open output .ply file: " + std::string(pFile));
+	}
+
 	outfile->Write( exporter.mOutput.str().c_str(), static_cast<size_t>(exporter.mOutput.tellp()),1);
 }
 

+ 4 - 0
code/STLExporter.cpp

@@ -57,6 +57,10 @@ void ExportSceneSTL(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene
 
 	// we're still here - export successfully completed. Write the file.
 	boost::scoped_ptr<IOStream> outfile (pIOSystem->Open(pFile,"wt"));
+	if(outfile == NULL) {
+		throw DeadlyExportError("could not open output .stl file: " + std::string(pFile));
+	}
+
 	outfile->Write( exporter.mOutput.str().c_str(), static_cast<size_t>(exporter.mOutput.tellp()),1);
 }
 

+ 27 - 27
include/assimp/mesh.h

@@ -135,8 +135,9 @@ struct aiFace
 
 	//! Default constructor
 	aiFace()
+      : mNumIndices( 0 )
+      , mIndices( NULL )
 	{
-		mNumIndices = 0; mIndices = NULL;
 	}
 
 	//! Default destructor. Delete the index array
@@ -147,13 +148,13 @@ struct aiFace
 
 	//! Copy constructor. Copy the index array
 	aiFace( const aiFace& o)
+      : mIndices( NULL )
 	{
-		mIndices = NULL;
 		*this = o;
 	}
 
 	//! Assignment operator. Copy the index array
-	const aiFace& operator = ( const aiFace& o)
+	aiFace& operator = ( const aiFace& o)
 	{
 		if (&o == this)
 			return *this;
@@ -248,17 +249,17 @@ struct aiBone
 
 	//! Default constructor
 	aiBone()
+      : mNumWeights( 0 )
+      , mWeights( NULL )
 	{
-		mNumWeights = 0; mWeights = NULL;
 	}
 
 	//! Copy constructor
 	aiBone(const aiBone& other)
+      : mName( other.mName )
+      , mNumWeights( other.mNumWeights )
+      , mOffsetMatrix( other.mOffsetMatrix )
 	{
-		mNumWeights = other.mNumWeights;
-		mOffsetMatrix = other.mOffsetMatrix;
-		mName = other.mName;
-
 		if (other.mWeights && other.mNumWeights)
 		{
 			mWeights = new aiVertexWeight[mNumWeights];
@@ -378,10 +379,10 @@ struct aiAnimMesh
 #ifdef __cplusplus
 
 	aiAnimMesh()
-		: mVertices()
-		, mNormals()
-		, mTangents()
-		, mBitangents()
+		: mVertices( NULL )
+		, mNormals( NULL )
+		, mTangents( NULL )
+		, mBitangents( NULL )
 		, mNumVertices( 0 )
 	{
 		// fixme consider moving this to the ctor initializer list as well
@@ -610,29 +611,28 @@ struct aiMesh
 
 	//! Default constructor. Initializes all members to 0
 	aiMesh()
+		: mPrimitiveTypes( 0 )
+		, mNumVertices( 0 )
+		, mNumFaces( 0 )
+		, mVertices( NULL )
+		, mNormals( NULL )
+		, mTangents( NULL )
+		, mBitangents( NULL )
+		, mFaces( NULL )
+		, mNumBones( 0 )
+		, mBones( 0 )
+		, mMaterialIndex( 0 )
+		, mNumAnimMeshes( 0 )
+		, mAnimMeshes( NULL )
 	{
-		mNumVertices    = 0; 
-		mNumFaces       = 0;
-
-		mNumAnimMeshes = 0;
-
-		mPrimitiveTypes = 0;
-		mVertices = NULL; mFaces    = NULL;
-		mNormals  = NULL; mTangents = NULL;
-		mBitangents = NULL;
-		mAnimMeshes = NULL;
-
 		for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++)
 		{
 			mNumUVComponents[a] = 0;
 			mTextureCoords[a] = NULL;
 		}
+      
 		for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++)
 			mColors[a] = NULL;
-		mNumBones = 0; mBones = NULL;
-		mMaterialIndex = 0;
-		mNumAnimMeshes = 0;
-		mAnimMeshes = NULL;
 	}
 
 	//! Deletes all storage allocated for the mesh

+ 0 - 12
workspaces/vc9/assimp.vcproj

@@ -2044,18 +2044,6 @@
 						>
 					</File>
 				</Filter>
-				<Filter
-					Name="m3"
-					>
-					<File
-						RelativePath="..\..\code\M3Importer.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\..\code\M3Importer.h"
-						>
-					</File>
-				</Filter>
 				<Filter
 					Name="xgl"
 					>