The Block class:
public class Block
{
const float tileSize = 0.25f;
public bool changed = true;
public enum Direction
{
north,
east,
south,
west,
up,
down }
;
//Base block constructor
public Block ()
{
}
public virtual MeshData Blockdata (Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.useRenderDataForCol = true;
if (!chunk.GetBlock (x, y + 1, z).IsSolid (Direction.down)) {
meshData = FaceDataUp (chunk, x, y, z, meshData);
}
if (!chunk.GetBlock (x, y - 1, z).IsSolid (Direction.up)) {
meshData = FaceDataDown (chunk, x, y, z, meshData);
}
if (!chunk.GetBlock (x, y, z + 1).IsSolid (Direction.south)) {
meshData = FaceDataNorth (chunk, x, y, z, meshData);
}
if (!chunk.GetBlock (x, y, z - 1).IsSolid (Direction.north)) {
meshData = FaceDataSouth (chunk, x, y, z, meshData);
}
if (!chunk.GetBlock (x + 1, y, z).IsSolid (Direction.west)) {
meshData = FaceDataEast (chunk, x, y, z, meshData);
}
if (!chunk.GetBlock (x - 1, y, z).IsSolid (Direction.east)) {
meshData = FaceDataWest (chunk, x, y, z, meshData);
}
//meshData.color = SetColor();
return meshData;
}
protected virtual MeshData FaceDataUp
(Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex (new Vector3 (x - 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y + 0.5f, z - 0.5f));
meshData.AddQuadTriangles ();
meshData.uv.AddRange(FaceUVs (Direction.up));
return meshData;
}
protected virtual MeshData FaceDataDown
(Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex (new Vector3 (x - 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y - 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y - 0.5f, z + 0.5f));
meshData.AddQuadTriangles ();
meshData.uv.AddRange(FaceUVs (Direction.down));
return meshData;
}
protected virtual MeshData FaceDataNorth
(Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex (new Vector3 (x + 0.5f, y - 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y - 0.5f, z + 0.5f));
meshData.AddQuadTriangles ();
meshData.uv.AddRange(FaceUVs (Direction.north));
return meshData;
}
protected virtual MeshData FaceDataEast
(Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex (new Vector3 (x + 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y - 0.5f, z + 0.5f));
meshData.AddQuadTriangles ();
meshData.uv.AddRange(FaceUVs (Direction.east));
return meshData;
}
protected virtual MeshData FaceDataSouth
(Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex (new Vector3 (x - 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x + 0.5f, y - 0.5f, z - 0.5f));
meshData.AddQuadTriangles ();
meshData.uv.AddRange(FaceUVs (Direction.south));
return meshData;
}
protected virtual MeshData FaceDataWest
(Chunk chunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex (new Vector3 (x - 0.5f, y - 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex (new Vector3 (x - 0.5f, y - 0.5f, z - 0.5f));
meshData.AddQuadTriangles ();
meshData.uv.AddRange(FaceUVs (Direction.west));
return meshData;
}
public virtual bool IsSolid (Direction direction)
{
switch (direction) {
case Direction.north:
return true;
case Direction.east:
return true;
case Direction.south:
return true;
case Direction.west:
return true;
case Direction.up:
return true;
case Direction.down:
return true;
}
return false;
}
public virtual Tile TexturePosition(Direction direction)
{
Tile tile = new Tile();
tile.x = 0;
tile.y = 0;
return tile;
}
// public virtual Color SetColor()
// {
// Color color = new Color();
// color.r = 1;
// color.g = 1;
// color.b = 1;
// color.a = 1;
//
// return color;
// }
public virtual Vector2[] FaceUVs(Direction direction)
{
Vector2[] UVs = new Vector2[4];
Tile tilePos = TexturePosition (direction);
float mipmapAdjustment = 0.07f;
UVs[0] = new Vector2((tileSize * tilePos.x + tileSize) - mipmapAdjustment, (tileSize * tilePos.y) + mipmapAdjustment);
UVs[1] = new Vector2((tileSize * tilePos.x + tileSize) - mipmapAdjustment, (tileSize * tilePos.y + tileSize) - mipmapAdjustment);
UVs[2] = new Vector2((tileSize * tilePos.x) + mipmapAdjustment, (tileSize * tilePos.y + tileSize) - mipmapAdjustment);
UVs[3] = new Vector2((tileSize * tilePos.x) + mipmapAdjustment, (tileSize * tilePos.y) + mipmapAdjustment);
return UVs;
}
public struct Tile { public int x; public int y;}
}
The MeshData Class:
public class MeshData
{
public List<Vector3> vertices = new List<Vector3>();
public List<int> triangles = new List<int>();
public List<Vector2> uv = new List<Vector2>();
//public Color color;
public List<Vector3> colVertices = new List<Vector3>();
public List<int> colTriangles = new List<int>();
public bool useRenderDataForCol;
public MeshData() { }
public void AddQuadTriangles()
{
triangles.Add(vertices.Count - 4);
triangles.Add(vertices.Count - 3);
triangles.Add(vertices.Count - 2);
triangles.Add(vertices.Count - 4);
triangles.Add(vertices.Count - 2);
triangles.Add(vertices.Count - 1);
if(useRenderDataForCol)
{
colTriangles.Add(colVertices.Count - 4);
colTriangles.Add(colVertices.Count - 3);
colTriangles.Add(colVertices.Count - 2);
colTriangles.Add(colVertices.Count - 4);
colTriangles.Add(colVertices.Count - 2);
colTriangles.Add(colVertices.Count - 1);
}
}
public void AddVertex(Vector3 vertex)
{
vertices.Add (vertex);
if (useRenderDataForCol)
{
colVertices.Add(vertex);
}
}
public void AddTriangle(int tri)
{
triangles.Add (tri);
if (useRenderDataForCol)
{
colTriangles.Add (tri - (vertices.Count - colVertices.Count));
}
}
}
And the Chunk Class (only relevant functions):
// Updates the chunk based on its contents
void UpdateChunk()
{
rendered = true;
MeshData meshData = new MeshData();
for (int x = 0; x < chunkSize; x++)
{
for (int y = 0; y < chunkSize; y++)
{
for (int z = 0; z < chunkSize; z++)
{
meshData = blocks[x, y, z].Blockdata(this, x, y, z, meshData);
}
}
}
RenderMesh(meshData);
}
//Sends the calculated mesh information to the mesh and collision components
void RenderMesh(MeshData meshData)
{
filter.mesh.Clear();
filter.mesh.vertices = meshData.vertices.ToArray();
filter.mesh.triangles = meshData.triangles.ToArray();
filter.mesh.uv = meshData.uv.ToArray ();
//rend.material.color = meshData.color;
filter.mesh.RecalculateNormals();
coll.sharedMesh = null;
Mesh mesh = new Mesh();
mesh.vertices = meshData.colVertices.ToArray ();
mesh.triangles = meshData.colTriangles.ToArray ();
mesh.RecalculateNormals();
coll.sharedMesh = mesh;
}