/* * Mesa 3-D graphics library * Version: 3.5 * * The MIT License * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * Linux Magazine July 2001 * Conversion to UGL/Mesa from GLUT by Stephane Raimbault, 2001 */ #include #include #include #include #include #include #include #include #include /* Need GLUT_SHAPES */ #include #ifndef PI #define PI 3.14159265 #endif UGL_LOCAL UGL_EVENT_SERVICE_ID eventServiceId; UGL_LOCAL UGL_EVENT_Q_ID qId; UGL_LOCAL UGL_MESA_CONTEXT umc; UGL_LOCAL volatile UGL_BOOL stopWex; UGL_LOCAL GLint angle; UGL_LOCAL GLfloat Sin[360], Cos[360]; UGL_LOCAL GLfloat L0pos[]={0.0, 2.0, -1.0}; UGL_LOCAL GLfloat L0dif[]={0.3, 0.3, 0.8}; UGL_LOCAL GLfloat L1pos[]={2.0, 2.0, 2.0}; UGL_LOCAL GLfloat L1dif[]={0.5, 0.5, 0.5}; UGL_LOCAL GLfloat Mspec[3]; UGL_LOCAL GLfloat Mshiny; UGL_LOCAL GLuint theTeapot; UGL_LOCAL void calcTableCosSin() { int i; for(i=0;i<360;i++) { Cos[i] = cos(((float)i)/180.0*PI); Sin[i] = sin(((float)i)/180.0*PI); } } UGL_LOCAL void initGL(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glColor3f(1.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glLightfv(GL_LIGHT0, GL_DIFFUSE, L0dif); glLightfv(GL_LIGHT0, GL_SPECULAR, L0dif); glLightfv(GL_LIGHT1, GL_DIFFUSE, L1dif); glLightfv(GL_LIGHT1, GL_SPECULAR, L1dif); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Mspec); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Mshiny); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, 1.0, 0.1, 10.0); glMatrixMode(GL_MODELVIEW); theTeapot = glGenLists(1); glNewList(theTeapot, GL_COMPILE); glutSolidTeapot(1.0); glEndList(); } UGL_LOCAL void drawGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(4.5*Cos[angle], 2.0,4.5*Sin[angle],0.0,0.0,0.0,0.0, 1.0,0.0); glLightfv(GL_LIGHT0, GL_POSITION, L0pos); glLightfv(GL_LIGHT1, GL_POSITION, L1pos); glCallList(theTeapot); glFlush(); uglMesaSwapBuffers(); } UGL_LOCAL void echoUse(void) { printf("tTeapot keys:\n"); printf(" Left Counter clockwise rotation (y-axis)\n"); printf(" Right Clockwise rotation (y-axis)\n"); printf(" j Enable/disable Light0\n"); printf(" k Enable/disable Light1\n"); printf(" m Add specular\n"); printf(" l Remove specular\n"); printf(" o Add shininess\n"); printf(" p Remove shininess\n"); printf(" ESC Exit\n"); } UGL_LOCAL void readKey (UGL_WCHAR key) { switch(key) { case UGL_UNI_RIGHT_ARROW: angle +=2; if (angle>= 360) angle-=360; break; case UGL_UNI_LEFT_ARROW: angle -=2; if (angle<0) angle+=360; break; case 'j': glIsEnabled(GL_LIGHT0) ? glDisable(GL_LIGHT0) : glEnable(GL_LIGHT0); break; case 'k': glIsEnabled(GL_LIGHT1) ? glDisable(GL_LIGHT1) : glEnable(GL_LIGHT1); break; case 'm': Mspec[0]+=0.1; if(Mspec[0]>1) Mspec[0]=1; Mspec[1]+=0.1; if(Mspec[1]>1) Mspec[1]=1; Mspec[2]+=0.1; if(Mspec[2]>1) Mspec[2]=1; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Mspec); break; case 'l': Mspec[0]-=0.1; if(Mspec[0]>1) Mspec[0]=1; Mspec[1]-=0.1; if(Mspec[1]>1) Mspec[1]=1; Mspec[2]-=0.1; if(Mspec[2]>1) Mspec[2]=1; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Mspec); break; case 'o': Mshiny -= 1; if (Mshiny<0) Mshiny=0; glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Mshiny); break; case 'p': Mshiny += 1; if (Mshiny>128) Mshiny=128; glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Mshiny); break; case UGL_UNI_ESCAPE: stopWex = UGL_TRUE; break; } } UGL_LOCAL void loopEvent(void) { UGL_EVENT event; UGL_INPUT_EVENT * pInputEvent; UGL_FOREVER { if (uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT) != UGL_STATUS_Q_EMPTY) { pInputEvent = (UGL_INPUT_EVENT *)&event; if (pInputEvent->header.type == UGL_EVENT_TYPE_KEYBOARD && pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN) readKey(pInputEvent->type.keyboard.key); } drawGL(); if (stopWex) break; } } void windMLTeapot (UGL_BOOL windMLMode); void uglteapot (void) { taskSpawn ("tTeapot", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLTeapot, UGL_FALSE,1,2,3,4,5,6,7,8,9); } void windMLTeapot (UGL_BOOL windMLMode) { UGL_INPUT_DEVICE_ID keyboardDevId; GLsizei displayWidth, displayHeight; GLsizei x, y, w, h; angle = 45; Mspec[0] = 0.5; Mspec[1] = 0.5; Mspec[2] = 0.5; Mshiny = 50; uglInitialize (); uglDriverFind (UGL_KEYBOARD_TYPE, 0, (UGL_UINT32 *)&keyboardDevId); uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0, (UGL_UINT32 *)&eventServiceId); qId = uglEventQCreate (eventServiceId, 100); /* Double buffering */ if (windMLMode) umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE | UGL_MESA_WINDML_EXCLUSIVE, NULL); else umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE, NULL); if (umc == NULL) { uglDeinitialize (); return; } uglMesaMakeCurrentContext (umc, 0, 0, 1, 1); uglMesaGetIntegerv(UGL_MESA_DISPLAY_WIDTH, &displayWidth); uglMesaGetIntegerv(UGL_MESA_DISPLAY_HEIGHT, &displayHeight); h = (displayHeight*2)/3; w = h; x = (displayWidth-w)/2; y = (displayHeight-h)/2; uglMesaMoveToWindow(x, y); uglMesaResizeToWindow(w, h); calcTableCosSin(); initGL (); echoUse(); stopWex = UGL_FALSE; loopEvent(); uglEventQDestroy (eventServiceId, qId); uglMesaDestroyContext(); uglDeinitialize (); return; }