dhewm3/neo/d3xp/AFEntity.h
dhewg 736ec20d4d Untangle the epic precompiled.h mess
Don't include the lazy precompiled.h everywhere, only what's
required for the compilation unit.
platform.h needs to be included instead to provide all essential
defines and types.
All includes use the relative path to the neo or the game
specific root.
Move all idlib related includes from idlib/Lib.h to precompiled.h.
precompiled.h still exists for the MFC stuff in tools/.
Add some missing header guards.
2011-12-19 23:21:47 +01:00

616 lines
16 KiB
C++

/*
===========================================================================
Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
Doom 3 Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#ifndef __GAME_AFENTITY_H__
#define __GAME_AFENTITY_H__
#include "physics/Physics_AF.h"
#include "physics/Force_Constant.h"
#include "Entity.h"
#include "AF.h"
/*
===============================================================================
idMultiModelAF
Entity using multiple separate visual models animated with a single
articulated figure. Only used for debugging!
===============================================================================
*/
const int GIB_DELAY = 200; // only gib this often to keep performace hits when blowing up several mobs
class idMultiModelAF : public idEntity {
public:
CLASS_PROTOTYPE( idMultiModelAF );
void Spawn( void );
~idMultiModelAF( void );
virtual void Think( void );
virtual void Present( void );
protected:
idPhysics_AF physicsObj;
void SetModelForId( int id, const idStr &modelName );
private:
idList<idRenderModel *> modelHandles;
idList<int> modelDefHandles;
};
/*
===============================================================================
idChain
Chain hanging down from the ceiling. Only used for debugging!
===============================================================================
*/
class idChain : public idMultiModelAF {
public:
CLASS_PROTOTYPE( idChain );
void Spawn( void );
protected:
void BuildChain( const idStr &name, const idVec3 &origin, float linkLength, float linkWidth, float density, int numLinks, bool bindToWorld = true );
};
/*
===============================================================================
idAFAttachment
===============================================================================
*/
class idAFAttachment : public idAnimatedEntity {
public:
CLASS_PROTOTYPE( idAFAttachment );
idAFAttachment( void );
virtual ~idAFAttachment( void );
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
void SetBody( idEntity *bodyEnt, const char *headModel, jointHandle_t attachJoint );
void ClearBody( void );
idEntity * GetBody( void ) const;
virtual void Think( void );
virtual void Hide( void );
virtual void Show( void );
void PlayIdleAnim( int blendTime );
virtual void GetImpactInfo( idEntity *ent, int id, const idVec3 &point, impactInfo_t *info );
virtual void ApplyImpulse( idEntity *ent, int id, const idVec3 &point, const idVec3 &impulse );
virtual void AddForce( idEntity *ent, int id, const idVec3 &point, const idVec3 &force );
virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location );
virtual void AddDamageEffect( const trace_t &collision, const idVec3 &velocity, const char *damageDefName );
void SetCombatModel( void );
idClipModel * GetCombatModel( void ) const;
virtual void LinkCombat( void );
virtual void UnlinkCombat( void );
protected:
idEntity * body;
idClipModel * combatModel; // render model for hit detection of head
int idleAnim;
jointHandle_t attachJoint;
};
/*
===============================================================================
idAFEntity_Base
===============================================================================
*/
class idAFEntity_Base : public idAnimatedEntity {
public:
CLASS_PROTOTYPE( idAFEntity_Base );
idAFEntity_Base( void );
virtual ~idAFEntity_Base( void );
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
virtual void Think( void );
virtual void GetImpactInfo( idEntity *ent, int id, const idVec3 &point, impactInfo_t *info );
virtual void ApplyImpulse( idEntity *ent, int id, const idVec3 &point, const idVec3 &impulse );
virtual void AddForce( idEntity *ent, int id, const idVec3 &point, const idVec3 &force );
virtual bool Collide( const trace_t &collision, const idVec3 &velocity );
virtual bool GetPhysicsToVisualTransform( idVec3 &origin, idMat3 &axis );
virtual bool UpdateAnimationControllers( void );
virtual void FreeModelDef( void );
virtual bool LoadAF( void );
bool IsActiveAF( void ) const { return af.IsActive(); }
const char * GetAFName( void ) const { return af.GetName(); }
idPhysics_AF * GetAFPhysics( void ) { return af.GetPhysics(); }
void SetCombatModel( void );
idClipModel * GetCombatModel( void ) const;
// contents of combatModel can be set to 0 or re-enabled (mp)
void SetCombatContents( bool enable );
virtual void LinkCombat( void );
virtual void UnlinkCombat( void );
int BodyForClipModelId( int id ) const;
void SaveState( idDict &args ) const;
void LoadState( const idDict &args );
void AddBindConstraints( void );
void RemoveBindConstraints( void );
virtual void ShowEditingDialog( void );
static void DropAFs( idEntity *ent, const char *type, idList<idEntity *> *list );
protected:
idAF af; // articulated figure
idClipModel * combatModel; // render model for hit detection
int combatModelContents;
idVec3 spawnOrigin; // spawn origin
idMat3 spawnAxis; // rotation axis used when spawned
int nextSoundTime; // next time this can make a sound
void Event_SetConstraintPosition( const char *name, const idVec3 &pos );
};
/*
===============================================================================
idAFEntity_Gibbable
===============================================================================
*/
extern const idEventDef EV_Gib;
extern const idEventDef EV_Gibbed;
class idAFEntity_Gibbable : public idAFEntity_Base {
public:
CLASS_PROTOTYPE( idAFEntity_Gibbable );
idAFEntity_Gibbable( void );
~idAFEntity_Gibbable( void );
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
virtual void Present( void );
virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location );
#ifdef _D3XP
void SetThrown( bool isThrown );
virtual bool Collide( const trace_t &collision, const idVec3 &velocity );
#endif
virtual void SpawnGibs( const idVec3 &dir, const char *damageDefName );
#ifdef _D3XP
bool IsGibbed() { return gibbed; };
#endif
protected:
idRenderModel * skeletonModel;
int skeletonModelDefHandle;
bool gibbed;
#ifdef _D3XP
bool wasThrown;
#endif
virtual void Gib( const idVec3 &dir, const char *damageDefName );
void InitSkeletonModel( void );
void Event_Gib( const char *damageDefName );
};
/*
===============================================================================
idAFEntity_Generic
===============================================================================
*/
class idAFEntity_Generic : public idAFEntity_Gibbable {
public:
CLASS_PROTOTYPE( idAFEntity_Generic );
idAFEntity_Generic( void );
~idAFEntity_Generic( void );
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
virtual void Think( void );
void KeepRunningPhysics( void ) { keepRunningPhysics = true; }
private:
void Event_Activate( idEntity *activator );
bool keepRunningPhysics;
};
/*
===============================================================================
idAFEntity_WithAttachedHead
===============================================================================
*/
class idAFEntity_WithAttachedHead : public idAFEntity_Gibbable {
public:
CLASS_PROTOTYPE( idAFEntity_WithAttachedHead );
idAFEntity_WithAttachedHead();
~idAFEntity_WithAttachedHead();
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
void SetupHead( void );
virtual void Think( void );
virtual void Hide( void );
virtual void Show( void );
virtual void ProjectOverlay( const idVec3 &origin, const idVec3 &dir, float size, const char *material );
virtual void LinkCombat( void );
virtual void UnlinkCombat( void );
protected:
virtual void Gib( const idVec3 &dir, const char *damageDefName );
#ifndef _D3XP
private:
#else
public:
#endif
idEntityPtr<idAFAttachment> head;
void Event_Gib( const char *damageDefName );
void Event_Activate( idEntity *activator );
};
/*
===============================================================================
idAFEntity_Vehicle
===============================================================================
*/
class idAFEntity_Vehicle : public idAFEntity_Base {
public:
CLASS_PROTOTYPE( idAFEntity_Vehicle );
idAFEntity_Vehicle( void );
void Spawn( void );
void Use( idPlayer *player );
protected:
idPlayer * player;
jointHandle_t eyesJoint;
jointHandle_t steeringWheelJoint;
float wheelRadius;
float steerAngle;
float steerSpeed;
const idDeclParticle * dustSmoke;
float GetSteerAngle( void );
};
/*
===============================================================================
idAFEntity_VehicleSimple
===============================================================================
*/
class idAFEntity_VehicleSimple : public idAFEntity_Vehicle {
public:
CLASS_PROTOTYPE( idAFEntity_VehicleSimple );
idAFEntity_VehicleSimple( void );
~idAFEntity_VehicleSimple( void );
void Spawn( void );
virtual void Think( void );
protected:
idClipModel * wheelModel;
idAFConstraint_Suspension * suspension[4];
jointHandle_t wheelJoints[4];
float wheelAngles[4];
};
/*
===============================================================================
idAFEntity_VehicleFourWheels
===============================================================================
*/
class idAFEntity_VehicleFourWheels : public idAFEntity_Vehicle {
public:
CLASS_PROTOTYPE( idAFEntity_VehicleFourWheels );
idAFEntity_VehicleFourWheels( void );
void Spawn( void );
virtual void Think( void );
protected:
idAFBody * wheels[4];
idAFConstraint_Hinge * steering[2];
jointHandle_t wheelJoints[4];
float wheelAngles[4];
};
/*
===============================================================================
idAFEntity_VehicleSixWheels
===============================================================================
*/
class idAFEntity_VehicleSixWheels : public idAFEntity_Vehicle {
public:
CLASS_PROTOTYPE( idAFEntity_VehicleSixWheels );
idAFEntity_VehicleSixWheels( void );
void Spawn( void );
virtual void Think( void );
#ifdef _D3XP
float force;
float velocity;
float steerAngle;
#endif
private:
idAFBody * wheels[6];
idAFConstraint_Hinge * steering[4];
jointHandle_t wheelJoints[6];
float wheelAngles[6];
};
#ifdef _D3XP
/*
===============================================================================
idAFEntity_VehicleAutomated
===============================================================================
*/
class idAFEntity_VehicleAutomated : public idAFEntity_VehicleSixWheels {
public:
CLASS_PROTOTYPE( idAFEntity_VehicleAutomated );
void Spawn( void );
void PostSpawn( void );
virtual void Think( void );
private:
idEntity *waypoint;
float steeringSpeed;
float currentSteering;
float idealSteering;
float originHeight;
void Event_SetVelocity( float _velocity );
void Event_SetTorque( float _torque );
void Event_SetSteeringSpeed( float _steeringSpeed );
void Event_SetWayPoint( idEntity *_waypoint );
};
#endif
/*
===============================================================================
idAFEntity_SteamPipe
===============================================================================
*/
class idAFEntity_SteamPipe : public idAFEntity_Base {
public:
CLASS_PROTOTYPE( idAFEntity_SteamPipe );
idAFEntity_SteamPipe( void );
~idAFEntity_SteamPipe( void );
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
virtual void Think( void );
private:
int steamBody;
float steamForce;
float steamUpForce;
idForce_Constant force;
renderEntity_t steamRenderEntity;
qhandle_t steamModelDefHandle;
void InitSteamRenderEntity( void );
};
/*
===============================================================================
idAFEntity_ClawFourFingers
===============================================================================
*/
class idAFEntity_ClawFourFingers : public idAFEntity_Base {
public:
CLASS_PROTOTYPE( idAFEntity_ClawFourFingers );
idAFEntity_ClawFourFingers( void );
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
private:
idAFConstraint_Hinge * fingers[4];
void Event_SetFingerAngle( float angle );
void Event_StopFingers( void );
};
#ifdef _D3XP
/**
* idHarvestable contains all of the code required to turn an entity into a harvestable
* entity. The entity must create an instance of this class and call the appropriate
* interface methods at the correct time.
*/
class idHarvestable : public idEntity {
public:
CLASS_PROTOTYPE( idHarvestable );
idHarvestable();
~idHarvestable();
void Spawn();
void Init(idEntity* parent);
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
void SetParent(idEntity* parent);
void Think();
void Gib();
protected:
idEntityPtr<idEntity> parentEnt;
float triggersize;
idClipModel * trigger;
float giveDelay;
float removeDelay;
bool given;
idEntityPtr<idPlayer> player;
int startTime;
bool fxFollowPlayer;
idEntityPtr<idEntityFx> fx;
idStr fxOrient;
protected:
void BeginBurn();
void BeginFX();
void CalcTriggerBounds( float size, idBounds &bounds );
bool GetFxOrientationAxis(idMat3& mat);
void Event_SpawnHarvestTrigger( void );
void Event_Touch( idEntity *other, trace_t *trace );
} ;
/*
===============================================================================
idAFEntity_Harvest
===============================================================================
*/
class idAFEntity_Harvest : public idAFEntity_WithAttachedHead {
public:
CLASS_PROTOTYPE( idAFEntity_Harvest );
idAFEntity_Harvest();
~idAFEntity_Harvest();
void Spawn( void );
void Save( idSaveGame *savefile ) const;
void Restore( idRestoreGame *savefile );
virtual void Think( void );
virtual void Gib( const idVec3 &dir, const char *damageDefName );
protected:
idEntityPtr<idHarvestable> harvestEnt;
protected:
void Event_SpawnHarvestEntity( void );
};
#endif
#endif /* !__GAME_AFENTITY_H__ */