From 9671ee605d80d7bf1f1d9e4a8f6e07a6e5d262cb Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Wed, 27 Sep 2017 00:16:39 +0200 Subject: [PATCH 1/8] =?UTF-8?q?Add=20360=C2=B0=20screenshot=20feature=20wh?= =?UTF-8?q?en=20pressing=20Ctrl=20+=20Screenshot=20Keybind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/replaymod/extras/ReplayModExtras.java | 2 + .../AdvancedScreenshots.java | 93 +++++++++++++++++++ .../advancedscreenshots/ScreenshotWriter.java | 56 +++++++++++ .../replaymod/replay/InputReplayTimer.java | 6 +- .../events/ReplayDispatchKeypressesEvent.java | 9 ++ src/main/resources/META-INF/replaymod_at.cfg | 3 + 6 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java create mode 100644 src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java create mode 100644 src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index 93ed038a..0e34b7c7 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -1,6 +1,7 @@ package com.replaymod.extras; import com.replaymod.core.ReplayMod; +import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots; import com.replaymod.extras.playeroverview.PlayerOverview; import com.replaymod.extras.urischeme.UriSchemeExtra; import com.replaymod.extras.youtube.YoutubeUpload; @@ -27,6 +28,7 @@ public class ReplayModExtras { public static ReplayModExtras instance; private static final List> builtin = Arrays.asList( + AdvancedScreenshots.class, PlayerOverview.class, UriSchemeExtra.class, YoutubeUpload.class, diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java new file mode 100644 index 00000000..b3dd2ae1 --- /dev/null +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -0,0 +1,93 @@ +package com.replaymod.extras.advancedscreenshots; + +import com.replaymod.core.ReplayMod; +import com.replaymod.extras.Extra; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.capturer.RenderInfo; +import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +import com.replaymod.render.rendering.Pipelines; +import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiControls; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.ScreenShotHelper; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.lwjgl.input.Keyboard; +import org.lwjgl.util.Dimension; +import org.lwjgl.util.ReadableDimension; + +import java.io.File; + +public class AdvancedScreenshots implements Extra { + + private final Minecraft mc = Minecraft.getMinecraft(); + + @Override + public void register(ReplayMod mod) throws Exception { + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public void onDispatchKeypresses(ReplayDispatchKeypressesEvent.Pre event) { + int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); + + // all the conditions required to trigger a screenshot condensed in a single if statement + if (i != 0 && !Keyboard.isRepeatEvent() + && (!(mc.currentScreen instanceof GuiControls) || ((GuiControls) mc.currentScreen).time <= mc.getSystemTime() - 20L) + && Keyboard.getEventKeyState() + && i == mc.gameSettings.keyBindScreenshot.getKeyCode()) { + + if (GuiScreen.isCtrlKeyDown()) { + ReplayMod.instance.runLater(() -> { + // take 360° screenshot + File screenshotFolder = new File(mc.mcDataDir, "screenshots"); + screenshotFolder.mkdir(); + File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); + + int width = 8640; + int height = 4320; + + int displayWidthBefore = mc.displayWidth; + int displayHeightBefore = mc.displayHeight; + + ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + + Pipelines.newEquirectangularPipeline(new RenderInfo() { + @Override + public ReadableDimension getFrameSize() { + return new Dimension(width, height); + } + + @Override + public int getTotalFrames() { + return 1; + } + + @Override + public float updateForNextFrame() { + return mc.timer.renderPartialTicks; + } + + @Override + public RenderSettings getRenderSettings() { + return new RenderSettings( + null, null, width, height, 0, 0, null, + true, true, true, true, null, + false, RenderSettings.AntiAliasing.NONE, null, null, false + ); + } + }, new ScreenshotWriter(screenshotFile)).run(); + + clrg.uninstall(); + + // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, + // so we have to reset it to the previous value + mc.resize(displayWidthBefore, displayHeightBefore); + }); + + event.setCanceled(true); + } + } + } +} diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java new file mode 100644 index 00000000..d487b08b --- /dev/null +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java @@ -0,0 +1,56 @@ +package com.replaymod.extras.advancedscreenshots; + +import com.replaymod.core.ReplayMod; +import com.replaymod.core.utils.Utils; +import com.replaymod.extras.ReplayModExtras; +import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.rendering.FrameConsumer; +import com.replaymod.replay.ReplayModReplay; +import net.minecraft.crash.CrashReport; +import org.lwjgl.util.ReadableDimension; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +public class ScreenshotWriter implements FrameConsumer { + + private final File outputFile; + + public ScreenshotWriter(File outputFile) { + this.outputFile = outputFile; + } + + @Override + public void consume(RGBFrame frame) { + try { + final ReadableDimension frameSize = frame.getSize(); + + BufferedImage img = new BufferedImage(frameSize.getWidth(), frameSize.getHeight(), BufferedImage.TYPE_INT_RGB); + for (int y = 0; y < frameSize.getHeight(); y++) { + for (int x = 0; x < frameSize.getWidth(); x++) { + byte r = frame.getByteBuffer().get(); + byte g = frame.getByteBuffer().get(); + byte b = frame.getByteBuffer().get(); + + int color = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); + img.setRGB(x, y, color); + } + } + + ImageIO.write(img, "PNG", outputFile); + } catch (Throwable t) { + CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame"); + + ReplayMod.instance.runLater(() -> Utils.error(ReplayModExtras.LOGGER, + ReplayModReplay.instance.getReplayHandler().getOverlay(), + report, null)); + } + } + + @Override + public void close() throws IOException { + + } +} diff --git a/src/main/java/com/replaymod/replay/InputReplayTimer.java b/src/main/java/com/replaymod/replay/InputReplayTimer.java index da1bd5fb..250ba766 100644 --- a/src/main/java/com/replaymod/replay/InputReplayTimer.java +++ b/src/main/java/com/replaymod/replay/InputReplayTimer.java @@ -3,6 +3,7 @@ package com.replaymod.replay; import com.replaymod.core.utils.WrappedTimer; import com.replaymod.replay.camera.CameraController; import com.replaymod.replay.camera.CameraEntity; +import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.settings.GameSettings; @@ -11,6 +12,7 @@ import net.minecraft.crash.CrashReport; import net.minecraft.util.ReportedException; import net.minecraft.util.Timer; import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; @@ -122,7 +124,9 @@ public class InputReplayTimer extends WrappedTimer { } // Twitch, screenshot, fullscreen, etc. (stuff that works everywhere) - mc.dispatchKeypresses(); + if (!MinecraftForge.EVENT_BUS.post(new ReplayDispatchKeypressesEvent.Pre())) { + mc.dispatchKeypresses(); + } if (pressed) { // This might be subject to change as vanilla shaders are still kinda unused in 1.8 diff --git a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java new file mode 100644 index 00000000..15b23352 --- /dev/null +++ b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java @@ -0,0 +1,9 @@ +package com.replaymod.replay.events; + +import net.minecraftforge.fml.common.eventhandler.Cancelable; +import net.minecraftforge.fml.common.eventhandler.Event; + +@Cancelable +public abstract class ReplayDispatchKeypressesEvent extends Event { + public static class Pre extends ReplayDispatchKeypressesEvent {} +} diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 59d3b95e..08652131 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -117,5 +117,8 @@ public net.minecraft.client.renderer.GlStateManager$FogState public net.minecraft.client.renderer.GlStateManager$BooleanState public net.minecraft.client.renderer.GlStateManager$BooleanState * +# ScreenShotHelper +public net.minecraft.util.ScreenShotHelper func_74290_a(Ljava/io/File;)Ljava/io/File; # getTimestampedPNGFileForDirectory + # Example # public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName From d2d7a36139968c9c8889978bc686295b4e96f568 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Wed, 27 Sep 2017 13:13:20 +0200 Subject: [PATCH 2/8] Added post-screenshot GUI --- .../com/replaymod/extras/ReplayModExtras.java | 1 + .../java/com/replaymod/extras/Setting.java | 8 ++ .../AdvancedScreenshots.java | 106 ++++++++-------- .../GuiUploadScreenshot.java | 114 ++++++++++++++++++ .../events/ReplayDispatchKeypressesEvent.java | 3 +- 5 files changed, 182 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/replaymod/extras/Setting.java create mode 100644 src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index 0e34b7c7..463e8805 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -45,6 +45,7 @@ public class ReplayModExtras { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { LOGGER = event.getModLog(); + ReplayMod.instance.getSettingsRegistry().register(Setting.class); } @Mod.EventHandler diff --git a/src/main/java/com/replaymod/extras/Setting.java b/src/main/java/com/replaymod/extras/Setting.java new file mode 100644 index 00000000..2f69e4c1 --- /dev/null +++ b/src/main/java/com/replaymod/extras/Setting.java @@ -0,0 +1,8 @@ +package com.replaymod.extras; + +import com.replaymod.core.SettingsRegistry; + +public final class Setting { + public static final SettingsRegistry.SettingKey SKIP_POST_SCREENSHOT_GUI = + new SettingsRegistry.SettingKeys<>("advanced", "skipPostScreenshotGui", null, false); +} diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java index b3dd2ae1..ee55cd2c 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -6,6 +6,7 @@ import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.rendering.Pipelines; +import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiControls; @@ -21,73 +22,80 @@ import java.io.File; public class AdvancedScreenshots implements Extra { + private ReplayMod mod; + private final Minecraft mc = Minecraft.getMinecraft(); @Override public void register(ReplayMod mod) throws Exception { + this.mod = mod; MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onDispatchKeypresses(ReplayDispatchKeypressesEvent.Pre event) { - int i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); + int keyCode = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() : Keyboard.getEventKey(); // all the conditions required to trigger a screenshot condensed in a single if statement - if (i != 0 && !Keyboard.isRepeatEvent() + if (keyCode != 0 && !Keyboard.isRepeatEvent() && (!(mc.currentScreen instanceof GuiControls) || ((GuiControls) mc.currentScreen).time <= mc.getSystemTime() - 20L) && Keyboard.getEventKeyState() - && i == mc.gameSettings.keyBindScreenshot.getKeyCode()) { + && keyCode == mc.gameSettings.keyBindScreenshot.getKeyCode()) { if (GuiScreen.isCtrlKeyDown()) { - ReplayMod.instance.runLater(() -> { - // take 360° screenshot - File screenshotFolder = new File(mc.mcDataDir, "screenshots"); - screenshotFolder.mkdir(); - File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); - - int width = 8640; - int height = 4320; - - int displayWidthBefore = mc.displayWidth; - int displayHeightBefore = mc.displayHeight; - - ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); - - Pipelines.newEquirectangularPipeline(new RenderInfo() { - @Override - public ReadableDimension getFrameSize() { - return new Dimension(width, height); - } - - @Override - public int getTotalFrames() { - return 1; - } - - @Override - public float updateForNextFrame() { - return mc.timer.renderPartialTicks; - } - - @Override - public RenderSettings getRenderSettings() { - return new RenderSettings( - null, null, width, height, 0, 0, null, - true, true, true, true, null, - false, RenderSettings.AntiAliasing.NONE, null, null, false - ); - } - }, new ScreenshotWriter(screenshotFile)).run(); - - clrg.uninstall(); - - // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, - // so we have to reset it to the previous value - mc.resize(displayWidthBefore, displayHeightBefore); - }); + ReplayMod.instance.runLater(this::createEquirectangularScreenshot); event.setCanceled(true); } } } + + private void createEquirectangularScreenshot() { + // take 360° screenshot + File screenshotFolder = new File(mc.mcDataDir, "screenshots"); + screenshotFolder.mkdir(); + File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); + + int width = 8640; + int height = 4320; + + int displayWidthBefore = mc.displayWidth; + int displayHeightBefore = mc.displayHeight; + + ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + + Pipelines.newEquirectangularPipeline(new RenderInfo() { + @Override + public ReadableDimension getFrameSize() { + return new Dimension(width, height); + } + + @Override + public int getTotalFrames() { + return 1; + } + + @Override + public float updateForNextFrame() { + return mc.timer.renderPartialTicks; + } + + @Override + public RenderSettings getRenderSettings() { + return new RenderSettings( + null, null, width, height, 0, 0, null, + true, true, true, true, null, + false, RenderSettings.AntiAliasing.NONE, null, null, false + ); + } + }, new ScreenshotWriter(screenshotFile)).run(); + + clrg.uninstall(); + + // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, + // so we have to reset it to the previous value + mc.resize(displayWidthBefore, displayHeightBefore); + + new GuiUploadScreenshot(ReplayModReplay.instance.getReplayHandler().getOverlay(), mod, screenshotFile).open(); + } } diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java new file mode 100644 index 00000000..828d7f65 --- /dev/null +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java @@ -0,0 +1,114 @@ +package com.replaymod.extras.advancedscreenshots; + +import com.replaymod.core.ReplayMod; +import com.replaymod.core.SettingsRegistry; +import com.replaymod.extras.Setting; +import de.johni0702.minecraft.gui.container.GuiContainer; +import de.johni0702.minecraft.gui.container.GuiPanel; +import de.johni0702.minecraft.gui.element.GuiButton; +import de.johni0702.minecraft.gui.element.GuiCheckbox; +import de.johni0702.minecraft.gui.element.GuiLabel; +import de.johni0702.minecraft.gui.layout.HorizontalLayout; +import de.johni0702.minecraft.gui.layout.VerticalLayout; +import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; +import org.lwjgl.util.ReadableColor; + +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.net.URI; + +public class GuiUploadScreenshot extends AbstractGuiPopup { + + public final ReplayMod mod; + + public final File screenshotFile; + + public final GuiLabel successLabel = new GuiLabel() + .setI18nText("replaymod.gui.advancedscreenshots.finished.description.360") + .setColor(ReadableColor.BLACK); + + public final GuiLabel veerLabel = new GuiLabel() + .setI18nText("replaymod.gui.advancedscreenshots.finished.description.veer") + .setColor(ReadableColor.BLACK); + + public final GuiButton veerUploadButton = new GuiButton() + .setSize(150, 20) + .setI18nLabel("replaymod.gui.advancedscreenshots.finished.upload.veer"); + + public final GuiButton showOnDiskButton = new GuiButton() + .setSize(150, 20) + .setI18nLabel("replaymod.gui.advancedscreenshots.finished.showfile"); + + public final GuiButton closeButton = new GuiButton() + .setSize(150, 20) + .setI18nLabel("replaymod.gui.close"); + + public final GuiCheckbox neverOpenCheckbox = new GuiCheckbox(); + + public final GuiLabel neverOpenLabel = new GuiLabel() + .setI18nText("replaymod.gui.notagain") + .setColor(ReadableColor.BLACK); + + public final GuiPanel checkboxPanel = GuiPanel.builder() + .layout(new HorizontalLayout(HorizontalLayout.Alignment.RIGHT).setSpacing(5)) + .with(neverOpenCheckbox, new HorizontalLayout.Data(0.5)) + .with(neverOpenLabel, new HorizontalLayout.Data(0.5)) + .build(); + + public GuiUploadScreenshot(GuiContainer container, ReplayMod mod, File screenshotFile) { + super(container); + this.mod = mod; + this.screenshotFile = screenshotFile; + + veerUploadButton.onClick(() -> { + try { + Desktop.getDesktop().browse(URI.create("https://veer.tv/upload")); + } catch (IOException e) { + e.printStackTrace(); + } + }); + + showOnDiskButton.onClick(() -> { + try { + Desktop.getDesktop().browse(URI.create("file://" + screenshotFile.getAbsolutePath())); + } catch (IOException e) { + e.printStackTrace(); + } + }); + + closeButton.onClick(() -> { + if (neverOpenCheckbox.isChecked()) { + SettingsRegistry settingsRegistry = mod.getSettingsRegistry(); + settingsRegistry.set(Setting.SKIP_POST_SCREENSHOT_GUI, true); + settingsRegistry.save(); + } + close(); + }); + + popup.addElements(new VerticalLayout.Data(0.5), + successLabel, + veerLabel, + veerUploadButton, + showOnDiskButton, + closeButton); + + popup.addElements(new VerticalLayout.Data(1), + checkboxPanel); + + popup.setLayout(new VerticalLayout().setSpacing(5)); + } + + @Override + protected void open() { + if (mod.getSettingsRegistry().get(Setting.SKIP_POST_SCREENSHOT_GUI)) { + return; + } + super.open(); + } + + @Override + protected GuiUploadScreenshot getThis() { + return this; + } +} diff --git a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java index 15b23352..d3547127 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java @@ -3,7 +3,8 @@ package com.replaymod.replay.events; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; -@Cancelable public abstract class ReplayDispatchKeypressesEvent extends Event { + + @Cancelable public static class Pre extends ReplayDispatchKeypressesEvent {} } From 98098ea2ed37b4bcb669b3ffd42d4ee603d6c25b Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Wed, 27 Sep 2017 13:13:49 +0200 Subject: [PATCH 3/8] Update language submodule --- src/main/resources/assets/replaymod/lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/replaymod/lang b/src/main/resources/assets/replaymod/lang index 8d77fe06..94282826 160000 --- a/src/main/resources/assets/replaymod/lang +++ b/src/main/resources/assets/replaymod/lang @@ -1 +1 @@ -Subproject commit 8d77fe0697691f0b682f422e268b40383468f31d +Subproject commit 942828260079edb1e35b2e500d6763c5234f6bbb From 7d380e770a0c884def0e2b45fcf31c5e085e728d Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Tue, 31 Oct 2017 17:28:21 +0100 Subject: [PATCH 4/8] =?UTF-8?q?Properly=20handle=20OOMExceptions=20when=20?= =?UTF-8?q?creating=20a=20360=C2=B0=20screenshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdvancedScreenshots.java | 79 ++++++++++--------- .../advancedscreenshots/ScreenshotWriter.java | 5 ++ 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java index ee55cd2c..4e891b67 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -11,6 +11,7 @@ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiControls; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.crash.CrashReport; import net.minecraft.util.ScreenShotHelper; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -51,51 +52,57 @@ public class AdvancedScreenshots implements Extra { } private void createEquirectangularScreenshot() { - // take 360° screenshot - File screenshotFolder = new File(mc.mcDataDir, "screenshots"); - screenshotFolder.mkdir(); - File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); + try { + // take 360° screenshot + File screenshotFolder = new File(mc.mcDataDir, "screenshots"); + screenshotFolder.mkdir(); + File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); - int width = 8640; - int height = 4320; + int height = 4 * 4320; + int width = 2 * height; - int displayWidthBefore = mc.displayWidth; - int displayHeightBefore = mc.displayHeight; + int displayWidthBefore = mc.displayWidth; + int displayHeightBefore = mc.displayHeight; - ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); - Pipelines.newEquirectangularPipeline(new RenderInfo() { - @Override - public ReadableDimension getFrameSize() { - return new Dimension(width, height); - } + Pipelines.newEquirectangularPipeline(new RenderInfo() { + @Override + public ReadableDimension getFrameSize() { + return new Dimension(width, height); + } - @Override - public int getTotalFrames() { - return 1; - } + @Override + public int getTotalFrames() { + return 1; + } - @Override - public float updateForNextFrame() { - return mc.timer.renderPartialTicks; - } + @Override + public float updateForNextFrame() { + return mc.timer.renderPartialTicks; + } - @Override - public RenderSettings getRenderSettings() { - return new RenderSettings( - null, null, width, height, 0, 0, null, - true, true, true, true, null, - false, RenderSettings.AntiAliasing.NONE, null, null, false - ); - } - }, new ScreenshotWriter(screenshotFile)).run(); + @Override + public RenderSettings getRenderSettings() { + return new RenderSettings( + null, null, width, height, 0, 0, null, + true, true, true, true, null, + false, RenderSettings.AntiAliasing.NONE, null, null, false + ); + } + }, new ScreenshotWriter(screenshotFile)).run(); - clrg.uninstall(); + clrg.uninstall(); - // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, - // so we have to reset it to the previous value - mc.resize(displayWidthBefore, displayHeightBefore); + // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, + // so we have to reset it to the previous value + mc.resize(displayWidthBefore, displayHeightBefore); - new GuiUploadScreenshot(ReplayModReplay.instance.getReplayHandler().getOverlay(), mod, screenshotFile).open(); + new GuiUploadScreenshot(ReplayModReplay.instance.getReplayHandler().getOverlay(), mod, screenshotFile).open(); + } catch (OutOfMemoryError e) { + e.printStackTrace(); + CrashReport report = CrashReport.makeCrashReport(e, "Creating Equirectangular Screenshot"); + Minecraft.getMinecraft().crashed(report); + } } } diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java index d487b08b..e04d1b59 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java @@ -6,6 +6,7 @@ import com.replaymod.extras.ReplayModExtras; import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.replay.ReplayModReplay; +import net.minecraft.client.Minecraft; import net.minecraft.crash.CrashReport; import org.lwjgl.util.ReadableDimension; @@ -40,6 +41,10 @@ public class ScreenshotWriter implements FrameConsumer { } ImageIO.write(img, "PNG", outputFile); + } catch (OutOfMemoryError e) { + e.printStackTrace(); + CrashReport report = CrashReport.makeCrashReport(e, "Exporting frame"); + Minecraft.getMinecraft().crashed(report); } catch (Throwable t) { CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame"); From 2ebec358e0ceee0ad9374b8faac53bc599fffe97 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Wed, 1 Nov 2017 13:24:52 +0100 Subject: [PATCH 5/8] Added Screenshot export settings GUI --- .../AdvancedScreenshots.java | 75 +--------------- .../GuiCreateScreenshot.java | 87 +++++++++++++++++++ .../GuiUploadScreenshot.java | 44 ++++++---- .../ScreenshotRenderer.java | 65 ++++++++++++++ .../render/gui/GuiRenderSettings.java | 4 +- 5 files changed, 187 insertions(+), 88 deletions(-) create mode 100644 src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java create mode 100644 src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java index 4e891b67..a3e7b36b 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -2,24 +2,12 @@ package com.replaymod.extras.advancedscreenshots; import com.replaymod.core.ReplayMod; import com.replaymod.extras.Extra; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.capturer.RenderInfo; -import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; -import com.replaymod.render.rendering.Pipelines; -import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.events.ReplayDispatchKeypressesEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiControls; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.crash.CrashReport; -import net.minecraft.util.ScreenShotHelper; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; -import org.lwjgl.util.Dimension; -import org.lwjgl.util.ReadableDimension; - -import java.io.File; public class AdvancedScreenshots implements Extra { @@ -43,66 +31,11 @@ public class AdvancedScreenshots implements Extra { && Keyboard.getEventKeyState() && keyCode == mc.gameSettings.keyBindScreenshot.getKeyCode()) { - if (GuiScreen.isCtrlKeyDown()) { - ReplayMod.instance.runLater(this::createEquirectangularScreenshot); + ReplayMod.instance.runLater(() -> { + new GuiCreateScreenshot(mod).display(); + }); - event.setCanceled(true); - } - } - } - - private void createEquirectangularScreenshot() { - try { - // take 360° screenshot - File screenshotFolder = new File(mc.mcDataDir, "screenshots"); - screenshotFolder.mkdir(); - File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); - - int height = 4 * 4320; - int width = 2 * height; - - int displayWidthBefore = mc.displayWidth; - int displayHeightBefore = mc.displayHeight; - - ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); - - Pipelines.newEquirectangularPipeline(new RenderInfo() { - @Override - public ReadableDimension getFrameSize() { - return new Dimension(width, height); - } - - @Override - public int getTotalFrames() { - return 1; - } - - @Override - public float updateForNextFrame() { - return mc.timer.renderPartialTicks; - } - - @Override - public RenderSettings getRenderSettings() { - return new RenderSettings( - null, null, width, height, 0, 0, null, - true, true, true, true, null, - false, RenderSettings.AntiAliasing.NONE, null, null, false - ); - } - }, new ScreenshotWriter(screenshotFile)).run(); - - clrg.uninstall(); - - // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, - // so we have to reset it to the previous value - mc.resize(displayWidthBefore, displayHeightBefore); - - new GuiUploadScreenshot(ReplayModReplay.instance.getReplayHandler().getOverlay(), mod, screenshotFile).open(); - } catch (OutOfMemoryError e) { - e.printStackTrace(); - CrashReport report = CrashReport.makeCrashReport(e, "Creating Equirectangular Screenshot"); - Minecraft.getMinecraft().crashed(report); + event.setCanceled(true); } } } diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java new file mode 100644 index 00000000..d4512d98 --- /dev/null +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java @@ -0,0 +1,87 @@ +package com.replaymod.extras.advancedscreenshots; + +import com.replaymod.core.ReplayMod; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.gui.GuiRenderSettings; +import com.replaymod.replay.ReplayModReplay; +import de.johni0702.minecraft.gui.container.GuiContainer; +import de.johni0702.minecraft.gui.container.GuiPanel; +import de.johni0702.minecraft.gui.element.GuiLabel; +import de.johni0702.minecraft.gui.layout.GridLayout; +import de.johni0702.minecraft.gui.layout.VerticalLayout; +import net.minecraft.crash.CrashReport; +import net.minecraft.util.ScreenShotHelper; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; + +import java.io.File; +import java.util.ArrayList; + +import static com.replaymod.core.utils.Utils.error; +import static com.replaymod.render.ReplayModRender.LOGGER; + +public class GuiCreateScreenshot extends GuiRenderSettings { + + private final ReplayMod mod; + + public GuiCreateScreenshot(ReplayMod mod) { + super(null, null); + + this.mod = mod; + + resetChildren(settingsList.getListPanel()).addElements(new VerticalLayout.Data(0.5), + new GuiLabel().setI18nText("replaymod.gui.advancedscreenshots.title"), mainPanel, new GuiPanel(), + new GuiLabel().setI18nText("replaymod.gui.rendersettings.advanced"), advancedPanel, new GuiPanel()); + + resetChildren(mainPanel).addElements(new GridLayout.Data(1, 0.5), + new GuiLabel().setI18nText("replaymod.gui.rendersettings.renderer"), renderMethodDropdown, + new GuiLabel().setI18nText("replaymod.gui.advancedscreenshots.resolution"), videoResolutionPanel, + new GuiLabel().setI18nText("replaymod.gui.rendersettings.outputfile"), outputFileButton); + + resetChildren(advancedPanel).addElements(null, nametagCheckbox, new GuiPanel().setLayout( + new GridLayout().setCellsEqualSize(false).setColumns(2).setSpacingX(5).setSpacingY(15)) + .addElements(new GridLayout.Data(0, 0.5), + new GuiLabel().setI18nText("replaymod.gui.rendersettings.stabilizecamera"), stabilizePanel, + chromaKeyingCheckbox, chromaKeyingColor)); + + exportArguments.setText(""); // To disable any preset-based checks + buttonPanel.removeElement(queueButton); + renderButton.setI18nLabel("replaymod.gui.advancedscreenshots.create").onClick(() -> { + // Closing this GUI ensures that settings are saved + getMinecraft().displayGuiScreen(null); + + mod.runLater(() -> { + try { + RenderSettings settings = save(false); + + boolean success = new ScreenshotRenderer(settings).renderScreenshot(); + if (success) { + new GuiUploadScreenshot(ReplayModReplay.instance.getReplayHandler().getOverlay(), mod, + settings).open(); + } + + } catch (Throwable t) { + error(LOGGER, GuiCreateScreenshot.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); + display(); // Re-show the render settings gui and the new error popup + } + }); + }); + } + + private > T resetChildren(T container) { + new ArrayList<>(container.getChildren()).forEach(container::removeElement); + return container; + } + + @Override + protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { + File screenshotFolder = new File(getMinecraft().mcDataDir, "screenshots"); + return ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); + } + + @Override + protected Property getConfigProperty(Configuration configuration) { + return configuration.get("screenshotsettings", "settings", "{}", + "Last state of the screenshot settings GUI. Internal use only."); + } +} \ No newline at end of file diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java index 828d7f65..e2168da5 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java @@ -3,6 +3,7 @@ package com.replaymod.extras.advancedscreenshots; import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; import com.replaymod.extras.Setting; +import com.replaymod.render.RenderSettings; import de.johni0702.minecraft.gui.container.GuiContainer; import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.element.GuiButton; @@ -14,7 +15,6 @@ import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import org.lwjgl.util.ReadableColor; import java.awt.*; -import java.io.File; import java.io.IOException; import java.net.URI; @@ -22,10 +22,10 @@ public class GuiUploadScreenshot extends AbstractGuiPopup { public final ReplayMod mod; - public final File screenshotFile; + public final RenderSettings renderSettings; public final GuiLabel successLabel = new GuiLabel() - .setI18nText("replaymod.gui.advancedscreenshots.finished.description.360") + .setI18nText("replaymod.gui.advancedscreenshots.finished.description") .setColor(ReadableColor.BLACK); public final GuiLabel veerLabel = new GuiLabel() @@ -56,22 +56,30 @@ public class GuiUploadScreenshot extends AbstractGuiPopup { .with(neverOpenLabel, new HorizontalLayout.Data(0.5)) .build(); - public GuiUploadScreenshot(GuiContainer container, ReplayMod mod, File screenshotFile) { + public GuiUploadScreenshot(GuiContainer container, ReplayMod mod, RenderSettings renderSettings) { super(container); this.mod = mod; - this.screenshotFile = screenshotFile; + this.renderSettings = renderSettings; - veerUploadButton.onClick(() -> { - try { - Desktop.getDesktop().browse(URI.create("https://veer.tv/upload")); - } catch (IOException e) { - e.printStackTrace(); - } - }); + boolean veer = renderSettings.getRenderMethod() == RenderSettings.RenderMethod.EQUIRECTANGULAR; + + if (renderSettings.getRenderMethod() == RenderSettings.RenderMethod.EQUIRECTANGULAR) { + successLabel.setI18nText("replaymod.gui.advancedscreenshots.finished.description.360"); + } + + if (veer) { + veerUploadButton.onClick(() -> { + try { + Desktop.getDesktop().browse(URI.create("https://veer.tv/upload")); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } showOnDiskButton.onClick(() -> { try { - Desktop.getDesktop().browse(URI.create("file://" + screenshotFile.getAbsolutePath())); + Desktop.getDesktop().browse(URI.create("file://" + renderSettings.getOutputFile().getAbsolutePath())); } catch (IOException e) { e.printStackTrace(); } @@ -86,10 +94,16 @@ public class GuiUploadScreenshot extends AbstractGuiPopup { close(); }); + popup.addElements(new VerticalLayout.Data(0.5), successLabel); + + if (veer) { + popup.addElements(new VerticalLayout.Data(0.5), + veerLabel, + veerUploadButton); + } + popup.addElements(new VerticalLayout.Data(0.5), successLabel, - veerLabel, - veerUploadButton, showOnDiskButton, closeButton); diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java new file mode 100644 index 00000000..72aad0ac --- /dev/null +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -0,0 +1,65 @@ +package com.replaymod.extras.advancedscreenshots; + +import com.replaymod.render.RenderSettings; +import com.replaymod.render.capturer.RenderInfo; +import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +import com.replaymod.render.rendering.Pipelines; +import lombok.RequiredArgsConstructor; +import net.minecraft.client.Minecraft; +import net.minecraft.crash.CrashReport; +import org.lwjgl.util.Dimension; +import org.lwjgl.util.ReadableDimension; + +@RequiredArgsConstructor +public class ScreenshotRenderer implements RenderInfo { + + private final Minecraft mc = Minecraft.getMinecraft(); + + private final RenderSettings settings; + + public boolean renderScreenshot() throws Throwable { + try { + int displayWidthBefore = mc.displayWidth; + int displayHeightBefore = mc.displayHeight; + + ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); + + Pipelines.newPipeline(settings.getRenderMethod(),this, + new ScreenshotWriter(settings.getOutputFile())).run(); + + clrg.uninstall(); + + mc.resize(displayWidthBefore, displayHeightBefore); + return true; + } catch (OutOfMemoryError e) { + e.printStackTrace(); + CrashReport report = CrashReport.makeCrashReport(e, "Creating Equirectangular Screenshot"); + Minecraft.getMinecraft().crashed(report); + } + return false; + } + + @Override + public ReadableDimension getFrameSize() { + return new Dimension(settings.getVideoWidth(), settings.getVideoHeight()); + } + + @Override + public int getTotalFrames() { + return 1; + } + + @Override + public float updateForNextFrame() { + return mc.timer.renderPartialTicks; + } + + @Override + public RenderSettings getRenderSettings() { + return new RenderSettings( + null, null, settings.getVideoWidth(), settings.getVideoHeight(), 0, 0, null, + true, true, true, true, null, + false, RenderSettings.AntiAliasing.NONE, null, null, false + ); + } +} diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java index f712dd0d..a07f801e 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java @@ -427,7 +427,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { ); } - private File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { + protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { String fileName = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss").format(new Date()); File folder = ReplayModRender.instance.getVideoFolder(); return new File(folder, fileName + "." + encodingPreset.getFileExtension()); @@ -447,7 +447,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable { config.save(); } - private Property getConfigProperty(Configuration configuration) { + protected Property getConfigProperty(Configuration configuration) { return configuration.get("rendersettings", "settings", "{}", "Last state of the render settings GUI. Internal use only."); } From a4a9473111b30d01359b5491b7519093fcf10ef1 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Wed, 1 Nov 2017 15:36:15 +0100 Subject: [PATCH 6/8] Hide GUI when exporting screenshot Workaround not all chunks being loaded in screenshot Fix wrong RenderSettings being exposed in ScreenshotRenderer Update Language submodule --- .../advancedscreenshots/GuiCreateScreenshot.java | 9 ++++++++- .../advancedscreenshots/ScreenshotRenderer.java | 12 ++++++------ .../extras/advancedscreenshots/ScreenshotWriter.java | 3 +++ src/main/resources/assets/replaymod/lang | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java index d4512d98..3ef09234 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java @@ -7,6 +7,7 @@ import com.replaymod.replay.ReplayModReplay; import de.johni0702.minecraft.gui.container.GuiContainer; import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.element.GuiLabel; +import de.johni0702.minecraft.gui.function.Loadable; import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout; import net.minecraft.crash.CrashReport; @@ -20,7 +21,7 @@ import java.util.ArrayList; import static com.replaymod.core.utils.Utils.error; import static com.replaymod.render.ReplayModRender.LOGGER; -public class GuiCreateScreenshot extends GuiRenderSettings { +public class GuiCreateScreenshot extends GuiRenderSettings implements Loadable { private final ReplayMod mod; @@ -73,6 +74,12 @@ public class GuiCreateScreenshot extends GuiRenderSettings { return container; } + @Override + public void load() { + // pause replay when opening this gui + ReplayModReplay.instance.getReplayHandler().getReplaySender().setReplaySpeed(0); + } + @Override protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { File screenshotFolder = new File(getMinecraft().mcDataDir, "screenshots"); diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index 72aad0ac..2133432d 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -22,6 +22,8 @@ public class ScreenshotRenderer implements RenderInfo { int displayWidthBefore = mc.displayWidth; int displayHeightBefore = mc.displayHeight; + boolean hideGUIBefore = mc.gameSettings.hideGUI; + ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); Pipelines.newPipeline(settings.getRenderMethod(),this, @@ -29,6 +31,7 @@ public class ScreenshotRenderer implements RenderInfo { clrg.uninstall(); + mc.gameSettings.hideGUI = hideGUIBefore; mc.resize(displayWidthBefore, displayHeightBefore); return true; } catch (OutOfMemoryError e) { @@ -46,7 +49,8 @@ public class ScreenshotRenderer implements RenderInfo { @Override public int getTotalFrames() { - return 1; + // render 2 frames, because only the second contains all frames fully loaded + return 2; } @Override @@ -56,10 +60,6 @@ public class ScreenshotRenderer implements RenderInfo { @Override public RenderSettings getRenderSettings() { - return new RenderSettings( - null, null, settings.getVideoWidth(), settings.getVideoHeight(), 0, 0, null, - true, true, true, true, null, - false, RenderSettings.AntiAliasing.NONE, null, null, false - ); + return settings; } } diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java index e04d1b59..c601f28f 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java @@ -25,6 +25,9 @@ public class ScreenshotWriter implements FrameConsumer { @Override public void consume(RGBFrame frame) { + // skip the first frame, in which not all chunks are properly loaded + if (frame.getFrameId() == 0) return; + try { final ReadableDimension frameSize = frame.getSize(); diff --git a/src/main/resources/assets/replaymod/lang b/src/main/resources/assets/replaymod/lang index 94282826..75edb999 160000 --- a/src/main/resources/assets/replaymod/lang +++ b/src/main/resources/assets/replaymod/lang @@ -1 +1 @@ -Subproject commit 942828260079edb1e35b2e500d6763c5234f6bbb +Subproject commit 75edb99901404c1364de54352b5ad8b5a21d9536 From 666a3611bbb61a9abdbf268d8dab99192f15e0b4 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Wed, 1 Nov 2017 15:43:49 +0100 Subject: [PATCH 7/8] Actually hide the GUI when exporting a screenshot --- .../replaymod/extras/advancedscreenshots/ScreenshotRenderer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index 2133432d..6fe7af62 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -23,6 +23,7 @@ public class ScreenshotRenderer implements RenderInfo { int displayHeightBefore = mc.displayHeight; boolean hideGUIBefore = mc.gameSettings.hideGUI; + mc.gameSettings.hideGUI = true; ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); From 650cc1036dc233f3f5243b25d02a5977fcb91e59 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Fri, 22 Dec 2017 15:14:20 +0100 Subject: [PATCH 8/8] Fix GuiUploadScreenshot showOnDiskButton crashing the game on Windows --- .../extras/advancedscreenshots/GuiUploadScreenshot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java index e2168da5..4c2cf396 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java @@ -79,7 +79,7 @@ public class GuiUploadScreenshot extends AbstractGuiPopup { showOnDiskButton.onClick(() -> { try { - Desktop.getDesktop().browse(URI.create("file://" + renderSettings.getOutputFile().getAbsolutePath())); + Desktop.getDesktop().browse(renderSettings.getOutputFile().toURI()); } catch (IOException e) { e.printStackTrace(); }