void BuildNodeLines() { for (int i = 0; i < nodeArray.Length; ++i) { Voxelizer.SDF_Node n = nodeArray[i]; // the Cube float s = (n.Max.x - n.Min.x) * 0.5f; Vector3 p = new Vector3(n.Min.x + s, n.Min.y + s, n.Min.z + s); /* * 0---2 * / /| * 1---3 | * | 4 : 6 * 5---7/ * * Y Z * | / * |/___X */ CUBE c; //top c.v0 = new Vector3(p.x - s, p.y + s, p.z + s); c.v1 = new Vector3(p.x - s, p.y + s, p.z - s); c.v2 = new Vector3(p.x + s, p.y + s, p.z + s); c.v3 = new Vector3(p.x + s, p.y + s, p.z - s); //bottom c.v4 = new Vector3(p.x - s, p.y - s, p.z + s); c.v5 = new Vector3(p.x - s, p.y - s, p.z - s); c.v6 = new Vector3(p.x + s, p.y - s, p.z + s); c.v7 = new Vector3(p.x + s, p.y - s, p.z - s); AddCube(c); //at lowest nodes draw the Nearest surface Vector if (n.c0 == -1 && s * 2.0f <= Smallest_Size) { AddLine(p, n.SurfacePoint, true); } } }
//============================================================================================================================================= //helper function to read a string and format it into a Node //============================================================================================================================================= Voxelizer.SDF_Node ParseNode(string word) { Voxelizer.SDF_Node node = new Voxelizer.SDF_Node(); int item = 0; string str = ""; word += ','; //required to get through all items char c = word[0]; //Node Format : int,int[8],Vector3,Vector3,Vector3 for (int i = 0; i < word.Length; ++i) { c = word[i]; if (c == ',') { switch (item) { case 0: node.index = int.Parse(str); break; case 1: //Node Index node.c0 = int.Parse(str); break; case 2: //Node Children node.c1 = int.Parse(str); break; case 3: node.c2 = int.Parse(str); break; case 4: node.c3 = int.Parse(str); break; case 5: node.c4 = int.Parse(str); break; case 6: node.c5 = int.Parse(str); break; case 7: node.c6 = int.Parse(str); break; case 8: node.c7 = int.Parse(str); break; case 9: //Node Min node.Min.x = float.Parse(str); break; case 10: node.Min.y = float.Parse(str); break; case 11: node.Min.z = float.Parse(str); break; case 12: //Node Max node.Max.x = float.Parse(str); break; case 13: node.Max.y = float.Parse(str); break; case 14: node.Max.z = float.Parse(str); break; case 15: //Node SurfacePoint node.SurfacePoint.x = float.Parse(str); break; case 16: node.SurfacePoint.y = float.Parse(str); break; case 17: //never gets called.... node.SurfacePoint.z = float.Parse(str); break; default: break; } str = ""; item++; } else { str += c; } } return(node); }