Skip to content

Instantly share code, notes, and snippets.

@Eldemarkki
Last active January 16, 2021 15:48
Show Gist options
  • Select an option

  • Save Eldemarkki/e213350650a73b61be53a742df1f0c29 to your computer and use it in GitHub Desktop.

Select an option

Save Eldemarkki/e213350650a73b61be53a742df1f0c29 to your computer and use it in GitHub Desktop.
A sample code for a blog post at eetumaenpaa.fi
using Eldemarkki.VoxelTerrain.Utilities;
using System.Runtime.CompilerServices;
using Eldemarkki.VoxelTerrain.Meshing.Data;
using Unity.Mathematics;
using Eldemarkki.VoxelTerrain.VoxelData;
namespace Eldemarkki.VoxelTerrain.Meshing.MarchingCubes
{
public static class MarchingCubesFunctions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float3 VertexInterpolate(float3 p1, float3 p2, float v1, float v2, float isolevel)
{
return p1 + (isolevel - v1) * (p2 - p1) / (v2 - v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static byte CalculateCubeIndex(VoxelCorners<byte> voxelDensities, byte isolevel)
{
byte cubeIndex = 0;
if (voxelDensities.Corner1 < isolevel) { cubeIndex |= 1; }
if (voxelDensities.Corner2 < isolevel) { cubeIndex |= 2; }
if (voxelDensities.Corner3 < isolevel) { cubeIndex |= 4; }
if (voxelDensities.Corner4 < isolevel) { cubeIndex |= 8; }
if (voxelDensities.Corner5 < isolevel) { cubeIndex |= 16; }
if (voxelDensities.Corner6 < isolevel) { cubeIndex |= 32; }
if (voxelDensities.Corner7 < isolevel) { cubeIndex |= 64; }
if (voxelDensities.Corner8 < isolevel) { cubeIndex |= 128; }
return cubeIndex;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static VertexList GenerateVertexList(VoxelCorners<byte> voxelDensities, int3 voxelLocalPosition,
int edgeIndex, byte isolevel)
{
VertexList vertexList = new VertexList();
for (int i = 0; i < 12; i++)
{
if ((edgeIndex & (1 << i)) == 0) { continue; }
int edgeStartIndex = MarchingCubesLookupTables.EdgeIndexTable[2 * i + 0];
int edgeEndIndex = MarchingCubesLookupTables.EdgeIndexTable[2 * i + 1];
int3 corner1 = voxelLocalPosition + LookupTables.CubeCorners[edgeStartIndex];
int3 corner2 = voxelLocalPosition + LookupTables.CubeCorners[edgeEndIndex];
float density1 = voxelDensities[edgeStartIndex] / 255f;
float density2 = voxelDensities[edgeEndIndex] / 255f;
vertexList[i] = VertexInterpolate(corner1, corner2, density1, density2, isolevel / 255f);
}
return vertexList;
}
public static VoxelCorners<T> GetVoxelDataUnitCube<T>(this VoxelDataVolume<T> voxelDataArray, int3 localPosition) where T : struct
{
VoxelCorners<T> voxelDataCorners = new VoxelCorners<T>();
for (int i = 0; i < 8; i++)
{
int3 voxelCorner = localPosition + LookupTables.CubeCorners[i];
if (voxelDataArray.TryGetVoxelData(voxelCorner, out T voxelData))
{
voxelDataCorners[i] = voxelData;
}
}
return voxelDataCorners;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment