From 38744413af5a303d599f88432cded1cce4d60407 Mon Sep 17 00:00:00 2001 From: Chicken-Bomes Date: Fri, 15 Aug 2014 19:19:48 +1000 Subject: [PATCH] Fixed anisotropic filtering with TextureFX --- .../lib/render/SpriteSheetManager.java | 6 +- .../lib/render/TextureSpecial.java | 60 +++++++++++++------ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/codechicken/lib/render/SpriteSheetManager.java b/src/codechicken/lib/render/SpriteSheetManager.java index b64436a..2b6a4af 100644 --- a/src/codechicken/lib/render/SpriteSheetManager.java +++ b/src/codechicken/lib/render/SpriteSheetManager.java @@ -48,9 +48,9 @@ public class SpriteSheetManager if(TextureUtils.refreshTexture(textureMap, resource.getResourcePath())) { reloadTexture(); - for(int i = 0; i < sprites.length; i++) - if(sprites[i] != null) - textureMap.setTextureEntry(sprites[i].getIconName(), sprites[i]); + for (TextureSpecial sprite : sprites) + if (sprite != null) + textureMap.setTextureEntry(sprite.getIconName(), sprite); } else { diff --git a/src/codechicken/lib/render/TextureSpecial.java b/src/codechicken/lib/render/TextureSpecial.java index 9a44498..841eff2 100644 --- a/src/codechicken/lib/render/TextureSpecial.java +++ b/src/codechicken/lib/render/TextureSpecial.java @@ -1,5 +1,6 @@ package codechicken.lib.render; +import codechicken.lib.asm.ObfMapping; import codechicken.lib.render.SpriteSheetManager.SpriteSheet; import codechicken.lib.render.TextureUtils.IIconSelfRegister; import cpw.mods.fml.relauncher.Side; @@ -10,10 +11,12 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.data.AnimationMetadataSection; import net.minecraft.client.settings.GameSettings; import net.minecraft.util.ResourceLocation; import java.awt.image.BufferedImage; +import java.lang.reflect.Method; import java.util.ArrayList; @SideOnly(Side.CLIENT) @@ -25,6 +28,8 @@ public class TextureSpecial extends TextureAtlasSprite implements IIconSelfRegis //textureFX fields private TextureFX textureFX; private int mipmapLevels; + private int rawWidth; + private int rawHeight; private int blankSize = -1; private ArrayList baseTextures; @@ -32,6 +37,18 @@ public class TextureSpecial extends TextureAtlasSprite implements IIconSelfRegis private boolean selfRegister; public int atlasIndex; + private static Method m_prepareAnisotropicFiltering; + static { + try { + m_prepareAnisotropicFiltering = TextureAtlasSprite.class.getMethod( + new ObfMapping("net/minecraft/client/renderer/texture", "func_147960_a", "([[III)[[I") + .toRuntime().s_name, int[][].class, int.class, int.class); + m_prepareAnisotropicFiltering.setAccessible(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + protected TextureSpecial(String par1) { super(par1); } @@ -58,7 +75,7 @@ public class TextureSpecial extends TextureAtlasSprite implements IIconSelfRegis public void initSprite(int sheetWidth, int sheetHeight, int originX, int originY, boolean rotated) { super.initSprite(sheetWidth, sheetHeight, originX, originY, rotated); if (textureFX != null) - textureFX.onTextureDimensionsUpdate(width, height); + textureFX.onTextureDimensionsUpdate(rawWidth, rawHeight); } @Override @@ -68,12 +85,29 @@ public class TextureSpecial extends TextureAtlasSprite implements IIconSelfRegis if (textureFX.changed()) { int[][] mipmaps = new int[mipmapLevels + 1][]; mipmaps[0] = textureFX.imageData; + mipmaps = prepareAnisotropicFiltering(mipmaps); mipmaps = TextureUtil.generateMipmapData(mipmapLevels, width, mipmaps); TextureUtil.uploadTextureMipmap(mipmaps, width, height, originX, originY, false, false); } } } + + public int[][] prepareAnisotropicFiltering(int[][] mipmaps) { + try { + return (int[][]) m_prepareAnisotropicFiltering.invoke(this, mipmaps, rawWidth, rawHeight); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void loadSprite(BufferedImage[] images, AnimationMetadataSection animationMeta, boolean anisotropicFiltering) { + rawWidth = images[0].getWidth(); + rawHeight = images[0].getHeight(); + super.loadSprite(images, animationMeta, anisotropicFiltering); + } + @Override public void generateMipmaps(int p_147963_1_) { super.generateMipmaps(p_147963_1_); @@ -85,35 +119,27 @@ public class TextureSpecial extends TextureAtlasSprite implements IIconSelfRegis return true; } - public void addFrame(int[] data) { + public void addFrame(int[] data, int width, int height) { GameSettings settings = Minecraft.getMinecraft().gameSettings; BufferedImage[] images = new BufferedImage[settings.mipmapLevels+1]; images[0] = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); images[0].setRGB(0, 0, width, height, data, 0, width); - super.loadSprite(images, null, settings.anisotropicFiltering > 1); + loadSprite(images, null, settings.anisotropicFiltering > 1); } @Override public boolean load(IResourceManager manager, ResourceLocation location) { if (baseTextures != null) { - for (TextureDataHolder tex : baseTextures) { - width = tex.width; - height = tex.height; - addFrame(tex.data); - } + for (TextureDataHolder tex : baseTextures) + addFrame(tex.data, tex.width, tex.height); } - - if (spriteSheet != null) { + else if (spriteSheet != null) { TextureDataHolder tex = spriteSheet.createSprite(spriteIndex); - width = tex.width; - height = tex.height; - addFrame(tex.data); + addFrame(tex.data, tex.width, tex.height); } - - if (blankSize > 0) { - width = height = blankSize; - addFrame(new int[blankSize * blankSize]); + else if (blankSize > 0) { + addFrame(new int[blankSize * blankSize], blankSize, blankSize); } if (framesTextureData.isEmpty())