Physics_Base.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  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_Base )
  24. END_CLASS
  25. /*
  26. ================
  27. idPhysics_Base::idPhysics_Base
  28. ================
  29. */
  30. idPhysics_Base::idPhysics_Base( void ) {
  31. self = NULL;
  32. clipMask = 0;
  33. SetGravity( gameLocal.GetGravity() );
  34. ClearContacts();
  35. }
  36. /*
  37. ================
  38. idPhysics_Base::~idPhysics_Base
  39. ================
  40. */
  41. idPhysics_Base::~idPhysics_Base( void ) {
  42. if ( self && self->GetPhysics() == this ) {
  43. self->SetPhysics( NULL );
  44. }
  45. idForce::DeletePhysics( this );
  46. ClearContacts();
  47. }
  48. /*
  49. ================
  50. idPhysics_Base::Save
  51. ================
  52. */
  53. void idPhysics_Base::Save( idSaveGame *savefile ) const {
  54. int i;
  55. savefile->WriteObject( self );
  56. savefile->WriteInt( clipMask );
  57. savefile->WriteVec3( gravityVector );
  58. savefile->WriteVec3( gravityNormal );
  59. savefile->WriteInt( contacts.Num() );
  60. for ( i = 0; i < contacts.Num(); i++ ) {
  61. savefile->WriteContactInfo( contacts[i] );
  62. }
  63. savefile->WriteInt( contactEntities.Num() );
  64. for ( i = 0; i < contactEntities.Num(); i++ ) {
  65. contactEntities[i].Save( savefile );
  66. }
  67. }
  68. /*
  69. ================
  70. idPhysics_Base::Restore
  71. ================
  72. */
  73. void idPhysics_Base::Restore( idRestoreGame *savefile ) {
  74. int i, num;
  75. savefile->ReadObject( reinterpret_cast<idClass *&>( self ) );
  76. savefile->ReadInt( clipMask );
  77. savefile->ReadVec3( gravityVector );
  78. savefile->ReadVec3( gravityNormal );
  79. savefile->ReadInt( num );
  80. contacts.SetNum( num );
  81. for ( i = 0; i < contacts.Num(); i++ ) {
  82. savefile->ReadContactInfo( contacts[i] );
  83. }
  84. savefile->ReadInt( num );
  85. contactEntities.SetNum( num );
  86. for ( i = 0; i < contactEntities.Num(); i++ ) {
  87. contactEntities[i].Restore( savefile );
  88. }
  89. }
  90. /*
  91. ================
  92. idPhysics_Base::SetSelf
  93. ================
  94. */
  95. void idPhysics_Base::SetSelf( idEntity *e ) {
  96. assert( e );
  97. self = e;
  98. }
  99. /*
  100. ================
  101. idPhysics_Base::SetClipModel
  102. ================
  103. */
  104. void idPhysics_Base::SetClipModel( idClipModel *model, float density, int id, bool freeOld ) {
  105. }
  106. /*
  107. ================
  108. idPhysics_Base::GetClipModel
  109. ================
  110. */
  111. idClipModel *idPhysics_Base::GetClipModel( int id ) const {
  112. return NULL;
  113. }
  114. /*
  115. ================
  116. idPhysics_Base::GetNumClipModels
  117. ================
  118. */
  119. int idPhysics_Base::GetNumClipModels( void ) const {
  120. return 0;
  121. }
  122. /*
  123. ================
  124. idPhysics_Base::SetMass
  125. ================
  126. */
  127. void idPhysics_Base::SetMass( float mass, int id ) {
  128. }
  129. /*
  130. ================
  131. idPhysics_Base::GetMass
  132. ================
  133. */
  134. float idPhysics_Base::GetMass( int id ) const {
  135. return 0.0f;
  136. }
  137. /*
  138. ================
  139. idPhysics_Base::SetContents
  140. ================
  141. */
  142. void idPhysics_Base::SetContents( int contents, int id ) {
  143. }
  144. /*
  145. ================
  146. idPhysics_Base::SetClipMask
  147. ================
  148. */
  149. int idPhysics_Base::GetContents( int id ) const {
  150. return 0;
  151. }
  152. /*
  153. ================
  154. idPhysics_Base::SetClipMask
  155. ================
  156. */
  157. void idPhysics_Base::SetClipMask( int mask, int id ) {
  158. clipMask = mask;
  159. }
  160. /*
  161. ================
  162. idPhysics_Base::GetClipMask
  163. ================
  164. */
  165. int idPhysics_Base::GetClipMask( int id ) const {
  166. return clipMask;
  167. }
  168. /*
  169. ================
  170. idPhysics_Base::GetBounds
  171. ================
  172. */
  173. const idBounds &idPhysics_Base::GetBounds( int id ) const {
  174. return bounds_zero;
  175. }
  176. /*
  177. ================
  178. idPhysics_Base::GetAbsBounds
  179. ================
  180. */
  181. const idBounds &idPhysics_Base::GetAbsBounds( int id ) const {
  182. return bounds_zero;
  183. }
  184. /*
  185. ================
  186. idPhysics_Base::Evaluate
  187. ================
  188. */
  189. bool idPhysics_Base::Evaluate( int timeStepMSec, int endTimeMSec ) {
  190. return false;
  191. }
  192. /*
  193. ================
  194. idPhysics_Base::UpdateTime
  195. ================
  196. */
  197. void idPhysics_Base::UpdateTime( int endTimeMSec ) {
  198. }
  199. /*
  200. ================
  201. idPhysics_Base::GetTime
  202. ================
  203. */
  204. int idPhysics_Base::GetTime( void ) const {
  205. return 0;
  206. }
  207. /*
  208. ================
  209. idPhysics_Base::GetImpactInfo
  210. ================
  211. */
  212. void idPhysics_Base::GetImpactInfo( const int id, const idVec3 &point, impactInfo_t *info ) const {
  213. memset( info, 0, sizeof( *info ) );
  214. }
  215. /*
  216. ================
  217. idPhysics_Base::ApplyImpulse
  218. ================
  219. */
  220. void idPhysics_Base::ApplyImpulse( const int id, const idVec3 &point, const idVec3 &impulse ) {
  221. }
  222. /*
  223. ================
  224. idPhysics_Base::AddForce
  225. ================
  226. */
  227. void idPhysics_Base::AddForce( const int id, const idVec3 &point, const idVec3 &force ) {
  228. }
  229. /*
  230. ================
  231. idPhysics_Base::Activate
  232. ================
  233. */
  234. void idPhysics_Base::Activate( void ) {
  235. }
  236. /*
  237. ================
  238. idPhysics_Base::PutToRest
  239. ================
  240. */
  241. void idPhysics_Base::PutToRest( void ) {
  242. }
  243. /*
  244. ================
  245. idPhysics_Base::IsAtRest
  246. ================
  247. */
  248. bool idPhysics_Base::IsAtRest( void ) const {
  249. return true;
  250. }
  251. /*
  252. ================
  253. idPhysics_Base::GetRestStartTime
  254. ================
  255. */
  256. int idPhysics_Base::GetRestStartTime( void ) const {
  257. return 0;
  258. }
  259. /*
  260. ================
  261. idPhysics_Base::IsPushable
  262. ================
  263. */
  264. bool idPhysics_Base::IsPushable( void ) const {
  265. return true;
  266. }
  267. /*
  268. ================
  269. idPhysics_Base::SaveState
  270. ================
  271. */
  272. void idPhysics_Base::SaveState( void ) {
  273. }
  274. /*
  275. ================
  276. idPhysics_Base::RestoreState
  277. ================
  278. */
  279. void idPhysics_Base::RestoreState( void ) {
  280. }
  281. /*
  282. ================
  283. idPhysics_Base::SetOrigin
  284. ================
  285. */
  286. void idPhysics_Base::SetOrigin( const idVec3 &newOrigin, int id ) {
  287. }
  288. /*
  289. ================
  290. idPhysics_Base::SetAxis
  291. ================
  292. */
  293. void idPhysics_Base::SetAxis( const idMat3 &newAxis, int id ) {
  294. }
  295. /*
  296. ================
  297. idPhysics_Base::Translate
  298. ================
  299. */
  300. void idPhysics_Base::Translate( const idVec3 &translation, int id ) {
  301. }
  302. /*
  303. ================
  304. idPhysics_Base::Rotate
  305. ================
  306. */
  307. void idPhysics_Base::Rotate( const idRotation &rotation, int id ) {
  308. }
  309. /*
  310. ================
  311. idPhysics_Base::GetOrigin
  312. ================
  313. */
  314. const idVec3 &idPhysics_Base::GetOrigin( int id ) const {
  315. return vec3_origin;
  316. }
  317. /*
  318. ================
  319. idPhysics_Base::GetAxis
  320. ================
  321. */
  322. const idMat3 &idPhysics_Base::GetAxis( int id ) const {
  323. return mat3_identity;
  324. }
  325. /*
  326. ================
  327. idPhysics_Base::SetLinearVelocity
  328. ================
  329. */
  330. void idPhysics_Base::SetLinearVelocity( const idVec3 &newLinearVelocity, int id ) {
  331. }
  332. /*
  333. ================
  334. idPhysics_Base::SetAngularVelocity
  335. ================
  336. */
  337. void idPhysics_Base::SetAngularVelocity( const idVec3 &newAngularVelocity, int id ) {
  338. }
  339. /*
  340. ================
  341. idPhysics_Base::GetLinearVelocity
  342. ================
  343. */
  344. const idVec3 &idPhysics_Base::GetLinearVelocity( int id ) const {
  345. return vec3_origin;
  346. }
  347. /*
  348. ================
  349. idPhysics_Base::GetAngularVelocity
  350. ================
  351. */
  352. const idVec3 &idPhysics_Base::GetAngularVelocity( int id ) const {
  353. return vec3_origin;
  354. }
  355. /*
  356. ================
  357. idPhysics_Base::SetGravity
  358. ================
  359. */
  360. void idPhysics_Base::SetGravity( const idVec3 &newGravity ) {
  361. gravityVector = newGravity;
  362. gravityNormal = newGravity;
  363. gravityNormal.Normalize();
  364. }
  365. /*
  366. ================
  367. idPhysics_Base::GetGravity
  368. ================
  369. */
  370. const idVec3 &idPhysics_Base::GetGravity( void ) const {
  371. return gravityVector;
  372. }
  373. /*
  374. ================
  375. idPhysics_Base::GetGravityNormal
  376. ================
  377. */
  378. const idVec3 &idPhysics_Base::GetGravityNormal( void ) const {
  379. return gravityNormal;
  380. }
  381. /*
  382. ================
  383. idPhysics_Base::ClipTranslation
  384. ================
  385. */
  386. void idPhysics_Base::ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const {
  387. memset( &results, 0, sizeof( trace_t ) );
  388. }
  389. /*
  390. ================
  391. idPhysics_Base::ClipRotation
  392. ================
  393. */
  394. void idPhysics_Base::ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const {
  395. memset( &results, 0, sizeof( trace_t ) );
  396. }
  397. /*
  398. ================
  399. idPhysics_Base::ClipContents
  400. ================
  401. */
  402. int idPhysics_Base::ClipContents( const idClipModel *model ) const {
  403. return 0;
  404. }
  405. /*
  406. ================
  407. idPhysics_Base::DisableClip
  408. ================
  409. */
  410. void idPhysics_Base::DisableClip( void ) {
  411. }
  412. /*
  413. ================
  414. idPhysics_Base::EnableClip
  415. ================
  416. */
  417. void idPhysics_Base::EnableClip( void ) {
  418. }
  419. /*
  420. ================
  421. idPhysics_Base::UnlinkClip
  422. ================
  423. */
  424. void idPhysics_Base::UnlinkClip( void ) {
  425. }
  426. /*
  427. ================
  428. idPhysics_Base::LinkClip
  429. ================
  430. */
  431. void idPhysics_Base::LinkClip( void ) {
  432. }
  433. /*
  434. ================
  435. idPhysics_Base::EvaluateContacts
  436. ================
  437. */
  438. bool idPhysics_Base::EvaluateContacts( void ) {
  439. return false;
  440. }
  441. /*
  442. ================
  443. idPhysics_Base::GetNumContacts
  444. ================
  445. */
  446. int idPhysics_Base::GetNumContacts( void ) const {
  447. return contacts.Num();
  448. }
  449. /*
  450. ================
  451. idPhysics_Base::GetContact
  452. ================
  453. */
  454. const contactInfo_t &idPhysics_Base::GetContact( int num ) const {
  455. return contacts[num];
  456. }
  457. /*
  458. ================
  459. idPhysics_Base::ClearContacts
  460. ================
  461. */
  462. void idPhysics_Base::ClearContacts( void ) {
  463. int i;
  464. idEntity *ent;
  465. for ( i = 0; i < contacts.Num(); i++ ) {
  466. ent = gameLocal.entities[ contacts[i].entityNum ];
  467. if ( ent ) {
  468. ent->RemoveContactEntity( self );
  469. }
  470. }
  471. contacts.SetNum( 0, false );
  472. }
  473. /*
  474. ================
  475. idPhysics_Base::AddContactEntity
  476. ================
  477. */
  478. void idPhysics_Base::AddContactEntity( idEntity *e ) {
  479. int i;
  480. idEntity *ent;
  481. bool found = false;
  482. for ( i = 0; i < contactEntities.Num(); i++ ) {
  483. ent = contactEntities[i].GetEntity();
  484. if ( ent == NULL ) {
  485. contactEntities.RemoveIndex( i-- );
  486. }
  487. if ( ent == e ) {
  488. found = true;
  489. }
  490. }
  491. if ( !found ) {
  492. contactEntities.Alloc() = e;
  493. }
  494. }
  495. /*
  496. ================
  497. idPhysics_Base::RemoveContactEntity
  498. ================
  499. */
  500. void idPhysics_Base::RemoveContactEntity( idEntity *e ) {
  501. int i;
  502. idEntity *ent;
  503. for ( i = 0; i < contactEntities.Num(); i++ ) {
  504. ent = contactEntities[i].GetEntity();
  505. if ( !ent ) {
  506. contactEntities.RemoveIndex( i-- );
  507. continue;
  508. }
  509. if ( ent == e ) {
  510. contactEntities.RemoveIndex( i-- );
  511. return;
  512. }
  513. }
  514. }
  515. /*
  516. ================
  517. idPhysics_Base::HasGroundContacts
  518. ================
  519. */
  520. bool idPhysics_Base::HasGroundContacts( void ) const {
  521. int i;
  522. for ( i = 0; i < contacts.Num(); i++ ) {
  523. if ( contacts[i].normal * -gravityNormal > 0.0f ) {
  524. return true;
  525. }
  526. }
  527. return false;
  528. }
  529. /*
  530. ================
  531. idPhysics_Base::IsGroundEntity
  532. ================
  533. */
  534. bool idPhysics_Base::IsGroundEntity( int entityNum ) const {
  535. int i;
  536. for ( i = 0; i < contacts.Num(); i++ ) {
  537. if ( contacts[i].entityNum == entityNum && ( contacts[i].normal * -gravityNormal > 0.0f ) ) {
  538. return true;
  539. }
  540. }
  541. return false;
  542. }
  543. /*
  544. ================
  545. idPhysics_Base::IsGroundClipModel
  546. ================
  547. */
  548. bool idPhysics_Base::IsGroundClipModel( int entityNum, int id ) const {
  549. int i;
  550. for ( i = 0; i < contacts.Num(); i++ ) {
  551. if ( contacts[i].entityNum == entityNum && contacts[i].id == id && ( contacts[i].normal * -gravityNormal > 0.0f ) ) {
  552. return true;
  553. }
  554. }
  555. return false;
  556. }
  557. /*
  558. ================
  559. idPhysics_Base::SetPushed
  560. ================
  561. */
  562. void idPhysics_Base::SetPushed( int deltaTime ) {
  563. }
  564. /*
  565. ================
  566. idPhysics_Base::GetPushedLinearVelocity
  567. ================
  568. */
  569. const idVec3 &idPhysics_Base::GetPushedLinearVelocity( const int id ) const {
  570. return vec3_origin;
  571. }
  572. /*
  573. ================
  574. idPhysics_Base::GetPushedAngularVelocity
  575. ================
  576. */
  577. const idVec3 &idPhysics_Base::GetPushedAngularVelocity( const int id ) const {
  578. return vec3_origin;
  579. }
  580. /*
  581. ================
  582. idPhysics_Base::SetMaster
  583. ================
  584. */
  585. void idPhysics_Base::SetMaster( idEntity *master, const bool orientated ) {
  586. }
  587. /*
  588. ================
  589. idPhysics_Base::GetBlockingInfo
  590. ================
  591. */
  592. const trace_t *idPhysics_Base::GetBlockingInfo( void ) const {
  593. return NULL;
  594. }
  595. /*
  596. ================
  597. idPhysics_Base::GetBlockingEntity
  598. ================
  599. */
  600. idEntity *idPhysics_Base::GetBlockingEntity( void ) const {
  601. return NULL;
  602. }
  603. /*
  604. ================
  605. idPhysics_Base::GetLinearEndTime
  606. ================
  607. */
  608. int idPhysics_Base::GetLinearEndTime( void ) const {
  609. return 0;
  610. }
  611. /*
  612. ================
  613. idPhysics_Base::GetAngularEndTime
  614. ================
  615. */
  616. int idPhysics_Base::GetAngularEndTime( void ) const {
  617. return 0;
  618. }
  619. /*
  620. ================
  621. idPhysics_Base::AddGroundContacts
  622. ================
  623. */
  624. void idPhysics_Base::AddGroundContacts( const idClipModel *clipModel ) {
  625. idVec6 dir;
  626. int index, num;
  627. index = contacts.Num();
  628. contacts.SetNum( index + 10, false );
  629. dir.SubVec3(0) = gravityNormal;
  630. dir.SubVec3(1) = vec3_origin;
  631. num = gameLocal.clip.Contacts( &contacts[index], 10, clipModel->GetOrigin(),
  632. dir, CONTACT_EPSILON, clipModel, clipModel->GetAxis(), clipMask, self );
  633. contacts.SetNum( index + num, false );
  634. }
  635. /*
  636. ================
  637. idPhysics_Base::AddContactEntitiesForContacts
  638. ================
  639. */
  640. void idPhysics_Base::AddContactEntitiesForContacts( void ) {
  641. int i;
  642. idEntity *ent;
  643. for ( i = 0; i < contacts.Num(); i++ ) {
  644. ent = gameLocal.entities[ contacts[i].entityNum ];
  645. if ( ent && ent != self ) {
  646. ent->AddContactEntity( self );
  647. }
  648. }
  649. }
  650. /*
  651. ================
  652. idPhysics_Base::ActivateContactEntities
  653. ================
  654. */
  655. void idPhysics_Base::ActivateContactEntities( void ) {
  656. int i;
  657. idEntity *ent;
  658. for ( i = 0; i < contactEntities.Num(); i++ ) {
  659. ent = contactEntities[i].GetEntity();
  660. if ( ent ) {
  661. ent->ActivatePhysics( self );
  662. } else {
  663. contactEntities.RemoveIndex( i-- );
  664. }
  665. }
  666. }
  667. /*
  668. ================
  669. idPhysics_Base::IsOutsideWorld
  670. ================
  671. */
  672. bool idPhysics_Base::IsOutsideWorld( void ) const {
  673. if ( !gameLocal.clip.GetWorldBounds().Expand( 128.0f ).IntersectsBounds( GetAbsBounds() ) ) {
  674. return true;
  675. }
  676. return false;
  677. }
  678. /*
  679. ================
  680. idPhysics_Base::DrawVelocity
  681. ================
  682. */
  683. void idPhysics_Base::DrawVelocity( int id, float linearScale, float angularScale ) const {
  684. idVec3 dir, org, vec, start, end;
  685. idMat3 axis;
  686. float length, a;
  687. dir = GetLinearVelocity( id );
  688. dir *= linearScale;
  689. if ( dir.LengthSqr() > Square( 0.1f ) ) {
  690. dir.Truncate( 10.0f );
  691. org = GetOrigin( id );
  692. gameRenderWorld->DebugArrow( colorRed, org, org + dir, 1 );
  693. }
  694. dir = GetAngularVelocity( id );
  695. length = dir.Normalize();
  696. length *= angularScale;
  697. if ( length > 0.1f ) {
  698. if ( length < 60.0f ) {
  699. length = 60.0f;
  700. }
  701. else if ( length > 360.0f ) {
  702. length = 360.0f;
  703. }
  704. axis = GetAxis( id );
  705. vec = axis[2];
  706. if ( idMath::Fabs( dir * vec ) > 0.99f ) {
  707. vec = axis[0];
  708. }
  709. vec -= vec * dir * vec;
  710. vec.Normalize();
  711. vec *= 4.0f;
  712. start = org + vec;
  713. for ( a = 20.0f; a < length; a += 20.0f ) {
  714. end = org + idRotation( vec3_origin, dir, -a ).ToMat3() * vec;
  715. gameRenderWorld->DebugLine( colorBlue, start, end, 1 );
  716. start = end;
  717. }
  718. end = org + idRotation( vec3_origin, dir, -length ).ToMat3() * vec;
  719. gameRenderWorld->DebugArrow( colorBlue, start, end, 1 );
  720. }
  721. }
  722. /*
  723. ================
  724. idPhysics_Base::WriteToSnapshot
  725. ================
  726. */
  727. void idPhysics_Base::WriteToSnapshot( idBitMsgDelta &msg ) const {
  728. }
  729. /*
  730. ================
  731. idPhysics_Base::ReadFromSnapshot
  732. ================
  733. */
  734. void idPhysics_Base::ReadFromSnapshot( const idBitMsgDelta &msg ) {
  735. }