using System;
using Game.Plugins.JNGame.Sync.Frame.AStar.Entity.Graph;
using Game.Plugins.JNGame.Sync.Frame.AStar.Navmesh;
using Game.Plugins.JNGame.Sync.Frame.AStar.Util;
using NotImplementedException = System.NotImplementedException;

namespace Plugins.JNGame.Sync.Frame.AStar.Entity.Tile
{
    public class NavmeshTile : INavmeshHolder
    {
        
        /// <summary>瓦片三角形</summary>  
        /// 这是一个包含瓦片所有三角形的数组  
        public int[] tris;  
  
        /// <summary>瓦片顶点</summary>  
        /// 这是一个包含瓦片所有顶点的数组  
        public Int3[] verts;  
  
        /// <summary>图空间中的瓦片顶点</summary>  
        /// 这是一个包含在图空间中定义的瓦片顶点的数组  
        public Int3[] vertsInGraphSpace;  
  
        /// <summary>瓦片X坐标</summary>  
        /// 这表示瓦片在X轴上的位置  
        public int x;  
  
        /// <summary>瓦片Z坐标</summary>  
        /// 这表示瓦片在Z轴上的位置  
        public int z;  
  
        /// <summary>  
        /// 瓦片坐标中的宽度。  
        /// 警告：除了1以外的宽度不受支持。这主要是为了未来可能的功能。  
        /// </summary>  
        /// 这表示瓦片在X轴上的宽度，但请注意，目前只支持宽度为1的瓦片  
        public int w;  
  
        /// <summary>  
        /// 瓦片坐标中的深度。  
        /// 警告：除了1以外的深度不受支持。这主要是为了未来可能的功能。  
        /// </summary>  
        /// 这表示瓦片在Z轴上的深度，但请注意，目前只支持深度为1的瓦片  
        public int d;  
  
        /// <summary>瓦片中的所有节点</summary>  
        /// 这是一个包含瓦片中所有节点的数组  
        public TriangleMeshNode[] nodes;  
  
        /// <summary>用于节点查找的边界框树</summary>  
        /// 这是一个边界框树（BBTree），用于高效地查找和定位瓦片中的节点  
        public BBTree bbTree;  
  
        /// <summary>用于批处理的临时标志</summary>  
        /// 这是一个布尔值，可能用于在批处理过程中标记或跟踪某些状态  
        public bool flag;  
  
        // 这是一个指向NavmeshBase对象的引用，可能表示瓦片所属的导航网格     
        public NavmeshBase graph;  
  
        // 获取瓦片（Tile）的坐标  
        public void GetTileCoordinates(int tileIndex, out int x, out int z) {  
            x = this.x; // 返回当前对象的x坐标  
            z = this.z; // 返回当前对象的z坐标  
        }  

        // 获取顶点数组的索引  
        public int GetVertexArrayIndex(int index) {  
            return index & NavmeshBase.VertexIndexMask; // 返回index与NavmeshBase.VertexIndexMask的按位与结果  
        }  

        /// <summary>获取瓦片中的特定顶点</summary>  
        // 获取特定索引的顶点  
        public Int3 GetVertex(int index) {  
            int idx = index & NavmeshBase.VertexIndexMask; // 计算索引的按位与结果  
            return verts[idx]; // 返回顶点数组在idx位置的元素  
        }  

        // 获取图空间中的顶点  
        public Int3 GetVertexInGraphSpace(int index) {  
            return vertsInGraphSpace[index & NavmeshBase.VertexIndexMask]; // 返回图空间顶点数组在指定索引位置的元素  
        }  

        /// <summary>将坐标从图空间转换为世界空间</summary>  
        // 获取图到世界的转换  
        public GraphTransform transform {   
            get {   
                return graph.transform; // 返回图的转换对象  
            }   
        }  


        // 获取所有的节点，并对每个节点执行给定的动作  
        public void GetNodes(Action<GraphNode> action)
        {
            if (nodes == null) return; // 如果节点为空，则直接返回  
            for (int i = 0; i < nodes.Length; i++) action(nodes[i]); // 遍历节点数组，对每个节点执行给定的动作  
        }
    }
}