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.
This commit is contained in:
Magpie
2022-04-05 02:06:07 +02:00
parent 311002069a
commit e3f14d5bdc
3 changed files with 45 additions and 1 deletions

View File

@@ -27,12 +27,16 @@ import forge.assets.AssetsDownloader;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.FSkinFont; import forge.assets.FSkinFont;
import forge.assets.ImageCache; import forge.assets.ImageCache;
import forge.card.CardImageRenderer;
import forge.card.CardRenderer;
import forge.error.ExceptionHandler; import forge.error.ExceptionHandler;
import forge.game.card.CardView;
import forge.gamemodes.limited.BoosterDraft; import forge.gamemodes.limited.BoosterDraft;
import forge.gui.FThreads; import forge.gui.FThreads;
import forge.gui.GuiBase; import forge.gui.GuiBase;
import forge.gui.error.BugReporter; import forge.gui.error.BugReporter;
import forge.interfaces.IDeviceAdapter; import forge.interfaces.IDeviceAdapter;
import forge.item.PaperCard;
import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgeConstants;
import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgePreferences;
import forge.localinstance.properties.ForgePreferences.FPref; import forge.localinstance.properties.ForgePreferences.FPref;
@@ -384,6 +388,11 @@ public class Forge implements ApplicationListener {
FThreads.invokeInEdtLater(new Runnable() { FThreads.invokeInEdtLater(new Runnable() {
@Override @Override
public void run() { 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 //selection
splashScreen.setShowModeSelector(true); splashScreen.setShowModeSelector(true);
//start background music //start background music

View File

@@ -200,6 +200,7 @@ public class RewardScene extends UIScene {
float spacing = 2; float spacing = 2;
int i = 0; int i = 0;
Forge.getGraphics().startClip(); //This allows to draw placeholder cards.
for (Reward reward : new Array.ArrayIterator<>(newRewards)) { for (Reward reward : new Array.ArrayIterator<>(newRewards)) {
boolean skipCard = false; boolean skipCard = false;
if (type == Type.Shop) { if (type == Type.Shop) {
@@ -238,6 +239,7 @@ public class RewardScene extends UIScene {
i++; i++;
} }
updateBuyButtons(); updateBuyButtons();
Forge.getGraphics().endClip();
} }
private void updateBuyButtons() { private void updateBuyButtons() {

View File

@@ -1,11 +1,14 @@
package forge.adventure.util; 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.Pixmap;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion; 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.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Matrix4; 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.Align;
import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.Disposable;
import forge.Forge; import forge.Forge;
import forge.Graphics;
import forge.adventure.scene.RewardScene; import forge.adventure.scene.RewardScene;
import forge.adventure.scene.Scene; import forge.adventure.scene.Scene;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.ImageCache; 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.gui.GuiBase;
import forge.item.PaperCard;
import forge.util.ImageFetcher; import forge.util.ImageFetcher;
import static forge.adventure.util.Paths.ITEMS_ATLAS; import static forge.adventure.util.Paths.ITEMS_ATLAS;
@@ -48,6 +57,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
boolean flipOnClick; boolean flipOnClick;
private boolean hover; private boolean hover;
private FrameBuffer frameBuffer;
static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher();
Image toolTipImage; Image toolTipImage;
@@ -55,6 +65,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
public void dispose() { public void dispose() {
if (needsToBeDisposed) if (needsToBeDisposed)
image.dispose(); image.dispose();
if (frameBuffer != null) frameBuffer.dispose();
} }
public Reward getReward() { public Reward getReward() {
@@ -66,6 +77,24 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
setCardImage(ImageCache.getImage(reward.getCard().getImageKey(false), false)); 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) { public RewardActor(Reward reward, boolean flippable) {
this.flipOnClick = flippable; this.flipOnClick = flippable;
this.reward = reward; this.reward = reward;
@@ -79,7 +108,11 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
} else { } else {
if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) { 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; break;