132001f49Smrg/* 232001f49Smrg * A lit, rotating torus via vertex program 332001f49Smrg */ 432001f49Smrg 532001f49Smrg#include <assert.h> 632001f49Smrg#include <string.h> 732001f49Smrg#include <stdio.h> 832001f49Smrg#include <stdlib.h> 932001f49Smrg#include <math.h> 1032001f49Smrg#include <GL/glew.h> 1132001f49Smrg#include "glut_wrap.h" 1232001f49Smrg 1332001f49Smrgstatic float Xrot = 0.0, Yrot = 0.0, Zrot = 0.0; 1432001f49Smrgstatic GLboolean Anim = GL_TRUE; 1532001f49Smrg 1632001f49Smrg 1732001f49Smrgstatic void Idle( void ) 1832001f49Smrg{ 1932001f49Smrg Xrot += .3; 2032001f49Smrg Yrot += .4; 2132001f49Smrg Zrot += .2; 2232001f49Smrg glutPostRedisplay(); 2332001f49Smrg} 2432001f49Smrg 2532001f49Smrg 2632001f49Smrgstatic void Display( void ) 2732001f49Smrg{ 2832001f49Smrg glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 2932001f49Smrg 3032001f49Smrg glPushMatrix(); 3132001f49Smrg glRotatef(Xrot, 1, 0, 0); 3232001f49Smrg glRotatef(Yrot, 0, 1, 0); 3332001f49Smrg glRotatef(Zrot, 0, 0, 1); 3432001f49Smrg glutSolidTorus(0.75, 2.0, 10, 20); 3532001f49Smrg glPopMatrix(); 3632001f49Smrg 3732001f49Smrg glutSwapBuffers(); 3832001f49Smrg} 3932001f49Smrg 4032001f49Smrg 4132001f49Smrgstatic void Reshape( int width, int height ) 4232001f49Smrg{ 4332001f49Smrg glViewport( 0, 0, width, height ); 4432001f49Smrg glMatrixMode( GL_PROJECTION ); 4532001f49Smrg glLoadIdentity(); 4632001f49Smrg glFrustum( -2.0, 2.0, -2.0, 2.0, 5.0, 25.0 ); 4732001f49Smrg glMatrixMode( GL_MODELVIEW ); 4832001f49Smrg glLoadIdentity(); 4932001f49Smrg glTranslatef( 0.0, 0.0, -12.0 ); 5032001f49Smrg} 5132001f49Smrg 5232001f49Smrg 5332001f49Smrgstatic void Key( unsigned char key, int x, int y ) 5432001f49Smrg{ 5532001f49Smrg (void) x; 5632001f49Smrg (void) y; 5732001f49Smrg switch (key) { 5832001f49Smrg case ' ': 5932001f49Smrg Xrot = Yrot = Zrot = 0; 6032001f49Smrg break; 6132001f49Smrg case 'a': 6232001f49Smrg Anim = !Anim; 6332001f49Smrg if (Anim) 6432001f49Smrg glutIdleFunc(Idle); 6532001f49Smrg else 6632001f49Smrg glutIdleFunc(NULL); 6732001f49Smrg break; 6832001f49Smrg case 'z': 6932001f49Smrg Zrot -= 5.0; 7032001f49Smrg break; 7132001f49Smrg case 'Z': 7232001f49Smrg Zrot += 5.0; 7332001f49Smrg break; 7432001f49Smrg case 27: 7532001f49Smrg exit(0); 7632001f49Smrg break; 7732001f49Smrg } 7832001f49Smrg glutPostRedisplay(); 7932001f49Smrg} 8032001f49Smrg 8132001f49Smrg 8232001f49Smrgstatic void SpecialKey( int key, int x, int y ) 8332001f49Smrg{ 8432001f49Smrg const GLfloat step = 3.0; 8532001f49Smrg (void) x; 8632001f49Smrg (void) y; 8732001f49Smrg switch (key) { 8832001f49Smrg case GLUT_KEY_UP: 8932001f49Smrg Xrot -= step; 9032001f49Smrg break; 9132001f49Smrg case GLUT_KEY_DOWN: 9232001f49Smrg Xrot += step; 9332001f49Smrg break; 9432001f49Smrg case GLUT_KEY_LEFT: 9532001f49Smrg Yrot -= step; 9632001f49Smrg break; 9732001f49Smrg case GLUT_KEY_RIGHT: 9832001f49Smrg Yrot += step; 9932001f49Smrg break; 10032001f49Smrg } 10132001f49Smrg glutPostRedisplay(); 10232001f49Smrg} 10332001f49Smrg 10432001f49Smrg 10532001f49Smrgstatic void Init( void ) 10632001f49Smrg{ 10732001f49Smrg /* borrowed from an nvidia demo: 10832001f49Smrg * c[0..3] = modelview matrix 10932001f49Smrg * c[4..7] = inverse modelview matrix 11032001f49Smrg * c[32] = light pos 11132001f49Smrg * c[35] = diffuse color 11232001f49Smrg */ 11332001f49Smrg static const char prog[] = 11432001f49Smrg "!!VP1.0\n" 11532001f49Smrg "#Simple transform and diffuse lighting\n" 11632001f49Smrg "\n" 11732001f49Smrg "DP4 o[HPOS].x, c[0], v[OPOS] ; # object x MVP -> clip\n" 11832001f49Smrg "DP4 o[HPOS].y, c[1], v[OPOS] ;\n" 11932001f49Smrg "DP4 o[HPOS].z, c[2], v[OPOS] ;\n" 12032001f49Smrg "DP4 o[HPOS].w, c[3], v[OPOS] ;\n" 12132001f49Smrg 12232001f49Smrg "DP3 R1.x, c[4], v[NRML] ; # normal x MV-1T -> lighting normal\n" 12332001f49Smrg "DP3 R1.y, c[5], v[NRML] ;\n" 12432001f49Smrg "DP3 R1.z, c[6], v[NRML] ;\n" 12532001f49Smrg 12632001f49Smrg "DP3 R0, c[32], R1 ; # L.N\n" 12732001f49Smrg "MUL o[COL0].xyz, R0, c[35] ; # col = L.N * diffuse\n" 12832001f49Smrg "MOV o[TEX0], v[TEX0];\n" 12932001f49Smrg "END"; 13032001f49Smrg 13132001f49Smrg if (!glutExtensionSupported("GL_NV_vertex_program")) { 13232001f49Smrg printf("Sorry, this program requires GL_NV_vertex_program"); 13332001f49Smrg exit(1); 13432001f49Smrg } 13532001f49Smrg 13632001f49Smrg glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 1, 13732001f49Smrg strlen(prog), (const GLubyte *) prog); 13832001f49Smrg assert(glIsProgramNV(1)); 13932001f49Smrg glBindProgramNV(GL_VERTEX_PROGRAM_NV, 1); 14032001f49Smrg 14132001f49Smrg /* Load the program registers */ 14232001f49Smrg glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV); 14332001f49Smrg glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4, GL_MODELVIEW, GL_INVERSE_TRANSPOSE_NV); 14432001f49Smrg 14532001f49Smrg /* Light position */ 14632001f49Smrg glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 32, 2, 2, 4, 1); 14732001f49Smrg /* Diffuse material color */ 14832001f49Smrg glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 35, 0.25, 0, 0.25, 1); 14932001f49Smrg 15032001f49Smrg glEnable(GL_VERTEX_PROGRAM_NV); 15132001f49Smrg glEnable(GL_DEPTH_TEST); 15232001f49Smrg glClearColor(0.3, 0.3, 0.3, 1); 15332001f49Smrg 15432001f49Smrg printf("glGetError = %d\n", (int) glGetError()); 15532001f49Smrg} 15632001f49Smrg 15732001f49Smrg 15832001f49Smrgint main( int argc, char *argv[] ) 15932001f49Smrg{ 16032001f49Smrg glutInit( &argc, argv ); 16132001f49Smrg glutInitWindowPosition( 0, 0 ); 16232001f49Smrg glutInitWindowSize( 250, 250 ); 16332001f49Smrg glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); 16432001f49Smrg glutCreateWindow(argv[0]); 16532001f49Smrg glewInit(); 16632001f49Smrg glutReshapeFunc( Reshape ); 16732001f49Smrg glutKeyboardFunc( Key ); 16832001f49Smrg glutSpecialFunc( SpecialKey ); 16932001f49Smrg glutDisplayFunc( Display ); 17032001f49Smrg if (Anim) 17132001f49Smrg glutIdleFunc(Idle); 17232001f49Smrg Init(); 17332001f49Smrg glutMainLoop(); 17432001f49Smrg return 0; 17532001f49Smrg} 176