OSG学習ノート5—スイッチノードを使用

1782 ワード

//osg_4_23.cpp:コンソールアプリケーションのエントリポイントを定義します.
//スイッチノードの使用
//スイッチノードの使い方、およびスイッチノードの更新コールバックを使用して動的サブノード切替プロセスを完了しました. 
//合わせて2回切り替え、1回120フレーム、1回240フレームの場合
//ノードの実装について:あるサブノードが対するスイッチ値を判断し、スイッチ値がfalseの場合、そのaccept()関数は実行されないので、そのサブノードとそのサブツリーもアクセサによって遍歴されない.
//そうでなければ正常なアクセサ推進操作を実行する
#include "stdafx.h"
#include<osg/Switch>
#include<osgDB/ReadFile>
#include<osgViewer/Viewer>


class CessnaCallback :public osg::NodeCallback//         ,                    
{
public:
	static const int _fireStartFrame = 120;//           120 
	static const int _fireStartFrame1 = 240;//           240 
	virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)//       
	{
		osg::Switch* cessnaSwitch = dynamic_cast<osg::Switch*>(node);
		if (cessnaSwitch && nv)
		{
			const osg::FrameStamp* frameStamp = nv->getFrameStamp();//           
			if (frameStamp)
			{
				if (_fireStartFrame < frameStamp->getFrameNumber())//      120 ,  setValue()        。
				{
					cessnaSwitch->setValue(0, false);
					cessnaSwitch->setValue(1, true);
				}
				if (_fireStartFrame1 < frameStamp->getFrameNumber())//      240 ,  setValue()        。
				{
					cessnaSwitch->setValue(0, true);
					cessnaSwitch->setValue(1,false);


				}
			}


		}
		traverse(node, nv);


	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	osg::ref_ptr<osg::Switch> root = new osg::Switch;
	root->addChild(osgDB::readNodeFile("cessna.osg"), true);//        ,             , true
	root->addChild(osgDB::readNodeFile("cessnafire.osg"), false);
	root->setUpdateCallback(new CessnaCallback);


	osgViewer::Viewer viewer;
	viewer.setSceneData(root.get());
	return viewer.run();
}