[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58517] trunk/blender/source/blender: optimization: only calculate the normals for passing into derivedMesh foreachMappedVert/ foreachMappedFaceCenter when needed,

Campbell Barton ideasman42 at gmail.com
Tue Jul 23 00:59:47 CEST 2013


Revision: 58517
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58517
Author:   campbellbarton
Date:     2013-07-22 22:59:47 +0000 (Mon, 22 Jul 2013)
Log Message:
-----------
optimization: only calculate the normals for passing into derivedMesh foreachMappedVert/foreachMappedFaceCenter when needed,
this means in editmode with wire draw, face and vertex normals don't have to be calculated at all.

in most cases the normals are not used so add a flag that makes calculating them only for functions that need them.
also fix face normal calculation for CDDM, was using quad calculation for ngons too.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/editors/armature/armature_skinning.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex_proj.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_iterators.c
    trunk/blender/source/blender/editors/space_view3d/view3d_snap.c
    trunk/blender/source/blender/editors/util/crazyspace.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-07-22 22:46:17 UTC (rev 58516)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-07-22 22:59:47 UTC (rev 58517)
@@ -152,6 +152,11 @@
 	DM_DRAW_ALWAYS_SMOOTH = 2
 } DMDrawFlag;
 
+typedef enum DMForeachFlag {
+	DM_FOREACH_NOP = 0,
+	DM_FOREACH_USE_NORMAL = (1 << 0),  /* foreachMappedVert, foreachMappedFaceCenter */
+} DMForeachFlag;
+
 typedef enum DMDirtyFlag {
 	/* dm has valid tessellated faces, but tessellated CDDATA need to be updated. */
 	DM_DIRTY_TESS_CDLAYERS = 1 << 0,
@@ -285,7 +290,8 @@
 	void (*foreachMappedVert)(DerivedMesh *dm,
 	                          void (*func)(void *userData, int index, const float co[3],
 	                                       const float no_f[3], const short no_s[3]),
-	                          void *userData);
+	                          void *userData,
+	                          DMForeachFlag flag);
 
 	/** Iterate over each mapped edge in the derived mesh, calling the
 	 * given function with the original edge and the mapped edge's new
@@ -303,7 +309,8 @@
 	void (*foreachMappedFaceCenter)(DerivedMesh *dm,
 	                                void (*func)(void *userData, int index,
 	                                             const float cent[3], const float no[3]),
-	                                void *userData);
+	                                void *userData,
+	                                DMForeachFlag flag);
 
 	/** Iterate over all vertex points, calling DO_MINMAX with given args.
 	 *

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2013-07-22 22:46:17 UTC (rev 58516)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2013-07-22 22:59:47 UTC (rev 58517)
@@ -1036,7 +1036,7 @@
 					if (ob->type != OB_MBALL) ob->flag |= OB_DONE;  /* doesnt render */
 
 					if (me->edit_btmesh) {
-						dm->foreachMappedVert(dm, vertex_dupli__mapFunc, (void *) &vdd);
+						dm->foreachMappedVert(dm, vertex_dupli__mapFunc, (void *) &vdd, DM_FOREACH_USE_NORMAL);
 					}
 					else {
 						for (a = 0; a < totvert; a++) {

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2013-07-22 22:46:17 UTC (rev 58516)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2013-07-22 22:59:47 UTC (rev 58517)
@@ -1548,20 +1548,27 @@
 static void cdDM_foreachMappedVert(
         DerivedMesh *dm,
         void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
-        void *userData)
+        void *userData,
+        DMForeachFlag flag)
 {
 	MVert *mv = CDDM_get_verts(dm);
-	int i, orig, *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+	int *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+	int i;
 
-	for (i = 0; i < dm->numVertData; i++, mv++) {
-		if (index) {
-			orig = *index++;
+	if (index) {
+		for (i = 0; i < dm->numVertData; i++, mv++) {
+			const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
+			const int orig = *index++;
 			if (orig == ORIGINDEX_NONE) continue;
-			func(userData, orig, mv->co, NULL, mv->no);
+			func(userData, orig, mv->co, NULL, no);
 		}
-		else
-			func(userData, i, mv->co, NULL, mv->no);
 	}
+	else {
+		for (i = 0; i < dm->numVertData; i++, mv++) {
+			const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
+			func(userData, i, mv->co, NULL, no);
+		}
+	}
 }
 
 static void cdDM_foreachMappedEdge(
@@ -1588,47 +1595,37 @@
 static void cdDM_foreachMappedFaceCenter(
         DerivedMesh *dm,
         void (*func)(void *userData, int index, const float cent[3], const float no[3]),
-        void *userData)
+        void *userData,
+        DMForeachFlag flag)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
 	MVert *mvert = cddm->mvert;
 	MPoly *mp;
 	MLoop *ml;
-	int i, j, orig, *index;
+	int i, orig, *index;
 
 	index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
 	mp = cddm->mpoly;
 	for (i = 0; i < dm->numPolyData; i++, mp++) {
 		float cent[3];
-		float no[3];
+		float *no, _no[3];
 
 		if (index) {
 			orig = *index++;
 			if (orig == ORIGINDEX_NONE) continue;
 		}
-		else
+		else {
 			orig = i;
+		}
 		
 		ml = &cddm->mloop[mp->loopstart];
-		cent[0] = cent[1] = cent[2] = 0.0f;
-		for (j = 0; j < mp->totloop; j++, ml++) {
-			add_v3_v3v3(cent, cent, mvert[ml->v].co);
-		}
-		mul_v3_fl(cent, 1.0f / (float)j);
+		BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
 
-		ml = &cddm->mloop[mp->loopstart];
-		if (j > 3) {
-			normal_quad_v3(no,
-			               mvert[(ml + 0)->v].co,
-			               mvert[(ml + 1)->v].co,
-			               mvert[(ml + 2)->v].co,
-			               mvert[(ml + 3)->v].co);
+		if (flag & DM_FOREACH_USE_NORMAL) {
+			BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no));
 		}
 		else {
-			normal_tri_v3(no,
-			              mvert[(ml + 0)->v].co,
-			              mvert[(ml + 1)->v].co,
-			              mvert[(ml + 2)->v].co);
+			no = NULL;
 		}
 
 		func(userData, orig, cent, no);

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-07-22 22:46:17 UTC (rev 58516)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2013-07-22 22:59:47 UTC (rev 58517)
@@ -86,7 +86,6 @@
 
 static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm)
 {
-
 	if (bmdm->vertexCos && (bmdm->vertexNos == NULL)) {
 
 		BMesh *bm = bmdm->em->bm;
@@ -196,9 +195,11 @@
 	/* do nothing */
 }
 
-static void emDM_foreachMappedVert(DerivedMesh *dm,
-                                   void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
-                                   void *userData)
+static void emDM_foreachMappedVert(
+        DerivedMesh *dm,
+        void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
+        void *userData,
+        DMForeachFlag flag)
 {
 	EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
 	BMesh *bm = bmdm->em->bm;
@@ -207,14 +208,26 @@
 	int i;
 
 	if (bmdm->vertexCos) {
-		emDM_ensureVertNormals(bmdm);
+		const float (*vertexCos)[3] = bmdm->vertexCos;
+		const float (*vertexNos)[3];
+
+		if (flag & DM_FOREACH_USE_NORMAL) {
+			emDM_ensureVertNormals(bmdm);
+			vertexNos = bmdm->vertexNos;
+		}
+		else {
+			vertexNos = NULL;
+		}
+
 		BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
-			func(userData, i, bmdm->vertexCos[i], bmdm->vertexNos[i], NULL);
+			const float *no = (flag & DM_FOREACH_USE_NORMAL) ? vertexNos[i] : NULL;
+			func(userData, i, vertexCos[i], no, NULL);
 		}
 	}
 	else {
 		BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
-			func(userData, i, eve->co, eve->no, NULL);
+			const float *no = (flag & DM_FOREACH_USE_NORMAL) ? eve->no : NULL;
+			func(userData, i, eve->co, no, NULL);
 		}
 	}
 }
@@ -359,9 +372,11 @@
 	glEnd();
 }
 
-static void emDM_foreachMappedFaceCenter(DerivedMesh *dm,
-                                         void (*func)(void *userData, int index, const float co[3], const float no[3]),
-                                         void *userData)
+static void emDM_foreachMappedFaceCenter(
+        DerivedMesh *dm,
+        void (*func)(void *userData, int index, const float co[3], const float no[3]),
+        void *userData,
+        DMForeachFlag flag)
 {
 	EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
 	BMesh *bm = bmdm->em->bm;
@@ -371,14 +386,29 @@
 	BMIter iter;
 	int i;
 
-	emDM_ensurePolyNormals(bmdm);
 	emDM_ensurePolyCenters(bmdm);
-	polyNos = bmdm->polyNos;  /* maybe NULL */
 	polyCos = bmdm->polyCos;  /* always set */
 
-	BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
-		func(userData, i, polyCos[i], polyNos ? polyNos[i] : efa->no);
+	if (flag & DM_FOREACH_USE_NORMAL) {
+		emDM_ensurePolyNormals(bmdm);
+		polyNos = bmdm->polyNos;  /* maybe NULL */
 	}
+	else {
+		polyNos = NULL;
+	}
+
+	if (polyNos) {
+		BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
+			const float *no = polyNos[i];
+			func(userData, i, polyCos[i], no);
+		}
+	}
+	else {
+		BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
+			const float *no = (flag & DM_FOREACH_USE_NORMAL) ? efa->no : NULL;
+			func(userData, i, polyCos[i], no);
+		}
+	}
 }
 
 static void emDM_drawMappedFaces(DerivedMesh *dm,
@@ -433,10 +463,16 @@
 		const float (*vertexNos)[3];
 		const float (*polyNos)[3];
 
-		emDM_ensureVertNormals(bmdm);
-		emDM_ensurePolyNormals(bmdm);
-		vertexNos = bmdm->vertexNos;
-		polyNos = bmdm->polyNos;
+		if (skip_normals) {
+			vertexNos = NULL;
+			polyNos = NULL;
+		}
+		else {
+			emDM_ensureVertNormals(bmdm);
+			emDM_ensurePolyNormals(bmdm);
+			vertexNos = bmdm->vertexNos;
+			polyNos = bmdm->polyNos;
+		}
 
 		BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE);
 
@@ -2186,7 +2222,7 @@
 	data.cos_cage = cos_cage;
 	data.visit_bitmap = visit_bitmap;
 
-	cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data);
+	cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data, DM_FOREACH_NOP);
 
 	MEM_freeN(visit_bitmap);
 

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2013-07-22 22:46:17 UTC (rev 58516)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2013-07-22 22:59:47 UTC (rev 58517)
@@ -1505,7 +1505,8 @@
 static void ccgDM_foreachMappedVert(
         DerivedMesh *dm,
         void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
-        void *userData)
+        void *userData,
+        DMForeachFlag flag)
 {
 	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
 	CCGVertIterator *vi;
@@ -1514,11 +1515,13 @@
 
 	for (vi = ccgSubSurf_getVertIterator(ccgdm->ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 		CCGVert *v = ccgVertIterator_getCurrent(vi);
-		CCGElem *vd = ccgSubSurf_getVertData(ccgdm->ss, v);
-		int index = ccgDM_getVertMapIndex(ccgdm->ss, v);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list