[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43305] branches/soc-2011-onion-uv-tools/ source/blender: Uv Sculpting:

Antony Riakiotakis kalast at gmail.com
Wed Jan 11 18:25:45 CET 2012


Revision: 43305
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43305
Author:   psy-fi
Date:     2012-01-11 17:25:44 +0000 (Wed, 11 Jan 2012)
Log Message:
-----------
Uv Sculpting:
=============
Bring back the uv grab tool toggle with G while in uv brush mode.
Also added Shift-LeftMouse drag becomes relax brush.

Modified Paths:
--------------
    branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_image.c
    branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_ops.c
    branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/sculpt_uv.c
    branches/soc-2011-onion-uv-tools/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c

Modified: branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_image.c	2012-01-11 16:48:22 UTC (rev 43304)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_image.c	2012-01-11 17:25:44 UTC (rev 43305)
@@ -5242,7 +5242,7 @@
 	if(settings->use_uv_sculpt) {
 		if(!settings->uvsculpt) {
 			settings->uvsculpt = MEM_callocN(sizeof(*settings->uvsculpt), "UV Smooth paint");
-			settings->uv_sculpt_tool = UV_SCULPT_TOOL_RELAX;
+			settings->uv_sculpt_tool = UV_SCULPT_TOOL_GRAB;
 			settings->uv_sculpt_settings = UV_SCULPT_LOCK_BORDERS | UV_SCULPT_ALL_ISLANDS;
 			settings->uv_relax_method = UV_SCULPT_TOOL_RELAX_LAPLACIAN;
 		}

Modified: branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_ops.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_ops.c	2012-01-11 16:48:22 UTC (rev 43304)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/paint_ops.c	2012-01-11 17:25:44 UTC (rev 43305)
@@ -699,11 +699,13 @@
 
 	WM_keymap_add_item(keymap, "SCULPT_OT_uv_sculpt_stroke", LEFTMOUSE, KM_PRESS, 0, 0);
 	RNA_boolean_set(WM_keymap_add_item(keymap, "SCULPT_OT_uv_sculpt_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
+	RNA_boolean_set(WM_keymap_add_item(keymap, "SCULPT_OT_uv_sculpt_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "temp_relax", 1);
 
 	ed_keymap_paint_brush_size(keymap, "tool_settings.uv_sculpt.brush.size");
 	ed_keymap_paint_brush_radial_control(keymap, "uv_sculpt", 0);
 
 	RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_uv_sculpt_tool_set", SKEY, KM_PRESS, 0, 0)->ptr, "tool", UV_SCULPT_TOOL_RELAX);
 	RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_uv_sculpt_tool_set", PKEY, KM_PRESS, 0, 0)->ptr, "tool", UV_SCULPT_TOOL_PINCH);
+	RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_uv_sculpt_tool_set", GKEY, KM_PRESS, 0, 0)->ptr, "tool", UV_SCULPT_TOOL_GRAB);
 
 }

Modified: branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/sculpt_uv.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/sculpt_uv.c	2012-01-11 16:48:22 UTC (rev 43304)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/sculpt_paint/sculpt_uv.c	2012-01-11 17:25:44 UTC (rev 43305)
@@ -85,7 +85,29 @@
 	char flag;
 }UvEdge;
 
+typedef struct UVInitialStrokeElement{
+	/* index to unique uv */
+	int uv;
 
+	/* strength of brush on initial position */
+	float strength;
+
+	/* initial uv position */
+	float initial_uv[2];
+}UVInitialStrokeElement;
+
+typedef struct UVInitialStroke{
+	/* Initial Selection,for grab brushes for instance */
+	UVInitialStrokeElement *initialSelection;
+
+	/* total initially selected UVs*/
+	int totalInitialSelected;
+
+	/* initial mouse coordinates */
+	float init_coord[2];
+}UVInitialStroke;
+
+
 /* custom data for uv smoothing brush */
 typedef struct UvSculptData{
 	/* Contains the first of each set of coincident uvs.
@@ -102,6 +124,9 @@
 	/* Need I say more? */
 	int totalUvEdges;
 
+	/* data for initial stroke, used by tools like grab */
+	UVInitialStroke *initial_stroke;
+
 	/* Timer to be used for airbrush-type brush */
 	wmTimer *timer;
 
@@ -265,7 +290,8 @@
 	float aspectRatio;
 	float alpha, zoomx, zoomy;
 	Brush *brush = paint_brush(sculptdata->uvsculpt);
-	tool = CTX_data_scene(C)->toolsettings->uv_sculpt_tool;
+	ToolSettings *toolsettings = CTX_data_tool_settings(C);
+	tool = RNA_boolean_get(op->ptr, "temp_relax")? UV_SCULPT_TOOL_RELAX : toolsettings->uv_sculpt_tool;
 
 	invert = RNA_boolean_get(op->ptr, "invert")? -1 : 1;
 	alpha = brush_alpha(brush);
@@ -322,7 +348,7 @@
 	 * Smooth Tool
 	 */
 	else if(tool == UV_SCULPT_TOOL_RELAX){
-		unsigned int method = CTX_data_scene(C)->toolsettings->uv_relax_method;
+		unsigned int method = toolsettings->uv_relax_method;
 		if(method == UV_SCULPT_TOOL_RELAX_HC){
 			HC_relaxation_iteration_uv(em, sculptdata, co, alpha, radius, aspectRatio);
 		}else{
@@ -330,6 +356,31 @@
 		}
 	}
 
+	/*
+	 * Grab Tool
+	 */
+	else if(tool == UV_SCULPT_TOOL_GRAB){
+		int i;
+		float diff[2];
+		sub_v2_v2v2(diff, co, sculptdata->initial_stroke->init_coord);
+
+		for(i = 0; i < sculptdata->initial_stroke->totalInitialSelected; i++ ){
+			UvElement *element;
+			int uvindex = sculptdata->initial_stroke->initialSelection[i].uv;
+			float strength = sculptdata->initial_stroke->initialSelection[i].strength;
+			sculptdata->uv[uvindex].uv[0] = sculptdata->initial_stroke->initialSelection[i].initial_uv[0] + strength*diff[0];
+			sculptdata->uv[uvindex].uv[1] = sculptdata->initial_stroke->initialSelection[i].initial_uv[1] + strength*diff[1];
+
+			for(element = sculptdata->uv[uvindex].element; element; element = element->next){
+				MTFace *mt;
+				if(element->separate && element != sculptdata->uv[uvindex].element)
+					break;
+				mt = CustomData_em_get(&em->fdata, element->face->data, CD_MTFACE);
+				copy_v2_v2(mt->uv[element->tfindex], sculptdata->uv[uvindex].uv);
+			}
+		}
+	}
+
 	BKE_mesh_end_editmesh(obedit->data, em);
 }
 
@@ -350,6 +401,12 @@
 	if(data->uvedges){
 		MEM_freeN(data->uvedges);
 	}
+	if(data->initial_stroke){
+		if(data->initial_stroke->initialSelection){
+			MEM_freeN(data->initial_stroke->initialSelection);
+		}
+		MEM_freeN(data->initial_stroke);
+	}
 
 	MEM_freeN(data);
 	op->customdata = NULL;
@@ -572,6 +629,66 @@
 				}
 			}
 		}
+
+		/* Allocate initial selection for grab tool */
+		if(ts->uv_sculpt_tool == UV_SCULPT_TOOL_GRAB){
+			float radius, radius_root;
+			unsigned int tool;
+			UvSculptData *sculptdata = (UvSculptData *)op->customdata;
+			SpaceImage *sima;
+			int width, height;
+			float aspectRatio;
+			float alpha, zoomx, zoomy;
+			Brush *brush = paint_brush(sculptdata->uvsculpt);
+			tool = CTX_data_scene(C)->toolsettings->uv_sculpt_tool;
+
+			alpha = brush_alpha(brush);
+
+			radius = brush_size(brush);
+			sima = CTX_wm_space_image(C);
+			ED_space_image_size(sima, &width, &height);
+			ED_space_image_zoom(sima, ar, &zoomx, &zoomy);
+
+			aspectRatio = width/(float)height;
+			radius /= (width*zoomx);
+			radius = radius*radius;
+			radius_root = sqrt(radius);
+
+			/* Allocate selection stack */
+			data->initial_stroke = MEM_mallocN(sizeof(*data->initial_stroke), "uv_sculpt_initial_stroke");
+			if(!data->initial_stroke){
+				uv_sculpt_stroke_exit(C, op);
+			}
+			data->initial_stroke->initialSelection = MEM_mallocN(sizeof(*data->initial_stroke->initialSelection)*data->totalUniqueUvs, "uv_sculpt_initial_selection");
+			if(!data->initial_stroke->initialSelection){
+				uv_sculpt_stroke_exit(C, op);
+			}
+
+			copy_v2_v2(data->initial_stroke->init_coord, co);
+
+			counter = 0;
+
+			for(i = 0; i < data->totalUniqueUvs; i++){
+				float dist, diff[2];
+				if(data->uv[i].flag & MARK_BOUNDARY){
+					continue;
+				}
+
+				sub_v2_v2v2(diff, data->uv[i].uv, co);
+				diff[1] /= aspectRatio;
+				if((dist = dot_v2v2(diff, diff)) <= radius){
+					float strength;
+					strength = alpha*brush_curve_strength(brush, sqrt(dist), radius_root);
+
+					data->initial_stroke->initialSelection[counter].uv = i;
+					data->initial_stroke->initialSelection[counter].strength = strength;
+					copy_v2_v2(data->initial_stroke->initialSelection[counter].initial_uv, data->uv[i].uv);
+					counter++;
+				}
+			}
+
+			data->initial_stroke->totalInitialSelected = counter;
+		}
 	}
 
 	return op->customdata;
@@ -608,9 +725,10 @@
 	switch(event->type) {
 		case LEFTMOUSE:
 		case MIDDLEMOUSE:
-		case RIGHTMOUSE: // XXX hardcoded
+		case RIGHTMOUSE:
 			uv_sculpt_stroke_exit(C, op);
 			return OPERATOR_FINISHED;
+
 		case MOUSEMOVE:
 		case INBETWEEN_MOUSEMOVE:
 			uv_sculpt_stroke_apply(C, op, event, obedit);
@@ -646,4 +764,5 @@
 
 	/* props */
 	RNA_def_boolean(ot->srna, "invert", 0, "Invert", "Inverts the operator");
+	RNA_def_boolean(ot->srna, "temp_relax", 0, "Relax", "Relax Tool");
 }

Modified: branches/soc-2011-onion-uv-tools/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/makesdna/DNA_scene_types.h	2012-01-11 16:48:22 UTC (rev 43304)
+++ branches/soc-2011-onion-uv-tools/source/blender/makesdna/DNA_scene_types.h	2012-01-11 17:25:44 UTC (rev 43305)
@@ -647,6 +647,7 @@
 
 #define UV_SCULPT_TOOL_PINCH				1
 #define UV_SCULPT_TOOL_RELAX				2
+#define UV_SCULPT_TOOL_GRAB					3
 
 #define UV_SCULPT_TOOL_RELAX_LAPLACIAN	1
 #define UV_SCULPT_TOOL_RELAX_HC			2

Modified: branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c	2012-01-11 16:48:22 UTC (rev 43304)
+++ branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c	2012-01-11 17:25:44 UTC (rev 43305)
@@ -71,6 +71,7 @@
 EnumPropertyItem uv_sculpt_tool_items[] = {
 	{UV_SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", "Pinch UVs"},
 	{UV_SCULPT_TOOL_RELAX, "RELAX", 0, "Relax", "Relax UVs"},
+	{UV_SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", "Grab UVs"},
 	{0, NULL, 0, NULL, NULL}};
 
 




More information about the Bf-blender-cvs mailing list