diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 476fab429..445eab1ad 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -823,6 +823,7 @@ set (PCH_SOURCES st_stuff.cpp r_data/v_palette.cpp wi_stuff.cpp + levelmeshhelper.cpp gamedata/a_keys.cpp gamedata/a_weapons.cpp gamedata/decallib.cpp diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 95317975c..6df23029e 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -1,29 +1,8 @@ -#include "levelmeshhelper.h" #include "hw_meshbuilder.h" #include "hw_mesh.h" #include "v_video.h" - -struct NullLevelMeshUpdater : UpdateLevelMesh -{ - virtual void FloorHeightChanged(struct sector_t *sector) {}; - virtual void CeilingHeightChanged(struct sector_t *sector) {}; - virtual void MidTex3DHeightChanged(struct sector_t *sector) {}; - - virtual void FloorTextureChanged(struct sector_t *sector) {}; - virtual void CeilingTextureChanged(struct sector_t *sector) {}; - - virtual void SectorChangedOther(struct sector_t *sector) {}; - - virtual void SideTextureChanged(struct side_t *side, int section) {}; -}; - -static NullLevelMeshUpdater nullUpdater; - -UpdateLevelMesh* LevelMeshUpdater = &nullUpdater; - - MeshBuilder::MeshBuilder() { Reset(); diff --git a/src/levelmeshhelper.cpp b/src/levelmeshhelper.cpp new file mode 100644 index 000000000..585db2229 --- /dev/null +++ b/src/levelmeshhelper.cpp @@ -0,0 +1,25 @@ + +#include "levelmeshhelper.h" + +struct NullLevelMeshUpdater : UpdateLevelMesh +{ + virtual void FloorHeightChanged(struct sector_t* sector) {}; + virtual void CeilingHeightChanged(struct sector_t* sector) {}; + virtual void MidTex3DHeightChanged(struct sector_t* sector) {}; + + virtual void FloorTextureChanged(struct sector_t* sector) {}; + virtual void CeilingTextureChanged(struct sector_t* sector) {}; + + virtual void SectorChangedOther(struct sector_t* sector) {}; + + virtual void SideTextureChanged(struct side_t* side, int section) {}; +}; + +static NullLevelMeshUpdater nullUpdater; + +UpdateLevelMesh* LevelMeshUpdater = &nullUpdater; + +void SetNullLevelMeshUpdater() +{ + LevelMeshUpdater = &nullUpdater; +} diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index f6b6eda23..e2eb4cf40 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -17,3 +17,5 @@ struct UpdateLevelMesh }; extern UpdateLevelMesh* LevelMeshUpdater; + +void SetNullLevelMeshUpdater(); diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index b819bd57d..06de343ea 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3203,6 +3203,8 @@ bool MapLoader::LoadLightmap(MapData* map) void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) { + SetNullLevelMeshUpdater(); + const int *oldvertextable = nullptr; // Reset defaults for lightmapping @@ -3544,4 +3546,6 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) seg++; } } + + LevelMeshUpdater = Level->levelMesh; // Start tracking level changes } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 77cbafd8f..898dfdade 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -381,6 +381,41 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) // To do: call FreeGeometry and FreeUniforms } +void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::FloorTextureChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::CeilingTextureChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::SectorChangedOther(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) +{ + // UpdateSide(level, side->Index()); +} + void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) { FreeSide(doomMap, sideIndex); @@ -428,7 +463,7 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) void DoomLevelMesh::UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) { - FreeSide(doomMap, sectorIndex); + FreeFlat(doomMap, sectorIndex); sector_t* sector = &doomMap.sectors[sectorIndex]; for (FSection& section : doomMap.sections.SectionsForSector(sectorIndex)) diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 75eba0693..a8fb67c25 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -2,6 +2,7 @@ #pragma once #include "hw_levelmesh.h" +#include "levelmeshhelper.h" #include "scene/hw_drawstructs.h" #include "common/rendering/hwrenderer/data/hw_meshbuilder.h" #include "tarray.h" @@ -41,7 +42,7 @@ struct FlatSurfaceBlock int FirstSurface = -1; }; -class DoomLevelMesh : public LevelMesh +class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh { public: DoomLevelMesh(FLevelLocals &doomMap); @@ -66,6 +67,14 @@ public: void CreateLights(FLevelLocals& doomMap); + void FloorHeightChanged(struct sector_t* sector) override; + void CeilingHeightChanged(struct sector_t* sector) override; + void MidTex3DHeightChanged(struct sector_t* sector) override; + void FloorTextureChanged(struct sector_t* sector) override; + void CeilingTextureChanged(struct sector_t* sector) override; + void SectorChangedOther(struct sector_t* sector) override; + void SideTextureChanged(struct side_t* side, int section) override; + private: void CreateSurfaces(FLevelLocals& doomMap);