Physics_Base.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856
  1. /*
  2. ===========================================================================
  3. Doom 3 BFG Edition GPL Source Code
  4. Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
  5. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
  6. Doom 3 BFG Edition 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 BFG Edition 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 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
  16. In addition, the Doom 3 BFG Edition 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 BFG Edition 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. #pragma hdrstop
  21. #include "../../idlib/precompiled.h"
  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() {
  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() {
  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() 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::Interpolate
  195. ================
  196. */
  197. bool idPhysics_Base::Interpolate( const float fraction ) {
  198. return false;
  199. }
  200. /*
  201. ================
  202. idPhysics_Base::ResetInterpolationState
  203. ================
  204. */
  205. void idPhysics_Base::ResetInterpolationState( const idVec3 & origin, const idMat3 & axis ) {
  206. }
  207. /*
  208. ================
  209. idPhysics_Base::UpdateTime
  210. ================
  211. */
  212. void idPhysics_Base::UpdateTime( int endTimeMSec ) {
  213. }
  214. /*
  215. ================
  216. idPhysics_Base::GetTime
  217. ================
  218. */
  219. int idPhysics_Base::GetTime() const {
  220. return 0;
  221. }
  222. /*
  223. ================
  224. idPhysics_Base::GetImpactInfo
  225. ================
  226. */
  227. void idPhysics_Base::GetImpactInfo( const int id, const idVec3 &point, impactInfo_t *info ) const {
  228. memset( info, 0, sizeof( *info ) );
  229. }
  230. /*
  231. ================
  232. idPhysics_Base::ApplyImpulse
  233. ================
  234. */
  235. void idPhysics_Base::ApplyImpulse( const int id, const idVec3 &point, const idVec3 &impulse ) {
  236. }
  237. /*
  238. ================
  239. idPhysics_Base::AddForce
  240. ================
  241. */
  242. void idPhysics_Base::AddForce( const int id, const idVec3 &point, const idVec3 &force ) {
  243. }
  244. /*
  245. ================
  246. idPhysics_Base::Activate
  247. ================
  248. */
  249. void idPhysics_Base::Activate() {
  250. }
  251. /*
  252. ================
  253. idPhysics_Base::PutToRest
  254. ================
  255. */
  256. void idPhysics_Base::PutToRest() {
  257. }
  258. /*
  259. ================
  260. idPhysics_Base::IsAtRest
  261. ================
  262. */
  263. bool idPhysics_Base::IsAtRest() const {
  264. return true;
  265. }
  266. /*
  267. ================
  268. idPhysics_Base::GetRestStartTime
  269. ================
  270. */
  271. int idPhysics_Base::GetRestStartTime() const {
  272. return 0;
  273. }
  274. /*
  275. ================
  276. idPhysics_Base::IsPushable
  277. ================
  278. */
  279. bool idPhysics_Base::IsPushable() const {
  280. return true;
  281. }
  282. /*
  283. ================
  284. idPhysics_Base::SaveState
  285. ================
  286. */
  287. void idPhysics_Base::SaveState() {
  288. }
  289. /*
  290. ================
  291. idPhysics_Base::RestoreState
  292. ================
  293. */
  294. void idPhysics_Base::RestoreState() {
  295. }
  296. /*
  297. ================
  298. idPhysics_Base::SetOrigin
  299. ================
  300. */
  301. void idPhysics_Base::SetOrigin( const idVec3 &newOrigin, int id ) {
  302. }
  303. /*
  304. ================
  305. idPhysics_Base::SetAxis
  306. ================
  307. */
  308. void idPhysics_Base::SetAxis( const idMat3 &newAxis, int id ) {
  309. }
  310. /*
  311. ================
  312. idPhysics_Base::Translate
  313. ================
  314. */
  315. void idPhysics_Base::Translate( const idVec3 &translation, int id ) {
  316. }
  317. /*
  318. ================
  319. idPhysics_Base::Rotate
  320. ================
  321. */
  322. void idPhysics_Base::Rotate( const idRotation &rotation, int id ) {
  323. }
  324. /*
  325. ================
  326. idPhysics_Base::GetOrigin
  327. ================
  328. */
  329. const idVec3 &idPhysics_Base::GetOrigin( int id ) const {
  330. return vec3_origin;
  331. }
  332. /*
  333. ================
  334. idPhysics_Base::GetAxis
  335. ================
  336. */
  337. const idMat3 &idPhysics_Base::GetAxis( int id ) const {
  338. return mat3_identity;
  339. }
  340. /*
  341. ================
  342. idPhysics_Base::SetLinearVelocity
  343. ================
  344. */
  345. void idPhysics_Base::SetLinearVelocity( const idVec3 &newLinearVelocity, int id ) {
  346. }
  347. /*
  348. ================
  349. idPhysics_Base::SetAngularVelocity
  350. ================
  351. */
  352. void idPhysics_Base::SetAngularVelocity( const idVec3 &newAngularVelocity, int id ) {
  353. }
  354. /*
  355. ================
  356. idPhysics_Base::GetLinearVelocity
  357. ================
  358. */
  359. const idVec3 &idPhysics_Base::GetLinearVelocity( int id ) const {
  360. return vec3_origin;
  361. }
  362. /*
  363. ================
  364. idPhysics_Base::GetAngularVelocity
  365. ================
  366. */
  367. const idVec3 &idPhysics_Base::GetAngularVelocity( int id ) const {
  368. return vec3_origin;
  369. }
  370. /*
  371. ================
  372. idPhysics_Base::SetGravity
  373. ================
  374. */
  375. void idPhysics_Base::SetGravity( const idVec3 &newGravity ) {
  376. gravityVector = newGravity;
  377. gravityNormal = newGravity;
  378. gravityNormal.Normalize();
  379. }
  380. /*
  381. ================
  382. idPhysics_Base::GetGravity
  383. ================
  384. */
  385. const idVec3 &idPhysics_Base::GetGravity() const {
  386. return gravityVector;
  387. }
  388. /*
  389. ================
  390. idPhysics_Base::GetGravityNormal
  391. ================
  392. */
  393. const idVec3 &idPhysics_Base::GetGravityNormal() const {
  394. return gravityNormal;
  395. }
  396. /*
  397. ================
  398. idPhysics_Base::ClipTranslation
  399. ================
  400. */
  401. void idPhysics_Base::ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const {
  402. memset( &results, 0, sizeof( trace_t ) );
  403. }
  404. /*
  405. ================
  406. idPhysics_Base::ClipRotation
  407. ================
  408. */
  409. void idPhysics_Base::ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const {
  410. memset( &results, 0, sizeof( trace_t ) );
  411. }
  412. /*
  413. ================
  414. idPhysics_Base::ClipContents
  415. ================
  416. */
  417. int idPhysics_Base::ClipContents( const idClipModel *model ) const {
  418. return 0;
  419. }
  420. /*
  421. ================
  422. idPhysics_Base::DisableClip
  423. ================
  424. */
  425. void idPhysics_Base::DisableClip() {
  426. }
  427. /*
  428. ================
  429. idPhysics_Base::EnableClip
  430. ================
  431. */
  432. void idPhysics_Base::EnableClip() {
  433. }
  434. /*
  435. ================
  436. idPhysics_Base::UnlinkClip
  437. ================
  438. */
  439. void idPhysics_Base::UnlinkClip() {
  440. }
  441. /*
  442. ================
  443. idPhysics_Base::LinkClip
  444. ================
  445. */
  446. void idPhysics_Base::LinkClip() {
  447. }
  448. /*
  449. ================
  450. idPhysics_Base::EvaluateContacts
  451. ================
  452. */
  453. bool idPhysics_Base::EvaluateContacts() {
  454. return false;
  455. }
  456. /*
  457. ================
  458. idPhysics_Base::GetNumContacts
  459. ================
  460. */
  461. int idPhysics_Base::GetNumContacts() const {
  462. return contacts.Num();
  463. }
  464. /*
  465. ================
  466. idPhysics_Base::GetContact
  467. ================
  468. */
  469. const contactInfo_t &idPhysics_Base::GetContact( int num ) const {
  470. return contacts[num];
  471. }
  472. /*
  473. ================
  474. idPhysics_Base::ClearContacts
  475. ================
  476. */
  477. void idPhysics_Base::ClearContacts() {
  478. int i;
  479. idEntity *ent;
  480. for ( i = 0; i < contacts.Num(); i++ ) {
  481. ent = gameLocal.entities[ contacts[i].entityNum ];
  482. if ( ent ) {
  483. ent->RemoveContactEntity( self );
  484. }
  485. }
  486. contacts.SetNum( 0 );
  487. }
  488. /*
  489. ================
  490. idPhysics_Base::AddContactEntity
  491. ================
  492. */
  493. void idPhysics_Base::AddContactEntity( idEntity *e ) {
  494. int i;
  495. idEntity *ent;
  496. bool found = false;
  497. for ( i = 0; i < contactEntities.Num(); i++ ) {
  498. ent = contactEntities[i].GetEntity();
  499. if ( ent == NULL ) {
  500. contactEntities.RemoveIndex( i-- );
  501. }
  502. if ( ent == e ) {
  503. found = true;
  504. }
  505. }
  506. if ( !found ) {
  507. contactEntities.Alloc() = e;
  508. }
  509. }
  510. /*
  511. ================
  512. idPhysics_Base::RemoveContactEntity
  513. ================
  514. */
  515. void idPhysics_Base::RemoveContactEntity( idEntity *e ) {
  516. int i;
  517. idEntity *ent;
  518. for ( i = 0; i < contactEntities.Num(); i++ ) {
  519. ent = contactEntities[i].GetEntity();
  520. if ( !ent ) {
  521. contactEntities.RemoveIndex( i-- );
  522. continue;
  523. }
  524. if ( ent == e ) {
  525. contactEntities.RemoveIndex( i-- );
  526. return;
  527. }
  528. }
  529. }
  530. /*
  531. ================
  532. idPhysics_Base::HasGroundContacts
  533. ================
  534. */
  535. bool idPhysics_Base::HasGroundContacts() const {
  536. int i;
  537. for ( i = 0; i < contacts.Num(); i++ ) {
  538. if ( contacts[i].normal * -gravityNormal > 0.0f ) {
  539. return true;
  540. }
  541. }
  542. return false;
  543. }
  544. /*
  545. ================
  546. idPhysics_Base::IsGroundEntity
  547. ================
  548. */
  549. bool idPhysics_Base::IsGroundEntity( int entityNum ) const {
  550. int i;
  551. for ( i = 0; i < contacts.Num(); i++ ) {
  552. if ( contacts[i].entityNum == entityNum && ( contacts[i].normal * -gravityNormal > 0.0f ) ) {
  553. return true;
  554. }
  555. }
  556. return false;
  557. }
  558. /*
  559. ================
  560. idPhysics_Base::IsGroundClipModel
  561. ================
  562. */
  563. bool idPhysics_Base::IsGroundClipModel( int entityNum, int id ) const {
  564. int i;
  565. for ( i = 0; i < contacts.Num(); i++ ) {
  566. if ( contacts[i].entityNum == entityNum && contacts[i].id == id && ( contacts[i].normal * -gravityNormal > 0.0f ) ) {
  567. return true;
  568. }
  569. }
  570. return false;
  571. }
  572. /*
  573. ================
  574. idPhysics_Base::SetPushed
  575. ================
  576. */
  577. void idPhysics_Base::SetPushed( int deltaTime ) {
  578. }
  579. /*
  580. ================
  581. idPhysics_Base::GetPushedLinearVelocity
  582. ================
  583. */
  584. const idVec3 &idPhysics_Base::GetPushedLinearVelocity( const int id ) const {
  585. return vec3_origin;
  586. }
  587. /*
  588. ================
  589. idPhysics_Base::GetPushedAngularVelocity
  590. ================
  591. */
  592. const idVec3 &idPhysics_Base::GetPushedAngularVelocity( const int id ) const {
  593. return vec3_origin;
  594. }
  595. /*
  596. ================
  597. idPhysics_Base::SetMaster
  598. ================
  599. */
  600. void idPhysics_Base::SetMaster( idEntity *master, const bool orientated ) {
  601. }
  602. /*
  603. ================
  604. idPhysics_Base::GetBlockingInfo
  605. ================
  606. */
  607. const trace_t *idPhysics_Base::GetBlockingInfo() const {
  608. return NULL;
  609. }
  610. /*
  611. ================
  612. idPhysics_Base::GetBlockingEntity
  613. ================
  614. */
  615. idEntity *idPhysics_Base::GetBlockingEntity() const {
  616. return NULL;
  617. }
  618. /*
  619. ================
  620. idPhysics_Base::GetLinearEndTime
  621. ================
  622. */
  623. int idPhysics_Base::GetLinearEndTime() const {
  624. return 0;
  625. }
  626. /*
  627. ================
  628. idPhysics_Base::GetAngularEndTime
  629. ================
  630. */
  631. int idPhysics_Base::GetAngularEndTime() const {
  632. return 0;
  633. }
  634. /*
  635. ================
  636. idPhysics_Base::AddGroundContacts
  637. ================
  638. */
  639. void idPhysics_Base::AddGroundContacts( const idClipModel *clipModel ) {
  640. idVec6 dir;
  641. int index, num;
  642. index = contacts.Num();
  643. contacts.SetNum( index + 10 );
  644. dir.SubVec3(0) = gravityNormal;
  645. dir.SubVec3(1) = vec3_origin;
  646. num = gameLocal.clip.Contacts( &contacts[index], 10, clipModel->GetOrigin(),
  647. dir, CONTACT_EPSILON, clipModel, clipModel->GetAxis(), clipMask, self );
  648. contacts.SetNum( index + num );
  649. }
  650. /*
  651. ================
  652. idPhysics_Base::AddContactEntitiesForContacts
  653. ================
  654. */
  655. void idPhysics_Base::AddContactEntitiesForContacts() {
  656. int i;
  657. idEntity *ent;
  658. for ( i = 0; i < contacts.Num(); i++ ) {
  659. ent = gameLocal.entities[ contacts[i].entityNum ];
  660. if ( ent && ent != self ) {
  661. ent->AddContactEntity( self );
  662. }
  663. }
  664. }
  665. /*
  666. ================
  667. idPhysics_Base::ActivateContactEntities
  668. ================
  669. */
  670. void idPhysics_Base::ActivateContactEntities() {
  671. int i;
  672. idEntity *ent;
  673. for ( i = 0; i < contactEntities.Num(); i++ ) {
  674. ent = contactEntities[i].GetEntity();
  675. if ( ent ) {
  676. ent->ActivatePhysics( self );
  677. } else {
  678. contactEntities.RemoveIndex( i-- );
  679. }
  680. }
  681. }
  682. /*
  683. ================
  684. idPhysics_Base::IsOutsideWorld
  685. ================
  686. */
  687. bool idPhysics_Base::IsOutsideWorld() const {
  688. if ( !gameLocal.clip.GetWorldBounds().Expand( 128.0f ).IntersectsBounds( GetAbsBounds() ) ) {
  689. return true;
  690. }
  691. return false;
  692. }
  693. /*
  694. ================
  695. idPhysics_Base::DrawVelocity
  696. ================
  697. */
  698. void idPhysics_Base::DrawVelocity( int id, float linearScale, float angularScale ) const {
  699. idVec3 dir, org, vec, start, end;
  700. idMat3 axis;
  701. float length, a;
  702. dir = GetLinearVelocity( id );
  703. dir *= linearScale;
  704. if ( dir.LengthSqr() > Square( 0.1f ) ) {
  705. dir = dir.Truncate( 10.0f );
  706. org = GetOrigin( id );
  707. gameRenderWorld->DebugArrow( colorRed, org, org + dir, 1 );
  708. }
  709. dir = GetAngularVelocity( id );
  710. length = dir.Normalize();
  711. length *= angularScale;
  712. if ( length > 0.1f ) {
  713. if ( length < 60.0f ) {
  714. length = 60.0f;
  715. }
  716. else if ( length > 360.0f ) {
  717. length = 360.0f;
  718. }
  719. axis = GetAxis( id );
  720. vec = axis[2];
  721. if ( idMath::Fabs( dir * vec ) > 0.99f ) {
  722. vec = axis[0];
  723. }
  724. vec -= vec * dir * vec;
  725. vec.Normalize();
  726. vec *= 4.0f;
  727. start = org + vec;
  728. for ( a = 20.0f; a < length; a += 20.0f ) {
  729. end = org + idRotation( vec3_origin, dir, -a ).ToMat3() * vec;
  730. gameRenderWorld->DebugLine( colorBlue, start, end, 1 );
  731. start = end;
  732. }
  733. end = org + idRotation( vec3_origin, dir, -length ).ToMat3() * vec;
  734. gameRenderWorld->DebugArrow( colorBlue, start, end, 1 );
  735. }
  736. }
  737. /*
  738. ================
  739. idPhysics_Base::WriteToSnapshot
  740. ================
  741. */
  742. void idPhysics_Base::WriteToSnapshot( idBitMsg &msg ) const {
  743. }
  744. /*
  745. ================
  746. idPhysics_Base::ReadFromSnapshot
  747. ================
  748. */
  749. void idPhysics_Base::ReadFromSnapshot( const idBitMsg &msg ) {
  750. }