public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        if (GUILayout.Button("Fill All"))
        {
            Core.Grass g = target as Core.Grass;
            if (g != null)
            {
                for (int i = 0; i < g.brushTiles.Length; i++)
                {
                    Core.GrassTileData data = g.brushTiles[i];
                    data.seed              = Random.Range(0, int.MaxValue);
                    data.size              = new ushort[Core.TerrainUtils.GRASS_TILE_CELL_COUNT];
                    data.texture           = new byte[Core.TerrainUtils.GRASS_TILE_CELL_COUNT];
                    data.textureIndeics    = new int[2];
                    data.textureIndeics[0] = 0;
                    data.textureIndeics[0] = 1;
                    for (int j = 0; j < Core.TerrainUtils.GRASS_TILE_CELL_COUNT; j++)
                    {
                        data.size[j]    = (ushort)(Random.Range(2, 4));
                        data.texture[j] = (byte)(j > 32 * 16 ? 0: 1);
                    }
                }
            }
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }
Exemple #2
0
 private void BuildGrassTiles()
 {
     for (int i = 0; i < brushTiles.Length; i++)
     {
         GrassTileData d = brushTiles[i];
         if (d != null && d.textureIndeics.Length > 0)
         {
             BuildGrassTile(d);
         }
     }
 }
Exemple #3
0
        private void BuildGrassTile(GrassTileData d)
        {
            if (d == null || d.textureIndeics == null)
            {
                return;
            }

            int grassCount   = 0;
            int grassCounter = 0;
            int grassSkip    = 2;

            for (int i = 0; i < d.textureIndeics.Length; i++)
            {
                for (int l = 0; l < TerrainUtils.GRASS_TILE_CELL_DIM; l++)
                {
                    for (int m = 0; m < TerrainUtils.GRASS_TILE_CELL_DIM; m++)
                    {
                        int idx = l * TerrainUtils.GRASS_TILE_CELL_DIM + m;

                        int texPos = d.texture[idx];
                        if (texPos != i || d.size[idx] <= 0)
                        {
                            continue;
                        }
                        if (grassCounter++ % grassSkip != 0)
                        {
                            continue;
                        }

                        grassCount++;
                    }
                }
            }
            if (grassCount <= 0)
            {
                return;
            }
            grassCounter = 0;

            Random.seed = d.seed;

            Vector3 tilePos = new Vector3();

            tilePos.x = (float)d.posX * TerrainUtils.TERRAIN_TILE_SIZE;
            tilePos.z = (float)d.posZ * TerrainUtils.TERRAIN_TILE_SIZE;
            tilePos.y = TerrainUtils.GetTerrainHeight(tilePos.x + TerrainUtils.TERRAIN_TILE_HALF_SIZE, tilePos.z + TerrainUtils.TERRAIN_TILE_HALF_SIZE);

            List <GrassTileCell> cellList = new List <GrassTileCell>();

            GrassTileCell[,] cellMap = new GrassTileCell[TerrainUtils.GRASS_TILE_CELL_DIM, TerrainUtils.GRASS_TILE_CELL_DIM];

            Vector3[]  vertices  = new Vector3[grassCount * 4];
            Color32[]  colors    = new Color32[grassCount * 4];
            Vector2[]  uvs       = new Vector2[grassCount * 4];
            Vector2[]  uv3       = new Vector2[grassCount * 4];
            Vector3[]  normals   = new Vector3[grassCount * 4];
            List <int> triangles = new List <int>();

            int vertIndex = 0;

            for (int i = 0; i < d.textureIndeics.Length; i++)
            {
                int texIndex = d.textureIndeics[i];

                Texture2D tex    = null;
                Rect      rect   = default(Rect);
                float     aspect = 1f;
                GetTexture(texIndex, ref tex, ref rect, ref aspect);

                for (int l = 0; l < TerrainUtils.GRASS_TILE_CELL_DIM; l++)
                {
                    for (int m = 0; m < TerrainUtils.GRASS_TILE_CELL_DIM; m++)
                    {
                        int idx = l * TerrainUtils.GRASS_TILE_CELL_DIM + m;

                        int texPos = d.texture[idx];
                        int size   = d.size[idx];

                        if (texPos != i || d.size[idx] <= 0)
                        {
                            continue;
                        }
                        if (grassCounter++ % grassSkip != 0)
                        {
                            continue;
                        }

                        float gx        = (float)m * TerrainUtils.GRASS_TILE_CELL_SIZE + Random.Range(0f, 0.26f);
                        float gz        = (float)l * TerrainUtils.GRASS_TILE_CELL_SIZE + Random.Range(0f, 0.26f);
                        float gy        = TerrainUtils.GetTerrainHeight(gx + tilePos.x, gz + tilePos.z) - tilePos.y;
                        int   rotation  = Random.Range(0, 63);
                        int   waveSpeed = Random.Range(0, 255);

                        float sx = gx;
                        float sz = gz;
                        float r  = Mathf.Deg2Rad * ((float)rotation / 64f * -60f + -30f);
                        float s  = (float)size;
                        float hw = aspect / 2f;

                        float hwsinr = hw * Mathf.Sin(r);
                        float hwcosr = hw * Mathf.Cos(r);

                        vertices[vertIndex + 0].x = -hwcosr * s + sx;
                        vertices[vertIndex + 0].y = 1 * s + gy;
                        vertices[vertIndex + 0].z = -hwsinr * s + sz;
                        vertices[vertIndex + 1].x = hwcosr * s + sx;
                        vertices[vertIndex + 1].y = 1 * s + gy;
                        vertices[vertIndex + 1].z = hwsinr * s + sz;
                        vertices[vertIndex + 2].x = -hwcosr * s + sx;
                        vertices[vertIndex + 2].y = 0 * s + gy;
                        vertices[vertIndex + 2].z = -hwsinr * s + sz;
                        vertices[vertIndex + 3].x = hwcosr * s + sx;
                        vertices[vertIndex + 3].y = 0 * s + gy;
                        vertices[vertIndex + 3].z = hwsinr * s + sz;

                        r  = Mathf.Deg2Rad * (Random.Range(0, 360f) * -60f + -30f);
                        sx = gx + Random.Range(-1f, 1f) * hw * s;
                        sz = gz + Random.Range(-1f, 1f) * hw * s;

                        uvs[vertIndex + 0].x = rect.xMin;
                        uvs[vertIndex + 0].y = rect.yMax - 0.01f;
                        uvs[vertIndex + 1].x = rect.xMax;
                        uvs[vertIndex + 1].y = rect.yMax - 0.01f;
                        uvs[vertIndex + 2].x = rect.xMin;
                        uvs[vertIndex + 2].y = rect.yMin;
                        uvs[vertIndex + 3].x = rect.xMax;
                        uvs[vertIndex + 3].y = rect.yMin;

                        colors[vertIndex + 0] = useColors[texIndex];
                        colors[vertIndex + 1] = useColors[texIndex];
                        colors[vertIndex + 2] = useColors[texIndex];
                        colors[vertIndex + 3] = useColors[texIndex];

                        uv3[vertIndex + 0].x = 1;
                        uv3[vertIndex + 0].y = waveSpeed;
                        uv3[vertIndex + 1].x = 1;
                        uv3[vertIndex + 1].y = waveSpeed;
                        uv3[vertIndex + 2].x = 0f;
                        uv3[vertIndex + 2].y = 0f;
                        uv3[vertIndex + 3].x = 0f;
                        uv3[vertIndex + 3].y = 0f;

                        normals[vertIndex + 0].x = 0f;
                        normals[vertIndex + 0].y = 1f;
                        normals[vertIndex + 0].z = 0f;
                        normals[vertIndex + 1].x = 0f;
                        normals[vertIndex + 1].y = 1f;
                        normals[vertIndex + 1].z = 0f;
                        normals[vertIndex + 2].x = 0f;
                        normals[vertIndex + 2].y = 1f;
                        normals[vertIndex + 2].z = 0f;
                        normals[vertIndex + 3].x = 0f;
                        normals[vertIndex + 3].y = 1f;
                        normals[vertIndex + 3].z = 0f;

                        triangles.Add(vertIndex + 0);
                        triangles.Add(vertIndex + 1);
                        triangles.Add(vertIndex + 2);
                        triangles.Add(vertIndex + 1);
                        triangles.Add(vertIndex + 3);
                        triangles.Add(vertIndex + 2);

                        GrassTileCell cell = new GrassTileCell();
                        cell.vertStart             = vertIndex;
                        cell.waveSpeed             = (float)waveSpeed;
                        cell.waveSpeedStart        = waveSpeed;
                        cell.waveSpeedStep         = 1 + Random.Range(0.0f, 1.0f);
                        cell.turbulenceScale       = 1;
                        cell.turbulenceScaleFactor = 0.1f;
                        cell.isTurbulence          = true;

                        cellList.Add(cell);
                        cellMap[m, l] = cell;

                        vertIndex += 4;
                    }
                }
            }

            // create grass tile
            string     tileName   = string.Format("GrassTile({0},{1})", d.posX, d.posZ);
            GameObject gameObject = new GameObject(tileName);

            gameObject.transform.parent        = transform;
            gameObject.transform.localPosition = Vector3.zero;
            gameObject.transform.localRotation = Quaternion.identity;
            gameObject.transform.localScale    = Vector3.one;
            gameObject.hideFlags = HideFlags.DontSaveInEditor;
            gameObject.layer     = LayerMask.NameToLayer("Terrain");

            gameObject.transform.localPosition = tilePos;

            Mesh mesh = new Mesh();

            mesh.vertices  = vertices;
            mesh.uv        = uvs;
            mesh.colors32  = colors;
            mesh.normals   = normals;
            mesh.uv3       = uv3;
            mesh.triangles = triangles.ToArray();

            MeshFilter meshFilter = gameObject.GetComponent <MeshFilter>();

            if (meshFilter == null)
            {
                meshFilter = gameObject.AddComponent <MeshFilter>();
            }
            meshFilter.sharedMesh = mesh;

            MeshRenderer meshRenderer = gameObject.GetComponent <MeshRenderer>();

            if (meshRenderer == null)
            {
                meshRenderer = gameObject.AddComponent <MeshRenderer>();
            }
            meshRenderer.sharedMaterial    = packedMaterial;
            meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            mesh.MarkDynamic();

            GrassTile tile = gameObject.GetComponent <GrassTile>();

            if (tile == null)
            {
                tile = gameObject.AddComponent <GrassTile>();
            }
            tile.basePos      = tilePos;
            tile.cellList     = cellList;
            tile.cellMap      = cellMap;
            tile.meshRenderer = meshRenderer;
            tile.meshFilter   = meshFilter;
            tile.uv3          = uv3;
            tile.Init();
            tileList.Add(tile);
        }