Quantcast
Channel: Community | MonoGame - Latest topics
Viewing all articles
Browse latest Browse all 6821

Texture Coordinates aren't working properly

$
0
0

@Jarelk wrote:

I'm trying to add textures to a wall for a group project. The problem is, no matter the coordinates I input, the texture always looks wonky unless I use 0 to 1 as coordinates.


A wall with a texture with coordinates, and the texture with 0-1 coordinates.

I want to be able to use texture coordinates to place a grid of the texture file on the wall, as I think is what's supposed to happen.

Here are the different pieces of code used:

private void BuildWallBuffer()
{
    List<VertexPositionTexture> wallVertexList = new List<VertexPositionTexture>();

    for (int x = 0; x < mazeWidth; x++)
    {
        for (int y = 0; y < mazeHeight; y++)
        {
            foreach (VertexPositionTexture vertex in BuildMazeWall(x, y))
            {
                wallVertexList.Add(vertex);
            }
        }
    }

    wallBuffer = new VertexBuffer(device, VertexPositionTexture.VertexDeclaration, wallVertexList.Count, BufferUsage.WriteOnly);
    wallBuffer.SetData<VertexPositionTexture>(wallVertexList.ToArray());
}

This is for making the vertexbuffer used in the draw method.

private List<VertexPositionTexture> BuildMazeWall(int x, int y)
{
    List<VertexPositionTexture> triangles = new List<VertexPositionTexture>();

    if (MazeCells[x, y].Walls[0] > 0)
    {
        triangles.Add(CalcPoint(0, x, y, new Vector2(1, 0)));
        triangles.Add(CalcPoint(4, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(2, x, y, new Vector2(1, 1)));
        triangles.Add(CalcPoint(4, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(6, x, y, new Vector2(0, 1)));
        triangles.Add(CalcPoint(2, x, y, new Vector2(1, 1)));
    }
    if (MazeCells[x, y].Walls[1] > 0)
    {
        triangles.Add(CalcPoint(4, x, y, new Vector2(1, 0)));
        triangles.Add(CalcPoint(5, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(6, x, y, new Vector2(1, 1)));
        triangles.Add(CalcPoint(5, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(7, x, y, new Vector2(0, 1)));
        triangles.Add(CalcPoint(6, x, y, new Vector2(1, 1)));
    }

    if (MazeCells[x, y].Walls[2] > 0)
    {
        triangles.Add(CalcPoint(5, x, y, new Vector2(1, 0)));
        triangles.Add(CalcPoint(1, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(7, x, y, new Vector2(1, 1)));
        triangles.Add(CalcPoint(1, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(3, x, y, new Vector2(0, 1)));
        triangles.Add(CalcPoint(7, x, y, new Vector2(1, 1)));
    }
    if (MazeCells[x, y].Walls[3] > 0)
    {
        triangles.Add(CalcPoint(1, x, y, new Vector2(1, 0)));
        triangles.Add(CalcPoint(0, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(3, x, y, new Vector2(1, 1)));
        triangles.Add(CalcPoint(0, x, y, new Vector2(0, 0)));
        triangles.Add(CalcPoint(2, x, y, new Vector2(0, 1)));
        triangles.Add(CalcPoint(3, x, y, new Vector2(1, 1)));
    }
    return triangles;

}

A rather convaluted method for creating the vertices for each wall in our "maze".

private VertexPositionTexture CalcPoint(int wallPoint, int xOfset, int yOffset, Vector2 textureCoordinates)
{
    return new VertexPositionTexture(wallPoints[wallPoint] + new Vector3(xOfset, 0, yOffset), textureCoordinates);
}

The actual vertices being made. "wallPoints" is a list of vertex coordinates.

    wallPoints[0] = new Vector3(0, 1, 0);
    wallPoints[1] = new Vector3(0, 1, 1);
    wallPoints[2] = new Vector3(0, 0, 0);
    wallPoints[3] = new Vector3(0, 0, 1);
    wallPoints[4] = new Vector3(1, 1, 0);
    wallPoints[5] = new Vector3(1, 1, 1);
    wallPoints[6] = new Vector3(1, 0, 0);
    wallPoints[7] = new Vector3(1, 0, 1);

Then it all gets drawn.

    groundEffect.View = camera.View;
    groundEffect.Projection = camera.Projection;
    groundEffect.TextureEnabled = true;
    groundEffect.Texture = wallTexture;
    foreach (EffectPass pass in groundEffect.CurrentTechnique.Passes)
    {
        pass.Apply();
        device.SetVertexBuffer(wallBuffer);
        device.DrawPrimitives(PrimitiveType.TriangleList, 0, wallBuffer.VertexCount / 3);
    }

Posts: 3

Participants: 3

Read full topic


Viewing all articles
Browse latest Browse all 6821

Trending Articles