///********************************************************************************
// *	文件名:	TerrainManager.cs
// *	全路径:	\Script\GameLogic\GameManager\TerrainManager.cs
// *	创建人:	李嘉
// *	创建时间:2014-04-02
// *
// *	功能说明:游戏地形数据管理器。
// *	         由于取消了场景中的Terrain节点,所以地形相关数据由此类管理。
// *	         每进入一个场景则初始化一次,在ActiveScene中进行初始化操作。
// *	         目前主要提供获得地表高度接口
// *	修改记录:
//*********************************************************************************/
//
//using System.IO;
//using Module.Log;
//using UnityEngine;
//
//public class TerrainManager
//{
//    private float m_fTerrainLenRate = 1.0f; //地图真是x坐标在高度图中的位置换算比例
//    private float m_fTerrainWidRate = 1.0f; //地图真是z坐标在高度图中的位置换算比例
//    private int m_nTerrainHeightMapLength; //地形长度
//    private int m_nTerrainHeightMapWidth; //地形宽度
//    private int m_nTerrainHeightMax; //地形高度最大值
//
//    private byte[,] m_TerrianRawData;
//
//    public TerrainManager()
//    {
//        RawDataOK = false;
//    }
//
//    public bool RawDataOK { get; private set; }
//
//    //从地形Raw文件读取地形高度数据
//    public bool InitTerrianData(string path, int nHeightMapLength, int nHeightMapWidth, int nHeightMax,
//        int nMapRealLength, int nMapRealWidth)
//    {
//        //如果m_TerrianRawData不为null
//        m_TerrianRawData = null;
//        RawDataOK = false;
//
//        //只能初始化一次,所以RawData必须为空
//        //if (nHeightMapLength <= 0 || nHeightMapWidth <= 0 || m_TerrianRawData != null)
//        if (nHeightMapLength <= 0 || nHeightMapWidth <= 0)
//            //数据发生错误,重新获取数据
//            return false;
//
//        m_nTerrainHeightMapLength = nHeightMapLength;
//        m_nTerrainHeightMapWidth = nHeightMapWidth;
//        m_nTerrainHeightMax = nHeightMax;
//
//        //得到长和宽的换算比例
//        if (nMapRealLength > 0) m_fTerrainLenRate = (float) m_nTerrainHeightMapLength / nMapRealLength;
//        if (nMapRealWidth > 0) m_fTerrainWidRate = (float) m_nTerrainHeightMapWidth / nMapRealWidth;
//
//        m_TerrianRawData = new byte[m_nTerrainHeightMapLength, m_nTerrainHeightMapWidth];
////#if UNITY_ANDROID && !UNITY_EDITOR
////        GameManager.gameManager.rawDataCallback = null;
////        // Raw 资源加载.回调方法
////        GameManager.gameManager.rawDataCallback = RawDataComplete;
////        //GameManager.gameManager.GetRawData(path);
////#else
//        return IOSAndPCReadRaw(path);
////#endif
//
////        return true;
//    }
//
//    private bool IOSAndPCReadRaw(string path)
//    {
//        try
//        {
//            if (!File.Exists(path))
//            {
//                LogModule.DebugLog("Can't Open Raw File " + path);
//                return false;
//            }
//
//            var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
//            var nSeek = 0;
//            var byteData = new byte[1];
//            //读数据
//            for (var lenIdx = 0; lenIdx < m_nTerrainHeightMapLength; ++lenIdx)
//            for (var widIdx = 0; widIdx < m_nTerrainHeightMapWidth; ++widIdx)
//            {
//                fileStream.Seek(nSeek, SeekOrigin.Begin);
//                fileStream.Read(byteData, 0, 1);
//                nSeek++;
//
//                //写入short
//                m_TerrianRawData[widIdx, lenIdx] = byteData[0];
//            }
//
//            RawDataOK = true;
//            fileStream.Close();
//        }
//        catch (IOException e)
//        {
//            LogModule.DebugLog("An IO exception has been thrown!");
//            LogModule.DebugLog(e.ToString());
//
//            return false;
//        }
//
//        return true;
//    }
//
//    public void RawDataComplete(byte[] bytes)
//    {
////        GameManager.gameManager.rawDataCallback -= RawDataComplete;
//        if (bytes == null || bytes.Length <= 0)
//            //数据发生失败后,重新提交申请数据
//            return;
//
//        var nSeek = 0;
//        //byte[] byteData = new byte[1];
//        //读数据
//        for (var lenIdx = 0; lenIdx < m_nTerrainHeightMapLength; ++lenIdx)
//        {
//            nSeek = lenIdx * m_nTerrainHeightMapWidth;
//
//            for (var widIdx = 0; widIdx < m_nTerrainHeightMapWidth; ++widIdx)
//                //写入short
//                m_TerrianRawData[widIdx, lenIdx] = bytes[nSeek + widIdx];
//        }
//
//        RawDataOK = true;
//    }
//
//    public float GetTerrianHeight(Vector3 pos)
//    {
//        if (m_TerrianRawData == null) return 0;
//
//        var nX = (int) (pos.x * m_fTerrainLenRate);
//        var nZ = (int) (pos.z * m_fTerrainWidRate);
//        if (nX < 0 || nX > m_nTerrainHeightMapLength || nZ < 0 || nZ > m_nTerrainHeightMapWidth) return 0;
//
//        //8bit灰度图可表示数值0~255,对应高度具体数值的0~m_nTerrainHeightMax
//        //所以根据所在灰度图区间来映射到对应高度
//        return (float) m_TerrianRawData[nX, nZ] / 255 * m_nTerrainHeightMax;
//    }
//
//    public float GetTerrianHeightSample(Vector3 pos)
//    {
//        if (m_TerrianRawData == null) return 0;
//
//        var nX = (int) (pos.x * m_fTerrainLenRate);
//        var nZ = (int) (pos.z * m_fTerrainWidRate);
//        var nX1 = nX + 1;
//        var nZ1 = nZ + 1;
//        if (nX < 0 || nX > m_nTerrainHeightMapLength || nZ < 0 || nZ > m_nTerrainHeightMapWidth) return 0;
//
//        if (nX1 > m_nTerrainHeightMapLength) nX1 = nX;
//
//        if (nZ1 > m_nTerrainHeightMapWidth) nZ1 = nZ;
//
//        var LeftBottomHeight = (float) m_TerrianRawData[nX, nZ] / 255 * m_nTerrainHeightMax;
//        var LeftTopHeight = (float) m_TerrianRawData[nX, nZ1] / 255 * m_nTerrainHeightMax;
//        var RightBottomHeight = (float) m_TerrianRawData[nX1, nZ] / 255 * m_nTerrainHeightMax;
//        var RightTopHeight = (float) m_TerrianRawData[nX1, nZ1] / 255 * m_nTerrainHeightMax;
//        var retValue = LeftBottomHeight;
//
//        if (nX1 - pos.x > pos.z - nZ)
//        {
//            if (nX1 == pos.x)
//            {
//                retValue = LeftBottomHeight + (LeftTopHeight - LeftBottomHeight) * (pos.z - nZ);
//            }
//            else
//            {
//                var k = (nZ1 - pos.z) / (nX1 - pos.x);
//                var b = nZ1 - k * nX1;
//                var nZTarget = k * nX + b;
//                var precent = nZTarget - nZ;
//                retValue = LeftBottomHeight + (LeftTopHeight - LeftBottomHeight) * precent;
//            }
//        }
//        else
//        {
//            if (pos.x == nX)
//            {
//                retValue = RightBottomHeight + (RightTopHeight - RightBottomHeight) * (pos.z - nZ);
//            }
//            else
//            {
//                var k = (pos.z - nZ) / (pos.x - nX);
//                var b = nZ - k * nX;
//                var nZTarget = k * nX1 + b;
//                var precent = nZTarget - nZ;
//                retValue = RightBottomHeight + (RightTopHeight - RightBottomHeight) * precent;
//            }
//        }
//
//
//        return retValue;
//    }
//}