2.5 - Transform Code for Animation Editors (Part 1)
authorJoshua Leung <aligorith@gmail.com>
Tue, 30 Dec 2008 00:28:11 +0000 (00:28 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 30 Dec 2008 00:28:11 +0000 (00:28 +0000)
Remove context pointer from transform code. Solved the need for this by modifying the code that needed it.

source/blender/editors/animation/anim_filter.c
source/blender/editors/include/ED_anim_api.h
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/editors/transform/transform_ops.c

index f9eddd1c2a88cf0b8e165b93fc8c86fdebea6245..e604af4d2424b1d7b400d1a9d810741326bd3719 100644 (file)
 
 /* Get shapekey data being edited (for Action Editor -> ShapeKey mode) */
 /* Note: there's a similar function in key.c (ob_get_key) */
-Key *actedit_get_shapekeys (const bContext *C, SpaceAction *saction) 
+Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction) 
 {
-    Scene *scene= CTX_data_scene(C);
+    Scene *scene= ac->scene;
     Object *ob;
     Key *key;
        
-    ob = OBACT;  // XXX er...
+    ob = OBACT;
     if (ob == NULL) 
                return NULL;
        
@@ -140,7 +140,7 @@ Key *actedit_get_shapekeys (const bContext *C, SpaceAction *saction)
 }
 
 /* Get data being edited in Action Editor (depending on current 'mode') */
-static short actedit_get_context (const bContext *C, bAnimContext *ac, SpaceAction *saction)
+static short actedit_get_context (bAnimContext *ac, SpaceAction *saction)
 {
        /* sync settings with current view status, then return appropriate data */
        switch (saction->mode) {
@@ -161,14 +161,15 @@ static short actedit_get_context (const bContext *C, bAnimContext *ac, SpaceActi
                        
                case SACTCONT_SHAPEKEY: /* 'ShapeKey Editor' */
                        ac->datatype= ANIMCONT_SHAPEKEY;
-                       ac->data= actedit_get_shapekeys(C, saction);
+                       ac->data= actedit_get_shapekeys(ac, saction);
                        
                        ac->mode= saction->mode;
                        return 1;
                        
                case SACTCONT_GPENCIL: /* Grease Pencil */ // XXX review how this mode is handled...
                        ac->datatype=ANIMCONT_GPENCIL;
-                       ac->data= CTX_wm_screen(C); // FIXME: add that dopesheet type thing here!
+                       //ac->data= CTX_wm_screen(C); // FIXME: add that dopesheet type thing here!
+                       ac->data= NULL; // !!!
                        
                        ac->mode= saction->mode;
                        return 1;
@@ -195,7 +196,7 @@ static short actedit_get_context (const bContext *C, bAnimContext *ac, SpaceActi
 /* ----------- Private Stuff - IPO Editor ------------- */
 
 /* Get data being edited in IPO Editor (depending on current 'mode') */
-static short ipoedit_get_context (const bContext *C, bAnimContext *ac, SpaceIpo *sipo)
+static short ipoedit_get_context (bAnimContext *ac, SpaceIpo *sipo)
 {
        // XXX FIXME...
        return 0;
@@ -203,44 +204,29 @@ static short ipoedit_get_context (const bContext *C, bAnimContext *ac, SpaceIpo
 
 /* ----------- Public API --------------- */
 
-/* Obtain current anim-data context from Blender Context info 
+/* Obtain current anim-data context, given that context info from Blender context has already been set 
  *     - AnimContext to write to is provided as pointer to var on stack so that we don't have
  *       allocation/freeing costs (which are not that avoidable with channels).
- *     - 
  */
-short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
+short ANIM_animdata_context_getdata (bAnimContext *ac)
 {
-       ScrArea *sa= CTX_wm_area(C);
-       ARegion *ar= CTX_wm_region(C);
-       Scene *scene= CTX_data_scene(C);
+       ScrArea *sa= ac->sa;
        short ok= 0;
        
-       /* clear old context info */
-       if (ac == NULL) return 0;
-       memset(ac, 0, sizeof(bAnimContext));
-       
-       /* set default context settings */
-       ac->scene= scene;
-       ac->obact= (scene && scene->basact)?  scene->basact->object : NULL;
-       ac->sa= sa;
-       ac->ar= ar;
-       ac->spacetype= (sa) ? sa->spacetype : 0;
-       ac->regiontype= (ar) ? ar->regiontype : 0;
-       
        /* context depends on editor we are currently in */
        if (sa) {
                switch (sa->spacetype) {
                        case SPACE_ACTION:
                        {
-                               SpaceAction *saction= (SpaceAction *)CTX_wm_space_data(C);
-                               ok= actedit_get_context(C, ac, saction);
+                               SpaceAction *saction= (SpaceAction *)sa->spacedata.first;
+                               ok= actedit_get_context(ac, saction);
                        }
                                break;
                                
                        case SPACE_IPO:
                        {
-                               SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
-                               ok= ipoedit_get_context(C, ac, sipo);
+                               SpaceIpo *sipo= (SpaceIpo *)sa->spacedata.first;
+                               ok= ipoedit_get_context(ac, sipo);
                        }
                                break;
                }
@@ -253,6 +239,33 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
                return 0;
 }
 
+/* Obtain current anim-data context from Blender Context info 
+ *     - AnimContext to write to is provided as pointer to var on stack so that we don't have
+ *       allocation/freeing costs (which are not that avoidable with channels).
+ *     - Clears data and sets the information from Blender Context which is useful
+ */
+short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
+{
+       ScrArea *sa= CTX_wm_area(C);
+       ARegion *ar= CTX_wm_region(C);
+       Scene *scene= CTX_data_scene(C);
+       
+       /* clear old context info */
+       if (ac == NULL) return 0;
+       memset(ac, 0, sizeof(bAnimContext));
+       
+       /* get useful default context settings from context */
+       ac->scene= scene;
+       ac->obact= (scene && scene->basact)?  scene->basact->object : NULL;
+       ac->sa= sa;
+       ac->ar= ar;
+       ac->spacetype= (sa) ? sa->spacetype : 0;
+       ac->regiontype= (ar) ? ar->regiontype : 0;
+       
+       /* get data context info */
+       return ANIM_animdata_context_getdata(ac);
+}
+
 /* ************************************************************ */
 /* Blender Data <-- Filter --> Channels to be operated on */
 
index 4e55f8c364ca5824af74c3cbbd78509fe00467bd..f5cd576c8a36943403692ed7b405d03475c889dd 100644 (file)
@@ -229,6 +229,12 @@ int ANIM_animdata_filter(ListBase *anim_data, int filter_mode, void *data, short
  */
 short ANIM_animdata_get_context(const struct bContext *C, bAnimContext *ac);
 
+/* Obtain current anim-data context (from Animation Editor) given 
+ * that Blender Context info has already been set. 
+ * Returns whether the operation was successful.
+ */
+short ANIM_animdata_context_getdata(bAnimContext *ac);
+
 /* ************************************************ */
 /* DRAWING API */
 // XXX should this get its own header file?
index 90107bee33936abe6f4f1b9908cc1e95e2b81218..bb333b2cfbb92aa3fdae433570944c7f468fa03b 100644 (file)
@@ -1107,8 +1107,6 @@ int transformEnd(TransInfo *t)
 #endif
                return 1;
        }
-       
-       t->context= NULL;
        t->event = NULL;
        
        return 0;
index 68be5f357904d6b44e139bd2a4792e4e58e65070..dc7949ed0ab4e2a3d02c9b054a45b15e0b80852e 100644 (file)
@@ -234,7 +234,6 @@ typedef struct TransInfo {
        /*************** NEW STUFF *********************/
 
        float           values[4];
-       struct bContext *context;
        void            *view;
        struct ScrArea  *sa;
        struct ARegion  *ar;
index 36deae8b98e054354a8677fad5fbc97f52f4a50b..fc32ac5a846f3cd0afd48ea1ab5967169bfd2c0b 100644 (file)
@@ -2575,6 +2575,8 @@ void flushTransIpoData(TransInfo *t)
        
        /* flush to 2d vector from internally used 3d vector */
        for (a=0, td= t->data2d; a<t->total; a++, td++) {
+               // FIXME: autosnap needs to be here...
+               
                /* we need to unapply the nla-scaling from the time in some situations */
                if (NLA_IPO_SCALED)
                        td->loc2d[0]= get_action_frame(OBACT, td->loc[0]);
@@ -3974,18 +3976,22 @@ void special_aftertrans_update(TransInfo *t)
        
        if (t->spacetype == SPACE_ACTION) {
                SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
-               Scene *scene= NULL;
+               Scene *scene;
                bAnimContext ac;
                
-               /* determine what type of data we are operating on */
-               if (ANIM_animdata_get_context(t->context, &ac) == 0) {
-                       printf("space action transform -> special aftertrans exit. no context \n"); // XXX
-                       return;
-               }
+               /* initialise relevant anim-context 'context' data from TransInfo data */
+                       /* NOTE: sync this with the code in ANIM_animdata_get_context() */
+               memset(&ac, 0, sizeof(bAnimContext));
                
-               /* get pointers to useful data */
-               scene= ac.scene;
-               ob = OBACT;
+               scene= ac.scene= t->scene;
+               ob= ac.obact= OBACT;
+               ac.sa= t->sa;
+               ac.ar= t->ar;
+               ac.spacetype= (t->sa)? t->sa->spacetype : 0;
+               ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+               
+               if (ANIM_animdata_context_getdata(&ac) == 0)
+                       return;
                
                if (ac.datatype == ANIMCONT_DOPESHEET) {
                        ListBase anim_data = {NULL, NULL};
index 1bac195911ee9c9c15026c5ff41a94d6d4acb417..25413d25b9d218568ee71ed4aed4187a4e6d5fbb 100644 (file)
@@ -674,7 +674,6 @@ void initTransInfo (bContext *C, TransInfo *t, wmEvent *event)
 //     else if(G.f & G_PARTICLEEDIT) G.moving= G_TRANSFORM_PARTICLE;
 //     else G.moving= G_TRANSFORM_OBJ;
        
-       t->context= C;
        t->scene = sce;
        t->sa = sa;
        t->ar = ar;
index 4ecb9358cc706652acf9cbf0fc18af7cb5b6ffd1..abd31801ca6165b11bca86a20dd5decb286aa65c 100644 (file)
@@ -63,10 +63,6 @@ static int transform_modal(bContext *C, wmOperator *op, wmEvent *event)
 {
        TransInfo *t = op->customdata;
        
-       /* need to set context here, otherwise we get crashes with things that use context */
-       // XXX this seems quite hackish - Aligorith
-       t->context= C;
-       
        transformEvent(t, event);
        
        transformApply(t);