As discussed on the mailing list, removing the non-functional,
authorJoshua Leung <aligorith@gmail.com>
Sun, 6 Nov 2011 05:46:45 +0000 (05:46 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sun, 6 Nov 2011 05:46:45 +0000 (05:46 +0000)
incompatible, and unmaintainable Time Offset cruft.

- Slow Parenting lives another day (just), although it now carries
appropriate cautionary disclaimers. It's only really for the Game
Engine nowadays, as that's the only place where it can possibly work
with any reliability.
- "Animation Hacks" panel is now "Relations Extras". I could've merged
the two panels, though I figured these options weren't that frequently
used to justify taking up screen-space by default along with the panel

13 files changed:
release/scripts/startup/bl_ui/properties_object.py
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/group.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/pointcache.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/animation/anim_draw.c
source/blender/editors/animation/keyframing.c
source/blender/editors/include/ED_anim_api.h
source/blender/editors/object/object_relations.c
source/blender/editors/space_view3d/drawobject.c
source/blender/makesdna/DNA_object_types.h
source/blender/makesrna/intern/rna_object.c

index 0779debb1029821556cef84d0f92959519343a4e..a359d58b59e1d7a9beb7defbc16a2a3f70218fc6 100644 (file)
@@ -257,10 +257,8 @@ class OBJECT_PT_duplication(ObjectButtonsPanel, Panel):
             layout.prop(ob, "dupli_group", text="Group")
 
 
-# XXX: the following options are all quite buggy, ancient hacks that should be dropped
-
-class OBJECT_PT_animation(ObjectButtonsPanel, Panel):
-    bl_label = "Animation Hacks"
+class OBJECT_PT_relations_extras(ObjectButtonsPanel, Panel):
+    bl_label = "Relations Extras"
     bl_options = {'DEFAULT_CLOSED'}
 
     def draw(self, context):
@@ -269,23 +267,17 @@ class OBJECT_PT_animation(ObjectButtonsPanel, Panel):
         ob = context.object
 
         split = layout.split()
-
-        col = split.column()
-        col.label(text="Time Offset:")
-        col.prop(ob, "use_time_offset_edit", text="Edit")
-        row = col.row()
-        row.prop(ob, "use_time_offset_parent", text="Parent")
-        row.active = (ob.parent is not None)
-        row = col.row()
-        row.prop(ob, "use_slow_parent")
-        row.active = (ob.parent is not None)
-        col.prop(ob, "time_offset", text="Offset")
-
-        # XXX: these are still used for a few curve-related tracking features
+        
         col = split.column()
         col.label(text="Tracking Axes:")
         col.prop(ob, "track_axis", text="Axis")
         col.prop(ob, "up_axis", text="Up Axis")
+        
+        col = split.column()
+        col.prop(ob, "use_slow_parent")
+        row = col.row()
+        row.active = ((ob.parent is not None) and (ob.use_slow_parent))
+        row.prop(ob, "slow_parent_offset", text="Offset")
 
 
 from bl_ui.properties_animviz import (
index d6139a680ec226b4d5ae5d86d1b5e4e3de930504..725ebfaa645c3539a804cc22567d44f08f2f3da4 100644 (file)
@@ -86,7 +86,7 @@ void set_mblur_offs(float blur);
 void set_field_offs(float field);
 void disable_speed_curve(int val);
 
-float bsystem_time(struct Scene *scene, struct Object *ob, float cfra, float ofs);
+float bsystem_time(struct Scene *scene, struct Object *ob, float cfra, float ofs); // XXX: last arg unused?
 void object_scale_to_mat3(struct Object *ob, float mat[][3]);
 void object_rot_to_mat3(struct Object *ob, float mat[][3]);
 void object_mat3_to_rot(struct Object *ob, float mat[][3], short use_compat);
@@ -118,7 +118,6 @@ void object_tfm_restore(struct Object *ob, void *obtfm_pt);
 void object_handle_update(struct Scene *scene, struct Object *ob);
 void object_sculpt_modifiers_changed(struct Object *ob);
 
-float give_timeoffset(struct Object *ob);
 int give_obdata_texspace(struct Object *ob, short **texflag, float **loc, float **size, float **rot);
 
 int object_insert_ptcache(struct Object *ob);
index cd025ecb559b8d75142ddd85253b5f37be3723e7..76c3e6e55020fb8d036a879dc0e3915c4f73c7c0 100644 (file)
@@ -276,8 +276,9 @@ void group_tag_recalc(Group *group)
 int group_is_animated(Object *parent, Group *group)
 {
        GroupObject *go;
-
-       if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first)
+       
+       // XXX: old animsys depreceated...
+       if(parent->nlastrips.first)
                return 1;
 
        for(go= group->gobject.first; go; go= go->next)
@@ -343,12 +344,11 @@ void group_handle_recalc_and_update(Scene *scene, Object *UNUSED(parent), Group
           * but when its enabled at some point it will need to be changed so as not to update so much - campbell */
 
        /* if animated group... */
-       if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first) {
+       if(parent->nlastrips.first) {
                int cfrao;
                
                /* switch to local time */
                cfrao= scene->r.cfra;
-               scene->r.cfra -= (int)floor(give_timeoffset(parent) + 0.5f);
                
                /* we need a DAG per group... */
                for(go= group->gobject.first; go; go= go->next) {
index a78b010392ef360c9dd208889906db1b2d89d7d6..5782ae5f2d76d27b4f81de9a61b8bf1d7133ae90 100644 (file)
@@ -1431,15 +1431,7 @@ float bsystem_time(struct Scene *scene, Object *UNUSED(ob), float cfra, float of
        
        /* global time */
        if (scene)
-               cfra*= scene->r.framelen;       
-       
-#if 0 // XXX old animation system
-       if (ob) {
-               /* ofset frames */
-               if ((ob->ipoflag & OB_OFFS_PARENT) && (ob->partype & PARSLOW)==0) 
-                       cfra-= give_timeoffset(ob);
-       }
-#endif // XXX old animation system
+               cfra *= scene->r.framelen;      
        
        cfra-= ofs;
 
@@ -1592,12 +1584,6 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
                makeDispListCurveTypes(scene, par, 0);
        if(cu->path==NULL) return;
        
-       /* exception, timeoffset is regarded as distance offset */
-       if(cu->flag & CU_OFFS_PATHDIST) {
-               timeoffs = give_timeoffset(ob);
-               SWAP(float, sf_orig, ob->sf);
-       }
-       
        /* catch exceptions: feature for nla stride editing */
        if(ob->ipoflag & OB_DISABLE_PATH) {
                ctime= 0.0f;
@@ -1618,7 +1604,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
                CLAMP(ctime, 0.0f, 1.0f);
        }
        else {
-               ctime= scene->r.cfra - give_timeoffset(ob);
+               ctime= scene->r.cfra;
                if (IS_EQF(cu->pathlen, 0.0f) == 0)
                        ctime /= cu->pathlen;
                
@@ -1862,9 +1848,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
        if(ob->parent) {
                Object *par= ob->parent;
                
-               // XXX depreceated - animsys
-               if(ob->ipoflag & OB_OFFS_PARENT) ctime-= give_timeoffset(ob);
-               
                /* hurms, code below conflicts with depgraph... (ton) */
                /* and even worse, it gives bad effects for NLA stride too (try ctime != par->ctime, with MBlur) */
                if(no_parent_ipo==0 && stime != par->ctime) {
@@ -1873,17 +1856,20 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
                        
                        if(par->proxy_from);    // was a copied matrix, no where_is! bad...
                        else where_is_object_time(scene, par, ctime);
-
+                       
                        solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
-
+                       
                        *par= tmp;
                }
                else
                        solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
                
+               /* "slow parent" is definitely not threadsafe, and may also give bad results jumping around 
+                * An old-fashioned hack which probably doesn't really cut it anymore
+                */
                if(ob->partype & PARSLOW) {
                        // include framerate
-                       fac1= ( 1.0f / (1.0f + (float)fabs(give_timeoffset(ob))) );
+                       fac1= ( 1.0f / (1.0f + (float)fabs(ob->sf)) );
                        if(fac1 >= 1.0f) return;
                        fac2= 1.0f-fac1;
                        
@@ -2006,7 +1992,6 @@ void where_is_object_simul(Scene *scene, Object *ob)
 for a lamp that is the child of another object */
 {
        Object *par;
-       //Ipo *ipo;
        float *fp1, *fp2;
        float slowmat[4][4];
        float fac1, fac2;
@@ -2017,10 +2002,9 @@ for a lamp that is the child of another object */
                par= ob->parent;
                
                solve_parenting(scene, ob, par, ob->obmat, slowmat, 1);
-
+               
                if(ob->partype & PARSLOW) {
-
-                       fac1= (float)(1.0/(1.0+ fabs(give_timeoffset(ob))));
+                       fac1= (float)(1.0/(1.0+ fabs(ob->sf)));
                        fac2= 1.0f-fac1;
                        fp1= ob->obmat[0];
                        fp2= slowmat[0];
@@ -2028,7 +2012,6 @@ for a lamp that is the child of another object */
                                fp1[0]= fac1*fp1[0] + fac2*fp2[0];
                        }
                }
-               
        }
        else {
                object_to_mat4(ob, ob->obmat);
@@ -2554,15 +2537,6 @@ void object_sculpt_modifiers_changed(Object *ob)
        }
 }
 
-float give_timeoffset(Object *ob)
-{
-       if ((ob->ipoflag & OB_OFFS_PARENTADD) && ob->parent) {
-               return ob->sf + give_timeoffset(ob->parent);
-       } else {
-               return ob->sf;
-       }
-}
-
 int give_obdata_texspace(Object *ob, short **texflag, float **loc, float **size, float **rot)
 {
        
index ae12ad8e66f9f51536442d19e7dfb23e287b8d5b..b327afa7df769d1ab6813a0ed1a0717076cf91c3 100644 (file)
@@ -2163,7 +2163,7 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
                 * system timing. */
 #if 0
                if ((ob->partype & PARSLOW)==0) {
-                       offset= give_timeoffset(ob);
+                       offset= ob->sf;
 
                        *startframe += (int)(offset+0.5f);
                        *endframe += (int)(offset+0.5f);
index 75b5213d576c854d50d51ff5863c7559fa45bba2..e17f8c720a563a1c0590d29079dd646f08b194ba 100644 (file)
@@ -7155,7 +7155,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                while(ob) {
                        if(ob->transflag & 1) {
                                ob->transflag -= 1;
-                               ob->ipoflag |= OB_OFFS_OB;
+                               //ob->ipoflag |= OB_OFFS_OB;
                        }
                        ob= ob->id.next;
                }
@@ -7186,7 +7186,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                }
                ob= main->object.first;
                while(ob) {
-                       ob->ipoflag |= OB_OFFS_PARENT;
+                       //ob->ipoflag |= OB_OFFS_PARENT;
                        if(ob->dt==0) ob->dt= OB_SOLID;
                        ob= ob->id.next;
                }
index 2774bd2cda483bd6a2082c59e86b6366def7126f..569125e1055566b402be91f28bc3a98711c10a3a 100644 (file)
@@ -237,28 +237,6 @@ void ANIM_draw_cfra (const bContext *C, View2D *v2d, short flag)
                glVertex2fv(vec);
        glEnd();
        
-       /* Draw dark green line if slow-parenting/time-offset is enabled */
-       if (flag & DRAWCFRA_SHOW_TIMEOFS) {
-               Object *ob= OBACT;
-               if(ob) {
-                       float timeoffset= give_timeoffset(ob);
-                       // XXX ob->ipoflag is depreceated!
-                       if ((ob->ipoflag & OB_OFFS_OB) && (timeoffset != 0.0f)) {
-                               vec[0]-= timeoffset; /* could avoid calling twice */
-                               
-                               UI_ThemeColorShade(TH_CFRAME, -30);
-                               
-                               glBegin(GL_LINE_STRIP);
-                                       /*vec[1]= v2d->cur.ymax;*/ // this is set already. this line is only included
-                                       glVertex2fv(vec);
-                                       
-                                       vec[1]= v2d->cur.ymin;
-                                       glVertex2fv(vec);
-                               glEnd();
-                       }
-               }
-       }
-       
        glLineWidth(1.0);
        
        /* Draw current frame number in a little box */
index fb34245d3385eef5f09e640152af9a1836872a37..9f466ef52d303babaac9b7ee799fb6abaa172054 100644 (file)
@@ -911,20 +911,6 @@ short insert_keyframe (ReportList *reports, ID *id, bAction *act, const char gro
                /* apply NLA-mapping to frame to use (if applicable) */
                cfra= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP);
        }
-
-#if 0
-       /* apply special time tweaking */
-               // XXX check on this stuff...
-       if (GS(id->name) == ID_OB) {
-               //Object *ob= (Object *)id;
-               
-               /* ancient time-offset cruft */
-               //if ( (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)) ) {
-               //      /* actually frametofloat calc again! */
-               //      cfra-= give_timeoffset(ob)*scene->r.framelen;
-               //}
-       }
-#endif
        
        /* key entire array convenience method */
        if (array_index == -1) { 
@@ -1018,20 +1004,6 @@ short delete_keyframe (ReportList *reports, ID *id, bAction *act, const char gro
                }
        }
        
-#if 0
-       /* apply special time tweaking */
-               // XXX check on this stuff...
-       if (GS(id->name) == ID_OB) {
-               //Object *ob= (Object *)id;
-               
-               /* ancient time-offset cruft */
-               //if ( (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)) ) {
-               //      /* actually frametofloat calc again! */
-               //      cfra-= give_timeoffset(ob)*scene->r.framelen;
-               //}
-       }
-#endif
-       
        /* key entire array convenience method */
        if (array_index == -1) { 
                array_index= 0;
index 0ac5a9e46ce38381c5cb76000e308d9249982ba6..6b449f68e1d8e189c61b5624dadc4012130c693d 100644 (file)
@@ -462,10 +462,8 @@ enum {
        DRAWCFRA_SHOW_NUMBOX    = (1<<0),
                /* time indication in seconds or frames */
        DRAWCFRA_UNIT_SECONDS   = (1<<1),
-               /* show time-offset line */
-       DRAWCFRA_SHOW_TIMEOFS   = (1<<2),
                /* draw indicator extra wide (for timeline) */
-       DRAWCFRA_WIDE                   = (1<<3)
+       DRAWCFRA_WIDE                   = (1<<2)
 } eAnimEditDraw_CurrentFrame; 
 
 /* main call to draw current-frame indicator in an Animation Editor */
index e9575c85c5fd39ad1c668d8353b5dd41ad4ce995..94e2f0aae0090ce234519ea74011f2b5cfa450fa 100644 (file)
@@ -655,7 +655,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
                                        data = con->data;
                                        data->tar = par;
                                        
-                                       get_constraint_target_matrix(scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra - give_timeoffset(ob));
+                                       get_constraint_target_matrix(scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra);
                                        sub_v3_v3v3(vec, ob->obmat[3], cmat[3]);
                                        
                                        ob->loc[0] = vec[0];
index 987c3984b77f0a5f7eb8c6e05d3e78d60fc810b9..da33f48116dc9ffe0ecc6b2fde5581f9d5eda963 100644 (file)
@@ -5748,7 +5748,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        Object *ob;
        Curve *cu;
        RegionView3D *rv3d= ar->regiondata;
-       //float cfraont;
        float vec1[3], vec2[3];
        unsigned int col=0;
        int /*sel, drawtype,*/ colindex= 0;
@@ -5787,83 +5786,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        /* no return after this point, otherwise leaks */
        view3d_cached_text_draw_begin();
        
-
-       /* draw keys? */
-#if 0 // XXX old animation system
-       if(base==(scene->basact) || (base->flag & (SELECT+BA_WAS_SEL))) {
-               if(flag==0 && warning_recursive==0 && ob!=scene->obedit) {
-                       if(ob->ipo && ob->ipo->showkey && (ob->ipoflag & OB_DRAWKEY)) {
-                               ListBase elems;
-                               CfraElem *ce;
-                               float temp[7][3];
-
-                               warning_recursive= 1;
-
-                               elems.first= elems.last= 0;
-                               // warning: no longer checks for certain ob-keys only... (so does this need to use the proper ipokeys then?)
-                               make_cfra_list(ob->ipo, &elems); 
-
-                               cfraont= (scene->r.cfra);
-                               drawtype= v3d->drawtype;
-                               if(drawtype>OB_WIRE) v3d->drawtype= OB_WIRE;
-                               sel= base->flag;
-                               memcpy(temp, &ob->loc, 7*3*sizeof(float));
-
-                               ipoflag= ob->ipoflag;
-                               ob->ipoflag &= ~OB_OFFS_OB;
-
-                               set_no_parent_ipo(1);
-                               disable_speed_curve(1);
-
-                               if ((ob->ipoflag & OB_DRAWKEYSEL)==0) {
-                                       ce= elems.first;
-                                       while(ce) {
-                                               if(!ce->sel) {
-                                                       (scene->r.cfra)= ce->cfra/scene->r.framelen;
-
-                                                       base->flag= 0;
-
-                                                       where_is_object_time(scene, ob, (scene->r.cfra));
-                                                       draw_object(scene, ar, v3d, base, 0);
-                                               }
-                                               ce= ce->next;
-                                       }
-                               }
-
-                               ce= elems.first;
-                               while(ce) {
-                                       if(ce->sel) {
-                                               (scene->r.cfra)= ce->cfra/scene->r.framelen;
-
-                                               base->flag= SELECT;
-
-                                               where_is_object_time(scene, ob, (scene->r.cfra));
-                                               draw_object(scene, ar, v3d, base, 0);
-                                       }
-                                       ce= ce->next;
-                               }
-
-                               set_no_parent_ipo(0);
-                               disable_speed_curve(0);
-
-                               base->flag= sel;
-                               ob->ipoflag= ipoflag;
-
-                               /* restore icu->curval */
-                               (scene->r.cfra)= cfraont;
-
-                               memcpy(&ob->loc, temp, 7*3*sizeof(float));
-                               where_is_object(scene, ob);
-                               v3d->drawtype= drawtype;
-
-                               BLI_freelistN(&elems);
-
-                               warning_recursive= 0;
-                       }
-               }
-       }
-#endif // XXX old animation system
-
        /* patch? children objects with a timeoffs change the parents. How to solve! */
        /* if( ((int)ob->ctime) != F_(scene->r.cfra)) where_is_object(scene, ob); */
        
@@ -5921,7 +5843,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                                        if(base->flag & (SELECT+BA_WAS_SEL)) {
                                                /* uses darker active color for non-active + selected*/
                                                theme_id= TH_GROUP_ACTIVE;
-
+                                               
                                                if(scene->basact != base) {
                                                        theme_shade= -16;
                                                }
@@ -6510,7 +6432,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                                        for (ct= targets.first; ct; ct= ct->next) {
                                                /* calculate target's matrix */
                                                if (cti->get_target_matrix) 
-                                                       cti->get_target_matrix(curcon, cob, ct, bsystem_time(scene, ob, (float)(scene->r.cfra), give_timeoffset(ob)));
+                                                       cti->get_target_matrix(curcon, cob, ct, bsystem_time(scene, ob, (float)(scene->r.cfra), 0.0f));
                                                else
                                                        unit_m4(ct->matrix);
                                                
index 3306b9e97bcf7f0590cbba77a66a25c90d2c6569..29568fdd0fbe14232981bc7507e1ff14b3e10c04 100644 (file)
@@ -163,7 +163,8 @@ typedef struct Object {
        
        short transflag, protectflag;   /* transformation settings and transform locks  */
        short trackflag, upflag;
-       short nlaflag, ipoflag;         // xxx depreceated... old animation system
+       short nlaflag;                          /* used for DopeSheet filtering settings (expanded/collapsed) */
+       short ipoflag;                          // xxx depreceated... old animation system
        short scaflag;                          /* ui state for game logic */
        char scavisflag;                        /* more display settings for game logic */
        char pad5;
@@ -325,11 +326,12 @@ typedef struct DupliObject {
 #define PARVERT1               5
 #define PARVERT3               6
 #define PARBONE                        7
+
+       /* slow parenting - is not threadsafe and/or may give errors after jumping  */
 #define PARSLOW                        16
 
 /* (short) transflag */
-/*#define OB_OFFS_LOCAL                1*/ /*UNUSED*/
-/* #define OB_QUAT                             2 */ /* never used, free flag */
+/* flags 1 and 2 were unused or relics from past features */
 #define OB_NEG_SCALE           4
 #define OB_DUPLI                       (8+16+256+512+2048)
 #define OB_DUPLIFRAMES         8
@@ -345,24 +347,12 @@ typedef struct DupliObject {
 #define OB_NO_CONSTRAINTS      8192 /* runtime constraints disable */
 
 /* (short) ipoflag */
-       // XXX depreceated - old animation system crap
-#define OB_DRAWKEY                     1
-#define OB_DRAWKEYSEL          2
-#define OB_OFFS_OB                     4
-/* #define OB_OFFS_MAT         8 */ /*UNUSED*/
-/* #define OB_OFFS_VKEY                16 */ /*UNUSED*/
-/* #define OB_OFFS_PATH                32 */ /*UNUSED*/
-#define OB_OFFS_PARENT         64
-#define OB_OFFS_PARTICLE       128
-       /* get ipo from from action or not? */
-#define OB_ACTION_OB           256
-#define OB_ACTION_KEY          512
-       /* for stride edit */
+/* XXX: many old flags for features removed due to incompatability 
+ * with new system and/or other design issues were here 
+ */
+       /* for stride/path editing (XXX: NEEDS REVIEW) */
 #define OB_DISABLE_PATH                1024
 
-#define OB_OFFS_PARENTADD      2048
-
-
 /* (short) trackflag / upflag */
 #define OB_POSX                        0
 #define OB_POSY                        1
@@ -529,10 +519,7 @@ typedef struct DupliObject {
 #define OB_SHAPE_EDIT_MODE     4
 
 /* ob->nlaflag */
-       // XXX depreceated - old animation system
-#define OB_NLA_OVERRIDE                (1<<0)
-#define OB_NLA_COLLAPSED       (1<<1)
-
+       /* WARNING: flags (1<<0) and (1<<1) were from old animsys */
        /* object-channel expanded status */
 #define OB_ADS_COLLAPSED       (1<<10)
        /* object's ipo-block */
index be2375f57162fbd06e27879db4f4bc2cf798b0f5..6e797146f12ef3f47d049d12e85fabb26e203e3e 100644 (file)
@@ -2210,13 +2210,20 @@ static void rna_def_object(BlenderRNA *brna)
        rna_def_animviz_common(srna);
        rna_def_motionpath_common(srna);
        
-       /* duplicates */
-               // XXX: evil old crap
+       /* slow parenting */
+       // XXX: evil old crap
        prop= RNA_def_property(srna, "use_slow_parent", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "partype", PARSLOW);
-       RNA_def_property_ui_text(prop, "Slow Parent", "Create a delay in the parent relationship");
+       RNA_def_property_ui_text(prop, "Slow Parent", "Create a delay in the parent relationship (Beware: this isn't renderfarm safe and may be invalid after jumping around the timeline)");
        RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
-
+       
+       prop= RNA_def_property(srna, "slow_parent_offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_TIME);
+       RNA_def_property_float_sdna(prop, NULL, "sf");
+       RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
+       RNA_def_property_ui_text(prop, "Slow Parent Offset", "Amount of delay in the parent relationship");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
+       
+       /* duplicates */
        prop= RNA_def_property(srna, "dupli_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "transflag");
        RNA_def_property_enum_items(prop, dupli_items);
@@ -2285,34 +2292,7 @@ static void rna_def_object(BlenderRNA *brna)
        prop= RNA_def_property(srna, "is_duplicator", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_DUPLI);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
-       /* time offset */
-       prop= RNA_def_property(srna, "time_offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_TIME);
-       RNA_def_property_float_sdna(prop, NULL, "sf");
-       RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
-       RNA_def_property_ui_text(prop, "Time Offset", "Animation offset in frames for F-Curve and dupligroup instances");
-       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
-
-       prop= RNA_def_property(srna, "use_time_offset_edit", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_OB);
-       RNA_def_property_ui_text(prop, "Time Offset Edit",
-                                "Use time offset when inserting keys and display time offset for F-Curve and action views");
-
-       prop= RNA_def_property(srna, "use_time_offset_parent", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_PARENT);
-       RNA_def_property_ui_text(prop, "Time Offset Parent", "Apply the time offset to this object's parent relationship");
-       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
-
-       prop= RNA_def_property(srna, "use_time_offset_particle", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_PARTICLE);
-       RNA_def_property_ui_text(prop, "Time Offset Particle", "Let the time offset work on the particle effect");
-       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
-
-       prop= RNA_def_property(srna, "use_time_offset_add_parent", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_PARENTADD);
-       RNA_def_property_ui_text(prop, "Time Offset Add Parent", "Add the parent's time offset value");
-       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
-
+       
        /* drawing */
        prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "dt");