adspartan: improve alphamap loading and conversion to big alpha format
This commit is contained in:
T1ti
2024-08-14 05:22:48 +02:00
parent e6c6f9e85c
commit c01ad917b2
3 changed files with 37 additions and 8 deletions

View File

@@ -95,16 +95,26 @@ void Alphamap::readBigAlpha(BlizzardArchive::ClientFile *f)
f->seekRelative(0x1000);
}
namespace
{
struct alpha_4_4
{
std::uint8_t lower : 4;
std::uint8_t upper : 4;
};
}
void Alphamap::readNotCompressed(BlizzardArchive::ClientFile *f, bool do_not_fix_alpha_map)
{
char const* abuf = f->getPointer();
alpha_4_4 const* abuf = reinterpret_cast<alpha_4_4 const*>(f->getPointer());
for (std::size_t x(0); x < 64; ++x)
{
for (std::size_t y(0); y < 64; y += 2)
{
amap[x * 64 + y + 0] = ((*abuf & 0x0f) << 4) | (*abuf & 0x0f);
amap[x * 64 + y + 1] = ((*abuf & 0xf0) >> 4) | (*abuf & 0xf0);
amap[x * 64 + y + 0] = abuf->lower | abuf->lower << 4;
amap[x * 64 + y + 1] = abuf->upper | abuf->upper << 4;
++abuf;
}
}

View File

@@ -1133,9 +1133,12 @@ void TextureSet::alphas_to_big_alpha(uint8_t* dest)
for (int k = static_cast<int>(nTextures - 2); k >= 0; --k)
{
uint8_t val = misc::rounded_255_int_div(*alpha(k, i) * a);
// uint8_t val = misc::rounded_255_int_div(*alpha(k, i) * a);
uint8_t* value_ptr = alpha(k, i);
uint8_t val = alpha_convertion_lookup[*value_ptr * a];
a -= val;
*alpha(k, i) = val;
// *alpha(k, i) = val;
*value_ptr = val;
}
}
}
@@ -1148,14 +1151,14 @@ void TextureSet::convertToBigAlpha()
return;
}
uint8_t tab[4096 * 3];
std::array<std::uint8_t, 4096 * 3> tab;
apply_alpha_changes();
alphas_to_big_alpha(tab);
alphas_to_big_alpha(tab.data());
for (size_t k = 0; k < nTextures - 1; k++)
{
alphamaps[k]->setAlpha(tab + 4096 * k);
alphamaps[k]->setAlpha(tab.data() + 4096 * k);
}
}
@@ -1639,3 +1642,5 @@ std::array<std::uint16_t, 8> TextureSet::lod_texture_map()
return _doodadMapping;
}
std::array<std::uint8_t, 256 * 256> TextureSet::alpha_convertion_lookup = TextureSet::make_alpha_lookup_array();

View File

@@ -166,5 +166,19 @@ private:
bool _do_not_convert_alphamaps;
static constexpr std::array<std::uint8_t, 256 * 256> make_alpha_lookup_array()
{
std::array<std::uint8_t, 256 * 256> array{};
for (int i = 0; i < 256 * 256; ++i)
{
array[i] = i / 255 + (i % 255 <= 127 ? 0 : 1);
}
return array;
}
static std::array<std::uint8_t, 256 * 256> alpha_convertion_lookup;
Noggit::NoggitRenderContext _context;
};