Replace projection matrix Redirect with ModifyArg
Should be better for compatibility because multiple mods can ModifyArg but only one can Redirect, and will be easier to port to 1.19.3.
This commit is contained in:
@@ -2,23 +2,30 @@ package com.replaymod.render.mixin;
|
||||
|
||||
import com.replaymod.render.hooks.EntityRendererHandler;
|
||||
import net.minecraft.client.render.GameRenderer;
|
||||
import net.minecraft.util.math.Matrix4f;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||
|
||||
@Mixin(GameRenderer.class)
|
||||
public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer {
|
||||
@Redirect(method = "getBasicProjectionMatrix", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Matrix4f;viewboxMatrix(DFFF)Lnet/minecraft/util/math/Matrix4f;"))
|
||||
private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) {
|
||||
return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
|
||||
private static final String METHOD = "getBasicProjectionMatrix";
|
||||
private static final String TARGET = "Lnet/minecraft/util/math/Matrix4f;viewboxMatrix(DFFF)Lnet/minecraft/util/math/Matrix4f;";
|
||||
private static final boolean TARGET_REMAP = true;
|
||||
private static final float OMNIDIRECTIONAL_FOV = 90;
|
||||
|
||||
@ModifyArg(method = METHOD, at = @At(value = "INVOKE", target = TARGET, remap = TARGET_REMAP), index = 0)
|
||||
private double replayModRender_perspective_fov(double fovY) {
|
||||
return isOmnidirectional() ? OMNIDIRECTIONAL_FOV : fovY;
|
||||
}
|
||||
|
||||
private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) {
|
||||
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
|
||||
fovY = 90;
|
||||
aspect = 1;
|
||||
}
|
||||
return Matrix4f.viewboxMatrix(fovY, aspect, zNear, zFar);
|
||||
@ModifyArg(method = METHOD, at = @At(value = "INVOKE", target = TARGET, remap = TARGET_REMAP), index = 1)
|
||||
private float replayModRender_perspective_aspect(float aspect) {
|
||||
return isOmnidirectional() ? 1 : aspect;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private boolean isOmnidirectional() {
|
||||
return replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user