mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2026-11-10 18:01:59 +00:00
* fix: handle embedded cubemap face order correctly * chore: do not treat cubemaps as separate logic when not necessary * chore: make sure face major image data is the default and chosen for any game other than qos * chore: make new tests use no namespace --------- Co-authored-by: Jan Laupetin <[email protected]>
75 lines
2.5 KiB
C++
75 lines
2.5 KiB
C++
#include "Image/Dx9TextureLoader.h"
|
|
#include "Image/Texture.h"
|
|
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include <cstring>
|
|
#include <vector>
|
|
|
|
using namespace image;
|
|
|
|
namespace
|
|
{
|
|
void FillCube(TextureCube& texture)
|
|
{
|
|
for (auto face = 0; face < texture.GetFaceCount(); face++)
|
|
{
|
|
for (auto mip = 0; mip < texture.GetMipMapCount(); mip++)
|
|
{
|
|
const auto value = static_cast<unsigned char>(face * 16 + mip + 1);
|
|
std::memset(texture.GetBufferForMipLevel(mip, face), value, texture.GetSizeOfMipLevel(mip));
|
|
}
|
|
}
|
|
}
|
|
|
|
std::vector<uint8_t> GetFaceMajorData(const TextureCube& texture)
|
|
{
|
|
std::vector<uint8_t> data;
|
|
for (auto face = 0; face < texture.GetFaceCount(); face++)
|
|
{
|
|
for (auto mip = 0; mip < texture.GetMipMapCount(); mip++)
|
|
{
|
|
const auto* buffer = texture.GetBufferForMipLevel(mip, face);
|
|
const auto mipSize = texture.GetSizeOfMipLevel(mip);
|
|
data.insert(data.end(), buffer, buffer + mipSize);
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
void RequireEqualCubeTextures(const TextureCube& expected, const Texture& actual)
|
|
{
|
|
REQUIRE(actual.GetTextureType() == TextureType::T_CUBE);
|
|
REQUIRE(actual.GetMipMapCount() == expected.GetMipMapCount());
|
|
|
|
for (auto face = 0; face < expected.GetFaceCount(); face++)
|
|
{
|
|
for (auto mip = 0; mip < expected.GetMipMapCount(); mip++)
|
|
{
|
|
const auto mipSize = expected.GetSizeOfMipLevel(mip);
|
|
REQUIRE(std::memcmp(actual.GetBufferForMipLevel(mip, face), expected.GetBufferForMipLevel(mip, face), mipSize) == 0);
|
|
}
|
|
}
|
|
}
|
|
} // namespace
|
|
|
|
TEST_CASE("Dx9TextureLoader reads face-major cubemap mip chains", "[image][dx9]")
|
|
{
|
|
TextureCube source(&format::A8, 8, 8, true);
|
|
source.Allocate();
|
|
FillCube(source);
|
|
|
|
const auto data = GetFaceMajorData(source);
|
|
Dx9TextureLoader loader;
|
|
const auto loaded = loader.Format(source.GetFormat()->GetD3DFormat())
|
|
.Type(TextureType::T_CUBE)
|
|
.HasMipMaps(true)
|
|
.CubeMapOrder(Dx9TextureLoader::CubeMapDataOrder::FaceMajor)
|
|
.Width(source.GetWidth())
|
|
.Height(source.GetHeight())
|
|
.LoadTexture(data.data());
|
|
|
|
REQUIRE(loaded);
|
|
RequireEqualCubeTextures(source, *loaded);
|
|
}
|