//----------------------------------------------------------------------------------------- CBaseEditor *CTerrainGroupEditorFactory::CreateObject(CBaseEditor **parent, OgitorsPropertyValueMap ¶ms) { OgitorsRoot* ogitorsRoot = OgitorsRoot::getSingletonPtr(); OgitorsPropertyValueMap::iterator ni; if ((ni = params.find("init")) != params.end()) { addEditorResources(); params.erase(ni); } /* Check for old 0.4 and 0.5 files that do not include the terrain textures */ OFS::OfsPtr& file = ogitorsRoot->GetProjectFile(); Ogre::String terrainDir = ogitorsRoot->GetProjectOptions()->TerrainDirectory; unsigned int flags; if (file->getDirFlags((terrainDir).c_str(), flags) == OFS::OFS_OK && file->getDirFlags((terrainDir+"/terrain/").c_str(), flags) != OFS::OFS_OK) { // must check the both dirs exist otherwise it could possibly be a new project file->moveDirectory((terrainDir).c_str(), (terrainDir+"/terrain/").c_str()); addEditorResources(false); } CTerrainGroupEditor *object = OGRE_NEW CTerrainGroupEditor(this); object->createProperties(params); object->mParentEditor->init(*parent); object->load(); mInstanceCount++; return object; }
//----------------------------------------------------------------------------------------- void CTerrainGroupEditorFactory::addEditorResources(bool changeDefaultNames) { OgitorsRoot* ogitorsRoot = OgitorsRoot::getSingletonPtr(); Ogre::String terrainDir = ogitorsRoot->GetProjectOptions()->TerrainDirectory; // create Terrain project folder and folder to hold the terrain ogitorsRoot->GetProjectFile()->createDirectory(terrainDir.c_str()); ogitorsRoot->GetProjectFile()->createDirectory((terrainDir+"/terrain/").c_str()); // copy default plant textures ogitorsRoot->GetProjectFile()->createDirectory((terrainDir+"/plants/").c_str()); Ogre::String copydir = Ogitors::Globals::MEDIA_PATH + "/plants/"; OgitorsUtils::CopyDirOfs(copydir, (terrainDir+"/plants/").c_str()); // copy default terrain textures sorting them into two different folders ogitorsRoot->GetProjectFile()->createDirectory((terrainDir+"/textures/").c_str()); ogitorsRoot->GetProjectFile()->createDirectory((terrainDir+"/textures/diffusespecular").c_str()); ogitorsRoot->GetProjectFile()->createDirectory((terrainDir+"/textures/normalheight").c_str()); Ogre::ResourceGroupManager *mngr = Ogre::ResourceGroupManager::getSingletonPtr(); copydir = Ogitors::Globals::MEDIA_PATH + "/terrainTextures/"; mngr->addResourceLocation(copydir,"FileSystem","CopyTerrain"); Ogre::FileInfoListPtr resList = mngr->listResourceFileInfo("CopyTerrain"); // copy the files to the different directories OFS::OfsPtr& file = ogitorsRoot->GetProjectFile(); for (Ogre::FileInfoList::const_iterator it = resList->begin(); it != resList->end(); ++it) { Ogre::FileInfo fInfo = (*it); Ogre::String loc = copydir + fInfo.path + fInfo.filename; Ogre::String newName = fInfo.filename; if(fInfo.archive->getType() == "FileSystem") { if(fInfo.filename.find("diffusespecular") != -1) { /* since we're using different resource groups for the terrain lets remove the naming scheme from the filenames except if the project is being upgraded, in which case leave the name alone. */ if (changeDefaultNames) { newName = Ogre::StringUtil::replaceAll(newName, "_diffusespecular", ""); } OgitorsUtils::CopyFileOfs(loc, terrainDir+"/textures/diffusespecular/"+newName); } if(fInfo.filename.find("normalheight") != -1) { if (changeDefaultNames) { newName = Ogre::StringUtil::replaceAll(newName, "_normalheight", ""); } OgitorsUtils::CopyFileOfs(loc, terrainDir+"/textures/normalheight/"+newName); } } } resList.setNull(); ogitorsRoot->DestroyResourceGroup("CopyTerrain"); }
//----------------------------------------------------------------------------- int COFSSceneSerializer::Export(bool SaveAs, Ogre::String exportfile) { OgitorsRoot *ogRoot = OgitorsRoot::getSingletonPtr(); OgitorsSystem *mSystem = OgitorsSystem::getSingletonPtr(); OFS::OfsPtr& mFile = ogRoot->GetProjectFile(); PROJECTOPTIONS *pOpt = ogRoot->GetProjectOptions(); bool forceSave = false; Ogre::String fileLocation = ogRoot->GetProjectFile()->getFileSystemName(); Ogre::String fileName = ""; if (!exportfile.empty()) { // Save location was passed, so use this filename fileLocation = exportfile; } if (SaveAs) { // Saving at a different location UTFStringVector extlist; if( mFile->getFileSystemType() == OFS::OFS_PACKED ) { extlist.push_back(OTR("Ogitor File System File")); extlist.push_back("*.ofs"); } else { extlist.push_back(OTR("Ogitor Scene File")); extlist.push_back("*" + Globals::OGSCENE_FORMAT_EXTENSION); } Ogre::String newfileLocation = mSystem->DisplaySaveDialog(OTR("Save As"), extlist, fileLocation); if(newfileLocation == "") return SCF_CANCEL; mSystem->SetSetting("system", "oldOpenPath", newfileLocation); if(Ogre::StringUtil::match(newfileLocation, fileLocation, false)) { SaveAs = false; } else { forceSave = true; fileLocation = newfileLocation; } } Ogre::String filePath = OgitorsUtils::ExtractFilePath(fileLocation); fileName = OgitorsUtils::ExtractFileName(fileLocation); // Change the project directory to the new path pOpt->ProjectDir = filePath; if(fileName.substr(fileName.size() - 4, 4) != ".ofs") fileLocation = filePath; int dotpos = fileName.find_last_of("."); if (dotpos > 0) { fileName.erase(dotpos, fileName.length() - dotpos); } if (SaveAs && mFile->moveFileSystemTo(fileLocation.c_str()) != OFS::OFS_OK) { return SCF_ERRFILE; } if (SaveAs) { mFile->deleteFile((pOpt->ProjectName + Globals::OGSCENE_FORMAT_EXTENSION).c_str()); pOpt->ProjectName = fileName; } if (_writeFile(fileName + Globals::OGSCENE_FORMAT_EXTENSION, forceSave) != SCF_OK) { return SCF_ERRFILE; } return SCF_OK; }