From 66e0fc6eb3aa0f554ea969acd5eb043ba59c2b22 Mon Sep 17 00:00:00 2001 From: hybrid Date: Thu, 7 May 2009 22:14:00 +0000 Subject: [PATCH] Add support for more texture formats git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@2375 dfc29bdd-3216-0410-991c-e03cc46cb475 --- source/Irrlicht/CColorConverter.cpp | 28 +++++++++++++++++++ source/Irrlicht/CColorConverter.h | 2 ++ source/Irrlicht/COGLESTexture.cpp | 43 ++++++++++++++++------------- 3 files changed, 54 insertions(+), 19 deletions(-) diff --git a/source/Irrlicht/CColorConverter.cpp b/source/Irrlicht/CColorConverter.cpp index e0afebc2..0ea5dce7 100644 --- a/source/Irrlicht/CColorConverter.cpp +++ b/source/Irrlicht/CColorConverter.cpp @@ -271,6 +271,18 @@ void CColorConverter::convert_A1R5G5B5toB8G8R8(const void* sP, s32 sN, void* dP) } } +void CColorConverter::convert_A1R5G5B5toR5G5B5A1(const void* sP, s32 sN, void* dP) +{ + const u16* sB = (const u16*)sP; + u16* dB = (u16*)dP; + + for (s32 x = 0; x < sN; ++x) + { + *dB = (*sB<<1)|(*sB>>15); + ++sB; ++dB; + } +} + void CColorConverter::convert_A1R5G5B5toA8R8G8B8(const void* sP, s32 sN, void* dP) { u16* sB = (u16*)sP; @@ -466,6 +478,22 @@ void CColorConverter::convert_B8G8R8A8toA8R8G8B8(const void* sP, s32 sN, void* d } +void CColorConverter::convert_R8G8B8toB8G8R8(const void* sP, s32 sN, void* dP) +{ + u8* sB = (u8*)sP; + u8* dB = (u8*)dP; + + for (s32 x = 0; x < sN; ++x) + { + dB[2] = sB[0]; + dB[1] = sB[1]; + dB[0] = sB[2]; + + sB += 3; + dB += 3; + } +} + void CColorConverter::convert_R8G8B8toR5G6B5(const void* sP, s32 sN, void* dP) { u8 * sB = (u8 *)sP; diff --git a/source/Irrlicht/CColorConverter.h b/source/Irrlicht/CColorConverter.h index 8ff9a88c..bcf5cdc4 100644 --- a/source/Irrlicht/CColorConverter.h +++ b/source/Irrlicht/CColorConverter.h @@ -53,6 +53,7 @@ public: static void convert_A1R5G5B5toB8G8R8(const void* sP, s32 sN, void* dP); static void convert_A1R5G5B5toA8R8G8B8(const void* sP, s32 sN, void* dP); static void convert_A1R5G5B5toA1R5G5B5(const void* sP, s32 sN, void* dP); + static void convert_A1R5G5B5toR5G5B5A1(const void* sP, s32 sN, void* dP); static void convert_A1R5G5B5toR5G6B5(const void* sP, s32 sN, void* dP); static void convert_A8R8G8B8toR8G8B8(const void* sP, s32 sN, void* dP); @@ -65,6 +66,7 @@ public: static void convert_R8G8B8toR8G8B8(const void* sP, s32 sN, void* dP); static void convert_R8G8B8toA8R8G8B8(const void* sP, s32 sN, void* dP); static void convert_R8G8B8toA1R5G5B5(const void* sP, s32 sN, void* dP); + static void convert_R8G8B8toB8G8R8(const void* sP, s32 sN, void* dP); static void convert_R8G8B8toR5G6B5(const void* sP, s32 sN, void* dP); static void convert_B8G8R8toA8R8G8B8(const void* sP, s32 sN, void* dP); static void convert_B8G8R8A8toA8R8G8B8(const void* sP, s32 sN, void* dP); diff --git a/source/Irrlicht/COGLESTexture.cpp b/source/Irrlicht/COGLESTexture.cpp index cedf0341..909190c6 100644 --- a/source/Irrlicht/COGLESTexture.cpp +++ b/source/Irrlicht/COGLESTexture.cpp @@ -149,34 +149,39 @@ void COGLES1Texture::copyTexture(bool newTexture) return; } + void(*convert)(const void*, s32, void*)=0; switch (Image->getColorFormat()) { case ECF_A1R5G5B5: - InternalFormat=GL_BGRA; - PixelFormat=GL_BGRA; - // TODO ogl-es - // PixelType=GL_UNSIGNED_SHORT_1_5_5_5_REV; - PixelType=GL_UNSIGNED_BYTE; + InternalFormat=GL_RGBA; + PixelFormat=GL_RGBA; + PixelType=GL_UNSIGNED_SHORT_5_5_5_1; + convert=CColorConverter::convert_A1R5G5B5toR5G5B5A1; break; case ECF_R5G6B5: InternalFormat=GL_RGB; - // TODO ogl-es - // PixelFormat=GL_BGR; - // PixelType=GL_UNSIGNED_SHORT_5_6_5_REV; PixelFormat=GL_RGB; - PixelType=GL_UNSIGNED_BYTE; + PixelType=GL_UNSIGNED_SHORT_5_6_5; break; case ECF_R8G8B8: InternalFormat=GL_RGB; - // TODO ogl-es - // PixelFormat=GL_BGR; PixelFormat=GL_RGB; PixelType=GL_UNSIGNED_BYTE; + convert=CColorConverter::convert_R8G8B8toB8G8R8; break; case ECF_A8R8G8B8: - InternalFormat=GL_BGRA; - PixelFormat=GL_BGRA; PixelType=GL_UNSIGNED_BYTE; + if (!Driver->queryOpenGLFeature(COGLES1ExtensionHandler::IRR_IMG_texture_format_BGRA8888) && !Driver->queryOpenGLFeature(COGLES1ExtensionHandler::IRR_EXT_texture_format_BGRA8888)) + { + convert=CColorConverter::convert_A8R8G8B8toA8B8G8R8; + InternalFormat=GL_RGBA; + PixelFormat=GL_RGBA; + } + else + { + InternalFormat=GL_BGRA; + PixelFormat=GL_BGRA; + } break; default: os::Printer::log("Unsupported texture format", ELL_ERROR); @@ -227,11 +232,11 @@ void COGLES1Texture::copyTexture(bool newTexture) void* source = 0; IImage* tmpImage=0; source = Image->lock(); - if (!Driver->queryOpenGLFeature(COGLES1ExtensionHandler::IRR_IMG_texture_format_BGRA8888) && !Driver->queryOpenGLFeature(COGLES1ExtensionHandler::IRR_EXT_texture_format_BGRA8888)) + if (convert) { - tmpImage = new CImage(ECF_A8R8G8B8, ImageSize); + tmpImage = new CImage(Image->getColorFormat(), Image->getDimension()); void* dest = tmpImage->lock(); - CColorConverter::convert_A8R8G8B8toA8B8G8R8(source, Image->getDimension().getArea(), dest); + convert(source, Image->getDimension().getArea(), dest); Image->unlock(); source = dest; } @@ -241,13 +246,13 @@ void COGLES1Texture::copyTexture(bool newTexture) else glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, Image->getDimension().Width, Image->getDimension().Height, PixelFormat, PixelType, source); - if (Driver->queryOpenGLFeature(COGLES1ExtensionHandler::IRR_IMG_texture_format_BGRA8888) || Driver->queryOpenGLFeature(COGLES1ExtensionHandler::IRR_EXT_texture_format_BGRA8888)) - Image->unlock(); - else + if (convert) { tmpImage->unlock(); tmpImage->drop(); } + else + Image->unlock(); if (Driver->testGLError()) os::Printer::log("Could not glTexImage2D", ELL_ERROR);