so i have this voxel engine that i want to implement marching cubes to. i cant seem to find anything that will help, so heres the code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class VoxelCube : MonoBehaviour
{
public Vector3 pos;
public List<Vector3> Cubes = new List<Vector3>();
public Mesh mesh;
public List<Vector3> vertices = new List<Vector3>();
public List<int> triangles = new List<int>();
public List<Vector2> uvs = new List<Vector2>();
private int LastVertex;
private void Start()
{
mesh = new Mesh();
for (int x = 0; x<20;x++)
{
for (int y = 0; y<20;y++)
{
for (int z = 0; z<20;z++)
{
SetCube(x,y,z);
}
}
}
for (int i = 0; i < Cubes.Count; i++)
{
pos = Cubes[i];
DrawCube();
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
mesh.SetUVs(0,uvs.ToArray());
mesh.RecalculateNormals();
mesh.Optimize();
GetComponent<MeshFilter>().mesh = mesh;
}
void SetCube(int x, int y, int z)
{
Cubes.Add(new Vector3(x,y,z));
}
void DrawCube()
{
if(!Cubes.Contains(new Vector3(pos.x,pos.y,pos.z+1)))
{
Front_GenerateFace();
}
if(!Cubes.Contains(new Vector3(pos.x,pos.y,pos.z-1)))
{
Back_GenerateFace();
}
if(!Cubes.Contains(new Vector3(pos.x-1,pos.y,pos.z)))
{
Left_GenerateFace();
}
if(!Cubes.Contains(new Vector3(pos.x+1,pos.y,pos.z)))
{
Right_GenerateFace();
}
if(!Cubes.Contains(new Vector3(pos.x,pos.y+1,pos.z)))
{
Top_GenerateFace();
}
if(!Cubes.Contains(new Vector3(pos.x,pos.y-1,pos.z)))
{
Bottom_GenerateFace();
}
}
void Front_GenerateFace()
{
LastVertex = vertices.Count;
vertices.Add(pos + Vector3.forward);
vertices.Add(pos + Vector3.forward + Vector3.up);
vertices.Add(pos + Vector3.forward + Vector3.up + Vector3.right);
vertices.Add(pos + Vector3.forward + Vector3.right);
triangles.Add(LastVertex+2);
triangles.Add(LastVertex+1);
triangles.Add(LastVertex);
triangles.Add(LastVertex);
triangles.Add(LastVertex+3);
triangles.Add(LastVertex+2);
}
void Back_GenerateFace()
{
LastVertex = vertices.Count;
vertices.Add(pos + Vector3.right);
vertices.Add(pos + Vector3.up + Vector3.right);
vertices.Add(pos + Vector3.up);
vertices.Add(pos);
triangles.Add(LastVertex + 2);
triangles.Add(LastVertex + 1);
triangles.Add(LastVertex);
triangles.Add(LastVertex);
triangles.Add(LastVertex + 3);
triangles.Add(LastVertex + 2);
}
void Left_GenerateFace()
{
LastVertex = vertices.Count;
vertices.Add(pos);
vertices.Add(pos + Vector3.up);
vertices.Add(pos + Vector3.forward + Vector3.up);
vertices.Add(pos + Vector3.forward);
triangles.Add(LastVertex+2);
triangles.Add(LastVertex+1);
triangles.Add(LastVertex);
triangles.Add(LastVertex);
triangles.Add(LastVertex+3);
triangles.Add(LastVertex+2);
}
void Right_GenerateFace()
{
LastVertex = vertices.Count;
vertices.Add(pos + Vector3.right + Vector3.forward);
vertices.Add(pos + Vector3.one);
vertices.Add(pos + Vector3.right + Vector3.up);
vertices.Add(pos + Vector3.right);
triangles.Add(LastVertex+2);
triangles.Add(LastVertex+1);
triangles.Add(LastVertex);
triangles.Add(LastVertex);
triangles.Add(LastVertex+3);
triangles.Add(LastVertex+2);
}
void Top_GenerateFace()
{
LastVertex = vertices.Count;
vertices.Add(pos + Vector3.up + Vector3.right);
vertices.Add(pos + Vector3.one);
vertices.Add(pos + Vector3.forward + Vector3.up);
vertices.Add(pos + Vector3.up);
triangles.Add(LastVertex+2);
triangles.Add(LastVertex+1);
triangles.Add(LastVertex);
triangles.Add(LastVertex);
triangles.Add(LastVertex+3);
triangles.Add(LastVertex+2);
}
void Bottom_GenerateFace()
{
LastVertex = vertices.Count;
vertices.Add(pos);
vertices.Add(pos + Vector3.forward);
vertices.Add(pos + Vector3.forward + Vector3.right);
vertices.Add(pos + Vector3.right);
triangles.Add(LastVertex+2);
triangles.Add(LastVertex+1);
triangles.Add(LastVertex);
triangles.Add(LastVertex);
triangles.Add(LastVertex+3);
triangles.Add(LastVertex+2);
}
}
(any optimizations would be nice too)