From f8df9da04b1bb032e2b22a67a6cc964ef2762087 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 27 Nov 2022 08:30:29 +0800 Subject: [PATCH] update match transition --- forge-gui-mobile/src/forge/Forge.java | 22 +++++++++++++-- forge-gui-mobile/src/forge/Graphics.java | 26 +++++++++++++++-- forge-gui-mobile/src/forge/Shaders.java | 28 +++++++++++++++++++ .../src/forge/adventure/scene/ArenaScene.java | 1 - .../src/forge/adventure/scene/GameScene.java | 2 +- .../src/forge/adventure/stage/MapStage.java | 8 ++---- .../src/forge/adventure/stage/WorldStage.java | 3 +- .../src/forge/screens/SplashScreen.java | 2 +- .../src/forge/screens/TransitionScreen.java | 22 +++++++++++++-- 9 files changed, 96 insertions(+), 18 deletions(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index eab6414574f..7cf13bfaf16 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -45,6 +45,8 @@ import forge.toolbox.*; import forge.util.*; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.*; public class Forge implements ApplicationListener { @@ -174,7 +176,8 @@ public class Forge implements ApplicationListener { Gdx.input.setCatchKey(Keys.BACK, true); destroyThis = true; //Prevent back() ForgePreferences prefs = new ForgePreferences(); - selector = prefs.getPref(FPref.UI_SELECTOR_MODE); + if (Files.exists(Paths.get(ForgeConstants.DEFAULT_SKINS_DIR+ForgeConstants.ADV_TEXTURE_BG_FILE))) + selector = prefs.getPref(FPref.UI_SELECTOR_MODE); String skinName; if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) { skinName = prefs.getPref(FPref.UI_SKIN); @@ -323,6 +326,7 @@ public class Forge implements ApplicationListener { //continuous rendering is needed for adventure mode startContinuousRendering(); GuiBase.setIsAdventureMode(true); + advStartup = false; isMobileAdventureMode = true; if (GuiBase.isAndroid()) //force it for adventure mode altZoneTabs = true; @@ -764,7 +768,19 @@ public class Forge implements ApplicationListener { } public static void clearTransitionScreen() { - transitionScreen = null; + clearTransitionScreen(false); + } + public static void clearTransitionScreen(boolean disableMatchTransition) { + if (transitionScreen != null) { + if (disableMatchTransition) { + transitionScreen.disableMatchTransition(); + transitionScreen = null; + } + if (!disableMatchTransition && transitionScreen.isMatchTransition()) { + return; + } + transitionScreen = null; + } } public static void clearSplashScreen() { @@ -1012,6 +1028,8 @@ public class Forge implements ApplicationListener { currentScene = newScene; currentScene.enter(); + if (currentScene instanceof DuelScene) + Forge.clearTransitionScreen(true); return true; } diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index 9b2e153f4e5..d16c0e0f8d7 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -44,6 +44,7 @@ public class Graphics { private final ShaderProgram shaderNightDay = new ShaderProgram(Shaders.vertexShaderDayNight, Shaders.fragmentShaderDayNight); private final ShaderProgram shaderPixelate = new ShaderProgram(Shaders.vertPixelateShader, Shaders.fragPixelateShader); private final ShaderProgram shaderPixelateWarp = new ShaderProgram(Shaders.vertPixelateShader, Shaders.fragPixelateShaderWarp); + private final ShaderProgram shaderChromaticAbberation = new ShaderProgram(Shaders.vertPixelateShader, Shaders.fragChromaticAbberation); private Texture dummyTexture = null; @@ -821,6 +822,25 @@ public class Graphics { setAlphaComposite(oldalpha); } } + public void drawChromatic(TextureRegion image, float x, float y, float w, float h, Float time) { + if (image == null) + return; + if (time != null) { + batch.end(); + shaderChromaticAbberation.bind(); + shaderChromaticAbberation.setUniformf("u_time", time); + batch.setShader(shaderChromaticAbberation); + batch.begin(); + //draw + batch.draw(image, x, y, w, h); + //reset + batch.end(); + batch.setShader(null); + batch.begin(); + } else { + drawImage(image, x, y, w, h); + } + } public void drawPixelated(FImage image, float x, float y, float w, float h, Float amount) { if (image == null) return; @@ -868,10 +888,10 @@ public class Graphics { batch.end(); shaderPixelateWarp.bind(); shaderPixelateWarp.setUniformf("u_resolution", image.getRegionWidth(), image.getRegionHeight()); - shaderPixelateWarp.setUniformf("u_cellSize", amount*6); - shaderPixelateWarp.setUniformf("u_amount", 0.2f); + shaderPixelateWarp.setUniformf("u_cellSize", amount); + shaderPixelateWarp.setUniformf("u_amount", 0.2f*amount); shaderPixelateWarp.setUniformf("u_speed", 0.5f); - shaderPixelateWarp.setUniformf("u_time", amount); + shaderPixelateWarp.setUniformf("u_time", 0.8f); batch.setShader(shaderPixelateWarp); batch.begin(); //draw diff --git a/forge-gui-mobile/src/forge/Shaders.java b/forge-gui-mobile/src/forge/Shaders.java index 2527a2e27f8..c409416cd57 100644 --- a/forge-gui-mobile/src/forge/Shaders.java +++ b/forge-gui-mobile/src/forge/Shaders.java @@ -42,6 +42,34 @@ public class Shaders { " v_texCoords = a_texCoord0;\n" + " gl_Position = u_projTrans * a_position;\n" + "}"; + public static final String fragChromaticAbberation="#ifdef GL_ES\n" + + "#define PRECISION mediump\n" + + "precision PRECISION float;\n" + + "precision PRECISION int;\n" + + "#else\n" + + "#define PRECISION\n" + + "#endif\n" + + "\n" + + "varying vec2 v_texCoords;\n" + + "uniform sampler2D u_texture;\n" + + "uniform float u_time;\n" + + "\n" + + "void main() {\n" + + "\tvec2 uv = v_texCoords;\n" + + "\tfloat amount = 0.0;\n" + + "\tamount = (1.0 + sin(u_time*6.0)) * 0.5;\n" + + "\tamount *= 1.0 + sin(u_time*16.0) * 0.5;\n" + + "\tamount *= 1.0 + sin(u_time*19.0) * 0.5;\n" + + "\tamount *= 1.0 + sin(u_time*27.0) * 0.5;\n" + + "\tamount = pow(amount, 3.0);\n" + + "\tamount *= 0.05;\n" + + " vec3 col;\n" + + " col.r = texture2D(u_texture, vec2(uv.x+amount,uv.y)).r;\n" + + " col.g = texture2D(u_texture, uv ).g;\n" + + " col.b = texture2D(u_texture, vec2(uv.x-amount,uv.y)).b;\n" + + "\tcol *= (1.0 - amount * 0.5);\n" + + " gl_FragColor = vec4(col,1.0);\n" + + "}"; public static final String fragPixelateShader = "#ifdef GL_ES\n" + "#define PRECISION mediump\n" + "precision PRECISION float;\n" + diff --git a/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java b/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java index 71d32fdf5d4..0baa4a81e29 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java @@ -210,7 +210,6 @@ public class ArenaScene extends UIScene implements IAfterMatch { FThreads.invokeInEdtNowOrLater(() -> { Forge.setTransitionScreen(new TransitionScreen(() -> { duelScene.initDuels(WorldStage.getInstance().getPlayerSprite(), enemies.get(enemies.size-1)); - Forge.clearTransitionScreen(); Forge.switchScene(DuelScene.instance()); }, Forge.takeScreenshot(), true, false)); }); diff --git a/forge-gui-mobile/src/forge/adventure/scene/GameScene.java b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java index 1698182a286..45f4d1086e6 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/GameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java @@ -72,7 +72,7 @@ public class GameScene extends HudScene { location = forHeader? TextUtil.capitalize(data.name)+" Map" : data.name; } catch (Exception e) { e.printStackTrace(); - location = ""; + location = forHeader ? "Waste Map" : "waste"; } } return location; diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index de7abb1fe35..dca4e703134 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -693,11 +693,9 @@ public class MapStage extends GameStage { isLoadingMatch = true; Forge.setTransitionScreen(new TransitionScreen(() -> { duelScene.initDuels(player, mob); - Forge.clearTransitionScreen(); - startPause(0.3f, () -> { - if (isInMap && effect != null) duelScene.setDungeonEffect(effect); - Forge.switchScene(DuelScene.instance()); - }); + if (isInMap && effect != null) + duelScene.setDungeonEffect(effect); + Forge.switchScene(DuelScene.instance()); }, Forge.takeScreenshot(), true, false)); } }); diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index ed31af4adb8..80def36d02f 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -129,8 +129,7 @@ public class WorldStage extends GameStage implements SaveFileContent { FThreads.invokeInEdtNowOrLater(() -> { Forge.setTransitionScreen(new TransitionScreen(() -> { duelScene.initDuels(player, mob); - Forge.clearTransitionScreen(); - startPause(0.3f, () -> Forge.switchScene(DuelScene.instance())); + Forge.switchScene(DuelScene.instance()); }, Forge.takeScreenshot(), true, false)); currentMob = mob; WorldSave.getCurrentSave().autoSave(); diff --git a/forge-gui-mobile/src/forge/screens/SplashScreen.java b/forge-gui-mobile/src/forge/screens/SplashScreen.java index d1b027867f8..72e3c0d3991 100644 --- a/forge-gui-mobile/src/forge/screens/SplashScreen.java +++ b/forge-gui-mobile/src/forge/screens/SplashScreen.java @@ -158,7 +158,7 @@ public class SplashScreen extends FContainer { String version = "v. " + Forge.CURRENT_VERSION; g.drawText(version, disclaimerFont, FProgressBar.SEL_FORE_COLOR, x, getHeight() - disclaimerHeight, w, disclaimerHeight, false, Align.center, true); - progressBar.setBounds(x + padding, Forge.getScreenHeight() - h2 * 2f, w2, h2); + progressBar.setBounds((Forge.getScreenWidth() - w2)/2, Forge.getScreenHeight() - h2 * 2f, w2, h2); g.draw(progressBar); } public void drawBackground(Graphics g) { diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index ca46a19f90d..36319f81c2a 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -9,9 +9,11 @@ import forge.assets.FSkin; import forge.assets.FSkinImage; import forge.assets.FSkinTexture; import forge.gui.FThreads; +import forge.gui.GuiBase; import forge.sound.SoundSystem; import forge.toolbox.FContainer; import forge.toolbox.FProgressBar; +import forge.util.MyRandom; public class TransitionScreen extends FContainer { private BGAnimation bgAnimation; @@ -43,7 +45,7 @@ public class TransitionScreen extends FContainer { isIntro = intro; isFadeMusic = fadeMusic; message = loadingMessage; - Forge.advStartup = Forge.selector.equals("Adventure"); + Forge.advStartup = intro && Forge.selector.equals("Adventure"); } public FProgressBar getProgressBar() { @@ -53,6 +55,12 @@ public class TransitionScreen extends FContainer { protected void doLayout(float width, float height) { } + public boolean isMatchTransition() { + return matchTransition; + } + public void disableMatchTransition() { + matchTransition = false; + } private class BGAnimation extends ForgeAnimation { float DURATION = 0.6f; @@ -107,8 +115,16 @@ public class TransitionScreen extends FContainer { g.draw(progressBar); } } else if (matchTransition) { - if (textureRegion != null) - g.drawPixelatedWarp(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), 2.6f-(1*percentage)); + if (textureRegion != null) { + if (GuiBase.isAndroid()) { + g.drawChromatic(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), percentage); + } else { + int max = Forge.isLandscapeMode() ? Forge.getScreenHeight() / 32 : Forge.getScreenWidth() / 32; + int min = Forge.isLandscapeMode() ? Forge.getScreenHeight() / 64 : Forge.getScreenWidth() / 64; + int val = MyRandom.getRandom().nextInt(max - min) + min; + g.drawPixelatedWarp(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), val * percentage); + } + } } else if (isIntro) { if (textureRegion != null) { if (Forge.advStartup) {