using System.Collections.Generic;
using JNGame.Math;
namespace JNGame.PathFinding
{
///
/// 二叉空间分割树
///
public partial class BspTree
{
private readonly List m_AllTriangle = new List();
///
/// 根节点
///
private BspTreeNode m_RootNode;
///
/// 查找点邻接三角形的缓存,每次查找都会清理,外部不可缓存此列表,只可一次性使用
///
private readonly List m_TempNeareastTrianges = new List(16);
///
/// 构造二叉空间分割树
///
/// 原始的三角形数据
public void Init(List rawTriangles)
{
foreach (var tri in rawTriangles)
{
m_AllTriangle.Add(new TriangleRef(tri));
}
m_RootNode = new BspTreeNode();
m_RootNode.Init(m_AllTriangle);
}
///
/// 根据位置检索BSP树,快速定位点所在三角形区域
///
///
///
///
public int GetTriangle(in LVector3 pos, out List nearTriangleIndices)
{
m_TempNeareastTrianges.Clear();
var pos2d = pos.ToLVector2XZ();
int triangleIndex = m_RootNode.GetTriangle(pos2d, out _, out List nearTriangles);
if (triangleIndex == -1)
{ // 未找到落位的三角形,说明在阻挡内,获取阻挡周边的一些三角形
for (int i = 0; i < nearTriangles.Count; ++i)
{
if (!m_TempNeareastTrianges.Contains(nearTriangles[i].index))
{
m_TempNeareastTrianges.Add(nearTriangles[i].index);
}
}
}
nearTriangleIndices = m_TempNeareastTrianges;
return triangleIndex;
}
}
}