I'm coding a 2D collision engine, and I need to merge adjacent axis-aligned bounding boxes depending on a direction (left, right, top, bottom).
The four cases are very similar, except for the if condition, and the push_back argument. Is there any way I can refactor this code without compromising performance?
vector<AABB> getMergedAABBSLeft(vector<AABB> mSource)
{
vector<AABB> result;
while(!mSource.empty())
{
bool merged{false}; AABB a{mSource.back()}; mSource.pop_back();
for(auto& b : mSource)
if(a.getRight() == b.getRight())
{
result.push_back(getMergedAABBVertically(a, b));
eraseRemove(mSource, b); merged = true; break;
}
if(!merged) result.push_back(a);
}
return result;
}
vector<AABB> getMergedAABBSRight(vector<AABB> mSource)
{
vector<AABB> result;
while(!mSource.empty())
{
bool merged{false}; AABB a{mSource.back()}; mSource.pop_back();
for(auto& b : mSource)
if(a.getLeft() == b.getLeft())
{
result.push_back(getMergedAABBVertically(a, b));
eraseRemove(mSource, b); merged = true; break;
}
if(!merged) result.push_back(a);
}
return result;
}
vector<AABB> getMergedAABBSTop(vector<AABB> mSource)
{
vector<AABB> result;
while(!mSource.empty())
{
bool merged{false}; AABB a{mSource.back()}; mSource.pop_back();
for(auto& b : mSource)
if(a.getBottom() == b.getBottom())
{
result.push_back(getMergedAABBHorizontally(a, b));
eraseRemove(mSource, b); merged = true; break;
}
if(!merged) result.push_back(a);
}
return result;
}
vector<AABB> getMergedAABBSBottom(vector<AABB> mSource)
{
vector<AABB> result;
while(!mSource.empty())
{
bool merged{false}; AABB a{mSource.back()}; mSource.pop_back();
for(auto& b : mSource)
if(a.getTop() == b.getTop())
{
result.push_back(getMergedAABBHorizontally(a, b));
eraseRemove(mSource, b); merged = true; break;
}
if(!merged) result.push_back(a);
}
return result;
}