Files
ReplayModCinematic/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java
2019-03-13 16:07:32 +01:00

100 lines
3.2 KiB
Java

package com.replaymod.extras.advancedscreenshots;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings;
import com.replaymod.render.blend.BlendState;
import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.rendering.Pipelines;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport;
//#if MC>=10800
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
//#endif
@RequiredArgsConstructor
public class ScreenshotRenderer implements RenderInfo {
private final Minecraft mc = MCVer.getMinecraft();
private final RenderSettings settings;
private int framesDone;
public boolean renderScreenshot() throws Throwable {
try {
//#if MC>=11300
int displayWidthBefore = mc.mainWindow.framebufferWidth;
int displayHeightBefore = mc.mainWindow.framebufferHeight;
//#else
//$$ int displayWidthBefore = mc.displayWidth;
//$$ int displayHeightBefore = mc.displayHeight;
//#endif
boolean hideGUIBefore = mc.gameSettings.hideGUI;
mc.gameSettings.hideGUI = true;
//#if MC>=10800
ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.renderGlobal);
//#endif
if (settings.getRenderMethod() == RenderSettings.RenderMethod.BLEND) {
BlendState.setState(new BlendState(settings.getOutputFile()));
Pipelines.newBlendPipeline(this).run();
} else {
Pipelines.newPipeline(settings.getRenderMethod(), this,
new ScreenshotWriter(settings.getOutputFile())).run();
}
//#if MC>=10800
clrg.uninstall();
//#endif
mc.gameSettings.hideGUI = hideGUIBefore;
//#if MC>=11300
mc.mainWindow.framebufferWidth = displayWidthBefore;
mc.mainWindow.framebufferHeight = displayHeightBefore;
mc.getFramebuffer().createBindFramebuffer(displayWidthBefore, displayHeightBefore);
//#else
//$$ mc.resize(displayWidthBefore, displayHeightBefore);
//#endif
return true;
} catch (OutOfMemoryError e) {
e.printStackTrace();
CrashReport report = CrashReport.makeCrashReport(e, "Creating Equirectangular Screenshot");
MCVer.getMinecraft().crashed(report);
}
return false;
}
@Override
public ReadableDimension getFrameSize() {
return new Dimension(settings.getVideoWidth(), settings.getVideoHeight());
}
@Override
public int getFramesDone() {
return framesDone;
}
@Override
public int getTotalFrames() {
// render 2 frames, because only the second contains all frames fully loaded
return 2;
}
@Override
public float updateForNextFrame() {
framesDone++;
return mc.timer.renderPartialTicks;
}
@Override
public RenderSettings getRenderSettings() {
return settings;
}
}