From e3f14d5bdcc8ad9df3765574a6f2ec4a89f4fb2e Mon Sep 17 00:00:00 2001 From: Magpie Date: Tue, 5 Apr 2022 02:06:07 +0200 Subject: [PATCH] Use rendered cards for Adventure when no image file has been found. This allows seeing cards that are yet to download as well as custom cards. Also, a card rendering is forced before showing the mode selection screen, a temporary fix with an issue with CardImageRenderer, where it fails the very first time. --- forge-gui-mobile/src/forge/Forge.java | 9 +++++ .../forge/adventure/scene/RewardScene.java | 2 ++ .../src/forge/adventure/util/RewardActor.java | 35 ++++++++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 8b758a854e3..f6dd56a4268 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -27,12 +27,16 @@ import forge.assets.AssetsDownloader; import forge.assets.FSkin; import forge.assets.FSkinFont; import forge.assets.ImageCache; +import forge.card.CardImageRenderer; +import forge.card.CardRenderer; import forge.error.ExceptionHandler; +import forge.game.card.CardView; import forge.gamemodes.limited.BoosterDraft; import forge.gui.FThreads; import forge.gui.GuiBase; import forge.gui.error.BugReporter; import forge.interfaces.IDeviceAdapter; +import forge.item.PaperCard; import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgePreferences.FPref; @@ -384,6 +388,11 @@ public class Forge implements ApplicationListener { FThreads.invokeInEdtLater(new Runnable() { @Override public void run() { + //Force CardImageRenderer to render a card. This prevents a "fail on first run" scenario. + PaperCard dummy = StaticData.instance().fetchCard("Black Lotus", "LEB", "233"); + graphics.getBatch().begin(); //Will throw an exception without this. + CardImageRenderer.drawCardImage(graphics, CardView.getCardForUi(dummy), false, 0, 0, 100, 100, CardRenderer.CardStackPosition.Top, false, false); + //selection splashScreen.setShowModeSelector(true); //start background music diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index 6ef8c7b6771..140eccf75c6 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -200,6 +200,7 @@ public class RewardScene extends UIScene { float spacing = 2; int i = 0; + Forge.getGraphics().startClip(); //This allows to draw placeholder cards. for (Reward reward : new Array.ArrayIterator<>(newRewards)) { boolean skipCard = false; if (type == Type.Shop) { @@ -238,6 +239,7 @@ public class RewardScene extends UIScene { i++; } updateBuyButtons(); + Forge.getGraphics().endClip(); } private void updateBuyButtons() { diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 05c21045f2c..5e590cf958f 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -1,11 +1,14 @@ package forge.adventure.util; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureAtlas; 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.math.MathUtils; import com.badlogic.gdx.math.Matrix4; @@ -21,11 +24,17 @@ import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Disposable; import forge.Forge; +import forge.Graphics; import forge.adventure.scene.RewardScene; import forge.adventure.scene.Scene; import forge.assets.FSkin; import forge.assets.ImageCache; +import forge.card.CardImageRenderer; +import forge.card.CardRenderer; +import forge.game.card.Card; +import forge.game.card.CardView; import forge.gui.GuiBase; +import forge.item.PaperCard; import forge.util.ImageFetcher; import static forge.adventure.util.Paths.ITEMS_ATLAS; @@ -48,6 +57,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb boolean flipOnClick; private boolean hover; + private FrameBuffer frameBuffer; static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); Image toolTipImage; @@ -55,6 +65,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb public void dispose() { if (needsToBeDisposed) image.dispose(); + if (frameBuffer != null) frameBuffer.dispose(); } public Reward getReward() { @@ -66,6 +77,24 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb setCardImage(ImageCache.getImage(reward.getCard().getImageKey(false), false)); } + public Texture renderPlaceholder(PaperCard card){ + Gdx.gl.glDisable(GL20.GL_SCISSOR_TEST); + Graphics G = new Graphics(); + Matrix4 m = new Matrix4(); + if (frameBuffer == null) + this.frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, 488, 680, false); + frameBuffer.begin(); + m.setToOrtho2D(0,680,488, -680); //So it renders flipped. + G.begin(488, 680); + G.setProjectionMatrix(m); + CardImageRenderer.drawCardImage(G, CardView.getCardForUi(card), false, 0, 0, 488, 680, CardRenderer.CardStackPosition.Top, Forge.enableUIMask.equals("Art"), true); + G.end(); + G.dispose(); + setCardImage(frameBuffer.getColorBufferTexture()); + frameBuffer.end(); + Gdx.gl.glEnable(GL20.GL_SCISSOR_TEST); + return frameBuffer.getColorBufferTexture(); + } public RewardActor(Reward reward, boolean flippable) { this.flipOnClick = flippable; this.reward = reward; @@ -79,7 +108,11 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } else { if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) { - fetcher.fetchImage(reward.getCard().getImageKey(false), this); + //Cannot find an image file, set up a rendered card until (if) a file is downloaded. + PaperCard C = reward.getCard(); + Texture T = renderPlaceholder(C); + setCardImage(T); + fetcher.fetchImage(C.getImageKey(false), this); } } break;