public Mesh GetTerrainInnerMesh(TerrainViewFeature feature)
    {
        Mesh mesh;

        if (innerDictionary.TryGetValue(feature, out mesh))
        {
            return(mesh);
        }
        mesh = generateInnerMesh(feature);
        innerDictionary.Add(feature, mesh);
        return(mesh);
    }
    public Mesh GetTerrainSurfaceMesh(TerrainViewFeature feature)
    {
        Mesh mesh;

        if (surfaceDictionary.TryGetValue(feature, out mesh))
        {
            return(mesh);
        }
        mesh = generateSurfaceMesh(feature);
        surfaceDictionary.Add(feature, mesh);
        return(mesh);
    }
Beispiel #3
0
    public Texture2D GetTerrainTexture(TerrainViewFeature feature)
    {
        Texture2D texture;

        if (textureDictionary.TryGetValue(feature, out texture))
        {
            return(texture);
        }
        texture = generateTerrain(feature);
        textureDictionary.Add(feature, texture);
        return(texture);
    }
    private Mesh generateSurfaceMesh(TerrainViewFeature feature)
    {
        Mesh mesh = new Mesh();

        mesh.vertices = surfaceVertices;
        mesh.normals  = surfaceNormals;
        mesh.uv       = surfaceUVs;

        List <int> triangleList = new List <int>();

        if (!feature.WaterCenter)
        {
            triangleList.AddRange(surfaceTriangles[4]);
        }
        if (!feature.WaterF)
        {
            triangleList.AddRange(surfaceTriangles[7]);
        }
        if (!feature.WaterL)
        {
            triangleList.AddRange(surfaceTriangles[3]);
        }
        if (!feature.WaterB)
        {
            triangleList.AddRange(surfaceTriangles[1]);
        }
        if (!feature.WaterR)
        {
            triangleList.AddRange(surfaceTriangles[5]);
        }
        if (!feature.WaterFL)
        {
            triangleList.AddRange(surfaceTriangles[6]);
        }
        if (!feature.WaterBL)
        {
            triangleList.AddRange(surfaceTriangles[0]);
        }
        if (!feature.WaterBR)
        {
            triangleList.AddRange(surfaceTriangles[2]);
        }
        if (!feature.WaterFR)
        {
            triangleList.AddRange(surfaceTriangles[8]);
        }

        mesh.triangles = triangleList.ToArray();

        return(mesh);
    }
    public void SetFeature(TerrainViewFeature viewFeature, TerrainTallFeature tallFeature)
    {
        this.viewFeature = viewFeature;
        this.tallFeature = tallFeature;

        Vector3 position = transform.position;

        position.y         = (this.tallFeature.Tall - 1) * TALL_HEIGHT;
        transform.position = position;

        tallFeature.Tall = 0;

        mfSurface.sharedMesh = TerrainMeshGenerator.Instance.GetTerrainSurfaceMesh(viewFeature);
        mfInner.sharedMesh   = TerrainMeshGenerator.Instance.GetTerrainInnerMesh(viewFeature);
        mfOutter.sharedMesh  = TerrainMeshGenerator.Instance.GetTerrainOutterMesh(tallFeature);
    }
    private void terrainViewFeatureOfPosition(Vector2Int position, out TerrainViewFeature terrainViewFeature, out TerrainTallFeature terrainTallFeature)
    {
        int x = position.x;
        int y = position.y;

        terrainViewFeature = new TerrainViewFeature(false, false, false, false, false, false, false, false, false);
        terrainTallFeature = new TerrainTallFeature(0, false, false, false, false);

        bool waterCenter = island.TerrainTypeOfCell(position) == TerrainType.Water;

        if (waterCenter)
        {
            bool waterFront      = island.TerrainTypeOfCell(new Vector2Int(x, y - 1)) == TerrainType.Water;
            bool waterLeft       = island.TerrainTypeOfCell(new Vector2Int(x - 1, y)) == TerrainType.Water;
            bool waterBack       = island.TerrainTypeOfCell(new Vector2Int(x, y + 1)) == TerrainType.Water;
            bool waterRight      = island.TerrainTypeOfCell(new Vector2Int(x + 1, y)) == TerrainType.Water;
            bool waterFrontLeft  = island.TerrainTypeOfCell(new Vector2Int(x - 1, y - 1)) == TerrainType.Water;
            bool waterBackLeft   = island.TerrainTypeOfCell(new Vector2Int(x - 1, y + 1)) == TerrainType.Water;
            bool waterBackRight  = island.TerrainTypeOfCell(new Vector2Int(x + 1, y + 1)) == TerrainType.Water;
            bool waterFrontRight = island.TerrainTypeOfCell(new Vector2Int(x + 1, y - 1)) == TerrainType.Water;

            terrainViewFeature.WaterCenter = waterCenter;
            terrainViewFeature.WaterF      = waterFront;
            terrainViewFeature.WaterL      = waterLeft;
            terrainViewFeature.WaterB      = waterBack;
            terrainViewFeature.WaterR      = waterRight;
            terrainViewFeature.WaterFL     = waterFront && waterLeft && waterFrontLeft;
            terrainViewFeature.WaterBL     = waterBack && waterLeft && waterBackLeft;
            terrainViewFeature.WaterBR     = waterBack && waterRight && waterBackRight;
            terrainViewFeature.WaterFR     = waterFront && waterRight && waterFrontRight;
        }

        TerrainTall tall      = island.TerrainTallOfCell(position);
        bool        tallFront = island.TerrainTallOfCell(new Vector2Int(x, y - 1)) < tall;
        bool        tallLeft  = island.TerrainTallOfCell(new Vector2Int(x - 1, y)) < tall;
        bool        tallBack  = island.TerrainTallOfCell(new Vector2Int(x, y + 1)) < tall;
        bool        tallRight = island.TerrainTallOfCell(new Vector2Int(x + 1, y)) < tall;

        terrainTallFeature.Front = tallFront;
        terrainTallFeature.Left  = tallLeft;
        terrainTallFeature.Back  = tallBack;
        terrainTallFeature.Right = tallRight;

        terrainTallFeature.Tall = (int)tall;

        return;
    }
Beispiel #7
0
    private Texture2D generateTerrain(TerrainViewFeature feature)
    {
        Texture2D texture = new Texture2D(width, width);

        int p0 = 0;
        int p1 = edge;
        int p2 = width - edge;
        int p3 = width;

        // Top
        setPixel(texture, p1, p2, p2, p3, feature.WaterF ? WaterColor : GrassColor);

        // Down
        setPixel(texture, p1, p2, p0, p1, feature.WaterB ? WaterColor : GrassColor);

        // Left
        setPixel(texture, p0, p1, p1, p2, feature.WaterL ? WaterColor : GrassColor);

        // Right
        setPixel(texture, p2, p3, p1, p2, feature.WaterR ? WaterColor : GrassColor);


        // TopLeft
        setPixel(texture, p0, p1, p2, p3, feature.WaterFL ? WaterColor : GrassColor);

        // TopRight
        setPixel(texture, p2, p3, p2, p3, feature.WaterFR ? WaterColor : GrassColor);

        // DownLeft
        setPixel(texture, p0, p1, p0, p1, feature.WaterBL ? WaterColor : GrassColor);

        // DownRight
        setPixel(texture, p2, p3, p0, p1, feature.WaterBR ? WaterColor : GrassColor);

        // Center
        setPixel(texture, p1, p2, p1, p2, feature.WaterCenter ? WaterColor : GrassColor);

        texture.Apply();
        return(texture);
    }
    private Mesh generateInnerMesh(TerrainViewFeature feature)
    {
        if (!feature.WaterCenter)
        {
            return(null);
        }

        Mesh mesh = new Mesh();

        mesh.vertices = innerVertices;

        Vector3[] normals = new Vector3[32];
        System.Array.Copy(innerNormals, normals, 32);

        List <int> triangleList = new List <int>();


        if (!feature.WaterF)
        {
            triangleList.AddRange(innerTriangles[11]);
        }
        if (!feature.WaterL)
        {
            triangleList.AddRange(innerTriangles[8]);
        }
        if (!feature.WaterB)
        {
            triangleList.AddRange(innerTriangles[9]);
        }
        if (!feature.WaterR)
        {
            triangleList.AddRange(innerTriangles[10]);
        }

        if (!feature.WaterFL && feature.WaterF)
        {
            triangleList.AddRange(innerTriangles[6]);
        }
        if (!feature.WaterFL && feature.WaterL)
        {
            triangleList.AddRange(innerTriangles[7]);
        }
        if (!feature.WaterBL && feature.WaterB)
        {
            triangleList.AddRange(innerTriangles[1]);
        }
        if (!feature.WaterBL && feature.WaterL)
        {
            triangleList.AddRange(innerTriangles[0]);
        }
        if (!feature.WaterBR && feature.WaterB)
        {
            triangleList.AddRange(innerTriangles[2]);
        }
        if (!feature.WaterBR && feature.WaterR)
        {
            triangleList.AddRange(innerTriangles[3]);
        }
        if (!feature.WaterFR && feature.WaterF)
        {
            triangleList.AddRange(innerTriangles[5]);
        }
        if (!feature.WaterFR && feature.WaterR)
        {
            triangleList.AddRange(innerTriangles[4]);
        }

        if (!feature.WaterF)
        {
            normals[10] = normals[13] = normals[26] = normals[29] = normalBack;
        }
        if (!feature.WaterL)
        {
            normals[1] = normals[14] = normals[17] = normals[30] = normalRight;
        }
        if (!feature.WaterB)
        {
            normals[2] = normals[5] = normals[18] = normals[21] = normalFront;
        }
        if (!feature.WaterR)
        {
            normals[6] = normals[9] = normals[22] = normals[25] = normalLeft;
        }


        mesh.triangles = triangleList.ToArray();
        mesh.normals   = normals;

        return(mesh);
    }
Beispiel #9
0
    public void SetTerrainFeature(Vector2Int position, TerrainViewFeature viewFeature, TerrainTallFeature tallFeature)
    {
        TerrainCellView terrainCellView = getCellView(position);

        terrainCellView.SetFeature(viewFeature, tallFeature);
    }
Beispiel #10
0
    private void init()
    {
        TerrainViewFeature feature = new TerrainViewFeature(false, false, false, false, false, false, false, false, false);

        textureDictionary.Add(feature, generateTerrain(feature));
    }