Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.94 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class Block
  6. {
  7.  
  8. enum Cubeside { BOTTOM, TOP, LEFT, RIGHT, FRONT, BACK };
  9. public enum BlockType { GRASS, DIRT, STONE, SAND, DIAMOND, COAL, GOLD, BEDROCK, AIR };
  10.  
  11.  
  12. public BlockType bType;
  13. public bool isSolid;
  14. Chunk owner;
  15. GameObject parent;
  16. Vector3 position;
  17.  
  18. Vector2[,] blockUVs = {
  19. /*grass top*/{new Vector2(0f,0.9375f),new Vector2(0.0625f,0.9375f),new Vector2(0f,1f),new Vector2(0.0625f,1f) },
  20. /*grass side*/{new Vector2(0.1875f,0.9375f),new Vector2(0.25f,0.9375f),new Vector2(0.1875f,1f),new Vector2(0.25f,1f)},
  21. /*dirt*/{new Vector2(0.5f,0.6875f),new Vector2(0.5625f,0.6875f),new Vector2(0.5f,0.75f),new Vector2(0.5625f,0.75f)},
  22. /*stone*/{new Vector2(0f,0.8125f),new Vector2(0.0625f,0.8125f),new Vector2(0f,0.875f),new Vector2(0.0625f,0.875f)},
  23. /*sand*/{new Vector2(0f,0.25f),new Vector2(0.0625f,0.25f),new Vector2(0f,0.3125f),new Vector2(0.0625f,0.3125f)},
  24. /*diamond*/{new Vector2(0f,0.3125f),new Vector2(0.0625f,0.3125f),new Vector2(0f,0.375f),new Vector2(0.0625f,0.375f)},
  25. /*coal*/{new Vector2(0.125f,0.8125f),new Vector2(0.1875f,0.8125f),new Vector2(0.125f,0.875f),new Vector2(0.1875f,0.875f) },
  26. /*gold*/{ new Vector2(0.125f,0.75f),new Vector2(0.1875f,0.75f),new Vector2(0.125f,0.8125f),new Vector2(0.1875f,0.8125f)},
  27. /*bedrock*/{ new Vector2(0.4375f,0.3125f),new Vector2(0.5f,0.3125f),new Vector2(0.4375f,0.375f),new Vector2(0.5f,0.375f)}};
  28.  
  29. public Block(BlockType b, Vector3 pos, GameObject p, Chunk o)
  30. {
  31. bType = b;
  32. owner = o;
  33. parent = p;
  34. position = pos;
  35. if (bType == BlockType.AIR)
  36. isSolid = false;
  37. else
  38. isSolid = true;
  39. }
  40.  
  41. public Block(BlockType b, Vector3 pos, GameObject p)
  42. {
  43. bType = b;
  44. parent = p;
  45. position = pos;
  46. if (bType == BlockType.AIR)
  47. isSolid = false;
  48. else
  49. isSolid = true;
  50. }
  51.  
  52. public void SetType(BlockType b)
  53. {
  54. bType = b;
  55. if (bType == BlockType.AIR)
  56. isSolid = false;
  57. else
  58. isSolid = true;
  59. }
  60.  
  61. void CreateQuad(Cubeside side)
  62. {
  63. Mesh mesh = new Mesh();
  64. mesh.name = "ScriptedMesh" + side.ToString();
  65.  
  66. Vector3[] vertices = new Vector3[4];
  67. Vector3[] normals = new Vector3[4];
  68. Vector2[] uvs = new Vector2[4];
  69. int[] triangles = new int[6];
  70.  
  71. //all possible UVs
  72. Vector2 uv00;
  73. Vector2 uv10;
  74. Vector2 uv01;
  75. Vector2 uv11;
  76.  
  77. if (bType == BlockType.GRASS && side == Cubeside.TOP)
  78. {
  79. uv00 = blockUVs[0, 0];
  80. uv10 = blockUVs[0, 1];
  81. uv01 = blockUVs[0, 2];
  82. uv11 = blockUVs[0, 3];
  83. }
  84. else if (bType == BlockType.GRASS && side == Cubeside.BOTTOM)
  85. {
  86. uv00 = blockUVs[(int)(BlockType.DIRT + 1), 0];
  87. uv10 = blockUVs[(int)(BlockType.DIRT + 1), 1];
  88. uv01 = blockUVs[(int)(BlockType.DIRT + 1), 2];
  89. uv11 = blockUVs[(int)(BlockType.DIRT + 1), 3];
  90. }
  91. else
  92. {
  93. uv00 = blockUVs[(int)(bType + 1), 0];
  94. uv10 = blockUVs[(int)(bType + 1), 1];
  95. uv01 = blockUVs[(int)(bType + 1), 2];
  96. uv11 = blockUVs[(int)(bType + 1), 3];
  97. }
  98.  
  99. //all possible vertices
  100. Vector3 p0 = new Vector3(-0.5f, -0.5f, 0.5f);
  101. Vector3 p1 = new Vector3(0.5f, -0.5f, 0.5f);
  102. Vector3 p2 = new Vector3(0.5f, -0.5f, -0.5f);
  103. Vector3 p3 = new Vector3(-0.5f, -0.5f, -0.5f);
  104. Vector3 p4 = new Vector3(-0.5f, 0.5f, 0.5f);
  105. Vector3 p5 = new Vector3(0.5f, 0.5f, 0.5f);
  106. Vector3 p6 = new Vector3(0.5f, 0.5f, -0.5f);
  107. Vector3 p7 = new Vector3(-0.5f, 0.5f, -0.5f);
  108.  
  109. switch (side)
  110. {
  111. case Cubeside.BOTTOM:
  112. vertices = new Vector3[] { p0, p1, p2, p3 };
  113. normals = new Vector3[] {Vector3.down, Vector3.down,
  114. Vector3.down, Vector3.down};
  115. uvs = new Vector2[] { uv11, uv01, uv00, uv10 };
  116. triangles = new int[] { 3, 1, 0, 3, 2, 1 };
  117. break;
  118. case Cubeside.TOP:
  119. vertices = new Vector3[] { p7, p6, p5, p4 };
  120. normals = new Vector3[] {Vector3.up, Vector3.up,
  121. Vector3.up, Vector3.up};
  122. uvs = new Vector2[] { uv11, uv01, uv00, uv10 };
  123. triangles = new int[] { 3, 1, 0, 3, 2, 1 };
  124. break;
  125. case Cubeside.LEFT:
  126. vertices = new Vector3[] { p7, p4, p0, p3 };
  127. normals = new Vector3[] {Vector3.left, Vector3.left,
  128. Vector3.left, Vector3.left};
  129. uvs = new Vector2[] { uv11, uv01, uv00, uv10 };
  130. triangles = new int[] { 3, 1, 0, 3, 2, 1 };
  131. break;
  132. case Cubeside.RIGHT:
  133. vertices = new Vector3[] { p5, p6, p2, p1 };
  134. normals = new Vector3[] {Vector3.right, Vector3.right,
  135. Vector3.right, Vector3.right};
  136. uvs = new Vector2[] { uv11, uv01, uv00, uv10 };
  137. triangles = new int[] { 3, 1, 0, 3, 2, 1 };
  138. break;
  139. case Cubeside.FRONT:
  140. vertices = new Vector3[] { p4, p5, p1, p0 };
  141. normals = new Vector3[] {Vector3.forward, Vector3.forward,
  142. Vector3.forward, Vector3.forward};
  143. uvs = new Vector2[] { uv11, uv01, uv00, uv10 };
  144. triangles = new int[] { 3, 1, 0, 3, 2, 1 };
  145. break;
  146. case Cubeside.BACK:
  147. vertices = new Vector3[] { p6, p7, p3, p2 };
  148. normals = new Vector3[] {Vector3.back, Vector3.back,
  149. Vector3.back, Vector3.back};
  150. uvs = new Vector2[] { uv11, uv01, uv00, uv10 };
  151. triangles = new int[] { 3, 1, 0, 3, 2, 1 };
  152. break;
  153. }
  154.  
  155. mesh.vertices = vertices;
  156. mesh.normals = normals;
  157. mesh.uv = uvs;
  158. mesh.triangles = triangles;
  159.  
  160. mesh.RecalculateBounds();
  161.  
  162. GameObject quad = new GameObject("Quad");
  163. quad.transform.position = position;
  164. quad.transform.parent = this.parent.transform;
  165.  
  166. MeshFilter meshFilter = (MeshFilter)quad.AddComponent(typeof(MeshFilter));
  167. meshFilter.mesh = mesh;
  168.  
  169. }
  170.  
  171. int ConvertBlockIndexToLocal(int i)
  172. {
  173. if (i == -1)
  174. i = World.chunkSize - 1;
  175. else if (i == World.chunkSize)
  176. i = 0;
  177. return i;
  178. }
  179.  
  180. public bool HasSolidNeighbour(int x, int y, int z)
  181. {
  182. Block[,,] chunks;
  183.  
  184. if (x < 0 || x >= World.chunkSize ||
  185. y < 0 || y >= World.chunkSize ||
  186. z < 0 || z >= World.chunkSize)
  187. { //block in a neighbouring chunk
  188.  
  189. Vector3 neighbourChunkPos = this.parent.transform.position +
  190. new Vector3((x - (int)position.x) * World.chunkSize,
  191. (y - (int)position.y) * World.chunkSize,
  192. (z - (int)position.z) * World.chunkSize);
  193. string nName = World.BuildChunkName(neighbourChunkPos);
  194.  
  195. x = ConvertBlockIndexToLocal(x);
  196. y = ConvertBlockIndexToLocal(y);
  197. z = ConvertBlockIndexToLocal(z);
  198.  
  199. Chunk nChunk;
  200. if (World.chunks.TryGetValue(nName, out nChunk))
  201. {
  202. chunks = nChunk.chunkData;
  203. }
  204. else
  205. return false;
  206. } //block in this chunk
  207. else
  208. chunks = owner.chunkData;
  209.  
  210. try
  211. {
  212. return chunks[x, y, z].isSolid;
  213. }
  214. catch (System.IndexOutOfRangeException) { }
  215.  
  216. return false;
  217. }
  218.  
  219. public void Draw()
  220. {
  221. if (bType == BlockType.AIR) return;
  222.  
  223. if (!HasSolidNeighbour((int)position.x, (int)position.y, (int)position.z + 1))
  224. CreateQuad(Cubeside.FRONT);
  225. if (!HasSolidNeighbour((int)position.x, (int)position.y, (int)position.z - 1))
  226. CreateQuad(Cubeside.BACK);
  227. if (!HasSolidNeighbour((int)position.x, (int)position.y + 1, (int)position.z))
  228. CreateQuad(Cubeside.TOP);
  229. if (!HasSolidNeighbour((int)position.x, (int)position.y - 1, (int)position.z))
  230. CreateQuad(Cubeside.BOTTOM);
  231. if (!HasSolidNeighbour((int)position.x - 1, (int)position.y, (int)position.z))
  232. CreateQuad(Cubeside.LEFT);
  233. if (!HasSolidNeighbour((int)position.x + 1, (int)position.y, (int)position.z))
  234. CreateQuad(Cubeside.RIGHT);
  235. }
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement