Skip to content

Instantly share code, notes, and snippets.

@Gliby
Last active August 29, 2015 14:25
Show Gist options
  • Save Gliby/77a9d963b2ae3072f6cd to your computer and use it in GitHub Desktop.
Save Gliby/77a9d963b2ae3072f6cd to your computer and use it in GitHub Desktop.
OpenGL ItemRenderer for Minecraft Forge 1.8!
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);
}
}
}
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);
}
}
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;
}
}
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