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 >
Wrap
C/C++ Source or Header
|
1998-07-07
|
5KB
|
200 lines
/*
* sample.cxx
* Usage: Use the mouse buttons to fly around a video texture map.
*
*/
#include "dmu.h"
#include "dmuVideoIn.h"
#include "dmuGLTex2d.h"
#include <dmedia/vl_mvp.h>
#include <unistd.h>
extern "C" {
#include "wt.h"
#include <GL/gl.h>
#include <GL/glu.h>
}
#define dmuCheck(dmFunc) { \
int dmuErrID; \
if ((dmuErrID = (dmFunc)) != DMU_OK) {\
fprintf(stderr,"*Error:%d:%s\n", dmuErrID, \
getErrorString(dmuErrID) ); \
/*exit(-1);*/\
}\
else { \
/*fprintf(stderr,"No Error\n");*/ \
} \
}
void myGLdraw(WTwindow *win, FLAG eye);
void handleDmuEvents(XtPointer *, int *fd, XtInputId*);
// These are global, so our event handler can get at them easier.
// it'd be better if we encapsulated them in a c++ class, but it's
// just a test app :)
dmuVideoIn *videoIn;
dmuGLTex2d *texture;
int sizeX,sizeY;
const float winSizeX = 5;
const float winSizeY = 5;
int i = 0;
void main(int argc, char *argv[])
{
/////////////////////////////////////////////////////////////////
// Set up WTK.
// WTuniverse_new(WTDISPLAY_DEFAULT, WTWINDOW_DEFAULT);
WTuniverse_new(WTDISPLAY_DEFAULT, WTWINDOW_NOBORDER);
WTwindow_setposition(WTuniverse_getwindows(), 0, 0, 640, 480);
WTwindow_zoomviewpoint(WTuniverse_getwindows());
WTsensor *sensor = WTmouse_new();
WTviewpoint *view = WTuniverse_getviewpoints();
WTviewpoint_addsensor(view, sensor);
/////////////////////////////////////////////////////////////////
// Set up video texture mapping.
// -- Construction --
videoIn = new dmuVideoIn;
videoIn->setName("Video In ");
texture = new dmuGLTex2d;
texture->setName("Texture");
// -- Wire --
videoIn->addObject(texture);
// -- Setup --
// Use current vcp setting for video source
dmuCheck(videoIn->setup(VL_ANY));
// Use ABGR_8 packing and formatting texture mapping
// dmuCheck(videoIn->setCaptureType(VL_TIMING_525_SQ_PIX));
dmuCheck(videoIn->setPacking(VL_PACKING_ABGR_8));
dmuCheck(videoIn->setCaptureType(VL_CAPTURE_INTERLEAVED));
dmuCheck(videoIn->setFormat(VL_FORMAT_RGB));
// Texture maps need to be powers of 2. Setting the zoom
// to 4/5 and then cropping to 512/256 gets us a pretty
// good area
//dmuCheck(videoIn->setZoom(4,5));
dmuCheck(videoIn->setSize(512,512));
dmuCheck(videoIn->setOrigin(0,32));
//dmuCheck(videoIn->setSize(512,256));
// Use graphics layout for texture maps
dmuCheck(videoIn->setLayout(VL_LAYOUT_GRAPHICS));
fprintf (stderr, "Getting video dimensions: ");
videoIn->getImageDimensions(&sizeX,&sizeY);
fprintf (stderr, "Video dimensions: %d, %d\n\n",sizeX,sizeY);
// Set up the texture object to have the same size
Widget window_widget = WTwindow_getwidget(WTuniverse_getwindows());
dmuCheck(texture->setup(XtDisplay(window_widget), sizeX, sizeY));
// -- Init --
fprintf (stderr, "Initializing: \n\n");
dmuCheck(videoIn->init());
// -- Start --
fprintf (stderr, "Fire it up!\n");
dmuCheck(videoIn->start());
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE_EXT);
XtAppContext app;
app = XtWidgetToApplicationContext(window_widget);
XtInputId inputID = XtAppAddInput(app, videoIn->getFD(),
(XtPointer) XtInputReadMask, handleDmuEvents, NULL);
WTwindow_setdrawfn(WTuniverse_getwindows(), myGLdraw);
WTuniverse_ready();
// XtAppMainLoop(app);
WTuniverse_go(); /* Starts simulation */
WTuniverse_delete(); /* All done */
delete (texture);
delete (videoIn);
}
void myGLdraw(WTwindow *win, FLAG eye)
{
//fprintf (stderr, "here I am!\n");
glPushMatrix();
//fprintf (stderr, "Using frame\n");
glColor3f(1.0,1.0,1.0);
glEnable( GL_TEXTURE_2D );
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0); glVertex3d(-winSizeX/2,winSizeY/2,0.0);
glTexCoord2d(1.0,0.0); glVertex3d(winSizeX/2,winSizeY/2,0.0);
glTexCoord2d(1.0,1.0); glVertex3d(winSizeX/2,-winSizeY/2,0.0);
glTexCoord2d(0.0,1.0); glVertex3d(-winSizeX/2,-winSizeY/2,0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
glLineWidth(4.0);
glColor3f (0.0, 1.0, 0.0);
glDisable(GL_LIGHTING);
glBegin(GL_LINE_LOOP);
glVertex3f (-winSizeX/2, -winSizeY/2, 0);
glVertex3f (winSizeX/2, -winSizeY/2, 0);
glVertex3f (winSizeX/2, winSizeY/2, 0);
glVertex3f (-winSizeX/2, winSizeY/2, 0);
glEnd();
glEnable(GL_LIGHTING);
glPopMatrix();
}
void handleDmuEvents(XtPointer*, int *fd, XtInputId*){
// fprintf (stderr, "In DMU callback...\n");
fd_set readFDSet;
int maxFD;
FD_ZERO(&readFDSet);
videoIn->setFD(&readFDSet, &maxFD);
int error = videoIn->handleEvents(readFDSet);
// This handles the temporary videoIn return values. We only want
// to redraw the screen if we have a new video frame waiting for us
if (error != VIDEOIN_TRANSFER_COMPLETE){
//fprintf (stderr, "Error reading frame\n");
return;
}
//fprintf (stderr, "Will use frame\n");
// Tell the texture to setup Open GL to use the latest
// video frame as a texture map.
dmuCheck(texture->defineTex2D());
// WTuniverse_go1();
}