Skip to content

Commit

Permalink
Added parallelism to computing covers
Browse files Browse the repository at this point in the history
  • Loading branch information
Vitek1425 committed May 6, 2018
1 parent 5732c80 commit 9a6a86b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 25 deletions.
46 changes: 25 additions & 21 deletions src/xrGame/cover_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
#include "xrAICore/Navigation/level_graph.h"
#include "cover_manager.h"
#include "ai_space.h"
Expand All @@ -33,7 +35,7 @@ CCoverManager::~CCoverManager()
xr_delete(m_smart_covers_storage);
}

IC bool CCoverManager::edge_vertex(u32 index)
IC bool CCoverManager::edge_vertex(u32 index) const
{
CLevelGraph::CVertex* v = ai().level_graph().vertex(index);
return ((!ai().level_graph().valid_vertex_id(v->link(0)) && (v->high_cover(0) < MIN_COVER_VALUE)) ||
Expand All @@ -46,21 +48,21 @@ IC bool CCoverManager::edge_vertex(u32 index)
(!ai().level_graph().valid_vertex_id(v->link(3)) && (v->low_cover(3) < MIN_COVER_VALUE)));
}

IC bool CCoverManager::cover(CLevelGraph::CVertex* v, u32 index0, u32 index1)
IC bool CCoverManager::cover(CLevelGraph::CVertex* v, u32 index0, u32 index1) const
{
return (ai().level_graph().valid_vertex_id(v->link(index0)) &&
ai().level_graph().valid_vertex_id(ai().level_graph().vertex(v->link(index0))->link(index1)) &&
m_temp[ai().level_graph().vertex(v->link(index0))->link(index1)]);
}

IC bool CCoverManager::critical_point(CLevelGraph::CVertex* v, u32 index, u32 index0, u32 index1)
IC bool CCoverManager::critical_point(CLevelGraph::CVertex* v, u32 index, u32 index0, u32 index1) const
{
return (!ai().level_graph().valid_vertex_id(v->link(index)) &&
(!ai().level_graph().valid_vertex_id(v->link(index0)) || !ai().level_graph().valid_vertex_id(v->link(index1)) ||
cover(v, index0, index) || cover(v, index1, index)));
}

IC bool CCoverManager::critical_cover(u32 index)
IC bool CCoverManager::critical_cover(u32 index) const
{
CLevelGraph::CVertex* v = ai().level_graph().vertex(index);
return (critical_point(v, 0, 1, 3) || critical_point(v, 2, 1, 3) || critical_point(v, 1, 0, 2) ||
Expand All @@ -75,25 +77,27 @@ void CCoverManager::compute_static_cover()
ai().level_graph().header().box(), ai().level_graph().header().cell_size() * .5f, 8 * 65536, 4 * 65536);
m_temp.resize(ai().level_graph().header().vertex_count());

CLevelGraph const& graph = ai().level_graph();
u32 levelVertexCount = ai().level_graph().header().vertex_count();
for (u32 i = 0; i < levelVertexCount; ++i)
{
CLevelGraph::CVertex const& vertex = *graph.vertex(i);
if (vertex.high_cover(0) + vertex.high_cover(1) + vertex.high_cover(2) + vertex.high_cover(3))
const CLevelGraph& graph = ai().level_graph();
const u32 levelVertexCount = ai().level_graph().header().vertex_count();
tbb::parallel_for(tbb::blocked_range<u32>(0, levelVertexCount), [&](const tbb::blocked_range<u32>& range) {
for (u32 i = range.begin(); i != range.end(); ++i)
{
m_temp[i] = edge_vertex(i);
continue;
const CLevelGraph::CVertex& vertex = *graph.vertex(i);
if (vertex.high_cover(0) + vertex.high_cover(1) + vertex.high_cover(2) + vertex.high_cover(3))
{
m_temp[i] = edge_vertex(i);
continue;
}

if (vertex.low_cover(0) + vertex.low_cover(1) + vertex.low_cover(2) + vertex.low_cover(3))
{
m_temp[i] = edge_vertex(i);
continue;
}

m_temp[i] = false;
}

if (vertex.low_cover(0) + vertex.low_cover(1) + vertex.low_cover(2) + vertex.low_cover(3))
{
m_temp[i] = edge_vertex(i);
continue;
}

m_temp[i] = false;
}
});

for (u32 i = 0; i < levelVertexCount; ++i)
if (m_temp[i] && critical_cover(i))
Expand Down
8 changes: 4 additions & 4 deletions src/xrGame/cover_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ class CCoverManager
mutable bool m_smart_covers_actual;

protected:
IC bool edge_vertex(u32 index);
IC bool cover(LevelGraph::CVertex* v, u32 index0, u32 index1);
IC bool critical_point(LevelGraph::CVertex* v, u32 index, u32 index0, u32 index1);
IC bool critical_cover(u32 index);
IC bool edge_vertex(u32 index) const;
IC bool cover(LevelGraph::CVertex* v, u32 index0, u32 index1) const;
IC bool critical_point(LevelGraph::CVertex* v, u32 index, u32 index0, u32 index1) const;
IC bool critical_cover(u32 index) const;

private:
template <typename _evaluator_type, typename _restrictor_type>
Expand Down

0 comments on commit 9a6a86b

Please sign in to comment.