b2Controller.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 "b2Controller.h"
  19. #include "../../Common/b2BlockAllocator.h"
  20. b2Controller::~b2Controller()
  21. {
  22. //Remove attached bodies
  23. Clear();
  24. }
  25. void b2Controller::AddBody(b2Body* body)
  26. {
  27. void* mem = m_world->m_blockAllocator.Allocate(sizeof(b2ControllerEdge));
  28. b2ControllerEdge* edge = new (mem) b2ControllerEdge;
  29. edge->body = body;
  30. edge->controller = this;
  31. //Add edge to controller list
  32. edge->nextBody = m_bodyList;
  33. edge->prevBody = NULL;
  34. if(m_bodyList)
  35. m_bodyList->prevBody = edge;
  36. m_bodyList = edge;
  37. ++m_bodyCount;
  38. //Add edge to body list
  39. edge->nextController = body->m_controllerList;
  40. edge->prevController = NULL;
  41. if(body->m_controllerList)
  42. body->m_controllerList->prevController = edge;
  43. body->m_controllerList = edge;
  44. }
  45. void b2Controller::RemoveBody(b2Body* body)
  46. {
  47. //Assert that the controller is not empty
  48. b2Assert(m_bodyCount>0);
  49. //Find the corresponding edge
  50. b2ControllerEdge* edge = m_bodyList;
  51. while(edge && edge->body!=body)
  52. edge = edge->nextBody;
  53. //Assert that we are removing a body that is currently attached to the controller
  54. b2Assert(edge!=NULL);
  55. //Remove edge from controller list
  56. if(edge->prevBody)
  57. edge->prevBody->nextBody = edge->nextBody;
  58. if(edge->nextBody)
  59. edge->nextBody->prevBody = edge->prevBody;
  60. if(edge == m_bodyList)
  61. m_bodyList = edge->nextBody;
  62. --m_bodyCount;
  63. //Remove edge from body list
  64. if(edge->prevController)
  65. edge->prevController->nextController = edge->nextController;
  66. if(edge->nextController)
  67. edge->nextController->prevController = edge->prevController;
  68. if(edge == body->m_controllerList)
  69. body->m_controllerList = edge->nextController;
  70. //Free the edge
  71. m_world->m_blockAllocator.Free(edge, sizeof(b2ControllerEdge));
  72. }
  73. void b2Controller::Clear(){
  74. while(m_bodyList)
  75. {
  76. b2ControllerEdge* edge = m_bodyList;
  77. //Remove edge from controller list
  78. m_bodyList = edge->nextBody;
  79. //Remove edge from body list
  80. if(edge->prevController)
  81. edge->prevController->nextController = edge->nextController;
  82. if(edge->nextController)
  83. edge->nextController->prevController = edge->prevController;
  84. if(edge == edge->body->m_controllerList)
  85. edge->body->m_controllerList = edge->nextController;
  86. //Free the edge
  87. m_world->m_blockAllocator.Free(edge, sizeof(b2ControllerEdge));
  88. }
  89. m_bodyCount = 0;
  90. }