示例#1
0
        private void GetVertices(Vector2d tileMercPos, Building.BuildingSettings typeSettings, IEnumerable <JSONObject> items, List <Vector3> verts, List <int> indices)
        {
            foreach (var geo in items)
            {
                var buildingCorners = new List <Vector3>();
                //foreach (var bb in geo["geometry"]["coordinates"].list)
                //{
                var bb = geo["geometry"]["coordinates"].list[0]; //this is wrong but cant fix it now
                for (int i = 0; i < bb.list.Count - 1; i++)
                {
                    var c            = bb.list[i];
                    var dotMerc      = GM.LatLonToMeters(c[1].f, c[0].f);
                    var localMercPos = new Vector2((float)(dotMerc.x - tileMercPos.x), (float)(dotMerc.y - tileMercPos.y));
                    buildingCorners.Add(localMercPos.ToVector3xz());
                }

                var height = 0f;
                if (typeSettings.IsVolumetric)
                {
                    height = geo["properties"].HasField("height") ? geo["properties"]["height"].f : Random.Range(typeSettings.MinimumBuildingHeight, typeSettings.MaximumBuildingHeight);
                }

                CreateMesh(buildingCorners, height, typeSettings, ref verts, ref indices);
                //}
            }
        }
示例#2
0
        private void CreateMesh(List <Vector3> corners, float height, Building.BuildingSettings typeSettings, List <Vector3> verts, List <int> indices)
        {
            var tris            = new Triangulator(corners);
            var vertsStartCount = verts.Count;

            verts.AddRange(corners.Select(x => new Vector3(x.x, height, x.z)).ToList());
            indices.AddRange(tris.Triangulate().Select(x => vertsStartCount + x));

            if (typeSettings.IsVolumetric)
            {
                Vector3 v1;
                Vector3 v2;
                int     ind = 0;
                for (int i = 1; i < corners.Count; i++)
                {
                    v1  = verts[vertsStartCount + i - 1];
                    v2  = verts[vertsStartCount + i];
                    ind = verts.Count;
                    verts.Add(v1);
                    verts.Add(v2);
                    verts.Add(new Vector3(v1.x, 0, v1.z));
                    verts.Add(new Vector3(v2.x, 0, v2.z));

                    indices.Add(ind);
                    indices.Add(ind + 2);
                    indices.Add(ind + 1);

                    indices.Add(ind + 1);
                    indices.Add(ind + 2);
                    indices.Add(ind + 3);
                }

                v1  = verts[vertsStartCount];
                v2  = verts[vertsStartCount + corners.Count - 1];
                ind = verts.Count;
                verts.Add(v1);
                verts.Add(v2);
                verts.Add(new Vector3(v1.x, 0, v1.z));
                verts.Add(new Vector3(v2.x, 0, v2.z));

                indices.Add(ind);
                indices.Add(ind + 1);
                indices.Add(ind + 2);

                indices.Add(ind + 1);
                indices.Add(ind + 3);
                indices.Add(ind + 2);
            }
        }
示例#3
0
        private static void SetProperties(JSONObject geo, Building building, Building.BuildingSettings typeSettings)
        {
            building.name = "building " + geo["properties"]["id"].ToString();
            if (geo["properties"].HasField("name"))
            {
                building.Name = geo["properties"]["name"].str;
            }

            building.Id          = geo["properties"]["id"].ToString();
            building.Type        = geo["type"].str;
            building.SortKey     = (int)geo["properties"]["sort_key"].f;
            building.Kind        = typeSettings.Type.ToString();
            building.LanduseKind = typeSettings.Type.ToString();
            building.GetComponent <MeshRenderer>().material = typeSettings.Material;
        }