#pragma once #include "IResource.h" #include "../Core/Types.h" namespace XCEngine { namespace Resources { enum class TextureType { Texture2D, Texture3D, TextureCube, Texture2DArray, TextureCubeArray }; enum class TextureFormat { Unknown, R8_UNORM, RG8_UNORM, RGBA8_UNORM, RGBA8_SRGB, R16_FLOAT, RG16_FLOAT, RGBA16_FLOAT, R32_FLOAT, RG32_FLOAT, RGBA32_FLOAT, D16_UNORM, D24_UNORM_S8_UINT, D32_FLOAT, D32_FLOAT_S8_X24_UINT, BC1_UNORM, BC1_UNORM_SRGB, BC2_UNORM, BC2_UNORM_SRGB, BC3_UNORM, BC3_UNORM_SRGB, BC4_UNORM, BC5_UNORM, BC6H_UF16, BC7_UNORM, BC7_UNORM_SRGB }; enum class TextureUsage : Core::uint8 { None = 0, ShaderResource = 1 << 0, RenderTarget = 1 << 1, DepthStencil = 1 << 2, UnorderedAccess = 1 << 3, TransferSrc = 1 << 4, TransferDst = 1 << 5 }; class Texture : public IResource { public: Texture(); virtual ~Texture() override; ResourceType GetType() const override { return ResourceType::Texture; } const Containers::String& GetName() const override { return m_name; } const Containers::String& GetPath() const override { return m_path; } ResourceGUID GetGUID() const override { return m_guid; } bool IsValid() const override { return m_isValid; } size_t GetMemorySize() const override { return m_memorySize; } void Release() override; Core::uint32 GetWidth() const { return m_width; } Core::uint32 GetHeight() const { return m_height; } Core::uint32 GetDepth() const { return m_depth; } Core::uint32 GetMipLevels() const { return m_mipLevels; } Core::uint32 GetArraySize() const { return m_arraySize; } TextureType GetTextureType() const { return m_textureType; } TextureFormat GetFormat() const { return m_format; } TextureUsage GetUsage() const { return m_usage; } const void* GetPixelData() const { return m_pixelData.Data(); } size_t GetPixelDataSize() const { return m_pixelData.Size(); } bool Create(Core::uint32 width, Core::uint32 height, Core::uint32 depth, Core::uint32 mipLevels, TextureType type, TextureFormat format, const void* data, size_t dataSize); bool GenerateMipmaps(); private: Core::uint32 m_width = 0; Core::uint32 m_height = 0; Core::uint32 m_depth = 1; Core::uint32 m_mipLevels = 1; Core::uint32 m_arraySize = 1; TextureType m_textureType = TextureType::Texture2D; TextureFormat m_format = TextureFormat::RGBA8_UNORM; TextureUsage m_usage = TextureUsage::ShaderResource; Containers::Array m_pixelData; }; } // namespace Resources } // namespace XCEngine