home *** CD-ROM | disk | FTP | other *** search
/ ftp.hitl.washington.edu / ftp.hitl.washington.edu.tar / ftp.hitl.washington.edu / pub / people / peter / ER / sample.cxx < prev    next >
C/C++ Source or Header  |  1998-07-07  |  5KB  |  200 lines

  1. /*
  2.  * sample.cxx
  3.  * Usage: Use the mouse buttons to fly around a video texture map.
  4.  *
  5.  */
  6.  
  7. #include "dmu.h"
  8. #include "dmuVideoIn.h"
  9. #include "dmuGLTex2d.h"
  10. #include <dmedia/vl_mvp.h>
  11. #include <unistd.h>
  12.  
  13. extern "C" {
  14. #include "wt.h"
  15.  
  16. #include <GL/gl.h>
  17. #include <GL/glu.h>
  18. }
  19.  
  20. #define dmuCheck(dmFunc) { \
  21.     int dmuErrID; \
  22.     if ((dmuErrID = (dmFunc)) != DMU_OK) {\
  23.        fprintf(stderr,"*Error:%d:%s\n", dmuErrID, \
  24.                getErrorString(dmuErrID) ); \
  25.                                              /*exit(-1);*/\
  26.     }\
  27.     else { \
  28.              /*fprintf(stderr,"No Error\n");*/ \
  29.     } \
  30.  }
  31.  
  32. void myGLdraw(WTwindow *win, FLAG eye);
  33.  
  34. void handleDmuEvents(XtPointer *, int *fd, XtInputId*);
  35.  
  36. // These are global, so our event handler can get at them easier.
  37. // it'd be better if we encapsulated them in a c++ class, but it's
  38. // just a test app :)
  39.  
  40. dmuVideoIn *videoIn;
  41. dmuGLTex2d *texture;
  42. int sizeX,sizeY;
  43. const float winSizeX = 5;
  44. const float winSizeY = 5;
  45. int i = 0;
  46.  
  47. void main(int argc, char *argv[])
  48. {
  49.  
  50.     /////////////////////////////////////////////////////////////////
  51.     // Set up WTK.
  52. //    WTuniverse_new(WTDISPLAY_DEFAULT, WTWINDOW_DEFAULT);
  53.     WTuniverse_new(WTDISPLAY_DEFAULT, WTWINDOW_NOBORDER);
  54.     WTwindow_setposition(WTuniverse_getwindows(), 0, 0, 640, 480);
  55.     WTwindow_zoomviewpoint(WTuniverse_getwindows());
  56.     WTsensor *sensor = WTmouse_new();
  57.     WTviewpoint *view = WTuniverse_getviewpoints();
  58.     WTviewpoint_addsensor(view, sensor);
  59.  
  60.     /////////////////////////////////////////////////////////////////
  61.     // Set up video texture mapping.
  62.     // -- Construction --
  63.     videoIn = new dmuVideoIn;
  64.     videoIn->setName("Video In ");
  65.  
  66.     texture = new dmuGLTex2d;
  67.     texture->setName("Texture");
  68.  
  69.     // -- Wire --
  70.     videoIn->addObject(texture);
  71.  
  72.     // -- Setup --
  73.  
  74.     // Use current vcp setting for video source
  75.     dmuCheck(videoIn->setup(VL_ANY));
  76.  
  77.     // Use ABGR_8 packing and formatting texture mapping
  78.     //  dmuCheck(videoIn->setCaptureType(VL_TIMING_525_SQ_PIX));
  79.     dmuCheck(videoIn->setPacking(VL_PACKING_ABGR_8));
  80.     dmuCheck(videoIn->setCaptureType(VL_CAPTURE_INTERLEAVED));
  81.     dmuCheck(videoIn->setFormat(VL_FORMAT_RGB));
  82.  
  83.     // Texture maps need to be powers of 2. Setting the zoom
  84.     // to 4/5 and then cropping to 512/256 gets us a pretty
  85.     // good area
  86.     //dmuCheck(videoIn->setZoom(4,5));
  87.     dmuCheck(videoIn->setSize(512,512));
  88.     dmuCheck(videoIn->setOrigin(0,32));
  89.     //dmuCheck(videoIn->setSize(512,256));
  90.  
  91.     // Use graphics layout for texture maps
  92.     dmuCheck(videoIn->setLayout(VL_LAYOUT_GRAPHICS));
  93.  
  94.     fprintf (stderr, "Getting video dimensions: ");
  95.     videoIn->getImageDimensions(&sizeX,&sizeY);
  96.     fprintf (stderr, "Video dimensions: %d, %d\n\n",sizeX,sizeY);
  97.  
  98.     // Set up the texture object to have the same size
  99.     Widget window_widget = WTwindow_getwidget(WTuniverse_getwindows());
  100.     dmuCheck(texture->setup(XtDisplay(window_widget), sizeX, sizeY));
  101.  
  102.     // -- Init --
  103.     fprintf (stderr, "Initializing: \n\n");
  104.     dmuCheck(videoIn->init());
  105.  
  106.     // -- Start --
  107.     fprintf (stderr, "Fire it up!\n");
  108.     dmuCheck(videoIn->start());
  109.  
  110.     glMatrixMode( GL_MODELVIEW );
  111.     glLoadIdentity();
  112.  
  113.     glEnable(GL_TEXTURE_2D);
  114.     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  115.     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  116.     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  117.     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  118.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE_EXT);
  119.  
  120.     XtAppContext    app;
  121.     app = XtWidgetToApplicationContext(window_widget);
  122.     XtInputId inputID = XtAppAddInput(app, videoIn->getFD(),
  123.         (XtPointer) XtInputReadMask, handleDmuEvents, NULL);
  124.  
  125.     WTwindow_setdrawfn(WTuniverse_getwindows(), myGLdraw);
  126.  
  127.     WTuniverse_ready();
  128.  
  129. //    XtAppMainLoop(app);
  130.     WTuniverse_go();            /* Starts simulation */
  131.  
  132.     WTuniverse_delete();        /* All done */
  133.     delete (texture);
  134.     delete (videoIn);
  135. }
  136.  
  137. void myGLdraw(WTwindow *win, FLAG eye)
  138. {
  139. //fprintf (stderr, "here I am!\n");
  140.  
  141.     glPushMatrix();
  142.  
  143. //fprintf (stderr, "Using frame\n");
  144.  
  145.     glColor3f(1.0,1.0,1.0);
  146.     glEnable( GL_TEXTURE_2D );
  147.  
  148.     glBegin(GL_QUADS);
  149.  
  150.         glTexCoord2d(0.0,0.0); glVertex3d(-winSizeX/2,winSizeY/2,0.0);
  151.         glTexCoord2d(1.0,0.0); glVertex3d(winSizeX/2,winSizeY/2,0.0);
  152.         glTexCoord2d(1.0,1.0); glVertex3d(winSizeX/2,-winSizeY/2,0.0);
  153.         glTexCoord2d(0.0,1.0); glVertex3d(-winSizeX/2,-winSizeY/2,0.0);
  154.  
  155.     glEnd();
  156.     glDisable(GL_TEXTURE_2D);
  157.  
  158.     glLineWidth(4.0);
  159.     glColor3f (0.0, 1.0, 0.0);
  160.     glDisable(GL_LIGHTING);
  161.     glBegin(GL_LINE_LOOP);
  162.  
  163.             glVertex3f (-winSizeX/2, -winSizeY/2, 0);
  164.             glVertex3f (winSizeX/2, -winSizeY/2, 0);
  165.             glVertex3f (winSizeX/2, winSizeY/2, 0);
  166.             glVertex3f (-winSizeX/2, winSizeY/2, 0);
  167.  
  168.     glEnd();
  169.     glEnable(GL_LIGHTING);
  170.  
  171.     glPopMatrix();
  172. }
  173.  
  174. void handleDmuEvents(XtPointer*, int *fd, XtInputId*){
  175. //    fprintf (stderr, "In DMU callback...\n");
  176.     fd_set readFDSet;
  177.     int maxFD;
  178.  
  179.     FD_ZERO(&readFDSet);
  180.     videoIn->setFD(&readFDSet, &maxFD);
  181.  
  182.     int error = videoIn->handleEvents(readFDSet);
  183.  
  184.     // This handles the temporary videoIn return values.  We only want
  185.     // to redraw the screen if we have a new video frame waiting for us
  186.     if (error != VIDEOIN_TRANSFER_COMPLETE){
  187. //fprintf (stderr, "Error reading frame\n");
  188.         return;
  189.     }
  190.  
  191. //fprintf (stderr, "Will use frame\n");
  192.     // Tell the texture to setup Open GL to use the latest
  193.     // video frame as a texture map.
  194.     dmuCheck(texture->defineTex2D());
  195.  
  196. //    WTuniverse_go1();
  197. }
  198.  
  199.  
  200.