Simplified module state serialization: uses now a templated function for both reading and writing
parent
84efe9b9aa
commit
546fe64c6f
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -79,7 +79,6 @@ struct ReadSerializer {
|
|||
|
||||
std::ifstream stream(filename, std::ios::binary);
|
||||
|
||||
|
||||
size_t key_size;
|
||||
size_t block_size;
|
||||
|
||||
|
|
|
@ -59,6 +59,21 @@ static struct module_state *module_init() {
|
|||
return state;
|
||||
}
|
||||
|
||||
template <typename Serializer>
|
||||
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<ReadSerializer*>(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<WriteSerializer*>(write_serializer));
|
||||
}
|
||||
|
||||
gRenderer = nullptr;
|
||||
state->renderer->shutdown();
|
||||
|
|
|
@ -280,12 +280,22 @@ static struct module_state *module_init() {
|
|||
return state;
|
||||
}
|
||||
|
||||
template <typename Serializer>
|
||||
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<ReadSerializer*>(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<WriteSerializer*>(write_serializer));
|
||||
}
|
||||
|
||||
// clean up
|
||||
cout << "destroying render entity " << state->character->entity << endl;
|
||||
|
|
Loading…
Reference in New Issue