Change mipping
This commit is contained in:
@@ -252,10 +252,10 @@ public class ModelManager {
|
|||||||
boolean needsAlphaDiscard = ((float)writeCount)/area<0.9;//If the amount of area covered by written pixels is less than a threashold, disable discard as its not needed
|
boolean needsAlphaDiscard = ((float)writeCount)/area<0.9;//If the amount of area covered by written pixels is less than a threashold, disable discard as its not needed
|
||||||
|
|
||||||
needsAlphaDiscard |= blockRenderLayer != RenderLayer.getSolid();
|
needsAlphaDiscard |= blockRenderLayer != RenderLayer.getSolid();
|
||||||
|
needsAlphaDiscard &= blockRenderLayer != RenderLayer.getTranslucent();//Translucent doesnt have alpha discard
|
||||||
faceModelData |= needsAlphaDiscard?1<<22:0;
|
faceModelData |= needsAlphaDiscard?1<<22:0;
|
||||||
|
|
||||||
faceModelData |= (!faceCoversFullBlock)?1<<23:0;
|
faceModelData |= ((!faceCoversFullBlock)&&blockRenderLayer != RenderLayer.getTranslucent())?1<<23:0;//Alpha discard override, translucency doesnt have alpha discard
|
||||||
|
|
||||||
MemoryUtil.memPutInt(faceUploadPtr, faceModelData);
|
MemoryUtil.memPutInt(faceUploadPtr, faceModelData);
|
||||||
}
|
}
|
||||||
@@ -296,7 +296,7 @@ public class ModelManager {
|
|||||||
|
|
||||||
this.putTextures(modelId, textureData);
|
this.putTextures(modelId, textureData);
|
||||||
|
|
||||||
glGenerateTextureMipmap(this.textures.id);
|
//glGenerateTextureMipmap(this.textures.id);
|
||||||
return modelId;
|
return modelId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -517,6 +517,7 @@ public class ModelManager {
|
|||||||
private void putTextures(int id, ColourDepthTextureData[] textures) {
|
private void putTextures(int id, ColourDepthTextureData[] textures) {
|
||||||
int X = (id&0xFF) * this.modelTextureSize*3;
|
int X = (id&0xFF) * this.modelTextureSize*3;
|
||||||
int Y = ((id>>8)&0xFF) * this.modelTextureSize*2;
|
int Y = ((id>>8)&0xFF) * this.modelTextureSize*2;
|
||||||
|
|
||||||
for (int subTex = 0; subTex < 6; subTex++) {
|
for (int subTex = 0; subTex < 6; subTex++) {
|
||||||
int x = X + (subTex%3)*this.modelTextureSize;
|
int x = X + (subTex%3)*this.modelTextureSize;
|
||||||
int y = Y + (subTex/3)*this.modelTextureSize;
|
int y = Y + (subTex/3)*this.modelTextureSize;
|
||||||
@@ -525,7 +526,25 @@ public class ModelManager {
|
|||||||
GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_PIXELS, 0);
|
GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_PIXELS, 0);
|
||||||
GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_ROWS, 0);
|
GlStateManager._pixelStore(GlConst.GL_UNPACK_SKIP_ROWS, 0);
|
||||||
GlStateManager._pixelStore(GlConst.GL_UNPACK_ALIGNMENT, 4);
|
GlStateManager._pixelStore(GlConst.GL_UNPACK_ALIGNMENT, 4);
|
||||||
glTextureSubImage2D(this.textures.id, 0, x, y, this.modelTextureSize, this.modelTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, textures[subTex].colour());
|
var current = textures[subTex].colour();
|
||||||
|
var next = new int[current.length>>1];
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
glTextureSubImage2D(this.textures.id, i, x>>i, y>>i, this.modelTextureSize>>i, this.modelTextureSize>>i, GL_RGBA, GL_UNSIGNED_BYTE, current);
|
||||||
|
|
||||||
|
int size = this.modelTextureSize>>(i+1);
|
||||||
|
for (int pX = 0; pX < size; pX++) {
|
||||||
|
for (int pY = 0; pY < size; pY++) {
|
||||||
|
int C00 = current[(pY*2)*size+pX*2];
|
||||||
|
int C01 = current[(pY*2+1)*size+pX*2];
|
||||||
|
int C10 = current[(pY*2)*size+pX*2+1];
|
||||||
|
int C11 = current[(pY*2+1)*size+pX*2+1];
|
||||||
|
next[pY*size+pX] = TextureUtils.mipColours(C00, C01, C10, C11);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
current = next;
|
||||||
|
next = new int[current.length>>1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
package me.cortex.zenith.client.core.model;
|
package me.cortex.zenith.client.core.model;
|
||||||
|
|
||||||
|
import me.jellysquid.mods.sodium.client.util.color.ColorSRGB;
|
||||||
|
import net.minecraft.util.math.ColorHelper;
|
||||||
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
//Texturing utils to manipulate data from the model bakery
|
//Texturing utils to manipulate data from the model bakery
|
||||||
@@ -158,4 +163,58 @@ public class TextureUtils {
|
|||||||
|
|
||||||
return new int[]{minX, maxX, minY, maxY};
|
return new int[]{minX, maxX, minY, maxY};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static int mipColours(int one, int two, int three, int four) {
|
||||||
|
return weightedAverageColor(weightedAverageColor(one, two), weightedAverageColor(three, four));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int weightedAverageColor(int one, int two) {
|
||||||
|
int alphaOne = ColorHelper.Abgr.getAlpha(one);
|
||||||
|
int alphaTwo = ColorHelper.Abgr.getAlpha(two);
|
||||||
|
if (alphaOne == alphaTwo) {
|
||||||
|
return averageRgb(one, two, alphaOne);
|
||||||
|
} else if (alphaOne == 0) {
|
||||||
|
return two & 16777215 | alphaTwo >> 2 << 24;
|
||||||
|
} else if (alphaTwo == 0) {
|
||||||
|
return one & 16777215 | alphaOne >> 2 << 24;
|
||||||
|
} else {
|
||||||
|
float scale = 1.0F / (float)(alphaOne + alphaTwo);
|
||||||
|
float relativeWeightOne = (float)alphaOne * scale;
|
||||||
|
float relativeWeightTwo = (float)alphaTwo * scale;
|
||||||
|
float oneR = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getRed(one)) * relativeWeightOne;
|
||||||
|
float oneG = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getGreen(one)) * relativeWeightOne;
|
||||||
|
float oneB = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getBlue(one)) * relativeWeightOne;
|
||||||
|
float twoR = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getRed(two)) * relativeWeightTwo;
|
||||||
|
float twoG = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getGreen(two)) * relativeWeightTwo;
|
||||||
|
float twoB = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getBlue(two)) * relativeWeightTwo;
|
||||||
|
float linearR = oneR + twoR;
|
||||||
|
float linearG = oneG + twoG;
|
||||||
|
float linearB = oneB + twoB;
|
||||||
|
int averageAlpha = alphaOne + alphaTwo >> 1;
|
||||||
|
return ColorSRGB.linearToSrgb(linearR, linearG, linearB, averageAlpha);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int averageRgb(int a, int b, int alpha) {
|
||||||
|
float ar = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getRed(a));
|
||||||
|
float ag = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getGreen(a));
|
||||||
|
float ab = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getBlue(a));
|
||||||
|
float br = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getRed(b));
|
||||||
|
float bg = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getGreen(b));
|
||||||
|
float bb = ColorSRGB.srgbToLinear(ColorHelper.Abgr.getBlue(b));
|
||||||
|
return ColorSRGB.linearToSrgb((ar + br) * 0.5F, (ag + bg) * 0.5F, (ab + bb) * 0.5F, alpha);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ public class Mapper {
|
|||||||
return (int) ((id>>56)&0xFF);
|
return (int) ((id>>56)&0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long withLight(long id, int light) {
|
||||||
|
return (id&(~(0xFFL<<56)))|(Integer.toUnsignedLong(light)<<56);
|
||||||
|
}
|
||||||
|
|
||||||
public void setCallbacks(Consumer<StateEntry> stateCallback, Consumer<BiomeEntry> biomeCallback) {
|
public void setCallbacks(Consumer<StateEntry> stateCallback, Consumer<BiomeEntry> biomeCallback) {
|
||||||
this.newStateCallback = stateCallback;
|
this.newStateCallback = stateCallback;
|
||||||
this.newBiomeCallback = biomeCallback;
|
this.newBiomeCallback = biomeCallback;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package me.cortex.zenith.common.world.other;
|
package me.cortex.zenith.common.world.other;
|
||||||
|
|
||||||
|
import static me.cortex.zenith.common.world.other.Mapper.withLight;
|
||||||
|
|
||||||
//Mipper for data
|
//Mipper for data
|
||||||
public class Mipper {
|
public class Mipper {
|
||||||
//TODO: also pass in the level its mipping from, cause at lower levels you want to preserve block details
|
//TODO: also pass in the level its mipping from, cause at lower levels you want to preserve block details
|
||||||
@@ -35,6 +37,13 @@ public class Mipper {
|
|||||||
return I000;
|
return I000;
|
||||||
}
|
}
|
||||||
//TODO: need to account for different light levels of "air"
|
//TODO: need to account for different light levels of "air"
|
||||||
return 0;
|
int blockLight = (Mapper.getLightId(I000)&0xF0)+(Mapper.getLightId(I001)&0xF0)+(Mapper.getLightId(I010)&0xF0)+(Mapper.getLightId(I011)&0xF0)+
|
||||||
|
(Mapper.getLightId(I100)&0xF0)+(Mapper.getLightId(I101)&0xF0)+(Mapper.getLightId(I110)&0xF0)+(Mapper.getLightId(I111)&0xF0);
|
||||||
|
int skyLight = (Mapper.getLightId(I000)&0x0F)+(Mapper.getLightId(I001)&0x0F)+(Mapper.getLightId(I010)&0x0F)+(Mapper.getLightId(I011)&0x0F)+
|
||||||
|
(Mapper.getLightId(I100)&0x0F)+(Mapper.getLightId(I101)&0x0F)+(Mapper.getLightId(I110)&0x0F)+(Mapper.getLightId(I111)&0x0F);
|
||||||
|
blockLight = blockLight/8;
|
||||||
|
skyLight = (int) Math.ceil((double)skyLight/8);
|
||||||
|
|
||||||
|
return withLight(I111, (blockLight<<4)|skyLight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ layout(location = 0) out vec4 outColour;
|
|||||||
void main() {
|
void main() {
|
||||||
vec2 uv = mod(uv, vec2(1))*(1f/(vec2(3,2)*256f));
|
vec2 uv = mod(uv, vec2(1))*(1f/(vec2(3,2)*256f));
|
||||||
vec4 colour = texture(blockModelAtlas, uv + baseUV);
|
vec4 colour = texture(blockModelAtlas, uv + baseUV);
|
||||||
if (discardAlpha == 1 && colour.a <= 0.001f) {
|
if (discardAlpha == 1 && colour.a <= 0.25f) {
|
||||||
discard;
|
discard;
|
||||||
}
|
}
|
||||||
outColour = colour * colourTinting;
|
outColour = colour * colourTinting;
|
||||||
|
|||||||
Reference in New Issue
Block a user