查看: 1488|回复: 11

如何在这个回调里(class updateShader : public osg::Uniform::Callback)添加一....

[复制链接]

该用户从未签到

发表于 2014-5-9 08:24:20 | 显示全部楼层 |阅读模式
如何在这个回调里(class updateShader : public osg::Uniform::Callback)添加一键盘事件处理?

该用户从未签到

发表于 2014-5-9 20:44:24 | 显示全部楼层
osg已经将这样的事件处理放到 osgGA::GUIEventHandler 了
你想在回调里直接处理键盘事件不现实也不合理。
在业务层组织下,是可以把当前的键盘消息传递给回调对象的。

该用户从未签到

 楼主| 发表于 2014-5-10 08:40:39 | 显示全部楼层
cenfer 发表于 2014-5-9 20:44
osg已经将这样的事件处理放到 osgGA::GUIEventHandler 了
你想在回调里直接处理键盘事件不现实也不合理。
...

谢谢你,我试试。。。。

该用户从未签到

 楼主| 发表于 2014-5-10 10:29:59 | 显示全部楼层
hczhang 发表于 2014-5-10 08:40
谢谢你,我试试。。。。

大神,如何将键盘消息与回调联系到一起?

该用户从未签到

发表于 2014-5-10 17:28:22 | 显示全部楼层
hczhang 发表于 2014-5-10 10:29
大神,如何将键盘消息与回调联系到一起?


代码大体示意一下吧

////////////////////////////////////////////////////////////////////////////////////////////////////
虚接口类
class EventClass
{
        virtual void sendGUIEvent() {};
};
//事件捕获
class userEventHandler: public osgGA::GUIEventHandler
{
        EventClass* _eventObj; //事件发送对象
        void setEventObj(EventClass* _obj) {_eventObj _eventObj = _obj; }//设置事件发送对象
        virtual bool  handle (const GUIEventAdapter &ea, GUIActionAdapter &aa)
        {
                if(需要处理事件)
                {
                        _eventObj->sendGUIEvent();
                }
        }
}


//////////////////////////////////////////////////////////////////
//事件传递接口 子类实现
class ChildEventClass : public EventClass
{
        updateShader* _callObj;
        void setUpdateShader(updateShader* obj){ _callObj = obj;}//设置相应事件的对象
        virtual void sendGUIEvent()
         {
                  _callObj->handleEvent() ;//事件处理
          };
};


//你的自定义回调里增加事件处理接口
class updateShader : public osg::Uniform::Callback
{
        void handleEvent() ;//事件处理
}

//////////////////////////////////////////////////////////////
业务层组织好指针的传递
main
{
       假定有业务层管理对象Manger
      // Manger->GetUpdateShader();//获得回调对象
      // Manger->GetUserEventHandler()//获得事件处理对象

       现在要创建事件传递对象了
       ChildEventClass* _event = new ChildEventClass;
        _event->setUpdateShader( Manger->GetUpdateShader() );
        Manger->GetUserEventHandler()->setEventObj(_event );
}

该用户从未签到

 楼主| 发表于 2014-5-11 10:41:36 | 显示全部楼层
cenfer 发表于 2014-5-10 17:28
代码大体示意一下吧

////////////////////////////////////////////////////////////////////////// ...

    谢谢啊。。。话说,,这个业务层 对象Manger及它的成员函数是怎么设计的?

该用户从未签到

发表于 2014-5-12 14:16:45 | 显示全部楼层
本帖最后由 cenfer 于 2014-5-12 14:20 编辑
hczhang 发表于 2014-5-11 10:41
谢谢啊。。。话说,,这个业务层 对象Manger及它的成员函数是怎么设计的?


哈哈  可以不那么复杂,简单的!!!
事件和节点回调 一起的。想起CEGUI的例子,回调是可以这样自定义的。

struct MyEventCallback : public osgGA::GUIEventHandler  
{  
    MyEventCallback () {}  

    /** do customized Event code. */  
    virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv);

};

setEventCallback(new MyEventCallback ());

该用户从未签到

 楼主| 发表于 2014-5-12 20:24:00 | 显示全部楼层
cenfer 发表于 2014-5-12 14:16
哈哈  可以不那么复杂,简单的!!!
事件和节点回调 一起的。想起CEGUI的例子,回调是可以这样自定义 ...

这是代码资源,主要是想通过键盘实现更改shader中的A、D、F变量,有时间帮忙看看呗。。。实在是不会弄了、、、谢谢啊

Water.zip

256.87 KB, 下载次数: 7, 下载积分: 威望 1

该用户从未签到

发表于 2014-5-12 20:32:04 | 显示全部楼层
好我看看吧

该用户从未签到

发表于 2014-5-12 21:54:31 | 显示全部楼层
本帖最后由 cenfer 于 2014-5-12 21:55 编辑
hczhang 发表于 2014-5-12 20:24
这是代码资源,主要是想通过键盘实现更改shader中的A、D、F变量,有时间帮忙看看呗。。。实在是不会弄了 ...


定义事件回调,以键盘A和F的响应为例,Uniform变量的更新算法你按需求自己整
struct MyEventCallback : public osgGA::GUIEventHandler  
{  
        MyEventCallback () {}  

        /** do customized Event code. */  
        virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv)
        {
                osgViewer::View * view = dynamic_cast<osgViewer::View*>(&aa);
                osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);  
                osg::Node* waterface= dynamic_cast<osg::Node*>(obj);  
                if (!view || !ev ||!waterface)
                {
                        return false;
                }

                osg::StateSet* stateset = waterface->getStateSet();
                if (!stateset)
                {
                        return false;
                }
        
                switch(ea.getEventType())  
                {  
                case(osgGA::GUIEventAdapter::KEYDOWN):
                        if (ea.getKey() == osgGA::GUIEventAdapter::KEY_A)
                        {
                                if (stateset->getUniform("A"))
                                {
                                        stateset->getUniform("A")->set(osg::Vec2(3.78085,1.77258));//设置新值
                                }
                        }
                        else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_F)
                        {
                                if (stateset->getUniform("F"))
                                {
                                        stateset->getUniform("F")->set(osg::Vec2(3.78085,1.77258));//设置新值
                                }
                        }
                        break;
                }
       
        return false;
       
        }
};


main函数里
waterface->setEventCallback(new MyEventCallback);

你里面的updateShader仅仅是osg::Uniform( "time", 0.0f )的更新。
响应键盘的Uniform你放在了waterface这个节点StateSet里。
所以你设置waterface节点的事件回调,获取StateSet就可以获取并设置Uniform的值了。




该用户从未签到

 楼主| 发表于 2014-5-13 09:13:27 | 显示全部楼层
cenfer 发表于 2014-5-12 21:54
定义事件回调,以键盘A和F的响应为例,Uniform变量的更新算法你按需求自己整
struct MyEventCallback  ...

非常谢谢你,实现了   。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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