nuclear@0: /* nuclear@0: Stereoimg - an OpenGL stereoscopic image viewer. nuclear@0: Copyright (C) 2011 John Tsiombikas nuclear@0: nuclear@0: This program is free software: you can redistribute it and/or modify nuclear@0: it under the terms of the GNU General Public License as published by nuclear@0: the Free Software Foundation, either version 3 of the License, or nuclear@0: (at your option) any later version. nuclear@0: nuclear@0: This program is distributed in the hope that it will be useful, nuclear@0: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@0: GNU General Public License for more details. nuclear@0: nuclear@0: You should have received a copy of the GNU General Public License nuclear@0: along with this program. If not, see . nuclear@0: */ nuclear@0: nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #ifndef __APPLE__ nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: nuclear@0: #include nuclear@0: nuclear@0: struct imgnode { nuclear@0: char *name; nuclear@0: int width, height; nuclear@0: unsigned int tex; nuclear@0: int swap; nuclear@0: nuclear@0: struct imgnode *next; nuclear@0: }; nuclear@0: nuclear@0: void show_image(struct imgnode *node); nuclear@0: void disp(void); nuclear@0: void reshape(int x, int y); nuclear@0: void keyb(unsigned char key, int x, int y); nuclear@0: int parse_args(int argc, char **argv); nuclear@0: nuclear@0: nuclear@0: struct imgnode *imglist; nuclear@0: int swap_eyes; nuclear@0: nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: glutInit(&argc, argv); nuclear@0: glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);// | GLUT_STEREO); nuclear@0: glutInitWindowSize(128, 128); nuclear@0: glutCreateWindow("stereo image viewer"); nuclear@0: nuclear@0: if(parse_args(argc, argv) == -1) { nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: glutDisplayFunc(disp); nuclear@0: glutReshapeFunc(reshape); nuclear@0: glutKeyboardFunc(keyb); nuclear@0: glutIdleFunc(glutPostRedisplay); nuclear@0: nuclear@0: glEnable(GL_TEXTURE_2D); nuclear@0: show_image(imglist); nuclear@0: nuclear@0: glutMainLoop(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void show_image(struct imgnode *node) nuclear@0: { nuclear@0: glutReshapeWindow(node->width / 2, node->height); nuclear@0: glutSetWindowTitle(node->name); nuclear@0: nuclear@0: glBindTexture(GL_TEXTURE_2D, node->tex); nuclear@0: nuclear@0: swap_eyes = node->swap; nuclear@0: } nuclear@0: nuclear@0: void disp(void) nuclear@0: { nuclear@0: glDrawBuffer(swap_eyes ? GL_BACK_RIGHT : GL_BACK_LEFT); nuclear@0: glClear(GL_COLOR_BUFFER_BIT); nuclear@0: nuclear@0: glBegin(GL_QUADS); nuclear@0: glColor3f(1, 1, 1); nuclear@0: glTexCoord2f(0, 1); glVertex2f(-1, -1); nuclear@0: glTexCoord2f(0.5, 1); glVertex2f(1, -1); nuclear@0: glTexCoord2f(0.5, 0); glVertex2f(1, 1); nuclear@0: glTexCoord2f(0, 0); glVertex2f(-1, 1); nuclear@0: glEnd(); nuclear@0: nuclear@0: glDrawBuffer(swap_eyes ? GL_BACK_LEFT : GL_BACK_RIGHT); nuclear@0: glClear(GL_COLOR_BUFFER_BIT); nuclear@0: nuclear@0: glBegin(GL_QUADS); nuclear@0: glColor3f(1, 1, 1); nuclear@0: glTexCoord2f(0.5, 1); glVertex2f(-1, -1); nuclear@0: glTexCoord2f(1, 1); glVertex2f(1, -1); nuclear@0: glTexCoord2f(1, 0); glVertex2f(1, 1); nuclear@0: glTexCoord2f(0.5, 0); glVertex2f(-1, 1); nuclear@0: glEnd(); nuclear@0: nuclear@0: glutSwapBuffers(); nuclear@0: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@0: nuclear@0: void reshape(int x, int y) nuclear@0: { nuclear@0: glViewport(0, 0, x, y); nuclear@0: } nuclear@0: nuclear@0: void keyb(unsigned char key, int x, int y) nuclear@0: { nuclear@0: switch(key) { nuclear@0: case 's': nuclear@0: swap_eyes = !swap_eyes; nuclear@0: glutPostRedisplay(); nuclear@0: break; nuclear@0: nuclear@0: case ' ': nuclear@0: imglist = imglist->next; nuclear@0: show_image(imglist); nuclear@0: glutPostRedisplay(); nuclear@0: break; nuclear@0: nuclear@0: case 27: nuclear@0: case 'q': nuclear@0: exit(0); nuclear@0: nuclear@0: default: nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: int parse_args(int argc, char **argv) nuclear@0: { nuclear@0: int i, cur_swap = 0; nuclear@0: struct imgnode *node; nuclear@0: struct imgnode *head = 0, *tail = 0; nuclear@0: nuclear@0: for(i=1; iname = argv[i]; nuclear@0: node->width = xsz; nuclear@0: node->height = ysz; nuclear@0: node->tex = tex; nuclear@0: node->swap = cur_swap; nuclear@0: node->next = 0; nuclear@0: nuclear@0: if(head) { nuclear@0: tail->next = node; nuclear@0: tail = node; nuclear@0: } else { nuclear@0: head = tail = node; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(!head) { nuclear@0: fprintf(stderr, "you must specify one or more images to open\n"); nuclear@0: return -1; nuclear@0: } nuclear@0: tail->next = head; nuclear@0: imglist = head; nuclear@0: return 0; nuclear@0: }