nuclear@2: /* nuclear@2: Stereoscopic tunnel for iOS. nuclear@24: Copyright (C) 2011-2015 John Tsiombikas nuclear@2: nuclear@2: This program is free software: you can redistribute it and/or modify nuclear@2: it under the terms of the GNU General Public License as published by nuclear@2: the Free Software Foundation, either version 3 of the License, or nuclear@2: (at your option) any later version. nuclear@2: nuclear@2: This program is distributed in the hope that it will be useful, nuclear@2: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@2: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@2: GNU General Public License for more details. nuclear@2: nuclear@2: You should have received a copy of the GNU General Public License nuclear@2: along with this program. If not, see . nuclear@2: */ nuclear@2: nuclear@2: #include nuclear@2: #include nuclear@2: #include nuclear@2: #include nuclear@2: #include "opengl.h" nuclear@2: #include "tex.h" nuclear@2: #include "config.h" nuclear@2: #include "imago2.h" nuclear@24: #include "assman.h" nuclear@24: nuclear@24: static size_t ioread(void *buf, size_t bytes, void *uptr); nuclear@24: static long ioseek(long offs, int whence, void *uptr); nuclear@2: nuclear@2: unsigned int load_texture(const char *fname) nuclear@2: { nuclear@2: unsigned int tex; nuclear@24: ass_file *fp; nuclear@24: struct img_io io; nuclear@24: struct img_pixmap img; nuclear@2: nuclear@2: if(!fname) { nuclear@2: return 0; nuclear@2: } nuclear@24: if(!(fp = ass_fopen(fname, "rb"))) { nuclear@24: fprintf(stderr, "failed to open texture file: %s: %s\n", fname, strerror(errno)); nuclear@2: return 0; nuclear@2: } nuclear@24: io.uptr = fp; nuclear@24: io.read = ioread; nuclear@24: io.write = 0; nuclear@24: io.seek = ioseek; nuclear@24: nuclear@24: img_init(&img); nuclear@24: if(img_read(&img, &io) == -1) { nuclear@24: fprintf(stderr, "failed to load image: %s\n", fname); nuclear@24: ass_fclose(fp); nuclear@24: return 0; nuclear@24: } nuclear@24: ass_fclose(fp); nuclear@24: img_convert(&img, IMG_FMT_RGBA32); nuclear@2: nuclear@2: glGenTextures(1, &tex); nuclear@2: glBindTexture(GL_TEXTURE_2D, tex); nuclear@2: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); nuclear@2: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); nuclear@24: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); nuclear@2: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@24: nuclear@24: #ifdef __GLEW_H__ nuclear@24: if(GLEW_SGIS_generate_mipmap) { nuclear@24: glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); nuclear@24: #endif nuclear@24: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width, img.height, 0, nuclear@24: GL_RGBA, GL_UNSIGNED_BYTE, img.pixels); nuclear@24: #ifdef __GLEW_H__ nuclear@24: } else { nuclear@24: gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, img.width, img.height, nuclear@24: GL_RGBA, GL_UNSIGNED_BYTE, img.pixels); nuclear@24: } nuclear@24: #endif nuclear@24: nuclear@24: #ifdef GL_ES_VERSION_2_0 nuclear@24: glGenerateMipmap(GL_TEXTURE_2D); nuclear@24: #endif nuclear@24: img_destroy(&img); nuclear@2: nuclear@2: return tex; nuclear@2: } nuclear@2: nuclear@2: void bind_texture(unsigned int tex, int unit) nuclear@2: { nuclear@2: glActiveTexture(GL_TEXTURE0 + unit); nuclear@2: nuclear@24: #ifndef GL_ES_VERSION_2_0 nuclear@2: if(tex) { nuclear@2: glEnable(GL_TEXTURE_2D); nuclear@2: } else { nuclear@2: glDisable(GL_TEXTURE_2D); nuclear@2: } nuclear@2: #endif nuclear@2: nuclear@2: glBindTexture(GL_TEXTURE_2D, tex); nuclear@2: } nuclear@24: nuclear@24: static size_t ioread(void *buf, size_t bytes, void *uptr) nuclear@24: { nuclear@24: return ass_fread(buf, 1, bytes, uptr); nuclear@24: } nuclear@24: nuclear@24: static long ioseek(long offs, int whence, void *uptr) nuclear@24: { nuclear@24: return ass_fseek(uptr, offs, whence); nuclear@24: }