From d1cbabff66436d117df17963134f792a610642d0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 16 Jun 2020 00:09:19 +0200 Subject: [PATCH] - backend update from Raze. (No, the AnimTexture isn't used yet.) --- src/common/textures/animtexture.cpp | 80 +++++++++++++++++++------- src/common/textures/animtexture.h | 21 ++++++- src/common/textures/texturemanager.cpp | 4 ++ wadsrc/static/menudef.txt | 6 -- 4 files changed, 80 insertions(+), 31 deletions(-) diff --git a/src/common/textures/animtexture.cpp b/src/common/textures/animtexture.cpp index 2d06eccab5..b19efa1679 100644 --- a/src/common/textures/animtexture.cpp +++ b/src/common/textures/animtexture.cpp @@ -33,6 +33,8 @@ */ #include "animtexture.h" #include "bitmap.h" +#include "texturemanager.h" +#include "templates.h" //========================================================================== // @@ -40,17 +42,19 @@ // //========================================================================== -void AnimTexture::SetFrameSize(int width, int height) +void AnimTexture::SetFrameSize(int format, int width, int height) { FTexture::SetSize(width, height); - Image.Resize(width * height); + Image.Resize(width * height * (format == Paletted ? 1 : 3)); + pixelformat = format; } void AnimTexture::SetFrame(const uint8_t* palette, const void* data_) { memcpy(Palette, palette, 768); - memcpy(Image.Data(), data_, Width * Height); + memcpy(Image.Data(), data_, Width * Height * (pixelformat == Paletted ? 1 : 3)); CleanHardwareTextures(); + pixelformat = Paletted; } //=========================================================================== @@ -67,14 +71,51 @@ FBitmap AnimTexture::GetBgraBitmap(const PalEntry* remap, int* trans) auto spix = Image.Data(); auto dpix = bmp.GetPixels(); - for (int i = 0; i < Width * Height; i++) + if (pixelformat == Paletted) { - int p = i * 4; - int index = spix[i]; - dpix[p + 0] = Palette[index * 3 + 2]; - dpix[p + 1] = Palette[index * 3 + 1]; - dpix[p + 2] = Palette[index * 3]; - dpix[p + 3] = 255; + for (int i = 0; i < Width * Height; i++) + { + int p = i * 4; + int index = spix[i]; + dpix[p + 0] = Palette[index * 3 + 2]; + dpix[p + 1] = Palette[index * 3 + 1]; + dpix[p + 2] = Palette[index * 3]; + dpix[p + 3] = 255; + } + } + else if (pixelformat == RGB) + { + for (int i = 0; i < Width * Height; i++) + { + int p = i * 4; + dpix[p + 0] = spix[p + 2]; + dpix[p + 1] = spix[p + 1]; + dpix[p + 2] = spix[p]; + dpix[p + 3] = 255; + } + } + else if (pixelformat == YUV) + { + for (int i = 0; i < Width * Height; i++) + { + int p = i * 4; + float y = spix[p] * (1 / 255.f); + float u = spix[p + 1] * (1 / 255.f) - 0.5f; + float v = spix[p + 2] * (1 / 255.f) - 0.5f; + + y = 1.1643f * (y - 0.0625f); + + float r = y + 1.5958f * v; + float g = y - 0.39173f * u - 0.81290f * v; + float b = y + 2.017f * u; + + dpix[p + 0] = (uint8_t)(clamp(b, 0.f, 1.f) * 255); + dpix[p + 1] = (uint8_t)(clamp(g, 0.f, 1.f) * 255); + dpix[p + 2] = (uint8_t)(clamp(r, 0.f, 1.f) * 255); + dpix[p + 3] = 255; + } + return bmp; + } return bmp; } @@ -88,20 +129,20 @@ FBitmap AnimTexture::GetBgraBitmap(const PalEntry* remap, int* trans) AnimTextures::AnimTextures() { active = 1; - tex[0] = MakeGameTexture(new AnimTexture, "", ETextureType::Special); - tex[1] = MakeGameTexture(new AnimTexture, "", ETextureType::Special); + tex[0] = TexMan.FindGameTexture("AnimTextureFrame1", ETextureType::Override); + tex[1] = TexMan.FindGameTexture("AnimTextureFrame2", ETextureType::Override); } AnimTextures::~AnimTextures() { - delete tex[0]; - delete tex[1]; + tex[0]->CleanHardwareData(true); + tex[1]->CleanHardwareData(true); } -void AnimTextures::SetSize(int width, int height) +void AnimTextures::SetSize(int format, int width, int height) { - static_cast(tex[0]->GetTexture())->SetFrameSize(width, height); - static_cast(tex[1]->GetTexture())->SetFrameSize(width, height); + static_cast(tex[0]->GetTexture())->SetFrameSize(format, width, height); + static_cast(tex[1]->GetTexture())->SetFrameSize(format, width, height); tex[0]->SetSize(width, height); tex[1]->SetSize(width, height); } @@ -111,8 +152,3 @@ void AnimTextures::SetFrame(const uint8_t* palette, const void* data) active ^= 1; static_cast(tex[active]->GetTexture())->SetFrame(palette, data); } - -FGameTexture* AnimTextures::GetFrame() -{ - return tex[active]; -} diff --git a/src/common/textures/animtexture.h b/src/common/textures/animtexture.h index 2515253a77..5710d44b3f 100644 --- a/src/common/textures/animtexture.h +++ b/src/common/textures/animtexture.h @@ -7,9 +7,16 @@ class AnimTexture : public FTexture { uint8_t Palette[768]; TArray Image; + int pixelformat; public: + enum + { + Paletted = 0, + RGB = 1, + YUV = 2 + }; AnimTexture() = default; - void SetFrameSize(int width, int height); + void SetFrameSize(int format, int width, int height); void SetFrame(const uint8_t* palette, const void* data); virtual FBitmap GetBgraBitmap(const PalEntry* remap, int* trans) override; }; @@ -22,7 +29,15 @@ class AnimTextures public: AnimTextures(); ~AnimTextures(); - void SetSize(int width, int height); + void SetSize(int format, int width, int height); void SetFrame(const uint8_t* palette, const void* data); - FGameTexture* GetFrame(); + FGameTexture* GetFrame() + { + return tex[active]; + } + + FTextureID GetFrameID() + { + return tex[active]->GetID(); + } }; diff --git a/src/common/textures/texturemanager.cpp b/src/common/textures/texturemanager.cpp index 73918db92d..60ed0c7477 100644 --- a/src/common/textures/texturemanager.cpp +++ b/src/common/textures/texturemanager.cpp @@ -45,6 +45,7 @@ #include "sc_man.h" #include "image.h" #include "vectors.h" +#include "animtexture.h" #include "formats/multipatchtexture.h" FTextureManager TexMan; @@ -1158,6 +1159,9 @@ void FTextureManager::Init(void (*progressFunc_)(), void (*checkForHacks)(BuildI AddGameTexture(CreateShaderTexture(false, true)); AddGameTexture(CreateShaderTexture(true, false)); AddGameTexture(CreateShaderTexture(true, true)); + // Add two animtexture entries so that movie playback can call functions using texture IDs. + AddGameTexture(MakeGameTexture(new AnimTexture(), "AnimTextureFrame1", ETextureType::Override)); + AddGameTexture(MakeGameTexture(new AnimTexture(), "AnimTextureFrame2", ETextureType::Override)); int wadcnt = fileSystem.GetNumWads(); diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 14935cb4fe..8959594016 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -801,12 +801,6 @@ OptionMenu "JoystickConfigMenu" protected // //------------------------------------------------------------------------------------------- -OptionValue ColumnMethods -{ - 0.0, "$OPTVAL_ORIGINAL" - 1.0, "$OPTVAL_OPTIMIZED" -} - OptionValue BlendMethods { 0.0, "$OPTVAL_CLASSIC"