void AnimationTarget::cloneInto(AnimationTarget* target, NodeCloneContext &context) const { if (_animationChannels) { for (std::vector<Animation::Channel*>::const_iterator it = _animationChannels->begin(); it != _animationChannels->end(); ++it) { Animation::Channel* channel = *it; GP_ASSERT(channel); GP_ASSERT(channel->_animation); Animation* animation = context.findClonedAnimation(channel->_animation); if (animation != NULL) { Animation::Channel* channelCopy = new Animation::Channel(*channel, animation, target); animation->addChannel(channelCopy); } else { // Clone the animation and register it with the context so that it only gets cloned once. animation = channel->_animation->clone(channel, target); context.registerClonedAnimation(channel->_animation, animation); } } } }
Animation* Animation::clone(Channel* channel, AnimationTarget* target) { GP_ASSERT(channel); Animation* animation = new Animation(getId()); Animation::Channel* channelCopy = new Animation::Channel(*channel, animation, target); animation->addChannel(channelCopy); // Release the animation because a newly created animation has a ref count of 1 and the channels hold the ref to animation. animation->release(); GP_ASSERT(animation->getRefCount() == 1); // Clone the clips if (_defaultClip) { animation->_defaultClip = _defaultClip->clone(animation); } if (_clips) { for (std::vector<AnimationClip*>::iterator it = _clips->begin(); it != _clips->end(); ++it) { AnimationClip* newClip = (*it)->clone(animation); animation->addClip(newClip); } } return animation; }
Animation* Animation::clone(Channel* channel, AnimationTarget* target) { Animation* animation = new Animation(getId()); Animation::Channel* channelCopy = new Animation::Channel(*channel, animation, target); animation->addChannel(channelCopy); // Release the animation because a newly created animation has a ref count of 1 and the channels hold the ref to animation. animation->release(); assert(animation->getRefCount() == 1); return animation; }