Physics_Static.cpp 18 KB

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