Update the dynamic submesh with poly lines

This commit is contained in:
Magnus Norddahl 2023-09-26 00:06:10 +02:00
commit 2b7394cbb1
3 changed files with 44 additions and 5 deletions

View file

@ -995,6 +995,7 @@ void D_Display ()
screen->FrameTimeNS = I_nsTime();
TexAnim.UpdateAnimations(screen->FrameTime);
R_UpdateSky(screen->FrameTime);
if (level.levelMesh) level.levelMesh->BeginFrame(level);
screen->BeginFrame();
twod->ClearClipRect();
if ((gamestate == GS_LEVEL || gamestate == GS_TITLELEVEL) && gametic != 0)

View file

@ -146,11 +146,20 @@ void DoomLevelSubmesh::CreateStatic(FLevelLocals& doomMap)
for (unsigned int i = 0; i < doomMap.sides.Size(); i++)
{
CreateSideSurfaces(doomMap, &doomMap.sides[i]);
bool isPolyLine = !!(doomMap.sides[i].Flags & WALLF_POLYOBJ);
if (!isPolyLine)
CreateSideSurfaces(doomMap, &doomMap.sides[i]);
}
CreateSubsectorSurfaces(doomMap);
CreateIndexes();
SetupLightmapUvs(doomMap);
UpdateCollision();
}
void DoomLevelSubmesh::CreateIndexes()
{
for (size_t i = 0; i < Surfaces.Size(); i++)
{
DoomLevelMeshSurface& s = Surfaces[i];
@ -200,15 +209,34 @@ void DoomLevelSubmesh::CreateStatic(FLevelLocals& doomMap)
}
}
}
SetupLightmapUvs(doomMap);
UpdateCollision();
}
void DoomLevelSubmesh::CreateDynamic(FLevelLocals& doomMap)
{
LightmapSampleDistance = doomMap.LightmapSampleDistance;
BuildSectorGroups(doomMap);
}
void DoomLevelSubmesh::UpdateDynamic(FLevelLocals& doomMap)
{
Surfaces.Clear();
MeshVertices.Clear();
MeshVertexUVs.Clear();
MeshElements.Clear();
MeshUVIndex.Clear();
MeshSurfaceIndexes.Clear();
LightmapUvs.Clear();
for (unsigned int i = 0; i < doomMap.lines.Size(); i++)
{
bool isPolyLine = doomMap.lines[i].sidedef[0] && (doomMap.lines[i].sidedef[0]->Flags & WALLF_POLYOBJ);
if (isPolyLine)
CreateSideSurfaces(doomMap, doomMap.lines[i].sidedef[0]);
}
CreateIndexes();
SetupLightmapUvs(doomMap);
UpdateCollision();
}
DoomLevelMesh::DoomLevelMesh(FLevelLocals &doomMap)
@ -223,6 +251,11 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals &doomMap)
static_cast<DoomLevelSubmesh*>(DynamicMesh.get())->CreateDynamic(doomMap);
}
void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap)
{
static_cast<DoomLevelSubmesh*>(DynamicMesh.get())->UpdateDynamic(doomMap);
}
void DoomLevelSubmesh::BuildSectorGroups(const FLevelLocals& doomMap)
{
int groupIndex = 0;

View file

@ -27,6 +27,7 @@ class DoomLevelSubmesh : public LevelSubmesh
public:
void CreateStatic(FLevelLocals& doomMap);
void CreateDynamic(FLevelLocals& doomMap);
void UpdateDynamic(FLevelLocals& doomMap);
LevelMeshSurface* GetSurface(int index) override { return &Surfaces[index]; }
unsigned int GetSurfaceIndex(const LevelMeshSurface* surface) const override { return (unsigned int)(ptrdiff_t)(static_cast<const DoomLevelMeshSurface*>(surface) - Surfaces.Data()); }
@ -59,6 +60,8 @@ private:
void SetupLightmapUvs(FLevelLocals& doomMap);
void CreateIndexes();
static bool IsTopSideSky(sector_t* frontsector, sector_t* backsector, side_t* side);
static bool IsTopSideVisible(side_t* side);
static bool IsBottomSideVisible(side_t* side);
@ -116,6 +119,8 @@ class DoomLevelMesh : public LevelMesh
{
public:
DoomLevelMesh(FLevelLocals &doomMap);
void BeginFrame(FLevelLocals& doomMap);
bool TraceSky(const FVector3& start, FVector3 direction, float dist)
{