From 3b8bdebf9f1bf30d4facb6c0d8e7e82492725755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Tue, 11 Feb 2020 20:57:47 +0200 Subject: [PATCH] Renderer|Gloom: Brute force plane heights update To see if this works at all, update all plane heights every frame. Next up: only update what is changing. --- .../include/render/classicworldrenderer.h | 2 + .../include/render/gloomworldrenderer.h | 3 +- .../client/include/render/iworldrenderer.h | 2 + .../src/render/classicworldrenderer.cpp | 8 ++++ .../client/src/render/gloomworldrenderer.cpp | 45 +++++++++++++++++++ doomsday/apps/client/src/world/gloomworld.cpp | 3 +- 6 files changed, 61 insertions(+), 2 deletions(-) diff --git a/doomsday/apps/client/include/render/classicworldrenderer.h b/doomsday/apps/client/include/render/classicworldrenderer.h index eae0ce0001..b2ecbaddc6 100644 --- a/doomsday/apps/client/include/render/classicworldrenderer.h +++ b/doomsday/apps/client/include/render/classicworldrenderer.h @@ -38,6 +38,8 @@ class ClassicWorldRenderer : public IWorldRenderer void glInit() override; void glDeinit() override; + void loadMap(const de::String &mapId) override; + void unloadMap() override; void setCamera() override; void advanceTime(de::TimeSpan elapsed) override; diff --git a/doomsday/apps/client/include/render/gloomworldrenderer.h b/doomsday/apps/client/include/render/gloomworldrenderer.h index deff119178..e2c985faa7 100644 --- a/doomsday/apps/client/include/render/gloomworldrenderer.h +++ b/doomsday/apps/client/include/render/gloomworldrenderer.h @@ -32,7 +32,8 @@ class GloomWorldRenderer : public IWorldRenderer void glDeinit() override; void setCamera() override; - void loadMap(const de::String &mapId); + void loadMap(const de::String &mapId) override; + void unloadMap() override; void advanceTime(de::TimeSpan elapsed) override; void renderPlayerView(int num) override; diff --git a/doomsday/apps/client/include/render/iworldrenderer.h b/doomsday/apps/client/include/render/iworldrenderer.h index ed7666ee99..b56460aed9 100644 --- a/doomsday/apps/client/include/render/iworldrenderer.h +++ b/doomsday/apps/client/include/render/iworldrenderer.h @@ -36,6 +36,8 @@ class IWorldRenderer virtual void glInit() = 0; virtual void glDeinit() = 0; + virtual void loadMap(const de::String &mapId) = 0; + virtual void unloadMap() = 0; virtual void setCamera() = 0; virtual void advanceTime(de::TimeSpan elapsed) = 0; diff --git a/doomsday/apps/client/src/render/classicworldrenderer.cpp b/doomsday/apps/client/src/render/classicworldrenderer.cpp index 334c7ec443..568d9fe3cf 100644 --- a/doomsday/apps/client/src/render/classicworldrenderer.cpp +++ b/doomsday/apps/client/src/render/classicworldrenderer.cpp @@ -18,7 +18,15 @@ #include "render/classicworldrenderer.h" +using namespace de; + ClassicWorldRenderer::ClassicWorldRenderer() {} +void ClassicWorldRenderer::loadMap(const String &/*mapId*/) +{} + +void ClassicWorldRenderer::unloadMap() +{} + // other methods elsewhere... diff --git a/doomsday/apps/client/src/render/gloomworldrenderer.cpp b/doomsday/apps/client/src/render/gloomworldrenderer.cpp index 1eaca4b3ad..54517e5ab6 100644 --- a/doomsday/apps/client/src/render/gloomworldrenderer.cpp +++ b/doomsday/apps/client/src/render/gloomworldrenderer.cpp @@ -22,10 +22,15 @@ #include "world/p_players.h" #include "clientapp.h" +#include +#include +#include #include #include #include #include +#include +#include using namespace de; @@ -81,6 +86,7 @@ DE_PIMPL(GloomWorldRenderer) PlayerCamera playerCamera; std::unique_ptr glWorld; + List sectorLut; // sector number => gloom ID ImageBank images; Impl(Public *i) : Base(i) @@ -111,12 +117,51 @@ void GloomWorldRenderer::setCamera() void GloomWorldRenderer::loadMap(const String &mapId) { d->glWorld->loadMap(mapId); + + // Read the lookup tables. + { + const auto & asset = App::asset("map." + mapId); + const Record lut = + parseJSON(String::fromUtf8(FS::locate(asset.absolutePath("lookupPath")))); + + const auto §orIds = lut["sectorIds"].array(); + d->sectorLut.resize(sectorIds.size()); + auto i = d->sectorLut.begin(); + for (const auto *value : sectorIds.elements()) + { + *i++ = value->asUInt(); + } + } +} + +void GloomWorldRenderer::unloadMap() +{ + d->sectorLut.clear(); } void GloomWorldRenderer::advanceTime(TimeSpan elapsed) { if (d->glWorld) { + // Update changed plane heights. + if (world::World::get().hasMap() && !d->sectorLut.isEmpty()) + { + const auto &map = world::World::get().map(); + const auto &glMap = d->glWorld->map(); + for (int sectorIndex = 0; sectorIndex < map.sectorCount(); ++sectorIndex) + { + const auto & sector = map.sector(sectorIndex); + const gloom::ID sectorId = d->sectorLut[sectorIndex]; + const gloom::ID floorId = glMap.floorPlaneId(sectorId); + const gloom::ID ceilingId = glMap.ceilingPlaneId(sectorId); + + d->glWorld->setPlaneY(floorId, sector.floor().height()); + d->glWorld->setPlaneY(ceilingId, sector.ceiling().height()); + + // TODO: Pass the target height and speed to glWorld and let the shaders update + // the heights on the GPU. Only update the plane heights buffer when a move begins. + } + } d->glWorld->update(elapsed); } } diff --git a/doomsday/apps/client/src/world/gloomworld.cpp b/doomsday/apps/client/src/world/gloomworld.cpp index 4c64439c86..da23e4c132 100644 --- a/doomsday/apps/client/src/world/gloomworld.cpp +++ b/doomsday/apps/client/src/world/gloomworld.cpp @@ -58,6 +58,7 @@ String GloomWorld::mapPackageId() const void GloomWorld::aboutToChangeMap() { + ClientApp::render().world().unloadMap(); PackageLoader::get().unload(mapPackageId()); d->exportedPath.clear(); } @@ -95,6 +96,6 @@ void GloomWorld::mapFinalized() // We are likely in a busy thread now, so we shouldn't do GL operations. // Load the map in the main thread instead. Loop::mainCall([mapId]() { - static_cast(ClientApp::render().world()).loadMap(mapId.lower()); + ClientApp::render().world().loadMap(mapId.lower()); }); }