duck

Some Terrain Wizards for Unity

Dec 10th, 2014
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.65 KB | None | 0 0
  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.IO;
  4.  
  5. // various terrain helper tools, a collection of wizards!
  6.  
  7. public class SplatmapWizard : ScriptableWizard
  8. {
  9.     public Terrain targetTerrain;
  10.     public Texture2D customSplatmap;
  11.    
  12.     private TerrainData data;
  13.     private int w;
  14.    
  15.     [MenuItem("Terrain/Replace Splatmap...")]
  16.     static void CreateWizard ()
  17.     {
  18.         var wiz = ScriptableWizard.DisplayWizard<SplatmapWizard>("Custom Splatmap", "Replace");
  19.         wiz.targetTerrain = Terrain.activeTerrain;
  20.     }
  21.    
  22.  
  23.     void OnWizardCreate ()
  24.     {
  25.         data = targetTerrain.terrainData;
  26.         int w = data.alphamapWidth;
  27.         //data.alphamapResolution = data.GetAlphamaps(0,0,w,w);
  28.  
  29.         float[,,] splatmapData = data.GetAlphamaps(0, 0, w, w);
  30.         Color[] mapColors = customSplatmap.GetPixels();
  31.  
  32.         int numSplatMaps = splatmapData.GetLength(2);
  33.  
  34.         for (int z=0; z<numSplatMaps; ++z)
  35.         {
  36.             for (int y=0; y<w; ++y)
  37.             {
  38.                 for (int x=0; x<w; ++x)
  39.                 {
  40.                     splatmapData[x,y,z] = mapColors[x*w + y][z];
  41.                 }
  42.             }
  43.         }
  44.  
  45.         data.SetAlphamaps(0, 0, splatmapData);
  46.     }
  47.    
  48. }
  49.  
  50.  
  51. public class GetSplatmapWizard : ScriptableWizard
  52. {
  53.     public Terrain terrain;
  54.     public Texture2D targetTexture;
  55.    
  56.     private TerrainData data;
  57.     private int w;
  58.    
  59.     [MenuItem("Terrain/Get Texture From Splatmap...")]
  60.     static void CreateWizard ()
  61.     {
  62.         var wiz = ScriptableWizard.DisplayWizard<GetSplatmapWizard>("Custom Splatmap", "Get");
  63.         wiz.terrain = Terrain.activeTerrain;
  64.     }
  65.    
  66.  
  67.     void OnWizardCreate ()
  68.     {
  69.         data = terrain.terrainData;
  70.         int w = data.alphamapWidth;
  71.         //data.alphamapResolution = data.GetAlphamaps(0,0,w,w);
  72.        
  73.         float[,,] splatmapData = data.GetAlphamaps(0, 0, w, w);
  74.         Color[] mapColors = targetTexture.GetPixels();
  75.        
  76.         int numSplatMaps = splatmapData.GetLength(2);
  77.        
  78.         for (int z=0; z<numSplatMaps; ++z)
  79.         {
  80.             for (int y=0; y<w; ++y)
  81.             {
  82.                 for (int x=0; x<w; ++x)
  83.                 {
  84.                     mapColors[x*w + y][z] = splatmapData[x,y,z];
  85.                 }
  86.             }
  87.         }
  88.        
  89.         targetTexture.SetPixels( mapColors );
  90.         var bytes = targetTexture.EncodeToPNG();
  91.         File.WriteAllBytes(Application.dataPath + "/"+targetTexture.name+".png", bytes);
  92.        
  93.        
  94.     }  
  95. }
  96.  
  97.  
  98. public class FlattenTerrainEdgeWizard : ScriptableWizard
  99. {
  100.     public Terrain terrain;
  101.     public float flattenToHeight;
  102.     private TerrainData data;
  103.     private int w;
  104.    
  105.     [MenuItem("Terrain/Flatten Terrain Edge...")]
  106.     static void CreateWizard ()
  107.     {
  108.         var wiz = ScriptableWizard.DisplayWizard<FlattenTerrainEdgeWizard>("Flatten Terrain Edge", "Apply");
  109.        
  110.         wiz.terrain = Terrain.activeTerrain;
  111.     }
  112.    
  113.    
  114.     void OnWizardCreate ()
  115.     {
  116.         data = terrain.terrainData;
  117.         int w = data.heightmapResolution;
  118.         float[,] heights = data.GetHeights(0,0,w,w);
  119.        
  120.         for (int y=0; y<w; y += 1)
  121.         {
  122.             for (int x=0; x<w; x += 1)
  123.             {
  124.                 if (x==0 || y==0 || x==w-1 || y==w-1)   heights[x,y] = flattenToHeight;
  125.             }
  126.         }
  127.        
  128.         data.SetHeights(0,0,heights);
  129.        
  130.     }
  131.    
  132. }
  133.  
  134.  
  135.  
  136. public class RaiseLowerTerrainWizard : ScriptableWizard
  137. {
  138.     public Terrain terrain;
  139.     public float amount;
  140.     private TerrainData data;
  141.     private int w;
  142.    
  143.     [MenuItem("Terrain/Raise or Lower Terrain...")]
  144.     static void CreateWizard ()
  145.     {
  146.         var wiz = ScriptableWizard.DisplayWizard<RaiseLowerTerrainWizard>("Raise or Lower Terrain", "Apply");
  147.         wiz.terrain = Terrain.activeTerrain;
  148.     }
  149.    
  150.    
  151.     void OnWizardCreate ()
  152.     {
  153.         data = terrain.terrainData;
  154.         int w = data.heightmapResolution;
  155.         float[,] heights = data.GetHeights(0,0,w,w);
  156.        
  157.         amount /= data.heightmapScale.y;
  158.        
  159.         for (int y=0; y<w; ++y)
  160.         {
  161.             for (int x=0; x<w; ++x)
  162.             {
  163.                 heights[x,y] += amount;
  164.             }
  165.         }
  166.        
  167.         data.SetHeights(0,0,heights);
  168.        
  169.     }
  170.    
  171. }
  172.  
  173. public class GroundAndAlignToTerrain : ScriptableWizard
  174. {
  175.     public Terrain terrain;
  176.     public bool alignRotationToSurface = true;
  177.     public float upwardsOffset = 0;
  178.     public bool randomYRotation = false;
  179.    
  180.     [MenuItem("Terrain/Ground and align selected objects to Terrain...")]
  181.     static void CreateWizard ()
  182.     {
  183.         var wiz = ScriptableWizard.DisplayWizard<GroundAndAlignToTerrain>("Ground and align selected objects to Terrain", "Apply");
  184.         wiz.terrain = Terrain.activeTerrain;
  185.     }
  186.    
  187.    
  188.     void OnWizardCreate ()
  189.     {
  190.         foreach (var obj in Selection.gameObjects)
  191.         {
  192.             Vector3 pos = obj.transform.position;
  193.             float height = terrain.SampleHeight(pos);
  194.             float x = pos.x-terrain.transform.position.x;
  195.             float z = pos.z-terrain.transform.position.z;
  196.             Vector3 up = terrain.terrainData.GetInterpolatedNormal(x,z);
  197.  
  198.             pos.y = height;
  199.             obj.transform.position = pos;
  200.             if (alignRotationToSurface)
  201.             {
  202.                 obj.transform.rotation = Quaternion.LookRotation( obj.transform.forward, up );
  203.             }
  204.             obj.transform.Translate( 0, upwardsOffset, 0, Space.Self );
  205.         }
  206.        
  207.     }
  208.    
  209. }
Advertisement
Add Comment
Please, Sign In to add comment