tex.imageBuffer = imageBuffer;
}
private void extractKTX() throws IOException {
KTXHeader header = new KTXHeader();
header.swap = true;
header.glTypeSize = 1;
header.pixelWidth = tex.width;
header.pixelHeight = tex.height;
header.pixelDepth = 0;
header.numberOfFaces = tex.imageCount;
header.numberOfMipmapLevels = tex.mipMap ? getMipMapCount(header.pixelWidth, header.pixelHeight) : 1;
int bpp;
switch (tex.textureFormat) {
case PVRTC_RGB2:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
header.glBaseInternalFormat = KTXHeader.GL_RGB;
bpp = 2;
break;
case PVRTC_RGBA2:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
header.glBaseInternalFormat = KTXHeader.GL_RGBA;
bpp = 2;
break;
case PVRTC_RGB4:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
header.glBaseInternalFormat = KTXHeader.GL_RGB;
bpp = 4;
break;
case PVRTC_RGBA4:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
header.glBaseInternalFormat = KTXHeader.GL_RGBA;
bpp = 4;
break;
case ATC_RGB4:
header.glInternalFormat = KTXHeader.GL_ATC_RGB_AMD;
header.glBaseInternalFormat = KTXHeader.GL_RGB;
bpp = 4;
break;
case ATC_RGBA8:
header.glInternalFormat = KTXHeader.GL_ATC_RGBA_EXPLICIT_ALPHA_AMD;
header.glBaseInternalFormat = KTXHeader.GL_RGBA;
bpp = 8;
break;
case ETC_RGB4:
header.glInternalFormat = KTXHeader.GL_ETC1_RGB8_OES;
header.glBaseInternalFormat = KTXHeader.GL_RGB;
bpp = 4;
break;
case ETC2_RGB4:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGB8_ETC2;
header.glBaseInternalFormat = KTXHeader.GL_RGB;
bpp = 4;
break;
case ETC2_RGB4_PUNCHTHROUGH_ALPHA:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
header.glBaseInternalFormat = KTXHeader.GL_RGBA;
bpp = 4;
break;
case ETC2_RGBA8:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RGBA8_ETC2_EAC;
header.glBaseInternalFormat = KTXHeader.GL_RGBA;
bpp = 8;
break;
case EAC_R:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_R11_EAC;
header.glBaseInternalFormat = KTXHeader.GL_RED;
bpp = 4;
break;
case EAC_R_SIGNED:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_SIGNED_R11_EAC;
header.glBaseInternalFormat = KTXHeader.GL_RED;
bpp = 4;
break;
case EAC_RG:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_RG11_EAC;
header.glBaseInternalFormat = KTXHeader.GL_RG;
bpp = 8;
break;
case EAC_RG_SIGNED:
header.glInternalFormat = KTXHeader.GL_COMPRESSED_SIGNED_RG11_EAC;
header.glBaseInternalFormat = KTXHeader.GL_RG;
bpp = 4;
break;
default:
throw new IllegalStateException("Invalid texture format for KTX: " + tex.textureFormat);
}
// header + raw image data + mip map image sizes
int imageSizeTotal = KTXHeader.SIZE + tex.imageBuffer.capacity() + header.numberOfMipmapLevels * 4;
ByteBuffer bb = ByteBuffer.allocateDirect(imageSizeTotal);
// write header
header.write(DataOutputWriter.newWriter(bb));
int mipMapWidth = header.pixelWidth;
int mipMapHeight = header.pixelHeight;
int mipMapOffset = 0;
for (int i = 0; i < header.numberOfMipmapLevels; i++) {