public static List <Vector3> CoordsToVerts(IList geometry, bool withNoise, GOTileObj goTile) { var convertedGeometry = new List <Vector3>(); for (int i = 0; i < geometry.Count; i++) { if (geometry.GetType() == typeof(List <LatLng>)) //Mapbox { LatLng c = (LatLng)geometry [i]; Coordinates coords = new Coordinates(c.Lat, c.Lng, 0); Vector3 p = goTile.coordinatesToVector(coords); if (withNoise && i != 0 && i != geometry.Count - 1) { float noise = GOFeatureMeshBuilder.Noise(); p.x += noise; p.z += noise; } convertedGeometry.Add(p); } else //Mapzen { IList c = (IList)geometry[i]; Coordinates coords = new Coordinates((double)c[1], (double)c[0], 0); convertedGeometry.Add(goTile.coordinatesToVector(coords)); } } return(convertedGeometry); }
public virtual IEnumerator CreatePolygon (GOTile tile, bool delayedLoad) { Profiler.BeginSample ("[GOFeature] CreatePolygon ALLOC"); GOFeatureMeshBuilder builder = new GOFeatureMeshBuilder(this); Profiler.EndSample (); Profiler.BeginSample ("[GOFeature] CreatePolygon Material"); //Materials Material material = tile.GetMaterial(renderingOptions,builder.center); Material roofMat = renderingOptions.roofMaterial; if (sort != 0) { if (material) material.renderQueue = -(int)sort; if (roofMat) roofMat.renderQueue = -(int)sort; } Profiler.EndSample (); Profiler.BeginSample ("[GOFeature] CreatePolygon Center"); //Group buildings by center coordinates if (layer.layerType == GOLayer.GOLayerType.Buildings && defaultRendering) { GameObject centerContainer = tile.findNearestCenter(builder.center,parent,material); parent = centerContainer; material = centerContainer.GetComponent<GOMatHolder> ().material; } Profiler.EndSample(); if (!layer.useRealHeight) { height = renderingOptions.polygonHeight; } int offset = 0; float trueHeight = height; #if GOLINK if (GOMap.GOLink) { trueHeight += BuildingElevationOffset; //[GOLINK] GOTerrain link (This requires GOTerrain! https://www.assetstore.unity3d.com/#!/content/84198) if (tile.map.goTerrain != null) { offset = BuildingElevationOffset; if (y < offset) y = tile.map.goTerrain.FindAltitudeForVector(builder.center)-offset; } } #endif Profiler.BeginSample ("[GOFeature] CreatePolygon MESH"); GameObject polygon = null; if (preloadedMeshData != null) polygon = builder.BuildPolygonFromPreloaded(this); else if (tile.map.mapType == GOMap.GOMapType.MapzenJson) //ONLY FOR JSON polygon = builder.BuildPolygon(layer,trueHeight+offset); Profiler.EndSample (); if (polygon == null) yield break; polygon.name = name; polygon.transform.parent = parent.transform; //Layer mask if (layer.useLayerMask == true) { tile.AddObjectToLayerMask (layer, polygon); } if (renderingOptions.tag.Length > 0) { polygon.tag = renderingOptions.tag; } if (layer.useRealHeight && roofMat != null) { Profiler.BeginSample ("[GOFeature] CreatePolygon ROOF"); GameObject roof; if (preloadedMeshData != null && preloadedMeshData.secondaryMesh != null) roof = builder.CreateRoofFromPreloaded (preloadedMeshData.secondaryMesh); else roof = builder.CreateRoof(); roof.name = "roof"; roof.transform.parent = polygon.transform; roof.GetComponent<MeshRenderer> ().material = roofMat; roof.transform.position = new Vector3 (roof.transform.position.x,trueHeight+0.11f,roof.transform.position.z); roof.tag = polygon.tag; roof.layer = polygon.layer; Profiler.EndSample (); } Profiler.BeginSample ("[GOFeature] TRANSFORM"); Vector3 pos = polygon.transform.position; pos.y = y; if (layer.layerType == GOLayer.GOLayerType.Buildings) y += GOFeatureMeshBuilder.Noise (); polygon.transform.position = pos; polygon.transform.localPosition = pos; GOFeatureBehaviour fb = polygon.AddComponent<GOFeatureBehaviour> (); fb.goFeature = this; builder.meshRenderer.material = material; if (layer.OnFeatureLoad != null) { layer.OnFeatureLoad.Invoke(builder.mesh,layer,kind, builder.center); } Profiler.EndSample (); preloadedMeshData = null; if (delayedLoad) yield return null; }
public virtual IEnumerator CreatePolygon(GOTile tile, bool delayedLoad) { // // if (layer.layerType == GOLayer.GOLayerType.Buildings && name != "Whitehall Building Annex") // yield break; Profiler.BeginSample("[GOFeature] CreatePolygon ALLOC"); GOFeatureMeshBuilder builder = new GOFeatureMeshBuilder(this); this.featureCenter = new Vector3(2, builder.center.y, 8); //new Vector3 (builder.center.x, builder.center.y, builder.center.z); Profiler.EndSample(); Material material = null; Material roofMat = null; if (layer.layerType == GOLayer.GOLayerType.Buildings && defaultRendering && renderingOptions.materials.Length != 0) { Profiler.BeginSample("[GOFeature] CreatePolygon Center"); GOCenterContainer centerContainer = tile.findNearestCenter(builder.center, parent); Profiler.EndSample(); if (centerContainer.material == null) { Profiler.BeginSample("[GOFeature] CreatePolygon Material"); centerContainer.material = tile.GetMaterial(renderingOptions, builder.center); centerContainer.secondaryMaterial = renderingOptions.roofMaterial; Profiler.EndSample(); } material = centerContainer.material; roofMat = centerContainer.secondaryMaterial; } else { Profiler.BeginSample("[GOFeature] CreatePolygon Material"); //Materials material = tile.GetMaterial(renderingOptions, builder.center); roofMat = renderingOptions.roofMaterial; Profiler.EndSample(); } if (sort != 0) { if (material) { material.renderQueue = -(int)sort; } if (roofMat) { roofMat.renderQueue = -(int)sort; } } if (!layer.useRealHeight) { height = renderingOptions.polygonHeight; } float offset = 0; float trueHeight = height; if (goTile.useElevation && layer.layerType == GOLayer.GOLayerType.Buildings) { trueHeight += BuildingElevationOffset; offset = BuildingElevationOffset; if (y < offset) { y = highestAltitudeVertex - offset + 0.5f; } // y = goTile.altitudeForPoint(builder.center)-offset+0.5f; } Profiler.BeginSample("[GOFeature] CreatePolygon MESH"); GameObject polygon = null; if (preloadedMeshData != null) { polygon = builder.BuildPolygonFromPreloaded(this, parent); } Profiler.EndSample(); if (polygon == null) { yield break; } polygon.name = name; //Layer mask if (layer.useLayerMask == true) { tile.AddObjectToLayerMask(layer, polygon); } if (renderingOptions.tag.Length > 0) { polygon.tag = renderingOptions.tag; } if (renderingOptions.hasRoof) { Material[] mats = new Material[2]; mats [0] = material; mats [1] = roofMat; MeshRenderer mr = polygon.GetComponent <MeshRenderer> (); mr.shadowCastingMode = layer.castShadows; mr.materials = mats; } else { builder.meshRenderer.material = material; builder.meshRenderer.shadowCastingMode = layer.castShadows; } Profiler.BeginSample("[GOFeature] TRANSFORM"); Vector3 pos = polygon.transform.position; pos.y = y; if (layer.layerType == GOLayer.GOLayerType.Buildings) { y += GOFeatureMeshBuilder.Noise(); } polygon.transform.position = pos; polygon.transform.localPosition = pos; if (goTile.addGoFeatureComponents) { GOFeatureBehaviour fb = polygon.AddComponent <GOFeatureBehaviour> (); fb.goFeature = this; } if (layer.OnFeatureLoad != null) { layer.OnFeatureLoad.Invoke(this, polygon); } Profiler.EndSample(); preloadedMeshData = null; if (delayedLoad) { yield return(null); } }