Files
Marching-Cubes/Assets/Script/MeshGeneration.cs
2023-03-02 12:39:08 +01:00

77 lines
2.2 KiB
C#

using System;
using Unity.VisualScripting;
using UnityEngine;
public class MeshGeneration : MonoBehaviour
{
[SerializeField] private Noise noise;
[SerializeField] private ComputeShader marchShader;
public Mesh March(int numPointsPerAxis, Vector3 offset, float isoLevel)
{
Buffers.Create(numPointsPerAxis);
int numVoxelsPerAxis = numPointsPerAxis - 1;
int numThreadsPerAxis = Mathf.CeilToInt (numVoxelsPerAxis / (float) 8);
noise.Generate(numPointsPerAxis, numThreadsPerAxis, offset);
marchShader.SetBuffer(0, "points", Buffers.pointsBuffer);
marchShader.SetBuffer(0, "triangles", Buffers.triangleBuffer);
marchShader.SetInt("numPointsPerAxis", numPointsPerAxis);
marchShader.SetFloat("isoLevel", isoLevel);
marchShader.Dispatch(0, numThreadsPerAxis,numThreadsPerAxis,numThreadsPerAxis);
ComputeBuffer.CopyCount(Buffers.triangleBuffer, Buffers.triCountBuffer, 0);
int[] triCountArray = { 0 };
Buffers.triCountBuffer.GetData(triCountArray);
int numTris = triCountArray[0];
Triangle[] tris = new Triangle[numTris];
Buffers.triangleBuffer.GetData(tris, 0,0, numTris);
Mesh mesh = new Mesh();
mesh.Clear();
var vertices = new Vector3[numTris * 3];
var meshTriangles = new int[numTris * 3];
for (int i = 0; i < numTris; i++) {
for (int j = 0; j < 3; j++) {
meshTriangles[i * 3 + j] = i * 3 + j;
vertices[i * 3 + j] = tris[i][j];
}
}
mesh.vertices = vertices;
mesh.triangles = meshTriangles;
mesh.RecalculateNormals();
return mesh;
}
private void OnDestroy()
{
Buffers.Release();
}
struct Triangle
{
public Vector3 a;
public Vector3 b;
public Vector3 c;
public Vector3 this [int i] {
get {
switch (i) {
case 0:
return a;
case 1:
return b;
default:
return c;
}
}
}
}
}