windows-nt/Source/XPSP1/NT/multimedia/opengl/test/demos/stonehen/roundwal.cxx
2020-09-26 16:20:57 +08:00

68 lines
1.1 KiB
C++

#include <windows.h>
#include <GL/glu.h>
#ifdef X11
#include <GL/glx.h>
#endif
#include <math.h>
#ifdef WIN32
#include "stonehen.h"
#endif
#include "Roundwal.h"
Roundwall::Roundwall()
{
height = 2;
radius = 20;
divisions = 20;
sint = cost = NULL;
}
void Roundwall::draw()
{
float texx = 0;
int i;
if (sint == NULL) compute_tables();
glBegin(GL_QUAD_STRIP);
for (i = 0; i <= divisions; i++, texx += 1.) {
glTexCoord2f(texx, 0);
glNormal3f(-cost[i], -sint[i], 0);
glVertex3f(radius * cost[i], radius * sint[i], 0);
glTexCoord2f(texx, 1);
glVertex3f(radius * cost[i], radius * sint[i], height);
}
glEnd();
}
void Roundwall::set_divisions(int d)
{
if (divisions != d) delete_tables();
divisions = d;
}
void Roundwall::delete_tables()
{
delete sint;
delete cost;
sint = cost = NULL;
}
void Roundwall::compute_tables()
{
int i;
float t, dt;
delete_tables();
cost = new float[divisions + 1];
sint = new float[divisions + 1];
dt = 2. * M_PI / divisions;
for (i = 0, t = 0.; i <= divisions; i++, t += dt) {
cost[i] = cos(t);
sint[i] = sin(t);
}
}