Implement ODS rendering via Iris Shader for MC 1.17

This commit is contained in:
Jonas Herzig
2021-06-29 17:57:11 +02:00
parent f462a5b391
commit 7ab2edd738
12 changed files with 333 additions and 6 deletions

View File

@@ -0,0 +1,27 @@
//#if MC>=11600
package com.replaymod.render.mixin;
import com.replaymod.render.capturer.IrisODSFrameCapturer;
import net.coderbot.iris.gl.uniform.UniformHolder;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.uniforms.CommonUniforms;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
@Pseudo
@Mixin(value = CommonUniforms.class, remap = false)
public class Mixin_AddIrisOdsShaderUniforms {
// Using ModifyVariable, so we only depend on a single argument. Hoping that reduces the chance of breaking changes.
@ModifyVariable(method = "generalCommonUniforms", at = @At("HEAD"), argsOnly = true)
private static UniformHolder addReplayModOdsUniforms(UniformHolder uniforms) {
IrisODSFrameCapturer ods = IrisODSFrameCapturer.INSTANCE;
if (ods != null) {
uniforms.uniform1b(UniformUpdateFrequency.PER_FRAME, "leftEye", ods::isLeftEye);
uniforms.uniform1i(UniformUpdateFrequency.PER_FRAME, "direction", ods::getDirection);
}
return uniforms;
}
}
//#endif

View File

@@ -0,0 +1,29 @@
//#if MC>=11600
package com.replaymod.render.mixin;
import com.replaymod.render.capturer.IrisODSFrameCapturer;
import net.coderbot.iris.Iris;
import net.fabricmc.loader.api.FabricLoader;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import java.nio.file.Path;
@Pseudo
@Mixin(value = Iris.class, remap = false)
public class Mixin_LoadIrisOdsShaderPack {
@Redirect(method = "loadExternalShaderpack", at = @At(value = "FIELD", opcode = Opcodes.GETSTATIC, target = "Lnet/coderbot/iris/Iris;SHADERPACKS_DIRECTORY:Ljava/nio/file/Path;"))
private static Path loadReplayModOdsPack(String name) {
if (IrisODSFrameCapturer.INSTANCE != null && IrisODSFrameCapturer.SHADER_PACK_NAME.equals(name)) {
return FabricLoader.getInstance().getModContainer("replaymod")
.orElseThrow(() -> new RuntimeException("Failed to get mod container for ReplayMod"))
.getRootPath();
} else {
return Iris.SHADERPACKS_DIRECTORY;
}
}
}
//#endif