inz-00/Assets/Scripts/MapRenderer.cs

98 lines
3.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Assets.Common;
using Assets.Map;
using UnityEngine;
namespace Assets
{
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(GraphGenerator))]
public class MapRenderer : MonoBehaviour
{
public float uvScale = 1.0f;
private List<Vector3> _vertices;
private List<Vector3> _normals;
private List<int> _triangles;
public void Generate()
{
var graph = GetComponent<GraphGenerator>();
graph.Reset();
graph.Generate();
var points = graph.VoronoiGenerator.Voronoi.Vertices;
_vertices = new List<Vector3>();
_normals = new List<Vector3>();
_triangles = new List<int>();
foreach (var location in graph.LocationGenerator.Result.Vertices.Skip(1))
{
GenerateLocationMesh(location, points);
GenerateLocationWall(location, points);
}
Mesh mesh = new Mesh();
mesh.vertices = _vertices.ToArray();
mesh.uv = _vertices.Select(v => new Vector2(v.x, v.z) / uvScale).ToArray();
mesh.normals = _normals.ToArray();
mesh.triangles = _triangles.ToArray();
GetComponent<MeshFilter>().sharedMesh = mesh;
}
private void GenerateLocationMesh(Location location, IList<Point> points)
{
foreach (var vertices in location.Sites.Select(site => site.Edges.Select(x => points[x.Item1]).Reverse()))
{
int start = _vertices.Count;
foreach (var vertex in vertices)
{
_vertices.Add(PointToVector(location, vertex));
_normals.Add(Vector3.up);
}
int end = _vertices.Count;
for (int i = start + 1; i < end - 1; i++)
{
_triangles.AddRange(new []{ start, i, i+1 });
}
}
}
private static Vector3 PointToVector(Location location, Point vertex)
{
return new Vector3((float)vertex.x, location.Type.height + Mathf.PerlinNoise((float)vertex.x, (float)vertex.y) / 4, (float)vertex.y);
}
private void GenerateLocationWall(Location location, IList<Point> points)
{
foreach (var (a, b) in location.BoundaryEdges.Select(x => (points[x.Item1], points[x.Item2])))
{
int start = _vertices.Count;
_vertices.Add(PointToVector(location, a));
_vertices.Add(PointToVector(location, b));
_vertices.Add(new Vector3((float)a.x, -10,(float)a.y));
_vertices.Add(new Vector3((float)b.x, -10,(float)b.y));
_normals.Add(Vector3.up);
_normals.Add(Vector3.up);
_normals.Add(Vector3.up);
_normals.Add(Vector3.up);
_triangles.AddRange(new []
{
start, start + 1, start + 2,
start + 1, start + 3, start + 2
});
}
}
}
}