Skip to content

Commit

Permalink
Optifine CTF support
Browse files Browse the repository at this point in the history
  • Loading branch information
octarine-noise committed Mar 10, 2015
1 parent 36e7683 commit 49f58d3
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 0 deletions.
Expand Up @@ -87,6 +87,7 @@ public static void postInit() {

ShadersModIntegration.init();
TerraFirmaCraftIntegration.init();
OptifineIntegration.init();
}

public static boolean isLeafTexture(TextureAtlasSprite icon) {
Expand Down
76 changes: 76 additions & 0 deletions src/main/java/mods/betterfoliage/client/OptifineIntegration.java
@@ -0,0 +1,76 @@
package mods.betterfoliage.client;

import java.util.Collection;

import mods.betterfoliage.BetterFoliage;
import mods.betterfoliage.loader.IResolvable;
import mods.betterfoliage.loader.impl.CodeRefs;
import net.minecraft.block.Block;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;

import com.google.common.collect.Sets;

public class OptifineIntegration {

public static boolean isPresent = false;

public static void init() {
boolean some = false, all = true;
for (IResolvable<?> element : CodeRefs.optifineCTF) {
if (element.resolve() == null) {
all = false;
} else {
some = true;
}
}
if (all) {
BetterFoliage.log.info("Found Optifine, using CTM support");
isPresent = true;
} else if (some) {
BetterFoliage.log.info("Found Optifine, but not all needed elements (wrong version?)");
}
}

public static Collection<IIcon> getAllCTMForBlock(Block block) {
Collection<IIcon> result = Sets.newHashSet();
if (!isPresent) return result;

Object[][] blockProperties = CodeRefs.fCTBlockProperties.getStaticField();
int blockId = Block.getIdFromBlock(block);

if (blockProperties != null && blockId < blockProperties.length && blockId >= 0) {
Object[] connectedProperties = blockProperties[blockId];
if (connectedProperties != null) {
for (Object cp : connectedProperties) {
IIcon[] icons = CodeRefs.fCPTileIcons.getInstanceField(cp);
for (int idx = 0; idx < icons.length; idx++) result.add(icons[idx]);
}
}
}
return result;
}

public static Collection<IIcon> getAllCTMForIcon(IIcon icon) {
Collection<IIcon> result = Sets.newHashSet();
if (!isPresent) return result;

Object[][] tileProperties = CodeRefs.fCTTileProperties.getStaticField();
int iconIdx = CodeRefs.mGetIndexInMap.invokeInstanceMethod(icon);

if (tileProperties != null && iconIdx < tileProperties.length && iconIdx >= 0) {
Object[] connectedProperties = tileProperties[iconIdx];
if (connectedProperties != null) {
for (Object cp : connectedProperties) {
IIcon[] icons = CodeRefs.fCPTileIcons.getInstanceField(cp);
for (int idx = 0; idx < icons.length; idx++) result.add(icons[idx]);
}
}
}
return result;
}

public static IIcon getConnectedTexture(IBlockAccess blockAccess, Block block, int x, int y, int z, int side, IIcon icon) {
return CodeRefs.mGetConnectedTexture.invokeStaticMethod(blockAccess, block, x, y, z, side, icon);
}
}
Expand Up @@ -2,6 +2,7 @@

import mods.betterfoliage.BetterFoliage;
import mods.betterfoliage.client.BetterFoliageClient;
import mods.betterfoliage.client.OptifineIntegration;
import mods.betterfoliage.client.render.IRenderBlockDecorator;
import mods.betterfoliage.client.render.IconSet;
import mods.betterfoliage.client.render.RenderBlockAOBase;
Expand Down Expand Up @@ -42,6 +43,10 @@ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block b
TextureAtlasSprite blockLeafIcon = null;
try {
blockLeafIcon = (TextureAtlasSprite) block.getIcon(world, x, y, z, ForgeDirection.NORTH.ordinal());
IIcon ctmIcon = OptifineIntegration.getConnectedTexture(blockAccess, block, x, y, z, ForgeDirection.NORTH.ordinal(), blockLeafIcon);
if (ctmIcon != null && ctmIcon != blockLeafIcon && ctmIcon instanceof TextureAtlasSprite) {
blockLeafIcon = (TextureAtlasSprite) ctmIcon;
}
} catch (ClassCastException e) {
}

Expand Down
@@ -1,11 +1,13 @@
package mods.betterfoliage.client.resource;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import mods.betterfoliage.BetterFoliage;
import mods.betterfoliage.client.BetterFoliageClient;
import mods.betterfoliage.client.OptifineIntegration;
import mods.betterfoliage.common.config.Config;
import mods.betterfoliage.loader.impl.CodeRefs;
import net.minecraft.block.Block;
Expand Down Expand Up @@ -57,6 +59,14 @@ public IIcon registerIcon(String resourceLocation) {
TextureAtlasSprite original = blockTextures.getTextureExtry(resourceLocation);
MinecraftForge.EVENT_BUS.post(new LeafTextureFoundEvent(blockTextures, original));
BetterFoliage.log.debug(String.format("Found leaf texture: %s", resourceLocation));

Collection<IIcon> ctmIcons = OptifineIntegration.getAllCTMForIcon(original);
if (!ctmIcons.isEmpty()) {
BetterFoliage.log.info(String.format("Found %d CTM variants for texture %s", ctmIcons.size(), original.getIconName()));
for (IIcon ctmIcon : ctmIcons) {
MinecraftForge.EVENT_BUS.post(new LeafTextureFoundEvent(blockTextures, (TextureAtlasSprite) ctmIcon));
}
}
return original;
}

Expand All @@ -79,6 +89,14 @@ public void handleTextureReload(TextureStitchEvent.Pre event) {
if (Config.leaves.matchesClass(block)) {
BetterFoliage.log.debug(String.format("Inspecting leaf block: %s", block.getClass().getName()));
block.registerBlockIcons(this);

Collection<IIcon> ctmIcons = OptifineIntegration.getAllCTMForBlock(block);
if (!ctmIcons.isEmpty()) {
BetterFoliage.log.info(String.format("Found %d CTM texture variants for block: id=%d class=%s", ctmIcons.size(), Block.getIdFromBlock(block), block.getClass().getName()));
for (IIcon ctmIcon : ctmIcons) {
MinecraftForge.EVENT_BUS.post(new LeafTextureFoundEvent(blockTextures, (TextureAtlasSprite) ctmIcon));
}
}
}
}

Expand Down

0 comments on commit 49f58d3

Please sign in to comment.