From f54283cab1f4ce3a16e0c8a0cef8ecbc28e32dff Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 24 Nov 2023 19:33:41 +0300 Subject: [PATCH] Show chunk borders debug option --- src/frontend/hud.cpp | 28 ++++++++++++++++++++++++---- src/frontend/hud.h | 4 +++- src/frontend/screens.cpp | 2 +- src/frontend/world_render.cpp | 23 ++++++++++++++++++++++- src/frontend/world_render.h | 7 +++++++ src/world/Level.h | 2 -- 6 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 5e17ca08..f6d47dd3 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -34,6 +34,7 @@ #include "gui/GUI.h" #include "ContentGfxCache.h" #include "screens.h" +#include "world_render.h" #include "../engine.h" #include "../core_defs.h" @@ -50,11 +51,12 @@ inline Label* create_label(gui::wstringsupplier supplier) { return label; } -HudRenderer::HudRenderer(Engine* engine, Level* level, const ContentGfxCache* cache) +HudRenderer::HudRenderer(Engine* engine, Level* level, const ContentGfxCache* cache, WorldRenderer* renderer) : level(level), assets(engine->getAssets()), gui(engine->getGUI()), - cache(cache) { + cache(cache), + renderer(renderer) { auto menu = gui->getMenu(); batch = new Batch2D(1024); uicamera = new Camera(vec3(), 1); @@ -126,13 +128,31 @@ HudRenderer::HudRenderer(Engine* engine, Level* level, const ContentGfxCache* ca { TrackBar* bar = new TrackBar(0.0f, 1.0f, 1.0f, 0.02f, 2); bar->supplier([=]() { - return level->skyLightMutliplier; + return renderer->skyLightMutliplier; }); bar->consumer([=](double val) { - level->skyLightMutliplier = val; + renderer->skyLightMutliplier = val; }); panel->add(bar); } + { + Panel* checkpanel = new Panel(vec2(400, 32), vec4(5.0f), 1.0f); + checkpanel->color(vec4(0.0f)); + checkpanel->orientation(Orientation::horizontal); + + CheckBox* checkbox = new CheckBox(); + checkbox->margin(vec4(0.0f, 0.0f, 5.0f, 0.0f)); + checkbox->supplier([=]() { + return renderer->isChunkBordersOn(); + }); + checkbox->consumer([=](bool checked) { + renderer->setChunkBorders(checked); + }); + checkpanel->add(checkbox); + checkpanel->add(new Label(L"Show Chunk Borders")); + + panel->add(checkpanel); + } panel->refresh(); menu->reset(); diff --git a/src/frontend/hud.h b/src/frontend/hud.h index 148e5210..cf727adf 100644 --- a/src/frontend/hud.h +++ b/src/frontend/hud.h @@ -14,6 +14,7 @@ class Player; class Level; class Engine; class ContentGfxCache; +class WorldRenderer; namespace gui { class GUI; @@ -37,8 +38,9 @@ class HudRenderer { std::shared_ptr debugPanel; gui::GUI* gui; const ContentGfxCache* const cache; + WorldRenderer* renderer; public: - HudRenderer(Engine* engine, Level* level, const ContentGfxCache* cache); + HudRenderer(Engine* engine, Level* level, const ContentGfxCache* cache, WorldRenderer* renderer); ~HudRenderer(); void update(); diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index 54c1a6ed..e7ca9006 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -93,7 +93,7 @@ LevelScreen::LevelScreen(Engine* engine, Level* level) level(level) { cache = new ContentGfxCache(level->content, engine->getAssets()); worldRenderer = new WorldRenderer(engine, level, cache); - hud = new HudRenderer(engine, level, cache); + hud = new HudRenderer(engine, level, cache, worldRenderer); backlight = engine->getSettings().graphics.backlight; } diff --git a/src/frontend/world_render.cpp b/src/frontend/world_render.cpp index 7bb3f584..d2654388 100644 --- a/src/frontend/world_render.cpp +++ b/src/frontend/world_render.cpp @@ -24,6 +24,7 @@ #include "../assets/Assets.h" #include "../objects/player_control.h" #include "../maths/FrustumCulling.h" +#include "../maths/voxmaths.h" #include "../settings.h" #include "../engine.h" #include "ContentGfxCache.h" @@ -110,7 +111,6 @@ void WorldRenderer::draw(const GfxContext& pctx, Camera* camera, bool occlusion) int displayWidth = viewport.getWidth(); int displayHeight = viewport.getHeight(); - float skyLightMutliplier = level->skyLightMutliplier; { GfxContext ctx = pctx.sub(); ctx.depthTest(true); @@ -174,6 +174,27 @@ void WorldRenderer::draw(const GfxContext& pctx, Camera* camera, bool occlusion) float length = 40.f; linesShader->use(); + if (chunkBorders){ + linesShader->uniformMatrix("u_projview", camera->getProjView()); + GfxContext ctx = pctx.sub(); + ctx.depthTest(true); + vec3 coord = level->player->camera->position; + int cx = floordiv((int)coord.x, CHUNK_W); + int cz = floordiv((int)coord.z, CHUNK_D); + for (int xx = 0; xx < CHUNK_W; xx++) { + lineBatch->line(cx * CHUNK_W + xx, 0, cz * CHUNK_D, + cx * CHUNK_W + xx, CHUNK_H, cz * CHUNK_D, 0,0,1,0.5f); + lineBatch->line(cx * CHUNK_W + xx, 0, (cz+1) * CHUNK_D, + cx * CHUNK_W + xx, CHUNK_H, (cz+1) * CHUNK_D, 0,0,1,0.5f); + + lineBatch->line(cx * CHUNK_W, 0, cz * CHUNK_D+xx, + cx * CHUNK_W, CHUNK_H, cz * CHUNK_D+xx, 1,0,0,0.5f); + lineBatch->line((cx+1) * CHUNK_W, 0, cz * CHUNK_D+xx, + (cx+1) * CHUNK_W, CHUNK_H, cz * CHUNK_D+xx, 1,0,0,0.5f); + } + lineBatch->render(); + } + // top-right: vec3 tsl = vec3(displayWidth - length - 4, -length - 4, 0.f); vec3 tsl = vec3(displayWidth/2, -((int)displayHeight)/2, 0.f); glm::mat4 model(glm::translate(glm::mat4(1.f), tsl)); diff --git a/src/frontend/world_render.h b/src/frontend/world_render.h index 53dfc9d3..2dd75e73 100644 --- a/src/frontend/world_render.h +++ b/src/frontend/world_render.h @@ -29,13 +29,20 @@ class WorldRenderer { Frustum* frustumCulling; LineBatch* lineBatch; ChunksRenderer* renderer; + bool chunkBorders = false; bool drawChunk(size_t index, Camera* camera, Shader* shader, bool occlusion); void drawChunks(Chunks* chunks, Camera* camera, Shader* shader, bool occlusion); public: + float skyLightMutliplier = 1.0f; // will be replaced with day-night cycle + WorldRenderer(Engine* engine, Level* level, const ContentGfxCache* cache); ~WorldRenderer(); void draw(const GfxContext& context, Camera* camera, bool occlusion); + void drawDebug(const GfxContext& context, Camera* camera); + + inline bool isChunkBordersOn() {return chunkBorders;} + inline void setChunkBorders(bool flag) {chunkBorders = flag;} }; diff --git a/src/world/Level.h b/src/world/Level.h index 6e3e7cc4..084b9cd3 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -31,8 +31,6 @@ public: LevelEvents* events; const EngineSettings& settings; - float skyLightMutliplier = 1.0f; // will be replaced with day-night cycle - Level(World* world, const Content* content, Player* player,