Hi,
is there a script to merge terrain tiles into one terrain? No stitching needed, just reconfigure tiling.
Kind Regards,
Skandy
Hi,
is there a script to merge terrain tiles into one terrain? No stitching needed, just reconfigure tiling.
Kind Regards,
Skandy
Here a script i wrote to merge the heightmaps of 256 terrains into a single terrain heightmap.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;
[ExecuteInEditMode]
public class CreateBigTerrain : MonoBehaviour
{
public Terrain _bigTerrain;
public Terrain _tiles;
public TerrainData tData;
public RenderTexture tileHeightmap;
public RenderTexture newHeightmap;
public bool active=true;
private int progressId;
IEnumerator Start()
{
if(active)
{
// Create a new progress indicator
progressId = Progress.Start("Merging Terrain");
yield return StartCoroutine("Calculate");
// The task is finished. Remove the associated progress indicator.
Progress.Remove(progressId);
active=false;
StopAllCoroutines();
}
DestroyImmediate(this);
}
IEnumerator Calculate()
{
TerrainData terrainData;
string path;
bool flipVertical=false;
Vector2 inputLevelsRange;
//_bigTerrain = GameObject.Find("bigTerrain").GetComponent<Terrain>();
int heightmapWidth = 1024;
int heightmapHeight = 1024;
float normalize = (1 << 16);
byte[] data = new byte[4096 * 4096 * 2];
for(int y=0; y<16; y++)
{
for(int x=0; x<16; x++)
{
_tiles = GameObject.Find("Terrain_"+x+"_"+y+"-20210513 - 125829").GetComponent<Terrain>();
tData = _tiles.terrainData;
float[,] heights = tData.GetHeights(0, 0, 1024, 1024);
for (int ty = 0; ty < 256; ++ty)
{
for (int tx = 0; tx < 256; ++tx)
{
int index = (x*256+tx)+(y*256+ty)*4096; //tx*4 + ty*4 * 1024;
//int srcY = flipVertical ? 1024 - 1 - y : y;
float remappedHeight = heights[ty*4, tx*4];// * (inputLevelsRange.y - inputLevelsRange.x) + inputLevelsRange.x;
int height = Mathf.RoundToInt(remappedHeight * normalize);
ushort compressedHeight = (ushort)Mathf.Clamp(height, 0, ushort.MaxValue);
byte[] byteData = System.BitConverter.GetBytes(compressedHeight);
data[index * 2 + 0] = byteData[0];
data[index * 2 + 1] = byteData[1];
}
}
yield return new WaitForSeconds(0.1f);
Progress.Report(progressId, x+16*y, 256,"Heightmap of Terrain_"+x+"_"+y+"-20210513 - 125829");
}
}
path="Assets/Heightmaps/bigTerrain";
FileStream fs = new FileStream((path + ".raw"), FileMode.Create);
fs.Write(data, 0, data.Length);
fs.Close();
yield return null;
}
// Update is called once per frame
void Update()
{
}
}