Automatically disable and re-enable Optifine's Fast Render setting before rendering a video

This commit is contained in:
CrushedPixel
2016-11-28 23:21:20 +01:00
committed by johni0702
parent 1fef12d2bd
commit 030c71c868
5 changed files with 97 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
package com.replaymod.compat; package com.replaymod.compat;
import com.replaymod.compat.optifine.DisableFastRender;
import com.replaymod.compat.shaders.ShaderBeginRender; import com.replaymod.compat.shaders.ShaderBeginRender;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLCommonHandler;
@@ -18,6 +19,7 @@ public class ReplayModCompat {
public void init(FMLInitializationEvent event) { public void init(FMLInitializationEvent event) {
EventBus bus = FMLCommonHandler.instance().bus(); EventBus bus = FMLCommonHandler.instance().bus();
bus.register(new ShaderBeginRender()); bus.register(new ShaderBeginRender());
bus.register(new DisableFastRender());
} }
} }

View File

@@ -0,0 +1,37 @@
package com.replaymod.compat.optifine;
import com.replaymod.render.events.ReplayRenderEvent;
import net.minecraft.client.Minecraft;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
public class DisableFastRender {
private final Minecraft mc = Minecraft.getMinecraft();
private boolean wasFastRender = false;
@SubscribeEvent
public void onRenderBegin(ReplayRenderEvent.Pre event) {
if (!FMLClientHandler.instance().hasOptifine()) return;
try {
wasFastRender = (boolean) OptifineReflection.gameSettings_ofFastRender.get(mc.gameSettings);
OptifineReflection.gameSettings_ofFastRender.set(mc.gameSettings, false);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@SubscribeEvent
public void onRenderEnd(ReplayRenderEvent.Post event){
if (!FMLClientHandler.instance().hasOptifine()) return;
try {
OptifineReflection.gameSettings_ofFastRender.set(mc.gameSettings, wasFastRender);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,27 @@
package com.replaymod.compat.optifine;
import net.minecraft.client.settings.GameSettings;
import java.lang.reflect.Field;
public class OptifineReflection {
// GameSettings.ofFastRender
public static Field gameSettings_ofFastRender;
static {
try {
// this throws an ignored ClassNotFoundException if Optifine isn't installed
Class.forName("Config");
gameSettings_ofFastRender = GameSettings.class.getDeclaredField("ofFastRender");
gameSettings_ofFastRender.setAccessible(true);
} catch (ClassNotFoundException ignore) {
// no optifine installed
} catch (NoSuchFieldException e) {
// the field wasn't found. Has it been renamed?
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,24 @@
package com.replaymod.render.events;
import com.replaymod.render.rendering.VideoRenderer;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.minecraftforge.fml.common.eventhandler.Event;
@RequiredArgsConstructor
public abstract class ReplayRenderEvent extends Event {
@Getter
private final VideoRenderer videoRenderer;
public static class Pre extends ReplayRenderEvent {
public Pre(VideoRenderer videoRenderer) {
super(videoRenderer);
}
}
public static class Post extends ReplayRenderEvent {
public Post(VideoRenderer videoRenderer) {
super(videoRenderer);
}
}
}

View File

@@ -7,6 +7,7 @@ import com.replaymod.render.RenderSettings;
import com.replaymod.render.ReplayModRender; import com.replaymod.render.ReplayModRender;
import com.replaymod.render.VideoWriter; import com.replaymod.render.VideoWriter;
import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.RenderInfo;
import com.replaymod.render.events.ReplayRenderEvent;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.gui.GuiVideoRenderer;
@@ -22,6 +23,7 @@ import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Framebuffer;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.input.Mouse; import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display; import org.lwjgl.opengl.Display;
import org.lwjgl.util.Dimension; import org.lwjgl.util.Dimension;
@@ -86,6 +88,8 @@ public class VideoRenderer implements RenderInfo {
* @return {@code true} if rendering was successful, {@code false} if the user aborted rendering (or the window was closed) * @return {@code true} if rendering was successful, {@code false} if the user aborted rendering (or the window was closed)
*/ */
public boolean renderVideo() { public boolean renderVideo() {
FMLCommonHandler.instance().bus().post(new ReplayRenderEvent.Pre(this));
setup(); setup();
// Because this might take some time to prepare we'll render the GUI at least once to not confuse the user // Because this might take some time to prepare we'll render the GUI at least once to not confuse the user
@@ -129,6 +133,9 @@ public class VideoRenderer implements RenderInfo {
} }
finish(); finish();
FMLCommonHandler.instance().bus().post(new ReplayRenderEvent.Post(this));
return !cancelled; return !cancelled;
} }