package com.carpentersblocks.renderer.helper; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class VertexHelper { public final static int TOP_LEFT = 0; public final static int BOTTOM_LEFT = 1; public final static int BOTTOM_RIGHT = 2; public final static int TOP_RIGHT = 3; public final static int SOUTHEAST = TOP_LEFT; public final static int NORTHEAST = BOTTOM_LEFT; public final static int NORTHWEST = BOTTOM_RIGHT; public final static int SOUTHWEST = TOP_RIGHT; public final static int TOP_CENTER = 4; public final static int BOTTOM_CENTER = 5; public final static int LEFT_CENTER = 6; public final static int RIGHT_CENTER = 7; private static boolean clearFloat = false; protected static boolean floatingIcon = false; private static int drawMode; /** Keeps track of vertices drawn per pass. */ public static int vertexCount = 0; /** Keeps track of vertex draws when in triangle mode. */ private static int triVertexCount = 0; /** * Offset used for faces. */ protected static double offset = 0.0D; /** * Sets draw mode internally. * <p> * This would ordinarily force a draw and prepare the {@link Tessellator} * with a new draw mode, but because alpha pass and ShadersModCore * have issues with {@link GL11#GL11_GL_TRIANGLES Triangles}, we'll use * a faux draw mode and transform {@link GL11#GL11_GL_TRIANGLES Triangles} * to {@link GL11#GL11_GL_QUADS Quads} instead in method {@link #setupVertex}. */ public static void startDrawing(int inDrawMode) { drawMode = inDrawMode; } /** * Gets floating icon flag. * <p> * Floating icons translate down on y-axis so top of icon * meets {@link RenderBlocks#renderMaxY}. * * @return <code>true</code> if icon is floating */ public static boolean hasFloatingIcon() { return floatingIcon; } /** * Temporarily sets floating icon flag for current face draw. * <p> * To keep it enabled, call {@link #setFloatingIconLock()} instead. */ public static void setFloatingIcon() { floatingIcon = clearFloat = true; } /** * Locks floating icon flag. */ public static void setFloatingIconLock() { floatingIcon = true; } /** * Clears floating icon flag. */ public static void clearFloatingIconLock() { floatingIcon = false; } /** * Sets offset for drawing face. */ public static void setOffset(double render_offset) { offset = render_offset; } /** * Clears offset. */ public static void clearOffset() { offset = 0.0D; } /** * Prepare helper for next face draw. */ public static void postRender() { if (clearFloat) { floatingIcon = clearFloat = false; } } /** * Adds vertex to Tessellator and increments draw count. */ public static void drawVertex(RenderBlocks renderBlocks, double x, double y, double z, double u, double v) { Tessellator.instance.addVertexWithUV(x, y, z, u, v); ++vertexCount; } /** * Applies brightness, color, and adds vertex through tessellator. * <p> * If {@link #drawMode} is {@link GL11#GL_TRIANGLES Triangles}, will automatically * duplicate the third vertex to form a {@link GL11#GL_QUADS Quad}. * * @param renderBlocks the {@link RenderBlocks} * @param x the x coordinate * @param y the y coordinate * @param z the z coordinate * @param u the texture coordinate x-offset * @param v the texture coordinate y-offset * @param vertex the vertex corner * @see {@link #startDrawing(int)} */ public static void setupVertex(RenderBlocks renderBlocks, double x, double y, double z, double u, double v, int vertex) { Tessellator tessellator = Tessellator.instance; if (renderBlocks != null && renderBlocks.enableAO) { switch(vertex) { case BOTTOM_CENTER: tessellator.setColorOpaque_F((renderBlocks.colorRedBottomLeft + renderBlocks.colorRedBottomRight) / 2.0F, (renderBlocks.colorGreenBottomLeft + renderBlocks.colorGreenBottomRight) / 2.0F, (renderBlocks.colorBlueBottomLeft + renderBlocks.colorBlueBottomRight) / 2.0F); tessellator.setBrightness(LightingHelper.getAverageBrightness(renderBlocks.brightnessBottomLeft, renderBlocks.brightnessBottomRight)); break; case TOP_CENTER: tessellator.setColorOpaque_F((renderBlocks.colorRedTopLeft + renderBlocks.colorRedTopRight) / 2.0F, (renderBlocks.colorGreenTopLeft + renderBlocks.colorGreenTopRight) / 2.0F, (renderBlocks.colorBlueTopLeft + renderBlocks.colorBlueTopRight) / 2); tessellator.setBrightness(LightingHelper.getAverageBrightness(renderBlocks.brightnessTopLeft, renderBlocks.brightnessTopRight)); break; case LEFT_CENTER: tessellator.setColorOpaque_F((renderBlocks.colorRedTopLeft + renderBlocks.colorRedBottomLeft) / 2.0F, (renderBlocks.colorGreenTopLeft + renderBlocks.colorGreenBottomLeft) / 2.0F, (renderBlocks.colorBlueTopLeft + renderBlocks.colorBlueBottomLeft) / 2.0F); tessellator.setBrightness(LightingHelper.getAverageBrightness(renderBlocks.brightnessTopLeft, renderBlocks.brightnessBottomLeft)); break; case RIGHT_CENTER: tessellator.setColorOpaque_F((renderBlocks.colorRedTopRight + renderBlocks.colorRedBottomRight) / 2.0F, (renderBlocks.colorGreenTopRight + renderBlocks.colorGreenBottomRight) / 2.0F, (renderBlocks.colorBlueTopRight + renderBlocks.colorBlueBottomRight) / 2); tessellator.setBrightness(LightingHelper.getAverageBrightness(renderBlocks.brightnessTopRight, renderBlocks.brightnessBottomRight)); break; case TOP_LEFT: tessellator.setColorOpaque_F(renderBlocks.colorRedTopLeft, renderBlocks.colorGreenTopLeft, renderBlocks.colorBlueTopLeft); tessellator.setBrightness(renderBlocks.brightnessTopLeft); break; case BOTTOM_LEFT: tessellator.setColorOpaque_F(renderBlocks.colorRedBottomLeft, renderBlocks.colorGreenBottomLeft, renderBlocks.colorBlueBottomLeft); tessellator.setBrightness(renderBlocks.brightnessBottomLeft); break; case BOTTOM_RIGHT: tessellator.setColorOpaque_F(renderBlocks.colorRedBottomRight, renderBlocks.colorGreenBottomRight, renderBlocks.colorBlueBottomRight); tessellator.setBrightness(renderBlocks.brightnessBottomRight); break; case TOP_RIGHT: tessellator.setColorOpaque_F(renderBlocks.colorRedTopRight, renderBlocks.colorGreenTopRight, renderBlocks.colorBlueTopRight); tessellator.setBrightness(renderBlocks.brightnessTopRight); break; } } drawVertex(renderBlocks, x, y, z, u, v); /* Alpha quad sorting and ShadersModeCore won't work with triangles, so make them a quad. */ if (drawMode == GL11.GL_TRIANGLES) { if (++triVertexCount > 2) { drawVertex(renderBlocks, x, y, z, u, v); triVertexCount = 0; } } } }