- moved several members from FTexture to FGameTexture.

This commit is contained in:
Christoph Oelckers 2020-04-17 18:52:48 +02:00
parent 42304d9680
commit 7641da8b7b
7 changed files with 59 additions and 46 deletions

View File

@ -126,7 +126,7 @@ FMaterial::FMaterial(FGameTexture * tx, int scaleflags)
mScaleFlags = scaleflags;
mTextureLayers.ShrinkToFit();
imgtex->Material[scaleflags] = this;
tx->Material[scaleflags] = this;
if (tx->isHardwareCanvas()) tx->SetTranslucent(false);
}
@ -167,10 +167,9 @@ FMaterial * FMaterial::ValidateTexture(FGameTexture * gtex, int scaleflags, bool
{
if (gtex && gtex->isValid())
{
auto tex = gtex->GetTexture();
if (!gtex->ShouldExpandSprite()) scaleflags &= ~CTF_Expand;
FMaterial *hwtex = tex->Material[scaleflags];
FMaterial *hwtex = gtex->Material[scaleflags];
if (hwtex == NULL && create)
{
hwtex = new FMaterial(gtex, scaleflags);

View File

@ -152,17 +152,6 @@ FTexture::~FTexture ()
{
if (areas != nullptr) delete[] areas;
areas = nullptr;
for (int i = 0; i < 2; i++)
{
if (Material[i] != nullptr) DeleteMaterial(Material[i]);
Material[i] = nullptr;
}
if (SoftwareTexture != nullptr)
{
delete SoftwareTexture;
SoftwareTexture = nullptr;
}
}
//===========================================================================
@ -861,10 +850,10 @@ void FGameTexture::SetupSpriteData()
{
// Since this is only needed for real sprites it gets allocated on demand.
// It also allocates from the image memory arena because it has the same lifetime and to reduce maintenance.
if (Base->spi == nullptr) Base->spi = (SpritePositioningInfo*)ImageArena.Alloc(2 * sizeof(SpritePositioningInfo));
if (spi == nullptr) spi = (SpritePositioningInfo*)ImageArena.Alloc(2 * sizeof(SpritePositioningInfo));
for (int i = 0; i < 2; i++)
{
auto& spi = Base->spi[i];
auto& spi = this->spi[i];
spi.mSpriteU[0] = spi.mSpriteV[0] = 0.f;
spi.mSpriteU[1] = spi.mSpriteV[1] = 1.f;
spi.spriteWidth = GetTexelWidth();
@ -889,7 +878,7 @@ void FGameTexture::SetupSpriteData()
void FGameTexture::SetSpriteRect()
{
if (!Base->spi) return;
if (!spi) return;
auto leftOffset = GetLeftOffsetHW();
auto topOffset = GetTopOffsetHW();
@ -898,7 +887,7 @@ void FGameTexture::SetSpriteRect()
for (int i = 0; i < 2; i++)
{
auto& spi = Base->spi[i];
auto& spi = this->spi[i];
// mSpriteRect is for positioning the sprite in the scene.
spi.mSpriteRect.left = -leftOffset / fxScale;
@ -1087,8 +1076,17 @@ FGameTexture::~FGameTexture()
{
FGameTexture* link = fileSystem.GetLinkedTexture(GetSourceLump());
if (link == this) fileSystem.SetLinkedTexture(GetSourceLump(), nullptr);
auto str = GetName();
Printf("Deleting texture %s\n", str.GetChars());
if (SoftwareTexture != nullptr)
{
delete SoftwareTexture;
SoftwareTexture = nullptr;
}
for (auto &mat : Material)
{
if (mat != nullptr) DeleteMaterial(mat);
mat = nullptr;
}
}
bool FGameTexture::isUserContent() const

View File

@ -119,8 +119,8 @@ void FTextureManager::FlushAll()
for (int j = 0; j < 2; j++)
{
Textures[i].Texture->GetTexture()->CleanHardwareTextures(true);
delete Textures[i].Texture->GetTexture()->SoftwareTexture;
Textures[i].Texture->GetTexture()->SoftwareTexture = nullptr;
delete Textures[i].Texture->GetSoftwareTexture();
Textures[i].Texture->SetSoftwareTexture(nullptr);
calcShouldUpscale(Textures[i].Texture);
}
}

View File

@ -248,8 +248,6 @@ class FTexture : public RefCountedBase
public:
SpritePositioningInfo *spi = nullptr;
IHardwareTexture* GetHardwareTexture(int translation, int scaleflags);
static FTexture *CreateTexture(const char *name, int lumpnum, ETextureType UseType);
virtual ~FTexture ();
@ -335,16 +333,6 @@ public:
static bool SmoothEdges(unsigned char * buffer,int w, int h);
static PalEntry averageColor(const uint32_t *data, int size, int maxout);
ISoftwareTexture* GetSoftwareTexture()
{
return SoftwareTexture;
}
void SetSoftwareTextue(ISoftwareTexture* swtex)
{
SoftwareTexture = swtex;
}
protected:
DVector2 Scale;
@ -352,11 +340,9 @@ protected:
int SourceLump;
FTextureID id;
FMaterial *Material[4] = { };
public:
FHardwareTextureContainer SystemTextures;
protected:
ISoftwareTexture *SoftwareTexture = nullptr;
protected:
@ -440,10 +426,6 @@ public:
{
return bTranslucent != -1 ? bTranslucent : DetermineTranslucency();
}
FMaterial* GetMaterial(int num)
{
return Material[num];
}
private:
int CheckDDPK3();
@ -610,7 +592,7 @@ class FGameTexture
{
friend class FMaterial;
// Material layers
// Material layers. These are shared so reference counting is used.
RefCountedPtr<FTexture> Base;
RefCountedPtr<FTexture> Brightmap;
RefCountedPtr<FTexture> Detailmap;
@ -624,6 +606,10 @@ class FGameTexture
int8_t shouldUpscaleFlag = 0; // Without explicit setup, scaling is disabled for a texture.
ETextureType UseType = ETextureType::Wall; // This texture's primary purpose
SpritePositioningInfo* spi = nullptr;
ISoftwareTexture* SoftwareTexture = nullptr;
FMaterial* Material[4] = { };
public:
FGameTexture(FTexture* wrap) : Base(wrap) {}
@ -679,9 +665,22 @@ public:
void SetSkyOffset(int ofs) { Base->SetSkyOffset(ofs); }
int GetSkyOffset() const { return Base->GetSkyOffset(); }
FTextureID GetID() const { return Base->GetID(); }
ISoftwareTexture* GetSoftwareTexture() { return Base->GetSoftwareTexture(); }
void SetSoftwareTexture(ISoftwareTexture* swtex) { Base->SetSoftwareTextue(swtex); }
void SetScale(DVector2 vec) { Base->SetScale(vec); }
ISoftwareTexture* GetSoftwareTexture()
{
return SoftwareTexture;
}
void SetSoftwareTexture(ISoftwareTexture* swtex)
{
SoftwareTexture = swtex;
}
FMaterial* GetMaterial(int num)
{
return Material[num];
}
const FString& GetName() const { return Base->GetName(); }
void SetShaderSpeed(float speed) { Base->shaderspeed = speed; }
void SetShaderIndex(int index) { Base->shaderindex = index; }
@ -726,7 +725,7 @@ public:
void SetSize(int x, int y) { Base->SetSize(x, y); }
void SetDisplaySize(float w, float h) { Base->SetSize((int)w, (int)h); }
const SpritePositioningInfo& GetSpritePositioning(int which) { if (Base->spi == nullptr) SetupSpriteData(); return Base->spi[which]; }
const SpritePositioningInfo& GetSpritePositioning(int which) { if (spi == nullptr) SetupSpriteData(); return spi[which]; }
int GetAreas(FloatRect** pAreas) const { return Base->GetAreas(pAreas); }
PalEntry GetSkyCapColor(bool bottom) { return Base->GetSkyCapColor(bottom); }

View File

@ -227,6 +227,8 @@ void FSoftwareRenderer::SetClearColor(int color)
mScene.SetClearColor(color);
}
FSWCanvasTexture* GetSWCamTex(FCanvasTexture* camtex);
void FSoftwareRenderer::RenderTextureView (FCanvasTexture *camtex, AActor *viewpoint, double fov)
{
auto renderTarget = mScene.MainThread()->Viewport->RenderTarget;
@ -237,7 +239,7 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *camtex, AActor *viewp
cameraViewpoint = r_viewpoint;
cameraViewwindow = r_viewwindow;
auto tex = static_cast<FSWCanvasTexture*>(camtex->GetSoftwareTexture());
auto tex = GetSWCamTex(camtex);
DCanvas *Canvas = renderTarget->IsBgra() ? tex->GetCanvasBgra() : tex->GetCanvas();

View File

@ -176,7 +176,7 @@ class FSWCanvasTexture : public FSoftwareTexture
public:
FSWCanvasTexture(FGameTexture *source) : FSoftwareTexture(source) {}
FSWCanvasTexture(FGameTexture* source);
~FSWCanvasTexture();
// Returns the whole texture, stored in column-major order

View File

@ -39,6 +39,21 @@
#include "m_alloc.h"
#include "imagehelpers.h"
static TMap<FCanvasTexture*, FSWCanvasTexture*> canvasMap;
FSWCanvasTexture* GetSWCamTex(FCanvasTexture* camtex)
{
auto p = canvasMap.CheckKey(camtex);
return p ? *p : nullptr;
}
FSWCanvasTexture::FSWCanvasTexture(FGameTexture* source) : FSoftwareTexture(source)
{
// The SW renderer needs to link the canvas textures, but let's do that outside the texture manager.
auto camtex = static_cast<FCanvasTexture*>(source->GetTexture());
canvasMap.Insert(camtex, this);
}
FSWCanvasTexture::~FSWCanvasTexture()
{