Advertisement
djgaven588

MinecraftChunk

Jun 13th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.98 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using UnityEngine;
  5.  
  6. public class WorldChunk : MonoBehaviour {
  7.  
  8.     public ChunkLayer[] chunkLayers;
  9.     public Pos2Int chunkPosition;
  10.  
  11.     private Queue<Vector3> finishedVerts;
  12.     private Queue<int> finishedTrias;
  13.     private Queue<Vector2> finishedUvs;
  14.  
  15.     private MeshFilter filter;
  16.  
  17.     public void Setup(ChunkLayer[] layers, Pos2Int pos, Material mat)
  18.     {
  19.         chunkLayers = layers;
  20.         chunkPosition = pos;
  21.         filter = GetComponent<MeshFilter>();
  22.         GetComponent<MeshRenderer>().sharedMaterial = mat;
  23.         World.RegisterChunk(chunkPosition, this);
  24.         UpdateChunk();
  25.         //Task.Run(UpdateChunk);
  26.     }
  27.  
  28.     private void FixedUpdate()
  29.     {
  30.         if (finishedVerts != null && finishedVerts.Count > 0)
  31.         {
  32.             filter.mesh.vertices = finishedVerts.ToArray();
  33.             filter.mesh.triangles = finishedTrias.ToArray();
  34.             filter.mesh.uv = finishedUvs.ToArray();
  35.             filter.mesh.RecalculateNormals();
  36.             filter.mesh.RecalculateBounds();
  37.             filter.mesh.RecalculateTangents();
  38.  
  39.             finishedVerts = new Queue<Vector3>();
  40.             finishedTrias = new Queue<int>();
  41.             finishedUvs = new Queue<Vector2>();
  42.             filter.mesh.name = "Chunk " + chunkPosition.x + " : " + chunkPosition.y;
  43.         }
  44.     }
  45.  
  46.     public void UpdateChunk()//async Task UpdateChunk()
  47.     {
  48.  
  49.         Queue<Vector3> vertices = new Queue<Vector3>();
  50.         Queue<int> triangles = new Queue<int>();
  51.         Queue<Vector2> uvs = new Queue<Vector2>();
  52.  
  53.         for (int i = 0; i < chunkLayers.Length; i++)
  54.         {
  55.             ChunkLayer below = (i-1 >= 0) ? chunkLayers[i - 1] : null;
  56.             ChunkLayer above = (i+1 < 256) ? chunkLayers[i + 1] : null;
  57.  
  58.             SingleLayerUpdate(below, chunkLayers[i], above,
  59.                         World.RetrieveLayer(chunkPosition + new Pos2Int(0, 1), i),
  60.                         World.RetrieveLayer(chunkPosition + new Pos2Int(0, -1), i),
  61.                         World.RetrieveLayer(chunkPosition + new Pos2Int(1, 0), i),
  62.                         World.RetrieveLayer(chunkPosition + new Pos2Int(-1, 0), i),
  63.                         ref vertices, ref triangles, ref uvs);
  64.         }
  65.         finishedVerts = vertices;
  66.         finishedTrias = triangles;
  67.         finishedUvs = uvs;
  68.         //await Task.Delay(1);
  69.     }
  70.  
  71.     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)
  72.     {
  73.         for (int x = 0; x < 16; x++)
  74.         {
  75.             for (int y = 0; y < 16; y++)
  76.             {
  77.                 ChunkBlock selected = _current.layerBlocks[x, y];
  78.                 Pos3Int location = new Pos3Int(x, _current.yLevel, y);
  79.                 //Debug.Log(selected.blockInfo.transparent);
  80.                 if (selected.blockInfo.internalName != "Air")
  81.                 {
  82.                     //Bottom
  83.                     if (_below != null)
  84.                     {
  85.                         if(_below.layerBlocks[x, y].blockInfo.transparent)
  86.                         {
  87.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.Bottom, selected.blockInfo.textures.bottomTextureId);
  88.                         }
  89.                     }
  90.                     else
  91.                     {
  92.                         AddFace(ref verts, ref triangles, ref uvs, location, Side.Bottom, selected.blockInfo.textures.bottomTextureId);
  93.                     }
  94.  
  95.                     //Top
  96.                     if (_above != null)
  97.                     {
  98.                         if (_above.layerBlocks[x, y].blockInfo.transparent)
  99.                         {
  100.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.Top, selected.blockInfo.textures.topTextureId);
  101.                         }
  102.                     }
  103.                     else
  104.                     {
  105.                         AddFace(ref verts, ref triangles, ref uvs, location, Side.Top, selected.blockInfo.textures.topTextureId);
  106.                     }
  107.  
  108.                     //North
  109.                     if (y + 1 > 15 && _north != null)
  110.                     {
  111.                         if (_north.layerBlocks[x, 0].blockInfo.transparent)
  112.                         {
  113.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.North, selected.blockInfo.textures.northTextureId);
  114.                         }
  115.                     }
  116.                     else if (y + 1 <= 15)
  117.                     {
  118.                         if (_current.layerBlocks[x, y + 1].blockInfo.transparent)
  119.                         {
  120.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.North, selected.blockInfo.textures.northTextureId);
  121.                         }
  122.                     }
  123.                     else
  124.                     {
  125.                         AddFace(ref verts, ref triangles, ref uvs, location, Side.North, selected.blockInfo.textures.northTextureId);
  126.                     }
  127.  
  128.                     //South
  129.                     if (y - 1 < 0 && _south != null)
  130.                     {
  131.                         if (_south.layerBlocks[x, 15].blockInfo.transparent)
  132.                         {
  133.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.South, selected.blockInfo.textures.southTextureId);
  134.                         }
  135.                     }
  136.                     else if (y - 1 >= 0)
  137.                     {
  138.                         if (_current.layerBlocks[x, y - 1].blockInfo.transparent)
  139.                         {
  140.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.South, selected.blockInfo.textures.southTextureId);
  141.                         }
  142.                     }
  143.                     else
  144.                     {
  145.                         AddFace(ref verts, ref triangles, ref uvs, location, Side.South, selected.blockInfo.textures.southTextureId);
  146.                     }
  147.  
  148.                     //East
  149.                     if (x + 1 > 15 && _east != null)
  150.                     {
  151.                         if (_east.layerBlocks[0, y].blockInfo.transparent)
  152.                         {
  153.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.East, selected.blockInfo.textures.eastTextureId);
  154.                         }
  155.                     }
  156.                     else if (x + 1 <= 15)
  157.                     {
  158.                         if (_current.layerBlocks[x + 1, y].blockInfo.transparent)
  159.                         {
  160.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.East, selected.blockInfo.textures.eastTextureId);
  161.                         }
  162.                     }
  163.                     else
  164.                     {
  165.                         AddFace(ref verts, ref triangles, ref uvs, location, Side.East, selected.blockInfo.textures.eastTextureId);
  166.                     }
  167.  
  168.                     //West
  169.                     if (x - 1 < 0 && _east != null)
  170.                     {
  171.                         if (_east.layerBlocks[15, y].blockInfo.transparent)
  172.                         {
  173.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.West, selected.blockInfo.textures.westTextureId);
  174.                         }
  175.                     }
  176.                     else if (x - 1 >= 0)
  177.                     {
  178.                         if (_current.layerBlocks[x - 1, y].blockInfo.transparent)
  179.                         {
  180.                             AddFace(ref verts, ref triangles, ref uvs, location, Side.West, selected.blockInfo.textures.westTextureId);
  181.                         }
  182.                     }
  183.                     else
  184.                     {
  185.                         AddFace(ref verts, ref triangles, ref uvs, location, Side.West, selected.blockInfo.textures.westTextureId);
  186.                     }
  187.                     //AddFace(ref verts, ref triangles, ref uvs, location, Side.Top, selected.blockInfo.textures.topTextureId);
  188.                 }
  189.             }
  190.         }
  191.     }
  192.  
  193.     private void AddFace(ref Queue<Vector3> verts, ref Queue<int> triangles, ref Queue<Vector2> uvs, Pos3Int offset, Side side, int textureId)
  194.     {
  195.         Vector2[] uvsToAdd = BlockDictionary.GetBlockTexture(textureId);
  196.         uvs.Enqueue(uvsToAdd[0]);
  197.         uvs.Enqueue(uvsToAdd[1]);
  198.         uvs.Enqueue(uvsToAdd[2]);
  199.         uvs.Enqueue(uvsToAdd[3]);
  200.  
  201.         int count = verts.Count;
  202.  
  203.         triangles.Enqueue(count);
  204.         triangles.Enqueue(count + 1);
  205.         triangles.Enqueue(count + 2);
  206.         triangles.Enqueue(count + 2);
  207.         triangles.Enqueue(count + 3);
  208.         triangles.Enqueue(count);
  209.  
  210.         if (side == Side.North)
  211.         {
  212.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 1));
  213.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 1));
  214.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 1));
  215.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 1));
  216.         }
  217.         else if (side == Side.South)
  218.         {
  219.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 0));
  220.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 0));
  221.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 0));
  222.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 0));
  223.         }
  224.         else if (side == Side.East)
  225.         {
  226.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 0));
  227.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 0));
  228.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 1));
  229.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 1));
  230.         }
  231.         else if (side == Side.West)
  232.         {
  233.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 1));
  234.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 1));
  235.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 0));
  236.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 0));
  237.         }
  238.         else if (side == Side.Top)
  239.         {
  240.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 0));
  241.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 1, 1));
  242.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 1));
  243.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 1, 0));
  244.         }
  245.         else if (side == Side.Bottom)
  246.         {
  247.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 0));
  248.             verts.Enqueue(offset.ConvertVector3() + new Vector3(1, 0, 1));
  249.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 1));
  250.             verts.Enqueue(offset.ConvertVector3() + new Vector3(0, 0, 0));
  251.         }
  252.     }
  253.  
  254.     public void DoTickUpdate()
  255.     {
  256.  
  257.     }
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement