package micdoodle8.mods.galacticraft.core.client.render.entities; import micdoodle8.mods.galacticraft.api.recipe.SchematicRegistry; import micdoodle8.mods.galacticraft.core.entities.EntityHangingSchematic; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.EntityHanging; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderSchematic extends Render<EntityHangingSchematic> { public RenderSchematic(RenderManager manager) { super(manager); } @Override protected ResourceLocation getEntityTexture(EntityHangingSchematic entity) { return SchematicRegistry.getSchematicTexture(entity.schematic); } @Override public void doRender(EntityHangingSchematic entity, double x, double y, double z, float entityYaw, float partialTicks) { GlStateManager.pushMatrix(); GlStateManager.translate(x, y, z); GlStateManager.rotate(180.0F - entityYaw, 0.0F, 1.0F, 0.0F); GlStateManager.enableRescaleNormal(); this.bindEntityTexture(entity); float f = 0.0625F; GlStateManager.scale(f, f, f); this.renderPainting(entity, entity.getWidthPixels(), entity.getHeightPixels()); GlStateManager.disableRescaleNormal(); GlStateManager.popMatrix(); super.doRender(entity, x, y, z, entityYaw, partialTicks); } private void renderPainting(EntityHangingSchematic painting, int width, int height) { float f = (float)(-width) / 2.0F; float f1 = (float)(-height) / 2.0F; float f2 = 0.5F; float f3 = 0.75F; float f4 = 0.8125F; float f5 = 0.0F; float f6 = 0.0625F; float f7 = 0.75F; float f8 = 0.8125F; float f9 = 0.001953125F; float f10 = 0.001953125F; float f11 = 0.7519531F; float f12 = 0.7519531F; float f13 = 0.0F; float f14 = 0.0625F; for (int i = 0; i < width / 16; ++i) { for (int j = 0; j < height / 16; ++j) { double a = f + (float)((i + 1) * 16); double b = f + (float)(i * 16); double c = f1 + (float)((j + 1) * 16); double d = f1 + (float)(j * 16); this.setLightmap(painting, (a + b) / 2.0F, (c + d) / 2.0F); float f19 = (float)(width - i * 16) / 32.0F; float f20 = (float)(width - (i + 1) * 16) / 32.0F; float f21 = (float)(height - j * 16) / 32.0F; float f22 = (float)(height - (j + 1) * 16) / 32.0F; Tessellator tessellator = Tessellator.getInstance(); WorldRenderer worldrenderer = tessellator.getWorldRenderer(); worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_NORMAL); worldrenderer.pos(a, d, (-f2)).tex(f20, f21).normal(0.0F, 0.0F, -1.0F).endVertex(); worldrenderer.pos(b, d, (-f2)).tex(f19, f21).normal(0.0F, 0.0F, -1.0F).endVertex(); worldrenderer.pos(b, c, (-f2)).tex(f19, f22).normal(0.0F, 0.0F, -1.0F).endVertex(); worldrenderer.pos(a, c, (-f2)).tex(f20, f22).normal(0.0F, 0.0F, -1.0F).endVertex(); worldrenderer.pos(a, c, f2).tex(f3, f5).normal(0.0F, 0.0F, 1.0F).endVertex(); worldrenderer.pos(b, c, f2).tex(f4, f5).normal(0.0F, 0.0F, 1.0F).endVertex(); worldrenderer.pos(b, d, f2).tex(f4, f6).normal(0.0F, 0.0F, 1.0F).endVertex(); worldrenderer.pos(a, d, f2).tex(f3, f6).normal(0.0F, 0.0F, 1.0F).endVertex(); worldrenderer.pos(a, c, (-f2)).tex(f7, f9).normal(0.0F, 1.0F, 0.0F).endVertex(); worldrenderer.pos(b, c, (-f2)).tex(f8, f9).normal(0.0F, 1.0F, 0.0F).endVertex(); worldrenderer.pos(b, c, f2).tex(f8, f10).normal(0.0F, 1.0F, 0.0F).endVertex(); worldrenderer.pos(a, c, f2).tex(f7, f10).normal(0.0F, 1.0F, 0.0F).endVertex(); worldrenderer.pos(a, d, f2).tex(f7, f9).normal(0.0F, -1.0F, 0.0F).endVertex(); worldrenderer.pos(b, d, f2).tex(f8, f9).normal(0.0F, -1.0F, 0.0F).endVertex(); worldrenderer.pos(b, d, (-f2)).tex(f8, f10).normal(0.0F, -1.0F, 0.0F).endVertex(); worldrenderer.pos(a, d, (-f2)).tex(f7, f10).normal(0.0F, -1.0F, 0.0F).endVertex(); worldrenderer.pos(a, c, f2).tex(f12, f13).normal(-1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(a, d, f2).tex(f12, f14).normal(-1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(a, d, (-f2)).tex(f11, f14).normal(-1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(a, c, (-f2)).tex(f11, f13).normal(-1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(b, c, (-f2)).tex(f12, f13).normal(1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(b, d, (-f2)).tex(f12, f14).normal(1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(b, d, f2).tex(f11, f14).normal(1.0F, 0.0F, 0.0F).endVertex(); worldrenderer.pos(b, c, f2).tex(f11, f13).normal(1.0F, 0.0F, 0.0F).endVertex(); tessellator.draw(); } } } private void setLightmap(EntityHanging painting, double p_77008_2_, double p_77008_3_) { int i = MathHelper.floor_double(painting.posX); int j = MathHelper.floor_double(painting.posY + (double)(p_77008_3_ / 16.0F)); int k = MathHelper.floor_double(painting.posZ); EnumFacing enumfacing = painting.facingDirection; if (enumfacing == EnumFacing.NORTH) { i = MathHelper.floor_double(painting.posX + (double)(p_77008_2_ / 16.0F)); } if (enumfacing == EnumFacing.WEST) { k = MathHelper.floor_double(painting.posZ - (double)(p_77008_2_ / 16.0F)); } if (enumfacing == EnumFacing.SOUTH) { i = MathHelper.floor_double(painting.posX - (double)(p_77008_2_ / 16.0F)); } if (enumfacing == EnumFacing.EAST) { k = MathHelper.floor_double(painting.posZ + (double)(p_77008_2_ / 16.0F)); } int l = this.renderManager.worldObj.getCombinedLight(new BlockPos(i, j, k), 0); int i1 = l % 65536; int j1 = l / 65536; OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)i1, (float)j1); GlStateManager.color(1.0F, 1.0F, 1.0F); } }