Selaa lähdekoodia

Bugfix: SplitByBoneCountProcess sometimes split too early
Export API continued.
First version of the Collada Exporter added. Handles static geometry and node hierarchy upto now.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@894 67173fc5-114c-0410-ac8e-9d2fd5bffc1f

ulfjorensen 14 vuotta sitten
vanhempi
commit
3a4651b0ec

+ 22 - 6
code/Exporter.cpp

@@ -59,11 +59,8 @@ namespace Assimp {
 
 // ------------------------------------------------------------------------------------------------
 // Exporter worker function prototypes. Should not be necessary to #ifndef them, it's just a prototype
-	void ExportSceneCollada(aiExportDataBlob*, const aiScene*) {
-	}
-
-	void ExportScene3DS(aiExportDataBlob*, const aiScene*) {
-	}
+void ExportSceneCollada(aiExportDataBlob*, const aiScene*);
+void ExportScene3DS(aiExportDataBlob*, const aiScene*) { }
 
 /// Function pointer type of a Export worker function
 typedef void (*fpExportFunc)(aiExportDataBlob*, const aiScene*);
@@ -270,7 +267,26 @@ ASSIMP_API aiReturn aiExportSceneEx( const aiScene* pScene, const char* pFormatI
 // ------------------------------------------------------------------------------------------------
 ASSIMP_API const C_STRUCT aiExportDataBlob* aiExportSceneToBlob( const aiScene* pScene, const char* pFormatId )
 {
-	return NULL;
+	// find a suitable exporter
+	const Assimp::ExportFormatEntry* exporter = NULL;
+	for( size_t a = 0; a < aiGetExportFormatCount(); ++a )
+	{
+		if( strcmp( Assimp::gExporters[a].mDescription.id, pFormatId) == 0 )
+			exporter = Assimp::gExporters + a;
+	}
+	
+	if( !exporter )
+		return NULL;
+
+	aiExportDataBlob* blob = new aiExportDataBlob;
+	exporter->mExportFunction( blob, pScene);
+	if( !blob->data || blob->size == 0 )
+	{
+		delete blob;
+		return NULL;
+	}
+
+	return blob;
 }
 
 // ------------------------------------------------------------------------------------------------

+ 4 - 2
code/SplitByBoneCountProcess.cpp

@@ -192,12 +192,14 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector<aiMesh
 				const std::vector<BoneWeight>& vb = vertexBones[face.mIndices[b]];
 				for( size_t c = 0; c < vb.size(); ++c)
 				{
+					size_t boneIndex = vb[c].first;
 					// if the bone is already used in this submesh, it's ok
-					if( isBoneUsed[ vb[c].first ] )
+					if( isBoneUsed[boneIndex] )
 						continue;
 
 					// if it's not used, yet, we would need to add it. Store its bone index
-					newBonesAtCurrentFace.push_back( vb[c].first);
+					if( std::find( newBonesAtCurrentFace.begin(), newBonesAtCurrentFace.end(), boneIndex) == newBonesAtCurrentFace.end() )
+						newBonesAtCurrentFace.push_back( boneIndex);
 				}
 			}
 

+ 1 - 1
include/export.h

@@ -156,7 +156,7 @@ ASSIMP_API const C_STRUCT aiExportDataBlob* aiExportSceneToBlob( const C_STRUCT
 * returned by aiExportScene(). 
 * @param pData the data blob returned by aiExportScenetoBlob
 */
-ASSIMP_API C_STRUCT void aiReleaseExportBlob( const C_STRUCT aiExportDataBlob* pData );
+ASSIMP_API C_STRUCT void aiReleaseExportData( const C_STRUCT aiExportDataBlob* pData );
 
 #ifdef __cplusplus
 }

+ 12 - 0
tools/assimp_view/assimp_view.cpp

@@ -183,6 +183,18 @@ DWORD WINAPI LoadThreadProc(LPVOID lpParameter)
 			D3DCOLOR_ARGB(0xFF,0xFF,0,0));
 		return 1;
 	}
+
+	// testweise wieder rausschreiben
+	const aiExportDataBlob* blob = aiExportSceneToBlob( g_pcAsset->pcScene, "collada");
+	if( blob )
+	{
+		FILE* file = fopen( "test.dae", "wb");
+		fwrite( blob->data, 1, blob->size, file);
+		fclose( file);
+
+		aiReleaseExportData( blob);
+	}
+
 	return 0;
 }
 

+ 13 - 1
workspaces/vc9/assimp.vcproj

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="Windows-1252"?>
 <VisualStudioProject
 	ProjectType="Visual C++"
-	Version="9.00"
+	Version="9,00"
 	Name="assimp"
 	ProjectGUID="{5691E159-2D9B-407F-971F-EA5C592DC524}"
 	RootNamespace="assimp"
@@ -4055,6 +4055,18 @@
 					</File>
 				</Filter>
 			</Filter>
+			<Filter
+				Name="export"
+				>
+				<File
+					RelativePath="..\..\code\ColladaExporter.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\code\ColladaExporter.h"
+					>
+				</File>
+			</Filter>
 		</Filter>
 		<Filter
 			Name="doc"