package mods.custom_flags.client.gui;
import cpw.mods.fml.common.network.PacketDispatcher;
import mods.custom_flags.CustomFlags;
import mods.custom_flags.client.gui.controls.GuiColourPicker;
import mods.custom_flags.client.gui.controls.GuiSliderAlt;
import mods.custom_flags.client.gui.controls.GuiTextFieldAlt;
import mods.custom_flags.client.gui.controls.GuiToggleButton;
import mods.custom_flags.client.gui.controls.canvus_tools.*;
import mods.custom_flags.items.ItemFlag;
import mods.custom_flags.packet.UpdateHeldFlagImagePacket;
import mods.custom_flags.utils.ImageData;
import mods.custom_flags.utils.Utils;
import mods.custom_flags.utils.swing.ImageFileViewer;
import mods.custom_flags.utils.swing.ImageFilter;
import mods.custom_flags.utils.swing.ImagePreviewPanel;
import mods.custom_flags.utils.swing.ImageSplitDialog;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.DynamicTexture;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatAllowedCharacters;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import org.lwjgl.input.Cursor;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.IntBuffer;
import java.util.Arrays;
/**
* Created by Aaron on 3/08/13.
*/
public class GuiFlagDesigner extends GuiScreen{
private GuiColourPicker colourPicker;
private GuiToggleButton[] toggleButtons;
private ITool[] tools;
private ITool selectedTool;
private GuiSliderAlt slider;
private static final ResourceLocation map_background = new ResourceLocation("textures/map/map_background.png");
private static final ResourceLocation background = new ResourceLocation("custom_flags:textures/gui.designer.png");
private static final int ID_SAVE = 0;
private static final int ID_LOAD = 1;
private static final int ID_OK = 2;
private static final int ID_LOAD_SECTION = 3;
private static final int ID_COLOUR_PICKER = 4;
private static final int SLIDER = 5;
private int guiLeft, guiTop, xSize, ySize;
private static final int canvusMult = 5;
private static final int canvusSize = canvusMult * 32;
private static final DynamicTexture canvus_back = new DynamicTexture(2,2);
private static final DynamicTexture overlay = new DynamicTexture(ImageData.IMAGE_RES, ImageData.IMAGE_RES);
private GuiTextFieldAlt colourTextField;
private JFileChooser fc;
private EntityPlayer player;
private int[][] imageBuffer = new int[CustomFlags.BUFFER_SIZE][];
private int bufferPointer = 0;
private Cursor[] cursors;
int x_lpanel_width = 30;
int panel_space = 10;
int canvus_pad = 16;
int x_rpanel_width = 92;
int x_tpanel_width;
int x_tpanel_start;
int x_lpanel_start;
int x_canvus_start;
int x_rpanel_start;
int y_tpanel_height = 20 + 10;
int y_panel_space = 10;
int y_rpanel_height = canvusSize;
int y_lpanel_height = canvusSize;
int y_tpanel_start;
int y_lpanel_start;
int y_canvus_start;
int y_rpanel_start;
long last_refresh = System.currentTimeMillis() - 500;
static{
int[] pixels = canvus_back.func_110565_c();
pixels[0] = 0xFF666666;
pixels[1] = 0xFF999999;
pixels[2] = 0xFF999999;
pixels[3] = 0xFF666666;
}
private int toolIndex = 0;
public GuiFlagDesigner(EntityPlayer player) {
this.player = player;
fc = new JFileChooser() {
@Override
protected JDialog createDialog(Component parent) throws HeadlessException {
// intercept the dialog created by JFileChooser
JDialog dialog = super.createDialog(parent);
dialog.setModal(true); // set modality (or setModalityType)
dialog.setAlwaysOnTop(true);
return dialog;
}
};
fc.setFileFilter(new ImageFilter());
fc.setAcceptAllFileFilterUsed(false);
if(CustomFlags.FcLoadImages){
fc.setFileView(new ImageFileViewer());
ImagePreviewPanel preview = new ImagePreviewPanel();
fc.setAccessory(preview);
fc.addPropertyChangeListener(preview);
}
imageBuffer = new int[CustomFlags.BUFFER_SIZE][];
imageBuffer[bufferPointer] = new int[ImageData.IMAGE_RES * ImageData.IMAGE_RES];
ItemStack item = player.getHeldItem();
if(item != null && item.getItem() instanceof ItemFlag){
if(((ItemFlag) item.getItem()).hasImageData(item)){
ImageData image = new ImageData(((ItemFlag) item.getItem()).getImageData(item));
image.setTexture(imageBuffer[bufferPointer]);
}else{
ImageData.defaultImage.setTexture(imageBuffer[bufferPointer]);
}
}else{
ImageData.defaultImage.setTexture(imageBuffer[bufferPointer]);
}
}
@Override
protected void keyTyped(char par1, int par2) {
super.keyTyped(par1, par2);
int x = (Mouse.getEventX() * this.width / this.mc.displayWidth -90 -guiLeft)/canvusMult;
int y = (this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1 - 25- guiTop)/canvusMult;
if(colourTextField.textboxKeyTyped(par1, par2)){
if(colourTextField.getText().length() == 4){
colourPicker.selectColour(colourTextField.parseText());
//colourPicker.hasChanged = false;
}
}else if(Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)){
if(par2 == Keyboard.KEY_Z){
int prev = (bufferPointer+CustomFlags.BUFFER_SIZE-1) % CustomFlags.BUFFER_SIZE;
if(imageBuffer[prev]==null) {
Toolkit.getDefaultToolkit().beep();
}else{
bufferPointer = prev;
selectedTool.drawOverlay(x,y,imageBuffer[bufferPointer],overlay,ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
}else if (par2 == Keyboard.KEY_Y){
int next = (bufferPointer+1) % CustomFlags.BUFFER_SIZE;
if(imageBuffer[next] == null) {
Toolkit.getDefaultToolkit().beep();
}else{
bufferPointer = next;
selectedTool.drawOverlay(x,y,imageBuffer[bufferPointer],overlay,ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
}
}else if (selectedTool instanceof TextTool){
if(par1 == '\b'){
if(((TextTool) selectedTool).text.length() > 0){
((TextTool) selectedTool).text = ((TextTool) selectedTool).text.substring(0, ((TextTool) selectedTool).text.length() - 1);
}
} else if (par1 == '\n' || par1 == '\r'){
int next = (bufferPointer+1) % CustomFlags.BUFFER_SIZE;
imageBuffer[next] = Arrays.copyOf(imageBuffer[bufferPointer], ImageData.IMAGE_RES * ImageData.IMAGE_RES);
bufferPointer = next;
//Clear the next
imageBuffer[(bufferPointer+1) % CustomFlags.BUFFER_SIZE] = null;
((TextTool) selectedTool).pressEnter(imageBuffer[bufferPointer], ImageData.roundColour(colourPicker.getRGB()));
} else{
if(ChatAllowedCharacters.isAllowedCharacter(par1))
((TextTool) selectedTool).text += Character.toString(par1);
}
selectedTool.drawOverlay(x,y,imageBuffer[bufferPointer],overlay,ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
}
@Override
public void initGui() {
super.initGui();
this.buttonList.clear();
this.xSize = x_lpanel_width + panel_space + canvus_pad + canvusSize + canvus_pad + panel_space + x_rpanel_width;
this.ySize = y_tpanel_height + panel_space + canvus_pad + canvusSize + canvus_pad;
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - ySize) / 2;
x_lpanel_start = guiLeft;
x_canvus_start = x_lpanel_start + panel_space + canvus_pad + x_lpanel_width;
x_rpanel_start = x_canvus_start + canvusSize + canvus_pad + panel_space;
x_tpanel_start = guiLeft;
x_tpanel_width = xSize;
y_tpanel_start = guiTop;
y_lpanel_start = y_tpanel_start + y_tpanel_height + panel_space + canvus_pad;
y_canvus_start = y_lpanel_start;
y_rpanel_start = y_lpanel_start;
this.buttonList.add(new GuiButton(ID_OK, 6 + x_rpanel_start, y_rpanel_start + y_rpanel_height - 25, 80, 20, StatCollector.translateToLocal("button.ok")));
this.buttonList.add(new GuiButton(ID_SAVE, guiLeft + 5, guiTop + 5, 100, 20,StatCollector.translateToLocal( "button.save")));
this.buttonList.add(new GuiButton(ID_LOAD, guiLeft + 5+100+11, guiTop + 5, 100, 20, StatCollector.translateToLocal("button.load")));
this.buttonList.add(new GuiButton(ID_LOAD_SECTION, guiLeft + 5+200+22, guiTop + 5, 100, 20, StatCollector.translateToLocal("button.load.sections")));
colourPicker = new GuiColourPicker(ID_COLOUR_PICKER, x_rpanel_start+6, y_rpanel_start+5, 0xFF000000, 7);
this.buttonList.add(colourPicker);
tools = new ITool[6];
toggleButtons = new GuiToggleButton[tools.length];
tools[0] = new PenTool();
tools[1] = new RectangleTool();
tools[2] = new CircleTool();
tools[3] = new FloodFillTool();
// tools[4] = new EyeDropperTool();
tools[4] = new TextTool();
tools[5] = new EyeDropperTool();
cursors = new Cursor[tools.length+1];
cursors[0] = Mouse.getNativeCursor();
for(int i = 0; i < toggleButtons.length; i++){
toggleButtons[i] = new GuiToggleButton(10+ i, x_lpanel_start+5, y_lpanel_start +i*26 + 5, 20, 20, StatCollector.translateToLocal(tools[i].getToolName()), i==0, tools[i].getToolImage());
this.buttonList.add(toggleButtons[i]);
try{
int[] rgbs = TextureUtil.func_110986_a(Minecraft.getMinecraft().func_110442_L(), tools[i].getToolImage());
IntBuffer buffer = IntBuffer.wrap(rgbs);
int res = (int) Math.sqrt(buffer.array().length);
cursors[i+1] = new Cursor(res, res, i==1||i==2?res/2:0, i==1||i==2?res/2:0, 1, buffer, null);
}
catch(Exception e){
e.printStackTrace();
}
}
selectedTool = tools[0];
slider = new GuiSliderAlt(SLIDER, guiLeft, guiTop+25+5*22, 80, StatCollector.translateToLocal("gui.threshold"), 0, 0 , 64);
//this.buttonList.add(slider);
slider.enabled = false;
slider.drawButton = false;
colourTextField = new GuiTextFieldAlt(this.fontRenderer, x_rpanel_start + 10 , y_rpanel_start+91, 75, 20);
colourTextField.setText("F000");
colourTextField.setMaxStringLength(4);
colourTextField.setEnableBackgroundDrawing(false);
}
@Override
public void updateScreen() {
int x = (Mouse.getEventX() * this.width / this.mc.displayWidth -(x_canvus_start))/canvusMult;
int y = (this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1 - (y_canvus_start))/canvusMult;
try{
if(x >= 0 && x < ImageData.IMAGE_RES && y >= 0 && y < ImageData.IMAGE_RES){
Mouse.setNativeCursor(cursors[toolIndex+1]);
}else{
Mouse.setNativeCursor(cursors[0]);
}
}catch (Exception e){
e.printStackTrace();
}
if(selectedTool instanceof TextTool && (last_refresh + 500 < System.currentTimeMillis())){
last_refresh = System.currentTimeMillis();
selectedTool.drawOverlay(x,y,imageBuffer[bufferPointer],overlay,ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
super.updateScreen();
}
@Override
protected void mouseClicked(int par1, int par2, int par3) {
int x = (Mouse.getEventX() * this.width / this.mc.displayWidth -(x_canvus_start))/canvusMult;
int y = (this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1 - (y_canvus_start))/canvusMult;
if(x >= 0 && x < ImageData.IMAGE_RES && y >= 0 && y < ImageData.IMAGE_RES){
if(selectedTool instanceof EyeDropperTool){
colourPicker.selectColour(imageBuffer[bufferPointer][x+ImageData.IMAGE_RES*y]);
}else if (selectedTool instanceof RectangleTool){
((RectangleTool) selectedTool).last_x = x;
((RectangleTool) selectedTool).last_y = y;
}else if(selectedTool instanceof TextTool){
selectedTool.draw(x, y, imageBuffer[bufferPointer], ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}else{
int next = (bufferPointer+1) % CustomFlags.BUFFER_SIZE;
imageBuffer[next] = Arrays.copyOf(imageBuffer[bufferPointer], ImageData.IMAGE_RES * ImageData.IMAGE_RES);
bufferPointer = next;
//Clear the next
imageBuffer[(bufferPointer+1) % CustomFlags.BUFFER_SIZE] = null;
selectedTool.draw(x, y, imageBuffer[bufferPointer], ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
}else if (selectedTool instanceof RectangleTool){
((RectangleTool) selectedTool).last_x = -1000;
((RectangleTool) selectedTool).last_y = -1000;
}
super.mouseClicked(par1, par2, par3);
colourTextField.mouseClicked(par1, par2, par3);
}
@Override
public void handleMouseInput() {
super.handleMouseInput();
int x = (Mouse.getEventX() * this.width / this.mc.displayWidth -(x_canvus_start))/canvusMult;
int y = (this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1 - (y_canvus_start))/canvusMult;
if(! Mouse.getEventButtonState() && Mouse.getEventButton() == 0){
if(selectedTool instanceof RectangleTool){
int next = (bufferPointer+1) % CustomFlags.BUFFER_SIZE;
imageBuffer[next] = Arrays.copyOf(imageBuffer[bufferPointer], ImageData.IMAGE_RES * ImageData.IMAGE_RES);
bufferPointer = next;
//Clear the next
imageBuffer[(bufferPointer+1) % CustomFlags.BUFFER_SIZE] = null;
selectedTool.draw(x, y, imageBuffer[bufferPointer], ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
}
selectedTool.drawOverlay(x,y,imageBuffer[bufferPointer],overlay, ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
@Override
protected void mouseClickMove(int par1, int par2, int par3, long par4) {
super.mouseClickMove(par1, par2, par3, par4);
int x = (Mouse.getEventX() * this.width / this.mc.displayWidth -(x_canvus_start))/canvusMult;
int y = (this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1 - (y_canvus_start))/canvusMult;
if(Mouse.isButtonDown(0)){
if(selectedTool instanceof EyeDropperTool){
if (x > -1 && x < ImageData.IMAGE_RES && y > -1 && y < ImageData.IMAGE_RES){
colourPicker.selectColour(imageBuffer[bufferPointer][x+ImageData.IMAGE_RES*y]);
}
}else{
selectedTool.draw(x, y, imageBuffer[bufferPointer], ImageData.roundColour(colourPicker.getRGB()), Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT));
}
}
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
int[] overPixels = overlay.func_110565_c();
for(int i = 0; i < overPixels.length; i++){
overPixels[i] = 0x00000000;
}
try{
Mouse.setNativeCursor(cursors[0]);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* Draws the screen and all the components in it.
*/
public void drawScreen(int par1, int par2, float par3)
{
this.drawDefaultBackground();
mc.renderEngine.func_110577_a(map_background);
drawTexturedModalRect(x_canvus_start - canvus_pad, y_canvus_start - canvus_pad, canvusSize + 2 * canvus_pad, canvusSize + 2 * canvus_pad, 0, 0, 1, 1);
mc.renderEngine.func_110577_a(background);
//Draw Top Panel
drawTexturedModalRect(x_tpanel_start, y_tpanel_start, 0,0, x_tpanel_width/2, y_tpanel_height);
drawTexturedModalRect(x_tpanel_start+x_tpanel_width/2, y_tpanel_start, 0,30, x_tpanel_width/2, y_tpanel_height);
//drawRect(x_tpanel_start, y_tpanel_start, x_tpanel_start + x_tpanel_width, y_tpanel_start + y_tpanel_height, 0xFFAAAAAA);
//Draw Left Panel
drawTexturedModalRect(x_lpanel_start, y_lpanel_start, 0,60, x_lpanel_width, y_lpanel_height);
//drawRect(x_lpanel_start, y_lpanel_start, x_lpanel_start + x_lpanel_width, y_lpanel_start + y_lpanel_height, 0xFFAAAAAA);
//Draw Right Panel
drawTexturedModalRect(x_rpanel_start, y_rpanel_start, 30,60, x_rpanel_width, y_rpanel_height);
colourTextField.drawTextBox();
GL11.glColor3f(1,1,1);
//Draw Canvas
canvus_back.func_110564_a();
drawTexturedModalRect(x_canvus_start, y_canvus_start, canvusSize, canvusSize, 0, 0, 32, 32);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
overlay.func_110564_a();
drawTexturedModalRect(x_canvus_start, y_canvus_start, canvusSize, canvusSize, 0, 0, 1, 1);
GL11.glDisable(GL11.GL_BLEND);
super.drawScreen(par1, par2, par3);
if(colourPicker.hasChanged){
int rgb = colourPicker.getRGB();
StringBuffer sb = new StringBuffer();
sb.append(Integer.toHexString((rgb >> 28) & 0xF));
sb.append(Integer.toHexString((rgb >> 20) & 0xF));
sb.append(Integer.toHexString((rgb >> 12) & 0xF));
sb.append(Integer.toHexString((rgb >> 4) & 0xF));
colourTextField.setText(sb.toString());
colourPicker.hasChanged = false;
}
}
@Override
protected void actionPerformed(GuiButton par1GuiButton) {
super.actionPerformed(par1GuiButton);
if(par1GuiButton.id >=10 && par1GuiButton.id < 10+toggleButtons.length){
for(int i = 0; i < toggleButtons.length; i++){
toggleButtons[i].setToggle(i+10==par1GuiButton.id);
}
selectedTool = tools[par1GuiButton.id - 10];
toolIndex = par1GuiButton.id - 10;
slider.enabled = selectedTool instanceof FloodFillTool;
slider.drawButton = selectedTool instanceof FloodFillTool;
if(selectedTool instanceof TextTool){
((TextTool) selectedTool).text="";
((TextTool) selectedTool).click_x = -1000;
((TextTool) selectedTool).click_y = -1000;
}
}
switch (par1GuiButton.id){
case ID_OK:
ItemStack stack = player.getCurrentEquippedItem();
if(stack != null && stack.getItem() instanceof ItemFlag){
((ItemFlag) stack.getItem()).setImageData(stack, new ImageData(imageBuffer[bufferPointer], ImageData.IMAGE_RES, ImageData.IMAGE_RES).getByteArray(), player.worldObj);
PacketDispatcher.sendPacketToServer(UpdateHeldFlagImagePacket.generatePacket(player.username, stack));
this.keyTyped('c',1);
}
break;
case ID_SAVE:
if(fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION){
BufferedImage image = new BufferedImage(ImageData.IMAGE_RES, ImageData.IMAGE_RES, BufferedImage.TYPE_4BYTE_ABGR);
int[] pixels = imageBuffer[bufferPointer];
for(int x = 0; x < image.getWidth(); x++){
for(int y = 0; y < image.getHeight(); y++){
image.setRGB(x, y, pixels[x+ImageData.IMAGE_RES*y]);
}
}
try {
File f = fc.getSelectedFile();
if(Utils.getExtention(f.getName()) == null){
f = new File(f.getParentFile(), f.getName()+".png");
}
f.createNewFile();
ImageIO.write(image, "png", f);
} catch (Throwable e) {
e.printStackTrace();
}
}
break;
case ID_LOAD:
if(fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
try{
ImageData image = new ImageData(ImageIO.read(fc.getSelectedFile()), ImageData.IMAGE_RES, ImageData.IMAGE_RES);
image.setTexture(imageBuffer[bufferPointer]);
int next = (bufferPointer+1) % CustomFlags.BUFFER_SIZE;
imageBuffer[next] = Arrays.copyOf(imageBuffer[bufferPointer], ImageData.IMAGE_RES * ImageData.IMAGE_RES);
bufferPointer = next;
imageBuffer[(bufferPointer+1) % CustomFlags.BUFFER_SIZE] = null;
}catch (Exception e){
e.printStackTrace();
}
}
break;
case ID_LOAD_SECTION:
if(fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
try{
BufferedImage original = ImageIO.read(fc.getSelectedFile());
ImageSplitDialog dialog = new ImageSplitDialog(original);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
if(dialog.imageSection != null){
ImageData image = new ImageData(
dialog.imageSection,
ImageData.IMAGE_RES, ImageData.IMAGE_RES);
image.setTexture(imageBuffer[bufferPointer]);
int next = (bufferPointer+1) % CustomFlags.BUFFER_SIZE;
imageBuffer[next] = Arrays.copyOf(imageBuffer[bufferPointer], ImageData.IMAGE_RES * ImageData.IMAGE_RES);
bufferPointer = next;
imageBuffer[(bufferPointer+1) % CustomFlags.BUFFER_SIZE] = null;
}
dialog.dispose();
}catch (Exception e){
e.printStackTrace();
}
}
break;
case SLIDER:
((FloodFillTool)tools[1]).threshold = slider.getValue();
break;
}
}
public void drawTexturedModalRect(int x, int y, int width, int height, int tex_x, int tex_y, int tex_width, int tex_height)
{
float f = 1F;
float f1 = 1F;
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.addVertexWithUV((double)(x + 0), (double)(y + height), (double)this.zLevel, (double)((float)(tex_x + 0) * f), (double)((float)(tex_y + tex_height) * f1));
tessellator.addVertexWithUV((double)(x + width), (double)(y + height), (double)this.zLevel, (double)((float)(tex_x + tex_width) * f), (double)((float)(tex_y + tex_height) * f1));
tessellator.addVertexWithUV((double)(x + width), (double)(y + 0), (double)this.zLevel, (double)((float)(tex_x + tex_width) * f), (double)((float)(tex_y + 0) * f1));
tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)this.zLevel, (double)((float)(tex_x + 0) * f), (double)((float)(tex_y + 0) * f1));
tessellator.draw();
}
}