bool SaveScene(KFbxSdkManager* pSdkManager, KFbxDocument* pScene, const char* pFilename, int pFileFormat, bool pEmbedMedia) { int lMajor, lMinor, lRevision; bool lStatus = true; // Create an exporter. KFbxExporter* lExporter = KFbxExporter::Create(pSdkManager, ""); if( pFileFormat < 0 || pFileFormat >= pSdkManager->GetIOPluginRegistry()->GetWriterFormatCount() ) { // Write in fall back format in less no ASCII format found pFileFormat = pSdkManager->GetIOPluginRegistry()->GetNativeWriterFormat(); //Try to export in ASCII if possible int lFormatIndex, lFormatCount = pSdkManager->GetIOPluginRegistry()->GetWriterFormatCount(); for (lFormatIndex=0; lFormatIndex<lFormatCount; lFormatIndex++) { if (pSdkManager->GetIOPluginRegistry()->WriterIsFBX(lFormatIndex)) { KString lDesc =pSdkManager->GetIOPluginRegistry()->GetWriterFormatDescription(lFormatIndex); char *lASCII = "ascii"; if (lDesc.Find(lASCII)>=0) { pFileFormat = lFormatIndex; break; } } } } // Set the export states. By default, the export states are always set to // true except for the option eEXPORT_TEXTURE_AS_EMBEDDED. The code below // shows how to change these states. 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); // Initialize the exporter by providing a filename. if(lExporter->Initialize(pFilename, pFileFormat, pSdkManager->GetIOSettings()) == false) { common->Warning("Call to KFbxExporter::Initialize() failed. Error returned: %s\n\n\n", lExporter->GetLastErrorString()); return false; } KFbxSdkManager::GetFileFormatVersion(lMajor, lMinor, lRevision); common->Printf("FBX version number for this version of the FBX SDK is %d.%d.%d\n\n", lMajor, lMinor, lRevision); // Export the scene. lStatus = lExporter->Export(pScene); // Destroy the exporter. lExporter->Destroy(); return lStatus; }
osgDB::ReaderWriter::WriteResult ReaderWriterFBX::writeNode( const osg::Node& node, const std::string& filename, const Options* options) const { try { std::string ext = osgDB::getLowerCaseFileExtension(filename); if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED; osg::ref_ptr<Options> localOptions = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options; localOptions->getDatabasePathList().push_front(osgDB::getFilePath(filename)); KFbxSdkManager* pSdkManager = KFbxSdkManager::Create(); if (!pSdkManager) { return WriteResult::ERROR_IN_WRITING_FILE; } CleanUpFbx cleanUpFbx(pSdkManager); pSdkManager->SetIOSettings(KFbxIOSettings::Create(pSdkManager, IOSROOT)); bool useFbxRoot = false; if (options) { std::istringstream iss(options->getOptionString()); std::string opt; while (iss >> opt) { if (opt == "Embedded") { pSdkManager->GetIOSettings()->SetBoolProp(EXP_FBX_EMBEDDED, true); } else if (opt == "UseFbxRoot") { useFbxRoot = true; } } } KFbxScene* pScene = KFbxScene::Create(pSdkManager, ""); pluginfbx::WriterNodeVisitor writerNodeVisitor(pScene, pSdkManager, filename, options, osgDB::getFilePath(node.getName().empty() ? filename : node.getName())); if (useFbxRoot && isBasicRootNode(node)) { // If root node is a simple group, put all elements under the FBX root const osg::Group * osgGroup = node.asGroup(); for(unsigned int child=0; child<osgGroup->getNumChildren(); ++child) { const_cast<osg::Node *>(osgGroup->getChild(child))->accept(writerNodeVisitor); } } else { // Normal scene const_cast<osg::Node&>(node).accept(writerNodeVisitor); } KFbxExporter* lExporter = KFbxExporter::Create(pSdkManager, ""); pScene->GetGlobalSettings().SetAxisSystem(KFbxAxisSystem::eOpenGL); // Ensure the directory exists or else the FBX SDK will fail if (!osgDB::makeDirectoryForFile(filename)) { OSG_NOTICE << "Can't create directory for file '" << filename << "'. FBX SDK may fail creating the file." << std::endl; } // The FBX SDK interprets the filename as UTF-8 #ifdef OSG_USE_UTF8_FILENAME const std::string& utf8filename(filename); #else std::string utf8filename(osgDB::convertStringFromCurrentCodePageToUTF8(filename)); #endif if (!lExporter->Initialize(utf8filename.c_str())) { return std::string(lExporter->GetLastErrorString()); } if (!lExporter->Export(pScene)) { return std::string(lExporter->GetLastErrorString()); } return WriteResult::FILE_SAVED; } catch (const std::string& s) { return s; } catch (const char* s) { return std::string(s); } catch (...) { } return WriteResult::ERROR_IN_WRITING_FILE; }
bool CFbxWriter::Write() { OBJ_ASSERT(m_pFbxFile); if(!m_pFbxFile) return false; std::string fileName(m_fileName.string()); // Extract native file path string KFbxSdkManager* pSdkManager = m_pFbxFile->GetFbxSdkManager(); KFbxScene* pScene = m_pFbxFile->GetFbxScene(); const char* pFilename = fileName.c_str(); bool pSaveAsBinary = m_bWriteBinary; bool pEmbedMedia = false; bool pSaveAsVersion5 = false; // max's FBX importer doesnt support version 6 for now int lMajor, lMinor, lRevision; // Create an exporter. KFbxExporter* lExporter = pSdkManager->CreateKFbxExporter(); // Initialize the exporter by providing a filename. if(lExporter->Initialize(pFilename) == false) { MSG_ERROR("Call to KFbxExporter::Initialize() failed. Error returned: " << lExporter->GetLastErrorString()); return false; } KFbxIO::GetCurrentVersion(lMajor, lMinor, lRevision); MSG_DEBUG("FBX version number for this version of the FBX SDK is " << lMajor << "." << lMinor << "." << lRevision); // Set the export states. By default, the export states are always set to // true except for the option eEXPORT_TEXTURE_AS_EMBEDDED. The code below // shows how to change these states. lExporter->SetState(KFbxExporter::eEXPORT_MATERIAL, true); lExporter->SetState(KFbxExporter::eEXPORT_TEXTURE, true); lExporter->SetState(KFbxExporter::eEXPORT_TEXTURE_AS_EMBEDDED, pEmbedMedia); lExporter->SetState(KFbxExporter::eEXPORT_LINK, true); lExporter->SetState(KFbxExporter::eEXPORT_SHAPE, true); lExporter->SetState(KFbxExporter::eEXPORT_GOBO, true); lExporter->SetState(KFbxExporter::eEXPORT_ANIMATION, true); lExporter->SetState(KFbxExporter::eEXPORT_GLOBAL_SETTINGS, true); // Set the file mode to binary if(pSaveAsVersion5) { MSG_INFO("writing FBX file version 5"); lExporter->SetFileFormat((pSaveAsBinary) ? KFbxExporter::eFBX_50_BINARY : KFbxExporter::eFBX_50_ASCII); } else { MSG_INFO("writing FBX file version 6"); lExporter->SetFileModeBinary(pSaveAsBinary); } // Export the scene. bool bStatus = lExporter->Export(*pScene); if(!bStatus) { MSG_ERROR("Error Returned: " << lExporter->GetLastErrorString()); } // Destroy the exporter. pSdkManager->DestroyKFbxExporter(lExporter); MSG_DEBUG("Done."); return bStatus; }