diff --git a/Engine/source/gfx/bitmap/bitmapUtils.cpp b/Engine/source/gfx/bitmap/bitmapUtils.cpp index f1ac8060f..3dd638852 100644 --- a/Engine/source/gfx/bitmap/bitmapUtils.cpp +++ b/Engine/source/gfx/bitmap/bitmapUtils.cpp @@ -174,9 +174,57 @@ void bitmapExtrudeRGBA_c(const void *srcMip, void *mip, U32 srcHeight, U32 srcWi } } +void bitmapExtrudeFPRGBA_c(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) +{ + const U16 *src = (const U16 *)srcMip; + U16 *dst = (U16 *)mip; + U32 stride = srcHeight != 1 ? (srcWidth) * 8 : 0; + + U32 width = srcWidth >> 1; + U32 height = srcHeight >> 1; + if (width == 0) width = 1; + if (height == 0) height = 1; + + if (srcWidth != 1) + { + for (U32 y = 0; y < height; y++) + { + for (U32 x = 0; x < width; x++) + { + *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2; + src++; + *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2; + src++; + *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2; + src++; + *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2; + src += 5; + } + src += stride; // skip + } + } + else + { + for (U32 y = 0; y < height; y++) + { + *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1; + src++; + *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1; + src++; + *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1; + src++; + *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1; + src += 5; + + src += stride; // skip + } + } +} + void (*bitmapExtrude5551)(const void *srcMip, void *mip, U32 height, U32 width) = bitmapExtrude5551_c; void (*bitmapExtrudeRGB)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeRGB_c; void (*bitmapExtrudeRGBA)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeRGBA_c; +void (*bitmapExtrudeFPRGBA)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeFPRGBA_c; //-------------------------------------------------------------------------- diff --git a/Engine/source/gfx/bitmap/bitmapUtils.h b/Engine/source/gfx/bitmap/bitmapUtils.h index 4efa9031e..489a8f296 100644 --- a/Engine/source/gfx/bitmap/bitmapUtils.h +++ b/Engine/source/gfx/bitmap/bitmapUtils.h @@ -30,6 +30,7 @@ extern void (*bitmapExtrude5551)(const void *srcMip, void *mip, U32 height, U32 width); extern void (*bitmapExtrudeRGB)(const void *srcMip, void *mip, U32 height, U32 width); extern void (*bitmapExtrudeRGBA)(const void *srcMip, void *mip, U32 height, U32 width); +extern void(*bitmapExtrudeFPRGBA)(const void *srcMip, void *mip, U32 height, U32 width); extern void (*bitmapConvertRGB_to_5551)(U8 *src, U32 pixels); extern void (*bitmapConvertRGB_to_1555)(U8 *src, U32 pixels); extern void (*bitmapConvertRGB_to_RGBX)( U8 **src, U32 pixels ); diff --git a/Engine/source/gfx/bitmap/ddsFile.cpp b/Engine/source/gfx/bitmap/ddsFile.cpp index 669f2445e..8c11fe5c6 100644 --- a/Engine/source/gfx/bitmap/ddsFile.cpp +++ b/Engine/source/gfx/bitmap/ddsFile.cpp @@ -294,7 +294,34 @@ bool DDSFile::readHeader(Stream &s) mFlags.set(CompressedData); else { - mBytesPerPixel = header.ddspf.bpp / 8; + switch (header.ddspf.fourCC) + { + case 36: // D3DFMT_A16B16G16R16 + mBytesPerPixel = 8; + break; + case 110: // D3DFMT_Q16W16V16U16 + mBytesPerPixel = 8; + break; + case 111: // D3DFMT_R16F + mBytesPerPixel = 2; + break; + case 112: // D3DFMT_G16R16F + mBytesPerPixel = 4; + break; + case 113: // D3DFMT_A16B16G16R16F + mBytesPerPixel = 8; + break; + case 114: // D3DFMT_R32F + mBytesPerPixel = 4; + break; + case 115: // D3DFMT_G32R32F + mBytesPerPixel = 8; + break; + case 116: // D3DFMT_A32B32G32R32F + mBytesPerPixel = 16; + break; + } + mFlags.set(RGBData); } } diff --git a/Engine/source/gfx/bitmap/gBitmap.cpp b/Engine/source/gfx/bitmap/gBitmap.cpp index 436dfe70c..6fba97e09 100644 --- a/Engine/source/gfx/bitmap/gBitmap.cpp +++ b/Engine/source/gfx/bitmap/gBitmap.cpp @@ -301,9 +301,12 @@ void GBitmap::allocateBitmap(const U32 in_width, const U32 in_height, const bool case GFXFormatR5G6B5: case GFXFormatR5G5B5A1: mBytesPerPixel = 2; break; - default: - AssertFatal(false, "GBitmap::GBitmap: misunderstood format specifier"); - break; + case GFXFormatR16G16B16A16F: + case GFXFormatR16G16B16A16: mBytesPerPixel = 8; + break; + default: + AssertFatal(false, "GBitmap::GBitmap: misunderstood format specifier"); + break; } // Set up the mip levels, if necessary...