From dda9c40c41ef110796968a3d72e2306eb1d8d19d Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 18 Nov 2023 23:19:15 +0300 Subject: [PATCH] Added CheckBox --- src/engine.cpp | 1 + src/frontend/gui/controls.cpp | 34 +++++++++++++++++++++++++++++ src/frontend/gui/controls.h | 41 +++++++++++++++++++++++++++++++---- src/frontend/screens.cpp | 21 +++++++++++++++++- src/frontend/world_render.cpp | 2 +- 5 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/engine.cpp b/src/engine.cpp index 6151f948..f9be1b35 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -96,6 +96,7 @@ void Engine::mainloop() { screen->draw(delta); gui->draw(&batch, assets); + Window::swapInterval(settings.display.swapInterval); Window::swapBuffers(); Events::pullEvents(); } diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index d2ab43f3..c0293703 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -192,4 +192,38 @@ void TrackBar::mouseMove(GUI*, int x, int y) { if (consumer_) { consumer_(value); } +} + +CheckBox::CheckBox(bool checked) : UINode(vec2(), vec2(32.0f)), checked_(checked) { + color(vec4(0.0f, 0.0f, 0.0f, 0.5f)); +} + +void CheckBox::draw(Batch2D* batch, Assets* assets) { + if (supplier_) { + checked_ = supplier_(); + } + vec2 coord = calcCoord(); + batch->texture(nullptr); + batch->color = checked_ ? checkColor : (hover_ ? hoverColor : color_); + batch->rect(coord.x, coord.y, size_.x, size_.y); +} + +void CheckBox::mouseRelease(GUI*, int x, int y) { + checked_ = !checked_; + if (consumer_) { + consumer_(checked_); + } +} + +void CheckBox::supplier(boolsupplier supplier) { + supplier_ = supplier; +} + +void CheckBox::consumer(boolconsumer consumer) { + consumer_ = consumer; +} + +CheckBox* CheckBox::checked(bool flag) { + checked_ = flag; + return this; } \ No newline at end of file diff --git a/src/frontend/gui/controls.h b/src/frontend/gui/controls.h index 09538c4c..8bbe6f1e 100644 --- a/src/frontend/gui/controls.h +++ b/src/frontend/gui/controls.h @@ -19,6 +19,9 @@ namespace gui { typedef std::function doublesupplier; typedef std::function doubleconsumer; + typedef std::function boolsupplier; + typedef std::function boolconsumer; + class Label : public UINode { protected: std::wstring text_; @@ -37,7 +40,7 @@ namespace gui { class Button : public Panel { protected: - glm::vec4 hoverColor {0.05f, 0.1f, 0.2f, 0.75f}; + glm::vec4 hoverColor {0.05f, 0.1f, 0.15f, 0.75f}; glm::vec4 pressedColor {0.0f, 0.0f, 0.0f, 0.95f}; std::vector actions; public: @@ -62,7 +65,8 @@ namespace gui { wstringsupplier supplier = nullptr; wstringconsumer consumer = nullptr; public: - TextBox(std::wstring placeholder, glm::vec4 padding=glm::vec4(2.0f)); + TextBox(std::wstring placeholder, + glm::vec4 padding=glm::vec4(2.0f)); virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; @@ -79,7 +83,6 @@ namespace gui { protected: glm::vec4 hoverColor {0.01f, 0.02f, 0.03f, 0.5f}; glm::vec4 trackColor {1.0f, 1.0f, 1.0f, 0.4f}; - Label* label; doublesupplier supplier_ = nullptr; doubleconsumer consumer_ = nullptr; double min; @@ -88,7 +91,11 @@ namespace gui { double step; int trackWidth; public: - TrackBar(double min, double max, double value, double step=1.0, int trackWidth=3); + TrackBar(double min, + double max, + double value, + double step=1.0, + int trackWidth=1); virtual void draw(Batch2D* batch, Assets* assets) override; virtual void supplier(doublesupplier supplier); @@ -96,6 +103,32 @@ namespace gui { virtual void mouseMove(GUI*, int x, int y) override; }; + + class CheckBox : public UINode { + protected: + glm::vec4 hoverColor {0.05f, 0.1f, 0.2f, 0.75f}; + glm::vec4 checkColor {1.0f, 1.0f, 1.0f, 0.4f}; + boolsupplier supplier_ = nullptr; + boolconsumer consumer_ = nullptr; + bool checked_ = false; + public: + CheckBox(bool checked=false); + + virtual void draw(Batch2D* batch, Assets* assets) override; + + virtual void mouseRelease(GUI*, int x, int y) override; + + virtual void supplier(boolsupplier supplier); + virtual void consumer(boolconsumer consumer); + + virtual CheckBox* checked(bool flag); + + virtual bool checked() const { + if (supplier_) + return supplier_(); + return checked_; + } + }; } #endif // FRONTEND_GUI_CONTROLS_H_ \ No newline at end of file diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index 395cfc42..afc1d055 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -181,7 +181,7 @@ Panel* create_settings_panel(Engine* engine) { std::to_wstring(engine->getSettings().chunks.loadDistance); })); - TrackBar* trackbar = new TrackBar(3, 66, 10); + TrackBar* trackbar = new TrackBar(3, 66, 10, 1, 3); trackbar->supplier([=]() { return engine->getSettings().chunks.loadDistance; }); @@ -209,6 +209,25 @@ Panel* create_settings_panel(Engine* engine) { panel->add(trackbar); } + { + 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 engine->getSettings().display.swapInterval != 0; + }); + checkbox->consumer([=](bool checked) { + engine->getSettings().display.swapInterval = checked; + }); + checkpanel->add(checkbox); + checkpanel->add(new Label(L"V-Sync")); + + panel->add(checkpanel); + } + panel->add((new Button(L"Back", vec4(10.f)))->listenAction([=](GUI* gui) { panel->visible(false); gui->get("back")->visible(true); diff --git a/src/frontend/world_render.cpp b/src/frontend/world_render.cpp index 3ccd2b42..175c940b 100644 --- a/src/frontend/world_render.cpp +++ b/src/frontend/world_render.cpp @@ -91,7 +91,7 @@ void WorldRenderer::draw(Camera* camera, bool occlusion, float fogFactor, float shader->uniform3f("u_cameraPos", camera->position); Block* cblock = Block::blocks[level->player->choosenBlock]; - float multiplier = 0.2f; + float multiplier = 0.5f; shader->uniform3f("u_torchlightColor", cblock->emission[0] / 15.0f * multiplier, cblock->emission[1] / 15.0f * multiplier,