Physics_StaticMulti.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. /*
  2. ===========================================================================
  3. Doom 3 GPL Source Code
  4. Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
  5. This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
  6. Doom 3 Source Code is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. Doom 3 Source Code is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
  16. 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.
  17. 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.
  18. ===========================================================================
  19. */
  20. #include "../../idlib/precompiled.h"
  21. #pragma hdrstop
  22. #include "../Game_local.h"
  23. CLASS_DECLARATION( idPhysics, idPhysics_StaticMulti )
  24. END_CLASS
  25. staticPState_t defaultState;
  26. /*
  27. ================
  28. idPhysics_StaticMulti::idPhysics_StaticMulti
  29. ================
  30. */
  31. idPhysics_StaticMulti::idPhysics_StaticMulti( void ) {
  32. self = NULL;
  33. hasMaster = false;
  34. isOrientated = false;
  35. defaultState.origin.Zero();
  36. defaultState.axis.Identity();
  37. defaultState.localOrigin.Zero();
  38. defaultState.localAxis.Identity();
  39. current.SetNum( 1 );
  40. current[0] = defaultState;
  41. clipModels.SetNum( 1 );
  42. clipModels[0] = NULL;
  43. }
  44. /*
  45. ================
  46. idPhysics_StaticMulti::~idPhysics_StaticMulti
  47. ================
  48. */
  49. idPhysics_StaticMulti::~idPhysics_StaticMulti( void ) {
  50. if ( self && self->GetPhysics() == this ) {
  51. self->SetPhysics( NULL );
  52. }
  53. idForce::DeletePhysics( this );
  54. for ( int i = 0; i < clipModels.Num(); i++ ) {
  55. delete clipModels[i];
  56. }
  57. }
  58. /*
  59. ================
  60. idPhysics_StaticMulti::Save
  61. ================
  62. */
  63. void idPhysics_StaticMulti::Save( idSaveGame *savefile ) const {
  64. int i;
  65. savefile->WriteObject( self );
  66. savefile->WriteInt(current.Num());
  67. for ( i = 0; i < current.Num(); i++ ) {
  68. savefile->WriteVec3( current[i].origin );
  69. savefile->WriteMat3( current[i].axis );
  70. savefile->WriteVec3( current[i].localOrigin );
  71. savefile->WriteMat3( current[i].localAxis );
  72. }
  73. savefile->WriteInt( clipModels.Num() );
  74. for ( i = 0; i < clipModels.Num(); i++ ) {
  75. savefile->WriteClipModel( clipModels[i] );
  76. }
  77. savefile->WriteBool(hasMaster);
  78. savefile->WriteBool(isOrientated);
  79. }
  80. /*
  81. ================
  82. idPhysics_StaticMulti::Restore
  83. ================
  84. */
  85. void idPhysics_StaticMulti::Restore( idRestoreGame *savefile ) {
  86. int i, num;
  87. savefile->ReadObject( reinterpret_cast<idClass *&>( self ) );
  88. savefile->ReadInt(num);
  89. current.AssureSize( num );
  90. for ( i = 0; i < num; i++ ) {
  91. savefile->ReadVec3( current[i].origin );
  92. savefile->ReadMat3( current[i].axis );
  93. savefile->ReadVec3( current[i].localOrigin );
  94. savefile->ReadMat3( current[i].localAxis );
  95. }
  96. savefile->ReadInt(num);
  97. clipModels.SetNum( num );
  98. for ( i = 0; i < num; i++ ) {
  99. savefile->ReadClipModel( clipModels[i] );
  100. }
  101. savefile->ReadBool(hasMaster);
  102. savefile->ReadBool(isOrientated);
  103. }
  104. /*
  105. ================
  106. idPhysics_StaticMulti::SetSelf
  107. ================
  108. */
  109. void idPhysics_StaticMulti::SetSelf( idEntity *e ) {
  110. assert( e );
  111. self = e;
  112. }
  113. /*
  114. ================
  115. idPhysics_StaticMulti::RemoveIndex
  116. ================
  117. */
  118. void idPhysics_StaticMulti::RemoveIndex( int id, bool freeClipModel ) {
  119. if ( id < 0 || id >= clipModels.Num() ) {
  120. return;
  121. }
  122. if ( clipModels[id] && freeClipModel ) {
  123. delete clipModels[id];
  124. clipModels[id] = NULL;
  125. }
  126. clipModels.RemoveIndex( id );
  127. current.RemoveIndex( id );
  128. }
  129. /*
  130. ================
  131. idPhysics_StaticMulti::SetClipModel
  132. ================
  133. */
  134. void idPhysics_StaticMulti::SetClipModel( idClipModel *model, float density, int id, bool freeOld ) {
  135. int i;
  136. assert( self );
  137. if ( id >= clipModels.Num() ) {
  138. current.AssureSize( id+1, defaultState );
  139. clipModels.AssureSize( id+1, NULL );
  140. }
  141. if ( clipModels[id] && clipModels[id] != model && freeOld ) {
  142. delete clipModels[id];
  143. }
  144. clipModels[id] = model;
  145. if ( clipModels[id] ) {
  146. clipModels[id]->Link( gameLocal.clip, self, id, current[id].origin, current[id].axis );
  147. }
  148. for ( i = clipModels.Num() - 1; i >= 1; i-- ) {
  149. if ( clipModels[i] ) {
  150. break;
  151. }
  152. }
  153. current.SetNum( i+1, false );
  154. clipModels.SetNum( i+1, false );
  155. }
  156. /*
  157. ================
  158. idPhysics_StaticMulti::GetClipModel
  159. ================
  160. */
  161. idClipModel *idPhysics_StaticMulti::GetClipModel( int id ) const {
  162. if ( id >= 0 && id < clipModels.Num() && clipModels[id] ) {
  163. return clipModels[id];
  164. }
  165. return gameLocal.clip.DefaultClipModel();
  166. }
  167. /*
  168. ================
  169. idPhysics_StaticMulti::GetNumClipModels
  170. ================
  171. */
  172. int idPhysics_StaticMulti::GetNumClipModels( void ) const {
  173. return clipModels.Num();
  174. }
  175. /*
  176. ================
  177. idPhysics_StaticMulti::SetMass
  178. ================
  179. */
  180. void idPhysics_StaticMulti::SetMass( float mass, int id ) {
  181. }
  182. /*
  183. ================
  184. idPhysics_StaticMulti::GetMass
  185. ================
  186. */
  187. float idPhysics_StaticMulti::GetMass( int id ) const {
  188. return 0.0f;
  189. }
  190. /*
  191. ================
  192. idPhysics_StaticMulti::SetContents
  193. ================
  194. */
  195. void idPhysics_StaticMulti::SetContents( int contents, int id ) {
  196. int i;
  197. if ( id >= 0 && id < clipModels.Num() ) {
  198. if ( clipModels[id] ) {
  199. clipModels[id]->SetContents( contents );
  200. }
  201. } else if ( id == -1 ) {
  202. for ( i = 0; i < clipModels.Num(); i++ ) {
  203. if ( clipModels[i] ) {
  204. clipModels[i]->SetContents( contents );
  205. }
  206. }
  207. }
  208. }
  209. /*
  210. ================
  211. idPhysics_StaticMulti::GetContents
  212. ================
  213. */
  214. int idPhysics_StaticMulti::GetContents( int id ) const {
  215. int i, contents = 0;
  216. if ( id >= 0 && id < clipModels.Num() ) {
  217. if ( clipModels[id] ) {
  218. contents = clipModels[id]->GetContents();
  219. }
  220. } else if ( id == -1 ) {
  221. for ( i = 0; i < clipModels.Num(); i++ ) {
  222. if ( clipModels[i] ) {
  223. contents |= clipModels[i]->GetContents();
  224. }
  225. }
  226. }
  227. return contents;
  228. }
  229. /*
  230. ================
  231. idPhysics_StaticMulti::SetClipMask
  232. ================
  233. */
  234. void idPhysics_StaticMulti::SetClipMask( int mask, int id ) {
  235. }
  236. /*
  237. ================
  238. idPhysics_StaticMulti::GetClipMask
  239. ================
  240. */
  241. int idPhysics_StaticMulti::GetClipMask( int id ) const {
  242. return 0;
  243. }
  244. /*
  245. ================
  246. idPhysics_StaticMulti::GetBounds
  247. ================
  248. */
  249. const idBounds &idPhysics_StaticMulti::GetBounds( int id ) const {
  250. int i;
  251. static idBounds bounds;
  252. if ( id >= 0 && id < clipModels.Num() ) {
  253. if ( clipModels[id] ) {
  254. return clipModels[id]->GetBounds();
  255. }
  256. }
  257. if ( id == -1 ) {
  258. bounds.Clear();
  259. for ( i = 0; i < clipModels.Num(); i++ ) {
  260. if ( clipModels[i] ) {
  261. bounds.AddBounds( clipModels[i]->GetAbsBounds() );
  262. }
  263. }
  264. for ( i = 0; i < clipModels.Num(); i++ ) {
  265. if ( clipModels[i] ) {
  266. bounds[0] -= clipModels[i]->GetOrigin();
  267. bounds[1] -= clipModels[i]->GetOrigin();
  268. break;
  269. }
  270. }
  271. return bounds;
  272. }
  273. return bounds_zero;
  274. }
  275. /*
  276. ================
  277. idPhysics_StaticMulti::GetAbsBounds
  278. ================
  279. */
  280. const idBounds &idPhysics_StaticMulti::GetAbsBounds( int id ) const {
  281. int i;
  282. static idBounds absBounds;
  283. if ( id >= 0 && id < clipModels.Num() ) {
  284. if ( clipModels[id] ) {
  285. return clipModels[id]->GetAbsBounds();
  286. }
  287. }
  288. if ( id == -1 ) {
  289. absBounds.Clear();
  290. for ( i = 0; i < clipModels.Num(); i++ ) {
  291. if ( clipModels[i] ) {
  292. absBounds.AddBounds( clipModels[i]->GetAbsBounds() );
  293. }
  294. }
  295. return absBounds;
  296. }
  297. return bounds_zero;
  298. }
  299. /*
  300. ================
  301. idPhysics_StaticMulti::Evaluate
  302. ================
  303. */
  304. bool idPhysics_StaticMulti::Evaluate( int timeStepMSec, int endTimeMSec ) {
  305. int i;
  306. idVec3 masterOrigin;
  307. idMat3 masterAxis;
  308. if ( hasMaster ) {
  309. self->GetMasterPosition( masterOrigin, masterAxis );
  310. for ( i = 0; i < clipModels.Num(); i++ ) {
  311. current[i].origin = masterOrigin + current[i].localOrigin * masterAxis;
  312. if ( isOrientated ) {
  313. current[i].axis = current[i].localAxis * masterAxis;
  314. } else {
  315. current[i].axis = current[i].localAxis;
  316. }
  317. if ( clipModels[i] ) {
  318. clipModels[i]->Link( gameLocal.clip, self, i, current[i].origin, current[i].axis );
  319. }
  320. }
  321. // FIXME: return false if master did not move
  322. return true;
  323. }
  324. return false;
  325. }
  326. /*
  327. ================
  328. idPhysics_StaticMulti::UpdateTime
  329. ================
  330. */
  331. void idPhysics_StaticMulti::UpdateTime( int endTimeMSec ) {
  332. }
  333. /*
  334. ================
  335. idPhysics_StaticMulti::GetTime
  336. ================
  337. */
  338. int idPhysics_StaticMulti::GetTime( void ) const {
  339. return 0;
  340. }
  341. /*
  342. ================
  343. idPhysics_StaticMulti::GetImpactInfo
  344. ================
  345. */
  346. void idPhysics_StaticMulti::GetImpactInfo( const int id, const idVec3 &point, impactInfo_t *info ) const {
  347. memset( info, 0, sizeof( *info ) );
  348. }
  349. /*
  350. ================
  351. idPhysics_StaticMulti::ApplyImpulse
  352. ================
  353. */
  354. void idPhysics_StaticMulti::ApplyImpulse( const int id, const idVec3 &point, const idVec3 &impulse ) {
  355. }
  356. /*
  357. ================
  358. idPhysics_StaticMulti::AddForce
  359. ================
  360. */
  361. void idPhysics_StaticMulti::AddForce( const int id, const idVec3 &point, const idVec3 &force ) {
  362. }
  363. /*
  364. ================
  365. idPhysics_StaticMulti::Activate
  366. ================
  367. */
  368. void idPhysics_StaticMulti::Activate( void ) {
  369. }
  370. /*
  371. ================
  372. idPhysics_StaticMulti::PutToRest
  373. ================
  374. */
  375. void idPhysics_StaticMulti::PutToRest( void ) {
  376. }
  377. /*
  378. ================
  379. idPhysics_StaticMulti::IsAtRest
  380. ================
  381. */
  382. bool idPhysics_StaticMulti::IsAtRest( void ) const {
  383. return true;
  384. }
  385. /*
  386. ================
  387. idPhysics_StaticMulti::GetRestStartTime
  388. ================
  389. */
  390. int idPhysics_StaticMulti::GetRestStartTime( void ) const {
  391. return 0;
  392. }
  393. /*
  394. ================
  395. idPhysics_StaticMulti::IsPushable
  396. ================
  397. */
  398. bool idPhysics_StaticMulti::IsPushable( void ) const {
  399. return false;
  400. }
  401. /*
  402. ================
  403. idPhysics_StaticMulti::SaveState
  404. ================
  405. */
  406. void idPhysics_StaticMulti::SaveState( void ) {
  407. }
  408. /*
  409. ================
  410. idPhysics_StaticMulti::RestoreState
  411. ================
  412. */
  413. void idPhysics_StaticMulti::RestoreState( void ) {
  414. }
  415. /*
  416. ================
  417. idPhysics_StaticMulti::SetOrigin
  418. ================
  419. */
  420. void idPhysics_StaticMulti::SetOrigin( const idVec3 &newOrigin, int id ) {
  421. idVec3 masterOrigin;
  422. idMat3 masterAxis;
  423. if ( id >= 0 && id < clipModels.Num() ) {
  424. current[id].localOrigin = newOrigin;
  425. if ( hasMaster ) {
  426. self->GetMasterPosition( masterOrigin, masterAxis );
  427. current[id].origin = masterOrigin + newOrigin * masterAxis;
  428. } else {
  429. current[id].origin = newOrigin;
  430. }
  431. if ( clipModels[id] ) {
  432. clipModels[id]->Link( gameLocal.clip, self, id, current[id].origin, current[id].axis );
  433. }
  434. } else if ( id == -1 ) {
  435. if ( hasMaster ) {
  436. self->GetMasterPosition( masterOrigin, masterAxis );
  437. Translate( masterOrigin + masterAxis * newOrigin - current[0].origin );
  438. } else {
  439. Translate( newOrigin - current[0].origin );
  440. }
  441. }
  442. }
  443. /*
  444. ================
  445. idPhysics_StaticMulti::SetAxis
  446. ================
  447. */
  448. void idPhysics_StaticMulti::SetAxis( const idMat3 &newAxis, int id ) {
  449. idVec3 masterOrigin;
  450. idMat3 masterAxis;
  451. if ( id >= 0 && id < clipModels.Num() ) {
  452. current[id].localAxis = newAxis;
  453. if ( hasMaster && isOrientated ) {
  454. self->GetMasterPosition( masterOrigin, masterAxis );
  455. current[id].axis = newAxis * masterAxis;
  456. } else {
  457. current[id].axis = newAxis;
  458. }
  459. if ( clipModels[id] ) {
  460. clipModels[id]->Link( gameLocal.clip, self, id, current[id].origin, current[id].axis );
  461. }
  462. } else if ( id == -1 ) {
  463. idMat3 axis;
  464. idRotation rotation;
  465. if ( hasMaster ) {
  466. self->GetMasterPosition( masterOrigin, masterAxis );
  467. axis = current[0].axis.Transpose() * ( newAxis * masterAxis );
  468. } else {
  469. axis = current[0].axis.Transpose() * newAxis;
  470. }
  471. rotation = axis.ToRotation();
  472. rotation.SetOrigin( current[0].origin );
  473. Rotate( rotation );
  474. }
  475. }
  476. /*
  477. ================
  478. idPhysics_StaticMulti::Translate
  479. ================
  480. */
  481. void idPhysics_StaticMulti::Translate( const idVec3 &translation, int id ) {
  482. int i;
  483. if ( id >= 0 && id < clipModels.Num() ) {
  484. current[id].localOrigin += translation;
  485. current[id].origin += translation;
  486. if ( clipModels[id] ) {
  487. clipModels[id]->Link( gameLocal.clip, self, id, current[id].origin, current[id].axis );
  488. }
  489. } else if ( id == -1 ) {
  490. for ( i = 0; i < clipModels.Num(); i++ ) {
  491. current[i].localOrigin += translation;
  492. current[i].origin += translation;
  493. if ( clipModels[i] ) {
  494. clipModels[i]->Link( gameLocal.clip, self, i, current[i].origin, current[i].axis );
  495. }
  496. }
  497. }
  498. }
  499. /*
  500. ================
  501. idPhysics_StaticMulti::Rotate
  502. ================
  503. */
  504. void idPhysics_StaticMulti::Rotate( const idRotation &rotation, int id ) {
  505. int i;
  506. idVec3 masterOrigin;
  507. idMat3 masterAxis;
  508. if ( id >= 0 && id < clipModels.Num() ) {
  509. current[id].origin *= rotation;
  510. current[id].axis *= rotation.ToMat3();
  511. if ( hasMaster ) {
  512. self->GetMasterPosition( masterOrigin, masterAxis );
  513. current[id].localAxis *= rotation.ToMat3();
  514. current[id].localOrigin = ( current[id].origin - masterOrigin ) * masterAxis.Transpose();
  515. } else {
  516. current[id].localAxis = current[id].axis;
  517. current[id].localOrigin = current[id].origin;
  518. }
  519. if ( clipModels[id] ) {
  520. clipModels[id]->Link( gameLocal.clip, self, id, current[id].origin, current[id].axis );
  521. }
  522. } else if ( id == -1 ) {
  523. for ( i = 0; i < clipModels.Num(); i++ ) {
  524. current[i].origin *= rotation;
  525. current[i].axis *= rotation.ToMat3();
  526. if ( hasMaster ) {
  527. self->GetMasterPosition( masterOrigin, masterAxis );
  528. current[i].localAxis *= rotation.ToMat3();
  529. current[i].localOrigin = ( current[i].origin - masterOrigin ) * masterAxis.Transpose();
  530. } else {
  531. current[i].localAxis = current[i].axis;
  532. current[i].localOrigin = current[i].origin;
  533. }
  534. if ( clipModels[i] ) {
  535. clipModels[i]->Link( gameLocal.clip, self, i, current[i].origin, current[i].axis );
  536. }
  537. }
  538. }
  539. }
  540. /*
  541. ================
  542. idPhysics_StaticMulti::GetOrigin
  543. ================
  544. */
  545. const idVec3 &idPhysics_StaticMulti::GetOrigin( int id ) const {
  546. if ( id >= 0 && id < clipModels.Num() ) {
  547. return current[id].origin;
  548. }
  549. if ( clipModels.Num() ) {
  550. return current[0].origin;
  551. } else {
  552. return vec3_origin;
  553. }
  554. }
  555. /*
  556. ================
  557. idPhysics_StaticMulti::GetAxis
  558. ================
  559. */
  560. const idMat3 &idPhysics_StaticMulti::GetAxis( int id ) const {
  561. if ( id >= 0 && id < clipModels.Num() ) {
  562. return current[id].axis;
  563. }
  564. if ( clipModels.Num() ) {
  565. return current[0].axis;
  566. } else {
  567. return mat3_identity;
  568. }
  569. }
  570. /*
  571. ================
  572. idPhysics_StaticMulti::SetLinearVelocity
  573. ================
  574. */
  575. void idPhysics_StaticMulti::SetLinearVelocity( const idVec3 &newLinearVelocity, int id ) {
  576. }
  577. /*
  578. ================
  579. idPhysics_StaticMulti::SetAngularVelocity
  580. ================
  581. */
  582. void idPhysics_StaticMulti::SetAngularVelocity( const idVec3 &newAngularVelocity, int id ) {
  583. }
  584. /*
  585. ================
  586. idPhysics_StaticMulti::GetLinearVelocity
  587. ================
  588. */
  589. const idVec3 &idPhysics_StaticMulti::GetLinearVelocity( int id ) const {
  590. return vec3_origin;
  591. }
  592. /*
  593. ================
  594. idPhysics_StaticMulti::GetAngularVelocity
  595. ================
  596. */
  597. const idVec3 &idPhysics_StaticMulti::GetAngularVelocity( int id ) const {
  598. return vec3_origin;
  599. }
  600. /*
  601. ================
  602. idPhysics_StaticMulti::SetGravity
  603. ================
  604. */
  605. void idPhysics_StaticMulti::SetGravity( const idVec3 &newGravity ) {
  606. }
  607. /*
  608. ================
  609. idPhysics_StaticMulti::GetGravity
  610. ================
  611. */
  612. const idVec3 &idPhysics_StaticMulti::GetGravity( void ) const {
  613. static idVec3 gravity( 0, 0, -g_gravity.GetFloat() );
  614. return gravity;
  615. }
  616. /*
  617. ================
  618. idPhysics_StaticMulti::GetGravityNormal
  619. ================
  620. */
  621. const idVec3 &idPhysics_StaticMulti::GetGravityNormal( void ) const {
  622. static idVec3 gravity( 0, 0, -1 );
  623. return gravity;
  624. }
  625. /*
  626. ================
  627. idPhysics_StaticMulti::ClipTranslation
  628. ================
  629. */
  630. void idPhysics_StaticMulti::ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const {
  631. memset( &results, 0, sizeof( trace_t ) );
  632. gameLocal.Warning( "idPhysics_StaticMulti::ClipTranslation called" );
  633. }
  634. /*
  635. ================
  636. idPhysics_StaticMulti::ClipRotation
  637. ================
  638. */
  639. void idPhysics_StaticMulti::ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const {
  640. memset( &results, 0, sizeof( trace_t ) );
  641. gameLocal.Warning( "idPhysics_StaticMulti::ClipRotation called" );
  642. }
  643. /*
  644. ================
  645. idPhysics_StaticMulti::ClipContents
  646. ================
  647. */
  648. int idPhysics_StaticMulti::ClipContents( const idClipModel *model ) const {
  649. int i, contents;
  650. contents = 0;
  651. for ( i = 0; i < clipModels.Num(); i++ ) {
  652. if ( clipModels[i] ) {
  653. if ( model ) {
  654. contents |= gameLocal.clip.ContentsModel( clipModels[i]->GetOrigin(), clipModels[i], clipModels[i]->GetAxis(), -1,
  655. model->Handle(), model->GetOrigin(), model->GetAxis() );
  656. } else {
  657. contents |= gameLocal.clip.Contents( clipModels[i]->GetOrigin(), clipModels[i], clipModels[i]->GetAxis(), -1, NULL );
  658. }
  659. }
  660. }
  661. return contents;
  662. }
  663. /*
  664. ================
  665. idPhysics_StaticMulti::DisableClip
  666. ================
  667. */
  668. void idPhysics_StaticMulti::DisableClip( void ) {
  669. int i;
  670. for ( i = 0; i < clipModels.Num(); i++ ) {
  671. if ( clipModels[i] ) {
  672. clipModels[i]->Disable();
  673. }
  674. }
  675. }
  676. /*
  677. ================
  678. idPhysics_StaticMulti::EnableClip
  679. ================
  680. */
  681. void idPhysics_StaticMulti::EnableClip( void ) {
  682. int i;
  683. for ( i = 0; i < clipModels.Num(); i++ ) {
  684. if ( clipModels[i] ) {
  685. clipModels[i]->Enable();
  686. }
  687. }
  688. }
  689. /*
  690. ================
  691. idPhysics_StaticMulti::UnlinkClip
  692. ================
  693. */
  694. void idPhysics_StaticMulti::UnlinkClip( void ) {
  695. int i;
  696. for ( i = 0; i < clipModels.Num(); i++ ) {
  697. if ( clipModels[i] ) {
  698. clipModels[i]->Unlink();
  699. }
  700. }
  701. }
  702. /*
  703. ================
  704. idPhysics_StaticMulti::LinkClip
  705. ================
  706. */
  707. void idPhysics_StaticMulti::LinkClip( void ) {
  708. int i;
  709. for ( i = 0; i < clipModels.Num(); i++ ) {
  710. if ( clipModels[i] ) {
  711. clipModels[i]->Link( gameLocal.clip, self, i, current[i].origin, current[i].axis );
  712. }
  713. }
  714. }
  715. /*
  716. ================
  717. idPhysics_StaticMulti::EvaluateContacts
  718. ================
  719. */
  720. bool idPhysics_StaticMulti::EvaluateContacts( void ) {
  721. return false;
  722. }
  723. /*
  724. ================
  725. idPhysics_StaticMulti::GetNumContacts
  726. ================
  727. */
  728. int idPhysics_StaticMulti::GetNumContacts( void ) const {
  729. return 0;
  730. }
  731. /*
  732. ================
  733. idPhysics_StaticMulti::GetContact
  734. ================
  735. */
  736. const contactInfo_t &idPhysics_StaticMulti::GetContact( int num ) const {
  737. static contactInfo_t info;
  738. memset( &info, 0, sizeof( info ) );
  739. return info;
  740. }
  741. /*
  742. ================
  743. idPhysics_StaticMulti::ClearContacts
  744. ================
  745. */
  746. void idPhysics_StaticMulti::ClearContacts( void ) {
  747. }
  748. /*
  749. ================
  750. idPhysics_StaticMulti::AddContactEntity
  751. ================
  752. */
  753. void idPhysics_StaticMulti::AddContactEntity( idEntity *e ) {
  754. }
  755. /*
  756. ================
  757. idPhysics_StaticMulti::RemoveContactEntity
  758. ================
  759. */
  760. void idPhysics_StaticMulti::RemoveContactEntity( idEntity *e ) {
  761. }
  762. /*
  763. ================
  764. idPhysics_StaticMulti::HasGroundContacts
  765. ================
  766. */
  767. bool idPhysics_StaticMulti::HasGroundContacts( void ) const {
  768. return false;
  769. }
  770. /*
  771. ================
  772. idPhysics_StaticMulti::IsGroundEntity
  773. ================
  774. */
  775. bool idPhysics_StaticMulti::IsGroundEntity( int entityNum ) const {
  776. return false;
  777. }
  778. /*
  779. ================
  780. idPhysics_StaticMulti::IsGroundClipModel
  781. ================
  782. */
  783. bool idPhysics_StaticMulti::IsGroundClipModel( int entityNum, int id ) const {
  784. return false;
  785. }
  786. /*
  787. ================
  788. idPhysics_StaticMulti::SetPushed
  789. ================
  790. */
  791. void idPhysics_StaticMulti::SetPushed( int deltaTime ) {
  792. }
  793. /*
  794. ================
  795. idPhysics_StaticMulti::GetPushedLinearVelocity
  796. ================
  797. */
  798. const idVec3 &idPhysics_StaticMulti::GetPushedLinearVelocity( const int id ) const {
  799. return vec3_origin;
  800. }
  801. /*
  802. ================
  803. idPhysics_StaticMulti::GetPushedAngularVelocity
  804. ================
  805. */
  806. const idVec3 &idPhysics_StaticMulti::GetPushedAngularVelocity( const int id ) const {
  807. return vec3_origin;
  808. }
  809. /*
  810. ================
  811. idPhysics_StaticMulti::SetMaster
  812. ================
  813. */
  814. void idPhysics_StaticMulti::SetMaster( idEntity *master, const bool orientated ) {
  815. int i;
  816. idVec3 masterOrigin;
  817. idMat3 masterAxis;
  818. if ( master ) {
  819. if ( !hasMaster ) {
  820. // transform from world space to master space
  821. self->GetMasterPosition( masterOrigin, masterAxis );
  822. for ( i = 0; i < clipModels.Num(); i++ ) {
  823. current[i].localOrigin = ( current[i].origin - masterOrigin ) * masterAxis.Transpose();
  824. if ( orientated ) {
  825. current[i].localAxis = current[i].axis * masterAxis.Transpose();
  826. } else {
  827. current[i].localAxis = current[i].axis;
  828. }
  829. }
  830. hasMaster = true;
  831. isOrientated = orientated;
  832. }
  833. } else {
  834. if ( hasMaster ) {
  835. hasMaster = false;
  836. }
  837. }
  838. }
  839. /*
  840. ================
  841. idPhysics_StaticMulti::GetBlockingInfo
  842. ================
  843. */
  844. const trace_t *idPhysics_StaticMulti::GetBlockingInfo( void ) const {
  845. return NULL;
  846. }
  847. /*
  848. ================
  849. idPhysics_StaticMulti::GetBlockingEntity
  850. ================
  851. */
  852. idEntity *idPhysics_StaticMulti::GetBlockingEntity( void ) const {
  853. return NULL;
  854. }
  855. /*
  856. ================
  857. idPhysics_StaticMulti::GetLinearEndTime
  858. ================
  859. */
  860. int idPhysics_StaticMulti::GetLinearEndTime( void ) const {
  861. return 0;
  862. }
  863. /*
  864. ================
  865. idPhysics_StaticMulti::GetAngularEndTime
  866. ================
  867. */
  868. int idPhysics_StaticMulti::GetAngularEndTime( void ) const {
  869. return 0;
  870. }
  871. /*
  872. ================
  873. idPhysics_StaticMulti::WriteToSnapshot
  874. ================
  875. */
  876. void idPhysics_StaticMulti::WriteToSnapshot( idBitMsgDelta &msg ) const {
  877. int i;
  878. idCQuat quat, localQuat;
  879. msg.WriteByte( current.Num() );
  880. for ( i = 0; i < current.Num(); i++ ) {
  881. quat = current[i].axis.ToCQuat();
  882. localQuat = current[i].localAxis.ToCQuat();
  883. msg.WriteFloat( current[i].origin[0] );
  884. msg.WriteFloat( current[i].origin[1] );
  885. msg.WriteFloat( current[i].origin[2] );
  886. msg.WriteFloat( quat.x );
  887. msg.WriteFloat( quat.y );
  888. msg.WriteFloat( quat.z );
  889. msg.WriteDeltaFloat( current[i].origin[0], current[i].localOrigin[0] );
  890. msg.WriteDeltaFloat( current[i].origin[1], current[i].localOrigin[1] );
  891. msg.WriteDeltaFloat( current[i].origin[2], current[i].localOrigin[2] );
  892. msg.WriteDeltaFloat( quat.x, localQuat.x );
  893. msg.WriteDeltaFloat( quat.y, localQuat.y );
  894. msg.WriteDeltaFloat( quat.z, localQuat.z );
  895. }
  896. }
  897. /*
  898. ================
  899. idPhysics_StaticMulti::ReadFromSnapshot
  900. ================
  901. */
  902. void idPhysics_StaticMulti::ReadFromSnapshot( const idBitMsgDelta &msg ) {
  903. int i, num;
  904. idCQuat quat, localQuat;
  905. num = msg.ReadByte();
  906. assert( num == current.Num() );
  907. for ( i = 0; i < current.Num(); i++ ) {
  908. current[i].origin[0] = msg.ReadFloat();
  909. current[i].origin[1] = msg.ReadFloat();
  910. current[i].origin[2] = msg.ReadFloat();
  911. quat.x = msg.ReadFloat();
  912. quat.y = msg.ReadFloat();
  913. quat.z = msg.ReadFloat();
  914. current[i].localOrigin[0] = msg.ReadDeltaFloat( current[i].origin[0] );
  915. current[i].localOrigin[1] = msg.ReadDeltaFloat( current[i].origin[1] );
  916. current[i].localOrigin[2] = msg.ReadDeltaFloat( current[i].origin[2] );
  917. localQuat.x = msg.ReadDeltaFloat( quat.x );
  918. localQuat.y = msg.ReadDeltaFloat( quat.y );
  919. localQuat.z = msg.ReadDeltaFloat( quat.z );
  920. current[i].axis = quat.ToMat3();
  921. current[i].localAxis = localQuat.ToMat3();
  922. }
  923. }