package openmods.utils.render;
import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import java.util.EnumSet;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.entity.Entity;
import net.minecraft.world.World;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import openmods.block.OpenBlock;
import openmods.utils.ColorUtils.RGB;
import org.lwjgl.opengl.GL11;
public class RenderUtils {
private static final EnumSet<ForgeDirection> ALL_SIDES = EnumSet.allOf(ForgeDirection.class);
public static class FogColorUpdater {
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onFogColor(EntityViewRenderEvent.FogColors evt) {
fogRed = evt.red;
fogGreen = evt.green;
fogBlue = evt.blue;
}
}
private static float fogRed;
private static float fogGreen;
private static float fogBlue;
public static void setupBillboard(Entity rve) {
GL11.glRotatef(-rve.rotationYaw, 0, 1, 0);
GL11.glRotatef(rve.rotationPitch, 1, 0, 0);
}
/**
* Please! For the love of sanity. Do not store this instance ANYWHERE!
* If you set it to a TE or Entity, Please remove it after you're done!
* THANK YOU!
*
* @return Returns a world for rendering with
*/
public static World getRenderWorld() {
if (Minecraft.getMinecraft() != null) return Minecraft.getMinecraft().theWorld;
return null;
}
public static double interpolateValue(double current, double prev, float partialTickTime) {
return prev + partialTickTime * (current - prev);
}
public static float interpolateYaw(Entity e, float f) {
return e.prevRotationYaw + (e.rotationYaw - e.prevRotationYaw) * f;
}
public static float interpolatePitch(Entity e, float f) {
return e.prevRotationPitch + (e.rotationPitch - e.prevRotationPitch) * f;
}
public static void translateToPlayer(Entity e, float partialTickTime) {
GL11.glTranslated(
interpolateValue(e.posX, e.prevPosX, partialTickTime) - RenderManager.renderPosX,
interpolateValue(e.posY, e.prevPosY, partialTickTime) - RenderManager.renderPosY,
interpolateValue(e.posZ, e.prevPosZ, partialTickTime) - RenderManager.renderPosZ);
}
public static void translateToWorld(Entity e, float partialTickTime) {
GL11.glTranslated(
interpolateValue(e.posX, e.prevPosX, partialTickTime),
interpolateValue(e.posY, e.prevPosY, partialTickTime),
interpolateValue(e.posZ, e.prevPosZ, partialTickTime));
}
@Deprecated
public static void rotateFacesOnRenderer(OpenBlock block, ForgeDirection rotation, RenderBlocks renderer) {
// no longer valid
}
public static void resetFacesOnRenderer(RenderBlocks renderer) {
renderer.uvRotateBottom = 0;
renderer.uvRotateEast = 0;
renderer.uvRotateNorth = 0;
renderer.uvRotateSouth = 0;
renderer.uvRotateTop = 0;
renderer.uvRotateWest = 0;
renderer.flipTexture = false;
}
public static void renderInventoryBlock(RenderBlocks renderer, Block block, int metadata) {
renderInventoryBlock(renderer, block, metadata, 0xFFFFFFFF);
}
public static void renderInventoryBlock(RenderBlocks renderer, Block block, int metadata, int colorMultiplier) {
renderInventoryBlock(renderer, block, metadata, colorMultiplier, ALL_SIDES);
}
public static void renderInventoryBlock(RenderBlocks renderer, Block block, int metadata, int colorMultiplier, Set<ForgeDirection> enabledSides) {
block.setBlockBoundsForItemRender();
renderer.setRenderBoundsFromBlock(block);
renderInventoryBlockNoBounds(renderer, block, metadata, colorMultiplier, enabledSides);
}
public static void renderInventoryBlockNoBounds(RenderBlocks renderer, Block block, int metadata) {
renderInventoryBlockNoBounds(renderer, block, metadata, 0xFFFFFFFF);
}
public static void renderInventoryBlockNoBounds(RenderBlocks renderer, Block block, int metadata, int colorMultiplier) {
renderInventoryBlockNoBounds(renderer, block, metadata, colorMultiplier, ALL_SIDES);
}
public static void renderInventoryBlockNoBounds(RenderBlocks renderer, Block block, int metadata, int colorMultiplier, Set<ForgeDirection> enabledSides) {
if (enabledSides.isEmpty()) return;
Tessellator tessellator = Tessellator.instance;
float r;
float g;
float b;
if (colorMultiplier > -1) {
r = (colorMultiplier >> 16 & 255) / 255.0F;
g = (colorMultiplier >> 8 & 255) / 255.0F;
b = (colorMultiplier & 255) / 255.0F;
GL11.glColor4f(r, g, b, 1.0F);
}
// Learn to matrix, please push and pop :D -- NC
GL11.glPushMatrix();
GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
tessellator.startDrawingQuads();
if (enabledSides.contains(ForgeDirection.DOWN)) {
tessellator.setNormal(0.0F, -1.0F, 0.0F);
renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata));
}
if (enabledSides.contains(ForgeDirection.UP)) {
tessellator.setNormal(0.0F, 1.0F, 0.0F);
renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, metadata));
}
if (enabledSides.contains(ForgeDirection.SOUTH)) {
tessellator.setNormal(0.0F, 0.0F, -1.0F);
renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, metadata));
}
if (enabledSides.contains(ForgeDirection.NORTH)) {
tessellator.setNormal(0.0F, 0.0F, 1.0F);
renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, metadata));
}
if (enabledSides.contains(ForgeDirection.WEST)) {
tessellator.setNormal(-1.0F, 0.0F, 0.0F);
renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, metadata));
}
if (enabledSides.contains(ForgeDirection.EAST)) {
tessellator.setNormal(1.0F, 0.0F, 0.0F);
renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata));
}
tessellator.draw();
GL11.glPopMatrix();
}
public static void renderCube(Tessellator tes, double x1, double y1, double z1, double x2, double y2, double z2) {
tes.addVertex(x1, y1, z1);
tes.addVertex(x1, y2, z1);
tes.addVertex(x2, y2, z1);
tes.addVertex(x2, y1, z1);
tes.addVertex(x1, y1, z2);
tes.addVertex(x2, y1, z2);
tes.addVertex(x2, y2, z2);
tes.addVertex(x1, y2, z2);
tes.addVertex(x1, y1, z1);
tes.addVertex(x1, y1, z2);
tes.addVertex(x1, y2, z2);
tes.addVertex(x1, y2, z1);
tes.addVertex(x2, y1, z1);
tes.addVertex(x2, y2, z1);
tes.addVertex(x2, y2, z2);
tes.addVertex(x2, y1, z2);
tes.addVertex(x1, y1, z1);
tes.addVertex(x2, y1, z1);
tes.addVertex(x2, y1, z2);
tes.addVertex(x1, y1, z2);
tes.addVertex(x1, y2, z1);
tes.addVertex(x1, y2, z2);
tes.addVertex(x2, y2, z2);
tes.addVertex(x2, y2, z1);
}
public static void disableLightmap() {
OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GL11.glDisable(GL11.GL_TEXTURE_2D);
OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit);
}
public static void enableLightmap() {
OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GL11.glEnable(GL11.GL_TEXTURE_2D);
OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit);
}
public static RGB getFogColor() {
return new RGB(fogRed, fogGreen, fogBlue);
}
public static void registerFogUpdater() {
MinecraftForge.EVENT_BUS.register(new FogColorUpdater());
}
}