dungeon_crawler

annotate prototype/imago2/imago_gl.c @ 67:2560a7ab0243

internalized libanim, libimago2, and libpsys
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 07 Oct 2012 02:04:00 +0300
parents
children
rev   line source
nuclear@67 1 #include "imago2.h"
nuclear@67 2
nuclear@67 3
nuclear@67 4 /* to avoid dependency to OpenGL, I'll define all the relevant GL macros manually */
nuclear@67 5 #define GL_UNSIGNED_BYTE 0x1401
nuclear@67 6 #define GL_FLOAT 0x1406
nuclear@67 7
nuclear@67 8 #define GL_LUMINANCE 0x1909
nuclear@67 9 #define GL_RGB 0x1907
nuclear@67 10 #define GL_RGBA 0x1908
nuclear@67 11
nuclear@67 12 #define GL_RGBA32F 0x8814
nuclear@67 13 #define GL_RGB32F 0x8815
nuclear@67 14 #define GL_LUMINANCE32F 0x8818
nuclear@67 15
nuclear@67 16 #define GL_TEXTURE_2D 0x0de1
nuclear@67 17 #define GL_TEXTURE_WRAP_S 0x2802
nuclear@67 18 #define GL_TEXTURE_WRAP_T 0x2803
nuclear@67 19 #define GL_TEXTURE_MAG_FILTER 0x2800
nuclear@67 20 #define GL_TEXTURE_MIN_FILTER 0x2801
nuclear@67 21 #define GL_LINEAR 0x2601
nuclear@67 22 #define GL_REPEAT 0x2901
nuclear@67 23
nuclear@67 24
nuclear@67 25 typedef unsigned int GLenum;
nuclear@67 26 typedef unsigned int GLuint;
nuclear@67 27 typedef int GLint;
nuclear@67 28 typedef int GLsizei;
nuclear@67 29 typedef void GLvoid;
nuclear@67 30
nuclear@67 31 /* for the same reason I'll load GL functions dynamically */
nuclear@67 32 typedef void (*gl_gen_textures_func)(GLsizei, GLuint*);
nuclear@67 33 typedef void (*gl_bind_texture_func)(GLenum, GLuint);
nuclear@67 34 typedef void (*gl_tex_parameteri_func)(GLenum, GLenum, GLint);
nuclear@67 35 typedef void (*gl_tex_image2d_func)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*);
nuclear@67 36
nuclear@67 37 static gl_gen_textures_func gl_gen_textures;
nuclear@67 38 static gl_bind_texture_func gl_bind_texture;
nuclear@67 39 static gl_tex_parameteri_func gl_tex_parameteri;
nuclear@67 40 static gl_tex_image2d_func gl_tex_image2d;
nuclear@67 41
nuclear@67 42 static int load_glfunc(void);
nuclear@67 43
nuclear@67 44 unsigned int img_fmt_glfmt(enum img_fmt fmt)
nuclear@67 45 {
nuclear@67 46 switch(fmt) {
nuclear@67 47 case IMG_FMT_GREY8:
nuclear@67 48 case IMG_FMT_GREYF:
nuclear@67 49 return GL_LUMINANCE;
nuclear@67 50
nuclear@67 51 case IMG_FMT_RGB24:
nuclear@67 52 case IMG_FMT_RGBF:
nuclear@67 53 return GL_RGB;
nuclear@67 54
nuclear@67 55 case IMG_FMT_RGBA32:
nuclear@67 56 case IMG_FMT_RGBAF:
nuclear@67 57 return GL_RGBA;
nuclear@67 58
nuclear@67 59 default:
nuclear@67 60 break;
nuclear@67 61 }
nuclear@67 62 return 0;
nuclear@67 63 }
nuclear@67 64
nuclear@67 65 unsigned int img_fmt_gltype(enum img_fmt fmt)
nuclear@67 66 {
nuclear@67 67 switch(fmt) {
nuclear@67 68 case IMG_FMT_GREY8:
nuclear@67 69 case IMG_FMT_RGB24:
nuclear@67 70 case IMG_FMT_RGBA32:
nuclear@67 71 return GL_UNSIGNED_BYTE;
nuclear@67 72
nuclear@67 73 case IMG_FMT_GREYF:
nuclear@67 74 case IMG_FMT_RGBF:
nuclear@67 75 case IMG_FMT_RGBAF:
nuclear@67 76 return GL_FLOAT;
nuclear@67 77
nuclear@67 78 default:
nuclear@67 79 break;
nuclear@67 80 }
nuclear@67 81 return 0;
nuclear@67 82 }
nuclear@67 83
nuclear@67 84 unsigned int img_fmt_glintfmt(enum img_fmt fmt)
nuclear@67 85 {
nuclear@67 86 switch(fmt) {
nuclear@67 87 case IMG_FMT_GREY8:
nuclear@67 88 return GL_LUMINANCE;
nuclear@67 89 case IMG_FMT_RGB24:
nuclear@67 90 return GL_RGB;
nuclear@67 91 case IMG_FMT_RGBA32:
nuclear@67 92 return GL_RGBA;
nuclear@67 93 case IMG_FMT_GREYF:
nuclear@67 94 return GL_LUMINANCE32F;
nuclear@67 95 case IMG_FMT_RGBF:
nuclear@67 96 return GL_RGB32F;
nuclear@67 97 case IMG_FMT_RGBAF:
nuclear@67 98 return GL_RGBA32F;
nuclear@67 99 default:
nuclear@67 100 break;
nuclear@67 101 }
nuclear@67 102 return 0;
nuclear@67 103 }
nuclear@67 104
nuclear@67 105 unsigned int img_glfmt(struct img_pixmap *img)
nuclear@67 106 {
nuclear@67 107 return img_fmt_glfmt(img->fmt);
nuclear@67 108 }
nuclear@67 109
nuclear@67 110 unsigned int img_gltype(struct img_pixmap *img)
nuclear@67 111 {
nuclear@67 112 return img_fmt_gltype(img->fmt);
nuclear@67 113 }
nuclear@67 114
nuclear@67 115 unsigned int img_glintfmt(struct img_pixmap *img)
nuclear@67 116 {
nuclear@67 117 return img_fmt_glintfmt(img->fmt);
nuclear@67 118 }
nuclear@67 119
nuclear@67 120 unsigned int img_gltexture(struct img_pixmap *img)
nuclear@67 121 {
nuclear@67 122 unsigned int tex;
nuclear@67 123 unsigned int intfmt, fmt, type;
nuclear@67 124
nuclear@67 125 if(!gl_gen_textures) {
nuclear@67 126 if(load_glfunc() == -1) {
nuclear@67 127 fprintf(stderr, "imago: failed to initialize the OpenGL helpers\n");
nuclear@67 128 return 0;
nuclear@67 129 }
nuclear@67 130 }
nuclear@67 131
nuclear@67 132 intfmt = img_glintfmt(img);
nuclear@67 133 fmt = img_glfmt(img);
nuclear@67 134 type = img_gltype(img);
nuclear@67 135
nuclear@67 136 gl_gen_textures(1, &tex);
nuclear@67 137 gl_bind_texture(GL_TEXTURE_2D, tex);
nuclear@67 138 gl_tex_parameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
nuclear@67 139 gl_tex_parameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
nuclear@67 140 gl_tex_parameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
nuclear@67 141 gl_tex_parameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
nuclear@67 142 gl_tex_image2d(GL_TEXTURE_2D, 0, intfmt, img->width, img->height, 0, fmt, type, img->pixels);
nuclear@67 143 return tex;
nuclear@67 144 }
nuclear@67 145
nuclear@67 146 unsigned int img_gltexture_load(const char *fname)
nuclear@67 147 {
nuclear@67 148 struct img_pixmap img;
nuclear@67 149 unsigned int tex;
nuclear@67 150
nuclear@67 151 img_init(&img);
nuclear@67 152 if(img_load(&img, fname) == -1) {
nuclear@67 153 img_destroy(&img);
nuclear@67 154 return 0;
nuclear@67 155 }
nuclear@67 156
nuclear@67 157 tex = img_gltexture(&img);
nuclear@67 158 img_destroy(&img);
nuclear@67 159 return tex;
nuclear@67 160 }
nuclear@67 161
nuclear@67 162 unsigned int img_gltexture_read_file(FILE *fp)
nuclear@67 163 {
nuclear@67 164 struct img_pixmap img;
nuclear@67 165 unsigned int tex;
nuclear@67 166
nuclear@67 167 img_init(&img);
nuclear@67 168 if(img_read_file(&img, fp) == -1) {
nuclear@67 169 img_destroy(&img);
nuclear@67 170 return 0;
nuclear@67 171 }
nuclear@67 172
nuclear@67 173 tex = img_gltexture(&img);
nuclear@67 174 img_destroy(&img);
nuclear@67 175 return tex;
nuclear@67 176 }
nuclear@67 177
nuclear@67 178 unsigned int img_gltexture_read(struct img_io *io)
nuclear@67 179 {
nuclear@67 180 struct img_pixmap img;
nuclear@67 181 unsigned int tex;
nuclear@67 182
nuclear@67 183 img_init(&img);
nuclear@67 184 if(img_read(&img, io) == -1) {
nuclear@67 185 img_destroy(&img);
nuclear@67 186 return 0;
nuclear@67 187 }
nuclear@67 188
nuclear@67 189 tex = img_gltexture(&img);
nuclear@67 190 img_destroy(&img);
nuclear@67 191 return tex;
nuclear@67 192 }
nuclear@67 193
nuclear@67 194 #if defined(__unix__) || defined(__APPLE__)
nuclear@67 195 #ifndef __USE_GNU
nuclear@67 196 #define __USE_GNU
nuclear@67 197 #endif
nuclear@67 198
nuclear@67 199 #include <dlfcn.h>
nuclear@67 200 #endif
nuclear@67 201 #ifdef WIN32
nuclear@67 202 #include <windows.h>
nuclear@67 203 #endif
nuclear@67 204
nuclear@67 205 static int load_glfunc(void)
nuclear@67 206 {
nuclear@67 207 #if defined(__unix__) || defined(__APPLE__)
nuclear@67 208 gl_gen_textures = (gl_gen_textures_func)dlsym(RTLD_DEFAULT, "glGenTextures");
nuclear@67 209 gl_bind_texture = (gl_bind_texture_func)dlsym(RTLD_DEFAULT, "glBindTexture");
nuclear@67 210 gl_tex_parameteri = (gl_tex_parameteri_func)dlsym(RTLD_DEFAULT, "glTexParameteri");
nuclear@67 211 gl_tex_image2d = (gl_tex_image2d_func)dlsym(RTLD_DEFAULT, "glTexImage2D");
nuclear@67 212 #endif
nuclear@67 213
nuclear@67 214 #ifdef WIN32
nuclear@67 215 HMODULE handle = GetModuleHandle(0);
nuclear@67 216 gl_gen_textures = (gl_gen_textures_func)GetProcAddress(handle, "glGenTextures");
nuclear@67 217 gl_bind_texture = (gl_bind_texture_func)GetProcAddress(handle, "glBindTexture");
nuclear@67 218 gl_tex_parameteri = (gl_tex_parameteri_func)GetProcAddress(handle, "glTexParameteri");
nuclear@67 219 gl_tex_image2d = (gl_tex_image2d_func)GetProcAddress(handle, "glTexImage2D");
nuclear@67 220 #endif
nuclear@67 221
nuclear@67 222 return (gl_gen_textures && gl_bind_texture && gl_tex_parameteri && gl_tex_image2d) ? 0 : -1;
nuclear@67 223 }