summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2011-10-20 15:28:49 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2011-10-20 15:28:49 (GMT)
commit09d3cacf9cb3ee0098df6d0ea34dc39b608f6931 (patch)
tree94cdd0c431f87d763826da6db167dc02ef04dd48 /src
parent2b56d31610c1c9be6c09e539cf8e344bc8becbc9 (diff)
downloadpowder-09d3cacf9cb3ee0098df6d0ea34dc39b608f6931.zip
powder-09d3cacf9cb3ee0098df6d0ea34dc39b608f6931.tar.gz
Implement Blur mode and embed shaders
Diffstat (limited to 'src')
-rw-r--r--src/elements/deut.c9
-rw-r--r--src/graphics.c63
2 files changed, 60 insertions, 12 deletions
diff --git a/src/elements/deut.c b/src/elements/deut.c
index 376f5f9..bee3753 100644
--- a/src/elements/deut.c
+++ b/src/elements/deut.c
@@ -73,11 +73,10 @@ int graphics_DEUT(GRAPHICS_FUNC_ARGS)
{
if(parts[i].life>=700)
{
- *firea = 20;
- *firer = *fireg = *fireb = 255;
-
- *pixel_mode |= FIRE_ADD;
- *pixel_mode &= ~PMODE;
+ *colr += parts[i].life*1;
+ *colg += parts[i].life*2;
+ *colb += parts[i].life*3;
+ *pixel_mode |= PMODE_GLOW;
}
else
{
diff --git a/src/graphics.c b/src/graphics.c
index 182df0b..61865d7 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -15,6 +15,7 @@
#include <defines.h>
#include <air.h>
#include <powder.h>
+#define INCLUDE_SHADERS
#include <graphics.h>
#include <powdergraphics.h>
#define INCLUDE_FONTDATA
@@ -26,7 +27,7 @@ unsigned cmode = CM_FIRE;
SDL_Surface *sdl_scrn;
int sdl_scale = 1;
-GLuint vidBuf, airBuf, fireAlpha, glowAlpha, fireProg;
+GLuint vidBuf, airBuf, fireAlpha, glowAlpha, blurAlpha, fireProg;
int sandcolour_r = 0;
int sandcolour_g = 0;
@@ -1824,7 +1825,7 @@ void render_parts(pixel *vid)
// -- END FLAT -- //
}
- if(cglow)
+ if(cglow || cblur)
{
// -- BEGIN GLOW -- //
//Start and prepare fire program
@@ -1846,12 +1847,27 @@ void render_parts(pixel *vid)
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
- glColorPointer(4, GL_FLOAT, 0, &glowC[0]);
- glVertexPointer(2, GL_INT, 0, &glowV[0]);
-
- glDrawArrays(GL_POINTS, 0, cglow);
+ if(cglow)
+ {
+ glColorPointer(4, GL_FLOAT, 0, &glowC[0]);
+ glVertexPointer(2, GL_INT, 0, &glowV[0]);
+
+ glDrawArrays(GL_POINTS, 0, cglow);
+ }
+
+ glPointSize(7.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ if(cblur)
+ {
+ glBindTexture(GL_TEXTURE_2D, blurAlpha);
+
+ glColorPointer(4, GL_FLOAT, 0, &blurC[0]);
+ glVertexPointer(2, GL_INT, 0, &blurV[0]);
+
+ glDrawArrays(GL_POINTS, 0, cblur);
+ }
//Clear some stuff we set
glDisable(GL_POINT_SPRITE);
@@ -2432,6 +2448,7 @@ void prepare_alpha(int size, float intensity)
float temp[CELL*3][CELL*3];
float fire_alphaf[CELL*3][CELL*3];
float glow_alphaf[11][11];
+ float blur_alphaf[7][7];
memset(temp, 0, sizeof(temp));
for (x=0; x<CELL; x++)
for (y=0; y<CELL; y++)
@@ -2482,6 +2499,27 @@ void prepare_alpha(int size, float intensity)
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 11, 11, GL_ALPHA, GL_FLOAT, glow_alphaf);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
+
+ c = 3;
+
+ for (x=-3; x<4; x++)
+ {
+ for (y=-3; y<4; y++)
+ {
+ if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2))
+ blur_alphaf[c+x][c-y] = 0.11f;
+ if (abs(x)+abs(y) <=3 && abs(x)+abs(y))
+ blur_alphaf[c+x][c-y] = 0.08f;
+ if (abs(x)+abs(y) == 2)
+ blur_alphaf[c+x][c-y] = 0.04f;
+ }
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, blurAlpha);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 7, 7, GL_ALPHA, GL_FLOAT, blur_alphaf);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
#endif
}
@@ -3044,6 +3082,17 @@ int sdl_open(void)
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
+
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &blurAlpha);
+ glBindTexture(GL_TEXTURE_2D, blurAlpha);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 7, 7, 0, GL_ALPHA, GL_FLOAT, NULL);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
loadShaders();
#else
@@ -3083,7 +3132,7 @@ int sdl_open(void)
void loadShaders()
{
GLuint vsize, fsize, vertexShader, fragmentShader;
- const char *vertex = file_load("test.vert", &vsize), * fragment = file_load("test.frag", &fsize);
+ //const char *vertex = file_load("test.vert", &vsize), * fragment = file_load("test.frag", &fsize);
vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);