[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43910] branches/bmesh/blender/source/ blender/bmesh/intern/bmesh_interp.c: optimization for interpolating between vertices when the factor is 0 or 1 (1 is used frequently).

Campbell Barton ideasman42 at gmail.com
Sun Feb 5 15:34:03 CET 2012


Revision: 43910
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43910
Author:   campbellbarton
Date:     2012-02-05 14:33:59 +0000 (Sun, 05 Feb 2012)
Log Message:
-----------
optimization for interpolating between vertices when the factor is 0 or 1 (1 is used frequently).

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

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-02-05 14:07:25 UTC (rev 43909)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-02-05 14:33:59 UTC (rev 43910)
@@ -50,20 +50,39 @@
  *			bmesh_data_interp_from_verts
  *
  *  Interpolates per-vertex data from two sources to a target.
- * 
- *  Returns -
- *	Nothing
  */
 void BM_Data_Interp_From_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, float fac)
 {
-	void *src[2];
-	float w[2];
 	if (v1->head.data && v2->head.data) {
-		src[0]= v1->head.data;
-		src[1]= v2->head.data;
-		w[0] = 1.0f-fac;
-		w[1] = fac;
-		CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, v->head.data);
+		/* first see if we can avoid interpolation */
+		if (fac <= 0.0f) {
+			if (v1 == v) {
+				/* do nothing */
+			}
+			else {
+				CustomData_bmesh_free_block(&bm->vdata, &v->head.data);
+				CustomData_bmesh_copy_data(&bm->vdata, &bm->vdata, v1->head.data, &v->head.data);
+			}
+		}
+		else if (fac >= 1.0f) {
+			if (v2 == v) {
+				/* do nothing */
+			}
+			else {
+				CustomData_bmesh_free_block(&bm->vdata, &v->head.data);
+				CustomData_bmesh_copy_data(&bm->vdata, &bm->vdata, v2->head.data, &v->head.data);
+			}
+		}
+		else {
+			void *src[2];
+			float w[2];
+
+			src[0]= v1->head.data;
+			src[1]= v2->head.data;
+			w[0] = 1.0f-fac;
+			w[1] = fac;
+			CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, v->head.data);
+		}
 	}
 }
 




More information about the Bf-blender-cvs mailing list