diff --git a/source/glbackend/gl_hwtexture.cpp b/source/glbackend/gl_hwtexture.cpp index 8c43bde40..1ce4d147f 100644 --- a/source/glbackend/gl_hwtexture.cpp +++ b/source/glbackend/gl_hwtexture.cpp @@ -64,19 +64,35 @@ unsigned int FHardwareTexture::CreateTexture(int w, int h, bool eightbit, bool m // //=========================================================================== -unsigned int FHardwareTexture::LoadTexture(unsigned char * buffer) +unsigned int FHardwareTexture::LoadTexture(const unsigned char * buffer) +{ + return LoadTexturePart(buffer, 0, 0, mWidth, mHeight); +} + +unsigned int FHardwareTexture::LoadTexture(FBitmap& bmp) +{ + return LoadTexture(bmp.GetPixels()); +} + +//=========================================================================== +// +// Loads the texture image into the hardware +// +//=========================================================================== + +unsigned int FHardwareTexture::LoadTexturePart(const unsigned char* buffer, int x, int y, int w, int h) { if (glTexID == 0) return 0; - int dstformat = glTextureBytes == 1? GL_R8 : GL_RGBA8;// TexFormat[gl_texture_format]; + int dstformat = glTextureBytes == 1 ? GL_R8 : GL_RGBA8;// TexFormat[gl_texture_format]; int srcformat = glTextureBytes == 1 ? GL_RED : GL_BGRA;// TexFormat[gl_texture_format]; glActiveTexture(GL_TEXTURE15); glBindTexture(GL_TEXTURE_2D, glTexID); if (glTextureBytes < 4) glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, srcformat, GL_UNSIGNED_BYTE, buffer); + + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, srcformat, GL_UNSIGNED_BYTE, buffer); if (mipmapped) glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); @@ -85,11 +101,6 @@ unsigned int FHardwareTexture::LoadTexture(unsigned char * buffer) return glTexID; } -unsigned int FHardwareTexture::LoadTexture(FBitmap& bmp) -{ - return LoadTexture(bmp.GetPixels()); -} - //=========================================================================== // // Destroys the texture diff --git a/source/glbackend/gl_hwtexture.h b/source/glbackend/gl_hwtexture.h index 9493eb2cf..afb804794 100644 --- a/source/glbackend/gl_hwtexture.h +++ b/source/glbackend/gl_hwtexture.h @@ -27,7 +27,8 @@ public: //bool BindOrCreate(FTexture *tex, int texunit, int clampmode, int translation, int flags); unsigned int CreateTexture(int w, int h, bool eightbit, bool mipmapped); - unsigned int LoadTexture(unsigned char * buffer); + unsigned int LoadTexture(const unsigned char * buffer); + unsigned int LoadTexturePart(const unsigned char* buffer, int x, int y, int w, int h); unsigned int LoadTexture(FBitmap &bmp); unsigned int GetTextureHandle(); int GetSampler() { return mSampler; } diff --git a/source/glbackend/gl_palmanager.cpp b/source/glbackend/gl_palmanager.cpp index 997314e9b..0b80386b7 100644 --- a/source/glbackend/gl_palmanager.cpp +++ b/source/glbackend/gl_palmanager.cpp @@ -35,10 +35,7 @@ #include #include "m_crc32.h" -#include "glad/glad.h" #include "glbackend.h" -#include "gl_samplers.h" -#include "gl_shader.h" #include "baselayer.h" #include "resourcefile.h" @@ -214,13 +211,28 @@ void PaletteManager::BindPalette(int index) void PaletteManager::SetPalswapData(int index, const uint8_t* data, int numshades_) { - // New palettes may only be added if declared transient or on startup. - // Otherwise this would require a renderer reset to flush out the textures affected by the change. - if (index < 0 || index > 255) return; // invalid index - ignore. numshades = numshades_; palswapmap[index] = FindPalswap(data); + if (palswapTexture == nullptr) + { + palswapTexture = inst->NewTexture(); + palswapTexture->CreateTexture(PALSWAP_TEXTURE_SIZE, PALSWAP_TEXTURE_SIZE, true, false); + palswapTexture->SetSampler(Sampler2DNoFilter); + } + else inst->UnbindTexture(1); // Unbind for updating. + + int32_t column = index % (PALSWAP_TEXTURE_SIZE / 256); + int32_t row = index / (PALSWAP_TEXTURE_SIZE / 256); + int32_t rowOffset = (numshades + 1) * row; + if (rowOffset > PALSWAP_TEXTURE_SIZE) + { + OSD_Printf("Polymost: palswaps are too large for palswap tilesheet!\n"); + return; + } + palswapTexture->LoadTexturePart(data, 256 * column, rowOffset, 256, numshades + 1); + } //=========================================================================== @@ -231,7 +243,6 @@ void PaletteManager::SetPalswapData(int index, const uint8_t* data, int numshade void PaletteManager::UpdatePalswaps(int width, int height) { - if (palswapTexture) delete palswapTexture; for (auto& pal : palettes) { pal.shadesdone = false; @@ -245,72 +256,5 @@ void PaletteManager::UpdatePalswaps(int width, int height) (height - 1) * (1.f / PALSWAP_TEXTURE_SIZE) }; inst->SetPalswapSize(&polymost1PalswapInnerSize.x); - + inst->BindTexture(1, palswapTexture); } - - -void GLInstance::SetPalswap(int index) -{ - float v1 = index * renderState.PalswapSize[0]; - float v2 = floorf(v1); - renderState.PalswapPos[0] = v1 - v2 + (0.5f / PALSWAP_TEXTURE_SIZE); - renderState.PalswapPos[1] = v2 * renderState.PalswapSize[1] + (0.5f / PALSWAP_TEXTURE_SIZE); -} - - -#if 0 - -static void polymost_setPalswapSize(uint32_t width, uint32_t height) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - -} - - -#endif - -// No point porting this, it's too much work for a short lived solution. -#if 0 -char allocateTexture = !palswapTextureID; -if (allocateTexture) -{ - G etTextureHandle(&palswapTextureID); -} -g lBindTexture(GL _TEXTURE_2D, palswapTextureID); -if (allocateTexture) -{ - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_BASE_LEVEL, 0); - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_MAX_LEVEL, 0); - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_MAG_FILTER, GL _NEAREST); - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_MIN_FILTER, GL _NEAREST); - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_MAX_ANISOTROPY_EXT, 1); - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE); - g lTexParameteri(GL _TEXTURE_2D, GL _TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE); - g lTexImage2D(GL _TEXTURE_2D, 0, GL _RED, PALSWAP_TEXTURE_SIZE, PALSWAP_TEXTURE_SIZE, 0, GL _RED, GL _UNSIGNED_BYTE, NULL); -} - -int32_t column = palookupnum % (PALSWAP_TEXTURE_SIZE / 256); -int32_t row = palookupnum / (PALSWAP_TEXTURE_SIZE / 256); -int32_t rowOffset = (numshades + 1) * row; -if (rowOffset > PALSWAP_TEXTURE_SIZE) -{ - OSD_Printf("Polymost: palswaps are too large for palswap tilesheet!\n"); - return; -} -g lTexSubImage2D(GL _TEXTURE_2D, 0, 256 * column, rowOffset, 256, numshades + 1, GL _RED, GL _UNSIGNED_BYTE, palookup[palookupnum]); - -polymost_setPalswapSize(256, numshades + 1); - -static void polymost_updatePalette() -{ - if (videoGetRenderMode() != REND_POLYMOST) - { - return; - } - - polymost_setPalswap(globalpal); - polymost_setShade(globalshade); - -} -#endif diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp index ffa7cd12e..c0868b907 100644 --- a/source/glbackend/glbackend.cpp +++ b/source/glbackend/glbackend.cpp @@ -438,6 +438,16 @@ void GLInstance::SetPalette(int index) palmanager.BindPalette(index); } + +void GLInstance::SetPalswap(int index) +{ + float v1 = index * renderState.PalswapSize[0]; + float v2 = floorf(v1); + renderState.PalswapPos[0] = v1 - v2 + (0.5f / PALSWAP_TEXTURE_SIZE); + renderState.PalswapPos[1] = v2 * renderState.PalswapSize[1] + (0.5f / PALSWAP_TEXTURE_SIZE); +} + + void PolymostRenderState::Apply(PolymostShader* shader) { shader->Clamp.Set(Clamp); diff --git a/source/glbackend/glbackend.h b/source/glbackend/glbackend.h index c18f5ca19..4dd9287e9 100644 --- a/source/glbackend/glbackend.h +++ b/source/glbackend/glbackend.h @@ -22,6 +22,7 @@ struct PaletteData PalEntry colors[256]; float shades[512]; // two values (addshade and mulshade for each palswap.) bool shadesdone; + int whiteindex, blackindex; FHardwareTexture* paltexture; };