Redesigned texture states system
This commit is contained in:
parent
5ab655a226
commit
725644b5fc
10 changed files with 267 additions and 95 deletions
29
api/buildcraft/api/rendering/ICullable.java
Normal file
29
api/buildcraft/api/rendering/ICullable.java
Normal file
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
|
||||
* http://www.mod-buildcraft.com
|
||||
*
|
||||
* BuildCraft is distributed under the terms of the Minecraft Mod Public
|
||||
* License 1.0, or MMPL. Please check the contents of the license located in
|
||||
* http://www.mod-buildcraft.com/MMPL-1.0.txt
|
||||
*
|
||||
* Facade API extraction performed by Itaros(Semion Nadezhdin)
|
||||
*/
|
||||
package buildcraft.api.rendering;
|
||||
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
/*
|
||||
* Implement on Block class to make it able to respond to facade render helper queries
|
||||
* For implementation details look into BlockGenericPipe implementation
|
||||
*/
|
||||
public interface ICullable {
|
||||
|
||||
//Side Rendering States
|
||||
//They are used to effectively cull obstructed sides while processing facades.
|
||||
//Make sure your implementation is correct otherwise expect FPS drop
|
||||
void setRenderSide(ForgeDirection side, boolean render);
|
||||
void setRenderAllSides();
|
||||
boolean shouldSideBeRendered(IBlockAccess blockAccess, int x, int y, int z, int side);
|
||||
|
||||
}
|
12
api/buildcraft/api/rendering/package-info.java
Normal file
12
api/buildcraft/api/rendering/package-info.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
/**
|
||||
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
|
||||
* http://www.mod-buildcraft.com
|
||||
*
|
||||
* BuildCraft is distributed under the terms of the Minecraft Mod Public
|
||||
* License 1.0, or MMPL. Please check the contents of the license located in
|
||||
* http://www.mod-buildcraft.com/MMPL-1.0.txt
|
||||
*/
|
||||
@API(apiVersion = "2.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|rendering")
|
||||
package buildcraft.api.rendering;
|
||||
import cpw.mods.fml.common.API;
|
||||
|
|
@ -16,6 +16,10 @@ import java.util.Locale;
|
|||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import cpw.mods.fml.common.registry.GameRegistry;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -36,13 +40,7 @@ import net.minecraft.util.MovingObjectPosition;
|
|||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.common.registry.GameRegistry;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.BuildCraftTransport;
|
||||
import buildcraft.api.core.BCLog;
|
||||
import buildcraft.api.core.BlockIndex;
|
||||
|
@ -63,17 +61,22 @@ import buildcraft.core.utils.Utils;
|
|||
import buildcraft.transport.gates.GateDefinition;
|
||||
import buildcraft.transport.gates.GateFactory;
|
||||
import buildcraft.transport.gates.ItemGate;
|
||||
import buildcraft.transport.render.ITextureStates;
|
||||
import buildcraft.transport.render.PipeRendererWorld;
|
||||
import buildcraft.transport.render.TextureStateManager;
|
||||
import buildcraft.transport.utils.FacadeMatrix;
|
||||
|
||||
public class BlockGenericPipe extends BlockBuildCraft {
|
||||
|
||||
public class BlockGenericPipe extends BlockBuildCraft implements ITextureStates{
|
||||
|
||||
public static int facadeRenderColor = -1;
|
||||
public static Map<Item, Class<? extends Pipe>> pipes = new HashMap<Item, Class<? extends Pipe>>();
|
||||
public static Map<BlockIndex, Pipe<?>> pipeRemoved = new HashMap<BlockIndex, Pipe<?>>();
|
||||
|
||||
private static long lastRemovedDate = -1;
|
||||
|
||||
|
||||
private static final ForgeDirection[] DIR_VALUES = ForgeDirection.values();
|
||||
|
||||
static enum Part {
|
||||
Pipe,
|
||||
Gate,
|
||||
|
@ -82,6 +85,9 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
RobotStation
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private TextureStateManager textureState;
|
||||
|
||||
static class RaytraceResult {
|
||||
public final Part hitPart;
|
||||
public final MovingObjectPosition movingObjectPosition;
|
||||
|
@ -100,7 +106,7 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
return String.format("RayTraceResult: %s, %s", hitPart == null ? "null" : hitPart.name(), boundingBox == null ? "null" : boundingBox.toString());
|
||||
}
|
||||
}
|
||||
private static final ForgeDirection[] DIR_VALUES = ForgeDirection.values();
|
||||
|
||||
private boolean skippedFirstIconRegister;
|
||||
private int renderMask = 0;
|
||||
|
||||
|
@ -1028,20 +1034,17 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
pipe.dropItem(pipeWire.getStack());
|
||||
}
|
||||
|
||||
@SuppressWarnings({"all"})
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIcon(IBlockAccess iblockaccess, int x, int y, int z, int side) {
|
||||
TileEntity tile = iblockaccess.getTileEntity(x, y, z);
|
||||
if (!(tile instanceof TileGenericPipe)) {
|
||||
return null;
|
||||
}
|
||||
if (((TileGenericPipe) tile).renderState.textureArray != null) {
|
||||
return ((TileGenericPipe) tile).renderState.textureArray[side];
|
||||
}
|
||||
return ((TileGenericPipe) tile).renderState.currentTexture;
|
||||
public TextureStateManager getTextureState() {
|
||||
return textureState;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIcon(int side, int meta) {
|
||||
return textureState.isSided() ? textureState.getTextureArray()[side] : textureState.getTexture();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onEntityCollidedWithBlock(World world, int i, int j, int k, Entity entity) {
|
||||
super.onEntityCollidedWithBlock(world, i, j, k, entity);
|
||||
|
@ -1184,6 +1187,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
skippedFirstIconRegister = true;
|
||||
return;
|
||||
}
|
||||
|
||||
textureState = new TextureStateManager(null);
|
||||
|
||||
BuildCraftTransport.instance.wireIconProvider.registerIcons(iconRegister);
|
||||
|
||||
|
@ -1207,12 +1212,6 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getIcon(int par1, int par2) {
|
||||
return BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.Stripes.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn a digging particle effect in the world, this is a wrapper around
|
||||
* EffectRenderer.addBlockHitEffects to allow the block more control over
|
||||
|
@ -1337,4 +1336,11 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block getBlock() {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -9,12 +9,6 @@
|
|||
package buildcraft.transport;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import buildcraft.core.network.IClientState;
|
||||
import buildcraft.transport.utils.ConnectionMatrix;
|
||||
import buildcraft.transport.utils.FacadeMatrix;
|
||||
|
@ -33,13 +27,6 @@ public class PipeRenderState implements IClientState {
|
|||
public final FacadeMatrix facadeMatrix = new FacadeMatrix();
|
||||
public final GateMatrix gateMatrix = new GateMatrix();
|
||||
|
||||
/*
|
||||
* This is a placeholder for the pipe renderer to set to a value that the BlockGenericPipe->TileGenericPipe will then return the the WorldRenderer
|
||||
*/
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon currentTexture;
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon[] textureArray;
|
||||
|
||||
private boolean dirty = true;
|
||||
|
||||
|
|
|
@ -11,6 +11,9 @@ package buildcraft.transport;
|
|||
import java.util.LinkedList;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -23,17 +26,12 @@ import net.minecraft.network.Packet;
|
|||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldServer;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
|
||||
import buildcraft.BuildCraftCore;
|
||||
import buildcraft.BuildCraftTransport;
|
||||
import buildcraft.api.core.BCLog;
|
||||
|
@ -67,9 +65,10 @@ import buildcraft.transport.gates.GateFactory;
|
|||
import buildcraft.transport.gates.ItemGate;
|
||||
import buildcraft.transport.utils.RobotStationState;
|
||||
|
||||
|
||||
public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFluidHandler,
|
||||
IPipeTile, IOverrideDefaultTriggers, ITileBufferHolder,
|
||||
IDropControlInventory, ISyncedTile, ISolidSideTile, IGuiReturnHandler {
|
||||
IDropControlInventory, ISyncedTile, ISolidSideTile, IGuiReturnHandler{
|
||||
|
||||
public boolean initialized = false;
|
||||
public final PipeRenderState renderState = new PipeRenderState();
|
||||
|
@ -1113,4 +1112,5 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui
|
|||
((IPowerReceptor) pipe).doWork(workProvider);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,9 +13,7 @@ import net.minecraft.client.renderer.RenderBlocks;
|
|||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.BuildCraftTransport;
|
||||
import buildcraft.core.CoreConstants;
|
||||
import buildcraft.core.utils.MatrixTranformations;
|
||||
|
@ -93,9 +91,12 @@ public final class FacadeRenderHelper {
|
|||
rotated[2][1] - zOffsets[side.ordinal()]);
|
||||
}
|
||||
|
||||
public static void pipeFacadeRenderer(RenderBlocks renderblocks, BlockGenericPipe block, PipeRenderState state, int x, int y, int z) {
|
||||
state.textureArray = new IIcon[6];
|
||||
public static void pipeFacadeRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z) {
|
||||
ITextureStates textureManager = (ITextureStates) blockStateMachine;
|
||||
IIcon[] textures = textureManager.getTextureState().popArray();
|
||||
|
||||
//block_statemachine.setRenderAllSides();
|
||||
|
||||
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
|
||||
Block renderBlock = state.facadeMatrix.getFacadeBlock(direction);
|
||||
|
||||
|
@ -105,11 +106,11 @@ public final class FacadeRenderHelper {
|
|||
int renderMeta = state.facadeMatrix.getFacadeMetaId(direction);
|
||||
|
||||
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
|
||||
state.textureArray[side.ordinal()] = renderBlock.getIcon(side.ordinal(), renderMeta);
|
||||
textures[side.ordinal()] = renderBlock.getIcon(side.ordinal(), renderMeta);
|
||||
if (side == direction || side == direction.getOpposite()) {
|
||||
block.setRenderSide(side, true);
|
||||
blockStateMachine.setRenderSide(side, true);
|
||||
} else {
|
||||
block.setRenderSide(side, state.facadeMatrix.getFacadeBlock(side) == null);
|
||||
blockStateMachine.setRenderSide(side, state.facadeMatrix.getFacadeBlock(side) == null);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,7 +140,7 @@ public final class FacadeRenderHelper {
|
|||
rotated[2][1] = CoreConstants.PIPE_MIN_POS - zFightOffset * 2;
|
||||
MatrixTranformations.transform(rotated, direction);
|
||||
setRenderBounds(renderblocks, rotated, direction);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
|
||||
rotated = MatrixTranformations.deepClone(zeroStateFacade);
|
||||
rotated[0][0] = CoreConstants.PIPE_MIN_POS - zFightOffset * 4;
|
||||
|
@ -147,26 +148,26 @@ public final class FacadeRenderHelper {
|
|||
rotated[2][0] = CoreConstants.PIPE_MAX_POS + zFightOffset * 2;
|
||||
MatrixTranformations.transform(rotated, direction);
|
||||
setRenderBounds(renderblocks, rotated, direction);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
|
||||
rotated = MatrixTranformations.deepClone(zeroStateFacade);
|
||||
rotated[0][0] = 0.0F;
|
||||
rotated[0][1] = CoreConstants.PIPE_MIN_POS - zFightOffset * 2;
|
||||
MatrixTranformations.transform(rotated, direction);
|
||||
setRenderBounds(renderblocks, rotated, direction);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
|
||||
rotated = MatrixTranformations.deepClone(zeroStateFacade);
|
||||
rotated[0][0] = CoreConstants.PIPE_MAX_POS + zFightOffset * 2;
|
||||
rotated[0][1] = 1F;
|
||||
MatrixTranformations.transform(rotated, direction);
|
||||
setRenderBounds(renderblocks, rotated, direction);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
} else { // Solid facade
|
||||
float[][] rotated = MatrixTranformations.deepClone(zeroStateFacade);
|
||||
MatrixTranformations.transform(rotated, direction);
|
||||
setRenderBounds(renderblocks, rotated, direction);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
}
|
||||
|
||||
if (renderBlock.getRenderType() == 31) {
|
||||
|
@ -183,10 +184,10 @@ public final class FacadeRenderHelper {
|
|||
BlockGenericPipe.facadeRenderColor = -1;
|
||||
}
|
||||
|
||||
state.textureArray = null;
|
||||
block.setRenderAllSides();
|
||||
textureManager.getTextureState().pushArray();
|
||||
blockStateMachine.setRenderAllSides();
|
||||
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal()); // Structure Pipe
|
||||
textureManager.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
|
||||
|
||||
// Always render connectors in pass 0
|
||||
if (PipeRendererWorld.renderPass == 0) {
|
||||
|
@ -196,7 +197,7 @@ public final class FacadeRenderHelper {
|
|||
MatrixTranformations.transform(rotated, direction);
|
||||
|
||||
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
package buildcraft.transport.render;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
|
||||
/*
|
||||
* This is fake block to render pluggables without altering host state
|
||||
* May prove useful if we will make API for roboports, plugs and facades
|
||||
*/
|
||||
@SideOnly(Side.CLIENT)
|
||||
public class FakePluggablesStateBlock extends Block implements ITextureStates {
|
||||
|
||||
private int renderMask = 0;
|
||||
|
||||
private TextureStateManager textureState;
|
||||
|
||||
|
||||
protected FakePluggablesStateBlock() {
|
||||
super(Material.glass);
|
||||
textureState = new TextureStateManager(null); //Always Clientside
|
||||
}
|
||||
|
||||
public TextureStateManager getTextureState() {
|
||||
return textureState;
|
||||
}
|
||||
@Override
|
||||
public IIcon getIcon(int side, int meta) {
|
||||
return textureState.isSided() ? textureState.getTextureArray()[side] : textureState.getTexture();
|
||||
}
|
||||
@Override
|
||||
public void setRenderSide(ForgeDirection side, boolean render) {
|
||||
if (render) {
|
||||
renderMask |= 1 << side.ordinal();
|
||||
} else {
|
||||
renderMask &= ~(1 << side.ordinal());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void setRenderAllSides() {
|
||||
renderMask = 0x3f;
|
||||
}
|
||||
@Override
|
||||
public Block getBlock() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public boolean shouldSideBeRendered(IBlockAccess blockAccess, int x, int y, int z, int side) {
|
||||
return (renderMask & (1 << side)) != 0;
|
||||
}
|
||||
|
||||
}
|
14
common/buildcraft/transport/render/ITextureStates.java
Normal file
14
common/buildcraft/transport/render/ITextureStates.java
Normal file
|
@ -0,0 +1,14 @@
|
|||
package buildcraft.transport.render;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.util.IIcon;
|
||||
import buildcraft.api.rendering.ICullable;
|
||||
|
||||
public interface ITextureStates extends ICullable {
|
||||
|
||||
TextureStateManager getTextureState();
|
||||
IIcon getIcon(int side, int meta);
|
||||
|
||||
Block getBlock();
|
||||
|
||||
}
|
|
@ -8,16 +8,16 @@
|
|||
*/
|
||||
package buildcraft.transport.render;
|
||||
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.BuildCraftTransport;
|
||||
import buildcraft.api.core.IIconProvider;
|
||||
import buildcraft.core.CoreConstants;
|
||||
|
@ -28,10 +28,13 @@ import buildcraft.transport.PipeRenderState;
|
|||
import buildcraft.transport.TileGenericPipe;
|
||||
import buildcraft.transport.TransportProxy;
|
||||
|
||||
public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public static int renderPass = -1;
|
||||
|
||||
public FakePluggablesStateBlock fakeBlock = new FakePluggablesStateBlock();
|
||||
|
||||
public void renderPipe(RenderBlocks renderblocks, IBlockAccess iblockaccess, BlockGenericPipe block, TileGenericPipe tile, int x, int y, int z) {
|
||||
PipeRenderState state = tile.renderState;
|
||||
IIconProvider icons = tile.getPipeIcons();
|
||||
|
@ -39,6 +42,8 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
if (icons == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Force pipe render into pass 0
|
||||
if (renderPass == 0) {
|
||||
|
@ -49,8 +54,8 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
|
||||
if (connectivity != 0x3f) { // note: 0x3f = 0x111111 = all sides
|
||||
resetToCenterDimensions(dim);
|
||||
|
||||
state.currentTexture = icons.getIcon(state.textureMatrix.getTextureIndex(ForgeDirection.UNKNOWN));
|
||||
|
||||
block.getTextureState().set(icons.getIcon(state.textureMatrix.getTextureIndex(ForgeDirection.UNKNOWN)));
|
||||
renderTwoWayBlock(renderblocks, block, x, y, z, dim, connectivity ^ 0x3f);
|
||||
}
|
||||
|
||||
|
@ -74,7 +79,7 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
int renderMask = (3 << (dir / 2 * 2)) ^ 0x3f;
|
||||
|
||||
// render sub block
|
||||
state.currentTexture = icons.getIcon(state.textureMatrix.getTextureIndex(ForgeDirection.VALID_DIRECTIONS[dir]));
|
||||
block.getTextureState().set(icons.getIcon(state.textureMatrix.getTextureIndex(ForgeDirection.VALID_DIRECTIONS[dir])));
|
||||
|
||||
renderTwoWayBlock(renderblocks, block, x, y, z, dim, renderMask);
|
||||
}
|
||||
|
@ -83,12 +88,13 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
renderblocks.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
// Facade renderer handles rendering in both passes
|
||||
pipeFacadeRenderer(renderblocks, block, state, x, y, z);
|
||||
pipeFacadeRenderer(renderblocks, fakeBlock, state, x, y, z);
|
||||
//block.setRenderAllSides();//Start fresh
|
||||
|
||||
// Force other opaque renders into pass 0
|
||||
if (renderPass == 0) {
|
||||
pipePlugRenderer(renderblocks, block, state, x, y, z);
|
||||
pipeRobotStationRenderer(renderblocks, block, state, x, y, z);
|
||||
pipePlugRenderer(renderblocks, fakeBlock, state, x, y, z);
|
||||
pipeRobotStationRenderer(renderblocks, fakeBlock, state, x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -117,11 +123,11 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
}
|
||||
|
||||
private void pipeFacadeRenderer(RenderBlocks renderblocks, BlockGenericPipe block, PipeRenderState state, int x, int y, int z) {
|
||||
FacadeRenderHelper.pipeFacadeRenderer(renderblocks, block, state, x, y, z);
|
||||
private void pipeFacadeRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z) {
|
||||
FacadeRenderHelper.pipeFacadeRenderer(renderblocks, blockStateMachine, state, x, y, z);
|
||||
}
|
||||
|
||||
private void pipePlugRenderer(RenderBlocks renderblocks, Block block, PipeRenderState state, int x, int y, int z) {
|
||||
private void pipePlugRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z) {
|
||||
float zFightOffset = 1F / 4096F;
|
||||
float[][] zeroState = new float[3][2];
|
||||
|
||||
|
@ -135,7 +141,7 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
zeroState[2][0] = 0.25F + zFightOffset;
|
||||
zeroState[2][1] = 0.75F - zFightOffset;
|
||||
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal()); // Structure Pipe
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
|
||||
|
||||
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
|
||||
if (state.plugMatrix.isConnected(direction)) {
|
||||
|
@ -143,7 +149,7 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
MatrixTranformations.transform(rotated, direction);
|
||||
|
||||
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,7 +163,7 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
zeroState[2][0] = 0.25F + 0.125F / 2;
|
||||
zeroState[2][1] = 0.75F - 0.125F / 2;
|
||||
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal()); // Structure Pipe
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
|
||||
|
||||
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
|
||||
if (state.plugMatrix.isConnected(direction)) {
|
||||
|
@ -165,14 +171,14 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
MatrixTranformations.transform(rotated, direction);
|
||||
|
||||
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void pipeRobotStationPartRender(RenderBlocks renderblocks,
|
||||
Block block, PipeRenderState state, int x, int y, int z,
|
||||
ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z,
|
||||
float xStart, float xEnd, float yStart, float yEnd, float zStart,
|
||||
float zEnd) {
|
||||
|
||||
|
@ -194,16 +200,16 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
switch (state.robotStationMatrix.getState(direction)) {
|
||||
case None:
|
||||
case Available:
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal());
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal()));
|
||||
break;
|
||||
case Reserved:
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal());
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal()));
|
||||
break;
|
||||
case Linked:
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal());
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal()));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -213,16 +219,16 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0],
|
||||
rotated[2][0], rotated[0][1], rotated[1][1],
|
||||
rotated[2][1]);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void pipeRobotStationRenderer(RenderBlocks renderblocks, Block block, PipeRenderState state, int x, int y, int z) {
|
||||
private void pipeRobotStationRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z) {
|
||||
//float width = 0.075F;
|
||||
|
||||
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
|
||||
pipeRobotStationPartRender (renderblocks, blockStateMachine, state, x, y, z,
|
||||
0.45F, 0.55F,
|
||||
0.0F, 0.224F,
|
||||
0.45F, 0.55F);
|
||||
|
@ -268,16 +274,16 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
switch (state.robotStationMatrix.getState(direction)) {
|
||||
case None:
|
||||
case Available:
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal());
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal()));
|
||||
break;
|
||||
case Reserved:
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal());
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal()));
|
||||
break;
|
||||
case Linked:
|
||||
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal());
|
||||
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
|
||||
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal()));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -287,7 +293,7 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
|
|||
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0],
|
||||
rotated[2][0], rotated[0][1], rotated[1][1],
|
||||
rotated[2][1]);
|
||||
renderblocks.renderStandardBlock(block, x, y, z);
|
||||
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
57
common/buildcraft/transport/render/TextureStateManager.java
Normal file
57
common/buildcraft/transport/render/TextureStateManager.java
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
|
||||
* http://www.mod-buildcraft.com
|
||||
*
|
||||
* BuildCraft is distributed under the terms of the Minecraft Mod Public
|
||||
* License 1.0, or MMPL. Please check the contents of the license located in
|
||||
* http://www.mod-buildcraft.com/MMPL-1.0.txt
|
||||
*
|
||||
* Texture State Manager by Itaros(Semion Nadezhdin)
|
||||
*/
|
||||
package buildcraft.transport.render;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
/*
|
||||
* This class moves texture management from PipeRenderState
|
||||
* to be filled while rendering as efficient as possible
|
||||
*/
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public final class TextureStateManager {
|
||||
|
||||
private IIcon currentTexture;
|
||||
private IIcon[] textureArray;
|
||||
private IIcon[] textureArrayCache;
|
||||
|
||||
public TextureStateManager(IIcon placeholder) {
|
||||
currentTexture = placeholder;
|
||||
textureArrayCache = new IIcon[6];
|
||||
}
|
||||
|
||||
public IIcon[] popArray() {
|
||||
textureArray = textureArrayCache;
|
||||
return textureArrayCache; //Thread safety. Seriously.
|
||||
}
|
||||
public void pushArray() {
|
||||
textureArray = null;
|
||||
}
|
||||
|
||||
|
||||
public IIcon getTexture() {
|
||||
return currentTexture;
|
||||
}
|
||||
public IIcon[] getTextureArray() {
|
||||
return textureArray;
|
||||
}
|
||||
|
||||
public boolean isSided() {
|
||||
return textureArray != null;
|
||||
}
|
||||
public void set(IIcon icon) {
|
||||
currentTexture = icon;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue