diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_action.h | 4 | ||||
-rw-r--r-- | source/blender/include/BIF_editconstraint.h | 3 | ||||
-rw-r--r-- | source/blender/src/buttons_object.c | 2 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 3 | ||||
-rw-r--r-- | source/blender/src/drawview.c | 34 | ||||
-rw-r--r-- | source/blender/src/editconstraint.c | 55 | ||||
-rw-r--r-- | source/blender/src/editobject.c | 97 | ||||
-rw-r--r-- | source/blender/src/headerbuttons.c | 9 |
8 files changed, 197 insertions, 10 deletions
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 0a187450c79..6942a426d8f 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -170,8 +170,8 @@ enum { POSE_UNUSED5 = 0x00000080, POSE_OBMAT = 0x00000100, POSE_PARMAT = 0x00000200, - PCHAN_DONE = 0x00000400 - + PCHAN_DONE = 0x00000400, + PCHAN_TRANS_UPDATE = 0x00000800 }; #endif diff --git a/source/blender/include/BIF_editconstraint.h b/source/blender/include/BIF_editconstraint.h index 2982abd5ec8..963b9fb4e08 100644 --- a/source/blender/include/BIF_editconstraint.h +++ b/source/blender/include/BIF_editconstraint.h @@ -56,8 +56,7 @@ struct ListBase *get_constraint_client_channels (int forcevalid); struct ListBase *get_constraint_client(char *name, short *clienttype, void** clientdata); int test_constraints (struct Object *owner, const char *substring, int disable); void test_scene_constraints (void); - -/* void unique_constraint_name (struct bConstraint *con, struct ListBase *list); */ +struct Object *get_con_target(struct bConstraint *constraint); #endif diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 311966f7f73..54afa9caf66 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -731,6 +731,8 @@ static uiBlock *add_constraintmenu(void *arg_unused) void do_constraintbuts(unsigned short event) { + clear_object_constraint_status(OBACT); + switch(event) { case B_CONSTRAINT_CHANGENAME: break; diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index a305fda18b0..92646ec0c5c 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -3551,7 +3551,8 @@ void draw_object(Base *base) case OB_MESH: me= ob->data; -#if 1 +#if 0 + /* this is a source of great slowness */ #ifdef __NLA /* Force a refresh of the display list if the parent is an armature */ if (ob->parent && ob->parent->type==OB_ARMATURE && ob->partype==PARSKEL){ diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index 559ca9443bd..bfe4506de92 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -1572,10 +1572,16 @@ void drawview3dspace(ScrArea *sa, void *spacedata) } } +#if 0 + /* Lets be a little more selective about when and where we do this, + * or else armatures/poses/displists get recalculated all of the + * time + */ /* Clear the constraint "done" flags */ for (base = G.scene->base.first; base; base=base->next){ clear_object_constraint_status(base->object); } +#endif /* draw set first */ if(G.scene->set) { @@ -1780,6 +1786,12 @@ void drawview3d_render(struct View3D *v3d) /* abuse! to make sure it doesnt draw the helpstuff */ G.f |= G_SIMULATION; + /* Clear the constraint "done" flags -- this must be done + * before displists are calculated for objects that are + * deformed by armatures */ + for (base = G.scene->base.first; base; base=base->next){ + clear_object_constraint_status(base->object); + } do_all_ipos(); BPY_do_all_scripts(SCRIPT_FRAMECHANGED); do_all_keys(); @@ -2244,7 +2256,8 @@ void inner_play_anim_loop(int init, int mode) static ScrArea *oldsa; static double swaptime; static int curmode; - + Base *base; + /* init */ if(init) { oldsa= curarea; @@ -2258,6 +2271,13 @@ void inner_play_anim_loop(int init, int mode) } set_timecursor(CFRA); + + /* Clear the constraint "done" flags -- this must be done + * before displists are calculated for objects that are + * deformed by armatures */ + for (base = G.scene->base.first; base; base=base->next){ + clear_object_constraint_status(base->object); + } do_all_ipos(); BPY_do_all_scripts(SCRIPT_FRAMECHANGED); do_all_keys(); @@ -2307,7 +2327,8 @@ int play_anim(int mode) int cfraont; unsigned short event=0; short val; - + Base *base; + /* patch for very very old scenes */ if(SFRA==0) SFRA= 1; if(EFRA==0) EFRA= 250; @@ -2356,7 +2377,14 @@ int play_anim(int mode) if(event==SPACEKEY); else CFRA= cfraont; - + + /* Clear the constraint "done" flags -- this must be done + * before displists are calculated for objects that are + * deformed by armatures */ + for (base = G.scene->base.first; base; base=base->next){ + clear_object_constraint_status(base->object); + } + do_all_ipos(); do_all_keys(); do_all_actions(); diff --git a/source/blender/src/editconstraint.c b/source/blender/src/editconstraint.c index 999a4d5f444..702e6a82573 100644 --- a/source/blender/src/editconstraint.c +++ b/source/blender/src/editconstraint.c @@ -774,3 +774,58 @@ bConstraintChannel *add_new_constraint_channel(const char* name) void add_influence_key_to_constraint (bConstraint *con){ printf("doesn't do anything yet\n"); } + +Object *get_con_target(bConstraint *constraint) +{ + /* + * If the target for this constraint is target, return a pointer + * to the name for this constraints subtarget ... NULL otherwise + */ + switch (constraint->type) { + + case CONSTRAINT_TYPE_ACTION: + { + bActionConstraint *data = constraint->data; + return data->tar; + } + break; + case CONSTRAINT_TYPE_LOCLIKE: + { + bLocateLikeConstraint *data = constraint->data; + return data->tar; + } + break; + case CONSTRAINT_TYPE_ROTLIKE: + { + bRotateLikeConstraint *data = constraint->data; + return data->tar; + } + break; + case CONSTRAINT_TYPE_KINEMATIC: + { + bKinematicConstraint *data = constraint->data; + return data->tar; + } + break; + case CONSTRAINT_TYPE_TRACKTO: + { + bTrackToConstraint *data = constraint->data; + return data->tar; + } + break; + case CONSTRAINT_TYPE_LOCKTRACK: + { + bLockTrackConstraint *data = constraint->data; + return data->tar; + } + break; + case CONSTRAINT_TYPE_FOLLOWPATH: + { + bFollowPathConstraint *data = constraint->data; + return data->tar; + } + break; + } + + return NULL; +} diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 71b3c4ec844..4f002f94670 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -447,6 +447,7 @@ void clear_object(char mode) case OB_ARMATURE: clear_armature (G.obpose, mode); #if 1 + clear_pose_constraint_status(G.obpose); make_displists_by_armature (G.obpose); #endif break; @@ -2589,6 +2590,88 @@ static Object *is_a_parent_selected(Object *ob) { return res; } +/*** POSE FIGURIN' -- START ***/ + +static void clear_pose_update_flag(Object *ob) { + /* Clear the flag for each pose channel that indicates that + * pose should be updated on every redraw + */ + bPoseChannel *chan; + + if (ob->pose) { + for (chan = ob->pose->chanbase.first; chan; + chan=chan->next){ + chan->flag &= ~PCHAN_TRANS_UPDATE; + } + } +} + +static void pose_flags_reset_done(Object *ob) { + /* Clear the constraint done status for every pose channe; + * that has been flagged as needing constant updating + */ + bPoseChannel *chan; + + if (ob->pose) { + for (chan = ob->pose->chanbase.first; chan; chan=chan->next){ + if (chan->flag & PCHAN_TRANS_UPDATE) { + chan->flag &= ~PCHAN_DONE; + } + + } + } + +} + +static int is_ob_constraint_target(Object *ob, ListBase *conlist) { + /* Is this object the target of a constraint in this list? + */ + + bConstraint *con; + + for (con=conlist->first; con; con=con->next) + { + if (get_con_target(con) == ob) + return 1; + } + return 0; + +} + +static int pose_do_update_flag(Object *ob) { + /* Figure out which pose channels need constant updating. + */ + Base *base; + bPoseChannel *chan; + int do_update = 0; + + if (ob->pose) { + for (chan = ob->pose->chanbase.first; chan; chan=chan->next){ + if (chan->constraints.first) { + for (base= FIRSTBASE; base; base= base->next) { + if (is_ob_constraint_target(base->object, + &chan->constraints)) { + if( (base->flag & SELECT) || (ob->flag & SELECT)) { + /* If this armature is selected, or if the + * object that is the target of a constraint + * is selected, then lets constantly update + * this pose channel. + */ + chan->flag |= PCHAN_TRANS_UPDATE; + do_update = 1; + } + } + } + } + } + } + + return do_update; +} + +/*** POSE FIGURIN' -- END ***/ + + static void setbaseflags_for_editing(int mode) /* 0,'g','r','s' */ { /* @@ -2624,7 +2707,10 @@ static void setbaseflags_for_editing(int mode) /* 0,'g','r','s' */ if(ob->track && TESTBASE(ob->track) && (base->flag & SELECT)==0) base->flag |= BA_PARSEL; } - + + if (pose_do_update_flag(base->object)) + base->flag |= BA_WHERE_UPDATE; + /* updates? */ if(ob->type==OB_IKA) { Ika *ika= ob->data; @@ -2681,6 +2767,8 @@ void clearbaseflags_for_editing() base->flag &= ~(BA_PARSEL+BA_WASSEL); base->flag &= ~(BA_DISP_UPDATE+BA_WHERE_UPDATE+BA_DO_IPO); + + clear_pose_update_flag(base->object); base= base->next; } @@ -3278,6 +3366,10 @@ void special_trans_update(int keyflags) base->object->partype |= PARSLOW; } else if(base->flag & BA_WHERE_UPDATE) { + /* deal with the armature case */ + pose_flags_reset_done(base->object); + make_displists_by_armature(base->object); + where_is_object(base->object); if(base->object->type==OB_IKA) { itterate_ika(base->object); @@ -3298,8 +3390,9 @@ void special_trans_update(int keyflags) } -#if 0 +#if 1 if (G.obpose && G.obpose->type == OB_ARMATURE) + clear_pose_constraint_status(G.obpose); make_displists_by_armature(G.obpose); #endif diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c index 03bbbb97fa9..6417dc6ec29 100644 --- a/source/blender/src/headerbuttons.c +++ b/source/blender/src/headerbuttons.c @@ -492,6 +492,8 @@ int std_libbuttons(uiBlock *block, short xco, short yco, void do_update_for_newframe(int mute) { + Base *base; + extern void audiostream_scrub(unsigned int frame); /* seqaudio.c */ allqueue(REDRAWVIEW3D, 0); @@ -505,6 +507,13 @@ void do_update_for_newframe(int mute) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWBUTSOBJECT, 0); + /* Clear the constraint "done" flags -- this must be done + * before displists are calculated for objects that are + * deformed by armatures */ + for (base = G.scene->base.first; base; base=base->next){ + clear_object_constraint_status(base->object); + } + /* layers/materials, object ipos are calculted in where_is_object (too) */ do_all_ipos(); BPY_do_all_scripts(SCRIPT_FRAMECHANGED); |