 //#####################################################################
// Copyright 2004, Eran Guendelman.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
#include <Core/Meshes/MESH_OBJECT.h>
#include <Core/Meshes/SEGMENTED_CURVE.h>
#include <Core/Read_Write/FILE_UTILITIES.h>
#include <Core/Utilities/VIEWER_DIR.h>
#include "../QT_RENDER_UTILS.h"
#include "../QT_WORLD.h"
#include "QT_OBJECT.h"
#include "QT_SPLIT_OBJECT.h"
namespace PhysBAM{
//#####################################################################
// Constructor
//#####################################################################
template<class TV,class TYPE> QT_SPLIT_OBJECT<TV,TYPE>::
QT_SPLIT_OBJECT(QT_WORLD& world,const std::string& name,const std::string& mesh_file,const std::string& part_file)
    :QT_COMPONENT(world,name)
{
    mesh_obj=QT_FILE_OBJECT<MESH>::Make(world.viewer_dir,mesh_file);
    particle_obj=QT_FILE_OBJECT<GEOMETRY_PARTICLES<TV>>::Make(world.viewer_dir,part_file);
    ptr=new TYPE(mesh_obj->Obj(),particle_obj->Obj());
    split=true;
}
//#####################################################################
// Constructor
//#####################################################################
template<class TV,class TYPE> QT_SPLIT_OBJECT<TV,TYPE>::
QT_SPLIT_OBJECT(QT_WORLD& world,const std::string& name,const std::string& file)
    :QT_COMPONENT(world,name)
{
    obj=QT_FILE_OBJECT<TYPE>::Make(world.viewer_dir,file);
    ptr=&obj->Obj();
}
//#####################################################################
// Destructor
//#####################################################################
template<class TV,class TYPE> QT_SPLIT_OBJECT<TV,TYPE>::
~QT_SPLIT_OBJECT()
{
    if(split) delete ptr;
}
//#####################################################################
// Function Read
//#####################################################################
template<class TV,class TYPE> void QT_SPLIT_OBJECT<TV,TYPE>::
Read()
{
    valid=false;
    if(split)
    {
        mesh_obj->Read();
        if(mesh_obj->valid)
        {
            particle_obj->Read();
            if(particle_obj->valid)
            {
                valid=true;
                ptr->Update_Number_Nodes();
            }
        }
    }
    else
    {
        obj->Read();
        valid=obj->valid;
    }
    if(valid) ptr->Update_Bounding_Box();
}
//#####################################################################
// Function Invalidate
//#####################################################################
template<class TV,class TYPE> void QT_SPLIT_OBJECT<TV,TYPE>::
Invalidate(bool invalidate_common)
{
    if(split)
    {
        mesh_obj->Invalidate(invalidate_common);
        particle_obj->Invalidate(invalidate_common);
    }
    else obj->Invalidate(invalidate_common);
}
//#####################################################################
// Function Bounding_Box
//#####################################################################
template<class TV,class TYPE> auto QT_SPLIT_OBJECT<TV,TYPE>::
Bounding_Box() -> RANGE<FV>
{
    if(!valid) return RANGE<FV>::Empty_Box();
    return RANGE<FV>(*ptr->bounding_box);
}
template class QT_SPLIT_OBJECT<VECTOR<double,2>,MESH_OBJECT<VECTOR<double,2>,1> >;
template class QT_SPLIT_OBJECT<VECTOR<double,2>,MESH_OBJECT<VECTOR<double,2>,2> >;
template class QT_SPLIT_OBJECT<VECTOR<double,3>,MESH_OBJECT<VECTOR<double,3>,1> >;
template class QT_SPLIT_OBJECT<VECTOR<double,3>,MESH_OBJECT<VECTOR<double,3>,2> >;
template class QT_SPLIT_OBJECT<VECTOR<double,3>,MESH_OBJECT<VECTOR<double,3>,3> >;
template class QT_SPLIT_OBJECT<VECTOR<float,2>,MESH_OBJECT<VECTOR<float,2>,1> >;
template class QT_SPLIT_OBJECT<VECTOR<float,2>,MESH_OBJECT<VECTOR<float,2>,2> >;
template class QT_SPLIT_OBJECT<VECTOR<float,3>,MESH_OBJECT<VECTOR<float,3>,1> >;
template class QT_SPLIT_OBJECT<VECTOR<float,3>,MESH_OBJECT<VECTOR<float,3>,2> >;
template class QT_SPLIT_OBJECT<VECTOR<float,3>,MESH_OBJECT<VECTOR<float,3>,3> >;
}
