stereoimg

annotate src/stereoimg.c @ 1:552f59cf0f73

ops
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 14 Jun 2012 00:32:58 +0300
parents b2a2a355b633
children
rev   line source
nuclear@0 1 /*
nuclear@0 2 Stereoimg - an OpenGL stereoscopic image viewer.
nuclear@0 3 Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org>
nuclear@0 4
nuclear@0 5 This program is free software: you can redistribute it and/or modify
nuclear@0 6 it under the terms of the GNU General Public License as published by
nuclear@0 7 the Free Software Foundation, either version 3 of the License, or
nuclear@0 8 (at your option) any later version.
nuclear@0 9
nuclear@0 10 This program is distributed in the hope that it will be useful,
nuclear@0 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@0 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@0 13 GNU General Public License for more details.
nuclear@0 14
nuclear@0 15 You should have received a copy of the GNU General Public License
nuclear@0 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@0 17 */
nuclear@0 18
nuclear@0 19 #include <stdio.h>
nuclear@0 20 #include <stdlib.h>
nuclear@0 21 #include <assert.h>
nuclear@0 22
nuclear@0 23 #ifndef __APPLE__
nuclear@0 24 #include <GL/glut.h>
nuclear@0 25 #else
nuclear@0 26 #include <GLUT/glut.h>
nuclear@0 27 #endif
nuclear@0 28
nuclear@0 29 #include <imago2.h>
nuclear@0 30
nuclear@0 31 struct imgnode {
nuclear@0 32 char *name;
nuclear@0 33 int width, height;
nuclear@0 34 unsigned int tex;
nuclear@0 35 int swap;
nuclear@0 36
nuclear@0 37 struct imgnode *next;
nuclear@0 38 };
nuclear@0 39
nuclear@0 40 void show_image(struct imgnode *node);
nuclear@0 41 void disp(void);
nuclear@0 42 void reshape(int x, int y);
nuclear@0 43 void keyb(unsigned char key, int x, int y);
nuclear@0 44 int parse_args(int argc, char **argv);
nuclear@0 45
nuclear@0 46
nuclear@0 47 struct imgnode *imglist;
nuclear@0 48 int swap_eyes;
nuclear@0 49
nuclear@0 50
nuclear@0 51 int main(int argc, char **argv)
nuclear@0 52 {
nuclear@0 53 glutInit(&argc, argv);
nuclear@1 54 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_STEREO);
nuclear@0 55 glutInitWindowSize(128, 128);
nuclear@0 56 glutCreateWindow("stereo image viewer");
nuclear@0 57
nuclear@0 58 if(parse_args(argc, argv) == -1) {
nuclear@0 59 return 1;
nuclear@0 60 }
nuclear@0 61
nuclear@0 62 glutDisplayFunc(disp);
nuclear@0 63 glutReshapeFunc(reshape);
nuclear@0 64 glutKeyboardFunc(keyb);
nuclear@0 65 glutIdleFunc(glutPostRedisplay);
nuclear@0 66
nuclear@0 67 glEnable(GL_TEXTURE_2D);
nuclear@0 68 show_image(imglist);
nuclear@0 69
nuclear@0 70 glutMainLoop();
nuclear@0 71 return 0;
nuclear@0 72 }
nuclear@0 73
nuclear@0 74
nuclear@0 75 void show_image(struct imgnode *node)
nuclear@0 76 {
nuclear@0 77 glutReshapeWindow(node->width / 2, node->height);
nuclear@0 78 glutSetWindowTitle(node->name);
nuclear@0 79
nuclear@0 80 glBindTexture(GL_TEXTURE_2D, node->tex);
nuclear@0 81
nuclear@0 82 swap_eyes = node->swap;
nuclear@0 83 }
nuclear@0 84
nuclear@0 85 void disp(void)
nuclear@0 86 {
nuclear@0 87 glDrawBuffer(swap_eyes ? GL_BACK_RIGHT : GL_BACK_LEFT);
nuclear@0 88 glClear(GL_COLOR_BUFFER_BIT);
nuclear@0 89
nuclear@0 90 glBegin(GL_QUADS);
nuclear@0 91 glColor3f(1, 1, 1);
nuclear@0 92 glTexCoord2f(0, 1); glVertex2f(-1, -1);
nuclear@0 93 glTexCoord2f(0.5, 1); glVertex2f(1, -1);
nuclear@0 94 glTexCoord2f(0.5, 0); glVertex2f(1, 1);
nuclear@0 95 glTexCoord2f(0, 0); glVertex2f(-1, 1);
nuclear@0 96 glEnd();
nuclear@0 97
nuclear@0 98 glDrawBuffer(swap_eyes ? GL_BACK_LEFT : GL_BACK_RIGHT);
nuclear@0 99 glClear(GL_COLOR_BUFFER_BIT);
nuclear@0 100
nuclear@0 101 glBegin(GL_QUADS);
nuclear@0 102 glColor3f(1, 1, 1);
nuclear@0 103 glTexCoord2f(0.5, 1); glVertex2f(-1, -1);
nuclear@0 104 glTexCoord2f(1, 1); glVertex2f(1, -1);
nuclear@0 105 glTexCoord2f(1, 0); glVertex2f(1, 1);
nuclear@0 106 glTexCoord2f(0.5, 0); glVertex2f(-1, 1);
nuclear@0 107 glEnd();
nuclear@0 108
nuclear@0 109 glutSwapBuffers();
nuclear@0 110 assert(glGetError() == GL_NO_ERROR);
nuclear@0 111 }
nuclear@0 112
nuclear@0 113 void reshape(int x, int y)
nuclear@0 114 {
nuclear@0 115 glViewport(0, 0, x, y);
nuclear@0 116 }
nuclear@0 117
nuclear@0 118 void keyb(unsigned char key, int x, int y)
nuclear@0 119 {
nuclear@0 120 switch(key) {
nuclear@0 121 case 's':
nuclear@0 122 swap_eyes = !swap_eyes;
nuclear@0 123 glutPostRedisplay();
nuclear@0 124 break;
nuclear@0 125
nuclear@0 126 case ' ':
nuclear@0 127 imglist = imglist->next;
nuclear@0 128 show_image(imglist);
nuclear@0 129 glutPostRedisplay();
nuclear@0 130 break;
nuclear@0 131
nuclear@0 132 case 27:
nuclear@0 133 case 'q':
nuclear@0 134 exit(0);
nuclear@0 135
nuclear@0 136 default:
nuclear@0 137 break;
nuclear@0 138 }
nuclear@0 139 }
nuclear@0 140
nuclear@0 141 int parse_args(int argc, char **argv)
nuclear@0 142 {
nuclear@0 143 int i, cur_swap = 0;
nuclear@0 144 struct imgnode *node;
nuclear@0 145 struct imgnode *head = 0, *tail = 0;
nuclear@0 146
nuclear@0 147 for(i=1; i<argc; i++) {
nuclear@0 148 if(argv[i][0] == '-' && argv[i][2] == 0) {
nuclear@0 149 switch(argv[i][1]) {
nuclear@0 150 case 's':
nuclear@0 151 cur_swap = !cur_swap;
nuclear@0 152 break;
nuclear@0 153
nuclear@0 154 default:
nuclear@0 155 fprintf(stderr, "invalid option: %s\n", argv[i]);
nuclear@0 156 return -1;
nuclear@0 157 }
nuclear@0 158 } else {
nuclear@0 159 int xsz, ysz;
nuclear@0 160 void *pix;
nuclear@0 161 unsigned int tex;
nuclear@0 162
nuclear@0 163 if(!(pix = img_load_pixels(argv[i], &xsz, &ysz, IMG_FMT_RGBA32))) {
nuclear@0 164 fprintf(stderr, "failed to open image: %s\n", argv[i]);
nuclear@0 165 return -1;
nuclear@0 166 }
nuclear@0 167 glGenTextures(1, &tex);
nuclear@0 168 glBindTexture(GL_TEXTURE_2D, tex);
nuclear@0 169 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
nuclear@0 170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
nuclear@0 171 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
nuclear@0 172 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
nuclear@0 173 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pix);
nuclear@0 174 img_free_pixels(pix);
nuclear@0 175
nuclear@0 176 if(!(node = malloc(sizeof *node))) {
nuclear@0 177 perror("failed to allocate image node");
nuclear@0 178 return -1;
nuclear@0 179 }
nuclear@0 180 node->name = argv[i];
nuclear@0 181 node->width = xsz;
nuclear@0 182 node->height = ysz;
nuclear@0 183 node->tex = tex;
nuclear@0 184 node->swap = cur_swap;
nuclear@0 185 node->next = 0;
nuclear@0 186
nuclear@0 187 if(head) {
nuclear@0 188 tail->next = node;
nuclear@0 189 tail = node;
nuclear@0 190 } else {
nuclear@0 191 head = tail = node;
nuclear@0 192 }
nuclear@0 193 }
nuclear@0 194 }
nuclear@0 195
nuclear@0 196 if(!head) {
nuclear@0 197 fprintf(stderr, "you must specify one or more images to open\n");
nuclear@0 198 return -1;
nuclear@0 199 }
nuclear@0 200 tail->next = head;
nuclear@0 201 imglist = head;
nuclear@0 202 return 0;
nuclear@0 203 }