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 #include "../../idlib/precompiled.h"
32 #include "../Game_local.h"
34 CLASS_DECLARATION( idPhysics_Base, idPhysics_Actor )
39 idPhysics_Actor::idPhysics_Actor
42 idPhysics_Actor::idPhysics_Actor( void ) {
46 invMass = 1.0f / mass;
49 masterDeltaYaw = 0.0f;
50 groundEntityPtr = NULL;
55 idPhysics_Actor::~idPhysics_Actor
58 idPhysics_Actor::~idPhysics_Actor( void ) {
70 void idPhysics_Actor::Save( idSaveGame *savefile ) const {
72 savefile->WriteClipModel( clipModel );
73 savefile->WriteMat3( clipModelAxis );
75 savefile->WriteFloat( mass );
76 savefile->WriteFloat( invMass );
78 savefile->WriteObject( masterEntity );
79 savefile->WriteFloat( masterYaw );
80 savefile->WriteFloat( masterDeltaYaw );
82 groundEntityPtr.Save( savefile );
87 idPhysics_Actor::Restore
90 void idPhysics_Actor::Restore( idRestoreGame *savefile ) {
92 savefile->ReadClipModel( clipModel );
93 savefile->ReadMat3( clipModelAxis );
95 savefile->ReadFloat( mass );
96 savefile->ReadFloat( invMass );
98 savefile->ReadObject( reinterpret_cast<idClass *&>( masterEntity ) );
99 savefile->ReadFloat( masterYaw );
100 savefile->ReadFloat( masterDeltaYaw );
102 groundEntityPtr.Restore( savefile );
107 idPhysics_Actor::SetClipModelAxis
110 void idPhysics_Actor::SetClipModelAxis( void ) {
111 // align clip model to gravity direction
112 if ( ( gravityNormal[2] == -1.0f ) || ( gravityNormal == vec3_zero ) ) {
113 clipModelAxis.Identity();
116 clipModelAxis[2] = -gravityNormal;
117 clipModelAxis[2].NormalVectors( clipModelAxis[0], clipModelAxis[1] );
118 clipModelAxis[1] = -clipModelAxis[1];
122 clipModel->Link( gameLocal.clip, self, 0, clipModel->GetOrigin(), clipModelAxis );
128 idPhysics_Actor::GetGravityAxis
131 const idMat3 &idPhysics_Actor::GetGravityAxis( void ) const {
132 return clipModelAxis;
137 idPhysics_Actor::GetMasterDeltaYaw
140 float idPhysics_Actor::GetMasterDeltaYaw( void ) const {
141 return masterDeltaYaw;
146 idPhysics_Actor::GetGroundEntity
149 idEntity *idPhysics_Actor::GetGroundEntity( void ) const {
150 return groundEntityPtr.GetEntity();
155 idPhysics_Actor::SetClipModel
158 void idPhysics_Actor::SetClipModel( idClipModel *model, const float density, int id, bool freeOld ) {
160 assert( model ); // a clip model is required
161 assert( model->IsTraceModel() ); // and it should be a trace model
162 assert( density > 0.0f ); // density should be valid
164 if ( clipModel && clipModel != model && freeOld ) {
168 clipModel->Link( gameLocal.clip, self, 0, clipModel->GetOrigin(), clipModelAxis );
173 idPhysics_Actor::GetClipModel
176 idClipModel *idPhysics_Actor::GetClipModel( int id ) const {
182 idPhysics_Actor::GetNumClipModels
185 int idPhysics_Actor::GetNumClipModels( void ) const {
191 idPhysics_Actor::SetMass
194 void idPhysics_Actor::SetMass( float _mass, int id ) {
195 assert( _mass > 0.0f );
197 invMass = 1.0f / _mass;
202 idPhysics_Actor::GetMass
205 float idPhysics_Actor::GetMass( int id ) const {
211 idPhysics_Actor::SetClipMask
214 void idPhysics_Actor::SetContents( int contents, int id ) {
215 clipModel->SetContents( contents );
220 idPhysics_Actor::SetClipMask
223 int idPhysics_Actor::GetContents( int id ) const {
224 return clipModel->GetContents();
229 idPhysics_Actor::GetBounds
232 const idBounds &idPhysics_Actor::GetBounds( int id ) const {
233 return clipModel->GetBounds();
238 idPhysics_Actor::GetAbsBounds
241 const idBounds &idPhysics_Actor::GetAbsBounds( int id ) const {
242 return clipModel->GetAbsBounds();
247 idPhysics_Actor::IsPushable
250 bool idPhysics_Actor::IsPushable( void ) const {
251 return ( masterEntity == NULL );
256 idPhysics_Actor::GetOrigin
259 const idVec3 &idPhysics_Actor::GetOrigin( int id ) const {
260 return clipModel->GetOrigin();
265 idPhysics_Player::GetAxis
268 const idMat3 &idPhysics_Actor::GetAxis( int id ) const {
269 return clipModel->GetAxis();
274 idPhysics_Actor::SetGravity
277 void idPhysics_Actor::SetGravity( const idVec3 &newGravity ) {
278 if ( newGravity != gravityVector ) {
279 idPhysics_Base::SetGravity( newGravity );
286 idPhysics_Actor::ClipTranslation
289 void idPhysics_Actor::ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const {
291 gameLocal.clip.TranslationModel( results, clipModel->GetOrigin(), clipModel->GetOrigin() + translation,
292 clipModel, clipModel->GetAxis(), clipMask,
293 model->Handle(), model->GetOrigin(), model->GetAxis() );
296 gameLocal.clip.Translation( results, clipModel->GetOrigin(), clipModel->GetOrigin() + translation,
297 clipModel, clipModel->GetAxis(), clipMask, self );
303 idPhysics_Actor::ClipRotation
306 void idPhysics_Actor::ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const {
308 gameLocal.clip.RotationModel( results, clipModel->GetOrigin(), rotation,
309 clipModel, clipModel->GetAxis(), clipMask,
310 model->Handle(), model->GetOrigin(), model->GetAxis() );
313 gameLocal.clip.Rotation( results, clipModel->GetOrigin(), rotation,
314 clipModel, clipModel->GetAxis(), clipMask, self );
320 idPhysics_Actor::ClipContents
323 int idPhysics_Actor::ClipContents( const idClipModel *model ) const {
325 return gameLocal.clip.ContentsModel( clipModel->GetOrigin(), clipModel, clipModel->GetAxis(), -1,
326 model->Handle(), model->GetOrigin(), model->GetAxis() );
329 return gameLocal.clip.Contents( clipModel->GetOrigin(), clipModel, clipModel->GetAxis(), -1, NULL );
335 idPhysics_Actor::DisableClip
338 void idPhysics_Actor::DisableClip( void ) {
339 clipModel->Disable();
344 idPhysics_Actor::EnableClip
347 void idPhysics_Actor::EnableClip( void ) {
353 idPhysics_Actor::UnlinkClip
356 void idPhysics_Actor::UnlinkClip( void ) {
362 idPhysics_Actor::LinkClip
365 void idPhysics_Actor::LinkClip( void ) {
366 clipModel->Link( gameLocal.clip, self, 0, clipModel->GetOrigin(), clipModel->GetAxis() );
371 idPhysics_Actor::EvaluateContacts
374 bool idPhysics_Actor::EvaluateContacts( void ) {
376 // get all the ground contacts
378 AddGroundContacts( clipModel );
379 AddContactEntitiesForContacts();
381 return ( contacts.Num() != 0 );