|
发表于 2014-5-12 21:54:31
|
显示全部楼层
本帖最后由 cenfer 于 2014-5-12 21:55 编辑
定义事件回调,以键盘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的值了。
|
|