//#####################################################################
// Copyright 2004-2009, Zhaosheng Bao, Ron Fedkiw, Jon Gretarsson, Geoffrey Irving, Andrew Selle, Jonathan Su, Joseph Teran.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
#include <Core/Spatial_Acceleration/BOX_HIERARCHY.h>
#include <Core/Data_Structures/Compute_Order_Using_KD_Tree.h>
namespace PhysBAM{
//#####################################################################
// Function Clean_Memory
//#####################################################################
template<class TV> void BOX_HIERARCHY<TV>::
Clean_Memory()
{
    first_leaf=0;
    box_hierarchy.Clean_Memory();
    leaf_to_index.Clean_Memory();
}
//#####################################################################
// Function Compute
//#####################################################################
template<class TV> void BOX_HIERARCHY<TV>::
Compute(const ARRAY<RANGE<TV> >& boxes,bool update_order)
{
    if(!boxes.m)
    {
        first_leaf=0;
        box_hierarchy.Remove_All();
        leaf_to_index.Remove_All();
        return;
    }
    if(update_order || box_hierarchy.m!=2*boxes.m-1)
    {
        ARRAY<TV> centroids(boxes.m);
        for(int i=0;i<boxes.m;i++)
            centroids(i)=boxes(i).Center();
        Compute_Order_Using_KD_Tree(leaf_to_index,centroids);
        box_hierarchy.Resize(2*boxes.m-1);
    }
    first_leaf=boxes.m-1;
    for(int i=0;i<boxes.m;i++)
        box_hierarchy(i+first_leaf)=boxes(leaf_to_index(i));
    for(int i=first_leaf-1;i>=0;i--)
        box_hierarchy(i)=box_hierarchy(2*i+1).Unite(box_hierarchy(2*i+2));
}
//#####################################################################
// Function Thicken_Boxes
//#####################################################################
template<class TV> void BOX_HIERARCHY<TV>::
Thicken_Boxes(T extra_thickness)
{
    for(auto&b:box_hierarchy) b.Change_Size(extra_thickness);
}
template class BOX_HIERARCHY<VECTOR<float,1> >;
template class BOX_HIERARCHY<VECTOR<float,2> >;
template class BOX_HIERARCHY<VECTOR<float,3> >;
template class BOX_HIERARCHY<VECTOR<double,1> >;
template class BOX_HIERARCHY<VECTOR<double,2> >;
template class BOX_HIERARCHY<VECTOR<double,3> >;
}
