windows-nt/Source/XPSP1/NT/multimedia/opengl/test/auxprogs/rgb/vtxtime.c
2020-09-26 16:20:57 +08:00

216 lines
3.8 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#define PI ((float)3.14159265358979323846)
#define WIDTH 512
#define HEIGHT 512
BOOL fSingle = FALSE;
BOOL fRotate = FALSE;
BOOL fColor = FALSE;
BOOL fNormal = FALSE;
BOOL fTexture = FALSE;
DWORD dwTotalMillis = 0;
int iTotalPoints = 0;
#define DEF_PRIM_POINTS 250
#define DEF_PRIMS 250
int iPrims = DEF_PRIMS;
int iPrimPoints = DEF_PRIM_POINTS;
int iPoints = DEF_PRIMS*DEF_PRIM_POINTS;
float fRotAngle = 0.0f;
#define MAX_COLOR (3*3)
float afColors[MAX_COLOR] =
{
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
};
float *pfCurColor;
void Init(void)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 1, .01, 15);
gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
glMatrixMode(GL_MODELVIEW);
}
void ResetTotals(void)
{
dwTotalMillis = 0;
iTotalPoints = 0;
}
void Redraw(void)
{
DWORD dwMillis;
char szMsg[80];
int iPt, iPrim;
float fX, fY, fDx, fDy;
dwMillis = GetTickCount();
glClear(GL_COLOR_BUFFER_BIT);
if (fRotate)
{
glLoadIdentity();
glRotatef(fRotAngle, 0.0f, 0.0f, 1.0f);
fRotAngle += 2.0f;
}
fDx = 2.0f/(iPrimPoints-1);
fDy = 2.0f/(iPrims-1);
fY = -1.0f;
pfCurColor = afColors;
for (iPrim = 0; iPrim < iPrims; iPrim++)
{
fX = -1.0f;
glBegin(GL_POINTS);
for (iPt = 0; iPt < iPrimPoints; iPt++)
{
if (fColor)
{
glColor3fv(pfCurColor);
pfCurColor += 3;
if (pfCurColor >= afColors+MAX_COLOR)
{
pfCurColor = afColors;
}
}
if (fNormal)
{
glNormal3f(0.0f, 0.0f, 1.0f);
}
if (fTexture)
{
glTexCoord2f(0.5f, 0.5f);
}
glVertex3f(fX, fY, 0.0f);
fX += fDx;
}
glEnd();
fY += fDy;
}
if (fSingle)
{
glFlush();
}
else
{
auxSwapBuffers();
}
dwMillis = GetTickCount()-dwMillis;
dwTotalMillis += dwMillis;
iTotalPoints += iPoints;
if (dwTotalMillis > 1000)
{
sprintf(szMsg, "%.3lf pts/sec",
(double)iTotalPoints*1000.0/dwTotalMillis);
SetWindowText(auxGetHWND(), szMsg);
ResetTotals();
}
}
void Reshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
}
void Keyc(void)
{
ResetTotals();
fColor = !fColor;
}
void Keyn(void)
{
ResetTotals();
fNormal = !fNormal;
}
void KeyP(void)
{
int iv1[1];
ResetTotals();
glGetIntegerv(GL_CLIP_VOLUME_CLIPPING_HINT_EXT, &iv1[0]);
if (iv1[0] == GL_FASTEST)
{
glHint(GL_CLIP_VOLUME_CLIPPING_HINT_EXT, GL_DONT_CARE);
}
else
{
glHint(GL_CLIP_VOLUME_CLIPPING_HINT_EXT, GL_FASTEST);
}
}
void Keyt(void)
{
ResetTotals();
fTexture = !fTexture;
}
void __cdecl main(int argc, char **argv)
{
GLenum eMode;
while (--argc > 0)
{
argv++;
if (!strcmp(*argv, "-sb"))
{
fSingle = TRUE;
}
else if (!strcmp(*argv, "-rotate"))
{
fRotate = TRUE;
}
}
auxInitPosition(10, 10, WIDTH, HEIGHT);
eMode = AUX_RGB;
if (!fSingle)
{
eMode |= AUX_DOUBLE;
}
auxInitDisplayMode(eMode);
auxInitWindow("Vertex API Timing");
auxReshapeFunc(Reshape);
auxIdleFunc(Redraw);
auxKeyFunc(AUX_c, Keyc);
auxKeyFunc(AUX_n, Keyn);
auxKeyFunc(AUX_P, KeyP);
auxKeyFunc(AUX_t, Keyt);
Init();
auxMainLoop(Redraw);
}