[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17739] branches/projection-paint/source/ blender: * layer mask (similar to the gimp), uses a UV layer' s image as mask for painting.

Campbell Barton ideasman42 at gmail.com
Sun Dec 7 20:24:41 CET 2008


Revision: 17739
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17739
Author:   campbellbarton
Date:     2008-12-07 20:24:41 +0100 (Sun, 07 Dec 2008)

Log Message:
-----------
* layer mask (similar to the gimp), uses a UV layer's image as mask for painting.
* cloning between layers was broken
* Added buttons for selecting the souce clone/mask layer in the UV layer list.

Modified Paths:
--------------
    branches/projection-paint/source/blender/blenkernel/BKE_customdata.h
    branches/projection-paint/source/blender/blenkernel/intern/customdata.c
    branches/projection-paint/source/blender/include/butspace.h
    branches/projection-paint/source/blender/makesdna/DNA_customdata_types.h
    branches/projection-paint/source/blender/makesdna/DNA_scene_types.h
    branches/projection-paint/source/blender/src/buttons_editing.c
    branches/projection-paint/source/blender/src/imagepaint.c

Modified: branches/projection-paint/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- branches/projection-paint/source/blender/blenkernel/BKE_customdata.h	2008-12-07 13:22:50 UTC (rev 17738)
+++ branches/projection-paint/source/blender/blenkernel/BKE_customdata.h	2008-12-07 19:24:41 UTC (rev 17739)
@@ -198,8 +198,12 @@
 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_clone_layer_index(const struct CustomData *data, int type);
+int CustomData_get_mask_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);
+int CustomData_get_clone_layer(const struct CustomData *data, int type);
+int CustomData_get_mask_layer(const struct CustomData *data, int type);
 
 /* copies the data from source to the data element at index in the first
  * layer of type
@@ -227,10 +231,14 @@
 /* sets the nth layer of type as active */
 void CustomData_set_layer_active(struct CustomData *data, int type, int n);
 void CustomData_set_layer_render(struct CustomData *data, int type, int n);
+void CustomData_set_layer_clone(struct CustomData *data, int type, int n);
+void CustomData_set_layer_mask(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);
+void CustomData_set_layer_clone_index(struct CustomData *data, int type, int n);
+void CustomData_set_layer_mask_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: branches/projection-paint/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/projection-paint/source/blender/blenkernel/intern/customdata.c	2008-12-07 13:22:50 UTC (rev 17738)
+++ branches/projection-paint/source/blender/blenkernel/intern/customdata.c	2008-12-07 19:24:41 UTC (rev 17739)
@@ -606,7 +606,7 @@
 {
 	const LayerTypeInfo *typeInfo;
 	CustomDataLayer *layer, *newlayer;
-	int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0;
+	int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0;
 
 	for(i = 0; i < source->totlayer; ++i) {
 		layer = &source->layers[i];
@@ -618,6 +618,8 @@
 			number = 0;
 			lastactive = layer->active;
 			lastrender = layer->active_rnd;
+			lastclone = layer->active_clone;
+			lastmask = layer->active_mask;
 			lasttype = type;
 		}
 		else
@@ -637,6 +639,8 @@
 		if(newlayer) {
 			newlayer->active = lastactive;
 			newlayer->active_rnd = lastrender;
+			newlayer->active_clone = lastclone;
+			newlayer->active_mask = lastmask;
 		}
 	}
 }
@@ -736,6 +740,28 @@
 	return -1;
 }
 
+int CustomData_get_clone_layer_index(const CustomData *data, int type)
+{
+	int i;
+
+	for(i=0; i < data->totlayer; ++i)
+		if(data->layers[i].type == type)
+			return i + data->layers[i].active_clone;
+
+	return -1;
+}
+
+int CustomData_get_mask_layer_index(const CustomData *data, int type)
+{
+	int i;
+
+	for(i=0; i < data->totlayer; ++i)
+		if(data->layers[i].type == type)
+			return i + data->layers[i].active_mask;
+
+	return -1;
+}
+
 int CustomData_get_active_layer(const CustomData *data, int type)
 {
 	int i;
@@ -758,7 +784,28 @@
 	return -1;
 }
 
+int CustomData_get_clone_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_clone;
+
+	return -1;
+}
+
+int CustomData_get_mask_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_mask;
+
+	return -1;
+}
+
 void CustomData_set_layer_active(CustomData *data, int type, int n)
 {
 	int i;
@@ -777,6 +824,24 @@
 			data->layers[i].active_rnd = n;
 }
 
+void CustomData_set_layer_clone(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_clone = n;
+}
+
+void CustomData_set_layer_mask(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_mask = 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)
 {
@@ -796,7 +861,24 @@
 			data->layers[i].active_rnd = n-i;
 }
 
+void CustomData_set_layer_clone_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_clone = n-i;
+}
+
+void CustomData_set_layer_mask_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_mask = n-i;
+}
+
 void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
 {
 	int i;

Modified: branches/projection-paint/source/blender/include/butspace.h
===================================================================
--- branches/projection-paint/source/blender/include/butspace.h	2008-12-07 13:22:50 UTC (rev 17738)
+++ branches/projection-paint/source/blender/include/butspace.h	2008-12-07 19:24:41 UTC (rev 17739)
@@ -446,6 +446,8 @@
 
 #define B_GEN_SKELETON		2085
 #define B_RETARGET_SKELETON	2086
+#define B_SETTFACE_CLONE	2087
+#define B_SETTFACE_MASK		2088
 
 /* *********************** */
 #define B_VGROUPBUTS		2100

Modified: branches/projection-paint/source/blender/makesdna/DNA_customdata_types.h
===================================================================
--- branches/projection-paint/source/blender/makesdna/DNA_customdata_types.h	2008-12-07 13:22:50 UTC (rev 17738)
+++ branches/projection-paint/source/blender/makesdna/DNA_customdata_types.h	2008-12-07 19:24:41 UTC (rev 17739)
@@ -37,6 +37,8 @@
 	int flag;       /* general purpose flag */
 	int active;     /* number of the active layer of this type */
 	int active_rnd; /* number of the layer to render*/
+	int active_clone; /* number of the layer to render*/
+	int active_mask; /* number of the layer to render*/
 	char pad[4];
 	char name[32];  /* layer name */
 	void *data;     /* layer data */

Modified: branches/projection-paint/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/projection-paint/source/blender/makesdna/DNA_scene_types.h	2008-12-07 13:22:50 UTC (rev 17738)
+++ branches/projection-paint/source/blender/makesdna/DNA_scene_types.h	2008-12-07 19:24:41 UTC (rev 17739)
@@ -347,8 +347,7 @@
 	short flag, tool;
 	
 	/* for projection painting only - todo - use flags */
-	char seam_bleed,normal_angle;
-	short clone_layer;
+	short seam_bleed,normal_angle;
 } ImagePaintSettings;
 
 typedef struct ParticleBrushData {
@@ -806,8 +805,10 @@
 #define IMAGEPAINT_PROJECT_DISABLE		8	/* Non projection 3D painting */
 #define IMAGEPAINT_PROJECT_XRAY			16
 #define IMAGEPAINT_PROJECT_BACKFACE		32
-#define IMAGEPAINT_PROJECT_CLONE_LAYER	64
-#define IMAGEPAINT_PROJECT_FLAT			128
+#define IMAGEPAINT_PROJECT_FLAT			64
+#define IMAGEPAINT_PROJECT_LAYER_CLONE	128
+#define IMAGEPAINT_PROJECT_LAYER_MASK	256
+#define IMAGEPAINT_PROJECT_LAYER_MASK_INV	512
 
 /* toolsettings->uvcalc_flag */
 #define UVCALC_FILLHOLES			1

Modified: branches/projection-paint/source/blender/src/buttons_editing.c
===================================================================
--- branches/projection-paint/source/blender/src/buttons_editing.c	2008-12-07 13:22:50 UTC (rev 17738)
+++ branches/projection-paint/source/blender/src/buttons_editing.c	2008-12-07 19:24:41 UTC (rev 17739)
@@ -184,7 +184,7 @@
 
 static float editbutweight= 1.0;
 float editbutvweight= 1;
-static int actmcol= 0, acttface= 0, acttface_rnd = 0, actmcol_rnd = 0;
+static int actmcol= 0, acttface= 0, acttface_rnd = 0, acttface_clone = 0, acttface_mask = 0, actmcol_rnd = 0;
 
 extern ListBase editNurb;
 
@@ -802,9 +802,9 @@
 
 static int customdata_buttons(
 	uiBlock *block,	Mesh *me, CustomData *data,
-	int type, int *activep,	int *renderp,
-	int setevt, int setevt_rnd, int newevt,
-	char *label, char *shortlabel, char *browsetip, char *browsetip_rnd,
+	int type, int *activep,	int *renderp, int *clonep, int *maskp,
+	int setevt, int setevt_rnd, int setevt_clone, int setevt_mask, int newevt,
+	char *label, char *shortlabel, char *browsetip, char *browsetip_rnd, char *browsetip_clone, char *browsetip_mask,
 	char *newtip, char *deltip, int x, int y)
 {
 	CustomDataLayer *layer;
@@ -828,12 +828,27 @@
 		layer= &data->layers[i];
 
 		if(layer->type == type) {
+			int xi = 0;
 			*activep= layer->active + 1;
 			*renderp= layer->active_rnd + 1;
+			if (clonep) *clonep= layer->active_clone + 1;
+			if (maskp) *maskp= layer->active_mask + 1;
 			
+			
 			uiDefIconButI(block, ROW, setevt, ICON_VIEW3D, x,y,25,19, activep, 1.0, count, 0, 0, browsetip);
 			uiDefIconButI(block, ROW, setevt_rnd, ICON_SCENE, x+25,y,25,19, renderp, 1.0, count, 0, 0, browsetip_rnd);
-			but=uiDefBut(block, TEX, setevt, "", x+50,y,145,19, layer->name, 0.0, 31.0, 0, 0, label);
+			
+			if (clonep) {
+				uiDefIconButI(block, ROW, setevt_clone, ICON_TEXTURE, x+50,y,25,19, clonep, 1.0, count, 0, 0, browsetip_clone);
+				xi += 25;
+			}
+			
+			if (maskp) {
+				uiDefIconButI(block, ROW, setevt_mask, ICON_PAINT, x+50+xi,y,25,19, maskp, 1.0, count, 0, 0, browsetip_mask);
+				xi += 25;
+			}
+			
+			but=uiDefBut(block, TEX, setevt, "", x+50+xi,y,145-xi,19, layer->name, 0.0, 31.0, 0, 0, label);
 			uiButSetFunc(but, verify_customdata_name_func, data, layer);
 			but= uiDefIconBut(block, BUT, B_NOP, VICON_X, x+195,y,25,19, NULL, 0.0, 0.0, 0.0, 0.0, deltip);
 			uiButSetFunc(but, delete_customdata_layer, me, layer);
@@ -902,14 +917,14 @@
 	uiBlockEndAlign(block);
 
 	fdata= (G.obedit)? &G.editMesh->fdata: &me->fdata;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list