void CompleteBoxPruningTest::Init()
{
    m_firstTime = true;

    SRand(0);
    mBoxes = new AABB[mNbBoxes];
    mBoxPtrs = new const AABB*[mNbBoxes];
    mBoxTime = new float[mNbBoxes];
    for(udword i=0; i<mNbBoxes; i++)
    {
        Point Center, Extents;

        Center.x = (UnitRandomFloat()-0.5f) * 100.0f;
        Center.y = (UnitRandomFloat()-0.5f) * 10.0f;
        Center.z = (UnitRandomFloat()-0.5f) * 100.0f;
        Extents.x = 2.0f + UnitRandomFloat() * 2.0f;
        Extents.y = 2.0f + UnitRandomFloat() * 2.0f;
        Extents.z = 2.0f + UnitRandomFloat() * 2.0f;

        mBoxes[i].SetCenterExtents(Center, Extents);
        mBoxPtrs[i] = &mBoxes[i];

        mBoxTime[i] = 2000.0f*UnitRandomFloat();
    }
}
void IndexedTriangle::RandomPoint(const Point* verts, Point& random)	const
{
	if(!verts)	return;

	// Random barycentric coords
	float Alpha	= UnitRandomFloat();
	float Beta	= UnitRandomFloat();
	float Gamma	= UnitRandomFloat();
	float OneOverTotal = 1.0f / (Alpha + Beta + Gamma);
	Alpha	*= OneOverTotal;
	Beta	*= OneOverTotal;
	Gamma	*= OneOverTotal;

	const Point& p0 = verts[mVRef[0]];
	const Point& p1 = verts[mVRef[1]];
	const Point& p2 = verts[mVRef[2]];
	random = Alpha*p0 + Beta*p1 + Gamma*p2;
}