[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16242] trunk/blender/source/blender: Little feature request

Martin Poirier theeth at yahoo.com
Sun Aug 24 22:57:56 CEST 2008


Revision: 16242
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16242
Author:   theeth
Date:     2008-08-24 22:57:56 +0200 (Sun, 24 Aug 2008)

Log Message:
-----------
Little feature request

Adding numerical input support to edge slide (and at the same time, loop cut).

Also clean up NumInput functions for external use. I might have a second pass at this to make it even easier.

Modified Paths:
--------------
    trunk/blender/source/blender/include/transform.h
    trunk/blender/source/blender/src/editmesh_tools.c
    trunk/blender/source/blender/src/transform_generics.c
    trunk/blender/source/blender/src/transform_numinput.c

Modified: trunk/blender/source/blender/include/transform.h
===================================================================
--- trunk/blender/source/blender/include/transform.h	2008-08-24 15:22:44 UTC (rev 16241)
+++ trunk/blender/source/blender/include/transform.h	2008-08-24 20:57:56 UTC (rev 16242)
@@ -466,7 +466,6 @@
 /*********************** Generics ********************************/
 
 void initTrans(TransInfo *t);
-void initTransModeFlags(TransInfo *t, int mode);
 void postTrans (TransInfo *t);
 
 void drawLine(float *center, float *dir, char axis, short options);
@@ -498,6 +497,7 @@
 
 /*********************** NumInput ********************************/
 
+void initNumInput(NumInput *n);
 void outputNumInput(NumInput *n, char *str);
 short hasNumInput(NumInput *n);
 void applyNumInput(NumInput *n, float *vec);

Modified: trunk/blender/source/blender/src/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_tools.c	2008-08-24 15:22:44 UTC (rev 16241)
+++ trunk/blender/source/blender/src/editmesh_tools.c	2008-08-24 20:57:56 UTC (rev 16242)
@@ -4667,6 +4667,7 @@
 
 int EdgeSlide(short immediate, float imperc)
 {
+	NumInput num;
 	EditMesh *em = G.editMesh;
 	EditFace *efa;
 	EditEdge *eed,*first=NULL,*last=NULL, *temp = NULL;
@@ -4683,6 +4684,8 @@
 	char str[128]; 
 	float labda = 0.0f;
 	
+	initNumInput(&num);
+		
 	view3d_get_object_project_mat(curarea, G.obedit, projectMat, viewMat);
 	
 	mvalo[0] = -1; mvalo[1] = -1; 
@@ -4994,17 +4997,84 @@
 		float v2[2], v3[2];
 		EditVert *centerVert, *upVert, *downVert;
 		
-		
-
 		getmouseco_areawin(mval);  
 		
 		if (!immediate && (mval[0] == mvalo[0] && mval[1] ==  mvalo[1])) {
 			PIL_sleep_ms(10);
 		} else {
+			char *p = str;;
 
 			mvalo[0] = mval[0];
 			mvalo[1] = mval[1];
 			
+
+			tempsv = BLI_ghash_lookup(vertgh,nearest);
+
+			centerVert = editedge_getSharedVert(tempsv->up, tempsv->down);
+			upVert = editedge_getOtherVert(tempsv->up, centerVert);
+			downVert = editedge_getOtherVert(tempsv->down, centerVert);
+
+			view3d_project_float(curarea, upVert->co, v2, projectMat);
+			view3d_project_float(curarea, downVert->co, v3, projectMat);
+
+			/* Determine the % on which the loop should be cut */   
+
+			rc[0]= v3[0]-v2[0];   
+			rc[1]= v3[1]-v2[1];   
+			len= rc[0]*rc[0]+ rc[1]*rc[1];
+			if (len==0) {len = 0.0001;}
+
+			if ((G.qual & LR_SHIFTKEY)==0) {
+				wasshift = 0;
+				labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len;   
+			}
+			else {
+				if (wasshift==0) {
+					wasshift = 1;
+					shiftlabda = labda;
+				}							
+				labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len / 10.0 + shiftlabda;   			
+			}
+			
+
+			if(labda<=0.0) labda=0.0;   
+			else if(labda>=1.0)labda=1.0;   
+
+			perc=((1-labda)*2)-1;		  
+			
+			if(G.qual == 0) {
+				perc *= 100;
+				perc = floor(perc);
+				perc /= 100;
+			} else if (G.qual == LR_CTRLKEY) {
+				perc *= 10;
+				perc = floor(perc);
+				perc /= 10;				   
+			}			
+			
+			if(prop == 0) {
+				len = VecLenf(upVert->co,downVert->co)*((perc+1)/2);
+				if(flip == 1) {
+					len = VecLenf(upVert->co,downVert->co) - len;
+				} 
+			}
+			
+			if (hasNumInput(&num))
+			{
+				applyNumInput(&num, &perc);
+				
+				if (prop)
+				{
+					perc = MIN2(perc, 1);
+					perc = MAX2(perc, -1);
+				}
+				else
+				{
+					len = MIN2(perc, VecLenf(upVert->co,downVert->co));
+					len = MAX2(len, 0);
+				}
+			}
+
 			//Adjust Edgeloop
 			if(immediate) {
 				perc = imperc;   
@@ -5043,13 +5113,7 @@
 
 			}
 			
-			tempsv = BLI_ghash_lookup(vertgh,nearest);
-
-			centerVert = editedge_getSharedVert(tempsv->up, tempsv->down);
-			upVert = editedge_getOtherVert(tempsv->up, centerVert);
-			downVert = editedge_getOtherVert(tempsv->down, centerVert);
 			 // Highlight the Control Edges
-	
 			scrarea_do_windraw(curarea);   
 			persp(PERSP_VIEW);   
 			glPushMatrix();   
@@ -5077,55 +5141,36 @@
 			
 			glPopMatrix();		 
 
-			view3d_project_float(curarea, upVert->co, v2, projectMat);
-			view3d_project_float(curarea, downVert->co, v3, projectMat);
-
-			/* Determine the % on which the loop should be cut */   
-
-			rc[0]= v3[0]-v2[0];   
-			rc[1]= v3[1]-v2[1];   
-			len= rc[0]*rc[0]+ rc[1]*rc[1];
-			if (len==0) {len = 0.0001;}
-
-			if ((G.qual & LR_SHIFTKEY)==0) {
-				wasshift = 0;
-				labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len;   
+			if(prop) {
+				p += sprintf(str, "(P)ercentage: ");
+			} else {
+				p += sprintf(str, "Non (P)rop Length: ");
 			}
-			else {
-				if (wasshift==0) {
-					wasshift = 1;
-					shiftlabda = labda;
-				}							
-				labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len / 10.0 + shiftlabda;   			
+			
+			if (hasNumInput(&num))
+			{
+				char num_str[20];
+				
+				outputNumInput(&num, num_str);
+				p += sprintf(p, "%s", num_str);
 			}
+			else
+			{
+				if (prop)
+				{
+					p += sprintf(p, "%f", perc);
+				}
+				else
+				{
+					p += sprintf(p, "%f", len);
+				}
+			}
 			
-
-			if(labda<=0.0) labda=0.0;   
-			else if(labda>=1.0)labda=1.0;   
-
-			perc=((1-labda)*2)-1;		  
 			
-			if(G.qual == 0) {
-				perc *= 100;
-				perc = floor(perc);
-				perc /= 100;
-			} else if (G.qual == LR_CTRLKEY) {
-				perc *= 10;
-				perc = floor(perc);
-				perc /= 10;				   
-			}			
-			if(prop) {
-				sprintf(str, "(P)ercentage: %f", perc);
-			} else {
-				len = VecLenf(upVert->co,downVert->co)*((perc+1)/2);
-				if(flip == 1) {
-					len = VecLenf(upVert->co,downVert->co) - len;
-				} 
-				sprintf(str, "Non (P)rop Length: %f, Press (F) to flip control side", len);
+			if (prop == 0) {
+				p += sprintf(p, ", Press (F) to flip control side");
 			}
 
-			
-			
 			headerprint(str);
 			screen_swapbuffers();			
 		}
@@ -5148,7 +5193,14 @@
 							perc = 0;  
 							immediate = 1;
 					} else if(event==PKEY) {
-							(prop == 1) ? (prop = 0):(prop = 1);
+							initNumInput(&num); /* reset num input */
+							if (prop) {
+								prop = 0;
+								num.flag |= NUM_NO_NEGATIVE;
+							}
+							else {
+								prop = 1;
+							}
 							mvalo[0] = -1;  
 					} else if(event==FKEY) {
 							(flip == 1) ? (flip = 0):(flip = 1); 
@@ -5186,7 +5238,13 @@
 							look = look->next;   
 						}	  
 					}
+					
+					if (handleNumInput(&num, event))
+					{
+						mvalo[0] = -1; /* NEED A BETTER WAY TO TRIGGER REDRAW */
+					}
 				}
+				
 			} 
 		} else {
 			draw = 0;

Modified: trunk/blender/source/blender/src/transform_generics.c
===================================================================
--- trunk/blender/source/blender/src/transform_generics.c	2008-08-24 15:22:44 UTC (rev 16241)
+++ trunk/blender/source/blender/src/transform_generics.c	2008-08-24 20:57:56 UTC (rev 16242)
@@ -583,39 +583,6 @@
 		reshadeall_displist();
 }
 
-void initTransModeFlags(TransInfo *t, int mode) 
-{
-	t->mode = mode;
-	t->num.flag = 0;
-
-	/* REMOVING RESTRICTIONS FLAGS */
-	t->flag &= ~T_ALL_RESTRICTIONS;
-	
-	switch (mode) {
-	case TFM_RESIZE:
-		t->flag |= T_NULL_ONE;
-		t->num.flag |= NUM_NULL_ONE;
-		t->num.flag |= NUM_AFFECT_ALL;
-		if (!G.obedit) {
-			t->flag |= T_NO_ZERO;
-			t->num.flag |= NUM_NO_ZERO;
-		}
-		break;
-	case TFM_TOSPHERE:
-		t->num.flag |= NUM_NULL_ONE;
-		t->num.flag |= NUM_NO_NEGATIVE;
-		t->flag |= T_NO_CONSTRAINT;
-		break;
-	case TFM_SHEAR:
-	case TFM_CREASE:
-	case TFM_BONE_ENVELOPE:
-	case TFM_CURVE_SHRINKFATTEN:
-	case TFM_BONE_ROLL:
-		t->flag |= T_NO_CONSTRAINT;
-		break;
-	}
-}
-
 void drawLine(float *center, float *dir, char axis, short options)
 {
 	extern void make_axis_color(char *col, char *col2, char axis);	// drawview.c
@@ -674,19 +641,10 @@
 	t->transform		= NULL;
 	t->handleEvent		= NULL;
 
-	t->total			=
-		t->num.idx		=
-		t->num.idx_max	=
-		t->num.ctrl[0]	= 
-		t->num.ctrl[1]	= 
-		t->num.ctrl[2]	= 0;
+	t->total			= 0;
 
 	t->val = 0.0f;
 
-	t->num.val[0]		= 
-		t->num.val[1]	= 
-		t->num.val[2]	= 0.0f;
-
 	t->vec[0]			=
 		t->vec[1]		=
 		t->vec[2]		= 0.0f;
@@ -708,7 +666,8 @@
 		t->around = V3D_CENTER;
 
 	setTransformViewMatrices(t);
-	initNDofInput(&(t->ndof));
+	initNumInput(&t->num);
+	initNDofInput(&t->ndof);
 }
 
 /* Here I would suggest only TransInfo related issues, like free data & reset vars. Not redraws */

Modified: trunk/blender/source/blender/src/transform_numinput.c
===================================================================
--- trunk/blender/source/blender/src/transform_numinput.c	2008-08-24 15:22:44 UTC (rev 16241)
+++ trunk/blender/source/blender/src/transform_numinput.c	2008-08-24 20:57:56 UTC (rev 16242)
@@ -41,6 +41,20 @@
 
 /* ************************** NUMINPUT **************************** */
 
+void initNumInput(NumInput *n)
+{
+	n->flag		=
+	n->idx		=
+	n->idx_max	=
+	n->ctrl[0]	= 
+	n->ctrl[1]	= 
+	n->ctrl[2]	= 0;
+
+	n->val[0]		= 
+	n->val[1]	= 
+	n->val[2]	= 0.0f;
+}
+
 void outputNumInput(NumInput *n, char *str)
 {
 	char cur;





More information about the Bf-blender-cvs mailing list