diff --git a/src/d_main.cpp b/src/d_main.cpp index a46ce9241..82895caef 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -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) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 22a8ca907..e48b75a37 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -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(DynamicMesh.get())->CreateDynamic(doomMap); } +void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) +{ + static_cast(DynamicMesh.get())->UpdateDynamic(doomMap); +} + void DoomLevelSubmesh::BuildSectorGroups(const FLevelLocals& doomMap) { int groupIndex = 0; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index fac36043c..b9578fe11 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -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(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) {