コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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;
            }
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
            });
        }
コード例 #5
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;
            }
        }