#include "ImportExport.h"
KFbxSdkManager* 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
)
{
KFbxScene* lScene = KFbxScene::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 = KFbxSdkManager::Create();
KFbxIOSettings * ios = KFbxIOSettings::Create(gSdkManager, IOSROOT );
gSdkManager->SetIOSettings(ios);
}
void DestroySdkObjects(
KFbxSdkManager* pSdkManager
)
{
if (pSdkManager) pSdkManager->Destroy();
}
bool LoadScene(
KFbxSdkManager* pSdkManager,
KFbxScene* pScene,
const char* pFilename
)
{
int lFileMajor, lFileMinor, lFileRevision;
int lSDKMajor, lSDKMinor, lSDKRevision;
int i, lAnimStackCount;
bool lStatus;
char lPassword[1024];
KFbxSdkManager::GetFileFormatVersion(lSDKMajor, lSDKMinor, lSDKRevision);
KFbxImporter* lImporter = KFbxImporter::Create(pSdkManager,"");
const bool lImportStatus = lImporter->Initialize(pFilename, -1, pSdkManager->GetIOSettings() );
lImporter->GetFileVersion(lFileMajor, lFileMinor, lFileRevision);
if( !lImportStatus )
{
UI_Printf("Call to KFbxImporter::Initialize() failed.");
UI_Printf("Error returned: %s", lImporter->GetLastErrorString());
if (lImporter->GetLastErrorID() ==
KFbxIO::eFILE_VERSION_NOT_SUPPORTED_YET ||
lImporter->GetLastErrorID() ==
KFbxIO::eFILE_VERSION_NOT_SUPPORTED_ANYMORE)
{
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++)
{
KFbxTakeInfo* 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->GetLastErrorID() == KFbxIO::ePASSWORD_ERROR)
{
UI_Printf("Please enter password: ");
lPassword[0] = '\0';
scanf("%s", lPassword);
KString 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->GetLastErrorID() ==
KFbxIO::ePASSWORD_ERROR)
{
UI_Printf("Incorrect password: file not imported.");
}
}
lImporter->Destroy();
return lStatus;
}
bool SaveScene(
KFbxSdkManager* pSdkManager,
KFbxScene* pScene,
const char* pFilename,
int pFileFormat,
bool pEmbedMedia
)
{
int lMajor, lMinor, lRevision;
bool lStatus = true;
KFbxExporter* lExporter = KFbxExporter::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))
{
KString 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 KFbxExporter::Initialize() failed.");
UI_Printf("Error returned: %s", lExporter->GetLastErrorString());
return false;
}
KFbxSdkManager::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();
KString 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);
strcpy(filter, 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();
KString 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);
strcpy(filter, 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);
strcat(buf, ext);
return buf;
}