VulkanShader_1.21.10-0.0.4-alpha.jar
Download file
package net.vulkanmod.mixin.texture.mip;
import net.minecraft.class_1011;
import net.minecraft.class_4725;
import net.vulkanmod.mixin.texture.image.NativeImageAccessor;
import org.lwjgl.system.MemoryUtil;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
@Mixin({class_4725.class})
public abstract class MipmapGeneratorM {
private static final int ALPHA_CUTOFF = 50;
@Shadow
private static float method_24099(int i) {
return 0.0F;
}
@Overwrite
public static class_1011[] method_24102(class_1011[] nativeImages, int i) {
if (i + 1 <= nativeImages.length) {
return nativeImages;
} else {
class_1011[] nativeImages2 = new class_1011[i + 1];
nativeImages2[0] = nativeImages[0];
long srcPtr = ((NativeImageAccessor)nativeImages2[0]).getPixels();
boolean bl = hasTransparentPixel(srcPtr, nativeImages2[0].method_4307(), nativeImages2[0].method_4323());
if (bl) {
int avg = calculateAverage(nativeImages2[0]);
avg &= 16777215;
class_1011 nativeImage = nativeImages2[0];
int width = nativeImage.method_4307();
int height = nativeImage.method_4323();
for(int m = 0; m < width; ++m) {
for(int n = 0; n < height; ++n) {
int p0 = MemoryUtil.memGetInt(srcPtr + ((long)m + (long)n * (long)width) * 4L);
boolean b0 = (p0 >> 24 & 255) >= 50;
p0 = b0 ? p0 : avg | p0 & -16777216;
MemoryUtil.memPutInt(srcPtr + ((long)m + (long)n * (long)width) * 4L, p0);
}
}
}
for(int j = 1; j <= i; ++j) {
if (j < nativeImages.length) {
nativeImages2[j] = nativeImages[j];
} else {
class_1011 nativeImage = nativeImages2[j - 1];
class_1011 nativeImage2 = new class_1011(nativeImage.method_4307() >> 1, nativeImage.method_4323() >> 1, false);
int width = nativeImage2.method_4307();
int height = nativeImage2.method_4323();
srcPtr = ((NativeImageAccessor)nativeImage).getPixels();
long dstPtr = ((NativeImageAccessor)nativeImage2).getPixels();
int width2 = width * 2;
for(int m = 0; m < width; ++m) {
for(int n = 0; n < height; ++n) {
int p0 = MemoryUtil.memGetInt(srcPtr + (long)(m * 2 + 0 + (n * 2 + 0) * width2) * 4L);
int p1 = MemoryUtil.memGetInt(srcPtr + (long)(m * 2 + 1 + (n * 2 + 0) * width2) * 4L);
int p2 = MemoryUtil.memGetInt(srcPtr + (long)(m * 2 + 0 + (n * 2 + 1) * width2) * 4L);
int p3 = MemoryUtil.memGetInt(srcPtr + (long)(m * 2 + 1 + (n * 2 + 1) * width2) * 4L);
int outColor = blend(p0, p1, p2, p3);
MemoryUtil.memPutInt(dstPtr + ((long)m + (long)n * (long)width) * 4L, outColor);
}
}
nativeImages2[j] = nativeImage2;
}
}
return nativeImages2;
}
}
private static boolean hasTransparentPixel(long ptr, int width, int height) {
for(int i = 0; i < width; ++i) {
for(int j = 0; j < height; ++j) {
if (getPixelA(MemoryUtil.memGetInt(ptr + (long)(i + j * width) * 4L)) == 0) {
return true;
}
}
}
return false;
}
private static int blend(int p0, int p1, int p2, int p3) {
int a = gammaBlend(p0, p1, p2, p3, 24);
int b = gammaBlend(p0, p1, p2, p3, 16);
int g = gammaBlend(p0, p1, p2, p3, 8);
int r = gammaBlend(p0, p1, p2, p3, 0);
return a << 24 | b << 16 | g << 8 | r;
}
private static int getMax(int i0, int i1, int i2, int i3) {
return Math.max(Math.max(Math.max(i0, i1), i2), i3);
}
private static int gammaBlend(int i, int j, int k, int l, int m) {
float f = method_24099(i >> m);
float g = method_24099(j >> m);
float h = method_24099(k >> m);
float n = method_24099(l >> m);
float o = (float)((double)((float)Math.pow((double)(f + g + h + n) * (double)0.25F, 0.45454545454545453)));
return (int)((double)o * (double)255.0F);
}
private static int getPixelA(int rgba) {
return rgba >> 24;
}
private static int calculateAverage(class_1011 nativeImage) {
int width = nativeImage.method_4307();
int height = nativeImage.method_4323();
int[] values = new int[width * height];
int count = 0;
long srcPtr = ((NativeImageAccessor)nativeImage).getPixels();
for(int i = 0; i < width; ++i) {
for(int j = 0; j < height; ++j) {
int value = MemoryUtil.memGetInt(srcPtr + ((long)i + (long)j * (long)width) * 4L);
if ((value >> 24 & 255) > 0) {
values[count] = value;
++count;
}
}
}
int sumR = 0;
int sumG = 0;
int sumB = 0;
for(int i = 0; i < count; ++i) {
sumR += values[i] & 255;
sumG += values[i] >> 8 & 255;
sumB += values[i] >> 16 & 255;
}
if (count == 0) {
return 0;
} else {
sumR /= count;
sumG /= count;
sumB /= count;
return sumR & 255 | (sumG & 255) << 8 | (sumB & 255) << 16 | -16777216;
}
}
}
Download file