b2Controller.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:4k
- /*
- * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- */
- #ifndef B2_CONTROLLER_H
- #define B2_CONTROLLER_H
- #include "../../Dynamics/b2World.h"
- #include "../../Dynamics/b2Body.h"
- class b2Body;
- class b2World;
- class b2Controller;
- /// A controller edge is used to connect bodies and controllers together
- /// in a bipartite graph.
- struct b2ControllerEdge
- {
- b2Controller* controller; ///< provides quick access to other end of this edge.
- b2Body* body; ///< the body
- b2ControllerEdge* prevBody; ///< the previous controller edge in the controllers's joint list
- b2ControllerEdge* nextBody; ///< the next controller edge in the controllers's joint list
- b2ControllerEdge* prevController; ///< the previous controller edge in the body's joint list
- b2ControllerEdge* nextController; ///< the next controller edge in the body's joint list
- };
- class b2ControllerDef;
- /// Base class for controllers. Controllers are a convience for encapsulating common
- /// per-step functionality.
- class b2Controller
- {
- public:
- virtual ~b2Controller();
- /// Controllers override this to implement per-step functionality.
- virtual void Step(const b2TimeStep& step) = 0;
- /// Controllers override this to provide debug drawing.
- virtual void Draw(b2DebugDraw *debugDraw) {B2_NOT_USED(debugDraw);};
- /// Adds a body to the controller list.
- void AddBody(b2Body* body);
- /// Removes a body from the controller list.
- void RemoveBody(b2Body* body);
- /// Removes all bodies from the controller list.
- void Clear();
- /// Get the next controller in the world's body list.
- b2Controller* GetNext();
- const b2Controller* GetNext() const;
- /// Get the parent world of this body.
- b2World* GetWorld();
- const b2World* GetWorld() const;
- /// Get the attached body list
- b2ControllerEdge* GetBodyList();
- const b2ControllerEdge* GetBodyList() const;
- protected:
- friend class b2World;
- b2World* m_world;
- b2ControllerEdge* m_bodyList;
- int32 m_bodyCount;
- b2Controller(const b2ControllerDef* def):
- m_world(NULL),
- m_bodyList(NULL),
- m_bodyCount(0),
- m_prev(NULL),
- m_next(NULL)
-
- {
- B2_NOT_USED(def);
- }
- virtual void Destroy(b2BlockAllocator* allocator) = 0;
- private:
- b2Controller* m_prev;
- b2Controller* m_next;
- static void Destroy(b2Controller* controller, b2BlockAllocator* allocator);
- };
- class b2ControllerDef
- {
- public:
- virtual ~b2ControllerDef() {};
-
- private:
- friend class b2World;
- virtual b2Controller* Create(b2BlockAllocator* allocator) const = 0;
- };
- inline b2Controller* b2Controller::GetNext()
- {
- return m_next;
- }
- inline const b2Controller* b2Controller::GetNext() const
- {
- return m_next;
- }
- inline b2World* b2Controller::GetWorld()
- {
- return m_world;
- }
- inline const b2World* b2Controller::GetWorld() const
- {
- return m_world;
- }
- inline b2ControllerEdge* b2Controller::GetBodyList()
- {
- return m_bodyList;
- }
- inline const b2ControllerEdge* b2Controller::GetBodyList() const
- {
- return m_bodyList;
- }
- inline void b2Controller::Destroy(b2Controller* controller, b2BlockAllocator* allocator)
- {
- controller->Destroy(allocator);
- }
- #endif