electrodynamics/src/main/scala/edx/mechanical/fluid/pipe/RenderPipe.scala
2015-01-27 16:15:44 +08:00

120 lines
3.6 KiB
Scala

package edx.mechanical.fluid.pipe
import java.awt.Color
import cpw.mods.fml.relauncher.{Side, SideOnly}
import edx.core.Reference
import net.minecraft.item.{ItemDye, ItemStack}
import net.minecraft.util.ResourceLocation
import net.minecraftforge.client.IItemRenderer.ItemRenderType
import net.minecraftforge.client.model.AdvancedModelLoader
import net.minecraftforge.common.util.ForgeDirection
import org.lwjgl.opengl.GL11
import resonantengine.api.item.ISimpleItemRenderer
import resonantengine.lib.render.{FluidRenderUtility, RenderUtility}
import resonantengine.lib.transform.vector.Vector3
import resonantengine.lib.utility.WorldUtility
import resonantengine.lib.wrapper.BitmaskWrapper._
@SideOnly(Side.CLIENT)
object RenderPipe extends ISimpleItemRenderer
{
val model = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "pipe.tcn"))
var texture = new ResourceLocation(Reference.domain, Reference.modelPath + "pipe.png")
/**
* Render pipe in world
*/
def render(part: PartPipe, x: Double, y: Double, z: Double, f: Float)
{
GL11.glPushMatrix()
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5)
render(part.getMaterialID, if (part.getColor > 0) ItemDye.field_150922_c(part.getColor) else -1, part.clientRenderMask)
val fluid = part.node.getFluid
val pos = new Vector3(x, y, z)
if (fluid != null && fluid.amount > 0)
{
ForgeDirection.VALID_DIRECTIONS.filter(d => part.clientRenderMask.mask(d.ordinal())).foreach(
dir =>
{
GL11.glPushMatrix()
GL11.glTranslated(dir.offsetX * 0.33, dir.offsetY * 0.33, dir.offsetZ * 0.33)
GL11.glScaled(0.33, 0.33, 0.33)
val tank = part.node
FluidRenderUtility.renderFluidTesselation(tank, 1, 1, 1, 1)
GL11.glPopMatrix()
})
}
GL11.glPopMatrix()
}
/**
* Render inventory pipe
*/
def renderInventoryItem(renderType: ItemRenderType, itemStack: ItemStack, data: AnyRef*)
{
GL11.glPushMatrix()
if (renderType == ItemRenderType.EQUIPPED_FIRST_PERSON || renderType == ItemRenderType.EQUIPPED)
GL11.glTranslated(0.5, 0.5, 0.5)
render(itemStack.getItemDamage, -1, 0xC)
GL11.glPopMatrix()
}
/**
* Render Pipe Model
*/
def render(meta: Int, colorCode: Int, sides: Int)
{
RenderUtility.enableBlending()
RenderUtility.bind(texture)
val material = PipeMaterials(meta).asInstanceOf[PipeMaterials.PipeMaterial]
val matColor = new Color(material.color)
GL11.glColor4f(matColor.getRed / 255f, matColor.getGreen / 255f, matColor.getBlue / 255f, 1)
model.renderOnly("Mid")
for (dir <- ForgeDirection.VALID_DIRECTIONS)
{
if (WorldUtility.isEnabledSide(sides, dir))
{
GL11.glColor4f(matColor.getRed / 255f, matColor.getGreen / 255f, matColor.getBlue / 255f, 1)
var prefix: String = null
dir match
{
case ForgeDirection.DOWN =>
prefix = "Bottom"
case ForgeDirection.UP =>
prefix = "Top"
case ForgeDirection.NORTH =>
prefix = "Front"
case ForgeDirection.SOUTH =>
prefix = "Back"
case ForgeDirection.WEST =>
prefix = "Right"
case ForgeDirection.EAST =>
prefix = "Left"
case _ =>
}
model.renderOnly(prefix + "Inter", prefix + "Connect")
if (colorCode > 0)
{
val color = new Color(colorCode)
GL11.glColor4f(color.getRed / 255f, color.getGreen / 255f, color.getBlue / 255f, 1)
}
model.renderOnly(prefix + "Pipe")
}
}
RenderUtility.disableBlending()
}
}