Revision: 23416
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23416
Author:   joeedh
Date:     2009-09-22 10:41:03 +0200 (Tue, 22 Sep 2009)

Log Message:
-----------
brought back edge slide.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/include/ED_transform.h
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_intern.h
    trunk/blender/source/blender/editors/mesh/mesh_ops.c
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/transform/transform_ops.c

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h      2009-09-22 
04:40:16 UTC (rev 23415)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h      2009-09-22 
08:41:03 UTC (rev 23416)
@@ -175,5 +175,13 @@
 struct MDeformWeight   *ED_vgroup_weight_verify(struct MDeformVert *dv, int 
defgroup);
 struct MDeformWeight   *ED_vgroup_weight_get(struct MDeformVert *dv, int 
defgroup);
 
+/*needed by edge slide*/
+struct EditVert *editedge_getOtherVert(struct EditEdge *eed, struct EditVert 
*eve);
+struct EditVert *editedge_getSharedVert(struct EditEdge *eed, struct EditEdge 
*eed2);
+int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
+int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
+int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
+short sharesFace(struct EditMesh *em, struct EditEdge *e1, struct EditEdge 
*e2);
+
 #endif /* ED_MESH_H */
 

Modified: trunk/blender/source/blender/editors/include/ED_transform.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_transform.h 2009-09-22 
04:40:16 UTC (rev 23415)
+++ trunk/blender/source/blender/editors/include/ED_transform.h 2009-09-22 
08:41:03 UTC (rev 23416)
@@ -75,7 +75,8 @@
        TFM_BAKE_TIME,
        TFM_BEVEL,
        TFM_BWEIGHT,
-       TFM_ALIGN
+       TFM_ALIGN,
+       TFM_EDGE_SLIDE
 } TfmMode;
 
 /* TRANSFORM CONTEXTS */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2009-09-22 
04:40:16 UTC (rev 23415)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2009-09-22 
08:41:03 UTC (rev 23416)
@@ -3868,11 +3868,11 @@
        EditVert origvert;
 } SlideVert;
 
+#if 0
 int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc)
 {
        return 0;
 /* XXX REFACTOR - #if 0'd for now, otherwise can't make 64bit windows builds 
on 64bit machine */
-#if 0
 useless:
        goto useless // because it doesn't do anything right now
 
@@ -4654,11 +4654,12 @@
        }
 
        return 1;
+}
 #endif // END OF XXX
-}
 
 int EdgeLoopDelete(EditMesh *em, wmOperator *op)
 {
+#if 0 //XXX won't work with new edgeslide
 
        /* temporal flag setting so we keep UVs when deleting edge loops,
        * this is a bit of a hack but it works how you would want in almost all 
cases */
@@ -4677,6 +4678,7 @@
        EM_select_flush(em);
        //      DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
        return 1;
+#endif
 }
 
 

Modified: trunk/blender/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_intern.h     2009-09-22 
04:40:16 UTC (rev 23415)
+++ trunk/blender/source/blender/editors/mesh/mesh_intern.h     2009-09-22 
08:41:03 UTC (rev 23416)
@@ -61,12 +61,6 @@
 extern struct EditFace *addfacelist(EditMesh *em, struct EditVert *v1, struct 
EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace 
*example, struct EditFace *exampleEdges);
 extern struct EditEdge *findedgelist(EditMesh *em, struct EditVert *v1, struct 
EditVert *v2);
 
-EditVert *editedge_getOtherVert(EditEdge *eed, EditVert *eve);
-EditVert *editedge_getSharedVert(EditEdge *eed, EditEdge *eed2);
-int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
-int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
-int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
-
 void em_setup_viewcontext(struct bContext *C, ViewContext *vc);
 
 void MESH_OT_separate(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c        2009-09-22 
04:40:16 UTC (rev 23415)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c        2009-09-22 
08:41:03 UTC (rev 23416)
@@ -113,6 +113,7 @@
        uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", 
"direction", 2);
        //uiItemO(layout, "Loopcut", 0, "MESH_OT_loop_cut"); // CutEdgeloop(em, 
1);
        //uiItemO(layout, "Edge Slide", 0, "MESH_OT_edge_slide"); // 
EdgeSlide(em, 0,0.0);
+       uiItemEnumO(layout, "Edge Slide", 0, "TFM_OT_transform", "mode", 
TFM_EDGE_SLIDE);
        uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
        uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", 
"ring", 1);
        uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region");

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c  2009-09-22 
04:40:16 UTC (rev 23415)
+++ trunk/blender/source/blender/editors/transform/transform.c  2009-09-22 
08:41:03 UTC (rev 23416)
@@ -100,6 +100,7 @@
 #include "ED_markers.h"
 #include "ED_util.h"
 #include "ED_view3d.h"
+#include "ED_mesh.h"
 
 #include "UI_view2d.h"
 #include "WM_types.h"
@@ -108,6 +109,8 @@
 #include "BLI_arithb.h"
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
+#include "BLI_ghash.h"
+#include "BLI_linklist.h"
 
 #include "PIL_time.h"                  /* sleep                                
*/
 
@@ -1428,6 +1431,9 @@
        case TFM_BONE_ENVELOPE:
                initBoneEnvelope(t);
                break;
+       case TFM_EDGE_SLIDE:
+               initEdgeSlide(t);
+               break;
        case TFM_BONE_ROLL:
                initBoneRoll(t);
                break;
@@ -4029,7 +4035,670 @@
        return 1;
 }
 
+/* ********************  Edge Slide   *************** */
 
+static int createSlideVerts(TransInfo *t)
+{
+       Mesh *me = t->obedit->data;
+       EditMesh *em = me->edit_mesh;
+       EditFace *efa;
+       EditEdge *eed,*first=NULL,*last=NULL, *temp = NULL;
+       EditVert *ev, *nearest = NULL;
+       LinkNode *edgelist = NULL, *vertlist=NULL, *look;
+       GHash *vertgh;
+       TransDataSlideVert *tempsv;
+       float perc = 0, percp = 0,vertdist; // XXX, projectMat[4][4];
+       float shiftlabda= 0.0f,len = 0.0f;
+       int i, j, numsel, numadded=0, timesthrough = 0, vertsel=0, prop=1, 
cancel = 0,flip=0;
+       int wasshift = 0;
+       /* UV correction vars */
+       GHash **uvarray= NULL;
+       SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
+       int  uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
+       int uvlay_idx;
+       TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
+       RegionView3D *v3d = t->ar->regiondata;
+       float projectMat[4][4];
+       float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f};
+       float vec[3];
+       //short mval[2], mvalo[2];
+       float labda = 0.0f, totvec=0.0;
+
+       view3d_get_object_project_mat(v3d, t->obedit, projectMat);
+
+       //mvalo[0] = -1; mvalo[1] = -1;
+       numsel =0;
+
+       // Get number of selected edges and clear some flags
+       for(eed=em->edges.first;eed;eed=eed->next) {
+               eed->f1 = 0;
+               eed->f2 = 0;
+               if(eed->f & SELECT) numsel++;
+       }
+
+       for(ev=em->verts.first;ev;ev=ev->next) {
+               ev->f1 = 0;
+       }
+
+       //Make sure each edge only has 2 faces
+       // make sure loop doesn't cross face
+       for(efa=em->faces.first;efa;efa=efa->next) {
+               int ct = 0;
+               if(efa->e1->f & SELECT) {
+                       ct++;
+                       efa->e1->f1++;
+                       if(efa->e1->f1 > 2) {
+                               //BKE_report(op->reports, RPT_ERROR, "3+ face 
edge");
+                               return 0;
+                       }
+               }
+               if(efa->e2->f & SELECT) {
+                       ct++;
+                       efa->e2->f1++;
+                       if(efa->e2->f1 > 2) {
+                               //BKE_report(op->reports, RPT_ERROR, "3+ face 
edge");
+                               return 0;
+                       }
+               }
+               if(efa->e3->f & SELECT) {
+                       ct++;
+                       efa->e3->f1++;
+                       if(efa->e3->f1 > 2) {
+                               //BKE_report(op->reports, RPT_ERROR, "3+ face 
edge");
+                               return 0;
+                       }
+               }
+               if(efa->e4 && efa->e4->f & SELECT) {
+                       ct++;
+                       efa->e4->f1++;
+                       if(efa->e4->f1 > 2) {
+                               //BKE_report(op->reports, RPT_ERROR, "3+ face 
edge");
+                               return 0;
+                       }
+               }
+               // Make sure loop is not 2 edges of same face
+               if(ct > 1) {
+                  //BKE_report(op->reports, RPT_ERROR, "Loop crosses itself");
+                  return 0;
+               }
+       }
+
+       // Get # of selected verts
+       for(ev=em->verts.first;ev;ev=ev->next) {
+               if(ev->f & SELECT) vertsel++;
+       }
+
+       // Test for multiple segments
+       if(vertsel > numsel+1) {
+               //BKE_report(op->reports, RPT_ERROR, "Please choose a single 
edge loop");
+               return 0;
+       }
+
+       // Get the edgeloop in order - mark f1 with SELECT once added
+       for(eed=em->edges.first;eed;eed=eed->next) {
+               if((eed->f & SELECT) && !(eed->f1 & SELECT)) {
+                       // If this is the first edge added, just put it in
+                       if(!edgelist) {
+                               BLI_linklist_prepend(&edgelist,eed);
+                               numadded++;
+                               first = eed;
+                               last  = eed;
+                               eed->f1 = SELECT;
+                       } else {
+                               if(editedge_getSharedVert(eed, last)) {
+                                       BLI_linklist_append(&edgelist,eed);
+                                       eed->f1 = SELECT;
+                                       numadded++;
+                                       last = eed;
+                               }  else if(editedge_getSharedVert(eed, first)) {
+                                       BLI_linklist_prepend(&edgelist,eed);
+                                       eed->f1 = SELECT;
+                                       numadded++;
+                                       first = eed;
+                               }
+                       }
+               }
+               if(eed->next == NULL && numadded != numsel) {
+                       eed=em->edges.first;
+                       timesthrough++;
+               }
+
+               // It looks like there was an unexpected case - Hopefully 
should not happen
+               if(timesthrough >= numsel*2) {
+                       BLI_linklist_free(edgelist,NULL);
+                       //BKE_report(op->reports, RPT_ERROR, "Could not order 
loop");
+                       return 0;
+               }
+       }
+
+       // Put the verts in order in a linklist
+       look = edgelist;
+       while(look) {
+               eed = look->link;
+               if(!vertlist) {
+                       if(look->next) {
+                               temp = look->next->link;
+
+                               //This is the first entry takes care of extra 
vert
+                               if(eed->v1 != temp->v1 && eed->v1 != temp->v2) {
+                                       BLI_linklist_append(&vertlist,eed->v1);
+                                       eed->v1->f1 = 1;
+                               } else {
+                                       BLI_linklist_append(&vertlist,eed->v2);
+                                       eed->v2->f1 = 1;
+                               }
+                       } else {
+                               //This is the case that we only have 1 edge
+                               BLI_linklist_append(&vertlist,eed->v1);
+                               eed->v1->f1 = 1;
+                       }
+               }
+               // for all the entries
+               if(eed->v1->f1 != 1) {
+                       BLI_linklist_append(&vertlist,eed->v1);
+                       eed->v1->f1 = 1;
+               } else  if(eed->v2->f1 != 1) {
+                       BLI_linklist_append(&vertlist,eed->v2);
+                       eed->v2->f1 = 1;
+               }
+               look = look->next;
+       }
+
+       // populate the SlideVerts
+
+       vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+       look = vertlist;
+       while(look) {
+               i=0;
+               j=0;
+               ev = look->link;
+               tempsv = (struct TransDataSlideVert*)MEM_mallocN(sizeof(struct 
TransDataSlideVert),"SlideVert");
+               tempsv->up = NULL;
+               tempsv->down = NULL;
+               tempsv->origvert.co[0] = ev->co[0];
+               tempsv->origvert.co[1] = ev->co[1];
+               tempsv->origvert.co[2] = ev->co[2];
+               tempsv->origvert.no[0] = ev->no[0];
+               tempsv->origvert.no[1] = ev->no[1];

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to