feat: add texture hot-reload

This commit is contained in:
2026-04-16 15:33:58 +08:00
parent cf9aaa62a7
commit 7d5b9c34b3
8 changed files with 59 additions and 9 deletions

View File

@@ -29,9 +29,6 @@ private:
Window m_window{m_renderer};
GLuint m_texture_array = 0;
inline static double last_time = glfwGetTime();
inline static double current_time = glfwGetTime();
inline static double delta_time = 0.0f;

View File

@@ -16,9 +16,14 @@ struct MouseState {
bool right = false;
};
struct KeyState {
bool r = false;
};
struct InputState {
MoveState move_state;
MouseState mouse_state;
KeyState key_state;
};
namespace Input {

View File

@@ -6,12 +6,14 @@
class TextureManager {
private:
bool m_need_reload = false;
GLuint m_block_status_array;
GLuint m_texture_array;
GLuint m_ui_array;
void load_block_status(unsigned status_id);
void load_block_texture(unsigned block_id);
void load_ui_texture(unsigned id);
public:
TextureManager();
~TextureManager();
@@ -22,4 +24,8 @@ public:
GLuint get_ui_array() const;
// Must call after MapTable::init_map() and glfwMakeContextCurrent(window);
void init_texture();
void hot_reload();
void need_reload();
void update();
};

View File

@@ -6,12 +6,16 @@ public:
Window(Renderer& renderer);
~Window();
bool is_mouse_enable() const;
const GLFWwindow* get_glfw_window() const;
GLFWwindow* get_glfw_window();
void init();
void update_viewport();
void toggle_fullscreen();
void toggle_mouse_able();
private:
bool m_mouse_enable = false;
float m_aspect;
GLFWwindow* m_window;
int m_width;

View File

@@ -19,7 +19,10 @@ App::~App() {
void App::cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
App* app = static_cast<App*>(glfwGetWindowUserPointer(window));
CUBED_ASSERT_MSG(app, "nullptr");
if (!app->m_window.is_mouse_enable()) {
app->m_camera.update_cursor_position_camera(xpos, ypos);
}
}
void App::init() {
m_window.init();
@@ -45,7 +48,6 @@ void App::init() {
Logger::info("Texture Load Success");
m_world.init_world();
Logger::info("World Init Success");
m_texture_array = m_texture_manager.get_texture_array();
m_camera.camera_init(&m_world.get_player("TestPlayer"));
@@ -54,7 +56,7 @@ void App::init() {
void App::key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
App* app = static_cast<App*>(glfwGetWindowUserPointer(window));
CUBED_ASSERT_MSG(app, "nullptr");
auto& input = Input::get_input_state();
switch(key) {
case GLFW_KEY_Q:
if (action == GLFW_PRESS) {
@@ -78,7 +80,12 @@ void App::key_callback(GLFWwindow* window, int key, int scancode, int action, in
break;
case GLFW_KEY_R:
if (action == GLFW_PRESS) {
app->m_world.need_gen();
app->m_texture_manager.need_reload();
}
break;
case GLFW_KEY_P:
if (action == GLFW_PRESS) {
app->m_window.toggle_mouse_able();
}
break;
@@ -159,6 +166,7 @@ void App::update() {
frame_count = 0;
fps_time_count = 0.0f;
}
m_texture_manager.update();
m_world.update(delta_time);
m_camera.update_move_camera();
const auto& player= m_world.get_player("TestPlayer");

View File

@@ -179,3 +179,19 @@ void TextureManager::init_texture() {
}
void TextureManager::update() {
if (m_need_reload) {
hot_reload();
}
}
void TextureManager::need_reload() {
m_need_reload = true;
}
void TextureManager::hot_reload() {
delet_texture();
init_texture();
m_need_reload = false;
}

View File

@@ -19,6 +19,10 @@ Window::~Window() {
glfwTerminate();
}
bool Window::is_mouse_enable() const {
return m_mouse_enable;
}
const GLFWwindow* Window::get_glfw_window() const {
return m_window;
}
@@ -98,3 +102,13 @@ void Window::toggle_fullscreen() {
}
update_viewport();
}
void Window::toggle_mouse_able() {
if (m_mouse_enable) {
glfwSetInputMode(m_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
m_mouse_enable = false;
} else {
glfwSetInputMode(m_window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
m_mouse_enable = true;
}
}