#include "ImportExport.h"
FbxManager* gSdkManager = NULL;
#ifdef IOS_REF
#undef IOS_REF
#define IOS_REF (*(gSdkManager->GetIOSettings()))
#endif
extern void UI_Printf(const char* msg, ...);
void ImportExport(
const char *ImportFileName,
const char* ExportFileName,
int pWriteFileFormat
)
{
FbxScene* lScene = FbxScene::Create(gSdkManager,"");
UI_Printf("------- Import started ---------------------------");
bool r = LoadScene(gSdkManager, lScene, ImportFileName);
if(r)
UI_Printf("------- Import succeeded -------------------------");
else
{
UI_Printf("------- Import failed ----------------------------");
lScene->Destroy();
return;
}
UI_Printf("\r\n");
UI_Printf("------- Export started ---------------------------");
r = SaveScene(gSdkManager,
lScene,
ExportFileName,
pWriteFileFormat,
false);
if(r) UI_Printf("------- Export succeeded -------------------------");
else UI_Printf("------- Export failed ----------------------------");
lScene->Destroy();
}
void InitializeSdkManager()
{
gSdkManager = FbxManager::Create();
FbxIOSettings * ios = FbxIOSettings::Create(gSdkManager, IOSROOT );
gSdkManager->SetIOSettings(ios);
}
void DestroySdkObjects(
FbxManager* pSdkManager,
bool pExitStatus
)
{
if( pSdkManager ) pSdkManager->Destroy();
if( pExitStatus ) FBXSDK_printf("Program Success!\n");
}
bool LoadScene(
FbxManager* pSdkManager,
FbxScene* pScene,
const char* pFilename
)
{
int lFileMajor, lFileMinor, lFileRevision;
int lSDKMajor, lSDKMinor, lSDKRevision;
int i, lAnimStackCount;
bool lStatus;
char lPassword[1024];
FbxManager::GetFileFormatVersion(lSDKMajor, lSDKMinor, lSDKRevision);
FbxImporter* lImporter = FbxImporter::Create(pSdkManager,"");
const bool lImportStatus = lImporter->Initialize(pFilename, -1, pSdkManager->GetIOSettings() );
lImporter->GetFileVersion(lFileMajor, lFileMinor, lFileRevision);
if( !lImportStatus )
{
FbxString error = lImporter->GetStatus().GetErrorString();
UI_Printf("Call to FbxImporter::Initialize() failed.");
UI_Printf("Error returned: %s", error.Buffer());
if (lImporter->GetStatus().GetCode() == FbxStatus::eInvalidFileVersion)
{
UI_Printf("FBX version number for this FBX SDK is %d.%d.%d",
lSDKMajor, lSDKMinor, lSDKRevision);
UI_Printf("FBX version number for file %s is %d.%d.%d",
pFilename, lFileMajor, lFileMinor, lFileRevision);
}
return false;
}
UI_Printf("FBX version number for this FBX SDK is %d.%d.%d",
lSDKMajor, lSDKMinor, lSDKRevision);
if (lImporter->IsFBX())
{
UI_Printf("FBX version number for file %s is %d.%d.%d",
pFilename, lFileMajor, lFileMinor, lFileRevision);
UI_Printf("Animation Stack Information");
lAnimStackCount = lImporter->GetAnimStackCount();
UI_Printf(" Number of animation stacks: %d", lAnimStackCount);
UI_Printf(" Active animation stack: \"%s\"",
lImporter->GetActiveAnimStackName());
for(i = 0; i < lAnimStackCount; i++)
{
FbxTakeInfo* lTakeInfo = lImporter->GetTakeInfo(i);
UI_Printf(" Animation Stack %d", i);
UI_Printf(" Name: \"%s\"", lTakeInfo->mName.Buffer());
UI_Printf(" Description: \"%s\"",
lTakeInfo->mDescription.Buffer());
UI_Printf(" Import Name: \"%s\"", lTakeInfo->mImportName.Buffer());
UI_Printf(" Import State: %s", lTakeInfo->mSelect ? "true" : "false");
}
IOS_REF.SetBoolProp(IMP_FBX_MATERIAL, true);
IOS_REF.SetBoolProp(IMP_FBX_TEXTURE, true);
IOS_REF.SetBoolProp(IMP_FBX_LINK, true);
IOS_REF.SetBoolProp(IMP_FBX_SHAPE, true);
IOS_REF.SetBoolProp(IMP_FBX_GOBO, true);
IOS_REF.SetBoolProp(IMP_FBX_ANIMATION, true);
IOS_REF.SetBoolProp(IMP_FBX_GLOBAL_SETTINGS, true);
}
lStatus = lImporter->Import(pScene);
if(lStatus == false &&
lImporter->GetStatus().GetCode() == FbxStatus::ePasswordError)
{
UI_Printf("Please enter password: ");
lPassword[0] = '\0';
FBXSDK_CRT_SECURE_NO_WARNING_BEGIN
scanf("%s", lPassword);
FBXSDK_CRT_SECURE_NO_WARNING_END
FbxString lString(lPassword);
IOS_REF.SetStringProp(IMP_FBX_PASSWORD, lString);
IOS_REF.SetBoolProp(IMP_FBX_PASSWORD_ENABLE, true);
lStatus = lImporter->Import(pScene);
if(lStatus == false && lImporter->GetStatus().GetCode() == FbxStatus::ePasswordError)
{
UI_Printf("Incorrect password: file not imported.");
}
}
lImporter->Destroy();
return lStatus;
}
bool SaveScene(
FbxManager* pSdkManager,
FbxScene* pScene,
const char* pFilename,
int pFileFormat,
bool pEmbedMedia
)
{
int lMajor, lMinor, lRevision;
bool lStatus = true;
FbxExporter* lExporter = FbxExporter::Create(pSdkManager, "");
if( pFileFormat < 0 ||
pFileFormat >=
pSdkManager->GetIOPluginRegistry()->GetWriterFormatCount() )
{
pFileFormat =
pSdkManager->GetIOPluginRegistry()->GetNativeWriterFormat();
if (!pEmbedMedia)
{
int lFormatIndex, lFormatCount =
pSdkManager->GetIOPluginRegistry()->
GetWriterFormatCount();
for (lFormatIndex=0; lFormatIndex<lFormatCount; lFormatIndex++)
{
if (pSdkManager->GetIOPluginRegistry()->
WriterIsFBX(lFormatIndex))
{
FbxString lDesc = pSdkManager->GetIOPluginRegistry()->
GetWriterFormatDescription(lFormatIndex);
if (lDesc.Find("ascii")>=0)
{
pFileFormat = lFormatIndex;
break;
}
}
}
}
}
if(lExporter->Initialize(pFilename, pFileFormat, pSdkManager->GetIOSettings()) == false)
{
UI_Printf("Call to FbxExporter::Initialize() failed.");
UI_Printf("Error returned: %s", lExporter->GetStatus().GetErrorString());
return false;
}
FbxManager::GetFileFormatVersion(lMajor, lMinor, lRevision);
UI_Printf("FBX version number for this FBX SDK is %d.%d.%d",
lMajor, lMinor, lRevision);
if (pSdkManager->GetIOPluginRegistry()->WriterIsFBX(pFileFormat))
{
IOS_REF.SetBoolProp(EXP_FBX_MATERIAL, true);
IOS_REF.SetBoolProp(EXP_FBX_TEXTURE, true);
IOS_REF.SetBoolProp(EXP_FBX_EMBEDDED, pEmbedMedia);
IOS_REF.SetBoolProp(EXP_FBX_SHAPE, true);
IOS_REF.SetBoolProp(EXP_FBX_GOBO, true);
IOS_REF.SetBoolProp(EXP_FBX_ANIMATION, true);
IOS_REF.SetBoolProp(EXP_FBX_GLOBAL_SETTINGS, true);
}
lStatus = lExporter->Export(pScene);
lExporter->Destroy();
return lStatus;
}
const char *GetReaderOFNFilters()
{
int nbReaders =
gSdkManager->GetIOPluginRegistry()->GetReaderFormatCount();
FbxString s;
int i = 0;
for(i=0; i < nbReaders; i++)
{
s += gSdkManager->GetIOPluginRegistry()->
GetReaderFormatDescription(i);
s += "|*.";
s += gSdkManager->GetIOPluginRegistry()->
GetReaderFormatExtension(i);
s += "|";
}
int nbChar = int(strlen(s.Buffer())) + 1;
char *filter = new char[ nbChar ];
memset(filter, 0, nbChar);
FBXSDK_strcpy(filter, nbChar, s.Buffer());
for(i=0; i < int(strlen(s.Buffer())); i++)
{
if(filter[i] == '|')
{
filter[i] = 0;
}
}
return filter;
}
const char *GetWriterSFNFilters()
{
int nbWriters =
gSdkManager->GetIOPluginRegistry()->GetWriterFormatCount();
FbxString s;
int i=0;
for(i=0; i < nbWriters; i++)
{
s += gSdkManager->GetIOPluginRegistry()->
GetWriterFormatDescription(i);
s += "|*.";
s += gSdkManager->GetIOPluginRegistry()->
GetWriterFormatExtension(i);
s += "|";
}
int nbChar = int(strlen(s.Buffer())) + 1;
char *filter = new char[ nbChar ];
memset(filter, 0, nbChar);
FBXSDK_strcpy(filter, nbChar, s.Buffer());
for(i=0; i < int(strlen(s.Buffer())); i++)
{
if(filter[i] == '|')
{
filter[i] = 0;
}
}
return filter;
}
const char *GetFileFormatExt(
const int pWriteFileFormat
)
{
char *buf = new char[10];
memset(buf, 0, 10);
buf[0] = '.';
const char * ext = gSdkManager->GetIOPluginRegistry()->
GetWriterFormatExtension(pWriteFileFormat);
FBXSDK_strcat(buf, 10, ext);
return buf;
}