package net.tropicraft.client.entity.model;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.tropicraft.entity.underdasea.EntityEagleRay;
import org.lwjgl.opengl.GL11;
public class ModelEagleRay extends ModelBase {
/**
* Wing joint amplitudes, linearly interpolated between previous tick and this tick using partialTicks.
*/
private float[] interpolatedWingAmplitudes = new float[EntityEagleRay.WING_JOINTS];
private ModelRenderer body;
public ModelEagleRay() {
textureWidth = 128;
textureHeight = 64;
body = new ModelRenderer(this, 32, 0);
body.addBox(-2F, 0F, 0F, 5, 3, 32);
body.setRotationPoint(0F, 0F, -8F);
body.setTextureSize(128, 64);
body.mirror = true;
}
@Override
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
setRotationAngles(f, f1, f2, f3, f4, f5, entity);
body.render(f5);
renderWings();
renderTailSimple();
}
private void renderTailSimple() {
Tessellator tessellator = Tessellator.instance;
float minU = 0.75f;
float maxU = 1.0f;
float minV = 0.0f;
float maxV = 0.5f;
GL11.glPushMatrix();
GL11.glTranslatef(0.55f, 0f, 1.5f);
GL11.glRotatef(-90f, 0f, 1f, 0f);
GL11.glScalef(1.5f, 1f, 1f);
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, minU, minV);
tessellator.addVertexWithUV(0.0D, 0.0D, 1.0D, minU, maxV);
tessellator.addVertexWithUV(1.0D, 0.0D, 1.0D, maxU, maxV);
tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, maxU, minV);
tessellator.draw();
GL11.glPopMatrix();
}
private void renderWings() {
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glPushMatrix();
GL11.glScalef(2f, 0.5f, 2f);
GL11.glTranslatef(0.1f, 0f, -0.25f);
renderWing(false);
GL11.glRotatef(180f, 0f, 1f, 0f);
GL11.glTranslatef(0.10f, 0f, -1f);
renderWing(true);
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_LIGHTING);
}
private void renderWing(boolean reverse) {
Tessellator tessellator = Tessellator.instance;
float minUFront = 0f;
float maxUFront = 0.25f;
float minVFront = 0f;
float maxVFront = 0.5f;
float minUBack = 0f;
float maxUBack = 0.25f;
float minVBack = 0.5f;
float maxVBack = 1f;
for (int i = 1; i < EntityEagleRay.WING_JOINTS; i++) {
float prevAmplitude = interpolatedWingAmplitudes[i-1];
float amplitude = interpolatedWingAmplitudes[i];
float prevX = (i-1)/(EntityEagleRay.WING_JOINTS-1f);
float x = i/(EntityEagleRay.WING_JOINTS-1f);
float prevUFront = minUFront + (maxUFront-minUFront)*prevX;
float uFront = minUFront + (maxUFront-minUFront)*x;
float prevUBack = minUBack + (maxUBack-minUBack)*prevX;
float uBack = minUBack + (maxUBack-minUBack)*x;
float offset = -0.001f;
// Bottom
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(x, amplitude-offset, 0.0D, uBack, reverse ? maxVBack : minVBack);
tessellator.addVertexWithUV(x, amplitude-offset, 1.0D, uBack, reverse ? minVBack : maxVBack);
tessellator.addVertexWithUV(prevX, prevAmplitude-offset, 1.0D, prevUBack, reverse ? minVBack : maxVBack);
tessellator.addVertexWithUV(prevX, prevAmplitude-offset, 0.0D, prevUBack, reverse ? maxVBack : minVBack);
tessellator.draw();
// Top
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(prevX, prevAmplitude, 0.0D, prevUFront, reverse ? maxVFront : minVFront);
tessellator.addVertexWithUV(prevX, prevAmplitude, 1.0D, prevUFront, reverse ? minVFront : maxVFront);
tessellator.addVertexWithUV(x, amplitude, 1.0D, uFront, reverse ? minVFront : maxVFront);
tessellator.addVertexWithUV(x, amplitude, 0.0D, uFront, reverse ? maxVFront : minVFront);
tessellator.draw();
}
}
private float lerp(float start, float end, float partialTicks) {
return start + (end-start)*partialTicks;
}
@Override
public void setLivingAnimations(EntityLivingBase entityLiving, float par2, float par3, float partialTicks) {
EntityEagleRay ray = (EntityEagleRay) entityLiving;
float[] prevWingAmplitudes = ray.getPrevWingAmplitudes();
float[] wingAmplitudes = ray.getWingAmplitudes();
for (int i = 1; i < EntityEagleRay.WING_JOINTS; i++) {
float prevWingAmplitude = prevWingAmplitudes[i];
float wingAmplitude = wingAmplitudes[i];
interpolatedWingAmplitudes[i] = prevWingAmplitude + partialTicks*(wingAmplitude - prevWingAmplitude);
}
}
private void setRotation(ModelRenderer model, float x, float y, float z) {
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
}