[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25603] trunk/blender/source/blender: Make manipulator axis fade away and become invisible when perpendicular to the screen .

Martin Poirier theeth at yahoo.com
Tue Dec 29 02:12:54 CET 2009


Revision: 25603
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25603
Author:   theeth
Date:     2009-12-29 02:12:54 +0100 (Tue, 29 Dec 2009)

Log Message:
-----------
Make manipulator axis fade away and become invisible when perpendicular to the screen.

Move some more vars to RegionView3D from View3D

Also remove some code no longer used.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform_manipulator.c
    trunk/blender/source/blender/makesdna/DNA_view3d_types.h

Modified: trunk/blender/source/blender/editors/transform/transform_manipulator.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_manipulator.c	2009-12-29 00:04:57 UTC (rev 25602)
+++ trunk/blender/source/blender/editors/transform/transform_manipulator.c	2009-12-29 01:12:54 UTC (rev 25603)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <float.h>
 
 #ifndef WIN32
 #include <unistd.h>
@@ -157,23 +158,23 @@
 }
 
 /* for pose mode */
-static void stats_pose(Scene *scene, View3D *v3d, bPoseChannel *pchan)
+static void stats_pose(Scene *scene, RegionView3D *rv3d, bPoseChannel *pchan)
 {
 	Bone *bone= pchan->bone;
 
 	if(bone) {
 		if (bone->flag & BONE_TRANSFORM) {
 			calc_tw_center(scene, pchan->pose_head);
-			protectflag_to_drawflags(pchan->protectflag, &v3d->twdrawflag);
+			protectflag_to_drawflags(pchan->protectflag, &rv3d->twdrawflag);
 		}
 	}
 }
 
 /* for editmode*/
-static void stats_editbone(View3D *v3d, EditBone *ebo)
+static void stats_editbone(RegionView3D *rv3d, EditBone *ebo)
 {
 	if (ebo->flag & BONE_EDITMODE_LOCKED)
-		protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &v3d->twdrawflag);
+		protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &rv3d->twdrawflag);
 }
 
 
@@ -263,7 +264,7 @@
 	/* transform widget matrix */
 	unit_m4(rv3d->twmat);
 
-	v3d->twdrawflag= 0xFFFF;
+	rv3d->twdrawflag= 0xFFFF;
 
 	/* transform widget centroid/center */
 	scene->twcent[0]= scene->twcent[1]= scene->twcent[2]= 0.0f;
@@ -308,7 +309,7 @@
 						totsel++;
 					}
 					if (ebo->flag & BONE_SELECTED) {
-						stats_editbone(v3d, ebo);
+						stats_editbone(rv3d, ebo);
 					}
 				}
 			}
@@ -419,7 +420,7 @@
 		if(totsel) {
 			/* use channels to get stats */
 			for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
-				stats_pose(scene, v3d, pchan);
+				stats_pose(scene, rv3d, pchan);
 			}
 
 			mul_v3_fl(scene->twcent, 1.0f/(float)totsel);	// centroid!
@@ -466,7 +467,7 @@
 				if(ob==NULL)
 					ob= base->object;
 				calc_tw_center(scene, base->object->obmat[3]);
-				protectflag_to_drawflags(base->object->protectflag, &v3d->twdrawflag);
+				protectflag_to_drawflags(base->object->protectflag, &rv3d->twdrawflag);
 				totsel++;
 			}
 		}
@@ -529,6 +530,44 @@
 	return totsel;
 }
 
+/* don't draw axis perpendicular to the view */
+void test_manipulator_axis(const bContext *C)
+{
+	RegionView3D *rv3d= CTX_wm_region_view3d(C);
+	float angle;
+	float vec[3];
+
+	viewvector(rv3d, rv3d->twmat[3], vec);
+
+	angle = fabs(angle_v3v3(rv3d->twmat[0], vec));
+	if (angle > M_PI / 2) {
+		angle = M_PI - angle;
+	}
+	angle = rv3d->twangle[0] = 180.0f * angle / M_PI;
+	if (angle < 5) {
+		rv3d->twdrawflag &= ~(MAN_TRANS_X|MAN_SCALE_X);
+	}
+
+	angle = fabs(angle_v3v3(rv3d->twmat[1], vec));
+	if (angle > M_PI / 2) {
+		angle = M_PI - angle;
+	}
+	angle = rv3d->twangle[1] = 180.0f * angle / M_PI;
+	if (angle < 5) {
+		rv3d->twdrawflag &= ~(MAN_TRANS_Y|MAN_SCALE_Y);
+	}
+
+	angle = fabs(angle_v3v3(rv3d->twmat[2], vec));
+	if (angle > M_PI / 2) {
+		angle = M_PI - angle;
+	}
+	angle = rv3d->twangle[2] = 180.0f * angle / M_PI;
+	if (angle < 5) {
+		rv3d->twdrawflag &= ~(MAN_TRANS_Z|MAN_SCALE_Z);
+	}
+}
+
+
 /* ******************** DRAWING STUFFIES *********** */
 
 static float screen_aligned(RegionView3D *rv3d, float mat[][4])
@@ -631,24 +670,32 @@
 	}
 }
 
+static char axisBlendAngle(float angle)
+{
+	if (angle > 20)
+		return 255;
+
+	if (angle < 5)
+		return 0;
+
+	return (char)(255.0f * (angle - 5) / 15.0f);
+}
+
 /* three colors can be set;
    grey for ghosting
    moving: in transform theme color
    else the red/green/blue
 */
-static void manipulator_setcolor(View3D *v3d, char axis, int colcode)
+static void manipulator_setcolor(View3D *v3d, char axis, int colcode, char alpha)
 {
-	float vec[4];
 	char col[4];
 
-	vec[3]= 0.7f; // alpha set on 0.5, can be glEnabled or not
-
 	if(colcode==MAN_GHOST) {
 		glColor4ub(0, 0, 0, 70);
 	}
 	else if(colcode==MAN_MOVECOL) {
 		UI_GetThemeColor3ubv(TH_TRANSFORM, col);
-		glColor4ub(col[0], col[1], col[2], 128);
+		glColor4ub(col[0], col[1], col[2], alpha);
 	}
 	else {
 		switch(axis) {
@@ -664,28 +711,28 @@
 				col[1]= col[1]<55?0:col[1]-55;
 				col[2]= col[2]<55?0:col[2]-55;
 			}
-			glColor4ub(col[0], col[1], col[2], 128);
+			glColor4ub(col[0], col[1], col[2], alpha);
 			break;
 		case 'x':
-			glColor4ub(220, 0, 0, 128);
+			glColor4ub(220, 0, 0, alpha);
 			break;
 		case 'y':
-			glColor4ub(0, 220, 0, 128);
+			glColor4ub(0, 220, 0, alpha);
 			break;
 		case 'z':
-			glColor4ub(30, 30, 220, 128);
+			glColor4ub(30, 30, 220, alpha);
 			break;
 		}
 	}
 }
 
 /* viewmatrix should have been set OK, also no shademode! */
-static void draw_manipulator_axes(View3D *v3d, int colcode, int flagx, int flagy, int flagz)
+static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode, int flagx, int flagy, int flagz)
 {
 
 	/* axes */
 	if(flagx) {
-		manipulator_setcolor(v3d, 'x', colcode);
+		manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
 		if(flagx & MAN_SCALE_X) glLoadName(MAN_SCALE_X);
 		else if(flagx & MAN_TRANS_X) glLoadName(MAN_TRANS_X);
 		glBegin(GL_LINES);
@@ -696,7 +743,7 @@
 	if(flagy) {
 		if(flagy & MAN_SCALE_Y) glLoadName(MAN_SCALE_Y);
 		else if(flagy & MAN_TRANS_Y) glLoadName(MAN_TRANS_Y);
-		manipulator_setcolor(v3d, 'y', colcode);
+		manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
 		glBegin(GL_LINES);
 		glVertex3f(0.0f, 0.2f, 0.0f);
 		glVertex3f(0.0f, 1.0f, 0.0f);
@@ -705,7 +752,7 @@
 	if(flagz) {
 		if(flagz & MAN_SCALE_Z) glLoadName(MAN_SCALE_Z);
 		else if(flagz & MAN_TRANS_Z) glLoadName(MAN_TRANS_Z);
-		manipulator_setcolor(v3d, 'z', colcode);
+		manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
 		glBegin(GL_LINES);
 		glVertex3f(0.0f, 0.0f, 0.2f);
 		glVertex3f(0.0f, 0.0f, 1.0f);
@@ -713,17 +760,6 @@
 	}
 }
 
-static void preOrtho(int ortho, float twmat[][4], int axis)
-{
-	if (ortho == 0) {
-		float omat[4][4];
-		copy_m4_m4(omat, twmat);
-		orthogonalize_m4(omat, axis);
-		glPushMatrix();
-		wmMultMatrix(omat);
-	}
-}
-
 static void preOrthoFront(int ortho, float twmat[][4], int axis)
 {
 	if (ortho == 0) {
@@ -743,162 +779,6 @@
 	}
 }
 
-/* only called while G.moving */
-static void draw_manipulator_rotate_ghost(View3D *v3d, RegionView3D *rv3d, int drawflags)
-{
-	GLUquadricObj *qobj;
-	float size, phi, startphi, vec[3], svec[3], matt[4][4], cross[3], tmat[3][3];
-	int arcs= (G.rt!=2);
-	int ortho;
-
-	glDisable(GL_DEPTH_TEST);
-
-	qobj= gluNewQuadric();
-	gluQuadricDrawStyle(qobj, GLU_FILL);
-
-	glColor4ub(0,0,0,64);
-	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-	glEnable(GL_BLEND);
-
-	/* we need both [4][4] transforms, t->mat seems to be premul, not post for mat[][4] */
-	copy_m4_m4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
-// XXX	mul_m4_m3m4(matt, t->mat, rv3d->twmat);
-
-	/* Screen aligned view rot circle */
-	if(drawflags & MAN_ROT_V) {
-
-		/* prepare for screen aligned draw */
-		glPushMatrix();
-		size= screen_aligned(rv3d, rv3d->twmat);
-
-		vec[0]= 0; // XXX (float)(t->con.imval[0] - t->center2d[0]);
-		vec[1]= 0; // XXX (float)(t->con.imval[1] - t->center2d[1]);
-		vec[2]= 0.0f;
-		normalize_v3(vec);
-
-		startphi= saacos( vec[1] );
-		if(vec[0]<0.0) startphi= -startphi;
-
-		phi= 0; // XXX (float)fmod(180.0*t->val/M_PI, 360.0);
-		if(phi > 180.0) phi-= 360.0;
-		else if(phi<-180.0) phi+= 360.0;
-
-		gluPartialDisk(qobj, 0.0, size, 32, 1, 180.0*startphi/M_PI, phi);
-
-		glPopMatrix();
-	}
-	else if(arcs) {
-		float imat[3][3], ivmat[3][3];
-		/* try to get the start rotation */
-
-		svec[0]= 0; // XXX (float)(t->con.imval[0] - t->center2d[0]);
-		svec[1]= 0; // XXX (float)(t->con.imval[1] - t->center2d[1]);
-		svec[2]= 0.0f;
-
-		/* screen aligned vec transform back to manipulator space */
-		copy_m3_m4(ivmat, rv3d->viewinv);
-		copy_m3_m4(tmat, rv3d->twmat);
-		invert_m3_m3(imat, tmat);
-		mul_m3_m3m3(tmat, imat, ivmat);
-
-		mul_m3_v3(tmat, svec);	// tmat is used further on
-		normalize_v3(svec);
-	}
-	
-	ortho = is_orthogonal_m4(rv3d->twmat);
-
-	if (ortho) {
-		wmMultMatrix(rv3d->twmat);	// aligns with original widget
-	}
-	
-
-	/* Z disk */
-	if(drawflags & MAN_ROT_Z) {
-		preOrtho(ortho, rv3d->twmat, 2);
-		
-		if(arcs) {
-			/* correct for squeezed arc */
-			svec[0]+= tmat[2][0];
-			svec[1]+= tmat[2][1];
-			normalize_v3(svec);
-
-			startphi= (float)atan2(svec[0], svec[1]);
-		}
-		else startphi= 0.5f*(float)M_PI;
-
-		VECCOPY(vec, rv3d->twmat[0]);	// use x axis to detect rotation
-		normalize_v3(vec);
-		normalize_v3(matt[0]);
-		phi= saacos( dot_v3v3(vec, matt[0]) );
-		if(phi!=0.0) {
-			cross_v3_v3v3(cross, vec, matt[0]);	// results in z vector
-			if(dot_v3v3(cross, rv3d->twmat[2]) > 0.0) phi= -phi;
-			gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*(phi)/M_PI);
-		}
-
-		postOrtho(ortho);
-	}
-	/* X disk */
-	if(drawflags & MAN_ROT_X) {
-		preOrtho(ortho, rv3d->twmat, 0);
-		
-		if(arcs) {
-			/* correct for squeezed arc */
-			svec[1]+= tmat[2][1];
-			svec[2]+= tmat[2][2];
-			normalize_v3(svec);
-
-			startphi= (float)(M_PI + atan2(svec[2], -svec[1]));
-		}
-		else startphi= 0.0f;
-
-		VECCOPY(vec, rv3d->twmat[1]);	// use y axis to detect rotation
-		normalize_v3(vec);
-		normalize_v3(matt[1]);
-		phi= saacos( dot_v3v3(vec, matt[1]) );
-		if(phi!=0.0) {
-			cross_v3_v3v3(cross, vec, matt[1]);	// results in x vector
-			if(dot_v3v3(cross, rv3d->twmat[0]) > 0.0) phi= -phi;
-			glRotatef(90.0, 0.0, 1.0, 0.0);
-			gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*phi/M_PI);
-			glRotatef(-90.0, 0.0, 1.0, 0.0);
-		}
-
-		postOrtho(ortho);
-	}
-	/* Y circle */
-	if(drawflags & MAN_ROT_Y) {
-		preOrtho(ortho, rv3d->twmat, 1);
-		
-		if(arcs) {
-			/* correct for squeezed arc */
-			svec[0]+= tmat[2][0];
-			svec[2]+= tmat[2][2];
-			normalize_v3(svec);
-
-			startphi= (float)(M_PI + atan2(-svec[0], svec[2]));
-		}
-		else startphi= (float)M_PI;
-
-		VECCOPY(vec, rv3d->twmat[2]);	// use z axis to detect rotation
-		normalize_v3(vec);
-		normalize_v3(matt[2]);
-		phi= saacos( dot_v3v3(vec, matt[2]) );
-		if(phi!=0.0) {
-			cross_v3_v3v3(cross, vec, matt[2]);	// results in y vector
-			if(dot_v3v3(cross, rv3d->twmat[1]) > 0.0) phi= -phi;
-			glRotatef(-90.0, 1.0, 0.0, 0.0);
-			gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*phi/M_PI);
-			glRotatef(90.0, 1.0, 0.0, 0.0);
-		}
-
-		postOrtho(ortho);
-	}
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list