[Bf-committers] [Bf-blender-cvs] [2108a61] master: BMesh: minor optimizations for shapekey lookups on conversion

Ken & Grace Williamson ibkanat at gmail.com
Tue Apr 22 17:08:48 CEST 2014


,/
On Apr 22, 2014 8:50 AM, "Campbell Barton" <noreply at git.blender.org> wrote:

> Commit: 2108a616910dc814be13a0b640970bfe4b7eb4ce
> Author: Campbell Barton
> Date:   Wed Apr 23 00:49:28 2014 +1000
> https://developer.blender.org/rB2108a616910dc814be13a0b640970bfe4b7eb4ce
>
> BMesh: minor optimizations for shapekey lookups on conversion
>
> ===================================================================
>
> M       source/blender/bmesh/intern/bmesh_mesh_conv.c
>
> ===================================================================
>
> diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c
> b/source/blender/bmesh/intern/bmesh_mesh_conv.c
> index e9c0005..b7be0cc 100644
> --- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
> +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
> @@ -233,12 +233,12 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
>         BMEdge *e, **etable = NULL;
>         BMFace *f;
>         float (*keyco)[3] = NULL;
> -       int *keyi;
>         int totuv, i, j;
>
>         int cd_vert_bweight_offset;
>         int cd_edge_bweight_offset;
>         int cd_edge_crease_offset;
> +       int cd_shape_keyindex_offset;
>
>         /* free custom data */
>         /* this isnt needed in most cases but do just incase */
> @@ -325,6 +325,7 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
>         cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata,
> CD_BWEIGHT);
>         cd_edge_bweight_offset = CustomData_get_offset(&bm->edata,
> CD_BWEIGHT);
>         cd_edge_crease_offset  = CustomData_get_offset(&bm->edata,
> CD_CREASE);
> +       cd_shape_keyindex_offset = me->key ?
> CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX) : -1;
>
>         for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
>                 v = vtable[i] = BM_vert_create(bm, keyco && set_key ?
> keyco[i] : mvert->co, NULL, BM_CREATE_SKIP_CD);
> @@ -348,10 +349,7 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
>                 /* set shapekey data */
>                 if (me->key) {
>                         /* set shape key original index */
> -                       keyi = CustomData_bmesh_get(&bm->vdata,
> v->head.data, CD_SHAPE_KEYINDEX);
> -                       if (keyi) {
> -                               *keyi = i;
> -                       }
> +                       if (cd_shape_keyindex_offset != -1)
> BM_ELEM_CD_SET_INT(v, cd_shape_keyindex_offset, i);
>
>                         for (block = me->key->block.first, j = 0; block;
> block = block->next, j++) {
>                                 float *co =
> CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, j);
> @@ -496,9 +494,9 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me,
>   */
>  static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
>  {
> +       const int cd_shape_keyindex_offset =
> CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX);
>         BMVert **vertMap = NULL;
>         BMVert *eve;
> -       int index;
>         int i = 0;
>         BMIter iter;
>
> @@ -506,32 +504,22 @@ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int
> ototvert)
>         BLI_assert(ototvert > 0);
>
>         vertMap = MEM_callocN(sizeof(*vertMap) * ototvert, "vertMap");
> -       if (CustomData_has_layer(&bm->vdata, CD_SHAPE_KEYINDEX)) {
> -               int *keyi;
> -               BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
> -                       keyi = CustomData_bmesh_get(&bm->vdata,
> eve->head.data, CD_SHAPE_KEYINDEX);
> -                       if (keyi) {
> -                               if (((index = *keyi) != ORIGINDEX_NONE) &&
> (index < ototvert)) {
> -                                       vertMap[index] = eve;
> -                               }
> -                       }
> -                       else {
> -                               if (i < ototvert) {
> -                                       vertMap[i] = eve;
> -                               }
> +       if (cd_shape_keyindex_offset != -1) {
> +               BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
> +                       const int keyi = BM_ELEM_CD_GET_INT(eve,
> cd_shape_keyindex_offset);
> +                       if ((keyi != ORIGINDEX_NONE) && (keyi < ototvert))
> {
> +                               vertMap[keyi] = eve;
>                         }
> -                       i++;
>                 }
>         }
>         else {
> -               BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
> +               BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
>                         if (i < ototvert) {
>                                 vertMap[i] = eve;
>                         }
>                         else {
>                                 break;
>                         }
> -                       i++;
>                 }
>         }
>
> @@ -825,6 +813,8 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool
> do_tessface)
>         /* see comment below, this logic is in twice */
>
>         if (me->key) {
> +               const int cd_shape_keyindex_offset =
> CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX);
> +
>                 KeyBlock *currkey;
>                 KeyBlock *actkey = BLI_findlink(&me->key->block,
> bm->shapenr - 1);
>
> @@ -868,16 +858,17 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool
> do_tessface)
>                                 }
>                         }
>
> -                       if (act_is_basis) { /* active key is a base */
> +                       /* active key is a base */
> +                       if (act_is_basis && (cd_shape_keyindex_offset !=
> -1)) {
>                                 float (*fp)[3] = actkey->data;
> -                               int *keyi;
>
>                                 ofs = MEM_callocN(sizeof(float) * 3 *
> bm->totvert,  "currkey->data");
>                                 mvert = me->mvert;
>                                 BM_ITER_MESH_INDEX (eve, &iter, bm,
> BM_VERTS_OF_MESH, i) {
> -                                       keyi =
> CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
> -                                       if (keyi && *keyi !=
> ORIGINDEX_NONE) {
> -                                               sub_v3_v3v3(ofs[i],
> mvert->co, fp[*keyi]);
> +                                       const int keyi =
> BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
> +
> +                                       if (keyi != ORIGINDEX_NONE) {
> +                                               sub_v3_v3v3(ofs[i],
> mvert->co, fp[keyi]);
>                                         }
>                                         else {
>                                                 /* if there are new
> vertices in the mesh, we can't propagate the offset
> @@ -894,12 +885,14 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool
> do_tessface)
>                 }
>
>                 for (currkey = me->key->block.first; currkey; currkey =
> currkey->next) {
> -                       int apply_offset = (ofs && (currkey != actkey) &&
> (bm->shapenr - 1 == currkey->relative));
> -                       int *keyi;
> +                       const bool apply_offset = (ofs && (currkey !=
> actkey) && (bm->shapenr - 1 == currkey->relative));
> +                       int cd_shape_offset;
> +                       int keyi;
>                         float (*ofs_pt)[3] = ofs;
> -                       float *newkey, *oldkey, *fp;
> +                       float *newkey, (*oldkey)[3], *fp;
>
>                         j = bm_to_mesh_shape_layer_index_from_kb(bm,
> currkey);
> +                       cd_shape_offset =
> CustomData_get_n_offset(&bm->vdata, CD_SHAPEKEY, j);
>
>
>                         fp = newkey = MEM_callocN(me->key->elemsize *
> bm->totvert,  "currkey->data");
> @@ -912,26 +905,29 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, bool
> do_tessface)
>                                         copy_v3_v3(fp, eve->co);
>
>                                         if (actkey != me->key->refkey) {
> /* important see bug [#30771] */
> -                                               if (oldverts) {
> -                                                       keyi =
> CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
> -                                                       if (*keyi !=
> ORIGINDEX_NONE && *keyi < currkey->totelem) { /* valid old vertex */
> -
> copy_v3_v3(mvert->co, oldverts[*keyi].co);
> +                                               if
> (cd_shape_keyindex_offset != -1) {
> +                                                       if (oldverts) {
> +                                                               keyi =
> BM_ELEM_CD_GET_INT(eve, cd_shape_keyindex_offset);
> +                                                               if (keyi
> != ORIGINDEX_NONE && keyi < currkey->totelem) { /* valid old vertex */
> +
> copy_v3_v3(mvert->co, oldverts[keyi].co);
> +                                                               }
>                                                         }
>                                                 }
>                                         }
>                                 }
>                                 else if (j != -1) {
>                                         /* in most cases this runs */
> -                                       copy_v3_v3(fp,
> CustomData_bmesh_get_n(&bm->vdata, eve->head.data, CD_SHAPEKEY, j));
> +                                       copy_v3_v3(fp,
> BM_ELEM_CD_GET_VOID_P(eve, cd_shape_offset));
>                                 }
> -                               else if (oldkey &&
> -                                        (keyi =
> CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX)) &&
> -                                        (*keyi != ORIGINDEX_NONE && *keyi
> < currkey->totelem))
> +                               else if ((oldkey != NULL) &&
> +                                        (cd_shape_keyindex_offset != -1)
> &&
> +                                        ((keyi = BM_ELEM_CD_GET_INT(eve,
> cd_shape_keyindex_offset)) != ORIGINDEX_NONE) &&
> +                                        (keyi < currkey->totelem))
>                                 {
>                                         /* old method of reconstructing
> keys via vertice's original key indices,
>                                          * currently used if the new
> method above fails (which is theoretically
>                                          * possible in certain cases of
> undo) */
> -                                       copy_v3_v3(fp, &oldkey[3 *
> (*keyi)]);
> +                                       copy_v3_v3(fp, oldkey[keyi]);
>                                 }
>                                 else {
>                                         /* fail! fill in with dummy value
> */
>
> _______________________________________________
> 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