2 ===========================================================================
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
22 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.
24 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.
26 ===========================================================================
29 #ifndef __PHYSICS_STATICMULTI_H__
30 #define __PHYSICS_STATICMULTI_H__
33 ===============================================================================
35 Physics for a non moving object using no or multiple collision models.
37 ===============================================================================
40 class idPhysics_StaticMulti : public idPhysics {
43 CLASS_PROTOTYPE( idPhysics_StaticMulti );
45 idPhysics_StaticMulti( void );
46 ~idPhysics_StaticMulti( void );
48 void Save( idSaveGame *savefile ) const;
49 void Restore( idRestoreGame *savefile );
51 void RemoveIndex( int id = 0, bool freeClipModel = true );
53 public: // common physics interface
55 void SetSelf( idEntity *e );
57 void SetClipModel( idClipModel *model, float density, int id = 0, bool freeOld = true );
58 idClipModel * GetClipModel( int id = 0 ) const;
59 int GetNumClipModels( void ) const;
61 void SetMass( float mass, int id = -1 );
62 float GetMass( int id = -1 ) const;
64 void SetContents( int contents, int id = -1 );
65 int GetContents( int id = -1 ) const;
67 void SetClipMask( int mask, int id = -1 );
68 int GetClipMask( int id = -1 ) const;
70 const idBounds & GetBounds( int id = -1 ) const;
71 const idBounds & GetAbsBounds( int id = -1 ) const;
73 bool Evaluate( int timeStepMSec, int endTimeMSec );
74 void UpdateTime( int endTimeMSec );
75 int GetTime( void ) const;
77 void GetImpactInfo( const int id, const idVec3 &point, impactInfo_t *info ) const;
78 void ApplyImpulse( const int id, const idVec3 &point, const idVec3 &impulse );
79 void AddForce( const int id, const idVec3 &point, const idVec3 &force );
80 void Activate( void );
81 void PutToRest( void );
82 bool IsAtRest( void ) const;
83 int GetRestStartTime( void ) const;
84 bool IsPushable( void ) const;
86 void SaveState( void );
87 void RestoreState( void );
89 void SetOrigin( const idVec3 &newOrigin, int id = -1 );
90 void SetAxis( const idMat3 &newAxis, int id = -1 );
92 void Translate( const idVec3 &translation, int id = -1 );
93 void Rotate( const idRotation &rotation, int id = -1 );
95 const idVec3 & GetOrigin( int id = 0 ) const;
96 const idMat3 & GetAxis( int id = 0 ) const;
98 void SetLinearVelocity( const idVec3 &newLinearVelocity, int id = 0 );
99 void SetAngularVelocity( const idVec3 &newAngularVelocity, int id = 0 );
101 const idVec3 & GetLinearVelocity( int id = 0 ) const;
102 const idVec3 & GetAngularVelocity( int id = 0 ) const;
104 void SetGravity( const idVec3 &newGravity );
105 const idVec3 & GetGravity( void ) const;
106 const idVec3 & GetGravityNormal( void ) const;
108 void ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const;
109 void ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const;
110 int ClipContents( const idClipModel *model ) const;
112 void DisableClip( void );
113 void EnableClip( void );
115 void UnlinkClip( void );
116 void LinkClip( void );
118 bool EvaluateContacts( void );
119 int GetNumContacts( void ) const;
120 const contactInfo_t & GetContact( int num ) const;
121 void ClearContacts( void );
122 void AddContactEntity( idEntity *e );
123 void RemoveContactEntity( idEntity *e );
125 bool HasGroundContacts( void ) const;
126 bool IsGroundEntity( int entityNum ) const;
127 bool IsGroundClipModel( int entityNum, int id ) const;
129 void SetPushed( int deltaTime );
130 const idVec3 & GetPushedLinearVelocity( const int id = 0 ) const;
131 const idVec3 & GetPushedAngularVelocity( const int id = 0 ) const;
133 void SetMaster( idEntity *master, const bool orientated = true );
135 const trace_t * GetBlockingInfo( void ) const;
136 idEntity * GetBlockingEntity( void ) const;
138 int GetLinearEndTime( void ) const;
139 int GetAngularEndTime( void ) const;
141 void WriteToSnapshot( idBitMsgDelta &msg ) const;
142 void ReadFromSnapshot( const idBitMsgDelta &msg );
145 idEntity * self; // entity using this physics object
146 idList<staticPState_t> current; // physics state
147 idList<idClipModel *> clipModels; // collision model
154 #endif /* !__PHYSICS_STATICMULTI_H__ */