mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 08:05:45 +00:00
ObjCommon: Add Id to ImageFormats to be able to identify predefined formats without comparing pointers
This commit is contained in:
parent
7d809faf07
commit
6b59fcb5fe
@ -1,12 +1,29 @@
|
||||
#include "ImageFormat.h"
|
||||
|
||||
ImageFormatUnsigned::ImageFormatUnsigned(const unsigned bitPerPixel, const unsigned rOffset, const unsigned rSize,
|
||||
|
||||
ImageFormat::ImageFormat(const ImageFormatId id, const DXGI_FORMAT dxgiFormat)
|
||||
{
|
||||
m_id = id;
|
||||
m_dxgi_format = dxgiFormat;
|
||||
}
|
||||
|
||||
ImageFormatId ImageFormat::GetId() const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
DXGI_FORMAT ImageFormat::GetDxgiFormat() const
|
||||
{
|
||||
return m_dxgi_format;
|
||||
}
|
||||
|
||||
ImageFormatUnsigned::ImageFormatUnsigned(const ImageFormatId id, const DXGI_FORMAT dxgiFormat,
|
||||
const unsigned bitPerPixel, const unsigned rOffset, const unsigned rSize,
|
||||
const unsigned gOffset, const unsigned gSize, const unsigned bOffset,
|
||||
const unsigned bSize, const unsigned aOffset, const unsigned aSize,
|
||||
DXGI_FORMAT dxgiFormat)
|
||||
const unsigned bSize, const unsigned aOffset, const unsigned aSize)
|
||||
: ImageFormat(id, dxgiFormat)
|
||||
{
|
||||
m_bit_per_pixel = bitPerPixel;
|
||||
m_dxgi_format = dxgiFormat;
|
||||
}
|
||||
|
||||
ImageFormatType ImageFormatUnsigned::GetType() const
|
||||
@ -14,11 +31,6 @@ ImageFormatType ImageFormatUnsigned::GetType() const
|
||||
return ImageFormatType::UNSIGNED;
|
||||
}
|
||||
|
||||
DXGI_FORMAT ImageFormatUnsigned::GetDXGIFormat() const
|
||||
{
|
||||
return m_dxgi_format;
|
||||
}
|
||||
|
||||
size_t ImageFormatUnsigned::GetSizeOfMipLevel(const unsigned mipLevel, const unsigned width, const unsigned height,
|
||||
const unsigned depth) const
|
||||
{
|
||||
@ -36,12 +48,12 @@ size_t ImageFormatUnsigned::GetSizeOfMipLevel(const unsigned mipLevel, const uns
|
||||
return mipWidth * mipHeight * mipDepth * m_bit_per_pixel / 8;
|
||||
}
|
||||
|
||||
ImageFormatBlockCompressed::ImageFormatBlockCompressed(const unsigned blockSize, const unsigned bitsPerBlock,
|
||||
DXGI_FORMAT dxgiFormat)
|
||||
ImageFormatBlockCompressed::ImageFormatBlockCompressed(const ImageFormatId id, const DXGI_FORMAT dxgiFormat,
|
||||
const unsigned blockSize, const unsigned bitsPerBlock)
|
||||
: ImageFormat(id, dxgiFormat)
|
||||
{
|
||||
m_block_size = blockSize;
|
||||
m_bits_per_block = bitsPerBlock;
|
||||
m_dxgi_format = dxgiFormat;
|
||||
}
|
||||
|
||||
ImageFormatType ImageFormatBlockCompressed::GetType() const
|
||||
@ -49,11 +61,6 @@ ImageFormatType ImageFormatBlockCompressed::GetType() const
|
||||
return ImageFormatType::BLOCK_COMPRESSED;
|
||||
}
|
||||
|
||||
DXGI_FORMAT ImageFormatBlockCompressed::GetDXGIFormat() const
|
||||
{
|
||||
return m_dxgi_format;
|
||||
}
|
||||
|
||||
size_t ImageFormatBlockCompressed::GetSizeOfMipLevel(const unsigned mipLevel, const unsigned width,
|
||||
const unsigned height, const unsigned depth) const
|
||||
{
|
||||
@ -75,12 +82,17 @@ size_t ImageFormatBlockCompressed::GetSizeOfMipLevel(const unsigned mipLevel, co
|
||||
return blockCount * m_bits_per_block / 8;
|
||||
}
|
||||
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_R8G8B8(24, 0, 8, 8, 8, 16, 8, 0, 0, DXGI_FORMAT_UNKNOWN);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_R8G8B8A8(32, 0, 8, 8, 8, 16, 8, 24, 8, DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_A8(8, 0, 0, 0, 0, 0, 0, 0, 8, DXGI_FORMAT_A8_UNORM);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_R16G16B16A16_FLOAT(128, 0, 0, 0, 0, 0, 0, 0, 8, DXGI_FORMAT_R16G16B16A16_FLOAT);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC1(4, 64, DXGI_FORMAT_BC1_UNORM);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC2(4, 128, DXGI_FORMAT_BC2_UNORM);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC3(4, 128, DXGI_FORMAT_BC3_UNORM);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC4(4, 64, DXGI_FORMAT_BC4_UNORM);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC5(4, 128, DXGI_FORMAT_BC5_UNORM);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_R8_G8_B8(ImageFormatId::R8_G8_B8, DXGI_FORMAT_UNKNOWN,
|
||||
24, 0, 8, 8, 8, 16, 8, 0, 0);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_R8_G8_B8_A8(ImageFormatId::R8_G8_B8_A8, DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||
32, 0, 8, 8, 8, 16, 8, 24, 8);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_A8(ImageFormatId::A8, DXGI_FORMAT_A8_UNORM,
|
||||
8, 0, 0, 0, 0, 0, 0, 0, 8);
|
||||
const ImageFormatUnsigned ImageFormat::FORMAT_R16_G16_B16_A16_FLOAT(ImageFormatId::R16_G16_B16_A16_FLOAT,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT,
|
||||
128, 0, 0, 0, 0, 0, 0, 0, 8);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC1(ImageFormatId::BC1, DXGI_FORMAT_BC1_UNORM, 4, 64);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC2(ImageFormatId::BC2, DXGI_FORMAT_BC2_UNORM, 4, 128);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC3(ImageFormatId::BC3, DXGI_FORMAT_BC3_UNORM, 4, 128);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC4(ImageFormatId::BC4, DXGI_FORMAT_BC4_UNORM, 4, 64);
|
||||
const ImageFormatBlockCompressed ImageFormat::FORMAT_BC5(ImageFormatId::BC5, DXGI_FORMAT_BC5_UNORM, 4, 128);
|
||||
|
@ -2,6 +2,20 @@
|
||||
|
||||
#include <dxgiformat.h>
|
||||
|
||||
enum class ImageFormatId
|
||||
{
|
||||
UNKNOWN,
|
||||
R8_G8_B8,
|
||||
R8_G8_B8_A8,
|
||||
A8,
|
||||
R16_G16_B16_A16_FLOAT,
|
||||
BC1,
|
||||
BC2,
|
||||
BC3,
|
||||
BC4,
|
||||
BC5
|
||||
};
|
||||
|
||||
enum class ImageFormatType
|
||||
{
|
||||
UNKNOWN,
|
||||
@ -9,56 +23,58 @@ enum class ImageFormatType
|
||||
BLOCK_COMPRESSED
|
||||
};
|
||||
|
||||
class IImageFormat
|
||||
{
|
||||
public:
|
||||
virtual ~IImageFormat() = default;
|
||||
|
||||
virtual ImageFormatType GetType() const = 0;
|
||||
virtual DXGI_FORMAT GetDXGIFormat() const = 0;
|
||||
virtual size_t GetSizeOfMipLevel(unsigned mipLevel, unsigned width, unsigned height, unsigned depth) const = 0;
|
||||
};
|
||||
|
||||
class ImageFormatUnsigned final : public IImageFormat
|
||||
{
|
||||
unsigned m_bit_per_pixel;
|
||||
DXGI_FORMAT m_dxgi_format;
|
||||
|
||||
public:
|
||||
ImageFormatUnsigned(unsigned bitPerPixel, unsigned rOffset, unsigned rSize, unsigned gOffset, unsigned gSize,
|
||||
unsigned bOffset, unsigned bSize, unsigned aOffset, unsigned aSize, DXGI_FORMAT dxgiFormat);
|
||||
|
||||
ImageFormatType GetType() const override;
|
||||
DXGI_FORMAT GetDXGIFormat() const override;
|
||||
size_t GetSizeOfMipLevel(unsigned mipLevel, unsigned width, unsigned height, unsigned depth) const override;
|
||||
};
|
||||
|
||||
class ImageFormatBlockCompressed final : public IImageFormat
|
||||
{
|
||||
unsigned m_block_size;
|
||||
unsigned m_bits_per_block;
|
||||
DXGI_FORMAT m_dxgi_format;
|
||||
|
||||
public:
|
||||
ImageFormatBlockCompressed(unsigned blockSize, unsigned bitsPerBlock, DXGI_FORMAT dxgiFormat);
|
||||
|
||||
ImageFormatType GetType() const override;
|
||||
DXGI_FORMAT GetDXGIFormat() const override;
|
||||
size_t GetSizeOfMipLevel(unsigned mipLevel, unsigned width, unsigned height, unsigned depth) const override;
|
||||
};
|
||||
class ImageFormatUnsigned;
|
||||
class ImageFormatBlockCompressed;
|
||||
|
||||
class ImageFormat
|
||||
{
|
||||
public:
|
||||
ImageFormat() = delete;
|
||||
ImageFormatId m_id;
|
||||
DXGI_FORMAT m_dxgi_format;
|
||||
|
||||
static const ImageFormatUnsigned FORMAT_R8G8B8;
|
||||
static const ImageFormatUnsigned FORMAT_R8G8B8A8;
|
||||
protected:
|
||||
ImageFormat(ImageFormatId id, DXGI_FORMAT dxgiFormat);
|
||||
|
||||
public:
|
||||
virtual ~ImageFormat() = default;
|
||||
|
||||
ImageFormatId GetId() const;
|
||||
DXGI_FORMAT GetDxgiFormat() const;
|
||||
|
||||
virtual ImageFormatType GetType() const = 0;
|
||||
virtual size_t GetSizeOfMipLevel(unsigned mipLevel, unsigned width, unsigned height, unsigned depth) const = 0;
|
||||
|
||||
static const ImageFormatUnsigned FORMAT_R8_G8_B8;
|
||||
static const ImageFormatUnsigned FORMAT_R8_G8_B8_A8;
|
||||
static const ImageFormatUnsigned FORMAT_A8;
|
||||
static const ImageFormatUnsigned FORMAT_R16G16B16A16_FLOAT; //TODO: Float not unsigned
|
||||
static const ImageFormatUnsigned FORMAT_R16_G16_B16_A16_FLOAT; //TODO: Float not unsigned
|
||||
static const ImageFormatBlockCompressed FORMAT_BC1;
|
||||
static const ImageFormatBlockCompressed FORMAT_BC2;
|
||||
static const ImageFormatBlockCompressed FORMAT_BC3;
|
||||
static const ImageFormatBlockCompressed FORMAT_BC4;
|
||||
static const ImageFormatBlockCompressed FORMAT_BC5;
|
||||
};
|
||||
|
||||
class ImageFormatUnsigned final : public ImageFormat
|
||||
{
|
||||
unsigned m_bit_per_pixel;
|
||||
|
||||
public:
|
||||
ImageFormatUnsigned(ImageFormatId id, DXGI_FORMAT dxgiFormat, unsigned bitPerPixel, unsigned rOffset,
|
||||
unsigned rSize, unsigned gOffset, unsigned gSize, unsigned bOffset, unsigned bSize,
|
||||
unsigned aOffset, unsigned aSize);
|
||||
|
||||
ImageFormatType GetType() const override;
|
||||
size_t GetSizeOfMipLevel(unsigned mipLevel, unsigned width, unsigned height, unsigned depth) const override;
|
||||
};
|
||||
|
||||
class ImageFormatBlockCompressed final : public ImageFormat
|
||||
{
|
||||
unsigned m_block_size;
|
||||
unsigned m_bits_per_block;
|
||||
|
||||
public:
|
||||
ImageFormatBlockCompressed(ImageFormatId id, DXGI_FORMAT dxgiFormat, unsigned blockSize, unsigned bitsPerBlock);
|
||||
|
||||
ImageFormatType GetType() const override;
|
||||
size_t GetSizeOfMipLevel(unsigned mipLevel, unsigned width, unsigned height, unsigned depth) const override;
|
||||
};
|
||||
|
@ -5,7 +5,7 @@
|
||||
// ==============================================
|
||||
// ================= Texture ====================
|
||||
// ==============================================
|
||||
Texture::Texture(const IImageFormat* format, const bool mipMaps)
|
||||
Texture::Texture(const ImageFormat* format, const bool mipMaps)
|
||||
{
|
||||
m_format = format;
|
||||
m_has_mip_maps = mipMaps;
|
||||
@ -38,7 +38,7 @@ Texture::~Texture()
|
||||
m_data = nullptr;
|
||||
}
|
||||
|
||||
const IImageFormat* Texture::GetFormat() const
|
||||
const ImageFormat* Texture::GetFormat() const
|
||||
{
|
||||
return m_format;
|
||||
}
|
||||
@ -73,12 +73,12 @@ bool Texture::HasMipMaps() const
|
||||
// ==============================================
|
||||
// ================ Texture2D ===================
|
||||
// ==============================================
|
||||
Texture2D::Texture2D(const IImageFormat* format, const unsigned width, const unsigned height)
|
||||
Texture2D::Texture2D(const ImageFormat* format, const unsigned width, const unsigned height)
|
||||
: Texture2D(format, width, height, false)
|
||||
{
|
||||
}
|
||||
|
||||
Texture2D::Texture2D(const IImageFormat* format, const unsigned width, const unsigned height, const bool mipMaps)
|
||||
Texture2D::Texture2D(const ImageFormat* format, const unsigned width, const unsigned height, const bool mipMaps)
|
||||
: Texture(format, mipMaps)
|
||||
{
|
||||
m_width = width;
|
||||
@ -162,12 +162,12 @@ uint8_t* Texture2D::GetBufferForMipLevel(const int mipLevel)
|
||||
// ==============================================
|
||||
const int TextureCube::FACE_COUNT = 6;
|
||||
|
||||
TextureCube::TextureCube(const IImageFormat* format, const unsigned width, const unsigned height)
|
||||
TextureCube::TextureCube(const ImageFormat* format, const unsigned width, const unsigned height)
|
||||
: Texture2D(format, width, height)
|
||||
{
|
||||
}
|
||||
|
||||
TextureCube::TextureCube(const IImageFormat* format, const unsigned width, const unsigned height, const bool mipMaps)
|
||||
TextureCube::TextureCube(const ImageFormat* format, const unsigned width, const unsigned height, const bool mipMaps)
|
||||
: Texture2D(format, width, height, mipMaps)
|
||||
{
|
||||
}
|
||||
@ -198,12 +198,12 @@ size_t TextureCube::GetSizeOfMipLevel(const int mipLevel) const
|
||||
// ================ Texture3D ===================
|
||||
// ==============================================
|
||||
|
||||
Texture3D::Texture3D(const IImageFormat* format, const unsigned width, const unsigned height, const unsigned depth)
|
||||
Texture3D::Texture3D(const ImageFormat* format, const unsigned width, const unsigned height, const unsigned depth)
|
||||
: Texture3D(format, width, height, depth, false)
|
||||
{
|
||||
}
|
||||
|
||||
Texture3D::Texture3D(const IImageFormat* format, const unsigned width, const unsigned height, const unsigned depth,
|
||||
Texture3D::Texture3D(const ImageFormat* format, const unsigned width, const unsigned height, const unsigned depth,
|
||||
const bool mipMaps)
|
||||
: Texture(format, mipMaps)
|
||||
{
|
||||
|
@ -5,11 +5,11 @@
|
||||
class Texture
|
||||
{
|
||||
protected:
|
||||
const IImageFormat* m_format;
|
||||
const ImageFormat* m_format;
|
||||
bool m_has_mip_maps;
|
||||
uint8_t* m_data;
|
||||
|
||||
Texture(const IImageFormat* format, bool mipMaps);
|
||||
Texture(const ImageFormat* format, bool mipMaps);
|
||||
Texture(Texture&& other) noexcept;
|
||||
|
||||
Texture& operator=(Texture&& other) noexcept;
|
||||
@ -20,7 +20,7 @@ public:
|
||||
|
||||
Texture& operator=(const Texture& other) = delete;
|
||||
|
||||
const IImageFormat* GetFormat() const;
|
||||
const ImageFormat* GetFormat() const;
|
||||
|
||||
void Allocate();
|
||||
bool Empty() const;
|
||||
@ -39,8 +39,8 @@ protected:
|
||||
unsigned m_height;
|
||||
|
||||
public:
|
||||
Texture2D(const IImageFormat* format, unsigned width, unsigned height);
|
||||
Texture2D(const IImageFormat* format, unsigned width, unsigned height, bool mipMaps);
|
||||
Texture2D(const ImageFormat* format, unsigned width, unsigned height);
|
||||
Texture2D(const ImageFormat* format, unsigned width, unsigned height, bool mipMaps);
|
||||
Texture2D(const Texture2D& other) = delete;
|
||||
Texture2D(Texture2D&& other) noexcept;
|
||||
~Texture2D() override;
|
||||
@ -62,8 +62,8 @@ class TextureCube final : public Texture2D
|
||||
static const int FACE_COUNT;
|
||||
|
||||
public:
|
||||
TextureCube(const IImageFormat* format, unsigned width, unsigned height);
|
||||
TextureCube(const IImageFormat* format, unsigned width, unsigned height, bool mipMaps);
|
||||
TextureCube(const ImageFormat* format, unsigned width, unsigned height);
|
||||
TextureCube(const ImageFormat* format, unsigned width, unsigned height, bool mipMaps);
|
||||
TextureCube(const TextureCube& other) = delete;
|
||||
TextureCube(TextureCube&& other) noexcept;
|
||||
~TextureCube() override;
|
||||
@ -81,8 +81,8 @@ class Texture3D final : public Texture
|
||||
unsigned m_depth;
|
||||
|
||||
public:
|
||||
Texture3D(const IImageFormat* format, unsigned width, unsigned height, unsigned depth);
|
||||
Texture3D(const IImageFormat* format, unsigned width, unsigned height, unsigned depth, bool mipMaps);
|
||||
Texture3D(const ImageFormat* format, unsigned width, unsigned height, unsigned depth);
|
||||
Texture3D(const ImageFormat* format, unsigned width, unsigned height, unsigned depth, bool mipMaps);
|
||||
Texture3D(const Texture3D& other) = delete;
|
||||
Texture3D(Texture3D&& other) noexcept;
|
||||
~Texture3D() override;
|
||||
|
@ -7,12 +7,12 @@ IwiLoader::IwiLoader(MemoryManager* memoryManager)
|
||||
m_memory_manager = memoryManager;
|
||||
}
|
||||
|
||||
const IImageFormat* IwiLoader::GetFormat27(int8_t format)
|
||||
const ImageFormat* IwiLoader::GetFormat27(int8_t format)
|
||||
{
|
||||
switch (static_cast<iwi27::IwiFormat>(format))
|
||||
{
|
||||
case iwi27::IwiFormat::IMG_FORMAT_BITMAP_RGBA:
|
||||
return &ImageFormat::FORMAT_R8G8B8A8;
|
||||
return &ImageFormat::FORMAT_R8_G8_B8_A8;
|
||||
case iwi27::IwiFormat::IMG_FORMAT_BITMAP_ALPHA:
|
||||
return &ImageFormat::FORMAT_A8;
|
||||
case iwi27::IwiFormat::IMG_FORMAT_DXT1:
|
||||
@ -25,7 +25,7 @@ const IImageFormat* IwiLoader::GetFormat27(int8_t format)
|
||||
return &ImageFormat::FORMAT_BC5;
|
||||
case iwi27::IwiFormat::IMG_FORMAT_A16B16G16R16F:
|
||||
assert(false); // Unsupported yet
|
||||
return &ImageFormat::FORMAT_R16G16B16A16_FLOAT;
|
||||
return &ImageFormat::FORMAT_R16_G16_B16_A16_FLOAT;
|
||||
case iwi27::IwiFormat::IMG_FORMAT_BITMAP_RGB:
|
||||
case iwi27::IwiFormat::IMG_FORMAT_BITMAP_LUMINANCE_ALPHA:
|
||||
case iwi27::IwiFormat::IMG_FORMAT_BITMAP_LUMINANCE:
|
||||
@ -55,7 +55,7 @@ Texture* IwiLoader::LoadIwi27(FileAPI::IFile* file)
|
||||
if (file->Read(&header, sizeof header, 1) != 1)
|
||||
return nullptr;
|
||||
|
||||
const IImageFormat* format = GetFormat27(header.format);
|
||||
const ImageFormat* format = GetFormat27(header.format);
|
||||
if (format == nullptr)
|
||||
return nullptr;
|
||||
|
||||
|
@ -8,7 +8,7 @@ class IwiLoader
|
||||
{
|
||||
MemoryManager* m_memory_manager;
|
||||
|
||||
const IImageFormat* GetFormat27(int8_t format);
|
||||
static const ImageFormat* GetFormat27(int8_t format);
|
||||
Texture* LoadIwi27(FileAPI::IFile* file);
|
||||
|
||||
public:
|
||||
|
Loading…
x
Reference in New Issue
Block a user