Skip to content

Commit bbada78

Browse files
committed
Hex Map updates
1 parent 2c87723 commit bbada78

File tree

6 files changed

+47
-13
lines changed

6 files changed

+47
-13
lines changed

Demo/Demo-URP.unitypackage

2.54 MB
Binary file not shown.

Images/Sample_01.PNG

421 KB
Loading

Runtime/Utility/HexMeshUtility.cs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class HexMeshData
2121
public List<Vector3> vertices;
2222
public List<int> triangles;
2323
public List<Color> colors;
24+
public List<Vector2> uv;
2425
public Vector3[] corners;
2526

2627
private float border = 0.25f;
@@ -41,6 +42,7 @@ public HexMeshData(float radius, float border = 0.2f)
4142
vertices = new List<Vector3>();
4243
triangles = new List<int>();
4344
colors = new List<Color>();
45+
uv = new List<Vector2>();
4446
corners = new [] {
4547
new Vector3(0f, 0f, outerRadius),
4648
new Vector3(innerRadius, 0f, 0.5f * outerRadius),
@@ -83,6 +85,7 @@ public Mesh CreateMesh()
8385
mesh.vertices = vertices.ToArray();
8486
mesh.triangles = triangles.ToArray();
8587
mesh.colors = colors.ToArray();
88+
mesh.uv = uv.ToArray();
8689
mesh.RecalculateNormals();
8790
return mesh;
8891
}
@@ -163,9 +166,9 @@ public static int GetNeighbor(int index, HexDirection hexDirection, int mapWidth
163166
return y * mapWidth + x;
164167
}
165168

166-
public static Mesh GenerateHexagonMesh(float radius, int startX, int startY, int chunkWidth, int chunkHeight, int mapWidth, int mapHeight, float[] heightMap, Func<float,Color> colorFunction, Func<float,float> elevationFunction)
169+
public static Mesh GenerateHexagonMesh(float radius, float border, int startX, int startY, int chunkWidth, int chunkHeight, int mapWidth, int mapHeight, float[] heightMap, Func<float,Color> colorFunction, Func<float,float> elevationFunction)
167170
{
168-
var meshData = new HexMeshData(radius, 0.3f);
171+
var meshData = new HexMeshData(radius, border);
169172

170173
for (int dy = 0; dy < chunkHeight && (startY + dy) < mapHeight; dy++)
171174
{
@@ -207,7 +210,8 @@ public static Mesh GenerateHexagonMesh(float radius, int startX, int startY, int
207210
center.y = elevation;
208211

209212
var color = colorFunction?.Invoke(heightMap[index]) ?? Color.white;
210-
AddTriangle(meshData, center, neighborElevation, previousNeighborElevation, nextNeighborElevation, (HexDirection)direction, color);
213+
var uv = new Vector2(x / (float)mapWidth, y / (float)mapHeight);
214+
AddTriangle(meshData, center, uv, neighborElevation, previousNeighborElevation, nextNeighborElevation, (HexDirection)direction, color);
211215
}
212216

213217
}
@@ -216,33 +220,33 @@ public static Mesh GenerateHexagonMesh(float radius, int startX, int startY, int
216220
return meshData.CreateMesh();
217221
}
218222

219-
private static void AddTriangle(HexMeshData meshData, Vector3 center, float neighborElevation, float previousElevation, float nextElevation, HexDirection direction, Color color)
223+
private static void AddTriangle(HexMeshData meshData, Vector3 center, Vector3 uv, float neighborElevation, float previousElevation, float nextElevation, HexDirection direction, Color color)
220224
{
221225
var v1 = center;
222226
var v2 = center + meshData.GetFirstSolidCorner(direction);
223227
var v3 = center + meshData.GetSecondSolidCorner(direction);
224228

225229
//Add inner solid triangle
226-
AddTriangle(meshData, v1, v2, v3, color);
230+
AddTriangle(meshData, v1, v2, v3, color, uv);
227231

228232
//Add Quad To Fill Border Gap
229233
var v4 = v2 + meshData.GetBridge(direction);
230234
v4.y = neighborElevation;
231235
var v5 = v3 + meshData.GetBridge(direction);
232236
v5.y = neighborElevation;
233-
AddQuad(meshData, v2, v3, v4, v5, color);
237+
AddQuad(meshData, v2, v3, v4, v5, color, uv);
234238

235239
//Add Triangles to fill gap on sides of quad
236240
var v6 = center + meshData.GetFirstCorner(direction);
237241
v6.y = Mathf.Min(neighborElevation,previousElevation);
238-
AddTriangle(meshData,v2, v6, v4, color);
242+
AddTriangle(meshData,v2, v6, v4, color, uv);
239243

240244
var v7 = center + meshData.GetSecondCorner(direction);
241245
v7.y = Mathf.Min(neighborElevation,nextElevation);
242-
AddTriangle(meshData,v3, v5, v7, color);
246+
AddTriangle(meshData, v3, v5, v7, color, uv);
243247
}
244248

245-
private static void AddTriangle(HexMeshData meshData, Vector3 v1, Vector3 v2, Vector3 v3, Color color)
249+
private static void AddTriangle(HexMeshData meshData, Vector3 v1, Vector3 v2, Vector3 v3, Color color, Vector3 uv)
246250
{
247251
var vertexIndex = meshData.vertices.Count;
248252

@@ -254,12 +258,16 @@ private static void AddTriangle(HexMeshData meshData, Vector3 v1, Vector3 v2, Ve
254258
meshData.colors.Add(color);
255259
meshData.colors.Add(color);
256260

261+
meshData.uv.Add(uv);
262+
meshData.uv.Add(uv);
263+
meshData.uv.Add(uv);
264+
257265
meshData.triangles.Add(vertexIndex);
258266
meshData.triangles.Add(vertexIndex + 1);
259267
meshData.triangles.Add(vertexIndex + 2);
260268
}
261269

262-
private static void AddQuad(HexMeshData meshData, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Color color)
270+
private static void AddQuad(HexMeshData meshData, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Color color, Vector3 uv)
263271
{
264272
var vertexIndex = meshData.vertices.Count;
265273

@@ -273,6 +281,11 @@ private static void AddQuad(HexMeshData meshData, Vector3 v1, Vector3 v2, Vector
273281
meshData.colors.Add(color);
274282
meshData.colors.Add(color);
275283

284+
meshData.uv.Add(uv);
285+
meshData.uv.Add(uv);
286+
meshData.uv.Add(uv);
287+
meshData.uv.Add(uv);
288+
276289
meshData.triangles.Add(vertexIndex);
277290
meshData.triangles.Add(vertexIndex + 2);
278291
meshData.triangles.Add(vertexIndex + 1);

Runtime/WorldMap/Views/WorldMapHexMeshView.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ public class WorldMapHexMeshView : MonoBehaviour, IWorldMapView
1515
[SerializeField] private int chunkHeight = 16;
1616
[SerializeField] private float heightScale = 1;
1717
[SerializeField] private bool smooth = false;
18+
19+
[SerializeField, Range(0,1f)] private float border = 0.25f;
1820

1921
[SerializeField] private List<WorldMapViewChunk> chunkList = new List<WorldMapViewChunk>();
20-
private Dictionary<Vector2, WorldMapViewChunk> _chunks = new Dictionary<Vector2, WorldMapViewChunk>();
22+
private readonly Dictionary<Vector2, WorldMapViewChunk> _chunks = new Dictionary<Vector2, WorldMapViewChunk>();
2123

2224
private void Start()
2325
{
@@ -53,7 +55,7 @@ public void DisplayMap(WorldMapData mapData)
5355
var startY = chunkY * chunkHeight;
5456
var chunkView = GetChunk(new Vector2Int(chunkX,chunkY));
5557
chunkView.transform.localPosition = new Vector3(0,0,0);
56-
var mesh = HexMeshUtility.GenerateHexagonMesh(radius, startX, startY, chunkWidth, chunkHeight, mapData.width, mapData.height, heightMap, GetColor, GetElevation);
58+
var mesh = HexMeshUtility.GenerateHexagonMesh(radius, border, startX, startY, chunkWidth, chunkHeight, mapData.width, mapData.height, heightMap, GetColor, GetElevation);
5759
chunkView.SetMesh(mesh);
5860
}
5961
}
@@ -102,7 +104,8 @@ private WorldMapViewChunk GetChunk(Vector2Int chunkPt)
102104
return chunk;
103105
}
104106

105-
private void ClearChunks()
107+
[ContextMenu("Clear Chunks")]
108+
public void ClearChunks()
106109
{
107110
foreach (var chunk in chunkList)
108111
{

Runtime/WorldMap/Views/WorldMapTextureView.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,19 @@ public class WorldMapTextureView : MonoBehaviour, IWorldMapView
2424

2525
[SerializeField] private bool scaleTexture = false;
2626
[SerializeField] private float textureScale = 2f;
27+
28+
private void Start()
29+
{
30+
//This is here just to show the enabled checkbox in the unity inspector
31+
}
2732

2833
public async void DisplayMap(WorldMapData worldMapData)
2934
{
35+
if (!enabled)
36+
{
37+
return;
38+
}
39+
3040
var heightMapLayer = worldMapData.GetLayer<HeightMapLayerData>();
3141
var regionMapLayer = worldMapData.GetLayer<RegionMapLayerData>();
3242

Runtime/WorldMap/WorldMapGenController.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
//Ignore those dumb 'never assigned to' warnings cuz this is Unity and our fields are serialized
22
#pragma warning disable CS0649
33

4+
using System;
45
using UnityEngine;
6+
using Random = UnityEngine.Random;
57

68
namespace Gameframe.Procgen
79
{
@@ -11,6 +13,8 @@ public class WorldMapGenController : MonoBehaviour
1113

1214
[SerializeField] private int seed = 100;
1315

16+
[SerializeField] private bool randomizeSeed = false;
17+
1418
[SerializeField, HideInInspector] private WorldMapData _mapData;
1519

1620
private void Start()
@@ -21,6 +25,10 @@ private void Start()
2125
[ContextMenu("GenerateMap")]
2226
public void GenerateMap()
2327
{
28+
if (randomizeSeed)
29+
{
30+
seed = Random.Range(int.MinValue, Int32.MaxValue);
31+
}
2432
_mapData = _generator.GenerateMap(seed);
2533
DisplayMap(_mapData);
2634
}

0 commit comments

Comments
 (0)