package openblocks.client.renderer.entity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import openblocks.common.entity.EntityHangGlider; import openmods.renderer.DisplayListWrapper; import org.lwjgl.opengl.GL11; public class EntityHangGliderRenderer extends Render { private static final float QUAD_HALF_SIZE = 2.4f; private static final float ONGROUND_ROTATION = 90f; private final DisplayListWrapper gliderRender = new DisplayListWrapper() { @Override public void compile() { GL11.glDisable(GL11.GL_CULL_FACE); GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); GL11.glBegin(GL11.GL_QUADS); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(QUAD_HALF_SIZE, 0, QUAD_HALF_SIZE); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-QUAD_HALF_SIZE, 0, QUAD_HALF_SIZE); GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-QUAD_HALF_SIZE, 0, -QUAD_HALF_SIZE); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(QUAD_HALF_SIZE, 0, -QUAD_HALF_SIZE); GL11.glEnd(); GL11.glEnable(GL11.GL_CULL_FACE); } }; private final ResourceLocation texture = new ResourceLocation("openblocks", "textures/models/hangglider.png"); @Override public void doRender(Entity entity, double x, double y, double z, float f, float f1) { final EntityHangGlider glider = (EntityHangGlider)entity; final EntityPlayer owner = glider.getPlayer(); if (owner == null) return; final Minecraft minecraft = Minecraft.getMinecraft(); final boolean isLocalPlayer = owner == minecraft.thePlayer; final boolean isFpp = minecraft.gameSettings.thirdPersonView == 0; final boolean isDeployed = glider.isDeployed(); if (isLocalPlayer && isFpp && !isDeployed) return; final float rotation = interpolateRotation(glider.prevRotationYaw, glider.rotationYaw, f1); GL11.glPushMatrix(); GL11.glTranslated(x, y, z); GL11.glRotatef(180.0F - rotation, 0.0F, 1.0F, 0.0F); if (isLocalPlayer) { if (!isDeployed) { // move up and closer to back GL11.glTranslated(0, -0.2, +0.3); } else { if (isFpp) { // move over head when flying in FPP GL11.glTranslated(0, +0.2, 0); } else { // move closer to back and forward when flying in TDD GL11.glTranslated(0, -0.8, -1.0); } } } else { if (!isDeployed) { // move up little bit (other player center is lower) GL11.glTranslated(0, +0.2, +0.3); } else { // move closer to back and forward when flying GL11.glTranslated(0, -0.5, -1.0); } } if (!isDeployed) { GL11.glRotatef(ONGROUND_ROTATION, 1, 0, 0); GL11.glScalef(0.4f, 1f, 0.4f); } bindTexture(texture); gliderRender.render(); GL11.glPopMatrix(); } /* Interpolate rotation */ private static float interpolateRotation(float prevRotation, float nextRotation, float modifier) { float rotation = nextRotation - prevRotation; while (rotation < -180.0F) rotation += 360.0F; while (rotation >= 180.0F) { rotation -= 360.0F; } return prevRotation + modifier * rotation; } @Override protected ResourceLocation getEntityTexture(Entity entity) { return texture; } }