private static List <int> GetBackToFrontElements(BspTreeNode node, BspTreeNode.Orientation orientation, List <Vector3> allPoints, Vector3 eye) { List <int> list = new List <int>(); for (int i = 0; i < node.getNumberOfElements(orientation); i++) { list.Add(node.getElement(orientation, i)); } list.AddRange(GetBackToFront(node.GetChild(orientation), allPoints, eye)); return(list); }
/** * Create VBO render vertices for the BSP tree planes. * */ private List <RenderVertex> CreateVBOPlanes(BspTreeNode node, float scale) { List <RenderVertex> renderVertices = new List <RenderVertex>(); if (node == null) { return(renderVertices); } Vector3 tangent = Vector3.Multiply(new Vector3(node.N.Y, -node.N.X, 0), scale); renderVertices.Add(new RenderVertex(Vector3.Add(node.P, tangent), normal, Color4.White)); renderVertices.Add(new RenderVertex(Vector3.Subtract(node.P, tangent), normal, Color4.White)); renderVertices.Add(new RenderVertex(node.P, normal, Color4.White)); renderVertices.Add(new RenderVertex(Vector3.Add(node.P, Vector3.Multiply(node.N, scale * 0.3f)), normal, Color4.White)); renderVertices.AddRange(CreateVBOPlanes(node.GetChild(BspTreeNode.Orientation.POSITIVE), scale * 0.5f)); renderVertices.AddRange(CreateVBOPlanes(node.GetChild(BspTreeNode.Orientation.NEGATIVE), scale * 0.5f)); return(renderVertices); }
/** * Create VBO render vertices for the elements in a node (front and back). */ private List <RenderVertex> CreateVBOElements(BspTreeNode node) { List <RenderVertex> renderVertices = new List <RenderVertex>(); if (node == null) { return(renderVertices); } for (int orientation = 0; orientation < 2; orientation++) { Color4 color = (orientation == 0) ? Color4.Magenta : Color4.Orange; for (int i = 0; i < node.getNumberOfElements((BspTreeNode.Orientation)orientation); i++) { int index = node.getElement((BspTreeNode.Orientation)orientation, i); renderVertices.Add(new RenderVertex(node.P, normal, color)); renderVertices.Add(new RenderVertex(points[index], normal, color)); } } renderVertices.AddRange(CreateVBOElements(node.GetChild(BspTreeNode.Orientation.POSITIVE))); renderVertices.AddRange(CreateVBOElements(node.GetChild(BspTreeNode.Orientation.NEGATIVE))); return(renderVertices); }