/* * 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.client.render.biostat; import matteroverdrive.Reference; import matteroverdrive.api.renderer.IBioticStatRenderer; import matteroverdrive.data.biostats.BioticStatShield; import matteroverdrive.entity.player.AndroidPlayer; import matteroverdrive.init.MatterOverdriveBioticStats; import matteroverdrive.util.RenderUtils; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.util.vector.Vector3f; import static org.lwjgl.opengl.GL11.*; /** * Created by Simeon on 6/7/2015. */ public class BioticStatRendererShield implements IBioticStatRenderer<BioticStatShield> { public static final ResourceLocation forcefield_damage_tex = new ResourceLocation(Reference.PATH_FX + "shield_damage.png"); public static final ResourceLocation forcefield_tex = new ResourceLocation(Reference.PATH_FX + "forcefield_plasma.png"); public static final ResourceLocation forcefield_plasma_tex = new ResourceLocation(Reference.PATH_FX + "forcefield_plasma_2.png"); public static final ResourceLocation shield_texture = new ResourceLocation(Reference.PATH_FX + "shield.png"); public static final ResourceLocation model_path = new ResourceLocation(Reference.PATH_MODEL + "shield_sphere.obj"); IModelCustom normal_sphere; IModelCustom shield_model; float opacityLerp; public BioticStatRendererShield() { shield_model = AdvancedModelLoader.loadModel(model_path); normal_sphere = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.MODEL_SPHERE)); opacityLerp = 0; } @Override public void onWorldRender(BioticStatShield stat,int level,RenderWorldLastEvent event) { for (Object entity : Minecraft.getMinecraft().theWorld.playerEntities) { renderPlayerShield(event, (EntityPlayer)entity); } } private void renderPlayerShield(RenderWorldLastEvent event, EntityPlayer player) { AndroidPlayer androidPlayer = AndroidPlayer.get(player); boolean isVisible = manageOpacityLerp(androidPlayer,event.partialTicks); if (isVisible) { double time = Minecraft.getMinecraft().theWorld.getWorldTime(); glPushMatrix(); glDepthMask(false); glEnable(GL_BLEND); glDisable(GL_ALPHA_TEST); glDisable(GL_CULL_FACE); glBlendFunc(GL_ONE, GL_ONE); Vec3 playerPosition = player.getPosition(event.partialTicks); Vec3 clientPosition = Minecraft.getMinecraft().thePlayer.getPosition(event.partialTicks); RenderUtils.applyColorWithMultipy(Reference.COLOR_HOLO, 0.2f * getOpacityLerp(player)); Minecraft.getMinecraft().renderEngine.bindTexture(shield_texture); if (!isClient(player)) { glTranslated(0, player.height - 0.5, 0); glEnable(GL_CULL_FACE); }else { if (Minecraft.getMinecraft().gameSettings.thirdPersonView > 0) { glEnable(GL_CULL_FACE); } } glTranslated(playerPosition.xCoord - clientPosition.xCoord, playerPosition.yCoord - clientPosition.yCoord, playerPosition.zCoord - clientPosition.zCoord); glTranslated(0, -0.5, 0); glScaled(3, 3, 3); glRotated(player.motionZ * 45, -1, 0, 0); glRotated(player.motionX * 45, 0, 0, 1); shield_model.renderAll(); glDisable(GL_CULL_FACE); renderAttacks(androidPlayer); RenderUtils.applyColorWithMultipy(Reference.COLOR_HOLO, 0.1f * getOpacityLerp(player)); Minecraft.getMinecraft().renderEngine.bindTexture(forcefield_tex); glScaled(1.02, 1.02, 1.02); normal_sphere.renderAll(); RenderUtils.applyColorWithMultipy(Reference.COLOR_HOLO, 0.05f * getOpacityLerp(player)); glPushMatrix(); glRotated(time * 0.005, Math.sin(time * 0.01), Math.cos(time * 0.01), 0); Minecraft.getMinecraft().renderEngine.bindTexture(forcefield_plasma_tex); glScaled(1.01, 1.01, 1.01); normal_sphere.renderAll(); glPopMatrix(); glDisable(GL_BLEND); glEnable(GL_CULL_FACE); glEnable(GL_ALPHA_TEST); glDepthMask(true); glPopMatrix(); } } private boolean manageOpacityLerp(AndroidPlayer androidPlayer, float partialTicks) { if (MatterOverdriveBioticStats.shield.getShieldState(androidPlayer)) { if (isClient(androidPlayer.getPlayer())) { if (opacityLerp < 1) { opacityLerp = Math.min(1, opacityLerp + partialTicks * 0.1f); } } return true; } else { if (isClient(androidPlayer.getPlayer()) && opacityLerp > 0) { opacityLerp = Math.max(0,opacityLerp - partialTicks * 0.2f); return true; } else { return false; } } } private boolean isClient(EntityPlayer player) { return player == Minecraft.getMinecraft().thePlayer; } private float getOpacityLerp(EntityPlayer player) { if (Minecraft.getMinecraft().thePlayer == player) { return opacityLerp; } return 1; } private void renderAttacks(AndroidPlayer androidPlayer) { float opacity = getOpacityLerp(androidPlayer.getPlayer()); if (androidPlayer.getEffects().hasKey(BioticStatShield.TAG_HITS)) { NBTTagList hits = androidPlayer.getEffects().getTagList(BioticStatShield.TAG_HITS, 10); for (int i = 0; i < hits.tagCount(); i++) { renderAttack(new Vector3f(hits.getCompoundTagAt(i).getFloat("x"), -hits.getCompoundTagAt(i).getFloat("y"), -hits.getCompoundTagAt(i).getFloat("z")).normalise(null), (hits.getCompoundTagAt(i).getInteger("time") / 10f) * opacity); } } } private void renderAttack(Vector3f dir,float percent) { glPushMatrix(); Vector3f front = new Vector3f(1, 0, 0); Vector3f c = Vector3f.cross(dir, front, null); double omega = Math.acos(Vector3f.dot(dir, front)); glRotated(omega * (180 / Math.PI), c.x, c.y, c.z); RenderUtils.applyColorWithMultipy(Reference.COLOR_HOLO, 1 * percent); Minecraft.getMinecraft().renderEngine.bindTexture(forcefield_damage_tex); normal_sphere.renderAll(); glPopMatrix(); } }