| /* | |
| * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org | |
| * | |
| * 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. | |
| */ | |
| #include <Box2D/Collision/b2BroadPhase.h> | |
| #include <cstring> | |
| using namespace std; | |
| b2BroadPhase::b2BroadPhase() | |
| { | |
| m_proxyCount = 0; | |
| m_pairCapacity = 16; | |
| m_pairCount = 0; | |
| m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); | |
| m_moveCapacity = 16; | |
| m_moveCount = 0; | |
| m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); | |
| } | |
| b2BroadPhase::~b2BroadPhase() | |
| { | |
| b2Free(m_moveBuffer); | |
| b2Free(m_pairBuffer); | |
| } | |
| int32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData) | |
| { | |
| int32 proxyId = m_tree.CreateProxy(aabb, userData); | |
| ++m_proxyCount; | |
| BufferMove(proxyId); | |
| return proxyId; | |
| } | |
| void b2BroadPhase::DestroyProxy(int32 proxyId) | |
| { | |
| UnBufferMove(proxyId); | |
| --m_proxyCount; | |
| m_tree.DestroyProxy(proxyId); | |
| } | |
| void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) | |
| { | |
| bool buffer = m_tree.MoveProxy(proxyId, aabb, displacement); | |
| if (buffer) | |
| { | |
| BufferMove(proxyId); | |
| } | |
| } | |
| void b2BroadPhase::TouchProxy(int32 proxyId) | |
| { | |
| BufferMove(proxyId); | |
| } | |
| void b2BroadPhase::BufferMove(int32 proxyId) | |
| { | |
| if (m_moveCount == m_moveCapacity) | |
| { | |
| int32* oldBuffer = m_moveBuffer; | |
| m_moveCapacity *= 2; | |
| m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); | |
| memcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32)); | |
| b2Free(oldBuffer); | |
| } | |
| m_moveBuffer[m_moveCount] = proxyId; | |
| ++m_moveCount; | |
| } | |
| void b2BroadPhase::UnBufferMove(int32 proxyId) | |
| { | |
| for (int32 i = 0; i < m_moveCount; ++i) | |
| { | |
| if (m_moveBuffer[i] == proxyId) | |
| { | |
| m_moveBuffer[i] = e_nullProxy; | |
| return; | |
| } | |
| } | |
| } | |
| // This is called from b2DynamicTree::Query when we are gathering pairs. | |
| bool b2BroadPhase::QueryCallback(int32 proxyId) | |
| { | |
| // A proxy cannot form a pair with itself. | |
| if (proxyId == m_queryProxyId) | |
| { | |
| return true; | |
| } | |
| // Grow the pair buffer as needed. | |
| if (m_pairCount == m_pairCapacity) | |
| { | |
| b2Pair* oldBuffer = m_pairBuffer; | |
| m_pairCapacity *= 2; | |
| m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); | |
| memcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair)); | |
| b2Free(oldBuffer); | |
| } | |
| m_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId); | |
| m_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId); | |
| ++m_pairCount; | |
| return true; | |
| } |