#pragma once #include "GCNTypes.hpp" #include "CFactoryMgr.hpp" #include "IObj.hpp" #include "IOStreams.hpp" #include "Graphics/CGraphics.hpp" #include "boo/graphicsdev/IGraphicsDataFactory.hpp" namespace urde { class CVParamTransfer; class CTexture { public: enum class EFontType { None = -1, OneLayer = 0, /* Fill bit0 */ OneLayerOutline = 1, /* Fill bit0, Outline bit1 */ FourLayers = 2, TwoLayersOutlines = 3, /* Fill bit0/2, Outline bit1/3 */ TwoLayers = 4, /* Fill bit0/1 and copied to bit2/3 */ TwoLayersOutlines2 = 8 /* Fill bit2/3, Outline bit0/1 */ }; private: ETexelFormat x0_fmt; u16 x4_w; u16 x6_h; u32 x8_mips; boo::ObjToken m_booTex; boo::ObjToken m_paletteTex; std::unique_ptr m_otex; EFontType m_ftype = EFontType::None; size_t ComputeMippedTexelCount(); size_t ComputeMippedBlockCountDXT1(); void BuildI4FromGCN(CInputStream& in); void BuildI8FromGCN(CInputStream& in); void BuildIA4FromGCN(CInputStream& in); void BuildIA8FromGCN(CInputStream& in); void BuildC4FromGCN(CInputStream& in); void BuildC8FromGCN(CInputStream& in); void BuildC14X2FromGCN(CInputStream& in); void BuildRGB565FromGCN(CInputStream& in); void BuildRGB5A3FromGCN(CInputStream& in); void BuildRGBA8FromGCN(CInputStream& in); void BuildDXT1FromGCN(CInputStream& in); void BuildRGBA8(const void* data, size_t length); void BuildC8(const void* data, size_t length); void BuildC8Font(const void* data, EFontType ftype); void BuildDXT1(const void* data, size_t length); public: CTexture(ETexelFormat, s16, s16, s32); CTexture(std::unique_ptr&& in, u32 length, bool otex); enum class EClampMode { None, One }; ETexelFormat GetTexelFormat() const {return x0_fmt;} ETexelFormat GetMemoryCardTexelFormat() const {return x0_fmt == ETexelFormat::C8PC ? ETexelFormat::C8 : ETexelFormat::RGB5A3;} u16 GetWidth() const {return x4_w;} u16 GetHeight() const {return x6_h;} u32 GetNumMips() const {return x8_mips;} void Load(int slot, EClampMode clamp) const; const boo::ObjToken& GetBooTexture() const {return m_booTex;} const boo::ObjToken& GetPaletteTexture() const {return m_paletteTex;} std::unique_ptr BuildMemoryCardTex(u32& sizeOut, ETexelFormat& fmtOut, std::unique_ptr& paletteOut) const; const boo::ObjToken& GetFontTexture(EFontType tp); }; CFactoryFnReturn FTextureFactory(const urde::SObjectTag& tag, std::unique_ptr&& in, u32 len, const urde::CVParamTransfer& vparms, CObjectReference* selfRef); }