4 : m_maxDistance(maxDistance)
10 cout <<
"Picker-Mode: multi-threaded" << endl;
12 cout <<
"Picker-Mode: single-threaded" << endl;
20 if (size == uvec2(0,0))
23 m_levels.resize((uint)glm::max(glm::ceil(glm::log2((
float)size.x)),
24 glm::ceil(glm::log2((
float)size.y)) ));
28 for (uvec2 levelSize(1,1); levelSize.x < size.x || levelSize.y < size.y ; levelSize *= 2)
52 if (!
m_levels[0].at(0,0))
return false;
54 list<uvec2> candidates;
55 candidates.push_back(uvec2(0,0));
58 for (
auto levelIdx = 1U; levelIdx <
m_levels.size() ; levelIdx ++)
61 auto posOnLevel = pos / (2U << (
m_levels.size() - levelIdx - 1));
63 auto nCandidates = candidates.size();
65 for (
auto& candidate : candidates)
68 candidates.push_front(candidate + uvec2(1,0));
69 candidates.push_front(candidate + uvec2(0,1));
70 candidates.push_front(candidate + uvec2(1,1));
74 candidates.remove_if([&level]
75 (uvec2
const & candidate)
77 return !level.at(candidate);
81 auto distances = [&posOnLevel]
82 (uvec2
const & candidate,
float* deltas)
84 deltas[0] = glm::length(vec2(candidate) - vec2(posOnLevel) - vec2(-0.5f,-0.5f));
85 deltas[1] = glm::length(vec2(candidate) - vec2(posOnLevel) - vec2( 0.5f,-0.5f));
86 deltas[2] = glm::length(vec2(candidate) - vec2(posOnLevel) - vec2(-0.5f, 0.5f));
87 deltas[3] = glm::length(vec2(candidate) - vec2(posOnLevel) - vec2( 0.5f, 0.5f));
89 auto minDistance = [distances]
90 (uvec2
const & candidate)
93 distances(candidate, deltas);
94 return (
float)(*min_element(deltas, deltas + 4));
97 (uvec2
const & candidate)
100 distances(candidate, deltas);
101 return (
float)(*max_element(deltas, deltas + 4));
106 float minimum_of_maxDistance = (float)(maxDistanceOnLevel+1);
107 for(
auto& candidate : candidates)
108 minimum_of_maxDistance = glm::min(minimum_of_maxDistance,
112 candidates.remove_if([minDistance, minimum_of_maxDistance]
113 (uvec2
const & candidate)
115 return minDistance(candidate) > (minimum_of_maxDistance);
119 auto nCandidates = candidates.size();
120 for (
auto& candidate : candidates)
123 candidates.push_front(candidate + uvec2(1,0));
124 candidates.push_front(candidate + uvec2(0,1));
125 candidates.push_front(candidate + uvec2(1,1));
129 candidates.remove_if([
this]
130 (uvec2
const & candidate)
135 if (candidates.empty())
139 auto distance = [pos]
140 (uvec2
const & candidate)
142 return glm::length(vec2(candidate)-vec2(pos));
145 foundPos = *min_element(candidates.begin(), candidates.end(), [distance]
146 (uvec2
const & a, uvec2
const & b)
148 return distance(a) < distance(b);
151 foundDistance = distance(foundPos);
173 auto const layerDiff =
m_levels.size() - layer;
174 auto layerExpansion = 2 << (layerDiff-1);
179 for (
auto level =
m_levels.rbegin() + 1; level !=
m_levels.rend(); level ++)
181 auto lastLevel = level - 1;
185 updateLayerArea(lastLevel, level, x * layerExpansion, y * layerExpansion, layerExpansion);
187 if (layerExpansion == 1)
uint16 id_t
The data-type used for the id-buffer.
Configuration & getConfig()
void updateLayerArea(TBaseLayer base, TCurrentLayer current, uint const offset_x, uint const offset_y, uint size)
vector< MidLevel > m_levels
uint const maxDistance() const
void resize(uvec2 const &size)
void updateLayersBaseCell(uint const layer, uint const x, uint const y)
array< auto_reset_event, 4 > m_updateLayersParallelMutex
void updateLayersParallel()
bool pickerMultiThreaded() const
void updateLayersSerial()
void updateLayerCell(TBaseLayer base, TCurrentLayer current, uint const x, uint const y)
uvec2 const & size() const
void resize(uvec2 const &size)
bool findNear(uvec2 const &pos, OUT id_t &foundId, OUT uvec2 &foundPos, OUT float &foundDistance)
QuadTree(Application *app, uvec2 const &size, uint const maxDistance)