Automatically disable and re-enable Optifine's Fast Render setting before rendering a video
This commit is contained in:
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user