feat(ui): add button scaling and change square vertices to top-left origin

This commit is contained in:
2026-07-13 11:11:30 +08:00
parent 01c9f61d1c
commit 576a2f8072
8 changed files with 29 additions and 25 deletions

View File

@@ -188,13 +188,14 @@ constexpr float CUBE_VER[24] = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0,
constexpr int OUTLINE_CUBE_INDICES[24] = {0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, constexpr int OUTLINE_CUBE_INDICES[24] = {0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6,
6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7}; 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7};
constexpr float SQUARE_VERTICES[6][2] = { constexpr float SQUARE_VERTICES_TOP_LEFT[6][2] = {
{-0.5f, -0.5f}, // bottom left {0.0f, 0.0f}, // top left
{-0.5f, 0.5f}, // top left {0.0f, 1.0f}, // bottom left
{0.5f, 0.5f}, // top right {1.0f, 1.0f}, // bottom right
{0.5f, 0.5f}, // top right
{0.5f, -0.5f}, // bottom right {1.0f, 1.0f}, // bottom right
{-0.5f, -0.5f} // bottom left {1.0f, 0.0f}, // top right
{0.0f, 0.0f} // top left
}; };
constexpr float SQUARE_TEXTURE_POS[6][2] = { constexpr float SQUARE_TEXTURE_POS[6][2] = {

View File

@@ -107,10 +107,10 @@ private:
ShaderManager m_shaders; ShaderManager m_shaders;
/* /*
0 - quad vao 0 - quad vao (center)
1 - sky vao 1 - sky vao
2 - outline vao 2 - outline vao
3 - ui vao 3 - ui vao (top-left)
4 - text vao 4 - text vao
*/ */
std::vector<VertexArray> m_vao; std::vector<VertexArray> m_vao;

View File

@@ -22,7 +22,7 @@ public:
Widget& set_position(const glm::vec2& pos) override; Widget& set_position(const glm::vec2& pos) override;
Widget& set_position(float x, float y) override; Widget& set_position(float x, float y) override;
Widget& set_scale(float scale) override;
float width() const override; float width() const override;
float height() const override; float height() const override;

View File

@@ -2,7 +2,6 @@
#include "Cubed/ui/text.hpp" #include "Cubed/ui/text.hpp"
#include "Cubed/ui/ui_vertex_data.hpp" #include "Cubed/ui/ui_vertex_data.hpp"
#include "Cubed/ui/widget.hpp" #include "Cubed/ui/widget.hpp"
#include "glm/ext/vector_float2.hpp"
namespace Cubed { namespace Cubed {
class Label : public Widget { class Label : public Widget {
public: public:
@@ -30,8 +29,6 @@ protected:
virtual void on_render(Renderer& renderer) override; virtual void on_render(Renderer& renderer) override;
private: private:
float m_scale = 1.0f;
glm::vec2 m_pos{0.0f, 0.0f};
TextStyle m_text; TextStyle m_text;
UIVertexData m_data; UIVertexData m_data;
bool m_dirty = false; bool m_dirty = false;

View File

@@ -42,6 +42,7 @@ protected:
virtual void on_render(Renderer& renderer); virtual void on_render(Renderer& renderer);
std::string m_id; std::string m_id;
float m_scale = 1.0f; float m_scale = 1.0f;
// Center is at the top-left corner, position is at the top-left corner
glm::vec2 m_pos{0.0f, 0.0f}; glm::vec2 m_pos{0.0f, 0.0f};
private: private:

View File

@@ -93,8 +93,9 @@ void Renderer::init(bool debug_on) {
m_vao[3].bind(); m_vao[3].bind();
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
Vertex2D vex{SQUARE_VERTICES[i][0], SQUARE_VERTICES[i][1], Vertex2D vex{SQUARE_VERTICES_TOP_LEFT[i][0],
SQUARE_TEXTURE_POS[i][0], SQUARE_TEXTURE_POS[i][1], 0}; SQUARE_VERTICES_TOP_LEFT[i][1], SQUARE_TEXTURE_POS[i][0],
SQUARE_TEXTURE_POS[i][1], 0};
m_ui.emplace_back(vex); m_ui.emplace_back(vex);
} }
m_ui_vbo->buffer_data(m_ui.data(), m_ui.size() * sizeof(Vertex2D)); m_ui_vbo->buffer_data(m_ui.data(), m_ui.size() * sizeof(Vertex2D));

View File

@@ -1,7 +1,5 @@
#include "Cubed/ui/button.hpp" #include "Cubed/ui/button.hpp"
#include "Cubed/tools/log.hpp"
namespace Cubed { namespace Cubed {
Button::Button() {} Button::Button() {}
@@ -24,22 +22,23 @@ void Button::render(Renderer& renderer) {
} }
bool Button::handle_mouse_move_event(const MouseMoveEvent& e) { bool Button::handle_mouse_move_event(const MouseMoveEvent& e) {
if (e.xpos >= m_min_pos.x && e.xpos <= m_max_pos.x) { if (e.xpos >= m_min_pos.x && e.xpos <= m_max_pos.x) {
if (e.ypos >= m_min_pos.y && e.ypos <= m_max_pos.y) { if (e.ypos >= m_min_pos.y && e.ypos <= m_max_pos.y) {
m_hovered = true; m_hovered = true;
Logger::info("Hovered {}", m_hovered);
return true; return true;
} }
} }
m_hovered = false; m_hovered = false;
Logger::info("Hovered {}", m_hovered);
return false; return false;
} }
bool Button::handle_mouse_button_event(const MouseButtonEvent& e) { bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
if (e.action == KeyAction::PRESS && e.key == MouseKey::LEFT_BUTTON) { if (e.action == KeyAction::PRESS && e.key == MouseKey::LEFT_BUTTON) {
if (m_hovered && m_clicked) { if (m_hovered && m_clicked) {
m_clicked(); m_clicked();
Logger::info("Button click!");
return true; return true;
} }
} }
@@ -52,15 +51,21 @@ Widget& Button::set_position(const glm::vec2& pos) {
m_foreground->set_position(pos); m_foreground->set_position(pos);
m_min_pos = pos; m_min_pos = pos;
m_max_pos.x = m_min_pos.x + m_background->width(); m_max_pos.x = m_min_pos.x + m_background->width() * m_scale;
m_max_pos.y = m_min_pos.y + m_background->height(); m_max_pos.y = m_min_pos.y + m_background->height() * m_scale;
return *this; return *this;
} }
Widget& Button::set_position(float x, float y) { Widget& Button::set_position(float x, float y) {
return set_position(glm::vec2{x, y}); return set_position(glm::vec2{x, y});
} }
Widget& Button::set_scale(float scale) {
m_scale = scale;
m_background->set_scale(scale);
m_max_pos.x = m_min_pos.x + m_background->width() * m_scale;
m_max_pos.y = m_min_pos.y + m_background->height() * m_scale;
return *this;
}
float Button::width() const { return m_background->width(); } float Button::width() const { return m_background->width(); }
float Button::height() const { return m_background->height(); } float Button::height() const { return m_background->height(); }

View File

@@ -16,7 +16,6 @@ void MainMenuUIManager::init() {
auto& back = start_game_button->set_background<Image>(); auto& back = start_game_button->set_background<Image>();
back.set_image("texture/ui/button001.png", back.set_image("texture/ui/button001.png",
m_scene.scene_manager().app().texture_manager()); m_scene.scene_manager().app().texture_manager());
back.set_scale(3.0f);
auto& fore = start_game_button->set_foreground<Label>(); auto& fore = start_game_button->set_foreground<Label>();
fore.set_text("Start Game"); fore.set_text("Start Game");
@@ -27,7 +26,7 @@ void MainMenuUIManager::init() {
back.width() / 2.0f, back.width() / 2.0f,
m_scene.scene_manager().app().renderer().window_width() / 2.0f + m_scene.scene_manager().app().renderer().window_width() / 2.0f +
back.height() / 2.0f); back.height() / 2.0f);
start_game_button->set_scale(3.0f);
m_widgets.try_emplace("start game", std::move(start_game_button)); m_widgets.try_emplace("start game", std::move(start_game_button));
} }
void MainMenuUIManager::update(float dt) { void MainMenuUIManager::update(float dt) {