More work on screen rendering. Base is working, still needs 'front'.

This commit is contained in:
Florian Nücke 2014-12-31 19:57:17 +01:00
parent 1c57dc40d0
commit c95d8ef4fd
3 changed files with 330 additions and 443 deletions

View File

@ -104,6 +104,7 @@ object Textures {
val ScreenUpIndicator = L("screen/up_indicator") val ScreenUpIndicator = L("screen/up_indicator")
val SwitchSideOn = L("SwitchSideOn") val SwitchSideOn = L("SwitchSideOn")
// Kill me now.
object Screen { object Screen {
val Single = Array( val Single = Array(
L("screen/b"), L("screen/b"),
@ -114,141 +115,287 @@ object Textures {
L("screen/b2") L("screen/b2")
) )
val HorizontalLeft = Array( val Horizontal = Array(
L("screen/bht"), // Vertical.
L("screen/bht"), Array(
L("screen/bht2"), Array(
L("screen/bht2"), L("screen/bht"),
L("screen/b2"), L("screen/bht"),
L("screen/b2") // Never rendered. L("screen/bht2"),
L("screen/bht2"),
L("screen/b2"),
L("screen/b2") // Never rendered.
),
Array(
L("screen/bhm"),
L("screen/bhm"),
L("screen/bhm2"),
L("screen/bhm2"),
L("screen/b2"), // Never rendered.
L("screen/b2") // Never rendered.
),
Array(
L("screen/bhb"),
L("screen/bhb"),
L("screen/bhb2"),
L("screen/bhb2"),
L("screen/b2"), // Never rendered.
L("screen/b2")
)
),
// Horizontal.
Array(
Array(
L("screen/bht2"),
L("screen/bht2"),
L("screen/bht"),
L("screen/bht"),
L("screen/b2"),
L("screen/b2") // Never rendered.
),
Array(
L("screen/bhm2"),
L("screen/bhm2"),
L("screen/bhm"),
L("screen/bhm"),
L("screen/b2"), // Never rendered.
L("screen/b2") // Never rendered.
),
Array(
L("screen/bhb2"),
L("screen/bhb2"),
L("screen/bhb"),
L("screen/bhb"),
L("screen/b2"), // Never rendered.
L("screen/b2")
)
)
) )
val HorizontalMiddle = Array( val Vertical = Array(
L("screen/bhm"), // Vertical.
L("screen/bhm"), Array(
L("screen/bhm2"), Array(
L("screen/bhm2"), L("screen/b"), // Never rendered.
L("screen/b2"), // Never rendered. L("screen/b"),
L("screen/b2") // Never rendered. L("screen/bvt"),
L("screen/bvt"),
L("screen/bvt"),
L("screen/bvt")
),
Array(
L("screen/b"), // Never rendered.
L("screen/b"), // Never rendered.
L("screen/bvm"),
L("screen/bvm"),
L("screen/bvm"),
L("screen/bvm")
),
Array(
L("screen/b"),
L("screen/b"), // Never rendered.
L("screen/bvb2"),
L("screen/bvb2"),
L("screen/bvb2"),
L("screen/bvb2")
)
),
// Horizontal.
Array(
Array(
L("screen/b2"), // Never rendered.
L("screen/b2"),
L("screen/bvt"),
L("screen/bvt"),
L("screen/bht2"),
L("screen/bht2")
),
Array(
L("screen/b2"), // Never rendered.
L("screen/b2"), // Never rendered.
L("screen/bvm"),
L("screen/bvm"),
L("screen/bhm2"),
L("screen/bhm2")
),
Array(
L("screen/b2"),
L("screen/b2"), // Never rendered.
L("screen/bvb"),
L("screen/bvb"),
L("screen/bhb2"),
L("screen/bhb2")
)
)
) )
val HorizontalRight = Array( val Multi = Array(
L("screen/bhb"), // Vertical.
L("screen/bhb"), Array(
L("screen/bhb2"), // Top.
L("screen/bhb2"), Array(
L("screen/b2"), // Never rendered. Array(
L("screen/b2") L("screen/bht"), // Never rendered.
) L("screen/bht"),
L("screen/btl"),
val VerticalTop = Array( L("screen/btl"),
L("screen/b"), // Never rendered. L("screen/bvt"),
L("screen/b"), L("screen/bvt") // Never rendered.
L("screen/bvt"), ),Array(
L("screen/bvt"), L("screen/bhm"), // Never rendered.
L("screen/bvt"), L("screen/bhm"),
L("screen/bvt") L("screen/btm"),
) L("screen/btm"),
L("screen/bvt"),
val VerticalMiddle = Array( L("screen/bvt") // Never rendered.
L("screen/b"), // Never rendered. ),
L("screen/b"), // Never rendered. Array(
L("screen/bvm"), L("screen/bhb"), // Never rendered.
L("screen/bvm"), L("screen/bhb"), // Never rendered.
L("screen/bvm"), L("screen/btr"),
L("screen/bvm") L("screen/btr"),
) L("screen/bvt"), // Never rendered.
L("screen/bvt") // Never rendered.
val VerticalBottom = Array( )
L("screen/b"), ),
L("screen/b"), // Never rendered. // Middle.
L("screen/bvb2"), Array(
L("screen/bvb2"), Array(
L("screen/bvb2"), L("screen/bht"), // Never rendered.
L("screen/bvb2") L("screen/bht"), // Never rendered.
) L("screen/bml"),
L("screen/bml"),
// TODO Horizontal one, too (for alternative sides). L("screen/bvm"), // Never rendered.
L("screen/bvm") // Never rendered.
val MultiTopLeft = Array( ),
L("screen/bht"), // Never rendered. Array(
L("screen/bht"), L("screen/bhm"), // Never rendered.
L("screen/btl"), L("screen/bhm"), // Never rendered.
L("screen/btl"), L("screen/bmm"),
L("screen/bvt"), L("screen/bmm"),
L("screen/bvt") // Never rendered. L("screen/bvt"), // Never rendered.
) L("screen/bvt") // Never rendered.
),
val MultiTopMiddle = Array( Array(
L("screen/bhm"), // Never rendered. L("screen/bhb"),
L("screen/bhm"), L("screen/bhb"), // Never rendered.
L("screen/btm"), L("screen/bmr"),
L("screen/btm"), L("screen/bmr"),
L("screen/bvt"), L("screen/bvm"), // Never rendered.
L("screen/bvt") // Never rendered. L("screen/bvm")
) )
),
val MultiTopRight = Array( // Right.
L("screen/bhb"), // Never rendered. Array(
L("screen/bhb"), // Never rendered. Array(
L("screen/btr"), L("screen/bht"), // Never rendered.
L("screen/btr"), L("screen/bht"),
L("screen/bvt"), // Never rendered. L("screen/bbl2"),
L("screen/bvt") // Never rendered. L("screen/bbl2"),
) L("screen/bvb2"),
L("screen/bvb2") // Never rendered.
val MultiMiddleLeft = Array( ),
L("screen/bht"), // Never rendered. Array(
L("screen/bht"), // Never rendered. L("screen/bhm"),
L("screen/bml"), L("screen/bhm"), // Never rendered.
L("screen/bml"), L("screen/bbm2"),
L("screen/bvm"), // Never rendered. L("screen/bbm2"),
L("screen/bvm") // Never rendered. L("screen/bvb2"),
) L("screen/bvb2") // Never rendered.
),
val MultiMiddleMiddle = Array( Array(
L("screen/bhm"), // Never rendered. L("screen/bhb"),
L("screen/bhm"), // Never rendered. L("screen/bhb"), // Never rendered.
L("screen/bmm"), L("screen/bbr2"),
L("screen/bmm"), L("screen/bbr2"),
L("screen/bvt"), // Never rendered. L("screen/bvb2"), // Never rendered.
L("screen/bvt") // Never rendered. L("screen/bvb2")
) )
)
val MultiMiddleRight = Array( ),
L("screen/bhb"), // Horizontal.
L("screen/bhb"), // Never rendered. Array(
L("screen/bmr"), // Top.
L("screen/bmr"), Array(
L("screen/bvm"), // Never rendered. Array(
L("screen/bvm") L("screen/bht2"), // Never rendered.
) L("screen/bht2"),
L("screen/btl"),
val MultiBottomLeft = Array( L("screen/btl"),
L("screen/bht"), // Never rendered. L("screen/bht2"),
L("screen/bht"), L("screen/bht2") // Never rendered.
L("screen/bbl2"), ),Array(
L("screen/bbl2"), L("screen/bhm2"), // Never rendered.
L("screen/bvb2"), L("screen/bhm2"),
L("screen/bvb2") // Never rendered. L("screen/btm"),
) L("screen/btm"),
L("screen/bht2"),
val MultiBottomMiddle = Array( L("screen/bht2") // Never rendered.
L("screen/bhm"), ),
L("screen/bhm"), // Never rendered. Array(
L("screen/bbm2"), L("screen/bhb2"), // Never rendered.
L("screen/bbm2"), L("screen/bhb2"), // Never rendered.
L("screen/bvb2"), L("screen/btr"),
L("screen/bvb2") // Never rendered. L("screen/btr"),
) L("screen/bht2"), // Never rendered.
L("screen/bht2") // Never rendered.
val MultiBottomRight = Array( )
L("screen/bhb"), ),
L("screen/bhb"), // Never rendered. // Middle.
L("screen/bbr2"), Array(
L("screen/bbr2"), Array(
L("screen/bvb2"), // Never rendered. L("screen/bht2"), // Never rendered.
L("screen/bvb2") L("screen/bht2"), // Never rendered.
L("screen/bml"),
L("screen/bml"),
L("screen/bhm2"), // Never rendered.
L("screen/bhm2") // Never rendered.
),
Array(
L("screen/bhm2"), // Never rendered.
L("screen/bhm2"), // Never rendered.
L("screen/bmm"),
L("screen/bmm"),
L("screen/bht2"), // Never rendered.
L("screen/bht2") // Never rendered.
),
Array(
L("screen/bhb2"),
L("screen/bhb2"), // Never rendered.
L("screen/bmr"),
L("screen/bmr"),
L("screen/bhm2"), // Never rendered.
L("screen/bhm2")
)
),
// Right.
Array(
Array(
L("screen/bht2"), // Never rendered.
L("screen/bht2"),
L("screen/bbl"),
L("screen/bbl"),
L("screen/bhb2"),
L("screen/bhb2") // Never rendered.
),
Array(
L("screen/bhm2"),
L("screen/bhm2"), // Never rendered.
L("screen/bbm"),
L("screen/bbm"),
L("screen/bhb2"),
L("screen/bhb2") // Never rendered.
),
Array(
L("screen/bhb2"),
L("screen/bhb2"), // Never rendered.
L("screen/bbr"),
L("screen/bbr"),
L("screen/bhb2"), // Never rendered.
L("screen/bhb2")
)
)
)
) )
// The hacks I do for namespacing... // The hacks I do for namespacing...

View File

@ -6,6 +6,7 @@ import li.cil.oc.Settings
import li.cil.oc.client.Textures import li.cil.oc.client.Textures
import li.cil.oc.common.block import li.cil.oc.common.block
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
import li.cil.oc.util.Color
import net.minecraft.block.Block import net.minecraft.block.Block
import net.minecraft.block.state.IBlockState import net.minecraft.block.state.IBlockState
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
@ -13,6 +14,7 @@ import net.minecraft.client.renderer.block.model.BakedQuad
import net.minecraft.client.renderer.block.model.ItemCameraTransforms import net.minecraft.client.renderer.block.model.ItemCameraTransforms
import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.client.resources.model.ModelResourceLocation import net.minecraft.client.resources.model.ModelResourceLocation
import net.minecraft.item.EnumDyeColor
import net.minecraft.util.EnumFacing import net.minecraft.util.EnumFacing
import net.minecraft.util.RegistrySimple import net.minecraft.util.RegistrySimple
import net.minecraftforge.client.event.ModelBakeEvent import net.minecraftforge.client.event.ModelBakeEvent
@ -37,11 +39,9 @@ object ExtendedBlockModel {
@SubscribeEvent @SubscribeEvent
def onModelBake(e: ModelBakeEvent): Unit = { def onModelBake(e: ModelBakeEvent): Unit = {
val registry = e.modelRegistry.asInstanceOf[RegistrySimple] val registry = e.modelRegistry.asInstanceOf[RegistrySimple]
val screenPattern = "^" + Settings.resourceDomain + ":screen\\d#.*"
registry.getKeys.collect { registry.getKeys.collect {
case location: ModelResourceLocation => case location: ModelResourceLocation if location.toString.matches(screenPattern) => registry.putObject(location, ScreenRenderer)
if (location.toString.startsWith(Settings.resourceDomain + ":screen1#")) {
registry.putObject(location, ScreenRenderer)
}
} }
} }
} }
@ -89,64 +89,76 @@ class ScreenRenderer(val state: IExtendedBlockState) extends SmartBlockModelBase
override def getFaceQuads(side: EnumFacing) = { override def getFaceQuads(side: EnumFacing) = {
state.getValue(block.Screen.Tile) match { state.getValue(block.Screen.Tile) match {
case screen: tileentity.Screen => case screen: tileentity.Screen =>
// TODO Translate facing to "local" coordinate system of our default texture layout.
val facing = screen.toLocal(side) val facing = screen.toLocal(side)
val textures = if (screen.width == 1 && screen.height == 1) { val (x, y) = screen.localPosition
Textures.Block.Screen.Single val pitch = if (screen.pitch == EnumFacing.NORTH) 0 else 1
} var rx = multiCoords(x, screen.width - 1)
else if (screen.width == 1) { var ry = multiCoords(y, screen.height - 1)
val (_, y) = screen.localPosition var rotation = 0
if (y == 0) Textures.Block.Screen.VerticalBottom
else if (y == screen.height - 1) Textures.Block.Screen.VerticalTop if (side == EnumFacing.UP) {
else Textures.Block.Screen.VerticalMiddle rotation += screen.yaw.getHorizontalIndex
} ry = 2 - ry
else if (screen.height == 1) {
val (x, _) = screen.localPosition
if (x == 0) Textures.Block.Screen.HorizontalRight
else if (x == screen.width - 1) Textures.Block.Screen.HorizontalLeft
else Textures.Block.Screen.HorizontalMiddle
} }
else { else {
val (x, y) = screen.localPosition if (side == EnumFacing.DOWN) {
// TODO Differentiate horizontal and vertical multiscreens. if (screen.yaw.getAxis == EnumFacing.Axis.X) {
if (x == 0) rotation += 1
if (y == 0) Textures.Block.Screen.MultiBottomRight rx = 2 - rx
else if (y == screen.height - 1) Textures.Block.Screen.MultiTopRight }
else Textures.Block.Screen.MultiMiddleRight if (screen.yaw.getAxisDirection.getOffset < 0)
else if (x == screen.width - 1) ry = 2 - ry
if (y == 0) Textures.Block.Screen.MultiBottomLeft }
else if (y == screen.height - 1) Textures.Block.Screen.MultiTopLeft else if (screen.yaw.getAxisDirection.getOffset > 0 && pitch == 1)
else Textures.Block.Screen.MultiMiddleLeft ry = 2 - ry
else if (screen.yaw == EnumFacing.NORTH || screen.yaw == EnumFacing.EAST)
if (y == 0) Textures.Block.Screen.MultiBottomMiddle rx = 2 - rx
else if (y == screen.height - 1) Textures.Block.Screen.MultiTopMiddle
else Textures.Block.Screen.MultiMiddleMiddle
} }
List(new BakedQuad(makeQuad(side, Textures.Block.getSprite(textures(facing.ordinal()))), -1, side)) val textures =
if (screen.width == 1 && screen.height == 1)
Textures.Block.Screen.Single
else if (screen.width == 1)
Textures.Block.Screen.Vertical(pitch)(ry)
else if (screen.height == 1)
Textures.Block.Screen.Horizontal(pitch)(rx)
else
Textures.Block.Screen.Multi(pitch)(ry)(rx)
List(new BakedQuad(makeQuad(side, Textures.Block.getSprite(textures(facing.ordinal())), screen.color, rotation), -1, side))
case _ => super.getFaceQuads(side) case _ => super.getFaceQuads(side)
} }
} }
private def makeQuad(facing: EnumFacing, texture: TextureAtlasSprite) = { private def multiCoords(value: Int, high: Int) = if (value == 0) 2 else if (value == high) 0 else 1
private def makeQuad(facing: EnumFacing, texture: TextureAtlasSprite, color: EnumDyeColor, rotation: Int) = {
val face = faces(facing.getIndex) val face = faces(facing.getIndex)
face.map(data => { val verts = face.map(f => (f._1, f._2, f._3))
val coords = face.map(f => (f._4, f._5))
(verts, coords.drop(rotation) ++ coords.take(rotation)).zipped.
map((v, c) => (v._1, v._2, v._3, c._1, c._2)).
map(data => {
val (x, y, z, u, v) = data val (x, y, z, u, v) = data
rawData(x, y, z, texture, u, v) rawData(x, y, z, texture, u, v, Color.rgbValues(color))
}).flatten }).flatten
} }
// See FaceBakery#storeVertexData. // See FaceBakery#storeVertexData.
private def rawData(x: Float, y: Float, z: Float, texture: TextureAtlasSprite, u: Float, v: Float) = { private def rawData(x: Float, y: Float, z: Float, texture: TextureAtlasSprite, u: Float, v: Float, color: Int) = {
Array( Array(
java.lang.Float.floatToRawIntBits(x), java.lang.Float.floatToRawIntBits(x),
java.lang.Float.floatToRawIntBits(y), java.lang.Float.floatToRawIntBits(y),
java.lang.Float.floatToRawIntBits(z), java.lang.Float.floatToRawIntBits(z),
0xFFFFFFFF, 0xFF000000 | rgb2bgr(color),
java.lang.Float.floatToRawIntBits(texture.getInterpolatedU(u)), java.lang.Float.floatToRawIntBits(texture.getInterpolatedU(u)),
java.lang.Float.floatToRawIntBits(texture.getInterpolatedV(v)), java.lang.Float.floatToRawIntBits(texture.getInterpolatedV(v)),
0 0
) )
} }
}
private def rgb2bgr(color: Int) = {
((color & 0x0000FF) << 16) | (color & 0x00FF00) | ((color & 0xFF0000) >>> 16)
}
}

View File

@ -67,278 +67,6 @@ class Screen(val tier: Int) extends RedstoneAware with traits.OmniRotatable {
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
// TODO remove
// object Icons {
// var b, b2, bbl, bbl2, bbm, bbm2, bbr, bbr2, bhb, bhb2, bhm, bhm2, bht, bht2, bml, bmm, bmr, btl, btm, btr, bvb, bvb2, bvm, bvt, f, f2, fbl, fbl2, fbm, fbm2, fbr, fbr2, fhb, fhb2, fhm, fhm2, fht, fht2, fml, fmm, fmr, ftl, ftm, ftr, fvb, fvb2, fvm, fvt = null: IIcon
//
// def fh = Array(fht, fhm, fhb)
//
// def fv = Array(fvt, fvm, fvb)
//
// def bh = Array(bht, bhm, bhb)
//
// def bv = Array(bvt, bvm, bvb)
//
// def fth = Array(ftl, ftm, ftr)
//
// def fmh = Array(fml, fmm, fmr)
//
// def fbh = Array(fbl, fbm, fbr)
//
// def bth = Array(btl, btm, btr)
//
// def bmh = Array(bml, bmm, bmr)
//
// def bbh = Array(bbl, bbm, bbr)
//
// def ftv = Array(ftl, fml, fbl)
//
// def fmv = Array(ftm, fmm, fbm)
//
// def fbv = Array(ftr, fmr, fbr)
//
// def btv = Array(btl, bml, bbl)
//
// def bmv = Array(btm, bmm, bbm)
//
// def bbv = Array(btr, bmr, bbr)
//
// def fh2 = Array(fht2, fhm2, fhb2)
//
// def fv2 = Array(fvt, fvm, fvb2)
//
// def bh2 = Array(bht2, bhm2, bhb2)
//
// def bv2 = Array(bvt, bvm, bvb2)
//
// def fbh2 = Array(fbl2, fbm2, fbr2)
//
// def bbh2 = Array(bbl2, bbm2, bbr2)
//
// def fud = Icons.fh2 ++ Icons.fv2 ++ Icons.fth ++ Icons.fmh ++ Icons.fbh2
//
// def bud = Icons.bh2.reverse ++ Icons.bv2 ++ Icons.bth.reverse ++ Icons.bmh.reverse ++ Icons.bbh2.reverse
//
// def fsn = Icons.fh ++ Icons.fv ++ Icons.fth ++ Icons.fmh ++ Icons.fbh
//
// def few = Icons.fv ++ Icons.fh ++ Icons.ftv ++ Icons.fmv ++ Icons.fbv
//
// def bsn = Icons.bh ++ Icons.bv ++ Icons.bth ++ Icons.bmh ++ Icons.bbh
//
// def bew = Icons.bv ++ Icons.bh ++ Icons.btv ++ Icons.bmv ++ Icons.bbv
//
// def sud = Array(Icons.bvt, Icons.bvm, Icons.bvb2)
//
// def sse = Array(Icons.bhb2, Icons.bhm2, Icons.bht2)
//
// def snw = Array(Icons.bht2, Icons.bhm2, Icons.bhb2)
//
// def th = Array(Icons.bhb, Icons.bhm, Icons.bht)
//
// def tv = Array(Icons.bvb, Icons.bvm, Icons.bvt)
// }
//
// // This an ugly monstrosity, but it's still better than having to manually
// // compute ambient occlusion in a custom block renderer to keep the lighting
// // pretty... which would be even more grotesque.
// override def getIcon(world: IBlockAccess, x: Int, y: Int, z: Int, worldSide: EnumFacing, localSide: EnumFacing) =
// world.getTileEntity(x, y, z) match {
// case screen: tileentity.Screen if screen.width > 1 || screen.height > 1 =>
// val right = screen.width - 1
// val bottom = screen.height - 1
// val (px, py) = screen.localPosition
// val (lx, ly) = screen.pitch match {
// case EnumFacing.NORTH => (px, py)
// case EnumFacing.UP => screen.yaw match {
// case EnumFacing.SOUTH =>
// (px, py)
// case EnumFacing.NORTH =>
// (right - px, bottom - py)
// case EnumFacing.EAST =>
// (right - px, py)
// case EnumFacing.WEST =>
// (px, bottom - py)
// case _ => throw new AssertionError("yaw has invalid value")
// }
// case EnumFacing.DOWN => screen.yaw match {
// case EnumFacing.SOUTH =>
// (px, bottom - py)
// case EnumFacing.NORTH =>
// (right - px, py)
// case EnumFacing.EAST =>
// (right - px, bottom - py)
// case EnumFacing.WEST =>
// (px, py)
// case _ => throw new AssertionError("yaw has invalid value")
// }
// case _ => throw new AssertionError("pitch has invalid value")
// }
// // See which face we're rendering. We can pretty much treat front and
// // back the same, except with a different texture set. Same goes for
// // left and right sides, as well as top and bottom sides.
// localSide match {
// case EnumFacing.SOUTH | EnumFacing.NORTH =>
// val (ud, sn, ew) =
// if (localSide == EnumFacing.SOUTH) (Icons.fud, Icons.fsn, Icons.few)
// else (Icons.bud, Icons.bsn, Icons.bew)
// val Array(ht, hm, hb, vt, vm, vb, tl, tm, tr, ml, mm, mr, bl, bm, br) = screen.pitch match {
// case EnumFacing.NORTH => ud
// case _ => screen.yaw match {
// case EnumFacing.SOUTH | EnumFacing.NORTH => sn
// case EnumFacing.EAST | EnumFacing.WEST => ew
// case _ => throw new AssertionError("yaw has invalid value")
// }
// }
// if (screen.height == 1) {
// if (lx == 0) ht
// else if (lx == right) hb
// else hm
// }
// else if (screen.width == 1) {
// if (ly == 0) vb
// else if (ly == bottom) vt
// else vm
// }
// else {
// if (lx == 0) {
// if (ly == 0) bl
// else if (ly == bottom) tl
// else ml
// }
// else if (lx == right) {
// if (ly == 0) br
// else if (ly == bottom) tr
// else mr
// }
// else {
// if (ly == 0) bm
// else if (ly == bottom) tm
// else mm
// }
// }
// case EnumFacing.EAST | EnumFacing.WEST =>
// val (ud, sn, ew) =
// if (localSide == EnumFacing.EAST) (Icons.sud, Icons.sse, Icons.snw)
// else (Icons.sud, Icons.snw, Icons.sse)
// val Array(t, m, b) = screen.pitch match {
// case EnumFacing.NORTH => ud
// case _ => screen.yaw match {
// case EnumFacing.SOUTH | EnumFacing.EAST => sn
// case EnumFacing.NORTH | EnumFacing.WEST => ew
// case _ => throw new AssertionError("yaw has invalid value")
// }
// }
// if (screen.height == 1) {
// Icons.b2
// }
// else {
// if (ly == 0) b
// else if (ly == bottom) t
// else m
// }
// case EnumFacing.UP | EnumFacing.DOWN =>
// val (sn, ew) =
// if (localSide == EnumFacing.UP ^ screen.pitch == EnumFacing.DOWN) (Icons.snw, Icons.sse)
// else (Icons.sse, Icons.snw)
// val Array(t, m, b) = screen.pitch match {
// case EnumFacing.NORTH => screen.yaw match {
// case EnumFacing.SOUTH => Icons.th
// case EnumFacing.NORTH => Icons.bh
// case EnumFacing.EAST => Icons.bv
// case EnumFacing.WEST => Icons.tv
// case _ => throw new AssertionError("yaw has invalid value")
// }
// case _ => screen.yaw match {
// case EnumFacing.SOUTH | EnumFacing.WEST => sn
// case EnumFacing.NORTH | EnumFacing.EAST => ew
// case _ => throw new AssertionError("yaw has invalid value")
// }
// }
// if (screen.width == 1) {
// if (screen.pitch == EnumFacing.NORTH) Icons.b
// else Icons.b2
// }
// else {
// if (lx == 0) b
// else if (lx == right) t
// else m
// }
// case _ => null
// }
// case screen: tileentity.Screen =>
// val (f, b, t, s) = screen.pitch match {
// case EnumFacing.NORTH => (Icons.f2, Icons.b2, Icons.b, Icons.b2)
// case _ => (Icons.f, Icons.b, Icons.b2, Icons.b2)
// }
// localSide match {
// case EnumFacing.SOUTH => f
// case EnumFacing.NORTH => b
// case EnumFacing.DOWN | EnumFacing.UP => t
// case _ => s
// }
// case _ => getIcon(localSide, 0)
// }
//
// override def getIcon(side: EnumFacing, metadata: Int) =
// side match {
// case EnumFacing.SOUTH => Icons.f2
// case EnumFacing.DOWN | EnumFacing.UP => Icons.b
// case _ => Icons.b2
// }
//
// override def registerBlockIcons(iconRegister: IIconRegister) = {
// Icons.b = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/b")
// Icons.b2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/b2")
// Icons.bbl = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bbl")
// Icons.bbl2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bbl2")
// Icons.bbm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bbm")
// Icons.bbm2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bbm2")
// Icons.bbr = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bbr")
// Icons.bbr2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bbr2")
// Icons.bhb = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bhb")
// Icons.bhb2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bhb2")
// Icons.bhm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bhm")
// Icons.bhm2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bhm2")
// Icons.bht = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bht")
// Icons.bht2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bht2")
// Icons.bml = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bml")
// Icons.bmm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bmm")
// Icons.bmr = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bmr")
// Icons.btl = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/btl")
// Icons.btm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/btm")
// Icons.btr = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/btr")
// Icons.bvb = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bvb")
// Icons.bvb2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bvb2")
// Icons.bvm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bvm")
// Icons.bvt = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/bvt")
// Icons.f = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/f")
// Icons.f2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/f2")
// Icons.fbl = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fbl")
// Icons.fbl2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fbl2")
// Icons.fbm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fbm")
// Icons.fbm2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fbm2")
// Icons.fbr = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fbr")
// Icons.fbr2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fbr2")
// Icons.fhb = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fhb")
// Icons.fhb2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fhb2")
// Icons.fhm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fhm")
// Icons.fhm2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fhm2")
// Icons.fht = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fht")
// Icons.fht2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fht2")
// Icons.fml = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fml")
// Icons.fmm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fmm")
// Icons.fmr = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fmr")
// Icons.ftl = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/ftl")
// Icons.ftm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/ftm")
// Icons.ftr = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/ftr")
// Icons.fvb = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fvb")
// Icons.fvb2 = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fvb2")
// Icons.fvm = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fvm")
// Icons.fvt = iconRegister.getAtlasSprite(Settings.resourceDomain + ":screen/fvt")
// }
// ----------------------------------------------------------------------- //
override def hasTileEntity(state: IBlockState) = true override def hasTileEntity(state: IBlockState) = true
override def createNewTileEntity(world: World, metadata: Int) = new tileentity.Screen(tier) override def createNewTileEntity(world: World, metadata: Int) = new tileentity.Screen(tier)