[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58386] trunk/blender/source/blender: optimization: avoid memcpy with shake key vertex array.

Campbell Barton ideasman42 at gmail.com
Fri Jul 19 12:40:20 CEST 2013


Revision: 58386
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58386
Author:   campbellbarton
Date:     2013-07-19 10:40:20 +0000 (Fri, 19 Jul 2013)
Log Message:
-----------
optimization: avoid memcpy with shake key vertex array.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_key.h
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/modifiers/intern/MOD_shapekey.c

Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_key.h	2013-07-19 10:40:12 UTC (rev 58385)
+++ trunk/blender/source/blender/blenkernel/BKE_key.h	2013-07-19 10:40:20 UTC (rev 58386)
@@ -59,6 +59,8 @@
 void key_curve_tangent_weights(float t, float data[4], int type);
 void key_curve_normal_weights(float t, float data[4], int type);
 
+float *BKE_key_evaluate_object_ex(struct Scene *scene, struct Object *ob, int *r_totelem,
+                                  float *arr, size_t arr_size);
 float *BKE_key_evaluate_object(struct Scene *scene, struct Object *ob, int *r_totelem);
 
 struct Key      *BKE_key_from_object(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2013-07-19 10:40:12 UTC (rev 58385)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2013-07-19 10:40:20 UTC (rev 58386)
@@ -1342,7 +1342,8 @@
 }
 
 /* returns key coordinates (+ tilt) when key applied, NULL otherwise */
-float *BKE_key_evaluate_object(Scene *scene, Object *ob, int *r_totelem)
+float *BKE_key_evaluate_object_ex(Scene *scene, Object *ob, int *r_totelem,
+                                  float *arr, size_t arr_size)
 {
 	Key *key = BKE_key_from_object(ob);
 	KeyBlock *actkb = BKE_keyblock_from_object(ob);
@@ -1386,8 +1387,17 @@
 		return NULL;
 	
 	/* allocate array */
-	out = MEM_callocN(size, "BKE_key_evaluate_object out");
+	if (arr == NULL) {
+		out = MEM_callocN(size, "BKE_key_evaluate_object out");
+	}
+	else {
+		if (arr_size != size) {
+			return NULL;
+		}
 
+		out = (char *)arr;
+	}
+
 	/* prevent python from screwing this up? anyhoo, the from pointer could be dropped */
 	key->from = (ID *)ob->data;
 		
@@ -1427,6 +1437,11 @@
 	return (float *)out;
 }
 
+float *BKE_key_evaluate_object(Scene *scene, Object *ob, int *r_totelem)
+{
+	return BKE_key_evaluate_object_ex(scene, ob, r_totelem, NULL, 0);
+}
+
 Key *BKE_key_from_object(Object *ob)
 {
 	if (ob == NULL) return NULL;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_shapekey.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_shapekey.c	2013-07-19 10:40:12 UTC (rev 58385)
+++ trunk/blender/source/blender/modifiers/intern/MOD_shapekey.c	2013-07-19 10:40:20 UTC (rev 58386)
@@ -55,17 +55,12 @@
                         ModifierApplyFlag UNUSED(flag))
 {
 	Key *key = BKE_key_from_object(ob);
-	float (*deformedVerts)[3];
 
 	if (key && key->block.first) {
 		int deformedVerts_tot;
-		deformedVerts = (float(*)[3])BKE_key_evaluate_object(md->scene, ob, &deformedVerts_tot);
-		if (deformedVerts) {
-			if (numVerts == deformedVerts_tot) {
-				memcpy(vertexCos, deformedVerts, sizeof(float) * 3 * numVerts);
-			}
-			MEM_freeN(deformedVerts);
-		}
+		BKE_key_evaluate_object_ex(md->scene, ob, &deformedVerts_tot,
+		                           (float *)vertexCos, sizeof(*vertexCos) * numVerts);
+
 	}
 }
 




More information about the Bf-blender-cvs mailing list