1 /*
2 	Copyright (C) 2005-2007 Feeling Software Inc.
3 	Portions of the code are:
4 	Copyright (C) 2005-2007 Sony Computer Entertainment America
5 
6 	MIT License: http://www.opensource.org/licenses/mit-license.php
7 */
8 
9 #include "StdAfx.h"
10 #include "FCDocument/FCDocument.h"
11 #include "FCDocument/FCDAnimation.h"
12 #include "FCDocument/FCDAnimationChannel.h"
13 #include "FCDocument/FCDAnimationClip.h"
14 #include "FCDocument/FCDAnimationCurve.h"
15 #include "FCDocument/FCDAnimated.h"
16 
17 //
18 // FCDAnimationClip
19 //
20 
21 ImplementObjectType(FCDAnimationClip);
22 ImplementParameterObjectNoCtr(FCDAnimationClip, FCDEntityInstance, animations);
23 
FCDAnimationClip(FCDocument * document)24 FCDAnimationClip::FCDAnimationClip(FCDocument* document)
25 :	FCDEntity(document, "AnimationClip")
26 ,	InitializeParameter(start, 0.0f)
27 ,	InitializeParameter(end, 0.0f)
28 ,	InitializeParameterNoArg(animations)
29 {
30 }
31 
~FCDAnimationClip()32 FCDAnimationClip::~FCDAnimationClip()
33 {
34 	curves.clear();
35 }
36 
AddClipCurve(FCDAnimationCurve * curve)37 void FCDAnimationClip::AddClipCurve(FCDAnimationCurve* curve)
38 {
39 	curve->RegisterAnimationClip(this);
40 	curves.push_back(curve);
41 	SetNewChildFlag();
42 }
43 
Clone(FCDEntity * _clone,bool cloneChildren) const44 FCDEntity* FCDAnimationClip::Clone(FCDEntity* _clone, bool cloneChildren) const
45 {
46 	FCDAnimationClip* clone = NULL;
47 	if (_clone == NULL) _clone = clone = new FCDAnimationClip(const_cast<FCDocument*>(GetDocument()));
48 	else if (_clone->HasType(FCDAnimationClip::GetClassType())) clone = (FCDAnimationClip*) _clone;
49 
50 	Parent::Clone(_clone, cloneChildren);
51 
52 	if (clone != NULL)
53 	{
54 		// Copy the generic animation clip parameters
55 		clone->start = start;
56 		clone->end = end;
57 
58 		// If requested, clone the animation curves as well.
59 		for (FCDAnimationCurveTrackList::const_iterator it = curves.begin(); it != curves.end(); ++it)
60 		{
61 			if (cloneChildren)
62 			{
63 				FCDAnimationCurve* clonedCurve = (*it)->Clone(NULL, false);
64 				clonedCurve->AddClip(clone);
65 				clone->AddClipCurve(clonedCurve);
66 			}
67 		}
68 	}
69 
70 	return _clone;
71 }
72 
AddInstanceAnimation()73 FCDEntityInstance* FCDAnimationClip::AddInstanceAnimation()
74 {
75 	FCDEntityInstance* newInstance = FCDEntityInstanceFactory::CreateInstance(GetDocument(), NULL, FCDEntity::ANIMATION);
76 	animations.push_back(newInstance);
77 	return newInstance;
78 }
79 
AddInstanceAnimation(FCDAnimation * animation)80 FCDEntityInstance* FCDAnimationClip::AddInstanceAnimation(FCDAnimation* animation)
81 {
82 	FCDEntityInstance* newInstance = FCDEntityInstanceFactory::CreateInstance(GetDocument(), NULL, animation);
83 	animations.push_back(newInstance);
84 	return newInstance;
85 }
86