[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