[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