public IList <TerrainData> CreateTerrainDatas(string sourceFolder, IList <string> names, LodLevel lod)
        {
            string destinationPath = UPath.Combine(sourceFolder, "TerrainData");
            string absPath         = UPath.GetAbsolutePath(destinationPath);

            if (!Directory.Exists(absPath))
            {
                Directory.CreateDirectory(absPath);
            }

            IList <TerrainData> terrainDatas = new List <TerrainData>();

            for (int i = 0; i < names.Count; i++)
            {
                // Create structure
                var terrainData = new TerrainData {
                    heightmapResolution = lod.HeightmapResolution + 1,
                    alphamapResolution  = lod.SplatmapResolution,
                    size = new Vector3(lod.TerrainWidth, lod.TerrainHeight, lod.TerrainWidth)
                };

                if (lod.HasDetailMap)
                {
                    terrainData.SetDetailResolution(lod.DetailmapResolution, lod.DetailResolutionPerPatch);
                }

                terrainDatas.Add(terrainData);

                // Serialize it
                string terrainName     = GetTerrainNameFromAsset(names[i]);
                string terrainDataPath = UPath.Combine(destinationPath, terrainName + "." + ImportCfg.TerrainDataExtention);

                AssetDatabase.CreateAsset(terrainData, terrainDataPath);
            }

            return(terrainDatas);
        }
 public static void ApplyDimensions(TerrainData terrainData, LodLevel lod)
 {
     terrainData.size = new Vector3(lod.TerrainWidth, lod.TerrainHeight, lod.TerrainWidth);
     EditorUtility.SetDirty(terrainData);
 }
        public IDictionary <IntVector3, TerrainTile> InstantiateTerrainInScene(IList <string> assets, IList <TerrainData> terrainDatas, LodLevel lod)
        {
            var terrains = new Dictionary <IntVector3, TerrainTile>();

            var existingTerrains = Object.FindObjectsOfType <TerrainTile>();

            for (int i = 0; i < existingTerrains.Length; i++)
            {
                var tile = existingTerrains[i];
                if (tile.LodLevel == lod.Level)
                {
                    Object.DestroyImmediate(tile.gameObject);
                }
            }

            float   halfGridWidth = (float)lod.GridSize * lod.TerrainWidth * 0.5f;
            Vector3 offset        = new Vector3(-halfGridWidth, 0f, -halfGridWidth);

            for (int i = 0; i < terrainDatas.Count; i++)
            {
                string asset = assets[i];

                string  name     = GetTerrainNameFromAsset(asset);
                var     region   = LandmasImporter.GetTerrainRegionFromName(name, lod.GridSize);
                Vector3 position = offset + LandmasImporter.GetTerrainPosition(region, lod.TerrainWidth);

                TerrainData terrainData = terrainDatas[i];
                Terrain     terrain     = new GameObject(name).AddComponent <Terrain>();
                terrain.terrainData = terrainData;
                if (lod.Level < 1)
                {
                    terrain.gameObject.AddComponent <TerrainCollider>().terrainData = terrainData;
                }
                terrain.gameObject.isStatic = true;
                terrain.gameObject.name     = name + "_lod" + lod.Level;
                terrain.transform.position  = position;

                LandmasImporter.ApplyTerrainQualitySettings(terrain, ImportCfg.TerrainConfiguration);

                terrain.Flush();

                var tile = terrain.gameObject.AddComponent <TerrainTile>();
                tile.Region   = region;
                tile.LodLevel = lod.Level;
                tile.Terrain  = terrain;

                terrains.Add(region, tile);
            }

            return(terrains);
        }
        public static void SetupLandmassUnityTerrain(IDictionary <IntVector3, TerrainTile> terrains, LodLevel lod, string shaderId, string folderPath)
        {
//            var matName = "terrain_lod" + lod.Level + "_material";
//            var matPath = UPath.Combine(folderPath, matName + ".mat");
//
//            Debug.Log(matPath);
//
//            var material = AssetDatabase.LoadAssetAtPath<Material>(matPath);
//
//            if (!material) {
//                material = new Material(Shader.Find(shaderId));
//                AssetDatabase.CreateAsset(material, matPath);
//            }
//
//            string colorMapName = "terrain_c_atlas.png";
//            string normalMapName = "terrain_n_atlas.png";
//
//            var colorMap = AssetDatabase.LoadAssetAtPath(UPath.Combine(lod.FolderPath, colorMapName), typeof(Texture2D)) as Texture2D;
//            var normalMap = AssetDatabase.LoadAssetAtPath(UPath.Combine(lod.FolderPath, normalMapName), typeof(Texture2D)) as Texture2D;
        }
        public void ProcessHeightmapAssets(IList <string> assets, IList <TerrainData> terrains, LodLevel lod, TaskProgressToken token)
        {
            if (IsProcessing)
            {
                return;
            }

            IsProcessing = true;

            token.Title = "Processing heightmaps...";

            // Todo: split out terrain data creation/retrieval, call it here to get List<TerrainData>, or something

            for (int i = 0; i < assets.Count; i++)
            {
                token.Progress = (float)(i + 1) / assets.Count;

                if (token.Cancel)
                {
                    break;
                }

                string heightmapPath = assets[i];

                TerrainData terrainData = terrains[i];
                var         heightData  = new float[lod.HeightmapResolution, lod.HeightmapResolution];
                LandmasImporter.LoadRawFileAsFloats(
                    heightmapPath,
                    ref heightData,
                    ImportCfg.HeightFormat,
                    false,
                    true);

                // For 8-bit PNGs
                //var heightTexture = LandmasImporter.LoadTexture(heightmapPath, ImportCfg.HeightmapResolution);
                //LandmasImporter.TextureToHeightMap(heightTexture, ref heightData, false, true);

                terrainData.SetHeights(0, 0, heightData);

                // Save assets to disk and flush them from memory
                if (i % ImportCfg.BatchLimit == 0)
                {
                    FlushAssetsToDisk();
                }
            }

            FlushAssetsToDisk();

            IsProcessing = false;
        }