Properly handle OOMExceptions when creating a 360° screenshot

This commit is contained in:
CrushedPixel
2017-10-31 17:28:21 +01:00
parent 98098ea2ed
commit 7d380e770a
2 changed files with 48 additions and 36 deletions

View File

@@ -11,6 +11,7 @@ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiControls; import net.minecraft.client.gui.GuiControls;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.crash.CrashReport;
import net.minecraft.util.ScreenShotHelper; import net.minecraft.util.ScreenShotHelper;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@@ -51,51 +52,57 @@ public class AdvancedScreenshots implements Extra {
} }
private void createEquirectangularScreenshot() { private void createEquirectangularScreenshot() {
// take 360° screenshot try {
File screenshotFolder = new File(mc.mcDataDir, "screenshots"); // take 360° screenshot
screenshotFolder.mkdir(); File screenshotFolder = new File(mc.mcDataDir, "screenshots");
File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder); screenshotFolder.mkdir();
File screenshotFile = ScreenShotHelper.getTimestampedPNGFileForDirectory(screenshotFolder);
int width = 8640; int height = 4 * 4320;
int height = 4320; int width = 2 * height;
int displayWidthBefore = mc.displayWidth; int displayWidthBefore = mc.displayWidth;
int displayHeightBefore = mc.displayHeight; int displayHeightBefore = mc.displayHeight;
ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal); ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal);
Pipelines.newEquirectangularPipeline(new RenderInfo() { Pipelines.newEquirectangularPipeline(new RenderInfo() {
@Override @Override
public ReadableDimension getFrameSize() { public ReadableDimension getFrameSize() {
return new Dimension(width, height); return new Dimension(width, height);
} }
@Override @Override
public int getTotalFrames() { public int getTotalFrames() {
return 1; return 1;
} }
@Override @Override
public float updateForNextFrame() { public float updateForNextFrame() {
return mc.timer.renderPartialTicks; return mc.timer.renderPartialTicks;
} }
@Override @Override
public RenderSettings getRenderSettings() { public RenderSettings getRenderSettings() {
return new RenderSettings( return new RenderSettings(
null, null, width, height, 0, 0, null, null, null, width, height, 0, 0, null,
true, true, true, true, null, true, true, true, true, null,
false, RenderSettings.AntiAliasing.NONE, null, null, false false, RenderSettings.AntiAliasing.NONE, null, null, false
); );
} }
}, new ScreenshotWriter(screenshotFile)).run(); }, new ScreenshotWriter(screenshotFile)).run();
clrg.uninstall(); clrg.uninstall();
// the Equirectangular rendering changes mc.displayWidth and mc.displayHeight, // the Equirectangular rendering changes mc.displayWidth and mc.displayHeight,
// so we have to reset it to the previous value // so we have to reset it to the previous value
mc.resize(displayWidthBefore, displayHeightBefore); 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);
}
} }
} }

View File

@@ -6,6 +6,7 @@ import com.replaymod.extras.ReplayModExtras;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.render.rendering.FrameConsumer;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadableDimension;
@@ -40,6 +41,10 @@ public class ScreenshotWriter implements FrameConsumer<RGBFrame> {
} }
ImageIO.write(img, "PNG", outputFile); ImageIO.write(img, "PNG", outputFile);
} catch (OutOfMemoryError e) {
e.printStackTrace();
CrashReport report = CrashReport.makeCrashReport(e, "Exporting frame");
Minecraft.getMinecraft().crashed(report);
} catch (Throwable t) { } catch (Throwable t) {
CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame"); CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame");