|
|
@@ -26,37 +26,43 @@ template <typename TE> class OcTree; |
|
|
|
//-- |
|
|
|
namespace Debug { |
|
|
|
//-- |
|
|
|
#define GET_DRAW_DATA(DEF_TREE, DEF_BOXES, DEF_ELEM, CHILD_NB, TBB) \ |
|
|
|
boxes.Push(tree->GetAABB(), vec4::one); \ |
|
|
|
leaves.Push(0, boxes.Last().m1); \ |
|
|
|
while (leaves.Count() > 0) \ |
|
|
|
{ \ |
|
|
|
for (int j = 0; j < tree->GetTree()[leaves[0].m1].m_elements.Count(); j++) \ |
|
|
|
{ \ |
|
|
|
bool done = false; \ |
|
|
|
for (int k = 0; k < elements.Count(); k++) \ |
|
|
|
{ \ |
|
|
|
if (elements[k].m1 == tree->GetElements()[tree->GetTree()[leaves[0].m1].m_elements[j]].m_element) \ |
|
|
|
{ \ |
|
|
|
elements[k].m2++; \ |
|
|
|
done = true; \ |
|
|
|
break; \ |
|
|
|
} \ |
|
|
|
} \ |
|
|
|
if (!done) \ |
|
|
|
elements.Push(tree->GetElements()[tree->GetTree()[leaves[0].m1].m_elements[j]].m_element, 1, vec4::v1001); \ |
|
|
|
} \ |
|
|
|
\ |
|
|
|
for (int i = 0; i < CHILD_NB; i++) \ |
|
|
|
{ \ |
|
|
|
if (tree->GetTree()[leaves[0].m1].m_children[i] != 0) \ |
|
|
|
{ \ |
|
|
|
TBB bbox = tree->GetSubAABB(leaves[0].m2, i); \ |
|
|
|
leaves.Push(tree->GetTree()[leaves[0].m1].m_children[i], bbox); \ |
|
|
|
boxes.Push(bbox, color); \ |
|
|
|
} \ |
|
|
|
} \ |
|
|
|
leaves.Remove(0); \ |
|
|
|
|
|
|
|
template<typename TREE, typename TE, typename TBB> |
|
|
|
void DrawInner(TREE *tree, Array<TBB, vec4> &boxes, |
|
|
|
Array<TE *, int, vec4> &elements, |
|
|
|
Array<int, TBB> &leaves, int children, vec4 color) |
|
|
|
{ |
|
|
|
boxes.Push(tree->GetAABB(), vec4::one); |
|
|
|
leaves.Push(0, boxes.Last().m1); |
|
|
|
while (leaves.Count() > 0) |
|
|
|
{ |
|
|
|
for (int j = 0; j < tree->GetTree()[leaves[0].m1].m_elements.Count(); j++) |
|
|
|
{ |
|
|
|
bool done = false; |
|
|
|
for (int k = 0; k < elements.Count(); k++) |
|
|
|
{ |
|
|
|
if (elements[k].m1 == tree->GetElements()[tree->GetTree()[leaves[0].m1].m_elements[j]].m_element) |
|
|
|
{ |
|
|
|
elements[k].m2++; |
|
|
|
done = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!done) |
|
|
|
elements.Push(tree->GetElements()[tree->GetTree()[leaves[0].m1].m_elements[j]].m_element, 1, vec4::v1001); |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < children; i++) |
|
|
|
{ |
|
|
|
if (tree->GetTree()[leaves[0].m1].m_children[i] != 0) |
|
|
|
{ |
|
|
|
TBB bbox = tree->GetSubAABB(leaves[0].m2, i); |
|
|
|
leaves.Push(tree->GetTree()[leaves[0].m1].m_children[i], bbox); |
|
|
|
boxes.Push(bbox, color); |
|
|
|
} |
|
|
|
} |
|
|
|
leaves.Remove(0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//-- |
|
|
@@ -67,7 +73,7 @@ void Draw(QuadTree<TE>* tree, vec4 color) |
|
|
|
Array<TE*, int, vec4> elements; |
|
|
|
Array<int, box2> leaves; |
|
|
|
|
|
|
|
GET_DRAW_DATA(tree, boxes, elements, 4, box2); |
|
|
|
DrawInner<QuadTree<TE>, TE, box2>(tree, boxes, elements, leaves, 4, color); |
|
|
|
|
|
|
|
vec3 off = vec3::v010 * .1f; |
|
|
|
vec3 add = vec3::v010 * .1f; |
|
|
@@ -98,7 +104,7 @@ void Draw(OcTree<TE>* tree, vec4 color) |
|
|
|
Array<TE*, int, vec4> elements; |
|
|
|
Array<int, box3> leaves; |
|
|
|
|
|
|
|
GET_DRAW_DATA(tree, boxes, elements, 8, box3); |
|
|
|
DrawInner<OcTree<TE>, TE, box3>(tree, boxes, elements, leaves, 8, color); |
|
|
|
|
|
|
|
vec3 off = vec3::v010 * .1f; |
|
|
|
vec3 add = vec3::v010 * .1f; |
|
|
|