Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- using UnityEngine;
- public class WorldChunk : MonoBehaviour {
- public ChunkLayer[] chunkLayers;
- public Pos2Int chunkPosition;
- private Queue<Vector3> finishedVerts;
- private Queue<int> finishedTrias;
- private Queue<Vector2> finishedUvs;
- private MeshFilter filter;
- public void Setup(ChunkLayer[] layers, Pos2Int pos, Material mat)
- {
- chunkLayers = layers;
- chunkPosition = pos;
- filter = GetComponent<MeshFilter>();
- GetComponent<MeshRenderer>().sharedMaterial = mat;
- World.RegisterChunk(chunkPosition, this);
- UpdateChunk();
- //Task.Run(UpdateChunk);
- }
- private void FixedUpdate()
- {
- if (finishedVerts != null && finishedVerts.Count > 0)
- {
- filter.mesh.vertices = finishedVerts.ToArray();
- filter.mesh.triangles = finishedTrias.ToArray();
- filter.mesh.uv = finishedUvs.ToArray();
- filter.mesh.RecalculateNormals();
- filter.mesh.RecalculateBounds();
- filter.mesh.RecalculateTangents();
- finishedVerts = new Queue<Vector3>();
- finishedTrias = new Queue<int>();
- finishedUvs = new Queue<Vector2>();
- filter.mesh.name = "Chunk " + chunkPosition.x + " : " + chunkPosition.y;
- }
- }
- public void UpdateChunk()//async Task UpdateChunk()
- {
- Queue<Vector3> vertices = new Queue<Vector3>();
- Queue<int> triangles = new Queue<int>();
- Queue<Vector2> uvs = new Queue<Vector2>();
- for (int i = 0; i < chunkLayers.Length; i++)
- {
- ChunkLayer below = (i-1 >= 0) ? chunkLayers[i - 1] : null;
- ChunkLayer above = (i+1 < 256) ? chunkLayers[i + 1] : null;
- SingleLayerUpdate(below, chunkLayers[i], above,
- World.RetrieveLayer(chunkPosition + new Pos2Int(0, 1), i),
- World.RetrieveLayer(chunkPosition + new Pos2Int(0, -1), i),
- World.RetrieveLayer(chunkPosition + new Pos2Int(1, 0), i),
- World.RetrieveLayer(chunkPosition + new Pos2Int(-1, 0), i),
- ref vertices, ref triangles, ref uvs);
- }
- finishedVerts = vertices;
- finishedTrias = triangles;
- finishedUvs = uvs;
- //await Task.Delay(1);
- }
- private void SingleLayerUpdate(ChunkLayer _below, ChunkLayer _current, ChunkLayer _above, ChunkLayer _north, ChunkLayer _south, ChunkLayer _east, ChunkLayer _west, ref Queue<Vector3> verts, ref Queue<int> triangles, ref Queue<Vector2> uvs)
- {
- for (int x = 0; x < 16; x++)
- {
- for (int y = 0; y < 16; y++)
- {
- ChunkBlock selected = _current.layerBlocks[x, y];
- Pos3Int location = new Pos3Int(x, _current.yLevel, y);
- //Debug.Log(selected.blockInfo.transparent);
- if (selected.blockInfo.internalName != "Air")
- {
- //Bottom
- if (_below != null)
- {
- if(_below.layerBlocks[x, y].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.Bottom, selected.blockInfo.textures.bottomTextureId);
- }
- }
- else
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.Bottom, selected.blockInfo.textures.bottomTextureId);
- }
- //Top
- if (_above != null)
- {
- if (_above.layerBlocks[x, y].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.Top, selected.blockInfo.textures.topTextureId);
- }
- }
- else
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.Top, selected.blockInfo.textures.topTextureId);
- }
- //North
- if (y + 1 > 15 && _north != null)
- {
- if (_north.layerBlocks[x, 0].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.North, selected.blockInfo.textures.northTextureId);
- }
- }
- else if (y + 1 <= 15)
- {
- if (_current.layerBlocks[x, y + 1].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.North, selected.blockInfo.textures.northTextureId);
- }
- }
- else
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.North, selected.blockInfo.textures.northTextureId);
- }
- //South
- if (y - 1 < 0 && _south != null)
- {
- if (_south.layerBlocks[x, 15].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.South, selected.blockInfo.textures.southTextureId);
- }
- }
- else if (y - 1 >= 0)
- {
- if (_current.layerBlocks[x, y - 1].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.South, selected.blockInfo.textures.southTextureId);
- }
- }
- else
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.South, selected.blockInfo.textures.southTextureId);
- }
- //East
- if (x + 1 > 15 && _east != null)
- {
- if (_east.layerBlocks[0, y].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.East, selected.blockInfo.textures.eastTextureId);
- }
- }
- else if (x + 1 <= 15)
- {
- if (_current.layerBlocks[x + 1, y].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.East, selected.blockInfo.textures.eastTextureId);
- }
- }
- else
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.East, selected.blockInfo.textures.eastTextureId);
- }
- //West
- if (x - 1 < 0 && _east != null)
- {
- if (_east.layerBlocks[15, y].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.West, selected.blockInfo.textures.westTextureId);
- }
- }
- else if (x - 1 >= 0)
- {
- if (_current.layerBlocks[x - 1, y].blockInfo.transparent)
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.West, selected.blockInfo.textures.westTextureId);
- }
- }
- else
- {
- AddFace(ref verts, ref triangles, ref uvs, location, Side.West, selected.blockInfo.textures.westTextureId);
- }
- //AddFace(ref verts, ref triangles, ref uvs, location, Side.Top, selected.blockInfo.textures.topTextureId);
- }
- }
- }
- }
- private void AddFace(ref Queue<Vector3> verts, ref Queue<int> triangles, ref Queue<Vector2> uvs, Pos3Int offset, Side side, int textureId)
- {
- Vector2[] uvsToAdd = BlockDictionary.GetBlockTexture(textureId);
- uvs.Enqueue(uvsToAdd[0]);
- uvs.Enqueue(uvsToAdd[1]);
- uvs.Enqueue(uvsToAdd[2]);
- uvs.Enqueue(uvsToAdd[3]);
- int count = verts.Count;
- triangles.Enqueue(count);
- triangles.Enqueue(count + 1);
- triangles.Enqueue(count + 2);
- triangles.Enqueue(count + 2);
- triangles.Enqueue(count + 3);
- triangles.Enqueue(count);
- if (side == Side.North)
- {
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 1));
- }
- else if (side == Side.South)
- {
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 0));
- }
- else if (side == Side.East)
- {
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 1));
- }
- else if (side == Side.West)
- {
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 0));
- }
- else if (side == Side.Top)
- {
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 0));
- }
- else if (side == Side.Bottom)
- {
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 0));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 1));
- verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 0));
- }
- }
- public void DoTickUpdate()
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement