Java tutorial
/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.vanilla.electromaster.client.effect; import cn.academy.core.Resources; import cn.lambdalib.util.client.RenderUtils; import cn.lambdalib.util.client.renderhook.PlayerRenderHook; import cn.lambdalib.util.client.shader.GLSLMesh; import cn.lambdalib.util.client.shader.ShaderSimple; import cn.lambdalib.util.deprecated.MeshUtils; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; import static org.lwjgl.opengl.GL11.*; /** * @author WeAthFolD */ public class RailgunHandEffect extends PlayerRenderHook { static final int PER_FRAME = 40, COUNT = 40; ResourceLocation[] textures; GLSLMesh mesh; public RailgunHandEffect() { textures = Resources.getEffectSeq("arc_burst", COUNT); mesh = new GLSLMesh(); mesh = MeshUtils.createBillboard(mesh, -1, -1, 1, 1); } @Override public void renderHand(boolean firstPerson) { if (RenderUtils.isInShadowPass()) return; long dt = getDeltaTime(); if (dt >= PER_FRAME * COUNT) { dispose(); return; } int frame = (int) (dt / PER_FRAME); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glDisable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); ShaderSimple.instance().useProgram(); glPushMatrix(); if (firstPerson) { glTranslated(.26, -.12, -.24); glScalef(.4f, .4f, 1f); } else { EntityPlayer player = Minecraft.getMinecraft().thePlayer; glTranslated(0, 0.2, -1); glRotated(-player.rotationPitch, 1, 0, 0); } RenderUtils.loadTexture(textures[frame]); mesh.draw(ShaderSimple.instance()); glPopMatrix(); GL20.glUseProgram(0); glAlphaFunc(GL_GEQUAL, 0.1f); glEnable(GL_CULL_FACE); } }