private void GenerateBuilding(Vector3[] vertices, float height) { var isClockwise = SimCoordinatesUtils.PolygonIsClockwise(vertices); Mesh newMesh = new Mesh(); GameObject building = new GameObject("Building"); GameObject shapes = new GameObject("Shapes"); building.transform.parent = mainObject.transform; building.transform.position = mainObject.transform.position; shapes.transform.parent = building.transform; shapes.AddComponent <MeshFilter>(); shapes.AddComponent <MeshRenderer>(); shapes.transform.position = new Vector3(0, 0, 0); shapes.GetComponent <MeshFilter>().mesh = newMesh; shapes.GetComponent <MeshRenderer>().material = this.material; CombineInstance[] combine = new CombineInstance[vertices.Length]; Vector3[] extrudedVertices = new Vector3[vertices.Length]; int[] triangles; for (int i = 0; i < vertices.Length; i++) { extrudedVertices[i] = new Vector3(vertices[i].x, vertices[i].y + height, vertices[i].z); if (i > 0) { if (isClockwise) { triangles = new int[6] { 0, 2, 1, 2, 3, 1 }; } else { triangles = new int[6] { 0, 1, 2, 2, 1, 3 }; } Mesh face = new Mesh { vertices = new Vector3[] { vertices[i - 1], extrudedVertices[i - 1], vertices[i], extrudedVertices[i] }, triangles = triangles, }; combine[i - 1].mesh = face; combine[i - 1].transform = building.transform.localToWorldMatrix; } } combine[vertices.Length - 1].mesh = GenerateRoof(extrudedVertices); combine[vertices.Length - 1].transform = building.transform.localToWorldMatrix; newMesh.CombineMeshes(combine); newMesh.RecalculateNormals(); }
public void CreateEnvironment(Coords worldPoint, int worldRadius, Vector3 editorPoint, float height, int editorRadius) { SetupGOInstance(editorPoint); var square = CoordinatesUtils.SquareFromCenter((worldPoint.Latitude, worldPoint.Longitude), worldRadius); var squareSim = CoordinatesUtils.SquareFromCenterSim(new Vector3(0, 0, 0), editorRadius); var tile = new Tile(square[2], square[0], squareSim[2], squareSim[0]); // Retrieve data from API only if necessary var data = SessionState.GetString("prev_environment", ""); if (SettingsHaveChanged(worldPoint, worldRadius, height) == true) { SessionState.SetFloat("prev_latitude", worldPoint.Latitude); SessionState.SetFloat("prev_longitude", worldPoint.Longitude); SessionState.SetInt("prev_radius", worldRadius); SessionState.SetFloat("prev_editor_heigh", height); data = Overpass.GetBuildingsInArea(tile); } var dataObj = JsonConvert.DeserializeObject <DataProperties>(data); SessionState.SetString("prev_environment", data); foreach (Elements elem in dataObj.elements) { Vector3[] points = new Vector3[elem.geometry.Length]; for (int i = 0; i < elem.geometry.Length; i++) { Coords geoPoint = new Coords(elem.geometry[i].lat, elem.geometry[i].lon); Vector3 simPoint = SimCoordinatesUtils.GPSToSim(geoPoint, tile); points[i] = simPoint; } GenerateBuilding(points, height); } }