From fbce36a05cd26944dc82b5d44be56988966cdb4e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 1 Oct 2022 18:02:48 +0300 Subject: [PATCH] Refactor, shader fix --- res/main.glslf | 5 ++++- src/voxel_engine.cpp | 30 +++++++++++++++--------------- src/world/Level.cpp | 3 +++ src/world/Level.h | 2 ++ src/world_render.cpp | 3 ++- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/res/main.glslf b/res/main.glslf index f8197996..9f56df09 100644 --- a/res/main.glslf +++ b/res/main.glslf @@ -7,11 +7,14 @@ out vec4 f_color; uniform sampler2D u_texture0; uniform vec3 u_fogColor; +uniform float u_fogFactor; void main(){ vec4 tex_color = texture(u_texture0, a_texCoord); //if (tex_color.a < 0.5) // discard; float depth = (a_distance/256.0)*(a_distance/256.0)*256.0/6; - f_color = mix(a_color * tex_color, vec4(u_fogColor,1.0), min(1.0, depth/256.0/1.0f)); + float alpha = a_color.a * tex_color.a; + f_color = mix(a_color * tex_color, vec4(u_fogColor,1.0), min(1.0, depth*u_fogFactor)); + f_color.a = alpha; } diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 74ed3206..a24b3e92 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -78,18 +78,12 @@ void write_world(World* world, Level* level){ world->wfile->writePlayer(level->player); } -void update_level(World* world, Level* level, vec3 position, float delta, long frame, VoxelRenderer* renderer, PlayerController* playerController){ - playerController->update_controls(delta); - playerController->update_interaction(); +void update_level(World* world, Level* level, float delta, long frame, VoxelRenderer* renderer){ + level->playerController->update_controls(delta); + level->playerController->update_interaction(); + vec3 position = level->player->hitbox->position; level->chunks->setCenter(world->wfile, position.x, 0, position.z); - int freeLoaders = level->chunksController->countFreeLoaders(); - for (int i = 0; i < freeLoaders; i++) - level->chunksController->_buildMeshes(renderer, frame); - - freeLoaders = level->chunksController->countFreeLoaders(); - for (int i = 0; i < freeLoaders; i++) - level->chunksController->loadVisible(world->wfile); } Level* load_level(World* world, Player* player) { @@ -137,7 +131,6 @@ int main() { std::cout << "-- preparing systems" << std::endl; HudRenderer hud; WorldRenderer worldRenderer(level); - PlayerController playerController(level); float lastTime = glfwGetTime(); float delta = 0.0f; @@ -162,12 +155,19 @@ int main() { devdata = !devdata; } - update_level(world, level, camera->position, delta, frame, worldRenderer.renderer, &playerController); + update_level(world, level, delta, frame, worldRenderer.renderer); + int freeLoaders = level->chunksController->countFreeLoaders(); + for (int i = 0; i < freeLoaders; i++) + level->chunksController->_buildMeshes(worldRenderer.renderer, frame); + freeLoaders = level->chunksController->countFreeLoaders(); + for (int i = 0; i < freeLoaders; i++) + level->chunksController->loadVisible(world->wfile); + worldRenderer.draw(world, camera, assets, occlusion); - if (playerController.selectedBlockId != -1){ - Block* selectedBlock = Block::blocks[playerController.selectedBlockId]; + if (level->playerController->selectedBlockId != -1){ + Block* selectedBlock = Block::blocks[level->playerController->selectedBlockId]; LineBatch* lineBatch = worldRenderer.lineBatch; - vec3 pos = playerController.selectedBlockPosition; + vec3 pos = level->playerController->selectedBlockPosition; if (selectedBlock->model == 1){ lineBatch->box(pos.x+0.5f, pos.y+0.5f, pos.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); } else if (selectedBlock->model == 2){ diff --git a/src/world/Level.cpp b/src/world/Level.cpp index 7770d124..a04e722f 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -1,6 +1,7 @@ #include "Level.h" #include "../lighting/Lighting.h" #include "../voxels/ChunksController.h" +#include "../player_control.h" Level::Level(World* world, Player* player, Chunks* chunks, PhysicsSolver* physics) : player(player), @@ -8,6 +9,7 @@ Level::Level(World* world, Player* player, Chunks* chunks, PhysicsSolver* physic physics(physics) { lighting = new Lighting(chunks); chunksController = new ChunksController(world, chunks, lighting); + playerController = new PlayerController(this); } Level::~Level(){ @@ -16,4 +18,5 @@ Level::~Level(){ delete player; delete lighting; delete chunksController; + delete playerController; } diff --git a/src/world/Level.h b/src/world/Level.h index de4bf554..6abb74c1 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -7,6 +7,7 @@ class Chunks; class Lighting; class PhysicsSolver; class ChunksController; +class PlayerController; class Level { public: @@ -15,6 +16,7 @@ public: PhysicsSolver* physics; Lighting* lighting; ChunksController* chunksController; + PlayerController* playerController; Level(World* world, Player* player, Chunks* chunks, PhysicsSolver* physics); ~Level(); }; diff --git a/src/world_render.cpp b/src/world_render.cpp index 8a98dc9d..660da4c4 100644 --- a/src/world_render.cpp +++ b/src/world_render.cpp @@ -112,7 +112,8 @@ void WorldRenderer::draw(World* world, Camera* camera, Assets* assets, bool occl shader->uniformMatrix("u_view", camera->getView()); shader->uniform1f("u_gamma", 1.6f); shader->uniform3f("u_skyLightColor", 2.2f,2.2f,2.2f); - shader->uniform3f("u_fogColor", 0.7f,0.71f,0.73f); + shader->uniform3f("u_fogColor", 0.7f,0.81f,1.0f); + shader->uniform1f("u_fogFactor", 0.03f); shader->uniform3f("u_cameraPos", camera->position.x,camera->position.y,camera->position.z); texture->bind();