diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-12-27 07:51:45 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-12-27 07:51:45 +0400 |
commit | 1d6c3ccf092c9c692db454f477435a814b81d30a (patch) | |
tree | 948dbbfbf7d9b55195dbde36bfffda037abd284e /source | |
parent | 6586fd9c62784af5496c48e5eeebc9b128d1addd (diff) |
display the number of tri's in object mode status, often requested feature from users who model for realtime/game-engine output,
the total number of faces wasn't so useful and could be especially misleading with ngons.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 37 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_geom.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_geom_inline.c | 20 | ||||
-rw-r--r-- | source/blender/editors/space_info/info_stats.c | 46 |
5 files changed, 67 insertions, 40 deletions
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 758a2a8a2e8..6b986cdceda 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -83,7 +83,7 @@ void BKE_displist_elem_free(DispList *dl); DispList *BKE_displist_find_or_create(struct ListBase *lb, int type); DispList *BKE_displist_find(struct ListBase *lb, int type); void BKE_displist_normals_add(struct ListBase *lb); -void BKE_displist_count(struct ListBase *lb, int *totvert, int *totface); +void BKE_displist_count(struct ListBase *lb, int *totvert, int *totface, int *tottri); void BKE_displist_free(struct ListBase *lb); int BKE_displist_has_faces(struct ListBase *lb); diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 083cb02fd3d..47cb18a7172 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -225,29 +225,48 @@ void BKE_displist_normals_add(ListBase *lb) } } -void BKE_displist_count(ListBase *lb, int *totvert, int *totface) +void BKE_displist_count(ListBase *lb, int *totvert, int *totface, int *tottri) { DispList *dl; - dl = lb->first; - while (dl) { + for (dl = lb->first; dl; dl = dl->next) { + int vert_tot = 0; + int face_tot = 0; + int tri_tot = 0; + switch (dl->type) { case DL_SURF: - *totvert += dl->nr * dl->parts; - *totface += (dl->nr - 1) * (dl->parts - 1); + { + vert_tot = dl->nr * dl->parts; + face_tot = (dl->nr - 1) * (dl->parts - 1); + tri_tot = face_tot * 2; break; + } case DL_INDEX3: + { + vert_tot = dl->nr; + face_tot = dl->parts; + tri_tot = face_tot; + break; + } case DL_INDEX4: - *totvert += dl->nr; - *totface += dl->parts; + { + vert_tot = dl->nr; + face_tot = dl->parts; + tri_tot = face_tot * 2; break; + } case DL_POLY: case DL_SEGM: - *totvert += dl->nr * dl->parts; + { + vert_tot = dl->nr * dl->parts; break; + } } - dl = dl->next; + *totvert += vert_tot; + *totface += face_tot; + *tottri += tri_tot; } } diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index 423765bad3d..2f3521fa030 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -262,6 +262,8 @@ void axis_dominant_v3(int *axis_a, int *axis_b, const float axis[3]); MINLINE int max_axis_v3(const float vec[3]); MINLINE int min_axis_v3(const float vec[3]); +MINLINE int poly_to_tri_count(const int poly_count, const int corner_count); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c index ba9770e1bd1..9bb824be85e 100644 --- a/source/blender/blenlib/intern/math_geom_inline.c +++ b/source/blender/blenlib/intern/math_geom_inline.c @@ -158,4 +158,24 @@ MINLINE int min_axis_v3(const float vec[3]) ((y < z) ? 1 : 2)); } +/** + * Simple method to find how many tri's we need when we already know the corner+poly count. + * + * Formula is: + * + * tri = ((corner_count / poly_count) - 2) * poly_count; + * + * Use doubles since this is used for allocating and we + * don't want float precision to give incorrect results. + * + * \param poly_count The number of ngon's/tris (1-2 sided faces will give incorrect results) + * \param corner_count - also known as loops in BMesh/DNA + */ +MINLINE int poly_to_tri_count(const int poly_count, const int corner_count) +{ + const double poly_count_d = (double)poly_count; + const double corner_count_d = (double)corner_count; + return (int)((((corner_count_d / poly_count_d) - 2.0) * poly_count_d) + 0.5); +} + #endif /* __MATH_GEOM_INLINE_C__ */ diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c index 5e5e0c87feb..73a43ee35ed 100644 --- a/source/blender/editors/space_info/info_stats.c +++ b/source/blender/editors/space_info/info_stats.c @@ -39,6 +39,7 @@ #include "DNA_scene_types.h" #include "BLI_utildefines.h" +#include "BLI_math.h" #include "BKE_anim.h" #include "BKE_blender.h" @@ -62,7 +63,7 @@ typedef struct SceneStats { int totbone, totbonesel; int totobj, totobjsel; int totlamp, totlampsel; - int tottri, totmesh, totcurve; + int tottri, totmesh; char infostr[512]; } SceneStats; @@ -74,7 +75,7 @@ static void stats_object(Object *ob, int sel, int totob, SceneStats *stats) { /* we assume derivedmesh is already built, this strictly does stats now. */ DerivedMesh *dm = ob->derivedFinal; - int totvert, totedge, totface; + int totvert, totedge, totface, totloop; stats->totmesh += totob; @@ -82,10 +83,12 @@ static void stats_object(Object *ob, int sel, int totob, SceneStats *stats) totvert = dm->getNumVerts(dm); totedge = dm->getNumEdges(dm); totface = dm->getNumPolys(dm); + totloop = dm->getNumLoops(dm); stats->totvert += totvert * totob; stats->totedge += totedge * totob; stats->totface += totface * totob; + stats->tottri += poly_to_tri_count(totface, totloop) * totob; if (sel) { stats->totvertsel += totvert; @@ -103,40 +106,23 @@ static void stats_object(Object *ob, int sel, int totob, SceneStats *stats) case OB_SURF: case OB_CURVE: case OB_FONT: - { - int tot = 0, totf = 0; - - stats->totcurve += totob; - - if (ob->disp.first) - BKE_displist_count(&ob->disp, &tot, &totf); - - tot *= totob; - totf *= totob; - - stats->totvert += tot; - stats->totface += totf; - - if (sel) { - stats->totvertsel += tot; - stats->totfacesel += totf; - } - break; - } case OB_MBALL: { - int tot = 0, totf = 0; + int totv = 0, totf = 0, tottri = 0; - BKE_displist_count(&ob->disp, &tot, &totf); + if (ob->disp.first) + BKE_displist_count(&ob->disp, &totv, &totf, &tottri); - tot *= totob; - totf *= totob; + totv *= totob; + totf *= totob; + tottri *= totob; - stats->totvert += tot; + stats->totvert += totv; stats->totface += totf; + stats->tottri += tottri; if (sel) { - stats->totvertsel += tot; + stats->totvertsel += totv; stats->totfacesel += totf; } break; @@ -389,8 +375,8 @@ static void stats_string(Scene *scene) stats->totbonesel, stats->totbone, memstr); } else { - s += sprintf(s, "Verts:%d | Faces:%d | Objects:%d/%d | Lamps:%d/%d%s", - stats->totvert, stats->totface, stats->totobjsel, stats->totobj, stats->totlampsel, stats->totlamp, memstr); + s += sprintf(s, "Verts:%d | Faces:%d| Tris:%d | Objects:%d/%d | Lamps:%d/%d%s", + stats->totvert, stats->totface, stats->tottri, stats->totobjsel, stats->totobj, stats->totlampsel, stats->totlamp, memstr); } if (ob) |