summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2011-10-22 16:33:04 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2011-10-22 16:33:04 (GMT)
commitba59ba8b7c9fc12ba9ff349c1d35d73fbfc54624 (patch)
tree55644ba4e46f161b22c6ea7cff8269283f7d8d83 /src
parentabb1a12271d8e8cf92af1ad67bff44664e766a95 (diff)
downloadpowder-ba59ba8b7c9fc12ba9ff349c1d35d73fbfc54624.zip
powder-ba59ba8b7c9fc12ba9ff349c1d35d73fbfc54624.tar.gz
Fix Air vel display
Diffstat (limited to 'src')
-rw-r--r--src/graphics.c93
1 files changed, 77 insertions, 16 deletions
diff --git a/src/graphics.c b/src/graphics.c
index 9b94fae..e3a27c7 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -27,7 +27,7 @@ unsigned cmode = CM_FIRE;
SDL_Surface *sdl_scrn;
int sdl_scale = 1;
-GLuint zoomTex, vidBuf, airBuf, fireAlpha, glowAlpha, blurAlpha, fireProg, partsFboTex, partsFbo, lensProg, partsTFX, partsTFY;
+GLuint airProg, zoomTex, vidBuf, airBuf, fireAlpha, glowAlpha, blurAlpha, fireProg, partsFboTex, partsFbo, lensProg, partsTFX, partsTFY, airPV, airVY, airVX;
int sandcolour_r = 0;
int sandcolour_g = 0;
@@ -1109,9 +1109,9 @@ void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag)
drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255);
}
}
-pixel air_buf[YRES/CELL][XRES/CELL];
void draw_air(pixel *vid)
{
+#ifndef OGLR
int x, y, i, j;
pixel c;
if (cmode == CM_PERS)//this should never happen anyway
@@ -1173,29 +1173,45 @@ void draw_air(pixel *vid)
c = PIXRGB(r, g, b);
}
}
-#ifdef OGLR
- air_buf[y][x] = c;
-#else
for (j=0; j<CELL; j++)//draws the colors
for (i=0; i<CELL; i++)
vid[(x*CELL+i) + (y*CELL+j)*(XRES+BARSIZE)] = c;
-#endif
}
-#ifdef OGLR
+#else
glEnable( GL_TEXTURE_2D );
- glBindTexture(GL_TEXTURE_2D, airBuf);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+
+ glUseProgram(airProg);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, airVX);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES/CELL, YRES/CELL, GL_RED, GL_FLOAT, vx);
+ glUniform1i(glGetUniformLocation(airProg, "airX"), 0);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, airVY);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES/CELL, YRES/CELL, GL_GREEN, GL_FLOAT, vy);
+ glUniform1i(glGetUniformLocation(airProg, "airY"), 1);
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_2D, airPV);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES/CELL, YRES/CELL, GL_BLUE, GL_FLOAT, pv);
+ glUniform1i(glGetUniformLocation(airProg, "airP"), 2);
+ glActiveTexture(GL_TEXTURE0);
+
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES/CELL, YRES/CELL, GL_BGRA, GL_UNSIGNED_BYTE, air_buf);
glBegin(GL_QUADS);
glTexCoord2d(1, 0);
- glVertex3f(XRES*sdl_scale, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ glVertex3f(XRES*sdl_scale, YRES*sdl_scale, 1.0);
glTexCoord2d(0, 0);
- glVertex3f(0, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ glVertex3f(0, YRES*sdl_scale, 1.0);
glTexCoord2d(0, 1);
- glVertex3f(0, MENUSIZE*sdl_scale, 1.0);
+ glVertex3f(0, 0, 1.0);
glTexCoord2d(1, 1);
- glVertex3f(XRES*sdl_scale, MENUSIZE*sdl_scale, 1.0);
+ glVertex3f(XRES*sdl_scale, 0, 1.0);
glEnd();
+
+ glUseProgram(0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDisable( GL_TEXTURE_2D );
#endif
}
@@ -3214,6 +3230,35 @@ int sdl_open(void)
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
+ //Texture for velocity maps for air
+ //TODO: Combine all air maps into 3D array or structs
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &airVX);
+ glBindTexture(GL_TEXTURE_2D, airVX);
+ 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_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glGenTextures(1, &airVY);
+ glBindTexture(GL_TEXTURE_2D, airVY);
+ 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_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glGenTextures(1, &airPV);
+ glBindTexture(GL_TEXTURE_2D, airPV);
+ 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_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
//Fire alpha texture
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &fireAlpha);
@@ -3285,12 +3330,13 @@ int sdl_open(void)
#endif
return 1;
}
-
+#ifdef OGLR
void loadShaders()
{
- GLuint vsize, fsize, vertexShader, fragmentShader;
+ GLuint avsize, afsize, vsize, fsize, vertexShader, fragmentShader;
//const char *vertex = file_load("test.vert", &vsize), * fragment = file_load("test.frag", &fsize);
const char *lensVertex = file_load("ltest.vert", &vsize), * lensFragment = file_load("ltest.frag", &fsize);
+ const char *airVertex = file_load("atest.vert", &avsize), * airFragment = file_load("atest.frag", &afsize);
//Particle texture
vertexShader = glCreateShader(GL_VERTEX_SHADER);
@@ -3321,8 +3367,23 @@ void loadShaders()
glAttachShader( lensProg, vertexShader );
glAttachShader( lensProg, fragmentShader );
glLinkProgram( lensProg );
-}
+
+ //Air
+ vertexShader = glCreateShader(GL_VERTEX_SHADER);
+ fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+
+ glShaderSource( vertexShader, 1, &airVertex, &avsize);
+ glShaderSource( fragmentShader, 1, &airFragment, &afsize);
+
+ glCompileShader( vertexShader );
+ glCompileShader( fragmentShader );
+ airProg = glCreateProgram();
+ glAttachShader( airProg, vertexShader );
+ glAttachShader( airProg, fragmentShader );
+ glLinkProgram( airProg );
+}
+#endif
int draw_debug_info(pixel* vid, int lm, int lx, int ly, int cx, int cy, int line_x, int line_y)
{
char infobuf[256];