/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Matter Overdrive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.gui.android;
import matteroverdrive.Reference;
import matteroverdrive.client.data.Color;
import matteroverdrive.data.MinimapEntityInfo;
import matteroverdrive.entity.player.AndroidPlayer;
import matteroverdrive.init.MatterOverdriveBioticStats;
import matteroverdrive.util.RenderUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.IMerchant;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.Vec3;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.Cylinder;
import org.lwjgl.util.glu.Sphere;
import static org.lwjgl.opengl.GL11.*;
/**
* Created by Simeon on 9/8/2015.
*/
public class AndroidHudMinimap extends AndroidHudElement
{
private Sphere sphere;
private Cylinder cylinder;
private final float OPACITY = 0.6f;
private final int ROTATION = 55;
private float ZOOM = 1;
private int RADIUS = 64;
public AndroidHudMinimap(AndroidHudPosition position,String name) {
super(position,name, 188, 188);
sphere = new Sphere();
cylinder = new Cylinder();
}
@Override
public boolean isVisible(AndroidPlayer android)
{
return android.isUnlocked(MatterOverdriveBioticStats.minimap,0);
}
@Override
public void drawElement(AndroidPlayer androidPlayer,int mouseX, int mouseY, ScaledResolution resolution, float ticks)
{
int x = getWidth(resolution,androidPlayer)/2;
int y = getHeight(resolution,androidPlayer)/2;
float scale = getScale(resolution);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glPushMatrix();
glTranslated(x, y, -100);
glRotated(ROTATION, 1, 0, 0);
glScaled(scale, scale, scale);
drawBackground(resolution);
beginMask();
glPopMatrix();
for (Object entityObj : mc.theWorld.loadedEntityList)
{
if (entityObj instanceof EntityLivingBase) {
EntityLivingBase entityLivingBase = (EntityLivingBase) entityObj;
Vec3 pos = (entityLivingBase).getPosition(ticks);
Vec3 playerPosition = mc.thePlayer.getPosition(ticks);
pos = pos.subtract(playerPosition);
pos.xCoord *= ZOOM;
pos.yCoord *= ZOOM;
pos.zCoord *= ZOOM;
if (AndroidPlayer.isVisibleOnMinimap((EntityLivingBase) entityObj, mc.thePlayer, pos)) {
if (pos.lengthVector() < Math.min(256, (RADIUS+16 / ZOOM))) {
//region Push
glPushMatrix();
glTranslated(0,0,-130);
drawEntity(entityLivingBase,scale,x,y,pos);
glPopMatrix();
//endregion
}
}
}
}
endMask();
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
}
private void beginMask()
{
glPushMatrix();
glClear(GL_DEPTH_BUFFER_BIT);
glClearDepth(1f);
GL11.glDepthFunc(GL11.GL_LESS);
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
glColorMask(false,false,false,false);
glDisable(GL_TEXTURE_2D);
glTranslated(0,0,1);
RenderUtils.drawCircle(RADIUS, 32);
glEnable(GL_TEXTURE_2D);
glDepthMask(false);
glColorMask(true,true,true,true);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_GREATER);
glPopMatrix();
}
private void endMask()
{
glDepthFunc(GL_LEQUAL);
glDepthMask(true);
GL11.glDisable(GL11.GL_DEPTH_TEST);
}
private void drawBackground(ScaledResolution resolution)
{
drawCompas();
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glLineWidth(1);
RenderUtils.applyColorWithAlpha(baseColor, 0.5f * OPACITY);
RenderUtils.drawCircle(RADIUS, 32);
drawFov(resolution);
double radarPercent = (mc.theWorld.getWorldTime() % AndroidPlayer.MINIMAP_SEND_TIMEOUT) / (double)AndroidPlayer.MINIMAP_SEND_TIMEOUT;
RenderUtils.applyColorWithAlpha(baseColor, 0.8f * OPACITY * (float) radarPercent);
RenderUtils.drawCircle(radarPercent * RADIUS, 32);
RenderUtils.applyColorWithAlpha(baseColor, 0.5f * OPACITY);
glCullFace(GL_FRONT);
cylinder.draw(RADIUS, RADIUS, 5, 64, 1);
glCullFace(GL_BACK);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glPushMatrix();
drawPlayer();
glPopMatrix();
}
private void drawCompas()
{
int rad = 74;
mc.fontRenderer.drawString("S", (int) (Math.sin(Math.toRadians(180 - mc.renderViewEntity.rotationYaw)) * rad), (int) (Math.cos(Math.toRadians(180 - mc.renderViewEntity.rotationYaw)) * rad), Reference.COLOR_MATTER.getColor());
mc.fontRenderer.drawString("N", (int) (Math.sin(Math.toRadians(-mc.renderViewEntity.rotationYaw)) * rad), (int) (Math.cos(Math.toRadians(-mc.renderViewEntity.rotationYaw)) * 64), Reference.COLOR_MATTER.getColor());
mc.fontRenderer.drawString("E", (int) (Math.sin(Math.toRadians(90 - mc.renderViewEntity.rotationYaw)) * rad), (int) (Math.cos(Math.toRadians(90 - mc.renderViewEntity.rotationYaw)) * rad), Reference.COLOR_MATTER.getColor());
mc.fontRenderer.drawString("W", (int) (Math.sin(Math.toRadians(-mc.renderViewEntity.rotationYaw - 90)) * rad), (int) (Math.cos(Math.toRadians(-mc.renderViewEntity.rotationYaw - 90)) * rad), Reference.COLOR_MATTER.getColor());
}
private void drawPlayer()
{
RenderUtils.applyColor(Reference.COLOR_HOLO_GREEN);
glRotated(90, 0, 0, 1);
glRotated(90, 1, 0, 0);
glTranslated(0, 0, 0);
RenderUtils.drawShip(0, 0, 0, 3);
}
private void drawFov(ScaledResolution resolution)
{
double aspectRatio = resolution.getScaledWidth_double() / resolution.getScaledHeight_double();
float angleAdd = (float)180;
float fovAngle = mc.gameSettings.fovSetting*0.5f*(float)aspectRatio;
glBegin(GL_LINE_STRIP);
glVertex3d(0, 0, 0);
glVertex3d(Math.sin(Math.toRadians(fovAngle + angleAdd)) * RADIUS, Math.cos(Math.toRadians(fovAngle + angleAdd)) * RADIUS, 0);
glVertex3d(0, 0, 0);
glVertex3d(Math.sin(Math.toRadians(-fovAngle + angleAdd)) * RADIUS, Math.cos(Math.toRadians(-fovAngle + angleAdd)) * RADIUS, 0);
glEnd();
}
private void drawEntity(EntityLivingBase entityLivingBase,float scale,int x,int y,Vec3 pos)
{
glTranslated(x, y, 0);
glRotated(ROTATION, 1, 0, 0);
glScaled(scale, scale, scale);
if (!entityLivingBase.equals(mc.thePlayer))
{
int size = getMinimapSize(entityLivingBase);
Color color = getMinimapColor(entityLivingBase);
float opacity = mc.thePlayer.canEntityBeSeen(entityLivingBase) ? 1 : 0.7f;
opacity *= baseColor.getFloatA();
glEnable(GL_TEXTURE_2D);
RenderUtils.applyColorWithAlpha(color, OPACITY * opacity);
glRotated(mc.renderViewEntity.rotationYaw, 0, 0, -1);
glTranslated(pos.xCoord, pos.zCoord, 0);
glRotated(entityLivingBase.getRotationYawHead(), 0, 0, 1);
glDisable(GL_TEXTURE_2D);
//region Depth Meter
glPushMatrix();
RenderUtils.applyColorWithAlpha(color, OPACITY * opacity);
RenderUtils.drawCircle(2, 18);
if (Math.abs(pos.yCoord) > 4) {
glBegin(GL_LINES);
glVertex3d(0, 0, 0);
glVertex3d(0, 0, pos.yCoord);
glEnd();
glTranslated(0, 0, pos.yCoord);
sphere.draw(2 * opacity, 6, 6);
}
glPopMatrix();
//endregion
RenderUtils.applyColorWithAlpha(color, 0.2f * OPACITY * opacity);
RenderUtils.drawCircle(size, 18);
}
}
private int getMinimapSize(EntityLivingBase entityLivingBase)
{
if (entityLivingBase instanceof IMob && entityLivingBase instanceof EntityCreature) {
return 17;
}else
{
return 4;
}
}
private Color getMinimapColor(EntityLivingBase entityLivingBase)
{
if (entityLivingBase instanceof IMob && !entityLivingBase.isOnSameTeam(Minecraft.getMinecraft().thePlayer))
{
MinimapEntityInfo entityInfo = AndroidPlayer.getMinimapEntityInfo(entityLivingBase);
if (entityInfo != null && entityInfo.isAttacking())
{
return Reference.COLOR_GUI_ENERGY;
}else
{
return Reference.COLOR_HOLO_RED;
}
}
else if (entityLivingBase instanceof EntityPlayer)
{
return Reference.COLOR_HOLO_YELLOW;
}
else if (entityLivingBase instanceof IMerchant || entityLivingBase.isOnSameTeam(Minecraft.getMinecraft().thePlayer))
{
return Reference.COLOR_HOLO_GREEN;
}
else
{
return Reference.COLOR_HOLO;
}
}
private float getScale(ScaledResolution resolution)
{
return 1.5f - 0.2f * resolution.getScaleFactor();
}
@Override
public int getWidth(ScaledResolution resolution,AndroidPlayer androidPlayer) {
return (int)(width * getScale(resolution));
}
@Override
public int getHeight(ScaledResolution resolution,AndroidPlayer androidPlayer)
{
return (int)(height * getScale(resolution));
}
}