Merge branch 'experimentalCTM' into 1.8
|
@ -47,6 +47,7 @@ public class MekanismConfig
|
|||
public static boolean machineEffects = true;
|
||||
public static boolean oldTransmitterRender = false;
|
||||
public static boolean replaceSoundsWhenResuming = true;
|
||||
public static boolean renderCTM = true;
|
||||
}
|
||||
|
||||
public static class usage
|
||||
|
|
|
@ -55,6 +55,7 @@ import mekanism.client.render.RenderGlowPanel;
|
|||
import mekanism.client.render.RenderPartTransmitter;
|
||||
import mekanism.client.render.RenderTickHandler;
|
||||
import mekanism.client.render.block.BasicRenderingHandler;
|
||||
import mekanism.client.render.block.CTMRenderingHandler;
|
||||
import mekanism.client.render.block.MachineRenderingHandler;
|
||||
import mekanism.client.render.entity.RenderBalloon;
|
||||
import mekanism.client.render.entity.RenderFlame;
|
||||
|
@ -174,6 +175,7 @@ public class ClientProxy extends CommonProxy
|
|||
{
|
||||
public static int MACHINE_RENDER_ID = RenderingRegistry.getNextAvailableRenderId();
|
||||
public static int BASIC_RENDER_ID = RenderingRegistry.getNextAvailableRenderId();
|
||||
public static int CTM_RENDER_ID = RenderingRegistry.getNextAvailableRenderId();
|
||||
|
||||
@Override
|
||||
public void loadConfiguration()
|
||||
|
@ -189,6 +191,7 @@ public class ClientProxy extends CommonProxy
|
|||
client.oldTransmitterRender = Mekanism.configuration.get("client", "OldTransmitterRender", false).getBoolean();
|
||||
client.replaceSoundsWhenResuming = Mekanism.configuration.get("client", "ReplaceSoundsWhenResuming", true,
|
||||
"If true, will reduce lagging between player sounds. Setting to false will reduce GC load").getBoolean();
|
||||
client.renderCTM = Mekanism.configuration.get("client", "Use CTM Renderer", true).getBoolean();
|
||||
|
||||
if(Mekanism.configuration.hasChanged())
|
||||
Mekanism.configuration.save();
|
||||
|
@ -336,6 +339,7 @@ public class ClientProxy extends CommonProxy
|
|||
//Register block handlers
|
||||
RenderingRegistry.registerBlockHandler(new MachineRenderingHandler());
|
||||
RenderingRegistry.registerBlockHandler(new BasicRenderingHandler());
|
||||
RenderingRegistry.registerBlockHandler(new CTMRenderingHandler());
|
||||
|
||||
Mekanism.logger.info("Render registrations complete.");
|
||||
}
|
||||
|
|
314
src/main/java/mekanism/client/render/CTM.java
Normal file
|
@ -0,0 +1,314 @@
|
|||
package mekanism.client.render;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
/**
|
||||
* CTM Logic adapted from Chisel.
|
||||
* Code licensed under GPLv2
|
||||
* @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket
|
||||
*/
|
||||
public class CTM
|
||||
{
|
||||
static int submaps[][] = {
|
||||
{16, 17, 18, 19},
|
||||
{16, 9, 18, 13},
|
||||
{8, 9, 12, 13},
|
||||
{8, 17, 12, 19},
|
||||
{16, 9, 6, 15},
|
||||
{8, 17, 14, 7},
|
||||
{2, 11, 6, 15},
|
||||
{8, 9, 14, 15},
|
||||
{10, 1, 14, 15},
|
||||
{10, 11, 14, 5},
|
||||
{0, 11, 4, 15},
|
||||
{0, 1, 14, 15},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{16, 17, 6, 7},
|
||||
{16, 9, 6, 5},
|
||||
{8, 9, 4, 5},
|
||||
{8, 17, 4, 7},
|
||||
{2, 11, 18, 13},
|
||||
{10, 3, 12, 19},
|
||||
{10, 11, 12, 13},
|
||||
{10, 3, 14, 7},
|
||||
{0, 11, 14, 15},
|
||||
{10, 11, 4, 15},
|
||||
{10, 11, 4, 5},
|
||||
{10, 1, 14, 5},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{2, 3, 6, 7},
|
||||
{2, 1, 6, 5},
|
||||
{0, 1, 4, 5},
|
||||
{0, 3, 4, 7},
|
||||
{2, 11, 6, 5},
|
||||
{8, 9, 4, 15},
|
||||
{2, 1, 6, 15},
|
||||
{8, 9, 14, 5},
|
||||
{0, 1, 4, 15},
|
||||
{0, 1, 14, 5},
|
||||
{10, 1, 4, 15},
|
||||
{0, 11, 14, 5},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{2, 3, 18, 19},
|
||||
{2, 1, 18, 13},
|
||||
{0, 1, 12, 13},
|
||||
{0, 3, 12, 19},
|
||||
{10, 1, 12, 13},
|
||||
{0, 3, 14, 7},
|
||||
{0, 11, 12, 13},
|
||||
{10, 3, 4, 7},
|
||||
{0, 11, 4, 5},
|
||||
{10, 1, 4, 5},
|
||||
{10, 11, 14, 15},
|
||||
{0, 1, 4, 5},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
{},
|
||||
};
|
||||
|
||||
public static int[] getSubmapIndices(IBlockAccess world, int x, int y, int z, int side, HashMap<Block, List<Integer>> blockMetas)
|
||||
{
|
||||
int index = getTexture(world, x, y, z, side, blockMetas);
|
||||
|
||||
return submaps[index];
|
||||
}
|
||||
|
||||
public static int getTexture(IBlockAccess world, int x, int y, int z, int side, HashMap<Block, List<Integer>> blockMetas)
|
||||
{
|
||||
if(world == null)
|
||||
return 0;
|
||||
|
||||
int texture = 0;
|
||||
|
||||
boolean b[] = new boolean[6];
|
||||
if(side <= 1)
|
||||
{
|
||||
b[0] = isConnected(world, x - 1, y, z, side, blockMetas);
|
||||
b[1] = isConnected(world, x + 1, y, z, side, blockMetas);
|
||||
b[2] = isConnected(world, x, y, z + 1, side, blockMetas);
|
||||
b[3] = isConnected(world, x, y, z - 1, side, blockMetas);
|
||||
} else if(side == 2)
|
||||
{
|
||||
b[0] = isConnected(world, x + 1, y, z, side, blockMetas);
|
||||
b[1] = isConnected(world, x - 1, y, z, side, blockMetas);
|
||||
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
|
||||
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
|
||||
} else if(side == 3)
|
||||
{
|
||||
b[0] = isConnected(world, x - 1, y, z, side, blockMetas);
|
||||
b[1] = isConnected(world, x + 1, y, z, side, blockMetas);
|
||||
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
|
||||
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
|
||||
} else if(side == 4)
|
||||
{
|
||||
b[0] = isConnected(world, x, y, z - 1, side, blockMetas);
|
||||
b[1] = isConnected(world, x, y, z + 1, side, blockMetas);
|
||||
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
|
||||
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
|
||||
} else if(side == 5)
|
||||
{
|
||||
b[0] = isConnected(world, x, y, z + 1, side, blockMetas);
|
||||
b[1] = isConnected(world, x, y, z - 1, side, blockMetas);
|
||||
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
|
||||
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
|
||||
}
|
||||
if(b[0] & !b[1] & !b[2] & !b[3])
|
||||
texture = 3;
|
||||
else if(!b[0] & b[1] & !b[2] & !b[3])
|
||||
texture = 1;
|
||||
else if(!b[0] & !b[1] & b[2] & !b[3])
|
||||
texture = 16;
|
||||
else if(!b[0] & !b[1] & !b[2] & b[3])
|
||||
texture = 48;
|
||||
else if(b[0] & b[1] & !b[2] & !b[3])
|
||||
texture = 2;
|
||||
else if(!b[0] & !b[1] & b[2] & b[3])
|
||||
texture = 32;
|
||||
else if(b[0] & !b[1] & b[2] & !b[3])
|
||||
texture = 19;
|
||||
else if(b[0] & !b[1] & !b[2] & b[3])
|
||||
texture = 51;
|
||||
else if(!b[0] & b[1] & b[2] & !b[3])
|
||||
texture = 17;
|
||||
else if(!b[0] & b[1] & !b[2] & b[3])
|
||||
texture = 49;
|
||||
else if(!b[0] & b[1] & b[2] & b[3])
|
||||
texture = 33;
|
||||
else if(b[0] & !b[1] & b[2] & b[3])
|
||||
texture = 35;
|
||||
else if(b[0] & b[1] & !b[2] & b[3])
|
||||
texture = 50;
|
||||
else if(b[0] & b[1] & b[2] & !b[3])
|
||||
texture = 18;
|
||||
else if(b[0] & b[1] & b[2] & b[3])
|
||||
texture = 34;
|
||||
|
||||
boolean b2[] = new boolean[6];
|
||||
if(side <= 1)
|
||||
{
|
||||
b2[0] = !isConnected(world, x + 1, y, z + 1, side, blockMetas);
|
||||
b2[1] = !isConnected(world, x - 1, y, z + 1, side, blockMetas);
|
||||
b2[2] = !isConnected(world, x + 1, y, z - 1, side, blockMetas);
|
||||
b2[3] = !isConnected(world, x - 1, y, z - 1, side, blockMetas);
|
||||
} else if(side == 2)
|
||||
{
|
||||
b2[0] = !isConnected(world, x - 1, y - 1, z, side, blockMetas);
|
||||
b2[1] = !isConnected(world, x + 1, y - 1, z, side, blockMetas);
|
||||
b2[2] = !isConnected(world, x - 1, y + 1, z, side, blockMetas);
|
||||
b2[3] = !isConnected(world, x + 1, y + 1, z, side, blockMetas);
|
||||
} else if(side == 3)
|
||||
{
|
||||
b2[0] = !isConnected(world, x + 1, y - 1, z, side, blockMetas);
|
||||
b2[1] = !isConnected(world, x - 1, y - 1, z, side, blockMetas);
|
||||
b2[2] = !isConnected(world, x + 1, y + 1, z, side, blockMetas);
|
||||
b2[3] = !isConnected(world, x - 1, y + 1, z, side, blockMetas);
|
||||
} else if(side == 4)
|
||||
{
|
||||
b2[0] = !isConnected(world, x, y - 1, z + 1, side, blockMetas);
|
||||
b2[1] = !isConnected(world, x, y - 1, z - 1, side, blockMetas);
|
||||
b2[2] = !isConnected(world, x, y + 1, z + 1, side, blockMetas);
|
||||
b2[3] = !isConnected(world, x, y + 1, z - 1, side, blockMetas);
|
||||
} else if(side == 5)
|
||||
{
|
||||
b2[0] = !isConnected(world, x, y - 1, z - 1, side, blockMetas);
|
||||
b2[1] = !isConnected(world, x, y - 1, z + 1, side, blockMetas);
|
||||
b2[2] = !isConnected(world, x, y + 1, z - 1, side, blockMetas);
|
||||
b2[3] = !isConnected(world, x, y + 1, z + 1, side, blockMetas);
|
||||
}
|
||||
|
||||
if(texture == 17 && b2[0])
|
||||
texture = 4;
|
||||
if(texture == 19 && b2[1])
|
||||
texture = 5;
|
||||
if(texture == 49 && b2[2])
|
||||
texture = 20;
|
||||
if(texture == 51 && b2[3])
|
||||
texture = 21;
|
||||
|
||||
if(texture == 18 && b2[0] && b2[1])
|
||||
texture = 7;
|
||||
if(texture == 33 && b2[0] && b2[2])
|
||||
texture = 6;
|
||||
if(texture == 35 && b2[3] && b2[1])
|
||||
texture = 23;
|
||||
if(texture == 50 && b2[3] && b2[2])
|
||||
texture = 22;
|
||||
|
||||
if(texture == 18 && !b2[0] && b2[1])
|
||||
texture = 39;
|
||||
if(texture == 33 && b2[0] && !b2[2])
|
||||
texture = 38;
|
||||
if(texture == 35 && !b2[3] && b2[1])
|
||||
texture = 53;
|
||||
if(texture == 50 && b2[3] && !b2[2])
|
||||
texture = 52;
|
||||
|
||||
if(texture == 18 && b2[0] && !b2[1])
|
||||
texture = 37;
|
||||
if(texture == 33 && !b2[0] && b2[2])
|
||||
texture = 36;
|
||||
if(texture == 35 && b2[3] && !b2[1])
|
||||
texture = 55;
|
||||
if(texture == 50 && !b2[3] && b2[2])
|
||||
texture = 54;
|
||||
|
||||
|
||||
if(texture == 34 && b2[0] && b2[1] && b2[2] && b2[3])
|
||||
texture = 58;
|
||||
|
||||
if(texture == 34 && !b2[0] && b2[1] && b2[2] && b2[3])
|
||||
texture = 9;
|
||||
if(texture == 34 && b2[0] && !b2[1] && b2[2] && b2[3])
|
||||
texture = 25;
|
||||
if(texture == 34 && b2[0] && b2[1] && !b2[2] && b2[3])
|
||||
texture = 8;
|
||||
if(texture == 34 && b2[0] && b2[1] && b2[2] && !b2[3])
|
||||
texture = 24;
|
||||
|
||||
if(texture == 34 && b2[0] && b2[1] && !b2[2] && !b2[3])
|
||||
texture = 11;
|
||||
if(texture == 34 && !b2[0] && !b2[1] && b2[2] && b2[3])
|
||||
texture = 26;
|
||||
if(texture == 34 && !b2[0] && b2[1] && !b2[2] && b2[3])
|
||||
texture = 27;
|
||||
if(texture == 34 && b2[0] && !b2[1] && b2[2] && !b2[3])
|
||||
texture = 10;
|
||||
|
||||
if(texture == 34 && b2[0] && !b2[1] && !b2[2] && b2[3])
|
||||
texture = 42;
|
||||
if(texture == 34 && !b2[0] && b2[1] && b2[2] && !b2[3])
|
||||
texture = 43;
|
||||
|
||||
if(texture == 34 && b2[0] && !b2[1] && !b2[2] && !b2[3])
|
||||
texture = 40;
|
||||
if(texture == 34 && !b2[0] && b2[1] && !b2[2] && !b2[3])
|
||||
texture = 41;
|
||||
if(texture == 34 && !b2[0] && !b2[1] && b2[2] && !b2[3])
|
||||
texture = 56;
|
||||
if(texture == 34 && !b2[0] && !b2[1] && !b2[2] && b2[3])
|
||||
texture = 57;
|
||||
return texture;
|
||||
}
|
||||
|
||||
public static boolean isConnected(IBlockAccess world, int x, int y, int z, int side, HashMap<Block, List<Integer>> blockMetas)
|
||||
{
|
||||
int x2 = x, y2 = y, z2 = z;
|
||||
|
||||
switch(side)
|
||||
{
|
||||
case 0:
|
||||
y2--;
|
||||
break;
|
||||
case 1:
|
||||
y2++;
|
||||
break;
|
||||
case 2:
|
||||
z2--;
|
||||
break;
|
||||
case 3:
|
||||
z2++;
|
||||
break;
|
||||
case 4:
|
||||
x2--;
|
||||
break;
|
||||
case 5:
|
||||
x2++;
|
||||
break;
|
||||
}
|
||||
|
||||
Block block1 = world.getBlock(x, y, z);
|
||||
Block block2 = world.getBlock(x2, y2, z2);
|
||||
|
||||
int meta1 = world.getBlockMetadata(x, y, z);
|
||||
int meta2 = world.getBlockMetadata(x2, y2, z2);
|
||||
|
||||
boolean validBlockMeta1 = false;
|
||||
boolean invalidBlockMeta2 = true;
|
||||
|
||||
for(Entry<Block, List<Integer>> entry : blockMetas.entrySet())
|
||||
{
|
||||
validBlockMeta1 |= block1.equals(entry.getKey()) && entry.getValue().contains(meta1);
|
||||
|
||||
invalidBlockMeta2 &= !(block2.equals(entry.getKey()) && entry.getValue().contains(meta2));
|
||||
}
|
||||
|
||||
return validBlockMeta1 && invalidBlockMeta2;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package mekanism.client.render.block;
|
||||
|
||||
import mekanism.api.MekanismConfig;
|
||||
import mekanism.client.ClientProxy;
|
||||
import mekanism.client.render.MekanismRenderer;
|
||||
import mekanism.common.CTMData;
|
||||
import mekanism.common.base.IBlockCTM;
|
||||
import mekanism.common.tile.TileEntityBasicBlock;
|
||||
import mekanism.common.util.MekanismUtils;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
|
||||
/**
|
||||
* CTM ISBRH adapted from Chisel
|
||||
* Code licensed under GPLv2
|
||||
* @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket
|
||||
*/
|
||||
public class CTMRenderingHandler implements ISimpleBlockRenderingHandler
|
||||
{
|
||||
RenderBlocksCTM rendererCTM = new RenderBlocksCTM();
|
||||
|
||||
@Override
|
||||
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer)
|
||||
{
|
||||
MekanismRenderer.renderItem(renderer, metadata, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks rendererOld)
|
||||
{
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
CTMData blockCTM = ((IBlockCTM)block).getCTMData(world, x, y, z, meta);
|
||||
|
||||
if(MekanismConfig.client.renderCTM && blockCTM != null)
|
||||
{
|
||||
if(blockCTM.hasFacingOverride() && world.getTileEntity(x, y, z) instanceof TileEntityBasicBlock)
|
||||
{
|
||||
TileEntityBasicBlock tile = (TileEntityBasicBlock)world.getTileEntity(x, y, z);
|
||||
blockCTM.setFacing(tile.facing);
|
||||
}
|
||||
rendererCTM.blockAccess = world;
|
||||
rendererCTM.renderMaxX = 1.0;
|
||||
rendererCTM.renderMaxY = 1.0;
|
||||
rendererCTM.renderMaxZ = 1.0;
|
||||
|
||||
rendererCTM.dataCTM = blockCTM;
|
||||
|
||||
rendererCTM.rendererOld = rendererOld;
|
||||
|
||||
return rendererCTM.renderStandardBlock(block, x, y, z);
|
||||
}
|
||||
return rendererOld.renderStandardBlock(block, x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldRender3DInInventory(int renderId)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderId()
|
||||
{
|
||||
return ClientProxy.CTM_RENDER_ID;
|
||||
}
|
||||
|
||||
}
|
387
src/main/java/mekanism/client/render/block/RenderBlocksCTM.java
Normal file
|
@ -0,0 +1,387 @@
|
|||
package mekanism.client.render.block;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import mekanism.client.render.CTM;
|
||||
import mekanism.common.CTMData;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
/**
|
||||
* CTM RenderBlocks adapted from Chisel
|
||||
* Code licensed under GPLv2
|
||||
* @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket
|
||||
*/
|
||||
public class RenderBlocksCTM extends RenderBlocks
|
||||
{
|
||||
|
||||
RenderBlocksCTM()
|
||||
{
|
||||
super();
|
||||
|
||||
resetVertices();
|
||||
}
|
||||
|
||||
Tessellator tessellator;
|
||||
double[] X = new double[26];
|
||||
double[] Y = new double[26];
|
||||
double[] Z = new double[26];
|
||||
double[] U = new double[26];
|
||||
double[] V = new double[26];
|
||||
int[] L = new int[26];
|
||||
float[] R = new float[26];
|
||||
float[] G = new float[26];
|
||||
float[] B = new float[26];
|
||||
CTMData dataCTM;
|
||||
RenderBlocks rendererOld;
|
||||
|
||||
int bx, by, bz;
|
||||
|
||||
@Override
|
||||
public boolean renderStandardBlock(Block block, int x, int y, int z)
|
||||
{
|
||||
bx = x;
|
||||
by = y;
|
||||
bz = z;
|
||||
|
||||
tessellator = Tessellator.instance;
|
||||
tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
|
||||
|
||||
tessellator.addTranslation(x, y, z);
|
||||
|
||||
boolean res = super.renderStandardBlock(block, x, y, z);
|
||||
|
||||
tessellator.addTranslation(-x, -y, -z);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void setupSides(int a, int b, int c, int d, int xa, int xb, int xc, int xd, int e)
|
||||
{
|
||||
L[a] = brightnessBottomLeft;
|
||||
L[b] = brightnessBottomRight;
|
||||
L[c] = brightnessTopRight;
|
||||
L[d] = brightnessTopLeft;
|
||||
L[e] = (brightnessBottomLeft + brightnessTopLeft + brightnessTopRight + brightnessBottomRight) / 4;
|
||||
L[xa] = (L[a] + L[b]) / 2;
|
||||
L[xb] = (L[b] + L[c]) / 2;
|
||||
L[xc] = (L[c] + L[d]) / 2;
|
||||
L[xd] = (L[d] + L[a]) / 2;
|
||||
|
||||
R[a] = colorRedBottomLeft;
|
||||
R[b] = colorRedBottomRight;
|
||||
R[c] = colorRedTopRight;
|
||||
R[d] = colorRedTopLeft;
|
||||
R[e] = (colorRedBottomLeft + colorRedTopLeft + colorRedTopRight + colorRedBottomRight) / 4;
|
||||
R[xa] = (R[a] + R[b]) / 2;
|
||||
R[xb] = (R[b] + R[c]) / 2;
|
||||
R[xc] = (R[c] + R[d]) / 2;
|
||||
R[xd] = (R[d] + R[a]) / 2;
|
||||
|
||||
G[a] = colorGreenBottomLeft;
|
||||
G[b] = colorGreenBottomRight;
|
||||
G[c] = colorGreenTopRight;
|
||||
G[d] = colorGreenTopLeft;
|
||||
G[e] = (colorGreenBottomLeft + colorGreenTopLeft + colorGreenTopRight + colorGreenBottomRight) / 4;
|
||||
G[xa] = (G[a] + G[b]) / 2;
|
||||
G[xb] = (G[b] + G[c]) / 2;
|
||||
G[xc] = (G[c] + G[d]) / 2;
|
||||
G[xd] = (G[d] + G[a]) / 2;
|
||||
|
||||
B[a] = colorBlueBottomLeft;
|
||||
B[b] = colorBlueBottomRight;
|
||||
B[c] = colorBlueTopRight;
|
||||
B[d] = colorBlueTopLeft;
|
||||
B[e] = (colorBlueBottomLeft + colorBlueTopLeft + colorBlueTopRight + colorBlueBottomRight) / 4;
|
||||
B[xa] = (B[a] + B[b]) / 2;
|
||||
B[xb] = (B[b] + B[c]) / 2;
|
||||
B[xc] = (B[c] + B[d]) / 2;
|
||||
B[xd] = (B[d] + B[a]) / 2;
|
||||
}
|
||||
|
||||
void side(int a, int b, int c, int d, int iconIndex, boolean flip, int side)
|
||||
{
|
||||
IIcon icon = iconIndex >= 16 ? dataCTM.getSmallSubmap(side).icons[iconIndex - 16] : dataCTM.getSubmap(side).icons[iconIndex];
|
||||
|
||||
double u0 = icon.getMaxU();
|
||||
double u1 = icon.getMinU();
|
||||
double v0 = icon.getMaxV();
|
||||
double v1 = icon.getMinV();
|
||||
|
||||
U[a] = flip ? u1 : u1;
|
||||
U[b] = flip ? u0 : u1;
|
||||
U[c] = flip ? u0 : u0;
|
||||
U[d] = flip ? u1 : u0;
|
||||
|
||||
V[a] = flip ? v1 : v1;
|
||||
V[b] = flip ? v1 : v0;
|
||||
V[c] = flip ? v0 : v0;
|
||||
V[d] = flip ? v0 : v1;
|
||||
|
||||
vert(a);
|
||||
vert(b);
|
||||
vert(c);
|
||||
vert(d);
|
||||
}
|
||||
|
||||
void vert(int index)
|
||||
{
|
||||
if(enableAO)
|
||||
{
|
||||
tessellator.setColorOpaque_F(R[index], G[index], B[index]);
|
||||
tessellator.setBrightness(L[index]);
|
||||
}
|
||||
|
||||
tessellator.addVertexWithUV(X[index], Y[index], Z[index], U[index], V[index]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderFaceXNeg(Block block, double x, double y, double z, IIcon icon)
|
||||
{
|
||||
if(rendererOld != null && rendererOld.hasOverrideBlockTexture())
|
||||
{
|
||||
IIcon i = rendererOld.overrideBlockTexture;
|
||||
|
||||
tessellator.addVertexWithUV(0.0, 1.0, 0.0, i.getMinU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(0.0, 0.0, 0.0, i.getMinU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(0.0, 0.0, 1.0, i.getMaxU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(0.0, 1.0, 1.0, i.getMaxU(), i.getMinV());
|
||||
} else
|
||||
{
|
||||
int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 4, dataCTM.acceptableBlockMetas);
|
||||
|
||||
setupSides(1, 0, 4, 5, 14, 19, 17, 23, 9);
|
||||
side(1, 14, 9, 23, tex[0], false, 4);
|
||||
side(23, 9, 17, 5, tex[1], false, 4);
|
||||
side(9, 19, 4, 17, tex[3], false, 4);
|
||||
side(14, 0, 19, 9, tex[2], false, 4);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderFaceXPos(Block block, double x, double y, double z, IIcon icon)
|
||||
{
|
||||
if(rendererOld != null && rendererOld.hasOverrideBlockTexture())
|
||||
{
|
||||
IIcon i = rendererOld.overrideBlockTexture;
|
||||
|
||||
tessellator.addVertexWithUV(1.0, 1.0, 1.0, i.getMaxU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(1.0, 0.0, 1.0, i.getMaxU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(1.0, 0.0, 0.0, i.getMinU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(1.0, 1.0, 0.0, i.getMinU(), i.getMinV());
|
||||
} else
|
||||
{
|
||||
int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 5, dataCTM.acceptableBlockMetas);
|
||||
|
||||
setupSides(3, 2, 6, 7, 15, 25, 16, 21, 11);
|
||||
side(11, 21, 3, 15, tex[3], false, 5);
|
||||
side(16, 7, 21, 11, tex[2], false, 5);
|
||||
side(25, 11, 15, 2, tex[1], false, 5);
|
||||
side(6, 16, 11, 25, tex[0], false, 5);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderFaceZNeg(Block block, double x, double y, double z, IIcon icon)
|
||||
{
|
||||
if(rendererOld != null && rendererOld.hasOverrideBlockTexture())
|
||||
{
|
||||
IIcon i = rendererOld.overrideBlockTexture;
|
||||
|
||||
tessellator.addVertexWithUV(1.0, 1.0, 0.0, i.getMaxU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(1.0, 0.0, 0.0, i.getMaxU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(0.0, 0.0, 0.0, i.getMinU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(0.0, 1.0, 0.0, i.getMinU(), i.getMinV());
|
||||
} else
|
||||
{
|
||||
int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 2, dataCTM.acceptableBlockMetas);
|
||||
|
||||
setupSides(2, 3, 0, 1, 15, 18, 14, 22, 8);
|
||||
side(2, 15, 8, 22, tex[0], false, 2);
|
||||
side(15, 3, 18, 8, tex[2], false, 2);
|
||||
side(8, 18, 0, 14, tex[3], false, 2);
|
||||
side(22, 8, 14, 1, tex[1], false, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void renderFaceZPos(Block block, double x, double y, double z, IIcon icon)
|
||||
{
|
||||
if(rendererOld != null && rendererOld.hasOverrideBlockTexture())
|
||||
{
|
||||
IIcon i = rendererOld.overrideBlockTexture;
|
||||
|
||||
tessellator.addVertexWithUV(0.0, 1.0, 1.0, i.getMinU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(0.0, 0.0, 1.0, i.getMinU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(1.0, 0.0, 1.0, i.getMaxU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(1.0, 1.0, 1.0, i.getMaxU(), i.getMinV());
|
||||
} else
|
||||
{
|
||||
int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 3, dataCTM.acceptableBlockMetas);
|
||||
|
||||
setupSides(4, 7, 6, 5, 20, 16, 24, 17, 10);
|
||||
side(17, 4, 20, 10, tex[2], false, 3);
|
||||
side(5, 17, 10, 24, tex[0], false, 3);
|
||||
side(24, 10, 16, 6, tex[1], false, 3);
|
||||
side(10, 20, 7, 16, tex[3], false, 3);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderFaceYNeg(Block block, double x, double y, double z, IIcon icon)
|
||||
{
|
||||
if(rendererOld != null && rendererOld.hasOverrideBlockTexture())
|
||||
{
|
||||
IIcon i = rendererOld.overrideBlockTexture;
|
||||
|
||||
tessellator.addVertexWithUV(0.0, 0.0, 1.0, i.getMinU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(0.0, 0.0, 0.0, i.getMinU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(1.0, 0.0, 0.0, i.getMaxU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(1.0, 0.0, 1.0, i.getMaxU(), i.getMaxV());
|
||||
} else
|
||||
{
|
||||
int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 0, dataCTM.acceptableBlockMetas);
|
||||
|
||||
setupSides(0, 3, 7, 4, 18, 21, 20, 19, 13);
|
||||
side(13, 21, 7, 20, tex[3], true, 0);
|
||||
side(19, 13, 20, 4, tex[2], true, 0);
|
||||
side(0, 18, 13, 19, tex[0], true, 0);
|
||||
side(18, 3, 21, 13, tex[1], true, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderFaceYPos(Block block, double x, double y, double z, IIcon icon)
|
||||
{
|
||||
if(rendererOld != null && rendererOld.hasOverrideBlockTexture())
|
||||
{
|
||||
IIcon i = rendererOld.overrideBlockTexture;
|
||||
|
||||
tessellator.addVertexWithUV(0.0, 1.0, 0.0, i.getMinU(), i.getMinV());
|
||||
tessellator.addVertexWithUV(0.0, 1.0, 1.0, i.getMinU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(1.0, 1.0, 1.0, i.getMaxU(), i.getMaxV());
|
||||
tessellator.addVertexWithUV(1.0, 1.0, 0.0, i.getMaxU(), i.getMinV());
|
||||
} else
|
||||
{
|
||||
int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 1, dataCTM.acceptableBlockMetas);
|
||||
|
||||
setupSides(2, 1, 5, 6, 22, 23, 24, 25, 12);
|
||||
side(12, 24, 6, 25, tex[3], false, 1);
|
||||
side(22, 12, 25, 2, tex[1], false, 1);
|
||||
side(1, 23, 12, 22, tex[0], false, 1);
|
||||
side(23, 5, 24, 12, tex[2], false, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void resetVertices()
|
||||
{
|
||||
X[0] = 0;
|
||||
Z[0] = 0;
|
||||
Y[0] = 0;
|
||||
|
||||
X[1] = 0;
|
||||
Z[1] = 0;
|
||||
Y[1] = 1;
|
||||
|
||||
X[2] = 1;
|
||||
Z[2] = 0;
|
||||
Y[2] = 1;
|
||||
|
||||
X[3] = 1;
|
||||
Z[3] = 0;
|
||||
Y[3] = 0;
|
||||
|
||||
X[4] = 0;
|
||||
Z[4] = 1;
|
||||
Y[4] = 0;
|
||||
|
||||
X[5] = 0;
|
||||
Z[5] = 1;
|
||||
Y[5] = 1;
|
||||
|
||||
X[6] = 1;
|
||||
Z[6] = 1;
|
||||
Y[6] = 1;
|
||||
|
||||
X[7] = 1;
|
||||
Z[7] = 1;
|
||||
Y[7] = 0;
|
||||
|
||||
X[8] = 0.5;
|
||||
Z[8] = 0;
|
||||
Y[8] = 0.5;
|
||||
|
||||
X[9] = 0;
|
||||
Z[9] = 0.5;
|
||||
Y[9] = 0.5;
|
||||
|
||||
X[10] = 0.5;
|
||||
Z[10] = 1;
|
||||
Y[10] = 0.5;
|
||||
|
||||
X[11] = 1;
|
||||
Z[11] = 0.5;
|
||||
Y[11] = 0.5;
|
||||
|
||||
X[12] = 0.5;
|
||||
Z[12] = 0.5;
|
||||
Y[12] = 1;
|
||||
|
||||
X[13] = 0.5;
|
||||
Z[13] = 0.5;
|
||||
Y[13] = 0;
|
||||
|
||||
X[14] = 0;
|
||||
Z[14] = 0;
|
||||
Y[14] = 0.5;
|
||||
|
||||
X[15] = 1;
|
||||
Z[15] = 0;
|
||||
Y[15] = 0.5;
|
||||
|
||||
X[16] = 1;
|
||||
Z[16] = 1;
|
||||
Y[16] = 0.5;
|
||||
|
||||
X[17] = 0;
|
||||
Z[17] = 1;
|
||||
Y[17] = 0.5;
|
||||
|
||||
X[18] = 0.5;
|
||||
Z[18] = 0;
|
||||
Y[18] = 0;
|
||||
|
||||
X[19] = 0;
|
||||
Z[19] = 0.5;
|
||||
Y[19] = 0;
|
||||
|
||||
X[20] = 0.5;
|
||||
Z[20] = 1;
|
||||
Y[20] = 0;
|
||||
|
||||
X[21] = 1;
|
||||
Z[21] = 0.5;
|
||||
Y[21] = 0;
|
||||
|
||||
X[22] = 0.5;
|
||||
Z[22] = 0;
|
||||
Y[22] = 1;
|
||||
|
||||
X[23] = 0;
|
||||
Z[23] = 0.5;
|
||||
Y[23] = 1;
|
||||
|
||||
X[24] = 0.5;
|
||||
Z[24] = 1;
|
||||
Y[24] = 1;
|
||||
|
||||
X[25] = 1;
|
||||
Z[25] = 0.5;
|
||||
Y[25] = 1;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
package mekanism.client.render.block;
|
||||
|
||||
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraftforge.client.event.TextureStitchEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
/**
|
||||
* Multi-texture class adapted from Chisel
|
||||
* Code licensed under GPLv2
|
||||
* @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket
|
||||
*/
|
||||
public class TextureSubmap
|
||||
{
|
||||
public int width, height;
|
||||
public IIcon icon;
|
||||
public IIcon icons[];
|
||||
|
||||
public TextureSubmap(IIcon i, int w, int h)
|
||||
{
|
||||
icon = i;
|
||||
width = w;
|
||||
height = h;
|
||||
icons = new IIcon[width * height];
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void TexturesStitched(TextureStitchEvent.Post event)
|
||||
{
|
||||
|
||||
for(int x = 0; x < width; x++)
|
||||
{
|
||||
for(int y = 0; y < height; y++)
|
||||
{
|
||||
icons[y * width + x] = new TextureVirtual(icon, width, height, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
package mekanism.client.render.block;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
/**
|
||||
* Texture component class adapted from Chisel
|
||||
* Code licensed under GPLv2
|
||||
* @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket
|
||||
*/
|
||||
public class TextureVirtual implements IIcon
|
||||
{
|
||||
int ox, oy;
|
||||
float u0, u1, v0, v1;
|
||||
String name;
|
||||
IIcon icon;
|
||||
|
||||
TextureVirtual(IIcon parent, int w, int h, int x, int y)
|
||||
{
|
||||
icon = parent;
|
||||
|
||||
u0 = icon.getInterpolatedU(16.0 * (x) / w);
|
||||
u1 = icon.getInterpolatedU(16.0 * (x + 1) / w);
|
||||
v0 = icon.getInterpolatedV(16.0 * (y) / h);
|
||||
v1 = icon.getInterpolatedV(16.0 * (y + 1) / h);
|
||||
|
||||
name = icon.getIconName() + "|" + x + "." + y;
|
||||
|
||||
ox = icon.getIconWidth();
|
||||
oy = icon.getIconHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getMinU()
|
||||
{
|
||||
return u0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getMaxU()
|
||||
{
|
||||
return u1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getInterpolatedU(double d0)
|
||||
{
|
||||
return (float) (u0 + (u1 - u0) * d0 / 16.0);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getMinV()
|
||||
{
|
||||
return v0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getMaxV()
|
||||
{
|
||||
return v1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getInterpolatedV(double d0)
|
||||
{
|
||||
return (float) (v0 + (v1 - v0) * d0 / 16.0);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public String getIconName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public int getIconWidth()
|
||||
{
|
||||
return ox;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public int getIconHeight()
|
||||
{
|
||||
return oy;
|
||||
}
|
||||
|
||||
}
|
129
src/main/java/mekanism/common/CTMData.java
Normal file
|
@ -0,0 +1,129 @@
|
|||
package mekanism.common;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.client.render.block.TextureSubmap;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class CTMData
|
||||
{
|
||||
public CTMTextureData mainTextureData;
|
||||
|
||||
public HashMap<Block, List<Integer>> acceptableBlockMetas = new HashMap<Block, List<Integer>>();
|
||||
|
||||
public CTMTextureData[] sideOverrides = new CTMTextureData[6];
|
||||
|
||||
public CTMTextureData facingOverride;
|
||||
|
||||
public int facing;
|
||||
|
||||
public CTMData(String textureName, Block block, List<Integer> connectableMeta)
|
||||
{
|
||||
mainTextureData = new CTMTextureData(textureName);
|
||||
acceptableBlockMetas.put(block, connectableMeta);
|
||||
}
|
||||
|
||||
public CTMData addSideOverride(ForgeDirection side, String sideTexture)
|
||||
{
|
||||
sideOverrides[side.ordinal()] = new CTMTextureData(sideTexture);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public CTMData addFacingOverride(String facingTexture)
|
||||
{
|
||||
facingOverride = new CTMTextureData(facingTexture);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean hasFacingOverride()
|
||||
{
|
||||
return facingOverride != null;
|
||||
}
|
||||
|
||||
public void setFacing(int newFacing)
|
||||
{
|
||||
facing = newFacing;
|
||||
}
|
||||
|
||||
public CTMData registerIcons(IIconRegister register)
|
||||
{
|
||||
mainTextureData.registerIcons(register);
|
||||
|
||||
if(facingOverride != null)
|
||||
{
|
||||
facingOverride.registerIcons(register);
|
||||
}
|
||||
|
||||
for(CTMTextureData data : sideOverrides)
|
||||
{
|
||||
if(data != null)
|
||||
{
|
||||
data.registerIcons(register);
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public CTMTextureData getTextureData(int side)
|
||||
{
|
||||
if(hasFacingOverride() && side == facing)
|
||||
{
|
||||
return facingOverride;
|
||||
}
|
||||
if(sideOverrides[side] != null)
|
||||
{
|
||||
return sideOverrides[side];
|
||||
}
|
||||
return mainTextureData;
|
||||
}
|
||||
|
||||
public IIcon getIcon(int side)
|
||||
{
|
||||
return getTextureData(side).icon;
|
||||
}
|
||||
|
||||
public TextureSubmap getSubmap(int side)
|
||||
{
|
||||
return getTextureData(side).submap;
|
||||
}
|
||||
|
||||
public TextureSubmap getSmallSubmap(int side)
|
||||
{
|
||||
return getTextureData(side).submapSmall;
|
||||
}
|
||||
|
||||
public CTMData addOtherBlockConnectivities(Block block, List<Integer> connectableMeta)
|
||||
{
|
||||
acceptableBlockMetas.put(block, connectableMeta);
|
||||
return this;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public boolean shouldRenderSide(IBlockAccess world, int x, int y, int z, int side)
|
||||
{
|
||||
Coord4D obj = new Coord4D(x, y, z);
|
||||
Block coordBlock = obj.getBlock(world);
|
||||
int coordMeta = obj.getMetadata(world);
|
||||
boolean valid = false;
|
||||
|
||||
for(Entry<Block, List<Integer>> entry : acceptableBlockMetas.entrySet())
|
||||
{
|
||||
valid |= entry.getKey().equals(coordBlock) && entry.getValue().contains(coordMeta);
|
||||
}
|
||||
return !valid;
|
||||
}
|
||||
|
||||
}
|
31
src/main/java/mekanism/common/CTMTextureData.java
Normal file
|
@ -0,0 +1,31 @@
|
|||
package mekanism.common;
|
||||
|
||||
import mekanism.client.render.block.TextureSubmap;
|
||||
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class CTMTextureData
|
||||
{
|
||||
public IIcon icon;
|
||||
|
||||
public TextureSubmap submap;
|
||||
|
||||
public TextureSubmap submapSmall;
|
||||
|
||||
public String texture;
|
||||
|
||||
public CTMTextureData(String textureName)
|
||||
{
|
||||
texture = textureName;
|
||||
}
|
||||
|
||||
public void registerIcons(IIconRegister register)
|
||||
{
|
||||
icon = register.registerIcon("mekanism:" + texture);
|
||||
submap = new TextureSubmap(register.registerIcon("mekanism:" + texture + "-ctm"), 4, 4);
|
||||
submapSmall = new TextureSubmap(icon, 2, 2);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,127 +0,0 @@
|
|||
package mekanism.common;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class ConnectedTextureRenderer
|
||||
{
|
||||
public static final byte[][] sideEdges = {{2, 5, 3, 4}, {2, 5, 3, 4}, {1, 4, 0, 5}, {1, 5, 0, 4}, {1, 3, 0, 2}, {1, 2, 0, 3}};
|
||||
|
||||
public Block block;
|
||||
public List<Integer> metadata;
|
||||
|
||||
public String iconTitle;
|
||||
|
||||
public Map<Integer, IIcon> glassMap = new HashMap<Integer, IIcon>();
|
||||
|
||||
public ConnectedTextureRenderer(String title, Block b, List<Integer> meta)
|
||||
{
|
||||
iconTitle = title;
|
||||
block = b;
|
||||
metadata = meta;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerIcons(IIconRegister register)
|
||||
{
|
||||
glassMap.put(0, register.registerIcon("mekanism:" + iconTitle + "_13"));
|
||||
glassMap.put(1, register.registerIcon("mekanism:" + iconTitle + "_20"));
|
||||
glassMap.put(4, register.registerIcon("mekanism:" + iconTitle + "_19"));
|
||||
glassMap.put(5, register.registerIcon("mekanism:" + iconTitle + "_23"));
|
||||
glassMap.put(7, register.registerIcon("mekanism:" + iconTitle + "_1"));
|
||||
glassMap.put(16, register.registerIcon("mekanism:" + iconTitle + "_7"));
|
||||
glassMap.put(17, register.registerIcon("mekanism:" + iconTitle + "_35"));
|
||||
glassMap.put(20, register.registerIcon("mekanism:" + iconTitle + "_40"));
|
||||
glassMap.put(21, register.registerIcon("mekanism:" + iconTitle + "_21"));
|
||||
glassMap.put(23, register.registerIcon("mekanism:" + iconTitle + "_31"));
|
||||
glassMap.put(28, register.registerIcon("mekanism:" + iconTitle + "_14"));
|
||||
glassMap.put(29, register.registerIcon("mekanism:" + iconTitle + "_45"));
|
||||
glassMap.put(31, register.registerIcon("mekanism:" + iconTitle + "_2"));
|
||||
glassMap.put(64, register.registerIcon("mekanism:" + iconTitle + "_8"));
|
||||
glassMap.put(65, register.registerIcon("mekanism:" + iconTitle + "_41"));
|
||||
glassMap.put(68, register.registerIcon("mekanism:" + iconTitle + "_46"));
|
||||
glassMap.put(69, register.registerIcon("mekanism:" + iconTitle + "_22"));
|
||||
glassMap.put(71, register.registerIcon("mekanism:" + iconTitle + "_32"));
|
||||
glassMap.put(80, register.registerIcon("mekanism:" + iconTitle + "_11"));
|
||||
glassMap.put(81, register.registerIcon("mekanism:" + iconTitle + "_10"));
|
||||
glassMap.put(84, register.registerIcon("mekanism:" + iconTitle + "_9"));
|
||||
glassMap.put(85, register.registerIcon("mekanism:" + iconTitle + "_17"));
|
||||
glassMap.put(87, register.registerIcon("mekanism:" + iconTitle + "_5"));
|
||||
glassMap.put(92, register.registerIcon("mekanism:" + iconTitle + "_34"));
|
||||
glassMap.put(93, register.registerIcon("mekanism:" + iconTitle + "_18"));
|
||||
glassMap.put(95, register.registerIcon("mekanism:" + iconTitle + "_6"));
|
||||
glassMap.put(112, register.registerIcon("mekanism:" + iconTitle + "_25"));
|
||||
glassMap.put(113, register.registerIcon("mekanism:" + iconTitle + "_43"));
|
||||
glassMap.put(116, register.registerIcon("mekanism:" + iconTitle + "_42"));
|
||||
glassMap.put(117, register.registerIcon("mekanism:" + iconTitle + "_29"));
|
||||
glassMap.put(119, register.registerIcon("mekanism:" + iconTitle + "_37"));
|
||||
glassMap.put(124, register.registerIcon("mekanism:" + iconTitle + "_26"));
|
||||
glassMap.put(125, register.registerIcon("mekanism:" + iconTitle + "_30"));
|
||||
glassMap.put(127, register.registerIcon("mekanism:" + iconTitle + "_38"));
|
||||
glassMap.put(193, register.registerIcon("mekanism:" + iconTitle + "_12"));
|
||||
glassMap.put(197, register.registerIcon("mekanism:" + iconTitle + "_44"));
|
||||
glassMap.put(199, register.registerIcon("mekanism:" + iconTitle + "_0"));
|
||||
glassMap.put(209, register.registerIcon("mekanism:" + iconTitle + "_33"));
|
||||
glassMap.put(213, register.registerIcon("mekanism:" + iconTitle + "_16"));
|
||||
glassMap.put(215, register.registerIcon("mekanism:" + iconTitle + "_4"));
|
||||
glassMap.put(221, register.registerIcon("mekanism:" + iconTitle + "_15"));
|
||||
glassMap.put(223, register.registerIcon("mekanism:" + iconTitle + "_3"));
|
||||
glassMap.put(241, register.registerIcon("mekanism:" + iconTitle + "_24"));
|
||||
glassMap.put(245, register.registerIcon("mekanism:" + iconTitle + "_28"));
|
||||
glassMap.put(247, register.registerIcon("mekanism:" + iconTitle + "_36"));
|
||||
glassMap.put(253, register.registerIcon("mekanism:" + iconTitle + "_27"));
|
||||
glassMap.put(255, register.registerIcon("mekanism:" + iconTitle + "_39"));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side)
|
||||
{
|
||||
int map = 0;
|
||||
|
||||
for(int face = 0; face < 4; face++)
|
||||
{
|
||||
int side0 = sideEdges[side][((face + 3) % 4)];
|
||||
int side1 = sideEdges[side][face];
|
||||
|
||||
if(!canConnect(world, new Coord4D(x, y, z), sideEdges[side][face], side))
|
||||
{
|
||||
map |= (7 << face * 2) % 256 | 7 >>> 8 - face * 2;
|
||||
}
|
||||
else if(!canConnect(world, new Coord4D(x, y, z).getFromSide(ForgeDirection.getOrientation(side0)), side1, side))
|
||||
{
|
||||
map |= 1 << face * 2;
|
||||
}
|
||||
else if(!canConnect(world, new Coord4D(x, y, z).getFromSide(ForgeDirection.getOrientation(side1)), side0, side))
|
||||
{
|
||||
map |= 1 << face * 2;
|
||||
}
|
||||
}
|
||||
|
||||
return glassMap.get(map);
|
||||
}
|
||||
|
||||
private boolean canConnect(IBlockAccess access, Coord4D obj, int side, int face)
|
||||
{
|
||||
Coord4D coord = obj.getFromSide(ForgeDirection.getOrientation(side));
|
||||
Coord4D coordAbove = obj.getFromSide(ForgeDirection.getOrientation(face));
|
||||
|
||||
return (coord.getBlock(access) == block && metadata.contains(coord.getMetadata(access))) && (coordAbove.getBlock(access) != block || metadata.contains(coordAbove.getMetadata(access)));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public boolean shouldRenderSide(IBlockAccess world, int x, int y, int z, int side)
|
||||
{
|
||||
Coord4D obj = new Coord4D(x, y, z).getFromSide(ForgeDirection.getOrientation(side).getOpposite());
|
||||
return obj.getBlock(world) != block || !metadata.contains(obj.getMetadata(world));
|
||||
}
|
||||
}
|
11
src/main/java/mekanism/common/base/IBlockCTM.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package mekanism.common.base;
|
||||
|
||||
import mekanism.common.CTMData;
|
||||
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IBlockCTM
|
||||
{
|
||||
public CTMData getCTMData(IBlockAccess world, int x, int y, int z, int meta);
|
||||
}
|
|
@ -8,7 +8,8 @@ import java.util.Random;
|
|||
import mekanism.api.Coord4D;
|
||||
import mekanism.api.Range4D;
|
||||
import mekanism.client.ClientProxy;
|
||||
import mekanism.common.ConnectedTextureRenderer;
|
||||
import mekanism.common.base.IBlockCTM;
|
||||
import mekanism.common.CTMData;
|
||||
import mekanism.common.ItemAttacher;
|
||||
import mekanism.common.Mekanism;
|
||||
import mekanism.common.MekanismBlocks;
|
||||
|
@ -72,11 +73,11 @@ import cpw.mods.fml.relauncher.SideOnly;
|
|||
* @author AidanBrady
|
||||
*
|
||||
*/
|
||||
public class BlockBasic extends Block
|
||||
public class BlockBasic extends Block implements IBlockCTM
|
||||
{
|
||||
public IIcon[][] icons = new IIcon[256][6];
|
||||
|
||||
public ConnectedTextureRenderer glassRenderer = new ConnectedTextureRenderer("glass/DynamicGlass", this, Arrays.asList(10));
|
||||
public CTMData[][] ctms = new CTMData[16][2];
|
||||
|
||||
public BlockBasic()
|
||||
{
|
||||
|
@ -134,11 +135,19 @@ public class BlockBasic extends Block
|
|||
icons[14][2] = register.registerIcon("mekanism:SalinationBlock");
|
||||
icons[15][0] = register.registerIcon("mekanism:SalinationValve");
|
||||
|
||||
glassRenderer.registerIcons(register);
|
||||
ctms[9][0] = new CTMData("ctm/DynamicTank", this, Arrays.asList(9, 11)).registerIcons(register);
|
||||
ctms[10][0] = new CTMData("ctm/DynamicGlass", this, Arrays.asList(10)).registerIcons(register);
|
||||
ctms[11][0] = new CTMData("ctm/DynamicValve", this, Arrays.asList(11, 9)).registerIcons(register);
|
||||
|
||||
ctms[14][0] = new CTMData("ctm/SalinationBlock", this, Arrays.asList(14, 15)).addOtherBlockConnectivities(MekanismBlocks.BasicBlock2, Arrays.asList(0)).addFacingOverride("ctm/SalinationController").registerIcons(register);
|
||||
ctms[14][1] = new CTMData("ctm/SalinationBlock", this, Arrays.asList(14, 15)).addOtherBlockConnectivities(MekanismBlocks.BasicBlock2, Arrays.asList(0)).addFacingOverride("ctm/SalinationControllerOn").registerIcons(register);
|
||||
ctms[15][0] = new CTMData("ctm/SalinationValve", this, Arrays.asList(15, 14)).addOtherBlockConnectivities(MekanismBlocks.BasicBlock2, Arrays.asList(0)).registerIcons(register);
|
||||
}
|
||||
else if(this == MekanismBlocks.BasicBlock2)
|
||||
{
|
||||
icons[0][0] = register.registerIcon("mekanism:SalinationBlock");
|
||||
|
||||
ctms[0][0] = new CTMData("ctm/SalinationBlock", this, Arrays.asList(0)).addOtherBlockConnectivities(MekanismBlocks.BasicBlock, Arrays.asList(14, 15)).registerIcons(register);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -150,39 +159,39 @@ public class BlockBasic extends Block
|
|||
|
||||
if(this == MekanismBlocks.BasicBlock)
|
||||
{
|
||||
if(metadata == 6)
|
||||
switch(metadata)
|
||||
{
|
||||
TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getTileEntity(x, y, z);
|
||||
case 6:
|
||||
TileEntityBasicBlock tileEntity6 = (TileEntityBasicBlock)world.getTileEntity(x, y, z);
|
||||
|
||||
if(side == 0 || side == 1)
|
||||
{
|
||||
return MekanismUtils.isActive(world, x, y, z) ? icons[6][3] : icons[6][1];
|
||||
}
|
||||
else if(side == tileEntity.facing)
|
||||
else if(side == tileEntity6.facing)
|
||||
{
|
||||
return MekanismUtils.isActive(world, x, y, z) ? icons[6][4] : icons[6][2];
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
return icons[6][0];
|
||||
}
|
||||
}
|
||||
else if(metadata == 10)
|
||||
{
|
||||
return glassRenderer.getIcon(world, x, y, z, side);
|
||||
}
|
||||
else if(metadata == 14)
|
||||
{
|
||||
TileEntitySalinationController tileEntity = (TileEntitySalinationController)world.getTileEntity(x, y, z);
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
return ctms[metadata][0].getIcon(side);
|
||||
case 14:
|
||||
TileEntitySalinationController tileEntity14 = (TileEntitySalinationController)world.getTileEntity(x, y, z);
|
||||
|
||||
if(side == tileEntity.facing)
|
||||
if(side == tileEntity14.facing)
|
||||
{
|
||||
return tileEntity.structured ? icons[14][1] : icons[14][0];
|
||||
return tileEntity14.structured ? icons[14][1] : icons[14][0];
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
return icons[14][2];
|
||||
}
|
||||
}
|
||||
else {
|
||||
default:
|
||||
return getIcon(side, metadata);
|
||||
}
|
||||
}
|
||||
|
@ -583,7 +592,7 @@ public class BlockBasic extends Block
|
|||
@SideOnly(Side.CLIENT)
|
||||
public int getRenderType()
|
||||
{
|
||||
return ClientProxy.BASIC_RENDER_ID;
|
||||
return ClientProxy.CTM_RENDER_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -795,9 +804,10 @@ public class BlockBasic extends Block
|
|||
@SideOnly(Side.CLIENT)
|
||||
public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side)
|
||||
{
|
||||
if(this == MekanismBlocks.BasicBlock && world.getBlockMetadata(x, y, z) == 10)
|
||||
Coord4D obj = new Coord4D(x, y, z).getFromSide(ForgeDirection.getOrientation(side).getOpposite());
|
||||
if(this == MekanismBlocks.BasicBlock && obj.getMetadata(world) == 10)
|
||||
{
|
||||
return glassRenderer.shouldRenderSide(world, x, y, z, side);
|
||||
return ctms[10][0].shouldRenderSide(world, x, y, z, side);
|
||||
}
|
||||
else {
|
||||
return super.shouldSideBeRendered(world, x, y, z, side);
|
||||
|
@ -843,4 +853,15 @@ public class BlockBasic extends Block
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CTMData getCTMData(IBlockAccess world, int x, int y, int z, int meta)
|
||||
{
|
||||
if(ctms[meta][1] != null && MekanismUtils.isActive(world, x, y, z))
|
||||
{
|
||||
return ctms[meta][1];
|
||||
}
|
||||
|
||||
return ctms[meta][0];
|
||||
}
|
||||
}
|
|
@ -10,6 +10,7 @@ import mekanism.api.Coord4D;
|
|||
import mekanism.api.ISalinationSolar;
|
||||
import mekanism.api.Range4D;
|
||||
import mekanism.common.Mekanism;
|
||||
import mekanism.common.base.IActiveState;
|
||||
import mekanism.common.content.tank.TankUpdateProtocol;
|
||||
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
||||
import mekanism.common.util.MekanismUtils;
|
||||
|
@ -26,7 +27,7 @@ import net.minecraftforge.fluids.FluidTank;
|
|||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class TileEntitySalinationController extends TileEntitySalinationBlock
|
||||
public class TileEntitySalinationController extends TileEntitySalinationBlock implements IActiveState
|
||||
{
|
||||
public static final int MAX_BRINE = 10000;
|
||||
public static final int MAX_SOLARS = 4;
|
||||
|
@ -755,4 +756,28 @@ public class TileEntitySalinationController extends TileEntitySalinationBlock
|
|||
{
|
||||
return INFINITE_EXTENT_AABB;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getActive()
|
||||
{
|
||||
return structured;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setActive(boolean active)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean renderUpdate()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean lightUpdate()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,16 @@
|
|||
package mekanism.generators.common.block;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.client.ClientProxy;
|
||||
import mekanism.common.CTMData;
|
||||
import mekanism.common.ItemAttacher;
|
||||
import mekanism.common.Mekanism;
|
||||
import mekanism.common.MekanismBlocks;
|
||||
import mekanism.common.base.IBlockCTM;
|
||||
import mekanism.common.tile.TileEntityBasicBlock;
|
||||
import mekanism.common.tile.TileEntityElectricBlock;
|
||||
import mekanism.common.util.MekanismUtils;
|
||||
|
@ -29,15 +35,19 @@ import net.minecraft.tileentity.TileEntity;
|
|||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.api.tools.IToolWrench;
|
||||
import cpw.mods.fml.common.ModAPIManager;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class BlockReactor extends BlockContainer
|
||||
public class BlockReactor extends BlockContainer implements IBlockCTM
|
||||
{
|
||||
public IIcon[][] icons = new IIcon[16][16];
|
||||
|
||||
public CTMData[] ctms = new CTMData[16];
|
||||
|
||||
public BlockReactor()
|
||||
{
|
||||
super(Material.iron);
|
||||
|
@ -63,6 +73,9 @@ public class BlockReactor extends BlockContainer
|
|||
{
|
||||
icons[0][0] = register.registerIcon("mekanism:ReactorGlass");
|
||||
icons[1][0] = register.registerIcon("mekanism:ReactorLaserFocus");
|
||||
|
||||
ctms[0] = new CTMData("ctm/ReactorGlass", this, Arrays.asList(0, 1)).registerIcons(register);
|
||||
ctms[1] = new CTMData("ctm/ReactorLaserFocus", this, Arrays.asList(1, 0)).registerIcons(register);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -253,6 +266,12 @@ public class BlockReactor extends BlockContainer
|
|||
return this == GeneratorsBlocks.Reactor ? 0 : 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderType()
|
||||
{
|
||||
return ClientProxy.CTM_RENDER_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpaqueCube()
|
||||
{
|
||||
|
@ -280,6 +299,34 @@ public class BlockReactor extends BlockContainer
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CTMData getCTMData(IBlockAccess world, int x, int y, int z, int meta)
|
||||
{
|
||||
return ctms[meta];
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side)
|
||||
{
|
||||
Coord4D obj = new Coord4D(x, y, z).getFromSide(ForgeDirection.getOrientation(side).getOpposite());
|
||||
if(this == GeneratorsBlocks.ReactorGlass)
|
||||
{
|
||||
int metadata = obj.getMetadata(world);
|
||||
switch(metadata)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
return ctms[metadata].shouldRenderSide(world, x, y, z, side);
|
||||
default:
|
||||
return super.shouldSideBeRendered(world, x, y, z, side);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return super.shouldSideBeRendered(world, x, y, z, side);
|
||||
}
|
||||
}
|
||||
|
||||
public static enum ReactorBlockType
|
||||
{
|
||||
CONTROLLER(GeneratorsBlocks.Reactor, 0, "ReactorController", 10, TileEntityReactorController.class),
|
||||
|
|
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"animation": {
|
||||
"frametime": 10
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"animation": {
|
||||
"frametime": 10
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |