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{ 1077ec3b29aSmrg GLint errnum; 10832001f49Smrg GLuint prognum; 10932001f49Smrg 11032001f49Smrg /* borrowed from an nvidia demo: 11132001f49Smrg * c[0..3] = modelview matrix 11232001f49Smrg * c[4..7] = invtrans modelview matrix 11332001f49Smrg * c[32] = light pos 11432001f49Smrg * c[35] = diffuse color 11532001f49Smrg */ 11632001f49Smrg static const char prog[] = 11732001f49Smrg "!!ARBvp1.0\n" 11832001f49Smrg "OPTION ARB_position_invariant ;" 11932001f49Smrg "TEMP R0, R1; \n" 12032001f49Smrg 12132001f49Smrg "# normal x MV-1T -> lighting normal\n" 12232001f49Smrg "DP3 R1.x, state.matrix.modelview.invtrans.row[0], vertex.normal ;\n" 12332001f49Smrg "DP3 R1.y, state.matrix.modelview.invtrans.row[1], vertex.normal;\n" 12432001f49Smrg "DP3 R1.z, state.matrix.modelview.invtrans.row[2], vertex.normal;\n" 12532001f49Smrg 12632001f49Smrg "DP3 R0, program.local[32], R1; # L.N\n" 12732001f49Smrg#if 0 12832001f49Smrg "MUL result.color.xyz, R0, program.local[35] ; # col = L.N * diffuse\n" 12932001f49Smrg#else 13032001f49Smrg "MUL result.color.primary.xyz, R0, program.local[35] ; # col = L.N * diffuse\n" 13132001f49Smrg#endif 13232001f49Smrg "MOV result.texcoord, vertex.texcoord;\n" 13332001f49Smrg "END"; 13432001f49Smrg 13532001f49Smrg if (!glutExtensionSupported("GL_ARB_vertex_program")) { 13632001f49Smrg printf("Sorry, this program requires GL_ARB_vertex_program"); 13732001f49Smrg exit(1); 13832001f49Smrg } 13932001f49Smrg 14032001f49Smrg 14132001f49Smrg glGenProgramsARB(1, &prognum); 14232001f49Smrg 14332001f49Smrg glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); 14432001f49Smrg glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 14532001f49Smrg strlen(prog), (const GLubyte *) prog); 14632001f49Smrg 14732001f49Smrg assert(glIsProgramARB(prognum)); 1487ec3b29aSmrg errnum = glGetError(); 1497ec3b29aSmrg printf("glGetError = %d\n", errnum); 1507ec3b29aSmrg if (errnum != GL_NO_ERROR) 15132001f49Smrg { 15232001f49Smrg GLint errorpos; 15332001f49Smrg 15432001f49Smrg glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); 15532001f49Smrg printf("errorpos: %d\n", errorpos); 15632001f49Smrg printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); 15732001f49Smrg } 15832001f49Smrg 15932001f49Smrg /* Light position */ 16032001f49Smrg glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, 32, 2, 2, 4, 1); 16132001f49Smrg /* Diffuse material color */ 16232001f49Smrg glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, 35, 0.25, 0, 0.25, 1); 16332001f49Smrg 16432001f49Smrg glEnable(GL_VERTEX_PROGRAM_ARB); 16532001f49Smrg glEnable(GL_DEPTH_TEST); 16632001f49Smrg glClearColor(0.3, 0.3, 0.3, 1); 16732001f49Smrg} 16832001f49Smrg 16932001f49Smrg 17032001f49Smrgint main( int argc, char *argv[] ) 17132001f49Smrg{ 17232001f49Smrg glutInit( &argc, argv ); 17332001f49Smrg glutInitWindowPosition( 0, 0 ); 17432001f49Smrg glutInitWindowSize( 250, 250 ); 17532001f49Smrg glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); 17632001f49Smrg glutCreateWindow(argv[0]); 17732001f49Smrg glewInit(); 17832001f49Smrg glutReshapeFunc( Reshape ); 17932001f49Smrg glutKeyboardFunc( Key ); 18032001f49Smrg glutSpecialFunc( SpecialKey ); 18132001f49Smrg glutDisplayFunc( Display ); 18232001f49Smrg if (Anim) 18332001f49Smrg glutIdleFunc(Idle); 18432001f49Smrg Init(); 18532001f49Smrg glutMainLoop(); 18632001f49Smrg return 0; 18732001f49Smrg} 188