diff --git a/source/glbackend/gl_hwtexture.h b/source/glbackend/gl_hwtexture.h index 1797c7639..56edb6ea6 100644 --- a/source/glbackend/gl_hwtexture.h +++ b/source/glbackend/gl_hwtexture.h @@ -3,6 +3,7 @@ #define __GLTEXTURE_H class FBitmap; +class FTexture; class FHardwareTexture //: public IHardwareTexture { @@ -15,6 +16,7 @@ private: int glTextureBytes = 4; bool mipmapped = true; int mWidth = 0, mHeight = 0; + int colorId = 0; public: @@ -28,6 +30,45 @@ public: unsigned int GetTextureHandle(); int GetSampler() { return mSampler; } void SetSampler(int sampler) { mSampler = sampler; } + + friend class FGameTexture; +}; + +class FGameTexture +{ + int Width, Height; + bool isHightile; + + FTexture* sourceData = nullptr; + // either indexed or the sole image for hightiles. + FHardwareTexture* hwBase = nullptr; + // If the number was large a TMap would be better - + // but in most cases the maximum number of palettes for a single tile is less than 10 where a linear search is much faster than a TMap. + TArray hwTextures; +public: + FGameTexture(bool hightile, int width, int height); + virtual ~FGameTexture(); + + // For dynamic subtypes. + virtual void SizeChanged(int width, int height); + static constexpr int MakeId(int palette, int palswap) + { + return palette + 256 * palswap; + } + + FHardwareTexture* GetBaseTexture(); + FHardwareTexture* CreateHardwareTexture(int palette, int palswap); + + FHardwareTexture* GetHardwareTexture(int palette, int palswap) + { + if (isHightile) return GetBaseTexture(); + auto id = MakeId(palette, palswap); + auto found = hwTextures.FindEx([=](FHardwareTexture* tex) + { + return tex->colorId == id; + }); + if (!found) return CreateHardwareTexture(palette, palswap); + } }; #endif diff --git a/source/glbackend/glbackend.h b/source/glbackend/glbackend.h index 04bc4c664..41b38bdb8 100644 --- a/source/glbackend/glbackend.h +++ b/source/glbackend/glbackend.h @@ -159,7 +159,9 @@ public: int GetTextureID(); FHardwareTexture* NewTexture(); + FGameTexture* NewTexture(const char *name, bool hightile); void BindTexture(int texunit, FHardwareTexture *texid, int sampler = NoSampler); + void BindTexture(int texunit, FGameTexture* texid, int sampler = NoSampler); void UnbindTexture(int texunit); void UnbindAllTextures(); void EnableBlend(bool on);