mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-06-17 16:17:02 +08:00
feat: add texture hot-reload
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -6,20 +6,26 @@
|
||||
|
||||
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();
|
||||
|
||||
|
||||
void delet_texture();
|
||||
GLuint get_block_status_array() const;
|
||||
GLuint get_texture_array() const;
|
||||
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();
|
||||
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
16
src/app.cpp
16
src/app.cpp
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user