This commit is contained in:
brausjonas
2022-05-12 11:02:58 +02:00
parent c147e5baea
commit 1429a95243
109 changed files with 9123 additions and 0 deletions
@@ -0,0 +1,137 @@
using System.Collections;
using System.Collections.Generic;
using System.Data.Common;
using UnityEngine;
public class Chunk
{
//basic
private Material material;
private ChunkCoord chunkPosition;
private World world;
//rendering
public GameObject gameObject;
private MeshFilter meshFilter;
private MeshRenderer meshRenderer;
//data
private List<Vector3> vertices = new List<Vector3>();
private List<Vector2> uv = new List<Vector2>();
private List<int> triangles = new List<int>();
public byte[,,] blocks;
private int triangleIndex = 0;
//physics
private MeshCollider collider;
public Chunk(Material material, ChunkCoord chunkPosition, World world, byte[,,] blocks)
{
this.blocks = blocks;
this.material = material;
this.chunkPosition = chunkPosition;
this.world = world;
}
//initializes the chunks components
public void Initialize()
{
gameObject = new GameObject(chunkPosition.x + ", " + chunkPosition.z);
gameObject.transform.position =
new Vector3(chunkPosition.x * Data.chunkWidth, 0, chunkPosition.z * Data.chunkWidth);
meshFilter = gameObject.AddComponent<MeshFilter>();
meshRenderer = gameObject.AddComponent<MeshRenderer>();
collider = gameObject.AddComponent<MeshCollider>();
}
public void AddBlocks()
{
for (int y = 0; y < Data.chunkHeight; y++)
{
for (int x = 0; x < Data.chunkWidth; x++)
{
for (int z = 0; z < Data.chunkWidth; z++)
{
AddBlock(x, y, z);
}
}
}
}
//adds the data of a single block
private void AddBlock(int x, int y, int z)
{
byte[] textures = world.GetTextures(blocks[x, y, z]);
//only draw solid blocks
if(blocks[x, y, z] != 0)
{
for (int f = 0; f < 6; f++)
{
//check for connecting faces
if (!world.CheckBlock(new Vector3(x + Data.faceChecks[f].x + chunkPosition.x * Data.chunkWidth,
y + Data.faceChecks[f].y,
z + Data.faceChecks[f].z + chunkPosition.z * Data.chunkWidth)))
{
for (int v = 0; v < 6; v++)
{
vertices.Add(Data.vertices[Data.triangles[f, v]] + new Vector3(x, y, z));
triangles.Add(triangleIndex);
triangleIndex++;
}
AddUV(textures[f]);
}
}
}
}
//add uv to a face
private void AddUV(byte textureID)
{
float y = (int)(textureID / Data.textureAtlasSize);
float x = (int)(textureID - (y * Data.textureAtlasSize));
float textureSize = 1f / Data.textureAtlasSize;
y /= Data.textureAtlasSize;
x /= Data.textureAtlasSize;
y = 1 - y;
uv.Add(new Vector2(x, y - textureSize));
uv.Add(new Vector2(x, y));
uv.Add(new Vector2(x + textureSize, y - textureSize));
uv.Add(new Vector2(x + textureSize, y - textureSize));
uv.Add(new Vector2(x, y));
uv.Add(new Vector2(x + textureSize, y));
}
//creates the final mesh
public void CreateMesh()
{
Mesh mesh = new Mesh();
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
mesh.uv = uv.ToArray();
mesh.RecalculateNormals();
meshFilter.mesh = mesh;
meshRenderer.material = material;
collider.sharedMesh = mesh;
}
public void Edit(byte x, byte y, byte z, byte blockID)
{
blocks[x, y, z] = blockID;
}
public void Update()
{
vertices.Clear();
triangles.Clear();
uv.Clear();
triangleIndex = 0;
AddBlocks();
CreateMesh();
}
}