[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12017] trunk/blender/source/blender: * added functions to copy between UV and vertex color layers.

Campbell Barton cbarton at metavr.com
Wed Sep 12 04:13:36 CEST 2007


Revision: 12017
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12017
Author:   campbellbarton
Date:     2007-09-12 04:13:35 +0200 (Wed, 12 Sep 2007)

Log Message:
-----------
* added functions to copy between UV and vertex color layers.
* added CustomData_set_layer_active_index and CustomData_set_layer_render_index
  since they did not accept values from CustomData_get_active_layer_index and CustomData_get_render_layer_index
* fixed some warnings
* made the colored edge in active face draw mode only display when texture mode enabled.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_customdata.h
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/src/drawobject.c
    trunk/blender/source/blender/src/editmesh_mods.c
    trunk/blender/source/blender/src/unwrapper.c

Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_customdata.h	2007-09-12 01:56:50 UTC (rev 12016)
+++ trunk/blender/source/blender/blenkernel/BKE_customdata.h	2007-09-12 02:13:35 UTC (rev 12017)
@@ -207,6 +207,10 @@
 void CustomData_set_layer_active(struct CustomData *data, int type, int n);
 void CustomData_set_layer_render(struct CustomData *data, int type, int n);
 
+/* same as above but works with an index from CustomData_get_layer_index */
+void CustomData_set_layer_active_index(struct CustomData *data, int type, int n);
+void CustomData_set_layer_render_index(struct CustomData *data, int type, int n);
+
 /* adds flag to the layer flags */
 void CustomData_set_layer_flag(struct CustomData *data, int type, int flag);
 

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2007-09-12 01:56:50 UTC (rev 12016)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2007-09-12 02:13:35 UTC (rev 12017)
@@ -563,7 +563,26 @@
 			data->layers[i].active_rnd = n;
 }
 
+/* for using with an index from CustomData_get_active_layer_index and CustomData_get_render_layer_index */
+void CustomData_set_layer_active_index(CustomData *data, int type, int n)
+{
+	int i;
 
+	for(i=0; i < data->totlayer; ++i)
+		if(data->layers[i].type == type)
+			data->layers[i].active = n-i;
+}
+
+void CustomData_set_layer_render_index(CustomData *data, int type, int n)
+{
+	int i;
+
+	for(i=0; i < data->totlayer; ++i)
+		if(data->layers[i].type == type)
+			data->layers[i].active_rnd = n-i;
+}
+
+
 void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
 {
 	int i;

Modified: trunk/blender/source/blender/src/drawobject.c
===================================================================
--- trunk/blender/source/blender/src/drawobject.c	2007-09-12 01:56:50 UTC (rev 12016)
+++ trunk/blender/source/blender/src/drawobject.c	2007-09-12 02:13:35 UTC (rev 12017)
@@ -2126,34 +2126,32 @@
 				}
 				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) {
+				if (G.vd->drawtype==OB_TEXTURE) {
+					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);
-					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);
+					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();
 				}
-				glEnd();
-				glLineWidth(1.0);
 				
 				glDisable(GL_BLEND);					
 				glDepthMask(1);

Modified: trunk/blender/source/blender/src/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_mods.c	2007-09-12 01:56:50 UTC (rev 12016)
+++ trunk/blender/source/blender/src/editmesh_mods.c	2007-09-12 02:13:35 UTC (rev 12017)
@@ -1345,6 +1345,28 @@
 	}
 }
 
+
+static short customdata_layers_menu(CustomData *data, int type) {
+	int i, ret;
+	char *str;
+	char *str_pt;
+	CustomDataLayer *layer;
+	
+	
+	str = str_pt = MEM_callocN(40 * G.editMesh->fdata.totlayer, "layer menu");
+	
+	/* see if there is a duplicate */
+	for(i=0; i<data->totlayer; i++) {
+		layer = &data->layers[i];
+		if(layer->type == type) {
+			str_pt += sprintf(str_pt, "%s%%x%d|", layer->name, i);
+		}
+	}
+	ret = pupmenu(str);
+	MEM_freeN(str);
+	return ret;
+}
+
 /* ctrl+c in mesh editmode */
 void mesh_copy_menu(void)
 {
@@ -1359,8 +1381,8 @@
 	if (!ese) return;
 	
 	if(ese->type == EDITVERT) {
-		EditVert *ev, *ev_act = (EditVert*)ese->data;
-		/*ret= pupmenu("");*/
+		/*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;
@@ -1410,10 +1432,14 @@
 						VecMulf(vec, eed_len_act/eed_len);
 						VecAddf(eed->v2->co, vec, vec_mid);
 					}
-					
 					change = 1;
 				}
 			}
+			
+			if (change)
+				recalc_editnormals();
+			
+			
 			break;
 		}
 		
@@ -1422,7 +1448,16 @@
 		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");
+		ret= pupmenu(
+			"Copy Face Selected%t|"
+			"Active Material%x1|Active Image%x2|Active UV Coords%x3|"
+			"Active Mode%x4|Active Transp%x5|Active Vertex Colors%x6|%l|"
+			
+			"TexFace UVs from layer%x7|"
+			"TexFace Images from layer%x8|"
+			"TexFace All from layer%x9|"
+			"Vertex Colors from layer%x10");
+		
 		if (ret<1) return;
 		
 		tf_act =	CustomData_em_get(&em->fdata, efa_act->data, CD_MTFACE);
@@ -1472,7 +1507,10 @@
 			}
 			break;
 		case 4: /* mode's */
-			if (!tf_act) error("mesh has no uv/image layers");
+			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);
@@ -1501,19 +1539,22 @@
 				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 */
+					/* guess the othe vale, we may need to use it
+					 * 
+					 * Modifying the 4th value of the mcol is ok here since its not seen
+					 * on a triangle
+					 * */
 					val = ((float)(mcol_act->r +  (mcol_act+1)->r + (mcol_act+2)->r)) / 3; CLAMP(val, 0, 255);
-					r = (char)val;
+					(mcol_act+3)->r = (char)val;
 					
 					val = ((float)(mcol_act->g +  (mcol_act+1)->g + (mcol_act+2)->g)) / 3; CLAMP(val, 0, 255);
-					g = (char)val;
+					(mcol_act+3)->g = (char)val;
 					
 					val = ((float)(mcol_act->b +  (mcol_act+1)->b + (mcol_act+2)->b)) / 3; CLAMP(val, 0, 255);
-					b = (char)val;
+					(mcol_act+3)->b = (char)val;
 				} 
 				
 				
@@ -1521,22 +1562,134 @@
 					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;
-						}
-						
+						memcpy(mcol, mcol_act, sizeof(MCol)*4);	
 						change = 1;
 					}
 				}
 			}
 			
 			break;
+		
+		
+		/* copy from layer */
+		case 7:
+		case 8:
+		case 9:
+			if (!tf_act) {
+				error("mesh has no uv/image layers");
+				return;
+			} else if (CustomData_number_of_layers(&em->fdata, CD_MTFACE)<2) {
+				error("mesh does not have multiple uv/image layers");
+				return;
+			} else {
+				int layer_orig_idx, layer_idx;
+				
+				layer_idx = (int)customdata_layers_menu(&em->fdata, CD_MTFACE);
+				if (layer_idx<0) return;
+				
+				/* warning, have not updated mesh pointers however this is not needed since we swicth back */
+				layer_orig_idx = CustomData_get_active_layer_index(&em->fdata, CD_MTFACE);
+				if (layer_idx==layer_orig_idx)
+					return;
+				
+				/* get the tfaces */
+				CustomData_set_layer_active_index(&em->fdata, CD_MTFACE, (int)layer_idx);
+				/* store the tfaces in our temp */
+				for(efa=em->faces.first; efa; efa=efa->next) {
+					if (efa->f & SELECT) {
+						efa->tmp.p = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					}	
+				}
+				CustomData_set_layer_active_index(&em->fdata, CD_MTFACE, layer_orig_idx);
+			}
+			break;
+			
+		case 10: /* select vcol layers - make sure this stays in sync with above code */
+			if (!mcol_act) {
+				error("mesh has no color layers");
+				return;
+			} else if (CustomData_number_of_layers(&em->fdata, CD_MCOL)<2) {
+				error("mesh does not have multiple color layers");
+				return;
+			} else {
+				int layer_orig_idx, layer_idx;
+				
+				layer_idx = (int)customdata_layers_menu(&em->fdata, CD_MCOL);
+				if (layer_idx<0) return;
+				
+				/* warning, have not updated mesh pointers however this is not needed since we swicth back */
+				layer_orig_idx = CustomData_get_active_layer_index(&em->fdata, CD_MCOL);
+				if (layer_idx==layer_orig_idx)
+					return;
+				
+				/* get the tfaces */
+				CustomData_set_layer_active_index(&em->fdata, CD_MCOL, (int)layer_idx);
+				/* store the tfaces in our temp */
+				for(efa=em->faces.first; efa; efa=efa->next) {
+					if (efa->f & SELECT) {
+						efa->tmp.p = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+					}	
+				}
+				CustomData_set_layer_active_index(&em->fdata, CD_MCOL, layer_orig_idx);
+				
+			}
+			break;
 		}
+		
+		/* layer copy only - sanity checks done above */
+		switch (ret) {
+		case 7: /* copy UV's only */
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT) {
+					tf_act = (MTFace *)efa->tmp.p; /* not active but easier to use this way */
+					tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					memcpy(tf->uv, tf_act->uv, sizeof(tf->uv));
+					change = 1;
+				}
+			}
+			break;
+		case 8: /* copy image settings only */
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT) {
+					tf_act = (MTFace *)efa->tmp.p; /* not active but easier to use this way */
+					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 9: /* copy all tface info */
+			for(efa=em->faces.first; efa; efa=efa->next) {
+				if (efa->f & SELECT) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list