From 4b28a3910463673a73c1becc5531af5cb5bd2a40 Mon Sep 17 00:00:00 2001 From: Moritz Heinemann Date: Sat, 26 Feb 2022 16:55:52 +0100 Subject: [PATCH] world render mode switch --- src/MapWindow/MapWindow.cpp | 29 +++++++++++++++++++------ src/MapWindow/MapWindow.h | 9 +++++++- src/MapWindow/World/MapTileRenderer.cpp | 8 +------ src/MapWindow/World/MapTileRenderer.h | 5 ----- src/MapWindow/World/WorldRenderer.cpp | 7 +----- src/MapWindow/World/WorldRenderer.h | 5 ----- 6 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/MapWindow/MapWindow.cpp b/src/MapWindow/MapWindow.cpp index 267946ae..b4702f69 100644 --- a/src/MapWindow/MapWindow.cpp +++ b/src/MapWindow/MapWindow.cpp @@ -46,12 +46,18 @@ Satisfactory3DMap::MapWindow::MapWindow() samplingFactorItem_(4), metallic_(0.0f), roughness_(0.5f), + worldRenderMode_(WorldRenderMode::TileMap), showSelectionMarker_(false), showHexEdit_(false) { dataView_ = std::make_shared(); pakExplorer_ = std::make_unique(dataView_); + // Fallback to HeightMap if no pak file is found. + if (dataView_->pak() == nullptr) { + worldRenderMode_ = WorldRenderMode::HeightMap; + } + fbo_ = std::make_unique(10, 10, glowl::FramebufferObject::DEPTH32F); fbo_->createColorAttachment(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE); // color fbo_->createColorAttachment(GL_RGBA32F, GL_RGBA, GL_FLOAT); // normals @@ -237,12 +243,18 @@ void Satisfactory3DMap::MapWindow::renderGui() { samplingFactor_ = sampling_values[samplingFactorItem_]; ImGui::SliderFloat("Metalic", &metallic_, 0.0f, 1.0f); ImGui::SliderFloat("Roughness", &roughness_, 0.0f, 1.0f); - ImGui::Checkbox("Use world tex", &worldRenderer_->useWorldTex()); - ImGui::Checkbox("Show world", &worldRenderer_->show()); - ImGui::Checkbox("Show TileMap", &mapTileRenderer_->show()); - ImGui::Checkbox("World wireframe", &worldRenderer_->wireframe()); + ImGui::Separator(); + const char* world_mode_names[] = {"None", "HeightMap", "TileMap"}; + ImGui::Combo("World Mode", reinterpret_cast(&worldRenderMode_), world_mode_names, + IM_ARRAYSIZE(world_mode_names)); + if (worldRenderMode_ == WorldRenderMode::HeightMap) { + ImGui::Checkbox("Use world tex", &worldRenderer_->useWorldTex()); + ImGui::Checkbox("World wireframe", &worldRenderer_->wireframe()); + } else if (worldRenderMode_ == WorldRenderMode::TileMap) { + ImGui::Checkbox("Tile wireframe", &mapTileRenderer_->wireframe()); + } + ImGui::Separator(); ImGui::Checkbox("Models wireframe", &modelRenderer_->wireframe()); - ImGui::Checkbox("Tile wireframe", &mapTileRenderer_->wireframe()); ImGui::End(); ImGui::Begin("SaveObject"); @@ -423,8 +435,11 @@ void Satisfactory3DMap::MapWindow::renderFbo() { glClearTexImage(fbo_->getColorAttachment(1)->getName(), 0, GL_RGBA, GL_FLOAT, clearColor1); glClearTexImage(fbo_->getColorAttachment(2)->getName(), 0, GL_RED_INTEGER, GL_INT, clearColor2); - worldRenderer_->render(projMx_, camera_->viewMx()); - mapTileRenderer_->render(projMx_, camera_->viewMx()); + if (worldRenderMode_ == WorldRenderMode::HeightMap) { + worldRenderer_->render(projMx_, camera_->viewMx()); + } else if (worldRenderMode_ == WorldRenderMode::TileMap) { + mapTileRenderer_->render(projMx_, camera_->viewMx()); + } if (dataView_->hasSave()) { modelRenderer_->render(projMx_, camera_->viewMx(), dataView_->selectedObjectId()); diff --git a/src/MapWindow/MapWindow.h b/src/MapWindow/MapWindow.h index 141d9098..6382c757 100644 --- a/src/MapWindow/MapWindow.h +++ b/src/MapWindow/MapWindow.h @@ -27,11 +27,17 @@ namespace Satisfactory3DMap { MapWindow(); ~MapWindow(); - const std::shared_ptr& dataView() const { + [[nodiscard]] const std::shared_ptr& dataView() const { return dataView_; } protected: + enum WorldRenderMode : int { + None = 0, + HeightMap = 1, + TileMap = 2, + }; + void render() override; void renderTick(); void renderGui(); @@ -93,6 +99,7 @@ namespace Satisfactory3DMap { int samplingFactorItem_; float metallic_; float roughness_; + WorldRenderMode worldRenderMode_; std::unique_ptr selectionMarkerModel_; std::unique_ptr selectionMarkerShader_; diff --git a/src/MapWindow/World/MapTileRenderer.cpp b/src/MapWindow/World/MapTileRenderer.cpp index 612b2c40..8509d80a 100644 --- a/src/MapWindow/World/MapTileRenderer.cpp +++ b/src/MapWindow/World/MapTileRenderer.cpp @@ -35,9 +35,7 @@ namespace { } } // namespace -Satisfactory3DMap::MapTileRenderer::MapTileRenderer(const std::shared_ptr& pak) - : wireframe_(false), - show_(true) { +Satisfactory3DMap::MapTileRenderer::MapTileRenderer(const std::shared_ptr& pak) : wireframe_(false) { const std::vector x = { -254000.0f, @@ -141,10 +139,6 @@ Satisfactory3DMap::MapTileRenderer::MapTileRenderer(const std::shared_ptr mapTiles_; bool wireframe_; - bool show_; }; } // namespace Satisfactory3DMap diff --git a/src/MapWindow/World/WorldRenderer.cpp b/src/MapWindow/World/WorldRenderer.cpp index c2e56ab7..2fabad45 100644 --- a/src/MapWindow/World/WorldRenderer.cpp +++ b/src/MapWindow/World/WorldRenderer.cpp @@ -28,8 +28,7 @@ Satisfactory3DMap::WorldRenderer::WorldRenderer() numInstancesX_(16), numInstancesY_(16), useWorldTex_(true), - wireframe_(false), - show_(true) { + wireframe_(false) { try { shader_ = std::make_unique(glowl::GLSLProgram::ShaderSourceList{ {glowl::GLSLProgram::ShaderType::Vertex, getStringResource("shaders/world.vert")}, @@ -65,10 +64,6 @@ Satisfactory3DMap::WorldRenderer::WorldRenderer() } void Satisfactory3DMap::WorldRenderer::render(const glm::mat4& projMx, const glm::mat4& viewMx) { - if (!show_) { - return; - } - if (wireframe_) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } diff --git a/src/MapWindow/World/WorldRenderer.h b/src/MapWindow/World/WorldRenderer.h index d1116d01..5b96ec18 100644 --- a/src/MapWindow/World/WorldRenderer.h +++ b/src/MapWindow/World/WorldRenderer.h @@ -23,10 +23,6 @@ namespace Satisfactory3DMap { return wireframe_; }; - bool& show() { - return show_; - } - protected: std::unique_ptr shader_; GLuint vaEmpty_; @@ -47,7 +43,6 @@ namespace Satisfactory3DMap { bool useWorldTex_; bool wireframe_; - bool show_; }; } // namespace Satisfactory3DMap