Merge pull request #1230 from kevlahnota/master

support showing back face on shops and loot on adventure mode
This commit is contained in:
Anthony Calosa
2022-07-29 00:01:39 +08:00
committed by GitHub
2 changed files with 75 additions and 30 deletions

View File

@@ -1,7 +1,6 @@
package forge.adventure.util;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.loaders.TextureLoader.TextureParameter;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
@@ -69,7 +68,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
boolean flipOnClick;
private boolean hover;
boolean loaded = true;
TextureParameter parameter;
boolean alternate = false;
public static int renderedCount = 0; //Counter for cards that require rendering a preview.
static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher();
@@ -109,18 +108,13 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
return;
image = replacement;
loaded = true;
TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(image));
if(Forge.isLandscapeMode())
drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f);
else
drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f);
if (toolTipImage != null) {
if (toolTipImage.getDrawable() instanceof TextureRegionDrawable) {
((TextureRegionDrawable) toolTipImage.getDrawable()).getRegion().getTexture().dispose();
}
}
toolTipImage.remove();
toolTipImage = new Image(drawable);
toolTipImage = new Image(processDrawable(image));
if (GuiBase.isAndroid()) {
if (holdTooltip.tooltip_image.getDrawable() instanceof TextureRegionDrawable) {
((TextureRegionDrawable) holdTooltip.tooltip_image.getDrawable()).getRegion().getTexture().dispose();
@@ -145,15 +139,13 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
case Card: {
if (ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) {
setCardImage(ImageCache.getImage(reward.getCard().getImageKey(false), false));
//preload card back for performance
if (reward.getCard().hasBackFace()) {
ImageCache.getImage(reward.getCard().getImageKey(true), false);
}
} else {
if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) {
//Cannot find an image file, set up a rendered card until (if) a file is downloaded.
if(renderedCount++ == 0) {
//The first time we find a card that has no art, render one out of view to fully initialize CardImageRenderer.
getGraphics().begin(preview_w, preview_h);
CardImageRenderer.drawCardImage(getGraphics(), CardView.getCardForUi(reward.getCard()), false, -(preview_w + 20), 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.enableUIMask.equals("Art"), true);
getGraphics().end();
}
T = renderPlaceholder(getGraphics(), reward.getCard()); //Now we can render the card.
setCardImage(T);
loaded = false;
@@ -236,6 +228,9 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
public void clicked(InputEvent event, float x, float y) {
if (flipOnClick)
flip();
if (frontSideUp())
alternate = !alternate;
switchTooltip();
}
@Override
@@ -250,20 +245,63 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
});
}
}
private void switchTooltip() {
if (!Reward.Type.Card.equals(reward.type))
return;
if (!reward.getCard().hasBackFace())
return;
Texture alt = ImageCache.getImage(reward.getCard().getImageKey(true), false);
PaperCard altCard = ImageUtil.getPaperCardFromImageKey(reward.getCard().getCardAltImageKey());
if (GuiBase.isAndroid()) {
if (alternate) {
if (alt != null) {
holdTooltip.tooltip_actor.clear();
holdTooltip.tooltip_actor.add(new Image(processDrawable(alt)));
} else {
if (T == null)
T = renderPlaceholder(getGraphics(), altCard);
holdTooltip.tooltip_actor.clear();
holdTooltip.tooltip_actor.add(new Image(processDrawable(T)));
}
} else {
if (toolTipImage != null) {
holdTooltip.tooltip_actor.clear();
holdTooltip.tooltip_actor.add(toolTipImage);
}
}
} else {
if (hover) {
if (alternate) {
if (alt != null) {
tooltip.setActor(new Image(processDrawable(alt)));
} else {
if (T == null)
T = renderPlaceholder(getGraphics(), altCard);
tooltip.setActor(new Image(processDrawable(T)));
}
} else {
if (toolTipImage != null)
tooltip.setActor(toolTipImage);
}
}
}
}
private TextureRegionDrawable processDrawable(Texture texture) {
TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(texture));
if(Forge.isLandscapeMode())
drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f);
else
drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f);
return drawable;
}
private void setCardImage(Texture img) {
if (img == null)
return;
image = img;
if (Forge.isTextureFilteringEnabled())
image.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear);
TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(image));
if(Forge.isLandscapeMode())
drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f);
else
drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f);
if (toolTipImage == null)
toolTipImage = new Image(drawable);
toolTipImage = new Image(processDrawable(image));
if (GuiBase.isAndroid()) {
if (holdTooltip == null)
holdTooltip = new HoldTooltip(toolTipImage);
@@ -279,6 +317,12 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
}
private Texture renderPlaceholder(Graphics g, PaperCard card){ //Use CardImageRenderer to output a Texture.
if(renderedCount++ == 0) {
//The first time we find a card that has no art, render one out of view to fully initialize CardImageRenderer.
g.begin(preview_w, preview_h);
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(reward.getCard()), false, -(preview_w + 20), 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true);
g.end();
}
Matrix4 m = new Matrix4();
FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, preview_w, preview_h, false);
frameBuffer.begin();
@@ -287,7 +331,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
g.begin(preview_w, preview_h);
g.setProjectionMatrix(m);
g.startClip();
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(card), false, 0, 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.enableUIMask.equals("Art"), true);
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(card), false, 0, 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true);
g.end();
g.endClip();
//Rendering ends here. Create a new Pixmap to Texture with mipmaps, otherwise will render as full black.
@@ -326,14 +370,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
//Rendering code ends here.
TextureRegionDrawable drawable = new TextureRegionDrawable(generatedTooltip);
if(Forge.isLandscapeMode())
drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f);
else
drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f);
if (toolTipImage == null)
toolTipImage = new Image(drawable);
toolTipImage = new Image(processDrawable(generatedTooltip));
if (frontSideUp()) {
if (GuiBase.isAndroid()) {
@@ -564,5 +602,13 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
tooltip_actor.remove();
super.touchUp(event, x, y, pointer, button);
}
@Override
public void tap(InputEvent event, float x, float y, int count, int button) {
if (count > 1)
alternate = !alternate;
switchTooltip();
super.tap(event, x, y, count, button);
}
}
}

View File

@@ -281,7 +281,6 @@ public class ImageCache {
}
if (!others && cardsLoaded.size() > maxCardCapacity) {
unloadCardTextures(Forge.getAssets().manager());
return null;
}
String fileName = file.getPath();
//load to assetmanager