Exemplo n.º 1
0
        private static void ReadLimits(GsiDemData gsiDemData, XmlReader reader)
        {
            string limitLine = reader.ReadElementContentAsString();

            string[] sep = limitLine.Split(' ');
            gsiDemData.XLen = int.Parse(sep[0]) + 1;
            gsiDemData.YLen = int.Parse(sep[1]) + 1;
        }
Exemplo n.º 2
0
        public static GsiDemData Parse(string path)
        {
            GsiDemData gsiDemData = new GsiDemData();

            Debug.Log(path);

            using (XmlReader reader = XmlReader.Create(path))
            {
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                    case XmlNodeType.Element:
                        if (reader.Name.Equals("fid"))
                        {
                            string   fid      = reader.ReadElementContentAsString();
                            string[] sepSplit = fid.Split('-');
                            gsiDemData.FileID = sepSplit[sepSplit.Length - 1];
                        }

                        if (reader.Name.Equals("gml:lowerCorner"))
                        {
                            gsiDemData.LowerCorner = ReadPos(reader);
                        }

                        if (reader.Name.Equals("gml:upperCorner"))
                        {
                            gsiDemData.UpperCorner = ReadPos(reader);
                        }

                        if (reader.Name.Equals("gml:high"))
                        {
                            ReadLimits(gsiDemData, reader);
                        }

                        if (reader.Name.Equals("gml:tupleList"))
                        {
                            ReadTupleList(gsiDemData, reader);
                        }

                        break;
                    }
                }
            }

            Debug.LogFormat("X {0} Y {1} / D {2}", gsiDemData.XLen, gsiDemData.YLen, gsiDemData.DemLists.Count);
            return(gsiDemData);
        }
Exemplo n.º 3
0
        public static void CreateGroundMesh(string directoryPath, GameObject parent, Vector2 worldCenter, Vector2 worldScale)
        {
            GameObject root = new GameObject("GroundRoot");

            root.transform.parent = parent.transform;
            string[] files = Directory.GetFiles(Path.Combine(Application.streamingAssetsPath, directoryPath))
                             .Where(s => !s.EndsWith(".meta"))
                             .ToArray();

            foreach (var file in files)
            {
                string     gsiDemMapName = Path.Combine(directoryPath, file);
                string     target        = Path.Combine(Application.streamingAssetsPath, gsiDemMapName);
                GsiDemData gsiDemData    = GsiDemParser.Parse(target);
                CreateGroundMeshByGsi(gsiDemData, root, worldCenter, worldScale);
            }
        }
Exemplo n.º 4
0
        private static void ReadTupleList(GsiDemData gsiDemData, XmlReader reader)
        {
            string[] posListLines = reader.ReadElementContentAsString().Split('\n');

            for (int i = 1; i < posListLines.Length - 1; i++)
            {
                string[] sep = posListLines[i].Split(',');
                float    dem = float.Parse(sep[1]);

                if (dem < 0)
                {
                    dem = 0.0f;
                    // dem = gsiDemData.DemLists[gsiDemData.DemLists.Count - 1];
                    // Debug.Log(string.Format("{0} {1}", i, posListLines[i]));
                }

                gsiDemData.DemLists.Add(dem);
            }
        }
Exemplo n.º 5
0
        private static void CreateGroundMeshByGsi(GsiDemData gsiDemData, GameObject parent, Vector2 worldCenter, Vector2 worldScale)
        {
            float FileMeterDegree = ((gsiDemData.UpperCorner.y - gsiDemData.LowerCorner.y) / (gsiDemData.YLen - 1));

            Debug.Log(FileMeterDegree);
            List <Vector3> verticesList = new List <Vector3>();

            for (int y = 0; y < gsiDemData.YLen; y++)
            {
                for (int x = 0; x < gsiDemData.XLen; x++)
                {
                    Vector2 pos = new Vector2
                    {
                        y = gsiDemData.LowerCorner.y + FileMeterDegree * (gsiDemData.YLen - y),
                        x = gsiDemData.LowerCorner.x + FileMeterDegree * x,
                    };
                    float northLat = (pos.y - worldCenter.y) * worldScale.y;
                    float eastLon  = (pos.x - worldCenter.x) * worldScale.x;
                    int   index    = y * gsiDemData.XLen + x;
                    var   height   = -1.0f;

                    if (index < gsiDemData.DemLists.Count)
                    {
                        height = gsiDemData.DemLists[index];
                    }

                    verticesList.Add(
                        new Vector3(
                            eastLon,
                            height,
                            northLat)
                        );
                }
            }

            List <int> trianglesList = new List <int>();

            for (int i = 0; i < verticesList.Count; i++)
            {
                if ((i % gsiDemData.XLen) == (gsiDemData.XLen - 1))
                {
                    continue;
                }

                if (i + gsiDemData.XLen < verticesList.Count)
                {
                    trianglesList.Add(i);
                    trianglesList.Add(i + 1);
                    trianglesList.Add(i + gsiDemData.XLen);
                    trianglesList.Add(i + 1);
                    trianglesList.Add(i + 1 + gsiDemData.XLen);
                    trianglesList.Add(i + gsiDemData.XLen);
                }
            }

            GameObject obj          = new GameObject("Ground" + gsiDemData.FileID);
            var        meshFilter   = obj.AddComponent <MeshFilter>();
            var        meshRenderer = obj.AddComponent <MeshRenderer>();
            var        meshCollider = obj.AddComponent <MeshCollider>();
            Mesh       mesh         = new Mesh();

            {
                mesh.vertices  = verticesList.ToArray();
                mesh.triangles = trianglesList.ToArray();
                mesh.RecalculateNormals();
            }
            meshFilter.sharedMesh       = mesh;
            meshCollider.sharedMesh     = mesh;
            meshRenderer.sharedMaterial = Resources.Load <Material>("Buildings/Materials/StandardOrange");
            obj.transform.parent        = parent.transform;
        }