Revision: 52407
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52407
Author:   campbellbarton
Date:     2012-11-20 13:29:27 +0000 (Tue, 20 Nov 2012)
Log Message:
-----------
bmesh operator api:
avoid per vert/edge/face string lookups in BMO_slot_map_* functions --- used in 
array modifier, subdivide, remove doubles and other tools.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_ghash.h
    trunk/blender/source/blender/blenlib/intern/BLI_ghash.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
    trunk/blender/source/blender/bmesh/intern/bmesh_operator_api_inline.h
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
    trunk/blender/source/blender/bmesh/operators/bmo_create.c
    trunk/blender/source/blender/bmesh/operators/bmo_dupe.c
    trunk/blender/source/blender/bmesh/operators/bmo_extrude.c
    trunk/blender/source/blender/bmesh/operators/bmo_mirror.c
    trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.h
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/modifiers/intern/MOD_array.c
    trunk/blender/source/blender/modifiers/intern/MOD_skin.c

Modified: trunk/blender/source/blender/blenlib/BLI_ghash.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_ghash.h    2012-11-20 12:54:28 UTC 
(rev 52406)
+++ trunk/blender/source/blender/blenlib/BLI_ghash.h    2012-11-20 13:29:27 UTC 
(rev 52407)
@@ -71,7 +71,7 @@
 void  *BLI_ghash_lookup(GHash *gh, const void *key);
 int    BLI_ghash_remove(GHash *gh, void *key, GHashKeyFreeFP keyfreefp, 
GHashValFreeFP valfreefp);
 void  *BLI_ghash_pop(GHash *gh, void *key, GHashKeyFreeFP keyfreefp);
-int    BLI_ghash_haskey(GHash *gh, void *key);
+int    BLI_ghash_haskey(GHash *gh, const void *key);
 int    BLI_ghash_size(GHash *gh);
 
 /* *** */

Modified: trunk/blender/source/blender/blenlib/intern/BLI_ghash.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_ghash.c     2012-11-20 
12:54:28 UTC (rev 52406)
+++ trunk/blender/source/blender/blenlib/intern/BLI_ghash.c     2012-11-20 
13:29:27 UTC (rev 52407)
@@ -178,7 +178,7 @@
        return NULL;
 }
 
-int BLI_ghash_haskey(GHash *gh, void *key)
+int BLI_ghash_haskey(GHash *gh, const void *key)
 {
        unsigned int hash = gh->hashfp(key) % gh->nbuckets;
        Entry *e;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h      
2012-11-20 12:54:28 UTC (rev 52406)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h      
2012-11-20 13:29:27 UTC (rev 52407)
@@ -140,6 +140,10 @@
 #define BMO_SLOT_AS_BUFFER(slot )      ((slot)->data.buf)
 #define BMO_SLOT_AS_GHASH(slot )       ((slot)->data.ghash)
 
+#define BMO_ASSERT_SLOT_IN_OP(slot, op) \
+       BLI_assert(((slot >= (op)->slots_in)  && (slot < 
&(op)->slots_in[BMO_OP_MAX_SLOTS])) || \
+                  ((slot >= (op)->slots_out) && (slot < 
&(op)->slots_out[BMO_OP_MAX_SLOTS])))
+
 /* way more than probably needed, compiler complains if limit hit */
 #define BMO_OP_MAX_SLOTS 16
 
@@ -385,8 +389,8 @@
 int BMO_slot_buffer_count(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char 
*slot_name);
 int BMO_slot_map_count(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char 
*slot_name);
 
-void BMO_slot_map_insert(BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name,
-                         void *element, void *data, int len);
+void BMO_slot_map_insert(BMOperator *op, BMOpSlot *slot,
+                         const void *element, void *data, int len);
 
 /* Counts the number of edges with tool flag toolflag around
  */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api_inline.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api_inline.h       
2012-11-20 12:54:28 UTC (rev 52406)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api_inline.h       
2012-11-20 13:29:27 UTC (rev 52407)
@@ -69,18 +69,16 @@
        oflags[bm->stackdepth - 1].f ^= oflag;
 }
 
-BLI_INLINE void BMO_slot_map_int_insert(BMOperator *op, BMOpSlot 
slot_args[BMO_OP_MAX_SLOTS],
-                                        const char *slot_name,
+BLI_INLINE void BMO_slot_map_int_insert(BMOperator *op, BMOpSlot *slot,
                                         void *element, int val)
 {
-       BMO_slot_map_insert(op, slot_args, slot_name, element, &val, 
sizeof(int));
+       BMO_slot_map_insert(op, slot, element, &val, sizeof(int));
 }
 
-BLI_INLINE void BMO_slot_map_float_insert(BMOperator *op, BMOpSlot 
slot_args[BMO_OP_MAX_SLOTS],
-                                          const char *slot_name,
+BLI_INLINE void BMO_slot_map_float_insert(BMOperator *op, BMOpSlot *slot,
                                           void *element, float val)
 {
-       BMO_slot_map_insert(op, slot_args, slot_name, element, &val, 
sizeof(float));
+       BMO_slot_map_insert(op, slot, element, &val, sizeof(float));
 }
 
 
@@ -89,63 +87,62 @@
  * do NOT use these for non-operator-api-allocated memory! instead
  * use BMO_slot_map_data_get and BMO_slot_map_insert, which copies the data. */
 
-BLI_INLINE void BMO_slot_map_ptr_insert(BMOperator *op, BMOpSlot 
slot_args[BMO_OP_MAX_SLOTS],
-                                        const char *slot_name,
-                                        void *element, void *val)
+BLI_INLINE void BMO_slot_map_ptr_insert(BMOperator *op, BMOpSlot *slot,
+                                        const void *element, void *val)
 {
-       BMO_slot_map_insert(op, slot_args, slot_name, element, &val, 
sizeof(void *));
+       BMO_slot_map_insert(op, slot, element, &val, sizeof(void *));
 }
 
-BLI_INLINE int BMO_slot_map_contains(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name, void *element)
+BLI_INLINE int BMO_slot_map_contains(BMOpSlot *slot, const void *element)
 {
-       BMOpSlot *slot = BMO_slot_get(slot_args, slot_name);
        BLI_assert(slot->slot_type == BMO_OP_SLOT_MAPPING);
 
        /* sanity check */
-       if (!slot->data.ghash) return 0;
+       if (UNLIKELY(slot->data.ghash == NULL)) {
+               return 0;
+       }
 
        return BLI_ghash_haskey(slot->data.ghash, element);
 }
 
-BLI_INLINE void *BMO_slot_map_data_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name,
-                                       void *element)
+BLI_INLINE void *BMO_slot_map_data_get(BMOpSlot *slot, const void *element)
 {
        BMOElemMapping *mapping;
-       BMOpSlot *slot = BMO_slot_get(slot_args, slot_name);
        BLI_assert(slot->slot_type == BMO_OP_SLOT_MAPPING);
 
        /* sanity check */
-       if (!slot->data.ghash) return NULL;
+       if (UNLIKELY(slot->data.ghash == NULL)) {
+               return NULL;
+       }
 
        mapping = (BMOElemMapping *)BLI_ghash_lookup(slot->data.ghash, element);
 
-       if (!mapping) return NULL;
+       if (!mapping) {
+               return NULL;
+       }
 
        return mapping + 1;
 }
 
-BLI_INLINE float BMO_slot_map_float_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name,
-                                        void *element)
+BLI_INLINE float BMO_slot_map_float_get(BMOpSlot *slot, const void *element)
 {
-       float *val = (float *) BMO_slot_map_data_get(slot_args, slot_name, 
element);
+       float *val = (float *) BMO_slot_map_data_get(slot, element);
        if (val) return *val;
 
        return 0.0f;
 }
 
-BLI_INLINE int BMO_slot_map_int_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name,
-                                    void *element)
+BLI_INLINE int BMO_slot_map_int_get(BMOpSlot *slot, const void *element)
 {
-       int *val = (int *) BMO_slot_map_data_get(slot_args, slot_name, element);
+       int *val = (int *) BMO_slot_map_data_get(slot, element);
        if (val) return *val;
 
        return 0;
 }
 
-BLI_INLINE void *BMO_slot_map_ptr_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name,
-                                      void *element)
+BLI_INLINE void *BMO_slot_map_ptr_get(BMOpSlot *slot, const void *element)
 {
-       void **val = (void **) BMO_slot_map_data_get(slot_args, slot_name, 
element);
+       void **val = (void **) BMO_slot_map_data_get(slot, element);
        if (val) return *val;
 
        return NULL;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c 2012-11-20 
12:54:28 UTC (rev 52406)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c 2012-11-20 
13:29:27 UTC (rev 52407)
@@ -592,13 +592,12 @@
 /* inserts a key/value mapping into a mapping slot.  note that it copies the
  * value, it doesn't store a reference to it. */
 
-void BMO_slot_map_insert(BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], 
const char *slot_name,
-                         void *element, void *data, int len)
+void BMO_slot_map_insert(BMOperator *op, BMOpSlot *slot,
+                         const void *element, void *data, int len)
 {
        BMOElemMapping *mapping;
-       BMOpSlot *slot = BMO_slot_get(slot_args, slot_name);
        BLI_assert(slot->slot_type == BMO_OP_SLOT_MAPPING);
-       BLI_assert(op->slots_in == slot_args || op->slots_out == slot_args);
+       BMO_ASSERT_SLOT_IN_OP(slot, op);
 
        mapping = (BMOElemMapping *) BLI_memarena_alloc(op->arena, 
sizeof(*mapping) + len);
 
@@ -610,7 +609,7 @@
                slot->data.ghash = BLI_ghash_ptr_new("bmesh slot map hash");
        }
 
-       BLI_ghash_insert(slot->data.ghash, element, mapping);
+       BLI_ghash_insert(slot->data.ghash, (void *)element, mapping);
 }
 
 #if 0

Modified: trunk/blender/source/blender/bmesh/operators/bmo_create.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_create.c   2012-11-20 
12:54:28 UTC (rev 52406)
+++ trunk/blender/source/blender/bmesh/operators/bmo_create.c   2012-11-20 
13:29:27 UTC (rev 52407)
@@ -741,8 +741,11 @@
        BMVert *startv;
        BMVert *endv;
        EPathNode *node;
-       int i, use_restrict = BMO_slot_bool_get(op->slots_in, "use_restrict");
+       int i;
+       const int use_restrict = BMO_slot_bool_get(op->slots_in, 
"use_restrict");
+       BMOpSlot *slot_restrict = BMO_slot_get(op->slots_in, "restrict");
 
+
        startv = edata[BM_elem_index_get(edge)].ftag ? edge->v2 : edge->v1;
        endv = edata[BM_elem_index_get(edge)].ftag ? edge->v1 : edge->v2;
        
@@ -806,12 +809,13 @@
                                continue;
                        }
                        
-                       if (use_restrict && BMO_slot_map_contains(op->slots_in, 
"restrict", e)) {
-                               int group = BMO_slot_map_int_get(op->slots_in, 
"restrict", e);
-                               
-                               if (!(group & path->group)) {
-                                       v2 = NULL;
-                                       continue;
+                       if (use_restrict) {
+                               int *group = (int 
*)BMO_slot_map_data_get(slot_restrict, e);
+                               if (group) {
+                                       if (!(*group & path->group)) {
+                                               v2 = NULL;
+                                               continue;
+                                       }
                                }
                        }
 
@@ -901,6 +905,8 @@
        const short use_smooth = BMO_slot_bool_get(op->slots_in, "use_smooth");
        int i, j, group = 0;
        unsigned int winding[2]; /* accumulte winding directions for each edge 
which has a face */
+       BMOpSlot *slot_restrict          = BMO_slot_get(op->slots_in, 
"restrict");
+       BMOpSlot *slot_face_groupmap_out = BMO_slot_get(op->slots_out, 
"face_groupmap.out");
 
        if (!bm->totvert || !bm->totedge)
                return;
@@ -932,14 +938,14 @@
        bm->elem_index_dirty &= ~BM_EDGE;
 
        init_rotsys(bm, edata, vdata);
-       
+
        while (1) {
                edge = NULL;
                group = 0;
                
                BMO_ITER (e, &siter, op->slots_in, "edges", BM_EDGE) {
                        /* if restrict is on, only start on faces in the 
restrict map */
-                       if (use_restrict && 
!BMO_slot_map_contains(op->slots_in, "restrict", e))
+                       if (use_restrict && 
!BMO_slot_map_contains(slot_restrict, e))
                                continue;
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to