[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23416] trunk/blender/source/blender/ editors: brought back edge slide.

Joseph Eagar joeedh at gmail.com
Tue Sep 22 10:41:03 CEST 2009


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. @@




More information about the Bf-blender-cvs mailing list