dungeon_crawler

annotate prototype/psys/psys_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 45172d087ebe
rev   line source
nuclear@67 1 #include <string.h>
nuclear@67 2 #include <errno.h>
nuclear@67 3 #include <assert.h>
nuclear@67 4
nuclear@67 5 #ifndef __APPLE__
nuclear@67 6 #ifdef WIN32
nuclear@67 7 #include <windows.h>
nuclear@67 8 #endif
nuclear@67 9
nuclear@67 10 #include <GL/gl.h>
nuclear@67 11 #else
nuclear@67 12 #include <OpenGL/gl.h>
nuclear@67 13 #endif
nuclear@67 14
nuclear@67 15 #include <imago2.h>
nuclear@67 16 #include "psys.h"
nuclear@67 17 #include "psys_gl.h"
nuclear@67 18
nuclear@67 19 void psys_gl_draw_start(struct psys_emitter *em, void *cls)
nuclear@67 20 {
nuclear@67 21 glPushAttrib(GL_ENABLE_BIT);
nuclear@67 22 glDisable(GL_LIGHTING);
nuclear@67 23
nuclear@67 24 glEnable(GL_BLEND);
nuclear@67 25 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
nuclear@67 26
nuclear@67 27 if(em->attr.tex) {
nuclear@67 28 glEnable(GL_TEXTURE_2D);
nuclear@67 29 glBindTexture(GL_TEXTURE_2D, em->attr.tex);
nuclear@67 30 }
nuclear@67 31
nuclear@67 32 glDepthMask(0);
nuclear@67 33 }
nuclear@67 34
nuclear@67 35 void psys_gl_draw(struct psys_emitter *em, struct psys_particle *p, void *cls)
nuclear@67 36 {
nuclear@67 37 float hsz = p->size / 2.0;
nuclear@67 38
nuclear@67 39 float xform[16];
nuclear@67 40
nuclear@67 41 glMatrixMode(GL_MODELVIEW);
nuclear@67 42 glPushMatrix();
nuclear@67 43
nuclear@67 44 glTranslatef(p->pos.x, p->pos.y, p->pos.z);
nuclear@67 45
nuclear@67 46 glGetFloatv(GL_MODELVIEW_MATRIX, xform);
nuclear@67 47 xform[0] = xform[5] = xform[10] = 1.0;
nuclear@67 48 xform[1] = xform[2] = xform[4] = xform[6] = xform[8] = xform[9] = 0.0;
nuclear@67 49 glLoadMatrixf(xform);
nuclear@67 50
nuclear@67 51 glBegin(GL_QUADS);
nuclear@67 52 glColor4f(p->color.x, p->color.y, p->color.z, p->alpha);
nuclear@67 53
nuclear@67 54 glTexCoord2f(0, 0);
nuclear@67 55 glVertex2f(-hsz, -hsz);
nuclear@67 56
nuclear@67 57 glTexCoord2f(1, 0);
nuclear@67 58 glVertex2f(hsz, -hsz);
nuclear@67 59
nuclear@67 60 glTexCoord2f(1, 1);
nuclear@67 61 glVertex2f(hsz, hsz);
nuclear@67 62
nuclear@67 63 glTexCoord2f(0, 1);
nuclear@67 64 glVertex2f(-hsz, hsz);
nuclear@67 65 glEnd();
nuclear@67 66
nuclear@67 67 glMatrixMode(GL_MODELVIEW);
nuclear@67 68 glPopMatrix();
nuclear@67 69 }
nuclear@67 70
nuclear@67 71 void psys_gl_draw_end(struct psys_emitter *em, void *cls)
nuclear@67 72 {
nuclear@67 73 glDepthMask(1);
nuclear@67 74 glPopAttrib();
nuclear@67 75 }
nuclear@67 76
nuclear@67 77
nuclear@67 78 unsigned int psys_gl_load_texture(const char *fname, void *cls)
nuclear@67 79 {
nuclear@67 80 unsigned int tex;
nuclear@67 81 void *pixels;
nuclear@67 82 int xsz, ysz;
nuclear@67 83
nuclear@67 84 if(!(pixels = img_load_pixels(fname, &xsz, &ysz, IMG_FMT_RGBA32))) {
nuclear@67 85 return 0;
nuclear@67 86 }
nuclear@67 87 printf("%s: creating texture %s (%dx%d)\n", __func__, fname, xsz, ysz);
nuclear@67 88
nuclear@67 89 glGenTextures(1, &tex);
nuclear@67 90 glBindTexture(GL_TEXTURE_2D, tex);
nuclear@67 91 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
nuclear@67 92 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
nuclear@67 93 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
nuclear@67 94 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
nuclear@67 95 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
nuclear@67 96
nuclear@67 97 assert(glGetError() == GL_NO_ERROR);
nuclear@67 98
nuclear@67 99 img_free_pixels(pixels);
nuclear@67 100 return tex;
nuclear@67 101 }
nuclear@67 102
nuclear@67 103 void psys_gl_unload_texture(unsigned int tex, void *cls)
nuclear@67 104 {
nuclear@67 105 glDeleteTextures(1, &tex);
nuclear@67 106 }