//#####################################################################
// Copyright 2009, Jon Gretarsson.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Namespace INTERSECTION
//##################################################################### 
#include <Core/Intersections/SEGMENT_3D_TRIANGLE_3D_INTERSECTION.h>
#include <Core/Basic_Geometry/RAY.h>
#include <Core/Basic_Geometry/SEGMENT_3D.h>
#include <Core/Basic_Geometry/TRIANGLE_3D.h>
#include <Core/Vectors/VECTOR.h>
namespace PhysBAM{
//#####################################################################
// Function Intersects
//#####################################################################
template<class T> bool Intersects(const SEGMENT_3D<T>& segment,const TRIANGLE_3D<T>& triangle,const T thickness_over_two)
{
    RAY<VECTOR<T,3> > ray;
    T len=ray.Set(segment.X.x,segment.X.y-segment.X.x);
    auto hit=Intersects(ray,triangle,thickness_over_two);
    return hit.Hit(len);
}
//#####################################################################
// Function Intersects
//#####################################################################
template<class T> bool Intersects(const SEGMENT_3D<T>& segment,const TRIANGLE_3D<T>& triangle,VECTOR<T,2>& weights_segment,VECTOR<T,3>& weights,const T thickness_over_two)
{
    RAY<VECTOR<T,3> > ray;
    T magnitude=ray.Set(segment.X.x,segment.X.y-segment.X.x);
    auto hit=Intersects(ray,triangle,thickness_over_two);
    if(!hit.Hit(magnitude)) return false;
    weights_segment(0)=hit.dist/magnitude;
    weights_segment(1)=1-weights_segment(0);
    weights=triangle.Barycentric_Coordinates(ray.Point(hit.dist));
    return true;
}
//#####################################################################
template bool Intersects(const SEGMENT_3D<float>&,const TRIANGLE_3D<float>&,const float);
template bool Intersects(const SEGMENT_3D<float>&,const TRIANGLE_3D<float>&,VECTOR<float,2>&,VECTOR<float,3>&,const float);
template bool Intersects(const SEGMENT_3D<double>&,const TRIANGLE_3D<double>&,const double);
template bool Intersects(const SEGMENT_3D<double>&,const TRIANGLE_3D<double>&,VECTOR<double,2>&,VECTOR<double,3>&,const double);
}
