dtABC::Application源码分析
Table of Contents
1 dtABC::Application类
1.1 概述
class DTABCEXPORT Application : public dtABC::BaseABC, public dtUtil::ConfigProperties Application类是大多应用程序类的基本,它包含了应用程序所需要的基本的组件(如键盘、鼠标的操作) 可以在Application类中的构造函数中 传进一个XML的配置文件,这个文件包含了内部DeltaWin,Camera,Scene的配置属性 通过调用GenerateDefaultConfigFile() 产生一个默认的配置文件,这个文件包含默认的一些属性,这些属性可以编辑来应用到构造函数中
Application *app = new Application("Mydatafile.xml"); app->Config(); app->Run();
1.2 重要函数
virtual void Run();//里面调用的是 dtCore::System::GetInstance().Run() /* 这个函数调用的是 BaseClass::Config(); 而这个函数里又是调用的 System* sys = &dtCore::System::GetInstance();sys->Config(); 而这个也基本上没做什么内容,就是发了一个SendMessage(System::MESSAGE_CONFIG);消息 */ virtual void Config(); static std::string GenerateDefaultConfigFile(const std::string& filename="config.xml") /*通过名称获得配置属性,defaultValue 是当name没有找到时候要用的值,返回找到name的值,如果没有找到将返回一个默认值*/ const std::string& GetConfigPropertyValue(const std::string& name, const std::string& defaultValue = "") const; static ApplicationConfigData GetDefaultConfigData();//获得默认的配置属性 void SetConfigPropertyValue(const std::string& name, const std::string& value); void RemoveConfigPropertyValue(const std::string& name); //View操作 void AddView(dtCore::View& view); osgViewer::CompositeViewer* GetCompositeViewer() //还有一大推键盘鼠标控制的函数 const dtCore::GenericKeyboardListener* GetKeyboardListener(); const dtCore::GenericMouseListener* GetMouseListener() ;
1.3 重要的属性
dtCore::RefPtr<osgViewer::CompositeViewer> mCompositeViewer; dtCore::RefPtr<dtCore::GenericKeyboardListener> mKeyboardListener;//键盘管理 dtCore::RefPtr<dtCore::GenericMouseListener> mMouseListener;//鼠标管理 typedef std::map<std::string, std::string> AppConfigPropertyMap;//属性表 AppConfigPropertyMap mConfigProperties; dtCore::StatsHandler *mStats; ///<for stats rendering/controlling ViewList mViewsToDelete; ///<list of Views to be removed at the en
2 dtABC::BaseABC
2.1 重要的方法
//View dtCore::View* GetView();//获得一个View或者创建一个默认的view dtCore::View* GetView(unsigned int idx);//获得第idx个view /*增加view void AddView(dtCore::View& view);在子类dtABC::Application中实现*/ void SetView(dtCore::View* view);//设置第一个view //相机Camera dtCore::Camera* GetCamera();//获得默认的应用程序的Camera dtCore::DeltaWin* GetWindow();//获得默认的应用程序窗口 //键盘鼠标 dtCore::Keyboard* GetKeyboard();//获得默认的应用程序键盘接口 dtCore::Mouse* GetMouse();//获得应用程序的默认鼠标 //窗口 dtCore::DeltaWin* GetWindow(); ///Get the default Application Window void SetWindow(dtCore::DeltaWin* win); ///Get the default Application Window //增加可绘制体 virtual void AddDrawable(dtCore::DeltaDrawable* obj); virtual void RemoveDrawable(dtCore::DeltaDrawable* obj);///Remove a visual object from the Scene //场景 dtCore::Scene* GetScene(); void SetScene(dtCore::Scene* scene);///Set the default Application Scene /*通过名字name向应用程序中加载一个地图*/ dtCore::Map& LoadMap(const std::string& name, bool addBillBoards = false); /*向场景中加载一个地图*/ void LoadMap(dtCore::Map& map, bool addBillBoards = false);
//BaseABC::OnMessage函数的处理过程
void BaseABC::OnMessage(MessageData* data) { if (data->message == dtCore::System::MESSAGE_EVENT_TRAVERSAL) { EventTraversal(*static_cast<const double*>(data->userData)); } else if (data->message == dtCore::System::MESSAGE_PRE_FRAME) { PreFrame(*static_cast<const double*>(data->userData)); } else if (data->message == dtCore::System::MESSAGE_FRAME) { Frame(*static_cast<const double*>(data->userData)); } else if (data->message == dtCore::System::MESSAGE_POST_FRAME) { PostFrame(*static_cast<const double*>(data->userData)); } else if (data->message == dtCore::System::MESSAGE_PAUSE) { Pause(*static_cast<const double*>(data->userData)); } }
3 dtABC::Application 中鼠标消息是怎样被捕获的
//在dtABC::Application中以一个属性 –下面看下,这个mMouseListener怎么达到监听目的
dtCore::RefPtr<dtCore::GenericMouseListener> mMouseListener;
这个鼠标监听器在函数void Application::AddView(dtCore::View& view)中被加入监听
if (view.GetMouse() != NULL) { view.GetMouse()->AddMouseListener(mMouseListener.get());//View中有个鼠标属性 }
而在View中的GetMouse函数中
const Mouse* View::GetMouse() const {/*也就是说View中返回的是KeyboardMouseHander中的Mouse*/ return mImpl->mKeyboardMouseHandler.valid() ? mImpl->mKeyboardMouseHandler->GetMouse() : NULL; }
mImpl 是VieWImpl类的实例 ViewImpl是View的具体实现类在ViewImpl中有个属性是
RefPtr<dtCore::KeyboardMouseHandler> mKeyboardMouseHandler;
其中KeyboardMouseHandler继承public osgGA::GUIEventHandler
在View中的CreateKeyboardMouseHandler()函数中ViewImpl中的mKeyboardMouseHandler被初始化
KeyboardMouseHandler* View::CreateKeyboardMouseHandler() { mImpl->mKeyboardMouseHandler = new dtCore::KeyboardMouseHandler(this); mImpl->mOsgViewerView->addEventHandler(mImpl->mKeyboardMouseHandler.get()); return mImpl->mKeyboardMouseHandler.get(); }
这就是说
最下层 osgGA::GUIEventHandler dtCore::KeyboardMouseHander(继承osgGA::GUIEventHandler)类中的RefPtr<Mouse> mMouse ViewImpl类中RefPtr<dtCore::KeyboardMouseHandler> mKeyboardMouseHandler; View类中ViewImpl*mImpl dtABC::BaseABC中typedef std::vector<dtCore::RefPtr<dtCore::View> > ViewList;//虽然是List,一般也是只用viewList[0] 所以dtABC::Application中 dtCore::RefPtr<dtCore::GenericMouseListener> mMouseListener; 就是在addView函数中被添加到场景中的