public static List <Vector3[]> GetVertices(Voxel voxel, int[,] trianglesEdges, float borderValue) { List <Vector3[]> allVertices = new List <Vector3[]>(); for (int i = 0; i < trianglesEdges.GetLength(0); i++) { if (trianglesEdges[i, 0] != -1) { Vector3[] vertices = new Vector3[3]; for (int j = 0; j < trianglesEdges.GetLength(1); j++) { int[,] points = VertexesCaseProvider.GetVertexesIndexInArrayByEdge(trianglesEdges[i, j]); Vector3 firstPoint = voxel.GetRange(points[0, 0], points[0, 1], points[0, 2]); Vector3 secondPoint = voxel.GetRange(points[1, 0], points[1, 1], points[1, 2]); float valueToInterpolate; valueToInterpolate = (borderValue - voxel.Density[points[0, 0], points[0, 1], points[0, 2]]) / (voxel.Density[points[1, 0], points[1, 1], points[1, 2]] - voxel.Density[points[0, 0], points[0, 1], points[0, 2]]); vertices[j] = Vector3.Lerp(firstPoint, secondPoint, valueToInterpolate); } allVertices.Add(vertices); } } return(allVertices); }
public void GenerateMesh(OctreeElement root, GameObject terrain) { meshVertices = new List <Vector3>(); uv = new List <Vector2>(); if (VertexesCaseProvider.ReadVerticesIndexesFromFile()) { List <OctreeElement> octreeBranches = root.NextElements.ToList(); while (octreeBranches.Count != 0) { int count = octreeBranches.Count; for (int i = count - 1; i >= 0; i--) { if (octreeBranches[i] != null) { OctreeElement[] nextElements = octreeBranches[i].NextElements; if (nextElements == null) { Voxel voxel = octreeBranches[i] as Voxel; if (voxel.Drawable) { foreach (var vertices in voxel.Vertices) { meshVertices.AddRange(vertices); uv.AddRange(voxel.GetUVPositionForVoxel()); } } } else { octreeBranches.AddRange(nextElements); } } octreeBranches.RemoveAt(i); } } } GenerateMesh(terrain); }
public void GetVerticesEdgesIndexes1() { Assert.AreEqual(VertexesCaseProvider.GetVertexesIndexInArrayByEdge(0)[0, 0], 0); }
public void GetVerticesEdgesIndexes3() { Assert.AreEqual(VertexesCaseProvider.GetVertexesIndexInArrayByEdge(1)[1, 1], 1); }