void savePrefab(const Path& path) override { auto& selected_entities = m_editor.getSelectedEntities(); if (selected_entities.size() != 1) return; Entity entity = selected_entities[0]; u64 prefab = getPrefab(entity); if (prefab != 0) entity = getPrefabRoot(entity); FS::OsFile file; if (!file.open(path.c_str(), FS::Mode::CREATE_AND_WRITE)) { g_log_error.log("Editor") << "Failed to create " << path.c_str(); return; } Array<Entity> entities(m_editor.getAllocator()); gatherHierarchy(entity, true, entities); OutputBlob blob(m_editor.getAllocator()); SaveEntityGUIDMap entity_map(entities); TextSerializer serializer(blob, entity_map); serializePrefab(m_universe, entities[0], path, serializer); file.write(blob.getData(), blob.getPos()); file.close(); if (prefab == 0) { m_editor.beginCommandGroup(crc32("save_prefab")); Transform tr = m_universe->getTransform(entity); m_editor.destroyEntities(&entities[0], entities.size()); auto* resource_manager = m_editor.getEngine().getResourceManager().get(PrefabResource::TYPE); auto* res = (PrefabResource*)resource_manager->load(path); FS::FileSystem& fs = m_editor.getEngine().getFileSystem(); while (fs.hasWork()) fs.updateAsyncTransactions(); instantiatePrefab(*res, tr.pos, tr.rot, tr.scale); m_editor.endCommandGroup(); } }
bool Settings::save() { auto& actions = m_app.getActions(); FS::OsFile file; if (!file.open(SETTINGS_PATH, FS::Mode::CREATE_AND_WRITE)) return false; file << "window = { x = " << m_window.x << ", y = " << m_window.y << ", w = " << m_window.w << ", h = " << m_window.h << " }\n"; file << "maximized = " << (m_is_maximized ? "true" : "false") << "\n"; auto writeBool = [&file](const char* name, bool value) { file << name << " = " << (value ? "true\n" : "false\n"); }; writeBool("settings_opened", m_is_open); writeBool("asset_browser_opened", m_is_asset_browser_open); writeBool("entity_list_opened", m_is_entity_list_open); writeBool("entity_template_list_opened", m_is_entity_template_list_open); writeBool("log_opened", m_is_log_open); writeBool("profiler_opened", m_is_profiler_open); writeBool("properties_opened", m_is_properties_open); writeBool("error_reporting_enabled", m_is_crash_reporting_enabled); file << "mouse_sensitivity_x = " << m_mouse_sensitivity.x << "\n"; file << "mouse_sensitivity_y = " << m_mouse_sensitivity.y << "\n"; file << "font_size = " << m_font_size << "\n"; file << "asset_browser_left_column_width = " << m_asset_browser_left_column_width << "\n"; saveStyle(file); file << "data_dir = \""; const char* c = m_data_dir; while (*c) { if (*c == '\\') file << "\\\\"; else file << *c; ++c; } file << "\"\n"; file << "custom = {\n"; lua_getglobal(m_state, "custom"); lua_pushnil(m_state); bool first = true; while (lua_next(m_state, -2)) { if (!first) file << ",\n"; const char* name = lua_tostring(m_state, -2); switch (lua_type(m_state, -1)) { case LUA_TBOOLEAN: file << name << " = " << (lua_toboolean(m_state, -1) != 0 ? "true" : "false"); break; case LUA_TNUMBER: file << name << " = " << (int)lua_tonumber(m_state, -1); break; default: ASSERT(false); break; } lua_pop(m_state, 1); first = false; } lua_pop(m_state, 1); file << "}\n"; file << "actions = {\n"; for (int i = 0; i < actions.size(); ++i) { file << "\t" << actions[i]->name << " = {" << actions[i]->shortcut[0] << ", " << actions[i]->shortcut[1] << ", " << actions[i]->shortcut[2] << "},\n"; } file << "}\n"; file << "toolbar = {\n"; for (auto* action : m_app.getToolbarActions()) { file << "\t\"" << action->name << "\",\n"; } file << "}\n"; ImGui::SaveDock(file); file.close(); return true; }
void Engine::destroy(Engine* engine, IAllocator& allocator) { LUMIX_DELETE(allocator, engine); g_error_file.close(); }