Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorMartin Poirier <theeth@yahoo.com>2009-09-23 00:16:56 +0400
committerMartin Poirier <theeth@yahoo.com>2009-09-23 00:16:56 +0400
commit930542540ade1ac181c1fbff2ca8f23715d377fb (patch)
tree1d92817d10d308bfd87c9f69b94fcb9df90df939 /source
parent986f8a9ea34e8c994ae1e19fa47f49e7e0c544e6 (diff)
Make edge slide a proper operator
Clean up a couple of things in transform (PET settings, custom data, ...)
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/mesh/mesh_ops.c2
-rw-r--r--source/blender/editors/transform/transform.c72
-rw-r--r--source/blender/editors/transform/transform.h1
-rw-r--r--source/blender/editors/transform/transform_conversions.c2
-rw-r--r--source/blender/editors/transform/transform_generics.c86
-rw-r--r--source/blender/editors/transform/transform_ops.c23
6 files changed, 115 insertions, 71 deletions
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index 3f1bbbb9097..a79b42dcbb8 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -113,7 +113,7 @@ static int edge_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
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");
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 6dec51945ce..ca9981bc590 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -1321,7 +1321,12 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
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 @@ static int createSlideVerts(TransInfo *t)
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 @@ int doEdgeSlide(TransInfo *t, float perc)
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;
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 404257a55ff..66d5ecd4d66 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -291,6 +291,7 @@ typedef struct TransInfo {
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 *********************/
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 64151918a47..543bbf13fcc 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -5312,6 +5312,8 @@ void createTransData(bContext *C, TransInfo *t)
}
else {
t->flag &= ~T_PROP_EDIT; /* no proportional edit in object mode */
+ t->options |= CTX_NO_PET;
+
createTransObject(C, t);
t->flag |= T_OBJECT;
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 59429d65e7b..ea5653dc130 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -978,51 +978,60 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
}
}
- /* 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 @@ void postTrans (TransInfo *t)
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,8 +1081,11 @@ void postTrans (TransInfo *t)
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);
}
}
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 69819da8cc2..b6f8d2c8c22 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -99,6 +99,7 @@ char OP_SHRINK_FATTEN[] = "TFM_OT_shrink_fatten";
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 @@ TransformModeItem transform_modes[] =
{OP_TILT, TFM_TILT},
{OP_TRACKBALL, TFM_TRACKBALL},
{OP_MIRROR, TFM_MIRROR},
+ {OP_EDGE_SLIDE, TFM_EDGE_SLIDE},
{NULL, 0}
};
@@ -549,6 +551,26 @@ void TFM_OT_mirror(struct wmOperatorType *ot)
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 @@ void transform_operatortypes(void)
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);
}