查看: 2038|回复: 3

有关共享一个graphics context的views的事件捕获的问题

[复制链接]

该用户从未签到

发表于 2009-1-7 00:35:00 | 显示全部楼层 |阅读模式
有两个分别属于两个不同的view的camera,它们共享一个graphics context。如何能使一个键盘事件同时被两个view都捕获?
                //Setup scene data for the views
                fused->addChild(positionIndicator) ;                                                //Add position indicator to the scene
                fused->addChild(viewerData.getTerrainData()) ;
                fused->addChild(viewerData.getVTPData()) ;
                osgUtil::Optimizer optimizer ;
                optimizer.optimize(fused.get()) ;                                                        //Optimize the scene, remove rendundent nodes and state etc.

                positionView->setSceneData(fused.get()) ;
                environmentView->setSceneData(fused.get()) ;
                positionReporterView->setSceneData(positionReporter) ;                //Set the scene of the reporter view

                //Get the number of windows to be created
                const int windowNumber = viewerData.getNumEnvironmentWindow() ;

                //Create graphics context traits
                std::vector<osg::ref_ptr<osg::GraphicsContext::Traits> > environmentContextsTraits ;
                for (int i = 0; i < windowNumber; i++)
                        environmentContextsTraits.push_back(new osg::GraphicsContext::Traits()) ;

                //Set traits for environment view contexts
                for (size_t i = 0; i < environmentContextsTraits.size(); i++){
                        std::string temp = "Environment View " ;
                        char num[256] ;
                        temp.append(itoa(i, num, 10)) ;
                        environmentContextsTraits->windowName = temp ;
                        environmentContextsTraits->windowDecoration = true ;
                        environmentContextsTraits->doubleBuffer = true ;
                        environmentContextsTraits->x = i * GRAPHICS_CONTEXT_WIDTH + (i + 1) * GRAPHICS_CONTEXT_LEFT_OFFSET ;
                        environmentContextsTraits->y = GRAPHICS_CONTEXT_TOP_OFFSET ;
                        environmentContextsTraits->width = GRAPHICS_CONTEXT_WIDTH ;
                        environmentContextsTraits->height = GRAPHICS_CONTEXT_HEIGHT ;
                }

                //Create the graphic contexts
                std::vector<osg::ref_ptr<osg::GraphicsContext> > environmentContexts ;
                for (int i = 0; i < windowNumber; i++)
                        environmentContexts.push_back(osg::GraphicsContext::createGraphicsContext(environmentContextsTraits.get())) ;

                //Associate the slave cameras of environment view to their graphics contexts
                for (int i = 0; i < windowNumber; i++){
                        const double angleBetweenCameras = (4 < windowNumber)? double(360) / windowNumber: 90.0 ;
                        osg::Matrix viewOffset ;
                        double angleToRotate = (i - double(windowNumber - 1) / 2) * angleBetweenCameras ;
                        viewOffset.makeRotate(angleToRotate / 180 * osg:I, osg::Vec3(0, 1, 0)) ;
                        osg::Camera *envCamera = new osg::Camera() ;
                        environmentView->addSlave(envCamera, osg::Matrix(), viewOffset) ;
                        envCamera->setGraphicsContext(environmentContexts.get()) ;
                        envCamera->setViewport(new osg::Viewport(0, 0, environmentContextsTraits->width, environmentContextsTraits->height)) ;
                        GLenum envCameraBuffer = environmentContextsTraits->doubleBuffer? GL_BACK: GL_FRONT ;
                        envCamera->setDrawBuffer(envCameraBuffer) ;
                        envCamera->setReadBuffer(envCameraBuffer) ;
                        envCamera->setDataVariance(osg::Object:YNAMIC) ;
                        envCamera->setProjectionMatrixAsPerspective(90.0, double(environmentContextsTraits->width) / environmentContextsTraits->height, 0.1, 10000.0) ;
                }

                if (windowNumber > 0){
                        //Associate the camera of position view to the first environment view's graphics context
                        osg::Camera *positionViewCamera = positionView->getCamera() ;
                        positionViewCamera->setGraphicsContext(environmentContexts[0].get()) ;
                        positionViewCamera->setViewport(new osg::Viewport(0, 0, environmentContextsTraits[0]->width / 4, environmentContextsTraits[0]->height / 4)) ;
                        GLenum positionViewCameraBuffer = environmentContextsTraits[0]->doubleBuffer? GL_BACK: GL_FRONT ;
                        positionViewCamera->setDrawBuffer(positionViewCameraBuffer) ;
                        positionViewCamera->setReadBuffer(positionViewCameraBuffer) ;
                        positionViewCamera->setDataVariance(osg::Object::DYNAMIC) ;
                        positionViewCamera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR) ;        //Crucial!!
                                //The OSG by default computes the near/far planes on the fly, overriding the values set by the projection matrix. This default behaviour
                                //ensures that a wide range of models are loadable in OSG applications without application programmers having to check the size of the model
                                //and manually setting the near/far to the range. Must switch this functionality off explicitly to make sure that the culling is performed
                                //according to the data specified in the projection matrix

                        //Associate the camera of position reporter view to the first environment view's graphics context
                        osg::Camera *positionReporterViewCamera = positionReporterView->getCamera() ;
                        positionReporterViewCamera->setGraphicsContext(environmentContexts[0].get()) ;
                        positionReporterViewCamera->setViewport(new osg::Viewport(0, 0, environmentContextsTraits[0]->width, environmentContextsTraits[0]->height)) ;
                        positionReporterViewCamera->setProjectionMatrixAsOrtho2D(0, environmentContextsTraits[0]->width, 0, environmentContextsTraits[0]->height) ;
                        positionReporterViewCamera->setClearMask(GL_DEPTH_BUFFER_BIT) ;
//                        positionReporterViewCamera->setRenderOrder(osg::Camera::POST_RENDER) ;
                        positionReporterViewCamera->setAllowEventFocus(false) ;
                                //Disable the position reporter view's camera from receiving events
                }

                //Setup manipulators for the views
                PositionViewGUIEventHandler *positionViewGUIHandler = new PositionViewGUIEventHandler() ;
                positionView->addEventHandler(positionViewGUIHandler) ;
                EnvironmentViewGUIEventHandler *environmentViewGUIHandler = new EnvironmentViewGUIEventHandler() ;
                environmentView->addEventHandler(environmentViewGUIHandler) ;
在如上代码中,position view和position reporter view的主camera都关联到同一个graphics context,请问如何能使这个graphics context产生的键盘事件被两个view的事件响应句柄捕获?谢谢!

该用户从未签到

发表于 2009-1-7 08:23:35 | 显示全部楼层
我想您可以使用addEventHandler将同一个键盘事件处理器赋给两个View对象,不过我并没有试验过。

该用户从未签到

发表于 2009-1-8 21:27:15 | 显示全部楼层
原帖由 array 于 2009-1-7 08:23 发表
我想您可以使用addEventHandler将同一个键盘事件处理器赋给两个View对象,不过我并没有试验过。

这样做没有问题,我以前也是这样实现的。

该用户从未签到

 楼主| 发表于 2009-1-9 02:03:42 | 显示全部楼层
好的,我去试试看~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表