/// <summary> /// 莫顿码计算 /// </summary> /// <param name="iTileIndex">地形的Tile索引</param> /// <param name="iChunkTileIndex">单个地形的拆分成chunk后的tile索引</param> /// <param name="iSlicingCount">单个地形的拆分个数。(如:2x2 则为2)</param> /// <param name="iLayerLevel">当前所属层级</param> /// <returns>莫顿码</returns> public static UINT32 Morton(Vector2 iTileIndex, Vector2 iChunkTileIndex, int iSlicingCount, int iLayerLevel) { var chunkIndexXG = (int)(iTileIndex.x * iSlicingCount + iChunkTileIndex.x); var chunkIndexZG = (int)(iTileIndex.y * iSlicingCount + iChunkTileIndex.y); return(UtilsMorton.Morton3d(chunkIndexXG, iLayerLevel, chunkIndexZG)); }
/// <summary> /// 莫顿码预览(3个纬度) /// 备注 /// x : x轴方向 /// y : 层级 /// z : z轴方向 /// </summary> /// <param name="iLevel">层级(影响到左边缩进的余白)</param> /// <param name="iMorton">莫顿码</param> private void DrawInverseMorton3DPreView(int iLevel, ref uint iMorton) { // 设定缩进 for (var i = 0; i < iLevel; ++i) { ++EditorGUI.indentLevel; } var level = iLevel; // 莫顿码输入值获取 var morton = (int)iMorton; DrawIntField(level, "莫顿码预览(3D)", ref morton); iMorton = (uint)(morton >= 0 ? morton : -1); if (0 <= morton) { // 莫顿码逆算 var display = Vector3.zero; UtilsMorton.InverseMorton3d(ref display.x, ref display.y, ref display.z, iMorton); // 显示结果 DrawVector3Field(level + 1, "反算预览", ref display); } // 恢复缩进 for (var i = 0; i < iLevel; ++i) { --EditorGUI.indentLevel; } }
/// <summary> /// 取得地形chunk信息列表 /// </summary> /// <param name="iLayerLevel">层级(-1:默认 全部取得)</param> /// <returns></returns> public List <TerrainChunkData> GetChunkData(int iLayerLevel = -1) { if (-1 == iLayerLevel) { return(data.Chunks); } var list = data.Chunks .Where(o => { var tilePos = Vector3.zero; UtilsMorton.InverseMorton3d(ref tilePos.x, ref tilePos.y, ref tilePos.z, o.Morton); return(Math.Abs(iLayerLevel - tilePos.y) <= 0.0f); }) .ToList(); return(list); }
/// <summary> /// 自动排序 /// </summary> public void AutoSort() { if (null == data || null == data.Chunks || 0 >= data.Chunks.Count) { return; } // 排序:排序层级(大->小) > x轴方向(小->大) > z轴方向(小->大) // 既:从下往上,从左到右,从外到内 data.Chunks.Sort((iX, iY) => { if (null == iX || null == iY) { return(0); } // 发型解析莫顿码 var x = Vector3.zero; UtilsMorton.InverseMorton3d(ref x.x, ref x.y, ref x.z, iX.Morton); var y = Vector3.zero; UtilsMorton.InverseMorton3d(ref y.x, ref y.y, ref y.z, iY.Morton); if (x.y > y.y) { return(-1); } if (x.x < y.x) { return(-1); } if (x.z < y.z) { return(-1); } return((x.y < y.y) && (x.x > y.x) && (x.z > y.z) ? 1 : 0); }); }
/// <summary> /// 莫顿码顺算预览(3D) /// 备注 /// x : x轴方向 /// y : z轴方向 /// </summary> /// <param name="iLevel">层级(影响到左边缩进的余白)</param> /// <param name="iMorton">莫顿码</param> private void DrawMorton3DPreView(int iLevel, ref Vector3 iMorton) { // 设定缩进 for (var i = 0; i < iLevel; ++i) { ++EditorGUI.indentLevel; } var level = iLevel; // 莫顿码输入值获取 iMorton.x = iMorton.x >= 0 ? iMorton.x : 0; iMorton.y = iMorton.y >= 0 ? iMorton.y : 0; DrawVector3Field(level + 1, "预览", ref iMorton); var morton = UtilsMorton.Morton3d(iMorton.x, iMorton.y, iMorton.z); // 莫顿码 DrawLabel(level, "莫顿码", Color.yellow, morton.ToString()); // 恢复缩进 for (var i = 0; i < iLevel; ++i) { --EditorGUI.indentLevel; } }