Esempio n. 1
0
    public bool ShowFileMapRegion(string filename)
    {
        if (_lastFileMapRegionName != filename)
        {
            FileMapRegion newFile = new FileMapRegion();

            try
            {
                byte[] region_data = Util.ReadFile(filename);
                if (!newFile.ReadFromMemory(region_data))
                {
                    HobaDebuger.LogWarning("ShowFileMapRegion, Failed to load " + filename);
                    return(false);
                }
            }
            catch (Exception)
            {
                HobaDebuger.LogWarning("ShowFileMapRegion, Failed to load " + filename);
                return(false);
            }

            _fileMapRegion = newFile;

            _lastFileMapRegionName = filename;
        }

        for (int i = 0; i < _mapRegionGameObjList.Count; ++i)
        {
            GameObject go = _mapRegionGameObjList[i];
            if (go != null)
            {
                GameObject.Destroy(go);
            }
        }
        _mapRegionGameObjList.Clear();
        List <int> Keys = new List <int>(_fileMapRegion.RegionMap.Keys);

        for (int i = 0; i < Keys.Count; ++i)
        {
            FileRegion fileRegion = _fileMapRegion.RegionMap[Keys[i]];

            //
            HashSet <uint> regionGridSet = fileRegion.RegionGridSet;

            List <Vector3> vertices  = new List <Vector3>();
            List <int>     triangles = new List <int>();

            Vector3[] vGrid   = new Vector3[4];
            int       voffset = 0;
            foreach (uint v in regionGridSet)
            {
                if (vertices.Count + 4 > 60000)  //split
                {
                    int        index = _mapRegionGameObjList.Count;
                    GameObject go    = new GameObject(HobaText.Format("MapRegionGameObj_{0}_{1}", Keys[i], index));

                    MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();
                    meshRenderer.enabled         = true;
                    meshRenderer.name            = HobaText.Format("MapRegionGameObj_{0}_{1}", Keys[i], index);
                    meshRenderer.material.shader = Shader.Find("Legacy Shaders/Bumped Diffuse");
                    meshRenderer.material.color  = GetMeshColor(Keys[i]);
                    CUnityUtil.DisableLightAndShadow(meshRenderer);

                    MeshFilter meshFilter = go.AddComponent <MeshFilter>();
                    meshFilter.sharedMesh           = new Mesh();
                    meshFilter.sharedMesh.name      = HobaText.Format("MeshFilterMesh_{0}_{1}", Keys[i], index);
                    meshFilter.sharedMesh.vertices  = vertices.ToArray();
                    meshFilter.sharedMesh.triangles = triangles.ToArray();

                    _mapRegionGameObjList.Add(go);

                    vertices.Clear();
                    triangles.Clear();
                    voffset = 0;
                }

                uint row = (v & 0xffff0000) >> 16;
                uint col = (v & 0xffff);

                _fileMapRegion.GetGridPositions(row, col, vGrid, 0);

                float fH0 = CUnityUtil.GetMapHeight(vGrid[0]);
                float fH1 = CUnityUtil.GetMapHeight(vGrid[1]);
                float fH2 = CUnityUtil.GetMapHeight(vGrid[2]);
                float fH3 = CUnityUtil.GetMapHeight(vGrid[3]);
//                 if (fH0 == 0.0f || fH1 == 0.0f || fH2 == 0.0f || fH3 == 0.0f)
//                     continue;

                vGrid[0].y = fH0 + 0.1f;
                vGrid[1].y = fH1 + 0.1f;
                vGrid[2].y = fH2 + 0.1f;
                vGrid[3].y = fH3 + 0.1f;

                vertices.Add(vGrid[0]);
                vertices.Add(vGrid[1]);
                vertices.Add(vGrid[2]);
                vertices.Add(vGrid[3]);

                triangles.Add(voffset + 0);
                triangles.Add(voffset + 1);
                triangles.Add(voffset + 2);
                triangles.Add(voffset + 3);
                triangles.Add(voffset + 2);
                triangles.Add(voffset + 1);

                voffset += 4;
            }

            if (vertices.Count > 0)
            {
                int        index = _mapRegionGameObjList.Count;
                GameObject go    = new GameObject(HobaText.Format("MapRegionGameObj_{0}_{1}", Keys[i], index));

                MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();
                meshRenderer.enabled         = true;
                meshRenderer.name            = HobaText.Format("MapRegionGameObj_{0}_{1}", Keys[i], index);
                meshRenderer.material.shader = Shader.Find("Legacy Shaders/Bumped Diffuse");
                meshRenderer.material.color  = GetMeshColor(Keys[i]);
                CUnityUtil.DisableLightAndShadow(meshRenderer);
                MeshFilter meshFilter = go.AddComponent <MeshFilter>();
                meshFilter.sharedMesh           = new Mesh();
                meshFilter.sharedMesh.name      = HobaText.Format("MeshFilterMesh_{0}_{1}", Keys[i], index);
                meshFilter.sharedMesh.vertices  = vertices.ToArray();
                meshFilter.sharedMesh.triangles = triangles.ToArray();

                _mapRegionGameObjList.Add(go);

                vertices.Clear();
                triangles.Clear();
                voffset = 0;
            }
        }

        return(true);
    }
Esempio n. 2
0
    public bool CreateNavMesh()
    {
        if (_LineGameObj != null)
        {
            GameObject.Destroy(_LineGameObj);
            _LineGameObj = null;
        }

        if (_LineGameObj == null)
        {
            _LineGameObj = new GameObject("LineGameObj");
        }
        for (int i = 0; i < _navMeshGameObjList.Count; ++i)
        {
            GameObject go = _navMeshGameObjList[i];
            if (go != null)
            {
                GameObject.Destroy(go);
            }
        }
        _navMeshGameObjList.Clear();

        LineRenderer lineRenderer = _LineGameObj.AddComponent <LineRenderer>();

        lineRenderer.useWorldSpace = true;
        lineRenderer.startWidth    = 0.05f;
        lineRenderer.endWidth      = 0.05f;
        lineRenderer.enabled       = false;
        CUnityUtil.DisableLightAndShadow(lineRenderer);

        //ground
        {
            LuaInterface.SamplePolyAreas area = LuaInterface.SamplePolyAreas.SAMPLE_POLYAREA_GROUND;

            Vector3[] vertices;
            int[]     triangles;
            //Load NavMesh
            {
                int vCont;
                int iCont;

                NavMeshManager m_navMeshMan = NavMeshManager.Instance;
                m_navMeshMan.GetNavMeshVertexIndexCount(out vCont, out iCont, area);

                vertices  = new Vector3[vCont];
                triangles = new int[iCont];

                m_navMeshMan.FillNavMeshVertexIndexBuffer(vertices, vCont, triangles, iCont, area);
            }

            CUnityUtil.SMeshData meshData = new CUnityUtil.SMeshData();
            meshData.vertices = vertices;
            meshData.indices  = triangles;

            List <CUnityUtil.SMeshData> listMeshData = new List <CUnityUtil.SMeshData>();
            CUnityUtil.SplitMeshData(meshData, listMeshData);

            Color color = new Color(0, 0.75f, 1.0f);
            for (int i = 0; i < listMeshData.Count; ++i)
            {
                GameObject go = new GameObject(HobaText.Format("NavMeshGameObj_{0}_{1}", (int)area, i));

                MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();
                meshRenderer.enabled         = false;
                meshRenderer.name            = HobaText.Format("MeshRenderer_{0}_{1}", (int)area, i);
                meshRenderer.material.shader = Shader.Find("Legacy Shaders/Bumped Diffuse");
                meshRenderer.material.color  = color;
                CUnityUtil.DisableLightAndShadow(meshRenderer);
                MeshFilter meshFilter = go.AddComponent <MeshFilter>();
                meshFilter.sharedMesh           = new Mesh();
                meshFilter.sharedMesh.name      = HobaText.Format("MeshFilterMesh_{0}_{1}", (int)area, i);
                meshFilter.sharedMesh.vertices  = listMeshData[i].vertices;
                meshFilter.sharedMesh.triangles = listMeshData[i].indices;

                _navMeshGameObjList.Add(go);
            }
        }

        //grass
        {
            LuaInterface.SamplePolyAreas area = LuaInterface.SamplePolyAreas.SAMPLE_POLYAREA_GRASS;

            Vector3[] vertices;
            int[]     triangles;
            //Load NavMesh
            {
                int vCont;
                int iCont;

                NavMeshManager m_navMeshMan = NavMeshManager.Instance;
                m_navMeshMan.GetNavMeshVertexIndexCount(out vCont, out iCont, area);

                vertices  = new Vector3[vCont];
                triangles = new int[iCont];

                m_navMeshMan.FillNavMeshVertexIndexBuffer(vertices, vCont, triangles, iCont, area);
            }

            CUnityUtil.SMeshData meshData = new CUnityUtil.SMeshData();
            meshData.vertices = vertices;
            meshData.indices  = triangles;

            List <CUnityUtil.SMeshData> listMeshData = new List <CUnityUtil.SMeshData>();
            CUnityUtil.SplitMeshData(meshData, listMeshData);

            Color color = new Color(0, 0.75f, 0.25f);
            for (int i = 0; i < listMeshData.Count; ++i)
            {
                GameObject go = new GameObject(HobaText.Format("NavMeshGameObj_{0}_{1}", (int)area, i));

                MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();
                meshRenderer.enabled         = false;
                meshRenderer.name            = HobaText.Format("MeshRenderer_{0}_{1}", (int)area, i);
                meshRenderer.material.shader = Shader.Find("Legacy Shaders/Bumped Diffuse");
                meshRenderer.material.color  = color;
                CUnityUtil.DisableLightAndShadow(meshRenderer);
                MeshFilter meshFilter = go.AddComponent <MeshFilter>();
                meshFilter.sharedMesh           = new Mesh();
                meshFilter.sharedMesh.name      = HobaText.Format("MeshFilterMesh_{0}_{1}", (int)area, i);
                meshFilter.sharedMesh.vertices  = listMeshData[i].vertices;
                meshFilter.sharedMesh.triangles = listMeshData[i].indices;

                _navMeshGameObjList.Add(go);
            }
        }

        //road
        {
            LuaInterface.SamplePolyAreas area = LuaInterface.SamplePolyAreas.SAMPLE_POLYAREA_ROAD;

            Vector3[] vertices;
            int[]     triangles;
            //Load NavMesh
            {
                int vCont;
                int iCont;

                NavMeshManager m_navMeshMan = NavMeshManager.Instance;
                m_navMeshMan.GetNavMeshVertexIndexCount(out vCont, out iCont, area);

                vertices  = new Vector3[vCont];
                triangles = new int[iCont];

                m_navMeshMan.FillNavMeshVertexIndexBuffer(vertices, vCont, triangles, iCont, area);
            }

            CUnityUtil.SMeshData meshData = new CUnityUtil.SMeshData();
            meshData.vertices = vertices;
            meshData.indices  = triangles;

            List <CUnityUtil.SMeshData> listMeshData = new List <CUnityUtil.SMeshData>();
            CUnityUtil.SplitMeshData(meshData, listMeshData);

            Color color = new Color(0.75f, 0.25f, 0f);
            for (int i = 0; i < listMeshData.Count; ++i)
            {
                GameObject go = new GameObject(HobaText.Format("NavMeshGameObj_{0}_{1}", (int)area, i));

                MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();
                meshRenderer.enabled         = false;
                meshRenderer.name            = HobaText.Format("MeshRenderer_{0}_{1}", (int)area, i);
                meshRenderer.material.shader = Shader.Find("Legacy Shaders/Bumped Diffuse");
                meshRenderer.material.color  = color;
                CUnityUtil.DisableLightAndShadow(meshRenderer);
                MeshFilter meshFilter = go.AddComponent <MeshFilter>();
                meshFilter.sharedMesh           = new Mesh();
                meshFilter.sharedMesh.name      = HobaText.Format("MeshFilterMesh_{0}_{1}", (int)area, i);
                meshFilter.sharedMesh.vertices  = listMeshData[i].vertices;
                meshFilter.sharedMesh.triangles = listMeshData[i].indices;

                _navMeshGameObjList.Add(go);
            }
        }


        //Default false
/*        showNavMesh(true);*/
        return(true);
    }