[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24432] branches/bmesh/blender/source/ blender/editors/mesh: fixed loopcut preview issues for the most part, though there's still an occasional problem I need to track down
Joseph Eagar
joeedh at gmail.com
Mon Nov 9 23:47:58 CET 2009
Revision: 24432
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24432
Author: joeedh
Date: 2009-11-09 23:47:55 +0100 (Mon, 09 Nov 2009)
Log Message:
-----------
fixed loopcut preview issues for the most part, though there's still an occasional problem I need to track down
Modified Paths:
--------------
branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c 2009-11-09 22:42:41 UTC (rev 24431)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c 2009-11-09 22:47:55 UTC (rev 24432)
@@ -494,9 +494,14 @@
if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)) {
int distance;
- unsigned int index = view3d_sample_backbuf_rect(vc, vc->mval, 50, bm_solidoffs, bm_wireoffs, &distance,0, NULL, NULL);
- BMEdge *eed = BMIter_AtIndex(vc->em->bm, BM_EDGES_OF_MESH, NULL, index-1);
-
+ unsigned int index;
+ BMEdge *eed;
+
+ view3d_validate_backbuf(vc);
+
+ index = view3d_sample_backbuf_rect(vc, vc->mval, 50, bm_solidoffs, bm_wireoffs, &distance,0, NULL, NULL);
+ eed = BMIter_AtIndex(vc->em->bm, BM_EDGES_OF_MESH, NULL, index-1);
+
if (eed && distance<*dist) {
*dist = distance;
return eed;
Modified: branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/loopcut.c 2009-11-09 22:42:41 UTC (rev 24431)
+++ branches/bmesh/blender/source/blender/editors/mesh/loopcut.c 2009-11-09 22:47:55 UTC (rev 24432)
@@ -123,12 +123,55 @@
glEnable(GL_DEPTH_TEST);
}
+/*given two opposite edges in a face, finds the ordering of their vertices so
+ that cut preview lines won't cross each other*/
+static void edgering_find_order(BMEditMesh *em, BMEdge *lasteed, BMEdge *eed,
+ BMVert *lastv1, BMVert *v[2][2])
+{
+ BMIter iter, liter;
+ BMLoop *l, *l2;
+ int rev;
+
+ l = eed->loop;
+
+ /*find correct order for v[1]*/
+ if (!(BM_Edge_In_Face(l->f, eed) && BM_Edge_In_Face(l->f, lasteed))) {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_LOOP, l) {
+ if (BM_Edge_In_Face(l->f, eed) && BM_Edge_In_Face(l->f, lasteed))
+ break;
+ }
+ }
+
+ /*this should never happen*/
+ if (!l) {
+ v[0][0] = eed->v1;
+ v[0][1] = eed->v2;
+ v[1][0] = lasteed->v1;
+ v[1][1] = lasteed->v2;
+ return;
+ }
+
+ l2 = BM_OtherFaceLoop(l->e, l->f, eed->v1);
+ rev = (l2 == (BMLoop*)l->head.prev);
+ while (l2->v != lasteed->v1 && l2->v != lasteed->v2) {
+ l2 = rev ? (BMLoop*)l2->head.prev : (BMLoop*)l2->head.next;
+ }
+
+ if (l2->v == lastv1) {
+ v[0][0] = eed->v1;
+ v[0][1] = eed->v2;
+ } else {
+ v[0][0] = eed->v2;
+ v[0][1] = eed->v1;
+ }
+}
+
static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
{
BMEditMesh *em = lcd->em;
BMEdge *startedge = lcd->eed;
BMEdge *eed, *lasteed;
- BMVert *v[2][2];
+ BMVert *v[2][2], *lastv1;
BMWalker walker;
float (*edges)[2][3] = NULL;
BLI_array_declare(edges);
@@ -161,48 +204,25 @@
BMW_Init(&walker, em->bm, BMW_EDGERING, 0, 0);
eed = startedge = BMW_Begin(&walker, startedge);
+ lastv1 = NULL;
for (lasteed=NULL; eed; eed=BMW_Step(&walker)) {
if (lasteed) {
BMIter liter;
BMLoop *l, *l2;
int rev;
- v[0][0] = eed->v1;
- v[0][1] = eed->v2;
- v[1][0] = lasteed->v1;
- v[1][1] = lasteed->v2;
-
-#if 0 //hrm. this code may be useful later.
- /*find correct order for v[1]*/
-
- l = eed->loop;
- if (!(BM_Edge_In_Face(l->f, eed) && BM_Edge_In_Face(l->f, lasteed))) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_LOOP, l) {
- if (BM_Edge_In_Face(l->f, eed) && BM_Edge_In_Face(l->f, lasteed))
- break;
- }
- }
-
- /*this should never happen*/
- if (!l) {
- lasteed = eed;
- continue;
- }
-
- l2 = BM_OtherFaceLoop(l->e, l->f, l->v);
- rev = (l2 == (BMLoop*)l->head.prev);
- while (l2->v != lasteed->v1 && l2->v != lasteed->v2) {
- l2 = rev ? (BMLoop*)l2->head.prev : (BMLoop*)l2->head.next;
- }
-
- if (l2->v == lasteed->v1) {
+ if (lastv1) {
+ v[1][0] = v[0][0];
+ v[1][1] = v[0][1];
+ } else {
v[1][0] = lasteed->v1;
v[1][1] = lasteed->v2;
- } else {
- v[1][0] = lasteed->v2;
- v[1][1] = lasteed->v1;
+ lastv1 = lasteed->v1;
}
-#endif
+
+ edgering_find_order(em, lasteed, eed, lastv1, v);
+ lastv1 = v[0][0];
+
for(i=1;i<=previewlines;i++){
co[0][0] = (v[0][1]->co[0] - v[0][0]->co[0])*(i/((float)previewlines+1))+v[0][0]->co[0];
co[0][1] = (v[0][1]->co[1] - v[0][0]->co[1])*(i/((float)previewlines+1))+v[0][0]->co[1];
@@ -222,10 +242,8 @@
}
if (BM_Edge_Share_Faces(lasteed, startedge)) {
- v[0][0] = startedge->v1;
- v[0][1] = startedge->v2;
- v[1][0] = lasteed->v1;
- v[1][1] = lasteed->v2;
+ edgering_find_order(em, lasteed, startedge, lastv1, v);
+
for(i=1;i<=previewlines;i++){
co[0][0] = (v[0][1]->co[0] - v[0][0]->co[0])*(i/((float)previewlines+1))+v[0][0]->co[0];
co[0][1] = (v[0][1]->co[1] - v[0][0]->co[1])*(i/((float)previewlines+1))+v[0][0]->co[1];
@@ -412,20 +430,6 @@
ED_region_tag_redraw(lcd->ar);
break;
- case WHEELUPMOUSE: /* change number of cuts */
- cuts++;
- RNA_int_set(op->ptr,"number_cuts",cuts);
- ringsel_find_edge(lcd, C, lcd->ar, cuts);
-
- ED_region_tag_redraw(lcd->ar);
- break;
- case WHEELDOWNMOUSE: /* change number of cuts */
- cuts=MAX2(cuts-1,1);
- RNA_int_set(op->ptr,"number_cuts",cuts);
- ringsel_find_edge(lcd, C, lcd->ar,cuts);
-
- ED_region_tag_redraw(lcd->ar);
- break;
case MOUSEMOVE: { /* mouse moved somewhere to select another loop */
int dist = 75;
BMEdge *edge;
@@ -485,14 +489,22 @@
ED_region_tag_redraw(lcd->ar);
break;
+ case PAGEUPKEY:
case WHEELUPMOUSE: /* change number of cuts */
+ if (event->val == KM_RELEASE)
+ break;
+
cuts++;
RNA_int_set(op->ptr,"number_cuts",cuts);
ringsel_find_edge(lcd, C, lcd->ar, cuts);
ED_region_tag_redraw(lcd->ar);
break;
+ case PAGEDOWNKEY:
case WHEELDOWNMOUSE: /* change number of cuts */
+ if (event->val == KM_RELEASE)
+ break;
+
cuts=MAX2(cuts-1,1);
RNA_int_set(op->ptr,"number_cuts",cuts);
ringsel_find_edge(lcd, C, lcd->ar,cuts);
More information about the Bf-blender-cvs
mailing list