mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-08 17:57:02 +08:00
feat(ui): add button scaling and change square vertices to top-left origin
This commit is contained in:
@@ -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] = {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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(); }
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user