Przeglądaj źródła

Procedural Generation 11/21

Nathan Gusatto 1 miesiąc temu
rodzic
commit
08803c915a

Plik diff jest za duży
+ 3 - 3
Assets/Scenes/SampleScene.unity


+ 29 - 0
Assets/Scripts/FallOffGenerator.cs

@@ -0,0 +1,29 @@
+using UnityEngine;
+
+public static class FallOffGenerator
+{
+    public static float[,] GenerateFallOffMap(int size)
+    {
+        float[,] map = new float[size, size];
+        for (int i = 0; i < size; i++)
+        {
+            for (int j = 0; j < size; j++)
+            {
+                float x = i / (float)size * 2 - 1;
+                float y = j / (float)size * 2 - 1;
+
+                float value = Mathf.Max(Mathf.Abs(x), Mathf.Abs(y));
+                map[i, j] = Evaluate(value);
+            }
+        }
+        return map;
+    }
+
+    static float Evaluate(float value)
+    {
+        float a = 3;
+        float b = 2.2f;
+
+        return Mathf.Pow(value, a) / (Mathf.Pow(value, a) + Mathf.Pow(b - b * value, a));
+    }
+}

+ 2 - 0
Assets/Scripts/FallOffGenerator.cs.meta

@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 990d7945f6938dc41b5497b640bb39fe

+ 18 - 1
Assets/Scripts/MapGenerator.cs

@@ -6,7 +6,7 @@ using System.Collections.Generic;
 public class MapGenerator : MonoBehaviour
 {
 
-    public enum DrawMode { NoiseMap, ColourMap, Mesh};
+    public enum DrawMode { NoiseMap, ColourMap, Mesh, FallOff};
     public DrawMode drawMode;
 
     public Noise.NormalizeMode normalizeMode;
@@ -26,6 +26,8 @@ public class MapGenerator : MonoBehaviour
     public int seed;
     public Vector2 offset;
 
+    public bool useFallOff;
+
     public float meshHeightMultiplier;
     public AnimationCurve meshHeightCurve;
 
@@ -33,9 +35,16 @@ public class MapGenerator : MonoBehaviour
 
     public TerrainType[] regions;
 
+    float[,] fallOffMap;
+
     Queue<MapThreadInfo<MapData>> mapDataThreadInfoQueue = new Queue<MapThreadInfo<MapData>>();
     Queue<MapThreadInfo<MeshData>> meshDataThreadInfoQueue = new Queue<MapThreadInfo<MeshData>>();
 
+    private void Awake()
+    {
+        fallOffMap = FallOffGenerator.GenerateFallOffMap(mapChunkSize);
+    }
+
     public void DrawMapInEditor()
     {
         MapData mapData = GenerateMapData(Vector2.zero);
@@ -53,6 +62,9 @@ public class MapGenerator : MonoBehaviour
         else if (drawMode == DrawMode.Mesh)
         {
             display.DrawMesh(MeshGenerator.GenerateTerrainMesh(mapData.heightMap, meshHeightMultiplier, meshHeightCurve, editorPreviewLOD), TextureGenerator.TextureFromColourMap(mapData.colourMap, mapChunkSize, mapChunkSize));
+        }else if (drawMode ==DrawMode.FallOff)
+        {
+            display.DrawTexture(TextureGenerator.TextureFromHeightMap(FallOffGenerator.GenerateFallOffMap(mapChunkSize)));
         }
     }
 
@@ -124,6 +136,10 @@ public class MapGenerator : MonoBehaviour
         {
             for (int x=0; x<mapChunkSize; x++)
             {
+                if (useFallOff)
+                {
+                    noiseMap[x, y] = Mathf.Clamp(noiseMap[x, y] - fallOffMap[x, y], 0, 1);
+                }
                 float currentHeight = noiseMap[x, y];
                 for (int i = 0; i < regions.Length; i++)
                 {
@@ -152,6 +168,7 @@ public class MapGenerator : MonoBehaviour
         {
             octaves = 0;
         }
+        fallOffMap = FallOffGenerator.GenerateFallOffMap(mapChunkSize);
     }
 
     struct MapThreadInfo<T>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików