Ogitor探索之代码分析(2)---void MainWindow::newScene()

在../qtOgitor/src/mainwindowactions.cpp中定义了void MainWindow::newScene()

在Qtogitor的新建场景按钮激活后调用

   1: void MainWindow::newScene()
   2: {
   3:     const char NewSceneDefinition[] = "  <OBJECT typename=/"%s/" scenemanagertype=/"%s/" name=/"SceneManager/"> <PROPERTY id=/"configfile/" type=/"7/" value=/"%s/"></PROPERTY></OBJECT>/n"
   4:                                       "</OGITORSCENE>/n";
   5:  
   6:     Ogitors::OgitorsRoot *ogRoot = OgitorsRoot::getSingletonPtr();
   7:  
   8:     if(ogRoot->IsSceneLoaded())
   9:         mOgreWidget->setSwitchingScene(true);
  10:  
  11:     if(!(ogRoot->TerminateScene()))
  12:     {
  13:         mOgreWidget->setSwitchingScene(false);
  14:         return;
  15:     }
  16:  
  17:     Ogitors::PROJECTOPTIONS *pOpt = ogRoot->GetProjectOptions();
  18:  
  19:     pOpt->IsNewProject = true;
  20:     pOpt->ProjectName = "";
  21:     pOpt->ProjectDir = Ogitors::OgitorsSystem::getSingletonPtr()->getProjectsDirectory();
  22:     pOpt->SceneManagerName = "OctreeSceneManager";
  23:     pOpt->TerrainDirectory = "Terrain";
  24:     pOpt->HydraxDirectory = "Hydrax";
  25:     pOpt->CaelumDirectory = "Caelum";
  26:     pOpt->PagedGeometryDirectory = "PagedGeometry";
  27:     pOpt->SceneManagerConfigFile = "";
  28:     pOpt->CameraSaveCount = 0;
  29:     pOpt->CameraSpeed = 1.0f;
  30:     pOpt->ResourceDirectories.clear();
  31:     pOpt->SelectionRectColour = Ogre::ColourValue(0.5f, 0, 1);
  32:     pOpt->SelectionBBColour = Ogre::ColourValue(1, 1, 1);
  33:     pOpt->HighlightBBColour = Ogre::ColourValue(0.91f, 0.19f, 0.19f);
  34:     pOpt->SelectHighlightBBColour = Ogre::ColourValue(0.19f, 0.91f, 0.19f);
  35:     pOpt->ObjectCount = 0;
  36:  
  37:     for(unsigned int v = 0;v < 31;v++)
  38:     {
  39:         pOpt->LayerNames[v] = "Layer " + Ogre::StringConverter::toString(v);
  40:         pOpt->LayerVisible[v] = true;
  41:     }
  42:     
  43:     pOpt->LayerCount = 1;
  44:  
  45:     SettingsDialog dlg(QApplication::activeWindow(), pOpt);
  46:     
  47:     if(dlg.exec() == QDialog::Accepted)
  48:     {
  49:         char buffer[5000];
  50:         Ogre::String filename = ogRoot->GetProjectOptions()->ProjectDir + "/" + ogRoot->GetProjectOptions()->ProjectName + ".ogscene";
  51:         filename = Ogitors::OgitorsUtils::QualifyPath(filename);
  52:         
  53:         bool succeed = false;
  54:         
  55:         try
  56:         {
  57:             std::ofstream outfile(filename.c_str());
  58:             
  59:             if(outfile.is_open())
  60:                 succeed = true;
  61:  
  62:             if(succeed)
  63:             {
  64:                 outfile << "<?xml version=/"1.0/" encoding=/"utf-8/"?>/n";
  65:                 outfile << "<OGITORSCENE version=/"2/">/n";
  66:                 ogRoot->WriteProjectOptions(outfile,true);
  67:                 sprintf_s(buffer,5000,NewSceneDefinition,ogRoot->GetProjectOptions()->SceneManagerName.c_str(),ogRoot->GetProjectOptions()->SceneManagerName.c_str(),ogRoot->GetProjectOptions()->SceneManagerConfigFile.c_str());
  68:                 outfile << buffer;
  69:             }
  70:  
  71:             outfile.close();
  72:         }
  73:         catch(...)
  74:         {
  75:             succeed = false;
  76:         }
  77:  
  78:         if(!succeed)
  79:         {
  80:             OgitorsSystem::getSingletonPtr()->DisplayMessageDialog("The path is Read-Only. Ogitor can not work with Read-Only Project Paths!", DLGTYPE_OK);
  81:             return;
  82:         }
  83:  
  84:         ogRoot->LoadScene(filename);
  85:     }
  86:     updateRecentFiles();
  87: }

void MainWindow::newScene()调用后会将初始场景写入xml格式的.ogscene文件中 请看上面62行代码

其中在66行代码调用的ogRoot->WriteProjectOptions(outfile,true);是将project的options更详细的写入文件

在D:/OgreSDK/ogitor_src/src0_43/Ogitor/src/OgitorsRootUtilityFunctions.cpp文件中定义了

void OgitorsRoot::WriteProjectOptions(std::ostream &outstream, bool newproject)

   1: void OgitorsRoot::WriteProjectOptions(std::ostream &outstream, bool newproject)
   2: {
   3:     char buffer[5000];
   4:     unsigned int i;
   5:  
   6:     PROJECTOPTIONS *pOpt = GetProjectOptions();
   7:  
   8:     outstream << "  <PROJECT>/n";
   9:     sprintf_s(buffer,5000,"    <SCENEMANAGER value=/"%s/"></SCENEMANAGER>/n",pOpt->SceneManagerName.c_str());
  10:     outstream << buffer;
  11:     sprintf_s(buffer,5000,"    <TERRAINDIR value=/"%s/"></TERRAINDIR>/n",pOpt->TerrainDirectory.c_str());
  12:     outstream << buffer;
  13:     sprintf_s(buffer,5000,"    <HYDRAXDIR value=/"%s/"></HYDRAXDIR>/n",pOpt->HydraxDirectory.c_str());
  14:     outstream << buffer;
  15:     sprintf_s(buffer,5000,"    <CAELUMDIR value=/"%s/"></CAELUMDIR>/n",pOpt->CaelumDirectory.c_str());
  16:     outstream << buffer;
  17:     sprintf_s(buffer,5000,"    <PAGEDGEOMETRYDIR value=/"%s/"></PAGEDGEOMETRYDIR>/n",pOpt->PagedGeometryDirectory.c_str());
  18:     outstream << buffer;
  19:     outstream << "    <RESOURCEDIRECTORIES>/n";
  20:     Ogre::String strtype;
  21:     Ogre::String value;
  22:     for(i = 0;i < pOpt->ResourceDirectories.size();i++)
  23:     {
  24:         value = pOpt->ResourceDirectories[i];
  25:         if(value.substr(0,3) == "FS:")
  26:             strtype = "FileSystem";
  27:         else if(value.substr(0,3) == "ZP:")
  28:             strtype = "Zip";
  29:         else strtype = "Unknown";
  30:         value.erase(0,3);
  31:         sprintf_s(buffer,5000,"      <DIRECTORY type=/"%s/" value=/"%s/"></DIRECTORY>/n",strtype.c_str(),value.c_str());
  32:         outstream << buffer;
  33:     }
  34:     outstream << "    </RESOURCEDIRECTORIES>/n";
  35:  
  36:     WriteCameraPositions(outstream,!newproject);
  37:  
  38:     outstream << "    <LAYERS>/n";
  39:     for(i = 0;i < 31;i++)
  40:     {
  41:         sprintf_s(buffer,5000,"      <LAYER id=/"%d/" name=/"%s/" visible=/"%s/"></LAYER>/n", i,pOpt->LayerNames[i].c_str(), Ogre::StringConverter::toString(pOpt->LayerVisible[i]).c_str());
  42:         outstream << buffer;
  43:     }
  44:     outstream << "    </LAYERS>/n";
  45:  
  46:     sprintf_s(buffer,5000,"  <LAYERCOUNT value=/"%s/"></LAYERCOUNT>/n",Ogre::StringConverter::toString(pOpt->LayerCount).c_str());
  47:     outstream << buffer;
  48:     sprintf_s(buffer,5000,"  <SELECTIONRECTCOLOUR value=/"%s/"></SELECTIONRECTCOLOUR>/n",Ogre::StringConverter::toString(pOpt->SelectionRectColour).c_str());
  49:     outstream << buffer;
  50:     sprintf_s(buffer,5000,"  <SELECTIONCOLOUR value=/"%s/"></SELECTIONCOLOUR>/n",Ogre::StringConverter::toString(pOpt->SelectionBBColour).c_str());
  51:     outstream << buffer;
  52:     sprintf_s(buffer,5000,"  <HIGHLIGHTCOLOUR value=/"%s/"></HIGHLIGHTCOLOUR>/n",Ogre::StringConverter::toString(pOpt->HighlightBBColour).c_str());
  53:     outstream << buffer;
  54:     sprintf_s(buffer,5000,"  <SELECTHIGHLIGHTCOLOUR value=/"%s/"></SELECTHIGHLIGHTCOLOUR>/n",Ogre::StringConverter::toString(pOpt->SelectHighlightBBColour).c_str());
  55:     outstream << buffer;
  56:     sprintf_s(buffer,5000,"  <GRIDCOLOUR value=/"%s/"></GRIDCOLOUR>/n",Ogre::StringConverter::toString(pOpt->GridColour).c_str());
  57:     outstream << buffer;
  58:     sprintf_s(buffer,5000,"  <GRIDSPACING value=/"%s/"></GRIDSPACING>/n",Ogre::StringConverter::toString(pOpt->GridSpacing).c_str());
  59:     outstream << buffer;
  60:     sprintf_s(buffer,5000,"  <SNAPANGLE value=/"%s/"></SNAPANGLE>/n",Ogre::StringConverter::toString(pOpt->SnapAngle).c_str());
  61:     outstream << buffer;
  62:     sprintf_s(buffer,5000,"  <WALKAROUNDHEIGHT value=/"%s/"></WALKAROUNDHEIGHT>/n",Ogre::StringConverter::toString(pOpt->WalkAroundHeight).c_str());
  63:     outstream << buffer;
  64:     sprintf_s(buffer,5000,"  <VOLUMESELECTIONDEPTH value=/"%s/"></VOLUMESELECTIONDEPTH>/n",Ogre::StringConverter::toString(pOpt->VolumeSelectionDepth).c_str());
  65:     outstream << buffer;
  66:     sprintf_s(buffer,5000,"  <OBJECTCOUNT value=/"%s/"></OBJECTCOUNT>/n",Ogre::StringConverter::toString(pOpt->ObjectCount).c_str());
  67:     outstream << buffer;
  68:     outstream << "  </PROJECT>/n";
  69: }

在newScene调用后读取用户输入的options和部分默认options写入.ogscene文件中,新建一个scene生成的基本xml文件如下,其中包含的基本的属性

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <OGITORSCENE version="2">
   3:   <PROJECT>
   4:     <SCENEMANAGER value="OctreeSceneManager"></SCENEMANAGER>
   5:     <TERRAINDIR value="Terrain"></TERRAINDIR>
   6:     <HYDRAXDIR value="Hydrax"></HYDRAXDIR>
   7:     <CAELUMDIR value="Caelum"></CAELUMDIR>
   8:     <PAGEDGEOMETRYDIR value="PagedGeometry"></PAGEDGEOMETRYDIR>
   9:     <RESOURCEDIRECTORIES>
  10:     </RESOURCEDIRECTORIES>
  11:   <CAMERASPEED value="1"></CAMERASPEED>
  12:   <CAMERAPOSITIONS count="0">
  13:     <OPTION id="0" position="5 10 5" orientation="0.937683 -0.155887 -0.306458 -0.050973"></OPTION>
  14:   </CAMERAPOSITIONS>
  15:     <LAYERS>
  16:       <LAYER id="0" name="Layer 0" visible="true"></LAYER>
  17:       <LAYER id="1" name="Layer 1" visible="true"></LAYER>
  18:       <LAYER id="2" name="Layer 2" visible="true"></LAYER>
  19:       <LAYER id="3" name="Layer 3" visible="true"></LAYER>
  20:       <LAYER id="4" name="Layer 4" visible="true"></LAYER>
  21:       <LAYER id="5" name="Layer 5" visible="true"></LAYER>
  22:       <LAYER id="6" name="Layer 6" visible="true"></LAYER>
  23:       <LAYER id="7" name="Layer 7" visible="true"></LAYER>
  24:       <LAYER id="8" name="Layer 8" visible="true"></LAYER>
  25:       <LAYER id="9" name="Layer 9" visible="true"></LAYER>
  26:       <LAYER id="10" name="Layer 10" visible="true"></LAYER>
  27:       <LAYER id="11" name="Layer 11" visible="true"></LAYER>
  28:       <LAYER id="12" name="Layer 12" visible="true"></LAYER>
  29:       <LAYER id="13" name="Layer 13" visible="true"></LAYER>
  30:       <LAYER id="14" name="Layer 14" visible="true"></LAYER>
  31:       <LAYER id="15" name="Layer 15" visible="true"></LAYER>
  32:       <LAYER id="16" name="Layer 16" visible="true"></LAYER>
  33:       <LAYER id="17" name="Layer 17" visible="true"></LAYER>
  34:       <LAYER id="18" name="Layer 18" visible="true"></LAYER>
  35:       <LAYER id="19" name="Layer 19" visible="true"></LAYER>
  36:       <LAYER id="20" name="Layer 20" visible="true"></LAYER>
  37:       <LAYER id="21" name="Layer 21" visible="true"></LAYER>
  38:       <LAYER id="22" name="Layer 22" visible="true"></LAYER>
  39:       <LAYER id="23" name="Layer 23" visible="true"></LAYER>
  40:       <LAYER id="24" name="Layer 24" visible="true"></LAYER>
  41:       <LAYER id="25" name="Layer 25" visible="true"></LAYER>
  42:       <LAYER id="26" name="Layer 26" visible="true"></LAYER>
  43:       <LAYER id="27" name="Layer 27" visible="true"></LAYER>
  44:       <LAYER id="28" name="Layer 28" visible="true"></LAYER>
  45:       <LAYER id="29" name="Layer 29" visible="true"></LAYER>
  46:       <LAYER id="30" name="Layer 30" visible="true"></LAYER>
  47:     </LAYERS>
  48:   <LAYERCOUNT value="1"></LAYERCOUNT>
  49:   <SELECTIONRECTCOLOUR value="0.498039 0 1 1"></SELECTIONRECTCOLOUR>
  50:   <SELECTIONCOLOUR value="1 1 1 1"></SELECTIONCOLOUR>
  51:   <HIGHLIGHTCOLOUR value="0.909804 0.188235 0.188235 1"></HIGHLIGHTCOLOUR>
  52:   <SELECTHIGHLIGHTCOLOUR value="0.188235 0.909804 0.188235 1"></SELECTHIGHLIGHTCOLOUR>
  53:   <GRIDCOLOUR value="1 1 1 1"></GRIDCOLOUR>
  54:   <GRIDSPACING value="1"></GRIDSPACING>
  55:   <SNAPANGLE value="0"></SNAPANGLE>
  56:   <WALKAROUNDHEIGHT value="0"></WALKAROUNDHEIGHT>
  57:   <VOLUMESELECTIONDEPTH value="0"></VOLUMESELECTIONDEPTH>
  58:   <OBJECTCOUNT value="0"></OBJECTCOUNT>
  59:   </PROJECT>
  60:   <OBJECT typename="OctreeSceneManager" scenemanagertype="OctreeSceneManager" name="SceneManager"> <PROPERTY id="configfile" type="7" value=""></PROPERTY></OBJECT>
  61: </OGITORSCENE>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值