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); //} } }
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); } }
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; }