nuclear@5: #include nuclear@5: #include nuclear@16: #include nuclear@5: nuclear@0: #ifndef __APPLE__ nuclear@5: #ifdef WIN32 nuclear@5: #include nuclear@5: #endif nuclear@5: nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: nuclear@5: #include nuclear@5: #include "psys.h" nuclear@5: #include "psys_gl.h" nuclear@0: nuclear@0: void psys_gl_draw_start(struct psys_emitter *em, void *cls) nuclear@0: { nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glDisable(GL_LIGHTING); nuclear@0: nuclear@2: glEnable(GL_BLEND); nuclear@3: glBlendFunc(GL_SRC_ALPHA, GL_ONE); nuclear@2: nuclear@5: if(em->attr.tex) { nuclear@2: glEnable(GL_TEXTURE_2D); nuclear@5: glBindTexture(GL_TEXTURE_2D, em->attr.tex); nuclear@2: } nuclear@2: nuclear@0: glDepthMask(0); nuclear@0: } nuclear@0: nuclear@0: void psys_gl_draw(struct psys_emitter *em, struct psys_particle *p, void *cls) nuclear@0: { nuclear@0: float hsz = p->size / 2.0; nuclear@0: nuclear@20: float xform[16]; nuclear@20: nuclear@20: glMatrixMode(GL_MODELVIEW); nuclear@20: glPushMatrix(); nuclear@20: nuclear@20: glTranslatef(p->pos.x, p->pos.y, p->pos.z); nuclear@20: nuclear@20: glGetFloatv(GL_MODELVIEW_MATRIX, xform); nuclear@20: xform[0] = xform[5] = xform[10] = 1.0; nuclear@20: xform[1] = xform[2] = xform[4] = xform[6] = xform[8] = xform[9] = 0.0; nuclear@20: glLoadMatrixf(xform); nuclear@20: nuclear@20: glBegin(GL_QUADS); nuclear@9: glColor4f(p->color.x, p->color.y, p->color.z, p->alpha); nuclear@9: nuclear@0: glTexCoord2f(0, 0); nuclear@20: glVertex2f(-hsz, -hsz); nuclear@0: nuclear@0: glTexCoord2f(1, 0); nuclear@20: glVertex2f(hsz, -hsz); nuclear@0: nuclear@0: glTexCoord2f(1, 1); nuclear@20: glVertex2f(hsz, hsz); nuclear@0: nuclear@0: glTexCoord2f(0, 1); nuclear@20: glVertex2f(-hsz, hsz); nuclear@20: glEnd(); nuclear@20: nuclear@20: glMatrixMode(GL_MODELVIEW); nuclear@20: glPopMatrix(); nuclear@0: } nuclear@0: nuclear@0: void psys_gl_draw_end(struct psys_emitter *em, void *cls) nuclear@0: { nuclear@0: glDepthMask(1); nuclear@0: glPopAttrib(); nuclear@0: } nuclear@5: nuclear@5: nuclear@5: unsigned int psys_gl_load_texture(const char *fname, void *cls) nuclear@5: { nuclear@5: unsigned int tex; nuclear@5: void *pixels; nuclear@5: int xsz, ysz; nuclear@5: nuclear@5: if(!(pixels = img_load_pixels(fname, &xsz, &ysz, IMG_FMT_RGBA32))) { nuclear@5: return 0; nuclear@5: } nuclear@16: printf("%s: creating texture %s (%dx%d)\n", __func__, fname, xsz, ysz); nuclear@5: nuclear@5: glGenTextures(1, &tex); nuclear@5: glBindTexture(GL_TEXTURE_2D, tex); nuclear@5: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nuclear@5: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@5: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); nuclear@5: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); nuclear@16: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); nuclear@16: nuclear@16: assert(glGetError() == GL_NO_ERROR); nuclear@5: nuclear@5: img_free_pixels(pixels); nuclear@5: return tex; nuclear@5: } nuclear@5: nuclear@5: void psys_gl_unload_texture(unsigned int tex, void *cls) nuclear@5: { nuclear@5: glDeleteTextures(1, &tex); nuclear@5: }