diff --git a/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java index 34b259b1..bd54f304 100644 --- a/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java +++ b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java @@ -1,7 +1,7 @@ package gregtech.api.items; import gregtech.api.interfaces.IIconContainer; -import gregtech.common.render.newitems.IItemIconContainerProvider; +import gregtech.common.render.items.IItemIconContainerProvider; import gregtech.common.render.IIconRegister; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; diff --git a/src/main/java/gregtech/api/items/GT_Generic_Block.java b/src/main/java/gregtech/api/items/GT_Generic_Block.java index a1401f70..3cae415e 100644 --- a/src/main/java/gregtech/api/items/GT_Generic_Block.java +++ b/src/main/java/gregtech/api/items/GT_Generic_Block.java @@ -1,7 +1,6 @@ package gregtech.api.items; import gregtech.api.util.GT_LanguageManager; -import gregtech.common.blocks.GT_Block_Machines; import gregtech.common.blocks.UnlistedBlockPosProperty; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -12,9 +11,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumBlockRenderType; -import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.IBlockAccess; @@ -23,8 +19,6 @@ import net.minecraftforge.common.property.ExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import static gregtech.api.enums.GT_Values.W; @@ -39,12 +33,15 @@ public abstract class GT_Generic_Block extends Block { super(aMaterial); setUnlocalizedName(mUnlocalizedName = aName); GameRegistry.registerBlock(this, aItemClass, getUnlocalizedName()); - GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Any Sub Block of this one"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Unnamed"); } @Override protected BlockStateContainer createBlockState() { - return new ExtendedBlockState.Builder(this).add(METADATA).add(BLOCK_POS).build(); + return new ExtendedBlockState.Builder(this) + .add(METADATA) + .add(BLOCK_POS) + .build(); } @Override @@ -62,38 +59,14 @@ public abstract class GT_Generic_Block extends Block { return ((IExtendedBlockState) state).withProperty(BLOCK_POS, pos); } - @Override - public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { - return getExtendedState(state, worldIn, pos); - } - @Override public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { return new ItemStack(this, 1, state.getValue(METADATA)); } - @Override - public boolean isOpaqueCube(IBlockState state) { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getBlockLayer() { - return BlockRenderLayer.CUTOUT; - } - - @Override - public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { - if(this instanceof GT_Block_Machines) { - return true; //Machines and wires should always render all sides; - } - //for anything else fallback to default implementation; - return super.shouldSideBeRendered(blockState, blockAccess, pos, side); - } - @Override public String getUnlocalizedName() { return mUnlocalizedName; } + } \ No newline at end of file diff --git a/src/main/java/gregtech/api/items/GT_Generic_Item.java b/src/main/java/gregtech/api/items/GT_Generic_Item.java index 39a08467..77b260c8 100644 --- a/src/main/java/gregtech/api/items/GT_Generic_Item.java +++ b/src/main/java/gregtech/api/items/GT_Generic_Item.java @@ -8,9 +8,9 @@ import gregtech.api.util.GT_Config; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_Utility; -import gregtech.common.render.newitems.IItemIconContainerProvider; +import gregtech.common.render.items.IItemIconContainerProvider; import gregtech.common.render.IIconRegister; -import gregtech.common.render.newitems.IItemIconProvider; +import gregtech.common.render.items.IItemIconProvider; import net.minecraft.block.BlockDispenser; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -26,10 +26,8 @@ import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.translation.I18n; import net.minecraft.world.World; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.registry.FMLControlledNamespacedRegistry; diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java index c28c86cf..96a01d86 100644 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java +++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java @@ -1,8 +1,8 @@ package gregtech.api.items; -import gregtech.common.render.IColorMultiplier; +import gregtech.common.render.IItemColorMultiplier; import gregtech.common.render.IIconRegister; -import gregtech.common.render.newitems.IItemIconProvider; +import gregtech.common.render.items.IItemIconProvider; import ic2.api.item.IElectricItem; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; @@ -10,7 +10,6 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import gregtech.api.GregTech_API; @@ -51,7 +50,7 @@ import static gregtech.api.enums.GT_Values.*; *

* These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike Item. */ -public abstract class GT_MetaGenerated_Item extends GT_MetaBase_Item implements IElectricItem, IItemIconProvider, IIconRegister, IColorMultiplier { +public abstract class GT_MetaGenerated_Item extends GT_MetaBase_Item implements IElectricItem, IItemIconProvider, IIconRegister, IItemColorMultiplier { /** * All instances of this Item Class are listed here. * This gets used to register the Renderer to all Items of this Type, if useStandardMetaItemRenderer() returns true. diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java index 04637677..572005f1 100644 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java +++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java @@ -13,8 +13,8 @@ import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; -import gregtech.common.render.IColorMultiplier; -import gregtech.common.render.newitems.IItemIconProvider; +import gregtech.common.render.IItemColorMultiplier; +import gregtech.common.render.items.IItemIconProvider; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; @@ -64,7 +64,7 @@ import java.util.Random; //@Optional.Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraft"), //@Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = "EnderIO") }) -public abstract class GT_MetaGenerated_Tool extends GT_MetaBase_Item implements IDamagableItem, IToolGrafter, IItemIconProvider, IColorMultiplier {//, IToolGrafter, IToolCrowbar, IToolWrench, ITool { +public abstract class GT_MetaGenerated_Tool extends GT_MetaBase_Item implements IDamagableItem, IToolGrafter, IItemIconProvider, IItemColorMultiplier {//, IToolGrafter, IToolCrowbar, IToolWrench, ITool { /** * All instances of this Item Class are listed here. * This gets used to register the Renderer to all Items of this Type, if useStandardMetaItemRenderer() returns true. diff --git a/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java b/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java index 128eed75..7ff90371 100644 --- a/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java +++ b/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java @@ -2,12 +2,11 @@ package gregtech.api.objects; import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; -import gregtech.common.render.newblocks.IBlockIconProvider; -import gregtech.common.render.newblocks.RenderUtil; +import gregtech.common.render.blocks.IBlockIconProvider; +import gregtech.common.render.RenderUtil; import net.minecraft.block.Block; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.client.FMLClientHandler; @@ -58,12 +57,14 @@ public class GT_CopiedBlockTexture implements ITexture { @Override @SideOnly(Side.CLIENT) public List getQuads(Block aBlock, BlockPos blockPos, EnumFacing side, float offset) { - TextureAtlasSprite sprite = getSide(mBlock, mMeta, EnumFacing.VALUES[mSide]); - if(sprite != null) { - BakedQuad quad = RenderUtil.renderSide(DefaultVertexFormats.BLOCK, sprite, side, -1, offset, mRGBa, false); - return Collections.singletonList(quad); + if(side != null) { + TextureAtlasSprite sprite = getSide(mBlock, mMeta, EnumFacing.VALUES[mSide]); + if(sprite != null) { + BakedQuad quad = RenderUtil.renderSide(sprite, side, offset, mRGBa); + return Collections.singletonList(quad); + } } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } @Override diff --git a/src/main/java/gregtech/api/objects/GT_PipeRenderedTexture.java b/src/main/java/gregtech/api/objects/GT_PipeRenderedTexture.java index 8d7c38fa..07b0a4d4 100644 --- a/src/main/java/gregtech/api/objects/GT_PipeRenderedTexture.java +++ b/src/main/java/gregtech/api/objects/GT_PipeRenderedTexture.java @@ -1,23 +1,23 @@ package gregtech.api.objects; -import com.google.common.collect.Lists; +import com.google.common.collect.ImmutableList; import gregtech.api.interfaces.IIconContainer; import gregtech.api.interfaces.ITexture; -import gregtech.common.render.newblocks.RenderUtil; +import gregtech.common.render.RenderUtil; import net.minecraft.block.Block; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -import java.util.ArrayList; import java.util.Collections; +import java.util.EnumMap; import java.util.List; public class GT_PipeRenderedTexture implements ITexture { + private EnumMap> sidedQuads; + private float thickness; private boolean connected; private TextureAtlasSprite connectedSprite; @@ -36,6 +36,7 @@ public class GT_PipeRenderedTexture implements ITexture { if(rgbaInsulation != null) { this.rgbaInsulation = GT_RenderedTexture.makeColor(rgbaInsulation); } + generate9(); } public GT_PipeRenderedTexture(float thickness, boolean connected, IIconContainer sprite, short[] rgba) { @@ -47,14 +48,28 @@ public class GT_PipeRenderedTexture implements ITexture { } @Override - public List getQuads(Block aBlock, BlockPos blockPos, EnumFacing side, float offset) { - float wireOffset = (1.0F - thickness) / 2f; + public List getQuads(Block aBlock, BlockPos blockPos, EnumFacing renderSide, float offset) { + if(renderSide != null) { + return sidedQuads.get(renderSide); + } + return Collections.EMPTY_LIST; + } + + private void generate9() { + sidedQuads = new EnumMap<>(EnumFacing.class); + for(EnumFacing side : EnumFacing.VALUES) { + sidedQuads.put(side, generateSide(side)); + } + } + + private ImmutableList generateSide(EnumFacing side) { + float wireOffset = (1.0F - thickness) / 2f; switch (side) { case UP: if(!connected) { BakedQuad quad = makeQuad(insulationSprite, wireOffset, wireOffset + thickness, wireOffset, thickness, thickness, EnumFacing.UP, rgbaInsulation); - return Lists.newArrayList(quad); + return ImmutableList.of(quad); } else { BakedQuad north = makeQuad(insulationSprite, wireOffset, wireOffset + thickness, wireOffset, thickness, wireOffset, EnumFacing.NORTH, rgbaInsulation); BakedQuad south = makeQuad(insulationSprite, wireOffset, wireOffset + thickness, wireOffset + thickness, thickness, wireOffset, EnumFacing.SOUTH, rgbaInsulation); @@ -64,12 +79,12 @@ public class GT_PipeRenderedTexture implements ITexture { BakedQuad up = makeQuad(connectedSprite, wireOffset, 1f, wireOffset, thickness, thickness, EnumFacing.UP, rgbaConnection); - return Lists.newArrayList(north, south, west, east, up); + return ImmutableList.of(north, south, west, east, up); } case DOWN: if(!connected) { BakedQuad quad = makeQuad(insulationSprite, wireOffset, wireOffset, wireOffset, thickness, thickness, EnumFacing.DOWN, rgbaInsulation); - return Lists.newArrayList(quad); + return ImmutableList.of(quad); } else { BakedQuad north = makeQuad(insulationSprite, wireOffset, 0f, wireOffset, thickness, wireOffset, EnumFacing.NORTH, rgbaInsulation); BakedQuad south = makeQuad(insulationSprite, wireOffset, 0f, wireOffset + thickness, thickness, wireOffset, EnumFacing.SOUTH, rgbaInsulation); @@ -79,12 +94,12 @@ public class GT_PipeRenderedTexture implements ITexture { BakedQuad down = makeQuad(connectedSprite, wireOffset, 0f, wireOffset, thickness, thickness, EnumFacing.DOWN, rgbaConnection); - return Lists.newArrayList(north, south, west, east, down); + return ImmutableList.of(north, south, west, east, down); } case EAST: if(!connected) { BakedQuad quad = makeQuad(insulationSprite, wireOffset, wireOffset, wireOffset, thickness, thickness, EnumFacing.WEST, rgbaInsulation); - return Lists.newArrayList(quad); + return ImmutableList.of(quad); } else { BakedQuad down = makeQuad(insulationSprite, wireOffset + thickness, wireOffset, wireOffset, wireOffset, thickness, EnumFacing.DOWN, rgbaInsulation); BakedQuad up = makeQuad(insulationSprite, wireOffset + thickness, wireOffset + thickness, wireOffset, wireOffset, thickness, EnumFacing.UP, rgbaInsulation); @@ -94,12 +109,12 @@ public class GT_PipeRenderedTexture implements ITexture { BakedQuad end = makeQuad(connectedSprite, 1f, wireOffset, wireOffset, thickness, thickness, EnumFacing.EAST, rgbaConnection); - return Lists.newArrayList(down, up, north, south, end); + return ImmutableList.of(down, up, north, south, end); } case WEST: if(!connected) { BakedQuad quad = makeQuad(insulationSprite, wireOffset + thickness, wireOffset, wireOffset, thickness, thickness, EnumFacing.EAST, rgbaInsulation); - return Lists.newArrayList(quad); + return ImmutableList.of(quad); } else { BakedQuad down = makeQuad(insulationSprite, 0f, wireOffset, wireOffset, wireOffset, thickness, EnumFacing.DOWN, rgbaInsulation); BakedQuad up = makeQuad(insulationSprite, 0f, wireOffset + thickness, wireOffset, wireOffset, thickness, EnumFacing.UP, rgbaInsulation); @@ -109,12 +124,12 @@ public class GT_PipeRenderedTexture implements ITexture { BakedQuad end = makeQuad(connectedSprite, 0f, wireOffset, wireOffset, thickness, thickness, EnumFacing.WEST, rgbaConnection); - return Lists.newArrayList(down, up, north, south, end); + return ImmutableList.of(down, up, north, south, end); } case NORTH: if(!connected) { BakedQuad quad = makeQuad(insulationSprite, wireOffset, wireOffset, wireOffset, thickness, thickness, EnumFacing.NORTH, rgbaInsulation); - return Lists.newArrayList(quad); + return ImmutableList.of(quad); } else { BakedQuad down = makeQuad(insulationSprite, wireOffset, wireOffset, 0f, thickness, wireOffset, EnumFacing.DOWN, rgbaInsulation); BakedQuad up = makeQuad(insulationSprite, wireOffset, wireOffset + thickness, 0f, thickness, wireOffset, EnumFacing.UP, rgbaInsulation); @@ -124,12 +139,12 @@ public class GT_PipeRenderedTexture implements ITexture { BakedQuad end = makeQuad(connectedSprite, wireOffset, wireOffset, 0f, thickness, thickness, EnumFacing.NORTH, rgbaConnection); - return Lists.newArrayList(down, up, end, east, west); + return ImmutableList.of(down, up, end, east, west); } case SOUTH: if(!connected) { BakedQuad quad = makeQuad(insulationSprite, wireOffset, wireOffset, wireOffset + thickness, thickness, thickness, EnumFacing.SOUTH, rgbaInsulation); - return Lists.newArrayList(quad); + return ImmutableList.of(quad); } else { BakedQuad down = makeQuad(insulationSprite, wireOffset, wireOffset, wireOffset + thickness, thickness, wireOffset, EnumFacing.DOWN, rgbaInsulation); BakedQuad up = makeQuad(insulationSprite, wireOffset, wireOffset + thickness, wireOffset + thickness, thickness, wireOffset, EnumFacing.UP, rgbaInsulation); @@ -139,14 +154,14 @@ public class GT_PipeRenderedTexture implements ITexture { BakedQuad end = makeQuad(connectedSprite, wireOffset, wireOffset, 1f, thickness, thickness, EnumFacing.SOUTH, rgbaConnection); - return Lists.newArrayList(down, up, end, east, west); + return ImmutableList.of(down, up, end, east, west); } } - return Collections.emptyList(); + throw new IllegalArgumentException(); } public BakedQuad makeQuad(TextureAtlasSprite sprite, float x, float y, float z, float width, float height, EnumFacing side, int rgba) { - return RenderUtil.renderQuadCustom(x, y, z, width, height, DefaultVertexFormats.BLOCK, sprite, side, -1, rgba, true); + return RenderUtil.renderQuadCustom(x, y, z, width, height, sprite, side, rgba); } @Override diff --git a/src/main/java/gregtech/api/objects/GT_RenderedTexture.java b/src/main/java/gregtech/api/objects/GT_RenderedTexture.java index 94dcb92f..cc8d7d75 100644 --- a/src/main/java/gregtech/api/objects/GT_RenderedTexture.java +++ b/src/main/java/gregtech/api/objects/GT_RenderedTexture.java @@ -3,20 +3,17 @@ package gregtech.api.objects; import com.google.common.collect.ImmutableList; import gregtech.api.interfaces.IIconContainer; import gregtech.api.interfaces.ITexture; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.newblocks.RenderUtil; +import gregtech.common.render.RenderUtil; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.awt.*; -import java.util.ArrayList; +import java.util.EnumMap; import java.util.HashMap; import java.util.List; @@ -25,7 +22,7 @@ public class GT_RenderedTexture implements ITexture { private final IIconContainer mIconContainer; public int mRGBa = -1; - private HashMap>> cache = new HashMap<>(); + private HashMap>> cache = new HashMap<>(); public GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa) { mIconContainer = aIcon; @@ -66,9 +63,9 @@ public class GT_RenderedTexture implements ITexture { @SideOnly(Side.CLIENT) public List getQuads(Block aBlock, BlockPos blockPos, EnumFacing side, float offset) { int offsetKey = offset2key(offset); - HashMap> offsetCache = cache.get(offsetKey); + EnumMap> offsetCache = cache.get(offsetKey); if(offsetCache == null) { - offsetCache = new HashMap<>(); + offsetCache = new EnumMap<>(EnumFacing.class); cache.put(offsetKey, offsetCache); } ImmutableList quads = offsetCache.get(side); @@ -79,15 +76,15 @@ public class GT_RenderedTexture implements ITexture { return quads; } - public ImmutableList generate9(EnumFacing side, float offset) { + private ImmutableList generate9(EnumFacing side, float offset) { ImmutableList.Builder quads = ImmutableList.builder(); TextureAtlasSprite sprite = mIconContainer.getIcon(); TextureAtlasSprite overlay = mIconContainer.getOverlayIcon(); if(sprite != null) { - quads.add(RenderUtil.renderSide(DefaultVertexFormats.BLOCK, sprite, side, -1, offset, mRGBa, false)); + quads.add(RenderUtil.renderSide(sprite, side, offset, mRGBa)); } if(overlay != null) { - quads.add(RenderUtil.renderSide(DefaultVertexFormats.BLOCK, overlay, side, -1, offset + 0.01F, mRGBa, false)); + quads.add(RenderUtil.renderSide(overlay, side, offset + 0.01F, mRGBa)); } return quads.build(); } diff --git a/src/main/java/gregtech/api/objects/GT_SidedTexture.java b/src/main/java/gregtech/api/objects/GT_SidedTexture.java index b07c0c55..76c610bb 100644 --- a/src/main/java/gregtech/api/objects/GT_SidedTexture.java +++ b/src/main/java/gregtech/api/objects/GT_SidedTexture.java @@ -16,6 +16,9 @@ import java.util.*; import java.util.List; public class GT_SidedTexture implements ITexture { + + private EnumMap sidedTextures; + private final IIconContainer[] mIconContainer; public int mRGBa; @@ -23,6 +26,15 @@ public class GT_SidedTexture implements ITexture { if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture"); mIconContainer = new IIconContainer[]{aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5}; mRGBa = makeColor(aRGBa); + generate9(); + } + + private void generate9() { + sidedTextures = new EnumMap<>(EnumFacing.class); + for(EnumFacing side : EnumFacing.VALUES) { + GT_RenderedTexture texture = new GT_RenderedTexture(mIconContainer[side.getIndex()], mRGBa); + sidedTextures.put(side, texture); + } } private int makeColor(short[] rgba) { @@ -50,8 +62,10 @@ public class GT_SidedTexture implements ITexture { @Override @SideOnly(Side.CLIENT) public List getQuads(Block aBlock, BlockPos blockPos, EnumFacing side, float offset) { - return new GT_RenderedTexture(mIconContainer[side.getIndex()], mRGBa) - .getQuads(aBlock, blockPos, side, offset); + if(side != null) { + return sidedTextures.get(side).getQuads(aBlock, blockPos, side, offset); + } + return Collections.emptyList(); } @Override diff --git a/src/main/java/gregtech/asm/ASM.java b/src/main/java/gregtech/asm/ASM.java index 435c59cd..4815aef2 100644 --- a/src/main/java/gregtech/asm/ASM.java +++ b/src/main/java/gregtech/asm/ASM.java @@ -14,7 +14,7 @@ import java.util.Map; public class ASM implements IFMLLoadingPlugin, IClassTransformer { private static final String OBF_METHOD_NAME = "func_178125_b"; - private static final String BLOCK_RENDERER = "gregtech/common/render/newblocks/BlockRenderer"; + private static final String BLOCK_RENDERER = "gregtech/common/render/GT_BlockRenderer"; private static final String SHOULD_HOOK_DESC = "(Lnet/minecraft/block/state/IBlockState;)Z"; private static final String HOOK_DESC = "(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/client/renderer/block/model/IBakedModel;"; diff --git a/src/main/java/gregtech/common/GT_Client.java b/src/main/java/gregtech/common/GT_Client.java index c723ab42..265f568d 100644 --- a/src/main/java/gregtech/common/GT_Client.java +++ b/src/main/java/gregtech/common/GT_Client.java @@ -7,16 +7,14 @@ package gregtech.common; import gregtech.api.GregTech_API; import gregtech.api.enums.*; -import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_Log; import gregtech.api.util.GT_Utility; import gregtech.common.entities.GT_Entity_Arrow; import gregtech.common.entities.GT_Entity_Arrow_Potion; -import gregtech.common.render.GT_CapeRenderer; -import gregtech.common.render.GT_Renderer_Entity_Arrow; -import gregtech.common.render.newitems.GT_IIconProvider_Item_Model; +import gregtech.common.render.entity.GT_CapeRenderer; +import gregtech.common.render.entity.GT_Renderer_Entity_Arrow; +import gregtech.common.render.GT_RenderDispatcher; import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.IReloadableResourceManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextComponentString; @@ -177,7 +175,7 @@ public class GT_Client extends GT_Proxy Textures.ItemIcons.BUTCHERYKNIFE.getClass(); TextureSet.SET_DIAMOND.getClass(); - new GT_IIconProvider_Item_Model(); + new GT_RenderDispatcher(); } public void run() { diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java index a8af5873..50144fb5 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java @@ -4,7 +4,7 @@ import com.google.common.collect.Lists; import gregtech.api.GregTech_API; import gregtech.api.items.GT_Generic_Block; import gregtech.api.util.GT_LanguageManager; -import gregtech.common.render.newblocks.IBlockIconProvider; +import gregtech.common.render.blocks.IBlockIconProvider; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockStateContainer; @@ -47,11 +47,6 @@ public abstract class GT_Block_Casings_Abstract extends GT_Generic_Block impleme return 2; } - @Override - protected BlockStateContainer createBlockState() { - return super.createBlockState(); - } - @Override public float getBlockHardness(IBlockState blockState, World worldIn, BlockPos pos) { return Blocks.IRON_BLOCK.getBlockHardness(blockState, worldIn, pos); diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java index 4f1b0360..cb3b2d6b 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java @@ -14,7 +14,7 @@ import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_Log; import gregtech.api.util.GT_Utility; import gregtech.common.render.IIconRegister; -import gregtech.common.render.newblocks.ITextureBlockIconProvider; +import gregtech.common.render.blocks.IBlockTextureProvider; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; @@ -30,6 +30,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; @@ -49,10 +50,7 @@ import java.util.Collections; import java.util.List; import java.util.Random; -@SuppressWarnings("deprecation") -public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlock, ITileEntityProvider, IIconRegister, ITextureBlockIconProvider { - - public static ThreadLocal mTemporaryTileEntity = new ThreadLocal<>(); +public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlock, ITileEntityProvider, IIconRegister, IBlockTextureProvider { public GT_Block_Machines() { super(GT_Item_Machines.class, "gt.blockmachines", new GT_Material_Machines()); @@ -327,7 +325,6 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo if ((tTileEntity instanceof IGregTechTileEntity)) { IGregTechTileEntity tGregTechTileEntity = (IGregTechTileEntity) tTileEntity; Random tRandom = new Random(); - mTemporaryTileEntity.set(tGregTechTileEntity); for (int i = 0; i < tGregTechTileEntity.getSizeInventory(); i++) { ItemStack tItem = tGregTechTileEntity.getStackInSlot(i); if ((tItem != null) && (tItem.stackSize > 0) && (tGregTechTileEntity.isValidSlot(i))) { @@ -358,12 +355,7 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo if(gregTechTileEntity != null) { return gregTechTileEntity.getDrops(); } - if(mTemporaryTileEntity.get() != null) { - IGregTechTileEntity tempTile = mTemporaryTileEntity.get(); - mTemporaryTileEntity.remove(); - return tempTile.getDrops(); - } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } @Override @@ -526,4 +518,11 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo return false; } + @Override + @SideOnly(Side.CLIENT) + //for multilayer blocks + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.CUTOUT; + } + } diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Metal.java b/src/main/java/gregtech/common/blocks/GT_Block_Metal.java index 223c0a7a..9b086b1e 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Metal.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Metal.java @@ -1,10 +1,8 @@ package gregtech.common.blocks; -import gregtech.common.render.newblocks.IBlockIconProvider; -import mezz.jei.Internal; +import gregtech.common.render.blocks.IBlockIconProvider; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.EnumFacing; -import net.minecraftforge.fml.common.Loader; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.interfaces.IIconContainer; diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java index 800dd8cb..d9078233 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java @@ -1,17 +1,5 @@ package gregtech.common.blocks; -import gregtech.api.enums.TextureSet; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.newblocks.ITextureBlockIconProvider; -import gregtech.jei.JEI_Compat; -import net.minecraft.block.SoundType; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.Explosion; -import net.minecraftforge.common.property.IExtendedBlockState; -import net.minecraftforge.fml.common.Loader; import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.Materials; @@ -21,26 +9,34 @@ import gregtech.api.items.GT_Generic_Block; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; +import gregtech.common.render.blocks.IBlockTextureProvider; +import gregtech.jei.JEI_Compat; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; +import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.Explosion; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.ArrayList; import java.util.Collections; import java.util.List; -public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements ITileEntityProvider, ITextureBlockIconProvider { - - private static final ITexture[] EMPTY = new ITexture[0]; +public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements ITileEntityProvider, IBlockTextureProvider { protected GT_Block_Ores_Abstract(String aUnlocalizedName, Material aMaterial) { super(GT_Item_Ores.class, aUnlocalizedName, aMaterial); @@ -189,11 +185,8 @@ public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements @Override @SideOnly(Side.CLIENT) public ITexture[] getTexture(World world, BlockPos blockPos, IExtendedBlockState blockState, EnumFacing side) { - if (!GT_Utility.isOpaqueBlock(world, blockPos.offset(side))) { - GT_TileEntity_Ores oreTile = (GT_TileEntity_Ores) world.getTileEntity(blockPos); - return oreTile.getTexture(this, (byte) side.getIndex()); - } - return EMPTY; + GT_TileEntity_Ores oreTile = (GT_TileEntity_Ores) world.getTileEntity(blockPos); + return oreTile.getTexture(this, (byte) side.getIndex()); } @Override @@ -217,7 +210,7 @@ public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements if ((tTileEntity instanceof GT_TileEntity_Ores)) { return ((GT_TileEntity_Ores) tTileEntity).getDrops(getDroppedBlock(), fortune); } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } public abstract OrePrefixes[] getProcessingPrefix(); //Must have 17 entries; an entry can be null to disable automatic recipes. @@ -247,4 +240,11 @@ public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements return baseBlockType <= 8; } + @Override + @SideOnly(Side.CLIENT) + //for multilayer blocks + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.CUTOUT; + } + } diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java b/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java index 6a43b905..5ea7ac9c 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java @@ -13,25 +13,17 @@ import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; -import gregtech.common.render.newblocks.IBlockIconProvider; -import ic2.core.block.EntityIC2Explosive; -import ic2.core.block.EntityItnt; +import gregtech.common.render.blocks.IBlockIconProvider; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; -import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.world.Explosion; import net.minecraft.world.IBlockAccess; @@ -39,7 +31,6 @@ import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import javax.annotation.Nullable; import java.util.List; public class GT_Block_Reinforced extends GT_Generic_Block implements IBlockIconProvider { diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Stones.java b/src/main/java/gregtech/common/blocks/GT_Block_Stones.java index ab5b6e77..1dee74d9 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Stones.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Stones.java @@ -4,7 +4,7 @@ import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_OreDictUnificator; -import gregtech.common.render.newblocks.IBlockIconProvider; +import gregtech.common.render.blocks.IBlockIconProvider; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.init.Blocks; diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java index c13bcffd..a5d0811a 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java @@ -8,7 +8,7 @@ import gregtech.api.items.GT_Generic_Block; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_Utility; -import gregtech.common.render.newblocks.IBlockIconProvider; +import gregtech.common.render.blocks.IBlockIconProvider; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; diff --git a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java index d1a0d8e5..8e46b5b2 100644 --- a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java +++ b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java @@ -35,27 +35,16 @@ public class GT_TileEntity_Ores extends TileEntity implements ITexturedTileEntit public short mMetaData = 0; public boolean mNatural = false; - @Nullable - @Override - public SPacketUpdateTileEntity getUpdatePacket() { - return new SPacketUpdateTileEntity(this.pos, -1, this.getUpdateTag()); - } - @Override public NBTTagCompound getUpdateTag() { - return writeToNBT(new NBTTagCompound()); - } - - @Override - public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { - readFromNBT(pkt.getNbtCompound()); - causeChunkUpdate(); + //return writeToNBT(new NBTTagCompound()); + return null; } @Override public void handleUpdateTag(NBTTagCompound tag) { readNBTInternal(tag); - causeChunkUpdate(); + //causeChunkUpdate(); } @Override diff --git a/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java b/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java index 2d6c190a..a8c154ea 100644 --- a/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java +++ b/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java @@ -4,7 +4,7 @@ import gregtech.api.enums.GT_Values; import gregtech.api.enums.ItemList; import gregtech.api.items.GT_Generic_Item; import gregtech.api.util.GT_Utility; -import gregtech.common.render.IColorMultiplier; +import gregtech.common.render.IItemColorMultiplier; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -19,7 +19,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; -public class GT_FluidDisplayItem extends GT_Generic_Item implements IColorMultiplier { +public class GT_FluidDisplayItem extends GT_Generic_Item implements IItemColorMultiplier { public GT_FluidDisplayItem() { super("GregTech_FluidDisplay", "Fluid Display", null); ItemList.Display_Fluid.set(this); diff --git a/src/main/java/gregtech/common/items/ItemComb.java b/src/main/java/gregtech/common/items/ItemComb.java index 46765aa7..d8e167ea 100644 --- a/src/main/java/gregtech/common/items/ItemComb.java +++ b/src/main/java/gregtech/common/items/ItemComb.java @@ -10,10 +10,9 @@ import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; -import gregtech.common.render.IColorMultiplier; +import gregtech.common.render.IItemColorMultiplier; import gregtech.common.render.IIconRegister; -import gregtech.common.render.newitems.IItemIconProvider; -import net.minecraft.client.renderer.color.IItemColor; +import gregtech.common.render.items.IItemIconProvider; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.creativetab.CreativeTabs; @@ -28,7 +27,7 @@ import java.util.List; import static gregtech.api.enums.GT_Values.MOD_ID; -public class ItemComb extends Item implements IItemIconProvider, IIconRegister, IColorMultiplier { +public class ItemComb extends Item implements IItemIconProvider, IIconRegister, IItemColorMultiplier { @SideOnly(Side.CLIENT) private TextureAtlasSprite itemIcon, secondIcon; diff --git a/src/main/java/gregtech/common/items/armor/ModularArmor_Item.java b/src/main/java/gregtech/common/items/armor/ModularArmor_Item.java index 0fcbe089..6bfbcfd9 100644 --- a/src/main/java/gregtech/common/items/armor/ModularArmor_Item.java +++ b/src/main/java/gregtech/common/items/armor/ModularArmor_Item.java @@ -3,7 +3,7 @@ package gregtech.common.items.armor; import gregtech.api.damagesources.GT_DamageSources; import gregtech.api.enums.GT_Values; import gregtech.common.render.IIconRegister; -import gregtech.common.render.newitems.IItemIconProvider; +import gregtech.common.render.items.IItemIconProvider; import ic2.core.IC2; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/gregtech/common/render/newblocks/BlockRenderer.java b/src/main/java/gregtech/common/render/GT_BlockRenderer.java similarity index 82% rename from src/main/java/gregtech/common/render/newblocks/BlockRenderer.java rename to src/main/java/gregtech/common/render/GT_BlockRenderer.java index 7efe3528..59c70bac 100644 --- a/src/main/java/gregtech/common/render/newblocks/BlockRenderer.java +++ b/src/main/java/gregtech/common/render/GT_BlockRenderer.java @@ -1,21 +1,19 @@ -package gregtech.common.render.newblocks; +package gregtech.common.render; import com.google.common.collect.ImmutableList; import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; import gregtech.api.items.GT_Generic_Block; -import gregtech.common.render.newitems.ModelUtil; +import gregtech.common.render.blocks.IBlockIconProvider; +import gregtech.common.render.blocks.IBlockTextureProvider; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.block.model.ItemOverrideList; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -32,7 +30,7 @@ import java.util.HashMap; import java.util.List; @SideOnly(Side.CLIENT) -public class BlockRenderer { +public class GT_BlockRenderer { /** * Quads cache for standard icon provider blocks @@ -44,8 +42,8 @@ public class BlockRenderer { if(blockState.getBlock() instanceof IBlockIconProvider) { return true; } - if(blockState.getBlock() instanceof ITextureBlockIconProvider) { - return true; + if(blockState.getBlock() instanceof IBlockTextureProvider) { + return true; } return false; } @@ -54,21 +52,30 @@ public class BlockRenderer { if(blockState.getBlock() instanceof IBlockIconProvider) { return ICON_PROVIDER; } - if(blockState.getBlock() instanceof ITextureBlockIconProvider) { + if(blockState.getBlock() instanceof IBlockTextureProvider) { return TEXTURE_PROVIDER; } return null; } - private static final IconProviderModel ICON_PROVIDER = new IconProviderModel(); - private static final TextureProviderModel TEXTURE_PROVIDER = new TextureProviderModel(); + public static final IconProviderModel ICON_PROVIDER = new IconProviderModel(); + public static final TextureProviderModel TEXTURE_PROVIDER = new TextureProviderModel(); + public static IBakedModel getItemBlockModel(Block block, ItemStack stack, EntityLivingBase entity) { + if(block instanceof IBlockTextureProvider) { + return GT_BlockRenderer.makeTextureProviderItemblock(stack, entity); + } else if(block instanceof IBlockIconProvider) { + return GT_BlockRenderer.makeIconProviderItemblock(stack, entity); + } else { + return null; + } + } - public static IBakedModel makeTextureProviderItemblock(ItemStack stack, EntityLivingBase holder) { + private static IBakedModel makeTextureProviderItemblock(ItemStack stack, EntityLivingBase holder) { return new ItemblockTextureProviderModel(stack, holder instanceof EntityPlayer ? (EntityPlayer) holder : null); } - public static IBakedModel makeIconProviderItemblock(ItemStack stack, EntityLivingBase holder) { + private static IBakedModel makeIconProviderItemblock(ItemStack stack, EntityLivingBase holder) { return new ItemblockIconProviderModel(stack, holder instanceof EntityPlayer ? (EntityPlayer) holder : null); } @@ -118,13 +125,13 @@ public class BlockRenderer { } ImmutableList faceQuad = quads.get(side); if(faceQuad == null) { - faceQuad = ImmutableList.of(RenderUtil.renderSide(DefaultVertexFormats.BLOCK, sideIcon, side, -1, 0.0F, -1, false)); + faceQuad = ImmutableList.of(RenderUtil.renderSide(sideIcon, side, 0.0F, 0xFFFFFF)); quads.put(side, faceQuad); } return faceQuad; } } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } public abstract TextureAtlasSprite getSideSprite(EnumFacing side, IBlockState blockState); @@ -139,7 +146,7 @@ public class BlockRenderer { ArrayList quads = new ArrayList<>(); IExtendedBlockState blockState = (IExtendedBlockState) state; BlockPos pos = blockState.getValue(GT_Generic_Block.BLOCK_POS); - ITextureBlockIconProvider provider = (ITextureBlockIconProvider) blockState.getBlock(); + IBlockTextureProvider provider = (IBlockTextureProvider) blockState.getBlock(); ITexture[] textures = provider.getTexture(Minecraft.getMinecraft().theWorld, pos, blockState, side); for (int i = 0; i < textures.length; i++) { if(textures[i] != null) { @@ -148,7 +155,7 @@ public class BlockRenderer { } return quads; } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } } @@ -169,7 +176,7 @@ public class BlockRenderer { public List getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { if(side != null) { ArrayList quads = new ArrayList<>(); - ITextureBlockIconProvider provider = (ITextureBlockIconProvider) block; + IBlockTextureProvider provider = (IBlockTextureProvider) block; ITexture[] textures = provider.getItemblockTexture(holder, itemStack, side); for (int i = 0; i < textures.length; i++) { if(textures[i] != null) { @@ -178,7 +185,7 @@ public class BlockRenderer { } return quads; } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } } @@ -187,7 +194,7 @@ public class BlockRenderer { @Override public boolean isAmbientOcclusion() { - return false; + return true; } @Override diff --git a/src/main/java/gregtech/common/render/newitems/GT_IIconProvider_Item_Model.java b/src/main/java/gregtech/common/render/GT_RenderDispatcher.java similarity index 77% rename from src/main/java/gregtech/common/render/newitems/GT_IIconProvider_Item_Model.java rename to src/main/java/gregtech/common/render/GT_RenderDispatcher.java index bd56fa86..de3c3c46 100644 --- a/src/main/java/gregtech/common/render/newitems/GT_IIconProvider_Item_Model.java +++ b/src/main/java/gregtech/common/render/GT_RenderDispatcher.java @@ -1,20 +1,18 @@ -package gregtech.common.render.newitems; +package gregtech.common.render; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import gregtech.api.GregTech_API; -import gregtech.common.render.IColorMultiplier; -import gregtech.common.render.IIconRegister; -import gregtech.common.render.newblocks.BlockRenderer; -import gregtech.common.render.newblocks.IBlockIconProvider; -import gregtech.common.render.newblocks.ITextureBlockIconProvider; +import gregtech.common.render.blocks.IBlockIconProvider; +import gregtech.common.render.blocks.IBlockTextureProvider; +import gregtech.common.render.items.IItemIconProvider; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemModelMesher; import net.minecraft.client.renderer.block.model.*; import net.minecraft.client.renderer.color.BlockColors; -import net.minecraft.client.renderer.color.IBlockColor; -import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; @@ -25,11 +23,10 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.model.TRSRTransformation; @@ -42,25 +39,29 @@ import javax.vecmath.Vector4f; import java.util.*; @SideOnly(Side.CLIENT) -public class GT_IIconProvider_Item_Model implements IBakedModel { +public class GT_RenderDispatcher implements IBakedModel { private static final ModelResourceLocation RESOURCE_LOCATION = new ModelResourceLocation("gregtech", "IItemIconProvider"); - private ItemStack itemStack; - private VertexFormat vertexFormat; + private static final ModelResourceLocation RESOURCE_LOCATION_BLOCK_TEXTURE = new ModelResourceLocation("gregtech", "IBlockTextureIconProvider"); + private static final ModelResourceLocation RESOURCE_LOCATION_BLOCK_ICON = new ModelResourceLocation("gregtech", "IBlockIconProvider"); - public GT_IIconProvider_Item_Model() { + private ItemStack itemStack; + + public GT_RenderDispatcher() { MinecraftForge.EVENT_BUS.register(this); - setupItemModels(); - this.vertexFormat = DefaultVertexFormats.ITEM; + setupModels(); } @SubscribeEvent public void onTextureMapStitch(TextureStitchEvent.Pre pre) { + ItemColors itemColors = Minecraft.getMinecraft().getItemColors(); + BlockColors blockColors = Minecraft.getMinecraft().getBlockColors(); System.out.println("Texture map stitch"); - System.out.println("GT_Mod: Starting Item Icon Load Phase"); + System.out.println("GT_Mod: Starting Icon Load Phase"); GregTech_API.sBlockIcons = pre.getMap(); + for (Runnable tRunnable : GregTech_API.sGTItemIconload) { try { tRunnable.run(); @@ -69,6 +70,7 @@ public class GT_IIconProvider_Item_Model implements IBakedModel { e.printStackTrace(); } } + for (Runnable tRunnable : GregTech_API.sGTBlockIconload) { try { tRunnable.run(); @@ -77,22 +79,41 @@ public class GT_IIconProvider_Item_Model implements IBakedModel { e.printStackTrace(); } } + for(ResourceLocation itemId : Item.REGISTRY.getKeys()) { Item item = Item.REGISTRY.getObject(itemId); + if(item instanceof IIconRegister) { ((IIconRegister) item).registerIcons(pre.getMap()); } - if(item instanceof IColorMultiplier) { - IColorMultiplier colorMultiplier = (IColorMultiplier) item; + + if(item instanceof IItemColorMultiplier) { + IItemColorMultiplier colorMultiplier = (IItemColorMultiplier) item; itemColors.registerItemColorHandler(colorMultiplier::getColorFromItemstack, item); } + + //we don't need color multiplier for standard blocks, only for ITexture-blocks + if(item instanceof ItemBlock && ((ItemBlock) item).block instanceof IBlockTextureProvider) { + //ITextures pass color as tint index + itemColors.registerItemColorHandler((stack, tintIndex) -> tintIndex, item); + } + } for(ResourceLocation blockId : Block.REGISTRY.getKeys()) { Block block = Block.REGISTRY.getObject(blockId); + if(block instanceof IIconRegister) { ((IIconRegister) block).registerIcons(pre.getMap()); } + + //we don't need color multiplier for standard blocks, only for ITexture-blocks + if(block instanceof IBlockTextureProvider) { + //ITextures pass color as tint index + blockColors.registerBlockColorHandler((state, worldIn, pos, tintIndex) -> tintIndex, block); + } + } + System.out.println("GT_Mod: Finished Icon Load Phase"); } @@ -100,18 +121,50 @@ public class GT_IIconProvider_Item_Model implements IBakedModel { public void onModelsBake(ModelBakeEvent bakeEvent) { System.out.println("Models bake"); bakeEvent.getModelRegistry().putObject(RESOURCE_LOCATION, this); + bakeEvent.getModelRegistry().putObject(RESOURCE_LOCATION_BLOCK_ICON, GT_BlockRenderer.ICON_PROVIDER); + bakeEvent.getModelRegistry().putObject(RESOURCE_LOCATION_BLOCK_TEXTURE, GT_BlockRenderer.TEXTURE_PROVIDER); + registerBlockModels(); } - public static void setupItemModels() { + public static void setupModels() { + + ItemModelMesher itemModelMesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); for(ResourceLocation itemId : Item.REGISTRY.getKeys()) { Item item = Item.REGISTRY.getObject(itemId); + if(item instanceof IItemIconProvider || (item instanceof ItemBlock && ( Block.getBlockFromItem(item) instanceof IBlockIconProvider || - Block.getBlockFromItem(item) instanceof ITextureBlockIconProvider))) { + Block.getBlockFromItem(item) instanceof IBlockTextureProvider))) { for (int i = 0; i < Short.MAX_VALUE; i++) { - Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, i, RESOURCE_LOCATION); + itemModelMesher.register(item, i, RESOURCE_LOCATION); } } + + } + } + + public void registerBlockModels() { + for(ResourceLocation blockId : Block.REGISTRY.getKeys()) { + Block block = Block.REGISTRY.getObject(blockId); + + if(block instanceof IBlockTextureProvider) { + ImmutableMap.Builder stateMap = ImmutableMap.builder(); + for(IBlockState blockState : block.getBlockState().getValidStates()) { + stateMap.put(blockState, RESOURCE_LOCATION_BLOCK_TEXTURE); + } + ImmutableMap immutableStateMap = stateMap.build(); + ModelLoader.setCustomStateMapper(block, block2 -> immutableStateMap); + } + + else if(block instanceof IBlockIconProvider) { + ImmutableMap.Builder stateMap = ImmutableMap.builder(); + for(IBlockState blockState : block.getBlockState().getValidStates()) { + stateMap.put(blockState, RESOURCE_LOCATION_BLOCK_ICON); + } + ImmutableMap immutableStateMap = stateMap.build(); + ModelLoader.setCustomStateMapper(block, block2 -> immutableStateMap); + } + } } @@ -128,14 +181,52 @@ public class GT_IIconProvider_Item_Model implements IBakedModel { for(int i = 0; i < iconProvider.getRenderPasses(itemStack) + 1; i++) { TextureAtlasSprite atlasSprite = iconProvider.getIcon(itemStack, i); if(atlasSprite != null) { - resultQuads.addAll(getQuadsForSprite(i, atlasSprite, vertexFormat, Optional.absent())); + resultQuads.addAll(getQuadsForSprite(i, atlasSprite, DefaultVertexFormats.ITEM, Optional.absent())); } } return resultQuads; } - return Collections.emptyList(); + return Collections.EMPTY_LIST; } + + @Override + public ItemOverrideList getOverrides() { + return new ItemOverrideList(Collections.EMPTY_LIST) { + @Override + public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) { + if(stack.getItem() instanceof ItemBlock) { + Block block = Block.getBlockFromItem(stack.getItem()); + return GT_BlockRenderer.getItemBlockModel(block, stack, entity); + } else { + GT_RenderDispatcher.this.itemStack = stack; + return GT_RenderDispatcher.this; + } + } + }; + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() { + if(itemStack != null) { + IItemIconProvider iconProvider = (IItemIconProvider) itemStack.getItem(); + return iconProvider.isHandheld(itemStack) ? + ModelUtil.HANDHELD_TRANSFORMS : + ModelUtil.DEFAULT_TRANSFORMS; + } + return ItemCameraTransforms.DEFAULT; + } + + @Override + public TextureAtlasSprite getParticleTexture() { + if(itemStack != null) { + IItemIconProvider iconProvider = (IItemIconProvider) itemStack.getItem(); + return iconProvider.getIcon(itemStack, 0); + } + return null; + } + + @Override public boolean isAmbientOcclusion() { return false; @@ -151,48 +242,13 @@ public class GT_IIconProvider_Item_Model implements IBakedModel { return false; } - @Override - public TextureAtlasSprite getParticleTexture() { - if(itemStack != null) { - IItemIconProvider iconProvider = (IItemIconProvider) itemStack.getItem(); - return iconProvider.getIcon(itemStack, 0); - } - return null; - } - @Override - public ItemCameraTransforms getItemCameraTransforms() { - if(itemStack != null) { - IItemIconProvider iconProvider = (IItemIconProvider) itemStack.getItem(); - return iconProvider.isHandheld(itemStack) ? ModelUtil.HANDHELD_TRANSFORMS : ModelUtil.DEFAULT_TRANSFORMS; - } - return ItemCameraTransforms.DEFAULT; - } - @Override - public ItemOverrideList getOverrides() { - return new ItemOverrideList(Collections.emptyList()) { - @Override - public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) { - if(stack.getItem() instanceof ItemBlock) { - Block block = Block.getBlockFromItem(stack.getItem()); - if(block instanceof ITextureBlockIconProvider) { - return BlockRenderer.makeTextureProviderItemblock(stack, entity); - } else if(block instanceof IBlockIconProvider) { - return BlockRenderer.makeIconProviderItemblock(stack, entity); - } else { - return null; - } - } + /////////////////////////////////////////////////////////////////////// + //ITEM RENDERING STUFF + /////////////////////////////////////////////////////////////////////// - GT_IIconProvider_Item_Model.this.itemStack = stack; - return GT_IIconProvider_Item_Model.this; - } - }; - } - - public static ImmutableList getQuadsForSprite(int tint, TextureAtlasSprite sprite, VertexFormat format, Optional transform) - { + public static ImmutableList getQuadsForSprite(int tint, TextureAtlasSprite sprite, VertexFormat format, Optional transform) { ImmutableList.Builder builder = ImmutableList.builder(); int uMax = sprite.getIconWidth(); @@ -414,6 +470,9 @@ public class GT_IIconProvider_Item_Model implements IBakedModel { break; } } + } + + } diff --git a/src/main/java/gregtech/common/render/IIconRegister.java b/src/main/java/gregtech/common/render/IIconRegister.java index 4a06ab1d..0dfea849 100644 --- a/src/main/java/gregtech/common/render/IIconRegister.java +++ b/src/main/java/gregtech/common/render/IIconRegister.java @@ -4,6 +4,16 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +/** + * Implement on blocks and items to access texture map and allow icon registration + * You can register you own sprite using: + * + * TextureAtlasSprite icon = textureMap.registerSprite(ResourceLocation) + * + * @see TextureMap + * @see net.minecraft.client.renderer.texture.TextureAtlasSprite + * @see gregtech.common.render.items.IItemIconProvider + */ public interface IIconRegister { @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/common/render/IColorMultiplier.java b/src/main/java/gregtech/common/render/IItemColorMultiplier.java similarity index 86% rename from src/main/java/gregtech/common/render/IColorMultiplier.java rename to src/main/java/gregtech/common/render/IItemColorMultiplier.java index 8f850e25..291c74bd 100644 --- a/src/main/java/gregtech/common/render/IColorMultiplier.java +++ b/src/main/java/gregtech/common/render/IItemColorMultiplier.java @@ -4,7 +4,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -public interface IColorMultiplier { +public interface IItemColorMultiplier { @SideOnly(Side.CLIENT) int getColorFromItemstack(ItemStack stack, int tintIndex); diff --git a/src/main/java/gregtech/common/render/newitems/ModelUtil.java b/src/main/java/gregtech/common/render/ModelUtil.java similarity index 92% rename from src/main/java/gregtech/common/render/newitems/ModelUtil.java rename to src/main/java/gregtech/common/render/ModelUtil.java index bb681e4b..d5f15958 100644 --- a/src/main/java/gregtech/common/render/newitems/ModelUtil.java +++ b/src/main/java/gregtech/common/render/ModelUtil.java @@ -1,4 +1,4 @@ -package gregtech.common.render.newitems; +package gregtech.common.render; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; @@ -11,6 +11,9 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.io.IOException; import java.io.InputStreamReader; +/** + * Simple util for gathering transforms from external model jsons + */ @SideOnly(Side.CLIENT) public class ModelUtil { diff --git a/src/main/java/gregtech/common/render/RenderUtil.java b/src/main/java/gregtech/common/render/RenderUtil.java new file mode 100644 index 00000000..025057f6 --- /dev/null +++ b/src/main/java/gregtech/common/render/RenderUtil.java @@ -0,0 +1,64 @@ +package gregtech.common.render; + +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.util.vector.Vector3f; + +/** + * Util for easy rendering quads based on side and with custom size + */ +@SideOnly(Side.CLIENT) +public class RenderUtil { + + private static FaceBakery FACE_BAKERY = new FaceBakery(); + private static BlockFaceUV DEFAULT_UV = new BlockFaceUV(new float[] {0F, 0F, 16F, 16F}, 0); + + public static BakedQuad renderSide(TextureAtlasSprite sprite, EnumFacing side, float offset, int color) { + switch (side) { + case DOWN: + return renderQuadCustom(0F, 0F - offset, 0F, 16F, 16F, sprite, side, color); + case UP: + return renderQuadCustom(0F, 16F + offset, 0F, 16F, 16F, sprite, side, color); + case WEST: + return renderQuadCustom(0F - offset, 0F, 0F, 16F, 16F, sprite, side, color); + case EAST: + return renderQuadCustom(16F + offset, 0F, 0F, 16F, 16F, sprite, side, color); + case NORTH: + return renderQuadCustom(0F, 0F, 0F - offset, 16F, 16F, sprite, side, color); + case SOUTH: + return renderQuadCustom(0F, 0F, 16F + offset, 16F, 16F, sprite, side, color); + default: + throw new IllegalArgumentException(); + } + } + + public static BakedQuad renderQuadCustom(float x, float y, float z, float width, float height, TextureAtlasSprite sprite, EnumFacing side, int color) { + Vector3f from = new Vector3f(x, y, z); + Vector3f to; + switch (side) { + case DOWN: + case UP: + to = new Vector3f(x + width, y, z + height); + break; + case WEST: + case EAST: + to = new Vector3f(x, y + width, z + height); + break; + case NORTH: + case SOUTH: + to = new Vector3f(x + width, y + height, z); + break; + default: + to = new Vector3f(x, y, z); + } + + return FACE_BAKERY.makeBakedQuad(from, to, + new BlockPartFace(side, color, sprite.getIconName(), DEFAULT_UV), + sprite, side, ModelRotation.X0_Y0, null, false, true); + } + + +} diff --git a/src/main/java/gregtech/common/render/newblocks/IBlockIconProvider.java b/src/main/java/gregtech/common/render/blocks/IBlockIconProvider.java similarity index 66% rename from src/main/java/gregtech/common/render/newblocks/IBlockIconProvider.java rename to src/main/java/gregtech/common/render/blocks/IBlockIconProvider.java index 87d87ed6..fc9e03f7 100644 --- a/src/main/java/gregtech/common/render/newblocks/IBlockIconProvider.java +++ b/src/main/java/gregtech/common/render/blocks/IBlockIconProvider.java @@ -1,4 +1,4 @@ -package gregtech.common.render.newblocks; +package gregtech.common.render.blocks; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.EntityPlayer; @@ -9,6 +9,15 @@ import net.minecraft.world.IBlockAccess; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +/** + * Implement on simple blocks which have only 1 sprite on each side + * For simple behavior just implement on block class and override {@link IBlockIconProvider#getIcon(EnumFacing, int)} + * If you care about {@link BlockPos} or @{@link ItemStack}, you can override getIcon based on them + * + * @see gregtech.common.render.IIconRegister + * @see TextureAtlasSprite + * @see IBlockIconProvider + */ public interface IBlockIconProvider { @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/common/render/blocks/IBlockTextureProvider.java b/src/main/java/gregtech/common/render/blocks/IBlockTextureProvider.java new file mode 100644 index 00000000..3ecdcf07 --- /dev/null +++ b/src/main/java/gregtech/common/render/blocks/IBlockTextureProvider.java @@ -0,0 +1,30 @@ +package gregtech.common.render.blocks; + +import gregtech.api.interfaces.ITexture; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Implement on blocks which care about {@link BlockPos} or {@link ItemStack} AND + * have custom rendering behaviour defined in {@link ITexture}s + * + * @see ITexture + * @see gregtech.common.render.IIconRegister + * @see IBlockIconProvider + */ +public interface IBlockTextureProvider { + + + @SideOnly(Side.CLIENT) + ITexture[] getTexture(World world, BlockPos blockPos, IExtendedBlockState blockState, EnumFacing side); + + @SideOnly(Side.CLIENT) + ITexture[] getItemblockTexture(EntityPlayer player, ItemStack itemStack, EnumFacing side); + +} diff --git a/src/main/java/gregtech/common/render/GT_CapeRenderer.java b/src/main/java/gregtech/common/render/entity/GT_CapeRenderer.java similarity index 97% rename from src/main/java/gregtech/common/render/GT_CapeRenderer.java rename to src/main/java/gregtech/common/render/entity/GT_CapeRenderer.java index abc9bea0..39976872 100644 --- a/src/main/java/gregtech/common/render/GT_CapeRenderer.java +++ b/src/main/java/gregtech/common/render/entity/GT_CapeRenderer.java @@ -1,90 +1,90 @@ -package gregtech.common.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderPlayerEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Collection; - -@SideOnly(Side.CLIENT) -public class GT_CapeRenderer extends RenderPlayer { - - private final ResourceLocation[] mCapes = {new ResourceLocation("gregtech:textures/BrainTechCape.png"), new ResourceLocation("gregtech:textures/GregTechCape.png"), new ResourceLocation("gregtech:textures/MrBrainCape.png"), new ResourceLocation("gregtech:textures/GregoriusCape.png")}; - private final Collection mCapeList; - - public GT_CapeRenderer(Collection aCapeList) { - super(Minecraft.getMinecraft().getRenderManager()); - this.mCapeList = aCapeList; - } - - public void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) { - /*AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.getEntityPlayer(); - if (GT_Utility.getFullInvisibility(aPlayer)) { - aEvent.setCanceled(true); - return; - } - float aPartialTicks = aEvent.partialRenderTick; - if (aPlayer.isInvisible()) { - return; - } - if (GT_Utility.getPotion(aPlayer, Integer.valueOf(Potion.invisibility.id).intValue())) { - return; - } - try { - ResourceLocation tResource = null; - if (aPlayer.getDisplayName().equalsIgnoreCase("Friedi4321")) { - tResource = this.mCapes[0]; - } - if (this.mCapeList.contains(aPlayer.getDisplayName().toLowerCase())) { - tResource = this.mCapes[1]; - } - if (aPlayer.getDisplayName().equalsIgnoreCase("Mr_Brain")) { - tResource = this.mCapes[2]; - } - if (aPlayer.getDisplayName().equalsIgnoreCase("GregoriusT")) { - tResource = this.mCapes[3]; - } - if ((tResource != null) && (!aPlayer.getHideCape())) { - bindTexture(tResource); - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 0.0F, 0.125F); - double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks); - double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks); - double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks); - float f6 = aPlayer.prevRenderYawOffset + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks; - double d3 = MathHelper.sin(f6 * 3.141593F / 180.0F); - double d4 = -MathHelper.cos(f6 * 3.141593F / 180.0F); - float f7 = (float) d1 * 10.0F; - float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F; - float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F; - if (f7 < -6.0F) { - f7 = -6.0F; - } - if (f7 > 32.0F) { - f7 = 32.0F; - } - if (f8 < 0.0F) { - f8 = 0.0F; - } - float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks; - f7 += MathHelper.sin((aPlayer.prevDistanceWalkedModified + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F) * 32.0F * f10; - if (aPlayer.isSneaking()) { - f7 += 25.0F; - } - GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - ((ModelBiped) this.mainModel).renderCloak(0.0625F); - GL11.glPopMatrix(); - } - } catch (Throwable e) { - if (GT_Values.D1) { - e.printStackTrace(GT_Log.err); - } - }*/ - } -} +package gregtech.common.render.entity; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Collection; + +@SideOnly(Side.CLIENT) +public class GT_CapeRenderer extends RenderPlayer { + + private final ResourceLocation[] mCapes = {new ResourceLocation("gregtech:textures/BrainTechCape.png"), new ResourceLocation("gregtech:textures/GregTechCape.png"), new ResourceLocation("gregtech:textures/MrBrainCape.png"), new ResourceLocation("gregtech:textures/GregoriusCape.png")}; + private final Collection mCapeList; + + public GT_CapeRenderer(Collection aCapeList) { + super(Minecraft.getMinecraft().getRenderManager()); + this.mCapeList = aCapeList; + } + + public void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) { + /*AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.getEntityPlayer(); + if (GT_Utility.getFullInvisibility(aPlayer)) { + aEvent.setCanceled(true); + return; + } + float aPartialTicks = aEvent.partialRenderTick; + if (aPlayer.isInvisible()) { + return; + } + if (GT_Utility.getPotion(aPlayer, Integer.valueOf(Potion.invisibility.id).intValue())) { + return; + } + try { + ResourceLocation tResource = null; + if (aPlayer.getDisplayName().equalsIgnoreCase("Friedi4321")) { + tResource = this.mCapes[0]; + } + if (this.mCapeList.contains(aPlayer.getDisplayName().toLowerCase())) { + tResource = this.mCapes[1]; + } + if (aPlayer.getDisplayName().equalsIgnoreCase("Mr_Brain")) { + tResource = this.mCapes[2]; + } + if (aPlayer.getDisplayName().equalsIgnoreCase("GregoriusT")) { + tResource = this.mCapes[3]; + } + if ((tResource != null) && (!aPlayer.getHideCape())) { + bindTexture(tResource); + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 0.0F, 0.125F); + double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks); + double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks); + double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks); + float f6 = aPlayer.prevRenderYawOffset + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks; + double d3 = MathHelper.sin(f6 * 3.141593F / 180.0F); + double d4 = -MathHelper.cos(f6 * 3.141593F / 180.0F); + float f7 = (float) d1 * 10.0F; + float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F; + float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F; + if (f7 < -6.0F) { + f7 = -6.0F; + } + if (f7 > 32.0F) { + f7 = 32.0F; + } + if (f8 < 0.0F) { + f8 = 0.0F; + } + float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks; + f7 += MathHelper.sin((aPlayer.prevDistanceWalkedModified + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F) * 32.0F * f10; + if (aPlayer.isSneaking()) { + f7 += 25.0F; + } + GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + ((ModelBiped) this.mainModel).renderCloak(0.0625F); + GL11.glPopMatrix(); + } + } catch (Throwable e) { + if (GT_Values.D1) { + e.printStackTrace(GT_Log.err); + } + }*/ + } +} diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java b/src/main/java/gregtech/common/render/entity/GT_Renderer_Entity_Arrow.java similarity index 94% rename from src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java rename to src/main/java/gregtech/common/render/entity/GT_Renderer_Entity_Arrow.java index 929cd94d..c5bbd504 100644 --- a/src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java +++ b/src/main/java/gregtech/common/render/entity/GT_Renderer_Entity_Arrow.java @@ -1,28 +1,28 @@ -package gregtech.common.render; - -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraftforge.fml.client.registry.RenderingRegistry; -import net.minecraft.client.renderer.entity.RenderArrow; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GT_Renderer_Entity_Arrow extends RenderArrow { - - private final ResourceLocation mTexture; - - public GT_Renderer_Entity_Arrow(Class aArrowClass, String aTextureName, RenderManager renderManager) { - super(renderManager); - this.mTexture = new ResourceLocation("gregtech:textures/entity/" + aTextureName + ".png"); - RenderingRegistry.registerEntityRenderingHandler(aArrowClass, this); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.mTexture; - } - -} +package gregtech.common.render.entity; + +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraft.client.renderer.entity.RenderArrow; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GT_Renderer_Entity_Arrow extends RenderArrow { + + private final ResourceLocation mTexture; + + public GT_Renderer_Entity_Arrow(Class aArrowClass, String aTextureName, RenderManager renderManager) { + super(renderManager); + this.mTexture = new ResourceLocation("gregtech:textures/entity/" + aTextureName + ".png"); + RenderingRegistry.registerEntityRenderingHandler(aArrowClass, this); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return this.mTexture; + } + +} diff --git a/src/main/java/gregtech/common/render/newitems/IItemIconContainerProvider.java b/src/main/java/gregtech/common/render/items/IItemIconContainerProvider.java similarity index 83% rename from src/main/java/gregtech/common/render/newitems/IItemIconContainerProvider.java rename to src/main/java/gregtech/common/render/items/IItemIconContainerProvider.java index a1f40098..7343c666 100644 --- a/src/main/java/gregtech/common/render/newitems/IItemIconContainerProvider.java +++ b/src/main/java/gregtech/common/render/items/IItemIconContainerProvider.java @@ -1,4 +1,4 @@ -package gregtech.common.render.newitems; +package gregtech.common.render.items; import gregtech.api.interfaces.IIconContainer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -6,6 +6,12 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +/** + * Simple multilayer implementation of {@link IItemIconProvider} for {@link IIconContainer} icons + * + * @see IIconContainer + * @see IItemIconProvider + */ @SideOnly(Side.CLIENT) public interface IItemIconContainerProvider extends IItemIconProvider { diff --git a/src/main/java/gregtech/common/render/items/IItemIconProvider.java b/src/main/java/gregtech/common/render/items/IItemIconProvider.java new file mode 100644 index 00000000..a28caf82 --- /dev/null +++ b/src/main/java/gregtech/common/render/items/IItemIconProvider.java @@ -0,0 +1,43 @@ +package gregtech.common.render.items; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Implement on items which need either simple or advanced rendering + * If you need simple behavior, implement {@link IItemIconProvider#getIcon(ItemStack, int)} + * + * If you need multilayer, you can override {@link IItemIconProvider#getRenderPasses(ItemStack)} + * If you need handheld item, return true in {@link IItemIconProvider#isHandheld(ItemStack)} + * + * @see gregtech.common.render.IIconRegister + * @see TextureAtlasSprite + * @see IItemIconContainerProvider + */ +public interface IItemIconProvider { + + @SideOnly(Side.CLIENT) + TextureAtlasSprite getIcon(ItemStack stack, int pass); + + /** + * Returns amount of additional render passes needed for item + * @param stack item stack + * @return 0 if dont need multilayer rendering, amount of layers otherwise + */ + @SideOnly(Side.CLIENT) + default int getRenderPasses(ItemStack stack) { + return 0; + } + + /** + * @param stack item stack + * @return true in item is handheld + */ + @SideOnly(Side.CLIENT) + default boolean isHandheld(ItemStack stack) { + return false; + } + +} diff --git a/src/main/java/gregtech/common/render/newblocks/ITextureBlockIconProvider.java b/src/main/java/gregtech/common/render/newblocks/ITextureBlockIconProvider.java deleted file mode 100644 index 9f993111..00000000 --- a/src/main/java/gregtech/common/render/newblocks/ITextureBlockIconProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package gregtech.common.render.newblocks; - -import gregtech.api.interfaces.ITexture; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.property.IExtendedBlockState; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public interface ITextureBlockIconProvider { - - @SideOnly(Side.CLIENT) - public ITexture[] getTexture(World world, BlockPos blockPos, IExtendedBlockState blockState, EnumFacing side); - - @SideOnly(Side.CLIENT) - public ITexture[] getItemblockTexture(EntityPlayer player, ItemStack itemStack, EnumFacing side); - -} diff --git a/src/main/java/gregtech/common/render/newblocks/RenderUtil.java b/src/main/java/gregtech/common/render/newblocks/RenderUtil.java deleted file mode 100644 index dfb353d5..00000000 --- a/src/main/java/gregtech/common/render/newblocks/RenderUtil.java +++ /dev/null @@ -1,169 +0,0 @@ -package gregtech.common.render.newblocks; - -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.VertexFormat; -import net.minecraft.util.EnumFacing; -import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderUtil { - - public static BakedQuad renderSide(VertexFormat vertexFormat, TextureAtlasSprite sprite, EnumFacing side, int tint, float offset, int color, boolean hideSiding) { - switch (side) { - case NORTH: - return buildQuad(vertexFormat, hideSiding ? null : EnumFacing.NORTH, sprite, tint, - 0, 0, -offset, sprite.getMaxU(), sprite.getMaxV(), - 0, 1, -offset, sprite.getMaxU(), sprite.getMinV(), - 1, 1, -offset, sprite.getMinU(), sprite.getMinV(), - 1, 0, -offset, sprite.getMinU(), sprite.getMaxV(), - color); - case SOUTH: - return buildQuad(vertexFormat, hideSiding ? null : EnumFacing.SOUTH, sprite, tint, - 1, 0, 1 + offset, sprite.getMinU(), sprite.getMaxV(), - 1, 1, 1 + offset, sprite.getMinU(), sprite.getMinV(), - 0, 1, 1 + offset, sprite.getMaxU(), sprite.getMinV(), - 0, 0, 1 + offset, sprite.getMaxU(), sprite.getMaxV(), - color); - case WEST: - return buildQuad(vertexFormat, hideSiding ? null : EnumFacing.WEST, sprite, tint, - -offset, 0, 1, sprite.getMaxU(), sprite.getMaxV(), - -offset, 1, 1 , sprite.getMaxU(), sprite.getMinV(), - -offset, 1, 0, sprite.getMinU(), sprite.getMinV(), - -offset, 0, 0, sprite.getMinU(), sprite.getMaxV(), - color); - case EAST: - return buildQuad(vertexFormat, hideSiding ? null : EnumFacing.EAST, sprite, tint, - 1 + offset, 0, 0, sprite.getMaxU(), sprite.getMaxV(), - 1 + offset, 1, 0 , sprite.getMaxU(), sprite.getMinV(), - 1 + offset, 1, 1, sprite.getMinU(), sprite.getMinV(), - 1 + offset, 0, 1, sprite.getMinU(), sprite.getMaxV(), - color); - case DOWN: - return buildQuad(vertexFormat, hideSiding ? null : EnumFacing.DOWN, sprite, tint, - 0, -offset, 0, sprite.getMinU(), sprite.getMinV(), - 1, -offset, 0, sprite.getMaxU(), sprite.getMinV(), - 1, -offset, 1, sprite.getMaxU(), sprite.getMaxV(), - 0, -offset, 1, sprite.getMinU(), sprite.getMaxV(), - color); - case UP: - return buildQuad(vertexFormat, hideSiding ? null : EnumFacing.UP, sprite, tint, - 0, 1 + offset, 1, sprite.getMinU(), sprite.getMaxV(), - 1, 1 + offset, 1, sprite.getMaxU(), sprite.getMaxV(), - 1, 1 + offset, 0, sprite.getMaxU(), sprite.getMinV(), - 0, 1 + offset, 0, sprite.getMinU(), sprite.getMinV(), - color); - - default: - System.out.println("Can't render side " + side); - throw new IllegalArgumentException(); - } - } - - public static BakedQuad renderQuadCustom(float x, float y, float z, float width, float height, VertexFormat vertexFormat, TextureAtlasSprite sprite, EnumFacing side, int tint, int color, boolean hide) { - //float spriteCut = Math.min((width + height) / 2.0F, 1.0F); TODO - switch (side) { - case NORTH: - return buildQuad(vertexFormat, EnumFacing.NORTH, sprite, tint, - x, y, z, sprite.getMaxU(), sprite.getMaxV(), - x, y + height, z, sprite.getMaxU(), sprite.getMinV(), - x + width, y + height, z, sprite.getMinU(), sprite.getMinV(), - x + width, y, z, sprite.getMinU(), sprite.getMaxV(), - color); - case SOUTH: - return buildQuad(vertexFormat, EnumFacing.SOUTH, sprite, tint, - x + width, y, z, sprite.getMinU(), sprite.getMaxV(), - x + width, y + height, z, sprite.getMinU(), sprite.getMinV(), - x, y + height, z, sprite.getMaxU(), sprite.getMinV(), - x, y, z, sprite.getMaxU(), sprite.getMaxV(), - color); - case WEST: - return buildQuad(vertexFormat, EnumFacing.WEST, sprite, tint, - x, y, z + height, sprite.getMaxU(), sprite.getMaxV(), - x, y + width, z + height, sprite.getMaxU(), sprite.getMinV(), - x, y + width, z, sprite.getMinU(), sprite.getMinV(), - x, y, z, sprite.getMinU(), sprite.getMaxV(), - color); - case EAST: - return buildQuad(vertexFormat, EnumFacing.EAST, sprite, tint, - x, y, z, sprite.getMaxU(), sprite.getMaxV(), - x, y + width, z, sprite.getMaxU(), sprite.getMinV(), - x, y + width, z + height, sprite.getMinU(), sprite.getMinV(), - x, y, z + height, sprite.getMinU(), sprite.getMaxV(), - color); - case DOWN: - return buildQuad(vertexFormat, EnumFacing.DOWN, sprite, tint, - x, y, z, sprite.getMinU(), sprite.getMinV(), - x + width, y, z, sprite.getMaxU(), sprite.getMinV(), - x + width, y, z + height, sprite.getMaxU(), sprite.getMaxV(), - x, y, z + height, sprite.getMinU(), sprite.getMaxV(), - color); - case UP: - return buildQuad(vertexFormat, hide ? null : EnumFacing.UP, sprite, tint, - x, y, z + height, sprite.getMinU(), sprite.getMaxV(), - x + width, y, z + height, sprite.getMaxU(), sprite.getMaxV(), - x + width, y, z, sprite.getMaxU(), sprite.getMinV(), - x, y, z, sprite.getMinU(), sprite.getMinV(), - color); - - default: - System.out.println("Can't render side " + side); - return null; - } - } - - private static BakedQuad buildQuad( - VertexFormat format, EnumFacing side, TextureAtlasSprite sprite, int tint, - float x0, float y0, float z0, float u0, float v0, - float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, int color) - { - UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format); - builder.setQuadTint(tint); - builder.setQuadOrientation(side); - builder.setTexture(sprite); - - putVertex(builder, format, side, x0, y0, z0, u0, v0, color); - putVertex(builder, format, side, x1, y1, z1, u1, v1, color); - putVertex(builder, format, side, x2, y2, z2, u2, v2, color); - putVertex(builder, format, side, x3, y3, z3, u3, v3, color); - return builder.build(); - } - - private static void putVertex(UnpackedBakedQuad.Builder builder, VertexFormat format, EnumFacing side, float x, float y, float z, float u, float v, int color) { - for(int e = 0; e < format.getElementCount(); e++) - { - switch(format.getElement(e).getUsage()) - { - case POSITION: - builder.put(e, x, y, z, 1); - break; - case COLOR: - if(color == -1) { - builder.put(e, 1f, 1f, 1f, 1f); - } else { - builder.put(e, - ((color >> 16) & 0xFF) / 255.0F, - ((color >> 8) & 0xFF) / 255.0F, - ((color) & 0xFF) / 255.0F, 1f); - } - break; - case UV: if(format.getElement(e).getIndex() == 0) - { - builder.put(e, u, v, 0f, 1f); - break; - } - case NORMAL: - builder.put(e, 0.0F, 0.0F, 1.0F, 0.0F); - break; - default: - builder.put(e); - break; - } - } - } - -} diff --git a/src/main/java/gregtech/common/render/newitems/IItemIconProvider.java b/src/main/java/gregtech/common/render/newitems/IItemIconProvider.java deleted file mode 100644 index 6b6cfce1..00000000 --- a/src/main/java/gregtech/common/render/newitems/IItemIconProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.common.render.newitems; - -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public interface IItemIconProvider { - - @SideOnly(Side.CLIENT) - TextureAtlasSprite getIcon(ItemStack stack, int pass); - - @SideOnly(Side.CLIENT) - default int getRenderPasses(ItemStack stack) { - return 0; - } - - @SideOnly(Side.CLIENT) - default boolean isHandheld(ItemStack stack) { - return false; - } - -}