diff --git a/include/Cubed/debug_collector.hpp b/include/Cubed/debug_collector.hpp index 6601c94..a6cb5ac 100644 --- a/include/Cubed/debug_collector.hpp +++ b/include/Cubed/debug_collector.hpp @@ -1,6 +1,7 @@ #pragma once -#include "Cubed/ui/text.hpp" +#include "Cubed/ui/label.hpp" +#include "Cubed/ui/widget.hpp" #include @@ -11,14 +12,13 @@ public: static DebugCollector& get(); DebugCollector(); - std::unordered_map& all_texts(); - - Text& text(std::string_view name); - void report(std::string_view name, std::string_view content); + void report(const std::string& name, std::string_view content); void init_text(); + Widget& get_widget(); private: - std::unordered_map m_texts; + Widget m_widget; + std::unordered_map m_component; }; } // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/render/renderer.hpp b/include/Cubed/render/renderer.hpp index 38f6949..42471c1 100644 --- a/include/Cubed/render/renderer.hpp +++ b/include/Cubed/render/renderer.hpp @@ -9,7 +9,7 @@ #include "Cubed/render/vertex_buffer.hpp" #include "Cubed/render/world_renderer.hpp" #include "Cubed/shader.hpp" -#include "Cubed/ui/text.hpp" +#include "Cubed/ui/label.hpp" #include #include @@ -31,6 +31,9 @@ public: void init(bool debug_on); const Shader& get_shader(const std::string& name) const; void render(); + + void render_lable(const Label& label); + void update(float delta_time); void update_fov(float fov); void update_proj_matrix(float aspect, float width, float height); @@ -118,9 +121,9 @@ private: void day_night_calculation(); void render_sky(); - void render_text(); - void render_ui(); + void render_ui(); + void render_crosshair(); void render_dev_panel(); }; diff --git a/include/Cubed/scene/scene.hpp b/include/Cubed/scene/scene.hpp new file mode 100644 index 0000000..76b3d92 --- /dev/null +++ b/include/Cubed/scene/scene.hpp @@ -0,0 +1,11 @@ +#pragma once + +namespace Cubed { +class Scene { +public: + Scene() = default; + virtual ~Scene() = default; + virtual void update(float dt) = 0; + virtual void render() = 0; +}; +} // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/tools/font.hpp b/include/Cubed/tools/font.hpp index 726f436..263bfa0 100644 --- a/include/Cubed/tools/font.hpp +++ b/include/Cubed/tools/font.hpp @@ -29,9 +29,7 @@ public: Font(); ~Font(); - static std::vector vertices(const std::string& text, - float x = 0.0f, float y = 0.0f, - float scale = 1.0f); + static std::vector vertices(const std::string& text); static const Texture* text_texture(); static const std::string& font_path(); diff --git a/include/Cubed/ui/label.hpp b/include/Cubed/ui/label.hpp new file mode 100644 index 0000000..f4034cc --- /dev/null +++ b/include/Cubed/ui/label.hpp @@ -0,0 +1,42 @@ +#pragma once +#include "Cubed/ui/text.hpp" +#include "Cubed/ui/ui_vertex_data.hpp" +#include "Cubed/ui/widget.hpp" +#include "glm/ext/vector_float2.hpp" +namespace Cubed { +class Label : public Widget { +public: + Label(const Label&) = delete; + Label(Label&&) = delete; + Label& operator=(const Label&) = delete; + Label& operator=(Label&&) = delete; + + Label(const std::string& id); + virtual ~Label() = default; + + Label& set_position(const glm::vec2& pos); + Label& set_position(float x, float y); + Label& set_text(std::string_view text); + Label& set_scale(float scale); + Label& set_color(Color color); + virtual void update(float dt) override; + virtual void render(Renderer& renderer) override; + + const UIVertexData& data() const; + const glm::vec2& pos() const; + const TextStyle& text_style() const; + float scale() const; + +protected: + virtual void on_update(float dt) override; + virtual void on_render(Renderer& renderer) override; + +private: + float m_scale = 1.0f; + glm::vec2 m_pos{0.0f, 0.0f}; + TextStyle m_text; + UIVertexData m_data; + bool m_dirty = false; + void update_vertices(); +}; +} // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/ui/text.hpp b/include/Cubed/ui/text.hpp index a7e5aba..9341d6b 100644 --- a/include/Cubed/ui/text.hpp +++ b/include/Cubed/ui/text.hpp @@ -1,8 +1,5 @@ #pragma once -#include "Cubed/primitive_data.hpp" -#include "Cubed/render/vertex_array.hpp" -#include "Cubed/render/vertex_buffer.hpp" #include "Cubed/ui/color.hpp" #include @@ -10,46 +7,9 @@ #include namespace Cubed { -class Shader; - -class Text { -public: - explicit Text(std::string_view name); - Text(std::string_view name, std::string_view str, - glm::vec2 pos = glm::vec2{0.0f, 0.0f}, Color color = Color::BLACK); - ~Text(); - Text(const Text&) = delete; - Text(Text&&) noexcept; - Text& operator=(const Text&) = delete; - Text& operator=(Text&&) noexcept = delete; - Text& color(Color color); - // Text& color(const glm::vec4& color, int pos); - Text& position(float x, float y); - Text& scale(float s); - Text& text(std::string_view str); - - std::size_t uuid() const; - void render(const Shader& shader); - - bool operator==(const Text& other) const; - -private: - float m_scale = 1.0f; - glm::vec2 m_pos{0.0f, 0.0f}; - - const std::string NAME; - const std::size_t UUID; - - std::string m_text; - glm::vec4 m_color{1.0f, 1.0f, 1.0f, 1.0f}; - glm::mat4 m_model_matrix; - - std::vector m_vertices; - std::unique_ptr m_vbo; - std::unique_ptr m_vao; - - void update_vertices(); - void upload_to_gpu(); +struct TextStyle { + std::string text; + Color color = Color::WHITE; }; } // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/ui/ui_vertex_data.hpp b/include/Cubed/ui/ui_vertex_data.hpp new file mode 100644 index 0000000..d7633b7 --- /dev/null +++ b/include/Cubed/ui/ui_vertex_data.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "Cubed/primitive_data.hpp" +#include "Cubed/render/vertex_array.hpp" +#include "Cubed/render/vertex_buffer.hpp" + +#include +#include +#include +namespace Cubed { +struct UIVertexData { + std::vector m_vertices; + std::unique_ptr m_vbo; + std::unique_ptr m_vao; + std::atomic m_sum{0}; + UIVertexData(); + ~UIVertexData(); + UIVertexData(const UIVertexData&) = delete; + UIVertexData(UIVertexData&&) noexcept; + UIVertexData& operator=(const UIVertexData&) = delete; + UIVertexData& operator=(UIVertexData&&) noexcept; + + void upload(); + void update_sum(); +}; +} // namespace Cubed diff --git a/include/Cubed/ui/widget.hpp b/include/Cubed/ui/widget.hpp new file mode 100644 index 0000000..5268257 --- /dev/null +++ b/include/Cubed/ui/widget.hpp @@ -0,0 +1,31 @@ +#pragma once +#include +#include +namespace Cubed { +class Renderer; +class Widget { + +public: + Widget(const std::string& id); + Widget() = default; + virtual ~Widget() = default; + virtual void update(float dt); + virtual void render(Renderer& renderer); + virtual const std::string& id() const; + template T& add_child(Args&&... args) { + auto widget = std::make_unique(std::forward(args)...); + T& ref = *widget; + m_children.emplace_back(std::move(widget)); + return ref; + }; + +protected: + virtual void on_update(float dt); + virtual void on_render(Renderer& renderer); + std::string m_id; + +private: + Widget* m_parent = nullptr; + std::vector> m_children; +}; +} // namespace Cubed \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 620bf53..a99015c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,7 +17,6 @@ target_sources(${PROJECT_NAME} tools/shader_tools.cpp tools/font.cpp tools/perlin_noise.cpp - ui/text.cpp window.cpp gameplay/builders/biome_builder.cpp gameplay/builders/plain_builder.cpp @@ -59,4 +58,7 @@ target_sources(${PROJECT_NAME} render/frame_buffer.cpp render/shader_manager.cpp render/world_renderer.cpp + ui/widget.cpp + ui/label.cpp + ui/ui_vertex_data.cpp ) \ No newline at end of file diff --git a/src/app.cpp b/src/app.cpp index 196b7e0..62e3966 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -375,6 +375,7 @@ void App::update() { m_audio.update_listener(m_camera.get_camera_pos(), m_camera.get_camera_front(), glm::vec3(0, 1, 0)); m_audio.update(); + DebugCollector::get().get_widget().update(dt); m_renderer.update(dt); } diff --git a/src/debug_collector.cpp b/src/debug_collector.cpp index f579538..a2808e7 100644 --- a/src/debug_collector.cpp +++ b/src/debug_collector.cpp @@ -1,6 +1,5 @@ #include "Cubed/debug_collector.hpp" -#include "Cubed/tools/cubed_hash.hpp" #include "Cubed/tools/system_info.hpp" #include "version.hpp" @@ -14,88 +13,105 @@ DebugCollector& DebugCollector::get() { } void DebugCollector::init_text() { - Text version_text("version"); - Text fps_text("fps"); - Text player_pos_text("player_pos"); - Text rendered_chunk_text("rendered_chunk"); - Text rss_text("rss"); - Text cpu_text("cpu"); - Text gpu_text("gpu"); - Text opengl_version_text("opengl_version"); - Text biome_text("biome"); - Text speed_text("speed"); + // version_text + auto& version_text = m_widget.add_child