LWJGL SlickUtil Texture Binding

Posted by Matthew Dockerty on Game Development See other posts from Game Development or by Matthew Dockerty
Published on 2014-02-20T07:47:03Z Indexed on 2014/08/19 16:32 UTC
Read the original article Hit count: 463

Filed under:
|
|
|
|

I am making a 3D game using LWJGL and I have a texture class with static variables so that I only need to load textures once, even if I need to use them more than once. I am using Slick Util for this. When I bind a texture it works fine, but then when I try to render something else after I have rendered the model with the texture, the texture is still being bound. How do I unbind the texture and set the rendermode to the one that was in use before any textures were bound? Some of my code is below. The problem I am having is the player texture is being used in the box drawn around the player after it the model has been rendered.

Model.java

public class Model {

public List<Vector3f> vertices = new ArrayList<Vector3f>();
public List<Vector3f> normals = new ArrayList<Vector3f>();
public ArrayList<Vector2f> textureCoords = new ArrayList<Vector2f>();
public List<Face> faces = new ArrayList<Face>();

public static Model TREE;
public static Model PLAYER;

public static void loadModels() {
    try {
        TREE = OBJLoader.loadModel(new File("assets/model/tree_pine_0.obj"));
        PLAYER = OBJLoader.loadModel(new File("assets/model/player.obj"));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void render(Vector3f position, Vector3f scale, Vector3f rotation, Texture texture, float shinyness) {
    glPushMatrix();
    {
        texture.bind();

        glColor3f(1, 1, 1);
        glTranslatef(position.x, position.y, position.z);
        glScalef(scale.x, scale.y, scale.z);
        glRotatef(rotation.x, 1, 0, 0);
        glRotatef(rotation.y, 0, 1, 0);
        glRotatef(rotation.z, 0, 0, 1);

        glMaterialf(GL_FRONT, GL_SHININESS, shinyness);

        glBegin(GL_TRIANGLES);
        {
            for (Face face : faces) {
                Vector2f t1 = textureCoords.get((int) face.textureCoords.x - 1);
                glTexCoord2f(t1.x, t1.y);
                Vector3f n1 = normals.get((int) face.normal.x - 1);
                glNormal3f(n1.x, n1.y, n1.z);
                Vector3f v1 = vertices.get((int) face.vertex.x - 1);
                glVertex3f(v1.x, v1.y, v1.z);

                Vector2f t2 = textureCoords.get((int) face.textureCoords.y - 1);
                glTexCoord2f(t2.x, t2.y);
                Vector3f n2 = normals.get((int) face.normal.y - 1);
                glNormal3f(n2.x, n2.y, n2.z);
                Vector3f v2 = vertices.get((int) face.vertex.y - 1);
                glVertex3f(v2.x, v2.y, v2.z);

                Vector2f t3 = textureCoords.get((int) face.textureCoords.z - 1);
                glTexCoord2f(t3.x, t3.y);
                Vector3f n3 = normals.get((int) face.normal.z - 1);
                glNormal3f(n3.x, n3.y, n3.z);
                Vector3f v3 = vertices.get((int) face.vertex.z - 1);
                glVertex3f(v3.x, v3.y, v3.z);
            }
            texture.release();
        }
        glEnd();
    }
    glPopMatrix();
}

}

Textures.java

public class Textures {

public static Texture FLOOR;
public static Texture PLAYER;

public static Texture SKYBOX_TOP;
public static Texture SKYBOX_BOTTOM;
public static Texture SKYBOX_FRONT;
public static Texture SKYBOX_BACK;
public static Texture SKYBOX_LEFT;
public static Texture SKYBOX_RIGHT;

public static void loadTextures() {
    try {
        FLOOR = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/model/floor.png")));
        FLOOR.setTextureFilter(GL11.GL_NEAREST);
        PLAYER = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/model/tree_pine_0.png")));
        PLAYER.setTextureFilter(GL11.GL_NEAREST);

        SKYBOX_TOP = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/textures/skybox_top.png")));
        SKYBOX_TOP.setTextureFilter(GL11.GL_NEAREST);
        SKYBOX_BOTTOM = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/textures/skybox_bottom.png")));
        SKYBOX_BOTTOM.setTextureFilter(GL11.GL_NEAREST);
        SKYBOX_FRONT = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/textures/skybox_front.png")));
        SKYBOX_FRONT.setTextureFilter(GL11.GL_NEAREST);
        SKYBOX_BACK = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/textures/skybox_back.png")));
        SKYBOX_BACK.setTextureFilter(GL11.GL_NEAREST);
        SKYBOX_LEFT = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/textures/skybox_left.png")));
        SKYBOX_LEFT.setTextureFilter(GL11.GL_NEAREST);
        SKYBOX_RIGHT = TextureLoader.getTexture("PNG", new FileInputStream(new File("assets/textures/skybox_right.png")));
        SKYBOX_RIGHT.setTextureFilter(GL11.GL_NEAREST);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

Player.java

public class Player {

private Vector3f position;
private float yaw;
private float moveSpeed;

public Player(float x, float y, float z, float yaw, float moveSpeed) {
    this.position = new Vector3f(x, y, z);
    this.yaw = yaw;
    this.moveSpeed = moveSpeed;
}

public void update() {
    if (Keyboard.isKeyDown(Keyboard.KEY_W))
        walkForward(moveSpeed);
    if (Keyboard.isKeyDown(Keyboard.KEY_S))
        walkBackwards(moveSpeed);
    if (Keyboard.isKeyDown(Keyboard.KEY_A))
        strafeLeft(moveSpeed);
    if (Keyboard.isKeyDown(Keyboard.KEY_D))
        strafeRight(moveSpeed);

    if (Mouse.isButtonDown(0))
        yaw += Mouse.getDX();

    LowPolyRPG.getInstance().getCamera().setPosition(-position.x, -position.y, -position.z);
    LowPolyRPG.getInstance().getCamera().setYaw(yaw);
}

public void walkForward(float distance) {
    position.setX(position.getX() + distance * (float) Math.sin(Math.toRadians(yaw)));
    position.setZ(position.getZ() - distance * (float) Math.cos(Math.toRadians(yaw)));
}

public void walkBackwards(float distance) {
    position.setX(position.getX() - distance * (float) Math.sin(Math.toRadians(yaw)));
    position.setZ(position.getZ() + distance * (float) Math.cos(Math.toRadians(yaw)));
}

public void strafeLeft(float distance) {
    position.setX(position.getX() + distance * (float) Math.sin(Math.toRadians(yaw - 90)));
    position.setZ(position.getZ() - distance * (float) Math.cos(Math.toRadians(yaw - 90)));
}

public void strafeRight(float distance) {
    position.setX(position.getX() + distance * (float) Math.sin(Math.toRadians(yaw + 90)));
    position.setZ(position.getZ() - distance * (float) Math.cos(Math.toRadians(yaw + 90)));
}

public void render() {
    Model.PLAYER.render(new Vector3f(position.x, position.y + 12, position.z), new Vector3f(3, 3, 3), new Vector3f(0, -yaw + 90, 0), Textures.PLAYER, 128);

    GL11.glPushMatrix();
    GL11.glTranslatef(position.getX(), position.getY(), position.getZ());
    GL11.glRotatef(-yaw, 0, 1, 0);
    GL11.glScalef(5.8f, 21, 2.2f);

    GL11.glDisable(GL11.GL_LIGHTING);

    GL11.glLineWidth(3);
    GL11.glBegin(GL11.GL_LINE_STRIP);

    GL11.glColor3f(1, 1, 1);

    glVertex3f(1f, 0f, -1f);
    glVertex3f(-1f, 0f, -1f);
    glVertex3f(-1f, 1f, -1f);
    glVertex3f(1f, 1f, -1f);

    glVertex3f(-1f, 0f, 1f);
    glVertex3f(1f, 0f, 1f);
    glVertex3f(1f, 1f, 1f);
    glVertex3f(-1f, 1f, 1f);

    glVertex3f(1f, 1f, -1f);
    glVertex3f(-1f, 1f, -1f);
    glVertex3f(-1f, 1f, 1f);
    glVertex3f(1f, 1f, 1f);

    glVertex3f(1f, 0f, 1f);
    glVertex3f(-1f, 0f, 1f);
    glVertex3f(-1f, 0f, -1f);
    glVertex3f(1f, 0f, -1f);

    glVertex3f(1f, 0f, 1f);
    glVertex3f(1f, 0f, -1f);
    glVertex3f(1f, 1f, -1f);
    glVertex3f(1f, 1f, 1f);

    glVertex3f(-1f, 0f, -1f);
    glVertex3f(-1f, 0f, 1f);
    glVertex3f(-1f, 1f, 1f);
    glVertex3f(-1f, 1f, -1f);

    GL11.glEnd();

    GL11.glEnable(GL11.GL_LIGHTING);

    GL11.glPopMatrix();
}

public Vector3f getPosition() {
    return new Vector3f(-position.x, -position.y, -position.z);
}

public float getX() {
    return position.getX();
}

public float getY() {
    return position.getY();
}

public float getZ() {
    return position.getZ();
}

public void setPosition(Vector3f position) {
    this.position = position;
}

public void setPosition(float x, float y, float z) {
    this.position.setX(x);
    this.position.setY(y);
    this.position.setZ(z);
}
}

Thanks for the help.

© Game Development or respective owner

Related posts about 3d

Related posts about textures