[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50651] trunk/blender/source/blender/ blenkernel: speedup for vertex parent lookups, were looping over array elements when it wasn' t needed for lattice and curves, and in some cases meshes.

Campbell Barton ideasman42 at gmail.com
Sun Sep 16 10:25:32 CEST 2012


Revision: 50651
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50651
Author:   campbellbarton
Date:     2012-09-16 08:25:31 +0000 (Sun, 16 Sep 2012)
Log Message:
-----------
speedup for vertex parent lookups, were looping over array elements when it wasn't needed for lattice and curves, and in some cases meshes.

do dirrect array lookups instead where possible.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2012-09-16 07:27:43 UTC (rev 50650)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2012-09-16 08:25:31 UTC (rev 50651)
@@ -93,6 +93,8 @@
 
 /* ** Nurbs ** */
 
+int BKE_nurbList_index_get_co(struct ListBase *editnurb, const int index, float r_co[3]);
+
 int BKE_nurbList_verts_count(struct ListBase *nurb);
 int BKE_nurbList_verts_count_without_handles(struct ListBase *nurb);
 

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2012-09-16 07:27:43 UTC (rev 50650)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2012-09-16 08:25:31 UTC (rev 50651)
@@ -429,6 +429,33 @@
 	}
 }
 
+int BKE_nurbList_index_get_co(ListBase *nurb, const int index, float r_co[3])
+{
+	Nurb *nu;
+	int tot = 0;
+
+	for (nu = nurb->first; nu; nu = nu->next) {
+		int tot_nu;
+		if (nu->type == CU_BEZIER) {
+			tot_nu = nu->pntsu;
+			if (index - tot < tot_nu) {
+				copy_v3_v3(r_co, nu->bezt[index - tot].vec[1]);
+				return TRUE;
+			}
+		}
+		else {
+			tot_nu = nu->pntsu * nu->pntsv;
+			if (index - tot < tot_nu) {
+				copy_v3_v3(r_co, nu->bp[index - tot].vec);
+				return TRUE;
+			}
+		}
+		tot += tot_nu;
+	}
+
+	return FALSE;
+}
+
 int BKE_nurbList_verts_count(ListBase *nurb)
 {
 	Nurb *nu;

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2012-09-16 07:27:43 UTC (rev 50650)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2012-09-16 08:25:31 UTC (rev 50651)
@@ -1766,13 +1766,13 @@
 static void give_parvert(Object *par, int nr, float vec[3])
 {
 	BMEditMesh *em;
-	int a, count;
 
 	zero_v3(vec);
 	
 	if (par->type == OB_MESH) {
 		Mesh *me = par->data;
 		DerivedMesh *dm;
+		int count;
 
 		em = me->edit_btmesh;
 
@@ -1795,19 +1795,29 @@
 		dm = (em) ? em->derivedFinal : par->derivedFinal;
 			
 		if (dm) {
-			MVert *mvert = dm->getVertArray(dm);
-			int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
-			int i, vindex, numVerts = dm->getNumVerts(dm);
+			int numVerts = dm->getNumVerts(dm);
 
-			/* get the average of all verts with (original index == nr) */
-			count = 0;
-			for (i = 0; i < numVerts; i++) {
-				vindex = (index) ? index[i] : i;
+			if (nr < numVerts) {
+				MVert *mvert = dm->getVertArray(dm);
+				int   *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
+				int i;
 
-				if (vindex == nr) {
-					add_v3_v3(vec, mvert[i].co);
-					count++;
+				/* get the average of all verts with (original index == nr) */
+				count = 0;
+				if (index) {
+					for (i = 0; i < numVerts; i++) {
+						if (index[i] == nr) {
+							add_v3_v3(vec, mvert[i].co);
+							count++;
+						}
+					}
 				}
+				else {
+					if (nr < numVerts) {
+						add_v3_v3(vec, mvert[nr].co);
+						count++;
+					}
+				}
 			}
 
 			if (count == 0) {
@@ -1828,73 +1838,33 @@
 		}
 	}
 	else if (ELEM(par->type, OB_CURVE, OB_SURF)) {
-		Nurb *nu;
-		Curve *cu;
-		BPoint *bp;
-		BezTriple *bezt;
-		int found = 0;
-		ListBase *nurbs;
+		Curve *cu       = par->data;
+		ListBase *nurb  = BKE_curve_nurbs_get(cu);;
 
-		cu = par->data;
-		nurbs = BKE_curve_nurbs_get(cu);
-		nu = nurbs->first;
+		BKE_nurbList_index_get_co(nurb, nr, vec);
+	}
+	else if (par->type == OB_LATTICE) {
+		Lattice *latt  = par->data;
+		DispList *dl   = BKE_displist_find(&par->disp, DL_VERTS);
+		float (*co)[3] = dl ? (float (*)[3])dl->verts : NULL;
+		int tot;
 
-		count = 0;
-		while (nu && !found) {
-			if (nu->type == CU_BEZIER) {
-				bezt = nu->bezt;
-				a = nu->pntsu;
-				while (a--) {
-					if (count == nr) {
-						found = 1;
-						copy_v3_v3(vec, bezt->vec[1]);
-						break;
-					}
-					count++;
-					bezt++;
-				}
+		if (latt->editlatt) latt = latt->editlatt->latt;
+
+		tot = latt->pntsu * latt->pntsv * latt->pntsw;
+
+		/* ensure dl is correct size */
+		BLI_assert(dl == NULL || dl->nr == tot);
+
+		if (nr < tot) {
+			if (co) {
+				copy_v3_v3(vec, co[nr]);
 			}
 			else {
-				bp = nu->bp;
-				a = nu->pntsu * nu->pntsv;
-				while (a--) {
-					if (count == nr) {
-						found = 1;
-						copy_v3_v3(vec, bp->vec);
-						break;
-					}
-					count++;
-					bp++;
-				}
+				copy_v3_v3(vec, latt->def[nr].vec);
 			}
-			nu = nu->next;
 		}
-
 	}
-	else if (par->type == OB_LATTICE) {
-		Lattice *latt = par->data;
-		BPoint *bp;
-		DispList *dl = BKE_displist_find(&par->disp, DL_VERTS);
-		float *co = dl ? dl->verts : NULL;
-		
-		if (latt->editlatt) latt = latt->editlatt->latt;
-		
-		a = latt->pntsu * latt->pntsv * latt->pntsw;
-		count = 0;
-		bp = latt->def;
-		while (a--) {
-			if (count == nr) {
-				if (co)
-					copy_v3_v3(vec, co);
-				else
-					copy_v3_v3(vec, bp->vec);
-				break;
-			}
-			count++;
-			if (co) co += 3;
-			else bp++;
-		}
-	}
 }
 
 static void ob_parvert3(Object *ob, Object *par, float mat[][4])




More information about the Bf-blender-cvs mailing list