b2GravityController.cpp
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:3k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty.  In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. * Permission is granted to anyone to use this software for any purpose,
  8. * including commercial applications, and to alter it and redistribute it
  9. * freely, subject to the following restrictions:
  10. * 1. The origin of this software must not be misrepresented; you must not
  11. * claim that you wrote the original software. If you use this software
  12. * in a product, an acknowledgment in the product documentation would be
  13. * appreciated but is not required.
  14. * 2. Altered source versions must be plainly marked as such, and must not be
  15. * misrepresented as being the original software.
  16. * 3. This notice may not be removed or altered from any source distribution.
  17. */
  18. #include "b2GravityController.h"
  19. b2GravityController::b2GravityController(const b2GravityControllerDef* def) : b2Controller(def)
  20. {
  21. G = def->G;
  22. invSqr = def->invSqr;
  23. }
  24. void b2GravityController::Step(const b2TimeStep& step)
  25. {
  26. B2_NOT_USED(step);
  27. if(invSqr){
  28. for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){
  29. b2Body* body1 = i->body;
  30. for(b2ControllerEdge *j=m_bodyList;j!=i;j=j->nextBody){
  31. b2Body* body2 = j->body;
  32. b2Vec2 d = body2->GetWorldCenter() - body1->GetWorldCenter();
  33. float32 r2 = d.LengthSquared();
  34. if(r2 < B2_FLT_EPSILON)
  35. continue;
  36. b2Vec2 f = G / r2 / sqrt(r2) * body1->GetMass() * body2->GetMass() * d;
  37. body1->ApplyForce(f      , body1->GetWorldCenter());
  38. body2->ApplyForce(-1.0f*f, body2->GetWorldCenter());
  39. }
  40. }
  41. }else{
  42. for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){
  43. b2Body* body1 = i->body;
  44. for(b2ControllerEdge *j=m_bodyList;j!=i;j=j->nextBody){
  45. b2Body* body2 = j->body;
  46. b2Vec2 d = body2->GetWorldCenter() - body1->GetWorldCenter();
  47. float32 r2 = d.LengthSquared();
  48. if(r2 < B2_FLT_EPSILON)
  49. continue;
  50. b2Vec2 f = G / r2 * body1->GetMass() * body2->GetMass() * d;
  51. body1->ApplyForce(f      , body1->GetWorldCenter());
  52. body2->ApplyForce(-1.0f*f, body2->GetWorldCenter());
  53. }
  54. }
  55. }
  56. }
  57. void b2GravityController::Destroy(b2BlockAllocator* allocator)
  58. {
  59. allocator->Free(this, sizeof(b2GravityController));
  60. }
  61. b2GravityController* b2GravityControllerDef::Create(b2BlockAllocator* allocator) const
  62. {
  63. void* mem = allocator->Allocate(sizeof(b2GravityController));
  64. return new (mem) b2GravityController(this);
  65. }