private void VisitTreeImpl(MyFunc<float, float, float, float, int, int, KdTreeObject[], bool> visitor)
{
m_QueryStack.Push(0);
while (m_QueryStack.Count > 0) {
int node = m_QueryStack.Pop();
int begin = m_KdTree[node].m_Begin;
int end = m_KdTree[node].m_End;
int left = m_KdTree[node].m_Left;
int right = m_KdTree[node].m_Right;
float minX = m_KdTree[node].m_MinX;
float minZ = m_KdTree[node].m_MinZ;
float maxX = m_KdTree[node].m_MaxX;
float maxZ = m_KdTree[node].m_MaxZ;
bool isVertical = (maxX - minX > maxZ - minZ);
if (isVertical) {
float splitValue = 0.5f * (maxX + minX);
if (!visitor(splitValue, minZ, splitValue, maxZ, begin, end, m_Objects)) {
m_QueryStack.Clear();
return;
}
} else {
float splitValue = 0.5f * (maxZ + minZ);
if (!visitor(minX, splitValue, maxX, splitValue, begin, end, m_Objects)) {
m_QueryStack.Clear();
return;
}
}
if (left > 0)
m_QueryStack.Push(left);
if (right > 0)
m_QueryStack.Push(right);
}
}