[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12010] trunk/blender/source/blender: Added active drawing in editmode (may need some more work), this hilightes the last selected vert/edge/face, which is needed for moving some of the UV tools into editmode.

Campbell Barton cbarton at metavr.com
Tue Sep 11 16:36:03 CEST 2007


Revision: 12010
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12010
Author:   campbellbarton
Date:     2007-09-11 16:36:03 +0200 (Tue, 11 Sep 2007)

Log Message:
-----------
Added active drawing in editmode (may need some more work), this hilightes the last selected  vert/edge/face, which is needed for moving some of the UV tools into editmode.

Added copy menu for editmode for copying from the active faces material, image, UV's vcols etc,
improved on the current vertex color copy by averaging the 4th color when copying color from a tri to a quad.

And added edge crease and length copy

cerrently verts dont have a copy menu but eventually copy weights would be good.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_editmesh.h
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/drawobject.c
    trunk/blender/source/blender/src/editmesh_mods.c
    trunk/blender/source/blender/src/editobject.c

Modified: trunk/blender/source/blender/include/BIF_editmesh.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editmesh.h	2007-09-11 10:22:00 UTC (rev 12009)
+++ trunk/blender/source/blender/include/BIF_editmesh.h	2007-09-11 14:36:03 UTC (rev 12010)
@@ -219,6 +219,7 @@
 extern void fill_mesh(void);
 extern void bevel_menu();
 extern void mesh_set_smooth_faces(short event);
+void mesh_copy_menu(void);
 void edge_rotate_selected(int dir);
 int EdgeSlide(short immediate, float imperc);
 int EdgeLoopDelete(void);

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c	2007-09-11 10:22:00 UTC (rev 12009)
+++ trunk/blender/source/blender/src/buttons_editing.c	2007-09-11 14:36:03 UTC (rev 12010)
@@ -5484,7 +5484,6 @@
 		} else {
 			if(FACESEL_PAINT_TEST) {
 				editing_panel_mesh_texface();
-				editing_panel_mesh_uvautocalculation(); /* draw hidden edge option from this needs to be elsewhere */
 			}
 			if(G.f & (G_VERTEXPAINT | G_TEXTUREPAINT | G_WEIGHTPAINT) ) {
 				editing_panel_mesh_paint();

Modified: trunk/blender/source/blender/src/drawobject.c
===================================================================
--- trunk/blender/source/blender/src/drawobject.c	2007-09-11 10:22:00 UTC (rev 12009)
+++ trunk/blender/source/blender/src/drawobject.c	2007-09-11 14:36:03 UTC (rev 12010)
@@ -2037,6 +2037,129 @@
 		if(em->vnode && (G.f & G_DRAW_VERSE_DEBUG))
 			draw_verse_debug(ob, em);
 #endif
+		
+		/* Draw active editmode vertex edge of face (if any)*/
+		if (em->selected.last) {
+			EditSelection *ese = em->selected.last;
+		
+			if(ese->type == EDITVERT) {
+				EditVert *ev = (EditVert*)ese->data;
+				float size = BIF_GetThemeValuef(TH_VERTEX_SIZE)*4;
+				
+				glEnable(GL_BLEND);
+				glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+				glDepthMask(0);
+				glColor4ub(255,255,255,64);
+				glPointSize(size);
+				
+				glBegin(GL_POINTS);
+				glVertex3fv(ev->co);
+				glEnd();
+				
+				glPointSize(1.0);
+				
+				glDisable(GL_BLEND);
+				glDepthMask(1);
+				
+			} else if(ese->type == EDITEDGE) {
+				EditEdge *eed = (EditEdge*)ese->data;
+				glEnable(GL_BLEND);
+				glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+				glDepthMask(0);
+				glColor4ub(255,255,255,128);
+				
+				glLineWidth(2.0);
+				
+				glBegin(GL_LINES);
+				glVertex3fv(eed->v1->co);
+				glVertex3fv(eed->v2->co);
+				glEnd();
+				
+				glLineWidth(1.0);
+
+				glDisable(GL_BLEND);
+				glDepthMask(1);
+				
+				
+			} else if(ese->type == EDITFACE) {
+				EditFace *efa = (EditEdge*)ese->data;
+				
+				/*  repeate this pattern
+				   X000X000 
+				   00000000 
+				   00X000X0 
+				   00000000 */
+				
+				GLubyte stipplepattern[32*32/8] = {
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0,
+					136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0
+				};
+				
+				glEnable(GL_BLEND);
+				glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+				glDepthMask(0);
+				glColor4ub(255,255,255,64);
+				
+	  			glEnable(GL_POLYGON_STIPPLE);
+	  			glPolygonStipple(stipplepattern);
+	  			
+				glDisable(GL_LIGHTING);
+				if (((EditFace*)ese->data)->v4) {
+					glBegin(GL_QUADS);
+					glVertex3fv(efa->v1->co);
+					glVertex3fv(efa->v2->co);
+					glVertex3fv(efa->v3->co);
+					glVertex3fv(efa->v4->co);
+					glEnd();
+				} else {
+					glBegin(GL_TRIANGLES);
+					glVertex3fv(efa->v1->co);
+					glVertex3fv(efa->v2->co);
+					glVertex3fv(efa->v3->co);
+					glEnd();
+				}
+				glDisable(GL_POLYGON_STIPPLE);
+				
+				glLineWidth(1.0);
+				glBegin(GL_LINES);
+				
+				glColor4ub(0,	255,0,	128);
+				glVertex3fv(efa->v1->co);
+				glVertex3fv(efa->v2->co);
+				
+				
+				glColor4ub(0,	0,	255,128);
+				glVertex3fv(efa->v2->co);
+				glVertex3fv(efa->v3->co);
+				
+				
+				glColor4ub(255,	255,0,	128);
+				if (efa->v4) {
+					glVertex3fv(efa->v3->co);
+					glVertex3fv(efa->v4->co);
+					
+					
+					glColor4ub(255,	0,	0,	128);
+					glVertex3fv(efa->v4->co);
+					glVertex3fv(efa->v1->co);
+				} else {
+					glVertex3fv(efa->v3->co);
+					glVertex3fv(efa->v1->co);
+				}
+				glEnd();
+				glLineWidth(1.0);
+				
+				glDisable(GL_BLEND);					
+				glDepthMask(1);
+			}
+		}
+		
 	}
 
 	if(dt>OB_WIRE) {

Modified: trunk/blender/source/blender/src/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_mods.c	2007-09-11 10:22:00 UTC (rev 12009)
+++ trunk/blender/source/blender/src/editmesh_mods.c	2007-09-11 14:36:03 UTC (rev 12010)
@@ -1345,7 +1345,212 @@
 	}
 }
 
+/* ctrl+c in mesh editmode */
+void mesh_copy_menu(void)
+{
+	EditMesh *em = G.editMesh;
+	EditSelection *ese;
+	short ret, change=0;
+	
+	if (!em) return;
+	
+	ese = em->selected.last;
+	
+	if (!ese) return;
+	
+	if(ese->type == EDITVERT) {
+		EditVert *ev, *ev_act = (EditVert*)ese->data;
+		/*ret= pupmenu("");*/
+	} else if(ese->type == EDITEDGE) {
+		EditEdge *eed, *eed_act = (EditEdge*)ese->data;
+		float vec[3], vec_mid[3], eed_len, eed_len_act;
+		
+		ret= pupmenu("Copy Active Edge to Selected%t|Crease%x1|Length%x2");
+		if (ret<1) return;
+		
+		eed_len_act = VecLenf(eed_act->v1->co, eed_act->v2->co);
+		
+		switch (ret) {
+		case 1: /* copy crease */
+			for(eed=em->edges.first; eed; eed=eed->next) {
+				if (eed->f & SELECT && eed != eed_act && eed->crease != eed_act->crease) {
+					eed->crease = eed_act->crease;
+					change = 1;
+				}
+			}
+			break;
+			
+		case 2: /* copy length */
+			
+			for(eed=em->edges.first; eed; eed=eed->next) {
+				if (eed->f & SELECT && eed != eed_act) {
+					
+					eed_len = VecLenf(eed->v1->co, eed->v2->co);
+					
+					if (eed_len == eed_len_act) continue;
+					/* if this edge is zero length we cont do anything with it*/
+					if (eed_len == 0.0f) continue;
+					if (eed_len_act == 0.0f) {
+						VecAddf(vec_mid, eed->v1->co, eed->v2->co);
+						VecMulf(vec_mid, 0.5);
+						VECCOPY(eed->v1->co, vec_mid);
+						VECCOPY(eed->v2->co, vec_mid);
+					} else {
+						/* copy the edge length */
+						VecAddf(vec_mid, eed->v1->co, eed->v2->co);
+						VecMulf(vec_mid, 0.5);
+						
+						/* SCALE 1 */
+						VecSubf(vec, eed->v1->co, vec_mid);
+						VecMulf(vec, eed_len_act/eed_len);
+						VecAddf(eed->v1->co, vec, vec_mid);
+						
+						/* SCALE 2 */
+						VecSubf(vec, eed->v2->co, vec_mid);
+						VecMulf(vec, eed_len_act/eed_len);
+						VecAddf(eed->v2->co, vec, vec_mid);
+					}
+					
+					change = 1;
+				}
+			}
+			break;
+		}
+		
+	} else if(ese->type == EDITFACE) {
+		EditFace *efa, *efa_act = (EditFace*)ese->data;
+		MTFace *tf, *tf_act;
+		MCol *mcol, *mcol_act;
+		
+		ret= pupmenu("Copy Active Face to Selected%t|Material%x1|Image%x2|UV Coords%x3|Mode%x4|Transp%x5|Vertex Colors%x6");
+		if (ret<1) return;
+		
+		tf_act =	CustomData_em_get(&em->fdata, efa_act->data, CD_MTFACE);
+		mcol_act =	CustomData_em_get(&em->fdata, efa_act->data, CD_MCOL);
+		
+		switch (ret) {
+		case 1: /* copy material */
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT && efa->mat_nr != efa_act->mat_nr) {
+					efa->mat_nr = efa_act->mat_nr;
+					change = 1;
+				}
+			}
+			break;
+		case 2:	/* copy image */
+			if (!tf_act) {
+				error("mesh has no uv/image layers");
+				return;
+			}
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT && efa != efa_act) {
+					tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					if (tf_act->tpage) {
+						tf->tpage = tf_act->tpage;
+						tf->mode |= TF_TEX;
+					} else {
+						tf->tpage = NULL;
+						tf->mode &= ~TF_TEX;
+					}
+					tf->tile= tf_act->tile;
+					change = 1;
+				}
+			}
+			break;
+			
+		case 3: /* copy UV's */
+			if (!tf_act) {
+				error("mesh has no uv/image layers");
+				return;
+			}
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT && efa != efa_act) {
+					tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					memcpy(tf->uv, tf_act->uv, sizeof(tf->uv));
+					change = 1;
+				}
+			}
+			break;
+		case 4: /* mode's */
+			if (!tf_act) error("mesh has no uv/image layers");
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT && efa != efa_act) {
+					tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					tf->mode= tf_act->mode;
+					change = 1;
+				}
+			}
+			break;
+		case 5: /* copy transp's */
+			if (!tf_act) {
+				error("mesh has no uv/image layers");
+				return;
+			}
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT && efa != efa_act) {
+					tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					tf->transp= tf_act->transp;
+					change = 1;
+				}
+			}
+			break;
+			
+		case 6: /* copy vcols's */
+			if (!mcol_act) {
+				error("mesh has no color layers");
+				return;
+			} else {
+				/* guess teh 4th color if needs be */
+				char r,g,b;
+				float val =- 1;
+				
+				if (!efa_act->v4) {
+					/* guess the othe vale, we may need to use it */
+					val = ((float)(mcol_act->r +  (mcol_act+1)->r + (mcol_act+2)->r)) / 3; CLAMP(val, 0, 255);
+					r = (char)val;
+					
+					val = ((float)(mcol_act->g +  (mcol_act+1)->g + (mcol_act+2)->g)) / 3; CLAMP(val, 0, 255);
+					g = (char)val;
+					
+					val = ((float)(mcol_act->b +  (mcol_act+1)->b + (mcol_act+2)->b)) / 3; CLAMP(val, 0, 255);
+					b = (char)val;
+				} 
+				
+				
+				for(efa=em->faces.first; efa; efa=efa->next) {
+					if (efa->f & SELECT && efa != efa_act) {
+						/* TODO - make copy from tri to quad guess the 4th vert */
+						mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+						memcpy(mcol, mcol_act, sizeof(MCol)*4);
+						
+						if (!efa_act->v4 && efa->v4) {
+							/* guess the 4th color */
+							(mcol+3)->r = r;
+							(mcol+3)->g = g;
+							(mcol+3)->b = b;
+						}
+						
+						change = 1;
+					}
+				}
+			}
+			
+			break;
+		}
+	}
+	
+	if (change) {
+		allqueue(REDRAWVIEW3D, 0);
+		allqueue(REDRAWBUTSEDIT, 0);
+		
+		if(ese->type == EDITVERT)		BIF_undo_push("Copy Vert Attribute");
+		else if (ese->type == EDITEDGE)	BIF_undo_push("Copy Edge Attribute");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list