Revision: 43757
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43757
Author:   campbellbarton
Date:     2012-01-30 01:18:49 +0000 (Mon, 30 Jan 2012)
Log Message:
-----------
more efficient array copying for add_shapekey_layers

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2012-01-29 22:32:00 UTC (rev 43756)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2012-01-30 01:18:49 UTC (rev 43757)
@@ -1211,29 +1211,39 @@
 {
        KeyBlock *kb;
        Key *key = me->key;
-       int a, b;
-       
+       int i;
+       const size_t shape_alloc_len = sizeof(float) * 3 * me->totvert;
+
        if (!me->key)
                return;
-       
-       if (dm->numVertData != me->totvert) {
-               printf("error in add_shapekey_layers: dm isn't the same size as 
me\n");
+
+       /* ensure we can use mesh vertex count for derived mesh custom data */
+       if (me->totvert != dm->getNumVerts(dm)) {
+               fprintf(stderr,
+                       "%s: vertex size mismatch (mesh/dm) '%s' (%d != %d)\n",
+                       __func__, me->id.name+2, me->totvert, 
dm->getNumVerts(dm));
                return;
        }
-               
-       for (a=0, kb=key->block.first; kb; kb=kb->next, a++) {
-               float (*cos)[3] = CustomData_add_layer_named(&dm->vertData, 
CD_SHAPEKEY, CD_CALLOC, NULL, dm->numVertData, kb->name);
-               int ci = CustomData_get_layer_index_n(&dm->vertData, 
CD_SHAPEKEY, a);
-               
-               dm->vertData.layers[ci].uid = kb->uid;
-               if (kb->totelem != dm->numVertData) {
-                       printf("error in add_shapekey_layers: totelem and 
totvert don't match");
-                       continue;
+
+       for (i=0, kb=key->block.first; kb; kb=kb->next, i++) {
+               int ci;
+               float *array;
+
+               if (me->totvert != kb->totelem) {
+                       fprintf(stderr,
+                               "%s: vertex size mismatch (mesh/keyblock) '%s' 
(%d != %d)\n",
+                               __func__, me->id.name+2, me->totvert, 
kb->totelem);
+                       array = MEM_callocN(shape_alloc_len, __func__);
                }
-               
-               for (b=0; b<kb->totelem; b++, cos++) {
-                       copy_v3_v3((float *)cos, ((float*)kb->data)+b*3);
+               else {
+                       array = MEM_mallocN(shape_alloc_len, __func__);
+                       memcpy(array, kb->data, shape_alloc_len);
                }
+
+               CustomData_add_layer_named(&dm->vertData, CD_SHAPEKEY, 
CD_ASSIGN, array, dm->numVertData, kb->name);
+               ci = CustomData_get_layer_index_n(&dm->vertData, CD_SHAPEKEY, 
i);
+
+               dm->vertData.layers[ci].uid = kb->uid;
        }
 }
 
@@ -1934,7 +1944,7 @@
 }
 
 static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
-       int build_shapekey_layers)
+                            int build_shapekey_layers)
 {
        Object *obact = scene->basact?scene->basact->object:NULL;
        int editing = paint_facesel_test(ob);
@@ -1980,7 +1990,7 @@
 }
 
 void makeDerivedMesh(Scene *scene, Object *ob, BMEditMesh *em,
-       CustomDataMask dataMask, int build_shapekey_layers)
+                     CustomDataMask dataMask, int build_shapekey_layers)
 {
        if (em) {
                editbmesh_build_data(scene, ob, em, dataMask);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to