[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23018] branches/bmesh/blender/source/ blender: part one of profiling/optimizing.

Joseph Eagar joeedh at gmail.com
Sat Sep 5 08:10:31 CEST 2009


Revision: 23018
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23018
Author:   joeedh
Date:     2009-09-05 08:10:30 +0200 (Sat, 05 Sep 2009)

Log Message:
-----------
part one of profiling/optimizing.  made cddm not update tesselations itself in cddm_from_mesh.  also made BMO_Test/Set/ClearFlag into macros, and tweaked the way normals are calculated.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-09-05 06:10:30 UTC (rev 23018)
@@ -951,8 +951,8 @@
 	                 mesh->totvert);
 	CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype,
 	                 mesh->totedge);
-	//CustomData_merge(&mesh->fdata, &dm->faceData, mask, alloctype,
-	//                 mesh->totface);
+	CustomData_merge(&mesh->fdata, &dm->faceData, mask|CD_MASK_ORIGINDEX, alloctype,
+	                 mesh->totface);
 	CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype,
 	                 mesh->totloop);
 	CustomData_merge(&mesh->pdata, &dm->polyData, mask, alloctype,
@@ -962,7 +962,7 @@
 	cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
 	cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
 	cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
-	//cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+	cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 
 	index = CustomData_get_layer(&dm->vertData, CD_ORIGINDEX);
 	for(i = 0; i < mesh->totvert; ++i, ++index)
@@ -976,9 +976,8 @@
 	for(i = 0; i < mesh->totpoly; ++i, ++index)
 		*index = i;
 
-	/*recalculates mfaces and sets the mface origindex layer
-	  to index mypolys.*/
-	cdDM_recalcTesselation((DerivedMesh*)cddm);
+	if (!CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX))
+		CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totface);
 
 	return dm;
 }

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2009-09-05 06:10:30 UTC (rev 23018)
@@ -177,6 +177,7 @@
 	}
 	MEM_freeN(medge);
 	
+	/*do faces*/
 	k = 0;
 	dfiter = dm->newFaceIter(dm);
 	for (; !dfiter->done; dfiter->step(dfiter)) {
@@ -215,7 +216,6 @@
 		CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, 
 			dfiter->index, &f->head.data);
 	}
-	
 	dfiter->free(dfiter);
 
 	MEM_freeN(vtable);
@@ -275,7 +275,7 @@
 					  Scene *scene, Object *ob, DerivedMesh *dm,
                                           int initFlags)
 {
-	DerivedMesh *cddm = CDDM_copy(dm);
+	DerivedMesh *cddm = dm; //CDDM_copy(dm); copying shouldn't be necassary here, as all modifiers return CDDM's
 	BMEditMesh *em = CDDM_To_BMesh(cddm, NULL);
 	BMOperator op, oldop, weldop;
 	int i, j, indexLen;
@@ -388,8 +388,8 @@
 		MTC_Mat4CpyMat4(final_offset, tmp_mat);
 	}
 
-	cddm->needsFree = 1;
-	cddm->release(cddm);
+	//cddm->needsFree = 1;
+	//cddm->release(cddm);
 	
 	BMO_Init_Op(&weldop, "weldverts");
 	BMO_InitOpf(em->bm, &op, "dupe geom=%avef");
@@ -475,7 +475,9 @@
 
 	if (j > 0) BMO_Finish_Op(em->bm, &op);
 
-	BMO_Exec_Op(em->bm, &weldop);
+	if (amd->flags & MOD_ARR_MERGE)
+		BMO_Exec_Op(em->bm, &weldop);
+
 	BMO_Finish_Op(em->bm, &weldop);
 
 	//BMO_CallOpf(em->bm, "removedoubles verts=%av dist=%f", amd->merge_dist);
@@ -533,11 +535,11 @@
 	float mtx[4][4], imtx[4][4];
 	int i, j;
 
-	cddm = CDDM_copy(dm);
+	cddm = dm; //CDDM_copy(dm); copying shouldn't be necassary here, as all modifiers return CDDM's
 	em = CDDM_To_BMesh(dm, NULL);
 
-	cddm->needsFree = 1;
-	cddm->release(cddm);
+	//cddm->needsFree = 1;
+	//cddm->release(cddm);
 	
 	/*convienence variable*/
 	bm = em->bm;

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-09-05 06:10:30 UTC (rev 23018)
@@ -131,9 +131,14 @@
   if you need to store a value per element, use a 
   ghash or a mapping slot to do it.*/
 /*flags 15 and 16 (1<<14 and 1<<15) are reserved for bmesh api use*/
+#define BMO_TestFlag(bm, element, flag) (((BMHeader*)element)->flags[bm->stackdepth-1].mask & (flag))
+#define BMO_SetFlag(bm, element, flag) (((BMHeader*)element)->flags[bm->stackdepth-1].mask |= (flag))
+#define BMO_ClearFlag(bm, element, flag) (((BMHeader*)element)->flags[bm->stackdepth-1].mask &= ~(flag))
+
+/*profiling showed a significant amount of time spent in BMO_TestFlag
 void BMO_SetFlag(struct BMesh *bm, void *element, int flag);
 void BMO_ClearFlag(struct BMesh *bm, void *element, int flag);
-int BMO_TestFlag(struct BMesh *bm, void *element, int flag);
+int BMO_TestFlag(struct BMesh *bm, void *element, int flag);*/
 
 /*count the number of elements with a specific flag.  type
   can be a bitmask of BM_FACE, BM_EDGE, or BM_FACE.*/

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-09-05 06:10:30 UTC (rev 23018)
@@ -357,47 +357,6 @@
 }
 
 /*
- * BMO_SETFLAG
- *
- * Sets a flag for a certain element
- *
-*/
-void BMO_SetFlag(BMesh *bm, void *element, int flag)
-{
-	BMHeader *head = element;
-	head->flags[bm->stackdepth-1].mask |= flag;
-}
-
-/*
- * BMO_CLEARFLAG
- *
- * Clears a specific flag from a given element
- *
-*/
-
-void BMO_ClearFlag(BMesh *bm, void *element, int flag)
-{
-	BMHeader *head = element;
-	head->flags[bm->stackdepth-1].mask &= ~flag;
-}
-
-/*
- * BMO_TESTFLAG
- *
- * Tests whether or not a flag is set for a specific element
- *
- *
-*/
-
-int BMO_TestFlag(BMesh *bm, void *element, int flag)
-{
-	BMHeader *head = element;
-	if(head->flags[bm->stackdepth-1].mask & flag)
-		return 1;
-	return 0;
-}
-
-/*
  * BMO_COUNTFLAG
  *
  * Counts the number of elements of a certain type that
@@ -1347,3 +1306,53 @@
 	return 1;
 }
 
+
+/*
+ * BMO_SETFLAG
+ *
+ * Sets a flag for a certain element
+ *
+*/
+#ifdef BMO_SetFlag
+#undef BMO_SetFlag
+#endif
+void BMO_SetFlag(BMesh *bm, void *element, int flag)
+{
+	BMHeader *head = element;
+	head->flags[bm->stackdepth-1].mask |= flag;
+}
+
+/*
+ * BMO_CLEARFLAG
+ *
+ * Clears a specific flag from a given element
+ *
+*/
+
+#ifdef BMO_ClearFlag
+#undef BMO_ClearFlag
+#endif
+void BMO_ClearFlag(BMesh *bm, void *element, int flag)
+{
+	BMHeader *head = element;
+	head->flags[bm->stackdepth-1].mask &= ~flag;
+}
+
+/*
+ * BMO_TESTFLAG
+ *
+ * Tests whether or not a flag is set for a specific element
+ *
+ *
+*/
+
+#ifdef BMO_TestFlag
+#undef BMO_TestFlag
+#endif
+int BMO_TestFlag(BMesh *bm, void *element, int flag)
+{
+	BMHeader *head = element;
+	if(head->flags[bm->stackdepth-1].mask & flag)
+		return 1;
+	return 0;
+}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-09-05 06:10:30 UTC (rev 23018)
@@ -90,6 +90,7 @@
 
 	double u[3],  v[3], w[3];/*, *w, v1[3], v2[3];*/
 	double n[3] = {0.0, 0.0, 0.0}, l, v1[3], v2[3];
+	double l2;
 	int i, s=0;
 
 	/*this fixes some weird numerical error*/
@@ -129,19 +130,27 @@
 		n[2] += (u[0] - v[0]) * (u[1] + v[1]);
 	}
 	
-	l = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+	l = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
+	l = sqrt(l);
+	/*fast square root, newton/babylonian method:
+	l2 = l*0.1;
 
+	l2 = (l/l2 + l2)*0.5;
+	l2 = (l/l2 + l2)*0.5;
+	l2 = (l/l2 + l2)*0.5;
+	*/
+
 	if (l == 0.0) {
 		normal[0] = 0.0f;
 		normal[1] = 0.0f;
 		normal[2] = 1.0f;
 
 		return;
-	}
+	} else l = 1.0f / l;
 
-	n[0] /= l;
-	n[1] /= l;
-	n[2] /= l;
+	n[0] *= l;
+	n[1] *= l;
+	n[2] *= l;
 	
 	normal[0] = (float) n[0];
 	normal[1] = (float) n[1];
@@ -437,7 +446,7 @@
 	BMLoop *l;
 	int i;
 
-	if(1) { //f->len > 4){
+	if(f->len > 4) {
 		i = 0;
 		l = f->loopbase;
 		do{
@@ -446,7 +455,6 @@
 			i += 1;
 		}while(l!=f->loopbase);
 
-		//compute_poly_plane(projectverts, f->len);
 		compute_poly_normal(f->no, projectverts, f->len);	
 	}
 	else if(f->len == 3){

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2009-09-05 06:10:30 UTC (rev 23018)
@@ -257,14 +257,6 @@
 	BMesh *bm = me->edit_btmesh->bm;
 
 	BMO_CallOpf(bm, "object_load_bmesh scene=%p object=%p", scene, ob);
-
-#if 0
-	EditMesh *em = bmesh_to_editmesh(me->edit_btmesh->bm);
-	
-	load_editMesh(scene, ob, em);
-	free_editMesh(em);
-	MEM_freeN(em);
-#endif
 }
 
 void EDBM_FreeEditBMesh(BMEditMesh *tm)

Modified: branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2009-09-05 04:04:51 UTC (rev 23017)
+++ branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2009-09-05 06:10:30 UTC (rev 23018)
@@ -204,60 +204,8 @@
 	return rgba_to_mcol(brush->rgb[0], brush->rgb[1], brush->rgb[2], 1.0f);
 }
 
-void do_shared_vertexcol(Mesh *me)
+static void do_shared_vertex_tesscol(Mesh *me)
 {
-	MLoop *ml = me->mloop;
-	MLoopCol *lcol = me->mloopcol;
-	MTexPoly *mtp = me->mtpoly;
-	MPoly *mp = me->mpoly;
-	float (*scol)[5];
-	int i;
-
-	/* if no mloopcol: do not do */
-	/* if mtexpoly: only the involved faces, otherwise all */
-
-	if(me->mloopcol==0 || me->totvert==0 || me->totpoly==0) return;
-
-	scol = MEM_callocN(sizeof(float)*me->totvert*5, "scol");
-
-	for (i=0; i<me->totloop; i++, ml++, lcol++) {
-		if (i >= mp->loopstart + mp->totloop) {
-			mp++;
-			if (mtp) mtp++;
-		}
-
-		if (mtp && !(mtp->mode & TF_SHAREDCOL))
-			continue;
-
-		scol[ml->v][0] += lcol->r;
-		scol[ml->v][1] += lcol->g;
-		scol[ml->v][2] += lcol->b;
-		scol[ml->v][3] += lcol->a;
-		scol[ml->v][4] += 1.0;
-	}
-	
-	for (i=0; i<me->totvert; i++) {
-		if (!scol[i][4]) continue;
-
-		scol[i][0] /= scol[i][4];
-		scol[i][1] /= scol[i][4];
-		scol[i][2] /= scol[i][4];

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list