diff --git a/src/main/java/dan200/computercraft/client/proxy/CCTurtleProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/CCTurtleProxyClient.java index cc6ce9f4e..9a1e686a0 100644 --- a/src/main/java/dan200/computercraft/client/proxy/CCTurtleProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/CCTurtleProxyClient.java @@ -13,16 +13,19 @@ import dan200.computercraft.client.render.TurtleSmartItemModel; import dan200.computercraft.shared.proxy.CCTurtleProxyCommon; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.core.TurtleBrain; +import dan200.computercraft.shared.turtle.items.ItemTurtleBase; +import dan200.computercraft.shared.util.Colour; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.SimpleReloadableResourceManager; -import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -32,12 +35,9 @@ import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import java.io.IOException; - public class CCTurtleProxyClient extends CCTurtleProxyCommon { public CCTurtleProxyClient() @@ -65,16 +65,19 @@ public class CCTurtleProxyClient extends CCTurtleProxyCommon String[] turtleModelNames = new String[] { "turtle_dynamic", "CC-Turtle", "CC-TurtleAdvanced", - "turtle_black", "turtle_red", "turtle_green", "turtle_brown", - "turtle_blue", "turtle_purple", "turtle_cyan", "turtle_lightGrey", - "turtle_grey", "turtle_pink", "turtle_lime", "turtle_yellow", - "turtle_lightBlue", "turtle_magenta", "turtle_orange", "turtle_white", + "turtle_white", "turtle_elf_overlay" }; registerItemModel( ComputerCraft.Blocks.turtle, turtleMeshDefinition, turtleModelNames ); registerItemModel( ComputerCraft.Blocks.turtleExpanded, turtleMeshDefinition, turtleModelNames ); registerItemModel( ComputerCraft.Blocks.turtleAdvanced, turtleMeshDefinition, turtleModelNames ); + // Setup turtle colours + Minecraft.getMinecraft().getItemColors().registerItemColorHandler( + new TurtleItemColour(), + ComputerCraft.Blocks.turtle, ComputerCraft.Blocks.turtleExpanded, ComputerCraft.Blocks.turtleAdvanced + ); + // Setup renderers ClientRegistry.bindTileEntitySpecialRenderer( TileTurtle.class, new TileEntityTurtleRenderer() ); @@ -181,4 +184,20 @@ public class CCTurtleProxyClient extends CCTurtleProxyCommon ); } } + + private static class TurtleItemColour implements IItemColor + { + @Override + public int getColorFromItemstack( ItemStack stack, int tintIndex ) + { + if( tintIndex == 0 ) + { + ItemTurtleBase turtle = (ItemTurtleBase) stack.getItem(); + Colour colour = turtle.getColour( stack ); + if( colour != null ) return colour.getHex(); + } + + return 0xFFFFFF; + } + } } diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java index af374f41e..5983f59b4 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java @@ -22,47 +22,33 @@ import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelManager; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.entity.Entity; -import net.minecraft.util.*; -import net.minecraft.util.math.*; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.model.pipeline.LightUtil; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import javax.vecmath.Matrix4f; -import java.util.Iterator; import java.util.List; public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer { private static ModelResourceLocation NORMAL_TURTLE_MODEL = new ModelResourceLocation( "computercraft:CC-Turtle", "inventory" ); private static ModelResourceLocation ADVANCED_TURTLE_MODEL = new ModelResourceLocation( "computercraft:CC-TurtleAdvanced", "inventory" ); - private static ModelResourceLocation[] COLOUR_TURTLE_MODELS = new ModelResourceLocation[] { - new ModelResourceLocation( "computercraft:turtle_black", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_red", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_green", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_brown", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_blue", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_purple", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_cyan", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_lightGrey", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_grey", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_pink", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_lime", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_yellow", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_lightBlue", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_magenta", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_orange", "inventory" ), - new ModelResourceLocation( "computercraft:turtle_white", "inventory" ), - }; + private static ModelResourceLocation COLOUR_TURTLE_MODEL = new ModelResourceLocation( "computercraft:turtle_white", "inventory" ); private static ModelResourceLocation BEGINNER_TURTLE_MODEL = new ModelResourceLocation( "computercraftedu:CC-TurtleJunior", "inventory" ); private static ModelResourceLocation[] BEGINNER_TURTLE_COLOUR_MODELS = new ModelResourceLocation[] { new ModelResourceLocation( "computercraftedu:turtleJunior_black", "inventory" ), @@ -115,38 +101,11 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer quads, int[] tints ) { - int color = 0xFFFFFFFF; - Iterator it = quads.iterator(); VertexBuffer buffer = tessellator.getBuffer(); VertexFormat format = DefaultVertexFormats.ITEM; buffer.begin( GL11.GL_QUADS, format ); - while( it.hasNext() ) + for (BakedQuad quad : quads) { - BakedQuad quad = (BakedQuad)it.next(); VertexFormat quadFormat = quad.getFormat(); if( quadFormat != format ) { @@ -322,7 +279,15 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer= 0 && index < tints.length ) colour = tints[ index ] | 0xFF000000; + } + + LightUtil.renderQuadColor( buffer, quad, colour ); } tessellator.draw(); } diff --git a/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java b/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java index 57538bb5f..f61dbba3a 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java +++ b/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java @@ -1,21 +1,18 @@ package dan200.computercraft.client.render; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.block.model.*; +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.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; -import net.minecraft.world.World; import javax.vecmath.Matrix4f; import javax.vecmath.Point3f; import java.util.ArrayList; -import java.util.Dictionary; import java.util.List; public class TurtleMultiModel implements IBakedModel @@ -49,7 +46,7 @@ public class TurtleMultiModel implements IBakedModel { if( m_faceQuads[ side.ordinal() ] == null ) { - List quads = new ArrayList(); + ArrayList quads = new ArrayList(); if( m_overlayModel != null ) { quads.addAll( m_overlayModel.getQuads( state, side, rand ) ); @@ -62,6 +59,7 @@ public class TurtleMultiModel implements IBakedModel { quads.addAll( transformQuads( m_rightUpgradeModel.getQuads( state, side, rand ), m_rightUpgradeTransform ) ); } + quads.trimToSize(); m_faceQuads[ side.ordinal() ] = quads; } return m_faceQuads[ side.ordinal() ]; @@ -70,20 +68,22 @@ public class TurtleMultiModel implements IBakedModel { if( m_generalQuads == null ) { - m_generalQuads = new ArrayList(); - m_generalQuads.addAll( m_baseModel.getQuads( state, side, rand ) ); + ArrayList quads = new ArrayList(); + quads.addAll( m_baseModel.getQuads( state, side, rand ) ); if( m_overlayModel != null ) { - m_generalQuads.addAll( m_overlayModel.getQuads( state, side, rand ) ); + quads.addAll( m_overlayModel.getQuads( state, side, rand ) ); } if( m_leftUpgradeModel != null ) { - m_generalQuads.addAll( transformQuads( m_leftUpgradeModel.getQuads( state, side, rand ), m_leftUpgradeTransform ) ); + quads.addAll( transformQuads( m_leftUpgradeModel.getQuads( state, side, rand ), m_leftUpgradeTransform ) ); } if( m_rightUpgradeModel != null ) { - m_generalQuads.addAll( transformQuads( m_rightUpgradeModel.getQuads( state, side, rand ), m_rightUpgradeTransform ) ); + quads.addAll( transformQuads( m_rightUpgradeModel.getQuads( state, side, rand ), m_rightUpgradeTransform ) ); } + quads.trimToSize(); + m_generalQuads = quads; } return m_generalQuads; } @@ -147,7 +147,7 @@ public class TurtleMultiModel implements IBakedModel { int[] vertexData = quad.getVertexData().clone(); int offset = 0; - BakedQuad copy = new BakedQuad( vertexData, quad.getTintIndex(), quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting(), quad.getFormat() ); + BakedQuad copy = new BakedQuad( vertexData, -1, quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting(), quad.getFormat() ); VertexFormat format = copy.getFormat(); for( int i=0; i