[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23426] trunk/blender/source/blender/ editors: Make edge slide a proper operator

Martin Poirier theeth at yahoo.com
Tue Sep 22 22:16:58 CEST 2009


Revision: 23426
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23426
Author:   theeth
Date:     2009-09-22 22:16:56 +0200 (Tue, 22 Sep 2009)

Log Message:
-----------
Make edge slide a proper operator

Clean up a couple of things in transform (PET settings, custom data, ...)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/mesh_ops.c
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/transform/transform_ops.c

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2009-09-22 19:09:04 UTC (rev 23425)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2009-09-22 20:16:56 UTC (rev 23426)
@@ -113,7 +113,7 @@
 	uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", "direction", 2);
 	//uiItemO(layout, "Loopcut", 0, "MESH_OT_loop_cut"); // CutEdgeloop(em, 1);
 	//uiItemO(layout, "Edge Slide", 0, "MESH_OT_edge_slide"); // EdgeSlide(em, 0,0.0);
-	uiItemEnumO(layout, "Edge Slide", 0, "TFM_OT_transform", "mode", TFM_EDGE_SLIDE);
+	uiItemO(layout, "Edge Slide", 0, "TFM_OT_edge_slide");
 	uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
 	uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", "ring", 1);
 	uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region");

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2009-09-22 19:09:04 UTC (rev 23425)
+++ trunk/blender/source/blender/editors/transform/transform.c	2009-09-22 20:16:56 UTC (rev 23426)
@@ -1321,7 +1321,12 @@
 	if (t->flag & T_MODAL)
 	{
 		ts->prop_mode = t->prop_mode;
-		ts->proportional = proportional;
+		
+		/* only save back if it wasn't automatically disabled */
+		if ((t->options & CTX_NO_PET) == 0)
+		{
+			ts->proportional = proportional;
+		}
 
 		if(t->spacetype == SPACE_VIEW3D)
 		{
@@ -4500,19 +4505,52 @@
 	return 1;
 }
 
+void freeSlideVerts(TransInfo *t)
+{
+	TransDataSlideUv *suv;
+	SlideData *sld = t->customData;
+	int uvlay_idx;
+
+	//BLI_ghash_free(edgesgh, freeGHash, NULL);
+	BLI_ghash_free(sld->vhash, NULL, (GHashValFreeFP)MEM_freeN);
+	BLI_linklist_free(sld->vertlist, NULL);
+	BLI_linklist_free(sld->edgelist, NULL);
+
+	if (sld->uvlay_tot) {
+		for (uvlay_idx=0; uvlay_idx<sld->uvlay_tot; uvlay_idx++) {
+			BLI_ghash_free(sld->uvhash[uvlay_idx], NULL, NULL);
+		}
+		MEM_freeN(sld->slideuv);
+		MEM_freeN(sld->uvhash);
+
+		suv = sld->suv_last-1;
+		while (suv >= sld->slideuv) {
+			if (suv->fuv_list) {
+				BLI_linklist_free(suv->fuv_list,NULL);
+			}
+			suv--;
+		}
+	}
+
+	MEM_freeN(sld);
+	t->customData = NULL;
+}
+
 void initEdgeSlide(TransInfo *t)
 {
 	SlideData *sld;
 
 	t->mode = TFM_EDGE_SLIDE;
 	t->transform = EdgeSlide;
-
+	
 	createSlideVerts(t);
 	sld = t->customData;
 
 	if (!sld)
 		return;
 
+	t->customFree = freeSlideVerts;
+
 	initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
 	setCustomPoints(t, &t->mouse, sld->end, sld->start);
 	
@@ -4639,36 +4677,6 @@
 	return 1;
 }
 
-void freeSlideVerts(TransInfo *t)
-{
-	TransDataSlideUv *suv;
-	SlideData *sld = t->customData;
-	int uvlay_idx;
-
-	//BLI_ghash_free(edgesgh, freeGHash, NULL);
-	BLI_ghash_free(sld->vhash, NULL, (GHashValFreeFP)MEM_freeN);
-	BLI_linklist_free(sld->vertlist, NULL);
-	BLI_linklist_free(sld->edgelist, NULL);
-
-	if (sld->uvlay_tot) {
-		for (uvlay_idx=0; uvlay_idx<sld->uvlay_tot; uvlay_idx++) {
-			BLI_ghash_free(sld->uvhash[uvlay_idx], NULL, NULL);
-		}
-		MEM_freeN(sld->slideuv);
-		MEM_freeN(sld->uvhash);
-
-		suv = sld->suv_last-1;
-		while (suv >= sld->slideuv) {
-			if (suv->fuv_list) {
-				BLI_linklist_free(suv->fuv_list,NULL);
-			}
-			suv--;
-		}
-	}
-
-	MEM_freeN(sld);
-}
-
 int EdgeSlide(TransInfo *t, short mval[2])
 {
 	TransData *td = t->data;

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2009-09-22 19:09:04 UTC (rev 23425)
+++ trunk/blender/source/blender/editors/transform/transform.h	2009-09-22 20:16:56 UTC (rev 23426)
@@ -291,6 +291,7 @@
 	struct Object *poseobj;		/* if t->flag & T_POSE, this denotes pose object */
 
 	void       *customData;		/* Per Transform custom data */
+	void  	  (*customFree)(struct TransInfo *); /* if a special free function is needed */
 
 	/*************** NEW STUFF *********************/
 

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-09-22 19:09:04 UTC (rev 23425)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-09-22 20:16:56 UTC (rev 23426)
@@ -5312,6 +5312,8 @@
 	}
 	else {
 		t->flag &= ~T_PROP_EDIT; /* no proportional edit in object mode */
+		t->options |= CTX_NO_PET;
+		
 		createTransObject(C, t);
 		t->flag |= T_OBJECT;
 

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c	2009-09-22 19:09:04 UTC (rev 23425)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c	2009-09-22 20:16:56 UTC (rev 23426)
@@ -978,51 +978,60 @@
 		}
 	}
 
-	/* setting PET flag */
-	if (op && RNA_struct_find_property(op->ptr, "proportional") && RNA_property_is_set(op->ptr, "proportional"))
+	/* setting PET flag only if property exist in operator. Otherwise, assume it's not supported */
+	if (op && RNA_struct_find_property(op->ptr, "proportional"))
 	{
-		switch(RNA_enum_get(op->ptr, "proportional"))
+		if (RNA_property_is_set(op->ptr, "proportional"))
 		{
-		case 2: /* XXX connected constant */
-			t->flag |= T_PROP_CONNECTED;
-		case 1: /* XXX prop on constant */
-			t->flag |= T_PROP_EDIT;
-			break;
+			switch(RNA_enum_get(op->ptr, "proportional"))
+			{
+			case 2: /* XXX connected constant */
+				t->flag |= T_PROP_CONNECTED;
+			case 1: /* XXX prop on constant */
+				t->flag |= T_PROP_EDIT;
+				break;
+			}
 		}
-	}
-	else
-	{
-		if ((t->options & CTX_NO_PET) == 0 && (ts->proportional)) {
-			t->flag |= T_PROP_EDIT;
+		else
+		{
+			if ((t->options & CTX_NO_PET) == 0 && (ts->proportional)) {
+				t->flag |= T_PROP_EDIT;
 
-			if(ts->proportional == 2)
-				t->flag |= T_PROP_CONNECTED;	// yes i know, has to become define
+				if(ts->proportional == 2)
+					t->flag |= T_PROP_CONNECTED;	// yes i know, has to become define
+			}
 		}
-	}
 
-	if (op && RNA_struct_find_property(op->ptr, "proportional_size") && RNA_property_is_set(op->ptr, "proportional_size"))
-	{
-		t->prop_size = RNA_float_get(op->ptr, "proportional_size");
-	}
-	else
-	{
-		t->prop_size = ts->proportional_size;
-	}
+		if (op && RNA_struct_find_property(op->ptr, "proportional_size") && RNA_property_is_set(op->ptr, "proportional_size"))
+		{
+			t->prop_size = RNA_float_get(op->ptr, "proportional_size");
+		}
+		else
+		{
+			t->prop_size = ts->proportional_size;
+		}
 
-	if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
-	{
-		t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff");
+
+		/* TRANSFORM_FIX_ME rna restrictions */
+		if (t->prop_size <= 0)
+		{
+			t->prop_size = 1.0f;
+		}
+		
+		if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
+		{
+			t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff");
+		}
+		else
+		{
+			t->prop_mode = ts->prop_mode;
+		}
 	}
-	else
+	else /* add not pet option to context when not available */
 	{
-		t->prop_mode = ts->prop_mode;
+		t->options |= CTX_NO_PET;
 	}
 
-	/* TRANSFORM_FIX_ME rna restrictions */
-	if (t->prop_size <= 0)
-	{
-		t->prop_size = 1.0f;
-	}
 
 	setTransformViewMatrices(t);
 	initNumInput(&t->num);
@@ -1065,8 +1074,6 @@
 			ED_uvedit_live_unwrap_end(t->state == TRANS_CANCEL);
 	}
 	else if(ELEM(t->spacetype, SPACE_ACTION, SPACE_NLA)) {
-		if (t->customData)
-			MEM_freeN(t->customData);
 	}
 
 	if (t->mouse.data)
@@ -1074,9 +1081,12 @@
 		MEM_freeN(t->mouse.data);
 	}
 
-	if (t->mode == TFM_EDGE_SLIDE) {
-		freeSlideVerts(t);
+	if (t->customFree) {
+		t->customFree(t);
 	}
+	else if (t->customData) {
+		MEM_freeN(t->customData);
+	}
 }
 
 void applyTransObjects(TransInfo *t)

Modified: trunk/blender/source/blender/editors/transform/transform_ops.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_ops.c	2009-09-22 19:09:04 UTC (rev 23425)
+++ trunk/blender/source/blender/editors/transform/transform_ops.c	2009-09-22 20:16:56 UTC (rev 23426)
@@ -99,6 +99,7 @@
 char OP_TILT[] = "TFM_OT_tilt";
 char OP_TRACKBALL[] = "TFM_OT_trackball";
 char OP_MIRROR[] = "TFM_OT_mirror";
+char OP_EDGE_SLIDE[] = "TFM_OT_edge_slide";
 
 
 TransformModeItem transform_modes[] =
@@ -113,6 +114,7 @@
 	{OP_TILT, TFM_TILT},
 	{OP_TRACKBALL, TFM_TRACKBALL},
 	{OP_MIRROR, TFM_MIRROR},
+	{OP_EDGE_SLIDE, TFM_EDGE_SLIDE},
 	{NULL, 0}
 };
 
@@ -549,6 +551,26 @@
 	Properties_Constraints(ot);
 }
 
+void TFM_OT_edge_slide(struct wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name   = "Tilt";
+	ot->description= "Tilt selected control vertices of 3d curve."; 
+	ot->idname = OP_EDGE_SLIDE;
+	ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+	/* api callbacks */
+	ot->invoke = transform_invoke;
+	ot->exec   = transform_exec;
+	ot->modal  = transform_modal;
+	ot->cancel  = transform_cancel;
+	ot->poll   = ED_operator_editmesh;
+
+	RNA_def_float_factor(ot->srna, "value", 0, 0, 1, "Factor", "", 0, 1);
+
+	RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
+}
+
 void TFM_OT_transform(struct wmOperatorType *ot)
 {
 	static EnumPropertyItem transform_mode_types[] = {
@@ -618,6 +640,7 @@
 	WM_operatortype_append(TFM_OT_tilt);
 	WM_operatortype_append(TFM_OT_trackball);
 	WM_operatortype_append(TFM_OT_mirror);
+	WM_operatortype_append(TFM_OT_edge_slide);
 
 	WM_operatortype_append(TFM_OT_select_orientation);
 }





More information about the Bf-blender-cvs mailing list