From 41b2f9b9112cc4872b51a13928afd99718f3d68f Mon Sep 17 00:00:00 2001 From: Nail Date: Fri, 4 Apr 2014 12:58:12 -0300 Subject: [PATCH] Per-pixel transparency. --- modules/gamelib/const.lua | 1 + src/client/const.h | 1 + src/client/spritemanager.cpp | 8 ++++++-- src/framework/graphics/image.cpp | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index 06b4f5d7..3d2e53f6 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -105,6 +105,7 @@ GameNewOutfitProtocol = 49 GamePVPMode = 50 GameWritableDate = 51 GameAdditionalVipInfo = 52 +GameSpritesAlphaChannel = 56 TextColors = { red = '#f55e5e', --'#c83200' diff --git a/src/client/const.h b/src/client/const.h index f11f0fc1..0b4e85c6 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -387,6 +387,7 @@ namespace Otc GameBaseSkillU16 = 53, GameCreatureIcons = 54, GameHideNpcNames = 55, + GameSpritesAlphaChannel = 56, LastGameFeature = 101 }; diff --git a/src/client/spritemanager.cpp b/src/client/spritemanager.cpp index a99fea88..7cda6dca 100644 --- a/src/client/spritemanager.cpp +++ b/src/client/spritemanager.cpp @@ -81,6 +81,7 @@ void SpriteManager::saveSpr(std::string fileName) else fin->addU16(m_spritesCount); + bool useAlpha = g_game.getFeature(Otc::GameSpritesAlphaChannel); uint32 offset = fin->tell(); uint32 spriteAddress = offset + 4 * m_spritesCount; for(int i = 1; i <= m_spritesCount; i++) @@ -98,6 +99,7 @@ void SpriteManager::saveSpr(std::string fileName) fin->addU8(m_spritesFile->getU8()); fin->addU8(m_spritesFile->getU8()); fin->addU8(m_spritesFile->getU8()); + if (useAlpha) fin->addU8(m_spritesFile->getU8()); uint16 dataSize = m_spritesFile->getU16(); fin->addU16(dataSize); @@ -153,6 +155,8 @@ ImagePtr SpriteManager::getSpriteImage(int id) uint8 *pixels = image->getPixelData(); int writePos = 0; int read = 0; + bool useAlpha = g_game.getFeature(Otc::GameSpritesAlphaChannel); + uint8 channels = useAlpha ? 4 : 3; // decompress pixels while(read < pixelDataSize && writePos < SPRITE_DATA_SIZE) { @@ -171,11 +175,11 @@ ImagePtr SpriteManager::getSpriteImage(int id) pixels[writePos + 0] = m_spritesFile->getU8(); pixels[writePos + 1] = m_spritesFile->getU8(); pixels[writePos + 2] = m_spritesFile->getU8(); - pixels[writePos + 3] = 0xFF; + pixels[writePos + 3] = useAlpha ? m_spritesFile->getU8() : 0xFF; writePos += 4; } - read += 4 + (3 * coloredPixels); + read += 4 + (channels * coloredPixels); } // fill remaining pixels with alpha diff --git a/src/framework/graphics/image.cpp b/src/framework/graphics/image.cpp index c7d79197..8f3bfe00 100644 --- a/src/framework/graphics/image.cpp +++ b/src/framework/graphics/image.cpp @@ -110,7 +110,7 @@ void Image::blit(const Point& dest, const ImagePtr& other) int y = p / other->getWidth(); int pos = ((dest.y + y) * m_size.width() + (dest.x + x)) * 4; - if(otherPixels[p*4+3] == 0xFF) { + if (otherPixels[p*4+3] != 0) { m_pixels[pos+0] = otherPixels[p*4+0]; m_pixels[pos+1] = otherPixels[p*4+1]; m_pixels[pos+2] = otherPixels[p*4+2];