7
7
// //////////////////////////////////////////////////////////////////////////
8
8
9
9
#include " stdafx.h"
10
+ #include " tbb/parallel_for.h"
11
+ #include " tbb/blocked_range.h"
10
12
#include " xrAICore/Navigation/level_graph.h"
11
13
#include " cover_manager.h"
12
14
#include " ai_space.h"
@@ -33,7 +35,7 @@ CCoverManager::~CCoverManager()
33
35
xr_delete (m_smart_covers_storage);
34
36
}
35
37
36
- IC bool CCoverManager::edge_vertex (u32 index)
38
+ IC bool CCoverManager::edge_vertex (u32 index) const
37
39
{
38
40
CLevelGraph::CVertex* v = ai ().level_graph ().vertex (index);
39
41
return ((!ai ().level_graph ().valid_vertex_id (v->link (0 )) && (v->high_cover (0 ) < MIN_COVER_VALUE)) ||
@@ -46,21 +48,21 @@ IC bool CCoverManager::edge_vertex(u32 index)
46
48
(!ai ().level_graph ().valid_vertex_id (v->link (3 )) && (v->low_cover (3 ) < MIN_COVER_VALUE)));
47
49
}
48
50
49
- IC bool CCoverManager::cover (CLevelGraph::CVertex* v, u32 index0, u32 index1)
51
+ IC bool CCoverManager::cover (CLevelGraph::CVertex* v, u32 index0, u32 index1) const
50
52
{
51
53
return (ai ().level_graph ().valid_vertex_id (v->link (index0)) &&
52
54
ai ().level_graph ().valid_vertex_id (ai ().level_graph ().vertex (v->link (index0))->link (index1)) &&
53
55
m_temp[ai ().level_graph ().vertex (v->link (index0))->link (index1)]);
54
56
}
55
57
56
- IC bool CCoverManager::critical_point (CLevelGraph::CVertex* v, u32 index, u32 index0, u32 index1)
58
+ IC bool CCoverManager::critical_point (CLevelGraph::CVertex* v, u32 index, u32 index0, u32 index1) const
57
59
{
58
60
return (!ai ().level_graph ().valid_vertex_id (v->link (index)) &&
59
61
(!ai ().level_graph ().valid_vertex_id (v->link (index0)) || !ai ().level_graph ().valid_vertex_id (v->link (index1)) ||
60
62
cover (v, index0, index) || cover (v, index1, index)));
61
63
}
62
64
63
- IC bool CCoverManager::critical_cover (u32 index)
65
+ IC bool CCoverManager::critical_cover (u32 index) const
64
66
{
65
67
CLevelGraph::CVertex* v = ai ().level_graph ().vertex (index);
66
68
return (critical_point (v, 0 , 1 , 3 ) || critical_point (v, 2 , 1 , 3 ) || critical_point (v, 1 , 0 , 2 ) ||
@@ -75,25 +77,27 @@ void CCoverManager::compute_static_cover()
75
77
ai ().level_graph ().header ().box (), ai ().level_graph ().header ().cell_size () * .5f , 8 * 65536 , 4 * 65536 );
76
78
m_temp.resize (ai ().level_graph ().header ().vertex_count ());
77
79
78
- CLevelGraph const & graph = ai ().level_graph ();
79
- u32 levelVertexCount = ai ().level_graph ().header ().vertex_count ();
80
- for (u32 i = 0 ; i < levelVertexCount; ++i)
81
- {
82
- CLevelGraph::CVertex const & vertex = *graph.vertex (i);
83
- if (vertex.high_cover (0 ) + vertex.high_cover (1 ) + vertex.high_cover (2 ) + vertex.high_cover (3 ))
80
+ const CLevelGraph& graph = ai ().level_graph ();
81
+ const u32 levelVertexCount = ai ().level_graph ().header ().vertex_count ();
82
+ tbb::parallel_for (tbb::blocked_range<u32 >(0 , levelVertexCount), [&](const tbb::blocked_range<u32 >& range) {
83
+ for (u32 i = range.begin (); i != range.end (); ++i)
84
84
{
85
- m_temp[i] = edge_vertex (i);
86
- continue ;
85
+ const CLevelGraph::CVertex& vertex = *graph.vertex (i);
86
+ if (vertex.high_cover (0 ) + vertex.high_cover (1 ) + vertex.high_cover (2 ) + vertex.high_cover (3 ))
87
+ {
88
+ m_temp[i] = edge_vertex (i);
89
+ continue ;
90
+ }
91
+
92
+ if (vertex.low_cover (0 ) + vertex.low_cover (1 ) + vertex.low_cover (2 ) + vertex.low_cover (3 ))
93
+ {
94
+ m_temp[i] = edge_vertex (i);
95
+ continue ;
96
+ }
97
+
98
+ m_temp[i] = false ;
87
99
}
88
-
89
- if (vertex.low_cover (0 ) + vertex.low_cover (1 ) + vertex.low_cover (2 ) + vertex.low_cover (3 ))
90
- {
91
- m_temp[i] = edge_vertex (i);
92
- continue ;
93
- }
94
-
95
- m_temp[i] = false ;
96
- }
100
+ });
97
101
98
102
for (u32 i = 0 ; i < levelVertexCount; ++i)
99
103
if (m_temp[i] && critical_cover (i))
0 commit comments