Delta3D 源码 之dtABC::Application类

                         dtABC::Application源码分析

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函数中被添加到场景中的

 

 

Date: 2012-10-20

Author: Sunday

Org version 7.9.2 with Emacs version 24

Validate XHTML 1.0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值