Fix T32209 quitting not saving latest data if you are in edit or sculpt mode on
quit.blend. This will use a slower file write if an object is in edit or sculpt mode. Autosaving will explicitly not be supported to keep it fast. Added a tooltip warning.
This commit is contained in:
parent
c2d6de8e20
commit
585d2f31a9
Notes:
blender-bot
2023-02-14 13:22:35 +01:00
Referenced by issue #32209, Autosave ignores multires sculpting (patch attached)
|
@ -46,7 +46,7 @@ struct Mesh;
|
|||
void ED_editors_init(struct bContext *C);
|
||||
void ED_editors_exit(struct bContext *C);
|
||||
|
||||
void ED_editors_flush_edits(const struct bContext *C, bool for_render);
|
||||
bool ED_editors_flush_edits(const struct bContext *C, bool for_render);
|
||||
|
||||
/* ************** Undo ************************ */
|
||||
|
||||
|
|
|
@ -153,19 +153,20 @@ void ED_editors_exit(bContext *C)
|
|||
|
||||
/* flush any temp data from object editing to DNA before writing files,
|
||||
* rendering, copying, etc. */
|
||||
void ED_editors_flush_edits(const bContext *C, bool for_render)
|
||||
bool ED_editors_flush_edits(const bContext *C, bool for_render)
|
||||
{
|
||||
bool has_edited = false;
|
||||
Object *ob;
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
Main *bmain = CTX_data_main(C);
|
||||
/* get editmode results */
|
||||
if (obedit)
|
||||
ED_object_editmode_load(obedit);
|
||||
|
||||
/* loop through all data to find edit mode or object mode, because during
|
||||
* exiting we might not have a context for edit object and multiple sculpt
|
||||
* objects can exist at the same time */
|
||||
for (ob = bmain->object.first; ob; ob = ob->id.next) {
|
||||
if (ob && (ob->mode & OB_MODE_SCULPT)) {
|
||||
if (ob->mode & OB_MODE_SCULPT) {
|
||||
/* flush multires changes (for sculpt) */
|
||||
multires_force_update(ob);
|
||||
has_edited = true;
|
||||
|
||||
if (for_render) {
|
||||
/* flush changes from dynamic topology sculpt */
|
||||
|
@ -177,7 +178,14 @@ void ED_editors_flush_edits(const bContext *C, bool for_render)
|
|||
BKE_sculptsession_bm_to_me(ob, false);
|
||||
}
|
||||
}
|
||||
else if (ob->mode & OB_MODE_EDIT) {
|
||||
/* get editmode results */
|
||||
has_edited = true;
|
||||
ED_object_editmode_load(ob);
|
||||
}
|
||||
}
|
||||
|
||||
return has_edited;
|
||||
}
|
||||
|
||||
/* ***** XXX: functions are using old blender names, cleanup later ***** */
|
||||
|
|
|
@ -4388,7 +4388,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
|
|||
prop = RNA_def_property(srna, "use_auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE);
|
||||
RNA_def_property_ui_text(prop, "Auto Save Temporary Files",
|
||||
"Automatic saving of temporary files in temp directory, uses process ID");
|
||||
"Automatic saving of temporary files in temp directory, uses process ID (Sculpt or edit mode data won't be saved!')");
|
||||
RNA_def_property_update(prop, 0, "rna_userdef_autosave_update");
|
||||
|
||||
prop = RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE);
|
||||
|
|
|
@ -54,6 +54,8 @@
|
|||
#include "BLI_threads.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BLO_writefile.h"
|
||||
|
||||
#include "BKE_blender.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_screen.h"
|
||||
|
@ -409,11 +411,18 @@ void WM_exit_ext(bContext *C, const bool do_python)
|
|||
if ((U.uiflag2 & USER_KEEP_SESSION) || BKE_undo_valid(NULL)) {
|
||||
/* save the undo state as quit.blend */
|
||||
char filename[FILE_MAX];
|
||||
|
||||
bool has_edited;
|
||||
int fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN | G_FILE_HISTORY);
|
||||
|
||||
BLI_make_file_string("/", filename, BLI_temp_dir_base(), BLENDER_QUIT_FILE);
|
||||
|
||||
if (BKE_undo_save_file(filename))
|
||||
printf("Saved session recovery to '%s'\n", filename);
|
||||
has_edited = ED_editors_flush_edits(C, false);
|
||||
|
||||
if ((has_edited && BLO_write_file(CTX_data_main(C), filename, fileflags, NULL, NULL)) ||
|
||||
BKE_undo_save_file(filename))
|
||||
{
|
||||
printf("Saved session recovery to '%s'\n", filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue