com.grillecube.client.renderer.world.ProgramTerrain.java Source code

Java tutorial

Introduction

Here is the source code for com.grillecube.client.renderer.world.ProgramTerrain.java

Source

/**
**   This file is part of the project https://github.com/toss-dev/VoxelEngine
**
**   License is available here: https://raw.githubusercontent.com/toss-dev/VoxelEngine/master/LICENSE.md
**
**   PEREIRA Romain
**                                       4-----7          
**                                      /|    /|
**                                     0-----3 |
**                                     | 5___|_6
**                                     |/    | /
**                                     1-----2
*/

package com.grillecube.client.renderer.world;

import org.lwjgl.opengl.GL20;

import com.grillecube.client.opengl.GLH;
import com.grillecube.client.opengl.GLProgram;
import com.grillecube.client.renderer.camera.CameraProjective;
import com.grillecube.common.maths.Vector3f;
import com.grillecube.common.resources.R;
import com.grillecube.common.world.WorldFlat;

public class ProgramTerrain extends GLProgram {

    public static final int MESH_TYPE_OPAQUE = 0;
    public static final int MESH_TYPE_TRANSPARENT = 1;

    /** uniforms location */
    private int blockAtlas;
    private int breakAtlas;

    private int viewMatrix;
    private int projMatrix;
    private int transfMatrix;
    private int meshType;

    private int fogColor;
    private int fogDensity;
    private int fogGradient;

    private int sunColor;
    private int sunPosition;
    private int sunIntensity;

    private int ambientLight;

    private int txAtlas;

    private int cameraPosition;

    public ProgramTerrain() {
        super();
        String header = "# define MESH_TYPE_OPAQUE (" + MESH_TYPE_OPAQUE + ")\n"
                + "# define MESH_TYPE_TRANSPARENT (" + MESH_TYPE_TRANSPARENT + ")\n";
        this.addShader(GLH.glhLoadShader(R.getResPath("shaders/terrain.fs"), GL20.GL_FRAGMENT_SHADER, header));
        this.addShader(GLH.glhLoadShader(R.getResPath("shaders/terrain.vs"), GL20.GL_VERTEX_SHADER, header));
        this.link();
    }

    @Override
    public void bindAttributes() {
        super.bindAttribute(0, "position");
        super.bindAttribute(1, "normal");
        super.bindAttribute(2, "uv");
        super.bindAttribute(3, "color");
        super.bindAttribute(4, "brightness");
    }

    @Override
    public void linkUniforms() {
        this.blockAtlas = super.getUniform("blockAtlas");
        this.breakAtlas = super.getUniform("breakAtlas");

        this.cameraPosition = super.getUniform("camera_position");

        this.projMatrix = super.getUniform("proj_matrix");
        this.viewMatrix = super.getUniform("view_matrix");
        this.transfMatrix = super.getUniform("transf_matrix");
        this.meshType = super.getUniform("mesh_type");
        this.fogColor = super.getUniform("fog_color");
        this.fogGradient = super.getUniform("fog_gradient");
        this.fogDensity = super.getUniform("fog_density");
        this.sunColor = super.getUniform("sun_color");
        this.sunPosition = super.getUniform("sun_position");
        this.sunIntensity = super.getUniform("sun_intensity");
        this.ambientLight = super.getUniform("ambient_light");

        this.txAtlas = super.getUniform("tx_atlas");
    }

    /** load global terrain uniform */
    private Vector3f sunpos = new Vector3f();

    public void loadUniforms(CameraProjective camera, WorldFlat world) {

        this.loadUniformInteger(this.blockAtlas, 0);
        this.loadUniformInteger(this.breakAtlas, 1);

        this.loadUniformVec(this.cameraPosition, camera.getPosition());
        this.loadUniformMatrix(this.projMatrix, camera.getProjectionMatrix());
        this.loadUniformMatrix(this.viewMatrix, camera.getViewMatrix());

        this.loadUniformVec(this.fogColor, world.getSky().getFogColor());
        this.loadUniformFloat(this.fogGradient, world.getSky().getFogGradient());
        this.loadUniformFloat(this.fogDensity, world.getSky().getFogDensity());

        this.loadUniformVec(this.sunColor, world.getSky().getSun().getColor());
        this.loadUniformFloat(this.sunIntensity, world.getSky().getSun().getIntensity());
        this.loadUniformVec(this.sunPosition, sunpos.set(world.getSky().getSun().getPosition()));
        this.loadUniformFloat(this.ambientLight, world.getSky().getAmbientLight());

        this.loadUniformInteger(this.txAtlas, 0);
    }

    /** load terrain instance uniforms variable */
    public void loadInstanceUniforms(TerrainMesh mesh) {
        this.loadUniformMatrix(this.transfMatrix, mesh.getTransformationMatrix());
    }

    public void loadTypeUniform(int meshType) {
        this.loadUniformInteger(this.meshType, meshType);
    }
}