This commit broke armature animations in BGE. Reported here: http://projects.blender.org/tracker/index.php?func=detail&aid=21800&group_id=9&atid=306
<http://projects.blender.org/tracker/index.php?func=detail&aid=21800&group_id=9&atid=306> Cheers, Dalai 2010/3/26 Brecht Van Lommel <[email protected]> > Revision: 27766 > > http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27766 > Author: blendix > Date: 2010-03-26 11:33:53 +0100 (Fri, 26 Mar 2010) > > Log Message: > ----------- > Optimization for pose channel name lookups using a hash, makes > playback in one particular scene with 3 characters go from 10 to 13 fps. > (commit 27728 by Brecht from render25 branch) > > Modified Paths: > -------------- > trunk/blender/source/blender/blenkernel/BKE_action.h > trunk/blender/source/blender/blenkernel/intern/action.c > trunk/blender/source/blender/blenkernel/intern/armature.c > trunk/blender/source/blender/blenkernel/intern/object.c > trunk/blender/source/blender/blenloader/intern/readfile.c > trunk/blender/source/blender/editors/armature/editarmature.c > trunk/blender/source/blender/makesdna/DNA_action_types.h > trunk/blender/source/blender/makesrna/intern/rna_pose.c > > Modified: trunk/blender/source/blender/blenkernel/BKE_action.h > =================================================================== > --- trunk/blender/source/blender/blenkernel/BKE_action.h 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/blenkernel/BKE_action.h 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -129,6 +129,13 @@ > */ > void free_pose_channels(struct bPose *pose); > > +/** > + * Removes the hash for quick lookup of channels, must > + * be done when adding/removing channels. > + */ > +void make_pose_channels_hash(struct bPose *pose); > +void free_pose_channels_hash(struct bPose *pose); > + > /** > * Removes and deallocates all data from a pose, and also frees the pose. > */ > > Modified: trunk/blender/source/blender/blenkernel/intern/action.c > =================================================================== > --- trunk/blender/source/blender/blenkernel/intern/action.c 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/blenkernel/intern/action.c 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -56,8 +56,9 @@ > > #include "BIK_api.h" > > +#include "BLI_blenlib.h" > +#include "BLI_ghash.h" > #include "BLI_math.h" > -#include "BLI_blenlib.h" > > #include "RNA_access.h" > > @@ -370,6 +371,9 @@ > if (ELEM(NULL, pose, name) || (name[0] == 0)) > return NULL; > > + if(pose->chanhash) > + return BLI_ghash_lookup(pose->chanhash, name); > + > return BLI_findstring(&((bPose *)pose)->chanbase, name, > offsetof(bPoseChannel, name)); > } > > @@ -405,6 +409,7 @@ > chan->protectflag = OB_LOCK_ROT4D; /* lock by components by > default */ > > BLI_addtail(&pose->chanbase, chan); > + free_pose_channels_hash(pose); > > return chan; > } > @@ -519,6 +524,26 @@ > } > } > > +void make_pose_channels_hash(bPose *pose) > +{ > + if(!pose->chanhash) { > + bPoseChannel *pchan; > + > + pose->chanhash= BLI_ghash_new(BLI_ghashutil_strhash, > BLI_ghashutil_strcmp); > + for(pchan=pose->chanbase.first; pchan; pchan=pchan->next) > + BLI_ghash_insert(pose->chanhash, pchan->name, > pchan); > + } > +} > + > +void free_pose_channels_hash(bPose *pose) > +{ > + if(pose->chanhash) { > + BLI_ghash_free(pose->chanhash, NULL, NULL); > + pose->chanhash= NULL; > + } > +} > + > + > void free_pose_channel(bPoseChannel *pchan) > { > // XXX this case here will need to be removed when the new > motionpaths are ready > @@ -550,6 +575,8 @@ > > BLI_freelistN(&pose->chanbase); > } > + > + free_pose_channels_hash(pose); > } > > void free_pose(bPose *pose) > > Modified: trunk/blender/source/blender/blenkernel/intern/armature.c > =================================================================== > --- trunk/blender/source/blender/blenkernel/intern/armature.c 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/blenkernel/intern/armature.c 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -1675,6 +1675,7 @@ > next= pchan->next; > if(pchan->bone==NULL) { > free_pose_channel(pchan); > + free_pose_channels_hash(pose); > BLI_freelinkN(&pose->chanbase, pchan); > } > } > > Modified: trunk/blender/source/blender/blenkernel/intern/object.c > =================================================================== > --- trunk/blender/source/blender/blenkernel/intern/object.c 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/blenkernel/intern/object.c 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -2459,7 +2459,10 @@ > void object_handle_update(Scene *scene, Object *ob) > { > if(ob->recalc & OB_RECALC) { > - > + /* speed optimization for animation lookups */ > + if(ob->pose) > + make_pose_channels_hash(ob->pose); > + > /* XXX new animsys warning: depsgraph tag OB_RECALC_DATA > should not skip drivers, > which is only in where_is_object now */ > if(ob->recalc & OB_RECALC) { > > Modified: trunk/blender/source/blender/blenloader/intern/readfile.c > =================================================================== > --- trunk/blender/source/blender/blenloader/intern/readfile.c 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/blenloader/intern/readfile.c 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -3652,6 +3652,8 @@ > link_list(fd, &pose->chanbase); > link_list(fd, &pose->agroups); > > + pose->chanhash= NULL; > + > for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) { > pchan->bone= NULL; > pchan->parent= newdataadr(fd, pchan->parent); > > Modified: trunk/blender/source/blender/editors/armature/editarmature.c > =================================================================== > --- trunk/blender/source/blender/editors/armature/editarmature.c > 2010-03-26 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/editors/armature/editarmature.c > 2010-03-26 10:33:53 UTC (rev 27766) > @@ -892,6 +892,8 @@ > > BLI_remlink(&opose->chanbase, pchan); > BLI_addtail(&pose->chanbase, pchan); > + free_pose_channels_hash(opose); > + free_pose_channels_hash(pose); > } > > ED_base_object_free_and_unlink(scene, base); > @@ -1095,6 +1097,7 @@ > > /* free any of the extra-data this pchan might have > */ > free_pose_channel(pchan); > + free_pose_channels_hash(ob->pose); > > /* get rid of unneeded bone */ > bone_free(arm, curbone); > @@ -1802,6 +1805,7 @@ > > if (curBone && (curBone->flag & BONE_SELECTED) && > (arm->layer & curBone->layer)) { > free_pose_channel(pchan); > + free_pose_channels_hash(obedit->pose); > BLI_freelinkN (&obedit->pose->chanbase, > pchan); > } > else { > > Modified: trunk/blender/source/blender/makesdna/DNA_action_types.h > =================================================================== > --- trunk/blender/source/blender/makesdna/DNA_action_types.h 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/makesdna/DNA_action_types.h 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -40,6 +40,7 @@ > struct SpaceLink; > struct Object; > struct Group; > +struct GHash; > > /* ************************************************ */ > /* Visualisation */ > @@ -326,6 +327,7 @@ > */ > typedef struct bPose { > ListBase chanbase; /* list of pose channels, > PoseBones in RNA */ > + struct GHash *chanhash; /* ghash for quicker string lookups > */ > > short flag, proxy_layer; /* proxy layer: copy from armature, > gets synced */ > > > Modified: trunk/blender/source/blender/makesrna/intern/rna_pose.c > =================================================================== > --- trunk/blender/source/blender/makesrna/intern/rna_pose.c 2010-03-26 > 08:32:54 UTC (rev 27765) > +++ trunk/blender/source/blender/makesrna/intern/rna_pose.c 2010-03-26 > 10:33:53 UTC (rev 27766) > @@ -37,6 +37,7 @@ > #include "DNA_scene_types.h" > > #include "BLI_math.h" > +#include "BLI_ghash.h" > > #include "WM_types.h" > > @@ -525,7 +526,7 @@ > { > PointerRNA rptr; > bPose *pose= (bPose*)ptr->data; > - bPoseChannel *pchan= BLI_findstring(&pose->chanbase, key, > offsetof(bPoseChannel, name)); > + bPoseChannel *pchan= get_pose_channel(pose, key); > RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr); > return rptr; > } > > > _______________________________________________ > Bf-blender-cvs mailing list > [email protected] > http://lists.blender.org/mailman/listinfo/bf-blender-cvs > _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
