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 SwitchSideOn = L("SwitchSideOn")
// Kill me now.
object Screen {
val Single = Array(
L("screen/b"),
@ -114,141 +115,287 @@ object Textures {
L("screen/b2")
)
val HorizontalLeft = Array(
L("screen/bht"),
L("screen/bht"),
L("screen/bht2"),
L("screen/bht2"),
L("screen/b2"),
L("screen/b2") // Never rendered.
val Horizontal = Array(
// Vertical.
Array(
Array(
L("screen/bht"),
L("screen/bht"),
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(
L("screen/bhm"),
L("screen/bhm"),
L("screen/bhm2"),
L("screen/bhm2"),
L("screen/b2"), // Never rendered.
L("screen/b2") // Never rendered.
val Vertical = Array(
// Vertical.
Array(
Array(
L("screen/b"), // Never rendered.
L("screen/b"),
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(
L("screen/bhb"),
L("screen/bhb"),
L("screen/bhb2"),
L("screen/bhb2"),
L("screen/b2"), // Never rendered.
L("screen/b2")
)
val VerticalTop = Array(
L("screen/b"), // Never rendered.
L("screen/b"),
L("screen/bvt"),
L("screen/bvt"),
L("screen/bvt"),
L("screen/bvt")
)
val VerticalMiddle = Array(
L("screen/b"), // Never rendered.
L("screen/b"), // Never rendered.
L("screen/bvm"),
L("screen/bvm"),
L("screen/bvm"),
L("screen/bvm")
)
val VerticalBottom = Array(
L("screen/b"),
L("screen/b"), // Never rendered.
L("screen/bvb2"),
L("screen/bvb2"),
L("screen/bvb2"),
L("screen/bvb2")
)
// TODO Horizontal one, too (for alternative sides).
val MultiTopLeft = Array(
L("screen/bht"), // Never rendered.
L("screen/bht"),
L("screen/btl"),
L("screen/btl"),
L("screen/bvt"),
L("screen/bvt") // Never rendered.
)
val MultiTopMiddle = Array(
L("screen/bhm"), // Never rendered.
L("screen/bhm"),
L("screen/btm"),
L("screen/btm"),
L("screen/bvt"),
L("screen/bvt") // Never rendered.
)
val MultiTopRight = Array(
L("screen/bhb"), // Never rendered.
L("screen/bhb"), // Never rendered.
L("screen/btr"),
L("screen/btr"),
L("screen/bvt"), // Never rendered.
L("screen/bvt") // Never rendered.
)
val MultiMiddleLeft = Array(
L("screen/bht"), // Never rendered.
L("screen/bht"), // Never rendered.
L("screen/bml"),
L("screen/bml"),
L("screen/bvm"), // Never rendered.
L("screen/bvm") // Never rendered.
)
val MultiMiddleMiddle = Array(
L("screen/bhm"), // Never rendered.
L("screen/bhm"), // Never rendered.
L("screen/bmm"),
L("screen/bmm"),
L("screen/bvt"), // Never rendered.
L("screen/bvt") // Never rendered.
)
val MultiMiddleRight = Array(
L("screen/bhb"),
L("screen/bhb"), // Never rendered.
L("screen/bmr"),
L("screen/bmr"),
L("screen/bvm"), // Never rendered.
L("screen/bvm")
)
val MultiBottomLeft = Array(
L("screen/bht"), // Never rendered.
L("screen/bht"),
L("screen/bbl2"),
L("screen/bbl2"),
L("screen/bvb2"),
L("screen/bvb2") // Never rendered.
)
val MultiBottomMiddle = Array(
L("screen/bhm"),
L("screen/bhm"), // Never rendered.
L("screen/bbm2"),
L("screen/bbm2"),
L("screen/bvb2"),
L("screen/bvb2") // Never rendered.
)
val MultiBottomRight = Array(
L("screen/bhb"),
L("screen/bhb"), // Never rendered.
L("screen/bbr2"),
L("screen/bbr2"),
L("screen/bvb2"), // Never rendered.
L("screen/bvb2")
val Multi = Array(
// Vertical.
Array(
// Top.
Array(
Array(
L("screen/bht"), // Never rendered.
L("screen/bht"),
L("screen/btl"),
L("screen/btl"),
L("screen/bvt"),
L("screen/bvt") // Never rendered.
),Array(
L("screen/bhm"), // Never rendered.
L("screen/bhm"),
L("screen/btm"),
L("screen/btm"),
L("screen/bvt"),
L("screen/bvt") // Never rendered.
),
Array(
L("screen/bhb"), // Never rendered.
L("screen/bhb"), // Never rendered.
L("screen/btr"),
L("screen/btr"),
L("screen/bvt"), // Never rendered.
L("screen/bvt") // Never rendered.
)
),
// Middle.
Array(
Array(
L("screen/bht"), // Never rendered.
L("screen/bht"), // Never rendered.
L("screen/bml"),
L("screen/bml"),
L("screen/bvm"), // Never rendered.
L("screen/bvm") // Never rendered.
),
Array(
L("screen/bhm"), // Never rendered.
L("screen/bhm"), // Never rendered.
L("screen/bmm"),
L("screen/bmm"),
L("screen/bvt"), // Never rendered.
L("screen/bvt") // Never rendered.
),
Array(
L("screen/bhb"),
L("screen/bhb"), // Never rendered.
L("screen/bmr"),
L("screen/bmr"),
L("screen/bvm"), // Never rendered.
L("screen/bvm")
)
),
// Right.
Array(
Array(
L("screen/bht"), // Never rendered.
L("screen/bht"),
L("screen/bbl2"),
L("screen/bbl2"),
L("screen/bvb2"),
L("screen/bvb2") // Never rendered.
),
Array(
L("screen/bhm"),
L("screen/bhm"), // Never rendered.
L("screen/bbm2"),
L("screen/bbm2"),
L("screen/bvb2"),
L("screen/bvb2") // Never rendered.
),
Array(
L("screen/bhb"),
L("screen/bhb"), // Never rendered.
L("screen/bbr2"),
L("screen/bbr2"),
L("screen/bvb2"), // Never rendered.
L("screen/bvb2")
)
)
),
// Horizontal.
Array(
// Top.
Array(
Array(
L("screen/bht2"), // Never rendered.
L("screen/bht2"),
L("screen/btl"),
L("screen/btl"),
L("screen/bht2"),
L("screen/bht2") // Never rendered.
),Array(
L("screen/bhm2"), // Never rendered.
L("screen/bhm2"),
L("screen/btm"),
L("screen/btm"),
L("screen/bht2"),
L("screen/bht2") // Never rendered.
),
Array(
L("screen/bhb2"), // Never rendered.
L("screen/bhb2"), // Never rendered.
L("screen/btr"),
L("screen/btr"),
L("screen/bht2"), // Never rendered.
L("screen/bht2") // Never rendered.
)
),
// Middle.
Array(
Array(
L("screen/bht2"), // Never rendered.
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...

View File

@ -6,6 +6,7 @@ import li.cil.oc.Settings
import li.cil.oc.client.Textures
import li.cil.oc.common.block
import li.cil.oc.common.tileentity
import li.cil.oc.util.Color
import net.minecraft.block.Block
import net.minecraft.block.state.IBlockState
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.texture.TextureAtlasSprite
import net.minecraft.client.resources.model.ModelResourceLocation
import net.minecraft.item.EnumDyeColor
import net.minecraft.util.EnumFacing
import net.minecraft.util.RegistrySimple
import net.minecraftforge.client.event.ModelBakeEvent
@ -37,11 +39,9 @@ object ExtendedBlockModel {
@SubscribeEvent
def onModelBake(e: ModelBakeEvent): Unit = {
val registry = e.modelRegistry.asInstanceOf[RegistrySimple]
val screenPattern = "^" + Settings.resourceDomain + ":screen\\d#.*"
registry.getKeys.collect {
case location: ModelResourceLocation =>
if (location.toString.startsWith(Settings.resourceDomain + ":screen1#")) {
registry.putObject(location, ScreenRenderer)
}
case location: ModelResourceLocation if location.toString.matches(screenPattern) => registry.putObject(location, ScreenRenderer)
}
}
}
@ -89,64 +89,76 @@ class ScreenRenderer(val state: IExtendedBlockState) extends SmartBlockModelBase
override def getFaceQuads(side: EnumFacing) = {
state.getValue(block.Screen.Tile) match {
case screen: tileentity.Screen =>
// TODO Translate facing to "local" coordinate system of our default texture layout.
val facing = screen.toLocal(side)
val textures = if (screen.width == 1 && screen.height == 1) {
Textures.Block.Screen.Single
}
else if (screen.width == 1) {
val (_, y) = screen.localPosition
if (y == 0) Textures.Block.Screen.VerticalBottom
else if (y == screen.height - 1) Textures.Block.Screen.VerticalTop
else Textures.Block.Screen.VerticalMiddle
}
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
val (x, y) = screen.localPosition
val pitch = if (screen.pitch == EnumFacing.NORTH) 0 else 1
var rx = multiCoords(x, screen.width - 1)
var ry = multiCoords(y, screen.height - 1)
var rotation = 0
if (side == EnumFacing.UP) {
rotation += screen.yaw.getHorizontalIndex
ry = 2 - ry
}
else {
val (x, y) = screen.localPosition
// TODO Differentiate horizontal and vertical multiscreens.
if (x == 0)
if (y == 0) Textures.Block.Screen.MultiBottomRight
else if (y == screen.height - 1) Textures.Block.Screen.MultiTopRight
else Textures.Block.Screen.MultiMiddleRight
else if (x == screen.width - 1)
if (y == 0) Textures.Block.Screen.MultiBottomLeft
else if (y == screen.height - 1) Textures.Block.Screen.MultiTopLeft
else Textures.Block.Screen.MultiMiddleLeft
else
if (y == 0) Textures.Block.Screen.MultiBottomMiddle
else if (y == screen.height - 1) Textures.Block.Screen.MultiTopMiddle
else Textures.Block.Screen.MultiMiddleMiddle
if (side == EnumFacing.DOWN) {
if (screen.yaw.getAxis == EnumFacing.Axis.X) {
rotation += 1
rx = 2 - rx
}
if (screen.yaw.getAxisDirection.getOffset < 0)
ry = 2 - ry
}
else if (screen.yaw.getAxisDirection.getOffset > 0 && pitch == 1)
ry = 2 - ry
if (screen.yaw == EnumFacing.NORTH || screen.yaw == EnumFacing.EAST)
rx = 2 - rx
}
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)
}
}
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)
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
rawData(x, y, z, texture, u, v)
rawData(x, y, z, texture, u, v, Color.rgbValues(color))
}).flatten
}
// 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(
java.lang.Float.floatToRawIntBits(x),
java.lang.Float.floatToRawIntBits(y),
java.lang.Float.floatToRawIntBits(z),
0xFFFFFFFF,
0xFF000000 | rgb2bgr(color),
java.lang.Float.floatToRawIntBits(texture.getInterpolatedU(u)),
java.lang.Float.floatToRawIntBits(texture.getInterpolatedV(v)),
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 createNewTileEntity(world: World, metadata: Int) = new tileentity.Screen(tier)