public static void Polygonise(IDistanceField a_distanceField, DistanceField <Chunk.Voxel> .Cell[] a_cells, int a_x, int a_y, int a_z, float a_iso, List <Chunk.ChunkVertex> a_verticies) { int cubeIndex = 0; for (int i = 0; i < 8; ++i) { if (a_cells[i].Distance < a_iso) { cubeIndex |= 1 << i; } } if (EdgeTable[cubeIndex] == 0) { return; } Chunk.ChunkVertex[] vertList = VertexList(a_distanceField, a_cells, a_x, a_y, a_z, a_iso, cubeIndex); for (int i = 0; TriTable[cubeIndex][i] != -1; i += 3) { a_verticies.Add(vertList[TriTable[cubeIndex][i + 0]]); a_verticies.Add(vertList[TriTable[cubeIndex][i + 1]]); a_verticies.Add(vertList[TriTable[cubeIndex][i + 2]]); } }
public DistanceFieldCollider(IDistanceField a_distanceField, PhysicsEngine a_engine) { m_distanceField = a_distanceField; m_engine = a_engine; m_engine.InputQueue.Enqueue(this); }
private static Chunk.ChunkVertex[] VertexList(IDistanceField a_distanceField, DistanceField <Chunk.Voxel> .Cell[] a_cells, int a_x, int a_y, int a_z, float a_iso, int a_cubeIndex) { Chunk.ChunkVertex[] vertList = new Chunk.ChunkVertex[12]; if ((EdgeTable[a_cubeIndex] & 1) != 0) { vertList[0].Position = new Vector4(LinearInterp ( new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[0].Distance), new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[1].Distance), a_iso ), 1.0f); vertList[0].Color = a_cells[0].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 2) != 0) { vertList[1].Position = new Vector4(LinearInterp ( new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[1].Distance), new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[2].Distance), a_iso ), 1.0f); vertList[1].Color = a_cells[1].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 4) != 0) { vertList[2].Position = new Vector4(LinearInterp ( new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[2].Distance), new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[3].Distance), a_iso ), 1.0f); vertList[2].Color = a_cells[3].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 8) != 0) { vertList[3].Position = new Vector4(LinearInterp ( new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[3].Distance), new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[0].Distance), a_iso ), 1.0f); vertList[3].Color = a_cells[0].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 16) != 0) { vertList[4].Position = new Vector4(LinearInterp ( new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[4].Distance), new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[5].Distance), a_iso ), 1.0f); vertList[4].Color = a_cells[4].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 32) != 0) { vertList[5].Position = new Vector4(LinearInterp ( new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[5].Distance), new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[6].Distance), a_iso ), 1.0f); vertList[5].Color = a_cells[5].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 64) != 0) { vertList[6].Position = new Vector4(LinearInterp ( new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[6].Distance), new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[7].Distance), a_iso ), 1.0f); vertList[6].Color = a_cells[7].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 128) != 0) { vertList[7].Position = new Vector4(LinearInterp ( new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[7].Distance), new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[4].Distance), a_iso ), 1.0f); vertList[7].Color = a_cells[4].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 256) != 0) { vertList[8].Position = new Vector4(LinearInterp ( new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[0].Distance), new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[4].Distance), a_iso ), 1.0f); vertList[8].Color = a_cells[0].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 512) != 0) { vertList[9].Position = new Vector4(LinearInterp ( new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[1].Distance), new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 0) * a_distanceField.Spacing, a_cells[5].Distance), a_iso ), 1.0f); vertList[9].Color = a_cells[1].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 1024) != 0) { vertList[10].Position = new Vector4(LinearInterp ( new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[2].Distance), new Vector4((a_x + 1) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[6].Distance), a_iso ), 1.0f); vertList[10].Color = a_cells[2].Data.UColor; } if ((EdgeTable[a_cubeIndex] & 2048) != 0) { vertList[11].Position = new Vector4(LinearInterp ( new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 0) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[3].Distance), new Vector4((a_x + 0) * a_distanceField.Spacing, (a_y + 1) * a_distanceField.Spacing, (a_z + 1) * a_distanceField.Spacing, a_cells[7].Distance), a_iso ), 1.0f); vertList[11].Color = a_cells[3].Data.UColor; } return(vertList); }