package shadersmod.client;

import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumType;
import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumUsage;

// related classes
// VertexFormatElement
// VertexFormat
// DefaultVertexFormats

public class SVertexFormat {

	public static final int vertexSizeBlock = 14;
	public static final int vertexSizeBlockVanilla = 7;
	public static final int vertexSizeItem = 13;
	public static final int vertexSizeItemVanilla = 7;
	
//    public static final SVertexElement NORMAL_3F = new SVertexElement(0, VertexFormatElement.EnumType.FLOAT, SVertexElementUsage.ENTITY, 3);
    public static final SVertexElement MIDUV_2F = new SVertexElement(0, VertexFormatElement.EnumType.FLOAT, SVertexElementUsage.MIDUV, 2);
    public static final SVertexElement TANGENT_4S = new SVertexElement(0, VertexFormatElement.EnumType.SHORT, SVertexElementUsage.TANGENT, 4);
    public static final SVertexElement ENTITY_4S = new SVertexElement(0, VertexFormatElement.EnumType.SHORT, SVertexElementUsage.ENTITY, 4);
    public static final SVertexElement PADDING_2S = new SVertexElement(0, VertexFormatElement.EnumType.SHORT, SVertexElementUsage.PADDING, 2);

	public static void onDefaultVertexFormatsClinit() {
        DefaultVertexFormats.BLOCK.clear();
        DefaultVertexFormats.BLOCK
        .addElement(DefaultVertexFormats.POSITION_3F)
        .addElement(DefaultVertexFormats.COLOR_4UB)
        .addElement(DefaultVertexFormats.TEX_2F)
        .addElement(DefaultVertexFormats.TEX_2S)
        .addElement(DefaultVertexFormats.NORMAL_3B)
        .addElement(DefaultVertexFormats.PADDING_1B)
        .addElement(MIDUV_2F)
        .addElement(TANGENT_4S)
        .addElement(ENTITY_4S);
        DefaultVertexFormats.ITEM.clear();
        DefaultVertexFormats.ITEM
	    .addElement(DefaultVertexFormats.POSITION_3F)
	    .addElement(DefaultVertexFormats.COLOR_4UB)
	    .addElement(DefaultVertexFormats.TEX_2F)
	    .addElement(PADDING_2S)
        .addElement(DefaultVertexFormats.NORMAL_3B)
        .addElement(DefaultVertexFormats.PADDING_1B)
        .addElement(MIDUV_2F)
        .addElement(TANGENT_4S)
        .addElement(ENTITY_4S);
        DefaultVertexFormats.OLDMODEL_POSITION_TEX_NORMAL
        .addElement(MIDUV_2F)
        .addElement(TANGENT_4S);
    }

	@SuppressWarnings("incomplete-switch")
	public static void onAddElement(VertexFormat vertexFormat, VertexFormatElement element) {
		if (element instanceof SVertexElement)
		{
			int offset = vertexFormat.getNextOffset();
			switch (((SVertexElement) element).getSVEUsage()) {
			case TANGENT:
				Dummy.put_vertexFormat_tangentElementOffset(vertexFormat, offset);
				break;
			case ENTITY:
				Dummy.put_vertexFormat_entityElementOffset(vertexFormat, offset);
				break;
			case MIDUV:
				Dummy.put_vertexFormat_miduvElementOffset(vertexFormat, offset);
				break;
			}
		}
	}

//	@SuppressWarnings("incomplete-switch")
//	public static VertexFormat addElement(VertexFormat vertexFormat, VertexFormatElement element) {
//		if (element.isPositionElement() || !(element instanceof SVertexElement)) {
//			return vertexFormat.addElement(element);
//		} else {
//			vertexFormat.getElements().add(element);
//			int offset = vertexFormat.getNextOffset();
//			Dummy.get_vertexFormat_offsets(vertexFormat).add(Integer.valueOf(offset));
//			switch (((SVertexElement) element).getSVEUsage()) {
//			case NORMAL:
//				Dummy.put_vertexFormat_normalElementOffset(vertexFormat, offset);
//				break;
//			case COLOR:
//				Dummy.put_vertexFormat_colorElementOffset(vertexFormat, offset);
//				break;
//			case UV:
//				Dummy.get_vertexFormat_uvOffsets(vertexFormat).add(element.getIndex(), offset);
//				break;
//			case TANGENT:
//				Dummy.put_vertexFormat_tangentElementOffset(vertexFormat, offset);
//				break;
//			case ENTITY:
//				Dummy.put_vertexFormat_entityElementOffset(vertexFormat, offset);
//				break;
//			case MIDUV:
//				Dummy.put_vertexFormat_miduvElementOffset(vertexFormat, offset);
//				break;
//			}
//			Dummy.put_vertexFormat_nextOffset(vertexFormat, offset + element.getSize()); 
//			return vertexFormat;
//		}
//	}

//	public static final VertexFormat defVertexFormatTextured = makeDefVertexFormatTextured();

//	public static VertexFormat makeDefVertexFormatBlock() {
//		VertexFormat vf = new VertexFormat();
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.POSITION, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.UBYTE, VertexFormatElement.EnumUsage.COLOR, 4));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.UV, 2));
//		vf.addElement(new VertexFormatElement(1, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.UV, 2));
//		// added
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.NORMAL, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.PADDING, 1));
//		// mc_midTexCoord
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.PADDING, 2));
//		// at_tangent
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		// mc_Entity
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		return vf;
//	}
//
//	public static VertexFormat makeDefVertexFormatItem() {
//		VertexFormat vf = new VertexFormat();
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.POSITION, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.UBYTE, VertexFormatElement.EnumUsage.COLOR, 4));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.UV, 2));
//		// inserted
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 2));
//		// moved
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.NORMAL, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.PADDING, 1));
//		// mc_midTexCoord
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.PADDING, 2));
//		// at_tangent
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		// mc_Entity
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		return vf;
//	}
//	
//	public static VertexFormat makeDefVertexFormatTextured() {
//		VertexFormat vf = new VertexFormat();
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.POSITION, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.UBYTE, VertexFormatElement.EnumUsage.PADDING, 4));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.UV, 2));
//		// inserted
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 2));
//		// moved
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.NORMAL, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.PADDING, 1));
//		// mc_midTexCoord
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.PADDING, 2));
//		// at_tangent
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		// mc_Entity
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		return vf;
//	}
//	
//	public static void setDefBakedFormat(VertexFormat vf) {
//		vf.clear();
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.POSITION, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.UBYTE, VertexFormatElement.EnumUsage.COLOR, 4));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.UV, 2));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 2));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.NORMAL, 3));
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.BYTE, VertexFormatElement.EnumUsage.PADDING, 1));
//		// mc_midTexCoord
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.PADDING, 2));
//		// at_tangent
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//		// mc_Entity
//		vf.addElement(new VertexFormatElement(0, VertexFormatElement.EnumType.SHORT, VertexFormatElement.EnumUsage.PADDING, 4));
//	}
}
