1450 lines
54 KiB
C++
1450 lines
54 KiB
C++
////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Crytek Engine Source File.
|
||
// Copyright (C), Crytek Studios, 2002.
|
||
// -------------------------------------------------------------------------
|
||
// File name: iCryAnimation.h
|
||
// Version: v1.00
|
||
// Created: 28/5/2001 by Vladimir Kajalin
|
||
// Compilers: Visual Studio.NET
|
||
// Description: CryAnimation interface
|
||
// -------------------------------------------------------------------------
|
||
// History:
|
||
//
|
||
////////////////////////////////////////////////////////////////////////////
|
||
|
||
#ifndef ICRY_ANIMATION
|
||
#define ICRY_ANIMATION
|
||
|
||
#if !defined(_XBOX) && !defined(LINUX)
|
||
#ifdef CRYANIMATION_EXPORTS
|
||
#define CRYANIMATION_API __declspec(dllexport)
|
||
#else
|
||
#define CRYANIMATION_API __declspec(dllimport)
|
||
#endif
|
||
#else
|
||
#define CRYANIMATION_API
|
||
#endif
|
||
|
||
//DOC-IGNORE-BEGIN
|
||
#include "smartptr.h"
|
||
#include "Cry_Math.h"
|
||
|
||
//! Forward declarations
|
||
#include "IBindable.h"
|
||
struct IShader;
|
||
class CryMatrix;
|
||
struct SRendParams;
|
||
template <class T> class list2;
|
||
struct CryEngineDecalInfo;
|
||
struct ParticleParams;
|
||
struct CryCharMorphParams;
|
||
struct IMatInfo;
|
||
|
||
//#include "CryParticleSpawnInfo.h"
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
#include <IPhysics.h>
|
||
//DOC-IGNORE-END
|
||
|
||
//! flags used by game
|
||
enum ECharRenderFlags
|
||
{
|
||
CS_FLAG_DRAW_MODEL = 1 << 0,
|
||
CS_FLAG_DRAW_NEAR = 1 << 1,
|
||
CS_FLAG_UPDATE = 1 << 2
|
||
/*
|
||
CS_FLAG_MIRROR_X = 1 << 3,// PARTIALLY supported (only for 1stperson weapons)
|
||
CS_FLAG_MIRROR_Y = 1 << 4,// NOT supported
|
||
CS_FLAG_MIRROR_Z = 1 << 5 // NOT supported
|
||
*/
|
||
};
|
||
|
||
//! character limb indentifiers used for IK
|
||
enum limb_identifiers { LIMB_LEFT_ARM=0,LIMB_RIGHT_ARM=1, LIMB_LEFT_LEG=2,LIMB_RIGHT_LEG=3 };
|
||
enum limb_ik_flags { ik_leg=1, ik_arm=2, ik_avoid_stretching=4 };
|
||
#define IK_NOT_USED 1E9f
|
||
|
||
|
||
|
||
// Description:
|
||
// Provide access to the bone matrices to allow procedural animations
|
||
struct ICryBone
|
||
{
|
||
// Description:
|
||
// Can set the relative to default pose matrix to not be calculated.
|
||
// In this case, the relative to default must be set externally via
|
||
// GetRelativeToDefPoseMatrixPointer.
|
||
// This feature is used for lip sync.
|
||
// Arguments:
|
||
// bDoNotCalculate - If set to true, the relative to default pose matrix
|
||
// will not be calculated.
|
||
// Summary:
|
||
// Can disable the relative to default pose matrix calculation
|
||
virtual void DoNotCalculateBoneRelativeMatrix(bool bDoNotCalculate) = 0;
|
||
|
||
// Description:
|
||
// Will remove the effect done by FixBoneMatrix.
|
||
// See Also:
|
||
// FixBoneMatrix
|
||
// Summary:
|
||
// Remove any bone matrix fixing effect
|
||
void UnfixBoneMatrix()
|
||
{
|
||
DoNotCalculateBoneRelativeMatrix(false);
|
||
}
|
||
|
||
// Description:
|
||
// Use a supplied matrix (relative to parent) as the bone matrix and
|
||
// will prevent the Animation System from changing it afterward. To
|
||
// reset this effect, call UnfixBoneMatrix.
|
||
// See Also:
|
||
// UnfixBoneMatrix
|
||
// Arguments:
|
||
// mtxBone - The matrix to specify to be the bone's matrix
|
||
// Summary:
|
||
// Fix the bone's matrix with a specified matrix
|
||
virtual void FixBoneMatrix (const Matrix44& mtxBone) = 0;
|
||
|
||
// Description:
|
||
// WHAT IS THIS:
|
||
// fixes the bone matrix to the given position in world coordinates,
|
||
// assuming the character position and orientation are given by the vCharPos and vCharAngles
|
||
// vCharAngles are the same as in the entity and in the Draw call to ICryCharInstance
|
||
// See Also:
|
||
// SetBoneOriginInWorld
|
||
// Arguments:
|
||
// vCharPos - The character's position
|
||
// vCharAngles - The character's angles
|
||
// vTargetOrigin - The character's target origin
|
||
// Summary:
|
||
// Fix the bone matrix to a position and orientation in world coordinates
|
||
virtual void FixBoneOriginInWorld (const Vec3& vCharPos, const Vec3& vCharAngles, const Vec3& vTargetOrigin) = 0;
|
||
|
||
// Description:
|
||
// WHAT IS THIS:
|
||
// Sets the bone matrix to the given position in world coordinates only for this frame (until update)
|
||
// assuming the character position and orientation are given by the vCharPos and vCharAngles
|
||
// vCharAngles are the same as in the entity and in the Draw call to ICryCharInstance
|
||
// See Also:
|
||
// FixBoneOriginInWorld
|
||
// Arguments:
|
||
// vCharPos - The character's position
|
||
// vCharAngles - The character's angles
|
||
// vTargetOrigin - The character's target origin
|
||
// Summary:
|
||
// Fix the bone matrix to a position and orientation in world coordinates until the Animation System is updated
|
||
virtual void SetBoneOriginInWorld (const Vec3& vCharPos, const Vec3& vCharAngles, const Vec3& vTargetOrigin) = 0;
|
||
|
||
// Description:
|
||
// Set the plus-matrix rotation components. The plus-matrix is used to
|
||
// rotate the upper body following the rotation of the head. This usually
|
||
// should be set in the game code.
|
||
// Arguments:
|
||
// x - x angle in degree
|
||
// y - y angle in degree
|
||
// z - z angle in degree
|
||
// Summary:
|
||
// Set the plus-matrix rotation components
|
||
virtual void SetPlusRotation(float x, float y, float z) = 0;
|
||
|
||
// Description:
|
||
// Set the plus-matrix rotation components. The plus-matrix is used to
|
||
// rotate the upper body following the rotation of the head. This usually
|
||
// should be set in the game code.
|
||
// Arguments:
|
||
// qRotation - Rotation stored as a quaternion
|
||
// Summary:
|
||
// Set the plus-matrix rotation components
|
||
virtual void SetPlusRotation(const CryQuat& qRotation) = 0;
|
||
|
||
// Description:
|
||
// Reset the plus-matrix to identity. The upper body will be rotated at the same rate as the head.
|
||
// Summary:
|
||
// Reset the plus-matrix rotation
|
||
virtual void ResetPlusRotation() = 0;
|
||
|
||
// Description:
|
||
// Get the position of the bone.
|
||
// Return Value:
|
||
// The position is return in a vec3 structure.
|
||
// Summary:
|
||
// Get the position of the bone
|
||
virtual Vec3 GetBonePosition() = 0;
|
||
|
||
// Description:
|
||
// Get the bone axis.
|
||
// Arguments:
|
||
// cAxis - char value containing either x, y or z
|
||
// Return Value:
|
||
// Return the vector for the requested axis. If cAxis wasn't set to either x, y or z, Vec3d(0,0,0) will be returned.
|
||
// Summary:
|
||
// Get the bone axis
|
||
virtual Vec3 GetBoneAxis(char cAxis) = 0;
|
||
|
||
// returns the parent world coordinate system rotation as a quaternion
|
||
|
||
// Description:
|
||
// Get the parent bone world coordinate rotation as a quaternion.
|
||
// Return Value:
|
||
// A quaternion holding the world coordinate rotation of the parent bone.
|
||
// Summary:
|
||
// Get the parent bone world coordinate rotation as a quaternion
|
||
virtual CryQuat GetParentWQuat () = 0;
|
||
|
||
// Description:
|
||
// Get the parent bone.
|
||
// Return Value:
|
||
// A pointer to a ICryBone derived class representing the parent bone. If there's none, NULL will be returned.
|
||
// Summary:
|
||
// Get the parent bone
|
||
virtual ICryBone* GetParent() = 0;
|
||
|
||
// Description:
|
||
// Get the matrix relative to the parent bone.
|
||
// Return Value:
|
||
// A 4x4 matrix holding the relative to the parent bone.
|
||
// Summary:
|
||
// Get the matrix relative to the parent bone
|
||
virtual const Matrix44& GetRelativeMatrix() = 0;
|
||
|
||
// Description:
|
||
// Get the matrix in object coordinates.
|
||
// Return Value:
|
||
// A 4x4 matrix holding the relative to the parent bone.
|
||
// Summary:
|
||
// Get the matrix in object coordinates
|
||
virtual const Matrix44& GetAbsoluteMatrix() = 0;
|
||
};
|
||
|
||
struct AnimSinkEventData
|
||
{
|
||
AnimSinkEventData (void* _p = NULL):
|
||
p(_p),
|
||
n((INT_PTR)_p)
|
||
{
|
||
}
|
||
|
||
void* p;
|
||
INT_PTR n;
|
||
|
||
operator void* () {return p;}
|
||
operator const void* ()const {return p;}
|
||
bool operator == (const AnimSinkEventData& that) const {return p == that.p && n == that.n;}
|
||
};
|
||
|
||
// Summary:
|
||
// Callback functions for game code
|
||
struct ICharInstanceSink
|
||
{
|
||
virtual void OnStartAnimation(const char *sAnimation) = 0;
|
||
virtual void OnAnimationEvent(const char *sAnimation, AnimSinkEventData data) = 0;
|
||
virtual void OnEndAnimation(const char *sAnimation) = 0;
|
||
};
|
||
|
||
// Summary:
|
||
// Types of blending between animation layers
|
||
enum AnimTwinMode
|
||
{
|
||
AnimTwinMode_Replace,
|
||
AnimTwinMode_Add
|
||
};
|
||
|
||
|
||
//DOC-IGNORE-BEGIN
|
||
//! This interface is free from concepts specific for CryEngine
|
||
//DOC-IGNORE-END
|
||
|
||
// Description:
|
||
// This interface hold a set of animation in which each animation is described as properties.
|
||
// Summary:
|
||
// Hold description of a set of animation
|
||
struct IAnimationSet
|
||
{
|
||
// Summary:
|
||
// Retrieves the amount of animation.
|
||
// Return Value:
|
||
// An integer holding the amount of animation
|
||
virtual int Count() = 0;
|
||
|
||
//! Returns the number of morph targets in the set
|
||
|
||
// Summary:
|
||
// Retrieves the amount of morph target.
|
||
// Return Value:
|
||
// An integer holding the amount of morth target
|
||
virtual int CountMorphTargets() {return 0;}
|
||
|
||
//! Returns the index of the animation in the set, -1 if there's no such animation
|
||
|
||
// Summary:
|
||
// Searches for the index of an animation using its name.
|
||
// Arguments:
|
||
// szAnimationName - Null terminated string holding the name of the animation.
|
||
// Return Value:
|
||
// An integer representing the index of the animation. In case the animation
|
||
// couldn't be found, -1 will be returned.
|
||
virtual int Find (const char* szAnimationName) = 0;
|
||
|
||
//! Loads the animation data in memory. fWhenRequired is the timeout in seconds from current moment when
|
||
//! the animation data will actually be required
|
||
|
||
// Summary:
|
||
// Loads the animation data in memory.
|
||
// See Also:
|
||
// <LINK IAnimationSet::StartLoadAnimation@const char*@float, IAnimationSet::StartLoadAnimation>
|
||
// Parameters:
|
||
// nAnimId - Index of the animation.
|
||
// fWhenRequired - Amount of second until the data is loaded. Use
|
||
// 0.0f to immediately load the data.
|
||
// Description:
|
||
// This method can allow to delay loading the data from disk
|
||
// until a specified amount of seconds.
|
||
virtual void StartLoadAnimation (int nAnimId, float fWhenRequired) {}
|
||
|
||
//! Loads the animation data in memory. fWhenRequired is the timeout in seconds from current moment when
|
||
//! the animation data will actually be required
|
||
|
||
// Summary:
|
||
// Loads the animation data in memory.
|
||
// See Also:
|
||
// <LINK IAnimationSet::StartLoadAnimation@int@float, IAnimationSet::StartLoadAnimation>
|
||
// Parameters:
|
||
// szAnimationName - Name of the animation
|
||
// fWhenRequired - Amount of second until the data is loaded. Use
|
||
// 0.0f to immediately load the data.
|
||
// Description:
|
||
// This method can allow to delay loading the data from disk
|
||
// until a specified amount of seconds.
|
||
void StartLoadAnimation (const char* szAnimationName, float fWhenRequired)
|
||
{
|
||
StartLoadAnimation(Find (szAnimationName),fWhenRequired);
|
||
}
|
||
|
||
//! Unloads animation from memory
|
||
//! The client must take into account that the animation can be shared and, if unloaded, the other
|
||
//! character models (animation sets) will have to load it back to use.
|
||
|
||
// Summary:
|
||
// Unloads the animation data from memory.
|
||
// See Also:
|
||
// <LINK IAnimationSet::UnloadAnimation@int, IAnimationSet::UnloadAnimation>
|
||
// Parameters:
|
||
// nAnimId - Id of the animation to unload.
|
||
// Description:
|
||
// If the animation is used after a cal to this method, the animation data
|
||
// will be loaded back automatically.
|
||
virtual void UnloadAnimation (int nAnimId) {}
|
||
|
||
//! Unloads animation from memory
|
||
//! The client must take into account that the animation can be shared and, if unloaded, the other
|
||
//! character models (animation sets) will have to load it back to use.
|
||
|
||
// Summary:
|
||
// Unloads the animation data from memory.
|
||
// See Also:
|
||
// <LINK IAnimationSet::UnloadAnimation@const char*, IAnimationSet::UnloadAnimation>
|
||
// Parameters:
|
||
// nAnimId - Id of the animation to unload.
|
||
// Description:
|
||
// If the animation is used after a cal to this method, the animation data
|
||
// will be loaded back automatically.
|
||
void UnloadAnimation (const char* szAnimationName)
|
||
{
|
||
UnloadAnimation(Find(szAnimationName));
|
||
}
|
||
|
||
//! Returns the index of the morph target in the set, -1 if there's no such morph target
|
||
|
||
// Summary:
|
||
// Searches for morph target using a specified name.
|
||
// Arguments:
|
||
// szMorphTarget - Name of the morph target to find.
|
||
// Return Value:
|
||
// An integer representing the index of the morph target. The value -1 will
|
||
// be returned in case that an appropriate morph target haven't been found.
|
||
virtual int FindMorphTarget (const char* szMorphTarget) {return -1;}
|
||
|
||
//! Returns the given animation length, in seconds
|
||
|
||
// Summary:
|
||
// Retrieves the length of an animation.
|
||
// See Also:
|
||
// <LINK IAnimationSet::GetLength@const char*, IAnimationSet::GetLength>
|
||
// Arguments:
|
||
// nAnimationId - Id of the animation.
|
||
// Return Value:
|
||
// A float value representing the length in seconds.
|
||
virtual float GetLength (int nAnimationId) = 0;
|
||
|
||
//! Returns the given animation length, in seconds
|
||
|
||
// Summary:
|
||
// Retrieves the length of an animation.
|
||
// See Also:
|
||
// <LINK IAnimationSet::GetLength@int, IAnimationSet::GetLength>
|
||
// Arguments:
|
||
// szAnimationName - Name of the animation.
|
||
// Return Value:
|
||
// A float value representing the length in seconds.
|
||
virtual float GetLength (const char* szAnimationName)
|
||
{
|
||
return GetLength(Find(szAnimationName));
|
||
}
|
||
|
||
//DOC-IGNORE-BEGIN
|
||
//! Returns the given animation's start, in seconds; 0 if the id is invalid
|
||
virtual float GetStart (int nAnimationId) {return 0;}// default implementation
|
||
|
||
//! Returns the given animation's start, in seconds
|
||
virtual float GetStart (const char* szAnimationName)
|
||
{
|
||
return GetStart (Find(szAnimationName));
|
||
}
|
||
//DOC-IGNORE-END
|
||
|
||
//! Returns the given animation name
|
||
|
||
// Summary:
|
||
// Gets the name of the specified animation.
|
||
// Arguments:
|
||
// nAnimationId - Id of an animation.
|
||
// Return Value:
|
||
// A null terminated string holding the name of the animation. In case the
|
||
// animation wasn't found, the string "!NEGATIVE ANIMATION ID!" will be
|
||
// returned.
|
||
virtual const char* GetName (int nAnimationId) = 0;
|
||
|
||
//! Returns the name of the morph target
|
||
|
||
// Summary:
|
||
// Gets the name of a morph target.
|
||
// Arguments:
|
||
// nMorphTargetId - Id of the morph target.
|
||
// Return Value:
|
||
// A null terminated string holding the name of the morph target. In case
|
||
// the specified id is out of range, the string
|
||
// "!MORPH TARGET ID OUT OF RANGE!" is returned.
|
||
virtual const char* GetNameMorphTarget (int nMorphTargetId) {return "!NOT IMPLEMENTED!";}
|
||
|
||
//! Retrieves the animation loop flag
|
||
|
||
// Summary:
|
||
// Determines if an animation will be looped.
|
||
// Arguments:
|
||
// nAnimationId - Id of the animation.
|
||
// Return Value:
|
||
// A boolean equal to true if the animation is looped, or false if it isn't.
|
||
virtual bool IsLoop (int nAnimationId) = 0;
|
||
|
||
//! Retrieves the animation loop flag
|
||
|
||
// Summary:
|
||
// Determines if an animation will be looped.
|
||
// Arguments:
|
||
// szAnimationName - Name of the animation.
|
||
// Return Value:
|
||
// A boolean equal to true if the animation is looped, or false if it isn't.
|
||
virtual bool IsLoop (const char* szAnimationName)
|
||
{
|
||
return IsLoop(Find(szAnimationName));
|
||
}
|
||
};
|
||
|
||
//! Interface that describes and manipulates a set of animations
|
||
//! Cry... because it's specific to the needs of the CryEngine
|
||
struct ICryAnimationSet: public IAnimationSet
|
||
{
|
||
//! Modifies the animation loop flag
|
||
|
||
// Summary:
|
||
// Specifies if an animation should be looped.
|
||
// Arguments:
|
||
// nAnimationId - Id of the animation.
|
||
// bIsLooped - Should be equal to true to enable looping, or false to disable it.
|
||
virtual void SetLoop (int nAnimationId, bool bIsLooped) = 0;
|
||
};
|
||
|
||
//! Interface to the character instance model
|
||
//! A set of characters created out of the same CGF share many properties, and
|
||
//! interface to those properties is through the ICryCharModel.
|
||
//! The instance of the ICryCharModel is guaranteed to be alive at least as long as
|
||
//! all its ICryCharInstance are alive
|
||
|
||
// Description:
|
||
// This class is used to store in memory the model data usually loaded from
|
||
// a cgf file. Should usually be created while creating a new character
|
||
// instance with ICryCharManager::MakeCharacter.
|
||
struct ICryCharModel: public _i_reference_target_t
|
||
{
|
||
// Description:
|
||
// Return a pointer of the instance of a ICryAnimationSet derived class
|
||
// applicable for the model.
|
||
// Return Value:
|
||
// A pointer to a ICryAnimationSet derived class
|
||
// Summary:
|
||
// Get the Animation Set defined for the model
|
||
virtual ICryAnimationSet* GetAnimationSet () = 0;
|
||
|
||
// Description:
|
||
// Return the name of a bone by searching its id.
|
||
// See Also:
|
||
// GetBoneByName
|
||
// Arguments:
|
||
// nId - Id of the bone
|
||
// Return Value:
|
||
// A NULL terminated char array which hold the name. If no bones of the specified id have been found, NULL is returned.
|
||
// Summary:
|
||
// Get the bone's name from a specified id
|
||
virtual const char * GetBoneName(int nId) const = 0;
|
||
|
||
// Description:
|
||
// Return the index of a bone by searching its name. It's important to
|
||
// be aware that the bone name is case sensitive.
|
||
// See Also:
|
||
// GetBoneName
|
||
// Arguments:
|
||
// szName - Name of the bone
|
||
// Return Value:
|
||
// An int value which hold the id. If no bones of the specified name have been found, -1 is returned.
|
||
// Summary:
|
||
// Get the bone's id from a specified name
|
||
virtual int GetBoneByName (const char* szName) {return -1;}
|
||
|
||
// Description:
|
||
// Return the number of bones included in the model. All bone ids start from 0. The first bone, which has the id 0, is the root bone.
|
||
// Return Value:
|
||
// An int value which hold the number of bones.
|
||
// Summary:
|
||
// Get the number of bones
|
||
virtual int NumBones() const = 0;
|
||
|
||
// Description:
|
||
// Currently not implemented. Will only return 1.0f.
|
||
// Return Value:
|
||
// A float value which hold the scale value.
|
||
// Summary:
|
||
// Get the scale of the model (not implemented)
|
||
virtual float GetScale() const = 0;
|
||
|
||
// Summary:
|
||
// Possible classes for a model
|
||
enum ClassEnum
|
||
{
|
||
CLASS_UNKNOWN,
|
||
CLASS_ANIMOBJECT,
|
||
CLASS_CRYCHARBODY
|
||
};
|
||
|
||
// Description:
|
||
// Get the class of the model.
|
||
// Return Value:
|
||
// Return one of the class ids declared in EClassEnum
|
||
// Summary:
|
||
// Get the class of the model
|
||
virtual ClassEnum GetClass() {return CLASS_UNKNOWN;}
|
||
|
||
// Description:
|
||
// Get a property attached to the model during exporting process.
|
||
// Return Value:
|
||
// A pointer to a null terminated char string which contain the
|
||
// filename of the model.
|
||
// Summary:
|
||
// Get the filename of the model
|
||
virtual const char* GetFileName() {return "";}
|
||
|
||
// Description:
|
||
// Get a property which was attached to the model during exporting
|
||
// process as the scene user properties.
|
||
// Arguments:
|
||
// szName - Name of the property
|
||
// Return Value:
|
||
// A pointer to a null terminated char string which contain the value
|
||
// of the requested property.
|
||
// NULL will be returned if there isn't any property attached with the
|
||
// specified name.
|
||
// Summary:
|
||
// Get property which was set for the model
|
||
virtual const char* GetProperty(const char* szName) {return "";}
|
||
};
|
||
|
||
|
||
//! This is interface to an object that should be skinned
|
||
//! It's used to let the renderer know that an object callback must be called before rendering because
|
||
//! the object vertices can be deformed
|
||
struct IDeformableRenderMesh
|
||
{
|
||
//! Renderer calls this function to allow update the video vertex buffers right before the rendering
|
||
virtual void ProcessSkinning(const Vec3& t,const Matrix44& mtxModel, int nTemplate, int nLod=-1, bool bForceUpdate=false) = 0;
|
||
};
|
||
|
||
struct ICryCharVisualElement: public _reference_target_t
|
||
{
|
||
// returns true if the given submesh is visible
|
||
virtual bool IsVisible() = 0;
|
||
|
||
// depending on bVisible, either makes the submesh visible or invisible
|
||
virtual void SetVisible(bool bVisible = true) = 0;
|
||
};
|
||
|
||
// this is submesh of the character instance: a piece of geometry that can be
|
||
// turned visible/invisible by wish
|
||
struct ICryCharSubmesh: public ICryCharVisualElement
|
||
{
|
||
// returns the model of the submesh, or NULL in case of failure
|
||
virtual ICryCharModel* GetModel () = 0;
|
||
|
||
//! Start the specified by parameters morph target
|
||
virtual void StartMorph (const char* szMorphTarget, const CryCharMorphParams& params) = 0;
|
||
|
||
//! Start the specified by parameters morph target
|
||
virtual void StartMorph (int nMorphTargetId, const CryCharMorphParams& params) = 0;
|
||
|
||
//! Finds the morph with the given id and sets its relative time.
|
||
//! Returns false if the operation can't be performed (no morph)
|
||
//! The default implementation for objects that don't implement morph targets is to always fail
|
||
virtual bool SetMorphTime (int nMorphTargetId, float fTime) = 0;
|
||
|
||
//! Set morph speed scale
|
||
//! Finds the morph target with the given id, sets its morphing speed and returns true;
|
||
//! if there's no such morph target currently playing, returns false
|
||
virtual bool SetMorphSpeed (int nMorphTargetId, float fSpeed) = 0;
|
||
|
||
//! Stops morph by target id
|
||
virtual bool StopMorph (int nMorphTargetId) = 0;
|
||
|
||
//! Stops all morphs
|
||
virtual void StopAllMorphs() = 0;
|
||
|
||
//! freezes all currently playing morphs at the point they're at
|
||
virtual void FreezeAllMorphs(){}
|
||
|
||
// Adds a decal to the character
|
||
virtual void AddDecal (CryEngineDecalInfo& Decal) = 0;
|
||
|
||
// cleans up the decals on this body part
|
||
virtual void ClearDecals() = 0;
|
||
|
||
//! returns the leaf buffer materials in this character (as they are used in the renderer)
|
||
virtual const list2<struct CMatInfo>*getLeafBufferMaterials() = 0;
|
||
|
||
virtual bool SetShaderTemplateName (const char *TemplName, int Id, const char *ShaderName=0,IMatInfo *pCustomMaterial=0, unsigned nFlags = 0) = 0;
|
||
};
|
||
|
||
// Description:
|
||
// Implement the sword trail effect
|
||
struct ICryCharFxTrail: public ICryCharVisualElement
|
||
{
|
||
|
||
};
|
||
|
||
|
||
|
||
//DOC-IGNORE-BEGIN
|
||
//! TODO:
|
||
//! Split this interface up into a few logical interfaces, starting with the ICryCharModel
|
||
//DOC-IGNORE-END
|
||
|
||
// Description:
|
||
// This interface contains methods for manipulating and querying an animated character
|
||
// Instance. The methods allow modify the animated instance to the certain way,
|
||
// animate it, render, retrieve BBox/etc, control physics, particles and skinning, transform.
|
||
// Summary:
|
||
// Interface to character animation
|
||
struct ICryCharInstance: public IBindable
|
||
{
|
||
virtual ~ICryCharInstance() {};
|
||
|
||
// Summary:
|
||
// Release character instance
|
||
virtual void Release() = 0;
|
||
|
||
// Description:
|
||
// Set rendering flags defined in ECharRenderFlags for this character instance
|
||
// Arguments:
|
||
// Pass the rendering flags
|
||
// Summary:
|
||
// Set rendering flags
|
||
virtual void SetFlags(int nFlags)=0;
|
||
|
||
// Description:
|
||
// Get the rendering flags enabled. The valid flags are the ones declared in ECharRenderFlags.
|
||
// Return Value:
|
||
// Return an integer value which hold the different rendering flags
|
||
// Summary:
|
||
// Set rendering flags
|
||
virtual int GetFlags()=0;
|
||
|
||
// Description:
|
||
// Execute a specified animation script command on the characted instance.
|
||
// Arguments:
|
||
// nCommand - The command to execute, as declared in CryAnimationScriptCommandEnum
|
||
// pParams - Any parameters for the command
|
||
// pResult - Pointer where to store the result
|
||
// Return Value:
|
||
// true if the command was executed,
|
||
// false if it wasn't executed
|
||
// Summary:
|
||
// Executes a script command
|
||
virtual bool ExecScriptCommand (int nCommand, void* pParams, void* pResult) {return false;}
|
||
|
||
// Description:
|
||
// Set the shader template to be used with the character instance.
|
||
// Arguments:
|
||
// TemplName - Name of the template
|
||
// Id - Id of the shader
|
||
// ShaderName - Name of the shader (optional)
|
||
// pCustomMaterial - Pointer to a Material class (optional)
|
||
// nFlags - Flags, which are defined in ECharShaderFlags (optional)
|
||
// Return Value:
|
||
// A bolean value which is true if success to set a new shader, otherwise false will be returned.
|
||
// Summary:
|
||
// Set the shader template to be used
|
||
virtual bool SetShaderTemplateName(const char *TemplName, int Id, const char *ShaderName=0,IMatInfo *pCustomMaterial=0,unsigned nFlags = 0)=0;
|
||
|
||
// Description:
|
||
// Get the name of the current shader template used by the character instance.
|
||
// Return Value:
|
||
// Null terminated char string which contain the name of the shader template
|
||
// Summary:
|
||
// Get the name of the current shader template
|
||
virtual const char * GetShaderTemplateName() = 0;
|
||
|
||
//DOC-IGNORE-BEGIN
|
||
// WHAT: !!!
|
||
//! Set refract coef. for refractive shader
|
||
//DOC-IGNORE-END
|
||
|
||
// Description:
|
||
// Set the refraction coeficient to be used by the refractive shader.
|
||
// Arguments:
|
||
// Name - Name of the value
|
||
// fVal - value to be passed to the shader
|
||
// ShaderName - Name of the shader
|
||
// Summary:
|
||
// Set a float value associated with a shader
|
||
virtual void SetShaderFloat(const char *Name, float fVal, const char *ShaderName=NULL) = 0;
|
||
|
||
// Description:
|
||
// Set the color to be used by the character instance
|
||
// Arguments:
|
||
// fR - Red value
|
||
// fG - Green value
|
||
// fB - Blue value
|
||
// fA - Alpha value
|
||
// Summary:
|
||
// Set the color
|
||
virtual void SetColor(float fR, float fG, float fB, float fA) = 0;
|
||
|
||
// Description:
|
||
// Draw the character using specified rendering parameters.
|
||
// Arguments:
|
||
// RendParams - Rendering parameters
|
||
// Summary:
|
||
// Draw the character
|
||
virtual void Draw(const SRendParams & RendParams,const Vec3& t)=0;
|
||
|
||
// Summary:
|
||
// Mark all LODs to be reskinned
|
||
virtual void ForceReskin () {}
|
||
|
||
// Description:
|
||
// Get the leaf buffer materials in this character as they are used in the renderer
|
||
// Return Value:
|
||
// List of material info
|
||
// Summary:
|
||
// Return the leaf buffer materials
|
||
virtual const list2<struct CMatInfo>*getLeafBufferMaterials() {return NULL;}
|
||
|
||
//! Interface for the renderer - returns the CDLight describing the light in this character;
|
||
//! returns NULL if there's no light with such index
|
||
//! ICryCharInstance owns this light. This light may be destructed without notice upon next call to
|
||
//! any other function but GetLight(). Nobody may every modify it.
|
||
virtual const class CDLight* GetBoundLight (int nIndex) = 0;
|
||
|
||
// Description:
|
||
// Draw the character shadow volumes into the stencil buffer. It's
|
||
// suggested to only use this function in in-door environment.
|
||
// Arguments:
|
||
// rParams - Rendering Parameters
|
||
// nLimitLOD - The maximum LOD to be used
|
||
// Summary:
|
||
// Draw the character shadow volumes into the stencil buffer
|
||
virtual void RenderShadowVolumes(const SRendParams *rParams, int nLimitLOD = 0)=0;
|
||
|
||
//! Draw the character without shaders for shadow mapping
|
||
//virtual void DrawForShadow(const Vec3 & vTranslationPlus = Vec3(0,0,0))=0;
|
||
|
||
//! Return dynamic bbox of object
|
||
|
||
// Description:
|
||
// Arguments:
|
||
// Summary:
|
||
// Get the bounding box
|
||
virtual void GetBBox(Vec3& Mins, Vec3& Maxs)=0;
|
||
|
||
//! Return dynamic center of object
|
||
|
||
// Summary:
|
||
// Gets the dynamic center.
|
||
// Return Value:
|
||
// Center of the character.
|
||
virtual const Vec3 GetCenter()=0;
|
||
|
||
//! Return dynamic radius of object
|
||
|
||
// Summary:
|
||
// Gets the dynamic radius.
|
||
// Return Value:
|
||
// Radius of the character.
|
||
virtual const float GetRadius()=0;
|
||
|
||
// Handle which determines the object binding to a bone in the character.
|
||
typedef ULONG_PTR ObjectBindingHandle;
|
||
|
||
// Specify an invalid object binding.
|
||
enum {nInvalidObjectBindingHandle = 0};
|
||
|
||
//! Attach object to bone (Return invalid handle if bone not found)
|
||
//! Detaches all objects beforehand; if the object is NULL, just detaches all objects from the bone
|
||
//! If the bone name is invalid, detaches everything to avoid using dangle pointers (in case the bone name was misspelled)
|
||
|
||
// Summary:
|
||
// Attach an object to a bone
|
||
// See Also:
|
||
// AttachToBone
|
||
// Description:
|
||
// The method AttachToBone should be used instead.
|
||
virtual ObjectBindingHandle AttachObjectToBone(IBindable * pWeaponModel, const char * szBoneName, bool bUseRelativeToDefPoseMatrix = true, unsigned nFlags = 0)=0;
|
||
|
||
// detaches all objects from bones; returns the nubmer of bindings deleted
|
||
|
||
// Summary:
|
||
// Detaches all objects from every bones.
|
||
// Return Value:
|
||
// An integer representing the number of binding detached.
|
||
virtual unsigned DetachAll() {return 0;}
|
||
|
||
// detach all bindings to the given bone; returns the nubmer of bindings deleted
|
||
|
||
// Summary:
|
||
// Detaches all objects from a specified bone.
|
||
// Arguemnts:
|
||
// nBone - The id of a bone.
|
||
// Return Value:
|
||
// An integer representing the number of binding detached.
|
||
virtual unsigned DetachAllFromBone(unsigned nBone) {return 0;}
|
||
|
||
// Summary:
|
||
// Flag used to attach bindable an object to a bone.
|
||
enum EAttachFlags
|
||
{
|
||
// Used to make sure a binding is more visible to the camera despite its distance.
|
||
FLAGS_ATTACH_ZOFFSET = 1
|
||
};
|
||
|
||
// Summary:
|
||
// Attaches an bindable object to a specified bone.
|
||
// Arguments:
|
||
// pObj - A pointer to an object derived from IBindable.
|
||
// nBone - Id of the bone to attach to.
|
||
// nFlags - A flag from EAttachFlags (optional).
|
||
// Return Value:
|
||
// An handle to the binding. In case the call failed, nInvalidObjectBindingHandle will be returned.
|
||
virtual ObjectBindingHandle AttachToBone (IBindable*pObj, unsigned nBone, unsigned nFlags = 0) {return nInvalidObjectBindingHandle;}
|
||
|
||
// detaches the given binding; returns true upon successful detach; if it returns false, the binding handle is invalid
|
||
// the binding becomes invalid immediately after detach
|
||
|
||
// Summary:
|
||
// Detaches a specified binded object.
|
||
// Arguments:
|
||
// nHandle - A binding object, as returned from AttachToBone.
|
||
// Return Value:
|
||
// A bool with the value true is the binding was detached, or false if the
|
||
// binding handle was invalid.
|
||
virtual bool Detach (ObjectBindingHandle nHandle) {return false;}
|
||
|
||
// checks if the given binding is valid
|
||
|
||
// Summary:
|
||
// Determines if a specified binding is valid.
|
||
// Arguments:
|
||
// A binding handle as returned by AttachToBone.
|
||
// Return Value:
|
||
// A bool which is equal to true if the binding is valid or false if it isn't.
|
||
virtual bool IsBindingValid (ObjectBindingHandle nHandle) {return false;}
|
||
|
||
// returns the number of bindings; valid until the next attach/detach operation
|
||
|
||
// Summary:
|
||
// Get the amount of binding on a character instance.
|
||
// Return Value:
|
||
// An integer representing the amount of binding.
|
||
virtual size_t GetBindingCount() {return 0;}
|
||
|
||
// fills the given array with GetBindingCount() pointers to IBindable
|
||
|
||
// Summary:
|
||
// Gets all pointers of every bindable attached.
|
||
// Note:
|
||
// Make sure the array is sized to at least the amount returned by GetBindingCount.
|
||
// See Also:
|
||
// GetBindingCount
|
||
// Arguments:
|
||
// pResult - An array of IBindable* which should be already allocated.
|
||
virtual void EnumBindables(IBindable** pResult) {}
|
||
|
||
typedef ULONG_PTR LightHandle;
|
||
enum {InvalidLightHandle = 0};
|
||
|
||
//! attach a light to a bone
|
||
//! If bCopyLight is true, then this light will be copied and the copy will be managed by the CryCharInstance
|
||
//! You can always get the pointer to it via GetLight, but don't you dare to delete it!
|
||
|
||
|
||
// Summary:
|
||
// Attach a light to a bone.
|
||
// Arguments:
|
||
// pDLight - ...
|
||
// nBone - ...
|
||
// bCopyLight - ...
|
||
// See Also:
|
||
// DetachLight, GetLight
|
||
virtual LightHandle AttachLight (CDLight* pDLight, unsigned nBone, bool bCopyLight = false) {return InvalidLightHandle;}
|
||
|
||
//! detach the light from the bone
|
||
|
||
// Summary:
|
||
// Detach a light from a bone.
|
||
// See Also:
|
||
// AttachLight
|
||
virtual void DetachLight (CDLight* pDLight){}
|
||
|
||
//! Attach a light (copying the light actually) to the bone
|
||
//! Returns the handle identifying the light. With this handle, you can either
|
||
//! Retrieve the light information or detach it.
|
||
|
||
// Summary:
|
||
// Attach a light to a bone.
|
||
// Arguments:
|
||
// rDLight - Structure representing a light.
|
||
// szBoneName - Name of the bone intended to have a light attached to it.
|
||
// See Also:
|
||
// DetachLight
|
||
virtual LightHandle AttachLight (const CDLight& rDLight, const char* szBoneName){return InvalidLightHandle;}
|
||
//! Detaches the light by the handle retuned by AttachLight
|
||
virtual void DetachLight (LightHandle nHandle) {}
|
||
//! Returns the light by the light handle; returns NULL if no such light found
|
||
virtual CDLight* GetLight(LightHandle nHandle) {return NULL;}
|
||
//! Returns the light handle if the light is attached; returns invalid handle, if this light is not attached
|
||
//! NOTE: if your light was attached with copying, then you won't get the handle for the original light pointer
|
||
//! because the original light might have been attached several times and have several pointers in this case
|
||
virtual LightHandle GetLightHandle (CDLight* pLight) {return InvalidLightHandle;}
|
||
|
||
//! Enables/Disables the Default Idle Animation restart.
|
||
//! If this feature is enabled, then the last looped animation will be played back after the current (non-loop) animation is finished.
|
||
//! Only those animations started with the flag bTreatAsDefaultIdleAnimation == true will be taken into account
|
||
|
||
// Summary:
|
||
// Enables or disables the default idle animation.
|
||
// See Also:
|
||
// SetDefaultIdleAnimation
|
||
// Description:
|
||
// When enabled, the default idle animation will be played back once the
|
||
// current non-looped animation will be finished. The default idle animation
|
||
// needs to have already been specified to the animation system.
|
||
// Arguments:
|
||
// nLayer - Specify on which layer to activate the default idle animation.
|
||
// bEnable - true will enable this feature, false will disable it.
|
||
virtual void EnableLastIdleAnimationRestart (unsigned nLayer, bool bEnable = true) = 0;
|
||
|
||
//! Start the specified animation with the given parameters
|
||
|
||
// Summary:
|
||
// Starts an animation with the given parameters.
|
||
// Arguments:
|
||
// szAnimName - Name of the animation.
|
||
// Params - Structure holding different options.
|
||
// Return Value:
|
||
// A bool value set to true if the call was successful, or false if it wasn't.
|
||
virtual bool StartAnimation (const char* szAnimName, const struct CryCharAnimationParams& Params) {return false;}
|
||
|
||
//DOC-IGNORE-BEGIN
|
||
// FOR TEST ONLY enables/disables StartAnimation* calls; puts warning into the log if StartAnimation* is called while disabled
|
||
virtual void EnableStartAnimation (bool bEnable) {}
|
||
//DOC-IGNORE-END
|
||
|
||
//! Start the specified by parameters morph target
|
||
virtual void StartMorph (const char* szMorphTarget, const CryCharMorphParams& params) {}
|
||
|
||
//! Start the specified by parameters morph target
|
||
virtual void StartMorph (int nMorphTargetId, const CryCharMorphParams& params) {}
|
||
|
||
//! Finds the morph with the given id and sets its relative time.
|
||
//! Returns false if the operation can't be performed (no morph)
|
||
//! The default implementation for objects that don't implement morph targets is to always fail
|
||
virtual bool SetMorphTime (int nMorphTargetId, float fTime) {return false;}
|
||
|
||
//! freezes all currently playing morphs at the point they're at
|
||
virtual void FreezeAllMorphs() {}
|
||
|
||
//! Stops the animation at the specified layer. Returns true if there was some animation on that layer, and false otherwise
|
||
virtual bool StopAnimation (int nLayer) {return false;}
|
||
|
||
//! Return current animation name ( Return 0 if animations stoped )
|
||
virtual const char * GetCurAnimation() = 0;
|
||
|
||
//! Returns the current animation in the layer or -1 if no animation is being played
|
||
//! in this layer (or if there's no such layer)
|
||
virtual int GetCurrentAnimation (unsigned nLayer) = 0;
|
||
|
||
//! Resets all animation layers ( stops all animations )
|
||
virtual void ResetAnimations()=0;
|
||
|
||
//! Set animations speed scale
|
||
//! This is the scale factor that affects the animation speed of the character.
|
||
//! All the animations are played with the constant real-time speed multiplied by this factor.
|
||
//! So, 0 means still animations (stuck at some frame), 1 - normal, 2 - twice as fast, 0.5 - twice slower than normal.
|
||
virtual void SetAnimationSpeed(float fSpeed) = 0;
|
||
|
||
virtual float GetAnimationSpeed() = 0;
|
||
|
||
//! Set morph speed scale
|
||
//! Finds the morph target with the given id, sets its morphing speed and returns true;
|
||
//! if there's no such morph target currently playing, returns false
|
||
virtual bool SetMorphSpeed (int nMorphTargetId, float fSpeed) {return false;}
|
||
|
||
//! Stops morph by target id
|
||
virtual bool StopMorph (int nMorphTargetId) {return false;}
|
||
|
||
//! Stops all morphs
|
||
virtual void StopAllMorphs() {}
|
||
|
||
//! This is the same as SetAnimationSpeed, but it sets the speed for layers
|
||
//! NOTE: It does NOT override the overall animation speed, but it's multiplies it
|
||
virtual void SetAnimationSpeed(int nLayer, float fSpeed) {}
|
||
|
||
//! Enable object animation time update. If the bUpdate flag is false, subsequent calls to Update will not animate the character
|
||
virtual void EnableTimeUpdate (bool bUpdate) = 0;
|
||
|
||
//! Set the current time of the given layer, in seconds
|
||
virtual void SetLayerTime (int nLayer, float fTimeSeconds) = 0;
|
||
//! Return the current time of the given layer, in seconds
|
||
virtual float GetLayerTime (int nLayer) = 0;
|
||
|
||
enum UpdateEnum
|
||
{
|
||
flagDontUpdateBones = 1,
|
||
flagDontUpdateAttachments = 1 << 1
|
||
};
|
||
|
||
//! Processes skining (call this function every frame to animate character)
|
||
//! dwFlags is a bitwise OR of one of the flags specified in the UpdateEnum enumeration
|
||
virtual void Update (Vec3 vPos = Vec3(0,0,0), float fRadius=0, unsigned uFlags = 0) {}
|
||
|
||
//! Updates the bones and the bounding box. Should be called if animation update
|
||
//! cycle in EntityUpdate has already passed but you need the result of new animatmions
|
||
//! started after Update right now.
|
||
virtual void ForceUpdate() {}
|
||
|
||
//! Synchronizes state with character physical animation; should be called after all updates (such as animation, game bones updates, etc.)
|
||
virtual void UpdatePhysics( float fScale=1.0f )=0;
|
||
|
||
//! IK (Used by physics engine)
|
||
virtual void BuildPhysicalEntity(IPhysicalEntity *pent,float mass,int surface_idx,float stiffness_scale=1.0f,int nLod=0) = 0;
|
||
virtual IPhysicalEntity *CreateCharacterPhysics(IPhysicalEntity *pHost, float mass,int surface_idx,float stiffness_scale, int nLod=0) = 0;
|
||
virtual int CreateAuxilaryPhysics(IPhysicalEntity *pHost, int nLod=0) = 0;
|
||
virtual IPhysicalEntity *GetCharacterPhysics() = 0;
|
||
virtual IPhysicalEntity *GetCharacterPhysics(const char *pRootBoneName) = 0;
|
||
virtual IPhysicalEntity *GetCharacterPhysics(int iAuxPhys) = 0;
|
||
virtual void SynchronizeWithPhysicalEntity(IPhysicalEntity *pent, const Vec3& posMaster=Vec3(zero),const Quat& qMaster=Quat(1,0,0,0)) = 0;
|
||
virtual IPhysicalEntity *RelinquishCharacterPhysics() = 0;
|
||
virtual void DestroyCharacterPhysics(int iMode=0) = 0;
|
||
virtual void SetCharacterPhysParams(float mass,int surface_idx) = 0;
|
||
virtual void SetLimbIKGoal(int limbid, vectorf ptgoal=vectorf(1E10f,0,0), int ik_flags=0, float addlen=0, vectorf goal_normal=vectorf(zero)) = 0;
|
||
virtual vectorf GetLimbEndPos(int limbid) = 0;
|
||
virtual void AddImpact(int partid, vectorf point,vectorf impact) = 0;
|
||
virtual int TranslatePartIdToDeadBody(int partid) = 0;
|
||
virtual vectorf GetOffset() = 0;
|
||
virtual void SetOffset(vectorf offset) = 0;
|
||
|
||
//! Direct access to the specified bone
|
||
virtual ICryBone * GetBoneByName(const char * szName) = 0;
|
||
|
||
//! Pose character bones
|
||
virtual bool SetAnimationFrame(const char * szString, int nFrame)=0;
|
||
|
||
//! Callback interface; <<TODO::>> THese should be in a separate interface
|
||
|
||
|
||
//! Enables receiving OnStart/OnEnd of all animations from this character instance
|
||
//! THe specified sink also receives the additional animation events specified through AddAnimationEvent interface
|
||
virtual void AddAnimationEventSink(ICharInstanceSink * pCharInstanceSink) = 0;
|
||
|
||
//! Counterpart to AddAnimationEventSink
|
||
virtual void RemoveAnimationEventSink(ICharInstanceSink * pCharInstanceSink) = 0;
|
||
|
||
//! Enables receiving OnStart/OnEnd of specified animation from this character instance
|
||
//! The specified sink also receives the additional animation events specified through AddAnimationEvent interface for this animation
|
||
virtual void AddAnimationEventSink(const char* szAnimName, ICharInstanceSink * pCharInstanceSink) = 0;
|
||
|
||
//! Counterpart to the AddAnimationEventSink
|
||
virtual void RemoveAnimationEventSink(const char* szAnimName, ICharInstanceSink * pCharInstanceSink) = 0;
|
||
|
||
//! Adds an animation event; whenever the character plays the specified frame of the specified animation,
|
||
//! it calls back the animation event sinkreceiving OnEvent notification of specified animation for all instances using this model
|
||
virtual bool AddAnimationEvent(const char * szAnimName, int nFrameID, AnimSinkEventData pUserData) = 0;
|
||
|
||
//! Deletes the animation event; from now on the sink won't be receiving the animation this event
|
||
virtual bool RemoveAnimationEvent (const char* szAnimName, int nFrameID, AnimSinkEventData pUserData) = 0;
|
||
|
||
//! Deletes all animation events
|
||
virtual void RemoveAllAnimationEvents(){}
|
||
|
||
//! Returns the model interface
|
||
virtual ICryCharModel* GetModel() = 0;
|
||
|
||
//! Return position of helper of the static object which is attached to animated object
|
||
virtual Vec3 GetTPVWeaponHelper(const char * szHelperName, ObjectBindingHandle nHandle) = 0;
|
||
|
||
//! Returns position of specified helper ( exported into cgf file )
|
||
//! Actually returns the given bone's position
|
||
//! Default implementation: 000
|
||
virtual Vec3 GetHelperPos(const char * szHelperName) {return Vec3(0,0,0);}
|
||
//! Returns the matrix of the specified helper ( exported into cgf file )
|
||
//! Actually returns the given bone's matrix
|
||
virtual const Matrix44 * GetHelperMatrixByName(const char * szHelperName) {return NULL;}
|
||
|
||
//! Returns the matrix of the helper object (in matOut), like GetTPVWeaponHelper returns the position.
|
||
//! When the return value is true, matOut contains the matrix of the helper object
|
||
//! When the return value is false, operation failed - assume the matOut to be undefined
|
||
virtual bool GetTPVWeaponHelperMatrix(const char * szHelperName, ObjectBindingHandle nHandle, Matrix44& matOut) {return false;}
|
||
|
||
//! Set the twining type. If replace - animations of second layer will overwrite first, otherwise it will sum
|
||
virtual void SetTwiningMode(AnimTwinMode eTwinMode = AnimTwinMode_Replace) = 0;
|
||
|
||
//! Return damage zone id for specified bone id
|
||
virtual int GetDamageTableValue (int nId) = 0;
|
||
|
||
//! returns true if the character is playing any animation now (so bbox is changing)
|
||
virtual bool IsCharacterActive() = 0;
|
||
|
||
// temporary hack - this is used in XPlayer in CryGame only
|
||
/*
|
||
Vec3 m_vAngles;
|
||
void SetAngles( const Vec3& angles ) {m_vAngles = angles;}
|
||
Vec3& GetAngles( ) {return m_vAngles;}
|
||
*/
|
||
|
||
//! Spawn decal on the walls, static objects, terrain and entities
|
||
//! The decal hit direction and source point are in the local coordinates of the chracter.
|
||
virtual void CreateDecal(CryEngineDecalInfo& DecalLCS)=0;
|
||
|
||
//! cleans up all decals in this character
|
||
virtual void ClearDecals() {}
|
||
|
||
//! Returns true if this character was created from the file the path refers to.
|
||
//! If this is true, then there's no need to reload the character if you need to change its model to this one.
|
||
virtual bool IsModelFileEqual (const char* szFileName) = 0;
|
||
|
||
|
||
//int AddParticleEmitter(ParticleParams& rInfo, float fSpawnRate, bool bFacesUp)
|
||
//{
|
||
// return AddParticleEmitter(rInfo, CryParticleSpawnInfo(fSpawnRate, bFacesUp?CryParticleSpawnInfo::FLAGS_RAIN_MODE:0));
|
||
//}
|
||
|
||
//! Sets up particle spawning. After this funtion is called, every subsequenc frame,
|
||
//! During the character deformation, particles will be spawned in the given characteristics.
|
||
//! The returned handle is to be used to stop particle spawning
|
||
//! -1 means invalid handle value (couldn't add the particle spawn task, or not implemented)
|
||
virtual int AddParticleEmitter(struct ParticleParams& rInfo, const struct CryParticleSpawnInfo& rSpawnInfo) {return -1;}
|
||
|
||
//! Stops particle spawning started with StartParticleSpawn that returned the parameter
|
||
//! Returns true if the particle spawn was stopped, or false if the handle is invalid
|
||
//! -1 means remove all particle emitters
|
||
virtual bool RemoveParticleEmitter (int nHandle) {return false;}
|
||
|
||
//! sets the scale to the given vector (1,1,1 is the default)
|
||
//! isn't compatible with physicalized objects, use only with weapons
|
||
virtual void SetScale (const Vec3d& vScale) {}
|
||
|
||
//! Pushes the underlying tree of objects into the given Sizer object for statistics gathering
|
||
virtual void GetMemoryUsage(class ICrySizer* pSizer) const = 0;
|
||
|
||
//! sets the given aniimation to the given layer as the default
|
||
virtual void SetDefaultIdleAnimation(unsigned nLayer, const char* szAnimName) = 0;
|
||
|
||
//! notifies the renderer that the character will soon be rendered
|
||
virtual void PreloadResources ( float fDistance, float fTime, int nFlags) {}
|
||
|
||
|
||
//! adds a submesh, returns handle to it which can be used to delete the submesh
|
||
//! submesh is created either visible or invisible
|
||
//! submesh creation/destruction is heavy operations, so the clients must use they rarely,
|
||
//! and set visible/invisible when they need to turn them on/off
|
||
//! But creating many submeshes is memory-consuming so the number of them must be kept low at all times
|
||
virtual ICryCharSubmesh* NewSubmesh (ICryCharModel* pModel, bool bVisible = false) {return NULL;}
|
||
// adds submesh to the specified slot; replaces submesh if there's some there
|
||
virtual ICryCharSubmesh* NewSubmesh (unsigned nSlot, ICryCharModel* pModel, bool bVisible = false) {return NULL;}
|
||
|
||
//! removes submesh from the character
|
||
//! does not change slot assignments. That is, removing a submesh from slot 1, you don't shift models from upper slots
|
||
//! you may NOT remove submesh from slot 0
|
||
virtual void RemoveSubmesh (ICryCharSubmesh* pSubmesh){}
|
||
virtual void RemoveSubmesh (unsigned nSlot) {}
|
||
|
||
//! enumeration of submeshes
|
||
//! returns the number of currently allocated submesh slots
|
||
virtual size_t NumSubmeshes() {return 0;}
|
||
//! returns submesh from the i-th slot. Some submesh slots may be empty (NULL)
|
||
virtual ICryCharSubmesh* GetSubmesh(unsigned i){return NULL;}
|
||
|
||
|
||
virtual ICryCharFxTrail* NewFxTrail (unsigned nSlot, const struct CryCharFxTrailParams&) {return NULL;}
|
||
virtual void RemoveFxTrail(unsigned nSlot) {}
|
||
|
||
|
||
// returns the pointer to this character instance, if it's a character instance
|
||
virtual struct ICryCharInstance* GetICryCharInstance() {return this;}
|
||
};
|
||
|
||
// Description:
|
||
// This class is the main access point for any character anymation
|
||
// required for a program which uses CryEngine.
|
||
// See Also:
|
||
// CreateCharManager
|
||
struct ICryCharManager
|
||
{
|
||
//DOC-IGNORE-BEGIN
|
||
// Flags used by this interface methods
|
||
enum
|
||
{
|
||
// Temporary flag for AnimObject testing.
|
||
nMakeAnimObject = 0x1000,
|
||
};
|
||
//DOC-IGNORE-END
|
||
|
||
// Description:
|
||
// Model keep in memory hints.
|
||
// The model of a character can be locked in memory. This means, that even if the
|
||
// number of characters using this model drops to zero, it'll be kept in memory.
|
||
// Such model is called Persistent.
|
||
// A model that's deleted as soon as there are no characters referencing it is called Transient.
|
||
// The default (when there's no hint) is defined by ca_KeepModels console variable.
|
||
// If there are both hints, it's up to the character animation system to decide whether to keep it or not.
|
||
// Summary:
|
||
// Flags to unload a model from memory when it's no longer being used
|
||
enum EModelPersistence
|
||
{
|
||
// Let the Animation System releases the model data when it<69>s no longer used
|
||
nHintModelTransient = 1,
|
||
// Force the model data to stay in memory even if no character instance uses it anymore
|
||
nHintModelPersistent = 2,
|
||
};
|
||
|
||
// Description:
|
||
// Contains statistics about CryCharManager.
|
||
struct Statistics
|
||
{
|
||
// Number of character instances
|
||
unsigned numCharacters;
|
||
// Number of character models (CGF)
|
||
unsigned numCharModels;
|
||
// Number of animobjects
|
||
unsigned numAnimObjects;
|
||
// Number of animobject models
|
||
unsigned numAnimObjectModels;
|
||
};
|
||
|
||
// Description:
|
||
// Will fill the Statistics parameters with statistic on the instance
|
||
// of the Animation System.
|
||
// It isn't recommanded to call this function often.
|
||
// Arguments:
|
||
// rStats - Structure which hold the statistics
|
||
// Summary:
|
||
// Get statistics on the Animation System
|
||
virtual void GetStatistics(Statistics& rStats) = 0;
|
||
|
||
// Description:
|
||
// Gather the memory currently used by the animation. The information
|
||
// returned is classified according to the flags set in the sizer
|
||
// argument.
|
||
// Arguments:
|
||
// pSizer - Sizer class which will store the memory usage
|
||
// Summary:
|
||
// Track memory usage
|
||
virtual void GetMemoryUsage(class ICrySizer* pSizer) const = 0;
|
||
|
||
// Description:
|
||
// Create a new instance for a model Load the model file along with any animation file that might be
|
||
// available.
|
||
// See Also:
|
||
// RemoveCharacter
|
||
// Arguments:
|
||
// szFilename - Filename of the model to be loaded
|
||
// nFlags - Set how the model will be kept in memory after being
|
||
// used. Uses flags defined with EModelPersistence.
|
||
// Return Value:
|
||
// A pointer to a ICryCharInstance class if the model could be loaded
|
||
// properly.
|
||
// NULL if the model couldn't be loaded.
|
||
// Summary:
|
||
// Create a new instance of a model
|
||
virtual ICryCharInstance * MakeCharacter(const char * szFilename, unsigned nFlags = 0)=0;
|
||
|
||
// Description:
|
||
// Load a model file into a ICryCharModel class. Usually, MakeCharacter
|
||
// shall be used to ensure that a model is only loaded once even if
|
||
// it's used several times.
|
||
// See Also:
|
||
// MakeCharacter
|
||
// Arguments:
|
||
// szFilename - Filename of the model to be loaded
|
||
// nFlags - Set how the model will be kept in memory after being
|
||
// used. Uses flags defined with EModelPersistence.
|
||
// Return Value:
|
||
// A pointer to a ICryCharModel class if the model could be loaded
|
||
// properly.
|
||
// NULL if the model couldn't be loaded.
|
||
// Summary:
|
||
// Load model file
|
||
virtual ICryCharModel* LoadModel(const char* szFileName, unsigned nFlags=0)=0;
|
||
|
||
// Description:
|
||
// Delete an instance of a character. If the corresponding model file
|
||
// is no longer used by any instances, it might be freed from memory if
|
||
// the model was set to nHintModelTransient.
|
||
// See Also:
|
||
// MakeCharacter
|
||
// Arguments:
|
||
// pCryCharInstance - Pointer to the character instance class to delete
|
||
// nFlags - Set how the model will be kept in memory after being
|
||
// used. Uses flags defined with EModelPersistence.
|
||
// Summary:
|
||
// Free a character instance
|
||
virtual void RemoveCharacter(ICryCharInstance * pCryCharInstance, unsigned nFlags = 0)=0;
|
||
|
||
// Description:
|
||
// Clear all decals on every characters. The result is the same as calling
|
||
// ExecScriptCommand with the command CASCMD_CLEAR_DECALS.
|
||
// Summary:
|
||
// Clear all decals on every characters
|
||
virtual void ClearDecals() = 0;
|
||
|
||
// Description:
|
||
// Cleans up all resources. Currently deletes all bodies and characters even if there are references on them.
|
||
// Summary:
|
||
// Cleans up all resources
|
||
virtual void ClearResources(void) = 0;
|
||
|
||
// Description:
|
||
// Execute a specified animation script command.
|
||
// Arguments:
|
||
// nCommand - The command to execute, as declared in CryAnimationScriptCommandEnum
|
||
// pParams - Any parameters for the command
|
||
// pResult - Pointer where to store the result
|
||
// Return Value:
|
||
// true if the command was executed,
|
||
// false if it wasn't executed
|
||
// Summary:
|
||
// Executes a script command
|
||
virtual bool ExecScriptCommand (int nCommand, void* pParams = NULL, void* pResult = NULL) {return false;}
|
||
|
||
// Description:
|
||
// Update the Animation System. It's important to call this function at every frame. This should perform very fast.
|
||
// Summary:
|
||
// Update the Animation System
|
||
virtual void Update() = 0;
|
||
|
||
//! The specified animation will be unloaded from memory; it will be loaded back upon the first invokation (via StartAnimation())
|
||
|
||
// Description:
|
||
// Unload a specific animation from memory. If there's any attempt to
|
||
// use it again, with ICryCharInstance::StartAnimation for example, it
|
||
// will loaded back automatically.
|
||
// See Also:
|
||
// StartLoadAnimation, ICryCharInstance::StartAnimation
|
||
// Arguments:
|
||
// szFileName - Filename of the animation
|
||
// Summary:
|
||
// Unload animation from memory
|
||
virtual void UnloadAnimation(const char* szFileName) = 0;
|
||
|
||
// Description:
|
||
// Start to load an animation file into memory. It allows to specify when the
|
||
// animation will be needed in order to let the system delay loading.
|
||
// See Also
|
||
// UnloadAnimation, ICryCharInstance::StartAnimation
|
||
// Arguments:
|
||
// szFileName - Filename of the animation
|
||
// fWhenRequired - Timeout in seconds until the animation is needed
|
||
// Summary:
|
||
// Start to load an animation file
|
||
virtual void StartLoadAnimation (const char* szFileName, float fWhenRequired) = 0;
|
||
|
||
// Description:
|
||
// Releases any resource allocated by the Animation System and shut it down properly.
|
||
// Summary:
|
||
// Release the Animation System
|
||
virtual void Release()=0;
|
||
|
||
//! Locks all models in memory
|
||
|
||
// Description:
|
||
// Lock all the models to stay loaded in memory.
|
||
// See Also:
|
||
// UnlockResources
|
||
// Summary:
|
||
// Lock all the models to stay loaded in memory.
|
||
virtual void LockResources() = 0;
|
||
|
||
// Description:
|
||
// Unlock all the models allow them to be unloaded from memory.
|
||
// See Also:
|
||
// LockResources
|
||
// Summary:
|
||
// Unlock all the models allow them to be unloaded from memory.
|
||
virtual void UnlockResources() = 0;
|
||
};
|
||
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#if (defined(GAMECUBE) || defined (PS2))
|
||
#define __TIMESTAMP__ "Ver1.0"
|
||
#endif
|
||
|
||
//#ifdef PS2
|
||
//#define __TIMESTAMP__ "Ver1.0"
|
||
//#endif
|
||
|
||
// expirimental way to track interface version
|
||
// this value will be compared with value passed from system module
|
||
const char gAnimInterfaceVersion[64] = __TIMESTAMP__;
|
||
|
||
// CreateCryAnimation function type definition
|
||
typedef ICryCharManager * (*PFNCREATECRYANIMATION)(ISystem * pSystem,const char * szInterfaceVersion);
|
||
|
||
// Description:
|
||
// Create an instance of the Animation System. It should usually be called
|
||
// by ISystem::InitAnimationSystem().
|
||
// See Also:
|
||
// ICryCharManager, ICryCharManager::Release
|
||
// Arguments:
|
||
// ISystem - Pointer to the current ISystem instance
|
||
// szInterfaceVersion - String version of with the build date
|
||
// Summary:
|
||
// Create an instance of the Animation System
|
||
CRYANIMATION_API ICryCharManager * CreateCharManager(ISystem* pSystem, const char * szInterfaceVersion=gAnimInterfaceVersion);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
#endif // ICRY_ANIMATION
|