44 lines
2.2 KiB
Java
44 lines
2.2 KiB
Java
package fr.adrien1106.reframed.client.model;
|
|
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
|
|
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView;
|
|
import net.minecraft.client.texture.Sprite;
|
|
import net.minecraft.util.math.MathHelper;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public record QuadUvBounds(float minU, float maxU, float minV, float maxV) {
|
|
public static QuadUvBounds read(QuadView quad) {
|
|
float u0 = quad.u(0), u1 = quad.u(1), u2 = quad.u(2), u3 = quad.u(3);
|
|
float v0 = quad.v(0), v1 = quad.v(1), v2 = quad.v(2), v3 = quad.v(3);
|
|
return new QuadUvBounds(
|
|
Math.min(Math.min(u0, u1), Math.min(u2, u3)),
|
|
Math.max(Math.max(u0, u1), Math.max(u2, u3)),
|
|
Math.min(Math.min(v0, v1), Math.min(v2, v3)),
|
|
Math.max(Math.max(v0, v1), Math.max(v2, v3))
|
|
);
|
|
}
|
|
|
|
boolean displaysSprite(Sprite sprite) {
|
|
return sprite.getMinU() <= minU && sprite.getMaxU() >= maxU && sprite.getMinV() <= minV && sprite.getMaxV() >= maxV;
|
|
}
|
|
|
|
void normalizeUv(MutableQuadView quad, Sprite sprite) {
|
|
float remappedMinU = norm(minU, sprite.getMinU(), sprite.getMaxU());
|
|
float remappedMaxU = norm(maxU, sprite.getMinU(), sprite.getMaxU());
|
|
float remappedMinV = norm(minV, sprite.getMinV(), sprite.getMaxV());
|
|
float remappedMaxV = norm(maxV, sprite.getMinV(), sprite.getMaxV());
|
|
quad.uv(0, MathHelper.approximatelyEquals(quad.u(0), minU) ? remappedMinU : remappedMaxU, MathHelper.approximatelyEquals(quad.v(0), minV) ? remappedMinV : remappedMaxV);
|
|
quad.uv(1, MathHelper.approximatelyEquals(quad.u(1), minU) ? remappedMinU : remappedMaxU, MathHelper.approximatelyEquals(quad.v(1), minV) ? remappedMinV : remappedMaxV);
|
|
quad.uv(2, MathHelper.approximatelyEquals(quad.u(2), minU) ? remappedMinU : remappedMaxU, MathHelper.approximatelyEquals(quad.v(2), minV) ? remappedMinV : remappedMaxV);
|
|
quad.uv(3, MathHelper.approximatelyEquals(quad.u(3), minU) ? remappedMinU : remappedMaxU, MathHelper.approximatelyEquals(quad.v(3), minV) ? remappedMinV : remappedMaxV);
|
|
}
|
|
|
|
static float norm(float value, float low, float high) {
|
|
float value2 = MathHelper.clamp(value, low, high);
|
|
return (value2 - low) / (high - low);
|
|
}
|
|
|
|
}
|