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

@@ -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");
app->m_camera.update_cursor_position_camera(xpos, ypos);
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

@@ -31,7 +31,7 @@ void MapTable::init_map() {
for (int i = 0; i < MAX_BLOCK_NUM; i++) {
id_to_name_map[i] = BLOCK_REISTER[i];
name_to_id_map[HASH::str(BLOCK_REISTER[i])] = i;
name_to_id_map[HASH::str(BLOCK_REISTER[i])] = i;
}
}

View File

@@ -178,4 +178,20 @@ void TextureManager::init_texture() {
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
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;
}
@@ -97,4 +101,14 @@ 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;
}
}