Your code for SetupVertices
is not taking into account the position of each cube in the chunk. The vertex buffer is for the whole chunk - and individual vertices must be stored in "chunk" space (relative to to the position of the chunk). Right now you're just creating a bunch of cubes at the origin. You need to translate them (just use +
) to the correct position.
Then your SetupIndices
method is not taking into account the location in the vertex buffer where each cube starts. So, effectively, each time you're adding a cube, you're really telling the GPU to render the first cube in the buffer - and the later cubes are just being ignored.
Here is a modified version of your code. I haven't tested it or checked your numbers. This is just to illustrate how you must do the offsetting for both vertices and indices. This code replaces SetupVertices
and SetupIndices
with a single method that takes the coordinates of each cube relative to the chunk.
private void SetUpVerticesAndIndicies(int x, int y, int z)
{
intshort verticesStart = (short)vertices.Count;
Vector3 cubePosition = new Vector3(x, y, z);
// Create the appropriate vertices for the cube:
//front left bottom corner ok
vertices.Add(new VertexPositionTexture(cubePosition + new Vector3(0, 0, 0), new Vector2(1, 0)));
//front left upper corner
vertices.Add(new VertexPositionTexture(cubePosition + new Vector3(0, 1, 0), new Vector2(1, 1)));
//front right upper corner ok
vertices.Add(new VertexPositionTexture(cubePosition + new Vector3(1, 1, 0), new Vector2(0, 1)));
// ... etc ...
// Create the appropriate indices for the cube:
// (these are indexes into the vertices list)
indices.Add(verticesStart + 0);
indices.Add(verticesStart + 2);
indices.Add(verticesStart + 3);
indices.Add(verticesStart + 0);
indices.Add(verticesStart + 1);
indices.Add(verticesStart + 2);
// ... etc ...
}
Hopefully you can see how this would translate to a method to add individual faces, as we discussed in your previous questions.