// Find index buffer with its position (for a given model, it has to be the same as its vertex buffer position) public NVRIndexBuffer GetIndexBuffer(int position) { if (IndexBuffers.Count > position) { return(IndexBuffers[position]); } else { NVRIndexBuffer newBuffer = new NVRIndexBuffer(D3DFORMAT.D3DFMT_INDEX16); IndexBuffers.Add(newBuffer); return(newBuffer); } }
// Generate buffers for writing private NVRBuffers GenerateBuffers() { NVRBuffers buffers = new NVRBuffers(); // Material buffer foreach (NVRMesh mesh in Meshes) { if (!buffers.Materials.Contains(mesh.Material)) { buffers.Materials.Add(mesh.Material); } } // Creating complex buffers first foreach (NVRMesh mesh in Meshes) { NVRDrawIndexedPrimitive complexMesh = mesh.IndexedPrimitives[0]; NVRVertexType type = complexMesh.Vertices[0].GetVertexType(); NVRVertexBuffer vertBuffer = buffers.GetVertexBuffer(complexMesh.Vertices.Count, type); int bufferIndex = buffers.VertexBuffers.IndexOf(vertBuffer); NVRIndexBuffer indBuffer = buffers.GetIndexBuffer(bufferIndex); complexMesh.IndexBuffer = bufferIndex; complexMesh.VertexBuffer = bufferIndex; complexMesh.FirstVertex = vertBuffer.Vertices.Count; complexMesh.FirstIndex = indBuffer.Indices.Count; complexMesh.IndexCount = complexMesh.Indices.Count; complexMesh.VertexCount = complexMesh.Vertices.Count; vertBuffer.Vertices.AddRange(complexMesh.Vertices); int indBufferMax = indBuffer.CurrentMax + 1; foreach (int index in complexMesh.Indices) { indBuffer.AddIndex(index + indBufferMax); } } // Then do simple ones foreach (NVRMesh mesh in Meshes) { NVRDrawIndexedPrimitive simpleMesh = mesh.IndexedPrimitives[1]; NVRVertexType type = simpleMesh.Vertices[0].GetVertexType(); NVRVertexBuffer vertBuffer = buffers.GetVertexBuffer(simpleMesh.Vertices.Count, type); int bufferIndex = buffers.VertexBuffers.IndexOf(vertBuffer); NVRIndexBuffer indBuffer = buffers.GetIndexBuffer(bufferIndex); simpleMesh.IndexBuffer = bufferIndex; simpleMesh.VertexBuffer = bufferIndex; simpleMesh.FirstVertex = vertBuffer.Vertices.Count; simpleMesh.FirstIndex = indBuffer.Indices.Count; simpleMesh.IndexCount = simpleMesh.Indices.Count; simpleMesh.VertexCount = simpleMesh.Vertices.Count; vertBuffer.Vertices.AddRange(simpleMesh.Vertices); int indBufferMax = indBuffer.CurrentMax + 1; foreach (int index in simpleMesh.Indices) { indBuffer.AddIndex(index + indBufferMax); } } NVRNode parentNode = this.CreateRootNode(); // Making mesh buffer buffers.GenerateMeshBuffer(parentNode); foreach (NVRMesh mesh in buffers.Meshes) { mesh.MaterialIndex = buffers.Materials.IndexOf(mesh.Material); } // Making node buffer buffers.Nodes.Add(parentNode); buffers.GenerateNodeBuffer(parentNode); foreach (NVRNode node in buffers.Nodes) { if (node.Children.Count > 0) { node.FirstChildNode = buffers.Nodes.IndexOf(node.Children[0]); } else { node.FirstChildNode = -1; } } return(buffers); }