[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56230] trunk/blender/source/blender: Add stencil control for mask overlay.

Antony Riakiotakis kalast at gmail.com
Tue Apr 23 02:06:28 CEST 2013


Revision: 56230
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56230
Author:   psy-fi
Date:     2013-04-23 00:06:22 +0000 (Tue, 23 Apr 2013)
Log Message:
-----------
Add stencil control for mask overlay. Key combinations are the same as
regular stencil but use Alt as well, so Alt-Rclick is translation, Alt-
clamping to avoid scaling of stencil to zero.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_ops.c
    trunk/blender/source/blender/makesdna/DNA_brush_types.h
    trunk/blender/source/blender/makesrna/intern/rna_brush.c

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2013-04-22 22:32:42 UTC (rev 56229)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2013-04-23 00:06:22 UTC (rev 56230)
@@ -661,8 +661,8 @@
 		float x = 0.0f, y = 0.0f; /* Quite warnings */
 		float co[3];
 
-		x = point_2d[0] - br->stencil_pos[0];
-		y = point_2d[1] - br->stencil_pos[1];
+		x = point_2d[0] - br->mask_stencil_pos[0];
+		y = point_2d[1] - br->mask_stencil_pos[1];
 
 		if (rotation > 0.001f || rotation < -0.001f) {
 			const float angle    = atan2f(y, x) + rotation;
@@ -672,12 +672,12 @@
 			y = flen * sinf(angle);
 		}
 
-		if (fabsf(x) > br->stencil_dimension[0] || fabsf(y) > br->stencil_dimension[1]) {
+		if (fabsf(x) > br->mask_stencil_dimension[0] || fabsf(y) > br->mask_stencil_dimension[1]) {
 			zero_v4(rgba);
 			return 0.0f;
 		}
-		x /= (br->stencil_dimension[0]);
-		y /= (br->stencil_dimension[1]);
+		x /= (br->mask_stencil_dimension[0]);
+		y /= (br->mask_stencil_dimension[1]);
 
 		x *= mtex->size[0];
 		y *= mtex->size[1];

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2013-04-22 22:32:42 UTC (rev 56229)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2013-04-23 00:06:22 UTC (rev 56230)
@@ -9318,6 +9318,12 @@
 				brush->stencil_pos[0] = 256;
 				brush->stencil_pos[1] = 256;
 			}
+			if (brush->mask_stencil_dimension[0] == 0) {
+				brush->mask_stencil_dimension[0] = 256;
+				brush->mask_stencil_dimension[1] = 256;
+				brush->mask_stencil_pos[0] = 256;
+				brush->mask_stencil_pos[1] = 256;
+			}
 		}
 
 		/* TIP: to initialize new variables added, use the new function

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c	2013-04-22 22:32:42 UTC (rev 56229)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c	2013-04-23 00:06:22 UTC (rev 56230)
@@ -585,14 +585,24 @@
 		}
 		/* Stencil code goes here */
 		else {
-			quad.xmin = -brush->stencil_dimension[0];
-			quad.ymin = -brush->stencil_dimension[1];
-			quad.xmax = brush->stencil_dimension[0];
-			quad.ymax = brush->stencil_dimension[1];
-
+			if (primary) {
+				quad.xmin = -brush->stencil_dimension[0];
+				quad.ymin = -brush->stencil_dimension[1];
+				quad.xmax = brush->stencil_dimension[0];
+				quad.ymax = brush->stencil_dimension[1];
+			}
+			else {
+				quad.xmin = -brush->mask_stencil_dimension[0];
+				quad.ymin = -brush->mask_stencil_dimension[1];
+				quad.xmax = brush->mask_stencil_dimension[0];
+				quad.ymax = brush->mask_stencil_dimension[1];
+			}
 			glMatrixMode(GL_MODELVIEW);
 			glPushMatrix();
-			glTranslatef(brush->stencil_pos[0], brush->stencil_pos[1], 0);
+			if (primary)
+				glTranslatef(brush->stencil_pos[0], brush->stencil_pos[1], 0);
+			else
+				glTranslatef(brush->mask_stencil_pos[0], brush->mask_stencil_pos[1], 0);
 			glRotatef(RAD2DEGF(mtex->rot), 0, 0, 1);
 			glMatrixMode(GL_TEXTURE);
 		}

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_ops.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_ops.c	2013-04-22 22:32:42 UTC (rev 56229)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_ops.c	2013-04-23 00:06:22 UTC (rev 56230)
@@ -451,14 +451,20 @@
 /***** Stencil Control *****/
 
 typedef enum {
-STENCIL_TRANSLATE,
-STENCIL_SCALE,
-STENCIL_ROTATE
+	STENCIL_TRANSLATE,
+	STENCIL_SCALE,
+	STENCIL_ROTATE
 } StencilControlMode;
 
 typedef enum {
-STENCIL_CONSTRAINT_X = 1,
-STENCIL_CONSTRAINT_Y = 2
+	STENCIL_PRIMARY = 0,
+	STENCIL_SECONDARY = 1
+} StencilTextureMode;
+
+
+typedef enum {
+	STENCIL_CONSTRAINT_X = 1,
+	STENCIL_CONSTRAINT_Y = 2
 } StencilConstraint;
 
 typedef struct {
@@ -471,48 +477,92 @@
 	float area_size[2];
 	StencilControlMode mode;
 	StencilConstraint constrain_mode;
+	int mask; /* we are twaking mask or colour stencil */
 	Brush *br;
+	float *dim_target;
+	float *rot_target;
+	float *pos_target;
 	short event_type;
 } StencilControlData;
 
+static void stencil_set_target(StencilControlData *scd)
+{
+	Brush *br = scd->br;
+	float mdiff[2];
+	if (scd->mask) {
+		copy_v2_v2(scd->init_sdim, br->mask_stencil_dimension);
+		copy_v2_v2(scd->init_spos, br->mask_stencil_pos);
+		scd->init_rot = br->mask_mtex.rot;
+
+		scd->dim_target = br->mask_stencil_dimension;
+		scd->rot_target = &br->mask_mtex.rot;
+		scd->pos_target = br->mask_stencil_pos;
+	} else {
+		copy_v2_v2(scd->init_sdim, br->stencil_dimension);
+		copy_v2_v2(scd->init_spos, br->stencil_pos);
+		scd->init_rot = br->mtex.rot;
+
+		scd->dim_target = br->stencil_dimension;
+		scd->rot_target = &br->mtex.rot;
+		scd->pos_target = br->stencil_pos;
+	}
+
+	sub_v2_v2v2(mdiff, scd->init_mouse, br->stencil_pos);
+	scd->lenorig = len_v2(mdiff);
+
+	scd->init_angle = atan2(mdiff[1], mdiff[0]);
+}
+
 static int stencil_control_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	Paint *paint = BKE_paint_get_active_from_context(C);
 	Brush *br = BKE_paint_brush(paint);
-	float mdiff[2];
 	float mvalf[2] = {event->mval[0], event->mval[1]};
 	ARegion *ar = CTX_wm_region(C);
+	StencilControlData *scd;
+	int mask = RNA_enum_get(op->ptr, "texmode");
 
-	StencilControlData *scd = MEM_mallocN(sizeof(StencilControlData), "stencil_control");
+	if (mask) {
+		if (br->mask_mtex.brush_map_mode != MTEX_MAP_MODE_STENCIL)
+			return OPERATOR_CANCELLED;
+	}
+	else {
+		if (br->mtex.brush_map_mode != MTEX_MAP_MODE_STENCIL)
+			return OPERATOR_CANCELLED;
+	}
 
+	scd = MEM_mallocN(sizeof(StencilControlData), "stencil_control");
+	scd->mask = mask;
+	scd->br = br;
+
 	copy_v2_v2(scd->init_mouse, mvalf);
-	copy_v2_v2(scd->init_sdim, br->stencil_dimension);
-	copy_v2_v2(scd->init_spos, br->stencil_pos);
-	sub_v2_v2v2(mdiff, mvalf, br->stencil_pos);
-	scd->lenorig = len_v2(mdiff);
-	scd->br = br;
-	scd->init_rot = br->mtex.rot;
-	scd->init_angle = atan2(mdiff[1], mdiff[0]);
+
+	stencil_set_target(scd);
+
 	scd->mode = RNA_enum_get(op->ptr, "mode");
 	scd->event_type = event->type;
 	scd->area_size[0] = ar->winx;
 	scd->area_size[1] = ar->winy;
 
+
 	op->customdata = scd;
 	WM_event_add_modal_handler(C, op);
 
 	return OPERATOR_RUNNING_MODAL;
 }
 
+static void stencil_restore(StencilControlData *scd)
+{
+	copy_v2_v2(scd->dim_target, scd->init_sdim);
+	copy_v2_v2(scd->pos_target, scd->init_spos);
+	*scd->rot_target = scd->init_rot;
+}
 
 static int stencil_control_cancel(bContext *UNUSED(C), wmOperator *op)
 {
 	StencilControlData *scd = op->customdata;
-	Brush *br = scd->br;
 
-	copy_v2_v2(br->stencil_dimension, scd->init_sdim);
-	copy_v2_v2(br->stencil_pos, scd->init_spos);
-	br->mtex.rot = scd->init_rot;
+	stencil_restore(scd);
 	MEM_freeN(op->customdata);
 	return OPERATOR_CANCELLED;
 }
@@ -526,21 +576,21 @@
 	switch (scd->mode) {
 		case STENCIL_TRANSLATE:
 			sub_v2_v2v2(mdiff, mvalf, scd->init_mouse);
-			add_v2_v2v2(scd->br->stencil_pos, scd->init_spos,
+			add_v2_v2v2(scd->pos_target, scd->init_spos,
 			            mdiff);
-			CLAMP(scd->br->stencil_pos[0],
-			      -scd->br->stencil_dimension[0] + PIXEL_MARGIN,
-			      scd->area_size[0] + scd->br->stencil_dimension[0] - PIXEL_MARGIN);
+			CLAMP(scd->pos_target[0],
+			      -scd->dim_target[0] + PIXEL_MARGIN,
+			      scd->area_size[0] + scd->dim_target[0] - PIXEL_MARGIN);
 
-			CLAMP(scd->br->stencil_pos[1],
-			      -scd->br->stencil_dimension[1] + PIXEL_MARGIN,
-			      scd->area_size[1] + scd->br->stencil_dimension[1] - PIXEL_MARGIN);
+			CLAMP(scd->pos_target[1],
+			      -scd->dim_target[1] + PIXEL_MARGIN,
+			      scd->area_size[1] + scd->dim_target[1] - PIXEL_MARGIN);
 
 			break;
 		case STENCIL_SCALE:
 		{
 			float len, factor;
-			sub_v2_v2v2(mdiff, mvalf, scd->br->stencil_pos);
+			sub_v2_v2v2(mdiff, mvalf, scd->pos_target);
 			len = len_v2(mdiff);
 			factor = len / scd->lenorig;
 			copy_v2_v2(mdiff, scd->init_sdim);
@@ -548,20 +598,22 @@
 				mdiff[0] = factor * scd->init_sdim[0];
 			if (scd->constrain_mode != STENCIL_CONSTRAINT_X)
 				mdiff[1] = factor * scd->init_sdim[1];
-			copy_v2_v2(scd->br->stencil_dimension, mdiff);
+			CLAMP(mdiff[0], 5.0, 10000);
+			CLAMP(mdiff[1], 5.0, 10000);
+			copy_v2_v2(scd->dim_target, mdiff);
 			break;
 		}
 		case STENCIL_ROTATE:
 		{
 			float angle;
-			sub_v2_v2v2(mdiff, mvalf, scd->br->stencil_pos);
+			sub_v2_v2v2(mdiff, mvalf, scd->pos_target);
 			angle = atan2(mdiff[1], mdiff[0]);
 			angle = scd->init_rot + angle - scd->init_angle;
 			if (angle < 0.0f)
 				angle += (float)(2 * M_PI);
 			if (angle > (float)(2 * M_PI))
 				angle -= (float)(2 * M_PI);
-			scd->br->mtex.rot = angle;
+			*scd->rot_target = angle;
 			break;
 		}
 	}
@@ -623,7 +675,9 @@
 	Paint *paint = BKE_paint_get_active_from_context(C);
 	Brush *br = BKE_paint_brush(paint);
 
-	return (br && br->mtex.brush_map_mode == MTEX_MAP_MODE_STENCIL);
+	return (br &&
+			(br->mtex.brush_map_mode == MTEX_MAP_MODE_STENCIL ||
+			 br->mask_mtex.brush_map_mode == MTEX_MAP_MODE_STENCIL));
 }
 
 static void BRUSH_OT_stencil_control(wmOperatorType *ot)
@@ -634,6 +688,12 @@
 		{STENCIL_ROTATE, "ROTATION", 0, "Rotation", ""},
 		{0, NULL, 0, NULL, NULL}
 	};
+
+	static EnumPropertyItem stencil_texture_items[] = {
+		{STENCIL_PRIMARY, "PRIMARY", 0, "Primary", ""},
+		{STENCIL_SECONDARY, "SECONDARY", 0, "Secondary", ""},
+		{0, NULL, 0, NULL, NULL}
+	};
 	/* identifiers */
 	ot->name = "Stencil Brush Control";
 	ot->description = "Control the stencil brush";
@@ -648,7 +708,8 @@
 	/* flags */
 	ot->flag = 0;
 
-	RNA_def_enum(ot->srna, "mode", stencil_control_items, 0, "Tool", "");
+	RNA_def_enum(ot->srna, "mode", stencil_control_items, STENCIL_TRANSLATE, "Tool", "");
+	RNA_def_enum(ot->srna, "texmode", stencil_texture_items, STENCIL_PRIMARY, "Tool", "");
 }
 
 
@@ -721,6 +782,15 @@
 	kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_CTRL, 0);
 	RNA_enum_set(kmi->ptr, "mode", STENCIL_ROTATE);
 
+	kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_ALT, 0);
+	RNA_enum_set(kmi->ptr, "mode", STENCIL_TRANSLATE);
+	RNA_enum_set(kmi->ptr, "texmode", STENCIL_SECONDARY);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list