2
Copyright (c) 2008-2009 NetAllied Systems GmbH
4
This file is part of COLLADAMax.
6
Portions of the code are:
7
Copyright (c) 2005-2007 Feeling Software Inc.
8
Copyright (c) 2005-2007 Sony Computer Entertainment America
10
Based on the 3dsMax COLLADASW Tools:
11
Copyright (c) 2005-2006 Autodesk Media Entertainment
13
Licensed under the MIT Open Source License,
14
for details please see LICENSE file or the website
15
http://www.opensource.org/licenses/mit-license.php
18
#include "COLLADAMaxStableHeaders.h"
19
#include "COLLADAMaxAnimationCreator.h"
22
#define COLORRGB_CONTROL_CLASS_ID Class_ID(0x118f7c01,0xfeee238a)
23
#define SCALEXYZ_CONTROL_CLASS_ID Class_ID(0x118f7c01,0xfeee238b)
29
//------------------------------
30
AnimationCreator::AnimationCreator( DocumentImporter* documentImporter )
31
: ImporterBase(documentImporter)
35
//------------------------------
36
AnimationCreator::~AnimationCreator()
40
//------------------------------
41
Control* AnimationCreator::createMaxFloatController( COLLADAFW::AnimationCurve* animationCurve, bool isLinear )
43
Class_ID controllerClassID(isLinear ? LININTERP_FLOAT_CLASS_ID : HYBRIDINTERP_FLOAT_CLASS_ID, 0);
44
return createMaxController( CTRL_FLOAT_CLASS_ID, controllerClassID );
47
//------------------------------
48
Control* AnimationCreator::createMaxTransformationController( COLLADAFW::AnimationCurve* animationCurve )
50
Class_ID controllerClassID(PRS_CONTROL_CLASS_ID, 0);
51
return createMaxController( CTRL_MATRIX3_CLASS_ID, controllerClassID );
54
//------------------------------
55
Control* AnimationCreator::createMaxConstantFloatController( float constantValue )
57
Class_ID controllerClassID(LININTERP_FLOAT_CLASS_ID, 0);
58
Control* maxController = createMaxController( CTRL_FLOAT_CLASS_ID, controllerClassID );
59
maxController->SetValue(0, &constantValue);
63
//------------------------------
64
Control* AnimationCreator::createMaxColorRGBAController()
66
// Create the controller: Point4 doesn't have a linear controller.
67
//return createMaxController( CTRL_POINT3_CLASS_ID, Class_ID (HYBRIDINTERP_COLOR_CLASS_ID, 0) );
68
return createMaxController( CTRL_POINT3_CLASS_ID, COLORRGB_CONTROL_CLASS_ID );
72
//------------------------------
73
Control* AnimationCreator::createMaxScaleController()
75
// Create the controller: Point4 doesn't have a linear controller.
76
return createMaxController( CTRL_SCALE_CLASS_ID, SCALEXYZ_CONTROL_CLASS_ID );
79
//------------------------------
80
Control* AnimationCreator::createMaxController( SClass_ID controllerSuperClassID, Class_ID controllerClassID )
82
Control* maxController = (Control*)createMaxObject( controllerSuperClassID, controllerClassID);
85
// Set the out-of-range types.
86
//maxController->SetORT(ToORT(curve->GetPreInfinity()), ORT_BEFORE);
87
//maxController->SetORT(ToORT(curve->GetPostInfinity()), ORT_AFTER);
92
//------------------------------
93
Control* AnimationCreator::cloneController( Control* controllerToClone, ConversionFunctorType conversionFunctor )
95
static Class_ID linearFloatClassId(LININTERP_FLOAT_CLASS_ID, 0);
96
static Class_ID hybridFloatClassId(HYBRIDINTERP_FLOAT_CLASS_ID, 0);
98
#ifdef MAX_2011_OR_NEWER
99
DefaultRemapDir remapDir;
100
Control* clonedController = (Control*)controllerToClone->Clone(remapDir);
102
Control* clonedController = (Control*)controllerToClone->Clone();
104
if ( (controllerToClone->SuperClassID() == CTRL_FLOAT_CLASS_ID) && (conversionFunctor) )
106
//we can only scale float controller
107
//we only need to scale, if there is a conversion functor
108
Class_ID controllerClassID = clonedController->ClassID();
110
IKeyControl* clonedKeyController = GetKeyControlInterface( clonedController );
112
if ( controllerClassID == linearFloatClassId )
114
int keyCount = clonedKeyController->GetNumKeys();
115
for ( int i = 0; i < keyCount; ++i)
118
clonedKeyController->GetKey(i, &key);
119
key.val = (*conversionFunctor)(key.val);
120
clonedKeyController->SetKey(i, &key);
123
else if ( controllerClassID == hybridFloatClassId )
125
int keyCount = clonedKeyController->GetNumKeys();
126
for ( int i = 0; i < keyCount; ++i)
129
clonedKeyController->GetKey(i, &key);
130
key.val = (*conversionFunctor)(key.val);
131
key.intan = (*conversionFunctor)(key.intan);
132
key.outtan = (*conversionFunctor)(key.outtan);
133
clonedKeyController->SetKey(i, &key);
137
return clonedController;
140
} // namespace COLLADAMax