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; }