From 5e53d832afe8882f07d9853be012e87b357f5cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Wed, 27 Aug 2014 23:54:47 +0200 Subject: [PATCH] Made cables render a little socket / plug when connected to blocks and some other stuff. --- .../oc/client/renderer/block/Assembler.scala | 76 ++++++ .../client/renderer/block/BlockRenderer.scala | 251 +----------------- .../cil/oc/client/renderer/block/Cable.scala | 127 +++++++++ .../oc/client/renderer/block/Hologram.scala | 95 +++++++ .../renderer/font/StaticFontRenderer.scala | 3 +- .../cil/oc/common/multipart/CablePart.scala | 10 +- .../li/cil/oc/common/tileentity/Switch.scala | 3 +- .../cil/oc/server/network/ArgumentsImpl.scala | 10 +- src/main/scala/li/cil/oc/util/ItemUtils.scala | 4 +- 9 files changed, 328 insertions(+), 251 deletions(-) create mode 100644 src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala create mode 100644 src/main/scala/li/cil/oc/client/renderer/block/Cable.scala create mode 100644 src/main/scala/li/cil/oc/client/renderer/block/Hologram.scala diff --git a/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala b/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala new file mode 100644 index 000000000..7cddccae8 --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/block/Assembler.scala @@ -0,0 +1,76 @@ +package li.cil.oc.client.renderer.block + +import li.cil.oc.client.Textures +import li.cil.oc.util.RenderState +import net.minecraft.block.Block +import net.minecraft.client.renderer.RenderBlocks +import org.lwjgl.opengl.GL11 + +object Assembler { + def render(block: Block, metadata: Int, x: Int, y: Int, z: Int, renderer: RenderBlocks) { + val previousRenderAllFaces = renderer.renderAllFaces + renderer.renderAllFaces = true + + // Bottom. + renderer.setRenderBounds(0, 0, 0, 1, 7 / 16f, 1) + renderer.renderStandardBlock(block, x, y, z) + // Middle. + renderer.setRenderBounds(2 / 16f, 7 / 16f, 2 / 16f, 14 / 16f, 9 / 16f, 14 / 16f) + renderer.renderStandardBlock(block, x, y, z) + // Top. + renderer.setRenderBounds(0, 9 / 16f, 0, 1, 1, 1) + renderer.renderStandardBlock(block, x, y, z) + + renderer.renderAllFaces = previousRenderAllFaces + } + + def render(block: Block, metadata: Int, renderer: RenderBlocks) { + // Bottom. + renderer.setRenderBounds(0, 0, 0, 1, 7 / 16f, 1) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceYNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + + // Middle. + val previousRenderAllFaces = renderer.renderAllFaces + renderer.renderAllFaces = true + renderer.setRenderBounds(2 / 16f, 7 / 16f, 2 / 16f, 14 / 16f, 9 / 16f, 14 / 16f) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + renderer.renderAllFaces = previousRenderAllFaces + + // Top. + renderer.setRenderBounds(0, 9 / 16f, 0, 1, 1, 1) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceYNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) + RenderState.makeItBlend() + RenderState.disableLighting() + + renderer.setOverrideBlockTexture(Textures.RobotAssembler.iconTopOn) + renderer.setRenderBounds(0, 0, 0, 1, 1.05, 1) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + + renderer.setOverrideBlockTexture(Textures.RobotAssembler.iconSideOn) + renderer.setRenderBounds(-0.005, 0, 0, 1.005, 1, 1) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + renderer.setRenderBounds(0, 0, -0.005, 1, 1, 1.005) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + + renderer.clearOverrideBlockTexture() + RenderState.enableLighting() + GL11.glPopAttrib() + } + } diff --git a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala index ac04c5232..c5d4b7258 100644 --- a/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/block/BlockRenderer.scala @@ -9,7 +9,6 @@ import li.cil.oc.common.tileentity import li.cil.oc.util.RenderState import net.minecraft.block.Block import net.minecraft.client.renderer.{RenderBlocks, Tessellator} -import net.minecraft.util.AxisAlignedBB import net.minecraft.world.IBlockAccess import net.minecraftforge.common.ForgeDirection import org.lwjgl.opengl.GL11 @@ -28,7 +27,7 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { GL11.glScalef(1.6f, 1.6f, 1.6f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() - renderCable(block, metadata, renderer) + Cable.render(block, metadata, renderer) Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: cable") @@ -41,14 +40,14 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { case Some(assembler: RobotAssembler) => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() - renderAssembler(block, metadata, renderer) + Assembler.render(block, metadata, renderer) Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler") case Some(hologram: Hologram) => GL11.glTranslatef(-0.5f, -0.5f, -0.5f) Tessellator.instance.startDrawingQuads() - renderHologram(block, metadata, renderer) + Hologram.render(block, metadata, renderer) Tessellator.instance.draw() RenderState.checkError(getClass.getName + ".renderInventoryBlock: hologram") @@ -82,7 +81,7 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { world.getBlockTileEntity(x, y, z) match { case cable: tileentity.Cable => - renderCable(Cable.neighbors(world, x, y, z), block, cable.getBlockMetadata, x, y, z, renderer) + Cable.render(world, x, y, z, block, renderer) RenderState.checkError(getClass.getName + ".renderWorldBlock: cable") @@ -172,13 +171,13 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { true case assembler: tileentity.RobotAssembler => - renderAssembler(assembler.block, assembler.getBlockMetadata, x, y, z, renderer) + Assembler.render(assembler.block, assembler.getBlockMetadata, x, y, z, renderer) RenderState.checkError(getClass.getName + ".renderWorldBlock: assembler") true case hologram: tileentity.Hologram => - renderHologram(hologram.block, hologram.getBlockMetadata, x, y, z, renderer) + Hologram.render(hologram.block, hologram.getBlockMetadata, x, y, z, renderer) RenderState.checkError(getClass.getName + ".renderWorldBlock: hologram") @@ -192,258 +191,32 @@ object BlockRenderer extends ISimpleBlockRenderingHandler { } } - def renderAssembler(block: Block, metadata: Int, x: Int, y: Int, z: Int, renderer: RenderBlocks) { - val previousRenderAllFaces = renderer.renderAllFaces - renderer.renderAllFaces = true - - // Bottom. - renderer.setRenderBounds(0, 0, 0, 1, 7 / 16f, 1) - renderer.renderStandardBlock(block, x, y, z) - // Middle. - renderer.setRenderBounds(2 / 16f, 7 / 16f, 2 / 16f, 14 / 16f, 9 / 16f, 14 / 16f) - renderer.renderStandardBlock(block, x, y, z) - // Top. - renderer.setRenderBounds(0, 9 / 16f, 0, 1, 1, 1) - renderer.renderStandardBlock(block, x, y, z) - - renderer.renderAllFaces = previousRenderAllFaces - } - - def renderAssembler(block: Block, metadata: Int, renderer: RenderBlocks) { - // Bottom. - renderer.setRenderBounds(0, 0, 0, 1, 7 / 16f, 1) - renderFaceYPos(block, metadata, renderer) - renderFaceYNeg(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - - // Middle. - val previousRenderAllFaces = renderer.renderAllFaces - renderer.renderAllFaces = true - renderer.setRenderBounds(2 / 16f, 7 / 16f, 2 / 16f, 14 / 16f, 9 / 16f, 14 / 16f) - renderFaceXPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - renderer.renderAllFaces = previousRenderAllFaces - - // Top. - renderer.setRenderBounds(0, 9 / 16f, 0, 1, 1, 1) - renderFaceYPos(block, metadata, renderer) - renderFaceYNeg(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - - GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS) - RenderState.makeItBlend() - RenderState.disableLighting() - - renderer.setOverrideBlockTexture(Textures.RobotAssembler.iconTopOn) - renderer.setRenderBounds(0, 0, 0, 1, 1.05, 1) - renderFaceYPos(block, metadata, renderer) - - renderer.setOverrideBlockTexture(Textures.RobotAssembler.iconSideOn) - renderer.setRenderBounds(-0.005, 0, 0, 1.005, 1, 1) - renderFaceXPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderer.setRenderBounds(0, 0, -0.005, 1, 1, 1.005) - renderFaceZPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - - renderer.clearOverrideBlockTexture() - RenderState.enableLighting() - GL11.glPopAttrib() - } - - def renderCable(mask: Int, block: Block, metadata: Int, x: Int, y: Int, z: Int, renderer: RenderBlocks) { - // Center part. - val bounds = AxisAlignedBB.getBoundingBox(-0.125, -0.125, -0.125, 0.125, 0.125, 0.125) - bounds.offset(0.5, 0.5, 0.5) - renderer.setRenderBounds(bounds.minX, bounds.minY, bounds.minZ, bounds.maxX, bounds.maxY, bounds.maxZ) - renderer.renderStandardBlock(block, x, y, z) - - // Connections. - def renderPart(side: ForgeDirection, boundSetter: () => Unit) { - bounds.setBounds(-0.125, -0.125, -0.125, 0.125, 0.125, 0.125) - bounds.offset(side.offsetX * 0.25, side.offsetY * 0.25, side.offsetZ * 0.25) - boundSetter() - bounds.offset(0.5, 0.5, 0.5) - renderer.setRenderBounds(bounds.minX, bounds.minY, bounds.minZ, bounds.maxX, bounds.maxY, bounds.maxZ) - renderer.renderStandardBlock(block, x, y, z) - } - for (side <- ForgeDirection.VALID_DIRECTIONS) { - if ((side.flag & mask) != 0) { - renderPart(side, () => { - bounds.minX = math.min(bounds.minX, side.offsetX * 0.5) - bounds.maxX = math.max(bounds.maxX, side.offsetX * 0.5) - bounds.minY = math.min(bounds.minY, side.offsetY * 0.5) - bounds.maxY = math.max(bounds.maxY, side.offsetY * 0.5) - bounds.minZ = math.min(bounds.minZ, side.offsetZ * 0.5) - bounds.maxZ = math.max(bounds.maxZ, side.offsetZ * 0.5) - }) - } - if ((side.getOpposite.flag & mask) == mask || mask == 0) { - renderer.overrideBlockTexture = Textures.Cable.iconCap - renderPart(side, () => { - bounds.minX = math.max(bounds.minX, -(0.125 + 1 / 16f)) - bounds.maxX = math.min(bounds.maxX, 0.125 + 1 / 16f) - bounds.minY = math.max(bounds.minY, -(0.125 + 1 / 16f)) - bounds.maxY = math.min(bounds.maxY, 0.125 + 1 / 16f) - bounds.minZ = math.max(bounds.minZ, -(0.125 + 1 / 16f)) - bounds.maxZ = math.min(bounds.maxZ, 0.125 + 1 / 16f) - }) - renderer.clearOverrideBlockTexture() - } - } - } - - def renderCable(block: Block, metadata: Int, renderer: RenderBlocks) { - val previousRenderAllFaces = renderer.renderAllFaces - renderer.renderAllFaces = true - - renderer.setRenderBounds(0.375, 3 / 16f, 0.375, 0.625, 13 / 16f, 0.625) - renderFaceXNeg(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - - renderer.overrideBlockTexture = Textures.Cable.iconCap - renderer.setRenderBounds(0.375, 2 / 16f, 0.375, 0.625, 3 / 16f, 0.625) - renderFaceYNeg(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - renderer.setRenderBounds(0.375, 13 / 16f, 0.375, 0.625, 14 / 16f, 0.625) - renderFaceYPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - renderer.clearOverrideBlockTexture() - - renderer.renderAllFaces = previousRenderAllFaces - } - - def renderHologram(block: Block, metadata: Int, x: Int, y: Int, z: Int, renderer: RenderBlocks) { - // Center. - renderer.setRenderBounds(4 / 16f, 0, 4 / 16f, 12 / 16f, 3 / 16f, 12 / 16f) - renderer.renderStandardBlock(block, x, y, z) - - val previousRenderAllFaces = renderer.renderAllFaces - renderer.renderAllFaces = true - - // Walls. - renderer.setRenderBounds(0, 0, 0, 2 / 16f, 7 / 16f, 1) - renderer.renderStandardBlock(block, x, y, z) - - renderer.setRenderBounds(14 / 16f, 0, 0, 1, 7 / 16f, 1) - renderer.renderStandardBlock(block, x, y, z) - - renderer.setRenderBounds(2 / 16f, 0, 0, 14 / 16f, 7 / 16f, 2 / 16f) - renderer.renderStandardBlock(block, x, y, z) - - renderer.setRenderBounds(2 / 16f, 0, 14 / 16f, 14 / 16f, 7 / 16f, 1) - renderer.renderStandardBlock(block, x, y, z) - - // Inner. - renderer.setRenderBounds(2 / 16f, 3 / 16f, 2 / 16f, 4 / 16f, 5 / 16f, 14 / 16f) - renderer.renderStandardBlock(block, x, y, z) - - renderer.setRenderBounds(12 / 16f, 3 / 16f, 2 / 16f, 14 / 16f, 5 / 16f, 14 / 16f) - renderer.renderStandardBlock(block, x, y, z) - - renderer.setRenderBounds(4 / 16f, 3 / 16f, 2 / 16f, 12 / 16f, 5 / 16f, 4 / 16f) - renderer.renderStandardBlock(block, x, y, z) - - renderer.setRenderBounds(4 / 16f, 3 / 16f, 12 / 16f, 12 / 16f, 5 / 16f, 14 / 16f) - renderer.renderStandardBlock(block, x, y, z) - - renderer.renderAllFaces = previousRenderAllFaces - } - - def renderHologram(block: Block, metadata: Int, renderer: RenderBlocks) { - val previousRenderAllFaces = renderer.renderAllFaces - renderer.renderAllFaces = true - - // Base and walls. - renderer.setRenderBounds(4 / 16f, 0, 4 / 16f, 12 / 16f, 3 / 16f, 12 / 16f) - renderFaceYPos(block, metadata, renderer) - - renderer.setRenderBounds(0, 0, 0, 1, 7 / 16f, 1) - renderFaceYNeg(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - - // Layer 1. - renderer.setRenderBounds(2 / 16f, 3 / 16f, 2 / 16f, 4 / 16f, 5 / 16f, 14 / 16f) - renderFaceYPos(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - - renderer.setRenderBounds(12 / 16f, 3 / 16f, 2 / 16f, 14 / 16f, 5 / 16f, 14 / 16f) - renderFaceYPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - - renderer.setRenderBounds(4 / 16f, 3 / 16f, 2 / 16f, 12 / 16f, 5 / 16f, 4 / 16f) - renderFaceYPos(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - - renderer.setRenderBounds(4 / 16f, 3 / 16f, 12 / 16f, 12 / 16f, 5 / 16f, 14 / 16f) - renderFaceYPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - - // Layer 2. - renderer.setRenderBounds(0, 3 / 16f, 0, 2 / 16f, 7 / 16f, 1) - renderFaceYPos(block, metadata, renderer) - renderFaceXPos(block, metadata, renderer) - - renderer.setRenderBounds(14 / 16f, 3 / 16f, 0, 1, 7 / 16f, 1) - renderFaceYPos(block, metadata, renderer) - renderFaceXNeg(block, metadata, renderer) - - renderer.setRenderBounds(2 / 16f, 3 / 16f, 0, 14 / 16f, 7 / 16f, 2 / 16f) - renderFaceYPos(block, metadata, renderer) - renderFaceZPos(block, metadata, renderer) - - renderer.setRenderBounds(2 / 16f, 3 / 16f, 14 / 16f, 14 / 16f, 7 / 16f, 1) - renderFaceYPos(block, metadata, renderer) - renderFaceZNeg(block, metadata, renderer) - - renderer.renderAllFaces = previousRenderAllFaces - } - - protected def renderFaceXPos(block: Block, metadata: Int, renderer: RenderBlocks) { + def renderFaceXPos(block: Block, metadata: Int, renderer: RenderBlocks) { Tessellator.instance.setNormal(1, 0, 0) renderer.renderFaceXPos(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.EAST.ordinal, metadata)) } - protected def renderFaceXNeg(block: Block, metadata: Int, renderer: RenderBlocks) { + def renderFaceXNeg(block: Block, metadata: Int, renderer: RenderBlocks) { Tessellator.instance.setNormal(-1, 0, 0) renderer.renderFaceXNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.WEST.ordinal, metadata)) } - protected def renderFaceYPos(block: Block, metadata: Int, renderer: RenderBlocks) { + def renderFaceYPos(block: Block, metadata: Int, renderer: RenderBlocks) { Tessellator.instance.setNormal(0, 1, 0) renderer.renderFaceYPos(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.UP.ordinal, metadata)) } - protected def renderFaceYNeg(block: Block, metadata: Int, renderer: RenderBlocks) { + def renderFaceYNeg(block: Block, metadata: Int, renderer: RenderBlocks) { Tessellator.instance.setNormal(0, -1, 0) renderer.renderFaceYNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.DOWN.ordinal, metadata)) } - protected def renderFaceZPos(block: Block, metadata: Int, renderer: RenderBlocks) { + def renderFaceZPos(block: Block, metadata: Int, renderer: RenderBlocks) { Tessellator.instance.setNormal(0, 0, 1) renderer.renderFaceZPos(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.SOUTH.ordinal, metadata)) } - protected def renderFaceZNeg(block: Block, metadata: Int, renderer: RenderBlocks) { + def renderFaceZNeg(block: Block, metadata: Int, renderer: RenderBlocks) { Tessellator.instance.setNormal(0, 0, -1) renderer.renderFaceZNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.NORTH.ordinal, metadata)) } diff --git a/src/main/scala/li/cil/oc/client/renderer/block/Cable.scala b/src/main/scala/li/cil/oc/client/renderer/block/Cable.scala new file mode 100644 index 000000000..9caac7841 --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/block/Cable.scala @@ -0,0 +1,127 @@ +package li.cil.oc.client.renderer.block + +import codechicken.multipart.TileMultipart +import li.cil.oc.client.Textures +import li.cil.oc.common +import li.cil.oc.util.mods.Mods +import net.minecraft.block.Block +import net.minecraft.client.renderer.RenderBlocks +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.AxisAlignedBB +import net.minecraft.world.IBlockAccess +import net.minecraftforge.common.ForgeDirection + +object Cable { + private val baseSize = 4.0 / 16.0 / 2.0 + + private val plugSize = 6.0 / 16.0 / 2.0 - 10e-5 + + def render(world: IBlockAccess, x: Int, y: Int, z: Int, block: Block, renderer: RenderBlocks) { + // Center part. + val bounds = AxisAlignedBB.getBoundingBox(-baseSize, -baseSize, -baseSize, baseSize, baseSize, baseSize) + bounds.offset(0.5, 0.5, 0.5) + renderer.setRenderBounds(bounds.minX, bounds.minY, bounds.minZ, bounds.maxX, bounds.maxY, bounds.maxZ) + renderer.renderStandardBlock(block, x, y, z) + + // Connections. + def renderPart(side: ForgeDirection, size: Double, boundSetter: (AxisAlignedBB, ForgeDirection) => Unit) { + bounds.setBounds(-size, -size, -size, size, size, size) + bounds.offset(side.offsetX * 0.25, side.offsetY * 0.25, side.offsetZ * 0.25) + boundSetter(bounds, side) + bounds.offset(0.5, 0.5, 0.5) + renderer.setRenderBounds(bounds.minX, bounds.minY, bounds.minZ, bounds.maxX, bounds.maxY, bounds.maxZ) + renderer.partialRenderBounds = false + renderer.renderStandardBlock(block, x, y, z) + } + + val mask = common.block.Cable.neighbors(world, x, y, z) + for (side <- ForgeDirection.VALID_DIRECTIONS) { + if ((side.flag & mask) != 0) { + renderPart(side, baseSize, setConnectedBounds) + } + renderer.overrideBlockTexture = Textures.Cable.iconCap + if ((side.flag & mask) != 0 && !isCable(world, x + side.offsetX, y + side.offsetY, z + side.offsetZ)) { + utilForTrickingTheRendererIntoUsingUnclampedTextureCoordinates(renderer, 1) + renderPart(side, plugSize, setPlugBounds) + utilForTrickingTheRendererIntoUsingUnclampedTextureCoordinates(renderer, 0) + } + else if ((side.getOpposite.flag & mask) == mask || mask == 0) { + renderPart(side, baseSize, setUnconnectedBounds) + } + renderer.clearOverrideBlockTexture() + } + } + + def render(block: Block, metadata: Int, renderer: RenderBlocks) { + val previousRenderAllFaces = renderer.renderAllFaces + renderer.renderAllFaces = true + + renderer.setRenderBounds(0.375, 3 / 16f, 0.375, 0.625, 13 / 16f, 0.625) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + + renderer.overrideBlockTexture = Textures.Cable.iconCap + renderer.setRenderBounds(0.375, 2 / 16f, 0.375, 0.625, 3 / 16f, 0.625) + BlockRenderer.renderFaceYNeg(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + renderer.setRenderBounds(0.375, 13 / 16f, 0.375, 0.625, 14 / 16f, 0.625) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + renderer.clearOverrideBlockTexture() + + renderer.renderAllFaces = previousRenderAllFaces + } + + private def isCable(world: IBlockAccess, x: Int, y: Int, z: Int) = { + val tileEntity = world.getBlockTileEntity(x, y, z) + tileEntity.isInstanceOf[common.tileentity.Cable] || (Mods.ForgeMultipart.isAvailable && isCableFMP(tileEntity)) + } + + private def isCableFMP(tileEntity: TileEntity) = { + tileEntity.isInstanceOf[TileMultipart] + } + + private def utilForTrickingTheRendererIntoUsingUnclampedTextureCoordinates(renderer: RenderBlocks, value: Int) { + renderer.uvRotateBottom = value + renderer.uvRotateEast = value + renderer.uvRotateNorth = value + renderer.uvRotateSouth = value + renderer.uvRotateTop = value + renderer.uvRotateWest = value + } + + private def setConnectedBounds(bounds: AxisAlignedBB, side: ForgeDirection) { + bounds.minX = math.min(bounds.minX, side.offsetX * 0.5) + bounds.maxX = math.max(bounds.maxX, side.offsetX * 0.5) + bounds.minY = math.min(bounds.minY, side.offsetY * 0.5) + bounds.maxY = math.max(bounds.maxY, side.offsetY * 0.5) + bounds.minZ = math.min(bounds.minZ, side.offsetZ * 0.5) + bounds.maxZ = math.max(bounds.maxZ, side.offsetZ * 0.5) + } + + private def setPlugBounds(bounds: AxisAlignedBB, side: ForgeDirection) { + bounds.minX = math.max(math.min(bounds.minX + side.offsetX * 10.0 / 16.0, 7.0 / 16.0), -0.5 - 10e-5) + bounds.maxX = math.min(math.max(bounds.maxX + side.offsetX * 10.0 / 16.0, -7.0 / 16.0), 0.5 + 10e-5) + bounds.minY = math.max(math.min(bounds.minY + side.offsetY * 10.0 / 16.0, 7.0 / 16.0), -0.5 - 10e-5) + bounds.maxY = math.min(math.max(bounds.maxY + side.offsetY * 10.0 / 16.0, -7.0 / 16.0), 0.5 + 10e-5) + bounds.minZ = math.max(math.min(bounds.minZ + side.offsetZ * 10.0 / 16.0, 7.0 / 16.0), -0.5 - 10e-5) + bounds.maxZ = math.min(math.max(bounds.maxZ + side.offsetZ * 10.0 / 16.0, -7.0 / 16.0), 0.5 + 10e-5) + } + + private def setUnconnectedBounds(bounds: AxisAlignedBB, side: ForgeDirection) { + bounds.minX = math.max(bounds.minX, -plugSize) + bounds.maxX = math.min(bounds.maxX, plugSize) + bounds.minY = math.max(bounds.minY, -plugSize) + bounds.maxY = math.min(bounds.maxY, plugSize) + bounds.minZ = math.max(bounds.minZ, -plugSize) + bounds.maxZ = math.min(bounds.maxZ, plugSize) + } +} diff --git a/src/main/scala/li/cil/oc/client/renderer/block/Hologram.scala b/src/main/scala/li/cil/oc/client/renderer/block/Hologram.scala new file mode 100644 index 000000000..f23f511bc --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/block/Hologram.scala @@ -0,0 +1,95 @@ +package li.cil.oc.client.renderer.block + +import net.minecraft.block.Block +import net.minecraft.client.renderer.RenderBlocks + +object Hologram { + def render(block: Block, metadata: Int, x: Int, y: Int, z: Int, renderer: RenderBlocks) { + // Center. + renderer.setRenderBounds(4 / 16f, 0, 4 / 16f, 12 / 16f, 3 / 16f, 12 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + val previousRenderAllFaces = renderer.renderAllFaces + renderer.renderAllFaces = true + + // Walls. + renderer.setRenderBounds(0, 0, 0, 2 / 16f, 7 / 16f, 1) + renderer.renderStandardBlock(block, x, y, z) + + renderer.setRenderBounds(14 / 16f, 0, 0, 1, 7 / 16f, 1) + renderer.renderStandardBlock(block, x, y, z) + + renderer.setRenderBounds(2 / 16f, 0, 0, 14 / 16f, 7 / 16f, 2 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + renderer.setRenderBounds(2 / 16f, 0, 14 / 16f, 14 / 16f, 7 / 16f, 1) + renderer.renderStandardBlock(block, x, y, z) + + // Inner. + renderer.setRenderBounds(2 / 16f, 2 / 16f, 2 / 16f, 4 / 16f, 5 / 16f, 14 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + renderer.setRenderBounds(12 / 16f, 2 / 16f, 2 / 16f, 14 / 16f, 5 / 16f, 14 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + renderer.setRenderBounds(4 / 16f, 2 / 16f, 2 / 16f, 12 / 16f, 5 / 16f, 4 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + renderer.setRenderBounds(4 / 16f, 2 / 16f, 12 / 16f, 12 / 16f, 5 / 16f, 14 / 16f) + renderer.renderStandardBlock(block, x, y, z) + + renderer.renderAllFaces = previousRenderAllFaces + } + + def render(block: Block, metadata: Int, renderer: RenderBlocks) { + val previousRenderAllFaces = renderer.renderAllFaces + renderer.renderAllFaces = true + + // Base and walls. + renderer.setRenderBounds(4 / 16f, 0, 4 / 16f, 12 / 16f, 3 / 16f, 12 / 16f) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + + renderer.setRenderBounds(0, 0, 0, 1, 7 / 16f, 1) + BlockRenderer.renderFaceYNeg(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + + // Layer 1. + renderer.setRenderBounds(2 / 16f, 3 / 16f, 2 / 16f, 4 / 16f, 5 / 16f, 14 / 16f) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + + renderer.setRenderBounds(12 / 16f, 3 / 16f, 2 / 16f, 14 / 16f, 5 / 16f, 14 / 16f) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + + renderer.setRenderBounds(4 / 16f, 3 / 16f, 2 / 16f, 12 / 16f, 5 / 16f, 4 / 16f) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + + renderer.setRenderBounds(4 / 16f, 3 / 16f, 12 / 16f, 12 / 16f, 5 / 16f, 14 / 16f) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + + // Layer 2. + renderer.setRenderBounds(0, 3 / 16f, 0, 2 / 16f, 7 / 16f, 1) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceXPos(block, metadata, renderer) + + renderer.setRenderBounds(14 / 16f, 3 / 16f, 0, 1, 7 / 16f, 1) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceXNeg(block, metadata, renderer) + + renderer.setRenderBounds(2 / 16f, 3 / 16f, 0, 14 / 16f, 7 / 16f, 2 / 16f) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceZPos(block, metadata, renderer) + + renderer.setRenderBounds(2 / 16f, 3 / 16f, 14 / 16f, 14 / 16f, 7 / 16f, 1) + BlockRenderer.renderFaceYPos(block, metadata, renderer) + BlockRenderer.renderFaceZNeg(block, metadata, renderer) + + renderer.renderAllFaces = previousRenderAllFaces + } + } diff --git a/src/main/scala/li/cil/oc/client/renderer/font/StaticFontRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/font/StaticFontRenderer.scala index 58fcd91fb..7ec52cd6c 100644 --- a/src/main/scala/li/cil/oc/client/renderer/font/StaticFontRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/font/StaticFontRenderer.scala @@ -2,6 +2,7 @@ package li.cil.oc.client.renderer.font import java.util.logging.Level +import com.google.common.base.Charsets import li.cil.oc.client.Textures import li.cil.oc.{OpenComputers, Settings} import net.minecraft.client.Minecraft @@ -16,7 +17,7 @@ import scala.io.Source */ class StaticFontRenderer extends TextureFontRenderer { protected val (chars, charWidth, charHeight) = try { - val lines = Source.fromInputStream(Minecraft.getMinecraft.getResourceManager.getResource(new ResourceLocation(Settings.resourceDomain, "textures/font/chars.txt")).getInputStream)("UTF-8").getLines() + val lines = Source.fromInputStream(Minecraft.getMinecraft.getResourceManager.getResource(new ResourceLocation(Settings.resourceDomain, "textures/font/chars.txt")).getInputStream)(Charsets.UTF_8).getLines() val chars = lines.next() val (w, h) = if (lines.hasNext) { val size = lines.next().split(" ", 2) diff --git a/src/main/scala/li/cil/oc/common/multipart/CablePart.scala b/src/main/scala/li/cil/oc/common/multipart/CablePart.scala index 8208dbe9d..5af552708 100644 --- a/src/main/scala/li/cil/oc/common/multipart/CablePart.scala +++ b/src/main/scala/li/cil/oc/common/multipart/CablePart.scala @@ -7,17 +7,16 @@ import codechicken.multipart._ import cpw.mods.fml.relauncher.{Side, SideOnly} import li.cil.oc.api.network.{Message, Node, Visibility} import li.cil.oc.api.{Items, network} -import li.cil.oc.client.renderer.block.BlockRenderer import li.cil.oc.common.block.{Cable, Delegator} import li.cil.oc.common.tileentity import li.cil.oc.util.Color import li.cil.oc.util.ExtendedNBT._ -import li.cil.oc.{Settings, api, common} +import li.cil.oc.{Settings, api, client, common} import net.minecraft.client.Minecraft import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound -import net.minecraft.util.{MovingObjectPosition, AxisAlignedBB} +import net.minecraft.util.{AxisAlignedBB, MovingObjectPosition} import scala.collection.convert.WrapAsJava import scala.collection.convert.WrapAsScala._ @@ -127,15 +126,14 @@ class CablePart(val original: Option[tileentity.Cable] = None) extends DelegateP override def renderStatic(pos: Vector3, olm: LazyLightMatrix, pass: Int) { val (x, y, z) = (pos.x.toInt, pos.y.toInt, pos.z.toInt) val block = api.Items.get("cable").block() - val metadata = world.getBlockMetadata(x, y, z) val renderer = Minecraft.getMinecraft.renderGlobal.globalRenderBlocks block match { case delegator: Delegator[_] => delegator.colorMultiplierOverride = Some(_color) - BlockRenderer.renderCable(Cable.neighbors(world, x, y, z), block, metadata, x, y, z, renderer) + client.renderer.block.Cable.render(world, x, y, z, block, renderer) delegator.colorMultiplierOverride = None case _ => - BlockRenderer.renderCable(Cable.neighbors(world, x, y, z), block, metadata, x, y, z, renderer) + client.renderer.block.Cable.render(world, x, y, z, block, renderer) } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Switch.scala b/src/main/scala/li/cil/oc/common/tileentity/Switch.scala index 04ee6d938..503149c91 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Switch.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Switch.scala @@ -1,5 +1,6 @@ package li.cil.oc.common.tileentity +import com.google.common.base.Charsets import cpw.mods.fml.common.Optional import dan200.computer.api.{IComputerAccess, ILuaContext, IPeripheral} import li.cil.oc.api.Driver @@ -114,7 +115,7 @@ class Switch extends traits.Hub with traits.NotAnalyzable with IPeripheral with val address = s"cc${wrapper.id}_${wrapper.attachmentName}" if (source != address && Option(destination).forall(_ == address) && openPorts(computer).contains(port)) wrapper.queueEvent("modem_message", Array(Seq(wrapper.attachmentName, Int.box(port), Int.box(answerPort)) ++ args.map { - case x: Array[Byte] => new String(x, "UTF-8") + case x: Array[Byte] => new String(x, Charsets.UTF_8) case x => x }: _*)) } diff --git a/src/main/scala/li/cil/oc/server/network/ArgumentsImpl.scala b/src/main/scala/li/cil/oc/server/network/ArgumentsImpl.scala index f26ea5d4a..cf9f1d4b8 100644 --- a/src/main/scala/li/cil/oc/server/network/ArgumentsImpl.scala +++ b/src/main/scala/li/cil/oc/server/network/ArgumentsImpl.scala @@ -1,5 +1,6 @@ package li.cil.oc.server.network +import com.google.common.base.Charsets import li.cil.oc.api.network import scala.collection.convert.WrapAsJava._ @@ -66,7 +67,7 @@ class ArgumentsImpl(val args: Seq[AnyRef]) extends network.Arguments { checkIndex(index, "string") args(index) match { case value: java.lang.String => value - case value: Array[Byte] => new String(value, "UTF-8") + case value: Array[Byte] => new String(value, Charsets.UTF_8) case value => throw typeError(index, value, "string") } } @@ -79,7 +80,7 @@ class ArgumentsImpl(val args: Seq[AnyRef]) extends network.Arguments { def checkByteArray(index: Int) = { checkIndex(index, "string") args(index) match { - case value: java.lang.String => value.getBytes("UTF-8") + case value: java.lang.String => value.getBytes(Charsets.UTF_8) case value: Array[Byte] => value case value => throw typeError(index, value, "string") } @@ -146,6 +147,11 @@ class ArgumentsImpl(val args: Seq[AnyRef]) extends network.Arguments { case _ => false }) + def toArray = args.map { + case value: Array[Byte] => new String(value, Charsets.UTF_8) + case value => value + }.toArray + private def isDefined(index: Int) = index >= 0 && index < args.length private def checkIndex(index: Int, name: String) = diff --git a/src/main/scala/li/cil/oc/util/ItemUtils.scala b/src/main/scala/li/cil/oc/util/ItemUtils.scala index 926eb2403..9c6cea94c 100644 --- a/src/main/scala/li/cil/oc/util/ItemUtils.scala +++ b/src/main/scala/li/cil/oc/util/ItemUtils.scala @@ -2,7 +2,7 @@ package li.cil.oc.util import java.util.logging.Level -import com.google.common.base.Strings +import com.google.common.base.{Charsets, Strings} import li.cil.oc.api.Persistable import li.cil.oc.common.Tier import li.cil.oc.util.ExtendedNBT._ @@ -144,7 +144,7 @@ object ItemUtils { object RobotData { val names = try { Source.fromInputStream(getClass.getResourceAsStream( - "/assets/" + Settings.resourceDomain + "/robot.names"))("UTF-8"). + "/assets/" + Settings.resourceDomain + "/robot.names"))(Charsets.UTF_8). getLines().map(_.takeWhile(_ != '#').trim()).filter(_ != "").toArray } catch {