331 lines
5.2 KiB
C
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);
|
|
}
|