From 1d73c0bd9f723113e55d13c7d6d26e1bce570dac Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 5 Dec 2023 14:47:46 +0300 Subject: [PATCH 1/2] Added FOV and mouse sensitivity settings --- src/files/settings_io.cpp | 2 ++ src/frontend/WorldRenderer.cpp | 2 +- src/frontend/gui/GUI.cpp | 2 +- src/frontend/hud.cpp | 4 ++-- src/frontend/menu.cpp | 34 ++++++++++++++++++++++++++++++++++ src/frontend/screens.cpp | 5 ++++- src/logic/PlayerController.cpp | 5 +++-- src/settings.h | 4 ++++ src/window/Camera.cpp | 12 ++++++++++-- src/window/Camera.h | 6 +++++- 10 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/files/settings_io.cpp b/src/files/settings_io.cpp index aa0a73c5..0ecc4414 100644 --- a/src/files/settings_io.cpp +++ b/src/files/settings_io.cpp @@ -25,7 +25,9 @@ toml::Wrapper create_wrapper(EngineSettings& settings) { toml::Section& camera = wrapper.add("camera"); camera.add("fov-effects", &settings.camera.fovEvents); + camera.add("fov", &settings.camera.fov); camera.add("shaking", &settings.camera.shaking); + camera.add("sensitivity", &settings.camera.sensitivity); toml::Section& graphics = wrapper.add("graphics"); graphics.add("fog-curve", &settings.graphics.fogCurve); diff --git a/src/frontend/WorldRenderer.cpp b/src/frontend/WorldRenderer.cpp index e065542c..8ab9f0ec 100644 --- a/src/frontend/WorldRenderer.cpp +++ b/src/frontend/WorldRenderer.cpp @@ -147,7 +147,7 @@ void WorldRenderer::draw(const GfxContext& pctx, Camera* camera){ Shader* backShader = assets->getShader("background"); backShader->use(); backShader->uniformMatrix("u_view", camera->getView(false)); - backShader->uniform1f("u_zoom", camera->zoom); + backShader->uniform1f("u_zoom", camera->zoom*camera->getFov()/(3.141592*0.5f)); backShader->uniform1f("u_ar", (float)Window::width/(float)Window::height); skybox->draw(backShader); diff --git a/src/frontend/gui/GUI.cpp b/src/frontend/gui/GUI.cpp index 4710b4c4..0027b2f2 100644 --- a/src/frontend/gui/GUI.cpp +++ b/src/frontend/gui/GUI.cpp @@ -120,7 +120,7 @@ void GUI::act(float delta) { void GUI::draw(Batch2D* batch, Assets* assets) { menu->setCoord((Window::size() - menu->size()) / 2.0f); - uicamera->fov = Window::height; + uicamera->setFov(Window::height); Shader* uishader = assets->getShader("ui"); uishader->use(); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 036f4072..6a8ea2b5 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -303,7 +303,7 @@ void HudRenderer::draw(const GfxContext& ctx){ debugPanel->visible(level->player->debug); - uicamera->fov = height; + uicamera->setFov(height); Shader* uishader = assets->getShader("ui"); uishader->use(); @@ -337,7 +337,7 @@ void HudRenderer::draw(const GfxContext& ctx){ Block* cblock = contentIds->getBlockDef(player->choosenBlock); assert(cblock != nullptr); - blocksPreview->draw(cblock, width - 56, uicamera->fov - 56, 48, vec4(1.0f)); + blocksPreview->draw(cblock, width - 56, uicamera->getFov() - 56, 48, vec4(1.0f)); //drawBlockPreview(cblock, width - 56, uicamera->fov - 56, 48, 48, vec4(1.0f)); } uishader->use(); diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index 036ff95c..e4d0e118 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -200,6 +200,7 @@ Panel* create_settings_panel(Engine* engine, PagesControl* menu) { Panel* panel = new Panel(vec2(400, 200), vec4(5.0f), 1.0f); panel->color(vec4(0.0f)); + // TODO: simplify repeating code for trackbars /* Load Distance setting track bar */{ panel->add((new Label(L""))->textSupplier([=]() { return L"Load Distance: " + @@ -250,6 +251,39 @@ Panel* create_settings_panel(Engine* engine, PagesControl* menu) { panel->add(trackbar); } + /* Fov setting track bar */{ + panel->add((new Label(L""))->textSupplier([=]() { + int fov = (int)engine->getSettings().camera.fov; + return L"FOV: "+std::to_wstring(fov)+L"°"; + })); + + TrackBar* trackbar = new TrackBar(30.0, 120.0, 90, 1, 4); + trackbar->supplier([=]() { + return engine->getSettings().camera.fov; + }); + trackbar->consumer([=](double value) { + engine->getSettings().camera.fov = value; + }); + panel->add(trackbar); + } + /* Camera sensitivity setting track bar */{ + panel->add((new Label(L""))->textSupplier([=]() { + std::wstringstream ss; + ss << std::fixed << std::setprecision(1); + ss << engine->getSettings().camera.sensitivity; + return L"Sensitivity: "+ss.str(); + })); + + TrackBar* trackbar = new TrackBar(0.1, 10.0, 2.0, 0.1, 4); + trackbar->supplier([=]() { + return engine->getSettings().camera.sensitivity; + }); + trackbar->consumer([=](double value) { + engine->getSettings().camera.sensitivity = value; + }); + panel->add(trackbar); + } + /* V-Sync checkbox */{ Panel* checkpanel = new Panel(vec2(400, 32), vec4(5.0f), 1.0f); checkpanel->color(vec4(0.0f)); diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index 0eb07e27..5de28c4a 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -73,7 +73,7 @@ void MenuScreen::draw(float delta) { Window::clear(); Window::setBgColor(vec3(0.2f)); - uicamera->fov = Window::height; + uicamera->setFov(Window::height); Shader* uishader = engine->getAssets()->getShader("ui"); uishader->use(); uishader->uniformMatrix("u_projview", uicamera->getProjView()); @@ -136,12 +136,15 @@ void LevelScreen::update(float delta) { if (!gui->isFocusCaught()) { updateHotkeys(); } + // TODO: subscribe for setting change EngineSettings& settings = engine->getSettings(); + level->player->camera->setFov(glm::radians(settings.camera.fov)); if (settings.graphics.backlight != backlight) { level->chunks->saveAndClear(); backlight = settings.graphics.backlight; } + if (!hud->isPause()) { level->world->updateTimers(delta); } diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index fd877b3d..bc52d6bd 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -41,8 +41,9 @@ void CameraControl::refresh() { } void CameraControl::updateMouse(PlayerInput& input) { - float rotX = -Events::deltaX / Window::height * 2; - float rotY = -Events::deltaY / Window::height * 2; + float sensitivity = settings.sensitivity; + float rotX = -Events::deltaX / Window::height * sensitivity; + float rotY = -Events::deltaY / Window::height * sensitivity; if (input.zoom){ rotX /= 4; diff --git a/src/settings.h b/src/settings.h index 59a0fcb7..ceb7c303 100644 --- a/src/settings.h +++ b/src/settings.h @@ -37,6 +37,10 @@ struct CameraSettings { bool fovEvents = true; /* Camera movement shake */ bool shaking = true; + /* Camera field of view */ + float fov = 90.0f; + /* Camera sensitivity */ + float sensitivity = 2.0f; }; struct GraphicsSettings { diff --git a/src/window/Camera.cpp b/src/window/Camera.cpp index fdf68ca1..93d5a313 100644 --- a/src/window/Camera.cpp +++ b/src/window/Camera.cpp @@ -7,7 +7,7 @@ using glm::vec3; using glm::vec4; using glm::mat4; -Camera::Camera(vec3 position, float fov) : position(position), fov(fov), zoom(1.0f), rotation(1.0f) { +Camera::Camera(vec3 position, float fov) : fov(fov), position(position), zoom(1.0f), rotation(1.0f) { updateVectors(); } @@ -60,4 +60,12 @@ mat4 Camera::getView(bool pos){ mat4 Camera::getProjView(){ return getProjection()*getView(); -} \ No newline at end of file +} + +void Camera::setFov(float fov) { + this->fov = fov; +} + +float Camera::getFov() const { + return fov; +} diff --git a/src/window/Camera.h b/src/window/Camera.h index ccf98f01..d327c31c 100644 --- a/src/window/Camera.h +++ b/src/window/Camera.h @@ -5,6 +5,7 @@ class Camera { void updateVectors(); + float fov; public: glm::vec3 front; glm::vec3 up; @@ -12,7 +13,7 @@ public: glm::vec3 dir; glm::vec3 position; - float fov; + float zoom; glm::mat4 rotation; bool perspective = true; @@ -25,6 +26,9 @@ public: glm::mat4 getProjection(); glm::mat4 getView(bool position=true); glm::mat4 getProjView(); + + void setFov(float fov); + float getFov() const; }; #endif /* WINDOW_CAMERA_H_ */ From ab864e27fe159dea9d29f843fbaacacae20d043a Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 5 Dec 2023 15:06:07 +0300 Subject: [PATCH 2/2] Mouse Sensitivity moved to controls menu --- src/frontend/menu.cpp | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index e4d0e118..ab7ee152 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -172,9 +172,27 @@ Panel* create_controls_panel(Engine* engine, PagesControl* menu) { Panel* panel = new Panel(vec2(400, 200), vec4(2.0f), 1.0f); panel->color(vec4(0.0f)); + /* Camera sensitivity setting track bar */{ + panel->add((new Label(L""))->textSupplier([=]() { + std::wstringstream ss; + ss << std::fixed << std::setprecision(1); + ss << engine->getSettings().camera.sensitivity; + return L"Mouse Sensitivity: "+ss.str(); + })); + + TrackBar* trackbar = new TrackBar(0.1, 10.0, 2.0, 0.1, 4); + trackbar->supplier([=]() { + return engine->getSettings().camera.sensitivity; + }); + trackbar->consumer([=](double value) { + engine->getSettings().camera.sensitivity = value; + }); + panel->add(trackbar); + } + Panel* scrollPanel = new Panel(vec2(400, 200), vec4(2.0f), 1.0f); scrollPanel->color(vec4(0.0f, 0.0f, 0.0f, 0.3f)); - scrollPanel->maxLength(500); + scrollPanel->maxLength(400); for (auto& entry : Events::bindings){ string bindname = entry.first; @@ -266,23 +284,6 @@ Panel* create_settings_panel(Engine* engine, PagesControl* menu) { }); panel->add(trackbar); } - /* Camera sensitivity setting track bar */{ - panel->add((new Label(L""))->textSupplier([=]() { - std::wstringstream ss; - ss << std::fixed << std::setprecision(1); - ss << engine->getSettings().camera.sensitivity; - return L"Sensitivity: "+ss.str(); - })); - - TrackBar* trackbar = new TrackBar(0.1, 10.0, 2.0, 0.1, 4); - trackbar->supplier([=]() { - return engine->getSettings().camera.sensitivity; - }); - trackbar->consumer([=](double value) { - engine->getSettings().camera.sensitivity = value; - }); - panel->add(trackbar); - } /* V-Sync checkbox */{ Panel* checkpanel = new Panel(vec2(400, 32), vec4(5.0f), 1.0f);