[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54923] trunk/blender/source/blender/ editors/transform/transform_manipulator.c: fix [#34426] Manipulator handles drawn incorrectly by depth

Campbell Barton ideasman42 at gmail.com
Thu Feb 28 07:12:07 CET 2013


Revision: 54923
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54923
Author:   campbellbarton
Date:     2013-02-28 06:12:06 +0000 (Thu, 28 Feb 2013)
Log Message:
-----------
fix [#34426] Manipulator handles drawn incorrectly by depth
original patch by Philipp Oeser (lichtwerk) with own changes.

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

Modified: trunk/blender/source/blender/editors/transform/transform_manipulator.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_manipulator.c	2013-02-28 05:18:47 UTC (rev 54922)
+++ trunk/blender/source/blender/editors/transform/transform_manipulator.c	2013-02-28 06:12:06 UTC (rev 54923)
@@ -841,39 +841,91 @@
 	glColor4ubv(col);
 }
 
-/* viewmatrix should have been set OK, also no shademode! */
-static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode, int flagx, int flagy, int flagz)
+static void axis_sort_v3(const float axis_values[3], int r_axis_order[3])
 {
+	float v[3];
+	copy_v3_v3(v, axis_values);
 
-	/* axes */
-	if (flagx) {
-		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);
-		glVertex3f(0.2f, 0.0f, 0.0f);
-		glVertex3f(1.0f, 0.0f, 0.0f);
-		glEnd();
+#define SWAP_AXIS(a, b) { \
+	SWAP(float, v[a],            v[b]); \
+	SWAP(int,   r_axis_order[a], r_axis_order[b]); \
+} (void)0
+
+	if (v[0] < v[1]) {
+		if (v[2] < v[0]) {  SWAP_AXIS(0, 2); }
 	}
-	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, axisBlendAngle(rv3d->twangle[1]));
-		glBegin(GL_LINES);
-		glVertex3f(0.0f, 0.2f, 0.0f);
-		glVertex3f(0.0f, 1.0f, 0.0f);
-		glEnd();
+	else {
+		if (v[1] < v[2]) { SWAP_AXIS(0, 1); }
+		else { SWAP_AXIS(0, 2); }
 	}
-	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, axisBlendAngle(rv3d->twangle[2]));
-		glBegin(GL_LINES);
-		glVertex3f(0.0f, 0.0f, 0.2f);
-		glVertex3f(0.0f, 0.0f, 1.0f);
-		glEnd();
+	if (v[2] < v[1])     { SWAP_AXIS(1, 2); }
+
+#undef SWAP_AXIS
+}
+static void manipulator_axis_order(RegionView3D *rv3d, int r_axis_order[3])
+{
+	float axis_values[3];
+	float vec[3];
+
+	ED_view3d_global_to_vector(rv3d, rv3d->twmat[3], vec);
+
+	axis_values[0] = -dot_v3v3(rv3d->twmat[0], vec);
+	axis_values[1] = -dot_v3v3(rv3d->twmat[1], vec);
+	axis_values[2] = -dot_v3v3(rv3d->twmat[2], vec);
+
+	axis_sort_v3(axis_values, r_axis_order);
+}
+
+/* viewmatrix should have been set OK, also no shademode! */
+static void draw_manipulator_axes_single(View3D *v3d, RegionView3D *rv3d, int colcode,
+                                         int flagx, int flagy, int flagz, int axis)
+{
+	switch (axis) {
+		case 0:
+			/* axes */
+			if (flagx) {
+				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);
+				glVertex3f(0.2f, 0.0f, 0.0f);
+				glVertex3f(1.0f, 0.0f, 0.0f);
+				glEnd();
+			}
+			break;
+		case 1:
+			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, axisBlendAngle(rv3d->twangle[1]));
+				glBegin(GL_LINES);
+				glVertex3f(0.0f, 0.2f, 0.0f);
+				glVertex3f(0.0f, 1.0f, 0.0f);
+				glEnd();
+			}
+			break;
+		case 2:
+			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, axisBlendAngle(rv3d->twangle[2]));
+				glBegin(GL_LINES);
+				glVertex3f(0.0f, 0.0f, 0.2f);
+				glVertex3f(0.0f, 0.0f, 1.0f);
+				glEnd();
+			}
+			break;
 	}
 }
+static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
+                                  int flagx, int flagy, int flagz,
+                                  const int axis_order[3])
+{
+	int i;
+	for (i = 0; i < 3; i++) {
+		draw_manipulator_axes_single(v3d, rv3d, colcode, flagx, flagy, flagz, axis_order[i]);
+	}
+}
 
 static void preOrthoFront(int ortho, float twmat[4][4], int axis)
 {
@@ -1214,10 +1266,14 @@
 {
 	float cywid = 0.25f * 0.01f * (float)U.tw_handlesize;
 	float cusize = cywid * 0.75f, dz;
+	int axis_order[3] = {2, 0, 1};
+	int i;
 
 	/* when called while moving in mixed mode, do not draw when... */
 	if ((drawflags & MAN_SCALE_C) == 0) return;
 
+	manipulator_axis_order(rv3d, axis_order);
+
 	glDisable(GL_DEPTH_TEST);
 
 	/* not in combo mode */
@@ -1255,29 +1311,42 @@
 	/* axis */
 
 	/* in combo mode, this is always drawn as first type */
-	draw_manipulator_axes(v3d, rv3d, colcode, drawflags & MAN_SCALE_X, drawflags & MAN_SCALE_Y, drawflags & MAN_SCALE_Z);
+	draw_manipulator_axes(v3d, rv3d, colcode,
+	                      drawflags & MAN_SCALE_X, drawflags & MAN_SCALE_Y, drawflags & MAN_SCALE_Z,
+	                      axis_order);
 
-	/* Z cube */
-	glTranslatef(0.0, 0.0, dz);
-	if (drawflags & MAN_SCALE_Z) {
-		if (G.f & G_PICKSEL) glLoadName(MAN_SCALE_Z);
-		manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
-		drawsolidcube(cusize);
+
+	for (i = 0; i < 3; i++) {
+		switch (axis_order[i]) {
+			case 0: /* X cube */
+				if (drawflags & MAN_SCALE_X) {
+					glTranslatef(dz, 0.0, 0.0);
+					if (G.f & G_PICKSEL) glLoadName(MAN_SCALE_X);
+					manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
+					drawsolidcube(cusize);
+					glTranslatef(-dz, 0.0, 0.0);
+				}
+				break;
+			case 1: /* Y cube */
+				if (drawflags & MAN_SCALE_Y) {
+					glTranslatef(0.0, dz, 0.0);
+					if (G.f & G_PICKSEL) glLoadName(MAN_SCALE_Y);
+					manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
+					drawsolidcube(cusize);
+					glTranslatef(0.0, -dz, 0.0);
+				}
+				break;
+			case 2: /* Z cube */
+				if (drawflags & MAN_SCALE_Z) {
+					glTranslatef(0.0, 0.0, dz);
+					if (G.f & G_PICKSEL) glLoadName(MAN_SCALE_Z);
+					manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
+					drawsolidcube(cusize);
+					glTranslatef(0.0, 0.0, -dz);
+				}
+				break;
+		}
 	}
-	/* X cube */
-	glTranslatef(dz, 0.0, -dz);
-	if (drawflags & MAN_SCALE_X) {
-		if (G.f & G_PICKSEL) glLoadName(MAN_SCALE_X);
-		manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
-		drawsolidcube(cusize);
-	}
-	/* Y cube */
-	glTranslatef(-dz, dz, 0.0);
-	if (drawflags & MAN_SCALE_Y) {
-		if (G.f & G_PICKSEL) glLoadName(MAN_SCALE_Y);
-		manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
-		drawsolidcube(cusize);
-	}
 
 	/* if shiftkey, center point as last, for selectbuffer order */
 	if (G.f & G_PICKSEL) {
@@ -1333,16 +1402,17 @@
 	float cywid = 0.25f * cylen, dz, size;
 	float unitmat[4][4];
 	int shift = 0; // XXX
+	int axis_order[3] = {0, 1, 2};
+	int i;
 
 	/* when called while moving in mixed mode, do not draw when... */
 	if ((drawflags & MAN_TRANS_C) == 0) return;
 
+	manipulator_axis_order(rv3d, axis_order);
+
 	// XXX if (moving) glTranslatef(t->vec[0], t->vec[1], t->vec[2]);
 	glDisable(GL_DEPTH_TEST);
 
-	qobj = gluNewQuadric();
-	gluQuadricDrawStyle(qobj, GLU_FILL);
-
 	/* center circle, do not add to selection when shift is pressed (planar constraint) */
 	if ((G.f & G_PICKSEL) && shift == 0) glLoadName(MAN_TRANS_C);
 
@@ -1360,8 +1430,11 @@
 	glLoadName(-1);
 
 	// translate drawn as last, only axis when no combo with scale, or for ghosting
-	if ((combo & V3D_MANIP_SCALE) == 0 || colcode == MAN_GHOST)
-		draw_manipulator_axes(v3d, rv3d, colcode, drawflags & MAN_TRANS_X, drawflags & MAN_TRANS_Y, drawflags & MAN_TRANS_Z);
+	if ((combo & V3D_MANIP_SCALE) == 0 || colcode == MAN_GHOST) {
+		draw_manipulator_axes(v3d, rv3d, colcode,
+		                      drawflags & MAN_TRANS_X, drawflags & MAN_TRANS_Y, drawflags & MAN_TRANS_Z,
+		                      axis_order);
+	}
 
 
 	/* offset in combo mode, for rotate a bit more */
@@ -1369,30 +1442,44 @@
 	else if (combo & (V3D_MANIP_SCALE)) dz = 1.0f + 0.5f * cylen;
 	else dz = 1.0f;
 
-	/* Z Cone */
-	glTranslatef(0.0, 0.0, dz);
-	if (drawflags & MAN_TRANS_Z) {
-		if (G.f & G_PICKSEL) glLoadName(MAN_TRANS_Z);
-		manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
-		draw_cone(qobj, cylen, cywid);
+	qobj = gluNewQuadric();
+	gluQuadricDrawStyle(qobj, GLU_FILL);
+
+	for (i = 0; i < 3; i++) {
+		switch (axis_order[i]) {
+			case 0: /* Z Cone */
+				if (drawflags & MAN_TRANS_Z) {
+					glTranslatef(0.0, 0.0, dz);
+					if (G.f & G_PICKSEL) glLoadName(MAN_TRANS_Z);
+					manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
+					draw_cone(qobj, cylen, cywid);
+					glTranslatef(0.0, 0.0, -dz);
+				}
+				break;
+			case 1: /* X Cone */
+				if (drawflags & MAN_TRANS_X) {
+					glTranslatef(dz, 0.0, 0.0);
+					if (G.f & G_PICKSEL) glLoadName(MAN_TRANS_X);
+					glRotatef(90.0, 0.0, 1.0, 0.0);
+					manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
+					draw_cone(qobj, cylen, cywid);
+					glRotatef(-90.0, 0.0, 1.0, 0.0);
+					glTranslatef(-dz, 0.0, 0.0);
+				}
+				break;
+			case 2: /* Y Cone */
+				if (drawflags & MAN_TRANS_Y) {
+					glTranslatef(0.0, dz, 0.0);
+					if (G.f & G_PICKSEL) glLoadName(MAN_TRANS_Y);
+					glRotatef(-90.0, 1.0, 0.0, 0.0);
+					manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
+					draw_cone(qobj, cylen, cywid);
+					glRotatef(90.0, 1.0, 0.0, 0.0);
+					glTranslatef(0.0, -dz, 0.0);
+				}
+				break;
+		}
 	}
-	/* X Cone */
-	glTranslatef(dz, 0.0, -dz);
-	if (drawflags & MAN_TRANS_X) {
-		if (G.f & G_PICKSEL) glLoadName(MAN_TRANS_X);
-		glRotatef(90.0, 0.0, 1.0, 0.0);
-		manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
-		draw_cone(qobj, cylen, cywid);
-		glRotatef(-90.0, 0.0, 1.0, 0.0);
-	}
-	/* Y Cone */
-	glTranslatef(-dz, dz, 0.0);
-	if (drawflags & MAN_TRANS_Y) {
-		if (G.f & G_PICKSEL) glLoadName(MAN_TRANS_Y);
-		glRotatef(-90.0, 1.0, 0.0, 0.0);
-		manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
-		draw_cone(qobj, cylen, cywid);
-	}
 
 	gluDeleteQuadric(qobj);
 	glLoadMatrixf(rv3d->viewmat);
@@ -1407,10 +1494,13 @@
 	float size;
 	float cylen = 0.01f * (float)U.tw_handlesize;
 	float cywid = 0.25f * cylen;
-
+	int axis_order[3] = {2, 0, 1};
+	int i;
 	/* when called while moving in mixed mode, do not draw when... */
 	if ((drawflags & MAN_ROT_C) == 0) return;
 
+	manipulator_axis_order(rv3d, axis_order);
+
 	/* prepare for screen aligned draw */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list