tcr/java/src/game/renderer/entity/RendererLivingEntity.java

572 lines
23 KiB
Java
Raw Normal View History

2025-03-11 00:23:54 +01:00
package game.renderer.entity;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.List;
2025-03-16 17:40:47 +01:00
import com.google.common.collect.Lists;
2025-03-11 00:23:54 +01:00
import game.color.TextColor;
import game.entity.Entity;
import game.entity.item.EntityCrystal;
import game.entity.types.EntityAnimal;
import game.entity.types.EntityLiving;
import game.log.Log;
2025-03-11 00:23:54 +01:00
import game.renderer.DefaultVertexFormats;
import game.renderer.GlState;
import game.renderer.ItemRenderer;
import game.renderer.RenderBuffer;
import game.renderer.Tessellator;
import game.renderer.layers.LayerRenderer;
import game.renderer.model.ModelBase;
import game.renderer.texture.DynamicTexture;
import game.util.ExtMath;
import game.window.WCF;
2025-03-11 00:23:54 +01:00
public abstract class RendererLivingEntity<T extends EntityLiving> extends Render<T>
{
private static final DynamicTexture textureBrightness = new DynamicTexture(16, 16);
private static final String crystalBeamTextures = "textures/entity/crystal_beam.png";
protected ModelBase mainModel;
protected FloatBuffer brightnessBuffer = ByteBuffer.allocateDirect(4 << 2).order(ByteOrder.nativeOrder()).asFloatBuffer();
protected List<LayerRenderer<T>> layerRenderers = Lists.<LayerRenderer<T>>newArrayList();
protected boolean renderOutlines = false;
public RendererLivingEntity(RenderManager renderManagerIn, ModelBase modelBaseIn)
{
super(renderManagerIn);
this.mainModel = modelBaseIn;
// this.shadowSize = shadowSizeIn;
}
protected <V extends EntityLiving, U extends LayerRenderer<V>> boolean addLayer(U layer)
{
return this.layerRenderers.add((LayerRenderer<T>)layer);
}
protected <V extends EntityLiving, U extends LayerRenderer<V>> boolean removeLayer(U layer)
{
return this.layerRenderers.remove(layer);
}
public ModelBase getMainModel()
{
return this.mainModel;
}
/**
* Returns a rotation angle that is inbetween two other rotation angles. par1 and par2 are the angles between which
* to interpolate, par3 is probably a float between 0.0 and 1.0 that tells us where "between" the two angles we are.
* Example: par1 = 30, par2 = 50, par3 = 0.5, then return = 40
*/
protected float interpolateRotation(float par1, float par2, float par3)
{
float f;
for (f = par2 - par1; f < -180.0F; f += 360.0F)
{
;
}
while (f >= 180.0F)
{
f -= 360.0F;
}
return par1 + par3 * f;
}
// public void transformHeldFull3DItemLayer()
// {
// }
/**
* Renders the desired {@code T} type Entity.
*/
public void doRender(T entity, double x, double y, double z, float partialTicks)
{
WCF.glPushMatrix();
GlState.disableCull();
this.mainModel.swingProgress = this.getSwingProgress(entity, partialTicks);
this.mainModel.isRiding = entity.isRiding();
this.mainModel.isChild = entity instanceof EntityAnimal && ((EntityAnimal)entity).isChild();
try
{
float f = this.interpolateRotation(entity.prevYawOffset, entity.yawOffset, partialTicks);
float f1 = this.interpolateRotation(entity.prevHeadYaw, entity.headYaw, partialTicks);
float f2 = f1 - f;
if (entity.isRiding() && entity.vehicle instanceof EntityLiving)
{
EntityLiving entitylivingbase = (EntityLiving)entity.vehicle;
f = this.interpolateRotation(entitylivingbase.prevYawOffset, entitylivingbase.yawOffset, partialTicks);
f2 = f1 - f;
float f3 = ExtMath.wrapf(f2);
if (f3 < -85.0F)
{
f3 = -85.0F;
}
if (f3 >= 85.0F)
{
f3 = 85.0F;
}
f = f1 - f3;
if (f3 * f3 > 2500.0F)
{
f += f3 * 0.2F;
}
}
float f7 = entity.prevPitch + (entity.rotPitch - entity.prevPitch) * partialTicks;
this.renderLivingAt(entity, x, y, z);
float f8 = this.handleRotationFloat(entity, partialTicks);
this.rotateCorpse(entity, f8, f, partialTicks);
GlState.enableRescaleNormal();
WCF.glScalef(-1.0F, -1.0F, 1.0F);
this.preRenderCallback(entity, partialTicks);
float f4 = 0.0625F;
WCF.glTranslatef(0.0F, -1.5078125F, 0.0F);
float f5 = entity.prevLswingAmount + (entity.lswingAmount - entity.prevLswingAmount) * partialTicks;
float f6 = entity.limbSwing - entity.lswingAmount * (1.0F - partialTicks);
if (this.mainModel.isChild)
{
f6 *= 3.0F;
}
if (f5 > 1.0F)
{
f5 = 1.0F;
}
GlState.enableAlpha();
this.mainModel.setLivingAnimations(entity, f6, f5, partialTicks);
this.mainModel.setRotationAngles(f6, f5, f8, f2, f7, 0.0625F, entity);
if (this.renderOutlines)
{
boolean flag1 = this.setOutlineColor(entity);
this.renderModel(entity, f6, f5, f8, f2, f7, 0.0625F);
if (flag1)
{
this.unsetOutlineColor();
}
}
else
{
// boolean flag = this.setDoRenderBrightness(entity, partialTicks);
this.renderModel(entity, f6, f5, f8, f2, f7, 0.0625F);
// if (flag)
// {
// this.unsetBrightness();
// }
GlState.depthMask(true);
// if (!(entity.isPlayer()) || !((EntityNPC)entity).isSpectator())
// {
this.renderLayers(entity, f6, f5, partialTicks, f8, f2, f7, 0.0625F);
// }
}
GlState.disableRescaleNormal();
}
catch (Exception exception)
{
Log.JNI.error((Throwable)exception, (String)"Konnte Objekt nicht rendern");
}
GlState.setActiveTexture(WCF.GL_TEXTURE1);
GlState.enableTexture2D();
GlState.setActiveTexture(WCF.GL_TEXTURE0);
GlState.enableCull();
WCF.glPopMatrix();
if (!this.renderOutlines)
{
super.doRender(entity, x, y, z, partialTicks);
}
}
protected boolean setOutlineColor(T entityLivingBaseIn)
{
int // i = 16777215;
// if (entityLivingBaseIn.isPlayer())
// {
// ScorePlayerTeam scoreplayerteam = (ScorePlayerTeam)((EntityNPC)entityLivingBaseIn).getTeam();
//
// if (scoreplayerteam != null)
// {
// String s = FontRenderer.getFormatFromString(scoreplayerteam.getColorPrefix());
//
// if (s.length() >= 1)
// {
// i = this.getFontRendererFromRenderManager().getColorCode(s.charAt(0));
// }
// }
// }
// else {
c = entityLivingBaseIn.getColor();
// }
float r = (float)(c >> 16 & 255) / 255.0F;
float g = (float)(c >> 8 & 255) / 255.0F;
float b = (float)(c & 255) / 255.0F;
GlState.disableLighting();
GlState.setActiveTexture(WCF.GL_TEXTURE0);
GlState.color(r, g, b, 1.0F);
GlState.disableTexture2D();
GlState.setActiveTexture(WCF.GL_TEXTURE1);
GlState.disableTexture2D();
GlState.setActiveTexture(WCF.GL_TEXTURE0);
return true;
}
protected void unsetOutlineColor()
{
GlState.enableLighting();
GlState.setActiveTexture(WCF.GL_TEXTURE0);
GlState.enableTexture2D();
GlState.setActiveTexture(WCF.GL_TEXTURE1);
GlState.enableTexture2D();
GlState.setActiveTexture(WCF.GL_TEXTURE0);
}
protected void renderModel(T entity, float x, float y, float z, float yaw, float pitch, float scale)
{
// boolean vis = !entity.isInvisible();
boolean ghost = entity.isGhost(); // ) || (!vis && !entity.isInvisible());
// if (!entity.isInvisible())
// {
if (!this.bindEntityTexture(entity))
{
return;
}
if (ghost)
{
WCF.glPushMatrix();
GlState.color(1.0F, 1.0F, 1.0F, 0.3F);
// GlState.color(entity.getRenderColor() | (vis ? 0x50000000 : 0x26000000));
GlState.depthMask(false);
GlState.enableBlend();
GlState.blendFunc(770, 771);
GlState.alphaFunc(516, 0.003921569F);
}
if(entity.isGlowing())
GlState.color(0.1F, 1.0F, 0.1F, 1.0F);
if(entity.hurtTime > 0 || entity.deathTime > 0)
GlState.color(1.0F, 0.5F, 0.5F, 1.0F);
this.mainModel.render(entity, x, y, z, yaw, pitch, scale);
if (ghost)
{
GlState.disableBlend();
GlState.alphaFunc(516, 0.1F);
WCF.glPopMatrix();
GlState.depthMask(true);
}
// }
}
// protected boolean setDoRenderBrightness(T entityLivingBaseIn, float partialTicks)
// {
// return this.setBrightness(entityLivingBaseIn, partialTicks, true);
// }
// protected boolean setBrightness(T entitylivingbaseIn, float partialTicks, boolean combineTextures)
// {
// return false;
// float f = entitylivingbaseIn.getBrightness(partialTicks);
// int i = this.getColorMultiplier(entitylivingbaseIn, f, partialTicks);
// boolean flag = (i >> 24 & 255) > 0;
// boolean flag1 = entitylivingbaseIn.hurtTime > 0 || entitylivingbaseIn.deathTime > 0;
// if (!flag) // && !flag1)
// {
// return false;
// }
// else if (!flag && !combineTextures)
// {
// return false;
// }
// else
// {
// GlState.setActiveTexture(SKC.GL_TEXTURE0);
// GlState.enableTexture2D();
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_MODE, SKC.GL_COMBINE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_RGB, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_RGB, SKC.GL_TEXTURE0);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_RGB, SKC.GL_PRIMARY_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_ALPHA, SKC.GL_REPLACE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_ALPHA, SKC.GL_TEXTURE0);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_ALPHA, SKC.GL_SRC_ALPHA);
// GlState.setActiveTexture(SKC.GL_TEXTURE1);
// GlState.enableTexture2D();
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_MODE, SKC.GL_COMBINE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_RGB, SKC.GL_INTERPOLATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_RGB, SKC.GL_CONSTANT);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_RGB, SKC.GL_PREVIOUS);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE2_RGB, SKC.GL_CONSTANT);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND2_RGB, SKC.GL_SRC_ALPHA);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_ALPHA, SKC.GL_REPLACE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_ALPHA, SKC.GL_PREVIOUS);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_ALPHA, SKC.GL_SRC_ALPHA);
// this.brightnessBuffer.position(0);
//
//// if (flag1)
//// {
//// this.brightnessBuffer.put(1.0F);
//// this.brightnessBuffer.put(0.0F);
//// this.brightnessBuffer.put(0.0F);
//// this.brightnessBuffer.put(0.3F);
//// }
//// else
//// {
// float f1 = (float)(i >> 24 & 255) / 255.0F;
// float f2 = (float)(i >> 16 & 255) / 255.0F;
// float f3 = (float)(i >> 8 & 255) / 255.0F;
// float f4 = (float)(i & 255) / 255.0F;
// this.brightnessBuffer.put(f2);
// this.brightnessBuffer.put(f3);
// this.brightnessBuffer.put(f4);
// this.brightnessBuffer.put(1.0F - f1);
//// }
//
// this.brightnessBuffer.flip();
// SKC.glTexEnv(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_COLOR, (FloatBuffer)this.brightnessBuffer);
// GlState.setActiveTexture(SKC.GL_TEXTURE2);
// GlState.enableTexture2D();
// GlState.bindTexture(textureBrightness.getGlTextureId());
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_MODE, SKC.GL_COMBINE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_RGB, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_RGB, SKC.GL_PREVIOUS);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_RGB, SKC.GL_TEXTURE1);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_ALPHA, SKC.GL_REPLACE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_ALPHA, SKC.GL_PREVIOUS);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_ALPHA, SKC.GL_SRC_ALPHA);
// GlState.setActiveTexture(SKC.GL_TEXTURE0);
// return true;
// }
// }
// protected void unsetBrightness()
// {
// GlState.setActiveTexture(SKC.GL_TEXTURE0);
// GlState.enableTexture2D();
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_MODE, SKC.GL_COMBINE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_RGB, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_RGB, SKC.GL_TEXTURE0);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_RGB, SKC.GL_PRIMARY_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_ALPHA, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_ALPHA, SKC.GL_TEXTURE0);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_ALPHA, SKC.GL_PRIMARY_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_ALPHA, SKC.GL_SRC_ALPHA);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_ALPHA, SKC.GL_SRC_ALPHA);
// GlState.setActiveTexture(SKC.GL_TEXTURE1);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_MODE, SKC.GL_COMBINE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_RGB, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_RGB, SKC.GL_TEXTURE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_RGB, SKC.GL_PREVIOUS);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_ALPHA, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_ALPHA, SKC.GL_SRC_ALPHA);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_ALPHA, SKC.GL_TEXTURE);
// GlState.color(1.0F, 1.0F, 1.0F, 1.0F);
// GlState.setActiveTexture(SKC.GL_TEXTURE2);
// GlState.disableTexture2D();
// GlState.bindTexture(0);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_TEXTURE_ENV_MODE, SKC.GL_COMBINE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_RGB, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND1_RGB, SKC.GL_SRC_COLOR);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_RGB, SKC.GL_TEXTURE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE1_RGB, SKC.GL_PREVIOUS);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_COMBINE_ALPHA, SKC.GL_MODULATE);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_OPERAND0_ALPHA, SKC.GL_SRC_ALPHA);
// SKC.glTexEnvi(SKC.GL_TEXTURE_ENV, SKC.GL_SOURCE0_ALPHA, SKC.GL_TEXTURE);
// GlState.setActiveTexture(SKC.GL_TEXTURE0);
// }
/**
* Sets a simple glTranslate on a LivingEntity.
*/
protected void renderLivingAt(T entityLivingBaseIn, double x, double y, double z)
{
WCF.glTranslatef((float)x, (float)y, (float)z);
}
protected void rotateCorpse(T bat, float p_77043_2_, float p_77043_3_, float partialTicks)
{
WCF.glRotatef(180.0F - p_77043_3_, 0.0F, 1.0F, 0.0F);
if (bat.deathTime > 0)
{
float f = ((float)bat.deathTime + partialTicks - 1.0F) / 20.0F * 1.6F;
f = ExtMath.sqrtf(f);
if (f > 1.0F)
{
f = 1.0F;
}
WCF.glRotatef(f * this.getDeathMaxRotation(bat), 0.0F, 0.0F, 1.0F);
}
else
{
String s = TextColor.stripCodes(bat.getCustomNameTag());
if (s != null && (s.startsWith("Australia") || s.startsWith("Australien"))) // && (!(bat.isPlayer()) || ((EntityNPC)bat).isWearing(ModelPart.CAPE)))
{
WCF.glTranslatef(0.0F, bat.height + 0.1F, 0.0F);
WCF.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
}
}
}
/**
* Returns where in the swing animation the living entity is (from 0 to 1). Args : entity, partialTickTime
*/
protected float getSwingProgress(T livingBase, float partialTickTime)
{
return livingBase.getSwingProgress(partialTickTime);
}
/**
* Defines what float the third param in setRotationAngles of ModelBase is
*/
protected float handleRotationFloat(T livingBase, float partialTicks)
{
return (float)livingBase.ticksExisted + partialTicks;
}
protected void renderLayers(T entity, float swing, float amount, float partial, float time, float dYaw, float dPitch, float scale) {
for(LayerRenderer<T> layer : this.layerRenderers) {
// boolean bright = this.setBrightness(entity, partial, layer.shouldCombineTextures());
layer.doRenderLayer(entity, swing, amount, partial, time, dYaw, dPitch, scale);
// if(bright)
// this.unsetBrightness();
}
}
protected float getDeathMaxRotation(T entityLivingBaseIn)
{
return 90.0F;
}
/**
* Returns an ARGB int color back. Args: entityLiving, lightBrightness, partialTickTime
*/
// protected int getColorMultiplier(T entitylivingbaseIn, float lightBrightness, float partialTickTime)
// {
// return 0;
// }
/**
* Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args:
* entityLiving, partialTickTime
*/
protected void preRenderCallback(T entitylivingbaseIn, float partialTickTime)
{
}
// protected boolean canRenderStats(T entity) {
// return entity.isEntityAlive() && !entity.isInvisible();
// }
public void renderName(T entity, double x, double y, double z)
{
String name = entity.getDisplayName();
if(name != null && !name.isEmpty())
this.renderLivingLabel(entity, name, x, entity.isSneakingVisually() ? y - 0.25 : y, z, 64);
if(entity.isEntityAlive())
this.renderLivingLabel(entity, entity.formatStats(), x, (entity.isSneakingVisually() ? y - 0.25 : y) + 0.3, z, 32);
}
// protected boolean canRenderName(T entity)
// {
// return entity != this.renderManager.livingPlayer && !entity.isInvisible() && entity.passenger == null;
// }
public void setRenderOutlines(boolean renderOutlinesIn)
{
this.renderOutlines = renderOutlinesIn;
}
protected void drawRechargeRay(Entity entity, EntityCrystal crystal, double p_180574_2_, double p_180574_4_, double p_180574_6_, float p_180574_8_)
{
float f = (float)crystal.innerRotation + p_180574_8_;
float f1 = ExtMath.sin(f * 0.2F) / 2.0F + 0.5F;
f1 = (f1 * f1 + f1) * 0.2F;
float f2 = (float)(crystal.posX - entity.posX - (entity.prevX - entity.posX) * (double)(1.0F - p_180574_8_));
float f3 = (float)((double)f1 + crystal.posY - 1.0D - entity.posY - (entity.prevY - entity.posY) * (double)(1.0F - p_180574_8_));
float f4 = (float)(crystal.posZ - entity.posZ - (entity.prevZ - entity.posZ) * (double)(1.0F - p_180574_8_));
float f5 = ExtMath.sqrtf(f2 * f2 + f4 * f4);
float f6 = ExtMath.sqrtf(f2 * f2 + f3 * f3 + f4 * f4);
WCF.glPushMatrix();
WCF.glTranslatef((float)p_180574_2_, (float)p_180574_4_ + 2.0F, (float)p_180574_6_);
WCF.glRotatef((float)(-Math.atan2((double)f4, (double)f2)) * 180.0F / (float)Math.PI - 90.0F, 0.0F, 1.0F, 0.0F);
WCF.glRotatef((float)(-Math.atan2((double)f5, (double)f3)) * 180.0F / (float)Math.PI - 90.0F, 1.0F, 0.0F, 0.0F);
// Tessellator tessellator = Tessellator.getInstance();
RenderBuffer worldrenderer = Tessellator.getBuffer();
ItemRenderer.disableStandardItemLighting();
GlState.disableCull();
this.bindTexture(crystalBeamTextures);
GlState.shadeModel(7425);
float f7 = 0.0F - ((float)entity.ticksExisted + p_180574_8_) * 0.01F;
float f8 = ExtMath.sqrtf(f2 * f2 + f3 * f3 + f4 * f4) / 32.0F - ((float)entity.ticksExisted + p_180574_8_) * 0.01F;
worldrenderer.begin(5, DefaultVertexFormats.POSITION_TEX_COLOR);
int i = 8;
for (int j = 0; j <= 8; ++j)
{
float f9 = ExtMath.sin((float)(j % 8) * (float)Math.PI * 2.0F / 8.0F) * 0.75F;
float f10 = ExtMath.cos((float)(j % 8) * (float)Math.PI * 2.0F / 8.0F) * 0.75F;
float f11 = (float)(j % 8) * 1.0F / 8.0F;
worldrenderer.pos((double)(f9 * 0.2F), (double)(f10 * 0.2F), 0.0D).tex((double)f11, (double)f8).color(0, 0, 0, 255).endVertex();
worldrenderer.pos((double)f9, (double)f10, (double)f6).tex((double)f11, (double)f7).color(255, 255, 255, 255).endVertex();
}
Tessellator.draw();
GlState.enableCull();
GlState.shadeModel(7424);
ItemRenderer.enableStandardItemLighting();
WCF.glPopMatrix();
}
static
{
int[] aint = textureBrightness.getTextureData();
for (int i = 0; i < 256; ++i)
{
aint[i] = -1;
}
textureBrightness.updateDynamicTexture();
}
}