Made cables render a little socket / plug when connected to blocks and some other stuff.

This commit is contained in:
Florian Nücke 2014-08-27 23:54:47 +02:00
parent a7de0a237a
commit 5e53d832af
9 changed files with 328 additions and 251 deletions

View File

@ -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()
}
}

View File

@ -9,7 +9,6 @@ import li.cil.oc.common.tileentity
import li.cil.oc.util.RenderState import li.cil.oc.util.RenderState
import net.minecraft.block.Block import net.minecraft.block.Block
import net.minecraft.client.renderer.{RenderBlocks, Tessellator} import net.minecraft.client.renderer.{RenderBlocks, Tessellator}
import net.minecraft.util.AxisAlignedBB
import net.minecraft.world.IBlockAccess import net.minecraft.world.IBlockAccess
import net.minecraftforge.common.ForgeDirection import net.minecraftforge.common.ForgeDirection
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
@ -28,7 +27,7 @@ object BlockRenderer extends ISimpleBlockRenderingHandler {
GL11.glScalef(1.6f, 1.6f, 1.6f) GL11.glScalef(1.6f, 1.6f, 1.6f)
GL11.glTranslatef(-0.5f, -0.5f, -0.5f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f)
Tessellator.instance.startDrawingQuads() Tessellator.instance.startDrawingQuads()
renderCable(block, metadata, renderer) Cable.render(block, metadata, renderer)
Tessellator.instance.draw() Tessellator.instance.draw()
RenderState.checkError(getClass.getName + ".renderInventoryBlock: cable") RenderState.checkError(getClass.getName + ".renderInventoryBlock: cable")
@ -41,14 +40,14 @@ object BlockRenderer extends ISimpleBlockRenderingHandler {
case Some(assembler: RobotAssembler) => case Some(assembler: RobotAssembler) =>
GL11.glTranslatef(-0.5f, -0.5f, -0.5f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f)
Tessellator.instance.startDrawingQuads() Tessellator.instance.startDrawingQuads()
renderAssembler(block, metadata, renderer) Assembler.render(block, metadata, renderer)
Tessellator.instance.draw() Tessellator.instance.draw()
RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler") RenderState.checkError(getClass.getName + ".renderInventoryBlock: assembler")
case Some(hologram: Hologram) => case Some(hologram: Hologram) =>
GL11.glTranslatef(-0.5f, -0.5f, -0.5f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f)
Tessellator.instance.startDrawingQuads() Tessellator.instance.startDrawingQuads()
renderHologram(block, metadata, renderer) Hologram.render(block, metadata, renderer)
Tessellator.instance.draw() Tessellator.instance.draw()
RenderState.checkError(getClass.getName + ".renderInventoryBlock: hologram") RenderState.checkError(getClass.getName + ".renderInventoryBlock: hologram")
@ -82,7 +81,7 @@ object BlockRenderer extends ISimpleBlockRenderingHandler {
world.getBlockTileEntity(x, y, z) match { world.getBlockTileEntity(x, y, z) match {
case cable: tileentity.Cable => 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") RenderState.checkError(getClass.getName + ".renderWorldBlock: cable")
@ -172,13 +171,13 @@ object BlockRenderer extends ISimpleBlockRenderingHandler {
true true
case assembler: tileentity.RobotAssembler => 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") RenderState.checkError(getClass.getName + ".renderWorldBlock: assembler")
true true
case hologram: tileentity.Hologram => 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") 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) { def renderFaceXPos(block: Block, metadata: 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) {
Tessellator.instance.setNormal(1, 0, 0) Tessellator.instance.setNormal(1, 0, 0)
renderer.renderFaceXPos(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.EAST.ordinal, metadata)) 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) Tessellator.instance.setNormal(-1, 0, 0)
renderer.renderFaceXNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.WEST.ordinal, metadata)) 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) Tessellator.instance.setNormal(0, 1, 0)
renderer.renderFaceYPos(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.UP.ordinal, metadata)) 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) Tessellator.instance.setNormal(0, -1, 0)
renderer.renderFaceYNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.DOWN.ordinal, metadata)) 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) Tessellator.instance.setNormal(0, 0, 1)
renderer.renderFaceZPos(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.SOUTH.ordinal, metadata)) 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) Tessellator.instance.setNormal(0, 0, -1)
renderer.renderFaceZNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.NORTH.ordinal, metadata)) renderer.renderFaceZNeg(block, 0, 0, 0, renderer.getBlockIconFromSideAndMetadata(block, ForgeDirection.NORTH.ordinal, metadata))
} }

View File

@ -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)
}
}

View File

@ -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
}
}

View File

@ -2,6 +2,7 @@ package li.cil.oc.client.renderer.font
import java.util.logging.Level import java.util.logging.Level
import com.google.common.base.Charsets
import li.cil.oc.client.Textures import li.cil.oc.client.Textures
import li.cil.oc.{OpenComputers, Settings} import li.cil.oc.{OpenComputers, Settings}
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
@ -16,7 +17,7 @@ import scala.io.Source
*/ */
class StaticFontRenderer extends TextureFontRenderer { class StaticFontRenderer extends TextureFontRenderer {
protected val (chars, charWidth, charHeight) = try { 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 chars = lines.next()
val (w, h) = if (lines.hasNext) { val (w, h) = if (lines.hasNext) {
val size = lines.next().split(" ", 2) val size = lines.next().split(" ", 2)

View File

@ -7,17 +7,16 @@ import codechicken.multipart._
import cpw.mods.fml.relauncher.{Side, SideOnly} import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.api.network.{Message, Node, Visibility} import li.cil.oc.api.network.{Message, Node, Visibility}
import li.cil.oc.api.{Items, network} 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.block.{Cable, Delegator}
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
import li.cil.oc.util.Color import li.cil.oc.util.Color
import li.cil.oc.util.ExtendedNBT._ 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.client.Minecraft
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound 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.WrapAsJava
import scala.collection.convert.WrapAsScala._ 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) { override def renderStatic(pos: Vector3, olm: LazyLightMatrix, pass: Int) {
val (x, y, z) = (pos.x.toInt, pos.y.toInt, pos.z.toInt) val (x, y, z) = (pos.x.toInt, pos.y.toInt, pos.z.toInt)
val block = api.Items.get("cable").block() val block = api.Items.get("cable").block()
val metadata = world.getBlockMetadata(x, y, z)
val renderer = Minecraft.getMinecraft.renderGlobal.globalRenderBlocks val renderer = Minecraft.getMinecraft.renderGlobal.globalRenderBlocks
block match { block match {
case delegator: Delegator[_] => case delegator: Delegator[_] =>
delegator.colorMultiplierOverride = Some(_color) 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 delegator.colorMultiplierOverride = None
case _ => 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)
} }
} }

View File

@ -1,5 +1,6 @@
package li.cil.oc.common.tileentity package li.cil.oc.common.tileentity
import com.google.common.base.Charsets
import cpw.mods.fml.common.Optional import cpw.mods.fml.common.Optional
import dan200.computer.api.{IComputerAccess, ILuaContext, IPeripheral} import dan200.computer.api.{IComputerAccess, ILuaContext, IPeripheral}
import li.cil.oc.api.Driver 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}" val address = s"cc${wrapper.id}_${wrapper.attachmentName}"
if (source != address && Option(destination).forall(_ == address) && openPorts(computer).contains(port)) 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 { 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 case x => x
}: _*)) }: _*))
} }

View File

@ -1,5 +1,6 @@
package li.cil.oc.server.network package li.cil.oc.server.network
import com.google.common.base.Charsets
import li.cil.oc.api.network import li.cil.oc.api.network
import scala.collection.convert.WrapAsJava._ import scala.collection.convert.WrapAsJava._
@ -66,7 +67,7 @@ class ArgumentsImpl(val args: Seq[AnyRef]) extends network.Arguments {
checkIndex(index, "string") checkIndex(index, "string")
args(index) match { args(index) match {
case value: java.lang.String => value 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") case value => throw typeError(index, value, "string")
} }
} }
@ -79,7 +80,7 @@ class ArgumentsImpl(val args: Seq[AnyRef]) extends network.Arguments {
def checkByteArray(index: Int) = { def checkByteArray(index: Int) = {
checkIndex(index, "string") checkIndex(index, "string")
args(index) match { 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: Array[Byte] => value
case value => throw typeError(index, value, "string") case value => throw typeError(index, value, "string")
} }
@ -146,6 +147,11 @@ class ArgumentsImpl(val args: Seq[AnyRef]) extends network.Arguments {
case _ => false 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 isDefined(index: Int) = index >= 0 && index < args.length
private def checkIndex(index: Int, name: String) = private def checkIndex(index: Int, name: String) =

View File

@ -2,7 +2,7 @@ package li.cil.oc.util
import java.util.logging.Level 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.api.Persistable
import li.cil.oc.common.Tier import li.cil.oc.common.Tier
import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ExtendedNBT._
@ -144,7 +144,7 @@ object ItemUtils {
object RobotData { object RobotData {
val names = try { val names = try {
Source.fromInputStream(getClass.getResourceAsStream( 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 getLines().map(_.takeWhile(_ != '#').trim()).filter(_ != "").toArray
} }
catch { catch {