summaryrefslogtreecommitdiff
path: root/src/graphics.c
diff options
context:
space:
mode:
authorSimon 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)
commitd69fc052fabf38b6691970c38abe4c8525eff3e8 (patch)
tree857691fe7d792a8dde25167e134ed3e12ce01f9f /src/graphics.c
parentd7fa0b139e5a91c3b1d406e63cae4a6ad79d0cd0 (diff)
downloadpowder-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.c119
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);