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

331 lines
5.2 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#define PI 3.14159265358979323846
#define WIDTH 800
#define HEIGHT 600
GLfloat xr = 0.0f;
GLfloat yr = 0.0f;
GLfloat intensity = 0.1f;
#define DRAW_TEAPOT 0x00000001
#define DRAW_TORUS 0x00000002
#define DRAW_SPHERE 0x00000004
#define DRAW_GRID 0x00000008
#define DRAW_CIRCLE 0x00000010
#define DRAW_SINE 0x00000020
DWORD dwDraw = 0xffffffff;
BOOL fSingle = FALSE;
BOOL fClipViewport = FALSE;
BOOL fSmooth = FALSE;
BOOL fPause = FALSE;
BOOL fLargeView = FALSE;
BOOL fLargeZ = FALSE;
BOOL fColor = TRUE;
int line_width = 1;
int steps = 20;
void Init(void)
{
double xyf, zf;
xyf = fLargeView ? 2.0 : 1.0;
zf = fLargeZ ? 2.0 : 1.0;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-xyf, xyf, -xyf, xyf, -zf, zf);
glMatrixMode(GL_MODELVIEW);
glShadeModel(fSmooth ? GL_SMOOTH : GL_FLAT);
glLineWidth((GLfloat)line_width);
}
void Redraw(void)
{
DWORD ms;
int i;
float x1, y1, dx1, dy1;
float x2, y2, dx2, dy2;
float col, dcol;
float ang, dang;
ms = GetTickCount();
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glRotatef(xr, 1.0f, 0.0f, 0.0f);
glRotatef(yr, 0.0f, 1.0f, 0.0f);
if (fColor)
{
glColor3f(intensity, 0.0f, 0.0f);
}
if (dwDraw & DRAW_SPHERE)
{
auxWireSphere(1.0);
}
if (dwDraw & DRAW_TORUS)
{
auxWireTorus(0.5, 1.0);
}
if (dwDraw & DRAW_TEAPOT)
{
auxWireTeapot(1.0);
}
if (dwDraw & DRAW_GRID)
{
x1 = -2.0f;
y1 = 0.0f;
dx1 = -x1/(steps-1);
dy1 = 2.0f/(steps-1);
x2 = -2.0f;
y2 = 0.0f;
dx2 = -x2/(steps-1);
dy2 = -2.0f/(steps-1);
col = 0.5f;
dcol = 0.5f/(steps-1);
glBegin(GL_LINES);
for (i = 0; i < steps; i++)
{
if (fColor)
{
glColor3f(col, 0.0f, 0.0f);
}
glVertex2f(x1, y1);
if (fColor)
{
glColor3f(0.0f, col, 0.0f);
}
glVertex2f(x1+2.0f, y1-2.0f);
if (fColor)
{
glColor3f(1.5f-col, 0.0f, 0.0f);
}
glVertex2f(x2, y2);
if (fColor)
{
glColor3f(0.0f, 1.5f-col, 0.0f);
}
glVertex2f(x2+2.0f, y2+2.0f);
x1 += dx1;
y1 += dy1;
x2 += dx2;
y2 += dy2;
col += dcol;
}
glEnd();
}
if (dwDraw & DRAW_CIRCLE)
{
if (fColor)
{
glColor3f(0.0f, intensity, 0.0f);
}
ang = 0.0f;
dang = (float)((PI*2.0)/steps);
glBegin(GL_LINE_LOOP);
for (i = 0; i < steps; i++)
{
x1 = (float)(cos(ang)*1.5);
y1 = (float)(sin(ang)*1.5);
glVertex2f(x1, y1);
ang += dang;
}
glEnd();
}
if (dwDraw & DRAW_SINE)
{
if (fColor)
{
glColor3f(0.0f, 0.0f, intensity);
}
ang = 0.0f;
dang = (float)((PI*2.0)/(steps-1));
x1 = -1.5f;
dx1 = 3.0f/(steps-1);
glBegin(GL_LINE_STRIP);
for (i = 0; i < steps; i++)
{
y1 = (float)(sin(ang)*1.5);
glVertex2f(x1, y1);
ang += dang;
x1 += dx1;
}
glEnd();
}
glFinish();
ms = GetTickCount()-ms;
printf("%d ms\n", ms);
if (!fSingle)
{
auxSwapBuffers();
}
}
void Reshape(GLsizei w, GLsizei h)
{
if (!fClipViewport)
{
glViewport(0, 0, w, h);
}
else
{
glViewport(WIDTH, 0, w, h);
}
}
void Step(void)
{
xr += 2.0f;
yr += 2.0f;
intensity += 0.1f;
if (intensity > 1.0f)
{
intensity = 0.1f;
}
Redraw();
}
void KeySpace(void)
{
Step();
}
char *draw_names[] =
{
"teapot",
"torus",
"sphere",
"grid",
"circle",
"sine"
};
#define DRAW_COUNT (sizeof(draw_names)/sizeof(draw_names[0]))
DWORD DrawBit(char *name)
{
int i;
DWORD bit;
bit = 1;
for (i = 0; i < DRAW_COUNT; i++)
{
if (!strcmp(name, draw_names[i]))
{
return bit;
}
bit <<= 1;
}
if (strlen(name) == 0)
{
return 0xffffffff;
}
else
{
printf("No draw option '%s'\n", name);
return 0;
}
}
void __cdecl main(int argc, char **argv)
{
int mode;
while (--argc > 0)
{
argv++;
if (!strcmp(*argv, "-sb"))
{
fSingle = TRUE;
}
else if (!strcmp(*argv, "-clip"))
{
fClipViewport = TRUE;
}
else if (!strncmp(*argv, "-lw", 3))
{
sscanf(*argv+3, "%d", &line_width);
}
else if (!strcmp(*argv, "-smooth"))
{
fSmooth = TRUE;
}
else if (!strcmp(*argv, "-pause"))
{
fPause = TRUE;
}
else if (!strncmp(*argv, "-draw", 5))
{
dwDraw &= ~DrawBit(*argv+5);
}
else if (!strncmp(*argv, "+draw", 5))
{
dwDraw |= DrawBit(*argv+5);
}
else if (!strcmp(*argv, "-nocolor"))
{
fColor = FALSE;
}
else if (!strcmp(*argv, "-largeview"))
{
fLargeView = TRUE;
}
else if (!strcmp(*argv, "-largez"))
{
fLargeZ = TRUE;
}
}
auxInitPosition(10, 10, WIDTH, HEIGHT);
mode = AUX_RGB | AUX_DEPTH16;
if (!fSingle)
{
mode |= AUX_DOUBLE;
}
auxInitDisplayMode(mode);
auxInitWindow("Wireframe Performance Test");
auxReshapeFunc(Reshape);
if (!fPause)
{
auxIdleFunc(Step);
}
auxKeyFunc(AUX_SPACE, KeySpace);
Init();
auxMainLoop(Redraw);
}