package com.cricketcraft.chisel.client.render;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import org.apache.commons.lang3.tuple.Triple;
import com.cricketcraft.chisel.api.carving.CarvingUtils;
import com.cricketcraft.chisel.api.rendering.TextureType;
import com.cricketcraft.chisel.api.rendering.TextureType.AbstractSubmapManager;
import com.cricketcraft.ctmlib.RenderBlocksCTM;
import com.cricketcraft.ctmlib.TextureSubmap;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class SubmapManagerRCTM extends SubmapManagerBase {
@SideOnly(Side.CLIENT)
private class RenderBlocksRCTM extends RenderBlocksCTM {
@Override
public void renderFaceXNeg(Block block, double x, double y, double z, IIcon icon) {
submap = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.submap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.WEST.ordinal());
submapSmall = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.smallSubmap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.WEST.ordinal());
super.renderFaceXNeg(block, x, y, z, submapSmall.getSubIcon(0, 0));
}
@Override
public void renderFaceXPos(Block block, double x, double y, double z, IIcon icon) {
submap = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.submap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.EAST.ordinal());
submapSmall = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.smallSubmap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.EAST.ordinal());
super.renderFaceXPos(block, x, y, z, submapSmall.getSubIcon(0, 0));
}
@Override
public void renderFaceYNeg(Block block, double x, double y, double z, IIcon icon) {
submap = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.submap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.DOWN.ordinal());
submapSmall = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.smallSubmap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.DOWN.ordinal());
super.renderFaceYNeg(block, x, y, z, submapSmall.getSubIcon(0, 0));
}
@Override
public void renderFaceYPos(Block block, double x, double y, double z, IIcon icon) {
submap = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.submap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.UP.ordinal());
submapSmall = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.smallSubmap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.UP.ordinal());
super.renderFaceYPos(block, x, y, z, submapSmall.getSubIcon(0, 0));
}
@Override
public void renderFaceZNeg(Block block, double x, double y, double z, IIcon icon) {
submap = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.submap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.NORTH.ordinal());
submapSmall = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.smallSubmap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.UP.ordinal());
super.renderFaceZNeg(block, x, y, z, submapSmall.getSubIcon(0, 0));
}
@Override
public void renderFaceZPos(Block block, double x, double y, double z, IIcon icon) {
submap = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.submap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.SOUTH.ordinal());
submapSmall = (TextureSubmap) TextureType.getRIcon(rType, SubmapManagerRCTM.this.smallSubmap, MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), ForgeDirection.SOUTH.ordinal());
super.renderFaceZPos(block, x, y, z, submapSmall.getSubIcon(0, 0));
}
}
private class Submap extends TextureSubmap {
private TextureSubmap[][] submap;
public Submap(IIcon base, int wh, TextureSubmap[][] submap) {
super(base, wh, wh);
this.submap = submap;
}
@Override
public void texturesStitched() {
for (int i = 0; i < icons.length; i++) {
for (int j = 0; j < icons[i].length; j++) {
icons[i][j] = submap[i][j];
submap[i][j].texturesStitched();
}
}
}
}
@SideOnly(Side.CLIENT)
private RenderBlocksCTM rb;
private TextureSubmap submap, smallSubmap;
private int size;
private String texturePath;
private int meta;
private IIcon defaultIcon;
private TextureType rType;
public SubmapManagerRCTM(int meta, String texturePath, TextureType rType) {
assert rType == TextureType.R16 || rType == TextureType.R9 || rType == TextureType.R4
: "Not a valid random type!";
this.meta = meta;
this.texturePath = texturePath;
this.size = Integer.parseInt(rType.name().substring(1, rType.name().length())); // >.>
this.rType = rType;
}
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int side, int meta) {
return defaultIcon;
}
@SideOnly(Side.CLIENT)
@Override
public RenderBlocks createRenderContext(RenderBlocks rendererOld, Block block, IBlockAccess world) {
if (rb == null) {
rb = new RenderBlocksRCTM();
}
rb.setRenderBoundsFromBlock(block);
return rb;
}
@SideOnly(Side.CLIENT)
@SuppressWarnings("unchecked")
@Override
public void registerIcons(String modName, Block block, IIconRegister register) {
IIcon base = register.registerIcon(modName + ":" + texturePath);
int wh = (int) Math.sqrt(size);
TextureSubmap[][] submaps = new TextureSubmap[wh][wh];
TextureSubmap[][] submapsSmall = new TextureSubmap[wh][wh];
for (int i = 0; i < size; i++) {
AbstractSubmapManager manager = (AbstractSubmapManager) TextureType.CTMX.createManagerFor(CarvingUtils.getDefaultVariationFor(block, meta, 0), texturePath + "-" + i);
manager.registerIcons(modName, block, register);
Object cached = manager.getCachedObject();
Triple<IIcon, TextureSubmap, TextureSubmap> triple = (Triple<IIcon, TextureSubmap, TextureSubmap>) cached;
submaps[i % wh][i / wh] = triple.getMiddle();
submapsSmall[i % wh][i / wh] = triple.getRight();
if (i == 0) {
defaultIcon = triple.getRight().getSubIcon(0, 0);
}
}
submap = new Submap(base, wh, submaps);
smallSubmap = new Submap(base, wh, submapsSmall);
}
}