Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2010-03-26 13:33:53 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2010-03-26 13:33:53 +0300
commit40e58c85092945ca71e974ce4062d90e44f7fb66 (patch)
treeb102a091696741d2ab4572f1c259ae8512263d5d /source/blender/blenkernel
parent6af1f968761b5d94184c68b1ea9dbf88792a1c13 (diff)
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)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_action.h7
-rw-r--r--source/blender/blenkernel/intern/action.c29
-rw-r--r--source/blender/blenkernel/intern/armature.c1
-rw-r--r--source/blender/blenkernel/intern/object.c5
4 files changed, 40 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index 1b38e276ca4..214b5a32cd6 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -129,6 +129,13 @@ void free_pose_channel(struct bPoseChannel *pchan);
*/
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.
*/
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 52f59c1681a..2d52d6061b9 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -56,8 +56,9 @@
#include "BIK_api.h"
-#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
+#include "BLI_math.h"
#include "RNA_access.h"
@@ -370,6 +371,9 @@ bPoseChannel *get_pose_channel(const bPose *pose, const char *name)
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 @@ bPoseChannel *verify_pose_channel(bPose *pose, const char *name)
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 init_pose_ikparam(bPose *pose)
}
}
+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 @@ void free_pose_channels(bPose *pose)
BLI_freelistN(&pose->chanbase);
}
+
+ free_pose_channels_hash(pose);
}
void free_pose(bPose *pose)
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 668ce9aadac..c1998d705ad 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -1675,6 +1675,7 @@ void armature_rebuild_pose(Object *ob, bArmature *arm)
next= pchan->next;
if(pchan->bone==NULL) {
free_pose_channel(pchan);
+ free_pose_channels_hash(pose);
BLI_freelinkN(&pose->chanbase, pchan);
}
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index b9e4894a868..bb7c77408ac 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2459,7 +2459,10 @@ void object_tfm_restore(Object *ob, void *obtfm_pt)
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) {