From 19b6628549c8b80f23976d9b42f2cd853989422c Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Tue, 9 Feb 2010 11:38:58 +0100 Subject: Initial commit. --- foo.cpp | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100755 foo.cpp (limited to 'foo.cpp') diff --git a/foo.cpp b/foo.cpp new file mode 100755 index 0000000..c924245 --- /dev/null +++ b/foo.cpp @@ -0,0 +1,180 @@ +#ifndef __APPLE__ +#include +#include +#else +#include +#include +#endif +#include +#include +#include +#include + +#include +#include + +#include "texturepng.h" + +class Pattern { + private: + double patt_width; + double patt_center[2]; + int patt_id; + double patt_trans_kake[3][4]; + + Texture* tex; + + public: + Pattern() { + patt_width = 10.0; + patt_center[0] = 0.0; + patt_center[1] = 0.0; + + patt_id = arLoadPatt("patt.head"); + + tex = new TexturePNG("foo.png"); + } + + void update(ARMarkerInfo* marker_info, int marker_num) { + for(int j = 0; j < marker_num; j++) { + if( patt_id == marker_info[j].id ) { + arGetTransMat(&marker_info[j], patt_center, patt_width, patt_trans_kake); + draw(); + //else if( marker_info[k].cf < marker_info[j].cf ) k = j; + } + } + } + + void draw() { + double gl_para[16]; + argConvGlpara(patt_trans_kake, gl_para); + + glMatrixMode(GL_MODELVIEW); + glLoadMatrixd(gl_para); + + glTranslatef(0.0, -8.0, 0.0); + + glBindTexture(GL_TEXTURE_2D, tex->tex()); + glBegin(GL_QUADS); + glTexCoord2f(0, 1); + glVertex3f(-30, -30, 0); + glTexCoord2f(0, 0); + glVertex3f(-30, 30, 0); + glTexCoord2f(1, 0); + glVertex3f(30, 30, 0); + glTexCoord2f(1, 1); + glVertex3f(30, -30, 0); + glEnd(); + } +}; + +Pattern* patt; + +static void init() { + ARParam wparam; + + // Open video device. + if(arVideoOpen(NULL) < 0) { + throw(std::runtime_error("arVideoOpen() failed.")); + } + + // Find the size of the window. + int xsize, ysize; + if(arVideoInqSize(&xsize, &ysize) < 0) { + throw(std::runtime_error("arVideoInqSize() failed.")); + } + + std::cout << "Image size (x, y) = (" << xsize << ", " << ysize << ")" << std::endl; + + // Set the initial camera parameters. + ARParam cparam; + if(arParamLoad("camera_para.dat", 1, &wparam) < 0) { + throw(std::runtime_error("arParamLoad() failed.")); + } + + arParamChangeSize(&wparam, xsize, ysize, &cparam); + arInitCparam(&cparam); + std::cout << "*** Camera Parameters ***" << std::endl; + arParamDisp(&cparam); + + // Open the graphics window. + argInit(&cparam, 1.0, 0, 0, 0, 0); + + // Texturing + glEnable(GL_TEXTURE_2D); + // Blending + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + // Smooth shading + glShadeModel(GL_SMOOTH); + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +} + +static void cleanup(void) { + arVideoCapStop(); + arVideoClose(); + argCleanup(); +} + +int count = 0; + +static void key_event(unsigned char key, int x, int y) { + switch(key) { + case 0x1b: + printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); + cleanup(); + exit(0); + } +} + +static void main_loop(void) { + ARUint8 *dataPtr; + + if((dataPtr = (ARUint8 *)arVideoGetImage()) == NULL) { + arUtilSleep(10); + return; + } + + if(count == 0) arUtilTimerReset(); + count++; + + argDrawMode2D(); + argDispImage(dataPtr, 0, 0); + + ARMarkerInfo* marker_info; + int marker_num; + + if(arDetectMarker(dataPtr, 100, &marker_info, &marker_num) < 0) { + throw(std::runtime_error("arDetectMarker() failed.")); + } + + argDrawMode3D(); + argDraw3dCamera( 0, 0 ); + glClearDepth( 1.0 ); + glClear(GL_DEPTH_BUFFER_BIT); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + patt->update(marker_info, marker_num); + + glDisable( GL_DEPTH_TEST ); + + arVideoCapNext(); + argSwapBuffers(); +} + +int main(int argc, char **argv) +{ + try { + glutInit(&argc, argv); + init(); + patt = new Pattern(); + arVideoCapStart(); + argMainLoop( NULL, key_event, main_loop ); + } catch(std::runtime_error e) { + cleanup(); + std::cerr << "Exception caught: " << e.what() << std::endl; + } + return 0; +} -- cgit v1.2.3