|
|
//====== Copyright � 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: CSFMScriptMgr declaration, defines the interface of the sfm script
// manager class which is used to run scripts and provides and interface for
// script commands to perform operations.
//
//=============================================================================
#ifndef SFMSCRIPTMGR_H
#define SFMSCRIPTMGR_H
#ifdef _WIN32
#pragma once
#endif
#include "sfmobjects/sfmrigutils.h"
#include "movieobjects/dmechannel.h"
#include "tier1/UtlBuffer.h"
#include "tier1/UtlStack.h"
#include "tier1/fmtstr.h"
// Forward declarations
class CDmeDag; class CDmeClip; class CDmeFilmClip; class CDmeAnimationSet; class CDmeRigHandle; class CDmeRigBaseConstraintOperator; class CDmeRig; class CDmeGameModel; class CSFMAnimSetScriptContext; class CDmePresetGroupInfo;
//-------------------------------------------------------------------------------------------------
// CSFMScriptContext -- The script context class is a storage container which provides information
// to the script manager about the current state, including dag node and time selection.
//
//-------------------------------------------------------------------------------------------------
class CSFMScriptContext {
public:
enum SelectMode_t { SELECT_ADD, SELECT_REMOVE, SELECT_TOGGLE, };
public: // Constructor
CSFMScriptContext( CDmeClip *pMovie, CDmeFilmClip *pShot, DmeTime_t time, DmeFramerate_t framerate, CDmeAnimationSet *pActiveAnimSet = NULL, const CUtlVector< CDmeDag * > *pSelectedDagList = NULL, CDmElement *pSharedPresetGroupSettings = NULL );
// Destructor, destroys the animation set context if created
~CSFMScriptContext();
// Get dag node the primary selection
CDmeDag *PrimaryDagSelection() const;
// Clear the current selection.
void ClearSelection();
// Add the specified node to the current selection.
void AddToSelection( CDmeDag *pDagNode, SelectMode_t mode );
// Remove the specified dag node from the current selection
bool RemoveFromSelection( CDmeDag *pDagNode, bool preserveOrder = true );
// Add the list of dag nodes to the current selection
void AddListSelection( const CUtlVector< CDmeDag* > &selection );
// Push the current selection on to the stack
void PushSelection();
// Pop the last selection from the stack
void PopSelection();
// Make the time selection include the entire shot
void TimeSelectAll( DmeTime_t handleTime = DMETIME_ZERO );
// Select time relative to the shot
void TimeSelectShot( float leftFalloff, float leftHold, float rightHold, float rightFalloff, int leftFalloffType, int rightFalloffType );
// Select time specified with in frames
void TimeSelectFrames( int leftFalloff, int leftHold, int rightHold, int rightFalloff, int leftFalloffType, int rightFalloffType ); // Set the channel operating mode
void SetChannelMode( ChannelMode_t mode ); // Get the current time a frame relative to the start of the shot
void SetCurrentFrame( int frame );
// Get the current frame relative to the start of the shot
int GetCurrentFrame() const;
// Set the current ( global ) time
void SetCurrentTime( DmeTime_t globalTime );
// Set the active animation set
void SetActiveAnimationSet( CDmeAnimationSet *pAnimationSet );
// Get the specified animation set context
CSFMAnimSetScriptContext *GetAnimSetContext( int index ) const; // Find the animation set context for the specified animation set.
CSFMAnimSetScriptContext *FindAnimationSetContext( CDmeAnimationSet *pAnimationSet ) const;
// Get the first selected dag node in the selection list and initialize the iterator
CDmeDag *GetFirstSelectedDag();
// Get the next selected dag node in the selection list
CDmeDag *GetNextSelectedDag();
// Start a new rig or continue an existing one if a rig with the specified name already exists
CDmeRig *BeginRig( const char *pchRigName, bool bAllowAppend );
// End the current rig
void EndRig();
// Add an element to the currently active rig
void AddElementToRig( CDmElement *pElement, CDmeAnimationSet *pAnimSet );
// Accessors
CDmeClip *Movie() const { return m_pMovie; } CDmeFilmClip *Shot() const { return m_pShot; } CDmeAnimationSet *ActiveAnimationSet() const { return m_pActiveAnimSet; } CDmeRig *CurrentRig() const { return m_pCurrentRig; } const DmeLog_TimeSelection_t &TimeSelection() const { return m_TimeSelection; } const CUtlVector< CDmeDag * > &Selection() const { return m_Selection; } DmeTime_t CurrentTime() const { return m_CurrentTime; } ChannelMode_t ChannelMode() const { return m_ChannelMode; } int NumAnimationSets() const { return m_AnimSetContextList.Count(); } CDmElement *SharedPresetGroupSettings() const { return m_pSharedPresetGroupSettings; }
private:
// Initialize the context.
void InititalizeContext();
// Destroy all of the animation set contexts
void DestroyAnimSetContexts();
private:
bool m_bPythonInitalized; // Flag indicating if python is initalized
CDmeClip *m_pMovie; // Current movie in which the script is operating
CDmeFilmClip *m_pShot; // Current shot in which the script is operating
CDmeAnimationSet *m_pActiveAnimSet; // Currently selected animation set, used as a default
CDmeRig *m_pCurrentRig; // Currently active rig
ChannelMode_t m_ChannelMode; // Mode in which channels will be operated
DmeTime_t m_CurrentTime; // Time at which the script is being run
DmeFramerate_t m_Framerate; // The framerate setting of the current session
DmeLog_TimeSelection_t m_TimeSelection; // Time selection to be used with any time dependent operations
CUtlVector< CDmeDag * > m_Selection; // Set of selected dag nodes for script operation
CUtlStack< CUtlVector< CDmeDag * > > m_SelectionStack; // Stack of selection sets used to store and restore selections
CUtlVector< CSFMAnimSetScriptContext* > m_AnimSetContextList; // List of the animation set contexts, one for each animation set in the group
int m_CurrentControlIndex; // Index used by the control iteration functions
int m_CurrentDagIndex; // Index used by the dag iteration functions
CDmElement *m_pSharedPresetGroupSettings; // Session's shared preset group settings
};
//-------------------------------------------------------------------------------------------------
// CSFMScriptMgr
//
//-------------------------------------------------------------------------------------------------
class CSFMScriptMgr {
public:
// Constructor
CSFMScriptMgr( CSFMScriptContext &scriptContext );
// Destructor
~CSFMScriptMgr();
static void SetInterfaceFactory( CreateInterfaceFn factory );
// Initialize the python script interface and register the sfm module.
static void InitializeScriptInterface();
// Shutdown the python script interface
static void ShutdownScriptInterface();
// Run the script provided in the buffer.
static bool RunScript( const CUtlBuffer &scriptBuffer, CSFMScriptContext &scriptContext, CUtlString *pErrorMsg = NULL );
// Find an animation set using the provided path
CDmeAnimationSet *FindAnimationSet( const char *pchName, CDmeAnimationSet *pDefaultAnimSet = NULL ) const;
// Set the currently active animation set that will be used when an animation set is not explicitly specified
bool SetActiveAnimationSet( const char *pchAnimSetPath ) const;
// Create an animation set for the specified element
CDmeAnimationSet *CreateDagAnimationSet( CDmeDag *pElement, const char *pName ) const;
// Create a game model referencing the specified mdl
CDmeGameModel *CreateGameModel( const char *pRelativeModelName ) const;
// Find a dag by name and animation set path
CDmeDag *FindDag( const char *pchAnimSetDagPath, CDmeAnimationSet **pAnimationSet = NULL, const char **pDagName = NULL ) const;
// Add all of the dag nodes of the animation set to the current selection
bool SelectAnimSet( const char *pchAnimSetPath = NULL ) const;
// Add the controls and dag nodes within the specified selection group to the current selection set
bool Select( const char *pchName, CSFMScriptContext::SelectMode_t mode = CSFMScriptContext::SELECT_ADD ) const;
// Make the primary selection dag node the parent of all other selected dag nodes
bool ParentDags( bool bMaintainWorldPos, bool bParentToWorld, ReParentLogMode_t logMode ) const;
// Create a rig handle with the specified name, add it to the active rig if any.
CDmeRigHandle *CreateRigHandle( char const *pchHandleName, char const *pchRigSubGroup, const Vector &p, const Quaternion &q, bool bPositionControl, bool bRotationControl ) const;
// Create a dag and associated control for the specified attachment position.
CDmeDag *CreateAttachmentHandle( const char *pchAttachmentName ) const;
// Create a dag node and add controls for it to the specified animation set
CDmeDag *CreateDag( const char *pName, const Vector &pos, const Quaternion &orient, CDmeAnimationSet *pAnimSet = NULL, CDmeDag *pParent = NULL ) const;
// Create a constraint of the specified type using the current selection.
CDmeConstraintTarget *CreateConstraint( char const *pchConstraintName, char const *pchRigSubGroup, int constrainType, bool bPreserveOffset, float weight, bool bCreateControls, bool bOperate ) const;
// Create an aim constraint using the current selection.
CDmeConstraintTarget *CreateAimConstraint( char const *pchConstraintName, char const *pchRigSubGroup, bool bPreserveOffset, float weight, bool bCreateControls, const Vector &upVector, TransformSpace_t upSpace, const CDmeDag *pRefDag ) const;
// Create an IK constraint using he current selection
CDmeConstraintTarget *CreateIKConstraint( char const *pchConstraintName, char const *pchRigSubGroup, bool bPreserveOffset, bool bCreateControls, const Vector &poleVector, CDmeDag *pPoleVectorTarget ) const;
// Remove all constraints from the currently selected dag nodes.
void RemoveConstraints() const;
// Generate position and orientation logs for the currently selected dag nodes.
bool GenerateLogSamples( CDmeDag *pParent, bool bPosition, bool bOrientation, bool bWorld ) const;
// Get the averaged position of the selected dag nodes
void GetDagPosition( Vector &position, TransformSpace_t space, const CDmeDag *pReferenceSpaceDag = NULL) const;
// Get the average orientation of the selected dag nodes
void GetDagRotation( Vector &rotation, TransformSpace_t space, const CDmeDag *pReferenceSpaceDag = NULL ) const;
// Move the selected dag nodes to the specified position or by specified amount
void MoveDags( const Vector &offset, TransformSpace_t space, bool bRelative, bool bOffsetMode, CDmeDag *pReferenceDag );
// Rotate the selected dag nodes to the specified position or by specified amount
void RotateDags( const Vector &offset, TransformSpace_t space, bool bRelative, bool bOffsetMode, CDmeDag *pReferenceDag );
// Set the current position and rotation as the default for the transforms of the selected dag nodes
void SetDagTransformDefaults( bool bPosition, bool bOrientation ) const;
// Set the currently selected dag nodes to their reference pose position.
void SetReferencePose() const; // Clear the error message buffer
void ClearErrorMessage();
// Append the provided string to the current error message
void AppendErrorMessage( const char *errorString );
// Get the current error message string
const char *GetErrorMessage() const; // Get the script context
const CSFMScriptContext &Context() const { return m_Context; } CSFMScriptContext &Context() { return m_Context; }
private:
// Execute the specified script
bool ExecuteScript( const CUtlBuffer &scriptBuffer );
// Separate the target name from the path of a animation set / dag name path.
static const char *SeparatePath( const char *pchAnimSetDagPath, char *pchAnimSetPath, int maxLength );
// Construct a name for constraint on the specified dag
void ConstructNameForConstraint( EConstraintType constraintType, CDmeDag *pDag, const char *pchConstraintName, CFmtStr &name ) const;
// Perform processing which is done on all newly created constraints
CDmeConstraintTarget *ProcessNewConstraint( CDmeDag *pSalveDag, CDmeRigBaseConstraintOperator* pConstraint, const char *pchRigSubGroup, bool bCreateControls ) const;
private:
CSFMScriptContext &m_Context; CUtlString m_ErrorBuffer;
static CreateInterfaceFn sm_pToolsFactory; }; //-------------------------------------------------------------------------------------------------
// Global pointer to the active script manager, created and destroyed by RunScript()
extern CSFMScriptMgr *g_pScriptMgr;
#endif // SFMSCRIPTMGR_H
|