690 lines
22 KiB
C
690 lines
22 KiB
C
|
/*
|
||
|
* surfgrid.c - simple test of polygon offset
|
||
|
*
|
||
|
* $Revision: 1.3 $
|
||
|
*
|
||
|
* usage:
|
||
|
* surfgrid [-f]
|
||
|
*
|
||
|
* options:
|
||
|
* -f run on full screen
|
||
|
*
|
||
|
* keys:
|
||
|
* p toggle polygon offset
|
||
|
* m toggle multisampling
|
||
|
* S increase polygon offset factor
|
||
|
* s decrease polygon offset factor
|
||
|
* B increase polygon offset bias
|
||
|
* b decrease polygon offset bias
|
||
|
* g toggle grid drawing
|
||
|
* t toggle surface drawing
|
||
|
* f toggle smooth/flat shading
|
||
|
* n toggle whether to use GL evaluators or GLU nurbs
|
||
|
* u decr number of segments in U direction
|
||
|
* U incr number of segments in U direction
|
||
|
* v decr number of segments in V direction
|
||
|
* V incr number of segments in V direction
|
||
|
* escape quit
|
||
|
*/
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <gl\gl.h>
|
||
|
#include <glaux.h>
|
||
|
|
||
|
#define W 600
|
||
|
#define H 600
|
||
|
|
||
|
static GLfloat controlpts[] =
|
||
|
{
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
3.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
3.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f, 4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
2.0f,-2.0f, 0.0f, 2.0f, 1.0f,-1.0f, 0.5f, 1.0f, 1.5f,-1.5f, 0.5f, 1.0f,
|
||
|
1.5f,-1.5f, 0.5f, 1.0f, 2.0f,-2.0f, 0.5f, 1.0f, 4.0f,-4.0f, 0.0f, 2.0f,
|
||
|
4.0f,-4.0f, 0.0f, 2.0f, 2.0f,-2.0f,-0.5f, 1.0f, 1.5f,-1.5f,-0.5f, 1.0f,
|
||
|
1.5f,-1.5f,-0.5f, 1.0f, 1.0f,-1.0f,-0.5f, 1.0f, 2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
0.0f,-2.0f, 0.0f, 2.0f, 0.0f,-1.0f, 0.5f, 1.0f, 0.0f,-1.5f, 0.5f, 1.0f,
|
||
|
0.0f,-1.5f, 0.5f, 1.0f, 0.0f,-2.0f, 0.5f, 1.0f, 0.0f,-4.0f, 0.0f, 2.0f,
|
||
|
0.0f,-4.0f, 0.0f, 2.0f, 0.0f,-2.0f,-0.5f, 1.0f, 0.0f,-1.5f,-0.5f, 1.0f,
|
||
|
0.0f,-1.5f,-0.5f, 1.0f, 0.0f,-1.0f,-0.5f, 1.0f, 0.0f,-2.0f, 0.0f, 2.0f,
|
||
|
0.0f,-2.0f, 0.0f, 2.0f, 0.0f,-1.0f, 0.5f, 1.0f, 0.0f,-1.5f, 0.5f, 1.0f,
|
||
|
0.0f,-1.5f, 0.5f, 1.0f, 0.0f,-2.0f, 0.5f, 1.0f, 0.0f,-4.0f, 0.0f, 2.0f,
|
||
|
0.0f,-4.0f, 0.0f, 2.0f, 0.0f,-2.0f,-0.5f, 1.0f, 0.0f,-1.5f,-0.5f, 1.0f,
|
||
|
0.0f,-1.5f,-0.5f, 1.0f, 0.0f,-1.0f,-0.5f, 1.0f, 0.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-2.0f,-2.0f, 0.0f, 2.0f,-1.0f,-1.0f, 0.5f, 1.0f,-1.5f,-1.5f, 0.5f, 1.0f,
|
||
|
-1.5f,-1.5f, 0.5f, 1.0f,-2.0f,-2.0f, 0.5f, 1.0f,-4.0f,-4.0f, 0.0f, 2.0f,
|
||
|
-4.0f,-4.0f, 0.0f, 2.0f,-2.0f,-2.0f,-0.5f, 1.0f,-1.5f,-1.5f,-0.5f, 1.0f,
|
||
|
-1.5f,-1.5f,-0.5f, 1.0f,-1.0f,-1.0f,-0.5f, 1.0f,-2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 0.0f, 1.0f, 2.0f,-3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
-3.0f, 0.0f, 1.0f, 2.0f,-4.0f, 0.0f, 1.0f, 2.0f,-8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-8.0f, 0.0f, 0.0f, 4.0f,-4.0f, 0.0f,-1.0f, 2.0f,-3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
-3.0f, 0.0f,-1.0f, 2.0f,-2.0f, 0.0f,-1.0f, 2.0f,-4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 0.0f, 1.0f, 2.0f,-3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
-3.0f, 0.0f, 1.0f, 2.0f,-4.0f, 0.0f, 1.0f, 2.0f,-8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-8.0f, 0.0f, 0.0f, 4.0f,-4.0f, 0.0f,-1.0f, 2.0f,-3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
-3.0f, 0.0f,-1.0f, 2.0f,-2.0f, 0.0f,-1.0f, 2.0f,-4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-2.0f, 2.0f, 0.0f, 2.0f,-1.0f, 1.0f, 0.5f, 1.0f,-1.5f, 1.5f, 0.5f, 1.0f,
|
||
|
-1.5f, 1.5f, 0.5f, 1.0f,-2.0f, 2.0f, 0.5f, 1.0f,-4.0f, 4.0f, 0.0f, 2.0f,
|
||
|
-4.0f, 4.0f, 0.0f, 2.0f,-2.0f, 2.0f,-0.5f, 1.0f,-1.5f, 1.5f,-0.5f, 1.0f,
|
||
|
-1.5f, 1.5f,-0.5f, 1.0f,-1.0f, 1.0f,-0.5f, 1.0f,-2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
0.0f, 2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 1.5f, 0.5f, 1.0f,
|
||
|
0.0f, 1.5f, 0.5f, 1.0f, 0.0f, 2.0f, 0.5f, 1.0f, 0.0f, 4.0f, 0.0f, 2.0f,
|
||
|
0.0f, 4.0f, 0.0f, 2.0f, 0.0f, 2.0f,-0.5f, 1.0f, 0.0f, 1.5f,-0.5f, 1.0f,
|
||
|
0.0f, 1.5f,-0.5f, 1.0f, 0.0f, 1.0f,-0.5f, 1.0f, 0.0f, 2.0f, 0.0f, 2.0f,
|
||
|
0.0f, 2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 1.5f, 0.5f, 1.0f,
|
||
|
0.0f, 1.5f, 0.5f, 1.0f, 0.0f, 2.0f, 0.5f, 1.0f, 0.0f, 4.0f, 0.0f, 2.0f,
|
||
|
0.0f, 4.0f, 0.0f, 2.0f, 0.0f, 2.0f,-0.5f, 1.0f, 0.0f, 1.5f,-0.5f, 1.0f,
|
||
|
0.0f, 1.5f,-0.5f, 1.0f, 0.0f, 1.0f,-0.5f, 1.0f, 0.0f, 2.0f, 0.0f, 2.0f,
|
||
|
2.0f, 2.0f, 0.0f, 2.0f, 1.0f, 1.0f, 0.5f, 1.0f, 1.5f, 1.5f, 0.5f, 1.0f,
|
||
|
1.5f, 1.5f, 0.5f, 1.0f, 2.0f, 2.0f, 0.5f, 1.0f, 4.0f, 4.0f, 0.0f, 2.0f,
|
||
|
4.0f, 4.0f, 0.0f, 2.0f, 2.0f, 2.0f,-0.5f, 1.0f, 1.5f, 1.5f,-0.5f, 1.0f,
|
||
|
1.5f, 1.5f,-0.5f, 1.0f, 1.0f, 1.0f,-0.5f, 1.0f, 2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
3.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
3.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f, 4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
};
|
||
|
|
||
|
static GLfloat nurbctlpts[] = {
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f,-2.0f, 0.0f, 2.0f, 1.0f,-1.0f, 0.5f, 1.0f,
|
||
|
2.0f,-2.0f, 0.5f, 1.0f, 4.0f,-4.0f, 0.0f, 2.0f, 2.0f,-2.0f,-0.5f, 1.0f,
|
||
|
1.0f,-1.0f,-0.5f, 1.0f, 2.0f,-2.0f, 0.0f, 2.0f,-2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-1.0f,-1.0f, 0.5f, 1.0f,-2.0f,-2.0f, 0.5f, 1.0f,-4.0f,-4.0f, 0.0f, 2.0f,
|
||
|
-2.0f,-2.0f,-0.5f, 1.0f,-1.0f,-1.0f,-0.5f, 1.0f,-2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 0.0f, 1.0f, 2.0f,-4.0f, 0.0f, 1.0f, 2.0f,
|
||
|
-8.0f, 0.0f, 0.0f, 4.0f,-4.0f, 0.0f,-1.0f, 2.0f,-2.0f, 0.0f,-1.0f, 2.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 2.0f, 0.0f, 2.0f,-1.0f, 1.0f, 0.5f, 1.0f,
|
||
|
-2.0f, 2.0f, 0.5f, 1.0f,-4.0f, 4.0f, 0.0f, 2.0f,-2.0f, 2.0f,-0.5f, 1.0f,
|
||
|
-1.0f, 1.0f,-0.5f, 1.0f,-2.0f, 2.0f, 0.0f, 2.0f, 2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
1.0f, 1.0f, 0.5f, 1.0f, 2.0f, 2.0f, 0.5f, 1.0f, 4.0f, 4.0f, 0.0f, 2.0f,
|
||
|
2.0f, 2.0f,-0.5f, 1.0f, 1.0f, 1.0f,-0.5f, 1.0f, 2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* Misc vector op routines.
|
||
|
*/
|
||
|
|
||
|
float x_axis[] = { 1.0f, 0.0f, 0.0f };
|
||
|
float y_axis[] = { 0.0f, 1.0f, 0.0f };
|
||
|
float z_axis[] = { 0.0f, 0.0f, 1.0f };
|
||
|
float nx_axis[] = { -1.0f, 0.0f, 0.0f };
|
||
|
float ny_axis[] = { 0.0f, -1.0f, 0.0f };
|
||
|
float nz_axis[] = { 0.0f, 0.0f, -1.0f };
|
||
|
|
||
|
void norm(float v[3])
|
||
|
{
|
||
|
float r;
|
||
|
|
||
|
r = (float)sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] );
|
||
|
|
||
|
v[0] /= r;
|
||
|
v[1] /= r;
|
||
|
v[2] /= r;
|
||
|
}
|
||
|
|
||
|
float dot(float a[3], float b[3])
|
||
|
{
|
||
|
return (a[0]*b[0] + a[1]*b[1] + a[2]*b[2]);
|
||
|
}
|
||
|
|
||
|
void cross(float v1[3], float v2[3], float result[3])
|
||
|
{
|
||
|
result[0] = v1[1]*v2[2] - v1[2]*v2[1];
|
||
|
result[1] = v1[2]*v2[0] - v1[0]*v2[2];
|
||
|
result[2] = v1[0]*v2[1] - v1[1]*v2[0];
|
||
|
}
|
||
|
|
||
|
float length(float v[3])
|
||
|
{
|
||
|
float r = (float)sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] );
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
static long winwidth = W, winheight = H;
|
||
|
GLUnurbsObj *nobj;
|
||
|
GLuint surflist, gridlist;
|
||
|
|
||
|
int useglunurbs = 0;
|
||
|
int smooth = 1;
|
||
|
int tracking = 0;
|
||
|
int showgrid = 1;
|
||
|
int showsurf = 1;
|
||
|
int fullscreen = 0;
|
||
|
int multisampling = 0;
|
||
|
float modelmatrix[16];
|
||
|
float scale = 0.5f;
|
||
|
float bias = 0.002f;
|
||
|
int usegments = 4;
|
||
|
int vsegments = 4;
|
||
|
|
||
|
int spindx, spindy;
|
||
|
int startx, starty;
|
||
|
int curx, cury;
|
||
|
|
||
|
void redraw(void);
|
||
|
void createlists(void);
|
||
|
|
||
|
float torusnurbpts[];
|
||
|
float torusbezierpts[];
|
||
|
|
||
|
void key_n(void)
|
||
|
{
|
||
|
useglunurbs = !useglunurbs;
|
||
|
}
|
||
|
|
||
|
void key_p(void)
|
||
|
{
|
||
|
#ifdef GL_POLYGON_OFFSET_EXT
|
||
|
if (glIsEnabled( GL_POLYGON_OFFSET_EXT ))
|
||
|
{
|
||
|
glDisable( GL_POLYGON_OFFSET_EXT );
|
||
|
printf("disabling polygon offset\n");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
glEnable( GL_POLYGON_OFFSET_EXT );
|
||
|
printf("enabling polygon offset\n");
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void key_m(void)
|
||
|
{
|
||
|
#ifdef GL_MULTISAMPLE_SGIS
|
||
|
if (multisampling)
|
||
|
{
|
||
|
if (glIsEnabled( GL_MULTISAMPLE_SGIS ))
|
||
|
{
|
||
|
glDisable( GL_MULTISAMPLE_SGIS );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
glEnable( GL_MULTISAMPLE_SGIS );
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void key_g(void)
|
||
|
{
|
||
|
showgrid = !showgrid;
|
||
|
}
|
||
|
|
||
|
void key_t(void)
|
||
|
{
|
||
|
showsurf = !showsurf;
|
||
|
}
|
||
|
|
||
|
void key_f(void)
|
||
|
{
|
||
|
smooth = !smooth;
|
||
|
if (smooth)
|
||
|
{
|
||
|
glShadeModel( GL_SMOOTH );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
glShadeModel( GL_FLAT );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void key_S(void)
|
||
|
{
|
||
|
scale += 0.1f;
|
||
|
printf( "scale: %8.4f\n", scale);
|
||
|
}
|
||
|
|
||
|
void key_s(void)
|
||
|
{
|
||
|
scale -= 0.1f;
|
||
|
printf( "scale: %8.4f\n", scale);
|
||
|
}
|
||
|
|
||
|
void key_B(void)
|
||
|
{
|
||
|
bias += 0.0001f;
|
||
|
printf( "bias: %8.4f\n", bias);
|
||
|
}
|
||
|
|
||
|
void key_b(void)
|
||
|
{
|
||
|
bias -= 0.0001f;
|
||
|
printf( "bias: %8.4f\n", bias);
|
||
|
}
|
||
|
|
||
|
void key_u(void)
|
||
|
{
|
||
|
usegments = (usegments < 2 ? 1 : usegments-1);
|
||
|
createlists();
|
||
|
}
|
||
|
|
||
|
void key_U(void)
|
||
|
{
|
||
|
usegments++;
|
||
|
createlists();
|
||
|
}
|
||
|
|
||
|
void key_v(void)
|
||
|
{
|
||
|
vsegments = (vsegments < 2 ? 1 : vsegments-1);
|
||
|
createlists();
|
||
|
}
|
||
|
|
||
|
void key_V(void)
|
||
|
{
|
||
|
vsegments++;
|
||
|
createlists();
|
||
|
}
|
||
|
|
||
|
void reshape_proc(GLsizei w, GLsizei h)
|
||
|
{
|
||
|
int size;
|
||
|
|
||
|
winwidth = w;
|
||
|
winheight = h;
|
||
|
size = (winwidth < winheight ? winwidth : winheight);
|
||
|
glViewport((winwidth-size)/2, (winheight-size)/2, size, size);
|
||
|
}
|
||
|
|
||
|
void mouse_ldown(AUX_EVENTREC *mouse)
|
||
|
{
|
||
|
curx = startx = mouse->data[AUX_MOUSEX];
|
||
|
cury = starty = mouse->data[AUX_MOUSEY];
|
||
|
spindx = 0;
|
||
|
spindy = 0;
|
||
|
tracking = 1;
|
||
|
}
|
||
|
|
||
|
void mouse_lup(AUX_EVENTREC *mouse)
|
||
|
{
|
||
|
/*
|
||
|
* If user released the button while moving the mouse, keep
|
||
|
* spinning.
|
||
|
*/
|
||
|
if (mouse->data[AUX_MOUSEX] != curx || mouse->data[AUX_MOUSEY] != cury)
|
||
|
{
|
||
|
spindx = mouse->data[AUX_MOUSEX] - curx;
|
||
|
spindy = mouse->data[AUX_MOUSEY] - cury;
|
||
|
}
|
||
|
tracking = 0;
|
||
|
}
|
||
|
|
||
|
void mouse_lloc(AUX_EVENTREC *mouse)
|
||
|
{
|
||
|
if (!tracking)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
curx = mouse->data[AUX_MOUSEX];
|
||
|
cury = mouse->data[AUX_MOUSEY];
|
||
|
if (curx != startx || cury != starty)
|
||
|
{
|
||
|
redraw();
|
||
|
startx = curx;
|
||
|
starty = cury;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void idle_proc(void)
|
||
|
{
|
||
|
if (!tracking && (spindx != 0 || spindy != 0))
|
||
|
{
|
||
|
redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void gridmaterials(void)
|
||
|
{
|
||
|
static float front_mat_diffuse[] = { 1.0f, 1.0f, 0.4f, 1.0f };
|
||
|
static float front_mat_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
||
|
static float back_mat_diffuse[] = { 1.0f, 0.0f, 0.0f, 1.0f };
|
||
|
static float back_mat_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
||
|
|
||
|
glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
|
||
|
glMaterialfv(GL_FRONT, GL_AMBIENT, front_mat_ambient);
|
||
|
glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
|
||
|
glMaterialfv(GL_BACK, GL_AMBIENT, back_mat_ambient);
|
||
|
}
|
||
|
|
||
|
void surfacematerials(void)
|
||
|
{
|
||
|
static float front_mat_diffuse[] = { 0.2f, 0.7f, 0.4f, 1.0f };
|
||
|
static float front_mat_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
||
|
static float back_mat_diffuse[] = { 1.0f, 1.0f, 0.2f, 1.0f };
|
||
|
static float back_mat_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
||
|
|
||
|
glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
|
||
|
glMaterialfv(GL_FRONT, GL_AMBIENT, front_mat_ambient);
|
||
|
glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
|
||
|
glMaterialfv(GL_BACK, GL_AMBIENT, back_mat_ambient);
|
||
|
}
|
||
|
|
||
|
void init(void)
|
||
|
{
|
||
|
static float ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||
|
static float diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||
|
static float position[] = { 90.0f, 90.0f, -150.0f, 0.0f };
|
||
|
static float lmodel_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||
|
static float lmodel_twoside[] = { (float)GL_TRUE };
|
||
|
|
||
|
glMatrixMode(GL_PROJECTION);
|
||
|
glLoadIdentity();
|
||
|
gluPerspective( 40.0, 1.0, 2.0, 200.0 );
|
||
|
glMatrixMode(GL_MODELVIEW);
|
||
|
glLoadIdentity();
|
||
|
glGetFloatv(GL_MODELVIEW_MATRIX, modelmatrix);
|
||
|
|
||
|
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
|
||
|
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
|
||
|
glLightfv(GL_LIGHT0, GL_POSITION, position);
|
||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
|
||
|
|
||
|
glEnable(GL_LIGHTING);
|
||
|
glEnable(GL_LIGHT0);
|
||
|
glEnable(GL_DEPTH_TEST);
|
||
|
glEnable(GL_AUTO_NORMAL);
|
||
|
#ifdef GL_POLYGON_OFFSET_EXT
|
||
|
glEnable(GL_POLYGON_OFFSET_EXT);
|
||
|
#endif
|
||
|
glFrontFace(GL_CCW);
|
||
|
|
||
|
glEnable( GL_MAP2_VERTEX_4 );
|
||
|
glClearColor(0.25f, 0.25f, 0.5f, 0.0f);
|
||
|
|
||
|
#ifdef GL_POLYGON_OFFSET_EXT
|
||
|
glPolygonOffsetEXT( scale, bias );
|
||
|
#endif
|
||
|
|
||
|
nobj = gluNewNurbsRenderer();
|
||
|
gluNurbsProperty(nobj, GLU_SAMPLING_METHOD, (float)GLU_DOMAIN_DISTANCE );
|
||
|
|
||
|
surflist = glGenLists(1);
|
||
|
gridlist = glGenLists(1);
|
||
|
createlists();
|
||
|
}
|
||
|
|
||
|
void drawmesh(void)
|
||
|
{
|
||
|
int i, j;
|
||
|
float *p;
|
||
|
|
||
|
int up2p = 4;
|
||
|
int uorder = 3, vorder = 3;
|
||
|
int nu = 4, nv = 4;
|
||
|
int vp2p = up2p * uorder * nu;
|
||
|
|
||
|
for (j=0; j < nv; j++) {
|
||
|
for (i=0; i < nu; i++) {
|
||
|
p = torusbezierpts + (j * vp2p * vorder) + (i * up2p * uorder);
|
||
|
#ifdef GL_POLYGON_OFFSET_EXT
|
||
|
glPolygonOffsetEXT( scale, bias );
|
||
|
#endif
|
||
|
glMap2f( GL_MAP2_VERTEX_4, 0.0f, 1.0f, up2p, 3, 0.0f, 1.0f, vp2p, 3,
|
||
|
(void*)p );
|
||
|
if (showsurf) {
|
||
|
surfacematerials();
|
||
|
glEvalMesh2( GL_FILL, 0, usegments, 0, vsegments );
|
||
|
}
|
||
|
if (showgrid) {
|
||
|
gridmaterials();
|
||
|
glEvalMesh2( GL_LINE, 0, usegments, 0, vsegments );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void redraw(void)
|
||
|
{
|
||
|
static int i=0;
|
||
|
int dx, dy;
|
||
|
float v[3], rot[3];
|
||
|
float len, ang;
|
||
|
static GLuint vcount;
|
||
|
|
||
|
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
||
|
glColor3f( 1.0f, 0.0f, 0.0f);
|
||
|
|
||
|
if (tracking) {
|
||
|
dx = curx - startx;
|
||
|
dy = cury - starty;
|
||
|
} else {
|
||
|
dx = spindx;
|
||
|
dy = spindy;
|
||
|
}
|
||
|
if (dx || dy) {
|
||
|
dy = -dy;
|
||
|
v[0] = (float)dx;
|
||
|
v[1] = (float)dy;
|
||
|
v[2] = 0.0f;
|
||
|
|
||
|
len = length(v);
|
||
|
ang = -len / 600 * 360;
|
||
|
norm( v );
|
||
|
cross( v, z_axis, rot );
|
||
|
|
||
|
/*
|
||
|
** This is certainly not recommended for programs that care
|
||
|
** about performance or numerical stability: we concatenate
|
||
|
** the rotation onto the current modelview matrix and read the
|
||
|
** matrix back, thus saving ourselves from writing our own
|
||
|
** matrix manipulation routines.
|
||
|
*/
|
||
|
glLoadIdentity();
|
||
|
glRotatef(ang, rot[0], rot[1], rot[2]);
|
||
|
glMultMatrixf(modelmatrix);
|
||
|
glGetFloatv(GL_MODELVIEW_MATRIX, modelmatrix);
|
||
|
}
|
||
|
glLoadIdentity();
|
||
|
glTranslatef( 0.0f, 0.0f, -10.0f );
|
||
|
glMultMatrixf(modelmatrix);
|
||
|
|
||
|
if (useglunurbs) {
|
||
|
if (showsurf) glCallList(surflist);
|
||
|
if (showgrid) glCallList(gridlist);
|
||
|
} else {
|
||
|
glMapGrid2f( usegments, 0.0f, 1.0f, vsegments, 0.0f, 1.0f );
|
||
|
drawmesh();
|
||
|
}
|
||
|
|
||
|
auxSwapBuffers();
|
||
|
}
|
||
|
|
||
|
static void usage(void)
|
||
|
{
|
||
|
printf("usage: surfgrid [-f]\n");
|
||
|
exit(-1);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* pass the name of the desired extension.
|
||
|
* this will return 1 if the extension is supported, 0 otherwise.
|
||
|
*/
|
||
|
int
|
||
|
getextension(char *e)
|
||
|
{
|
||
|
const GLubyte *s;
|
||
|
|
||
|
s = glGetString(GL_EXTENSIONS);
|
||
|
if (!s)
|
||
|
return 0;
|
||
|
if (*s == '\0')
|
||
|
return 0;
|
||
|
return (strstr(s,e) == 0) ? 0 : 1;
|
||
|
}
|
||
|
|
||
|
int __cdecl main(int argc, char **argv)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for (i=1; i<argc; i++) {
|
||
|
if (argv[i][0] == '-') {
|
||
|
switch (argv[i][1]) {
|
||
|
case 'f':
|
||
|
fullscreen = 1;
|
||
|
break;
|
||
|
default:
|
||
|
usage();
|
||
|
break;
|
||
|
}
|
||
|
} else {
|
||
|
usage();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef GL_POLYGON_OFFSET_EXT
|
||
|
if (!getextension("GL_EXT_polygon_offset"))
|
||
|
{
|
||
|
printf("Warning: GL_EXT_polygon_offset not supported on this "
|
||
|
"machine.. trying anyway\n");
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
auxInitPosition(50, 50, winwidth, winheight);
|
||
|
auxInitDisplayMode(AUX_RGB | AUX_DOUBLE | AUX_DEPTH16);
|
||
|
auxInitWindow("SurfGrid");
|
||
|
|
||
|
auxReshapeFunc(reshape_proc);
|
||
|
auxIdleFunc(idle_proc);
|
||
|
auxKeyFunc(AUX_n, key_n);
|
||
|
auxKeyFunc(AUX_p, key_p);
|
||
|
auxKeyFunc(AUX_m, key_m);
|
||
|
auxKeyFunc(AUX_g, key_g);
|
||
|
auxKeyFunc(AUX_t, key_t);
|
||
|
auxKeyFunc(AUX_f, key_f);
|
||
|
auxKeyFunc(AUX_S, key_S);
|
||
|
auxKeyFunc(AUX_s, key_s);
|
||
|
auxKeyFunc(AUX_B, key_B);
|
||
|
auxKeyFunc(AUX_b, key_b);
|
||
|
auxKeyFunc(AUX_u, key_u);
|
||
|
auxKeyFunc(AUX_U, key_U);
|
||
|
auxKeyFunc(AUX_v, key_v);
|
||
|
auxKeyFunc(AUX_V, key_V);
|
||
|
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEDOWN, mouse_ldown);
|
||
|
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEUP, mouse_lup);
|
||
|
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, mouse_lloc);
|
||
|
|
||
|
init();
|
||
|
|
||
|
auxMainLoop(redraw);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
float circleknots[] = { 0.0f, 0.0f, 0.0f, 0.25f, 0.50f, 0.50f, 0.75f, 1.0f,
|
||
|
1.0f, 1.0f };
|
||
|
|
||
|
void createlists(void)
|
||
|
{
|
||
|
gluNurbsProperty(nobj, GLU_U_STEP, (usegments-1)*4.0f );
|
||
|
gluNurbsProperty(nobj, GLU_V_STEP, (vsegments-1)*4.0f );
|
||
|
|
||
|
gluNurbsProperty(nobj, GLU_DISPLAY_MODE, (float)GLU_FILL);
|
||
|
glNewList(surflist, GL_COMPILE);
|
||
|
surfacematerials();
|
||
|
gluBeginSurface(nobj);
|
||
|
gluNurbsSurface(nobj, 10, circleknots, 10, circleknots,
|
||
|
4, 28, torusnurbpts, 3, 3, GL_MAP2_VERTEX_4);
|
||
|
gluEndSurface(nobj);
|
||
|
glEndList();
|
||
|
|
||
|
gluNurbsProperty(nobj, GLU_DISPLAY_MODE, (float)GLU_OUTLINE_POLYGON);
|
||
|
glNewList(gridlist, GL_COMPILE);
|
||
|
gridmaterials();
|
||
|
gluBeginSurface(nobj);
|
||
|
gluNurbsSurface(nobj, 10, circleknots, 10, circleknots,
|
||
|
4, 28, torusnurbpts, 3, 3, GL_MAP2_VERTEX_4);
|
||
|
gluEndSurface(nobj);
|
||
|
glEndList();
|
||
|
}
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
/*
|
||
|
* Control points of the torus in Bezier form. Can be rendered
|
||
|
* using OpenGL evaluators.
|
||
|
*/
|
||
|
static GLfloat torusbezierpts[] = {
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
3.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
3.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f, 4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
2.0f,-2.0f, 0.0f, 2.0f, 1.0f,-1.0f, 0.5f, 1.0f, 1.5f,-1.5f, 0.5f, 1.0f,
|
||
|
1.5f,-1.5f, 0.5f, 1.0f, 2.0f,-2.0f, 0.5f, 1.0f, 4.0f,-4.0f, 0.0f, 2.0f,
|
||
|
4.0f,-4.0f, 0.0f, 2.0f, 2.0f,-2.0f,-0.5f, 1.0f, 1.5f,-1.5f,-0.5f, 1.0f,
|
||
|
1.5f,-1.5f,-0.5f, 1.0f, 1.0f,-1.0f,-0.5f, 1.0f, 2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
0.0f,-2.0f, 0.0f, 2.0f, 0.0f,-1.0f, 0.5f, 1.0f, 0.0f,-1.5f, 0.5f, 1.0f,
|
||
|
0.0f,-1.5f, 0.5f, 1.0f, 0.0f,-2.0f, 0.5f, 1.0f, 0.0f,-4.0f, 0.0f, 2.0f,
|
||
|
0.0f,-4.0f, 0.0f, 2.0f, 0.0f,-2.0f,-0.5f, 1.0f, 0.0f,-1.5f,-0.5f, 1.0f,
|
||
|
0.0f,-1.5f,-0.5f, 1.0f, 0.0f,-1.0f,-0.5f, 1.0f, 0.0f,-2.0f, 0.0f, 2.0f,
|
||
|
0.0f,-2.0f, 0.0f, 2.0f, 0.0f,-1.0f, 0.5f, 1.0f, 0.0f,-1.5f, 0.5f, 1.0f,
|
||
|
0.0f,-1.5f, 0.5f, 1.0f, 0.0f,-2.0f, 0.5f, 1.0f, 0.0f,-4.0f, 0.0f, 2.0f,
|
||
|
0.0f,-4.0f, 0.0f, 2.0f, 0.0f,-2.0f,-0.5f, 1.0f, 0.0f,-1.5f,-0.5f, 1.0f,
|
||
|
0.0f,-1.5f,-0.5f, 1.0f, 0.0f,-1.0f,-0.5f, 1.0f, 0.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-2.0f,-2.0f, 0.0f, 2.0f,-1.0f,-1.0f, 0.5f, 1.0f,-1.5f,-1.5f, 0.5f, 1.0f,
|
||
|
-1.5f,-1.5f, 0.5f, 1.0f,-2.0f,-2.0f, 0.5f, 1.0f,-4.0f,-4.0f, 0.0f, 2.0f,
|
||
|
-4.0f,-4.0f, 0.0f, 2.0f,-2.0f,-2.0f,-0.5f, 1.0f,-1.5f,-1.5f,-0.5f, 1.0f,
|
||
|
-1.5f,-1.5f,-0.5f, 1.0f,-1.0f,-1.0f,-0.5f, 1.0f,-2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 0.0f, 1.0f, 2.0f,-3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
-3.0f, 0.0f, 1.0f, 2.0f,-4.0f, 0.0f, 1.0f, 2.0f,-8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-8.0f, 0.0f, 0.0f, 4.0f,-4.0f, 0.0f,-1.0f, 2.0f,-3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
-3.0f, 0.0f,-1.0f, 2.0f,-2.0f, 0.0f,-1.0f, 2.0f,-4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 0.0f, 1.0f, 2.0f,-3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
-3.0f, 0.0f, 1.0f, 2.0f,-4.0f, 0.0f, 1.0f, 2.0f,-8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-8.0f, 0.0f, 0.0f, 4.0f,-4.0f, 0.0f,-1.0f, 2.0f,-3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
-3.0f, 0.0f,-1.0f, 2.0f,-2.0f, 0.0f,-1.0f, 2.0f,-4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
-2.0f, 2.0f, 0.0f, 2.0f,-1.0f, 1.0f, 0.5f, 1.0f,-1.5f, 1.5f, 0.5f, 1.0f,
|
||
|
-1.5f, 1.5f, 0.5f, 1.0f,-2.0f, 2.0f, 0.5f, 1.0f,-4.0f, 4.0f, 0.0f, 2.0f,
|
||
|
-4.0f, 4.0f, 0.0f, 2.0f,-2.0f, 2.0f,-0.5f, 1.0f,-1.5f, 1.5f,-0.5f, 1.0f,
|
||
|
-1.5f, 1.5f,-0.5f, 1.0f,-1.0f, 1.0f,-0.5f, 1.0f,-2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
0.0f, 2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 1.5f, 0.5f, 1.0f,
|
||
|
0.0f, 1.5f, 0.5f, 1.0f, 0.0f, 2.0f, 0.5f, 1.0f, 0.0f, 4.0f, 0.0f, 2.0f,
|
||
|
0.0f, 4.0f, 0.0f, 2.0f, 0.0f, 2.0f,-0.5f, 1.0f, 0.0f, 1.5f,-0.5f, 1.0f,
|
||
|
0.0f, 1.5f,-0.5f, 1.0f, 0.0f, 1.0f,-0.5f, 1.0f, 0.0f, 2.0f, 0.0f, 2.0f,
|
||
|
0.0f, 2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 1.5f, 0.5f, 1.0f,
|
||
|
0.0f, 1.5f, 0.5f, 1.0f, 0.0f, 2.0f, 0.5f, 1.0f, 0.0f, 4.0f, 0.0f, 2.0f,
|
||
|
0.0f, 4.0f, 0.0f, 2.0f, 0.0f, 2.0f,-0.5f, 1.0f, 0.0f, 1.5f,-0.5f, 1.0f,
|
||
|
0.0f, 1.5f,-0.5f, 1.0f, 0.0f, 1.0f,-0.5f, 1.0f, 0.0f, 2.0f, 0.0f, 2.0f,
|
||
|
2.0f, 2.0f, 0.0f, 2.0f, 1.0f, 1.0f, 0.5f, 1.0f, 1.5f, 1.5f, 0.5f, 1.0f,
|
||
|
1.5f, 1.5f, 0.5f, 1.0f, 2.0f, 2.0f, 0.5f, 1.0f, 4.0f, 4.0f, 0.0f, 2.0f,
|
||
|
4.0f, 4.0f, 0.0f, 2.0f, 2.0f, 2.0f,-0.5f, 1.0f, 1.5f, 1.5f,-0.5f, 1.0f,
|
||
|
1.5f, 1.5f,-0.5f, 1.0f, 1.0f, 1.0f,-0.5f, 1.0f, 2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 3.0f, 0.0f, 1.0f, 2.0f,
|
||
|
3.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.0f, 0.0f, 4.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 3.0f, 0.0f,-1.0f, 2.0f,
|
||
|
3.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f, 4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* Control points of a torus in NURBS form. Can be rendered using
|
||
|
* the GLU NURBS routines.
|
||
|
*/
|
||
|
static GLfloat torusnurbpts[] = {
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f,-2.0f, 0.0f, 2.0f, 1.0f,-1.0f, 0.5f, 1.0f,
|
||
|
2.0f,-2.0f, 0.5f, 1.0f, 4.0f,-4.0f, 0.0f, 2.0f, 2.0f,-2.0f,-0.5f, 1.0f,
|
||
|
1.0f,-1.0f,-0.5f, 1.0f, 2.0f,-2.0f, 0.0f, 2.0f,-2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-1.0f,-1.0f, 0.5f, 1.0f,-2.0f,-2.0f, 0.5f, 1.0f,-4.0f,-4.0f, 0.0f, 2.0f,
|
||
|
-2.0f,-2.0f,-0.5f, 1.0f,-1.0f,-1.0f,-0.5f, 1.0f,-2.0f,-2.0f, 0.0f, 2.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 0.0f, 1.0f, 2.0f,-4.0f, 0.0f, 1.0f, 2.0f,
|
||
|
-8.0f, 0.0f, 0.0f, 4.0f,-4.0f, 0.0f,-1.0f, 2.0f,-2.0f, 0.0f,-1.0f, 2.0f,
|
||
|
-4.0f, 0.0f, 0.0f, 4.0f,-2.0f, 2.0f, 0.0f, 2.0f,-1.0f, 1.0f, 0.5f, 1.0f,
|
||
|
-2.0f, 2.0f, 0.5f, 1.0f,-4.0f, 4.0f, 0.0f, 2.0f,-2.0f, 2.0f,-0.5f, 1.0f,
|
||
|
-1.0f, 1.0f,-0.5f, 1.0f,-2.0f, 2.0f, 0.0f, 2.0f, 2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
1.0f, 1.0f, 0.5f, 1.0f, 2.0f, 2.0f, 0.5f, 1.0f, 4.0f, 4.0f, 0.0f, 2.0f,
|
||
|
2.0f, 2.0f,-0.5f, 1.0f, 1.0f, 1.0f,-0.5f, 1.0f, 2.0f, 2.0f, 0.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f, 2.0f, 0.0f, 1.0f, 2.0f, 4.0f, 0.0f, 1.0f, 2.0f,
|
||
|
8.0f, 0.0f, 0.0f, 4.0f, 4.0f, 0.0f,-1.0f, 2.0f, 2.0f, 0.0f,-1.0f, 2.0f,
|
||
|
4.0f, 0.0f, 0.0f, 4.0f,
|
||
|
};
|