[Bf-committers] Teach draw patch to bf blender

Campbell Barton cbarton at metavr.com
Tue Oct 5 15:53:12 CEST 2004


Hi All- This patch adds buttons in the mesh draw options that allows you 
to draw:
- edge length
- Face area
- Face Angles

This is realy usefull for architectural drawing and dosent interfear 
with any blenders functionality.

I also added a function to BLI_arithb: VecAngle3

*float VecAngle3( float *v1, float *v2, float *v3)  /* Return the angle 
between vec 1&2 and vec 1&3 */
{
    float vec1[3], vec2[3];

    VecSubf(vec1, v2, v1);
    VecSubf(vec2, v3, v1);
    Normalise(vec1);
  Normalise(vec2);
    return saacos(vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]) * 
57.295779;
}*

I have tested this farily well- Design decissions were made with Tons 
help, hopr you like it.

- Cam


-- 
Campbell J Barton

133 Hope Street
Geelong West, Victoria 3218 Australia

URL:    http://www.metavr.com
e-mail: cbarton at metavr.com
phone: AU (03) 5229 0241

-------------- next part --------------
Index: source/blender/blenkernel/BKE_global.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/BKE_global.h,v
retrieving revision 1.16
diff -u -r1.16 BKE_global.h
--- source/blender/blenkernel/BKE_global.h	23 Sep 2004 20:52:49 -0000	1.16
+++ source/blender/blenkernel/BKE_global.h	5 Oct 2004 12:53:21 -0000
@@ -172,6 +172,10 @@
 #define G_DRAWSEAMS     (1 << 20)
 #define G_HIDDENEDGES   (1 << 21)
 
+#define G_DRAW_EDGLEN		(1 << 22) /* Teac info Drawing */
+#define G_DRAW_FACEAREA		(1 << 23)
+#define G_DRAW_FACEANG		(1 << 24)
+
 /* G.fileflags */
 
 #define G_AUTOPACK_BIT                  0
Index: source/blender/blenlib/BLI_arithb.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/blenlib/BLI_arithb.h,v
retrieving revision 1.10
diff -u -r1.10 BLI_arithb.h
--- source/blender/blenlib/BLI_arithb.h	13 Jul 2004 11:48:49 -0000	1.10
+++ source/blender/blenlib/BLI_arithb.h	5 Oct 2004 12:53:22 -0000
@@ -546,6 +546,12 @@
 	short axis, 
 	short upflag
 );
+	float
+VecAngle3(
+	float *v1, 
+	float *v2,
+	float *v3
+);
 
 	void 
 i_lookat(
Index: source/blender/blenlib/intern/arithb.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/blenlib/intern/arithb.c,v
retrieving revision 1.12
diff -u -r1.12 arithb.c
--- source/blender/blenlib/intern/arithb.c	13 Jul 2004 11:48:49 -0000	1.12
+++ source/blender/blenlib/intern/arithb.c	5 Oct 2004 12:53:24 -0000
@@ -2065,6 +2065,17 @@
 	}
 }
 
+float VecAngle3( float *v1, float *v2, float *v3)  /* Return the angle between vec 1&2 and vec 1&3 */
+{
+	float vec1[3], vec2[3];
+
+	VecSubf(vec1, v2, v1);
+	VecSubf(vec2, v3, v1);
+	Normalise(vec1);
+	Normalise(vec2);
+	return saacos(vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]) * 57.295779;
+}
+
 void euler_rot(float *beul, float ang, char axis)
 {
 	float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];

Index: source/blender/src/buttons_editing.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/buttons_editing.c,v
retrieving revision 1.71
diff -u -r1.71 buttons_editing.c
--- source/blender/src/buttons_editing.c	29 Sep 2004 21:44:12 -0000	1.71
+++ source/blender/src/buttons_editing.c	5 Oct 2004 12:53:31 -0000
@@ -2076,20 +2076,27 @@
 	if(uiNewPanel(curarea, block, "Mesh Tools 1", "Editing", 960, 0, 318, 204)==0) return;
 
 	uiBlockBeginAlign(block);
-	uiDefBut(block, BUT,B_DOCENTRE, "Centre",		1091, 200, 166, 19, 0, 0, 0, 0, 0, "Shifts object data to be centered about object's origin");
-	uiDefBut(block, BUT,B_HIDE,		"Hide",			1091, 180,  77, 19, 0, 0, 0, 0, 0, "Hides selected faces");
-	uiDefBut(block, BUT,B_REVEAL,	"Reveal",		1171, 180,  86, 19, 0, 0, 0, 0, 0, "Reveals selected faces");
-	uiDefBut(block, BUT,B_SELSWAP,	"Select Swap",	1091, 160, 166, 19, 0, 0, 0, 0, 0, "Selects unselected faces, and deselects selected faces");
+	uiDefBut(block, BUT,B_DOCENTRE, "Centre",		955, 200, 320, 19, 0, 0, 0, 0, 0, "Shifts object data to be centered about object's origin");
+	uiDefBut(block, BUT,B_HIDE,		"Hide",		955, 180,  160, 19, 0, 0, 0, 0, 0, "Hides selected faces");
+	uiDefBut(block, BUT,B_REVEAL,	"Reveal",		1115, 180,  160, 19, 0, 0, 0, 0, 0, "Reveals selected faces");
+	uiDefBut(block, BUT,B_SELSWAP,	"Select Swap",		955, 160, 320, 19, 0, 0, 0, 0, 0, "Selects unselected faces, and deselects selected faces");
 	uiBlockEndAlign(block);
-
+	
 	uiBlockBeginAlign(block);
-	uiDefButF(block, NUM,		  REDRAWVIEW3D, "NSize:",		1090, 131, 166, 19, &editbutsize, 0.001, 2.0, 10, 0, "Sets the length to use when displaying face normals");
-	uiDefButI(block, TOG|BIT|6, REDRAWVIEW3D, "Draw Normals",	1090,110,166,19, &G.f, 0, 0, 0, 0, "Displays face normals as lines");
-	uiDefButI(block, TOG|BIT|7, REDRAWVIEW3D, "Draw Faces",		1090,88,166,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
-	uiDefButI(block, TOG|BIT|18, B_DRAWEDGES, "Draw Edges", 	1090,66,166,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights");
-	uiDefButI(block, TOG|BIT|19, B_DRAWCREASES, "Draw Creases",	1090,44,166,19, &G.f, 0, 0, 0, 0, "Displays creased edges using hilights");
-	uiDefButI(block, TOG|BIT|20, REDRAWVIEW3D, "Draw Seams",	1090,22,166,19, &G.f, 0, 0, 0, 0, "Displays UV unwrapping seams");
-	uiDefButI(block, TOG|BIT|11, 0, "All Edges",				1090, 0,166,19, &G.f, 0, 0, 0, 0, "Displays all edges in object mode without optimization");
+	uiDefButF(block, NUM,		  REDRAWVIEW3D, "NSize:",	955, 131, 150, 19, &editbutsize, 0.001, 2.0, 10, 0, "Sets the length to use when displaying face normals");
+	uiDefButI(block, TOG|BIT|6, REDRAWVIEW3D, "Draw Normals",	955,110,150,19, &G.f, 0, 0, 0, 0, "Displays face normals as lines");
+	uiDefButI(block, TOG|BIT|7, REDRAWVIEW3D, "Draw Faces",		955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
+	uiDefButI(block, TOG|BIT|18, REDRAWVIEW3D, "Draw Edges", 	955,66,150,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights");
+	uiDefButI(block, TOG|BIT|19, REDRAWVIEW3D, "Draw Creases",	955,44,150,19, &G.f, 0, 0, 0, 0, "Displays face normals as lines");
+	uiDefButI(block, TOG|BIT|20, REDRAWVIEW3D, "Draw Seams",	955,22,150,19, &G.f, 0, 0, 0, 0, "Displays UV unwrapping seams");
+	uiDefButI(block, TOG|BIT|11, 0, "All Edges",			955, 0,150,19, &G.f, 0, 0, 0, 0, "Displays all edges in object mode without optimization");
+	uiBlockEndAlign(block);
+	
+	/* Teach drawing options */
+	uiBlockBeginAlign(block);
+	uiDefButI(block, TOG|BIT|22, REDRAWVIEW3D, "Edge Length",	1125,131,150,19, &G.f, 0, 0, 0, 0, "Displays edge lengths");
+	uiDefButI(block, TOG|BIT|23, REDRAWVIEW3D, "Face Area",		1125,110,150,19, &G.f, 0, 0, 0, 0, "Displays the area of faces");
+	uiDefButI(block, TOG|BIT|24, REDRAWVIEW3D, "Face Angles",	1125,88,150,19, &G.f, 0, 0, 0, 0, "Displays the angles in the faces in degrees");
 	uiBlockEndAlign(block);
 
 }
Index: source/blender/src/drawobject.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/drawobject.c,v
retrieving revision 1.110
diff -u -r1.110 drawobject.c
--- source/blender/src/drawobject.c	1 Oct 2004 14:04:17 -0000	1.110
+++ source/blender/src/drawobject.c	5 Oct 2004 12:53:35 -0000
@@ -94,6 +94,7 @@
 #include "BIF_editmesh.h"
 #include "BIF_glutil.h"
 #include "BIF_resources.h"
+#include "BIF_language.h"
 
 #include "BDR_drawmesh.h"
 #include "BDR_drawobject.h"
@@ -2655,7 +2656,11 @@
 	EditFace *efa;
 	float fvec[3], *f1, *f2, *f3, *f4, *extverts=NULL;
 	int a, start, end, test, ok, optimal=0;
-
+	
+	/* For drawing measurements */
+	char val[32]; /* Stores the measurement display text here */
+	float area;	
+	
 	me= get_mesh(ob);
 
 	if(ob==G.obedit || (G.obedit && ob->data==G.obedit->data)) {
@@ -2784,8 +2789,143 @@
 
 			glEnd();
 		}
-	}
-	else { /* Object mode draw */
+		
+		/* Draw Edge Lengths */
+		if(G.f & G_DRAW_EDGLEN) {	/* normals */
+			/* Now Draw distance */
+			BIF_ThemeColor(TH_TEXT);
+			glDisable(GL_DEPTH_TEST);			
+			eed= em->edges.first;
+			while(eed) {
+				if(  eed->h==0 && eed->h==0 &&
+					(eed->v1->f & 1 || eed->v2->f & 1) ) {
+					
+					sprintf(val,"%.3f",
+						sqrt((eed->v2->co[0] - eed->v1->co[0])*(eed->v2->co[0] - eed->v1->co[0])
+							+ (eed->v2->co[1] - eed->v1->co[1])*(eed->v2->co[1] - eed->v1->co[1])
+							+ (eed->v2->co[2] - eed->v1->co[2])*(eed->v2->co[2] - eed->v1->co[2])));
+					
+					glRasterPos3f( (eed->v1->co[0]+eed->v2->co[0])/2,  (eed->v1->co[1]+eed->v2->co[1])/2,  (eed->v1->co[2]+eed->v2->co[2])/2);
+					/* Draw the length to the screen */
+					BIF_DrawString( G.fonts, val, 0);
+						
+				}
+				eed= eed->next;
+			}
+		}
+			
+		/* Draw Face Areas */
+		if(G.f & G_DRAW_FACEAREA) {
+	
+			BIF_ThemeColor(TH_TEXT);
+			glDisable(GL_DEPTH_TEST);
+			efa= em->faces.first;
+			while(efa) {
+				if(efa->v1->h==0 && efa->v2->h==0 && efa->v3->h==0 && (efa->v4==NULL || efa->v4->h==0)) {
+					if((efa->v1->f & 1 || efa->v2->f & 1 || efa->v3->f & 1) && (efa->v4==NULL || efa->v4->f & 1) ) {
+						/* Calculate the area of 4 vert face f1 is the area*/
+						if (efa->v4) {
+							area=  AreaT3Dfl( efa->v1->co, efa->v2->co, efa->v3->co);
+							area+= AreaT3Dfl( efa->v1->co, efa->v3->co, efa->v4->co);
+							CalcCent4f(fvec, efa->v1->co, efa->v2->co, efa->v3->co, efa->v4->co);
+						} else { /* Calculate the area of 3 verts */          
+							area = AreaT3Dfl( efa->v1->co, efa->v2->co, efa->v3->co);
+							CalcCent3f(fvec, efa->v1->co, efa->v2->co, efa->v3->co);
+						}              
+					sprintf(val,"%.3f", area);
+					glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+					BIF_DrawString( G.fonts, val, 0);
+					}
+				}
+				efa= efa->next;
+			}
+			glEnable(GL_DEPTH_TEST);
+		}
+		
+		/* Draw Face Angles */
+		if(G.f & G_DRAW_FACEANG) {
+	
+			BIF_ThemeColor(TH_TEXT);
+			glDisable(GL_DEPTH_TEST);
+			efa= em->faces.first;
+			while(efa) {
+				if(efa->v1->h==0 && efa->v2->h==0 && efa->v3->h==0 && (efa->v4==NULL || efa->v4->h==0)) {
+					
+					/* Calculate the area of 4 vert face */
+					if (efa->v4) {
+						/*Vec 1*/
+						if (efa->v1->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v1->co,efa->v2->co,efa->v4->co));
+							fvec[0] = (efa->v1->co[0]*20 + efa->v2->co[0] + efa->v3->co[0] + efa->v4->co[0]) / 23;
+							fvec[1] = (efa->v1->co[1]*20 + efa->v2->co[1] + efa->v3->co[1] + efa->v4->co[1]) / 23;
+							fvec[2] = (efa->v1->co[2]*20 + efa->v2->co[2] + efa->v3->co[2] + efa->v4->co[2]) / 23;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);
+						}
+						/*Vec 2*/
+						if (efa->v2->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v2->co,efa->v1->co,efa->v3->co));
+							fvec[0] = (efa->v2->co[0]*20 + efa->v1->co[0] + efa->v3->co[0] + efa->v4->co[0]) / 23;
+							fvec[1] = (efa->v2->co[1]*20 + efa->v1->co[1] + efa->v3->co[1] + efa->v4->co[1]) / 23;
+							fvec[2] = (efa->v2->co[2]*20 + efa->v1->co[2] + efa->v3->co[2] + efa->v4->co[2]) / 23;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);
+						}
+						/*Vec 3*/
+						if (efa->v3->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v3->co,efa->v2->co,efa->v4->co));
+							fvec[0] = (efa->v3->co[0]*20 + efa->v2->co[0] + efa->v1->co[0] + efa->v4->co[0]) / 23;
+							fvec[1] = (efa->v3->co[1]*20 + efa->v2->co[1] + efa->v1->co[1] + efa->v4->co[1]) / 23;
+							fvec[2] = (efa->v3->co[2]*20 + efa->v2->co[2] + efa->v1->co[2] + efa->v4->co[2]) / 23;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);
+						}
+						/*Vec 4*/
+						if (efa->v4->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v4->co,efa->v1->co,efa->v3->co));
+							fvec[0] = (efa->v4->co[0]*20 + efa->v2->co[0] + efa->v3->co[0] + efa->v1->co[0]) / 23;
+							fvec[1] = (efa->v4->co[1]*20 + efa->v2->co[1] + efa->v3->co[1] + efa->v1->co[1]) / 23;
+							fvec[2] = (efa->v4->co[2]*20 + efa->v2->co[2] + efa->v3->co[2] + efa->v1->co[2]) / 23;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);
+						}
+					} else { /* we have 3 verts in the face */
+					
+						/*Vec 1*/
+						if (efa->v1->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v1->co,efa->v2->co,efa->v3->co));
+							fvec[0] = (efa->v1->co[0]*15 + efa->v2->co[0] + efa->v3->co[0]) / 17;
+							fvec[1] = (efa->v1->co[1]*15 + efa->v2->co[1] + efa->v3->co[1]) / 17;
+							fvec[2] = (efa->v1->co[2]*15 + efa->v2->co[2] + efa->v3->co[2]) / 17;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);
+						}
+						/*Vec 2*/
+						if (efa->v2->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v2->co,efa->v1->co,efa->v3->co));
+							fvec[0] = (efa->v2->co[0]*15 + efa->v1->co[0] + efa->v3->co[0]) / 17;
+							fvec[1] = (efa->v2->co[1]*15 + efa->v1->co[1] + efa->v3->co[1]) / 17;
+							fvec[2] = (efa->v2->co[2]*15 + efa->v1->co[2] + efa->v3->co[2]) / 17;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);         
+						}
+						/*Vec 3*/
+						if (efa->v3->f & 1) {
+							sprintf(val,"%.3f", VecAngle3(efa->v3->co,efa->v2->co,efa->v1->co));
+							fvec[0] = (efa->v3->co[0]*15 + efa->v2->co[0] + efa->v1->co[0]) / 17;
+							fvec[1] = (efa->v3->co[1]*15 + efa->v2->co[1] + efa->v1->co[1]) / 17;
+							fvec[2] = (efa->v3->co[2]*15 + efa->v2->co[2] + efa->v1->co[2]) / 17;
+							glRasterPos3f(fvec[0], fvec[1], fvec[2]);
+							BIF_DrawString( G.fonts, val, 0);
+						}
+					}
+				}
+			efa= efa->next;
+			}
+		glEnable(GL_DEPTH_TEST);
+		}    
+		
+	} else { /* Object mode draw */
 		
 		if(me==NULL) return;
 		


More information about the Bf-committers mailing list