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; } } }