Fix sky in zdrayland

This commit is contained in:
Magnus Norddahl 2024-02-29 20:38:36 +01:00
parent 2b5ae842da
commit 847ffe030b
4 changed files with 69 additions and 28 deletions

View file

@ -3,6 +3,8 @@
#include "framework/tarray.h"
#include "framework/templates.h"
#include "framework/zstring.h"
#include <map>
#include <memory>
class FGameTexture;
@ -87,12 +89,37 @@ public:
extern FFileSystem fileSystem;
class FGameTexture
{
public:
bool isValid() const { return Valid; }
float GetDisplayWidth() const { return 64.0f; }
float GetDisplayHeight() const { return 64.0f; }
float GetScaleY() const { return 1.0f; }
private:
FString Name;
bool Valid = true;
friend class FTextureManager;
};
class FTextureManager
{
public:
FTextureManager()
{
Textures.Push(std::make_unique<FGameTexture>());
Textures.Last()->Name = "-";
Textures.Last()->Valid = false;
}
FGameTexture* GetGameTexture(FTextureID texnum, bool animate = false)
{
return nullptr;
if (!texnum.isValid() || texnum.isNull())
return Textures[0].get();
return Textures[texnum.GetIndex()].get();
}
enum
@ -125,19 +152,20 @@ public:
if (name[0] == '-' && name[1] == '\0')
return FTextureID(0);
// To do: actually build up a list of texture ids
return FTextureID(1);
auto it = NameToID.find(name);
if (it != NameToID.end())
return FTextureID(it->second);
int id = Textures.Size();
Textures.Push(std::make_unique<FGameTexture>());
Textures.Last()->Name = name;
NameToID[name] = id;
return FTextureID(id);
}
std::map<FString, int> NameToID;
TArray<std::unique_ptr<FGameTexture>> Textures;
};
extern FTextureManager TexMan;
class FGameTexture
{
public:
bool isValid() const { return false; }
float GetDisplayWidth() const { return 64.0f; }
float GetDisplayHeight() const { return 64.0f; }
};

View file

@ -190,6 +190,9 @@ struct IntSector
Plane ceilingplane;
Plane floorplane;
double floorTexZ;
double ceilingTexZ;
int sampleDistanceCeiling;
int sampleDistanceFloor;

View file

@ -450,6 +450,8 @@ void FProcessor::ParseSector(IntSector *sec)
sec->sampleDistanceFloor = 0;
int ceilingplane = 0, floorplane = 0;
bool floorTexZSet = false;
bool ceilingTexZSet = false;
SC_MustGetStringName("{");
while (!SC_CheckString("}"))
@ -457,6 +459,16 @@ void FProcessor::ParseSector(IntSector *sec)
const char *value;
const char *key = ParseKey(value);
if (stricmp(key, "heightfloor") == 0)
{
sec->floorTexZ = CheckFloat(key);
floorTexZSet = true;
}
else if (stricmp(key, "heightceiling") == 0)
{
sec->ceilingTexZ = CheckFloat(key);
ceilingTexZSet = true;
}
if (stricmp(key, "textureceiling") == 0)
{
CopyUDMFString(sec->data.ceilingpic, 64, value);
@ -468,10 +480,14 @@ void FProcessor::ParseSector(IntSector *sec)
else if (stricmp(key, "heightceiling") == 0)
{
sec->data.ceilingheight = CheckFloat(key);
if (!ceilingTexZSet)
sec->ceilingTexZ = sec->data.ceilingheight;
}
else if (stricmp(key, "heightfloor") == 0)
{
sec->data.floorheight = CheckFloat(key);
if (!floorTexZSet)
sec->floorTexZ = sec->data.floorheight;
}
else if (stricmp(key, "lightlevel") == 0)
{

View file

@ -224,11 +224,7 @@ void DoomLevelMesh::CreateSideSurfaces(FLevel& doomMap, IntSideDef* side)
float v2Top = (float)front->ceilingplane.ZatPoint(v2);
float v2Bottom = (float)front->floorplane.ZatPoint(v2);
/*if (side->line->getPortal() && side->line->frontsector == front)
{
CreateLinePortalSurface(doomMap, side);
}
else*/ if (side->line->special == Line_Horizon && front != back)
if (side->line->special == Line_Horizon && front != back)
{
CreateLineHorizonSurface(doomMap, side);
}
@ -382,14 +378,14 @@ void DoomLevelMesh::CreateMidWallSurface(FLevel& doomMap, IntSideDef* side)
const auto& texture = side->GetTexture(WallPart::MIDDLE);
//if ((side->Flags & WALLF_WRAP_MIDTEX) || (side->line->flags & WALLF_WRAP_MIDTEX))
if (/*(side->flags & ML_3DMIDTEX) ||*/ (side->line->flags & ML_3DMIDTEX))
{
verts[0].z = v1Bottom;
verts[1].z = v2Bottom;
verts[2].z = v1Top;
verts[3].z = v2Top;
}
/*else
else
{
int offset = 0;
@ -404,18 +400,18 @@ void DoomLevelMesh::CreateMidWallSurface(FLevel& doomMap, IntSideDef* side)
if (side->line->flags & ML_DONTPEGBOTTOM)
{
yTextureOffset += (float)side->sectordef->planes[PLANE_FLOOR].TexZ;
yTextureOffset += (float)side->sectordef->floorTexZ;
}
else
{
yTextureOffset += (float)(side->sectordef->planes[PLANE_CEILING].TexZ - gameTexture->GetDisplayHeight() / side->GetTextureYScale(WallPart::MIDDLE));
yTextureOffset += (float)(side->sectordef->ceilingTexZ - gameTexture->GetDisplayHeight() / side->GetTextureYScale(WallPart::MIDDLE));
}
verts[0].z = std::min(std::max(yTextureOffset + mid1Bottom, v1Bottom), v1Top);
verts[1].z = std::min(std::max(yTextureOffset + mid2Bottom, v2Bottom), v2Top);
verts[2].z = std::max(std::min(yTextureOffset + mid1Top, v1Top), v1Bottom);
verts[3].z = std::max(std::min(yTextureOffset + mid2Top, v2Top), v2Bottom);
}*/
}
// mid texture
DoomLevelMeshSurface surf;
@ -775,16 +771,14 @@ bool DoomLevelMesh::IsTopSideSky(IntSector* frontsector, IntSector* backsector,
bool DoomLevelMesh::IsTopSideVisible(IntSideDef* side)
{
//auto tex = TexMan.GetGameTexture(side->GetTexture(WallPart::TOP), true);
//return tex && tex->isValid();
return true;
auto tex = TexMan.GetGameTexture(side->GetTexture(WallPart::TOP), true);
return tex && tex->isValid();
}
bool DoomLevelMesh::IsBottomSideVisible(IntSideDef* side)
{
//auto tex = TexMan.GetGameTexture(side->GetTexture(WallPart::BOTTOM), true);
//return tex && tex->isValid();
return true;
auto tex = TexMan.GetGameTexture(side->GetTexture(WallPart::BOTTOM), true);
return tex && tex->isValid();
}
bool DoomLevelMesh::IsSkySector(IntSector* sector, SecPlaneType plane)