Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3.  
  4. [RequireComponent(typeof(MeshFilter))]
  5. public class MarchingCubes : MonoBehaviour
  6. {
  7. [Header("Main")]
  8. public Chunk ChunkRef;
  9. public TerrainManager TM;
  10.  
  11. MeshFilter meshFilter;
  12. MeshCollider meshCollider;
  13.  
  14. List<Vector3> Vertices = new List<Vector3>();
  15. List<int> Triangles = new List<int>();
  16.  
  17. int c = -1;
  18.  
  19. public void Create()
  20. {
  21. meshFilter = GetComponent<MeshFilter>();
  22. meshCollider = GetComponent<MeshCollider>();
  23.  
  24. ChunkRef.TerrainMap = new float[TM.TD.ChunkSize + 1, TM.TD.ChunkHeight + 1, TM.TD.ChunkSize + 1];
  25. CreateTerrainMap();
  26.  
  27. CreateMeshData();
  28. }
  29.  
  30. void ClearMeshData()
  31. {
  32. Vertices.Clear();
  33. Triangles.Clear();
  34. }
  35.  
  36. void BuildMesh()
  37. {
  38. Mesh mesh = new Mesh();
  39. mesh.vertices = Vertices.ToArray();
  40. mesh.triangles = Triangles.ToArray();
  41. mesh.RecalculateNormals();
  42.  
  43. meshFilter.mesh = mesh;
  44. meshCollider.sharedMesh = mesh;
  45. }
  46.  
  47. int GetCubeConfig(float[] cube)
  48. {
  49. int index = 0;
  50. for (int i = 0; i < 8; i++)
  51. {
  52. if (cube[i] > TM.TD.SurfaceLevel)
  53. index |= 1 << i;
  54. }
  55.  
  56. return index;
  57. }
  58.  
  59. void MarchCube(Vector3Int pos)
  60. {
  61. float[] cube = new float[8];
  62. for (int i = 0; i < 8; i++)
  63. {
  64. cube[i] = SampleTerrain(pos + TM.CornerTable[i]);
  65. }
  66.  
  67. int index = GetCubeConfig(cube);
  68.  
  69. if (index == 0 || index == 255)
  70. return;
  71.  
  72. int e = 0;
  73.  
  74. for (int i = 0; i < 5; i++)
  75. {
  76. for (int p = 0; p < 3; p++)
  77. {
  78. int indice = TM.TriangleTable[index, e];
  79.  
  80. if (indice == -1)
  81. return;
  82.  
  83. Vector3 vert1 = pos + TM.CornerTable[TM.EdgeIndexes[indice, 0]];
  84. Vector3 vert2 = pos + TM.CornerTable[TM.EdgeIndexes[indice, 1]];
  85.  
  86. Vector3 vertPos;
  87.  
  88. if (TM.TD.SmoothTerrain)
  89. {
  90. float vert1Sample = cube[TM.EdgeIndexes[indice, 0]];
  91. float vert2Sample = cube[TM.EdgeIndexes[indice, 1]];
  92.  
  93. float dif = vert2Sample - vert1Sample;
  94. if (dif == 0)
  95. dif = TM.TD.SurfaceLevel;
  96. else
  97. dif = (TM.TD.SurfaceLevel - vert1Sample) / dif;
  98.  
  99. vertPos = vert1 + ((vert2 - vert1) * dif);
  100. }
  101. else
  102. vertPos = (vert1 + vert2) / 2f;
  103.  
  104. if (TM.TD.FlatShaded)
  105. {
  106. Vertices.Add(vertPos);
  107. Triangles.Add(Vertices.Count - 1);
  108. } else
  109. Triangles.Add(VertForIndice(vertPos));
  110.  
  111. e++;
  112. }
  113. }
  114. }
  115.  
  116. void CreateTerrainMap()
  117. {
  118. for (int x = 0; x < TM.TD.ChunkSize + 1; x++)
  119. {
  120. for (int y = 0; y < TM.TD.ChunkHeight + 1; y++)
  121. {
  122. for (int z = 0; z < TM.TD.ChunkSize + 1; z++)
  123. {
  124. float h = TM.PG.SampleTerrain(new Vector2(x + TM.TD.ChunkSize * ChunkRef.Pos.x, z + TM.TD.ChunkSize * ChunkRef.Pos.y));
  125.  
  126. ChunkRef.TerrainMap[x, y, z] = y - h;
  127. }
  128. }
  129. }
  130. }
  131.  
  132. void CreateMeshData()
  133. {
  134. ClearMeshData();
  135.  
  136. for (int x = 0; x < TM.TD.ChunkSize; x++)
  137. {
  138. for (int y = 0; y < TM.TD.ChunkHeight; y++)
  139. {
  140. for (int z = 0; z < TM.TD.ChunkSize; z++)
  141. {
  142. MarchCube(new Vector3Int(x, y, z));
  143. }
  144. }
  145. }
  146.  
  147. BuildMesh();
  148. }
  149.  
  150. float SampleTerrain(Vector3Int point)
  151. {
  152. return ChunkRef.TerrainMap[point.x, point.y, point.z];
  153. }
  154.  
  155. int VertForIndice(Vector3 vert)
  156. {
  157. for (int i = 0; i < Vertices.Count; i++)
  158. {
  159. if (Vertices[i] == vert)
  160. return i;
  161. }
  162.  
  163. Vertices.Add(vert);
  164. return Vertices.Count - 1;
  165. }
  166.  
  167. public void PlaceTerrain(Vector3 pos)
  168. {
  169. Vector3Int p = new Vector3Int(Mathf.CeilToInt(pos.x), Mathf.CeilToInt(pos.y), Mathf.CeilToInt(pos.z));
  170. ChunkRef.TerrainMap[p.x, p.y, p.z] = 0f;
  171. CreateMeshData();
  172. }
  173.  
  174. public void RemoveTerrain(Vector3 pos)
  175. {
  176. Vector3Int p = new Vector3Int(Mathf.FloorToInt(pos.x), Mathf.FloorToInt(pos.y), Mathf.FloorToInt(pos.z));
  177. ChunkRef.TerrainMap[p.x, p.y, p.z] = 1f;
  178. CreateMeshData();
  179. }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement