From dacaae3e12f7bed519d00c62131707ac494fdcbf Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 12 Aug 2016 17:10:30 -0400 Subject: [PATCH] Did some testing with rendering a layer on top of existing mobs - not sure if in the end I will want to make individual textures/renderers for each mob to make it more pretty, or if I will just have a singular texture overlay. --- .../util/handler/event/ClientHandler.java | 248 ++++++++++++++++++ .../textures/entities/defaultCrystalLayer.png | Bin 0 -> 5104 bytes 2 files changed, 248 insertions(+) create mode 100644 src/main/resources/assets/bloodmagic/textures/entities/defaultCrystalLayer.png diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index dc62c397..111155c6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -11,21 +11,29 @@ import javax.annotation.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.passive.EntityChicken; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.MouseEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.event.sound.PlaySoundEvent; @@ -96,6 +104,9 @@ public class ClientHandler private static EnumFacing mrsHoloDirection; private static boolean mrsHoloDisplay; + boolean doCrystalRenderTest = false; + public static ResourceLocation crystalResource = new ResourceLocation(Constants.Mod.DOMAIN + "textures/entities/defaultCrystalLayer.png"); + // Contrary to what your IDE tells you, this *is* actually needed. public static final BMKeyBinding keyOpenSigilHolding = new BMKeyBinding("openSigilHolding", Keyboard.KEY_H, BMKeyBinding.Key.OPEN_SIGIL_HOLDING); @@ -121,6 +132,243 @@ public class ClientHandler } } + public static int stateMachine = 0; + + @SubscribeEvent + public void onLivingRenderEvent(RenderLivingEvent.Post event) + { + if (doCrystalRenderTest) + blarg(crystalResource, event.getRenderer(), event.getEntity(), event.getX(), event.getY(), event.getZ(), event.getEntity().rotationYaw, Minecraft.getMinecraft().getRenderPartialTicks()); + } + + //TODO: START + + public void blarg(ResourceLocation resource, RenderLivingBase renderer, EntityLivingBase entity, double x, double y, double z, float entityYaw, float partialTicks) + { +// if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.RenderLivingEvent.Pre(entity, this, x, y, z))) return; + GlStateManager.pushMatrix(); + GlStateManager.disableCull(); + renderer.getMainModel().swingProgress = entity.getSwingProgress(partialTicks); + boolean shouldSit = entity.isRiding() && (entity.getRidingEntity() != null && entity.getRidingEntity().shouldRiderSit()); + renderer.getMainModel().isRiding = shouldSit; + renderer.getMainModel().isChild = entity.isChild(); + + try + { + float f = this.interpolateRotation(entity.prevRenderYawOffset, entity.renderYawOffset, partialTicks); + float f1 = this.interpolateRotation(entity.prevRotationYawHead, entity.rotationYawHead, partialTicks); + float f2 = f1 - f; + + if (shouldSit && entity.getRidingEntity() instanceof EntityLivingBase) + { + EntityLivingBase entitylivingbase = (EntityLivingBase) entity.getRidingEntity(); + f = this.interpolateRotation(entitylivingbase.prevRenderYawOffset, entitylivingbase.renderYawOffset, partialTicks); + f2 = f1 - f; + float f3 = MathHelper.wrapDegrees(f2); + + if (f3 < -85.0F) + { + f3 = -85.0F; + } + + if (f3 >= 85.0F) + { + f3 = 85.0F; + } + + f = f1 - f3; + + if (f3 * f3 > 2500.0F) + { + f += f3 * 0.2F; + } + } + + float f7 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * partialTicks; + this.renderLivingAt(entity, x, y, z); + float f8 = this.handleRotationFloat(entity, partialTicks); + this.rotateCorpse(entity, f8, f, partialTicks); + float f4 = this.prepareScale(entity, partialTicks); + float f5 = 0.0F; + float f6 = 0.0F; + + if (!entity.isRiding()) + { + f5 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * partialTicks; + f6 = entity.limbSwing - entity.limbSwingAmount * (1.0F - partialTicks); + + if (entity.isChild()) + { + f6 *= 3.0F; + } + + if (f5 > 1.0F) + { + f5 = 1.0F; + } + } + + GlStateManager.enableAlpha(); + renderer.getMainModel().setLivingAnimations(entity, f6, f5, partialTicks); + renderer.getMainModel().setRotationAngles(f6, f5, f8, f2, f7, f4, entity); + +// if (this.renderOutlines) +// { +// boolean flag1 = this.setScoreTeamColor(entity); +// GlStateManager.enableColorMaterial(); +// GlStateManager.enableOutlineMode(this.getTeamColor(entity)); +// +// if (!this.renderMarker) +// { +// this.renderModel(resource, renderer, entity, f6, f5, f8, f2, f7, f4); +// } +// +//// if (!(entity instanceof EntityPlayer) || !((EntityPlayer) entity).isSpectator()) +//// { +//// this.renderLayers(entity, f6, f5, partialTicks, f8, f2, f7, f4); +//// } +// +// GlStateManager.disableOutlineMode(); +// GlStateManager.disableColorMaterial(); +// +//// if (flag1) +//// { +//// this.unsetScoreTeamColor(); +//// } +// } else + { +// boolean flag = this.setDoRenderBrightness(entity, partialTicks); + this.renderModel(resource, renderer, entity, f6, f5, f8, f2, f7, f4); + +// if (flag) +// { +// renderer.unsetBrightness(); +// } + + GlStateManager.depthMask(true); + + if (!(entity instanceof EntityPlayer) || !((EntityPlayer) entity).isSpectator()) + { +// this.renderLayers(entity, f6, f5, partialTicks, f8, f2, f7, f4); + } + } + + GlStateManager.disableRescaleNormal(); + } catch (Exception exception) + { +// LOGGER.error((String)"Couldn\'t render entity", (Throwable)exception); + } + + GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GlStateManager.enableTexture2D(); + GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); + GlStateManager.enableCull(); + GlStateManager.popMatrix(); +// super.doRender(entity, x, y, z, entityYaw, partialTicks); +// net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.RenderLivingEvent.Post(entity, this, x, y, z)); + } + + protected void renderModel(ResourceLocation resource, RenderLivingBase renderer, EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) + { + boolean flag = !entitylivingbaseIn.isInvisible();// || this.renderOutlines; + boolean flag1 = !flag && !entitylivingbaseIn.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer); + + if (flag || flag1) + { + renderer.bindTexture(resource); + + if (flag1) + { + GlStateManager.enableBlendProfile(GlStateManager.Profile.TRANSPARENT_MODEL); + } + + renderer.getMainModel().render(entitylivingbaseIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor); + + if (flag1) + { + GlStateManager.disableBlendProfile(GlStateManager.Profile.TRANSPARENT_MODEL); + } + } + } + + protected float interpolateRotation(float prevYawOffset, float yawOffset, float partialTicks) + { + float f; + + for (f = yawOffset - prevYawOffset; f < -180.0F; f += 360.0F) + { + ; + } + + while (f >= 180.0F) + { + f -= 360.0F; + } + + return prevYawOffset + partialTicks * f; + } + + protected void renderLivingAt(EntityLivingBase entityLivingBaseIn, double x, double y, double z) + { + GlStateManager.translate((float) x, (float) y, (float) z); + } + + protected void rotateCorpse(EntityLivingBase entityLiving, float p_77043_2_, float p_77043_3_, float partialTicks) + { + GlStateManager.rotate(180.0F - p_77043_3_, 0.0F, 1.0F, 0.0F); + + if (entityLiving.deathTime > 0) + { + float f = ((float) entityLiving.deathTime + partialTicks - 1.0F) / 20.0F * 1.6F; + f = MathHelper.sqrt_float(f); + + if (f > 1.0F) + { + f = 1.0F; + } + + GlStateManager.rotate(f * this.getDeathMaxRotation(entityLiving), 0.0F, 0.0F, 1.0F); + } else + { + String s = TextFormatting.getTextWithoutFormattingCodes(entityLiving.getName()); + + if (s != null && (s.equals("Dinnerbone") || s.equals("Grumm")) && (!(entityLiving instanceof EntityPlayer) || ((EntityPlayer) entityLiving).isWearing(EnumPlayerModelParts.CAPE))) + { + GlStateManager.translate(0.0F, entityLiving.height + 0.1F, 0.0F); + GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F); + } + } + } + + protected float getDeathMaxRotation(EntityLivingBase entity) + { + return 90.0F; + } + + public float prepareScale(EntityLivingBase entitylivingbaseIn, float partialTicks) + { + GlStateManager.enableRescaleNormal(); + GlStateManager.scale(-1.0F, -1.0F, 1.0F); +// this.preRenderCallback(entitylivingbaseIn, partialTicks); + float f = 0.0625F; + GlStateManager.translate(0.0F, -1.501F, 0.0F); + return f; + } + + protected float handleRotationFloat(EntityLivingBase livingBase, float partialTicks) + { + if (livingBase instanceof EntityChicken) + { + EntityChicken chickenEntity = (EntityChicken) livingBase; + float f = chickenEntity.oFlap + (chickenEntity.wingRotation - chickenEntity.oFlap) * partialTicks; + float f1 = chickenEntity.oFlapSpeed + (chickenEntity.destPos - chickenEntity.oFlapSpeed) * partialTicks; + return (MathHelper.sin(f) + 1.0F) * f1; + } + return (float) livingBase.ticksExisted + partialTicks; + } + + //TODO: END + @SubscribeEvent public void onSoundEvent(PlaySoundEvent event) { diff --git a/src/main/resources/assets/bloodmagic/textures/entities/defaultCrystalLayer.png b/src/main/resources/assets/bloodmagic/textures/entities/defaultCrystalLayer.png new file mode 100644 index 0000000000000000000000000000000000000000..594387e144456aa7aaa3a48de84a9763531e499c GIT binary patch literal 5104 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