refactor: move server logic to WorldScene and refactor UI methods

This commit is contained in:
2026-07-14 09:44:52 +08:00
parent 558fd6311d
commit d1db165ca3
13 changed files with 59 additions and 49 deletions

View File

@@ -1,7 +1,5 @@
#pragma once #pragma once
#include "Cubed/audio/audio_engine.hpp" #include "Cubed/audio/audio_engine.hpp"
#include "Cubed/gameplay/network_server.hpp"
#include "Cubed/gameplay/server_world.hpp"
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
#include "Cubed/argument.hpp" #include "Cubed/argument.hpp"
#include "Cubed/config.hpp" #include "Cubed/config.hpp"
@@ -40,7 +38,7 @@ public:
Renderer& renderer(); Renderer& renderer();
TextureManager& texture_manager(); TextureManager& texture_manager();
Window& window(); Window& window();
ServerWorld& server_world();
Config& config(); Config& config();
const Argument& argument() const; const Argument& argument() const;
AudioEngine& audio(); AudioEngine& audio();
@@ -49,7 +47,7 @@ private:
Config m_game_config; Config m_game_config;
TextureManager m_texture_manager; TextureManager m_texture_manager;
NetworkServer m_server;
AudioEngine m_audio; AudioEngine m_audio;
Renderer m_renderer; Renderer m_renderer;

View File

@@ -3,6 +3,7 @@
#include "Cubed/camera.hpp" #include "Cubed/camera.hpp"
#include "Cubed/dev_panel.hpp" #include "Cubed/dev_panel.hpp"
#include "Cubed/gameplay/client_world.hpp" #include "Cubed/gameplay/client_world.hpp"
#include "Cubed/gameplay/network_server.hpp"
#include "Cubed/scene/scene.hpp" #include "Cubed/scene/scene.hpp"
#include "Cubed/ui/world_ui_manager.hpp" #include "Cubed/ui/world_ui_manager.hpp"
namespace Cubed { namespace Cubed {
@@ -26,11 +27,13 @@ public:
Camera& camera(); Camera& camera();
SceneManager& scene_manager(); SceneManager& scene_manager();
ClientWorld& client_world(); ClientWorld& client_world();
ServerWorld& server_world();
private: private:
SceneManager& m_scene_manager; SceneManager& m_scene_manager;
DevPanel m_dev_panel; DevPanel m_dev_panel;
Camera m_camera; Camera m_camera;
NetworkServer m_server;
std::shared_ptr<NetworkClient> m_client; std::shared_ptr<NetworkClient> m_client;
ClientWorld m_client_world; ClientWorld m_client_world;
WorldUIManager m_ui_manager; WorldUIManager m_ui_manager;

View File

@@ -16,9 +16,6 @@ public:
Button& operator=(const Button&) = delete; Button& operator=(const Button&) = delete;
Button& operator=(Button&&) = delete; Button& operator=(Button&&) = delete;
void render(Renderer& renderer) override;
void update(float dt) override;
bool handle_mouse_move_event(const MouseMoveEvent& e) override; bool handle_mouse_move_event(const MouseMoveEvent& e) override;
bool handle_mouse_button_event(const MouseButtonEvent& e) override; bool handle_mouse_button_event(const MouseButtonEvent& e) override;
void set_window_size(int width, int height) override; void set_window_size(int width, int height) override;
@@ -54,5 +51,8 @@ private:
std::unique_ptr<Image> m_background; std::unique_ptr<Image> m_background;
std::unique_ptr<Label> m_foreground; std::unique_ptr<Label> m_foreground;
bool m_hovered = false; bool m_hovered = false;
void on_render(Renderer& renderer) override;
void on_update(float dt) override;
}; };
} // namespace Cubed } // namespace Cubed

View File

@@ -9,8 +9,6 @@ class TextureManager;
class Image : public Widget { class Image : public Widget {
public: public:
Image(Widget* parent); Image(Widget* parent);
void update(float dt) override;
void render(Renderer& renderer) override;
Image& set_image(const std::string& path, TextureManager& texture_manager); Image& set_image(const std::string& path, TextureManager& texture_manager);
float width() const override; float width() const override;
@@ -20,6 +18,8 @@ public:
float scale() const; float scale() const;
private: private:
void on_render(Renderer& renderer) override;
const Texture* m_texture = nullptr; const Texture* m_texture = nullptr;
glm::vec2 m_pos{0.0f, 0.0f}; glm::vec2 m_pos{0.0f, 0.0f};
float m_scale = 1.0f; float m_scale = 1.0f;

View File

@@ -18,8 +18,6 @@ public:
Label& set_color(Color color); Label& set_color(Color color);
Label& set_scale(float scale); Label& set_scale(float scale);
virtual void update(float dt) override;
virtual void render(Renderer& renderer) override;
const UIVertexData& data() const; const UIVertexData& data() const;

View File

@@ -12,9 +12,6 @@ public:
Rect(Widget* parent); Rect(Widget* parent);
~Rect(); ~Rect();
void update(float dt) override;
void render(Renderer& renderer) override;
float width() const override; float width() const override;
float height() const override; float height() const override;
float alpha() const; float alpha() const;
@@ -31,6 +28,9 @@ public:
Color color() const; Color color() const;
private: private:
void on_update(float dt) override;
void on_render(Renderer& renderer) override;
Color m_color = Color::WHITE; Color m_color = Color::WHITE;
float m_width = 0.0f; float m_width = 0.0f;
float m_height = 0.0f; float m_height = 0.0f;

View File

@@ -65,17 +65,12 @@ void App::init(int argc, char** argv) {
glfwSetCharCallback(m_window.get_glfw_window(), char_callback); glfwSetCharCallback(m_window.get_glfw_window(), char_callback);
m_audio.init(); m_audio.init();
ChunkGenerator::init();
BlockManager::init(); BlockManager::init();
m_renderer.init(m_argument.debug_on); m_renderer.init(m_argument.debug_on);
Logger::info("Renderer Init Success"); Logger::info("Renderer Init Success");
// MapTable::init_map(); // MapTable::init_map();
m_texture_manager.init_texture(); m_texture_manager.init_texture();
Logger::info("Texture Load Success"); Logger::info("Texture Load Success");
if (!m_argument.is_client) {
m_server.start_server(m_argument.port);
}
m_scene_manager.request_push(SceneType::MAIN_MENU); m_scene_manager.request_push(SceneType::MAIN_MENU);
@@ -669,10 +664,6 @@ void App::run() {
update(); update();
render(); render();
} }
if (!m_argument.is_client) {
m_server.server_world().stop();
}
} }
// static Gait player_gait = Gait::WALK; // static Gait player_gait = Gait::WALK;
void App::update() { void App::update() {
@@ -733,6 +724,10 @@ void App::dispatch_event(const Event& e) {
return; return;
} }
if (DebugCollector::get().handle_event(e)) {
return;
}
if (m_scene_manager.handle_event(e)) { if (m_scene_manager.handle_event(e)) {
return; return;
} }
@@ -764,7 +759,7 @@ float App::get_fps() { return fps; }
Renderer& App::renderer() { return m_renderer; } Renderer& App::renderer() { return m_renderer; }
TextureManager& App::texture_manager() { return m_texture_manager; } TextureManager& App::texture_manager() { return m_texture_manager; }
Window& App::window() { return m_window; } Window& App::window() { return m_window; }
ServerWorld& App::server_world() { return m_server.server_world(); }
Config& App::config() { return m_game_config; } Config& App::config() { return m_game_config; }
const Argument& App::argument() const { return m_argument; } const Argument& App::argument() const { return m_argument; }
AudioEngine& App::audio() { return m_audio; } AudioEngine& App::audio() { return m_audio; }

View File

@@ -270,7 +270,7 @@ void DevPanel::show_biome_table_bar() {
} }
void DevPanel::show_time_table_bar() { void DevPanel::show_time_table_bar() {
ServerWorld& world = m_app.server_world(); ServerWorld& world = m_world_scene.server_world();
ImGui::Text("Game Tick %llu", world.game_tick()); ImGui::Text("Game Tick %llu", world.game_tick());
ImGui::SameLine(); ImGui::SameLine();
ImGui::Text("Day Tick %llu", world.day_tick()); ImGui::Text("Day Tick %llu", world.day_tick());
@@ -495,40 +495,42 @@ void DevPanel::show_server_world_table_bar() {
ImGui::Text("ChunkGenerator Seed: %u", ChunkGenerator::seed()); ImGui::Text("ChunkGenerator Seed: %u", ChunkGenerator::seed());
ImGui::Text("Pool Threads %d Max Support Threads %d Reserved Threads %d", ImGui::Text("Pool Threads %d Max Support Threads %d Reserved Threads %d",
m_app.server_world().gen_pool_threads(), m_world_scene.server_world().gen_pool_threads(),
m_app.server_world().max_threads(), RESERVED_THREADS); m_world_scene.server_world().max_threads(), RESERVED_THREADS);
ImGui::SliderInt("Set Pool Threads", &m_threads, 1, ImGui::SliderInt("Set Pool Threads", &m_threads, 1,
m_app.server_world().max_threads()); m_world_scene.server_world().max_threads());
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Set")) { if (ImGui::Button("Set")) {
m_app.server_world().change_pool_threads( m_world_scene.server_world().change_pool_threads(
ServerWorld::ThreadPoolKind::GEN, m_threads); ServerWorld::ThreadPoolKind::GEN, m_threads);
} }
if (m_threads > m_app.server_world().max_threads() - RESERVED_THREADS) { if (m_threads >
m_world_scene.server_world().max_threads() - RESERVED_THREADS) {
ImGui::TextColored( ImGui::TextColored(
ImVec4(1.0f, 1.0f, 0.0f, 1.0f), ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
"Waring: When the threads in the thread pool exceed \n(maximum " "Waring: When the threads in the thread pool exceed \n(maximum "
"threads minus reserved threads), \nit may cause stuttering."); "threads minus reserved threads), \nit may cause stuttering.");
} }
m_chunk_style = m_app.server_world().chunk_load_style(); m_chunk_style = m_world_scene.server_world().chunk_load_style();
if (ImGui::Combo("ChunkLoadStyle", &m_chunk_style, CHUNK_LOAD_STYLE, if (ImGui::Combo("ChunkLoadStyle", &m_chunk_style, CHUNK_LOAD_STYLE,
IM_ARRAYSIZE(CHUNK_LOAD_STYLE))) { IM_ARRAYSIZE(CHUNK_LOAD_STYLE))) {
m_app.server_world().set_chunk_load_style(m_chunk_style); m_world_scene.server_world().set_chunk_load_style(m_chunk_style);
} }
if (ImGui::Button("Request Chunk Build")) { if (ImGui::Button("Request Chunk Build")) {
m_app.server_world().need_gen(m_player->get_uuid()); m_world_scene.server_world().need_gen(m_player->get_uuid());
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Checkbox("Gen Thread", &m_gen_thread_running)) { if (ImGui::Checkbox("Gen Thread", &m_gen_thread_running)) {
if (m_gen_thread_running) { if (m_gen_thread_running) {
m_app.server_world().start_gen_thread(); m_world_scene.server_world().start_gen_thread();
} else { } else {
m_app.server_world().stop_gen_thread(); m_world_scene.server_world().stop_gen_thread();
} }
} }
ImGui::Text("Server Chunk Size %d", m_app.server_world().chunk_size()); ImGui::Text("Server Chunk Size %d",
m_world_scene.server_world().chunk_size());
if (ImGui::BeginTabBar("World Settings")) { if (ImGui::BeginTabBar("World Settings")) {
if (ImGui::BeginTabItem("Time")) { if (ImGui::BeginTabItem("Time")) {

View File

@@ -61,6 +61,11 @@ bool WorldScene::handle_event(const Event& e) {
} }
void WorldScene::on_enter() { void WorldScene::on_enter() {
ChunkGenerator::init();
if (!m_argument.is_client) {
m_server.start_server(m_argument.port);
}
m_client = std::make_shared<NetworkClient>(m_client_world); m_client = std::make_shared<NetworkClient>(m_client_world);
m_client->start(m_argument.ip, m_argument.port); m_client->start(m_argument.ip, m_argument.port);
@@ -80,9 +85,14 @@ void WorldScene::on_leave() {
m_scene_manager.app().window().set_camera(nullptr); m_scene_manager.app().window().set_camera(nullptr);
m_scene_manager.app().window().set_game_running(false); m_scene_manager.app().window().set_game_running(false);
if (!m_argument.is_client) {
m_server.server_world().stop();
}
} }
Camera& WorldScene::camera() { return m_camera; } Camera& WorldScene::camera() { return m_camera; }
SceneManager& WorldScene::scene_manager() { return m_scene_manager; } SceneManager& WorldScene::scene_manager() { return m_scene_manager; }
ClientWorld& WorldScene::client_world() { return m_client_world; } ClientWorld& WorldScene::client_world() { return m_client_world; }
ServerWorld& WorldScene::server_world() { return m_server.server_world(); }
} // namespace Cubed } // namespace Cubed

View File

@@ -3,7 +3,7 @@
namespace Cubed { namespace Cubed {
Button::Button(Widget* parent) : Widget(parent) {} Button::Button(Widget* parent) : Widget(parent) {}
void Button::update(float dt) { void Button::on_update(float dt) {
if (m_background) { if (m_background) {
m_background->update(dt); m_background->update(dt);
} }
@@ -12,7 +12,7 @@ void Button::update(float dt) {
} }
} }
void Button::render(Renderer& renderer) { void Button::on_render(Renderer& renderer) {
if (m_background) { if (m_background) {
m_background->render(renderer); m_background->render(renderer);
} }
@@ -32,6 +32,10 @@ bool Button::handle_mouse_move_event(const MouseMoveEvent& e) {
} }
m_hovered = false; m_hovered = false;
if (Widget::handle_mouse_move_event(e)) {
return true;
}
return false; return false;
} }
bool Button::handle_mouse_button_event(const MouseButtonEvent& e) { bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
@@ -42,6 +46,11 @@ bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
return true; return true;
} }
} }
if (Widget::handle_mouse_button_event(e)) {
return true;
}
return false; return false;
} }
@@ -51,6 +60,7 @@ Button& Button::set_scale(float scale) {
} }
void Button::set_window_size(int width, int height) { void Button::set_window_size(int width, int height) {
m_background->set_window_size(width, height); m_background->set_window_size(width, height);
Widget::set_window_size(width, height);
} }
Widget& Button::set_anchor(Anchor anchor) { Widget& Button::set_anchor(Anchor anchor) {
m_background->set_anchor(anchor); m_background->set_anchor(anchor);

View File

@@ -5,8 +5,8 @@
namespace Cubed { namespace Cubed {
Image::Image(Widget* parent) : Widget(parent) {} Image::Image(Widget* parent) : Widget(parent) {}
void Image::update(float) {}
void Image::render(Renderer& renderer) { renderer.render_image(*this); } void Image::on_render(Renderer& renderer) { renderer.render_image(*this); }
Image& Image::set_image(const std::string& path, Image& Image::set_image(const std::string& path,
TextureManager& texture_manager) { TextureManager& texture_manager) {

View File

@@ -19,12 +19,9 @@ Label& Label::set_scale(float scale) {
m_scale = scale; m_scale = scale;
return *this; return *this;
} }
void Label::update(float dt) { on_update(dt); }
void Label::on_update(float dt) { (void)dt; } void Label::on_update(float dt) { (void)dt; }
void Label::render(Renderer& renderer) { on_render(renderer); }
void Label::on_render(Renderer& renderer) { renderer.render_lable(*this); } void Label::on_render(Renderer& renderer) { renderer.render_lable(*this); }
void Label::update_vertices() { void Label::update_vertices() {

View File

@@ -8,7 +8,8 @@ Rect::Rect(Widget* parent)
}; };
Rect::~Rect() {} Rect::~Rect() {}
void Rect::update(float dt) {
void Rect::on_update(float) {
if (m_fill) { if (m_fill) {
if (!m_parent) { if (!m_parent) {
m_width = m_window_width; m_width = m_window_width;
@@ -18,12 +19,8 @@ void Rect::update(float dt) {
m_height = m_parent->height(); m_height = m_parent->height();
} }
} }
Widget::update(dt);
}
void Rect::render(Renderer& renderer) {
renderer.render_rect(*this);
Widget::render(renderer);
} }
void Rect::on_render(Renderer& renderer) { renderer.render_rect(*this); }
float Rect::width() const { return m_width * m_scale; } float Rect::width() const { return m_width * m_scale; }
float Rect::height() const { return m_height * m_scale; } float Rect::height() const { return m_height * m_scale; }