OSG 事件处理机制 类图
来源:互联网 发布:nike手机抢购软件 编辑:程序博客网 时间:2024/05/16 14:48
本文为osg源码学习笔记,有理解不当之处,请随时指正.
PS: 本文参考osg 版本: 3.4.0
1. 事件处理框架
OSG的事件处理可分为两个大的模块.
1) 事件适配模块(类图右侧) : 为各窗口平台中间抽象层(GA: GUI Abstraction)或适配层, 将各平台的用户输入事件适配为OSG内部定义的事件(EventAdapter).
2) 事件处理模块(类图左侧): 为用户提供输入事件的处理机制. 用户注册事件handler,对输入事件(EventAdapter)进行处理.
2. 源码分析
按照从 用户事件输入->用户事件处理的过程,用源码佐证上述分析. 整个分析过程,以鼠标事件为例.
1) 平台相关事件 适配为 OSG内部定义事件
a. 接收用户输入
源码现场: GraphicsWindowWin32::handleNativeWindowingEvent()
以鼠标事件为例,将windows鼠标事件的相关信息,交由eventqueue处理.
case WM_LBUTTONDOWN : case WM_MBUTTONDOWN : case WM_RBUTTONDOWN : ///////////////////// { ::SetCapture(hwnd); int button; if (uMsg==WM_LBUTTONDOWN) button = 1; else if (uMsg==WM_MBUTTONDOWN) button = 2; else button = 3; _capturedMouseButtons.insert(button); float mx = GET_X_LPARAM(lParam); float my = GET_Y_LPARAM(lParam); transformMouseXY(mx, my); getEventQueue()->mouseButtonPress(mx, my, button, eventTime); } break;
b. 适配事件, 并添加至事件队列
源码现场: osgGA::GUIEventAdapter* EventQueue
GUIEventAdapter* event = new GUIEventAdapter(*_accumulateEventState); event->setEventType(GUIEventAdapter::PUSH); event->setTime(time); switch(button) { case(1): event->setButton(GUIEventAdapter::LEFT_MOUSE_BUTTON); break; case(2): event->setButton(GUIEventAdapter::MIDDLE_MOUSE_BUTTON); break; case(3): event->setButton(GUIEventAdapter::RIGHT_MOUSE_BUTTON); break; } addEvent(event);
2) 事件处理
至此,用户 输入外部事件已经适配为osg内部eventAdapter,并添加至事件队列中.
Viewer负责在事件更新循环中,将事件队列中的事件,分发给各event handler进行处理.
源码现场: Viewer::eventTraversal()
for(osgGA::EventQueue::Events::iterator itr = events.begin(); itr != events.end(); ++itr) { osgGA::Event* event = itr->get(); for(EventHandlers::iterator hitr = _eventHandlers.begin(); hitr != _eventHandlers.end(); ++hitr) { (*hitr)->handle( event, 0, _eventVisitor.get()); } }
阅读全文
0 0
- OSG 事件处理机制 类图
- OSG — 事件处理模型
- osg事件处理(两个)
- OSG学习笔记15-OSG中对事件的处理
- OSG学习笔记9-处理键盘事件
- OSG 文件读取机制 类图
- C#事件处理机制
- java 事件处理机制
- 事件处理机制
- Flex事件处理机制
- JAVA事件处理机制
- JAVA事件处理机制
- java事件处理机制
- AWT事件处理机制
- Java事件处理机制
- Ext 事件处理机制
- java事件处理机制
- Qt事件处理机制
- C语言的一些知识点
- vs2010+opencv3.0.0 环境配置 (以及配置技巧)
- POJ2749 Building roads【2-SAT】
- HDU 1179 Ollivanders: Makers of Fine Wands since 382 BC.(二分图匹配+匈牙利算法)
- hdu6127Hard challenge(极角排序)
- OSG 事件处理机制 类图
- java集合2
- HDU
- Velocity快速入门教程-脚本语法详解(转)
- mysql 区分大小写 mysql安装目录 数据文件目录
- CSS备忘录
- jquery 复制元素,并修改属性,追加到另一个元素后面
- 关于android studio进行NDK编译生成.so文件
- matplotlib模块数据可视化-图片处理