blob: f2f660e70cff45d3d1dafafa44ad5079121189a5 [file] [log] [blame] [raw]
package li.cil.oc.api.event;
import cpw.mods.fml.common.eventhandler.Cancelable;
import cpw.mods.fml.common.eventhandler.Event;
import li.cil.oc.api.component.RackMountable;
import li.cil.oc.api.internal.Rack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.ForgeDirection;
/**
* Fired to allow rendering a custom overlay for {@link li.cil.oc.api.component.RackMountable}s.
* </p>
* When this event is fired, the GL state is set up such that the origin is
* the top left corner of the mountable the event was fired for. It's the
* event handler's responsibility to not render outside the are of the
* mountable (unless that's explicitly what they're going for, of course).
*/
public abstract class RackMountableRenderEvent extends Event {
/**
* The rack that house the mountable this event is fired for.
*/
public final Rack rack;
/**
* The index of the mountable in the rack the event is fired for.
*/
public final int mountable;
/**
* Some additional data made available by the mountable. May be <tt>null</tt>.
*
* @see RackMountable#getData()
*/
public final NBTTagCompound data;
public RackMountableRenderEvent(Rack rack, int mountable, NBTTagCompound data) {
this.rack = rack;
this.mountable = mountable;
this.data = data;
}
/**
* Fired when the static rack model is rendered.
* <p/>
* Code here runs inside a <tt>ISimpleBlockRenderingHandler</tt>, so functionality
* is limited to what's possible in there. This is primarily meant to allow setting
* a custom override texture (<tt>renderer.setOverrideBlockTexture</tt>) for the
* mountables front.
* <p/>
* The bounds will be set up before this call, so you may adjust those, if you wish.
*/
@Cancelable
public static class Block extends RackMountableRenderEvent {
/**
* The front-facing side, i.e. where the mountable is visible on the rack.
*/
public final ForgeDirection side;
/**
* The renderer used for rendering the block.
*/
public final RenderBlocks renderer;
/**
* Texture to use for the front of the mountable.
*/
private IIcon frontTextureOverride;
public Block(final Rack rack, final int mountable, final NBTTagCompound data, final ForgeDirection side, final RenderBlocks renderer) {
super(rack, mountable, data);
this.side = side;
this.renderer = renderer;
}
/**
* The texture currently set to use for the front of the mountable, or <tt>null</tt>.
*/
public IIcon getFrontTextureOverride() {
return frontTextureOverride;
}
/**
* Set the texture to use for the front of the mountable.
*
* @param texture the texture to use.
*/
public void setFrontTextureOverride(final IIcon texture) {
frontTextureOverride = texture;
}
}
/**
* Fired when the dynamic rack model is rendered.
* <p/>
* Code here runs inside a <tt>TileEntitySpecialRenderer</tt>, so go nuts. This is
* primarily meant to allow rendering custom overlays, such as LEDs. The GL state
* will have been adjusted such that rendering a one by one quad starting at the
* origin will fill the full front face of the rack (i.e. rotation and translation
* have already been applied).
* <p/>
* If you wish to have something glowing (like LEDs), you'll have to disable
* lighting yourself (and enable it again afterwards!).
* <p/>
* Use the {@link #renderOverlay(ResourceLocation)} to render a slice from a
* texture in the vertical area occupied by the mountable.
*/
public static class TileEntity extends RackMountableRenderEvent {
/**
* The vertical low and high texture coordinates for the mountable's slot.
* <p/>
* This is purely for convenience; they're computed as <tt>(2/16)+i*(3/16)</tt>.
*/
public final float v0, v1;
public TileEntity(final Rack rack, final int mountable, final NBTTagCompound data, final float v0, final float v1) {
super(rack, mountable, data);
this.v0 = v0;
this.v1 = v1;
}
/**
* Utility method for rendering a texture as the front-side overlay.
*
* @param texture the texture to use to render the overlay.
*/
public void renderOverlay(final ResourceLocation texture) {
renderOverlay(texture, 0, 1);
}
/**
* Utility method for rendering a texture as the front-side overlay
* over a specified horizontal area.
*
* @param texture the texture to use to render the overlay.
* @param u0 the lower end of the vertical area to render at.
* @param u1 the upper end of the vertical area to render at.
*/
public void renderOverlay(final ResourceLocation texture, final float u0, final float u1) {
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
final Tessellator t = Tessellator.instance;
t.startDrawingQuads();
t.addVertexWithUV(u0, v1, 0, u0, v1);
t.addVertexWithUV(u1, v1, 0, u1, v1);
t.addVertexWithUV(u1, v0, 0, u1, v0);
t.addVertexWithUV(u0, v0, 0, u0, v0);
t.draw();
}
}
}