* speedup for animating bones, in one scene with sintel and a dragon animated its...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 29 Dec 2009 15:40:26 +0000 (15:40 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 29 Dec 2009 15:40:26 +0000 (15:40 +0000)
* utility function BLI_findstring to avoid listbase lookup loops everywhere.
  eg:
    ListBase *lb= objects= &CTX_data_main(C)->object;
    Object *ob= BLI_findstring(lb, name, offsetof(ID, name) + 2);

* made some more math functions use const's, (fix warnings I made in previous commits)

12 files changed:
source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/action.c
source/blender/blenkernel/intern/library.c
source/blender/blenlib/BLI_listbase.h
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/intern/listbase.c
source/blender/blenlib/intern/math_vector_inline.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/space_logic/logic_window.c
source/blender/makesrna/intern/rna_pose.c
source/blender/python/generic/bpy_internal_import.c
source/gameengine/Converter/KX_BlenderSceneConverter.cpp

index c9d1caa1cfea9adb4d954b49038d9016bee49460..21150af71440f0055be16ab1cbe8e1c6daa81637 100644 (file)
@@ -220,8 +220,6 @@ const struct ListBase *BKE_spacetypes_list(void);
 void BKE_spacetype_register(struct SpaceType *st);
 void BKE_spacetypes_free(void);        /* only for quitting blender */
 
-// MenuType *BKE_spacemenu_find(const char *idname, int spacetype);
-
 /* spacedata */
 void BKE_spacedata_freelist(ListBase *lb);
 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
index 303cd208b7cca770b35ed315e7a1d7e6c0ceb872..9e89ae77caae32085294c2995dd3f28fde90d41b 100644 (file)
@@ -379,19 +379,10 @@ bActionGroup *action_groups_find_named (bAction *act, const char name[])
 /* usually used within a loop, so we got a N^2 slowdown */
 bPoseChannel *get_pose_channel(const bPose *pose, const char *name)
 {
-       bPoseChannel *chan;
-       
        if (ELEM(NULL, pose, name) || (name[0] == 0))
                return NULL;
        
-       for (chan=pose->chanbase.first; chan; chan=chan->next) {
-               if (chan->name[0] == name[0]) {
-                       if (!strcmp (chan->name, name))
-                               return chan;
-               }
-       }
-
-       return NULL;
+       return BLI_findstring(&pose->chanbase, name, offsetof(bPoseChannel, name));
 }
 
 /* Use with care, not on Armature poses but for temporal ones */
index a32746e3093c21bf3bb44cc48362d2ee9bf42e9e..c38cfe4ee27db2a09ea13ccedfe614a4337d2980 100644 (file)
@@ -38,6 +38,7 @@
 #include <ctype.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stddef.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -844,18 +845,8 @@ void free_main(Main *mainvar)
 
 ID *find_id(char *type, char *name)            /* type: "OB" or "MA" etc */
 {
-       ID *id;
-       ListBase *lb;
-       
-       lb= wich_libbase(G.main, GS(type));
-       
-       id= lb->first;
-       while(id) {
-               if(id->name[2]==name[0] && strcmp(id->name+2, name)==0 ) 
-                       return id;
-               id= id->next;
-       }
-       return 0;
+       ListBase *lb= wich_libbase(G.main, GS(type));
+       return BLI_findstring(lb, name, offsetof(ID, name) + 2);
 }
 
 static void get_flags_for_id(ID *id, char *buf) 
@@ -1336,11 +1327,7 @@ void test_idbutton(char *name)
        if(lb==0) return;
        
        /* search for id */
-       idtest= lb->first;
-       while(idtest) {
-               if( strcmp(idtest->name+2, name)==0) break;
-               idtest= idtest->next;
-       }
+       idtest= BLI_findstring(lb, name, offsetof(ID, name) + 2);
 
        if(idtest) if( new_id(lb, idtest, name)==0 ) sort_alpha_id(lb, idtest);
 }
index bd735888f95dca7eec8d6d6d3816f4fa6b21f153..f4841762227c0ea27c317e5037f96f58e1b469f2 100644 (file)
@@ -44,6 +44,7 @@ void addlisttolist(struct ListBase *list1, struct ListBase *list2);
 void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
 void *BLI_findlink(struct ListBase *listbase, int number);
 int BLI_findindex(struct ListBase *listbase, void *vlink);
+void *BLI_findstring(struct ListBase *listbase, const char *id, int offset);
 void BLI_freelistN(struct ListBase *listbase);
 void BLI_addtail(struct ListBase *listbase, void *vlink);
 void BLI_remlink(struct ListBase *listbase, void *vlink);
index 26e7ff5abe91b0023e659770902e0ef8f15d0e79..4dbef4ef07c3a27bef5c226fbb274a9f9d1bbb43 100644 (file)
@@ -81,22 +81,22 @@ MINLINE void madd_v3_v3v3fl(float r[3], float a[3], float b[3], float f);
 MINLINE void madd_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]);
 
 MINLINE void negate_v3(float r[3]);
-MINLINE void negate_v3_v3(float r[3], float a[3]);
+MINLINE void negate_v3_v3(float r[3], const float a[3]);
 
-MINLINE float dot_v2v2(float a[2], float b[2]); 
-MINLINE float dot_v3v3(float a[3], float b[3]);
+MINLINE float dot_v2v2(const float a[2], const float b[2]);
+MINLINE float dot_v3v3(const float a[3], const float b[3]);
 
-MINLINE float cross_v2v2(float a[2], float b[2]);
+MINLINE float cross_v2v2(const float a[2], const float b[2]);
 MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]);
 
 MINLINE void star_m3_v3(float R[3][3],float a[3]);
 
 /*********************************** Length **********************************/
 
-MINLINE float len_v2(float a[2]);
-MINLINE float len_v2v2(float a[2], float b[2]);
-MINLINE float len_v3(float a[3]);
-MINLINE float len_v3v3(float a[3], float b[3]);
+MINLINE float len_v2(const float a[2]);
+MINLINE float len_v2v2(const float a[2], const float b[2]);
+MINLINE float len_v3(const float a[3]);
+MINLINE float len_v3v3(const float a[3], const float b[3]);
 
 MINLINE float normalize_v2(float r[2]);
 MINLINE float normalize_v3(float r[3]);
index 166f4ed029e2c832ea78c1d36f8be62a2e69c05f..9b4e1720d8b58004a10d0e1ddb8712db13d33729 100644 (file)
@@ -343,6 +343,26 @@ int BLI_findindex(ListBase *listbase, void *vlink)
        return -1;
 }
 
+void *BLI_findstring(ListBase *listbase, const char *id, int offset)
+{
+       Link *link= NULL;
+       const char *id_iter;
+
+       if (listbase == NULL) return NULL;
+
+       link= listbase->first;
+       while (link) {
+               id_iter= ((const char *)link) + offset;
+               printf("ASS '%s'\n", id_iter);
+               if(id[0] == id_iter[0] && strcmp(id, id_iter)==0)
+                       return link;
+
+               link= link->next;
+       }
+
+       return NULL;
+}
+
 void BLI_duplicatelist(ListBase *list1, const ListBase *list2)
 {
        struct Link *link1, *link2;
index 16f35dbc5faa4659f762b6fab4d280438896dfd2..8b09cb86d3a7a9ad3408eecec7908330f8df9da3 100644 (file)
@@ -194,24 +194,24 @@ MINLINE void negate_v3(float r[3])
        r[2]= -r[2];
 }
 
-MINLINE void negate_v3_v3(float r[3], float a[3])
+MINLINE void negate_v3_v3(float r[3], const float a[3])
 {
        r[0]= -a[0];
        r[1]= -a[1];
        r[2]= -a[2];
 }
 
-MINLINE float dot_v2v2(float *a, float *b)
+MINLINE float dot_v2v2(const float a[2], const float b[2])
 {
        return a[0]*b[0] + a[1]*b[1];
 }
 
-MINLINE float dot_v3v3(float a[3], float b[3])
+MINLINE float dot_v3v3(const float a[3], const float b[3])
 {
        return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
 }
 
-MINLINE float cross_v2v2(float a[2], float b[2])
+MINLINE float cross_v2v2(const float a[2], const float b[2])
 {
         return a[0]*b[1] - a[1]*b[0];
 }
@@ -236,12 +236,12 @@ MINLINE void star_m3_v3(float mat[][3], float *vec)
 
 /*********************************** Length **********************************/
 
-MINLINE float len_v2(float *v)
+MINLINE float len_v2(const float v[2])
 {
        return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
 }
 
-MINLINE float len_v2v2(float *v1, float *v2)
+MINLINE float len_v2v2(const float v1[2], const float v2[2])
 {
        float x, y;
 
@@ -250,12 +250,12 @@ MINLINE float len_v2v2(float *v1, float *v2)
        return (float)sqrt(x*x+y*y);
 }
 
-MINLINE float len_v3(float a[3])
+MINLINE float len_v3(const float a[3])
 {
        return sqrtf(dot_v3v3(a, a));
 }
 
-MINLINE float len_v3v3(float a[3], float b[3])
+MINLINE float len_v3v3(const float a[3], const float b[3])
 {
        float d[3];
 
index 7bad3ee0ecd9824e3ca34a22dfff4e359cff5fb6..a2b926003a756ff0f7b486e00f242587da05fcef 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include <stdlib.h>
+#include <stddef.h>
 #include <string.h>
 
 #include "MEM_guardedalloc.h"
@@ -920,18 +921,11 @@ static void draw_constraint_spaceselect (uiBlock *block, bConstraint *con, short
 
 static void test_obpoin_but(bContext *C, char *name, ID **idpp)
 {
-       ID *id;
+       ID *id= BLI_findstring(&CTX_data_main(C)->object, name, offsetof(ID, name) + 2);
+       *idpp= id; /* can be NULL */
        
-       id= CTX_data_main(C)->object.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       *idpp= id;
-                       id_lib_extern(id);      /* checks lib data, sets correct flag for saving then */
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       if(id)
+               id_lib_extern(id);      /* checks lib data, sets correct flag for saving then */
 }
 
 /* draw panel showing settings for a constraint */
index 8ba0577e3c762005a167a1d1064aaa67efed8f26..dfc9b263ac23dd807d19f494b75eea29fc874b2c 100644 (file)
@@ -975,107 +975,45 @@ static void verify_logicbutton_func(bContext *C, void *data1, void *data2)
 
 static void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp)
 {
-       ID *id;
-       
-       id= CTX_data_main(C)->text.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       *idpp= id;
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       *idpp= BLI_findstring(&CTX_data_main(C)->text, name, offsetof(ID, name) + 2);
 }
 
 static void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
 {
-       ID *id;
-       
-       id= CTX_data_main(C)->action.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       id_us_plus(id);
-                       *idpp= id;
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       *idpp= BLI_findstring(&CTX_data_main(C)->text, name, offsetof(ID, name) + 2);
+       if(*idpp)
+               id_us_plus(*idpp);
 }
 
 
 static void test_obpoin_but(struct bContext *C, char *name, ID **idpp)
 {
-       ID *id;
-       
-       id= CTX_data_main(C)->object.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       *idpp= id;
-                       id_lib_extern(id);      /* checks lib data, sets correct flag for saving then */
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       *idpp= BLI_findstring(&CTX_data_main(C)->object, name, offsetof(ID, name) + 2);
+       if(*idpp)
+               id_lib_extern(*idpp);   /* checks lib data, sets correct flag for saving then */
 }
 
 static void test_meshpoin_but(struct bContext *C, char *name, ID **idpp)
 {
-       ID *id;
-
-       if( *idpp ) (*idpp)->us--;
-       
-       id= CTX_data_main(C)->mesh.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       *idpp= id;
-                       id_us_plus(id);
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       *idpp= BLI_findstring(&CTX_data_main(C)->mesh, name, offsetof(ID, name) + 2);
+       if(*idpp)
+               id_us_plus(*idpp);
 }
 
 static void test_matpoin_but(struct bContext *C, char *name, ID **idpp)
 {
-       ID *id;
-
-       if( *idpp ) (*idpp)->us--;
-       
-       id= CTX_data_main(C)->mat.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       *idpp= id;
-                       id_us_plus(id);
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       *idpp= BLI_findstring(&CTX_data_main(C)->mat, name, offsetof(ID, name) + 2);
+       if(*idpp)
+               id_us_plus(*idpp);
 }
 
 static void test_scenepoin_but(struct bContext *C, char *name, ID **idpp)
 {
-       ID *id;
-       
-       if( *idpp ) (*idpp)->us--;
-       
-       id= CTX_data_main(C)->scene.first;
-       while(id) {
-               if( strcmp(name, id->name+2)==0 ) {
-                       *idpp= id;
-                       id_us_plus(id);
-                       return;
-               }
-               id= id->next;
-       }
-       *idpp= NULL;
+       *idpp= BLI_findstring(&CTX_data_main(C)->scene, name, offsetof(ID, name) + 2);
+       if(*idpp)
+               id_us_plus(*idpp);
 }
 
-
 static void test_keyboard_event(struct bContext *C, void *arg_ks, void *arg_unused)
 {
        bKeyboardSensor *ks= (bKeyboardSensor*)arg_ks;
index 7e2b9d7875bd99ebebfac4a7d485ed4ffd027e10..07c4445872e080a351f4bdc0f0eeea0a3782e634 100644 (file)
@@ -58,6 +58,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "RNA_access.h"
+
 static void rna_Pose_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
        // XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
@@ -509,6 +511,16 @@ static int rna_PoseChannel_rotation_4d_editable(PointerRNA *ptr, int index)
        return PROP_EDITABLE;
 }
 
+/* not essential, but much faster then the default lookup function */
+PointerRNA rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key)
+{
+       PointerRNA rptr;
+       bPose *pose= (bPose*)ptr->data;
+       bPoseChannel *pchan= BLI_findstring(&pose->chanbase, key, offsetof(bPoseChannel, name));
+       RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr);
+       return rptr;
+}
+
 #else
 
 static void rna_def_bone_group(BlenderRNA *brna)
@@ -1077,7 +1089,7 @@ static void rna_def_pose(BlenderRNA *brna)
        RNA_def_property_collection_sdna(prop, NULL, "chanbase", NULL);
        RNA_def_property_struct_type(prop, "PoseBone");
        RNA_def_property_ui_text(prop, "Pose Bones", "Individual pose bones for the armature.");
-
+       RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, "rna_PoseBones_lookup_string"); /* can be removed, only for fast lookup */
        /* bone groups */
        prop= RNA_def_property(srna, "bone_groups", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "agroups", NULL);
index 002467687c47680741a7ddbb770d9c881e2b2504..e890dc11f057ca8e868591324d6b15ec2a7ae395 100644 (file)
@@ -33,6 +33,8 @@
 #include "MEM_guardedalloc.h"
 #include "BKE_text.h" /* txt_to_buf */ 
 #include "BKE_main.h"
+#include "BLI_listbase.h"
+#include <stddef.h>
 
 static Main *bpy_import_main= NULL;
 
@@ -100,10 +102,7 @@ PyObject *bpy_text_import_name( char *name, int *found )
        memcpy( txtname, name, namelen );
        memcpy( &txtname[namelen], ".py", 4 );
 
-       for(text = maggie->text.first; text; text = text->id.next) {
-               if( !strcmp( txtname, text->id.name+2 ) )
-                       break;
-       }
+       text= BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2);
 
        if( !text )
                return NULL;
@@ -142,12 +141,7 @@ PyObject *bpy_text_reimport( PyObject *module, int *found )
                return NULL;
 
        /* look up the text object */
-       text = ( Text * ) & ( maggie->text.first );
-       while( text ) {
-               if( !strcmp( txtname, text->id.name+2 ) )
-                       break;
-               text = text->id.next;
-       }
+       text= BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2);
 
        /* uh-oh.... didn't find it */
        if( !text )
index 6519626ee89d86f1114b7a57067c9f96f2b9730e..7faa570c70729cca3a9aa15853119198217e4b29 100644 (file)
@@ -675,23 +675,6 @@ IpoCurve* findIpoCurve(IpoCurve* first, const char* searchName)
        return 0;
 }
 
-// this is not longer necesary //rcruiz
-/*Ipo* KX_BlenderSceneConverter::findIpoForName(char* objName)
-{
-       Ipo* ipo_iter = (Ipo*)m_maggie->ipo.first;
-
-       while( ipo_iter )
-       {
-               if( strcmp( objName, ipo_iter->id.name + 2 ) == 0 ) 
-               {
-                       return ipo_iter;
-               }
-               ipo_iter = (Ipo*)ipo_iter->id.next;
-       }
-       return 0;
-}
-*/
-
 void   KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
 {
 
@@ -1374,12 +1357,8 @@ bool KX_BlenderSceneConverter::MergeScene(KX_Scene *to, KX_Scene *from)
  * it does not convert */
 RAS_MeshObject *KX_BlenderSceneConverter::ConvertMeshSpecial(KX_Scene* kx_scene, Main *maggie, const char *name)
 {
-       ID *me;
-       
        /* Find a mesh in the current main */
-       for(me = (ID *)m_maggie->mesh.first; me; me= (ID *)me->next)
-               if(strcmp(name, me->name+2)==0)
-                       break;
+       ID *me= static_cast<ID *>(BLI_findstring(&m_maggie->mesh, name, offsetof(ID, name) + 2));
        
        if(me==NULL) {
                printf("Could not be found \"%s\"\n", name);