diff --git a/core/src/zero1hd/rhythmbullet/audio/visualizer/BasicVisualizer.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/BasicVisualizer.java index 16cc847..3a3d3c9 100755 --- a/core/src/zero1hd/rhythmbullet/audio/visualizer/BasicVisualizer.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/BasicVisualizer.java @@ -130,9 +130,11 @@ public class BasicVisualizer extends VisualizerCore { barWidth = MathUtils.ceil((float) width/(float) barCount); barWidth -= spaceBetweenBars; - for (int i = 0; i < bars.length; i++) { barSpace = i*(barWidth+spaceBetweenBars); + if (i == bars.length - 1) { + barSpace -= 2; + } if (flip) { bars[i].setRotation(rotation+180); } else { diff --git a/core/src/zero1hd/rhythmbullet/audio/visualizer/MirrorVisualizer.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/MirrorVisualizer.java index 6b6d1fd..46c8966 100755 --- a/core/src/zero1hd/rhythmbullet/audio/visualizer/MirrorVisualizer.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/MirrorVisualizer.java @@ -36,15 +36,18 @@ public class MirrorVisualizer { public void position(int barWidth, int spaceBetweenBars) { int barSpaceMultiplier = barWidth + spaceBetweenBars; - + for (int i = 0; i < bars.length; i ++) { if (flip) { bars[i].setRotation(rotation+180); } else { bars[i].setRotation(rotation); } - - bars[i].setPosition(xPos + i*barSpaceMultiplier*rectCoordRot.x, yPos + i*barSpaceMultiplier*rectCoordRot.y); + int barSpace = i*(barWidth+spaceBetweenBars); + if (i == bars.length - 1) { + barSpace -= 2; + } + bars[i].setPosition(xPos + barSpace*rectCoordRot.x, yPos + barSpace*rectCoordRot.y); } } diff --git a/core/src/zero1hd/rhythmbullet/graphics/ui/pages/MainPage.java b/core/src/zero1hd/rhythmbullet/graphics/ui/pages/MainPage.java index 8ce1d9e..82568f7 100755 --- a/core/src/zero1hd/rhythmbullet/graphics/ui/pages/MainPage.java +++ b/core/src/zero1hd/rhythmbullet/graphics/ui/pages/MainPage.java @@ -77,7 +77,6 @@ public class MainPage extends Page implements OnDifferentSongListener { @Override public void changed(ChangeEvent event, Actor actor) { Gdx.app.exit(); - System.exit(0); } }); table.add(quitButton).fillX(); diff --git a/core/src/zero1hd/rhythmbullet/graphics/ui/pages/OptionsPage.java b/core/src/zero1hd/rhythmbullet/graphics/ui/pages/OptionsPage.java index 7621e92..977dcdf 100755 --- a/core/src/zero1hd/rhythmbullet/graphics/ui/pages/OptionsPage.java +++ b/core/src/zero1hd/rhythmbullet/graphics/ui/pages/OptionsPage.java @@ -15,6 +15,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.utils.Align; import zero1hd.rhythmbullet.RhythmBullet; import zero1hd.rhythmbullet.audio.SongListController; @@ -28,18 +29,31 @@ public class OptionsPage extends Page { private TextField directoryField; public OptionsPage(RhythmBullet core, Vector3 targetPosition, MoreOptionsPage moreOptionsPage, SongListController sc) { - optionsTable.defaults().spaceLeft(40f).padTop(5f).padBottom(5f).left(); + super("General", core.getDefaultSkin()); - Label optionGeneralTitle = new Label("General", core.getDefaultSkin(), "large-font", core.getDefaultSkin().getColor("default")); - optionsTable.add(optionGeneralTitle).left().spaceBottom(10f); + //Back button + TextButton backButton = new TextButton("Back", core.getDefaultSkin()); + backButton.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + targetPosition.x = 0.5f*Gdx.graphics.getWidth(); + } + }); + backButton.setPosition(10, getHeightBelowTitle() + 5); + addActor(backButton); + addSpaceToTitle(backButton.getWidth() + backButton.getX() + 20); - optionsTable.row(); + optionsTable.align(Align.center); + optionsTable.defaults().space(10f).expandY().padBottom(25f); + optionsTable.setPosition(0, 0); + optionsTable.setSize(getWidth(), getHeightBelowTitle() - 5); + addActor(optionsTable); Label musicVolSliderLabel = new Label("Music Volume: ", core.getDefaultSkin()); - optionsTable.add(musicVolSliderLabel).padRight(12f).left(); + optionsTable.add(musicVolSliderLabel).left(); musicVolSlider = new Slider(0, 100, 0.1f, false, core.getDefaultSkin()); musicVolSlider.setValue(core.getPrefs().getFloat("music vol", 100f)*100f); - optionsTable.add(musicVolSlider).prefWidth(790).left(); + optionsTable.add(musicVolSlider).spaceRight(15f).prefWidth(0.5f*getWidth()).fillX(); final Label musicVolPercentage = new Label(MathUtils.round(musicVolSlider.getValue()) + "%", core.getDefaultSkin()); musicVolSlider.addListener(new ChangeListener() { @Override @@ -50,15 +64,15 @@ public class OptionsPage extends Page { core.getPrefs().putFloat("music vol", musicVolSlider.getPercent()); } }); - optionsTable.add(musicVolPercentage).expandX(); + optionsTable.add(musicVolPercentage).center(); optionsTable.row(); Label fxVolSliderLabel = new Label("FX Volume: ", core.getDefaultSkin()); - optionsTable.add(fxVolSliderLabel).padRight(12f).left(); - fxVolSlider = new Slider(0, 100, 1, false, core.getDefaultSkin()); + optionsTable.add(fxVolSliderLabel).left(); + fxVolSlider = new Slider(0, 100, 0.1f, false, core.getDefaultSkin()); fxVolSlider.setValue(core.getPrefs().getFloat("fx vol", 100f)*100f); - optionsTable.add(fxVolSlider).prefWidth(790); + optionsTable.add(fxVolSlider).spaceRight(15f).prefWidth(0.5f*getWidth()).fillX(); final Label fxVolPercentage = new Label(MathUtils.round(fxVolSlider.getValue()) + "%", core.getDefaultSkin()); fxVolSlider.addListener(new ChangeListener() { @Override @@ -68,7 +82,7 @@ public class OptionsPage extends Page { } }); - optionsTable.add(fxVolPercentage); + optionsTable.add(fxVolPercentage).center(); optionsTable.row(); @@ -76,33 +90,18 @@ public class OptionsPage extends Page { optionsTable.add(musicDirectoryLabel).left(); directoryField = new TextField(null, core.getDefaultSkin()); directoryField.setText(core.getPrefs().getString("music dir", System.getProperty("user.home")+System.getProperty("file.separator")+"Music")); - optionsTable.add(directoryField).prefWidth(810).left(); + optionsTable.add(directoryField).fillX(); optionsTable.row(); Label debugCodeLabel = new Label("Debug Code: ", core.getDefaultSkin()); optionsTable.add(debugCodeLabel).left(); final TextField debugCodeField = new TextField(null, core.getDefaultSkin()); - optionsTable.add(debugCodeField).prefWidth(810).left(); + optionsTable.add(debugCodeField).fillX(); optionsTable.top(); - //Back button - TextButton backButton = new TextButton("Back", core.getDefaultSkin()); - backButton.addListener(new ChangeListener() { - @Override - public void changed(ChangeEvent event, Actor actor) { - targetPosition.x = 0.5f*Gdx.graphics.getWidth(); - } - }); - backButton.setPosition(10, getHeight()-backButton.getHeight()-18); - addActor(backButton); - - optionsTable.setPosition(backButton.getX()+ 20 + backButton.getWidth(), 0); - optionsTable.setSize(getWidth()-backButton.getWidth()-10-20-10, getHeight()); - addActor(optionsTable); - optionsTable.row(); TextButton keybindSettings = new TextButton("Set Controls", core.getDefaultSkin()); @@ -113,7 +112,7 @@ public class OptionsPage extends Page { targetPosition.y = -0.5f*Gdx.graphics.getHeight(); } }); - optionsTable.add(keybindSettings).colspan(2).fill(); + optionsTable.add(keybindSettings).colspan(2).fillX(); optionsTable.row(); @@ -125,7 +124,7 @@ public class OptionsPage extends Page { targetPosition.y = -0.5f*Gdx.graphics.getHeight(); } }); - optionsTable.add(graphicsSettings).colspan(2).fill(); + optionsTable.add(graphicsSettings).colspan(2).fillX(); addListener(new InputListener() { @Override public boolean keyUp(InputEvent event, int keycode) { diff --git a/core/src/zero1hd/rhythmbullet/graphics/ui/pages/Page.java b/core/src/zero1hd/rhythmbullet/graphics/ui/pages/Page.java index bdfc17b..1b5de8c 100755 --- a/core/src/zero1hd/rhythmbullet/graphics/ui/pages/Page.java +++ b/core/src/zero1hd/rhythmbullet/graphics/ui/pages/Page.java @@ -32,7 +32,11 @@ public class Page extends Group implements Disposable { public float getHeightBelowTitle() { return pageTitle.getY(); } - + + public void addSpaceToTitle(float space) { + pageTitle.moveBy(space, 0); + } + @Override public void dispose() { } diff --git a/core/src/zero1hd/rhythmbullet/screens/GameScreen.java b/core/src/zero1hd/rhythmbullet/screens/GameScreen.java index 8c950ad..bb3539b 100755 --- a/core/src/zero1hd/rhythmbullet/screens/GameScreen.java +++ b/core/src/zero1hd/rhythmbullet/screens/GameScreen.java @@ -6,12 +6,15 @@ 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.Batch; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; 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; +import com.badlogic.gdx.utils.viewport.ScreenViewport; import zero1hd.rhythmbullet.RhythmBullet; import zero1hd.rhythmbullet.audio.MusicManager; @@ -37,7 +40,8 @@ public class GameScreen extends ScreenAdapter { private FrameBuffer hBlur, vBlur; private TextureRegion fboRegion; private int fboSize; - + private Batch batch; + private ScreenViewport screenViewport; private int blurlvl = 4; /** @@ -88,6 +92,9 @@ public class GameScreen extends ScreenAdapter { */ public void loadShaders() { if (core.getPrefs().getBoolean("glow shader")) { + batch = new SpriteBatch(); + screenViewport = new ScreenViewport(); + 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()) { @@ -125,13 +132,14 @@ public class GameScreen extends ScreenAdapter { fboSize = 4096; } - lightFilterBuffer = new FrameBuffer(Format.RGBA8888, fboSize/4, fboSize/4, false); + lightFilterBuffer = new FrameBuffer(Format.RGBA8888, fboSize/2, fboSize/2, 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(); - + hBlur = new FrameBuffer(Format.RGBA8888, fboSize/2, fboSize/2, false); + vBlur = new FrameBuffer(Format.RGBA8888, fboSize/2, fboSize/2, false); + + fboRegion = new TextureRegion(normalBuffer.getColorBufferTexture()); + fboRegion.flip(false, true); + combineShader.begin(); combineShader.setUniformi("u_texture1", 1); combineShader.end(); @@ -161,93 +169,78 @@ public class GameScreen extends ScreenAdapter { blurlvl = 4; if (gaussianBlurShader != null) { //Begin drawing a normal version of screen + gameArea.getViewport().apply(); normalBuffer.begin(); - Gdx.gl.glClearColor(0f, 0f, 0f, 0f); + Gdx.gl.glClearColor(0.22f, 0f, 0f, 1f); 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 + normalBuffer.end(); + //END STAGE BATCH + //BEGINNING NORMAL SCREEN RENDER + screenViewport.apply(); //Begin light filtering lightFilterBuffer.begin(); - Gdx.gl.glClearColor(0f, 0f, 0f, 0f); + Gdx.gl.glClearColor(0f, 0f, 0f, 1f); 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()); + fboRegion.setTexture(normalBuffer.getColorBufferTexture()); + batch.setShader(brightFilterShader); + batch.begin(); //BATCH STARTS HERE + batch.draw(fboRegion, 0, 0, gameArea.getWidth(), gameArea.getHeight()); + batch.flush(); + lightFilterBuffer.end(); //Horizontal gaussian blur hBlur.begin(); - fboRegion.setRegion(lightFilterBuffer.getColorBufferTexture()); - gameArea.getBatch().setShader(gaussianBlurShader); + Gdx.gl.glClearColor(0f, 0f, 0f, 1f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("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()); + batch.draw(fboRegion, 0f, 0f, gameArea.getWidth(), gameArea.getHeight()); + batch.flush(); + hBlur.end(); //Vertical gaussian blur vBlur.begin(); - fboRegion.setRegion(hBlur.getColorBufferTexture()); - gameArea.getBatch().setShader(gaussianBlurShader); + Gdx.gl.glClearColor(0f, 0f, 0f, 1f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + fboRegion.setTexture(hBlur.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("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()); + batch.draw(fboRegion, 0f, 0f, gameArea.getWidth(), gameArea.getHeight()); + batch.flush(); + vBlur.end(); for (int i = 0; i < blurlvl; i++) { //Horizontal gaussian blur hBlur.begin(); - fboRegion.setRegion(vBlur.getColorBufferTexture()); - gameArea.getBatch().setShader(gaussianBlurShader); + fboRegion.setTexture(vBlur.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("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()); + batch.draw(fboRegion, 0f, 0f, gameArea.getWidth(), gameArea.getHeight()); + batch.flush(); + hBlur.end(); //Vertical gaussian blur vBlur.begin(); - fboRegion.setRegion(hBlur.getColorBufferTexture()); - gameArea.getBatch().setShader(gaussianBlurShader); + fboRegion.setTexture(hBlur.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("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()); + batch.draw(fboRegion, 0f, 0f, gameArea.getWidth(), gameArea.getHeight()); + batch.flush(); + vBlur.end(); } - - //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 + + //draw a final copy to a fbo + Gdx.gl.glClearColor(0f, 0f, 0f, 0f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + batch.setShader(combineShader); + fboRegion.setTexture(normalBuffer.getColorBufferTexture()); + batch.draw(fboRegion, 0f, 0f, gameArea.getWidth(), gameArea.getHeight()); + batch.setShader(null); + batch.end(); //STAGE BATCH ENDS HERE + } else { gameArea.draw(); } diff --git a/core/src/zero1hd/rhythmbullet/screens/MainMenu.java b/core/src/zero1hd/rhythmbullet/screens/MainMenu.java index e793ff1..06f40d4 100755 --- a/core/src/zero1hd/rhythmbullet/screens/MainMenu.java +++ b/core/src/zero1hd/rhythmbullet/screens/MainMenu.java @@ -4,8 +4,9 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Pixmap.Format; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.FrameBuffer; import com.badlogic.gdx.graphics.glutils.ShaderProgram; @@ -17,12 +18,12 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.viewport.ScreenViewport; import zero1hd.rhythmbullet.RhythmBullet; +import zero1hd.rhythmbullet.audio.SongList; import zero1hd.rhythmbullet.audio.SongListController; import zero1hd.rhythmbullet.graphics.ui.pages.CreditsPage; import zero1hd.rhythmbullet.graphics.ui.pages.MainPage; import zero1hd.rhythmbullet.graphics.ui.pages.MoreOptionsPage; import zero1hd.rhythmbullet.graphics.ui.pages.OptionsPage; -import zero1hd.rhythmbullet.audio.SongList; import zero1hd.rhythmbullet.util.TransitionAdapter; public class MainMenu extends ScreenAdapter implements TransitionAdapter { @@ -47,8 +48,9 @@ public class MainMenu extends ScreenAdapter implements TransitionAdapter { private FrameBuffer hBlur, vBlur; private TextureRegion fboRegion; private int fboSize; - private int blurlvl = 2; + private Batch batch; + private ScreenViewport screenViewport; public MainMenu(final RhythmBullet core) { this.core = core; @@ -118,6 +120,9 @@ public class MainMenu extends ScreenAdapter implements TransitionAdapter { } public void loadShaders() { if (core.getPrefs().getBoolean("glow shader")) { + batch = new SpriteBatch(); + screenViewport = new ScreenViewport(); + 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()) { @@ -159,9 +164,10 @@ public class MainMenu extends ScreenAdapter implements TransitionAdapter { normalBuffer = new FrameBuffer(Format.RGBA8888, fboSize, fboSize, false); hBlur = new FrameBuffer(Format.RGBA8888, fboSize/2, fboSize/2, false); vBlur = new FrameBuffer(Format.RGBA8888, fboSize/2, fboSize/2, false); - - fboRegion = new TextureRegion(); - + + fboRegion = new TextureRegion(normalBuffer.getColorBufferTexture()); + fboRegion.flip(false, true); + combineShader.begin(); combineShader.setUniformi("u_texture1", 1); combineShader.end(); @@ -176,87 +182,95 @@ public class MainMenu extends ScreenAdapter implements TransitionAdapter { @Override public void render(float delta) { - Gdx.gl.glClearColor(0f, 0f, 0f, 1f); + Gdx.gl.glClearColor(0.22f, 0f, 0f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); stage.act(delta); blurlvl = 5; - if (gaussianBlurShader != null) { - //Begin drawing a normal version of screen + stage.getViewport().apply(); normalBuffer.begin(); Gdx.gl.glClearColor(0.22f, 0f, 0f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); stage.draw(); normalBuffer.end(); - //END + //END STAGE BATCH + //BEGINNING NORMAL SCREEN RENDER + screenViewport.apply(); //Begin light filtering lightFilterBuffer.begin(); Gdx.gl.glClearColor(0f, 0f, 0f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - stage.getBatch().setShader(brightFilterShader); - stage.getBatch().begin(); //BATCH STARTS HERE - stage.getRoot().draw(stage.getBatch(), 1f); - stage.getBatch().flush(); + fboRegion.setTexture(normalBuffer.getColorBufferTexture()); + batch.setShader(brightFilterShader); + batch.begin(); //BATCH STARTS HERE + batch.draw(fboRegion, 0, 0, stage.getWidth(), stage.getHeight()); + batch.flush(); lightFilterBuffer.end(); //Horizontal gaussian blur hBlur.begin(); - fboRegion.setRegion(lightFilterBuffer.getColorBufferTexture()); - stage.getBatch().setShader(gaussianBlurShader); + Gdx.gl.glClearColor(0f, 0f, 0f, 1f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + fboRegion.setTexture(lightFilterBuffer.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("horizontal", 1); - stage.getBatch().draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); - stage.getBatch().flush(); + batch.draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); + batch.flush(); hBlur.end(); //Vertical gaussian blur vBlur.begin(); - fboRegion.setRegion(hBlur.getColorBufferTexture()); - stage.getBatch().setShader(gaussianBlurShader); + Gdx.gl.glClearColor(0f, 0f, 0f, 1f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + fboRegion.setTexture(hBlur.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("horizontal", 0); - stage.getBatch().draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); - stage.getBatch().flush(); + batch.draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); + batch.flush(); vBlur.end(); for (int i = 0; i < blurlvl; i++) { //Horizontal gaussian blur hBlur.begin(); - fboRegion.setRegion(vBlur.getColorBufferTexture()); - stage.getBatch().setShader(gaussianBlurShader); + fboRegion.setTexture(vBlur.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("horizontal", 1); - stage.getBatch().draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); - stage.getBatch().flush(); + batch.draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); + batch.flush(); hBlur.end(); //Vertical gaussian blur vBlur.begin(); - fboRegion.setRegion(hBlur.getColorBufferTexture()); - stage.getBatch().setShader(gaussianBlurShader); + fboRegion.setTexture(hBlur.getColorBufferTexture()); + batch.setShader(gaussianBlurShader); gaussianBlurShader.setUniformi("horizontal", 0); - stage.getBatch().draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); - stage.getBatch().flush(); + batch.draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); + batch.flush(); vBlur.end(); } - - //Draw everything to screen - stage.getBatch().setShader(combineShader); - fboRegion.setRegion(normalBuffer.getColorBufferTexture()); - fboRegion.flip(false, true); - stage.getBatch().draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); - stage.getBatch().setShader(null); - stage.getBatch().end(); //BATCH ENDS HERE + + //draw a final copy to a fbo + Gdx.gl.glClearColor(0f, 0f, 0f, 0f); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + batch.setShader(combineShader); + fboRegion.setTexture(normalBuffer.getColorBufferTexture()); + batch.draw(fboRegion, 0f, 0f, stage.getWidth(), stage.getHeight()); + batch.setShader(null); + batch.end(); //STAGE BATCH ENDS HERE + } else { stage.draw(); } if (stage.getCamera().position.x != targetPosition.x || stage.getCamera().position.y != targetPosition.y) { stage.getCamera().position.lerp(targetPosition, lerpAlpha); + stage.getViewport().apply(); } super.render(delta); } - @Override public void preTransition() { stage.clear();