diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-05-19 04:33:54 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-05-19 04:33:54 +0400 |
commit | b7fe3258b66698f62f630d0b18431b54b65101ed (patch) | |
tree | 74b32c07db8ce268a4792fd0d0977004477a6ff3 | |
parent | a8c0b748c965c90f81ee7ef77bbeb4d5809ce004 (diff) |
some stability stuff related to undo, and more extrude stuff works
-rw-r--r-- | intern/guardedalloc/MEM_guardedalloc.h | 44 | ||||
-rw-r--r-- | intern/guardedalloc/Makefile | 15 | ||||
-rw-r--r-- | intern/guardedalloc/SConscript | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editderivedbmesh.c | 7 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 11 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_operators_private.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/extrudeops.c | 22 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_tools.c | 55 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmeshutils.c | 17 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 43 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_intern.h | 7 |
11 files changed, 167 insertions, 57 deletions
diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h index 1d4c753802b..6cead013895 100644 --- a/intern/guardedalloc/MEM_guardedalloc.h +++ b/intern/guardedalloc/MEM_guardedalloc.h @@ -74,7 +74,11 @@ extern "C" { * Release memory previously allocatred by this module. */ short MEM_freeN(void *vmemh); - + short WMEM_freeN(void *vmemh); + + short _MEM_freeN(void *vmemh, char *file, int line); + #define MEM_freeN(vmemh) _MEM_freeN(vmemh, __FILE__, __LINE__) + /** * Duplicates a block of memory, and returns a pointer to the * newly allocated block. */ @@ -130,6 +134,44 @@ extern "C" { uintptr_t MEM_get_mapped_memory_in_use(void); int MEM_get_memory_blocks_in_use(void); +/********* Internal structs. They're only here for the MEM_OVERHEAD macro.*********/ + +/* --------------------------------------------------------------------- */ +/* Data definition */ +/* --------------------------------------------------------------------- */ +/* all memory chunks are put in linked lists */ +typedef struct localLink +{ + struct localLink *next,*prev; +} localLink; + +typedef struct localListBase +{ + void *first, *last; +} localListBase; + + /* note: keep this struct aligned (e.g., irix/gcc) - Hos */ +typedef struct MemHead { + int tag1; + int len; + struct MemHead *next,*prev; + const char * name; + const char * nextname; + int tag2; + int mmap; /* if true, memory was mmapped */ +} MemHead; + +typedef struct MemTail { + int tag3, pad; +} MemTail; + +/*memory bias to hopefully account + for allocation overhead from + the system allocator.*/ +#define MEM_OVERHEADBIAS 32 + +#define MEM_OVERHEAD (sizeof(MemHead) + sizeof(MemTail) + MEM_OVERHEADBIAS) + #ifdef __cplusplus } #endif diff --git a/intern/guardedalloc/Makefile b/intern/guardedalloc/Makefile index 55894d54c8e..f0cef3d222c 100644 --- a/intern/guardedalloc/Makefile +++ b/intern/guardedalloc/Makefile @@ -1,5 +1,3 @@ -# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*- -# vim: tabstop=8 # # $Id$ # @@ -24,7 +22,7 @@ # # The Original Code is: all of this file. # -# Contributor(s): Hans Lambermont, GSR +# Contributor(s): Hans Lambermont # # ***** END GPL LICENSE BLOCK ***** # decimation main makefile. @@ -40,13 +38,16 @@ TESTDIRS = test include nan_subdirs.mk -install: $(ALL_OR_DEBUG) +install: all debug @[ -d $(NAN_GUARDEDALLOC) ] || mkdir $(NAN_GUARDEDALLOC) @[ -d $(NAN_GUARDEDALLOC)/include ] || mkdir $(NAN_GUARDEDALLOC)/include - @[ -d $(NAN_GUARDEDALLOC)/lib/$(DEBUG_DIR) ] || mkdir $(NAN_GUARDEDALLOC)/lib/$(DEBUG_DIR) - @../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)libguardedalloc.a $(NAN_GUARDEDALLOC)/lib/$(DEBUG_DIR) + @[ -d $(NAN_GUARDEDALLOC)/lib ] || mkdir $(NAN_GUARDEDALLOC)/lib + @[ -d $(NAN_GUARDEDALLOC)/lib/debug ] || mkdir $(NAN_GUARDEDALLOC)/lib/debug + @../tools/cpifdiff.sh $(DIR)/libguardedalloc.a $(NAN_GUARDEDALLOC)/lib/ + @../tools/cpifdiff.sh $(DIR)/debug/libguardedalloc.a $(NAN_GUARDEDALLOC)/lib/debug/ ifeq ($(OS),darwin) - ranlib $(NAN_GUARDEDALLOC)/lib/$(DEBUG_DIR)libguardedalloc.a + ranlib $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a + ranlib $(NAN_GUARDEDALLOC)/lib/debug/libguardedalloc.a endif @../tools/cpifdiff.sh *.h $(NAN_GUARDEDALLOC)/include/ diff --git a/intern/guardedalloc/SConscript b/intern/guardedalloc/SConscript index 0184ddd9785..ef6c6b49266 100644 --- a/intern/guardedalloc/SConscript +++ b/intern/guardedalloc/SConscript @@ -5,4 +5,4 @@ Import('env') sources = env.Glob('intern/*.c') incs = '.' -env.BlenderLib ('bf_guardedalloc', sources, Split(incs), defines=[], libtype=['intern', 'player'], priority = [5, 175] ) +env.BlenderLib ('bf_guardedalloc', sources, Split(incs), defines=[], libtype=['intern', 'player'], priority = [10, 175] ) diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c index 3bb8ec0907a..c51375b3417 100644 --- a/source/blender/blenkernel/intern/editderivedbmesh.c +++ b/source/blender/blenkernel/intern/editderivedbmesh.c @@ -107,10 +107,13 @@ BMEditMesh *TM_Copy(BMEditMesh *tm) tm2->derivedCage = tm2->derivedFinal = NULL; tm2->act_face = NULL; - + + tm2->looptris = NULL; tm2->bm = BM_Copy_Mesh(tm->bm); TM_RecalcTesselation(tm2); + tm2->vert_index = tm2->edge_index = tm2->face_index = NULL; + return tm2; } @@ -123,6 +126,8 @@ void TM_RecalcTesselation(BMEditMesh *tm) BMFace *f; BMLoop *l; int i = 0; + + if (tm->looptris) MEM_freeN(tm->looptris); f = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL); for ( ; f; f=BMIter_Step(&iter)) { diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 6ea2f5fc218..315eb0410a8 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -3,6 +3,16 @@ #include <stdio.h> +BMOpDefine def_extrudeverts_indiv = { + "extrude_vert_indiv", + {{BMOP_OPSLOT_ELEMENT_BUF, "verts"}, + {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"}, + {BMOP_OPSLOT_ELEMENT_BUF, "vertout"}, + {0} /*null-terminating sentinel*/}, + extrude_vert_indiv_exec, + 0 +}; + #if 0 BMOpDefine def_makeprim = { "makeprim", @@ -156,6 +166,7 @@ BMOpDefine *opdefines[] = { &def_extrudefaceregion, &def_connectverts, //&def_makeprim, + &def_extrudeverts_indiv, }; int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*)); diff --git a/source/blender/bmesh/intern/bmesh_operators_private.h b/source/blender/bmesh/intern/bmesh_operators_private.h index 41319d0ee4d..7cc81522d6d 100644 --- a/source/blender/bmesh/intern/bmesh_operators_private.h +++ b/source/blender/bmesh/intern/bmesh_operators_private.h @@ -20,5 +20,6 @@ void bmesh_make_fgons_exec(BMesh *bmesh, BMOperator *op); void extrude_edge_context_exec(BMesh *bm, BMOperator *op); void connectverts_exec(BMesh *bm, BMOperator *op); void makeprim_exec(BMesh *bm, BMOperator *op); +void extrude_vert_indiv_exec(BMesh *bm, BMOperator *op); #endif diff --git a/source/blender/bmesh/operators/extrudeops.c b/source/blender/bmesh/operators/extrudeops.c index a98793826d8..8858447bc82 100644 --- a/source/blender/bmesh/operators/extrudeops.c +++ b/source/blender/bmesh/operators/extrudeops.c @@ -14,6 +14,28 @@ #define EXT_KEEP 2 #define EXT_DEL 4 +void extrude_vert_indiv_exec(BMesh *bm, BMOperator *op) +{ + BMOIter siter; + BMVert *v, *dupev; + BMEdge *e; + + v = BMO_IterNew(&siter, bm, op, "verts"); + for (; v; v=BMO_IterStep(&siter)) { + dupev = BM_Make_Vert(bm, v->co, NULL); + VECCOPY(dupev->no, v->no); + BM_Copy_Attributes(bm, bm, v, dupev); + + e = BM_Make_Edge(bm, v, dupev, NULL, 0); + + BMO_SetFlag(bm, e, EXT_KEEP); + BMO_SetFlag(bm, dupev, EXT_KEEP); + } + + BMO_Flag_To_Slot(bm, op, "vertout", EXT_KEEP, BM_VERT); + BMO_Flag_To_Slot(bm, op, "edgeout", EXT_KEEP, BM_EDGE); +} + void extrude_edge_context_exec(BMesh *bm, BMOperator *op) { BMOperator dupeop, delop; diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index 0e2a8dadb3b..ec655862c28 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -441,28 +441,33 @@ short EDBM_Extrude_edges_indiv(BMEditMesh *em, short flag, float *nor) } /* extrudes individual vertices */ -short EDBM_Extrude_verts_indiv(BMEditMesh *em, short flag, float *nor) +short EDBM_Extrude_verts_indiv(BMEditMesh *em, wmOperator *op, short flag, float *nor) { -#if 0 - EditVert *eve; - - /* make the edges */ - for(eve= em->verts.first; eve; eve= eve->next) { - if(eve->f & flag) { - eve->tmp.v = addvertlist(em, eve->co, eve); - addedgelist(em, eve, eve->tmp.v, NULL); + BMIter iter; + BMVert *v, **verts = NULL; + V_DECLARE(verts); + int i=0; + + /*kindof hackish way of deselecting the original vertices, but + oh well.*/ + v = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL); + for ( ; v; v=BMIter_Step(&iter)) { + if (BM_TestHFlag(v, BM_SELECT)) { + V_GROW(verts); + verts[i++] = v; } - else eve->tmp.v = NULL; } + + EDBM_CallOpf(em, op, "extrude_vert_indiv verts=%hv", flag); - /* set correct selection */ - EM_clear_flag_all(em, SELECT); + i--; + while (i >= 0) { + BM_Select(em->bm, verts[i], 0); + i--; + } - for(eve= em->verts.last; eve; eve= eve->prev) - if (eve->tmp.v) - eve->tmp.v->f |= flag; + V_FREE(verts); -#endif return 'g'; // g is grab } @@ -600,11 +605,19 @@ short EDBM_Extrude(Object *obedit, BMEditMesh *em, short flag, float *nor) eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); for ( ; eed; eed=BMIter_Step(&iter)) { if (BM_TestHFlag(eed, flag)) { - BM_SetHFlag(eed->v1, flag); - BM_SetHFlag(eed->v2, flag); + if (flag != BM_SELECT) { + BM_SetHFlag(eed->v1, flag); + BM_SetHFlag(eed->v2, flag); + } else { + BM_Select(em->bm, eed->v1, 1); + BM_Select(em->bm, eed->v2, 1); + } } else { - if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) - BM_SetHFlag(eed, flag); + if (BM_TestHFlag(eed->v1, flag) && BM_TestHFlag(eed->v2, flag)) { + if (flag != BM_SELECT) + BM_SetHFlag(eed, flag); + else BM_Select(em->bm, eed, 1); + } } } @@ -719,7 +732,7 @@ void EDBM_Extrude_Mesh(Object *obedit, BMEditMesh *em, wmOperator *op) if(nr<1) return; if(nr==1) transmode= EDBM_Extrude(obedit, em, SELECT, nor); - else if(nr==4) transmode= EDBM_Extrude_verts_indiv(em, SELECT, nor); + else if(nr==4) transmode= EDBM_Extrude_verts_indiv(em, op, SELECT, nor); else if(nr==3) transmode= EDBM_Extrude_edges_indiv(em, SELECT, nor); else transmode= EDBM_Extrude_face_indiv(em, SELECT, nor); diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c index 6171967879e..2d15644cbde 100644 --- a/source/blender/editors/mesh/bmeshutils.c +++ b/source/blender/editors/mesh/bmeshutils.c @@ -146,9 +146,9 @@ void EDBM_Tesselate(EditMesh *em) } } -int EDBM_CallOpf(EditMesh *em, wmOperator *op, char *fmt, ...) +int EDBM_CallOpf(BMEditMesh *em, wmOperator *op, char *fmt, ...) { - BMesh *bm = editmesh_to_bmesh(em); + BMesh *bm = em->bm; BMOperator bmop; va_list list; @@ -169,9 +169,9 @@ int EDBM_CallOpf(EditMesh *em, wmOperator *op, char *fmt, ...) return EDBM_Finish(bm, em, op, 1); } -int EDBM_CallOpfSilent(EditMesh *em, char *fmt, ...) +int EDBM_CallOpfSilent(BMEditMesh *em, char *fmt, ...) { - BMesh *bm = editmesh_to_bmesh(em); + BMesh *bm = em->bm; BMOperator bmop; va_list list; @@ -192,20 +192,15 @@ int EDBM_CallOpfSilent(EditMesh *em, char *fmt, ...) /*returns 0 on error, 1 on success*/ int EDBM_Finish(BMesh *bm, EditMesh *em, wmOperator *op, int report) { - EditMesh *em2; char *errmsg; if (BMO_GetError(bm, &errmsg, NULL)) { if (report) BKE_report(op->reports, RPT_ERROR, errmsg); - BM_Free_Mesh(bm); + /*BMESH_TODOwe should really undo here or something, back + out of the failed op :/*/ return 0; } - em2 = bmesh_to_editmesh(bm); - set_editMesh(em, em2); - MEM_freeN(em2); - BM_Free_Mesh(bm); - return 1; } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 267145a6a78..139fa29ddf9 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -1002,31 +1002,44 @@ static void erase_vertices(EditMesh *em, ListBase *l) } } -static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event) +static int delete_mesh(Object *obedit, wmOperator *op, int event) { + BMEditMesh *bem = ((Mesh*)obedit->data)->edit_btmesh; + EditMesh *em = NULL; EditFace *efa, *nextvl; EditVert *eve,*nextve; EditEdge *eed,*nexted; int count; char *str="Erase"; - + if(event<1) return; + if (event != 7 && event != 5) + em= EM_GetEditMesh((Mesh *)obedit->data); + if(event==10 ) { str= "Erase Vertices"; erase_edges(em, &em->edges); erase_faces(em, &em->faces); erase_vertices(em, &em->verts); + + EM_fgon_flags(em); // redo flags and indices for fgons + EM_EndEditMesh(obedit->data, em); } else if(event==7) { - if (!EDBM_CallOpf(em, op, "dissolveverts verts=%hv",BM_SELECT)) + if (!EDBM_CallOpf(bem, op, "dissolveverts verts=%hv",BM_SELECT)) return OPERATOR_CANCELLED; } else if(event==6) { - if(!EdgeLoopDelete(em, op)) + if(!EdgeLoopDelete(em, op)) { + EM_EndEditMesh(obedit->data, em); return; + } str= "Erase Edge Loop"; + + EM_fgon_flags(em); // redo flags and indices for fgons + EM_EndEditMesh(obedit->data, em); } else if(event==4) { str= "Erase Edges & Faces"; @@ -1068,7 +1081,10 @@ static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event) free_editface(em, efa); } efa= nextvl; + } + EM_fgon_flags(em); // redo flags and indices for fgons + EM_EndEditMesh(obedit->data, em); } else if(event==1) { str= "Erase Edges"; @@ -1114,10 +1130,15 @@ static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event) eve= nextve; } + EM_fgon_flags(em); // redo flags and indices for fgons + EM_EndEditMesh(obedit->data, em); } else if(event==2) { str="Erase Faces"; delfaceflag(em, SELECT); + + EM_fgon_flags(em); // redo flags and indices for fgons + EM_EndEditMesh(obedit->data, em); } else if(event==3) { str= "Erase All"; @@ -1125,16 +1146,17 @@ static int delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event) if(em->edges.first) free_edgelist(em, &em->edges); if(em->faces.first) free_facelist(em, &em->faces); if(em->selected.first) BLI_freelistN(&(em->selected)); + + EM_fgon_flags(em); // redo flags and indices for fgons + EM_EndEditMesh(obedit->data, em); } else if(event==5) { - if (!EDBM_CallOpf(em, op, "del geom=%hf context=%d", + if (!EDBM_CallOpf(bem, op, "del geom=%hf context=%d", BM_SELECT, DEL_ONLYFACES)) return OPERATOR_CANCELLED; str= "Erase Only Faces"; } - EM_fgon_flags(em); // redo flags and indices for fgons - // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); } @@ -1154,13 +1176,11 @@ static EnumPropertyItem prop_mesh_delete_types[] = { static int delete_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); - delete_mesh(obedit, em, op, RNA_enum_get(op->ptr, "type")); + delete_mesh(obedit, op, RNA_enum_get(op->ptr, "type")); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - EM_EndEditMesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6666,7 +6686,7 @@ void MESH_OT_beauty_fill(wmOperatorType *ot) static int convert_quads_to_tris_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - EditMesh *em= EM_GetEditMesh((Mesh *)obedit->data); + BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; //convert_to_triface(em,0); if (!EDBM_CallOpf(em, op, "triangulate faces=%hf", BM_SELECT)) @@ -6674,7 +6694,6 @@ static int convert_quads_to_tris_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - EM_EndEditMesh(obedit->data, em); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index 8b034458229..4f58ee5fea0 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -50,15 +50,16 @@ struct BMFace; /* ******************** bmeshutils.c */ /*calls a bmesh op, reporting errors to the user, doing conversions, etc.*/ -int EDBM_CallOpf(EditMesh *em, struct wmOperator *op, char *fmt, ...); +int EDBM_CallOpf(struct BMEditMesh *em, struct wmOperator *op, char *fmt, ...); + /*same as above, but doesn't report errors.*/ -int EDBM_CallOpfSilent(EditMesh *em, char *fmt, ...); +int EDBM_CallOpfSilent(struct BMEditMesh *em, char *fmt, ...); /*called after bmesh tool exec. checks for errors and does conversions. if any errors are raised by bmesh, it displays the error to the user and returns 0 (and does not convert). otherwise, it converts the bmesh back into the editmesh, and returns 1.*/ -int EDBM_Finish(struct BMesh *bm, struct EditMesh *em, +int EDBM_Finish(struct BMesh *bm, struct BMEditMesh *em, struct wmOperator *op, int report); void EDBM_clear_flag_all(struct BMEditMesh *em, int flag); |