突然觉得调试更一目了然。避免“看过就学会,收藏即学习”
先加载个牛
直奔主题frame()
这里用到的是基类viewerBase::frame(),单视景器和多视景器都调用它。这里是单视景器
视景器初始化
转到了osgViewer::viewer::Init(),
为什么呢?因为主函数调用就是单视景器
osgViewer::Viewer派生自ViewerBase和osgViewer::View,所以调用的是基类ViewerBase的frame()
那为啥不继续子类调用父类了呢?因为是个纯虚函数。该父类调用子类了。
然后,继续啃另外一个爹,父类osgViewer::View的初始化。这里先总结下,每个事件是GUIEventAdapter,每个窗口有一个事件队列EventQueue,EventQueue的成员变量_eventQueue是存储事件的链表,即GUIEventAdapter->_eventQueue->osg::ref_ptr<osgGA::EventQueue> _eventQueue;->View(这两个_eventQueue不是同一个意思,一个是链表,一个是EventQueue对象)
涉及到了两个成员变量
1,第一个成员变量_eventQueue
从类的注释看,osgGA::EventQueue收集单个窗口事件,也就是说,每个窗口都有个事件队列。
事件列表及操作,一堆GUIEventAdapter
既然与窗口事件相关,那就与上下文相关,鼠标范围相关(范围以外点击不引起鼠标事件),
鼠标有各种事件
键盘有各种事件
窗口有各种事件
时间相关事件
用户自定义事件(相当重要,可以自定义封包)
事件状态
这些事件都是互斥保护
列表中保存的这一堆GUIEventAdapter,很明显就是窗口、鼠标、键盘等交互事件了
看成员变量
2,第二个成员变量osg::ref_ptr<osgGA::MatrixManipulator> _cameraManipulator;漫游器
从定义看出,漫游器是个继承自GUIEventHandler的抽象类,也就是说,实际应用还需要再派生
一般通过继承osgGA::GUIEventHandler类,并重写handle()函数,再派生。
拉回来,继续调试下去
//分配和返回一个新的GUIEventAdapter事件指针
事件类型:
这个例子用的是KeySwitchMatrixManipulator
_current是选中的漫游器
这里选中的是轨迹球漫游器
这两个名字起的也太任性了
第一天结束。