Kawe Mazidjatari 04bee896be Fix string/wstring type conflict
cppkore uses string/wstring as StringBase while we use std::string/std::wstring as string/wstring. Changed all types in cppkore to String/WString instead.
2022-05-21 21:51:35 +02:00

178 lines
5.3 KiB
C++

#pragma once
#include <vector>
#include <cstdint>
#include <dxgiformat.h>
#include "StringBase.h"
#include "ImmutableStringBase.h"
#include "Stream.h"
#include "..\cppkore_incl\DirectXTex\DirectXTex.h"
namespace Assets
{
// Represents the possible supported texture containers
enum class TextureType
{
// Specifies that the type of texture is a DDS container
DDS,
// Specifies that the type of texture is a TGA container
TGA,
// Specifies that the type of texture is a HDR container
HDR,
// Specifies that the type of texture is a WIC format container
WIC
};
// Represents the possible supported save file types
enum class SaveFileType
{
// Specifies the dds image format.
Dds,
// Specifies the tga image format.
Tga,
// Specifies the tiff image format.
Tiff,
// Specifies the hdr image format.
Hdr,
// Specifies the png image format.
Png,
// Specifies the bmp image format.
Bmp,
// Specifies the jpeg image format.
Jpeg,
// Specifies the jxr image format.
Jxr,
// Specifies the gif image format.
Gif
};
// Represents the possible transcode step stages
enum class TranscodeType
{
// Calculates the missing 'Z' (B) channel of the image for a normal map
NormalMapBC5,
// Calculates the missing 'Z' (B) channel of the image for a normal map (And inverts 'Y' (G))
NormalMapBC5OpenGl,
};
// Represents a texture asset (Image) and provides support for loading and saving images
class Texture
{
public:
// Creates a texture from an existing scratch image
Texture(void* ScratchImage);
// Creates a new 2D texture with the specified width and height
Texture(uint32_t Width, uint32_t Height);
// Creates a new 2D texture with the specified width, height, and format
Texture(uint32_t Width, uint32_t Height, DXGI_FORMAT Format);
// Cleans up all texture resources
~Texture();
// Disable copying, enable move semantics
Texture(const Texture& Rhs) = delete;
Texture(Texture&& Rhs) noexcept;
// Gets the width of this image
const uint32_t Width() const;
// Gets the height of this image
const uint32_t Height() const;
// Gets the pitch of this image
const uint32_t Pitch() const;
// Gets the mip count of this image
const uint32_t MipCount() const;
// Gets the block size of this image
const uint32_t BlockSize() const;
// Gets a pointer to the pixel buffer of this texture (Image[0])
uint8_t* GetPixels();
// Gets a pointer to the pixel buffer of this texture (Image[0])
const uint8_t* GetPixels() const;
// Gets the format of the image data
const DXGI_FORMAT Format() const;
// Get the number of bits per pixel
const uint8_t GetBpp() const;
// idrk
const uint8_t Pixbl() const;
void CopyTextureSlice(std::unique_ptr<Texture>& SourceTexture, DirectX::Rect srcRect, uint32_t x, uint32_t y);
// Sets the format of the image data (Converted on call)
void ConvertToFormat(DXGI_FORMAT Format);
// Transcodes the image using a transcoder
; void Transcode(TranscodeType Type);
// Saves the texture to the specified file path
void Save(const String& File);
// Saves the texture to the specified path with the specified file type
void Save(const String& File, SaveFileType Type);
// Saves the texture to the specified stream
void Save(IO::Stream& Stream, SaveFileType Type = SaveFileType::Dds);
// Saves the texture to the specified buffer
void Save(uint8_t* Buffer, uint64_t BufferLength, SaveFileType Type = SaveFileType::Dds);
// Loads a texture from the specified file path
static Texture FromFile(const String& File);
// Loads a texture from the specified file path with the specified type
static Texture FromFile(const String& File, TextureType Type);
// Loads a texture from the specified stream
static Texture FromStream(IO::Stream& Stream, TextureType Type = TextureType::DDS);
// Loads a texture from the specified buffer
static Texture FromBuffer(uint8_t* Buffer, uint64_t BufferLength, TextureType Type = TextureType::DDS);
// Loads a texture from the specified raw block data
static Texture FromRawBlock(uint8_t* Buffer, uint64_t BufferLength, uint32_t Width, uint32_t Height, DXGI_FORMAT Format);
static int Morton(uint32_t i, uint32_t sx, uint32_t sy);
// Returns the file extension for the given type
constexpr static imstring GetExtensionForType(const SaveFileType Type)
{
switch (Type)
{
case SaveFileType::Tga:
return ".tga";
case SaveFileType::Tiff:
return ".tiff";
case SaveFileType::Hdr:
return ".hdr";
case SaveFileType::Png:
return ".png";
case SaveFileType::Bmp:
return ".bmp";
case SaveFileType::Jpeg:
return ".jpg";
case SaveFileType::Jxr:
return ".jxr";
case SaveFileType::Gif:
return ".gif";
}
return ".dds";
}
protected:
// Used for specific load routines
Texture();
private:
// Internal image data, managed by DirectXTex
void* DirectXImage;
// Internal routine to ensure the proper DXGI_FORMAT for the specified type
void EnsureFormatForType(SaveFileType Type);
// Internal routine to save to a blob type
void SaveToMemoryBlob(void* Blob, SaveFileType Type);
// A list of transcoder implementations
void Transcoder_NormalMapBC5();
void Transcoder_NormalMapBC5OpenGl();
// Internal routine to ensure that a 32bpp DXGI_FORMAT is selected
static bool IsValid32bppFormat(DXGI_FORMAT Format);
};
}