preparing structure for an animated background
This commit is contained in:
parent
fd66c4703a
commit
9da00fac4a
@ -5,6 +5,10 @@ import com.badlogic.gdx.InputMultiplexer;
|
||||
import com.badlogic.gdx.Screen;
|
||||
import com.badlogic.gdx.ScreenAdapter;
|
||||
import com.badlogic.gdx.graphics.GL20;
|
||||
import com.badlogic.gdx.graphics.Pixmap.Format;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
|
||||
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
|
||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
|
||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
||||
@ -25,6 +29,15 @@ public class GameScreen extends ScreenAdapter {
|
||||
|
||||
private CoreMusicInfo music;
|
||||
|
||||
private ShaderProgram gaussianBlurShader;
|
||||
private ShaderProgram brightFilterShader;
|
||||
private ShaderProgram combineShader;
|
||||
private FrameBuffer lightFilterBuffer;
|
||||
private FrameBuffer normalBuffer;
|
||||
private FrameBuffer hBlur, vBlur;
|
||||
private TextureRegion fboRegion;
|
||||
private int fboSize;
|
||||
|
||||
/**
|
||||
* The game screen where the game play area, and hud are placed.
|
||||
* @param core The game context object
|
||||
@ -62,10 +75,72 @@ public class GameScreen extends ScreenAdapter {
|
||||
@Override
|
||||
public void show() {
|
||||
Gdx.input.setInputProcessor(inputs);
|
||||
gameArea.loadShaders(core.getPrefs());
|
||||
loadShaders();
|
||||
super.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* needs to be called right after set as screen (should be called in show method).
|
||||
* This is due to the saving preference being done once the screen is hidden.
|
||||
* @param prefs
|
||||
*/
|
||||
public void loadShaders() {
|
||||
if (core.getPrefs().getBoolean("glow shader")) {
|
||||
Gdx.app.debug("Shader", "using glow shader");
|
||||
brightFilterShader = new ShaderProgram(Gdx.files.internal("shaders/basic.vsh"), Gdx.files.internal("shaders/bright_filter.fsh"));
|
||||
if (!brightFilterShader.isCompiled()) {
|
||||
System.err.println(brightFilterShader.getLog());
|
||||
System.exit(0);
|
||||
}
|
||||
if (brightFilterShader.getLog().length() != 0) {
|
||||
System.out.println(brightFilterShader.getLog());
|
||||
}
|
||||
|
||||
gaussianBlurShader = new ShaderProgram(Gdx.files.internal("shaders/basic.vsh"), Gdx.files.internal("shaders/gaussian_blur.fsh"));
|
||||
if (!gaussianBlurShader.isCompiled()) {
|
||||
System.err.println(gaussianBlurShader.getLog());
|
||||
System.exit(0);
|
||||
}
|
||||
if (gaussianBlurShader.getLog().length() != 0) {
|
||||
System.out.println(gaussianBlurShader.getLog());
|
||||
}
|
||||
|
||||
combineShader = new ShaderProgram(Gdx.files.internal("shaders/basic.vsh"), Gdx.files.internal("shaders/combine.fsh"));
|
||||
if (!combineShader.isCompiled()) {
|
||||
System.err.println(combineShader.getLog());
|
||||
System.exit(0);
|
||||
}
|
||||
if (combineShader.getLog().length() != 0) {
|
||||
System.out.println(combineShader.getLog());
|
||||
}
|
||||
|
||||
|
||||
if (Gdx.graphics.getWidth() < 1024) {
|
||||
fboSize = 2048;
|
||||
} else if (Gdx.graphics.getWidth() < 2048) {
|
||||
fboSize = 4096;
|
||||
} else {
|
||||
fboSize = 4096;
|
||||
}
|
||||
|
||||
lightFilterBuffer = new FrameBuffer(Format.RGBA8888, fboSize/4, fboSize/4, false);
|
||||
normalBuffer = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false);
|
||||
hBlur = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false);
|
||||
vBlur = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false);
|
||||
|
||||
fboRegion = new TextureRegion();
|
||||
|
||||
combineShader.begin();
|
||||
combineShader.setUniformi("u_texture1", 1);
|
||||
combineShader.end();
|
||||
|
||||
vBlur.getColorBufferTexture().bind(1);
|
||||
|
||||
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0);
|
||||
}
|
||||
|
||||
ShaderProgram.pedantic = false;
|
||||
}
|
||||
@Override
|
||||
public void render(float delta) {
|
||||
Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
|
||||
@ -80,7 +155,71 @@ public class GameScreen extends ScreenAdapter {
|
||||
}
|
||||
gameArea.getViewport().apply();
|
||||
|
||||
gameArea.draw();
|
||||
if (gaussianBlurShader != null) {
|
||||
//Begin drawing a normal version of screen
|
||||
normalBuffer.begin();
|
||||
Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||
gameArea.draw();
|
||||
gameArea.getCollisionDetector().renderParticles(gameArea.getBatch(), Gdx.graphics.getDeltaTime(), true);
|
||||
normalBuffer.end(
|
||||
gameArea.getViewport().getScreenX(),
|
||||
gameArea.getViewport().getScreenY(),
|
||||
gameArea.getViewport().getScreenWidth(),
|
||||
gameArea.getViewport().getScreenHeight());
|
||||
//END
|
||||
|
||||
//Begin light filtering
|
||||
lightFilterBuffer.begin();
|
||||
Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||
gameArea.getBatch().setShader(brightFilterShader);
|
||||
gameArea.getBatch().begin(); //BATCH STARTS HERE
|
||||
gameArea.getRoot().draw(gameArea.getBatch(), 1f);
|
||||
gameArea.getBatch().flush();
|
||||
lightFilterBuffer.end(
|
||||
gameArea.getViewport().getScreenX(),
|
||||
gameArea.getViewport().getScreenY(),
|
||||
gameArea.getViewport().getScreenWidth(),
|
||||
gameArea.getViewport().getScreenHeight());
|
||||
|
||||
//Horizontal gaussian blur
|
||||
hBlur.begin();
|
||||
fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture());
|
||||
gameArea.getBatch().setShader(gaussianBlurShader);
|
||||
gaussianBlurShader.setUniformf("horizontal", 1);
|
||||
gameArea.getBatch().draw(fboRegion, 0f, 0f, RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT);
|
||||
gameArea.getBatch().flush();
|
||||
hBlur.end(
|
||||
gameArea.getViewport().getScreenX(),
|
||||
gameArea.getViewport().getScreenY(),
|
||||
gameArea.getViewport().getScreenWidth(),
|
||||
gameArea.getViewport().getScreenHeight());
|
||||
|
||||
//Vertical gaussian blur
|
||||
vBlur.begin();
|
||||
fboRegion.setTexture(hBlur.getColorBufferTexture());
|
||||
gameArea.getBatch().setShader(gaussianBlurShader);
|
||||
gaussianBlurShader.setUniformf("horizontal", 0);
|
||||
gameArea.getBatch().draw(fboRegion, 0f, 0f, RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT);
|
||||
gameArea.getBatch().flush();
|
||||
vBlur.end(
|
||||
gameArea.getViewport().getScreenX(),
|
||||
gameArea.getViewport().getScreenY(),
|
||||
gameArea.getViewport().getScreenWidth(),
|
||||
gameArea.getViewport().getScreenHeight());
|
||||
|
||||
//Draw everything to screen
|
||||
gameArea.getBatch().setShader(combineShader);
|
||||
fboRegion.setRegion(normalBuffer.getColorBufferTexture());
|
||||
fboRegion.flip(false, true);
|
||||
gameArea.getBatch().draw(fboRegion, 0f, 0f, RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT);
|
||||
gameArea.getBatch().setShader(null);
|
||||
gameArea.getBatch().end(); //BATCH ENDS HERE
|
||||
} else {
|
||||
gameArea.draw();
|
||||
}
|
||||
|
||||
gameHUD.getViewport().apply();
|
||||
gameHUD.draw();
|
||||
if (music != null && !music.getPlaybackMusic().isPlaying()) {
|
||||
@ -102,6 +241,18 @@ public class GameScreen extends ScreenAdapter {
|
||||
public void dispose() {
|
||||
gameHUD.dispose();
|
||||
gameArea.dispose();
|
||||
|
||||
if (gaussianBlurShader != null) {
|
||||
normalBuffer.dispose();
|
||||
lightFilterBuffer.dispose();
|
||||
hBlur.dispose();
|
||||
vBlur.dispose();
|
||||
|
||||
brightFilterShader.dispose();
|
||||
gaussianBlurShader.dispose();
|
||||
combineShader.dispose();
|
||||
gaussianBlurShader.dispose();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
@ -3,11 +3,6 @@ package zero1hd.rhythmbullet.stages;
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.Preferences;
|
||||
import com.badlogic.gdx.assets.AssetManager;
|
||||
import com.badlogic.gdx.graphics.GL20;
|
||||
import com.badlogic.gdx.graphics.Pixmap.Format;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
|
||||
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
|
||||
import com.badlogic.gdx.scenes.scene2d.Stage;
|
||||
import com.badlogic.gdx.utils.viewport.FitViewport;
|
||||
|
||||
@ -35,15 +30,6 @@ public class GamePlayArea extends Stage {
|
||||
|
||||
public ScoreManager score = new ScoreManager();
|
||||
|
||||
private ShaderProgram gaussianBlurShader;
|
||||
private ShaderProgram brightFilterShader;
|
||||
private ShaderProgram combineShader;
|
||||
private FrameBuffer lightFilterBuffer;
|
||||
private FrameBuffer normalBuffer;
|
||||
private FrameBuffer hBlur, vBlur;
|
||||
private TextureRegion fboRegion;
|
||||
private int fboSize;
|
||||
|
||||
public GamePlayArea(AssetManager assetManager, Preferences prefs) {
|
||||
super(new FitViewport(RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT));
|
||||
Gdx.app.debug("Game Area", "new area created");
|
||||
@ -65,120 +51,9 @@ public class GamePlayArea extends Stage {
|
||||
return audioMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* needs to be called right after set as screen (should be called in show method).
|
||||
* This is due to the saving preference being done once the screen is hidden.
|
||||
* @param prefs
|
||||
*/
|
||||
public void loadShaders(Preferences prefs) {
|
||||
if (prefs.getBoolean("glow shader")) {
|
||||
Gdx.app.debug("Shader", "using glow shader");
|
||||
brightFilterShader = new ShaderProgram(Gdx.files.internal("shaders/basic.vsh"), Gdx.files.internal("shaders/bright_filter.fsh"));
|
||||
if (!brightFilterShader.isCompiled()) {
|
||||
System.err.println(brightFilterShader.getLog());
|
||||
System.exit(0);
|
||||
}
|
||||
if (brightFilterShader.getLog().length() != 0) {
|
||||
System.out.println(brightFilterShader.getLog());
|
||||
}
|
||||
|
||||
gaussianBlurShader = new ShaderProgram(Gdx.files.internal("shaders/basic.vsh"), Gdx.files.internal("shaders/gaussian_blur.fsh"));
|
||||
if (!gaussianBlurShader.isCompiled()) {
|
||||
System.err.println(gaussianBlurShader.getLog());
|
||||
System.exit(0);
|
||||
}
|
||||
if (gaussianBlurShader.getLog().length() != 0) {
|
||||
System.out.println(gaussianBlurShader.getLog());
|
||||
}
|
||||
|
||||
combineShader = new ShaderProgram(Gdx.files.internal("shaders/basic.vsh"), Gdx.files.internal("shaders/combine.fsh"));
|
||||
if (!combineShader.isCompiled()) {
|
||||
System.err.println(combineShader.getLog());
|
||||
System.exit(0);
|
||||
}
|
||||
if (combineShader.getLog().length() != 0) {
|
||||
System.out.println(combineShader.getLog());
|
||||
}
|
||||
|
||||
|
||||
if (Gdx.graphics.getWidth() < 1024) {
|
||||
fboSize = 2048;
|
||||
} else if (Gdx.graphics.getWidth() < 2048) {
|
||||
fboSize = 4096;
|
||||
} else {
|
||||
fboSize = 4096;
|
||||
}
|
||||
|
||||
lightFilterBuffer = new FrameBuffer(Format.RGBA8888, fboSize/4, fboSize/4, false);
|
||||
normalBuffer = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false);
|
||||
hBlur = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false);
|
||||
vBlur = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false);
|
||||
|
||||
fboRegion = new TextureRegion();
|
||||
|
||||
combineShader.begin();
|
||||
combineShader.setUniformi("u_texture1", 1);
|
||||
combineShader.end();
|
||||
|
||||
vBlur.getColorBufferTexture().bind(1);
|
||||
|
||||
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0);
|
||||
}
|
||||
|
||||
ShaderProgram.pedantic = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw() {
|
||||
if (gaussianBlurShader != null) {
|
||||
//Begin drawing a normal version of screen
|
||||
normalBuffer.begin();
|
||||
Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||
super.draw();
|
||||
collisionDetector.renderParticles(getBatch(), Gdx.graphics.getDeltaTime(), true);
|
||||
normalBuffer.end(getViewport().getScreenX(), getViewport().getScreenY(), getViewport().getScreenWidth(), getViewport().getScreenHeight());
|
||||
//END
|
||||
|
||||
//Begin light filtering
|
||||
lightFilterBuffer.begin();
|
||||
Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
|
||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||
getBatch().setShader(brightFilterShader);
|
||||
getBatch().begin(); //BATCH STARTS HERE
|
||||
getRoot().draw(getBatch(), 1f);
|
||||
getBatch().flush();
|
||||
lightFilterBuffer.end(getViewport().getScreenX(), getViewport().getScreenY(), getViewport().getScreenWidth(), getViewport().getScreenHeight());
|
||||
|
||||
//Horizontal gaussian blur
|
||||
hBlur.begin();
|
||||
fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture());
|
||||
getBatch().setShader(gaussianBlurShader);
|
||||
gaussianBlurShader.setUniformf("horizontal", 1);
|
||||
getBatch().draw(fboRegion, 0f, 0f, RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT);
|
||||
getBatch().flush();
|
||||
hBlur.end(getViewport().getScreenX(), getViewport().getScreenY(), getViewport().getScreenWidth(), getViewport().getScreenHeight());
|
||||
|
||||
//Vertical gaussian blur
|
||||
vBlur.begin();
|
||||
fboRegion.setTexture(hBlur.getColorBufferTexture());
|
||||
getBatch().setShader(gaussianBlurShader);
|
||||
gaussianBlurShader.setUniformf("horizontal", 0);
|
||||
getBatch().draw(fboRegion, 0f, 0f, RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT);
|
||||
getBatch().flush();
|
||||
vBlur.end(getViewport().getScreenX(), getViewport().getScreenY(), getViewport().getScreenWidth(), getViewport().getScreenHeight());
|
||||
|
||||
//Draw everything to screen
|
||||
getBatch().setShader(combineShader);
|
||||
fboRegion.setRegion(normalBuffer.getColorBufferTexture());
|
||||
fboRegion.flip(false, true);
|
||||
getBatch().draw(fboRegion, 0f, 0f, RhythmBullet.GAME_AREA_WIDTH, RhythmBullet.GAME_AREA_HEIGHT);
|
||||
getBatch().setShader(null);
|
||||
getBatch().end(); //BATCH ENDS HERE
|
||||
|
||||
} else {
|
||||
super.draw();
|
||||
}
|
||||
super.draw();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -264,10 +139,10 @@ public class GamePlayArea extends Stage {
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
if (gaussianBlurShader != null) {
|
||||
normalBuffer.dispose();
|
||||
gaussianBlurShader.dispose();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
public CollisionDetector getCollisionDetector() {
|
||||
return collisionDetector;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user