mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-29 08:27:03 +01:00
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": [
|
"client": [
|
||||||
"CancelTileEntityRenderMixin",
|
"CancelTileEntityRenderMixin",
|
||||||
"EntityContraptionInteractionMixin",
|
"EntityContraptionInteractionMixin",
|
||||||
"FixInverseCbrtMixin",
|
"FixNormalScalingMixin",
|
||||||
"FogColorTrackerMixin",
|
"FogColorTrackerMixin",
|
||||||
"HeavyBootsOnPlayerMixin",
|
"HeavyBootsOnPlayerMixin",
|
||||||
"LightUpdateMixin",
|
"LightUpdateMixin",
|
||||||
|
|
Loading…
Reference in a new issue