[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46477] trunk/blender/source/blender/ editors/space_view3d/drawobject.c: some speedups for face angle drawing

Campbell Barton ideasman42 at gmail.com
Wed May 9 18:43:09 CEST 2012


Revision: 46477
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46477
Author:   campbellbarton
Date:     2012-05-09 16:43:09 +0000 (Wed, 09 May 2012)
Log Message:
-----------
some speedups for face angle drawing
- avoid calculating face center when the face isnt used at all.
- avoid copying vectors when its not needed.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/drawobject.c

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2012-05-09 16:38:49 UTC (rev 46476)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2012-05-09 16:43:09 UTC (rev 46477)
@@ -2955,35 +2955,45 @@
 		UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col);
 
 
-		for (efa = BM_iter_new(&iter, em->bm, BM_FACES_OF_MESH, NULL);
-		     efa; efa = BM_iter_step(&iter))
-		{
-			BMIter liter;
-			BMLoop *loop;
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			const int is_face_sel = BM_elem_flag_test(efa, BM_ELEM_SELECT);
 
-			BM_face_calc_center_bounds(efa, vmid);
+			if (is_face_sel || do_moving) {
+				BMIter liter;
+				BMLoop *loop;
+				int cent_ok = FALSE;
 
-			for (loop = BM_iter_new(&liter, em->bm, BM_LOOPS_OF_FACE, efa);
-			     loop; loop = BM_iter_step(&liter))
-			{
-				float v1[3], v2[3], v3[3];
+				BM_ITER_ELEM(loop, &liter, efa, BM_LOOPS_OF_FACE) {
+					if (is_face_sel || (do_moving && BM_elem_flag_test(loop->v, BM_ELEM_SELECT))) {
+						/* yes, we should avoid triple matrix multiply every vertex for 'global' */
+						float angle;
 
-				copy_v3_v3(v1, loop->prev->v->co);
-				copy_v3_v3(v2, loop->v->co);
-				copy_v3_v3(v3, loop->next->v->co);
+						/* lazy init center calc */
+						if (cent_ok == FALSE) {
+							BM_face_calc_center_bounds(efa, vmid);
+							cent_ok = TRUE;
+						}
 
-				if (do_global) {
-					mul_mat3_m4_v3(ob->obmat, v1);
-					mul_mat3_m4_v3(ob->obmat, v2);
-					mul_mat3_m4_v3(ob->obmat, v3);
-				}
+						if (do_global) {
+							copy_v3_v3(v1, loop->prev->v->co);
+							copy_v3_v3(v2, loop->v->co);
+							copy_v3_v3(v3, loop->next->v->co);
 
-				if ( (BM_elem_flag_test(efa, BM_ELEM_SELECT)) ||
-				     (do_moving && BM_elem_flag_test(loop->v, BM_ELEM_SELECT)))
-				{
-					BLI_snprintf(numstr, sizeof(numstr), "%.3f", RAD2DEGF(angle_v3v3v3(v1, v2, v3)));
-					interp_v3_v3v3(fvec, vmid, v2, 0.8f);
-					view3d_cached_text_draw_add(fvec, numstr, 0, txt_flag, col);
+							mul_mat3_m4_v3(ob->obmat, v1);
+							mul_mat3_m4_v3(ob->obmat, v2);
+							mul_mat3_m4_v3(ob->obmat, v3);
+
+							angle = angle_v3v3v3(v1, v2, v3);
+							interp_v3_v3v3(fvec, vmid, v2, 0.8f);
+						}
+						else {
+							angle = angle_v3v3v3(loop->prev->v->co, loop->v->co, loop->v->co);
+							interp_v3_v3v3(fvec, vmid, loop->v->co, 0.8f);
+						}
+
+						BLI_snprintf(numstr, sizeof(numstr), "%.3f", RAD2DEGF(angle));
+						view3d_cached_text_draw_add(fvec, numstr, 0, txt_flag, col);
+					}
 				}
 			}
 		}




More information about the Bf-blender-cvs mailing list