Пример #1
0
        public static void SetSplatFromMap(TerrainExtension ter)
        {
            Terrain t             = ter.GetComponent <Terrain>();
            int     splatMapWidth = t.terrainData.alphamapWidth;

            float[,,] splatmapData = new float[splatMapWidth, splatMapWidth, t.terrainData.alphamapLayers];

            float tx = 0;
            float ty = 0;

            for (int y = 0; y < splatMapWidth; y++)
            {
                ty = (float)(y) / (float)splatMapWidth;
                for (int x = 0; x < splatMapWidth; x++)
                {
                    tx = (float)(x) / (float)splatMapWidth;

                    float etx = tx;
                    if (ter.FlipSplatMapX)
                    {
                        etx = 1 - tx;
                    }
                    float ety = ty;
                    if (ter.FlipSplatMapY)
                    {
                        ety = 1 - ty;
                    }
                    Color   c     = ter.GetSplatMap().GetPixelBilinear(ety, etx);
                    float[] ts    = new float[4];
                    float   total = 1; //c.g+c.b+c.a;
                                       //Normalize splats
                    ts[1]  = c.g;
                    total -= ts[1];
                    ts[2]  = Mathf.Clamp01(c.b * total);
                    total -= ts[2];
                    ts[3]  = Mathf.Clamp01(c.r * total);
                    total -= ts[3];

                    ts[0] = Mathf.Clamp01(total);
                    for (int j = 0; j < t.terrainData.alphamapLayers; j++)
                    {
                        splatmapData[x, y, j] = ts[j];
                    }
                }
            }
            t.terrainData.SetAlphamaps(0, 0, splatmapData);
        }
Пример #2
0
        public static void SaveSplatMapFromTerrain(TerrainExtension ter, string path)
        {
            Terrain t = ter.GetComponent <Terrain>();

            int splatMapWidth = t.terrainData.alphamapWidth;

            float[,,] splatmapData = t.terrainData.GetAlphamaps(0, 0, splatMapWidth, splatMapWidth);
            var targetSplatmap = ter.GetSplatMap();

            Color [] colors = new Color[splatMapWidth * splatMapWidth];
            if (splatmapData != null && t.terrainData.splatPrototypes.Length > 1)
            {
                for (int j = 0; j < targetSplatmap.height; j++)
                {
                    for (int i = 0; i < targetSplatmap.width; i++)
                    {
                        float tu = i / ((float)targetSplatmap.width);
                        float tv = j / ((float)targetSplatmap.height);

                        Color splatC = Color.red;

                        int sxi = Mathf.Clamp(Mathf.RoundToInt((float)splatMapWidth * tv), 0, splatMapWidth - 1);
                        int syi = Mathf.Clamp(Mathf.RoundToInt((float)splatMapWidth * tu), 0, splatMapWidth - 1);
                        splatC.r = splatmapData[sxi, syi, 3];
                        splatC.g = splatmapData[sxi, syi, 1];
                        splatC.b = splatmapData[sxi, syi, 2];
                        splatC.a = 1;

                        colors[j * targetSplatmap.height + i] = splatC;
                        //targetSplatmap.SetPixel(i, j, splatC);
                    }
                }
            }

            targetSplatmap.SetPixels(colors);

            byte[] bytes = targetSplatmap.EncodeToPNG();

            //string path = AssetDatabase.GetAssetOrScenePath(ter.GetSplatMap());
            Debug.Log("Writing to path" + path);
            if (!string.IsNullOrEmpty(path))
            {
                File.WriteAllBytes(path, bytes);
            }
        }
Пример #3
0
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            TerrainExtension ter = (TerrainExtension)target as TerrainExtension;

            EditorGUILayout.Separator();
            EditorGUILayout.BeginHorizontal();
            GUILayout.Label("Editor for terrain extension");
            EditorGUILayout.EndHorizontal();

            /*if (ter.Lightmap != null)
             * {
             *  if (GUILayout.Button("Generate NormalMap"))
             *  {
             *      if (ter.BakeAllTimeIndicesUpTo > 0)
             *      {
             *          for (int i = 0; i < ter.BakeAllTimeIndicesUpTo; i++)
             *          {
             *              ter.BakeTimeIndex = i;
             *              TerrainMapGenerator.GenerateNormalMap(ter, AssetDatabase.GetAssetOrScenePath(ter.GetNormalMap()));
             *          }
             *      }
             *      else
             *      {
             *          TerrainMapGenerator.GenerateNormalMap(ter, AssetDatabase.GetAssetOrScenePath(ter.GetNormalMap()));
             *      }
             *  }
             *
             *  if (GUILayout.Button("Generate HeightMap"))
             *  {
             *      TerrainMapGenerator.GenerateHeightMap(ter, AssetDatabase.GetAssetOrScenePath(ter.GetHeightMap()));
             *  }
             *
             * }
             * else
             * {
             *  GUILayout.Label("Must create a png map (with correct settings)\n and associate it as Normal map on both the material\n and on the terrain extension");
             * }*/


            if (ter.GetSplatMap() != null)
            {
                if (GUILayout.Button("Set splat from map"))
                {
                    SetSplatFromMap(ter);
                }

                if (GUILayout.Button("Save splatmap"))
                {
                    TerrainMapGenerator.SaveSplatMapFromTerrain(ter, AssetDatabase.GetAssetOrScenePath(ter.GetSplatMap()));
                }
            }

            if (GUILayout.Button("Generate splatmap from terrain"))
            {
                TerrainMapGenerator.GenerateSplatMap(ter);
            }

            if (GUILayout.Button("Smooth terrain"))
            {
                SmoothTerrain(ter);
            }

            /*if (GUILayout.Button("AddRockNoise"))
             * {
             *  TerrainMapGenerator.GenerateRockNoise(ter);
             * }*/
        }