com.lyeeedar.Roguelike3D.Graphics.Models.SkyBox.java Source code

Java tutorial

Introduction

Here is the source code for com.lyeeedar.Roguelike3D.Graphics.Models.SkyBox.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Philip Collin.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     Philip Collin - initial API and implementation
 ******************************************************************************/
package com.lyeeedar.Roguelike3D.Graphics.Models;

import java.nio.IntBuffer;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.utils.BufferUtils;

public class SkyBox {

    private static final int SKYBOX_TEXTURE_UNIT = 0;
    private static final int SKYBOX_TEXTURE_ACTIVE_UNIT = GL20.GL_TEXTURE0 + SKYBOX_TEXTURE_UNIT;

    Mesh mesh;
    Pixmap[] texture = new Pixmap[6];
    ShaderProgram shader;

    int textureId;

    public SkyBox(String texture) {

        this.texture[0] = new Pixmap(Gdx.files.internal("data/textures/" + texture + "_px.png"));
        this.texture[1] = new Pixmap(Gdx.files.internal("data/textures/" + texture + "_nx.png"));
        this.texture[2] = new Pixmap(Gdx.files.internal("data/textures/" + texture + "_py.png"));
        this.texture[3] = new Pixmap(Gdx.files.internal("data/textures/" + texture + "_ny.png"));
        this.texture[4] = new Pixmap(Gdx.files.internal("data/textures/" + texture + "_pz.png"));
        this.texture[5] = new Pixmap(Gdx.files.internal("data/textures/" + texture + "_nz.png"));

        IntBuffer buffer = BufferUtils.newIntBuffer(1);
        buffer.position(0);
        buffer.limit(buffer.capacity());
        Gdx.gl20.glGenTextures(1, buffer);
        textureId = buffer.get(0);

        Gdx.gl20.glActiveTexture(SKYBOX_TEXTURE_ACTIVE_UNIT);
        Gdx.gl20.glBindTexture(GL20.GL_TEXTURE_CUBE_MAP, textureId);

        for (int i = 0; i < 6; i++) {
            glTexImage2D(GL20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, this.texture[i]);
        }

        float[] vertices = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,
                -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, };

        for (int i = 0; i < vertices.length; i++) {
            vertices[i] *= 10;
        }

        short[] indices = { 0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1 };

        mesh = new Mesh(true, 24, 14, new VertexAttribute(Usage.Position, 3, "a_position"));

        mesh.setVertices(vertices);
        mesh.setIndices(indices);

        final String vertexShader = Gdx.files.internal("data/shaders/model/skybox.vertex.glsl").readString();
        final String fragmentShader = Gdx.files.internal("data/shaders/model/skybox.fragment.glsl").readString();
        ShaderProgram.pedantic = true;
        shader = new ShaderProgram(vertexShader, fragmentShader);

        Gdx.gl20.glTexParameteri(GL20.GL_TEXTURE_CUBE_MAP, GL20.GL_TEXTURE_MIN_FILTER, GL20.GL_NEAREST);
        Gdx.gl20.glTexParameteri(GL20.GL_TEXTURE_CUBE_MAP, GL20.GL_TEXTURE_MAG_FILTER, GL20.GL_NEAREST);

        Gdx.gl20.glTexParameteri(GL20.GL_TEXTURE_CUBE_MAP, GL20.GL_TEXTURE_WRAP_S, GL20.GL_CLAMP_TO_EDGE);
        Gdx.gl20.glTexParameteri(GL20.GL_TEXTURE_CUBE_MAP, GL20.GL_TEXTURE_WRAP_T, GL20.GL_CLAMP_TO_EDGE);

    }

    public void render(Camera cam) {
        Gdx.gl.glDisable(GL20.GL_DEPTH_TEST);
        Gdx.gl.glDepthMask(false);
        Gdx.gl.glDisable(GL20.GL_CULL_FACE);

        Gdx.gl20.glActiveTexture(SKYBOX_TEXTURE_ACTIVE_UNIT);
        Gdx.gl20.glBindTexture(GL20.GL_TEXTURE_CUBE_MAP, textureId);

        shader.begin();

        shader.setUniformMatrix("u_pv", cam.combined);
        shader.setUniformf("u_pos", cam.position);
        shader.setUniformi("u_texture", 0);
        mesh.render(shader, GL20.GL_TRIANGLE_STRIP);

        shader.end();

        Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
        Gdx.gl.glDepthMask(true);
        Gdx.gl.glEnable(GL20.GL_CULL_FACE);
    }

    private void glTexImage2D(int textureCubeMapIndex, Pixmap pixmap) {
        Gdx.gl20.glTexImage2D(textureCubeMapIndex, 0, pixmap.getGLInternalFormat(), pixmap.getWidth(),
                pixmap.getHeight(), 0, pixmap.getGLFormat(), pixmap.getGLType(), pixmap.getPixels());
    }
}