Related Scripting Object: AnimationSourceItem
An ActionSource contains a collection of animation source items, which you can get at using ActionSource::GetItems. The AnimationSourceItem class provides access to the animation DataSource (for example, an FCurve) and a target entity such as the Parameter or Cluster which the animation source drives. More...
#include <xsi_animationsourceitem.h>
Inheritance diagram for AnimationSourceItem:

Public Member Functions |
|
| AnimationSourceItem () | |
| ~AnimationSourceItem () | |
| AnimationSourceItem (const CRef &in_ref) | |
| AnimationSourceItem (const AnimationSourceItem &in_obj) | |
| bool | IsA (siClassID in_ClassID) const |
| siClassID | GetClassID () const |
| AnimationSourceItem & | operator= (const AnimationSourceItem &in_obj) |
| AnimationSourceItem & | operator= (const CRef &in_ref) |
| bool | GetIsActive () const |
| CStatus | PutIsActive (bool in_bActiveState) |
| CRef | GetSource () const |
| CStatus | PutSource (CRef in_source) |
| CString | GetTarget () const |
| CStatus | PutTarget (CString &in_target) |
| CStatus | SetAsStatic (CValue &in_vValue, StaticSource &out_static) |
One way to create action animation is to create an empty ActionSource and then populate it afterwards using ActionSource::AddSourceItem. In that case you can add a StaticSource as the animation source using AnimationSourceItem::SetAsStatic.
In order to know exactly which type of AnimationSourceItem you are dealing with you can use SIObject::GetType which returns one of the values contained in the siAnimationSourceItemType enum.
using namespace XSI; Application app; Model root = app.GetActiveSceneRoot(); X3DObject myCube; root.AddGeometry( L"Cube", L"MeshSurface", L"", myCube ); //Creating the first animation source CValueArray args(9); CValue outArg; args[0] = root; args[1] = L"cube.kine.local.posx,cube.kine.local.posy,cube.kine.local.posz"; args[2] = 1l; args[3] = L"StoredStaticPose"; args[4] = true; args[5] = 1l; args[6] = 5l; args[7] = false; args[8] = false; app.ExecuteCommand( L"StoreAction", args, outArg ); ActionSource mySource(outArg); CRefArray aSourceItems = mySource.GetItems(); for(LONG i = 0; i < aSourceItems.GetCount();++i) { SourceItem currItem(aSourceItems[i]); app.LogMessage(L" The animated target is " + currItem.GetTarget()); app.LogMessage(L" The type of animation is " + currItem.GetType()); //In this case its a static value //you can switch on type. StaticValue myVal = currItem.GetSource(); app.LogMessage(L" The value is " + myVal.GetValue().GetAsText()); }
using namespace XSI; // Forward declarations CString GetRelativeName( Parameter& in_param ); FCurve MakeAnFCurve( Null& in_obj, CString in_param ); Application app; // NewScene command CValueArray cargs; CValue oarg; cargs.Add( L"" ); cargs.Add( false ); app.ExecuteCommand( L"NewScene", cargs, oarg ); cargs.Clear(); // Get the scene root Model root = app.GetActiveSceneRoot(); // Create a null and get pointers to the pos parameters Null n; root.AddNull( L"null", n ); Parameter posx = n.GetParameter( L"posx" ); CString rposx = GetRelativeName(posx); Parameter posy = n.GetParameter( L"posy" ); CString rposy = GetRelativeName(posy); Parameter posz = n.GetParameter( L"posz" ); CString rposz = GetRelativeName(posz); // Create an empty actionsource and then populate it with static values ActionSource src = root.AddActionSource( L"StaticActionSource" ); FCurve fc = MakeAnFCurve( n, L"posy" ); src.AddSourceItem( rposx, 2.0 ); // static value src.AddSourceItem( rposy, fc ); // fcurve src.AddSourceItem( rposz ); // default static value = 0.0 // Now change the value on the posz parameter using SetAsStatic and change // the posy parameter source to an fcurve CRefArray animsrcitems = src.GetItems(); for ( LONG i=0; i<animsrcitems.GetCount(); ++i ) { AnimationSourceItem srcitem(animsrcitems[i]); // Get a pointer to the source item (it can be either a StaticSource or an FCurve) CRef ref = srcitem.GetSource(); if ( ref.IsA(siFCurveID) ) { FCurve datasrc(ref); // Print the FCurve type app.LogMessage( L"AnimationSourceItem[" + CString(i) + L"] (" + srcitem.GetTarget() + L") has " + CString(datasrc.GetNumKeys()) + L" keys" ); } if ( ref.IsA(siStaticSourceID) ) { StaticSource datasrc(ref); // Print the current value app.LogMessage( L"AnimationSourceItem[" + CString(i) + L"] (" + srcitem.GetTarget() + L") has this static value: " + CString( datasrc.GetValue() ) ); } // AnimationSourceItem::GetTarget returns the \xl RelativeName if ( srcitem.GetTarget() == rposy ) { StaticSource staticvalue; srcitem.SetAsStatic( CValue(1.0), staticvalue ); // Check for the new value (we know it's a StaticSource because we just set it) StaticSource datasrc( srcitem.GetSource() ); // refresh app.LogMessage( L"New static value = " + CString( datasrc.GetValue() ) ); } if ( srcitem.GetTarget() == rposz ) { StaticSource staticvalue; srcitem.SetAsStatic( CValue(1.5), staticvalue ); // Check for the new value (we know it's a StaticSource because we just set it) StaticSource datasrc( srcitem.GetSource() ); // refresh app.LogMessage( L"New static value = " + CString( datasrc.GetValue() ) ); } } //INFO : AnimationSourceItem[0] (null.kine.local.posx) has this static value: 2 //INFO : AnimationSourceItem[1] (null.kine.local.posy) has 4 keys //INFO : New static value = 1 //INFO : AnimationSourceItem[2] (null.kine.local.posz) has this static value: 0 //INFO : New static value = 1.5 // Function to remove the name of the model from the FullName of the specified parameter. // This is necessary when setting up a source that will later be used to instantiate a // clip when the parameter lives under a model other than the Scene_Root. CString GetRelativeName( Parameter& in_param ) { Model mdl = in_param.GetModel(); CString mdlname = mdl.GetFullName(); if ( mdlname.IsEqualNoCase(L"Scene_Root") ) { return in_param.GetFullName(); } else { CString tmp = in_param.GetFullName(); CString lookfor = mdlname + L"."; CString foundsofar = L""; CString relpath = L""; for ( ULONG i=0; i<tmp.Length(); ++i ) { if ( foundsofar.IsEqualNoCase(lookfor) ) { relpath += tmp[i]; } else { foundsofar += tmp[i]; } } return relpath; } } // Convenience function FCurve MakeAnFCurve( Null& in_obj, CString in_param ) { Parameter p = in_obj.GetParameter( in_param ); FCurve fc; p.AddFCurve( siStandardFCurve, fc ); fc.AddKey( CTime(1.0), CValue(1.25) ); fc.AddKey( CTime(25.0), CValue(2.0) ); fc.AddKey( CTime(40.0), CValue(2.75) ); fc.AddKey( CTime(85.0), CValue(0.0) ); return fc; }
Default constructor.
| ~AnimationSourceItem | ( | ) |
Default destructor.
| AnimationSourceItem | ( | const CRef & | in_ref | ) |
Constructor.
| in_ref | constant reference object. |
| AnimationSourceItem | ( | const AnimationSourceItem & | in_obj | ) |
Copy constructor.
| in_obj | constant class object. |
| bool IsA | ( | siClassID | in_ClassID | ) | const [virtual] |
Returns true if a given class type is compatible with this API class.
| in_ClassID | class type. |
Reimplemented from SIObject.
| siClassID GetClassID | ( | ) | const [virtual] |
Returns the type of the API class.
Reimplemented from SIObject.
| AnimationSourceItem& operator= | ( | const AnimationSourceItem & | in_obj | ) |
Creates an object from another object. The newly created object is set to empty if the input object is not compatible.
| in_obj | constant class object. |
| AnimationSourceItem& operator= | ( | const CRef & | in_ref | ) |
Creates an object from a reference object. The newly created object is set to empty if the input reference object is not compatible.
| in_ref | constant class object. |
Reimplemented from SIObject.
| bool GetIsActive | ( | ) | const |
Returns true if the animation source item is active.
using namespace XSI; // Forward declaration void MakeFCActionSource( Null& in_null ); Application app; // NewScene command CValueArray cargs; CValue oarg; cargs.Add( L"" ); cargs.Add( false ); app.ExecuteCommand( L"NewScene", cargs, oarg ); cargs.Clear(); oarg.Clear(); Model root = app.GetActiveSceneRoot(); // Create a simple actionsource from some animation on the null's position Null n; root.AddNull( L"null", n ); MakeFCActionSource( n ); // Get the actionsource from the model CRefArray sources = root.GetSources(); app.LogMessage( L"Number of sources on " + root.GetFullName() + L": " + CString(sources.GetCount()) ); ActionSource src( sources.GetItem(0) ); // Find animation source item with posx and mute it CRefArray srcitems = src.GetItems(); for ( LONG i=0; i<srcitems.GetCount(); ++i ) { AnimationSourceItem animsrcitm( srcitems[i] ); // Find the right target by looking for 'posx' with the StringSearch command cargs.Add( animsrcitm.GetTarget() ); cargs.Add( L"posx" ); cargs.Add( false ); app.ExecuteCommand( L"StringSearch", cargs, oarg ); if ( oarg.GetAsText() != L"-1" ) { app.LogMessage( L"muting " + animsrcitm.GetTarget() ); animsrcitm.PutIsActive( false ); break; // Quit looking once it's found } cargs.Clear(); oarg.Clear(); } // Apply actionsource with muted posx CValueArray args; CValue outarg; args.Add( root.GetFullName() ); args.Add( src.GetFullName() ); args.Add( root.GetFullName() ); // Simple clips take the model as compound owner app.ExecuteCommand( L"AddClip", args, outarg ); // Find the clip Mixer mxr = root.GetMixer(); CRefArray cliplist = mxr.GetClips(); Clip clp( cliplist[0] ); // Test the source items src = clp.GetSource(); srcitems = src.GetItems(); for ( i=0; i<srcitems.GetCount(); ++i ) { AnimationSourceItem animsrcitm( srcitems[i] ); app.LogMessage( animsrcitm.GetFullName() + L" " + animsrcitm.GetTarget() + L" is active: " + CString(animsrcitm.GetIsActive()) ); } // Expected results: //INFO : Number of sources on Scene_Root: 1 //INFO : muting null.kine.local.posx //INFO : AnimationSourceItem null.kine.local.posx is active: false //INFO : AnimationSourceItem null.kine.local.posy is active: true //INFO : AnimationSourceItem null.kine.local.posz is active: true // Function to remove the name of the model from the FullName of the specified parameter. // This is necessary when setting up a source that will later be used to instantiate a // clip when the parameter lives under a model other than the Scene_Root. CString GetRelativeName( Parameter& in_param ) { Model mdl = in_param.GetModel(); CString mdlname = mdl.GetFullName(); if ( mdlname.IsEqualNoCase(L"Scene_Root") ) { return in_param.GetFullName(); } else { CString tmp = in_param.GetFullName(); CString lookfor = mdlname + L"."; CString foundsofar = L""; CString relpath = L""; for ( ULONG i=0; i<tmp.Length(); ++i ) { if ( foundsofar.IsEqualNoCase(lookfor) ) { relpath += tmp[i]; } else { foundsofar += tmp[i]; } } return relpath; } } // Create a simple actionsource from animation on the null's position void MakeFCActionSource( Null& in_null ) { Application app; CTimeArray time; time.Add( CTime(1.000) ); time.Add( CTime(50.000) ); time.Add( CTime(100.000) ); CValueArray vals; // X Parameter posx = in_null.GetParameter( L"posx" ); CString rposx = GetRelativeName(posx); FCurve fcx; posx.AddFCurve( siStandardFCurve, fcx ); vals.Add( CValue(-8.153) ); vals.Add( CValue(0.197) ); vals.Add( CValue(9.413) ); fcx.SetKeys( time, vals ); vals.Clear(); // Y Parameter posy = in_null.GetParameter( L"posy" ); CString rposy = GetRelativeName(posy); FCurve fcy; posy.AddFCurve( siStandardFCurve, fcy ); vals.Add( CValue(7.015) ); vals.Add( CValue(-1.92) ); vals.Add( CValue(7.015) ); fcy.SetKeys( time, vals ); vals.Clear(); // Z Parameter posz = in_null.GetParameter( L"posz" ); CString rposz = GetRelativeName(posz); FCurve fcz; posz.AddFCurve( siStandardFCurve, fcz ); vals.Add( CValue(-0.702) ); vals.Add( CValue(0.192) ); vals.Add( CValue(-0.702) ); fcz.SetKeys( time, vals ); // StoreAction command CValueArray args; CValue outarg; args.Add( app.GetActiveSceneRoot().GetFullName() ); args.Add( rposx + L"," + rposy + L"," + rposz ); args.Add( CValue(2.0) ); args.Add( L"StoredFcvAction" ); args.Add( true ); args.Add( CValue(1.0) ); args.Add( CValue(100.0) ); app.ExecuteCommand( L"StoreAction", args, outarg ); }
| CStatus PutIsActive | ( | bool | in_bActiveState | ) |
Sets the activeness of the animation source item (true = active; false = muted).
| in_bActiveState | activation state. |
CStatus::Fail failure
| CRef GetSource | ( | ) | const |
Returns the animation source (FCurve, StaticSource or ShapeKey).
Sets the animation source (FCurve or StaticSource).
| in_source | The animation source reference. |
using namespace XSI; // Forward declarations CString GetRelativeName( Parameter& in_param ); void MakeNewFCrvSource(); void MakeNewFCrv( FCurve& out_fc ); void PrintClipInfo( Clip& in_clip ); void PrintSourceInfo( ActionSource& in_src ); Application app; // NewScene command CValueArray cargs; CValue oarg; cargs.Add( L"" ); cargs.Add( false ); app.ExecuteCommand( L"NewScene", cargs, oarg ); cargs.Clear(); oarg.Clear(); // Get the SceneRoot Model root = app.GetActiveSceneRoot(); CString rootName = root.GetFullName(); // New fcurve ActionSource MakeNewFCrvSource(); Null n = root.FindChild( L"", siNullPrimType, CStringArray() ); // Get the ActionSource from the model & instantiate it as a clip CRefArray sources = root.GetSources(); ActionSource src( sources.GetItem(0) ); // AddClip command CValueArray clipArgs; CValue outClip; clipArgs.Add( rootName ); clipArgs.Add( src.GetRef().GetAsText() ); clipArgs.Add( rootName ); // Simple clips take the model as compound owner app.ExecuteCommand( L"AddClip", clipArgs, outClip ); // Set up another fc (external to a source) FCurve fc; MakeNewFCrv( fc ); // Find the clip Mixer mxr = root.GetMixer(); CRefArray cliplist = mxr.GetClips(); Clip clp(cliplist[0]); app.LogMessage( L"BEFORE source modifications:" ); PrintClipInfo( clp ); // Copy the fc onto the fc-based source CRefArray srcitems = src.GetItems(); AnimationSourceItem oldSrcItem( srcitems.GetItem(0) ); oldSrcItem.PutSource( fc.GetRef() ); // Print the values on the action source after modifications to the source // (the instanced action in the clip and its underlying source have the same values) app.LogMessage( L"AFTER source modifications:" ); PrintClipInfo( clp ); // Expected results: //INFO : BEFORE source modifications: //INFO : Reporting on Mixer.Mixer_Anim_Track.StoredFcvAction_Clip clip: //INFO : - Source used = Sources.Scene_Root.StoredFcvAction //INFO : --- SrcItem #0 target = MyAnimatedNull.kine.local.posx and its datasource is a FCurve //INFO : (evaluates to -2.84068 at frame 30) //INFO : --- SrcItem #1 target = MyAnimatedNull.kine.local.posy and its datasource is a FCurve //INFO : (evaluates to 1.3305 at frame 30) //INFO : --- SrcItem #2 target = MyAnimatedNull.kine.local.posz and its datasource is a FCurve //INFO : (evaluates to -0.133232 at frame 30) //INFO : //INFO : AFTER source modifications: //INFO : Reporting on Mixer.Mixer_Anim_Track.StoredFcvAction_Clip clip: //INFO : - Source used = Sources.Scene_Root.StoredFcvAction //INFO : --- SrcItem #0 target = MyAnimatedNull.kine.local.posx and its datasource is a FCurve //INFO : (evaluates to 2.84068 at frame 30) //INFO : --- SrcItem #1 target = MyAnimatedNull.kine.local.posy and its datasource is a FCurve //INFO : (evaluates to 1.3305 at frame 30) //INFO : --- SrcItem #2 target = MyAnimatedNull.kine.local.posz and its datasource is a FCurve //INFO : (evaluates to -0.133232 at frame 30) //INFO : // Function to remove the name of the model from the FullName of the specified parameter. // This is necessary when setting up a source that will later be used to instantiate a // clip when the parameter lives under a model other than the Scene_Root. CString GetRelativeName( Parameter& in_param ) { Model mdl = in_param.GetModel(); CString mdlname = mdl.GetFullName(); if ( mdlname.IsEqualNoCase(L"Scene_Root") ) { return in_param.GetFullName(); } else { CString tmp = in_param.GetFullName(); CString lookfor = mdlname + L"."; CString foundsofar = L""; CString relpath = L""; for ( ULONG i=0; i<tmp.Length(); ++i ) { if ( foundsofar.IsEqualNoCase(lookfor) ) { relpath += tmp[i]; } else { foundsofar += tmp[i]; } } return relpath; } } // Create a simple (fcurve) actionsource based on a null's position void MakeNewFCrvSource() { Application app; Model root = app.GetActiveSceneRoot(); Null n; root.AddNull( L"MyAnimatedNull", n ); CTimeArray time; time.Add( CTime(1.000) ); time.Add( CTime(50.000) ); time.Add( CTime(100.000) ); CValueArray vals; // X Parameter posx = n.GetParameter( L"posx" ); CString rposx = GetRelativeName(posx); FCurve fcx; posx.AddFCurve( siStandardFCurve, fcx ); vals.Add( CValue(-8.153) ); vals.Add( CValue(0.197) ); vals.Add( CValue(9.413) ); fcx.SetKeys( time, vals ); vals.Clear(); // Y Parameter posy = n.GetParameter( L"posy" ); CString rposy = GetRelativeName(posy); FCurve fcy; posy.AddFCurve( siStandardFCurve, fcy ); vals.Add( CValue(7.015) ); vals.Add( CValue(-1.92) ); vals.Add( CValue(7.015) ); fcy.SetKeys( time, vals ); vals.Clear(); // Z Parameter posz = n.GetParameter( L"posz" ); CString rposz = GetRelativeName(posz); FCurve fcz; posz.AddFCurve( siStandardFCurve, fcz ); vals.Add( CValue(-0.702) ); vals.Add( CValue(0.192) ); vals.Add( CValue(-0.702) ); fcz.SetKeys( time, vals ); // StoreAction command CValueArray args; CValue outArg; args.Add( CRef(root) ); args.Add( rposx + L"," + rposy + L"," + rposz ); args.Add( 2.0 ); args.Add( L"StoredFcvAction" ); args.Add( true ); args.Add( 1.0 ); args.Add( 100.0 ); app.ExecuteCommand( L"StoreAction", args, outArg ); } // Convenience function to create an fcurve void MakeNewFCrv( FCurve& out_fc ) { Application app; Model root = app.GetActiveSceneRoot(); Null n; root.AddNull( L"MyDummyNull", n ); CRefArray kids; kids.Add( n ); Model m; root.AddModel( kids, L"MyDummyModel", m ); CTimeArray time; time.Add( CTime(1.000) ); time.Add( CTime(50.000) ); time.Add( CTime(100.000) ); CValueArray vals; vals.Add( CValue(8.153) ); vals.Add( CValue(-0.197) ); vals.Add( CValue(-9.413) ); // X Parameter posx = n.GetParameter( L"posx" ); posx.AddFCurve( siStandardFCurve, out_fc ); out_fc.SetKeys( time, vals ); } // Convenience function to print out information about the clip's source void PrintClipInfo( Clip& in_clip ) { Application app; // Clip app.LogMessage( L"Reporting on " + in_clip.GetFullName() + L" clip:" ); // Clip's source PrintSourceInfo( ActionSource(in_clip.GetSource()) ); } // Convenience function to print out information about the source void PrintSourceInfo( ActionSource& in_src ) { Application app; // Source app.LogMessage( L" - Source used = " + in_src.GetFullName() ); // Source's items CRefArray itemsRef = in_src.GetItems(); for ( LONG i=0; i<itemsRef.GetCount(); ++i ) { AnimationSourceItem animsrcitm( itemsRef[i] ); app.LogMessage( L" --- SrcItem #" + CString(i) + L" target = " + animsrcitm.GetTarget() + L" and its datasource is a " + animsrcitm.GetSource().GetClassIDName() ); // Underlying data source is an FCurve if ( animsrcitm.GetSource().GetClassID() == siFCurveID ) { FCurve fc( animsrcitm.GetSource() ); app.LogMessage( L" (evaluates to " + fc.Eval( CTime(30.0) ).GetAsText() + L" at frame 30)" ); } // Underlying data source is a StaticSource if ( animsrcitm.GetSource().GetClassID() == siStaticSourceID ) { StaticSource sv( animsrcitm.GetSource() ); app.LogMessage( L" (evaluates to " + sv.GetValue().GetAsText() + L")" ); } } // Extra blank line app.LogMessage( L"" ); }
| CString GetTarget | ( | ) | const |
Returns the complete name of the animation target (the Parameter to which the animation has been applied) as a RelativeName.
using namespace XSI; // Forward declarations CString GetRelativeName( Parameter& in_param ); void MakeNewFCrvSource( Null& in_null ); void PrintClipInfo( Clip& in_clip ); void PrintSourceInfo( ActionSource& in_src ); Application app; // NewScene command CValueArray cargs; CValue oarg; cargs.Add( L"" ); cargs.Add( false ); app.ExecuteCommand( L"NewScene", cargs, oarg ); cargs.Clear(); oarg.Clear(); // Get the SceneRoot Model root = app.GetActiveSceneRoot(); // Create a new model and add a null Model m; root.AddModel( CRefArray(), L"MyModel", m ); Null n; m.AddNull( L"MyNull", n ); // Add an fcurve ActionSource based on the new null MakeNewFCrvSource( n ); // Get the ActionSource from the model CRefArray sources = m.GetSources(); ActionSource src( sources.GetItem(0) ); app.LogMessage( L"BEFORE source modifications:" ); PrintSourceInfo( src ); // Get the relative name for the posx parameter Parameter posx = n.GetParameter( L"posx" ); CString rp = GetRelativeName( posx ); // Find animation source item with posx CRefArray srcitems = src.GetItems(); for ( LONG i=0; i<srcitems.GetCount(); ++i ) { AnimationSourceItem itm( srcitems.GetItem(i) ); if ( itm.GetTarget() == rp ) { // Change the fcurve keys on the posx source FCurve fc( itm.GetSource() ); CTimeArray t; t.Add( CTime(1) ); t.Add( CTime(50) ); t.Add( CTime(100) ); CValueArray v; v.Add( CValue(-8.0) ); v.Add( CValue(8.0) ); v.Add( CValue(9.0) ); fc.SetKeys( t, v ); break; } } // Print modified info app.LogMessage( L"AFTER source modifications:" ); PrintSourceInfo( src ); // Expected results: //INFO : BEFORE source modifications: //INFO : - Source used = Sources.MyModel.StoredFcvAction //INFO : Underlying fc evaluates to -2.84068 at frame 30) on MyNull.kine.local.posx //INFO : //INFO : AFTER source modifications: //INFO : - Source used = Sources.MyModel.StoredFcvAction //INFO : Underlying fc evaluates to 2.1793 at frame 30) on MyNull.kine.local.posx //INFO : // Function to remove the name of the model from the FullName of the specified parameter. // This is necessary when setting up a source that will later be used to instantiate a // clip when the parameter lives under a model other than the Scene_Root. CString GetRelativeName( Parameter& in_param ) { Model mdl = in_param.GetModel(); CString mdlname = mdl.GetFullName(); if ( mdlname.IsEqualNoCase(L"Scene_Root") ) { return in_param.GetFullName(); } else { CString tmp = in_param.GetFullName(); CString lookfor = mdlname + L"."; CString foundsofar = L""; CString relpath = L""; for ( ULONG i=0; i<tmp.Length(); ++i ) { if ( foundsofar.IsEqualNoCase(lookfor) ) { relpath += tmp[i]; } else { foundsofar += tmp[i]; } } return relpath; } } // Create a simple (fcurve) actionsource based on a null's position void MakeNewFCrvSource( Null& in_null ) { Application app; Model mdl = in_null.GetModel(); CTimeArray time; time.Add( CTime(1.000) ); time.Add( CTime(50.000) ); time.Add( CTime(100.000) ); CValueArray vals; // X Parameter posx = in_null.GetParameter( L"posx" ); CString rposx = GetRelativeName(posx); FCurve fcx; posx.AddFCurve( siStandardFCurve, fcx ); vals.Add( CValue(-8.153) ); vals.Add( CValue(0.197) ); vals.Add( CValue(9.413) ); fcx.SetKeys( time, vals ); vals.Clear(); // Y Parameter posy = in_null.GetParameter( L"posy" ); CString rposy = GetRelativeName(posy); FCurve fcy; posy.AddFCurve( siStandardFCurve, fcy ); vals.Add( CValue(7.015) ); vals.Add( CValue(-1.92) ); vals.Add( CValue(7.015) ); fcy.SetKeys( time, vals ); vals.Clear(); // Z Parameter posz = in_null.GetParameter( L"posz" ); CString rposz = GetRelativeName(posz); FCurve fcz; posz.AddFCurve( siStandardFCurve, fcz ); vals.Add( CValue(-0.702) ); vals.Add( CValue(0.192) ); vals.Add( CValue(-0.702) ); fcz.SetKeys( time, vals ); // Build an action with the fcurves as source items ActionSource src = mdl.AddActionSource( L"StoredFcvAction" ); src.AddSourceItem( rposx, fcx, true ); src.AddSourceItem( rposy, fcy, true ); src.AddSourceItem( rposz, fcz, true ); } // Convenience function to print out information about the source void PrintSourceInfo( ActionSource& in_src ) { Application app; app.LogMessage( L" - Source used = " + in_src.GetFullName() ); // Get the Source's first item CRefArray itemsRef = in_src.GetItems(); AnimationSourceItem animsrcitm( itemsRef[0] ); // Get underlying fcurve FCurve fc( animsrcitm.GetSource() ); app.LogMessage( L" Underlying fc evaluates to " + fc.Eval( CTime(30.0) ).GetAsText() + L" at frame 30 on " + animsrcitm.GetTarget() ); // Extra blank line app.LogMessage( L"" ); }
Sets the complete name of the object to be animated by this animation source item as a RelativeName.
| in_target | The RelativeName (SIObject::GetFullName without the modelname prefix) |
CStatus::Fail failure
| CStatus SetAsStatic | ( | CValue & | in_vValue, | |
| StaticSource & | out_static | |||
| ) |
Sets the source of the source item as a StaticSource (static value).
| in_vValue | The value of the AnimationSourceItem. |
| out_static | The newly created StaticSource. |
CStatus::Fail failure
using namespace XSI; // Forward declarations CString GetRelativeName( Parameter& in_param ); void MakeStaticActionSource(); void PrintClipInfo( Clip& in_clip ); void PrintSourceInfo( ActionSource& in_src ); Application app; // NewScene command CValueArray cargs; CValue oarg; cargs.Add( L"" ); cargs.Add( false ); app.ExecuteCommand( L"NewScene", cargs, oarg ); cargs.Clear(); oarg.Clear(); // Get the SceneRoot Model root = app.GetActiveSceneRoot(); CString rootName = root.GetFullName(); // New static ActionSource MakeStaticActionSource(); Null n = root.FindChild( L"", siNullPrimType, CStringArray() ); // Get the ActionSource from the model & instantiate it as a clip CRefArray sources = root.GetSources(); ActionSource src( sources.GetItem(0) ); // AddClip command CValueArray clipArgs; CValue outClip; clipArgs.Add( rootName ); clipArgs.Add( src.GetRef().GetAsText() ); clipArgs.Add( rootName ); // Simple clips take the model as compound owner app.ExecuteCommand( L"AddClip", clipArgs, outClip ); // Find the clip Mixer mxr = root.GetMixer(); CRefArray cliplist = mxr.GetClips(); Clip clp(cliplist[0]); app.LogMessage( L"BEFORE source modifications:" ); PrintClipInfo( clp ); // Get the AnimationSourceItem CRefArray srcitems = src.GetItems(); AnimationSourceItem oldSrcItem( srcitems.GetItem(0) ); // Use the AnimationSourceItem::GetSource function to get the StaticSource and then change its value StaticSource sv( oldSrcItem.GetSource() ); sv.PutValue( CValue(2.5) ); // Print the values on the action source after modifications to the source app.LogMessage( L"AFTER source modifications:" ); PrintClipInfo( clp ); // Expected results: //INFO : BEFORE source modifications: //INFO : Reporting on Mixer.Mixer_Anim_Track.Action_Clip clip: //INFO : - Source used = Sources.Scene_Root.Action //INFO : --- SrcItem #0 target = MyAnimatedNull.kine.local.posx and its datasource is a StaticSource //INFO : (evaluates to 0) //INFO : --- SrcItem #1 target = MyAnimatedNull.kine.local.posy and its datasource is a StaticSource //INFO : (evaluates to 1) //INFO : --- SrcItem #2 target = MyAnimatedNull.kine.local.posz and its datasource is a StaticSource //INFO : (evaluates to 2) //INFO : //INFO : AFTER source modifications: //INFO : Reporting on Mixer.Mixer_Anim_Track.Action_Clip clip: //INFO : - Source used = Sources.Scene_Root.Action //INFO : --- SrcItem #0 target = MyAnimatedNull.kine.local.posx and its datasource is a StaticSource //INFO : (evaluates to 2.5) //INFO : --- SrcItem #1 target = MyAnimatedNull.kine.local.posy and its datasource is a StaticSource //INFO : (evaluates to 1) //INFO : --- SrcItem #2 target = MyAnimatedNull.kine.local.posz and its datasource is a StaticSource //INFO : (evaluates to 2) //INFO : // Function to remove the name of the model from the FullName of the specified parameter. // This is necessary when setting up a source that will later be used to instantiate a // clip when the parameter lives under a model other than the Scene_Root. CString GetRelativeName( Parameter& in_param ) { Model mdl = in_param.GetModel(); CString mdlname = mdl.GetFullName(); if ( mdlname.IsEqualNoCase(L"Scene_Root") ) { return in_param.GetFullName(); } else { CString tmp = in_param.GetFullName(); CString lookfor = mdlname + L"."; CString foundsofar = L""; CString relpath = L""; for ( ULONG i=0; i<tmp.Length(); ++i ) { if ( foundsofar.IsEqualNoCase(lookfor) ) { relpath += tmp[i]; } else { foundsofar += tmp[i]; } } return relpath; } } // Create a simple actionsource based on static values void MakeStaticActionSource() { Application app; Model root = app.GetActiveSceneRoot(); Null n; root.AddNull( L"MyAnimatedNull", n ); // Get the relative names for the parameter targets Parameter posx = n.GetParameter( L"posx" ); CString rposx = GetRelativeName(posx); Parameter posy = n.GetParameter( L"posy" ); CString rposy = GetRelativeName(posy); Parameter posz = n.GetParameter( L"posz" ); CString rposz = GetRelativeName(posz); // Create an empty action source ActionSource src = root.AddActionSource(); // Populate it with a static value using ActionSource::AddSourceItem (default=0.0) src.AddSourceItem( rposx ); // Populate it with a specified static value using ActionSource::AddSourceItem src.AddSourceItem( rposy, double(1.0), true ); // Populate it with the default static value, then set a real value later with AnimationSourceItem::SetAsStatic AnimationSourceItem animsrcitem = src.AddSourceItem( rposz ); animsrcitem.SetAsStatic( CValue(2.0), StaticSource() ); } // Convenience function to print out information about the clip's source void PrintClipInfo( Clip& in_clip ) { Application app; // Clip app.LogMessage( L"Reporting on " + in_clip.GetFullName() + L" clip:" ); // Clip's source PrintSourceInfo( ActionSource(in_clip.GetSource()) ); } // Convenience function to print out information about the source void PrintSourceInfo( ActionSource& in_src ) { Application app; // Source app.LogMessage( L" - Source used = " + in_src.GetFullName() ); // Source's items CRefArray itemsRef = in_src.GetItems(); for ( LONG i=0; i<itemsRef.GetCount(); ++i ) { AnimationSourceItem animsrcitm( itemsRef[i] ); app.LogMessage( L" --- SrcItem #" + CString(i) + L" target = " + animsrcitm.GetTarget() + L" and its datasource is a " + animsrcitm.GetSource().GetClassIDName() ); // Underlying data source is an FCurve if ( animsrcitm.GetSource().GetClassID() == siFCurveID ) { FCurve fc( animsrcitm.GetSource() ); app.LogMessage( L" (evaluates to " + fc.Eval( CTime(30.0) ).GetAsText() + L" at frame 30)" ); } // Underlying data source is a StaticSource if ( animsrcitm.GetSource().GetClassID() == siStaticSourceID ) { StaticSource sv( animsrcitm.GetSource() ); app.LogMessage( L" (evaluates to " + sv.GetValue().GetAsText() + L")" ); } } // Extra blank line app.LogMessage( L"" ); }