- moved the textures used for the animations into the texture manager.

This is to allow giving them a texture ID so that they can be used from ZScript which has no access to naked textures.
This also consolidates AnimTexture and VpxTexture.
This commit is contained in:
Christoph Oelckers 2020-06-14 20:27:13 +02:00
parent edd9f1773b
commit 946da7d622
9 changed files with 94 additions and 104 deletions

View file

@ -172,7 +172,7 @@ void credPlaySmk(const char *_pzSMK, const char *_pzWAV, int nWav)
uint8_t palette[768]; uint8_t palette[768];
AnimTextures animtex; AnimTextures animtex;
TArray<uint8_t> pFrame(nWidth * nHeight + std::max(nWidth, nHeight), true); TArray<uint8_t> pFrame(nWidth * nHeight + std::max(nWidth, nHeight), true);
animtex.SetSize(nWidth, nHeight); animtex.SetSize(AnimTexture::Paletted, nWidth, nHeight);
int nFrameRate = Smacker_GetFrameRate(hSMK); int nFrameRate = Smacker_GetFrameRate(hSMK);
int nFrames = Smacker_GetNumFrames(hSMK); int nFrames = Smacker_GetNumFrames(hSMK);

View file

@ -14,6 +14,8 @@
#include "bitmap.h" #include "bitmap.h"
#include "v_draw.h" #include "v_draw.h"
#include "v_video.h" #include "v_video.h"
#include "texturemanager.h"
#include "animtexture.h"
#undef UNUSED #undef UNUSED
#define VPX_CODEC_DISABLE_COMPAT 1 #define VPX_CODEC_DISABLE_COMPAT 1
@ -21,74 +23,6 @@
#include <vpx/vp8dx.h> #include <vpx/vp8dx.h>
#include "animvpx.h" #include "animvpx.h"
class VPXTexture : public FTexture
{
public:
VPXTexture();
void SetFrame(const void* data, int width, int height);
virtual FBitmap GetBgraBitmap(const PalEntry* remap, int* trans) override;
protected:
const void* data;
public:
};
//==========================================================================
//
//
//
//==========================================================================
VPXTexture::VPXTexture() {}
void VPXTexture::SetFrame(const void *data_, int width, int height)
{
Width = width;
Height = height;
data = data_;
SystemTextures.Clean();
}
//===========================================================================
//
// FPNGTexture::CopyPixels
//
//===========================================================================
FBitmap VPXTexture::GetBgraBitmap(const PalEntry* remap, int* trans)
{
FBitmap bmp;
bmp.Create(Width, Height);
auto spix = (uint8_t*)data;
auto dpix = bmp.GetPixels();
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, 1.f) * 255);
dpix[p + 1] = (uint8_t)(clamp(g, 0, 1.f) * 255);
dpix[p + 2] = (uint8_t)(clamp(r, 0, 1.f) * 255);
dpix[p + 3] = 255;
}
return bmp;
}
const char *animvpx_read_ivf_header_errmsg[] = { const char *animvpx_read_ivf_header_errmsg[] = {
"All OK", "All OK",
"couldn't read 32-byte IVF header", "couldn't read 32-byte IVF header",
@ -418,17 +352,18 @@ static int which;
void animvpx_setup_glstate(int32_t animvpx_flags) void animvpx_setup_glstate(int32_t animvpx_flags)
{ {
////////// GL STATE ////////// ////////// GL STATE //////////
vpxtex[0] = MakeGameTexture(new VPXTexture, nullptr, ETextureType::Special); vpxtex[0] = TexMan.FindGameTexture("AnimTextureFrame1", ETextureType::Override);
vpxtex[1] = MakeGameTexture(new VPXTexture, nullptr, ETextureType::Special); vpxtex[1] = TexMan.FindGameTexture("AnimTextureFrame2", ETextureType::Override);
sampler = CLAMP_XY; sampler = CLAMP_XY;
GLInterface.ClearScreen(0, true); GLInterface.ClearScreen(0, true);
} }
void animvpx_restore_glstate(void) void animvpx_restore_glstate(void)
{ {
delete vpxtex[0]; vpxtex[0]->CleanHardwareData();
vpxtex[0] = nullptr; vpxtex[0] = nullptr;
delete vpxtex[1]; vpxtex[1]->CleanHardwareData();
vpxtex[1] = nullptr; vpxtex[1] = nullptr;
} }
@ -443,8 +378,8 @@ int32_t animvpx_render_frame(animvpx_codec_ctx *codec, double animvpx_aspect)
return 2; // shouldn't happen return 2; // shouldn't happen
which ^= 1; which ^= 1;
static_cast<VPXTexture*>(vpxtex[which]->GetTexture())->SetFrame(codec->pic, codec->width, codec->height); static_cast<AnimTexture*>(vpxtex[which]->GetTexture())->SetFrameSize(AnimTexture::YUV, codec->width, codec->height);
vpxtex[which]->CleanHardwareData(); static_cast<AnimTexture*>(vpxtex[which]->GetTexture())->SetFrame(nullptr, codec->pic);
float vid_wbyh = ((float)codec->width)/codec->height; float vid_wbyh = ((float)codec->width)/codec->height;
if (animvpx_aspect > 0) if (animvpx_aspect > 0)

View file

@ -33,6 +33,8 @@
*/ */
#include "animtexture.h" #include "animtexture.h"
#include "bitmap.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); 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_) void AnimTexture::SetFrame(const uint8_t* palette, const void* data_)
{ {
memcpy(Palette, palette, 768); memcpy(Palette, palette, 768);
memcpy(Image.Data(), data_, Width * Height); memcpy(Image.Data(), data_, Width * Height * (pixelformat == Paletted ? 1 : 3));
CleanHardwareTextures(); CleanHardwareTextures();
pixelformat = Paletted;
} }
//=========================================================================== //===========================================================================
@ -67,14 +71,51 @@ FBitmap AnimTexture::GetBgraBitmap(const PalEntry* remap, int* trans)
auto spix = Image.Data(); auto spix = Image.Data();
auto dpix = bmp.GetPixels(); auto dpix = bmp.GetPixels();
for (int i = 0; i < Width * Height; i++) if (pixelformat == Paletted)
{ {
int p = i * 4; for (int i = 0; i < Width * Height; i++)
int index = spix[i]; {
dpix[p + 0] = Palette[index * 3 + 2]; int p = i * 4;
dpix[p + 1] = Palette[index * 3 + 1]; int index = spix[i];
dpix[p + 2] = Palette[index * 3]; dpix[p + 0] = Palette[index * 3 + 2];
dpix[p + 3] = 255; 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; return bmp;
} }
@ -88,20 +129,20 @@ FBitmap AnimTexture::GetBgraBitmap(const PalEntry* remap, int* trans)
AnimTextures::AnimTextures() AnimTextures::AnimTextures()
{ {
active = 1; active = 1;
tex[0] = MakeGameTexture(new AnimTexture, "", ETextureType::Special); tex[0] = TexMan.FindGameTexture("AnimTextureFrame1", ETextureType::Override);
tex[1] = MakeGameTexture(new AnimTexture, "", ETextureType::Special); tex[1] = TexMan.FindGameTexture("AnimTextureFrame2", ETextureType::Override);
} }
AnimTextures::~AnimTextures() AnimTextures::~AnimTextures()
{ {
delete tex[0]; tex[0]->CleanHardwareData(true);
delete tex[1]; tex[1]->CleanHardwareData(true);
} }
void AnimTextures::SetSize(int width, int height) void AnimTextures::SetSize(int format, int width, int height)
{ {
static_cast<AnimTexture*>(tex[0]->GetTexture())->SetFrameSize(width, height); static_cast<AnimTexture*>(tex[0]->GetTexture())->SetFrameSize(format, width, height);
static_cast<AnimTexture*>(tex[1]->GetTexture())->SetFrameSize(width, height); static_cast<AnimTexture*>(tex[1]->GetTexture())->SetFrameSize(format, width, height);
tex[0]->SetSize(width, height); tex[0]->SetSize(width, height);
tex[1]->SetSize(width, height); tex[1]->SetSize(width, height);
} }
@ -111,8 +152,3 @@ void AnimTextures::SetFrame(const uint8_t* palette, const void* data)
active ^= 1; active ^= 1;
static_cast<AnimTexture*>(tex[active]->GetTexture())->SetFrame(palette, data); static_cast<AnimTexture*>(tex[active]->GetTexture())->SetFrame(palette, data);
} }
FGameTexture* AnimTextures::GetFrame()
{
return tex[active];
}

View file

@ -7,9 +7,16 @@ class AnimTexture : public FTexture
{ {
uint8_t Palette[768]; uint8_t Palette[768];
TArray<uint8_t> Image; TArray<uint8_t> Image;
int pixelformat;
public: public:
enum
{
Paletted = 0,
RGB = 1,
YUV = 2
};
AnimTexture() = default; 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); void SetFrame(const uint8_t* palette, const void* data);
virtual FBitmap GetBgraBitmap(const PalEntry* remap, int* trans) override; virtual FBitmap GetBgraBitmap(const PalEntry* remap, int* trans) override;
}; };
@ -22,7 +29,15 @@ class AnimTextures
public: public:
AnimTextures(); AnimTextures();
~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); void SetFrame(const uint8_t* palette, const void* data);
FGameTexture* GetFrame(); FGameTexture* GetFrame()
{
return tex[active];
}
FTextureID GetFrameID()
{
return tex[active]->GetID();
}
}; };

View file

@ -45,6 +45,7 @@
#include "sc_man.h" #include "sc_man.h"
#include "image.h" #include "image.h"
#include "vectors.h" #include "vectors.h"
#include "animtexture.h"
#include "formats/multipatchtexture.h" #include "formats/multipatchtexture.h"
FTextureManager TexMan; FTextureManager TexMan;
@ -1158,6 +1159,9 @@ void FTextureManager::Init(void (*progressFunc_)(), void (*checkForHacks)(BuildI
AddGameTexture(CreateShaderTexture(false, true)); AddGameTexture(CreateShaderTexture(false, true));
AddGameTexture(CreateShaderTexture(true, false)); AddGameTexture(CreateShaderTexture(true, false));
AddGameTexture(CreateShaderTexture(true, true)); 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(); int wadcnt = fileSystem.GetNumWads();

View file

@ -444,7 +444,7 @@ int32_t Anim_Play(const char *fn)
{ {
AnimTextures animtex; AnimTextures animtex;
animtex.SetSize(320, 200); animtex.SetSize(AnimTexture::Paletted, 320, 200);
do do
{ {

View file

@ -216,7 +216,7 @@ void PlayMovie(const char* fileName)
int z = 0; int z = 0;
AnimTextures animtex; AnimTextures animtex;
animtex.SetSize(200, 320); animtex.SetSize(AnimTexture::Paletted, 200, 320);
// Read a frame in first // Read a frame in first
if (ReadFrame(fp, palette)) if (ReadFrame(fp, palette))

View file

@ -480,7 +480,7 @@ int32_t Anim_Play(const char *fn)
{ {
AnimTextures animtex; AnimTextures animtex;
animtex.SetSize(320, 200); animtex.SetSize(AnimTexture::Paletted, 320, 200);
do do
{ {

View file

@ -262,7 +262,7 @@ playanm(short anim_num)
{ {
AnimTextures animtex; AnimTextures animtex;
animtex.SetSize(320, 200); animtex.SetSize(AnimTexture::Paletted, 320, 200);
if (ANIMnum == 1) if (ANIMnum == 1)
{ {
// draw the first frame // draw the first frame