package tk.captainsplexx.Resource.ITEXTURE;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HashMap;
import tk.captainsplexx.Resource.FileHandler;
import tk.captainsplexx.Resource.FileSeeker;
public class ITexture {
/******************************************************STATIC*********************************STATIC************************************************************/
/*Texture Format*/
public static final int TF_DXT1 = 0;
public static final int TF_DXT1A = 1;
public static final int TF_DXT3 = 2;
public static final int TF_DXT5 = 3;
public static final int TF_DXT5A = 4;
public static final int TF_DXN = 5;
public static final int TF_BC7 = 6;
public static final int TF_RGB565 = 7;
public static final int TF_RGB888 = 8;
public static final int TF_ARGB1555 = 9;
public static final int TF_ARGB4444 = 10;
public static final int TF_ARGB8888 = 11;
public static final int TF_L8 = 12;
public static final int TF_L16 = 13;
public static final int TF_ABGR16 = 14;
public static final int TF_ABGR16F = 15;
public static final int TF_ABGR32F = 16;
public static final int TF_R16F = 17;
public static final int TF_R32F = 18;
public static final int TF_NormalDXN = 19;
public static final int TF_NormalDXT1 = 20;
public static final int TF_NormalDXT5 = 21;
public static final int TF_NormalDXT5RGA = 22;
public static final int TF_RG8 = 23;
public static final int TF_GR16 = 24;
public static final int TF_GR16F = 25;
public static final int TF_D16 = 26;
public static final int TF_D24 = 27;
public static final int TF_D24S8 = 28;
public static final int TF_D24FS8 = 29;
public static final int TF_D32F = 30;
public static final int TF_D32FS8 = 31;
public static final int TF_S8 = 32;
public static final int TF_ABGR32 = 33;
public static final int TF_GR32F = 34;
public static final int TF_A2R10G10B10 = 35;
public static final int TF_R11G11B10F = 36;
public static final int TF_ABGR16_SNORM = 37;
public static final int TF_ABGR16_UINT = 38;
public static final int TF_L16_UINT = 39;
public static final int TF_L32 = 40;
public static final int TF_GR16_UINT = 41;
public static final int TF_GR32_UINT = 42;
public static final int TF_ETC1 = 43;
public static final int TF_ETC2_RGB = 44;
public static final int TF_ETC2_RGBA = 45;
public static final int TF_ETC2_RGB_A1 = 56;
public static final int TF_PVRTC1_4BPP_RGBA = 57;
public static final int TF_PVRTC1_4BPP_RGB = 58;
public static final int TF_PVRTC1_2BPP_RGBA = 59;
public static final int TF_PVRTC1_2BPP_RGB = 60;
public static final int TF_PVRTC2_4BPP = 61;
public static final int TF_PVRTC2_2BPP = 62;
public static final int TF_R8 = 63;
public static final int TF_R9G9B9E5F = 64;
/*Unknown Textureformat!*/
public static final int TF_Unknown = 255;
/*DDS TextureFormat*/
public static final int DDS_DXT1 = 827611204;
public static final int DDS_NormalDXT1 = 827611204;
public static final int DDS_DXT1A = 1093752900;
public static final int DDS_DXT5 = 894720068;
public static final int DDS_DXT5A = 826889281;
public static final int DDS_ABGR32F = 116;
public static final int DDS_NormalDXN = 843666497;//ATI2
/*TextureFormat <-> DDS_Format*/
public static HashMap<Integer, Integer> PixelFormatTypes = new HashMap<Integer, Integer>(){{
put(TF_DXT1, DDS_DXT1);
put(TF_NormalDXT1, DDS_NormalDXT1);
put(TF_DXT1A, DDS_DXT1A);
put(TF_DXT5, DDS_DXT5);
put(TF_DXT5A, DDS_DXT5A);
put(TF_ABGR32F, DDS_ABGR32F);
put(TF_NormalDXN, DDS_NormalDXN);
};
};
/*Texture Type*/
public static final int TT_2d = 0;
public static final int TT_Cube = 1;
public static final int TT_3d = 2;
public static final int TT_2dArray = 3;
public static final int TT_1dArray = 4;
public static final int TT_1d = 5;
/***********************************************END******************OF******************STATIC****************************************************************/
private int /*unsigned*/ mipOneEndOffset;
private int /*unsigned*/ mipTwoEndOffset;
private int textureType;
private int pixelFormat;
private short /*unsigned*/ unknown;
private short width;
private short height;
private short depth;
private short sliceCount;
private byte numSizes;
private byte firstMip;
private byte[] chunkID;
private int[] mipSizes;
private byte[] data;
private int chunkSize;
private int /*unsigned*/ nameHash;
private byte[] name;
public ITexture(){
this.mipOneEndOffset = 0;
this.mipTwoEndOffset = 0;
this.textureType = 0;
this.pixelFormat = 0;
this.unknown = 0;
this.width = 0;
this.height = 0;
this.depth = 0;
this.sliceCount = 0;
this.numSizes = 0;
this.firstMip = 0;
this.chunkID = null;
this.mipSizes = null;
this.data = null;
this.chunkSize = 0;
this.nameHash = 0;
this.name = null;
}
public ITexture(byte[] itextureBytes, FileSeeker seeker) {
if (seeker==null){seeker=new FileSeeker();}
this.mipOneEndOffset = FileHandler.readInt(itextureBytes, seeker);
this.mipTwoEndOffset = FileHandler.readInt(itextureBytes, seeker);
this.textureType = FileHandler.readInt(itextureBytes, seeker);
this.pixelFormat = FileHandler.readInt(itextureBytes, seeker);
this.unknown = FileHandler.readShort(itextureBytes, seeker, ByteOrder.LITTLE_ENDIAN);
this.width = FileHandler.readShort(itextureBytes, seeker, ByteOrder.LITTLE_ENDIAN);
this.height = FileHandler.readShort(itextureBytes, seeker, ByteOrder.LITTLE_ENDIAN);
this.depth = FileHandler.readShort(itextureBytes, seeker, ByteOrder.LITTLE_ENDIAN);
this.sliceCount = FileHandler.readShort(itextureBytes, seeker, ByteOrder.LITTLE_ENDIAN);
this.numSizes = FileHandler.readByte(itextureBytes, seeker);
this.firstMip = FileHandler.readByte(itextureBytes, seeker);
this.chunkID = FileHandler.readByte(itextureBytes, seeker, 16);
/*Mips*/
this.mipSizes = new int[15];
for (int i=0; i<this.mipSizes.length; i++){
this.mipSizes[i] = FileHandler.readInt(itextureBytes, seeker);
}
this.chunkSize = FileHandler.readInt(itextureBytes, seeker);
this.nameHash = FileHandler.readInt(itextureBytes, seeker);
this.name = FileHandler.readByte(itextureBytes, seeker, 16);
}
public byte[] toBytes(){
ArrayList<Byte> itextureBytes = new ArrayList<>();
FileHandler.addBytes(FileHandler.toBytes(this.mipOneEndOffset, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.mipTwoEndOffset, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.textureType, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.pixelFormat, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.unknown /*short*/, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.width /*short*/, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.height /*short*/, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.depth /*short*/, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.sliceCount /*short*/, ByteOrder.LITTLE_ENDIAN), itextureBytes);
itextureBytes.add(this.numSizes);
itextureBytes.add(this.firstMip);
FileHandler.addBytes(this.chunkID, itextureBytes);
for (int i=0; i<this.mipSizes.length; i++){
FileHandler.addBytes(FileHandler.toBytes(this.mipSizes[i], ByteOrder.LITTLE_ENDIAN), itextureBytes);
}
FileHandler.addBytes(FileHandler.toBytes(this.chunkSize, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(FileHandler.toBytes(this.nameHash, ByteOrder.LITTLE_ENDIAN), itextureBytes);
FileHandler.addBytes(this.name, itextureBytes);
return FileHandler.toByteArray(itextureBytes);
}
public int getMipOneEndOffset() {
return mipOneEndOffset;
}
public void setMipOneEndOffset(int mipOneEndOffset) {
this.mipOneEndOffset = mipOneEndOffset;
}
public int getMipTwoEndOffset() {
return mipTwoEndOffset;
}
public void setMipTwoEndOffset(int mipTwoEndOffset) {
this.mipTwoEndOffset = mipTwoEndOffset;
}
public int getTextureType() {
return textureType;
}
public void setTextureType(int textureType) {
this.textureType = textureType;
}
public int getPixelFormat() {
return pixelFormat;
}
public void setPixelFormat(int pixelFormat) {
this.pixelFormat = pixelFormat;
}
public short getUnknown() {
return unknown;
}
public void setUnknown(short unknown) {
this.unknown = unknown;
}
public short getWidth() {
return width;
}
public void setWidth(short width) {
this.width = width;
}
public short getHeight() {
return height;
}
public void setHeight(short height) {
this.height = height;
}
public short getDepth() {
return depth;
}
public void setDepth(short depth) {
this.depth = depth;
}
public short getSliceCount() {
return sliceCount;
}
public void setSliceCount(short sliceCount) {
this.sliceCount = sliceCount;
}
public byte getNumSizes() {
return numSizes;
}
public void setNumSizes(byte numSizes) {
this.numSizes = numSizes;
}
public byte getFirstMip() {
return firstMip;
}
public void setFirstMip(byte firstMip) {
this.firstMip = firstMip;
}
public byte[] getChunkID() {
return chunkID;
}
public void setChunkID(byte[] chunkID) {
this.chunkID = chunkID;
}
public int[] getMipSizes() {
return mipSizes;
}
public void setMipSizes(int[] mipSizes) {
this.mipSizes = mipSizes;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public int getChunkSize() {
return chunkSize;
}
public void setChunkSize(int chunkSize) {
this.chunkSize = chunkSize;
}
public int getNameHash() {
return nameHash;
}
public void setNameHash(int nameHash) {
this.nameHash = nameHash;
}
public byte[] getName() {
return name;
}
public void setName(byte[] name) {
this.name = name;
}
}