56 lines
1.5 KiB
C++
56 lines
1.5 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "bih/bih.h"
|
|
|
|
using namespace GS;
|
|
using namespace GS::BIH;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
uint Tree::IntersectNode(Node *node, MinMax &mm, uint *iarray, uint max)
|
|
{
|
|
uint count = 0;
|
|
|
|
if (node->axis == 3)
|
|
{
|
|
if (node->count > max)
|
|
return 0;
|
|
|
|
Memory::Copy(iarray, (uint *)node->p, sizeof(uint) * node->count);
|
|
return node->count;
|
|
}
|
|
else
|
|
{
|
|
if (mm.mx[node->axis] > node->split[1])
|
|
{
|
|
MinMax sub_mm = mm;
|
|
if (node->split[1] > sub_mm.mn[node->axis])
|
|
sub_mm.mn[node->axis] = node->split[1];
|
|
|
|
uint added = IntersectNode(&((Node *)node->p)[1], sub_mm, iarray/* + count*/, max);
|
|
max -= added; count += added;
|
|
}
|
|
if (mm.mn[node->axis] < node->split[0])
|
|
{
|
|
MinMax sub_mm = mm;
|
|
if (node->split[0] < sub_mm.mx[node->axis])
|
|
sub_mm.mx[node->axis] = node->split[0];
|
|
|
|
uint added = IntersectNode(&((Node *)node->p)[0], sub_mm, iarray + count, max);
|
|
/*max -= added;*/ count += added;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
uint Tree::Intersect(MinMax &in_mm, uint *iarray, uint max)
|
|
{
|
|
if (root.IsNull() || !in_mm.TestOverlap(minmax))
|
|
return 0;
|
|
return IntersectNode(root, in_mm, iarray, max);
|
|
}
|
|
//------------------------------------------------------------------------------
|