Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.37 KB | None | 0 0
  1. /// <summary>
  2. /// Generate the chunk mesh.
  3. /// </summary>
  4. public void GenerateMesh()
  5. {
  6. Stopwatch stopwatch = new Stopwatch();
  7. stopwatch.Start();
  8.  
  9. DynamicMesh chunkDynamicMesh = new DynamicMesh(65535);
  10. for(int x = 0; x < CHUNK_WIDTH; x++)
  11. {
  12. for(int y = 0; y < CHUNK_HEIGHT; y++)
  13. {
  14. for(int z = 0; z < CHUNK_DEPTH; z++)
  15. {
  16. IVoxelBase currentVoxel = this.GetVoxel(x, y, z);
  17. VoxelProperties voxelProperties = currentVoxel.GetProperties();
  18.  
  19. if(voxelProperties.IsMeshable)
  20. {
  21. IVoxelBase northVoxel = this.GetVoxel(x, y, z + 1);
  22. IVoxelBase southVoxel = this.GetVoxel(x, y, z - 1);
  23. IVoxelBase eastVoxel = this.GetVoxel(x + 1, y, z);
  24. IVoxelBase westVoxel = this.GetVoxel(x - 1, y, z);
  25. IVoxelBase upVoxel = this.GetVoxel(x, y + 1, z);
  26. IVoxelBase downVoxel = this.GetVoxel(x, y - 1, z);
  27.  
  28. Color northFaceColor = ((Color)voxelProperties.Color * 0.9f) * (northVoxel.Lighting / 16.0f);
  29. Color southFaceColor = ((Color)voxelProperties.Color * 0.9f) * (southVoxel.Lighting / 16.0f);
  30. Color eastFaceColor = ((Color)voxelProperties.Color * 0.8f) * (eastVoxel.Lighting / 16.0f);
  31. Color westFaceColor = ((Color)voxelProperties.Color * 0.8f) * (westVoxel.Lighting / 16.0f);
  32. Color upFaceColor = ((Color)voxelProperties.Color * 1.0f) * (upVoxel.Lighting / 16.0f);
  33. Color downFaceColor = ((Color)voxelProperties.Color * 0.7f) * (downVoxel.Lighting / 16.0f);
  34.  
  35. northFaceColor.a = 1.0f;
  36. southFaceColor.a = 1.0f;
  37. eastFaceColor.a = 1.0f;
  38. westFaceColor.a = 1.0f;
  39. upFaceColor.a = 1.0f;
  40. downFaceColor.a = 1.0f;
  41.  
  42. if(!northVoxel.GetProperties().IsSolid)
  43. {
  44. float aoFactorOne = this.CalculateAOFactor(this.GetVoxel(x + 1, y - 1, z + 1), this.GetVoxel(x + 1, y, z + 1), this.GetVoxel(x, y - 1, z + 1), AO_DARKNESS_LIMIT);
  45. float aoFactorTwo = this.CalculateAOFactor(this.GetVoxel(x + 1, y + 1, z + 1), this.GetVoxel(x + 1, y, z + 1), this.GetVoxel(x, y + 1, z + 1), AO_DARKNESS_LIMIT);
  46. float aoFactorThree = this.CalculateAOFactor(this.GetVoxel(x - 1, y + 1, z + 1), this.GetVoxel(x - 1, y, z + 1), this.GetVoxel(x, y + 1, z + 1), AO_DARKNESS_LIMIT);
  47. float aoFactorFour = this.CalculateAOFactor(this.GetVoxel(x - 1, y - 1, z + 1), this.GetVoxel(x - 1, y, z + 1), this.GetVoxel(x, y - 1, z + 1), AO_DARKNESS_LIMIT);
  48.  
  49. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), northFaceColor * aoFactorOne);
  50. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), northFaceColor * aoFactorTwo);
  51. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), northFaceColor * aoFactorThree);
  52. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), northFaceColor * aoFactorFour);
  53. chunkDynamicMesh.AddUVs(currentVoxel.GetFaceUVs(VoxelFace.North));
  54. chunkDynamicMesh.AddQuad(aoFactorOne + aoFactorThree > aoFactorTwo + aoFactorFour);
  55. }
  56.  
  57. if(!southVoxel.GetProperties().IsSolid)
  58. {
  59. float aoFactorOne = this.CalculateAOFactor(this.GetVoxel(x - 1, y - 1, z - 1), this.GetVoxel(x - 1, y, z - 1), this.GetVoxel(x, y - 1, z - 1), AO_DARKNESS_LIMIT);
  60. float aoFactorTwo = this.CalculateAOFactor(this.GetVoxel(x - 1, y + 1, z - 1), this.GetVoxel(x - 1, y, z - 1), this.GetVoxel(x, y + 1, z - 1), AO_DARKNESS_LIMIT); ;
  61. float aoFactorThree = this.CalculateAOFactor(this.GetVoxel(x + 1, y + 1, z - 1), this.GetVoxel(x + 1, y, z - 1), this.GetVoxel(x, y + 1, z - 1), AO_DARKNESS_LIMIT); ;
  62. float aoFactorFour = this.CalculateAOFactor(this.GetVoxel(x + 1, y - 1, z - 1), this.GetVoxel(x + 1, y, z - 1), this.GetVoxel(x, y - 1, z - 1), AO_DARKNESS_LIMIT); ;
  63.  
  64. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), southFaceColor * aoFactorOne);
  65. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), southFaceColor * aoFactorTwo);
  66. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), southFaceColor * aoFactorThree);
  67. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), southFaceColor * aoFactorFour);
  68. chunkDynamicMesh.AddUVs(currentVoxel.GetFaceUVs(VoxelFace.South));
  69. chunkDynamicMesh.AddQuad(aoFactorOne + aoFactorThree > aoFactorTwo + aoFactorFour);
  70. }
  71.  
  72. if(!eastVoxel.GetProperties().IsSolid)
  73. {
  74. float aoFactorOne = this.CalculateAOFactor(this.GetVoxel(x + 1, y - 1, z - 1), this.GetVoxel(x + 1, y - 1, z), this.GetVoxel(x + 1, y, z - 1), AO_DARKNESS_LIMIT);
  75. float aoFactorTwo = this.CalculateAOFactor(this.GetVoxel(x + 1, y + 1, z - 1), this.GetVoxel(x + 1, y + 1, z), this.GetVoxel(x + 1, y, z - 1), AO_DARKNESS_LIMIT);
  76. float aoFactorThree = this.CalculateAOFactor(this.GetVoxel(x + 1, y + 1, z + 1), this.GetVoxel(x + 1, y + 1, z), this.GetVoxel(x + 1, y, z + 1), AO_DARKNESS_LIMIT);
  77. float aoFactorFour = this.CalculateAOFactor(this.GetVoxel(x + 1, y - 1, z + 1), this.GetVoxel(x + 1, y - 1, z), this.GetVoxel(x + 1, y, z + 1), AO_DARKNESS_LIMIT);
  78.  
  79. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), eastFaceColor * aoFactorOne);
  80. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), eastFaceColor * aoFactorTwo);
  81. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), eastFaceColor * aoFactorThree);
  82. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), eastFaceColor * aoFactorFour);
  83. chunkDynamicMesh.AddUVs(currentVoxel.GetFaceUVs(VoxelFace.East));
  84. chunkDynamicMesh.AddQuad(aoFactorOne + aoFactorThree > aoFactorTwo + aoFactorFour);
  85. }
  86.  
  87. if(!westVoxel.GetProperties().IsSolid)
  88. {
  89. float aoFactorOne = this.CalculateAOFactor(this.GetVoxel(x - 1, y - 1, z + 1), this.GetVoxel(x - 1, y - 1, z), this.GetVoxel(x - 1, y, z + 1), AO_DARKNESS_LIMIT);
  90. float aoFactorTwo = this.CalculateAOFactor(this.GetVoxel(x - 1, y + 1, z + 1), this.GetVoxel(x - 1, y + 1, z), this.GetVoxel(x - 1, y, z + 1), AO_DARKNESS_LIMIT);
  91. float aoFactorThree = this.CalculateAOFactor(this.GetVoxel(x - 1, y + 1, z - 1), this.GetVoxel(x - 1, y + 1, z), this.GetVoxel(x - 1, y, z - 1), AO_DARKNESS_LIMIT);
  92. float aoFactorFour = this.CalculateAOFactor(this.GetVoxel(x - 1, y - 1, z - 1), this.GetVoxel(x - 1, y - 1, z), this.GetVoxel(x - 1, y, z - 1), AO_DARKNESS_LIMIT);
  93.  
  94. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), westFaceColor * aoFactorOne);
  95. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), westFaceColor * aoFactorTwo);
  96. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), westFaceColor * aoFactorThree);
  97. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), westFaceColor * aoFactorFour);
  98. chunkDynamicMesh.AddUVs(currentVoxel.GetFaceUVs(VoxelFace.West));
  99. chunkDynamicMesh.AddQuad(aoFactorOne + aoFactorThree > aoFactorTwo + aoFactorFour);
  100. }
  101.  
  102. if(!upVoxel.GetProperties().IsSolid)
  103. {
  104. float aoFactorOne = this.CalculateAOFactor(this.GetVoxel(x - 1, y + 1, z + 1), this.GetVoxel(x - 1, y + 1, z), this.GetVoxel(x, y + 1, z + 1), AO_DARKNESS_LIMIT);
  105. float aoFactorTwo = this.CalculateAOFactor(this.GetVoxel(x + 1, y + 1, z + 1), this.GetVoxel(x + 1, y + 1, z), this.GetVoxel(x, y + 1, z + 1), AO_DARKNESS_LIMIT);
  106. float aoFactorThree = this.CalculateAOFactor(this.GetVoxel(x + 1, y + 1, z - 1), this.GetVoxel(x + 1, y + 1, z), this.GetVoxel(x, y + 1, z - 1), AO_DARKNESS_LIMIT);
  107. float aoFactorFour = this.CalculateAOFactor(this.GetVoxel(x - 1, y + 1, z - 1), this.GetVoxel(x - 1, y + 1, z), this.GetVoxel(x, y + 1, z - 1), AO_DARKNESS_LIMIT);
  108.  
  109. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), upFaceColor * aoFactorOne);
  110. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), upFaceColor * aoFactorTwo);
  111. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), upFaceColor * aoFactorThree);
  112. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y + voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), upFaceColor * aoFactorFour);
  113. chunkDynamicMesh.AddUVs(currentVoxel.GetFaceUVs(VoxelFace.Up));
  114. chunkDynamicMesh.AddQuad(aoFactorOne + aoFactorThree > aoFactorTwo + aoFactorFour);
  115. }
  116.  
  117. if(!downVoxel.GetProperties().IsSolid)
  118. {
  119. float aoFactorOne = this.CalculateAOFactor(this.GetVoxel(x - 1, y - 1, z - 1), this.GetVoxel(x - 1, y - 1, z), this.GetVoxel(x, y - 1, z - 1), AO_DARKNESS_LIMIT);
  120. float aoFactorTwo = this.CalculateAOFactor(this.GetVoxel(x + 1, y - 1, z - 1), this.GetVoxel(x + 1, y - 1, z), this.GetVoxel(x, y - 1, z - 1), AO_DARKNESS_LIMIT);
  121. float aoFactorThree = this.CalculateAOFactor(this.GetVoxel(x + 1, y - 1, z + 1), this.GetVoxel(x + 1, y - 1, z), this.GetVoxel(x, y - 1, z + 1), AO_DARKNESS_LIMIT);
  122. float aoFactorFour = this.CalculateAOFactor(this.GetVoxel(x - 1, y - 1, z + 1), this.GetVoxel(x - 1, y - 1, z), this.GetVoxel(x, y - 1, z + 1), AO_DARKNESS_LIMIT);
  123.  
  124. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), downFaceColor);
  125. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z - voxelProperties.MeshRadii.z), downFaceColor);
  126. chunkDynamicMesh.AddVertex(new Vector3(x + voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), downFaceColor);
  127. chunkDynamicMesh.AddVertex(new Vector3(x - voxelProperties.MeshRadii.x, y - voxelProperties.MeshRadii.y, z + voxelProperties.MeshRadii.z), downFaceColor);
  128. chunkDynamicMesh.AddUVs(currentVoxel.GetFaceUVs(VoxelFace.Down));
  129. chunkDynamicMesh.AddQuad(aoFactorOne + aoFactorThree > aoFactorTwo + aoFactorFour);
  130. }
  131. }
  132. }
  133. }
  134. }
  135.  
  136. this.MeshFilter.mesh.Clear();
  137. this.MeshFilter.mesh.vertices = chunkDynamicMesh.RenderingVertices.ToArray();
  138. this.MeshFilter.mesh.triangles = chunkDynamicMesh.RenderingTriangles.ToArray();
  139. this.MeshFilter.mesh.uv = chunkDynamicMesh.RenderingUVs.ToArray();
  140. this.MeshFilter.mesh.colors = chunkDynamicMesh.RenderingColors.ToArray();
  141. this.MeshFilter.mesh.RecalculateNormals();
  142.  
  143. Mesh newMeshCollider = new Mesh();
  144. newMeshCollider.vertices = chunkDynamicMesh.ColliderVertices.ToArray();
  145. newMeshCollider.triangles = chunkDynamicMesh.ColliderTriangles.ToArray();
  146. this.MeshCollider.sharedMesh = null;
  147. this.MeshCollider.sharedMesh = newMeshCollider;
  148.  
  149. stopwatch.Stop();
  150. UnityEngine.Debug.Log(stopwatch.ElapsedMilliseconds);
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement