Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/sculpt_paint/sculpt_undo.c
| Show First 20 Lines • Show All 520 Lines • ▼ Show 20 Lines | if (unode->grid_hidden) { | ||||
| for (i = 0; i < unode->totgrid; i++) { | for (i = 0; i < unode->totgrid; i++) { | ||||
| if (unode->grid_hidden[i]) | if (unode->grid_hidden[i]) | ||||
| MEM_freeN(unode->grid_hidden[i]); | MEM_freeN(unode->grid_hidden[i]); | ||||
| } | } | ||||
| MEM_freeN(unode->grid_hidden); | MEM_freeN(unode->grid_hidden); | ||||
| } | } | ||||
| if (unode->mask) | if (unode->mask) | ||||
| MEM_freeN(unode->mask); | MEM_freeN(unode->mask); | ||||
| if (unode->bm_entry) { | if (unode->bm_entry) { | ||||
| BM_log_entry_drop(unode->bm_entry); | BM_log_entry_drop(unode->bm_entry); | ||||
| } | } | ||||
| if (unode->bm_enter_totvert) | if (unode->bm_enter_totvert) | ||||
| CustomData_free(&unode->bm_enter_vdata, unode->bm_enter_totvert); | CustomData_free(&unode->bm_enter_vdata, unode->bm_enter_totvert); | ||||
| if (unode->bm_enter_totedge) | if (unode->bm_enter_totedge) | ||||
| CustomData_free(&unode->bm_enter_edata, unode->bm_enter_totedge); | CustomData_free(&unode->bm_enter_edata, unode->bm_enter_totedge); | ||||
| if (unode->bm_enter_totloop) | if (unode->bm_enter_totloop) | ||||
| CustomData_free(&unode->bm_enter_ldata, unode->bm_enter_totloop); | CustomData_free(&unode->bm_enter_ldata, unode->bm_enter_totloop); | ||||
| if (unode->bm_enter_totpoly) | if (unode->bm_enter_totpoly) | ||||
| CustomData_free(&unode->bm_enter_pdata, unode->bm_enter_totpoly); | CustomData_free(&unode->bm_enter_pdata, unode->bm_enter_totpoly); | ||||
| } | } | ||||
| } | } | ||||
| static bool sculpt_undo_cleanup(bContext *C, ListBase *lb) { | |||||
| Object *ob = CTX_data_active_object(C); | |||||
| SculptUndoNode *unode; | |||||
| bool cleanup = false; | |||||
| for (unode = lb->first; unode; unode = unode->next) { | |||||
| if (strcmp(unode->idname, ob->id.name) != 0) { | |||||
| cleanup = true; | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (cleanup) { | |||||
| for (unode = lb->first; unode; unode = unode->next) { | |||||
| if (unode->bm_entry) | |||||
| BM_log_cleanup_entry(unode->bm_entry); | |||||
| } | |||||
| } | |||||
| return cleanup; | |||||
| } | |||||
| SculptUndoNode *sculpt_undo_get_node(PBVHNode *node) | SculptUndoNode *sculpt_undo_get_node(PBVHNode *node) | ||||
| { | { | ||||
| ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_MESH); | ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_MESH); | ||||
| if (!lb) { | if (!lb) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 288 Lines • ▼ Show 20 Lines | SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node, | ||||
| else unode->shapeName[0] = '\0'; | else unode->shapeName[0] = '\0'; | ||||
| return unode; | return unode; | ||||
| } | } | ||||
| void sculpt_undo_push_begin(const char *name) | void sculpt_undo_push_begin(const char *name) | ||||
| { | { | ||||
| ED_undo_paint_push_begin(UNDO_PAINT_MESH, name, | ED_undo_paint_push_begin(UNDO_PAINT_MESH, name, | ||||
| sculpt_undo_restore, sculpt_undo_free); | sculpt_undo_restore, sculpt_undo_free, sculpt_undo_cleanup); | ||||
| } | } | ||||
| void sculpt_undo_push_end(void) | void sculpt_undo_push_end(void) | ||||
| { | { | ||||
| ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_MESH); | ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_MESH); | ||||
| SculptUndoNode *unode; | SculptUndoNode *unode; | ||||
| /* we don't need normals in the undo stack */ | /* we don't need normals in the undo stack */ | ||||
| Show All 12 Lines | |||||