tenebrae2/gl_bumpstat.c
2004-01-01 22:42:24 +00:00

150 lines
No EOL
4.5 KiB
C

/*
Copyright (C) 2001-2002 Charles Hollemeersch
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
A passtrough bumpmap driver that collects statistics.
This uses the original bumpmap driver for the actual drawing
*/
#include "quakedef.h"
static bumpdriver_t original;
static qboolean gl_bumpstatistics;
static int ambientSurfaces;
static int bumpSurfaces;
static int ambientSurfaceTris;
static int bumpSurfaceTris;
static int ambientTriangles;
static int bumpTriangles;
static double averageTris;
static int numFrames = 0;
void STAT_drawSurfaceListBase(vertexdef_t *verts, msurface_t **surfs, int numSurfaces, shader_t *shader) {
int i;
original.drawSurfaceListBase(verts, surfs, numSurfaces, shader);
ambientSurfaces += numSurfaces;
for (i=0; i<numSurfaces; i++) {
ambientSurfaceTris += (surfs[i]->polys->numindecies/3);
}
}
void STAT_drawSurfaceListBump (vertexdef_t *verts, msurface_t **surfs, int numSurfaces, const transform_t *tr, const lightobject_t *lo) {
int i;
original.drawSurfaceListBump(verts, surfs, numSurfaces, tr, lo);
bumpSurfaces += numSurfaces;
for (i=0; i<numSurfaces; i++) {
bumpSurfaceTris += (surfs[i]->polys->numindecies/3);
}
}
void STAT_drawTriangleListBase (vertexdef_t *verts, int *indecies, int numIndecies, shader_t *shader, int lightmapIndex) {
original.drawTriangleListBase(verts, indecies, numIndecies, shader, lightmapIndex);
ambientTriangles += (numIndecies/3);
}
void STAT_drawTriangleListBump (const vertexdef_t *verts, int *indecies, int numIndecies, shader_t *shader, const transform_t *tr, const lightobject_t *lo) {
original.drawTriangleListBump(verts, indecies, numIndecies, shader, tr, lo);
bumpTriangles += (numIndecies/3);
}
void *STAT_getDriverMem (size_t size, drivermem_t hint) {
return original.getDriverMem(size, hint);
}
void STAT_freeAllDriverMem (void) {
original.freeAllDriverMem();
}
void STAT_freeDriver (void) {
original.freeDriver();
}
/**
This installs the statistics driver
*/
void BUMP_StartStat(void) {
original = gl_bumpdriver;
gl_bumpstatistics = true;
gl_bumpdriver.drawSurfaceListBase = STAT_drawSurfaceListBase;
gl_bumpdriver.drawSurfaceListBump = STAT_drawSurfaceListBump;
gl_bumpdriver.drawTriangleListBase = STAT_drawTriangleListBase;
gl_bumpdriver.drawTriangleListBump = STAT_drawTriangleListBump;
gl_bumpdriver.getDriverMem = STAT_getDriverMem;
gl_bumpdriver.freeAllDriverMem = STAT_freeAllDriverMem;
gl_bumpdriver.freeDriver = STAT_freeDriver;
}
/**
This uninstals the statistics driver and reinstalls the old driver
*/
void BUMP_StopStat(void) {
gl_bumpstatistics = false;
gl_bumpdriver = original;
}
/**
This prints the current statistics
*/
void BUMP_PrintStats(void) {
if (!gl_bumpstatistics) return;
/*
ambientSurfaces = 0;
bumpSurfaces = 0;
ambientSurfaceTris = 0;
bumpSurfaceTris = 0;
ambientTriangles = 0;
bumpTriangles = 0;
*/
Con_Printf("--- Stats ---\n");
Con_Printf("Surfaces\n");
Con_Printf(" Ambient: %i Bump %i Total %i\n",ambientSurfaces, bumpSurfaces, ambientSurfaces+bumpSurfaces);
Con_Printf("SurfaceTriangles\n");
Con_Printf(" Ambient: %i Bump %i Total %i\n",ambientSurfaceTris, bumpSurfaceTris, ambientSurfaceTris+bumpSurfaceTris);
Con_Printf("Triangles\n");
Con_Printf(" Ambient: %i Bump %i Total %i\n",ambientTriangles, bumpTriangles, ambientTriangles+bumpTriangles);
averageTris = (averageTris*numFrames + (ambientTriangles+bumpTriangles+ambientSurfaceTris+bumpSurfaceTris)) / (numFrames+1);
Con_Printf("Average\n");
Con_Printf(" Triangles: %i\n", (int)(averageTris));
numFrames++;
}
/**
This resets the internal counters, should be called every frame
*/
void BUMP_ResetStats(void) {
if (!gl_bumpstatistics) return;
ambientSurfaces = 0;
bumpSurfaces = 0;
ambientSurfaceTris = 0;
bumpSurfaceTris = 0;
ambientTriangles = 0;
bumpTriangles = 0;
}
void ToggleStatistics_f(void) {
if (gl_bumpstatistics) {
BUMP_StopStat();
} else {
BUMP_StartStat();
}
}