[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27766] trunk/blender/source/blender: Optimization for pose channel name lookups using a hash, makes
Dalai Felinto
dfelinto at gmail.com
Sun Mar 28 01:55:32 CET 2010
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 <brecht at blender.org>
> 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
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list