Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/guardedalloc/MEM_guardedalloc.h44
-rw-r--r--intern/guardedalloc/Makefile15
-rw-r--r--intern/guardedalloc/SConscript2
-rw-r--r--source/blender/blenkernel/intern/editderivedbmesh.c7
-rw-r--r--source/blender/bmesh/intern/bmesh_opdefines.c11
-rw-r--r--source/blender/bmesh/intern/bmesh_operators_private.h1
-rw-r--r--source/blender/bmesh/operators/extrudeops.c22
-rw-r--r--source/blender/editors/mesh/bmesh_tools.c55
-rw-r--r--source/blender/editors/mesh/bmeshutils.c17
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c43
-rw-r--r--source/blender/editors/mesh/mesh_intern.h7
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);