[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20261] branches/bmesh/blender/source/ blender: extrude works now, though vert extrude does not.
Joseph Eagar
joeedh at gmail.com
Mon May 18 16:55:34 CEST 2009
Revision: 20261
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20261
Author: joeedh
Date: 2009-05-18 16:55:34 +0200 (Mon, 18 May 2009)
Log Message:
-----------
extrude works now, though vert extrude does not. still plenty of work needed on this code. also did some work on the select infrastructure; the bmesh api now tracks the number of selected verts/edges/faces.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
branches/bmesh/blender/source/blender/bmesh/bmesh.h
branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils_mods.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
branches/bmesh/blender/source/blender/editors/transform/transform_orientations.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h 2009-05-18 14:55:34 UTC (rev 20261)
@@ -49,7 +49,7 @@
ListBase selected;
/*selection mode*/
- int selectmode, totfacesel, totvertsel, totedgesel;
+ int selectmode;
int mat_nr;
} BMEditMesh;
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2009-05-18 14:55:34 UTC (rev 20261)
@@ -102,10 +102,14 @@
BMEditMesh *TM_Copy(BMEditMesh *tm)
{
- BMEditMesh *tm2 = MEM_mallocN(sizeof(BMEditMesh), "tm2");
+ BMEditMesh *tm2 = MEM_callocN(sizeof(BMEditMesh), "tm2");
*tm2 = *tm;
+
+ tm2->derivedCage = tm2->derivedFinal = NULL;
+ tm2->act_face = NULL;
tm2->bm = BM_Copy_Mesh(tm->bm);
+ TM_RecalcTesselation(tm2);
return tm2;
}
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-05-18 14:55:34 UTC (rev 20261)
@@ -39,6 +39,7 @@
#include "DNA_listBase.h"
#include "DNA_customdata_types.h"
+#include "DNA_scene_types.h"
#include "BLI_mempool.h"
#include "BKE_customdata.h"
@@ -153,9 +154,10 @@
struct BMFace **plar;
int vtarlen, edarlen, lparlen, plarlen;
int totvert, totedge, totface, totloop;
+ int totvertsel, totedgesel, totfacesel;
int nextv, nexte, nextp, nextl;
struct CustomData vdata, edata, pdata, ldata;
- int selectmode;
+ int selectmode; /*now uses defines in DNA_scene_types.h*/
struct BLI_mempool *flagpool; /*memory pool for dynamically allocated flag layers*/
int stackdepth; /*current depth of operator stack*/
int totflags, walkers; /*total number of tool flag layers*/
@@ -217,6 +219,8 @@
struct BMVert *BM_Make_Vert(struct BMesh *bm, float co[3], struct BMVert *example);
struct BMEdge *BM_Make_Edge(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge *example, int nodouble);
struct BMFace *BM_Make_Quadtriangle(struct BMesh *bm, struct BMVert **verts, BMEdge **edges, int len, struct BMFace *example, int nodouble);
+/*more easier to use version of BM_Make_Quadtriangle*/
+BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, BMFace *example);
/*makes an ngon from an unordered list of edges. v1 and v2 must be the verts
defining edges[0], and define the winding of the new face.*/
Modified: branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki 2009-05-18 14:55:34 UTC (rev 20261)
@@ -2,7 +2,7 @@
= Introduction =
-BMesh is a non-manifold, locally-modifiable boundary representation. It was designed to replace the current, limited EditMesh structure, solving many of the design limitations and maintainance issues of EditMesh.
+BMesh is a non-manifold boundary representation. It was designed to replace the current, limited EditMesh structure, solving many of the design limitations and maintainance issues of EditMesh.
== The Structure ==
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c 2009-05-18 14:55:34 UTC (rev 20261)
@@ -122,6 +122,25 @@
*
*/
+BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, BMFace *example)
+{
+ BMEdge *edar[4];
+ BMVert *vtar[4];
+
+ edar[0] = v1->edge;
+ edar[1] = v1->edge;
+ edar[2] = v1->edge;
+ if (v4) edar[3] = v1->edge;
+ else edar[3] = NULL;
+
+ vtar[0] = v1;
+ vtar[1] = v2;
+ vtar[2] = v3;
+ vtar[3] = v4;
+
+ return BM_Make_Quadtriangle(bm, vtar, edar, v4?4:3, example, 0);
+}
+
/*remove the edge array bits from this. Its not really needed?*/
BMFace *BM_Make_Quadtriangle(BMesh *bm, BMVert **verts, BMEdge **edges, int len, BMFace *example, int nodouble)
{
@@ -406,6 +425,8 @@
v2 = BM_Make_Vert(bm, v->co, NULL);
BM_Copy_Attributes(bmold, bm, v, v2);
V_GROW(vtable);
+ VECCOPY(v2->no, v->no);
+
vtable[V_COUNT(vtable)-1] = v2;
BMINDEX_SET(v, i);
@@ -415,7 +436,7 @@
e = BMIter_New(&iter, bmold, BM_EDGES_OF_MESH, NULL);
for (i=0; e; e=BMIter_Step(&iter), i++) {
e2 = BM_Make_Edge(bm, vtable[BMINDEX_GET(e->v1)],
- vtable[BMINDEX_GET(e->v1)], e, 0);
+ vtable[BMINDEX_GET(e->v2)], e, 0);
BM_Copy_Attributes(bmold, bm, e, e2);
V_GROW(etable);
@@ -437,8 +458,17 @@
edges[i] = etable[BMINDEX_GET(l->e)];
}
- f2 = BM_Make_Ngon(bm, loops[0]->v, loops[1]->v, edges, f->len, 0);
+ v = vtable[BMINDEX_GET(loops[0]->v)];
+ v2 = vtable[BMINDEX_GET(loops[1]->v)];
+
+ if (!bmesh_verts_in_edge(v, v2, edges[0])) {
+ v = vtable[BMINDEX_GET(loops[V_COUNT(loops)-1]->v)];
+ v2 = vtable[BMINDEX_GET(loops[0]->v)];
+ }
+
+ f2 = BM_Make_Ngon(bm, v, v2, edges, f->len, 0);
BM_Copy_Attributes(bmold, bm, f, f2);
+ VECCOPY(f2->no, f->no);
l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f2);
for (i=0; i<f->len; i++, l = BMIter_Step(&liter)) {
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c 2009-05-18 14:55:34 UTC (rev 20261)
@@ -232,7 +232,7 @@
curvert = v2;
if(bm->vtarlen < len){
- MEM_freeN(bm->vtar);
+ if (bm->vtar) MEM_freeN(bm->vtar);
bm->vtar = MEM_callocN(sizeof(BMVert *)* len, "BM Vert pointer array");
bm->vtarlen = len;
}
@@ -337,6 +337,8 @@
int bmesh_kv(BMesh *bm, BMVert *v){
if(v->edge == NULL){
+ if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel--;
+
BLI_remlink(&(bm->verts), &(v->head));
bmesh_free_vert(bm,v);
return 1;
@@ -370,6 +372,7 @@
if(edok) bmesh_error();
/*remove and deallocate*/
+ if (BM_TestHFlag(e, BM_SELECT)) bm->totedgesel--;
BLI_remlink(&(bm->edges), &(e->head));
bmesh_free_edge(bm, e);
return 1;
@@ -408,6 +411,7 @@
bply->loopbase = newbase;
}
+ if (BM_TestHFlag(bply, BM_SELECT)) bm->totfacesel--;
BLI_remlink(&(bm->polys), &(bply->head));
bmesh_free_poly(bm, bply);
return 1;
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-05-18 14:55:34 UTC (rev 20261)
@@ -32,30 +32,35 @@
BMEdge *e;
BMLoop *l;
BMFace *f;
+ BMHeader *ele;
BMIter edges;
BMIter faces;
-
+ BMIter iter;
+
+ int types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH};
+ int *tots[3];
+ int i;
int totsel;
if(bm->selectmode & BM_VERT){
for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm ); e; e= BMIter_Step(&edges)){
- if(bmesh_test_sysflag(&(e->v1->head), BM_SELECT) && bmesh_test_sysflag(&(e->v2->head), BM_SELECT)) bmesh_set_sysflag(&(e->head), BM_SELECT);
- else bmesh_clear_sysflag(&(e->head), BM_SELECT);
+ if(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT)) BM_SetHFlag(e, 1);
+ else BM_ClearHFlag(e, 0);
}
for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f= BMIter_Step(&faces)){
totsel = 0;
l=f->loopbase;
do{
- if(bmesh_test_sysflag(&(l->v->head), BM_SELECT))
+ if(BM_TestHFlag(l->v, BM_SELECT))
totsel++;
l = ((BMLoop*)(l->head.next));
- }while(l!=f->loopbase);
+ } while(l != f->loopbase);
if(totsel == f->len)
- bmesh_set_sysflag(&(f->head), BM_SELECT);
+ BM_SetHFlag(f, 1);
else
- bmesh_clear_sysflag(&(f->head), BM_SELECT);
+ BM_ClearHFlag(f, 0);
}
}
else if(bm->selectmode & BM_EDGE) {
@@ -69,11 +74,24 @@
}while(l!=f->loopbase);
if(totsel == f->len)
- bmesh_set_sysflag(&(f->head), BM_SELECT);
+ BM_SetHFlag(f, 1);
else
- bmesh_clear_sysflag(&(f->head), BM_SELECT);
+ BM_ClearHFlag(f, 0);
}
- }
+ }
+
+ /*recount tot*sel variables*/
+ bm->totvertsel = bm->totedgesel = bm->totfacesel = 0;
+ tots[0] = &bm->totvertsel;
+ tots[1] = &bm->totedgesel;
+ tots[2] = &bm->totfacesel;
+
+ for (i=0; i<3; i++) {
+ ele = BMIter_New(&iter, bm, types[i], NULL);
+ for ( ; ele; ele=BMIter_Step(&iter)) {
+ if (BM_TestHFlag(ele, BM_SELECT)) *tots[i] += 1;
+ }
+ }
}
/*
@@ -86,10 +104,13 @@
void BM_Select_Vert(BMesh *bm, BMVert *v, int select)
{
- if(select)
- bmesh_set_sysflag(&(v->head), BM_SELECT);
- else
- bmesh_clear_sysflag(&(v->head), BM_SELECT);
+ if(select) {
+ if (!BM_TestHFlag(v, BM_SELECT)) bm->totvertsel += 1;
+ BM_SetHFlag(v, BM_SELECT);
+ } else {
+ if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel -= 1;
+ BM_ClearHFlag(v, BM_SELECT);
+ }
}
/*
@@ -107,15 +128,49 @@
void BM_Select_Edge(BMesh *bm, BMEdge *e, int select)
{
- if(select){
- bmesh_set_sysflag(&(e->head), BM_SELECT);
- bmesh_set_sysflag(&(e->v1->head), BM_SELECT);
- bmesh_set_sysflag(&(e->v2->head), BM_SELECT);
+ int candesel;
+ int testiso = 1;
+
+ /*I might move this logic to bmeshutils_mods.c, where it'd be invoked
+ by the selection tools. in that case, we'd still retain the checks
+ for if an edge's verts can be deselected.*/
+
+ /*ensure vert selections are valid, only if not in a multiselect
+ mode that shares SCE_SELECT_VERT*/
+ if (bm->selectmode & (SCE_SELECT_VERTEX|SCE_SELECT_EDGE)) testiso = 1;
+ else if (bm->selectmode & (SCE_SELECT_VERTEX|SCE_SELECT_FACE)) testiso = 1;
+
+ if (testiso && !select) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list