package com.cookbook.samples;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
public class ShaderSample extends GdxSample {
private static final float WORLD_TO_SCREEN = 1.0f / 100.0f;
private static final float SCENE_WIDTH = 12.80f;
private static final float SCENE_HEIGHT = 7.20f;
private static final int NUM_SHADERS = 4;
private OrthographicCamera camera;
private Viewport viewport;
private SpriteBatch batch;
private Texture background;
private ShaderProgram shaders[];
private String shaderNames[];
private int currentShader;
@Override
public void create() {
camera = new OrthographicCamera();
viewport = new FitViewport(SCENE_WIDTH, SCENE_HEIGHT, camera);
batch = new SpriteBatch();
background = new Texture(Gdx.files.internal("data/jungle-level.png"));
shaders = new ShaderProgram[NUM_SHADERS];
shaderNames = new String[NUM_SHADERS];
currentShader = 0;
shaders[0] = null;
shaderNames[0] = "Null";
shaders[1] = new ShaderProgram(Gdx.files.internal("data/shaders/grayscale.vert"),
Gdx.files.internal("data/shaders/grayscale.frag"));
shaderNames[1] = "Grayscale";
shaders[2] = new ShaderProgram(Gdx.files.internal("data/shaders/sepia.vert"),
Gdx.files.internal("data/shaders/sepia.frag"));
shaderNames[2] = "Sepia";
shaders[3] = new ShaderProgram(Gdx.files.internal("data/shaders/inverted.vert"),
Gdx.files.internal("data/shaders/inverted.frag"));
shaderNames[3] = "Inverted";
camera.position.set(SCENE_WIDTH * 0.5f, SCENE_HEIGHT * 0.5f, 0.0f);
Gdx.input.setInputProcessor(this);
for (ShaderProgram shader : shaders) {
if (shader != null && !shader.isCompiled()) {
Gdx.app.error("ShaderSample: ", shader.getLog());
}
}
Gdx.app.log("ShaderSample", "Switching to shader " + shaderNames[currentShader]);
}
@Override
public void dispose() {
batch.dispose();
background.dispose();
for (ShaderProgram shader : shaders) {
if (shader != null) {
shader.dispose();
}
}
}
@Override
public void render() {
Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.begin();
int width = background.getWidth();
int height = background.getHeight();
batch.draw(background,
0.0f, 0.0f,
0.0f, 0.0f,
width, height,
WORLD_TO_SCREEN, WORLD_TO_SCREEN,
0.0f,
0, 0,
width, height,
false, false);
batch.end();
}
@Override
public boolean touchDown (int screenX, int screenY, int pointer, int button) {
currentShader = (currentShader + 1) % shaders.length;
batch.setShader(shaders[currentShader]);
Gdx.app.log("ShaderSample", "Switching to shader " + shaderNames[currentShader]);
return true;
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
}
}