diff options
Diffstat (limited to 'src/main/java/gregtech')
11 files changed, 650 insertions, 32 deletions
diff --git a/src/main/java/gregtech/api/enums/Materials.java b/src/main/java/gregtech/api/enums/Materials.java index 17357b0825..e0264866ea 100644 --- a/src/main/java/gregtech/api/enums/Materials.java +++ b/src/main/java/gregtech/api/enums/Materials.java @@ -16,9 +16,8 @@ import gregtech.api.objects.GT_FluidStack; import gregtech.api.objects.MaterialStack; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; -import gregtech.common.render.items.GT_GeneratedMaterial_Renderer; -import gregtech.common.render.items.GaiaSpiritRenderer; -import gregtech.common.render.items.TranscendentMetalRenderer; +import gregtech.common.render.items.*; +import gregtech.common.render.items.UniversiumRenderer; import gregtech.loaders.materialprocessing.ProcessingConfig; import gregtech.loaders.materialprocessing.ProcessingModSupport; import java.util.*; @@ -910,6 +909,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { public static Materials Time = new Materials(587, TextureSet.SET_FLUID, 1.0F, 0, 2, 16|32, 100, 1, 255, 255, "Time", "Molten Time", -1, -1, 0, 0, false, false, 200, 1, 1, Dyes.dyePurple); public static Materials Space = new Materials(106, TextureSet.SET_FLUID, 1.0F, 0, 2, 16|32, 100, 1, 255, 255, "Space", "Molten Space", -1, -1, 0, 0, false, false, 200, 1, 1, Dyes.dyePurple); + public static Materials Universium = new Materials(139, new TextureSet("universium", true), 1.0F,4*2621440, 25, 1|2|64|128, 38, 49, 69, 255, "Universium" , "Universium", -1, -1, 0, 0, false, true, 2, 1, 1, Dyes._NULL , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setProcessingMaterialTierEU(Tier.UMV); // spotless:on @@ -1997,6 +1997,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { Quartzite.mChemicalFormula = "SiO\u2082"; CertusQuartz.mChemicalFormula = "SiO\u2082"; SpaceTime.mChemicalFormula = "Reality itself distilled into physical form"; + Universium.mChemicalFormula = "A tear into the space beyond space"; Longasssuperconductornameforuvwire.mChemicalFormula = "Nq*\u2084(Ir\u2083Os)\u2083EuSm"; Longasssuperconductornameforuhvwire.mChemicalFormula = "D\u2086(SpNt)\u2087Tn\u2085Am\u2086"; SuperconductorUEVBase.mChemicalFormula = "D*\u2085If*\u2085(✦◆✦)(⚷⚙⚷ Ni4Ti6)"; @@ -2532,6 +2533,9 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { public static void initClient() { TranscendentMetal.renderer = new TranscendentMetalRenderer(); MaterialsBotania.GaiaSpirit.renderer = new GaiaSpiritRenderer(); + Infinity.renderer = new InfinityRenderer(); + CosmicNeutronium.renderer = new CosmicNeutroniumRenderer(); + Universium.renderer = new UniversiumRenderer(); } private static void fillGeneratedMaterialsMap() { diff --git a/src/main/java/gregtech/api/enums/OrePrefixes.java b/src/main/java/gregtech/api/enums/OrePrefixes.java index ffe60675d6..cd78d3a560 100644 --- a/src/main/java/gregtech/api/enums/OrePrefixes.java +++ b/src/main/java/gregtech/api/enums/OrePrefixes.java @@ -3262,6 +3262,9 @@ public enum OrePrefixes { ingot.mNotGeneratedItems.add(Materials.WoodSealed); ingot.mNotGeneratedItems.add(Materials.Wood); + frame.mNotGeneratedItems.add(Materials.Universium); + frameGt.mNotGeneratedItems.add(Materials.Universium); + plateDouble.mNotGeneratedItems.add(Materials.MagnetohydrodynamicallyConstrainedStarMatter); plateTriple.mNotGeneratedItems.add(Materials.MagnetohydrodynamicallyConstrainedStarMatter); plateQuadruple.mNotGeneratedItems.add(Materials.MagnetohydrodynamicallyConstrainedStarMatter); @@ -3353,6 +3356,7 @@ public enum OrePrefixes { nanite.mGeneratedItems.add(Materials.Silver); nanite.mGeneratedItems.add(Materials.TranscendentMetal); nanite.mGeneratedItems.add(Materials.Neutronium); + nanite.mGeneratedItems.add(Materials.Universium); nanite.mGeneratedItems.add(Materials.WhiteDwarfMatter); nanite.mGeneratedItems.add(Materials.BlackDwarfMatter); nanite.mGeneratedItems.add(Materials.Glowstone); diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java index 569e535e8c..13a2ac8490 100644 --- a/src/main/java/gregtech/api/enums/Textures.java +++ b/src/main/java/gregtech/api/enums/Textures.java @@ -2269,7 +2269,9 @@ public class Textures { POCKET_MULTITOOL_KNIFE, POCKET_MULTITOOL_SAW, POCKET_MULTITOOL_SCREWDRIVER, - POCKET_MULTITOOL_WIRECUTTER; + POCKET_MULTITOOL_WIRECUTTER, + HALO, + HALO_FUZZY; public static final IIconContainer[] DURABILITY_BAR = { diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index 51efb8a9a7..f1cdde1d48 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -9,6 +9,7 @@ import static gregtech.api.enums.GT_Values.M; import static gregtech.api.enums.GT_Values.NW; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.enums.GT_Values.W; +import static gregtech.api.enums.Materials.FLUID_MAP; import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation; import cofh.api.transport.IItemDuct; @@ -1954,6 +1955,10 @@ public class GT_Utility { tNBT.setLong("mFluidDisplayHeat", aFluid.getFluid().getTemperature(aFluid)); tNBT.setBoolean("mFluidState", aFluid.getFluid().isGaseous(aFluid)); tNBT.setBoolean("mHideStackSize", aHideStackSize); + try { + tNBT.setString("mFluidMaterialName", FLUID_MAP.get(aFluid.getFluid()).mName); + } catch (Exception ignored) { + } rStack.setTagCompound(tNBT); return rStack; } diff --git a/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java b/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java index 221c6cd8aa..caec5e1581 100644 --- a/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java +++ b/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java @@ -1,7 +1,10 @@ package gregtech.common.render; +import appeng.util.ReadableNumberConverter; +import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; import gregtech.common.items.GT_FluidDisplayItem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -13,7 +16,7 @@ import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.client.MinecraftForgeClient; import org.lwjgl.opengl.GL11; -@SideOnly(cpw.mods.fml.relauncher.Side.CLIENT) +@SideOnly(Side.CLIENT) public class GT_FluidDisplayStackRenderer implements IItemRenderer { public GT_FluidDisplayStackRenderer() { @@ -40,20 +43,23 @@ public class GT_FluidDisplayStackRenderer implements IItemRenderer { GL11.glEnable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_ALPHA_TEST); - IIcon icon = item.getItem().getIconFromDamage(item.getItemDamage()); - - Tessellator tess = Tessellator.instance; - tess.startDrawingQuads(); - // draw a simple rectangle for the inventory icon - final float x_min = icon.getMinU(); - final float x_max = icon.getMaxU(); - final float y_min = icon.getMinV(); - final float y_max = icon.getMaxV(); - tess.addVertexWithUV(0, 16, 0, x_min, y_max); - tess.addVertexWithUV(16, 16, 0, x_max, y_max); - tess.addVertexWithUV(16, 0, 0, x_max, y_min); - tess.addVertexWithUV(0, 0, 0, x_min, y_min); - tess.draw(); + Materials associatedFluidMaterial = Materials.get(item.stackTagCompound.getString("mFluidMaterialName")); + if (associatedFluidMaterial.renderer == null + || !associatedFluidMaterial.renderer.renderFluidDisplayItem(type, item, data)) { + IIcon icon = item.getItem().getIconFromDamage(item.getItemDamage()); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + // draw a simple rectangle for the inventory icon + final float x_min = icon.getMinU(); + final float x_max = icon.getMaxU(); + final float y_min = icon.getMinV(); + final float y_max = icon.getMaxV(); + tess.addVertexWithUV(0, 16, 0, x_min, y_max); + tess.addVertexWithUV(16, 16, 0, x_max, y_max); + tess.addVertexWithUV(16, 0, 0, x_max, y_min); + tess.addVertexWithUV(0, 0, 0, x_min, y_min); + tess.draw(); + } if (item.getTagCompound() == null) { GL11.glDisable(GL11.GL_BLEND); @@ -66,29 +72,21 @@ public class GT_FluidDisplayStackRenderer implements IItemRenderer { if (fluidAmount > 0L && !item.getTagCompound().getBoolean("mHideStackSize")) { String amountString; - if (fluidAmount < 10000) { + if (fluidAmount < 10_000) { amountString = "" + fluidAmount + "L"; } else { - int exp = (int) (Math.log(fluidAmount) / Math.log(1000)); - double shortAmount = fluidAmount / Math.pow(1000, exp); - if (shortAmount >= 100) { - amountString = String.format( - "%.0f%cL", shortAmount, "kMGTPE".charAt(exp - 1)); // heard it here first, PetaLiters - } else if (shortAmount >= 10) { - amountString = String.format("%.1f%cL", shortAmount, "kMGTPE".charAt(exp - 1)); - } else { - amountString = String.format("%.2f%cL", shortAmount, "kMGTPE".charAt(exp - 1)); - } + amountString = ReadableNumberConverter.INSTANCE.toWideReadableForm(fluidAmount); } FontRenderer fontRender = Minecraft.getMinecraft().fontRenderer; float smallTextScale = fontRender.getUnicodeFlag() ? 3F / 4F : 1F / 2F; GL11.glDisable(GL11.GL_BLEND); + GL11.glPushMatrix(); GL11.glScalef(smallTextScale, smallTextScale, 1.0f); fontRender.drawString( amountString, 0, (int) (16 / smallTextScale) - fontRender.FONT_HEIGHT + 1, 0xFFFFFF, true); - GL11.glScalef(1f, 1f, 1f); + GL11.glPopMatrix(); GL11.glDisable(GL11.GL_ALPHA_TEST); } } diff --git a/src/main/java/gregtech/common/render/GT_RenderUtil.java b/src/main/java/gregtech/common/render/GT_RenderUtil.java index df490f4806..29ba761c63 100644 --- a/src/main/java/gregtech/common/render/GT_RenderUtil.java +++ b/src/main/java/gregtech/common/render/GT_RenderUtil.java @@ -1,13 +1,27 @@ package gregtech.common.render; + +import gregtech.api.items.GT_MetaGenerated_Item; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import org.lwjgl.opengl.GL11; public class GT_RenderUtil { - public static void renderBlockIcon( + + public static void colorGTItem(ItemStack aStack) { + if (aStack.getItem() instanceof GT_MetaGenerated_Item) { + GT_MetaGenerated_Item aItem = (GT_MetaGenerated_Item) aStack.getItem(); + + short[] tModulation = aItem.getRGBa(aStack); + GL11.glColor4f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F, 255.0f); + } else { + System.out.println("WARNING: " + aStack.getDisplayName() + " does not have an associated GT colour."); + +public static void renderBlockIcon( RenderBlocks aRenderer, Block aBlock, double aX, double aY, double aZ, IIcon aIcon, byte aSide) { switch (aSide) { case 0: @@ -28,6 +42,7 @@ public class GT_RenderUtil { case 5: aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon); return; + } } diff --git a/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java b/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java new file mode 100644 index 0000000000..5a9cda6559 --- /dev/null +++ b/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java @@ -0,0 +1,112 @@ +package gregtech.common.render.items; + +import static gregtech.common.render.GT_RenderUtil.colorGTItem; + +import com.gtnewhorizons.modularui.api.math.Pos2d; +import gregtech.api.enums.Textures; +import gregtech.common.render.GT_RenderUtil; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class CosmicNeutroniumRenderer extends GT_GeneratedMaterial_Renderer { + + // spotless:off + private static final Pos2d point0 = new Pos2d(0 - 10, 0 - 10); + private static final Pos2d point1 = new Pos2d(17 + 10, 0 - 10); + private static final Pos2d point2 = new Pos2d(17 + 10, 17 + 10); + private static final Pos2d point3 = new Pos2d(0 - 10, 17 + 10); + // spotless:on + + private void drawHalo(ItemRenderType type) { + // Because when this class is instantiated, making this a static field will cause it to set to null. + final IIcon haloFuzzy = Textures.ItemIcons.HALO_FUZZY.getIcon(); + + if (haloFuzzy == null) { + return; + } + + GL11.glPushMatrix(); + + // Ideally this magic haloColour number should scale depending on the # of transparent pixels, + // but I'm not sure how to determine this with OpenGL. + // This is from Avaritia code, but modified to untangle the interfaces. + int haloColour = 0x4DFFFFFF; + float ca = (float) (haloColour >> 24 & 255) / 255.0F; + float cr = (float) (0x99FFFFFF >> 16 & 255) / 255.0F; + float cg = (float) (0x99FFFFFF >> 8 & 255) / 255.0F; + float cb = (float) (0x99FFFFFF & 255) / 255.0F; + GL11.glColor4f(cr, cg, cb, ca); + + // spotless:off + // For those following in my footsteps, this may be of use - Colen 25th dec 2022. + // http://greyminecraftcoder.blogspot.com/2013/08/the-tessellator.html + + Tessellator t = Tessellator.instance; + + if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { + t.startDrawingQuads(); + t.addVertexWithUV(point0.x, point0.y, 0, haloFuzzy.getMinU(), haloFuzzy.getMinV()); + t.addVertexWithUV(point3.x, point3.y, 0, haloFuzzy.getMinU(), haloFuzzy.getMaxV()); + t.addVertexWithUV(point2.x, point2.y, 0, haloFuzzy.getMaxU(), haloFuzzy.getMaxV()); + t.addVertexWithUV(point1.x, point1.y, 0, haloFuzzy.getMaxU(), haloFuzzy.getMinV()); + t.draw(); + } + + GL11.glPopMatrix(); + } + + @Override + public void renderRegularItem(ItemRenderType type, ItemStack item, IIcon icon, boolean shouldModulateColor) { + + RenderItem r = RenderItem.getInstance(); + + GL11.glPushMatrix(); + + if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + } + + drawHalo(type); + + //spotless:on + { + // Draw actual cosmic Nt item. + GL11.glPushMatrix(); + + colorGTItem(item); + + if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { + GT_RenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); + } else { + GL11.glEnable(GL11.GL_DEPTH_TEST); + ItemRenderer.renderItemIn2D( + Tessellator.instance, + icon.getMaxU(), + icon.getMinV(), + icon.getMinU(), + icon.getMaxV(), + icon.getIconWidth(), + icon.getIconHeight(), + 0.0625F); + } + GL11.glPopMatrix(); + } + + // GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + r.renderWithColor = true; + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java b/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java index 6a2535559e..b9419caa28 100644 --- a/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java +++ b/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java @@ -29,6 +29,20 @@ public class GT_GeneratedMaterial_Renderer implements IItemRenderer { return type == ItemRenderType.ENTITY; } + /** + * Handle special fluid display rendering. Return false if does not need such kind of handling. + * Note: annotations should not be rendered here. Only render the fluid + * texture. + * Parameters are values passed from {@link IItemRenderer#renderItem(ItemRenderType, ItemStack, Object...)} + * verbatim. Do not modify the argument. + * + * While this is called, BLEND and ALPHA_TEST is on. It is expected that these remain enabled while exit. + * @return true if did special fluid display rendering. false otherwise. + */ + public boolean renderFluidDisplayItem(ItemRenderType type, ItemStack aStack, Object... data) { + return false; + } + @Override public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { short aMetaData = (short) aStack.getItemDamage(); @@ -55,6 +69,7 @@ public class GT_GeneratedMaterial_Renderer implements IItemRenderer { if (tOverlay != null && aFluid != null && aFluid.getFluid() != null) { IIcon fluidIcon = aFluid.getFluid().getIcon(aFluid); if (fluidIcon != null) { + // Adds colour to a cells fluid. Does not colour full fluid icons as shown in NEI etc. renderContainedFluid(type, aFluid, fluidIcon); } } diff --git a/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java b/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java index 8e23a0005d..0133f21c8b 100644 --- a/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java +++ b/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java @@ -1,7 +1,11 @@ package gregtech.common.render.items; +import static gregtech.api.util.GT_OreDictUnificator.getAssociation; + +import gregtech.api.enums.Materials; import gregtech.api.items.GT_MetaGenerated_Item; import gregtech.api.util.GT_Utility; +import java.util.Objects; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; import net.minecraftforge.client.IItemRenderer; @@ -58,6 +62,15 @@ public class GT_MetaGenerated_Item_Renderer implements IItemRenderer { if (aMetaData < aItem.mOffset) { IItemRenderer aMaterialRenderer = aItem.getMaterialRenderer(aMetaData); + + // Handle fluid rendering. + if (aMaterialRenderer == null) { + Materials material = Objects.requireNonNull(getAssociation(aStack)).mMaterial.mMaterial; + if (material.renderer != null) { + aMaterialRenderer = material.renderer; + } + } + return aMaterialRenderer != null ? aMaterialRenderer : mMaterialRenderer; } diff --git a/src/main/java/gregtech/common/render/items/InfinityRenderer.java b/src/main/java/gregtech/common/render/items/InfinityRenderer.java new file mode 100644 index 0000000000..4f1695bec0 --- /dev/null +++ b/src/main/java/gregtech/common/render/items/InfinityRenderer.java @@ -0,0 +1,148 @@ +package gregtech.common.render.items; + +import codechicken.lib.render.TextureUtils; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.GT_MetaGenerated_Item; +import gregtech.api.util.GT_Utility; +import gregtech.common.render.GT_RenderUtil; +import java.util.Random; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.fluids.FluidStack; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class InfinityRenderer extends GT_GeneratedMaterial_Renderer { + public Random rand = new Random(); + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.INVENTORY; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { + short aMetaData = (short) aStack.getItemDamage(); + GT_MetaGenerated_Item aItem = (GT_MetaGenerated_Item) aStack.getItem(); + + IIconContainer aIconContainer = aItem.getIconContainer(aMetaData); + + if (aIconContainer == null) { + return; + } + + IIcon tIcon = aIconContainer.getIcon(); + IIcon tOverlay = aIconContainer.getOverlayIcon(); + FluidStack aFluid = GT_Utility.getFluidForFilledItem(aStack, true); + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + renderHalo(); + + if (tOverlay != null) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + TextureUtils.bindAtlas(aItem.getSpriteNumber()); + if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { + GT_RenderUtil.renderItemIcon(tOverlay, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); + } else { + ItemRenderer.renderItemIn2D( + Tessellator.instance, + tOverlay.getMaxU(), + tOverlay.getMinV(), + tOverlay.getMinU(), + tOverlay.getMaxV(), + tOverlay.getIconWidth(), + tOverlay.getIconHeight(), + 0.0625F); + } + } + + if (tIcon != null) { + renderRegularItem(type, aStack, tIcon, aFluid == null); + } + } + + private void renderHalo() { + GL11.glPushMatrix(); + IIcon halo = Textures.ItemIcons.HALO.getIcon(); + + int spread = 10; + int haloAlpha = 0xFF000000; + + if (halo == null) { + return; + } + + Tessellator t = Tessellator.instance; + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + GL11.glColor4f(20 / 255.0f, 20 / 255.0f, 20 / 255.0f, (float) (haloAlpha >> 24 & 255) / 255.0F); + + t.startDrawingQuads(); + t.addVertexWithUV(-spread, -spread, 0, halo.getMinU(), halo.getMinV()); + t.addVertexWithUV(-spread, 16 + spread, 0, halo.getMinU(), halo.getMaxV()); + t.addVertexWithUV(16 + spread, 16 + spread, 0, halo.getMaxU(), halo.getMaxV()); + t.addVertexWithUV(16 + spread, -spread, 0, halo.getMaxU(), halo.getMinV()); + t.draw(); + GL11.glPopMatrix(); + } + + @Override + public void renderRegularItem(ItemRenderType type, ItemStack item, IIcon icon, boolean shouldModulateColor) { + + RenderItem r = RenderItem.getInstance(); + Minecraft mc = Minecraft.getMinecraft(); + Tessellator t = Tessellator.instance; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + GL11.glPushMatrix(); + double scale = (rand.nextGaussian() * 0.15) + 0.95; + double offset = (1.0 - scale) / 2.0; + GL11.glEnable(GL11.GL_BLEND); + GL11.glTranslated(offset * 16.0, offset * 16.0, 1.0); + GL11.glScaled(scale, scale, 1.0); + + t.startDrawingQuads(); + t.setColorRGBA_F(1.0f, 1.0f, 1.0f, 0.6f); + t.addVertexWithUV(0 - offset, 0 - offset, 0, icon.getMinU(), icon.getMinV()); + t.addVertexWithUV(0 - offset, 16 + offset, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(16 + offset, 16 + offset, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(16 + offset, 0 - offset, 0, icon.getMaxU(), icon.getMinV()); + t.draw(); + + GL11.glPopMatrix(); + + r.renderItemIntoGUI(mc.fontRenderer, mc.getTextureManager(), item, 0, 0, true); + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + r.renderWithColor = true; + + GL11.glDisable(GL11.GL_BLEND); + RenderHelper.enableGUIStandardItemLighting(); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/gregtech/common/render/items/UniversiumRenderer.java b/src/main/java/gregtech/common/render/items/UniversiumRenderer.java new file mode 100644 index 0000000000..baaf951ddc --- /dev/null +++ b/src/main/java/gregtech/common/render/items/UniversiumRenderer.java @@ -0,0 +1,302 @@ +package gregtech.common.render.items; + +import codechicken.lib.render.TextureUtils; +import gregtech.api.enums.ItemList; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.items.GT_MetaGenerated_Item; +import gregtech.common.render.GT_RenderUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import singulariteam.eternalsingularity.render.CosmicRenderStuffs; + +public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer { + + private static final float cosmicOpacity = 2.5f; + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING; + } + + @Override + public boolean renderFluidDisplayItem(ItemRenderType type, ItemStack aStack, Object... data) { + magicRenderMethod( + type, ItemList.Emitter_UEV.get(1), aStack.getItem().getIconFromDamage(aStack.getItemDamage()), data); + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) { + short aMetaData = (short) aStack.getItemDamage(); + GT_MetaGenerated_Item aItem = (GT_MetaGenerated_Item) aStack.getItem(); + + IIconContainer aIconContainer = aItem.getIconContainer(aMetaData); + + if (aIconContainer == null) { + return; + } + + IIcon tIcon = aIconContainer.getIcon(); + IIcon tOverlay = aIconContainer.getOverlayIcon(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + if (tOverlay != null) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + TextureUtils.bindAtlas(aItem.getSpriteNumber()); + if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) { + GT_RenderUtil.renderItemIcon(tOverlay, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F); + } else { + ItemRenderer.renderItemIn2D( + Tessellator.instance, + tOverlay.getMaxU(), + tOverlay.getMinV(), + tOverlay.getMinU(), + tOverlay.getMaxV(), + tOverlay.getIconWidth(), + tOverlay.getIconHeight(), + 0.0625F); + } + } + + GL11.glDisable(GL11.GL_BLEND); + + if (tIcon != null) { + magicRenderMethod(type, aStack, getTrueIcon(aStack), data); + } + } + + private void magicRenderMethod(ItemRenderType type, ItemStack tmpItem, IIcon tIcon, Object... data) { + + RenderItem r = RenderItem.getInstance(); + Minecraft mc = Minecraft.getMinecraft(); + Tessellator t = Tessellator.instance; + + this.processLightLevel(type, tmpItem, data); + + switch (type) { + case ENTITY: { + GL11.glPushMatrix(); + if (tmpItem.isOnItemFrame()) GL11.glTranslatef(0F, -0.3F, 0.01F); + render(tmpItem, null); + GL11.glPopMatrix(); + + break; + } + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: { + render(tmpItem, data[1] instanceof EntityPlayer ? (EntityPlayer) data[1] : null); + break; + } + case INVENTORY: { + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + r.renderItemIntoGUI(mc.fontRenderer, mc.getTextureManager(), tmpItem, 0, 0, true); + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + r.renderWithColor = true; + + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + r.renderItemIntoGUI(mc.fontRenderer, mc.getTextureManager(), tmpItem, 0, 0, true); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + CosmicRenderStuffs.cosmicOpacity = cosmicOpacity; + CosmicRenderStuffs.inventoryRender = true; + CosmicRenderStuffs.useShader(); + + GL11.glColor4d(0, 1, 1, 1); + + float minu = tIcon.getMinU(); + float maxu = tIcon.getMaxU(); + float minv = tIcon.getMinV(); + float maxv = tIcon.getMaxV(); + + // Draw cosmic overlay + t.startDrawingQuads(); + t.addVertexWithUV(0, 0, 0, minu, minv); + t.addVertexWithUV(0, 16, 0, minu, maxv); + t.addVertexWithUV(16, 16, 0, maxu, maxv); + t.addVertexWithUV(16, 0, 0, maxu, minv); + t.draw(); + + CosmicRenderStuffs.releaseShader(); + CosmicRenderStuffs.inventoryRender = false; + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + r.renderWithColor = true; + + GL11.glPopMatrix(); + break; + } + default: + break; + } + } + + public void render(ItemStack item, EntityPlayer player) { + int passes = 1; + if (item.getItem().requiresMultipleRenderPasses()) { + passes = item.getItem().getRenderPasses(item.getItemDamage()); + } + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + + IIcon icon; + float f, f1, f2, f3; + float scale = 1F / 16F; + + for (int i = 0; i < passes; i++) { + icon = this.getStackIcon(item, player); + + f = icon.getMinU(); + f1 = icon.getMaxU(); + f2 = icon.getMinV(); + f3 = icon.getMaxV(); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + // RENDER ITEM IN HAND + ItemRenderer.renderItemIn2D( + Tessellator.instance, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), scale); + } + + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthFunc(GL11.GL_EQUAL); + CosmicRenderStuffs.cosmicOpacity = cosmicOpacity; + CosmicRenderStuffs.useShader(); + + IIcon cosmicIcon = getTrueIcon(item); + + float minu = cosmicIcon.getMinU(); + float maxu = cosmicIcon.getMaxU(); + float minv = cosmicIcon.getMinV(); + float maxv = cosmicIcon.getMaxV(); + + // RENDER COSMIC OVERLAY IN HAND + ItemRenderer.renderItemIn2D( + Tessellator.instance, + maxu, + minv, + minu, + maxv, + cosmicIcon.getIconWidth(), + cosmicIcon.getIconHeight(), + scale); + CosmicRenderStuffs.releaseShader(); + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + + GL11.glColor4f(1F, 1F, 1F, 1F); + } + + public void processLightLevel(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: { + EntityItem ent = (EntityItem) (data[1]); + if (ent != null) { + CosmicRenderStuffs.setLightFromLocation( + ent.worldObj, + MathHelper.floor_double(ent.posX), + MathHelper.floor_double(ent.posY), + MathHelper.floor_double(ent.posZ)); + } + break; + } + case EQUIPPED: { + EntityLivingBase ent = (EntityLivingBase) (data[1]); + if (ent != null) { + CosmicRenderStuffs.setLightFromLocation( + ent.worldObj, + MathHelper.floor_double(ent.posX), + MathHelper.floor_double(ent.posY), + MathHelper.floor_double(ent.posZ)); + } + break; + } + case EQUIPPED_FIRST_PERSON: { + EntityLivingBase ent = (EntityLivingBase) (data[1]); + if (ent != null) { + CosmicRenderStuffs.setLightFromLocation( + ent.worldObj, + MathHelper.floor_double(ent.posX), + MathHelper.floor_double(ent.posY), + MathHelper.floor_double(ent.posZ)); + } + break; + } + case INVENTORY: { + CosmicRenderStuffs.setLightLevel(10.2f); + return; + } + default: { + CosmicRenderStuffs.setLightLevel(1.0f); + } + } + } + + public IIcon getStackIcon(ItemStack stack, EntityPlayer player) { + return getTrueIcon(stack); + } + + public IIcon getTrueIcon(ItemStack stack) { + short aMetaData = (short) stack.getItemDamage(); + GT_MetaGenerated_Item aItem = (GT_MetaGenerated_Item) stack.getItem(); + + IIconContainer aIconContainer = aItem.getIconContainer(aMetaData); + + return aIconContainer.getIcon(); + } +} |