探索一下和OGITOR 相关的打开场景操作
void MainWindow::openScene()
{
Ogitors::OgitorsRoot *ogRoot = OgitorsRoot::getSingletonPtr();
if(ogRoot->IsSceneLoaded())
mOgreWidget->setSwitchingScene(true);
if(!(ogRoot->TerminateScene()))
{
mOgreWidget->setSwitchingScene(false);
return;
}
int ret = ogRoot->LoadScene("");
if(ret == SCF_CANCEL)
return;
if( ret != SCF_OK )
{
QMessageBox::warning(this,"qtOgitor", tr("Error Loading file") + ": " + CBaseSerializer::GetErrorString((SCENEFILERESULT)ret).c_str(), QMessageBox::Ok);
return;
}
updateRecentFiles();
}
探索一下 int ret = ogRoot->LoadScene(""); 这里应该是主要部分
int OgitorsRoot::LoadScene(Ogre::String filename)
{
setLoadState(LS_LOADING);
if(filename != "")
filename = OgitorsUtils::QualifyPath(filename);
ClearProjectOptions();
mPostSceneUpdateList.clear();
Ogre::UTFString msg = mSystem->Translate("Load in progress...");
mSystem->UpdateLoadProgress(-1, msg);
COgitorsSceneSerializer *defaultserializer = OGRE_NEW COgitorsSceneSerializer();
int ret = defaultserializer->Import(filename);
if(ret != Ogitors::SCF_OK)
{
msg = mSystem->Translate("Please load a Scene File...");
mSystem->UpdateLoadProgress(-1, msg);
setLoadState(LS_UNLOADED);
}
OGRE_DELETE defaultserializer;
return ret;
}
OK, 探索之旅就从这里开始逐步小小地深入一下。
1、setLoadState(LS_LOADING); 设置加载状态,并发送相关事件。
void OgitorsRoot::setLoadState(LoadState state)
{
if(mLoadState != state)
{
mLoadState = state;
LoadStateChangeEvent evt(state);
EventManager::Instance()->sendEvent(this, 0, &evt);
}
}
2、ClearProjectOptions(); 设置项目的初始值。
void OgitorsRoot::ClearProjectOptions()
{
mProjectOptions.IsNewProject = false;
mProjectOptions.CreatedIn.clear();
mProjectOptions.ProjectDir.clear();
mProjectOptions.ProjectName.clear();
mProjectOptions.SceneManagerName.clear();
mProjectOptions.TerrainDirectory = "Terrain";
mProjectOptions.HydraxDirectory = "Hydrax";
mProjectOptions.CaelumDirectory = "Caelum";
mProjectOptions.PagedGeometryDirectory = "PagedGeometry";
mProjectOptions.SceneManagerConfigFile = "";
mProjectOptions.ResourceDirectories.clear();
mProjectOptions.CameraSaveCount = 0;
for(int i = 0;i < 10;i++)
{
mProjectOptions.CameraPositions[i] = Vector3::ZERO;
mProjectOptions.CameraOrientations[i] = Quaternion::IDENTITY;
}
for(unsigned int v = 0;v < 31;v++)
{
mProjectOptions.LayerNames[v] = "Layer " + Ogre::StringConverter::toString(v);
mProjectOptions.LayerVisible[v] = true;
}
mProjectOptions.LayerCount = 1;
mProjectOptions.SelectionRectColour = Ogre::ColourValue(0.5f, 0, 1);
mProjectOptions.SelectionBBColour = Ogre::ColourValue(1, 1, 1);
mProjectOptions.SelectHighlightBBColour = Ogre::ColourValue(0.19f, 0.91f, 0.19f);
mProjectOptions.HighlightBBColour = Ogre::ColourValue(0.91f, 0.19f, 0.19f);
mProjectOptions.GridColour = Ogre::ColourValue(0.7f, 0.7f, 0.7f);
mProjectOptions.GridSpacing = 1.0f;
mProjectOptions.SnapAngle = 5.0f;
mProjectOptions.CameraSpeed = 1.0f;
mProjectOptions.WalkAroundHeight = 2.0f;
mProjectOptions.VolumeSelectionDepth = 20.0f;
mProjectOptions.ObjectCount = 0;
}
3、下面这几行代码用来显示在视口的加载进度信息。
Ogre::UTFString msg = mSystem->Translate("Load in progress...");
mSystem->UpdateLoadProgress(-1, msg);
4、最重要的部分就是这里吧:int ret = defaultserializer->Import(filename);