diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-05-12 00:35:55 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-05-12 00:35:55 (GMT) |
| commit | d69fc052fabf38b6691970c38abe4c8525eff3e8 (patch) | |
| tree | 857691fe7d792a8dde25167e134ed3e12ce01f9f /src/graphics.c | |
| parent | d7fa0b139e5a91c3b1d406e63cae4a6ad79d0cd0 (diff) | |
| download | powder-d69fc052fabf38b6691970c38abe4c8525eff3e8.zip powder-d69fc052fabf38b6691970c38abe4c8525eff3e8.tar.gz | |
Fancy motion blur for OpenGL, fix a lot of dialogues in OpenGL, fix gravity lensing in OpenGL, ensure Phot and Neut are PMODE_ADD, not FLAT
Diffstat (limited to 'src/graphics.c')
| -rw-r--r-- | src/graphics.c | 119 |
1 files changed, 109 insertions, 10 deletions
diff --git a/src/graphics.c b/src/graphics.c index d39db8e..1b1e8ce 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -24,8 +24,7 @@ #if defined(OGLR) #ifdef MACOSX -#include <GL/glew.h> -#include <OpenGL/gl.h> +#include <OpenGL/gl3.h> #include <OpenGL/glu.h> #elif defined(WIN32) #include <GL/glew.h> @@ -458,6 +457,7 @@ void clearScreenNP(float alpha) void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale) { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glDrawPixels(w,h,GL_BGRA,GL_UNSIGNED_BYTE,src); //Why does this still think it's ABGR? glEnable( GL_TEXTURE_2D ); glBindTexture(GL_TEXTURE_2D, vidBuf); @@ -475,6 +475,7 @@ void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale) glEnd(); glDisable( GL_TEXTURE_2D ); + glBlendFunc(GL_ONE, GL_ONE); glFlush(); SDL_GL_SwapBuffers (); } @@ -1750,12 +1751,16 @@ GLuint addV[(YRES*XRES)*2]; GLfloat addC[(YRES*XRES)*4]; GLfloat lineV[(((YRES*XRES)*2)*6)]; GLfloat lineC[(((YRES*XRES)*2)*6)]; +GLfloat blurLineV[(((YRES*XRES)*2))]; +GLfloat blurLineC[(((YRES*XRES)*2)*4)]; +GLfloat ablurLineV[(((YRES*XRES)*2))]; +GLfloat ablurLineC[(((YRES*XRES)*2)*4)]; #endif void render_parts(pixel *vid) { int deca, decr, decg, decb, cola, colr, colg, colb, firea, firer, fireg, fireb, pixel_mode, q, i, t, nx, ny, x, y, caddress; int orbd[4] = {0, 0, 0, 0}, orbl[4] = {0, 0, 0, 0}; - float gradv, flicker, fnx, fny; + float gradv, flicker, fnx, fny, flx, fly; #ifdef OGLR int cfireV = 0, cfireC = 0, cfire = 0; int csmokeV = 0, csmokeC = 0, csmoke = 0; @@ -1765,6 +1770,8 @@ void render_parts(pixel *vid) int cflatV = 0, cflatC = 0, cflat = 0; int caddV = 0, caddC = 0, cadd = 0; int clineV = 0, clineC = 0, cline = 0; + int cblurLineV = 0, cblurLineC = 0, cblurLine = 0; + int cablurLineV = 0, cablurLineC = 0, cablurLine = 0; GLuint origBlendSrc, origBlendDst; glGetIntegerv(GL_BLEND_SRC, &origBlendSrc); @@ -1792,6 +1799,8 @@ void render_parts(pixel *vid) ny = (int)(parts[i].y+0.5f); fnx = parts[i].x; fny = parts[i].y; + flx = parts[i].lastX; + fly = parts[i].lastY; if(photons[ny][nx]&0xFF && !(ptypes[t].properties & TYPE_ENERGY)) continue; @@ -2099,6 +2108,65 @@ void render_parts(pixel *vid) draw_line(vid , cplayer->legs[8], cplayer->legs[9], cplayer->legs[12], cplayer->legs[13], legr, legg, legb, s); #endif } +#ifdef OGLR + if((display_mode & DISPLAY_EFFE) && (fabs(fnx-flx)>1.5f || fabs(fny-fly)>1.5f)) + { + if(pixel_mode & PMODE_FLAT) + { + blurLineV[cblurLineV++] = nx; + blurLineV[cblurLineV++] = ny; + blurLineC[cblurLineC++] = ((float)colr)/255.0f; + blurLineC[cblurLineC++] = ((float)colg)/255.0f; + blurLineC[cblurLineC++] = ((float)colb)/255.0f; + blurLineC[cblurLineC++] = 1.0f; + cblurLine++; + + blurLineV[cblurLineV++] = flx; + blurLineV[cblurLineV++] = fly; + blurLineC[cblurLineC++] = ((float)colr)/255.0f; + blurLineC[cblurLineC++] = ((float)colg)/255.0f; + blurLineC[cblurLineC++] = ((float)colb)/255.0f; + blurLineC[cblurLineC++] = 0.0f; + cblurLine++; + } + else if(pixel_mode & PMODE_BLEND) + { + blurLineV[cblurLineV++] = nx; + blurLineV[cblurLineV++] = ny; + blurLineC[cblurLineC++] = ((float)colr)/255.0f; + blurLineC[cblurLineC++] = ((float)colg)/255.0f; + blurLineC[cblurLineC++] = ((float)colb)/255.0f; + blurLineC[cblurLineC++] = ((float)cola)/255.0f; + cblurLine++; + + blurLineV[cblurLineV++] = flx; + blurLineV[cblurLineV++] = fly; + blurLineC[cblurLineC++] = ((float)colr)/255.0f; + blurLineC[cblurLineC++] = ((float)colg)/255.0f; + blurLineC[cblurLineC++] = ((float)colb)/255.0f; + blurLineC[cblurLineC++] = 0.0f; + cblurLine++; + } + else if(pixel_mode & PMODE_ADD) + { + ablurLineV[cablurLineV++] = nx; + ablurLineV[cablurLineV++] = ny; + ablurLineC[cablurLineC++] = ((float)colr)/255.0f; + ablurLineC[cablurLineC++] = ((float)colg)/255.0f; + ablurLineC[cablurLineC++] = ((float)colb)/255.0f; + ablurLineC[cablurLineC++] = ((float)cola)/255.0f; + cablurLine++; + + ablurLineV[cablurLineV++] = flx; + ablurLineV[cablurLineV++] = fly; + ablurLineC[cablurLineC++] = ((float)colr)/255.0f; + ablurLineC[cablurLineC++] = ((float)colg)/255.0f; + ablurLineC[cablurLineC++] = ((float)colb)/255.0f; + ablurLineC[cablurLineC++] = 0.0f; + cablurLine++; + } + } +#endif if(pixel_mode & PMODE_FLAT) { #ifdef OGLR @@ -2546,6 +2614,36 @@ void render_parts(pixel *vid) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if(cablurLine) + { + // -- BEGIN LINES -- // + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable( GL_LINE_SMOOTH ); + glColorPointer(4, GL_FLOAT, 0, &ablurLineC[0]); + glVertexPointer(2, GL_FLOAT, 0, &ablurLineV[0]); + + glDrawArrays(GL_LINES, 0, cablurLine); + + //Clear some stuff we set + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_LINE_SMOOTH); + // -- END LINES -- // + } + if(cblurLine) + { + // -- BEGIN LINES -- // + glEnable( GL_LINE_SMOOTH ); + glColorPointer(4, GL_FLOAT, 0, &blurLineC[0]); + glVertexPointer(2, GL_FLOAT, 0, &blurLineV[0]); + + glDrawArrays(GL_LINES, 0, cblurLine); + + //Clear some stuff we set + glDisable(GL_LINE_SMOOTH); + // -- END LINES -- // + } + if(cflat) { // -- BEGIN FLAT -- // @@ -3310,7 +3408,7 @@ void prepare_alpha(int size, float intensity) for (x=0; x<CELL*3; x++) for (y=0; y<CELL*3; y++) { - fire_alphaf[y][x] = intensity*temp[y][x]/((float)(CELL*CELL)); + fire_alphaf[y][x] = (intensity*temp[y][x]/((float)(CELL*CELL)))/2.0f; } glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, fireAlpha); @@ -3322,6 +3420,7 @@ void prepare_alpha(int size, float intensity) c = 5; + glow_alphaf[c][c] = 0.8f; glow_alphaf[c][c-1] = 0.4f; glow_alphaf[c][c+1] = 0.4f; glow_alphaf[c-1][c] = 0.4f; @@ -3910,18 +4009,18 @@ int sdl_open(void) glEnable(GL_TEXTURE_2D); glGenTextures(1, &partsTFX); glBindTexture(GL_TEXTURE_2D, partsTFX); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, XRES, YRES, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, XRES/CELL, YRES/CELL, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); glGenTextures(1, &partsTFY); glBindTexture(GL_TEXTURE_2D, partsTFY); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, XRES, YRES, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, XRES/CELL, YRES/CELL, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); |
