216 lines
8.2 KiB
Java
216 lines
8.2 KiB
Java
package electroblob.wizardry.client.renderer.effect;
|
|
|
|
import electroblob.wizardry.Wizardry;
|
|
import electroblob.wizardry.data.WizardData;
|
|
import electroblob.wizardry.registry.Spells;
|
|
import electroblob.wizardry.spell.Shield;
|
|
import electroblob.wizardry.util.EntityUtils;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.BufferBuilder;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.renderer.OpenGlHelper;
|
|
import net.minecraft.client.renderer.Tessellator;
|
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraftforge.client.event.RenderPlayerEvent;
|
|
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
|
import net.minecraftforge.fml.common.Mod;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
import org.lwjgl.opengl.GL11;
|
|
|
|
@Mod.EventBusSubscriber(Side.CLIENT)
|
|
public class RenderShield {
|
|
|
|
private static final ResourceLocation TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/entity/shield.png");
|
|
|
|
// First person
|
|
@SubscribeEvent
|
|
public static void onRenderWorldLastEvent(RenderWorldLastEvent event){
|
|
// Only render in first person
|
|
if(Minecraft.getMinecraft().gameSettings.thirdPersonView == 0){
|
|
|
|
EntityPlayer player = Minecraft.getMinecraft().player;
|
|
|
|
if(WizardData.get(player).getVariable(Shield.SHIELD_KEY) != null && EntityUtils.isCasting(player, Spells.shield)){
|
|
|
|
GlStateManager.pushMatrix();
|
|
|
|
GlStateManager.disableCull();
|
|
GlStateManager.enableBlend();
|
|
GlStateManager.blendFunc(GL11.GL_ONE, GL11.GL_SRC_ALPHA);
|
|
GlStateManager.shadeModel(GL11.GL_SMOOTH);
|
|
GlStateManager.disableLighting();
|
|
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f);
|
|
|
|
GlStateManager.translate(0, 1.4, 0);
|
|
|
|
GlStateManager.rotate(-player.rotationYaw, 0, 1, 0);
|
|
GlStateManager.rotate(player.rotationPitch, 1, 0, 0);
|
|
|
|
GlStateManager.translate(0, 0, 1);
|
|
|
|
GlStateManager.pushMatrix();
|
|
|
|
// Changes the scale at which the texture is applied to the model. See LayerCreeper for a similar example,
|
|
// but with translation instead of scaling.
|
|
// You can do all sorts of fun stuff with this, just by applying transformations in the 2D texture space.
|
|
GlStateManager.matrixMode(GL11.GL_TEXTURE); // Switch to the 2D texture space
|
|
GlStateManager.loadIdentity();
|
|
|
|
GlStateManager.translate(0.5, 0.5, 0);
|
|
|
|
float s = 1 - ((player.ticksExisted + event.getPartialTicks()) % 5) / 5 * 0.52f;
|
|
s = s*s;
|
|
GlStateManager.scale(s, s, 1);
|
|
|
|
GlStateManager.translate(-0.5, -0.5, 0);
|
|
|
|
GlStateManager.matrixMode(GL11.GL_MODELVIEW); // Switch back to the 3D model space
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
|
|
Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE);
|
|
|
|
render(tessellator);
|
|
|
|
// Undo the texture scaling
|
|
GlStateManager.matrixMode(GL11.GL_TEXTURE);
|
|
GlStateManager.loadIdentity();
|
|
GlStateManager.matrixMode(GL11.GL_MODELVIEW);
|
|
|
|
GlStateManager.popMatrix();
|
|
|
|
GlStateManager.enableLighting();
|
|
|
|
GlStateManager.shadeModel(GL11.GL_FLAT);
|
|
GlStateManager.enableCull();
|
|
GlStateManager.disableBlend();
|
|
// RenderHelper.enableStandardItemLighting();
|
|
|
|
GlStateManager.popMatrix();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Third person
|
|
@SubscribeEvent
|
|
public static void onRenderPlayerEvent(RenderPlayerEvent.Post event){
|
|
|
|
EntityPlayer player = event.getEntityPlayer();
|
|
|
|
if(WizardData.get(player).getVariable(Shield.SHIELD_KEY) != null && EntityUtils.isCasting(player, Spells.shield)){
|
|
|
|
GlStateManager.pushMatrix();
|
|
|
|
GlStateManager.disableCull();
|
|
GlStateManager.enableBlend();
|
|
// For some reason, the old blend function (GL11.GL_SRC_ALPHA, GL11.GL_SRC_ALPHA) caused the inner
|
|
// edges to appear black, so I have changed it to this, which looks very slightly different.
|
|
GlStateManager.blendFunc(GL11.GL_ONE, GL11.GL_SRC_ALPHA);
|
|
GlStateManager.shadeModel(GL11.GL_SMOOTH);
|
|
GlStateManager.disableLighting();
|
|
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f);
|
|
|
|
GlStateManager.translate(event.getX(), event.getY(), event.getZ());
|
|
|
|
GlStateManager.translate(0, 1.3, 0);
|
|
|
|
// GlStateManager.rotate(180, 0, 1, 0);
|
|
GlStateManager.rotate(-player.renderYawOffset, 0, 1, 0);
|
|
// GlStateManager.rotate(-player.rotationPitch, 1, 0, 0);
|
|
|
|
GlStateManager.translate(0, 0, 1);
|
|
|
|
GlStateManager.pushMatrix();
|
|
|
|
// Changes the scale at which the texture is applied to the model. See LayerCreeper for a similar example,
|
|
// but with translation instead of scaling.
|
|
// You can do all sorts of fun stuff with this, just by applying transformations in the 2D texture space.
|
|
GlStateManager.matrixMode(GL11.GL_TEXTURE); // Switch to the 2D texture space
|
|
GlStateManager.loadIdentity();
|
|
|
|
GlStateManager.translate(0.5, 0.5, 0);
|
|
|
|
float s = 1 - ((player.ticksExisted + event.getPartialRenderTick()) % 5) / 5 * 0.52f;
|
|
s = s*s;
|
|
GlStateManager.scale(s, s, 1);
|
|
|
|
GlStateManager.translate(-0.5, -0.5, 0);
|
|
|
|
GlStateManager.matrixMode(GL11.GL_MODELVIEW); // Switch back to the 3D model space
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
|
|
Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE);
|
|
|
|
render(tessellator);
|
|
|
|
// Undo the texture scaling
|
|
GlStateManager.matrixMode(GL11.GL_TEXTURE);
|
|
GlStateManager.loadIdentity();
|
|
GlStateManager.matrixMode(GL11.GL_MODELVIEW);
|
|
|
|
GlStateManager.popMatrix();
|
|
|
|
GlStateManager.enableLighting();
|
|
|
|
GlStateManager.shadeModel(GL11.GL_FLAT);
|
|
GlStateManager.enableCull();
|
|
GlStateManager.disableBlend();
|
|
// RenderHelper.enableStandardItemLighting();
|
|
|
|
GlStateManager.popMatrix();
|
|
}
|
|
}
|
|
|
|
private static void render(Tessellator tessellator){
|
|
|
|
BufferBuilder buffer = tessellator.getBuffer();
|
|
|
|
double widthOuter = 0.6d;
|
|
double heightOuter = 0.7d;
|
|
double widthInner = 0.3d;
|
|
double heightInner = 0.4d;
|
|
double depth = 0.2d;
|
|
|
|
buffer.begin(GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_TEX_COLOR);
|
|
|
|
buffer.pos(-widthOuter, heightInner, -depth).tex(0, 0.2).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(-widthInner, heightInner, 0).tex(0.2, 0.2).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(-widthInner, heightOuter, -depth).tex(0.2, 0).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(-widthInner, heightInner, 0).tex(0.2, 0.2).color(200, 200, 255, 255).endVertex();
|
|
|
|
buffer.pos(widthInner, heightOuter, -depth).tex(0.8, 0).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(widthInner, heightInner, 0).tex(0.8, 0.2).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(widthOuter, heightInner, -depth).tex(1, 0.2).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(widthInner, heightInner, 0).tex(0.8, 0.2).color(200, 200, 255, 255).endVertex();
|
|
|
|
buffer.pos(widthOuter, -heightInner, -depth).tex(1, 0.8).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(widthInner, -heightInner, 0).tex(0.8, 0.8).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(widthInner, -heightOuter, -depth).tex(0.8, 1).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(widthInner, -heightInner, 0).tex(0.8, 0.8).color(200, 200, 255, 255).endVertex();
|
|
|
|
buffer.pos(-widthInner, -heightOuter, -depth).tex(0.2, 1).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(-widthInner, -heightInner, 0).tex(0.2, 0.8).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(-widthOuter, -heightInner, -depth).tex(0, 0.8).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(-widthInner, -heightInner, 0).tex(0.2, 0.8).color(200, 200, 255, 255).endVertex();
|
|
|
|
buffer.pos(-widthOuter, heightInner, -depth).tex(0, 0.2).color(0, 0, 0, 255).endVertex();
|
|
buffer.pos(-widthInner, heightInner, 0).tex(0.2, 0.2).color(200, 200, 255, 255).endVertex();
|
|
|
|
tessellator.draw();
|
|
|
|
buffer.begin(GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_TEX_COLOR);
|
|
|
|
buffer.pos(-widthInner, heightInner, 0).tex(0.2, 0.2).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(widthInner, heightInner, 0).tex(0.8, 0.2).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(-widthInner, -heightInner, 0).tex(0.2, 0.8).color(200, 200, 255, 255).endVertex();
|
|
buffer.pos(widthInner, -heightInner, 0).tex(0.8, 0.8).color(200, 200, 255, 255).endVertex();
|
|
|
|
tessellator.draw();
|
|
}
|
|
|
|
}
|