Revision: 24037
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24037
Author:   aligorith
Date:     2009-10-21 12:36:46 +0200 (Wed, 21 Oct 2009)

Log Message:
-----------
Graph Editor: Pivot Modes for Transform

It is now possible to choose from 'Bounding Box' (default), '2D-Cursor', and 
'Individual Centers' as the pivot point(s) that rotation/scaling is performed 
around.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_graph/graph_header.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/makesdna/DNA_space_types.h
    trunk/blender/source/blender/makesrna/intern/rna_space.c

Modified: trunk/blender/source/blender/editors/space_graph/graph_header.c
===================================================================
--- trunk/blender/source/blender/editors/space_graph/graph_header.c     
2009-10-21 10:11:03 UTC (rev 24036)
+++ trunk/blender/source/blender/editors/space_graph/graph_header.c     
2009-10-21 10:36:46 UTC (rev 24037)
@@ -250,17 +250,30 @@
        ED_area_tag_redraw(CTX_wm_area(C));
 }
 
+static char *garound_pup(const bContext *C)
+{
+       static char string[512];
+       char *str = string;
 
+       str += sprintf(str, "%s", "Pivot: %t"); 
+       str += sprintf(str, "%s", "|Bounding Box Center %x0"); 
+       //str += sprintf(str, "%s", "|Median Point %x3");
+       str += sprintf(str, "%s", "|2D Cursor %x1");
+       str += sprintf(str, "%s", "|Individual Centers %x2");
+       return string;
+}
+
 void graph_header_buttons(const bContext *C, ARegion *ar)
 {
+       SpaceIpo *sipo= CTX_wm_space_graph(C);
        ScrArea *sa= CTX_wm_area(C);
-       SpaceIpo *sipo= CTX_wm_space_graph(C);
        uiBlock *block;
        int xco, yco= 3;
        
        block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
        uiBlockSetHandleFunc(block, do_graph_buttons, NULL);
        
+       /* standard buttosn in header - viewtype selector and menus */
        xco= ED_area_header_standardbuttons(C, block, yco);
        
        if ((sa->flag & HEADER_NO_PULLDOWN)==0) {
@@ -310,6 +323,10 @@
        }
        xco += 98;
        
+       /* pivot mode setting */
+       uiDefIconTextButI(block, ICONTEXTROW,B_REDR, ICON_ROTATE, 
garound_pup(C), xco,yco,XIC+10,YIC, &(sipo->around), 0, 3.0, 0, 0, 
"Rotation/Scaling Pivot");
+       xco+= XIC+10;
+       
        /* copy + paste */
        uiBlockBeginAlign(block);
                uiDefIconButO(block, BUT, "GRAPH_OT_copy", 
WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco+=XIC,yco,XIC,YIC, "Copies the 
selected keyframes from the selected channel(s) to the buffer");

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c      
2009-10-21 10:11:03 UTC (rev 24036)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c      
2009-10-21 10:36:46 UTC (rev 24037)
@@ -3344,6 +3344,7 @@
 
 static void createTransGraphEditData(bContext *C, TransInfo *t)
 {
+       SpaceIpo *sipo= CTX_wm_space_graph(C);
        Scene *scene= CTX_data_scene(C);
        ARegion *ar= CTX_wm_region(C);
        View2D *v2d= &ar->v2d;
@@ -3375,7 +3376,7 @@
                /* only side on which mouse is gets transformed */
                float xmouse, ymouse;
                
-               UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], 
&xmouse, &ymouse);
+               UI_view2d_region_to_view(v2d, t->imval[0], t->imval[1], 
&xmouse, &ymouse);
                side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
        }
        else {
@@ -3403,7 +3404,7 @@
                /* only include BezTriples whose 'keyframe' occurs on the same 
side of the current frame as mouse */
                for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
                        if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
-                               if (v2d->around == V3D_LOCAL) {
+                               if (sipo->around == V3D_LOCAL) {
                                        /* for local-pivot we only need to 
count the number of selected handles only, so that centerpoints don't
                                         * don't get moved wrong
                                         */
@@ -3482,7 +3483,7 @@
                                /* only include main vert if selected */
                                if (bezt->f2 & SELECT) {
                                        /* if scaling around individuals 
centers, do not include keyframes */
-                                       if (v2d->around != V3D_LOCAL) {
+                                       if (sipo->around != V3D_LOCAL) {
                                                /* if handles were not 
selected, store their selection status */
                                                if (!(bezt->f1 & SELECT) && 
!(bezt->f3 & SELECT)) {
                                                        if (hdata == NULL)

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c 
2009-10-21 10:11:03 UTC (rev 24036)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c 
2009-10-21 10:36:46 UTC (rev 24037)
@@ -952,11 +952,17 @@
                t->view = &ar->v2d;
                t->around = sima->around;
        }
+       else if(t->spacetype==SPACE_IPO) 
+       {
+               SpaceIpo *sipo= sa->spacedata.first;
+               t->view = &ar->v2d;
+               t->around = sipo->around;
+       }
        else
        {
                // XXX for now, get View2D  from the active region
                t->view = &ar->v2d;
-               
+               // XXX for now, the center point is the midpoint of the data
                t->around = V3D_CENTER;
        }
        
@@ -1196,6 +1202,18 @@
        calculateCenter2D(t);
 }
 
+void calculateCenterCursorGraph2D(TransInfo *t)
+{
+       SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
+       Scene *scene= t->scene;
+       
+       /* cursor is combination of current frame, and graph-editor cursor 
value */
+       t->center[0]= (float)(scene->r.cfra);
+       t->center[1]= sipo->cursorVal;
+       
+       calculateCenter2D(t);
+}
+
 void calculateCenterMedian(TransInfo *t)
 {
        float partial[3] = {0.0f, 0.0f, 0.0f};
@@ -1267,6 +1285,8 @@
        case V3D_CURSOR:
                if(t->spacetype==SPACE_IMAGE)
                        calculateCenterCursor2D(t);
+               else if(t->spacetype==SPACE_IPO)
+                       calculateCenterCursorGraph2D(t);
                else
                        calculateCenterCursor(t);
                break;

Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_space_types.h     2009-10-21 
10:11:03 UTC (rev 24036)
+++ trunk/blender/source/blender/makesdna/DNA_space_types.h     2009-10-21 
10:36:46 UTC (rev 24037)
@@ -104,7 +104,7 @@
        int flag;                               /* settings for Graph editor */
        
        float cursorVal;                /* cursor value (y-value, x-value is 
current frame) */
-       int pad;
+       int around;                             /* pivot point for transforms */
 } SpaceIpo;
 
 typedef struct SpaceButs {

Modified: trunk/blender/source/blender/makesrna/intern/rna_space.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_space.c    2009-10-21 
10:11:03 UTC (rev 24036)
+++ trunk/blender/source/blender/makesrna/intern/rna_space.c    2009-10-21 
10:36:46 UTC (rev 24037)
@@ -1195,6 +1195,15 @@
                {SIPO_MODE_ANIMATION, "FCURVES", 0, "F-Curves", ""},
                {SIPO_MODE_DRIVERS, "DRIVERS", 0, "Drivers", ""},
                {0, NULL, 0, NULL, NULL}};
+               
+               /* this is basically the same as the one for the 3D-View, but 
with some entries ommitted */
+       static EnumPropertyItem gpivot_items[] = {
+               {V3D_CENTER, "BOUNDING_BOX_CENTER", 0, "Bounding Box Center", 
""},
+               {V3D_CURSOR, "CURSOR", 0, "2D Cursor", ""},
+               {V3D_LOCAL, "INDIVIDUAL_CENTERS", 0, "Individual Centers", ""},
+               //{V3D_CENTROID, "MEDIAN_POINT", 0, "Median Point", ""},
+               //{V3D_ACTIVE, "ACTIVE_ELEMENT", 0, "Active Element", ""},
+               {0, NULL, 0, NULL, NULL}};
        
        
        srna= RNA_def_struct(brna, "SpaceGraphEditor", "Space");
@@ -1252,6 +1261,12 @@
        RNA_def_property_ui_text(prop, "Cursor Y-Value", "Graph Editor 2D-Value 
cursor - Y-Value component");
        RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
        
+       prop= RNA_def_property(srna, "pivot_point", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "around");
+       RNA_def_property_enum_items(prop, gpivot_items);
+       RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for 
rotation/scaling.");
+       RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+       
        // TODO... autosnap, dopesheet?
 }
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to