diff options
| author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2010-02-09 11:38:58 +0100 | 
|---|---|---|
| committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2010-02-09 11:38:58 +0100 | 
| commit | 19b6628549c8b80f23976d9b42f2cd853989422c (patch) | |
| tree | 3d8ad793b39c0e96b3bb6d6ca7e0a2555a17a803 /foo.cpp | |
Initial commit.
Diffstat (limited to 'foo.cpp')
| -rwxr-xr-x | foo.cpp | 180 | 
1 files changed, 180 insertions, 0 deletions
| @@ -0,0 +1,180 @@ +#ifndef __APPLE__ +#include <GL/gl.h> +#include <GL/glut.h> +#else +#include <OpenGL/gl.h> +#include <GLUT/glut.h> +#endif +#include <AR/gsub.h> +#include <AR/video.h> +#include <AR/param.h> +#include <AR/ar.h> + +#include <stdexcept> +#include <iostream> + +#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; +} | 
