summaryrefslogtreecommitdiff
path: root/foo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'foo.cpp')
-rwxr-xr-xfoo.cpp180
1 files changed, 180 insertions, 0 deletions
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 <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;
+}