The-Simpsons-Hit-and-Run/game/code/render/DSG/StatePropDSG.h

211 lines
7.3 KiB
C++

//===========================================================================
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
//
// Component: StatePropDSG
//
// Description: DSG object that contains a state prop
//
// Authors: Michael Riegger
//
//===========================================================================
// Recompilation protection flag.
#ifndef STATEPROPDSG_H
#define STATEPROPDSG_H
//===========================================================================
// Nested Includes
//===========================================================================
#include <render/dsg/DynaPhysDsg.h>
#include <stateprop/stateprop.hpp>
#include <loading/loadingmanager.h>
#include <worldsim/physicsairef.h>
#include <memory/map.h>
//===========================================================================
// Forward References
//===========================================================================
namespace poser
{
class Pose;
};
namespace sim
{
class PhysicsObject;
};
class tEntityStore;
//===========================================================================
// Constants, Typedefs, and Macro Definitions (needed by external clients)
//===========================================================================
//===========================================================================
// Interface Definitions
//===========================================================================
//===========================================================================
//
// Description:
// A State Prop Object suited for entry into a DSG
//
// Constraints:
//
//
//===========================================================================
class StatePropDSGProcAnimator;
class StatePropDSG : public DynaPhysDSG, public CStatePropListener
{
public:
enum Event
{
IDLE,
FADE_IN,
FADE_OUT,
MOVING,
ATTACK_CHARGING,
ATTACK_CHARGED,
ATTACKING,
DESTROYED,
HIT,
FEATHER_TOUCH,
STOMP,
VEHICLE_HIT
};
StatePropDSG();
virtual ~StatePropDSG();
virtual void LoadSetup( CStatePropData* statePropData,
int startState,
const rmt::Matrix& transform,
CollisionAttributes* ipCollAttr,
bool isDynaLoaded = true,
tEntityStore* ipSearchStore = NULL,
bool useSharedtPose = false,
sim::CollisionObject* collisionObject = NULL,
sim::PhysicsObject* physicsObject = NULL );
StatePropDSG* Clone(const char* Name, const rmt::Matrix& iMatrix) const;
virtual void Display();
// Updates animation
virtual void AdvanceAnimation( float timeInMS );
// Updates physics
virtual void Update( float dt );
virtual void GetBoundingBox( rmt::Box3D* box );
virtual void GetBoundingSphere( rmt::Sphere* sphere );
// Dangerous function, assert on use
virtual rmt::Vector* pPosition();
virtual const rmt::Vector& rPosition();
virtual void GetPosition( rmt::Vector* ipPosn );
virtual void SetPosition( const rmt::Vector& position );
virtual void SetTransform( const rmt::Matrix& matrix );
virtual void GetTransform( rmt::Matrix* pMatrix );
// This will have to be changed, default to true for now
virtual bool HasAlpha()const { return true; }
virtual sim::Solving_Answer PreReactToCollision( sim::SimState* pCollidedObj, sim::Collision& inCollision );
virtual sim::Solving_Answer PostReactToCollision(rmt::Vector& impulse, sim::Collision& inCollision);
virtual int GetAIRef();
virtual void RecieveEvent( int callback , CStateProp* stateProp );
virtual void AddToSimulation( void );
virtual void ApplyForce( const rmt::Vector& direction, float force );
virtual int CastsShadow();
virtual void DisplaySimpleShadow();
virtual void SetRank(rmt::Vector& irRefPosn, rmt::Vector& mViewVector);
// Sets which drawable element is the shadow/lightpool and should
// be projected on the ground and drawn only in the shadow pass
void SetShadowElement( tUID elementName );
// Turn collisions on and off. Used by the artist callback : REMOVE_COLLISION_VOLUME
void EnableCollisionVolume( bool enable );
// Kills a subvolume, called by callbacks of the same name
void RemoveSubCollisionVolume( int volumeIndex );
virtual void GenerateCoins( int numCoins );
void SetState( int state );
bool HandleEvent( Event );
unsigned int GetState()const;
tUID GetStatePropUID()const { return mpStateProp->GetUID(); }
tUID GetDrawableUID()const { return mpStateProp->GetDrawable()->GetUID(); }
void SetProcAnimator( StatePropDSGProcAnimator* Animator ) { mpProcAnimator = Animator; }
StatePropDSGProcAnimator* GetProcAnimator( void ) const { return mpProcAnimator; }
// Sets which joint the sim state should animate upon
void SetSimJoint( int jointId );
// Returns type of stateprop based upon CollisionAttributes
// either PROP_MOVEABLE / BREAKABLE / STATIC
int GetType()const;
// Add and remove a CStatePropListener
void AddStatePropListener( CStatePropListener* statePropListener );
void RemoveStatePropListener( CStatePropListener* statePropListener );
// Turn on/off visibility
void EnableVisibility( bool enable );
// Remove the shared tPose pool
static void RemoveAllSharedtPoses();
// Typedefs
typedef Map< tUID, tPose* > PoseMap;
typedef PoseMap::iterator PoseMapIt;
protected:
virtual void OnSetSimState( sim::SimState* ipCollObj );
rmt::Matrix mTransform;
CStateProp* mpStateProp;
sim::PhysicsObject* mpPhysObj;
bool m_IsDynaLoaded;
// The drawable element index
StatePropDSGProcAnimator* mpProcAnimator;
int m_ShadowElement;
// Which joint any sim animation is tied to
int m_SimAnimJoint;
// Uses m_SimJoint to animate the collision volume
void AnimateCollisionVolume( );
// Memory optimizations: optionally make the tPose shared amongst
// all elements of that stateprop type
// Find a tPose from the given stateprop type
// If none exist, then NULL is returned
static tPose* GetSharedtPose( tUID type );
// Add the given shared pose to the shared pose list
static void AddNewSharedtPose( tUID uid, tPose* );
// List of all tPoses, indexed by stateprop type UID
// So that the tCompositeDrawables don't have to allocate a new tPose
// every time.
static PoseMap* sp_SharedtPoses;
private:
// These methods defined as private and not implemented ensure that
// clients will not be able to use them. For example, we will
// disallow StatePropDSG from being copied and assigned.
StatePropDSG( const StatePropDSG& );
StatePropDSG& operator=( const StatePropDSG& );
};
#endif