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 com.replaymod.render.hooks.EntityRendererHandler;
|
||||||
import net.minecraft.client.render.GameRenderer;
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import net.minecraft.util.math.Matrix4f;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||||
|
|
||||||
@Mixin(GameRenderer.class)
|
@Mixin(GameRenderer.class)
|
||||||
public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer {
|
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 static final String METHOD = "getBasicProjectionMatrix";
|
||||||
private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) {
|
private static final String TARGET = "Lnet/minecraft/util/math/Matrix4f;viewboxMatrix(DFFF)Lnet/minecraft/util/math/Matrix4f;";
|
||||||
return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
|
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) {
|
@ModifyArg(method = METHOD, at = @At(value = "INVOKE", target = TARGET, remap = TARGET_REMAP), index = 1)
|
||||||
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
|
private float replayModRender_perspective_aspect(float aspect) {
|
||||||
fovY = 90;
|
return isOmnidirectional() ? 1 : aspect;
|
||||||
aspect = 1;
|
|
||||||
}
|
}
|
||||||
return Matrix4f.viewboxMatrix(fovY, aspect, zNear, zFar);
|
|
||||||
|
@Unique
|
||||||
|
private boolean isOmnidirectional() {
|
||||||
|
return replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user