Properly handle OOMExceptions when creating a 360° screenshot
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user