{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}} {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\lang1033\f0\fs20 /* \par * lighttool.c\par * This program demonstrates the use of the GL lighting model.\par * Menus allow selection of all kinds of lights and the\par * number of polygons making up the plane and sphere.\par * \par * Objects are drawn using a grey material characteristic. \par * A single light source illuminates the objects.\par */\par #include \par #include \par \par int MAXY=10;\par int MAXX=10;\par int shade_model=GL_FLAT;\par int wire_frame = 0;\par int wire_overlay = 0;\par int spot_on = 0;\par int regular_on = 1;\par int LightMode = 3;\par GLfloat light_position[] = \{ 0.0, 0.0, 10.0, 1.0 \};\par GLfloat light_off[] = \{0.0, 0.0, 0.0, 1.0\};\par GLfloat light_ambient[] = \{ 0.3, 0.3, 0.3, 1.0 \};\par GLfloat light_diffuse[] = \{ 1.0, 1.0, 1.0, 1.0 \};\par \par GLfloat spot_diffuse[] = \{1.0, 1.0, 0.0, 1.0 \};\par GLfloat spot_position[] = \{ 0.0, 0.0, 10.0, 1.0 \};\par GLfloat spot_direction[] = \{ 0.0, 0.0, -1.0, 0.0 \};\par \par GLfloat spot_cutoff = 45.0;\par GLfloat spot_exponent = 2.0;\par \par /* text: draws a string of text with an 18 point helvetica bitmap font\par at position (x,y) in window space (bottom left corner is (0,0). */\par void\par text(int x, int y, char* s) \par \{\par int lines;\par char* p;\par \par glDisable(GL_DEPTH_TEST);\par glDisable(GL_LIGHTING);\par glMatrixMode(GL_PROJECTION);\par glPushMatrix();\par glLoadIdentity();\par glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), \par \tab 0, glutGet(GLUT_WINDOW_HEIGHT), -1, 1);\par glMatrixMode(GL_MODELVIEW);\par glPushMatrix();\par glLoadIdentity();\par glColor3ub(255, 255, 255);\par glRasterPos2i(x+1, y-1);\par for(p = s, lines = 0; *p; p++) \{\par \tab if (*p == '\\n') \{\par \tab lines++;\par \tab glRasterPos2i(x+1, y-1-(lines*18));\par \tab\}\par \tab glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *p);\par \}\par glColor3ub(255, 255, 255);\par glRasterPos2i(x, y);\par for(p = s, lines = 0; *p; p++) \{\par \tab if (*p == '\\n') \{\par \tab lines++;\par \tab glRasterPos2i(x, y-(lines*18));\par \tab\}\par \tab glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *p);\par \}\par glMatrixMode(GL_MODELVIEW);\par glPopMatrix();\par glMatrixMode(GL_PROJECTION);\par glPopMatrix();\par glEnable(GL_DEPTH_TEST);\par glEnable(GL_LIGHTING);\par \}\par \par /* Initialize material property and light source.\par */\par void plane(int wire)\par \{\par int i,j;\par float llx, lly;\par float urx, ury; \par \par float inc_y, inc_x;\par \par /* calculate size of individual rectangle */\par inc_y = 20.0/(float)MAXY;\par inc_x = 20.0/(float)MAXX; \par \par llx = -10.0 - inc_x;\par lly = -10.0 - inc_y;\par \par urx = -10.0;\par ury = -10.0;\par \par for(i=0; iRed", 1);\par glutAddMenuEntry("Ambient->Green", 2);\par glutAddMenuEntry("Ambient->Blue", 3);\par glutAddMenuEntry("Ambient->White", 4);\par glutAddMenuEntry("Diffuse->Red", 5);\par glutAddMenuEntry("Diffuse->Green", 6);\par glutAddMenuEntry("Diffuse->Blue", 7);\par glutAddMenuEntry("Diffuse->White", 8);\par \par submenu3 = glutCreateMenu(draw_mode);\par glutAddMenuEntry("Wire Frame", 1);\par glutAddMenuEntry("Solid", 2);\par \par submenu4 = glutCreateMenu(number_sides);\par glutAddMenuEntry("2", 2);\par glutAddMenuEntry("3", 3);\par glutAddMenuEntry("4", 4);\par glutAddMenuEntry("5", 5);\par glutAddMenuEntry("6", 6);\par glutAddMenuEntry("7", 7);\par glutAddMenuEntry("8", 8);\par glutAddMenuEntry("9", 9);\par glutAddMenuEntry("10", 10);\par glutAddMenuEntry("20", 20);\par glutAddMenuEntry("40", 40);\par \par submenu5 = glutCreateMenu(position);\par glutAddMenuEntry("pos @ (0,0,1)", 1);\par glutAddMenuEntry("pos @ (0,0,5)", 2);\par glutAddMenuEntry("pos @ (0,0,10)", 3);\par glutAddMenuEntry("pos @ (0,0,20)", 4);\par glutAddMenuEntry("pos @ (-10,-10,5)", 5);\par glutAddMenuEntry("dir @ (0,0,1)", 6);\par \par submenu6 = glutCreateMenu(overlay);\par glutAddMenuEntry("overlay grid", 1);\par glutAddMenuEntry("remove overlay", 2);\par \par submenu7 = glutCreateMenu(spot);\par glutAddMenuEntry("spot light", 1);\par glutAddMenuEntry("regular light", 2);\par glutAddMenuEntry("both on", 3);\par \par submenu8 = glutCreateMenu(spotcut);\par glutAddMenuEntry("cutoff 1.0", 1);\par glutAddMenuEntry("cutoff 5.0", 2);\par glutAddMenuEntry("cutoff 10.0", 3);\par glutAddMenuEntry("cutoff 20.0", 4);\par glutAddMenuEntry("cutoff 30.0", 5);\par glutAddMenuEntry("cutoff 40.0", 6);\par glutAddMenuEntry("cutoff 60.0", 7);\par glutAddMenuEntry("cutoff 90.0", 8);\par glutAddMenuEntry("cutoff 180.0", 9);\par \par submenu9 = glutCreateMenu(spotexp);\par glutAddMenuEntry("exponent 1.0", 1);\par glutAddMenuEntry("exponent 2.0", 2);\par glutAddMenuEntry("exponent 4.0", 3);\par glutAddMenuEntry("exponent 8.0", 4);\par glutAddMenuEntry("exponent 10.0", 5);\par \par submenu10 = glutCreateMenu(shademodel);\par glutAddMenuEntry("flat", 1);\par glutAddMenuEntry("smooth", 2);\par \par glutCreateMenu(choice_selected);\par glutAddMenuEntry("Quit", 666);\par glutAddSubMenu("Light Mode", submenu1);\par glutAddSubMenu("Light Color", submenu2);\par glutAddSubMenu("Draw Mode", submenu3);\par glutAddSubMenu("Number Sides", submenu4);\par glutAddSubMenu("Light Position", submenu5);\par glutAddSubMenu("Grid Overlay", submenu6);\par glutAddSubMenu("Spotlight", submenu7);\par glutAddSubMenu("Spot Cutoff", submenu8);\par glutAddSubMenu("Spot Exponent", submenu9);\par glutAddSubMenu("Shade Model", submenu10);\par \par glutAttachMenu(GLUT_RIGHT_BUTTON);\par \par glutKeyboardFunc(keyboard);\par glutReshapeFunc (myReshape);\par glutDisplayFunc(display);\par glutMainLoop();\par return 0; /* ANSI C requires main to return int. */\par \}\par \par }