[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