[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12087] trunk/blender/source/blender: fixed copy between UV layers.

Campbell Barton cbarton at metavr.com
Tue Sep 18 21:39:26 CEST 2007


Revision: 12087
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12087
Author:   campbellbarton
Date:     2007-09-18 21:39:25 +0200 (Tue, 18 Sep 2007)

Log Message:
-----------
fixed copy between UV layers.
made the UV layer menu a generic functions (can make a menu from the names of any custimdata layer type)
added a menu in the UV window for selecting teh editnmode UV layer - If there ends up not being enough room in the header this may need to be removed.

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

Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_customdata.h	2007-09-18 14:34:17 UTC (rev 12086)
+++ trunk/blender/source/blender/blenkernel/BKE_customdata.h	2007-09-18 19:39:25 UTC (rev 12087)
@@ -185,6 +185,8 @@
 int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name);
 int CustomData_get_active_layer_index(const struct CustomData *data, int type);
 int CustomData_get_render_layer_index(const struct CustomData *data, int type);
+int CustomData_get_active_layer(const struct CustomData *data, int type);
+int CustomData_get_render_layer(const struct CustomData *data, int type);
 
 /* copies the data from source to the data element at index in the first
  * layer of type

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2007-09-18 14:34:17 UTC (rev 12086)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2007-09-18 19:39:25 UTC (rev 12087)
@@ -110,6 +110,14 @@
 UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v);
 void free_uv_vert_map(UvVertMap *vmap);
 
+
+/* functions for making menu's from customdata layers */
+int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
+void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
+int mesh_layers_menu(struct CustomData *data, int type);
+
+
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2007-09-18 14:34:17 UTC (rev 12086)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2007-09-18 19:39:25 UTC (rev 12087)
@@ -545,6 +545,29 @@
 	return -1;
 }
 
+int CustomData_get_active_layer(const CustomData *data, int type)
+{
+	int i;
+
+	for(i=0; i < data->totlayer; ++i)
+		if(data->layers[i].type == type)
+			return data->layers[i].active;
+
+	return -1;
+}
+
+int CustomData_get_render_layer(const CustomData *data, int type)
+{
+	int i;
+
+	for(i=0; i < data->totlayer; ++i)
+		if(data->layers[i].type == type)
+			return data->layers[i].active_rnd;
+
+	return -1;
+}
+
+
 void CustomData_set_layer_active(CustomData *data, int type, int n)
 {
 	int i;

Modified: trunk/blender/source/blender/src/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_mods.c	2007-09-18 14:34:17 UTC (rev 12086)
+++ trunk/blender/source/blender/src/editmesh_mods.c	2007-09-18 19:39:25 UTC (rev 12087)
@@ -1346,23 +1346,48 @@
 	}
 }
 
+int mesh_layers_menu_charlen(CustomData *data, int type)
+{
+ 	int i, len = 0;
+	/* see if there is a duplicate */
+	for(i=0; i<data->totlayer; i++) {
+		if((&data->layers[i])->type == type) {
+			/* we could count the chars here but we'll just assumeme each
+			 * is 32 chars with some room for the menu text - 40 should be fine */
+			len+=40; 
+		}
+	}
+	return len;
+}
 
-static short customdata_layers_menu(CustomData *data, int type) {
-	int i, ret;
-	char *str;
-	char *str_pt;
+/* this function adds menu text into an existing string.
+ * this string's size should be allocated with mesh_layers_menu_charlen */
+void mesh_layers_menu_concat(CustomData *data, int type, char *str) {
+	int i, count = 0;
+	char *str_pt = str;
 	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);
+			str_pt += sprintf(str_pt, "%s%%x%d|", layer->name, count);
+			count++;
 		}
 	}
+}
+
+int mesh_layers_menu(CustomData *data, int type) {
+	int ret;
+	char *str_pt, *str;
+	
+	str_pt = str = MEM_mallocN(mesh_layers_menu_charlen(data, type) + 18, "layer menu");
+	str[0] = '\0';
+	
+	str_pt += sprintf(str_pt, "Layers%%t|");
+	
+	mesh_layers_menu_concat(data, type, str_pt);
+	
 	ret = pupmenu(str);
 	MEM_freeN(str);
 	return ret;
@@ -1585,23 +1610,23 @@
 			} else {
 				int layer_orig_idx, layer_idx;
 				
-				layer_idx = (int)customdata_layers_menu(&em->fdata, CD_MTFACE);
+				layer_idx = mesh_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);
+				layer_orig_idx = CustomData_get_active_layer(&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);
+				CustomData_set_layer_active(&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);
+				CustomData_set_layer_active(&em->fdata, CD_MTFACE, layer_orig_idx);
 			}
 			break;
 			
@@ -1615,23 +1640,23 @@
 			} else {
 				int layer_orig_idx, layer_idx;
 				
-				layer_idx = (int)customdata_layers_menu(&em->fdata, CD_MCOL);
+				layer_idx = mesh_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);
+				layer_orig_idx = CustomData_get_active_layer(&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);
+				CustomData_set_layer_active(&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);
+				CustomData_set_layer_active(&em->fdata, CD_MCOL, layer_orig_idx);
 				
 			}
 			break;

Modified: trunk/blender/source/blender/src/header_image.c
===================================================================
--- trunk/blender/source/blender/src/header_image.c	2007-09-18 14:34:17 UTC (rev 12086)
+++ trunk/blender/source/blender/src/header_image.c	2007-09-18 19:39:25 UTC (rev 12087)
@@ -50,6 +50,7 @@
 #include "DNA_space_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_userdef_types.h"
+#include "DNA_customdata_types.h" /* for UV layer menu */
 
 #include "BLI_blenlib.h"
 
@@ -62,6 +63,8 @@
 #include "BKE_image.h"
 #include "BKE_main.h"
 #include "BKE_utildefines.h"
+#include "BLI_editVert.h" /* for UV layer menu */
+#include "BKE_customdata.h" /* ditto */
 
 #include "BIF_butspace.h"
 #include "BIF_drawimage.h"
@@ -350,6 +353,16 @@
 	}
 }
 
+static void do_image_buttons_set_uvlayer_callback(void *act, void *data)
+{
+	CustomData_set_layer_active(&G.editMesh->fdata, CD_MTFACE, *((int *)act));
+	
+	BIF_undo_push("Set Active UV Texture");
+	allqueue(REDRAWVIEW3D, 0);
+	allqueue(REDRAWBUTSEDIT, 0);
+	allqueue(REDRAWIMAGE, 0);
+}
+
 static void do_image_view_viewnavmenu(void *arg, int event)
 {
 	switch(event) {
@@ -1195,11 +1208,36 @@
 
 	/* UV EditMode buttons, not painting or rencering or compositing */
 	if ( EM_texFaceCheck() && (G.sima->flag & SI_DRAWTOOL)==0 && !is_render) {
+		int layercount;
 		xco+=10;
 		uiDefIconTextButS(block, ICONTEXTROW,B_AROUND, ICON_ROTATE, around_pup(), xco,0,XIC+10,YIC, &(G.v2d->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period) ");
 		xco+= XIC + 12;
 		uiDefIconButBitI(block, TOG, SI_SYNC_UVSEL, B_REDR,			ICON_MESH_HLT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Sync Mesh Selection");
-		xco+= XIC+16;
+		
+		
+		/* Layer Menu */
+		layercount = CustomData_number_of_layers(&G.editMesh->fdata, CD_MTFACE); 
+		if (layercount>1 && layercount < 12) { /* could allow any number but limit of 11 means no malloc needed */
+			uiBut *ubut;
+			char str_menu[384], *str_pt; /*384 allows for 11 layers */
+			static int act;
+			
+			act = CustomData_get_active_layer(&G.editMesh->fdata, CD_MTFACE);
+			
+			/*str_pt = (char *)MEM_mallocN(layercount*40 , "uvmenu"); str[0]='\0';*/
+			str_pt = str_menu;
+			str_pt[0]='\0';
+			mesh_layers_menu_concat(&G.editMesh->fdata, CD_MTFACE, str_pt);
+			xco+= XIC+8;
+			ubut = uiDefButI(block, MENU, B_NOP, str_menu ,xco,0,115,YIC, &act, 0, 0, 0, 0, "Active UV Layer for editing");
+			uiButSetFunc(ubut, do_image_buttons_set_uvlayer_callback, &act, NULL);
+			
+			/*MEM_freeN(str);*/
+			xco+= 120;
+			
+		} else {
+			xco+= XIC+16;
+		}
 	}
 	
 	if (ima) {





More information about the Bf-blender-cvs mailing list