示例#1
0
 /**
  * Get singleton object for terrain render
  */
 public static TerrainRender Get()
 {
     if (terrainRender == null)
     {
         terrainRender = (new GameObject("TerrainRender")).AddComponent <TerrainRender>();
     }
     return(terrainRender);
 }
示例#2
0
        /**
         * Změna Y souřadnice stěn na hodnotu výšky terénu
         */
        private List <Vector3> GetGroundEdges(ThreeDimObject threeDimObject)
        {
            TerrainHeight = TerrainUtils.MapTopValue + 1f;
            var biggestTerrainHeight = 0f;
            var localCoordinates     = threeDimObject.XyzCoordinates;

            foreach (var localCoordinate in localCoordinates)
            {
                var tempHeight = TerrainRender.Get().Terrain.SampleHeight(localCoordinate);
                //get biggest terrain height
                if (tempHeight > biggestTerrainHeight)
                {
                    biggestTerrainHeight = tempHeight;
                }

                //get lowest terrain height
                if (tempHeight < TerrainHeight)
                {
                    TerrainHeight = tempHeight;
                }
            }

            //no coordinates, set default value
            if (TerrainHeight == TerrainUtils.MapTopValue + 1f)
            {
                TerrainHeight = 0f;
            }

            var groundEdges = new List <Vector3>();

            foreach (var localCoordinate in localCoordinates)
            {
                var v = localCoordinate;
                v.y = TerrainHeight;
                groundEdges.Add(v);
            }

            //save biggest terrain height for roof edges
            TerrainHeight = biggestTerrainHeight;

            return(groundEdges);
        }
示例#3
0
        /**
         * Create trees on the terrain
         */
        public void GenerateTrees(LatLngObject middleMapPoint, List <TreeObject> trees)
        {
            Vector3 middleMapXyz;

            ConiferousTree = Resources.Load("3DObjects/Trees/Prefabs/Fir_Tree", typeof(GameObject)) as GameObject;
            LeafyTree      = Resources.Load("3DObjects/Trees/Prefabs/Poplar_Tree", typeof(GameObject)) as GameObject;
            //default position, if map does not contain any building or road
            if (middleMapPoint.Equals(new LatLngObject()))
            {
                middleMapXyz = Vector3.zero;
            }
            else
            {
                middleMapXyz = Converter.ConvertLatLngToXyz(middleMapPoint);
            }

            var         treeCount = Main.Settings.NumberOfTrees;
            const float treeScale = 0.06f;
            var         terrain   = TerrainRender.Get().Terrain;
            var         random    = new Random();

            //GENERATE RANDOM TREE POSITIONS
            if (trees.Count == 0)
            {
                for (var i = 0; i < treeCount; i++)
                {
                    var       decimalRandomPartX = random.NextDouble();
                    var       decimalRandomPartZ = random.NextDouble();
                    const int limitX             = (TerrainUtils.MapWidth / 2) - 2;
                    const int limitZ             = (TerrainUtils.MapHeight / 2) - 2;
                    var       randomX            = random.Next((int)(middleMapXyz.x - limitX), (int)(middleMapXyz.x + limitX));
                    // + 2 a + 1 kvuli korekcim umisteni na hranice terenu
                    var randomZ    = random.Next((int)(middleMapXyz.z - limitZ + 2), (int)(middleMapXyz.z + limitZ + 1));
                    var randomDecX = (float)(randomX + decimalRandomPartX);
                    var randomDecZ = (float)(randomZ + decimalRandomPartZ);
                    var randomPos  = new Vector3(randomDecX, 0, randomDecZ);
                    var terrainY   = terrain.SampleHeight(randomPos);
                    randomPos.y = terrainY;

                    var randNumberTree = random.Next(0, 2);
                    if (!IsPointInCollision(randomPos))
                    {
                        GameObject tree;
                        switch (randNumberTree)
                        {
                        case 0:
                            tree = Instantiate(LeafyTree);
                            break;

                        default:
                            tree = Instantiate(ConiferousTree);
                            break;
                        }

                        var treeTransform = tree.transform;
                        treeTransform.position   = randomPos;
                        treeTransform.localScale = new Vector3(treeScale, treeScale, treeScale);
                    }
                    else
                    {
                        --i;
                    }
                }
            }
            //CUSTOM TREE POSITIONS
            else
            {
                foreach (var currentTree in trees)
                {
                    var treePos = Converter.ConvertLatLngToXyz(currentTree.LatLngCoordinate);
                    //if tree is outside the map
                    if (TerrainUtils.IsObjectOutsideMap(treePos, middleMapXyz))
                    {
                        continue;
                    }

                    //set y position from terrain
                    var terrainY = terrain.SampleHeight(treePos);
                    treePos.y = terrainY;

                    var        randNumberTree = random.Next(0, 2);
                    GameObject tree;
                    switch (randNumberTree)
                    {
                    case 0:
                        tree = Instantiate(LeafyTree);
                        break;

                    default:
                        tree = Instantiate(ConiferousTree);
                        break;
                    }

                    var treeTransform = tree.transform;
                    treeTransform.position   = treePos;
                    treeTransform.localScale = new Vector3(treeScale, treeScale, treeScale);
                }
            }
        }
示例#4
0
        /**
         * Render roads
         */
        public void Render(LatLngObject mapMiddleMapPoint, Transform cameraTransform, List <RoadObject> roads)
        {
            if (roads.Count == 0)
            {
                return;
            }

            var middleMapPoint = Converter.ConvertLatLngToXyz(mapMiddleMapPoint);

            //save into global variable
            Roads = roads;
            var terrain = TerrainRender.Get().Terrain;

            //render roads
            for (var i = 0; i < roads.Count; i++)
            {
                var ySize = 1;

                var roadPointInXyz = new Vector3[roads[i].LatLngCoordinates.Count];
                if (roadPointInXyz.Length == 0)
                {
                    continue;
                }

                //convert road point from LatLng to Xyz coordination's; Y coordinate values set as terrain height
                for (var j = 0; j < roadPointInXyz.Length; j++)
                {
                    roadPointInXyz[j] = Converter.ConvertLatLngToXyz(roads[i].LatLngCoordinates[j]);
                    //pricteni hodnoty navic proti prolinani s terenem
                    roadPointInXyz[j].y = terrain.SampleHeight(roadPointInXyz[j]) + 0.03f;
                }

                //road starts outside terrain => reverse points
                if (TerrainUtils.IsObjectOutsideMap(roadPointInXyz[0], middleMapPoint))
                {
                    Array.Reverse(roadPointInXyz);
                }

                //points of road
                for (var j = 0; j < roadPointInXyz.Length; j++)
                {
                    var roadPoint = roadPointInXyz[j];
                    //pokud je mezi dvěma body cesty rozdíl větší než 1
                    if (j == 0 || Math.Abs(roadPoint.x - roadPointInXyz[j - 1].x) >= 1 || Math.Abs(roadPoint.z - roadPointInXyz[j - 1].z) >= 1)
                    {
                        continue;
                    }

                    //snižovat souřadnici Y cesty, pokud je za hranou terénu (efekt padání cesty)
                    if (TerrainUtils.IsObjectOutsideMap(roadPoint, middleMapPoint))
                    {
                        roadPointInXyz[j].y -= ySize;
                        ySize++;
                    }
                }

                //vytvoreni cesty(nastaveni barvy, pozic, poctu pozic...)
                CreateRoadObject(roads, roadPointInXyz, i);

                //set cars for road type
                var carRoads     = new[] { RoadUtils.Secondary };
                var vehicleTypes = new[] { RoadUtils.VehicleTram };
                if (Main.Settings.RoadObjectsToggle && carRoads.Contains(roads[i].RoadType) || vehicleTypes.Contains(roads[i].VehicleType))
                {
                    roads[i].XyzCoordinates = roadPointInXyz;
                    RoadObjectRender.Get().RenderObjectsOnRoad(roads[i], middleMapPoint);
                }

                UiUtils.SetDefaultCameraPos(middleMapPoint, cameraTransform);
            }
        }