|
参考下面的帖子实现了一个模型的淡入操作的更新回调类
http://www.osgchina.org/bbs/viewthread.php?tid=1314&highlight=%B5%AD
对调度进来的节点(程序能够正确得到当前调度的节点)并设置更新回调:-
- virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
- {
- node->getOrCreateStateSet()->setAttributeAndModes(blendFunc,osg::StateAttribute::ON);
- node->getOrCreateStateSet()->setAttributeAndModes(blendColor,osg::StateAttribute::ON);
- if (alpha > 1)
- {
- //node->setUpdateCallback(NULL);
- node->removeUpdateCallback(this);
- alpha = 0.0f;
- }
- else
- {
- alpha += 0.01;
- blendColor->setConstantColor(osg::Vec4(1, 1, 1,alpha));
- }
- traverse( node, nv );
- }
复制代码
当alpha大于1时,就采用如上方法移除掉node的更新回调。
该更新回调类的对象,使用了一个全局变量:
Lodnode->setUpdateCallback(g_fadecallback);//g_fadecallback使用智能指针
结果发现,节点并没有成功将更新回调移除掉
已经调度到场景的节点和刚调度的节点均有淡入操作
按照思路:已经调度到场景的节点是不会再执行淡入操作的:
node->removeUpdateCallback(this);
后来,我将执行更新回调的类使用局部变量:
Lodnode->setUpdateCallback(new FadeCallback);
更新回调类不做任何修改
结果就和我预想的一致
调试发现执行removeUpdateCallback和setUpdateCallback(NULL)等效
就是将节点当前的更新回调置空
造成如上差别的原因:个人猜测跟智能指针的使用有关,不知是否正确,请大家多指教,谢谢。 |
|