[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37574] branches/soc-2011-onion/source/ blender/editors/uvedit/uvedit_ops.c: Modal operator for stitching.

Ryakiotakis Antonis kalast at gmail.com
Fri Jun 17 02:39:59 CEST 2011


Revision: 37574
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37574
Author:   psy-fi
Date:     2011-06-17 00:39:59 +0000 (Fri, 17 Jun 2011)
Log Message:
-----------
Modal operator for stitching. Old options fully functional again

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-17 00:30:04 UTC (rev 37573)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-17 00:39:59 UTC (rev 37574)
@@ -1123,22 +1123,54 @@
 	int count;
 } UVVertAverage;
 
-static int stitch_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+typedef struct StitchState {
+	short preview;
+	int use_limit;
+	float limitDist;
+	short selectMode;
+} StitchState;
+
+#define VERT_STITCH 1
+#define EDGE_STITCH 2
+
+static void stitch_update_header(StitchState *stitch_state, bContext *C)
 {
+	static char str[] = "V(ertices): %c  E(dges): %c  P(review): %c  L(imit): %c  S(nap): %c  Wheel(limit adjust): %f";
+	char msg[256];
 	ScrArea *sa= CTX_wm_area(C);
-
 	if(sa) {
-		char str[] = "V(ertices):  E(dges):  P(review):  L(imit):  S(nap):  Wheel(limit adjust):";
-		ED_area_headerprint(sa, str);
+		sprintf(msg, str, ' ', ' ', ' ', stitch_state->use_limit?'*':' ', ' ', stitch_state->limitDist);
+		ED_area_headerprint(sa, msg);
 	}
+}
+
+static int stitch_init(bContext *C, wmOperator *op)
+{
+	StitchState *stitch_state = MEM_mallocN(sizeof(StitchState), "stitch_state");
+
+	op->customdata = stitch_state;
+
+	if(!stitch_state)
+		return 0;
+
+	stitch_state->use_limit = RNA_boolean_get(op->ptr, "use_limit");
+	stitch_state->limitDist = RNA_float_get(op->ptr, "limit");
+
+	stitch_update_header(stitch_state, C);
+	return 1;
+}
+
+static int stitch_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+	if(!stitch_init(C, op))
+		return OPERATOR_CANCELLED;
+
 	WM_event_add_modal_handler(C, op);
 	return OPERATOR_RUNNING_MODAL;
 }
 
-
-static int stitch_exec(bContext *C, wmOperator *op)
+static int stitch_uvs(bContext *C, wmOperator *op)
 {
-	SpaceImage *sima;
 	Scene *scene;
 	Object *obedit;
 	EditMesh *em;
@@ -1146,20 +1178,21 @@
 	EditVert *eve;
 	Image *ima;
 	MTFace *tf;
+	StitchState *stitch_state;
 
+	stitch_state = (StitchState *)op->customdata;
 	scene= CTX_data_scene(C);
 	obedit= CTX_data_edit_object(C);
 	em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
 	ima= CTX_data_edit_image(C);
-	sima= CTX_wm_space_image(C);
 	
-	if(RNA_boolean_get(op->ptr, "use_limit")) {
+	if(stitch_state->use_limit) {
 		UvVertMap *vmap;
 		UvMapVert *vlist, *iterv;
 		float newuv[2], limit[2];
 		int a, vtot;
 
-		limit[0]= RNA_float_get(op->ptr, "limit");
+		limit[0]= stitch_state->limitDist;
 		limit[1]= limit[0];
 
 		EM_init_index_arrays(em, 0, 0, 1);
@@ -1293,27 +1326,64 @@
 
 		MEM_freeN(uv_average);
 	}
+	BKE_mesh_end_editmesh(obedit->data, em);
 
+	return OPERATOR_FINISHED;
+}
+
+
+static void stitch_exit(bContext *C, wmOperator *op)
+{
+	StitchState *stitch_state;
+	Scene *scene;
+	SpaceImage *sima;
+	ScrArea *sa= CTX_wm_area(C);
+	Object *obedit;
+
+	stitch_state = (StitchState *)op->customdata;
+	scene= CTX_data_scene(C);
+	obedit= CTX_data_edit_object(C);
+	sima= CTX_wm_space_image(C);
+
+	stitch_state = (StitchState *)op->customdata;
+
+	RNA_float_set(op->ptr, "limit", stitch_state->limitDist);
+	RNA_boolean_set(op->ptr, "use_limit", stitch_state->use_limit);
+
+	if(sa)
+		ED_area_headerprint(sa, NULL);
+
 	uvedit_live_unwrap_update(sima, scene, obedit);
 	DAG_id_tag_update(obedit->data, 0);
 	WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+	if(stitch_state){
+		MEM_freeN(stitch_state);
+		op->customdata = NULL;
+	}
 
-	BKE_mesh_end_editmesh(obedit->data, em);
-	return OPERATOR_FINISHED;
 }
 
 
-static int stitch_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int stitch_exec(bContext *C, wmOperator *op)
 {
-	float limit;
 	int returnValue;
-	ScrArea *sa= CTX_wm_area(C);;
+	if(!stitch_init(C, op))
+		return OPERATOR_CANCELLED;
+	returnValue = stitch_uvs(C, op);
+	stitch_exit(C, op);
+	return returnValue;
+}
 
+static int stitch_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+	StitchState *stitch_state;
+
+	stitch_state = (StitchState *)op->customdata;
+
 	switch(event->type){
 		/* Cancel */
 		case ESCKEY:
-			if(sa)
-				ED_area_headerprint(sa, NULL);
+			stitch_exit(C, op);
 			return OPERATOR_CANCELLED;
 
 		/* Select verts/edges*/
@@ -1321,33 +1391,32 @@
 			return OPERATOR_RUNNING_MODAL;
 
 		case LEFTMOUSE:
-		case PADENTER:
-			returnValue = stitch_exec(C, op);
-			if(sa)
-				ED_area_headerprint(sa, NULL);
+		case PADENTER:{
+			int returnValue;
+			returnValue = stitch_uvs(C, op);
+			stitch_exit(C, op);
 			return returnValue;
-
+		}
 		/* Increase limit */
 		case PADPLUSKEY:
 		case WHEELUPMOUSE:
-			limit = RNA_float_get(op->ptr, "limit");
-			limit += 0.01;
-			RNA_float_set(op->ptr, "limit", limit);
-			return OPERATOR_RUNNING_MODAL;
+			stitch_state->limitDist += 0.01;
+			break;
 
 		/* Decrease limit */
 		case PADMINUS:
 		case WHEELDOWNMOUSE:
-			limit = RNA_float_get(op->ptr, "limit");
-			limit -= 0.01;
-			RNA_float_set(op->ptr, "limit", limit);
-			return OPERATOR_RUNNING_MODAL;
+			stitch_state->limitDist -= 0.01;
+			stitch_state->limitDist = MAX2(0.01, stitch_state->limitDist);
+			break;
 
 		/* Use Limit (Default off)*/
 		case LKEY:
-			returnValue = RNA_boolean_get(op->ptr, "use_limit");
-			RNA_boolean_set(op->ptr, "use_limit", !returnValue);
-			return OPERATOR_RUNNING_MODAL;
+			if(event->val == KM_PRESS){
+				stitch_state->use_limit = !stitch_state->use_limit;
+				break;
+			} else
+				return OPERATOR_RUNNING_MODAL;
 
 		/* Use Edge selection */
 		case EKEY:
@@ -1368,8 +1437,17 @@
 		default:
 			return OPERATOR_RUNNING_MODAL;
 	}
+
+	/* if updated settings, renew feedback message */
+	stitch_update_header(stitch_state, C);
+	return OPERATOR_RUNNING_MODAL;
 }
 
+static int stitch_cancel(bContext *C, wmOperator *op)
+{
+	stitch_exit(C, op);
+	return OPERATOR_CANCELLED;
+}
 
 static void UV_OT_stitch(wmOperatorType *ot)
 {
@@ -1383,6 +1461,7 @@
 	ot->invoke = stitch_invoke;
 	ot->modal = stitch_modal;
 	ot->exec= stitch_exec;
+	ot->cancel = stitch_cancel;
 	ot->poll= ED_operator_uvedit;
 
 	/* properties */




More information about the Bf-blender-cvs mailing list