From 28a40def2edd499a49cf468e1201dea54a483967 Mon Sep 17 00:00:00 2001 From: DizzyThermal Date: Thu, 24 Oct 2019 23:51:55 -0400 Subject: [PATCH] Incrementing PartPicker! WIP --- .../tkviewer/gui/TKPartPickerGUI.java | 51 ++++++++----- .../tkviewer/utilities/RenderUtils.java | 76 +++++++++++++++++++ 2 files changed, 107 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/gamemode/tkviewer/gui/TKPartPickerGUI.java b/src/main/java/com/gamemode/tkviewer/gui/TKPartPickerGUI.java index bd207f1..d34f2e5 100644 --- a/src/main/java/com/gamemode/tkviewer/gui/TKPartPickerGUI.java +++ b/src/main/java/com/gamemode/tkviewer/gui/TKPartPickerGUI.java @@ -12,6 +12,8 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.nio.Buffer; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -65,6 +67,8 @@ public class TKPartPickerGUI extends JFrame implements ActionListener { }; LinkedHashMap characterPartInfo; + int partValue = 0; + public TKPartPickerGUI(String title) { super(title); this.setPreferredSize(new Dimension(640, 480)); @@ -72,19 +76,20 @@ public TKPartPickerGUI(String title) { this.setIconImage(this.clientIcon); characterPartInfo = new LinkedHashMap(); - characterPartInfo.put("Bodies", new PartInfo(0, 2, true, RenderUtils.createBodyRenderer())); - characterPartInfo.put("Bows", new PartInfo(0, 0,false, RenderUtils.createBowRenderer())); + characterPartInfo.put("Bodies", new PartInfo(46, 2, true, RenderUtils.createBodyRenderer())); characterPartInfo.put("Coats", new PartInfo(0, 0,false, RenderUtils.createCoatRenderer())); - characterPartInfo.put("Faces", new PartInfo(0, 18,true, RenderUtils.createFaceRenderer())); - characterPartInfo.put("Face Decorations", new PartInfo(0, 0,false, RenderUtils.createFaceDecRenderer())); - characterPartInfo.put("Fans", new PartInfo(0, 0,false, RenderUtils.createFanRenderer())); - characterPartInfo.put("Hair", new PartInfo(0, 18,true, RenderUtils.createHairRenderer())); - characterPartInfo.put("Helmets", new PartInfo(0, 0,false, RenderUtils.createHelmetRenderer())); + characterPartInfo.put("Shoes", new PartInfo(0, 0,false, RenderUtils.createShoeRenderer())); characterPartInfo.put("Mantles", new PartInfo(0, 0,false, RenderUtils.createMantleRenderer())); + characterPartInfo.put("Helmets", new PartInfo(0, 0,false, RenderUtils.createHelmetRenderer())); + + characterPartInfo.put("Faces", new PartInfo(0, 2,true, RenderUtils.createFaceRenderer())); + characterPartInfo.put("Face Decorations", new PartInfo(3, 0,false, RenderUtils.createFaceDecRenderer())); + characterPartInfo.put("Hair", new PartInfo(0, 2,true, RenderUtils.createHairRenderer())); + characterPartInfo.put("Spears", new PartInfo(0, 0,false, RenderUtils.createSpearRenderer())); - characterPartInfo.put("Shoes", new PartInfo(0, 0,false, RenderUtils.createShoeRenderer())); characterPartInfo.put("Shields", new PartInfo(0, 0,false, RenderUtils.createShieldRenderer())); characterPartInfo.put("Swords", new PartInfo(0, 0,false, RenderUtils.createSwordRenderer())); + characterPartInfo.put("Fans", new PartInfo(0, 0,false, RenderUtils.createFanRenderer())); initMenu(); initPanel(); @@ -92,8 +97,9 @@ public TKPartPickerGUI(String title) { SwingWorker loadingWorker = new SwingWorker() { @Override protected Boolean doInBackground() throws Exception { - while (!this.isCancelled()) { + while (true) { Thread.sleep(250); + tickValue++; viewerPanel.removeAll(); @@ -102,8 +108,6 @@ protected Boolean doInBackground() throws Exception { viewerPanel.revalidate(); viewerPanel.repaint(); } - - return true; } @Override @@ -172,27 +176,34 @@ public BufferedImage renderCharacter() { BufferedImage characterImage = createGrassBackground(); Graphics2D graphicsObject = characterImage.createGraphics(); - int number = 0; + List> effImages = new ArrayList>(); for (Map.Entry characterPartInfo : this.characterPartInfo.entrySet()) { String partKey = characterPartInfo.getKey(); PartInfo partInfo = characterPartInfo.getValue(); if (partInfo.getShouldRender()) { + int partIndex = partInfo.getPartIndex(); int animationIndex = partInfo.getAnimationIndex(); List effectImages = partInfo.getPartRenderer().renderAnimation(partIndex, animationIndex); - graphicsObject.drawImage(effectImages.get(tickValue).getImage(), null, 50, 50); - System.out.println(tickValue); - if (tickValue >= 1) { - tickValue = 0; - } else { - tickValue++; - } + effImages.add(effectImages); } } - tickValue++; + + List effectImages = RenderUtils.aggregateAnimations(effImages); + + BufferedImage drawing = effectImages.get(tickValue % effectImages.size()).getImage(); + int backgroundWidth = characterImage.getWidth(); + int backgroundHeight = characterImage.getHeight(); + int width = drawing.getWidth(); + int height = drawing.getHeight(); + graphicsObject.drawImage(drawing, null, (backgroundWidth / 2) - (width / 2), (backgroundHeight / 2) - (height / 2)); + + characterPartInfo.get("Bodies").setPartIndex(partValue++); + characterPartInfo.get("Hair").setPartIndex(partValue++); + //characterPartInfo.get("Face").setPartIndex(partValue++); return characterImage; } diff --git a/src/main/java/com/gamemode/tkviewer/utilities/RenderUtils.java b/src/main/java/com/gamemode/tkviewer/utilities/RenderUtils.java index 2a013fc..07a4750 100644 --- a/src/main/java/com/gamemode/tkviewer/utilities/RenderUtils.java +++ b/src/main/java/com/gamemode/tkviewer/utilities/RenderUtils.java @@ -13,12 +13,18 @@ import com.gamemode.tkviewer.render.PartRenderer; import com.gamemode.tkviewer.render.SObjRenderer; import com.gamemode.tkviewer.render.TileRenderer; +import com.gamemode.tkviewer.resources.EffectImage; import com.gamemode.tkviewer.resources.Frame; import com.gamemode.tkviewer.resources.PivotData; import com.gamemode.tkviewer.resources.Resources; +import java.awt.*; +import java.awt.image.BufferedImage; import java.io.File; +import java.nio.Buffer; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class RenderUtils { public static DatFileHandler CHAR_DAT = new DatFileHandler(Resources.NTK_DATA_DIRECTORY + File.separator + "char.dat"); @@ -28,6 +34,16 @@ public class RenderUtils { */ private RenderUtils() {} + public static PivotData getPivotData(BufferedImage image) { + int width = image.getWidth(); + int height = image.getHeight(); + + int left = width / 2; + int top = height / 2; + + return new PivotData(left, top, width, height); + } + public static PivotData getPivotData(List frames) { // Determine Canvas Size int left, top, right, bottom; @@ -58,6 +74,66 @@ public static PivotData getPivotData(List frames) { return new PivotData(Math.abs(left), Math.abs(top), width, height); } + public static List aggregateAnimations (List < List > effImages){ + List allFrames = new ArrayList<>(); + for (List subListImages : effImages) { + allFrames.addAll(subListImages.stream().map(EffectImage::getFrame).collect(Collectors.toList())); + } + PivotData pivotData = RenderUtils.getPivotData(allFrames); + int maxWidth = pivotData.getCanvasWidth(); + int maxHeight = pivotData.getCanvasHeight(); + + // Correct Images according to maxWidth and maxHeight + for (int i = 0; i < effImages.size(); i++) { + for (int j = 0; j < effImages.get(i).size(); j++) { + EffectImage effImage = effImages.get(i).get(j); + effImage.setImage(resizeImage(effImage.getImage(), maxWidth, maxHeight, pivotData, + effImage.getFrame(), effImage.getPivotData())); + } + } + + List mergedImages = effImages.get(0); + for (int i = 1; i < effImages.size(); i++) { + mergedImages = mergeEffectImages(mergedImages, effImages.get(i)); + } + + return mergedImages; + } + + /** + * Draws images2 on top of images1 - images all must be equal size! + */ + public static List mergeEffectImages(List images1, List images2) { + List returnEffectImages = new ArrayList(); + + int count = Math.max(images1.size(), images2.size()); + int width = Math.max(images1.get(0).getImage().getWidth(), images2.get(0).getImage().getWidth()); + int height = Math.max(images1.get(0).getImage().getHeight(), images2.get(0).getImage().getHeight()); + for (int i = 0; i < count; i++) { + BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + + Graphics2D graphicsObject = newImage.createGraphics(); + graphicsObject.drawImage(images1.get(i % images1.size()).getImage(),null,0,0); + graphicsObject.drawImage(images2.get(i % images2.size()).getImage(),null,0,0); + + returnEffectImages.add(new EffectImage(newImage, images1.get(i % images1.size()).getDelay(), null, null)); + } + + return returnEffectImages; + } + + public static BufferedImage resizeImage(BufferedImage image, int newWidth, int newHeight, PivotData pivotData, + Frame frame, PivotData framePivotData) { + BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); + + Graphics2D graphicsObject = newImage.createGraphics(); + int frameLeft = (pivotData.getPivotX() - framePivotData.getPivotX()); + int frameTop = (pivotData.getPivotY() - framePivotData.getPivotY()); + graphicsObject.drawImage(image, null, frameLeft, frameTop); + + return newImage; + } + public static PartRenderer createBodyRenderer () { return new PartRenderer("Body"); } public static PartRenderer createBowRenderer () { return new PartRenderer("Bow");