home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / exampleCode / opengl / lmwrap / ogl / grafix.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-11  |  6.3 KB  |  223 lines

  1. /*
  2.  * Copyright (c) 1995, Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that the name of Silicon Graphics may not be used in any advertising or
  7.  * publicity relating to the software without the specific, prior written
  8.  * permission of Silicon Graphics.
  9.  *
  10.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  11.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  12.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  13.  *
  14.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  15.  * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE
  17.  * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  21.  */
  22. /*----------------------------------------------------------------------------
  23.  * 
  24.  * file   : grafix.c 
  25.  * 
  26.  * Author : Yusuf Attarwala
  27.  * 
  28.  *---------------------------------------------------------------------------*/
  29. #include <X11/keysym.h>
  30. #include <strings.h>
  31. #include "Xmincludes.h"
  32. #include "globals.h"
  33. #include "lm.h"
  34.  
  35. #include <Xm/Protocols.h>
  36.  
  37. Arg args[40];
  38. int argcnt;
  39.  
  40. extern void doExit();
  41.  
  42. void
  43. createGraphics(parent)
  44. Widget parent;
  45. {
  46.     char *c;
  47.     Widget frameD,frameS;
  48.     Widget glwDbuffer,glwSbuffer;
  49.     Widget gf;
  50.  
  51.     static int firstTime = 1;
  52.     void gfxExposeCB(),
  53.          gfxResizeCB(),
  54.      gfxInitCB();
  55.          
  56.     Atom xaWmDeleteWindow = XmInternAtom(display,"WM_DELETE_WINDOW",TRUE);
  57.  
  58.     argcnt = 0;
  59.     XtSetArg(args[argcnt],XmNtitle,   "lmwrap - OPENGL");argcnt++;
  60.     XtSetArg(args[argcnt],XmNiconName,"lmwrapO");argcnt++;
  61.     XtSetArg(args[argcnt],XmNkeyboardFocusPolicy, XmPOINTER);argcnt++;
  62.     XtSetArg(args[argcnt],XmNdeleteResponse,      XmUNMAP);argcnt++;
  63.     XtSetArg(args[argcnt],XmNdefaultPosition,     False);argcnt++;
  64.     XtSetArg(args[argcnt],XmNminWidth,  300);argcnt++;
  65.     XtSetArg(args[argcnt],XmNminAspectX,  1);argcnt++;
  66.     XtSetArg(args[argcnt],XmNminAspectY,  1);argcnt++;
  67.     XtSetArg(args[argcnt],XmNmaxAspectX,  1);argcnt++;
  68.     XtSetArg(args[argcnt],XmNmaxAspectY,  1);argcnt++;
  69.  
  70.     quadObj = gluNewQuadric();  /* for drawing sphere */
  71.  
  72.  
  73.     gf = XtCreatePopupShell("ui",
  74.                    topLevelShellWidgetClass,parent,args,argcnt);
  75.  
  76.     XmAddWMProtocolCallback(gf,xaWmDeleteWindow,doExit,0);
  77.  
  78.     /* double buffer widget */
  79.     argcnt = 0;
  80.     XtSetArg(args[argcnt], XmNbackground,BlackPixel(display,screen)); argcnt++;
  81.     frameD = XtCreateWidget("frameD", xmFrameWidgetClass,
  82.                              gf, args, argcnt);
  83.  
  84.     XtManageChild(frameD);
  85.  
  86.     argcnt = 0;
  87.     argcnt = 0;
  88.     XtSetArg(args[argcnt], GLwNrgba,               TRUE); argcnt++;
  89.     XtSetArg(args[argcnt], GLwNredSize,            1); argcnt++;
  90.     XtSetArg(args[argcnt], GLwNgreenSize,          1); argcnt++;
  91.     XtSetArg(args[argcnt], GLwNblueSize,           1); argcnt++;
  92.     XtSetArg(args[argcnt], GLwNdepthSize,         24); argcnt++;
  93.     XtSetArg(args[argcnt], GLwNdoublebuffer,       TRUE); argcnt++;
  94.     XtSetArg(args[argcnt], GLwNallocateBackground, TRUE); argcnt++;
  95.     glwDbuffer = GLwCreateMDrawingArea(frameD, "gfx", args, argcnt);
  96.     XtManageChild(glwDbuffer);
  97.  
  98.     XtAddCallback(glwDbuffer, GLwNexposeCallback, gfxExposeCB, NULL);
  99.     XtAddCallback(glwDbuffer, GLwNresizeCallback, gfxResizeCB, NULL);
  100.     XtAddCallback(glwDbuffer, GLwNginitCallback,  gfxInitCB,   NULL);
  101.  
  102.     /* default to double buffer */
  103.     glw = glwDbuffer;
  104.     XtManageChild(gf);
  105.  
  106.     if (firstTime) {
  107.         firstTime = 0;
  108.     }
  109.  
  110.     GLwDrawingAreaMakeCurrent(glw, glxc);
  111.     glMatrixMode(GL_PROJECTION);
  112.     glOrtho(-10.0,10.0,-10.0,10.0,-5.0,10.0);
  113.     glMatrixMode(GL_MODELVIEW);
  114.     glLoadIdentity();
  115.  
  116. }
  117.  
  118. void 
  119. gfxExposeCB(w,cd,call) 
  120. Widget w;
  121. XtPointer *cd;
  122. XtPointer *call;
  123. {
  124.     GLwDrawingAreaMakeCurrent(glw, glxc);
  125.     drawScene();
  126. }
  127.  
  128. void
  129. gfxResizeCB(w,cd,call) 
  130. Widget w;
  131. XtPointer *cd;
  132. XtPointer *call;
  133. {
  134.     GLwDrawingAreaCallbackStruct *draw_struct;
  135.     draw_struct = (GLwDrawingAreaCallbackStruct *) call;
  136.  
  137.     if (draw_struct->event != (XEvent *)NULL) {
  138.         window_width  = draw_struct->event->xconfigure.width;
  139.         window_height = draw_struct->event->xconfigure.height;
  140.     }
  141.     else {
  142.         argcnt = 0;
  143.         XtSetArg(args[argcnt], XmNwidth,  &window_width); argcnt++;
  144.         XtSetArg(args[argcnt], XmNheight, &window_height); argcnt++;
  145.         XtGetValues(w,args,argcnt);
  146.     }
  147.  
  148.     GLwDrawingAreaMakeCurrent(glw, glxc);
  149.     glViewport(0, 0, draw_struct->width-1, draw_struct->height-1);
  150.     drawScene();
  151.  
  152.  
  153. }
  154.  
  155. void
  156. gfxInitCB(w,cd,call) 
  157. Widget w;
  158. XtPointer *cd;
  159. XtPointer *call;
  160. {
  161.     XVisualInfo *vi;
  162.     GLwDrawingAreaCallbackStruct *draw_struct;
  163.     draw_struct = (GLwDrawingAreaCallbackStruct *) call;
  164.  
  165.     XtSetArg(args[0], GLwNvisualInfo, &vi);
  166.     XtGetValues(w, args, 1);
  167.  
  168.     glxc = glXCreateContext(XtDisplay(w), vi, 0, GL_TRUE);
  169.  
  170.     GLwDrawingAreaMakeCurrent(glw, glxc);
  171.  
  172.     glClearColor(0.0,0.0,0.0,1.0);
  173.  
  174.     /* irisGL style calls, calls our lmdef */
  175.  
  176.     lmdef(DEFMATERIAL,MAT_BRASS,SZ(mat_brass),mat_brass);
  177.     lmdef(DEFMATERIAL,MAT_REDPLASTIC,SZ(mat_redplastic),mat_redplastic);
  178.     lmdef(DEFMATERIAL,MAT_SILVER,SZ(mat_silver),mat_silver);
  179.     lmdef(DEFMATERIAL,MAT_GRNPLASTIC,SZ(mat_grnplastic),mat_grnplastic);
  180.  
  181.     lmdef(DEFLMODEL,  LTM_INFINITE,SZ(infinite),infinite);
  182.     lmdef(DEFLMODEL,  LTM_LOCAL,SZ(local),local);
  183.     lmdef(DEFLMODEL,  LTM_INF_TWO,SZ(infinite),infinite);
  184.  
  185.     lmdef(DEFLIGHT,   LT_INF_WHITE,SZ(white_inf_light),white_inf_light);
  186.     lmdef(DEFLIGHT,   LT_INF_RED,SZ(red_inf_light),red_inf_light);
  187.  
  188.     glEnable(GL_LIGHT0);
  189.     glEnable(GL_DEPTH_TEST);
  190. }
  191.  
  192. Boolean
  193. trackBallMotion()
  194. {
  195.     anglex += 2.0;
  196.     angley += 2.0;
  197.     anglez += 2.0;
  198.     if (anglex >= 360.0) anglex = 0.;
  199.     if (angley >= 360.0) angley = 0.;
  200.     if (anglez >= 360.0) anglez = 0.;
  201.  
  202.     refresh = 1;
  203.     drawScene();
  204.     return(0);
  205. }
  206.  
  207. void
  208. animation(flag)
  209. int flag;
  210. {
  211.     Boolean trackBallMotion();
  212.     static XtWorkProcId wpid;
  213.  
  214.     if (flag == 0) {
  215.         if (doTumble == 1) XtRemoveWorkProc(wpid);
  216.     doTumble = 0;
  217.     }
  218.     else if (doTumble == 0) {
  219.     doTumble = 1;
  220.     wpid = XtAppAddWorkProc(appContext,trackBallMotion,NULL);
  221.     }
  222. }
  223.