[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22832] branches/bmesh/blender/source/ blender: Shift-G (select similar) is now bmeshafied for edge select mode.

Joseph Eagar joeedh at gmail.com
Fri Aug 28 11:36:32 CEST 2009


Revision: 22832
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22832
Author:   joeedh
Date:     2009-08-28 11:36:31 +0200 (Fri, 28 Aug 2009)

Log Message:
-----------
Shift-G (select similar) is now bmeshafied for edge select mode.
The patch was by Wael El Oraiby.  Commit of patch #19257.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
    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/operators/utils.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-08-28 09:36:31 UTC (rev 22832)
@@ -107,7 +107,8 @@
 #define SUB_ELEMS_FACE 50
 
 /*
-note: all mface interfaces now officially operate on tesselated data.
+Note: all mface interfaces now officially operate on tesselated data.
+      Also, the mface origindex layer indexes mpolys, not mfaces.
 */
 
 /*DM Iterators.  For now, first implement face iterators.

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-08-28 09:36:31 UTC (rev 22832)
@@ -46,6 +46,8 @@
 #include "BKE_utildefines.h"
 #include "BKE_tessmesh.h"
 
+#include "BLI_editVert.h"
+#include "BLI_scanfill.h"
 #include "BLI_arithb.h"
 #include "BLI_blenlib.h"
 #include "BLI_edgehash.h"
@@ -482,7 +484,7 @@
 	}
 }
 
-static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
+static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, int has_vcol, int matnr))
 {
 	cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
 }
@@ -781,9 +783,6 @@
 	MVert *mv = cddm->mvert;
 	MPoly *mf = cddm->mpoly;
 	MLoop *ml = cddm->mloop;
-	float (*cents)[3];
-	float (*nors)[3];
-	int *flens;
 	int i, j, orig, *index;
 	int maxf=0;
 
@@ -820,6 +819,132 @@
 
 }
 
+void cddm_loops_to_corners(CustomData *fdata, CustomData *ldata, 
+			   CustomData *pdata, int lindex[3], int findex, 
+			   int polyindex, int numTex, int numCol) 
+{
+	MTFace *texface;
+	MTexPoly *texpoly;
+	MCol *mcol;
+	MLoopCol *mloopcol;
+	MLoopUV *mloopuv;
+	int i, j;
+
+	for(i=0; i < numTex; i++){
+		texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
+		texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
+		
+		texface->tpage = texpoly->tpage;
+		texface->flag = texpoly->flag;
+		texface->transp = texpoly->transp;
+		texface->mode = texpoly->mode;
+		texface->tile = texpoly->tile;
+		texface->unwrap = texpoly->unwrap;
+
+		for (j=0; j<3; j++) {
+			mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, lindex[j], i);
+			texface->uv[j][0] = mloopuv->uv[0];
+			texface->uv[j][1] = mloopuv->uv[1];
+		}
+	}
+
+	for(i=0; i < numCol; i++){
+		mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
+
+		for (j=0; j<3; j++) {
+			mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, lindex[j], i);
+			mcol[j].r = mloopcol->r;
+			mcol[j].g = mloopcol->g;
+			mcol[j].b = mloopcol->b;
+			mcol[j].a = mloopcol->a;
+		}
+	}
+}
+
+static void cdDM_recalcTesselation(DerivedMesh *dm)
+{
+	CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+	MPoly *mp;
+	MLoop *ml;
+	MFace *mf = NULL;
+	V_DECLARE(mf);
+	EditVert *v, *lastv, *firstv;
+	EditFace *f;
+	V_DECLARE(origIndex);
+	int i, j, k, lindex[3], *origIndex = NULL, *polyorigIndex;
+	int numTex, numCol;
+
+	numTex = CustomData_number_of_layers(&dm->loopData, CD_MLOOPUV);
+	numCol = CustomData_number_of_layers(&dm->loopData, CD_MLOOPCOL);
+	
+	k = 0;
+	mp = cddm->mpoly;
+	polyorigIndex = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
+	for (i=0; i<dm->numPolyData; i++, mp++) {
+		ml = cddm->mloop + mp->loopstart;
+		firstv = NULL;
+		lastv = NULL;
+		for (j=0; j<mp->totloop; j++, ml++) {
+			v = BLI_addfillvert(cddm->mvert[ml->v].co);
+			if (polyorigIndex)
+				v->f1 = polyorigIndex[i];
+			else
+				v->f1 = i;
+
+			v->f2 = mp->loopstart + j;
+
+			if (lastv)
+				BLI_addfilledge(lastv, v);
+
+			if (!firstv)
+				firstv = v;
+			lastv = v;
+		}
+		BLI_addfilledge(firstv, v);
+		
+		BLI_edgefill(0, 0);
+		for (f=fillfacebase.first; f; f=f->next) {
+			V_GROW(mf);
+			V_GROW(origIndex);
+
+			/*these are loop indices, they'll be transformed
+			  into vert indices later.*/
+			mf[k].v1 = f->v1->f2;
+			mf[k].v2 = f->v2->f2;
+			mf[k].v3 = f->v3->f2;
+			origIndex[k] = f->v1->f1;
+
+			k++;
+		}
+
+		BLI_end_edgefill();
+	}
+
+	memset(&dm->faceData, 0, sizeof(CustomData));
+	dm->numFaceData = k;
+	
+	CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, mf, dm->numFaceData);
+	CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_ASSIGN, origIndex, dm->numFaceData);
+	CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, &dm->loopData, dm->numFaceData);
+
+	/*set convienence pointer*/
+	cddm->mface = mf;
+
+	for (i=0; i<dm->numFaceData; i++, mf++) {
+		lindex[0] = mf->v1;
+		lindex[1] = mf->v2;
+		lindex[2] = mf->v3;
+
+		/*transform loop indices to vert indices*/
+		mf->v1 = cddm->mloop[mf->v1].v;
+		mf->v2 = cddm->mloop[mf->v2].v;
+		mf->v3 = cddm->mloop[mf->v3].v;
+
+		cddm_loops_to_corners(&dm->faceData, &dm->loopData, &dm->polyData,
+			lindex, i, origIndex[i], numTex, numCol);
+	}
+}
+
 static void cdDM_release(DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
@@ -858,6 +983,9 @@
 	dm->getVertDataArray = DM_get_vert_data_layer;
 	dm->getEdgeDataArray = DM_get_edge_data_layer;
 	dm->getTessFaceDataArray = DM_get_tessface_data_layer;
+	
+	//doesn't work yet for all cases
+	//dm->recalcTesselation = cdDM_recalcTesselation;
 
 	dm->getVertCos = cdDM_getVertCos;
 	dm->getVertCo = cdDM_getVertCo;
@@ -929,7 +1057,6 @@
 
 	CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totvert);
 	CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totedge);
-	CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totface);
 	CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totpoly);
 
 	dm->deformedOnly = 1;
@@ -940,8 +1067,6 @@
 	                 mesh->totvert);
 	CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype,
 	                 mesh->totedge);
-	CustomData_merge(&mesh->fdata, &dm->faceData, mask, alloctype,
-	                 mesh->totface);
 	CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype,
 	                 mesh->totloop);
 	CustomData_merge(&mesh->pdata, &dm->polyData, mask, alloctype,
@@ -949,7 +1074,6 @@
 
 	cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
 	cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
-	cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 	cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
 	cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
 
@@ -961,14 +1085,14 @@
 	for(i = 0; i < mesh->totedge; ++i, ++index)
 		*index = i;
 
-	index = CustomData_get_layer(&dm->faceData, CD_ORIGINDEX);
-	for(i = 0; i < mesh->totface; ++i, ++index)
-		*index = i;
-
 	index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
 	for(i = 0; i < mesh->totpoly; ++i, ++index)
 		*index = i;
 
+	/*recalculates mfaces and sets the mface origindex layer
+	  to index mypolys.*/
+	cdDM_recalcTesselation((DerivedMesh*)cddm);
+
 	return dm;
 }
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2009-08-28 09:36:31 UTC (rev 22832)
@@ -55,6 +55,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
+
 #include "BLI_arithb.h"
 #include "BLI_linklist.h"
 #include "BLI_memarena.h"

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2009-08-28 09:36:31 UTC (rev 22832)
@@ -22,6 +22,7 @@
 	SUBD_STRAIGHT_CUT,
 };
 
+/* similar face selection slot values */
 enum {
 	SIMFACE_MATERIAL = 201,
 	SIMFACE_IMAGE,
@@ -31,6 +32,17 @@
 	SIMFACE_COPLANAR,
 };
 
+/* similar edge selection slot values */
+enum {
+	SIMEDGE_LENGTH = 101,
+	SIMEDGE_DIR,
+	SIMEDGE_FACE,
+	SIMEDGE_FACE_ANGLE,
+	SIMEDGE_CREASE,
+	SIMEDGE_SEAM,
+	SIMEDGE_SHARP,
+};
+
 extern BMOpDefine *opdefines[];
 extern int bmesh_total_ops;
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-08-28 09:36:31 UTC (rev 22832)
@@ -629,6 +629,22 @@
 	0
 };
 
+/*
+  Similar edges select
+
+  Select similar edges (length, direction, edge, seam,....).
+*/
+BMOpDefine def_similaredges = {
+	"similaredges",
+	{{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /* input edges */
+	 {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"}, /* output edges */
+	 {BMOP_OPSLOT_INT, "type"},			/* type of selection */
+	 {BMOP_OPSLOT_FLT, "thresh"},		/* threshold of selection */
+	 {0} /*null-terminating sentinel*/},
+	bmesh_similaredges_exec,
+	0
+};
+
 BMOpDefine *opdefines[] = {
 	&def_splitop,
 	&def_dupeop,
@@ -670,6 +686,7 @@
 	&def_pointmerge,
 	&def_collapse,
 	&def_similarfaces,
+	&def_similaredges,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-08-28 09:36:31 UTC (rev 22832)
@@ -47,5 +47,5 @@
 void bmesh_pointmerge_exec(BMesh *bm, BMOperator *op);
 void bmesh_collapse_exec(BMesh *bm, BMOperator *op);
 void bmesh_similarfaces_exec(BMesh *bm, BMOperator *op);
-
+void bmesh_similaredges_exec(BMesh *bm, BMOperator *op);
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/operators/utils.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/utils.c	2009-08-28 04:50:35 UTC (rev 22831)
+++ branches/bmesh/blender/source/blender/bmesh/operators/utils.c	2009-08-28 09:36:31 UTC (rev 22832)
@@ -501,7 +501,7 @@
 	BMIter fm_iter;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list