diff --git a/src/RuntimeModule.h b/src/RuntimeModule.h index 8a8f237..46b3897 100644 --- a/src/RuntimeModule.h +++ b/src/RuntimeModule.h @@ -18,12 +18,12 @@ struct module_api { /** * Called exactly once when the module code is reloaded. */ - void (*reload)(struct module_state *state); + void (*reload)(struct module_state *state, void* read_serializer); /** * Called exactly once when the module code is about to be reloaded. */ - void (*unload)(struct module_state *state); + void (*unload)(struct module_state *state, void* write_serializer); /** * Called at a regular interval by the main program. diff --git a/src/RuntimeModuleManager.cc b/src/RuntimeModuleManager.cc index 842961e..6951f7b 100644 --- a/src/RuntimeModuleManager.cc +++ b/src/RuntimeModuleManager.cc @@ -65,7 +65,7 @@ void RuntimeModuleManager::LoadModule(RuntimeModule* module) { module->state = module->api.init(); } std::cout << "Reloading module " << module->name << std::endl; - module->api.reload(module->state); + module->api.reload(module->state, gReadSerializer); } else { std::cerr << "Error: could not find API for module " << module->name << std::endl; dlclose(module->handle); @@ -123,7 +123,7 @@ void RuntimeModuleManager::UnloadModules() { for (int i = mModules.size() - 1; i >= 0 ; i--) { if (mModules[i]->handle) { - mModules[i]->api.unload(mModules[i]->state); + mModules[i]->api.unload(mModules[i]->state, gWriteSerializer); mModules[i]->state = nullptr; dlclose(mModules[i]->handle); mModules[i]->handle = 0; diff --git a/src/Serializer.h b/src/Serializer.h index 8e68d3c..6f7da30 100644 --- a/src/Serializer.h +++ b/src/Serializer.h @@ -79,7 +79,6 @@ struct ReadSerializer { std::ifstream stream(filename, std::ios::binary); - size_t key_size; size_t block_size; diff --git a/src/modules/RenderModule.cc b/src/modules/RenderModule.cc index 36b1dde..7b26ba4 100644 --- a/src/modules/RenderModule.cc +++ b/src/modules/RenderModule.cc @@ -59,6 +59,21 @@ static struct module_state *module_init() { return state; } +template +static void module_serialize ( + struct module_state *state, + Serializer* serializer) { + // get the state from the serializer + Camera* camera = &gRenderer->cameras[gRenderer->activeCameraIndex]; + assert (camera != nullptr); + + SerializeBool (*serializer, "protot.RenderModule.draw_floor", gRenderer->drawFloor); + SerializeBool (*serializer, "protot.RenderModule.draw_skybox", gRenderer->drawSkybox); + SerializeBool (*serializer, "protot.RenderModule.debug_enabled", gRenderer->drawDebug); + SerializeVec3 (*serializer, "protot.RenderModule.camera.eye", camera->eye); + SerializeVec3 (*serializer, "protot.RenderModule.camera.poi", camera->poi); +} + static void module_finalize(struct module_state *state) { std::cout << "RenderModule finalize called" << std::endl; @@ -68,7 +83,7 @@ static void module_finalize(struct module_state *state) { free(state); } -static void module_reload(struct module_state *state) { +static void module_reload(struct module_state *state, void *read_serializer) { std::cout << "RenderModule reload called" << std::endl; assert (gWindow != nullptr); int width, height; @@ -79,30 +94,23 @@ static void module_reload(struct module_state *state) { state->renderer->initialize(width, height); gRenderer = state->renderer; + // load the state of the module + if (read_serializer != nullptr) { + module_serialize(state, static_cast(read_serializer)); + } + // get the state from the serializer Camera* camera = &gRenderer->cameras[gRenderer->activeCameraIndex]; assert (camera != nullptr); - SerializeBool (*gReadSerializer, "protot.RenderModule.draw_floor", gRenderer->drawFloor); - SerializeBool (*gReadSerializer, "protot.RenderModule.draw_skybox", gRenderer->drawSkybox); - SerializeBool (*gReadSerializer, "protot.RenderModule.debug_enabled", gRenderer->drawDebug); - SerializeVec3 (*gReadSerializer, "protot.RenderModule.camera.eye", camera->eye); - SerializeVec3 (*gReadSerializer, "protot.RenderModule.camera.poi", camera->poi); - camera->updateMatrices(); } -static void module_unload(struct module_state *state) { - Camera* camera = &gRenderer->cameras[gRenderer->activeCameraIndex]; - - //(*gSerializer)["protot"]["RenderModule"]["active_camera"] = (double)gRenderer->activeCameraIndex; - - SerializeBool (*gWriteSerializer, "protot.RenderModule.draw_floor", gRenderer->drawFloor); - SerializeBool (*gWriteSerializer, "protot.RenderModule.draw_skybox", gRenderer->drawSkybox); - SerializeBool (*gWriteSerializer, "protot.RenderModule.debug_enabled", gRenderer->drawDebug); - SerializeVec3 (*gWriteSerializer, "protot.RenderModule.camera.eye", camera->eye); - SerializeVec3 (*gWriteSerializer, "protot.RenderModule.camera.poi", camera->poi); - +static void module_unload(struct module_state *state, void* write_serializer) { + // serialize the state of the module + if (write_serializer != nullptr) { + module_serialize(state, static_cast(write_serializer)); + } gRenderer = nullptr; state->renderer->shutdown(); diff --git a/src/modules/TestModule.cc b/src/modules/TestModule.cc index b577af4..bec4e67 100644 --- a/src/modules/TestModule.cc +++ b/src/modules/TestModule.cc @@ -280,12 +280,22 @@ static struct module_state *module_init() { return state; } +template +static void module_serialize ( + struct module_state *state, + Serializer* serializer) { + SerializeVec3(*serializer, "protot.TestModule.entity.position", state->character->position); + SerializeBool(*serializer, "protot.TestModule.character_window.visible", state->character_properties_window_visible); + SerializeBool(*serializer, "protot.TestModule.modules_window.visible", state->modules_window_visible); + SerializeInt(*serializer, "protot.TestModule.modules_window.selection_index", state->modules_window_selected_index); +} + static void module_finalize(struct module_state *state) { std::cout << "Module finalize called" << std::endl; free(state); } -static void module_reload(struct module_state *state) { +static void module_reload(struct module_state *state, void* read_serializer) { std::cout << "Module reload called. State: " << state << std::endl; // reset mouse scrolling state @@ -323,22 +333,20 @@ static void module_reload(struct module_state *state) { cout << "Creating render entity mesh ... success!" << endl; // load the state of the entity - SerializeVec3(*gReadSerializer, "protot.TestModule.entity.position", state->character->position); - SerializeBool(*gReadSerializer, "protot.TestModule.character_window.visible", state->character_properties_window_visible); - SerializeBool(*gReadSerializer, "protot.TestModule.modules_window.visible", state->modules_window_visible); - SerializeInt(*gReadSerializer, "protot.TestModule.modules_window.selection_index", state->modules_window_selected_index); + if (read_serializer != nullptr) { + module_serialize(state, static_cast(read_serializer)); + } glfwSetScrollCallback (gWindow, mouse_scroll_callback); } -static void module_unload(struct module_state *state) { +static void module_unload(struct module_state *state, void* write_serializer) { glfwSetScrollCallback (gWindow, nullptr); // serialize the state of the entity - SerializeVec3(*gWriteSerializer, "protot.TestModule.entity.position", state->character->position); - SerializeBool(*gWriteSerializer, "protot.TestModule.character_window.visible", state->character_properties_window_visible); - SerializeBool(*gWriteSerializer, "protot.TestModule.modules_window.visible", state->modules_window_visible); - SerializeInt(*gWriteSerializer, "protot.TestModule.modules_window.selection_index", state->modules_window_selected_index); + if (write_serializer != nullptr) { + module_serialize(state, static_cast(write_serializer)); + } // clean up cout << "destroying render entity " << state->character->entity << endl;