Last active
August 29, 2015 14:25
-
-
Save Gliby/77a9d963b2ae3072f6cd to your computer and use it in GitHub Desktop.
OpenGL ItemRenderer for Minecraft Forge 1.8!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.ArrayList; | |
import java.util.List; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.item.Item; | |
import net.minecraftforge.client.event.ModelBakeEvent; | |
import net.minecraftforge.common.MinecraftForge; | |
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | |
import net.minecraftforge.fml.relauncher.Side; | |
import net.minecraftforge.fml.relauncher.SideOnly; | |
/** | |
* @author Gliby, contact@gliby.net | |
* | |
* Manages raw item renderer's. | |
*/ | |
@SideOnly(Side.CLIENT) | |
public class ItemRendererManager { | |
/** | |
* Should be created on FMLInitializationEvent event, everything takes care | |
* of it's self. | |
*/ | |
public ItemRendererManager() { | |
MinecraftForge.EVENT_BUS.register(this); | |
} | |
List<RawItemRenderer> itemRenderer = new ArrayList<RawItemRenderer>(); | |
public void registerItemRenderer(RawItem item, RawItemRenderer itemRender) { | |
this.itemRenderer.add(itemRender); | |
item.setRenderer(itemRender); | |
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, itemRender.resourceLocation); | |
} | |
@SubscribeEvent | |
public void bakeModel(ModelBakeEvent event) { | |
for (int i = 0; i < itemRenderer.size(); i++) { | |
RawItemRenderer itemRender = itemRenderer.get(i); | |
event.modelRegistry.putObject(itemRender.resourceLocation, itemRender); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import net.gliby.physics.Physics; | |
import net.gliby.physics.client.render.entity.RenderPhysicsBlock; | |
import net.gliby.physics.client.render.entity.RenderPhysicsModelPart; | |
import net.gliby.physics.client.render.entity.RenderPhysicsRagdoll; | |
import net.gliby.physics.client.render.items.RenderItemPhysicsGun; | |
import net.gliby.physics.client.render.player.RenderAdditionalPlayer; | |
import net.gliby.physics.client.render.world.RenderAdditionalWorld; | |
import net.gliby.physics.common.entity.EntityPhysicsBlock; | |
import net.gliby.physics.common.entity.EntityPhysicsModelPart; | |
import net.gliby.physics.common.entity.EntityPhysicsRagdoll; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.renderer.block.model.ItemCameraTransforms; | |
import net.minecraft.client.renderer.entity.RenderItem; | |
import net.minecraft.client.resources.model.ModelResourceLocation; | |
import net.minecraftforge.common.MinecraftForge; | |
import net.minecraftforge.fml.client.registry.RenderingRegistry; | |
import net.minecraftforge.fml.common.event.FMLInitializationEvent; | |
/** | |
* This isn't an actual @Mod class, just an example. THIS ACTUAL CLASS IS NOT MEANT TO COMPILE! | |
*/ | |
public class Mod { | |
/** | |
* Called on Forge's init event, found inside @Mod interface. | |
* | |
* @param event | |
*/ | |
@EventHandler | |
public void eventInit(FMLInitializationEvent event) { | |
ItemRendererManager itemRenderManager = new ItemRendererManager(); | |
//Create fake-model resource, doesn't need any file to function. | |
ModelResourceLocation modelID = new ModelResourceLocation(Physics.MOD_ID, "physicsgun"); | |
//Create actual RawItemRenderer instance, simply a class that "extends RawItemRenderer". | |
RenderItemPhysicsGun renderRawPhysicsGun = new RenderItemPhysicsGun(modelID); | |
//Register and bind to raw item! | |
itemRenderManager.registerItemRenderer(Physics.itemPhysicsGun, renderRawPhysicsGun); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RawItemRenderer; | |
import net.minecraft.entity.Entity; | |
import net.minecraft.entity.player.EntityPlayer; | |
import net.minecraft.item.Item; | |
import net.minecraft.item.ItemStack; | |
import net.minecraft.world.World; | |
import net.minecraftforge.fml.relauncher.Side; | |
import net.minecraftforge.fml.relauncher.SideOnly; | |
/** | |
* | |
* @author Gliby, contact@gliby.net | |
* | |
*/ | |
public abstract class RawItem extends Item { | |
@SideOnly(Side.CLIENT) | |
public RawItemRenderer renderer; | |
@SideOnly(Side.CLIENT) | |
public net.minecraft.client.resources.model.ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { | |
this.renderer.setOwner(player); | |
return super.getModel(stack, player, useRemaining); | |
} | |
/** | |
* @param itemRender | |
*/ | |
public void setRenderer(RawItemRenderer itemRender) { | |
this.renderer = itemRender; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Collections; | |
import java.util.List; | |
import javax.vecmath.Matrix4f; | |
import org.apache.commons.lang3.tuple.Pair; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.entity.AbstractClientPlayer; | |
import net.minecraft.client.entity.EntityPlayerSP; | |
import net.minecraft.client.model.ModelBiped; | |
import net.minecraft.client.renderer.GlStateManager; | |
import net.minecraft.client.renderer.Tessellator; | |
import net.minecraft.client.renderer.WorldRenderer; | |
import net.minecraft.client.renderer.block.model.ItemCameraTransforms; | |
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; | |
import net.minecraft.client.renderer.entity.RenderItem; | |
import net.minecraft.client.renderer.texture.TextureAtlasSprite; | |
import net.minecraft.client.renderer.texture.TextureManager; | |
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; | |
import net.minecraft.client.renderer.vertex.VertexFormat; | |
import net.minecraft.client.resources.model.IBakedModel; | |
import net.minecraft.client.resources.model.ModelResourceLocation; | |
import net.minecraft.entity.Entity; | |
import net.minecraft.entity.player.EntityPlayer; | |
import net.minecraft.item.ItemStack; | |
import net.minecraft.util.EnumFacing; | |
import net.minecraft.util.MathHelper; | |
import net.minecraftforge.client.ForgeHooksClient; | |
import net.minecraftforge.client.model.IFlexibleBakedModel; | |
import net.minecraftforge.client.model.IPerspectiveAwareModel; | |
import net.minecraftforge.client.model.ISmartItemModel; | |
/** | |
* Based on iChunUtil's own item renderer, but with a some of my own spice. | |
* # Usage: | |
* # Simply extend this class, then register with ItemRendererManager! | |
*/ | |
public abstract class RawItemRenderer implements ISmartItemModel, IPerspectiveAwareModel, IFlexibleBakedModel { | |
protected EntityPlayer owner; | |
protected TextureManager textureManager; | |
public ModelResourceLocation resourceLocation; | |
private Pair<IBakedModel, Matrix4f> pair; | |
protected ModelBiped playerBiped = new ModelBiped(); | |
protected Minecraft mc; | |
public RawItemRenderer(ModelResourceLocation resourceLocation) { | |
this.mc = Minecraft.getMinecraft(); | |
this.textureManager = mc.getTextureManager(); | |
this.resourceLocation = resourceLocation; | |
this.pair = Pair.of((IBakedModel) this, null); | |
this.playerBiped = new ModelBiped(); | |
this.playerBiped.textureWidth = 64; | |
this.playerBiped.textureHeight = 64; | |
} | |
public abstract void render(); | |
@Override | |
public final List getGeneralQuads() { | |
// Method that this get's called in, is using startDrawingQuads. We | |
// finish | |
// drawing it so we can move on to render our own thing. | |
Tessellator tessellator = Tessellator.getInstance(); | |
WorldRenderer worldrenderer = tessellator.getWorldRenderer(); | |
tessellator.draw(); | |
GlStateManager.pushMatrix(); | |
GlStateManager.translate(0.5F, 0.5F, 0.5F); | |
GlStateManager.scale(-1.0F, -1.0F, 1.0F); | |
if (owner != null) { | |
if (transformType == TransformType.THIRD_PERSON) { | |
if (owner.isSneaking()) GlStateManager.translate(0.0F, -0.2F, 0.0F); | |
} | |
} | |
if (onGround()) { | |
GlStateManager.scale(-3f, -3f, -3f); | |
} | |
render(); | |
GlStateManager.popMatrix(); | |
// Reset the dynamic values. | |
this.owner = null; | |
this.stack = null; | |
this.transformType = null; | |
// Method that this gets called is expecting that we are still using | |
// startDrawingQuads. | |
worldrenderer.startDrawingQuads(); | |
return Collections.EMPTY_LIST; | |
} | |
protected boolean onGround() { | |
return transformType == null; | |
} | |
@Override | |
public List getFaceQuads(EnumFacing p_177551_1_) { | |
return Collections.EMPTY_LIST; | |
} | |
@Override | |
public final boolean isAmbientOcclusion() { | |
return true; | |
} | |
@Override | |
public final boolean isGui3d() { | |
return true; | |
} | |
@Override | |
public final boolean isBuiltInRenderer() { | |
return false; | |
} | |
@Override | |
public final TextureAtlasSprite getTexture() { | |
return Minecraft.getMinecraft().getTextureMapBlocks().getMissingSprite(); | |
} | |
@Override | |
public abstract ItemCameraTransforms getItemCameraTransforms(); | |
protected ItemStack stack; | |
@Override | |
public IBakedModel handleItemState(ItemStack stack) { | |
this.stack = stack; | |
return this; | |
} | |
public void setOwner(EntityPlayer player) { | |
this.owner = player; | |
} | |
protected TransformType transformType; | |
@Override | |
public Pair<IBakedModel, Matrix4f> handlePerspective(TransformType cameraTransformType) { | |
this.transformType = cameraTransformType; | |
switch (cameraTransformType) { | |
case FIRST_PERSON: | |
RenderItem.applyVanillaTransform(getItemCameraTransforms().firstPerson); | |
break; | |
case GUI: | |
RenderItem.applyVanillaTransform(getItemCameraTransforms().gui); | |
break; | |
case HEAD: | |
RenderItem.applyVanillaTransform(getItemCameraTransforms().head); | |
break; | |
case THIRD_PERSON: | |
RenderItem.applyVanillaTransform(getItemCameraTransforms().thirdPerson); | |
break; | |
default: | |
break; | |
} | |
return pair; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment