回调
- osg::Node
- setUpdateCallback()
- 参数为osg::NodeCallback
- operator()重载
- 参数为osg::NodeCallback
- addUpdateCallback()
- setEventCallback()
- 参数为osg::NodeCallback
- operator()重载
- 参数为osg::NodeCallback
- setCullCallback()
- 参数为osg::NodeCallback
- operator()重载
- 参数为osg::NodeCallback
- setUpdateCallback()
- osg::Drawable
- setUpdateCallback()
- osg::Drawable::UpdateCallback
- update()重载
- osg::Drawable::UpdateCallback
- setEventCallback()
- osg::Drawable::EventCallback
- event()重载
- osg::Drawable::EventCallback
- setCullCallback()
- osg::Drawable::CullCallback
- cull()重载
- osg::Drawable::CullCallback
- setUpdateCallback()
- osg::StateAttribute
- setUpdateCallback()
- osg:: StateAttributeCallback
- operator()重载
- osg:: StateAttributeCallback
- setEventCallback()
- osg:: StateAttributeCallback
- operator()重载
- osg:: StateAttributeCallback
- setUpdateCallback()
- osg::Uniform
- setUpdateCallback()
- osg::Uniform:: Callback
- operator()重载
- osg::Uniform:: Callback
- setEventCallback()
- osg::Uniform:: Callback
- operator()重载
- osg::Uniform:: Callback
- setUpdateCallback()
- osg::Camera
- setPreDrawCallback()
- osg::Camera:: DrawCallback
- operator()重载
- osg::Camera:: DrawCallback
- setPostDrawCallback()
- osg::Camera:: DrawCallback
- operator()重载
- osg::Camera:: DrawCallback
- setPreDrawCallback()
traverse用法
- node和Nodevisitor中traverse用法
- callback中traverse用法:
- 调用Nodevisitor的traverse方法,如果忘记了,traversal会停止
示例
#include <osg/Switch>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
class SwitchingCallback : public osg::NodeCallback
{
public:
SwitchingCallback() : _count(0) {}
virtual void operator()(osg::Node* node,
osg::NodeVisitor* nv);
protected:
unsigned int _count;
};
void SwitchingCallback::operator()(osg::Node* node,
osg::NodeVisitor* nv)
{
osg::Switch* switchNode = static_cast<osg::Switch*>(node);
if (!((++_count) % 60) && switchNode)
{
switchNode->setValue(0, !switchNode->getValue(0));
switchNode->setValue(1, !switchNode->getValue(1));
}
traverse(node, nv);
}
int main(int argc, char** argv)
{
osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile(
"cessna.osg");
osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile("cessnafire.osg");
osg::ref_ptr<osg::Switch> root = new osg::Switch;
root->addChild(model1.get(), false);
root->addChild(model2.get(), true);
root->setUpdateCallback(new SwitchingCallback);
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
return viewer.run();
}
避免冲突
osg::Object变量枚举值
-
UNSPECIFIED(default)
-
STATIC update和draw过程中不变
-
DYNAMIC update和cull完成后才能draw
node->setDataVariance( osg::Object::DYNAMIC );
drawable回调中如果顶点和组元改变需调用
- 更新显示列表中顶点和组元
- setUseDisplayList(true)情况下
- drawable->dirtyDisplayList()
- setUseVertexBufferObjects(true)且setUseDisplayList(false)情况下
- vertices->dirty();
- setUseDisplayList(true)情况下
- 更新边界使cull正确
- drawable->dirtyBound()
示例
#include <osg/Geometry>
#include <osg/Geode>
#include <osgViewer/Viewer>
osg::Geometry* createQuad