Add Optifine compatibility to rendering by disabling their separate chunk loading queue

Add compatibility to shaders that utilize the Shadow Map by manually setting displayListEntitiesDirty to false
Call Shaders.beginRender in an Event Handler to avoid calling all of EntityRenderer#renderWorld
This commit is contained in:
CrushedPixel
2016-11-09 04:28:56 +01:00
committed by johni0702
parent 3a28c5ba6f
commit e5eb982b98
10 changed files with 270 additions and 47 deletions

View File

@@ -1,52 +1,28 @@
package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.lang.reflect.Field;
@Mixin(EntityRenderer.class)
public abstract class MixinShaderEntityRenderer {
@Shadow
public Minecraft mc;
@Inject(method = "renderWorldPass", at = @At("HEAD"))
private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) {
if (ReplayModReplay.instance.getReplayHandler() == null) return;
if (ShaderReflection.shaders_frameTimeCounter == null) return;
private static Field replayModCompat_frameTimeCounterField = null;
static {
replayModCompat_initFrameTimeCounterField();
}
private static void replayModCompat_initFrameTimeCounterField() {
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();
float timestamp = replayHandler.getReplaySender().currentTimeStamp() / 1000f % 3600f;
try {
replayModCompat_frameTimeCounterField = Class.forName("shadersmod.client.Shaders")
.getDeclaredField("frameTimeCounter");
replayModCompat_frameTimeCounterField.setAccessible(true);
} catch (ClassNotFoundException ignore) {
// no shaders mod installed
} catch (NoSuchFieldException e) {
// the field wasn't found. Has it been renamed?
ShaderReflection.shaders_frameTimeCounter.set(null, timestamp);
} catch (Exception e) {
e.printStackTrace();
}
}
@Inject(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;enableDepth()V"))
private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) {
if (replayModCompat_frameTimeCounterField != null) {
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();
float timestamp = replayHandler.getReplaySender().currentTimeStamp() / 1000f % 3600f;
try {
replayModCompat_frameTimeCounterField.set(null, timestamp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}