#include <windows.h>
#include <tchar.h>
#include <conio.h>
#include <fbxsdk.h>
#include <kfbxio/kfbximporter.h>  // FBXファイルインポート用
#include <kfbxplugins/kfbxscene.h>
#include <stdio.h>
#include <locale.h>

void Import(KFbxSdkManager* pSdkManager, KFbxScene* pScene, const char* file);

int main(int argc, char**argv) {


	// ライブラリが日本語対応してない模様
	// インポートファイルディレクトリは日本語ディレクトリを含むと読めないorz
	// setlocale(LC_ALL, "jpn");
	
	KFbxSdkManager *pSdkManager = NULL; 
	KFbxScene      *pScene = NULL;

	pSdkManager = KFbxSdkManager::Create();
	pScene = KFbxScene::Create(pSdkManager, "");

	if(!pSdkManager) {
		puts("FBX SDK 2009.1が正常にインストールされていない可能性があります");
		_getch();
		exit(-1);
	}
	if(!pScene) {
		puts("シーンの作成に失敗しました");
		_getch();
		exit(-1);
	}
	
	Import(pSdkManager, pScene, "C:\\FBXtoX\\humanoid.fbx");


	puts("何かキーを押してください");

	pSdkManager->Destroy();
	pSdkManager = NULL;
	_getch();

	return 0;
}

void Import(KFbxSdkManager* pSdkManager, KFbxScene* pScene, const char* file) {

	int iFileFormat = -1;
	int iFileMajor, iFileMinor, iFileRevision;
	int iSdkMajor, iSdkMinor, iSdkRevision;
	int i, iTakeCount;
	bool bStatus;

	// FBXってパスワードかかるの？
	char Password[1024];

	// バージョンがあがったらこの関数もあるかどうかわからないけど・・・
	KFbxIO::GetCurrentVersion(iSdkMajor, iSdkMinor, iSdkRevision);
	
	// インポータ作成
	KFbxImporter* pImporter = KFbxImporter::Create(pSdkManager, "");

	// インポートする情報を設定するオプション
	KFbxStreamOptionsFbxReader* lImportOptions=KFbxStreamOptionsFbxReader::Create(pSdkManager, "");

	if(!pSdkManager->GetIOPluginRegistry()->DetectFileFormat(file, iFileFormat)) {
		// ファイルフォーマット取得に失敗した場合
		iFileFormat = pSdkManager->GetIOPluginRegistry()->GetNativeReaderFormat();
	}
	
	// インポータにファイルフォーマットを設定
	pImporter->SetFileFormat(iFileFormat);

	const bool bImportStatus = pImporter->Initialize(file);

	// ファイルバージョンを取得
	pImporter->GetFileVersion(iFileMajor, iFileMinor, iFileRevision);

	if(!bImportStatus) {  // インポータ初期化失敗の場合エラーを表示してリターン
		puts("FBXImporterの初期化に失敗しました\n");
		printf("エラー内容: %s\n\n", pImporter->GetLastErrorString());

		if(pImporter->GetLastErrorID() == KFbxIO::eFILE_VERSION_NOT_SUPPORTED_YET || 
			pImporter->GetLastErrorID() == KFbxIO::eFILE_VERSION_NOT_SUPPORTED_ANYMORE) 
		{
			puts("FBX SDK 2009.1がサポートしていないバージョンのファイルです\n");
		}
		return;
	}

	// FBXファイルであれば処理を行う
	if(pImporter->IsFBX()) { 
		printf("ファイル名 %s バージョン %d.%d.%d\n\n", file, iFileMajor, iFileMinor, iFileRevision);

		// 情報取得
		// 撮影とかでよくあるテイク１とかテイク２とかそういうノリ（・・・なんじゃないかな）
		puts("このファイル情報は以下の通りです");
		iTakeCount = pImporter->GetTakeCount();

		printf("     アニメーション情報数 : %d\n", iTakeCount);
		printf("     カレントアニメーション情報 : \"%s\", \n", pImporter->GetCurrentTakeName());
		puts("\n");

		for(i=0; i<iTakeCount; i++) {  // すべての情報を取得

			KFbxTakeInfo* lTakeInfo = pImporter->GetTakeInfo(i);

			printf("    Take %d\n", i);
			printf("         Name: \"%s\"\n", lTakeInfo->mName.Buffer());
			printf("         Description: \"%s\"\n", lTakeInfo->mDescription.Buffer());

			// 異なった名前でインポートしたい場合、下を変更してくれーらしい
			printf("         Import Name: \"%s\"\n", lTakeInfo->mImportName.Buffer());

			// インポートする必要がない場合、下をfalseにしてくださいだそうです。
			printf("         Import State: %s\n", lTakeInfo->mSelect ? "true" : "false");
			printf("\n");
		}

		// インポートする情報を設定
		// とりあえずパースしたいので全てtrueで必要情報は全部読み込みます
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_MATERIAL, true);
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_TEXTURE, true);
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_LINK, true);
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_SHAPE, true);
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_GOBO, true);
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_ANIMATION, true);
		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_GLOBAL_SETTINGS, true);
	}

	// ファイルをインポート
	bStatus = pImporter->Import(pScene, lImportOptions);
	
	
	// パスワードが掛っていた場合
	if(bStatus == false && pImporter->GetLastErrorID() == KFbxIO::ePASSWORD_ERROR)
	{
		printf("パスワードを入力してください: ");
		
		Password[0] = '\0';

		scanf("%s", Password);
		KString lString(Password);

		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_PASSWORD, lString);

		lImportOptions->SetOption(KFBXSTREAMOPT_FBX_PASSWORD_ENABLE, true);

		bStatus = pImporter->Import(pScene, lImportOptions);

		if(bStatus == false && pImporter->GetLastErrorID() == KFbxIO::ePASSWORD_ERROR)
		{
			printf("パスワードが一致しないようです。\n");
		}
	}

	// 後片付け
	if(lImportOptions) 
		lImportOptions->Destroy();
	lImportOptions = NULL;
	pImporter->Destroy();

	return;
}