From 7d380e770a0c884def0e2b45fcf31c5e085e728d Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Tue, 31 Oct 2017 17:28:21 +0100 Subject: [PATCH] =?UTF-8?q?Properly=20handle=20OOMExceptions=20when=20crea?= =?UTF-8?q?ting=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");