Exemple #1
0
    void CheckSelectedTile()
    {
        RaycastHit        hit;
        TerrainController terrain = TerrainController.thisTerrainController;

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit, float.MaxValue, terrainLayer))
        {
            highlighter.Clear();
            GridTile tile = GridTile.FindClosestGridTile(hit.point - new Vector3(terrain.tileSize / 2, 0, terrain.tileSize / 2));
            if (tile == null)
            {
                return;
            }

            for (int i = 0; i < 4; i++)
            {
                vert[i] = tile.gridNodes[i].position + new Vector3(0, 0.3f, 0);
            }

            highlighter.vertices  = vert;
            highlighter.triangles = tri;
            highlighter.uv        = uv;

            UIScript.GetInstance().SetActiveTile(tile);
        }
        highlighter.RecalculateNormals();
        GetComponent <MeshFilter>().mesh = highlighter;
    }
    void UpdateSelectionMesh()
    {
        int tileSize = terrainController.tileSize;

        Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask))
        {
            vertices.Clear();
            triangles.Clear();

            Vector3 hitPoint = hit.point;

            for (int i = -currentSize; i < currentSize; i++)
            {
                for (int j = -currentSize; j < currentSize; j++)
                {
                    Vector3  currentPos  = new Vector3(hitPoint.x + i * tileSize, 0, hitPoint.z + j * tileSize);
                    GridTile curGridTile = GridTile.FindClosestGridTile(currentPos);

                    if (curGridTile == null || Vector3.Distance(hit.point, curGridTile.position) > currentSize * tileSize)
                    {
                        continue;
                    }

                    CreatePlane(curGridTile.gridNodes.ToArray());
                }
            }

            SetMesh();
        }
    }
Exemple #3
0
 bool AboveGround(Vector3 vertex)
 {
     if (GridTile.FindClosestGridTile(vertex + transform.position) != null)
     {
         return(vertex.y > GridTile.FindClosestGridTile(vertex + transform.position).position.y);
     }
     else
     {
         return(false);
     }
 }
Exemple #4
0
    // Use this for initialization
    void Start()
    {
        city = this;

        terrain = TerrainController.thisTerrainController;

        float   xPos      = minLocX * terrain.length + (float)rand.NextDouble() * (maxLocX - minLocX) * terrain.length;
        float   zPos      = minLocZ * terrain.width + (float)rand.NextDouble() * (maxLocZ - minLocZ) * terrain.width;
        Vector3 centerPos = new Vector3(xPos, 0, zPos);

        centerTile         = GridTile.FindClosestGridTile(centerPos);
        cityPointTimer     = 0;
        cityPoints         = 0;
        requiredCityPoints = 8000;
        maximumRadius      = 400;
        currentRadius      = startRadius;
        StartCoroutine(BuildStartCity());
    }
Exemple #5
0
    // Set the terrain height around a position to the tile closest to the entered position
    void EqualTerrain(Vector3 pos, float circleRadius, bool isTemp)
    {
        GridTile        middleTile = GridTile.FindClosestGridTile(pos);
        List <GridTile> gridtiles  = GridTile.FindGridTilesAround(pos, circleRadius);

        List <Chunk> updateChunks = new List <Chunk>();

        foreach (GridTile tile in gridtiles)
        {
            for (int i = 0; i < tile.gridNodes.Count; i++)
            {
                if (tile.gridNodes[i].heighIsSet)
                {
                    continue;
                }

                Vector3 newPos = Vector3.zero;
                Vector3 vertex = tile.gridNodes[i].position;
                Chunk[] chunks = Chunk.FindChunksWithVertex(vertex);
                foreach (Chunk chunk in chunks)
                {
                    int[] index = Chunk.FindClosestVertices(vertex, chunk);

                    float diffx = chunk.gameObject.transform.position.x + chunk.map[index[0], index[1]].x - middleTile.position.x;
                    float diffz = chunk.gameObject.transform.position.z + chunk.map[index[0], index[1]].z - middleTile.position.z;

                    newPos = new Vector3(chunk.map[index[0], index[1]].x, pos.y, chunk.map[index[0], index[1]].z);

                    if (!isTemp)
                    {
                        chunk.map[index[0], index[1]] = newPos;
                    }
                    else
                    {
                        chunk.tempMap[index[0], index[1]] = newPos;
                    }

                    //chunk.AddVertsAndUVAndNorm(chunk.map.GetLength(0), true);

                    if (!updateChunks.Contains(chunk))
                    {
                        updateChunks.Add(chunk);
                    }
                }

                if (!isTemp)
                {
                    tile.gridNodes[i].position   = new Vector3(tile.gridNodes[i].position.x, pos.y, tile.gridNodes[i].position.z);
                    tile.gridNodes[i].heighIsSet = true;
                }
            }
            if (!isTemp)
            {
                tile.position = tile.gridNodes[0].position;
            }
        }
        foreach (Chunk chunk in updateChunks)
        {
            chunk.GenerateTerrainMesh(true, isTemp);
            tempChunks.Add(chunk);
        }
    }
Exemple #6
0
    // Function that determines if a tile has an object on it and return true if there is no objects on all the tiles in a circle with size as diameter.
    public bool CanBuild(Vector3 pos, float size, GameObject buildObj, float scale, Quaternion rotation, bool neglectTerrainObjects)
    {
        List <GridTile> gridtiles = GridTile.FindGridTilesAround(pos, size + 60);
        GridTile        thisTile  = GridTile.FindClosestGridTile(pos);

        Collider[] colliders = Physics.OverlapBox(buildObj.GetComponent <BoxCollider>().center *scale + pos, buildObj.GetComponent <BoxCollider>().size / 2 * scale, rotation, notTerrain);

        if (colliders.Length > 1)
        {
            return(false);
        }

        else if (colliders.Length == 1 && colliders[0].gameObject.GetInstanceID() != buildObj.gameObject.GetInstanceID())
        {
            return(false);
        }

        if (pos.y <= TerrainController.thisTerrainController.waterLevel)
        {
            return(false);
        }

        float lowPoint  = pos.y;
        float highPoint = pos.y;
        bool  heighSet  = false;

        foreach (GridTile tile in gridtiles)
        {
            if (tile.isOutsideBorder)
            {
                return(false);
            }

            for (int i = 0; i < tile.gridNodes.Count; i++)
            {
                if (tile.gridNodes[i].position.y > highPoint)
                {
                    highPoint = tile.position.y;
                }
                else if (tile.gridNodes[i].position.y < lowPoint)
                {
                    lowPoint = tile.position.y;
                }

                if (tile.gridNodes[i].heighIsSet)
                {
                    heighSet = true;
                }
            }
        }
        if ((highPoint - lowPoint > 40 || lowPoint < TerrainController.thisTerrainController.waterLevel) && heighSet)
        {
            return(false);
        }
        if (BuildingHeight(pos, size * scale) == -1)
        {
            return(false);
        }

        return(true);
    }
    void CalculateChunk(object args)
    {
        object[] argsArr = (object[])args;
        int      i       = (int)argsArr[0];
        float    time    = (float)argsArr[1];

        int operationsPerThread = Mathf.CeilToInt(windSpeedChunks.Count / chunkThreads.Length);
        int windCount           = windSpeedChunks.Count;

        int startK = (int)i * operationsPerThread;
        int endK   = ((int)i + 1) * operationsPerThread;

        for (int k = startK; k < endK; k++)
        {
            if (k >= windCount)
            {
                break;
            }

            if (!windSpeedChunks[k].isEnabled)
            {
                continue;
            }

            List <Vector3> vert = threadVerts[k];

            for (int j = 0; j < vert.Count; j++)
            {
                GridTile tile = GridTile.FindClosestGridTile(vert[j]);

                if (tile != null && tile.canSeeWind && !tile.isOutsideBorder)
                {
                    float   curWind = WindController.GetWindAtTile(tile, height, time);
                    Vector2 curUv   = new Vector2(1 - curWind / WindController.WindMagnitudeAtTime(time), 1 - curWind / WindController.WindMagnitudeAtTime(time));
                    for (int intp = 0; intp < intpSteps; intp++)
                    {
                        if (curUvs)
                        {
                            Vector2 interpolated = Vector2.Lerp(buffereduvs[k][(intpSteps - 1)][j], curUv, (float)intp / (intpSteps - 1));

                            uvs[k][intp][j].Set(interpolated.x, interpolated.y);
                        }
                        else
                        {
                            Vector2 interpolated = Vector2.Lerp(uvs[k][(intpSteps - 1)][j], curUv, (float)intp / (intpSteps - 1));

                            buffereduvs[k][intp][j].Set(interpolated.x, interpolated.y);
                        }

                        if (stopThreads)
                        {
                            return;
                        }
                    }
                }
                else if (tile != null && !tile.canSeeWind && !tile.isOutsideBorder)
                {
                    Vector2 curUv = new Vector2(0.125f, 0.875f);

                    for (int intp = 0; intp < intpSteps; intp++)
                    {
                        if (curUvs)
                        {
                            Vector2 interpolated = Vector2.Lerp(buffereduvs[k][(intpSteps - 1)][j], curUv, (float)intp / (intpSteps - 1));

                            uvs[k][intp][j].Set(interpolated.x, interpolated.y);
                        }
                        else
                        {
                            Vector2 interpolated = Vector2.Lerp(uvs[k][(intpSteps - 1)][j], curUv, (float)intp / (intpSteps - 1));

                            buffereduvs[k][intp][j].Set(interpolated.x, interpolated.y);
                        }

                        if (stopThreads)
                        {
                            return;
                        }
                    }
                }
            }
        }
    }
 void Start()
 {
     uniProperties = GetComponent <UniversalProperties>();
     health        = 1;
     onGridtile    = GridTile.FindClosestGridTile(transform.position);
 }