197 lines
6.1 KiB
Scala
197 lines
6.1 KiB
Scala
package edx.electrical.circuit.component.laser.fx
|
|
|
|
import cpw.mods.fml.client.FMLClientHandler
|
|
import cpw.mods.fml.relauncher.{Side, SideOnly}
|
|
import edx.core.Reference
|
|
import edx.electrical.ElectricalContent
|
|
import edx.electrical.circuit.component.laser.Laser
|
|
import net.minecraft.client.particle.EntityFX
|
|
import net.minecraft.client.renderer.Tessellator
|
|
import net.minecraft.util.ResourceLocation
|
|
import net.minecraft.world.World
|
|
import org.lwjgl.opengl.GL11._
|
|
import resonantengine.lib.transform.vector.Vector3
|
|
|
|
/**
|
|
* @author Calclavia
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
class EntityLaserFX(par1World: World, start: Vector3, end: Vector3, color: Vector3, energy: Double) extends EntityFX(par1World, start.x, start.y, start.z)
|
|
{
|
|
val laserStartTexture = new ResourceLocation(Reference.domain, Reference.FX_DIRECTORY + "laserStart.png")
|
|
val laserMiddleTexture = new ResourceLocation(Reference.domain, Reference.FX_DIRECTORY + "laserMiddle.png")
|
|
val laserEndTexture = new ResourceLocation(Reference.domain, Reference.FX_DIRECTORY + "laserEnd.png")
|
|
val laserNoiseTexture = new ResourceLocation(Reference.domain, Reference.FX_DIRECTORY + "noise.png")
|
|
|
|
val energyPercentage = Math.min(energy / Laser.maxEnergy, 1).toFloat
|
|
|
|
val endSize = 0.01
|
|
// + (0.2 - 0.01) * energyPercentage
|
|
val detail = 20
|
|
val rotationSpeed = 18
|
|
|
|
/**
|
|
* Set position
|
|
*/
|
|
val midPoint = (end + start) / 2
|
|
setPosition(midPoint.x, midPoint.y, midPoint.z)
|
|
lastTickPosX = posX
|
|
lastTickPosY = posY
|
|
lastTickPosZ = posZ
|
|
|
|
prevPosX = posX
|
|
prevPosY = posY
|
|
prevPosZ = posZ
|
|
|
|
particleScale = 0.4f * energyPercentage
|
|
particleMaxAge = 1
|
|
particleAlpha = 1 / (detail.asInstanceOf[Float] / (5f * energyPercentage))
|
|
particleRed = color.x.toFloat
|
|
particleGreen = color.y.toFloat
|
|
particleBlue = color.z.toFloat
|
|
|
|
val length = start.distance(end)
|
|
|
|
val difference = end - start
|
|
val angles = difference.toEulerAngle
|
|
|
|
val modifierTranslation = (length / 2) + endSize;
|
|
|
|
override def onUpdate
|
|
{
|
|
prevPosX = posX
|
|
prevPosY = posY
|
|
prevPosZ = posZ
|
|
|
|
if (particleAge >= particleMaxAge)
|
|
{
|
|
setDead
|
|
}
|
|
|
|
particleAge += 1
|
|
}
|
|
|
|
override def renderParticle(tessellator: Tessellator, par2: Float, par3: Float, par4: Float, par5: Float, par6: Float, par7: Float)
|
|
{
|
|
tessellator.draw()
|
|
|
|
glPushMatrix()
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
|
|
glEnable(3042);
|
|
glColor4f(1, 1, 1, 1)
|
|
|
|
/**
|
|
* Translation
|
|
*/
|
|
val f11 = this.prevPosX + (this.posX - this.prevPosX) * par2 - EntityFX.interpPosX
|
|
val f12 = this.prevPosY + (this.posY - this.prevPosY) * par2 - EntityFX.interpPosY
|
|
val f13 = this.prevPosZ + (this.posZ - this.prevPosZ) * par2 - EntityFX.interpPosZ
|
|
|
|
glTranslated(f11, f12, f13)
|
|
|
|
/**
|
|
* Rotate the beam
|
|
*/
|
|
glRotated(angles.yaw, 0, 1, 0)
|
|
glRotated(angles.pitch, 1, 0, 0)
|
|
|
|
glRotated(90, 1, 0, 0)
|
|
|
|
val time = worldObj.getTotalWorldTime()
|
|
|
|
/**
|
|
* Tessellate laser
|
|
*/
|
|
glPushMatrix()
|
|
glRotatef(time % (360 / rotationSpeed) * rotationSpeed + rotationSpeed * par2, 0, 1, 0)
|
|
|
|
for (a <- 0 to detail)
|
|
{
|
|
glRotatef(a * 360 / detail, 0, 1, 0)
|
|
|
|
/**
|
|
* Render Cap
|
|
*/
|
|
glPushMatrix()
|
|
glTranslated(0, -modifierTranslation, 0)
|
|
glRotatef(180, 1, 0, 0)
|
|
|
|
FMLClientHandler.instance.getClient.renderEngine.bindTexture(laserStartTexture)
|
|
|
|
tessellator.startDrawingQuads()
|
|
tessellator.setBrightness(200)
|
|
tessellator.setColorRGBA_F(particleRed, particleGreen, particleBlue, particleAlpha)
|
|
tessellator.addVertexWithUV(-particleScale, -particleScale, 0, 0, 0)
|
|
tessellator.addVertexWithUV(-particleScale, particleScale, 0, 0, 1)
|
|
tessellator.addVertexWithUV(particleScale, particleScale, 0, 1, 1)
|
|
tessellator.addVertexWithUV(particleScale, -particleScale, 0, 1, 0)
|
|
tessellator.draw()
|
|
|
|
glPopMatrix()
|
|
|
|
/**
|
|
* Render Middle
|
|
*/
|
|
glPushMatrix()
|
|
FMLClientHandler.instance.getClient.renderEngine.bindTexture(laserMiddleTexture)
|
|
|
|
tessellator.startDrawingQuads()
|
|
tessellator.setBrightness(200)
|
|
tessellator.setColorRGBA_F(particleRed, particleGreen, particleBlue, particleAlpha)
|
|
tessellator.addVertexWithUV(-particleScale, -length / 2 + endSize, 0, 0, 0)
|
|
tessellator.addVertexWithUV(-particleScale, length / 2 - endSize, 0, 0, 1)
|
|
tessellator.addVertexWithUV(particleScale, length / 2 - endSize, 0, 1, 1)
|
|
tessellator.addVertexWithUV(particleScale, -length / 2 + endSize, 0, 1, 0)
|
|
tessellator.draw()
|
|
glPopMatrix()
|
|
|
|
/**
|
|
* Render End
|
|
*/
|
|
glPushMatrix()
|
|
glTranslated(0, -modifierTranslation, 0)
|
|
glRotatef(180, 1, 0, 0)
|
|
|
|
FMLClientHandler.instance.getClient.renderEngine.bindTexture(laserEndTexture)
|
|
|
|
tessellator.startDrawingQuads()
|
|
tessellator.setBrightness(200)
|
|
tessellator.setColorRGBA_F(particleRed, particleGreen, particleBlue, particleAlpha)
|
|
tessellator.addVertexWithUV(-particleScale, -particleScale, 0, 0, 0)
|
|
tessellator.addVertexWithUV(-particleScale, particleScale, 0, 0, 1)
|
|
tessellator.addVertexWithUV(particleScale, particleScale, 0, 1, 1)
|
|
tessellator.addVertexWithUV(particleScale, -particleScale, 0, 1, 0)
|
|
tessellator.draw()
|
|
|
|
glPopMatrix()
|
|
|
|
/**
|
|
* Render Noise
|
|
*/
|
|
glPushMatrix()
|
|
FMLClientHandler.instance.getClient.renderEngine.bindTexture(laserNoiseTexture)
|
|
|
|
tessellator.startDrawingQuads()
|
|
tessellator.setBrightness(200)
|
|
tessellator.setColorRGBA_F(particleRed, particleGreen, particleBlue, particleAlpha)
|
|
tessellator.addVertexWithUV(-particleScale, -length / 2 + endSize, 0, 0, 0)
|
|
tessellator.addVertexWithUV(-particleScale, length / 2 - endSize, 0, 0, 1)
|
|
tessellator.addVertexWithUV(particleScale, length / 2 - endSize, 0, 1, 1)
|
|
tessellator.addVertexWithUV(particleScale, -length / 2 + endSize, 0, 1, 0)
|
|
tessellator.draw()
|
|
glPopMatrix()
|
|
}
|
|
|
|
glPopMatrix()
|
|
|
|
glEnable(3042)
|
|
|
|
glPopMatrix()
|
|
|
|
FMLClientHandler.instance().getClient().renderEngine.bindTexture(ElectricalContent.particleTextures)
|
|
tessellator.startDrawingQuads()
|
|
}
|
|
|
|
}
|