Override LoadImage for ktx files

This commit is contained in:
Pavel Krajcevski 2014-03-11 18:27:37 -04:00
parent 41a7abcdbb
commit ebfd8f8f81
2 changed files with 52 additions and 11 deletions

View file

@ -62,6 +62,8 @@
#include "ScopedAllocator.h"
#include "GLDefines.h"
#include "Image.h"
#include "CompressedImage.h"
class ByteReader {
private:
@ -138,8 +140,31 @@ ImageLoaderKTX::ImageLoaderKTX(const uint8 *rawData, const int32 rawDataSz)
ImageLoaderKTX::~ImageLoaderKTX() { }
FasTC::Image<> *ImageLoaderKTX::LoadImage() {
// Get rid of the pixel data if it exists...
if(m_PixelData) {
delete m_PixelData;
m_PixelData = NULL;
}
if(!ReadData()) {
return NULL;
}
if(!m_bIsCompressed) {
uint32 *pixels = reinterpret_cast<uint32 *>(m_PixelData);
return new FasTC::Image<>(m_Width, m_Height, pixels);
}
return new CompressedImage(m_Width, m_Height, m_Format, m_PixelData);
}
bool ImageLoaderKTX::ReadData() {
// Default is uncompressed
m_bIsCompressed = false;
ByteReader rdr (m_RawData, m_NumRawDataBytes);
// First, check to make sure that the identifier is present...
@ -246,13 +271,24 @@ bool ImageLoaderKTX::ReadData() {
return false;
}
if(glType == 0 &&
glFormat == 0 &&
glInternalFormat == GL_COMPRESSED_RGBA_BPTC_UNORM) {
fprintf(stderr, "KTX loader - BPTC compressed textures unsupported!\n");
return false;
// Load compressed texture...
// rdr.Advance(pixelWidth * pixelHeight);
m_Width = pixelWidth;
m_Height = pixelHeight;
if(glType == 0 && glFormat == 0) {
switch(glInternalFormat) {
case GL_COMPRESSED_RGBA_BPTC_UNORM:
m_Format = FasTC::eCompressionFormat_BPTC;
default:
fprintf(stderr, "KTX loader - texture format (0x%x) unsupported!\n", glInternalFormat);
return false;
}
uint32 dataSize = CompressedImage::GetCompressedSize(pixelWidth * pixelHeight * 4, m_Format);
m_PixelData = new uint8[dataSize];
memcpy(m_PixelData, rdr.GetData(), dataSize);
rdr.Advance(dataSize);
m_bIsCompressed = true;
} else {
if(glType != GL_BYTE) {
@ -267,10 +303,10 @@ bool ImageLoaderKTX::ReadData() {
// We should have RGBA8 data here so we can simply load it
// as we normally would.
m_Width = pixelWidth;
m_Height = pixelHeight;
LoadFromPixelBuffer(reinterpret_cast<const uint32 *>(rdr.GetData()));
rdr.Advance(pixelWidth * pixelHeight * 4);
uint32 pixelDataSz = m_Width * m_Height * 4;
m_PixelData = new uint8[pixelDataSz];
memcpy(m_PixelData, rdr.GetData(), pixelDataSz);
rdr.Advance(pixelDataSz);
}
return rdr.GetBytesLeft() == 0;
}

View file

@ -54,6 +54,7 @@
#define _IO_SRC_IMAGE_LOADER_KTX_H_
#include "ImageLoader.h"
#include "CompressionFormat.h"
class ImageLoaderKTX : public ImageLoader {
public:
@ -68,8 +69,12 @@ class ImageLoaderKTX : public ImageLoader {
m_Processor = proc;
}
virtual FasTC::Image<> *LoadImage();
private:
KTXKeyValueProcessor m_Processor;
bool m_bIsCompressed;
FasTC::ECompressionFormat m_Format;
};
#endif // _IO_SRC_IMAGE_LOADER_KTX_H_