void addChannel( osgAnimation::Channel* pChannel, osg::ref_ptr<osgAnimation::AnimationManagerBase>& pAnimManager, const char* pTakeName) { if (!pChannel) { return; } if (!pAnimManager) pAnimManager = new osgAnimation::BasicAnimationManager; osgAnimation::Animation* pAnimation = 0; const osgAnimation::AnimationList& anims = pAnimManager->getAnimationList(); for (size_t i = 0; i < anims.size(); ++i) { if (anims[i]->getName() == pTakeName) { pAnimation = anims[i].get(); } } if (!pAnimation) { pAnimation = new osgAnimation::Animation; pAnimation->setName(pTakeName); pAnimManager->registerAnimation(pAnimation); } pAnimation->addChannel(pChannel); }
ExampleTimelineUsage(osgAnimation::TimelineAnimationManager* manager) { _releaseKey = false; _manager = manager; const osgAnimation::AnimationList& list = _manager->getAnimationList(); osgAnimation::AnimationMap map; for (osgAnimation::AnimationList::const_iterator it = list.begin(); it != list.end(); it++) map[(*it)->getName()] = *it; _mainLoop = new osgAnimation::ActionStripAnimation(map["Idle_Main"].get(),0.0,0.0); _mainLoop->setLoop(0); // means forever _scratchHead = new osgAnimation::ActionStripAnimation(map["Idle_Head_Scratch.02"].get(),0.2,0.3); _scratchHead->setLoop(1); // one time map["Idle_Nose_Scratch.01"]->setDuration(10.0); // set this animation duration to 10 seconds _scratchNose = new osgAnimation::ActionStripAnimation(map["Idle_Nose_Scratch.01"].get(),0.2,0.3); _scratchNose->setLoop(1); // one time // add the main loop at priority 0 at time 0. osgAnimation::Timeline* tml = _manager->getTimeline(); tml->play(); tml->addActionAt(0.0, _mainLoop.get(), 0); // add a scratch head priority 1 at 3.0 second. tml->addActionAt(5.0, _scratchHead.get(), 1); // populate time with scratch head for (int i = 1; i < 20; i++) { // we add a scratch head priority 1 each 10 second // note: // it's possible to add the same instance more then once on the timeline // the only things you need to take care is if you remove it. It will remove // all instance that exist on the timeline. If you need to differtiate // it's better to create a new instance tml->addActionAt(5.0 + 10.0 * i, _scratchHead.get(), 1); } // we will add the scratch nose action only when the player hit a key // in the operator() // now we will add callback at end and begin of animation of Idle_Nose_Scratch.02 _scratchNose->setCallback(0.0, new NoseBegin); _scratchNose->setCallback(_scratchNose->getNumFrames()-1, new NoseEnd); }