PDA

View Full Version : How to access scene information in a C++ modifier


m7ossny
03-22-2007, 10:40 PM
Hi,

I am building a new C++ modifier for Vizard. I am intending to handle the whole scen at once.

modifier=viz.add('modifier.dlm')
logo1=viz.add('logo1.wrl')
logo2=viz.add('logo2.wrl')

viz.modify(modifier)

Well, the last command calls a native code in the dlm file in the function named "void SceneModifier(void *modifier)"

In this function i can get the whole scene through the modifier parameter.
VizModifierObj* pscenemodifier=(VizModifierObj*)modifier;
osg::Node* pnode=pscenemodifier->node.get();

The question is how to get seperate nodes declared in this scene?


Thanks alot for time, Bye.

farshizzo
03-23-2007, 11:02 AM
Hi,

To get the root of each individual vizard node, you will need to create an osg::NodeVisitor that traverses the scenegraph and checks the user data of each node. Here is some sample code that will do this:class VizNodeData : public osg::Referenced
{
public:
VizNodeData(int id) : m_id(id) {}
int getID() const { return m_id; }
private:
int m_id;
};

class VizardNodeVisitor : public osg::NodeVisitor
{
public :
VizardNodeVisitor() : osg::NodeVisitor( TRAVERSE_ALL_CHILDREN ) {}

virtual void apply( osg::Node &node )
{
VizNodeData *data = dynamic_cast<VizNodeData*>(node.getUserData());
if(data) {
//This is the root of a Vizard node with ID: data->getID()
}
traverse(node);
}
};Then in your SceneModifier function you will need to apply this node visitor to the scene root:VizardNodeVisitor vnv;
((VizModifierObj*)modifier)->node->accept(vnv);Let me know if you need anymore help.