1 /* 2 * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org 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 19 #ifndef B2_ISLAND_H 20 #define B2_ISLAND_H 21 22 #include "../Common/b2Math.h" 23 #include "b2Body.h" 24 #include "b2TimeStep.h" 25 26 class b2Contact; 27 class b2Joint; 28 class b2StackAllocator; 29 class b2ContactListener; 30 struct b2ContactVelocityConstraint; 31 struct b2Profile; 32 33 /// This is an internal class. 34 class b2Island 35 { 36 public: 37 b2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity, 38 b2StackAllocator* allocator, b2ContactListener* listener); 39 ~b2Island(); 40 Clear()41 void Clear() 42 { 43 m_bodyCount = 0; 44 m_contactCount = 0; 45 m_jointCount = 0; 46 } 47 48 void Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep); 49 50 void SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB); 51 Add(b2Body * body)52 void Add(b2Body* body) 53 { 54 b2Assert(m_bodyCount < m_bodyCapacity); 55 body->m_islandIndex = m_bodyCount; 56 m_bodies[m_bodyCount] = body; 57 ++m_bodyCount; 58 } 59 Add(b2Contact * contact)60 void Add(b2Contact* contact) 61 { 62 b2Assert(m_contactCount < m_contactCapacity); 63 m_contacts[m_contactCount++] = contact; 64 } 65 Add(b2Joint * joint)66 void Add(b2Joint* joint) 67 { 68 b2Assert(m_jointCount < m_jointCapacity); 69 m_joints[m_jointCount++] = joint; 70 } 71 72 void Report(const b2ContactVelocityConstraint* constraints); 73 74 b2StackAllocator* m_allocator; 75 b2ContactListener* m_listener; 76 77 b2Body** m_bodies; 78 b2Contact** m_contacts; 79 b2Joint** m_joints; 80 81 b2Position* m_positions; 82 b2Velocity* m_velocities; 83 84 int32 m_bodyCount; 85 int32 m_jointCount; 86 int32 m_contactCount; 87 88 int32 m_bodyCapacity; 89 int32 m_contactCapacity; 90 int32 m_jointCapacity; 91 }; 92 93 #endif 94