Improve normal scaling fix
This commit is contained in:
parent
e05db3cd76
commit
b10ceaf63d
3 changed files with 37 additions and 33 deletions
|
@ -1,32 +0,0 @@
|
|||
package com.simibubi.create.foundation.mixin;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
/**
|
||||
* Vanilla's fast inverse cube root function returns nonsensical results for negative
|
||||
* numbers, which results in incorrect vertex normal scaling. By negating the input
|
||||
* and output accordingly, this issue can be prevented.
|
||||
*/
|
||||
@Mixin(MathHelper.class)
|
||||
public class FixInverseCbrtMixin {
|
||||
@ModifyVariable(at = @At("HEAD"), method = "fastInverseCbrt(F)F")
|
||||
private static float negateAtHead(float input) {
|
||||
if (input < 0) {
|
||||
input *= -1;
|
||||
}
|
||||
return input;
|
||||
}
|
||||
|
||||
@Inject(at = @At("TAIL"), method = "fastInverseCbrt(F)F", cancellable = true)
|
||||
private static void negateAtTail(float input, CallbackInfoReturnable<Float> cir) {
|
||||
if (input < 0) {
|
||||
cir.setReturnValue(cir.getReturnValueF() * -1);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.simibubi.create.foundation.mixin;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.At.Shift;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
|
||||
@Mixin(MatrixStack.class)
|
||||
public class FixNormalScalingMixin {
|
||||
/**
|
||||
* Minecraft negates the normal matrix if all scales are equal and negative, but
|
||||
* does not return afterward. This allows the rest of the method's logic to be
|
||||
* applied, which negates the matrix again, resulting in the matrix being the
|
||||
* same as in the beginning.
|
||||
*/
|
||||
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/vector/Matrix3f;multiply(F)V", shift = Shift.AFTER), method = "scale(FFF)V", cancellable = true)
|
||||
private void returnAfterNegate(float x, float y, float z, CallbackInfo ci) {
|
||||
ci.cancel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Minecraft takes the inverse cube root of the product of all scales to provide a
|
||||
* rough estimate for normalization so that it does not need to be done later. It
|
||||
* does not make sense for this "normalization factor" to be negative though, as
|
||||
* that would invert all normals. Additionally, Minecraft's fastInverseCbrt method
|
||||
* does not work for negative numbers.
|
||||
*/
|
||||
@ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;fastInverseCbrt(F)F"), method = "scale(FFF)V")
|
||||
private float absInvCbrtInput(float input) {
|
||||
return Math.abs(input);
|
||||
}
|
||||
}
|
|
@ -9,7 +9,7 @@
|
|||
"client": [
|
||||
"CancelTileEntityRenderMixin",
|
||||
"EntityContraptionInteractionMixin",
|
||||
"FixInverseCbrtMixin",
|
||||
"FixNormalScalingMixin",
|
||||
"FogColorTrackerMixin",
|
||||
"HeavyBootsOnPlayerMixin",
|
||||
"LightUpdateMixin",
|
||||
|
|
Loading…
Reference in a new issue