From 6c70bb531b4c28d9dd0a06919468ddb1b704f2b7 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 19 Nov 2023 00:22:12 +0300 Subject: [PATCH] world render refactor --- src/frontend/screens.cpp | 6 ++---- src/frontend/world_render.cpp | 28 ++++++++++++++-------------- src/frontend/world_render.h | 16 ++++++---------- src/graphics/LineBatch.cpp | 12 ++++-------- src/graphics/LineBatch.h | 8 +------- 5 files changed, 27 insertions(+), 43 deletions(-) diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index afc1d055..984ebc0e 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -301,7 +301,7 @@ void MenuScreen::draw(float delta) { LevelScreen::LevelScreen(Engine* engine, Level* level) : Screen(engine), level(level) { - worldRenderer = new WorldRenderer(level, engine->getAssets()); + worldRenderer = new WorldRenderer(engine, level); hud = new HudRenderer(engine, level); } @@ -351,11 +351,9 @@ void LevelScreen::update(float delta) { } void LevelScreen::draw(float delta) { - EngineSettings& settings = engine->getSettings(); Camera* camera = level->player->camera; - float fogFactor = 18.0f / (float)settings.chunks.loadDistance; - worldRenderer->draw(camera, occlusion, fogFactor, settings.graphics.fogCurve); + worldRenderer->draw(camera, occlusion); hud->draw(); if (level->player->debug) { hud->drawDebug( 1 / delta, occlusion); diff --git a/src/frontend/world_render.cpp b/src/frontend/world_render.cpp index 175c940b..c3227872 100644 --- a/src/frontend/world_render.cpp +++ b/src/frontend/world_render.cpp @@ -11,7 +11,6 @@ #include "../graphics/Shader.h" #include "../graphics/Texture.h" #include "../graphics/LineBatch.h" -#include "../graphics/Batch3D.h" #include "../voxels/Chunks.h" #include "../voxels/Chunk.h" #include "../voxels/Block.h" @@ -22,13 +21,15 @@ #include "../assets/Assets.h" #include "../objects/player_control.h" #include "../maths/FrustumCulling.h" +#include "../settings.h" +#include "../engine.h" using glm::vec3; using std::shared_ptr; -WorldRenderer::WorldRenderer(Level* level, Assets* assets) : assets(assets), level(level) { +WorldRenderer::WorldRenderer(Engine* engine, Level* level) + : engine(engine), level(level) { lineBatch = new LineBatch(4096); - batch3d = new Batch3D(1024); renderer = new ChunksRenderer(level); frustumCulling = new Frustum(); level->events->listen(EVT_CHUNK_HIDDEN, [this](lvl_event_type type, Chunk* chunk) { @@ -37,7 +38,6 @@ WorldRenderer::WorldRenderer(Level* level, Assets* assets) : assets(assets), lev } WorldRenderer::~WorldRenderer() { - delete batch3d; delete lineBatch; delete renderer; delete frustumCulling; @@ -65,7 +65,9 @@ bool WorldRenderer::drawChunk(size_t index, Camera* camera, Shader* shader, bool } -void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float fogCurve){ +void WorldRenderer::draw(Camera* camera, bool occlusion){ + EngineSettings& settings = engine->getSettings(); + Assets* assets = engine->getAssets(); Chunks* chunks = level->chunks; vec3 skyColor(0.7f, 0.81f, 1.0f); @@ -77,6 +79,8 @@ void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); + float fogFactor = 18.0f / (float)settings.chunks.loadDistance; + Texture* texture = assets->getTexture("block"); Shader* shader = assets->getShader("main"); Shader* linesShader = assets->getShader("lines"); @@ -87,7 +91,7 @@ void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float shader->uniform3f("u_skyLightColor", 1.1f,1.1f,1.1f); shader->uniform3f("u_fogColor", skyColor); shader->uniform1f("u_fogFactor", fogFactor); - shader->uniform1f("u_fogCurve", fogCurve); + shader->uniform1f("u_fogCurve", settings.graphics.fogCurve); shader->uniform3f("u_cameraPos", camera->position); Block* cblock = Block::blocks[level->player->choosenBlock]; @@ -124,9 +128,6 @@ void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float } shader->uniformMatrix("u_model", mat4(1.0f)); - batch3d->begin(); - // draw 3D stuff here - batch3d->render(); if (level->playerController->selectedBlockId != -1){ Block* selectedBlock = Block::blocks[level->playerController->selectedBlockId]; @@ -142,6 +143,8 @@ void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float lineBatch->render(); } + glDisable(GL_DEPTH_TEST); + if (level->player->debug) { float length = 40.f; @@ -153,16 +156,13 @@ void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float -(float)Window::height, 0.f, -length, length) * model * glm::inverse(camera->rotation)); - glDisable(GL_DEPTH_TEST); - - glLineWidth(4.0f); + lineBatch->lineWidth(4.0f); lineBatch->line(0.f, 0.f, 0.f, length, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f); lineBatch->line(0.f, 0.f, 0.f, 0.f, length, 0.f, 0.f, 0.f, 0.f, 1.f); lineBatch->line(0.f, 0.f, 0.f, 0.f, 0.f, length, 0.f, 0.f, 0.f, 1.f); lineBatch->render(); - glEnable(GL_DEPTH_TEST); - glLineWidth(2.0f); + lineBatch->lineWidth(2.0f); lineBatch->line(0.f, 0.f, 0.f, length, 0.f, 0.f, 1.f, 0.f, 0.f, 1.f); lineBatch->line(0.f, 0.f, 0.f, 0.f, length, 0.f, 0.f, 1.f, 0.f, 1.f); lineBatch->line(0.f, 0.f, 0.f, 0.f, 0.f, length, 0.f, 0.f, 1.f, 1.f); diff --git a/src/frontend/world_render.h b/src/frontend/world_render.h index 7e263e68..34e9df8b 100644 --- a/src/frontend/world_render.h +++ b/src/frontend/world_render.h @@ -10,32 +10,28 @@ #include #include -class World; class Level; class Camera; -class Assets; class LineBatch; -class Batch3D; class ChunksRenderer; class Shader; class Texture; -class Framebuffer; class Frustum; +class Engine; class WorldRenderer { - Batch3D* batch3d; - Assets* assets; + Engine* engine; Level* level; Frustum* frustumCulling; + LineBatch* lineBatch; + ChunksRenderer* renderer; bool drawChunk(size_t index, Camera* camera, Shader* shader, bool occlusion); public: - ChunksRenderer* renderer; - LineBatch* lineBatch; - WorldRenderer(Level* level, Assets* assets); + WorldRenderer(Engine* engine, Level* level); ~WorldRenderer(); - void draw(Camera* camera, bool occlusion, float fogFactor, float fogCurve); + void draw(Camera* camera, bool occlusion); }; diff --git a/src/graphics/LineBatch.cpp b/src/graphics/LineBatch.cpp index 0d8f6216..37a74015 100644 --- a/src/graphics/LineBatch.cpp +++ b/src/graphics/LineBatch.cpp @@ -1,10 +1,3 @@ -/* - * LineBatch.cpp - * - * Created on: Jun 25, 2020 - * Author: MihailRis - */ - #include "LineBatch.h" #include "Mesh.h" @@ -67,7 +60,6 @@ void LineBatch::box(float x, float y, float z, float w, float h, float d, line(x+w, y+h, z-d, x+w, y+h, z+d, r,g,b,a); } -#include void LineBatch::render(){ if (index == 0) return; @@ -75,3 +67,7 @@ void LineBatch::render(){ mesh->draw(GL_LINES); index = 0; } + +void LineBatch::lineWidth(float width) { + glLineWidth(width); +} \ No newline at end of file diff --git a/src/graphics/LineBatch.h b/src/graphics/LineBatch.h index 99cfaa29..58d7de3a 100644 --- a/src/graphics/LineBatch.h +++ b/src/graphics/LineBatch.h @@ -1,10 +1,3 @@ -/* - * LineBatch.h - * - * Created on: Jun 25, 2020 - * Author: MihailRis - */ - #ifndef GRAPHICS_LINEBATCH_H_ #define GRAPHICS_LINEBATCH_H_ @@ -27,6 +20,7 @@ public: float r, float g, float b, float a); void render(); + void lineWidth(float width); }; #endif /* GRAPHICS_LINEBATCH_H_ */