Skip to content

Commit

Permalink
xrGame/obstacles_query.cpp: cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Apr 24, 2018
1 parent 4038665 commit 067a10d
Showing 1 changed file with 34 additions and 44 deletions.
78 changes: 34 additions & 44 deletions src/xrGame/obstacles_query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@

void obstacles_query::set_intersection(const obstacles_query& query)
{
u32 n = m_obstacles.size();
u32 buffer_size = n * sizeof(OBSTACLES::value_type);
// XXX: probably replace alloca
const u32 n = m_obstacles.size();
const u32 buffer_size = n * sizeof(OBSTACLES::value_type);
OBSTACLES::value_type* temp = (OBSTACLES::value_type*)_alloca(buffer_size);
memcpy(temp, &*obstacles().begin(), buffer_size);
m_obstacles.erase(
Expand All @@ -36,14 +37,12 @@ void obstacles_query::set_intersection(const obstacles_query& query)

void obstacles_query::merge(const AREA& object_area)
{
u32 area_size = m_area.size();
u32 destination_size = area_size + object_area.size();
u32 buffer_size = destination_size * sizeof(u32);
u32* temp = (u32*)_alloca(buffer_size);
memcpy(temp, &*m_area.begin(), area_size * sizeof(u32));
AREA temp(std::move(m_area));
const u32 area_size = temp.size();
const u32 destination_size = area_size + object_area.size();
m_area.resize(destination_size);
m_area.erase(
std::set_union(temp, temp + area_size, object_area.begin(), object_area.end(), m_area.begin()), m_area.end());
std::set_union(temp.begin(), temp.end(), object_area.begin(), object_area.end(), m_area.begin()), m_area.end());
}

void obstacles_query::compute_area()
Expand All @@ -53,23 +52,20 @@ void obstacles_query::compute_area()
m_area.clear();

m_crc = 0;
OBSTACLES::iterator I = m_obstacles.begin();
OBSTACLES::iterator E = m_obstacles.end();
for (; I != E; ++I)

for (auto& it : m_obstacles)
{
ai_obstacle& obstacle = (*I).first->obstacle();
ai_obstacle& obstacle = it.first->obstacle();
merge(obstacle.area());
(*I).second = obstacle.crc();
m_crc ^= (*I).second;
it.second = obstacle.crc();
m_crc ^= it.second;
}
}

void obstacles_query::merge(const obstacles_query& query)
{
OBSTACLES::const_iterator I = query.obstacles().begin();
OBSTACLES::const_iterator E = query.obstacles().end();
for (; I != E; ++I)
add((*I).first);
for (const auto& it : query.obstacles())
add(it.first);
}

bool obstacles_query::merge(const Fvector& position, const float& radius, const obstacles_query& query)
Expand All @@ -85,27 +81,25 @@ bool obstacles_query::merge(const Fvector& position, const float& radius, const
return (true);
}

u32 crc_before = crc();
const u32 crc_before = crc();
compute_area();
return (crc() != crc_before);
return crc() != crc_before;
}

bool obstacles_query::objects_changed(const Fvector& position, const float& radius) const
{
OBSTACLES::const_iterator I = obstacles().begin();
OBSTACLES::const_iterator E = obstacles().end();
for (; I != E; ++I)
for (const auto& it : obstacles())
{
if ((*I).first->obstacle().crc() == (*I).second)
if (it.first->obstacle().crc() == it.second)
continue;

if ((*I).first->obstacle().distance_to(position) >= radius)
if (it.first->obstacle().distance_to(position) >= radius)
continue;

return (true);
return true;
}

return (false);
return false;
}

struct too_far_predicate
Expand All @@ -121,44 +115,40 @@ struct too_far_predicate

IC bool operator()(const std::pair<const CGameObject*, u32>& object) const
{
typedef obstacles_query::AREA AREA;
const AREA& area = object.first->obstacle().area();
AREA::const_iterator I = area.begin();
AREA::const_iterator E = area.end();
for (; I != E; ++I)
for (const auto& it : object.first->obstacle().area())
{
Fvector vertex_position = ai().level_graph().vertex_position(*I);
Fvector vertex_position = ai().level_graph().vertex_position(it);
const float distance_sqr = vertex_position.distance_to_sqr(m_position);
if (distance_sqr < m_radius_sqr)
return (false);
return false;
}

return (true);
return true;
}
};

bool obstacles_query::remove_objects(const Fvector& position, const float& radius)
{
update_objects(position, radius);

OBSTACLES::iterator I = std::remove_if(m_obstacles.begin(), m_obstacles.end(), too_far_predicate(position, radius));
const auto iterator = std::remove_if(m_obstacles.begin(), m_obstacles.end(), too_far_predicate(position, radius));

if (I == m_obstacles.end())
return (false);
if (iterator == m_obstacles.end())
return false;

m_obstacles.erase(I, m_obstacles.end());
m_obstacles.erase(iterator, m_obstacles.end());

m_actual = false;
u32 crc_before = crc();
const u32 crc_before = crc();
compute_area();
return (crc_before != crc());
return crc_before != crc();
}

void obstacles_query::remove_links(IGameObject* object)
{
OBSTACLES::iterator I = m_obstacles.find(smart_cast<CGameObject*>(object));
if (I == m_obstacles.end())
const auto iterator = m_obstacles.find(smart_cast<CGameObject*>(object));
if (iterator == m_obstacles.end())
return;

m_obstacles.erase(I);
m_obstacles.erase(iterator);
}

0 comments on commit 067a10d

Please sign in to comment.