summaryrefslogtreecommitdiff
path: root/src/graphics.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics.c')
-rw-r--r--src/graphics.c3845
1 files changed, 1328 insertions, 2517 deletions
diff --git a/src/graphics.c b/src/graphics.c
index c208cfd..6972ade 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -2,7 +2,7 @@
#include <SDL/SDL.h>
#include <bzlib.h>
-#ifdef OpenGL
+#if defined(OGLR)
#ifdef MACOSX
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
@@ -15,18 +15,23 @@
#include <defines.h>
#include <air.h>
#include <powder.h>
+#define INCLUDE_SHADERS
#include <graphics.h>
+#include <powdergraphics.h>
#define INCLUDE_FONTDATA
#include <font.h>
#include <misc.h>
-
+#include "hmap.h"
unsigned cmode = CM_FIRE;
SDL_Surface *sdl_scrn;
int sdl_scale = 1;
-int emp_decor = 0;
+#ifdef OGLR
+GLuint airProg, zoomTex, vidBuf, airBuf, fireAlpha, glowAlpha, blurAlpha, fireProg, partsFboTex, partsFbo, lensProg, partsTFX, partsTFY, airPV, airVY, airVX;
+#endif
+int emp_decor = 0;
int sandcolour_r = 0;
int sandcolour_g = 0;
int sandcolour_b = 0;
@@ -39,6 +44,63 @@ unsigned char fire_b[YRES/CELL][XRES/CELL];
unsigned int fire_alpha[CELL*3][CELL*3];
pixel *pers_bg;
+char * flm_data;
+int flm_data_points = 4;
+pixel flm_data_colours[] = {PIXPACK(0xAF9F0F), PIXPACK(0xDFBF0F), PIXPACK(0x60300F), PIXPACK(0x000000)};
+float flm_data_pos[] = {1.0f, 0.9f, 0.5f, 0.0f};
+
+char * plasma_data;
+int plasma_data_points = 5;
+pixel plasma_data_colours[] = {PIXPACK(0xAFFFFF), PIXPACK(0xAFFFFF), PIXPACK(0x301060), PIXPACK(0x301040), PIXPACK(0x000000)};
+float plasma_data_pos[] = {1.0f, 0.9f, 0.5f, 0.25, 0.0f};
+
+char * generate_gradient(pixel * colours, float * points, int pointcount, int size)
+{
+ int cp, i, j;
+ pixel ptemp;
+ char * newdata = malloc(size * 3);
+ float poss, pose, temp;
+ memset(newdata, 0, size*3);
+ //Sort the Colours and Points
+ for (i = (pointcount - 1); i > 0; i--)
+ {
+ for (j = 1; j <= i; j++)
+ {
+ if (points[j-1] > points[j])
+ {
+ temp = points[j-1];
+ points[j-1] = points[j];
+ points[j] = temp;
+
+ ptemp = colours[j-1];
+ colours[j-1] = colours[j];
+ colours[j] = ptemp;
+ }
+ }
+ }
+ i = 0;
+ j = 1;
+ poss = points[i];
+ pose = points[j];
+ for (cp = 0; cp < size; cp++)
+ {
+ float cpos = (float)cp / (float)size, ccpos, cccpos;
+ if(cpos > pose && j+1 < pointcount)
+ {
+ poss = points[++i];
+ pose = points[++j];
+ }
+ ccpos = cpos - poss;
+ cccpos = ccpos / (pose - poss);
+ if(cccpos > 1.0f)
+ cccpos = 1.0f;
+ newdata[(cp*3)] = PIXR(colours[i])*(1.0f-cccpos) + PIXR(colours[j])*(cccpos);
+ newdata[(cp*3)+1] = PIXG(colours[i])*(1.0f-cccpos) + PIXG(colours[j])*(cccpos);
+ newdata[(cp*3)+2] = PIXB(colours[i])*(1.0f-cccpos) + PIXB(colours[j])*(cccpos);
+ }
+ return newdata;
+}
+
void *ptif_pack(pixel *src, int w, int h, int *result_size){
int i = 0, datalen = (w*h)*3, cx = 0, cy = 0;
unsigned char *red_chan = calloc(1, w*h);
@@ -284,6 +346,57 @@ pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f)
return q;
}
+#ifdef OGLR
+void clearScreen(float alpha)
+{
+ if(alpha > 0.999f)
+ {
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ }
+ else
+ {
+ glColor4f(0.0f, 0.0f, 0.0f, alpha);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glBegin(GL_QUADS);
+ glVertex2f(0, 0);
+ glVertex2f(XRES, 0);
+ glVertex2f(XRES, YRES);
+ glVertex2f(0, YRES);
+ glEnd();
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ }
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale)
+{
+
+ //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);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, GL_BGRA, GL_UNSIGNED_BYTE, src);
+ glBegin(GL_QUADS);
+ glTexCoord2d(1, 0);
+ glVertex3f((XRES+BARSIZE)*sdl_scale, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ glTexCoord2d(0, 0);
+ glVertex3f(0, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ glTexCoord2d(0, 1);
+ glVertex3f(0, 0, 1.0);
+ glTexCoord2d(1, 1);
+ glVertex3f((XRES+BARSIZE)*sdl_scale, 0, 1.0);
+ glEnd();
+
+ glDisable( GL_TEXTURE_2D );
+ glFlush();
+ SDL_GL_SwapBuffers ();
+}
+#endif
+
void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch)
{
pixel *dst;
@@ -380,8 +493,8 @@ void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch)
void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch)
{
-#ifdef OpenGL
- RenderScene();
+#if defined(OGLR)
+ ogl_blit(x, y, w, h, src, pitch, sdl_scale);
#else
if (sdl_scale == 2)
sdl_blit_2(x, y, w, h, src, pitch);
@@ -404,312 +517,6 @@ void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsi
blendpixel(vid, x-1, y+1, cr, cg, cb, 64);
}
-//old and unused equation to draw walls
-/*
-void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall)
-{
- int x, y, i, j, c;
- int bo = b;
- if (iswall==1)
- {
- b = b-100;
- x = (2+32*((b-22)/1));
- y = YRES+2+40;
- switch (b)
- {
- case WL_WALLELEC:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- if (!(i%2) && !(j%2))
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- else
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080);
- }
- }
- }
- break;
- case 23:
- for (j=1; j<15; j++)
- {
- for (i=1; i<6+j; i++)
- {
- if (!(i&j&1))
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- for (; i<27; i++)
- {
- if (i&j&1)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- }
- break;
- case 24:
- for (j=1; j<15; j+=2)
- {
- for (i=1+(1&(j>>1)); i<27; i+=2)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- break;
- case 25:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000);
- drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255);
- }
- }
- for (i=9; i<27; i++)
- {
- drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255);
- }
- break;
- case 26:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000);
- }
- }
- drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255);
- drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255);
- break;
- case 27:
- for (j=1; j<15; j+=2)
- {
- for (i=1+(1&(j>>1)); i<27; i+=2)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- break;
- case 28:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- if (!(i%2) && !(j%2))
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- }
- break;
- case 29:
- for (j=1; j<15; j+=2)
- {
- for (i=1+(1&(j>>1)); i<27; i+=2)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- break;
- case 30:
- for (j=1; j<15; j+=2)
- {
- for (i=1+(1&(j>>1)); i<13; i+=2)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- for (j=1; j<15; j++)
- {
- for (i=14; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- break;
- case 32:
- for (j=1; j<15; j+=2)
- {
- for (i=1+(1&(j>>1)); i<27; i+=2)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- break;
- case 33:
- for (j=1; j<15; j+=2)
- {
- for (i=1+(1&(j>>1)); i<27; i+=2)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- break;
- case 34:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- if (!(i%2) && !(j%2))
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- }
- break;
- case 36:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc);
- if (c<544)
- {
- c = 255;
- }
- else
- {
- c = 0;
- }
- drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255);
- break;
- case 37:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc);
- if (c<544)
- {
- c = 255;
- }
- else
- {
- c = 0;
- }
- drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255);
- break;
- case 38:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc);
- if (c<544)
- {
- c = 255;
- }
- else
- {
- c = 0;
- }
- drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255);
- break;
- case 39:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc);
- if (c<544)
- {
- c = 255;
- }
- else
- {
- c = 0;
- }
- drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255);
- break;
- default:
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- }
- if (b==30)
- {
- for (j=4; j<12; j++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000);
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000);
- vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000);
- vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000);
- }
- }
- }
- else
- {
- x = 2+32*(b/2);
- y = YRES+2+20*(b%2);
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- if (b==0)
- {
- for (j=4; j<12; j++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000);
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000);
- vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000);
- vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000);
- }
- }
- c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors);
- if (c<544)
- {
- c = 255;
- }
- else
- {
- c = 0;
- }
- drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255);
- }
- if (bo==sl || bo==sr)
- {
- c = 0;
- if (bo==sl)
- c |= PIXPACK(0xFF0000);
- if (bo==sr)
- c |= PIXPACK(0x0000FF);
- for (i=0; i<30; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c;
- vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c;
- }
- for (j=0; j<18; j++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c;
- vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c;
- }
- }
-}
-*/
//draws walls and elements for menu
int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc)
{
@@ -719,9 +526,6 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc)
return 26;
if ((b&0xFF) == PT_LIFE)
{
-#ifdef OpenGL
- fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255);
-#else
for (j=1; j<15; j++)
{
for (i=1; i<27; i++)
@@ -729,7 +533,6 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc)
vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
}
}
-#endif
c = PIXB(pc) + 3*PIXG(pc) + 2*PIXR(pc);
if (c<544)
{
@@ -916,9 +719,6 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc)
{
//x = 2+32*(b/2);
//y = YRES+2+20*(b%2);
-#ifdef OpenGL
- fillrect(vid_buf, x, y, 28, 16, PIXR(pc), PIXG(pc), PIXB(pc), 255);
-#else
for (j=1; j<15; j++)
{
for (i=1; i<27; i++)
@@ -926,7 +726,6 @@ int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc)
vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
}
}
-#endif
if (b==0)
{
for (j=4; j<12; j++)
@@ -989,6 +788,20 @@ _inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
#endif
{
+#ifdef PIXALPHA
+ pixel t;
+ if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
+ return;
+ if (a!=255)
+ {
+ t = vid[y*(XRES+BARSIZE)+x];
+ r = (a*r + (255-a)*PIXR(t)) >> 8;
+ g = (a*g + (255-a)*PIXG(t)) >> 8;
+ b = (a*b + (255-a)*PIXB(t)) >> 8;
+ a = a > PIXA(t) ? a : PIXA(t);
+ }
+ vid[y*(XRES+BARSIZE)+x] = PIXRGBA(r,g,b,a);
+#else
pixel t;
if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
return;
@@ -1000,6 +813,7 @@ inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
b = (a*b + (255-a)*PIXB(t)) >> 8;
}
vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
+#endif
}
#if defined(WIN32) && !defined(__GNUC__)
@@ -1028,8 +842,6 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a)
int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a)
{
-#ifdef OpenGL
-#else
int sx = x;
for (; *s; s++)
{
@@ -1076,7 +888,6 @@ int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a
else
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
}
-#endif
return x;
}
@@ -1093,8 +904,6 @@ int drawtext_outline(pixel *vid, int x, int y, const char *s, int r, int g, int
}
int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a)
{
-#ifdef OpenGL
-#else
int sx = x;
int rh = 12;
int rw = 0;
@@ -1171,21 +980,11 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
}
return rh;
- #endif
}
//draws a rectange, (x,y) are the top left coords.
void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a)
{
-#ifdef OpenGL
- glBegin(GL_LINE_LOOP);
- glColor4ub(r, g, b, a);
- glVertex2i(x, y);
- glVertex2i(x+w, y);
- glVertex2i(x+w, y+h);
- glVertex2i(x, y+h);
- glEnd();
-#else
int i;
for (i=0; i<=w; i++)
{
@@ -1197,49 +996,33 @@ void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a
drawpixel(vid, x, y+i, r, g, b, a);
drawpixel(vid, x+w, y+i, r, g, b, a);
}
-#endif
}
//draws a rectangle and fills it in as well.
void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a)
{
-#ifdef OpenGL
- glBegin(GL_QUADS);
- glColor4ub(r, g, b, a);
- glVertex2i(x, y);
- glVertex2i(x+w, y);
- glVertex2i(x+w, y+h);
- glVertex2i(x, y+h);
- glEnd();
-#else
int i,j;
for (j=1; j<h; j++)
for (i=1; i<w; i++)
drawpixel(vid, x+i, y+j, r, g, b, a);
-#endif // OpenGL
}
void clearrect(pixel *vid, int x, int y, int w, int h)
{
+#ifdef OGLR
+ fillrect(vid, x, y, w, h, 0, 0, 0, 255);
+#else
int i;
for (i=1; i<h; i++)
memset(vid+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1));
+#endif
}
//draws a line of dots, where h is the height. (why is this even here)
void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a)
{
-#ifdef OpenGL
- int i;
- glBegin(GL_QUADS);
- glColor4ub(r, g, b, a);
- for (i = 0; i <= h; i +=2)
- glVertex2i(x, y+i);
- glEnd();
-#else
int i;
for (i=0; i<=h; i+=2)
drawpixel(vid, x, y+i, r, g, b, a);
-#endif //OpenGL
}
int textwidth(char *s)
@@ -1397,16 +1180,19 @@ _inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
#endif
{
-#ifdef OpenGL
- if (x<0 || y<0 || x>=XRES+BARSIZE || r>=YRES+MENUSIZE)
+#ifdef PIXALPHA
+ pixel t;
+ if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
return;
if (a!=255)
{
- glBegin (GL_QUADS);
- glColor4ub(r,g,b,a);
- glVertex2i(x, y);
+ t = vid[y*(XRES+BARSIZE)+x];
+ r = (a*r + (255-a)*PIXR(t)) >> 8;
+ g = (a*g + (255-a)*PIXG(t)) >> 8;
+ b = (a*b + (255-a)*PIXB(t)) >> 8;
+ a = a > PIXA(t) ? a : PIXA(t);
}
- vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
+ vid[y*(XRES+BARSIZE)+x] = PIXRGBA(r,g,b,a);
#else
pixel t;
if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
@@ -1419,7 +1205,7 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
b = (a*b + (255-a)*PIXB(t)) >> 8;
}
vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
-#endif //OpenGL
+#endif
}
void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag)
@@ -1438,15 +1224,13 @@ 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);
}
}
-
void draw_air(pixel *vid)
{
+#ifndef OGLR
int x, y, i, j;
pixel c;
-
if (cmode == CM_PERS)//this should never happen anyway
return;
-
for (y=0; y<YRES/CELL; y++)
for (x=0; x<XRES/CELL; x++)
{
@@ -1508,6 +1292,43 @@ void draw_air(pixel *vid)
for (i=0; i<CELL; i++)
vid[(x*CELL+i) + (y*CELL+j)*(XRES+BARSIZE)] = c;
}
+#else
+ glEnable( GL_TEXTURE_2D );
+ 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);
+ glBegin(GL_QUADS);
+ glTexCoord2d(1, 0);
+ glVertex3f(XRES*sdl_scale, YRES*sdl_scale, 1.0);
+ glTexCoord2d(0, 0);
+ glVertex3f(0, YRES*sdl_scale, 1.0);
+ glTexCoord2d(0, 1);
+ glVertex3f(0, 0, 1.0);
+ glTexCoord2d(1, 1);
+ 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
}
void draw_grav_zones(pixel * vid)
@@ -1749,6 +1570,22 @@ void draw_other(pixel *vid) // EMP effect
return;
if (emp_decor>0)
{
+#ifdef OGLR
+ float femp_decor = ((float)emp_decor)/255.0f;
+ /*int r=emp_decor*2.5, g=100+emp_decor*1.5, b=255;
+ int a=(1.0*emp_decor/110)*255;
+ if (r>255) r=255;
+ if (g>255) g=255;
+ if (b>255) g=255;
+ if (a>255) a=255;*/
+ glBegin(GL_QUADS);
+ glColor4f(femp_decor*2.5f, 0.4f+femp_decor*1.5f, 1.0f+femp_decor*1.5f, femp_decor/0.44f);
+ glVertex2f(0, MENUSIZE);
+ glVertex2f(XRES, MENUSIZE);
+ glVertex2f(XRES, YRES+MENUSIZE);
+ glVertex2f(0, YRES+MENUSIZE);
+ glEnd();
+#else
int r=emp_decor*2.5, g=100+emp_decor*1.5, b=255;
int a=(1.0*emp_decor/110)*255;
if (r>255) r=255;
@@ -1760,141 +1597,234 @@ void draw_other(pixel *vid) // EMP effect
{
drawpixel(vid, i, j, r, g, b, a);
}
+#endif
}
}
-//the main function for drawing the particles
-void draw_parts(pixel *vid)
-{
- int i, x, y, t, nx, ny, r, s;
- int orbd[4] = {0, 0, 0, 0};
- int orbl[4] = {0, 0, 0, 0};
- int cr, cg, cb;
- float fr, fg, fb, div_n;
- float pt = R_TEMP;
- if (GRID_MODE)//draws the grid
- {
- for (ny=0; ny<YRES; ny++)
- for (nx=0; nx<XRES; nx++)
- {
- if (ny%(4*GRID_MODE)==0)
- blendpixel(vid, nx, ny, 100, 100, 100, 80);
- if (nx%(4*GRID_MODE)==0)
- blendpixel(vid, nx, ny, 100, 100, 100, 80);
- }
- }
- for (i = 0; i<=parts_lastActiveIndex; i++) {
-#ifdef OpenGL
- if (cmode == CM_FANCY) //If fancy mode
- {
-
- if (t==PT_MWAX)
- {
- for (x=-1; x<=1; x++)
- {
- for (y=-1; y<=1; y++)
- {
- if ((abs(x) == 0) && (abs(y) == 0))
- blendpixel(vid,x+nx,y+ny,224,224,170,255);
- else if (abs(y) != 0 && abs(x) != 0)
- blendpixel(vid,x+nx,y+ny,224,224,170,20);
- else
- blendpixel(vid,x+nx,y+ny,224,224,170,40);
- }
- }
-
- }
-
- else if (t==PT_PLUT)
- {
- int tempx;
- int tempy;
- cr = 0x40;
- cg = 0x70;
- cb = 0x20;
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- for (tempx = 2; tempx < 10; tempx++) {
- for (tempy = 2; tempy < 10; tempy++) {
- blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5);
- blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5);
- blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5);
- blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5);
- }
- }
- }
- }
- if (parts[i].type) {
- //Do nothing
- t = parts[i].type;
- nx = (int)(parts[i].x+0.5f);
- ny = (int)(parts[i].y+0.5f);
- glBegin (GL_POINTS);
- glColor3ub (PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors));
- glVertex2d (nx, ny);
- glEnd ();
- }
-#else
+void prepare_graphicscache()
+{
+ graphicscache = malloc(sizeof(gcache_item)*PT_NUM);
+ memset(graphicscache, 0, sizeof(gcache_item)*PT_NUM);
+}
+//New function for drawing particles
+#ifdef OGLR
+GLuint fireV[(YRES*XRES)*2];
+GLfloat fireC[(YRES*XRES)*4];
+GLuint smokeV[(YRES*XRES)*2];
+GLfloat smokeC[(YRES*XRES)*4];
+GLuint blobV[(YRES*XRES)*2];
+GLfloat blobC[(YRES*XRES)*4];
+GLuint blurV[(YRES*XRES)*2];
+GLfloat blurC[(YRES*XRES)*4];
+GLuint glowV[(YRES*XRES)*2];
+GLfloat glowC[(YRES*XRES)*4];
+GLuint flatV[(YRES*XRES)*2];
+GLfloat flatC[(YRES*XRES)*4];
+GLfloat lineV[(((YRES*XRES)*2)*6)];
+GLfloat lineC[(((YRES*XRES)*2)*6)];
+#endif
+void render_parts(pixel *vid)
+{
+ //TODO: Replace cmode with a set of flags
+ int deca, decr, decg, decb, colr, colg, colb, firea, firer, fireg, fireb, pixel_mode, i, t, nx, ny, x, y, caddress;
+ float gradv, flicker, fnx, fny;
+#ifdef OGLR
+ int cfireV = 0, cfireC = 0, cfire = 0;
+ int csmokeV = 0, csmokeC = 0, csmoke = 0;
+ int cblobV = 0, cblobC = 0, cblob = 0;
+ int cblurV = 0, cblurC = 0, cblur = 0;
+ int cglowV = 0, cglowC = 0, cglow = 0;
+ int cflatV = 0, cflatC = 0, cflat = 0;
+ int clineV = 0, clineC = 0, cline = 0;
+ GLuint origBlendSrc, origBlendDst;
+ //Set coord offset
+ glScalef(1,-1,1);
+ glTranslatef(0, -YRES/*-(YRES+MENUSIZE)*/, 0);
+
+ glGetIntegerv(GL_BLEND_SRC, &origBlendSrc);
+ glGetIntegerv(GL_BLEND_DST, &origBlendDst);
+ //Render to the particle FBO
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+#endif
+ for(i = 0; i<=parts_lastActiveIndex; i++) {
if (parts[i].type) {
t = parts[i].type;
nx = (int)(parts[i].x+0.5f);
ny = (int)(parts[i].y+0.5f);
+ fnx = parts[i].x;
+ fny = parts[i].y;
if(photons[ny][nx]&0xFF && !(ptypes[t].properties & TYPE_ENERGY))
continue;
-
- if (t==PT_SOAP)
- {
- if ((parts[i].ctype&7) == 7)
- draw_line(vid, nx, ny, (int)(parts[parts[i].tmp].x+0.5f), (int)(parts[parts[i].tmp].y+0.5f), 245, 245, 220, XRES+BARSIZE);
- }
+
+ //Defaults
+ pixel_mode = 0 | PMODE_FLAT;
+ colr = PIXR(ptypes[t].pcolors);
+ colg = PIXG(ptypes[t].pcolors);
+ colb = PIXB(ptypes[t].pcolors);
+ firea = 0;
- if(t==PT_WIRE)
+ deca = (parts[i].dcolour>>24)&0xFF;
+ decr = (parts[i].dcolour>>16)&0xFF;
+ decg = (parts[i].dcolour>>8)&0xFF;
+ decb = (parts[i].dcolour)&0xFF;
+
+ if (graphicscache[t].isready)
{
- if (parts[i].ctype==0)
- blendpixel(vid, nx, ny, 255, 204, 0, 255);
- else if(parts[i].ctype==1)
- blendpixel(vid, nx, ny, 0, 0, 255, 255);
- else
- blendpixel(vid, nx, ny, 255, 255, 255, 255);
-
- continue;
+ pixel_mode = graphicscache[t].pixel_mode;
+ colr = graphicscache[t].colr;
+ colg = graphicscache[t].colg;
+ colb = graphicscache[t].colb;
+ firea = graphicscache[t].firea;
+ firer = graphicscache[t].firer;
+ fireg = graphicscache[t].fireg;
+ fireb = graphicscache[t].fireb;
}
-
- if (cmode!=CM_HEAT)
+ else
{
- if (t==PT_STKM)
+ if (ptypes[t].graphics_func)
{
- char buff[20]; //Buffer for HP
- pixel pc;
-
- if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
+ if ((*(ptypes[t].graphics_func))(&(parts[i]), nx, ny, &pixel_mode, &colr, &colg, &colb, &firea, &firer, &fireg, &fireb)) //That's a lot of args, a struct might be better
{
- sprintf(buff, "%3d", parts[i].life); //Show HP
- drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
+ graphicscache[t].isready = 1;
+ graphicscache[t].pixel_mode = pixel_mode;
+ graphicscache[t].colr = colr;
+ graphicscache[t].colg = colg;
+ graphicscache[t].colb = colb;
+ graphicscache[t].firea = firea;
+ graphicscache[t].firer = firer;
+ graphicscache[t].fireg = fireg;
+ graphicscache[t].fireb = fireb;
}
-
- if ((int)player.elem<PT_NUM) pc = ptypes[(int)player.elem].pcolors;
- else pc = PIXPACK(0x8080FF);
- s = XRES+BARSIZE;
- //head
- draw_line(vid , nx-2, ny+2, nx+2, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
- draw_line(vid , nx-2, ny-2, nx+2, ny-2, PIXR(pc), PIXG(pc), PIXB(pc), s);
- draw_line(vid , nx-2, ny-2, nx-2, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
- draw_line(vid , nx+2, ny-2, nx+2, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
- //legs
- draw_line(vid , nx, ny+3, player.legs[0], player.legs[1], 255, 255, 255, s);
- draw_line(vid , player.legs[0], player.legs[1], player.legs[4], player.legs[5], 255, 255, 255, s);
- draw_line(vid , nx, ny+3, player.legs[8], player.legs[9], 255, 255, 255, s);
- draw_line(vid , player.legs[8], player.legs[9], player.legs[12], player.legs[13], 255, 255, 255, s);
}
- else if (t==PT_STKM2)
+ else
{
+ if(graphics_DEFAULT(&(parts[i]), nx, ny, &pixel_mode, &colr, &colg, &colb, &firea, &firer, &fireg, &fireb))
+ {
+ graphicscache[t].isready = 1;
+ graphicscache[t].pixel_mode = pixel_mode;
+ graphicscache[t].colr = colr;
+ graphicscache[t].colg = colg;
+ graphicscache[t].colb = colb;
+ graphicscache[t].firea = firea;
+ graphicscache[t].firer = firer;
+ graphicscache[t].fireg = fireg;
+ graphicscache[t].fireb = fireb;
+ }
+ }
+ }
+ if(ptypes[t].properties & PROP_HOT_GLOW && parts[i].temp>(ptransitions[t].thv-800.0f))
+ {
+ gradv = 3.1415/(2*ptransitions[t].thv-(ptransitions[t].thv-800.0f));
+ caddress = (parts[i].temp>ptransitions[t].thv)?ptransitions[t].thv-(ptransitions[t].thv-800.0f):parts[i].temp-(ptransitions[t].thv-800.0f);
+ colr += sin(gradv*caddress) * 226;;
+ colg += sin(gradv*caddress*4.55 +3.14) * 34;
+ colb += sin(gradv*caddress*2.22 +3.14) * 64;
+ }
+ if(cmode == CM_NOTHING)
+ {
+#ifdef OGLR
+ flatV[cflatV++] = nx;
+ flatV[cflatV++] = ny;
+ flatC[cflatC++] = ((float)colr)/255.0f;
+ flatC[cflatC++] = ((float)colg)/255.0f;
+ flatC[cflatC++] = ((float)colb)/255.0f;
+ flatC[cflatC++] = 1.0f;
+ cflat++;
+#else
+ vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(colr,colg,colb);
+#endif
+ }
+ else
+ {
+ //Alter colour based on display mode
+ switch(cmode)
+ {
+ case CM_HEAT:
+ caddress = restrict_flt((int)( restrict_flt((float)(parts[i].temp+(-MIN_TEMP)), 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/1024) ) *3, 0.0f, (1024.0f*3)-3);
+ firea = 255;
+ firer = colr = (unsigned char)color_data[caddress];
+ fireg = colg = (unsigned char)color_data[caddress+1];
+ fireb = colb = (unsigned char)color_data[caddress+2];
+ case CM_PERS:
+ case CM_CRACK:
+ case CM_VEL:
+ case CM_PRESS:
+ case CM_LIFE:
+ case CM_GRAD:
+ if(pixel_mode & FIRE_ADD) pixel_mode = (pixel_mode & ~FIRE_ADD) | PMODE_GLOW | PMODE_FLAT;
+ if(pixel_mode & FIRE_BLEND) pixel_mode = (pixel_mode & ~FIRE_BLEND) | PMODE_BLUR;
+ case CM_FIRE:
+ if(pixel_mode & PMODE_BLOB) pixel_mode = (pixel_mode & ~PMODE_BLOB) | PMODE_FLAT;
+ if(pixel_mode & PMODE_BLUR) pixel_mode = (pixel_mode & ~PMODE_BLUR) | PMODE_FLAT;
+ break;
+ case CM_BLOB:
+ if(pixel_mode & PMODE_FLAT) pixel_mode = (pixel_mode & ~PMODE_FLAT) | PMODE_BLOB;
+ break;
+ case CM_FANCY:
+ break;
+ default:
+ break;
+ }
+
+ //Apply decoration colour
+ colr = (deca*decr + (255-deca)*colr) >> 8;
+ colg = (deca*decg + (255-deca)*colg) >> 8;
+ colb = (deca*decb + (255-deca)*colb) >> 8;
+
+ //All colours are now set, check ranges
+ if(colr>255) colr = 255;
+ else if(colr<0) colr = 0;
+ if(colg>255) colg = 255;
+ else if(colg<0) colg = 0;
+ if(colb>255) colb = 255;
+ else if(colb<0) colb = 0;
+
+ //Pixel rendering
+ if(pixel_mode & PSPEC_STICKMAN)
+ {
+ //Special case for stickman
+ playerst *cplayer;
+ if(t==PT_STKM)
+ cplayer = &player;
+ else if(t==PT_STKM2)
+ cplayer = &player2;
+ else if(t==PT_FIGH)
+ cplayer = &fighters[(unsigned char)parts[i].tmp];
+ else
+ continue;
+#ifdef OGLR
+ glColor4f(((float)colr)/255.0f, ((float)colg)/255.0f, ((float)colb)/255.0f, 1.0f);
+ glEnable(GL_LINE_SMOOTH);
+ glBegin(GL_LINE_STRIP);
+ glVertex2f(fnx-2, fny-2);
+ glVertex2f(fnx+2, fny-2);
+ glVertex2f(fnx+2, fny+2);
+ glVertex2f(fnx-2, fny+2);
+ glVertex2f(fnx-2, fny-2);
+ glEnd();
+ if(t==PT_STKM)
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ else
+ glColor4f(0.6f, 0.6f, 1.0f, 1.0f);
+ glBegin(GL_LINES);
+ glVertex2f(nx, ny+3);
+ glVertex2f(cplayer->legs[0], cplayer->legs[1]);
+
+ glVertex2f(cplayer->legs[0], cplayer->legs[1]);
+ glVertex2f(cplayer->legs[4], cplayer->legs[5]);
+
+ glVertex2f(nx, ny+3);
+ glVertex2f(cplayer->legs[8], cplayer->legs[9]);
+
+ glVertex2f(cplayer->legs[8], cplayer->legs[9]);
+ glVertex2f(cplayer->legs[12], cplayer->legs[13]);
+ glEnd();
+ glDisable(GL_LINE_SMOOTH);
+#else
char buff[20]; //Buffer for HP
+ int s;
pixel pc;
if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
@@ -1903,8 +1833,8 @@ void draw_parts(pixel *vid)
drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
}
- if ((int)player2.elem<PT_NUM) pc = ptypes[(int)player2.elem].pcolors;
- else pc = PIXPACK(0x8080FF);
+ if (cplayer->elem<PT_NUM) pc = ptypes[cplayer->elem].pcolors;
+ else pc = PIXPACK(0xFFFFFF);
s = XRES+BARSIZE;
//head
draw_line(vid , nx-2, ny+2, nx+2, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
@@ -1912,2056 +1842,614 @@ void draw_parts(pixel *vid)
draw_line(vid , nx-2, ny-2, nx-2, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
draw_line(vid , nx+2, ny-2, nx+2, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
//legs
- draw_line(vid , nx, ny+3, player2.legs[0], player2.legs[1], 100, 100, 255, s);
- draw_line(vid , player2.legs[0], player2.legs[1], player2.legs[4], player2.legs[5], 100, 100, 255, s);
- draw_line(vid , nx, ny+3, player2.legs[8], player2.legs[9], 100, 100, 255, s);
- draw_line(vid , player2.legs[8], player2.legs[9], player2.legs[12], player2.legs[13], 100, 100, 255, s);
- }
- else if (t==PT_FIGH) //Fighter should be visible in heat mode
- {
- char buff[10]; //Buffer for HP
- pixel pc;
- playerst *figh = &fighters[(unsigned char)parts[i].tmp];
-
- if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
- {
- sprintf(buff, "%3d", parts[i].life); //Show HP
- drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
- }
- if ((int)figh->elem<PT_NUM) pc = ptypes[(int)figh->elem].pcolors;
- else pc = PIXPACK(0x8080FF);
- s = XRES+BARSIZE;
- //head
- draw_line(vid , nx, ny+2, nx+2, ny, PIXR(pc), PIXG(pc), PIXB(pc), s);
- draw_line(vid , nx+2, ny, nx, ny-2, PIXR(pc), PIXG(pc), PIXB(pc), s);
- draw_line(vid , nx, ny-2, nx-2, ny, PIXR(pc), PIXG(pc), PIXB(pc), s);
- draw_line(vid , nx-2, ny, nx, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
- //legs
- draw_line(vid , nx, ny+3, figh->legs[0], figh->legs[1], 255, 255, 255, s);
- draw_line(vid , figh->legs[0], figh->legs[1], figh->legs[4], figh->legs[5], 255, 255, 255, s);
- draw_line(vid , nx, ny+3, figh->legs[8], figh->legs[9], 255, 255, 255, s);
- draw_line(vid , figh->legs[8], figh->legs[9], figh->legs[12], figh->legs[13], 255, 255, 255, s);
+ draw_line(vid , nx, ny+3, cplayer->legs[0], cplayer->legs[1], 255, 255, 255, s);
+ draw_line(vid , cplayer->legs[0], cplayer->legs[1], cplayer->legs[4], cplayer->legs[5], 255, 255, 255, s);
+ draw_line(vid , nx, ny+3, cplayer->legs[8], cplayer->legs[9], 255, 255, 255, s);
+ draw_line(vid , cplayer->legs[8], cplayer->legs[9], cplayer->legs[12], cplayer->legs[13], 255, 255, 255, s);
+#endif
}
- if (cmode==CM_NOTHING && t!=PT_PIPE && t!=PT_SWCH && t!=PT_LCRY && t!=PT_PUMP && t!=PT_GPMP && t!=PT_PBCN && t!=PT_FILT && t!=PT_HSWC && t!=PT_PCLN && t!=PT_DEUT && t!=PT_WIFI && t!=PT_LIFE && t!=PT_PVOD)//nothing display but show needed color changes
+ if(pixel_mode & PMODE_FLAT)
{
- if (t==PT_PHOT)
- {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else
- {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
+#ifdef OGLR
+ flatV[cflatV++] = nx;
+ flatV[cflatV++] = ny;
+ flatC[cflatC++] = ((float)colr)/255.0f;
+ flatC[cflatC++] = ((float)colg)/255.0f;
+ flatC[cflatC++] = ((float)colb)/255.0f;
+ flatC[cflatC++] = 1.0f;
+ cflat++;
+#else
+ vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(colr,colg,colb);
+#endif
}
- else if (cmode==CM_GRAD)
+ if(pixel_mode & PMODE_BLOB)
{
- float frequency = 0.05;
- int q = parts[i].temp-40;
- cr = sin(frequency*q) * 16 + PIXR(ptypes[t].pcolors);
- cg = sin(frequency*q) * 16 + PIXG(ptypes[t].pcolors);
- cb = sin(frequency*q) * 16 + PIXB(ptypes[t].pcolors);
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- if (cr<=0)
- cr = 0;
- if (cg<=0)
- cg = 0;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
+#ifdef OGLR
+ blobV[cblobV++] = nx;
+ blobV[cblobV++] = ny;
+ blobC[cblobC++] = ((float)colr)/255.0f;
+ blobC[cblobC++] = ((float)colg)/255.0f;
+ blobC[cblobC++] = ((float)colb)/255.0f;
+ blobC[cblobC++] = 1.0f;
+ cblob++;
+#else
+ blendpixel(vid, nx+1, ny, colr, colg, colb, 223);
+ blendpixel(vid, nx-1, ny, colr, colg, colb, 223);
+ blendpixel(vid, nx, ny+1, colr, colg, colb, 223);
+ blendpixel(vid, nx, ny-1, colr, colg, colb, 223);
+
+ blendpixel(vid, nx+1, ny-1, colr, colg, colb, 112);
+ blendpixel(vid, nx-1, ny-1, colr, colg, colb, 112);
+ blendpixel(vid, nx+1, ny+1, colr, colg, colb, 112);
+ blendpixel(vid, nx-1, ny+1, colr, colg, colb, 112);
+#endif
}
- else if (cmode==CM_FANCY && //all fancy mode effects go here, this is a list of exceptions to skip
- t!=PT_FIRE && t!=PT_PLSM && t!=PT_WTRV &&
- t!=PT_HFLM && t!=PT_SPRK && t!=PT_FIRW &&
- t!=PT_DUST && t!=PT_FIRW && t!=PT_FWRK &&
- t!=PT_NEUT && t!=PT_LAVA && t!=PT_BOMB &&
- t!=PT_PHOT && t!=PT_THDR && t!=PT_SMKE &&
- t!=PT_LCRY && t!=PT_SWCH && t!=PT_PCLN &&
- t!=PT_PUMP && t!=PT_HSWC && t!=PT_FILT &&
- t!=PT_GPMP && t!=PT_PBCN && t!=PT_LIFE &&
- t!=PT_O2 && t!=PT_H2 && t!=PT_PVOD)
+ if(pixel_mode & PMODE_GLOW)
{
- if (ptypes[parts[i].type].properties&TYPE_LIQUID) //special effects for liquids in fancy mode
- {
- if (parts[i].type==PT_DEUT)
- {
- cr = PIXR(ptypes[t].pcolors) + parts[i].life*1;
- cg = PIXG(ptypes[t].pcolors) + parts[i].life*2;
- cb = PIXB(ptypes[t].pcolors) + parts[i].life*4;
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- for (x=-1; x<=1; x++)
- {
- for (y=-1; y<=1; y++)
- {
- if ((abs(x) == 0) && (abs(y) == 0))
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,100);
- else if (abs(y) != 0 || abs(x) != 0)
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,50);
- }
- }
- }
- else if (parts[i].type==PT_LAVA && parts[i].life)
- {
- cr = parts[i].life * 2 + 0xE0;
- cg = parts[i].life * 1 + 0x50;
- cb = parts[i].life/2 + 0x10;
- if (cr>255) cr = 255;
- if (cg>192) cg = 192;
- if (cb>128) cb = 128;
- for (x=-1; x<=1; x++)
- {
- for (y=-1; y<=1; y++)
- {
- if ((abs(x) == 0) && (abs(y) == 0))
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,100);
- else if (abs(y) != 0 || abs(x) != 0)
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,50);
- }
- }
- }
- else if (parts[i].type==PT_GLOW)
- {
- fr = restrict_flt(parts[i].temp-(275.13f+32.0f), 0, 128)/50.0f;
- fg = restrict_flt(parts[i].ctype, 0, 128)/50.0f;
- fb = restrict_flt(parts[i].tmp, 0, 128)/50.0f;
-
- cr = restrict_flt(64.0f+parts[i].temp-(275.13f+32.0f), 0, 255);
- cg = restrict_flt(64.0f+parts[i].ctype, 0, 255);
- cb = restrict_flt(64.0f+parts[i].tmp, 0, 255);
-
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr, cg, cb);
- x = nx/CELL;
- y = ny/CELL;
- fg += fire_g[y][x];
- if (fg > 255) fg = 255;
- fire_g[y][x] = fg;
- fb += fire_b[y][x];
- if (fb > 255) fb = 255;
- fire_b[y][x] = fb;
- fr += fire_r[y][x];
- if (fr > 255) fr = 255;
- fire_r[y][x] = fr;
-
- for (x=-1; x<=1; x++)
- {
- for (y=-1; y<=1; y++)
- {
- if ((abs(x) == 0) && (abs(y) == 0))
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,100);
- else if (abs(y) != 0 || abs(x) != 0)
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,50);
- }
- }
- }
- else
- {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- for (x=-1; x<=1; x++)
- {
- for (y=-1; y<=1; y++)
- {
- if ((abs(x) == 0) && (abs(y) == 0))
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,100);
- else if (abs(y) != 0 || abs(x) != 0)
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,50);
- }
- }
- }
- }
- else if (ptypes[parts[i].type].properties&TYPE_GAS)
- {
- //if(parts[i].type!=PT_FIRE&&parts[i].type!=PT_SMKE&&parts[i].type!=PT_PLSM&&parts[i].type!=PT_WTRV)
- {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- for (x=-1; x<=1; x++)
- {
- for (y=-1; y<=1; y++)
- {
- if ((abs(x) == 0) && (abs(y) == 0))
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,180);
- else if (abs(y) != 0 && abs(x) != 0)
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,50);
- else
- blendpixel(vid,x+nx,y+ny,cr,cg,cb,80);
- }
- }
- }
- }
- else if (ptypes[parts[i].type].properties&PROP_RADIOACTIVE)
- {
- int tempx = 0;
- int tempy = 0;
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- //blendpixel(vid, nx, ny, cr, cg, cb, 192);
- //blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- //blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- //blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- //blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- addpixel(vid, nx, ny, cr, cg, cb, 192);
- addpixel(vid, nx+1, ny, cr, cg, cb, 96);
- addpixel(vid, nx-1, ny, cr, cg, cb, 96);
- addpixel(vid, nx, ny+1, cr, cg, cb, 96);
- addpixel(vid, nx, ny-1, cr, cg, cb, 96);
- for (tempx = 2; tempx < 7; tempx++) {
- for (tempy = 2; tempy < 7; tempy++) {
- addpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5);
- addpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5);
- addpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5);
- addpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5);
- //blendpixel(vid, nx+tempx, ny-tempy, cr, cg, cb, 5);
- //blendpixel(vid, nx-tempx, ny+tempy, cr, cg, cb, 5);
- //blendpixel(vid, nx+tempx, ny+tempy, cr, cg, cb, 5);
- //blendpixel(vid, nx-tempx, ny-tempy, cr, cg, cb, 5);
- }
+#ifdef OGLR
+ glowV[cglowV++] = nx;
+ glowV[cglowV++] = ny;
+ glowC[cglowC++] = ((float)colr)/255.0f;
+ glowC[cglowC++] = ((float)colg)/255.0f;
+ glowC[cglowC++] = ((float)colb)/255.0f;
+ glowC[cglowC++] = 1.0f;
+ cglow++;
+#else
+ addpixel(vid, nx, ny, colr, colg, colb, 192);
+ addpixel(vid, nx+1, ny, colr, colg, colb, 96);
+ addpixel(vid, nx-1, ny, colr, colg, colb, 96);
+ addpixel(vid, nx, ny+1, colr, colg, colb, 96);
+ addpixel(vid, nx, ny-1, colr, colg, colb, 96);
+
+ for (x = 1; x < 6; x++) {
+ addpixel(vid, nx, ny-x, colr, colg, colb, 5);
+ addpixel(vid, nx, ny+x, colr, colg, colb, 5);
+ addpixel(vid, nx-x, ny, colr, colg, colb, 5);
+ addpixel(vid, nx+x, ny, colr, colg, colb, 5);
+ for (y = 1; y < 6; y++) {
+ if(x + y > 7)
+ continue;
+ addpixel(vid, nx+x, ny-y, colr, colg, colb, 5);
+ addpixel(vid, nx-x, ny+y, colr, colg, colb, 5);
+ addpixel(vid, nx+x, ny+y, colr, colg, colb, 5);
+ addpixel(vid, nx-x, ny-y, colr, colg, colb, 5);
}
}
- else //if no fancy effects, draw a simple pixel
- {
- vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors;
- }
- }
- else if (cmode==CM_LIFE)
- {
- float frequency = 0.4;
- int q;
- if (!(parts[i].life<5))
- q = sqrt(parts[i].life);
- else
- q = parts[i].life;
- cr = sin(frequency*q) * 100 + 128;
- cg = sin(frequency*q) * 100 + 128;
- cb = sin(frequency*q) * 100 + 128;
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- if (cr<=0)
- cr = 0;
- if (cg<=0)
- cg = 0;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else if (t==PT_QRTZ || t==PT_PQRT)
- {
- int z = parts[i].tmp - 5;//speckles!
- if (parts[i].temp>(ptransitions[t].thv-800.0f))//hotglow for quartz
- {
- float frequency = 3.1415/(2*ptransitions[t].thv-(ptransitions[t].thv-800.0f));
- int q = (parts[i].temp>ptransitions[t].thv)?ptransitions[t].thv-(ptransitions[t].thv-800.0f):parts[i].temp-(ptransitions[t].thv-800.0f);
- cr = sin(frequency*q) * 226 + (z * 16 + PIXR(ptypes[t].pcolors));
- cg = sin(frequency*q*4.55 +3.14) * 34 + (z * 16 + PIXR(ptypes[t].pcolors));
- cb = sin(frequency*q*2.22 +3.14) * 64 + (z * 16 + PIXR(ptypes[t].pcolors));
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- if (cr<=0)
- cr = 0;
- if (cg<=0)
- cg = 0;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else
- {
- cr = z * 16 + PIXR(ptypes[t].pcolors);
- cg = z * 16 + PIXG(ptypes[t].pcolors);
- cb = z * 16 + PIXB(ptypes[t].pcolors);
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- }
- else if (t==PT_CLST)
- {
- int z = parts[i].tmp - 5;//speckles!
- cr = z * 16 + PIXR(ptypes[t].pcolors);
- cg = z * 16 + PIXG(ptypes[t].pcolors);
- cb = z * 16 + PIXB(ptypes[t].pcolors);
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else if (t==PT_CBNW)
- {
- int z = parts[i].tmp2 - 20;//speckles!
- cr = z * 1 + PIXR(ptypes[t].pcolors);
- cg = z * 2 + PIXG(ptypes[t].pcolors);
- cb = z * 8 + PIXB(ptypes[t].pcolors);
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else if (t==PT_SPNG)
- {
- cr = PIXR(ptypes[t].pcolors) - parts[i].life*15;
- cg = PIXG(ptypes[t].pcolors) - parts[i].life*15;
- cb = PIXB(ptypes[t].pcolors) - parts[i].life*15;
- if (cr<=50)
- cr = 50;
- if (cg<=50)
- cg = 50;
- if (cb<=20)
- cb = 20;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
-
- }
- else if (t==PT_LIFE && parts[i].ctype>=0 && parts[i].ctype < NGOLALT) {
- pixel pc;
- if (parts[i].ctype==NGT_LOTE)//colors for life states
- {
- if (parts[i].tmp==2)
- pc = PIXRGB(255, 128, 0);
- else if (parts[i].tmp==1)
- pc = PIXRGB(255, 255, 0);
- else
- pc = PIXRGB(255, 0, 0);
- }
- else if (parts[i].ctype==NGT_FRG2)//colors for life states
- {
- if (parts[i].tmp==2)
- pc = PIXRGB(0, 100, 50);
- else
- pc = PIXRGB(0, 255, 90);
- }
- else if (parts[i].ctype==NGT_STAR)//colors for life states
- {
- if (parts[i].tmp==4)
- pc = PIXRGB(0, 0, 128);
- else if (parts[i].tmp==3)
- pc = PIXRGB(0, 0, 150);
- else if (parts[i].tmp==2)
- pc = PIXRGB(0, 0, 190);
- else if (parts[i].tmp==1)
- pc = PIXRGB(0, 0, 230);
- else
- pc = PIXRGB(0, 0, 70);
- }
- else if (parts[i].ctype==NGT_FROG)//colors for life states
- {
- if (parts[i].tmp==2)
- pc = PIXRGB(0, 100, 0);
- else
- pc = PIXRGB(0, 255, 0);
- }
- else if (parts[i].ctype==NGT_BRAN)//colors for life states
- {
- if (parts[i].tmp==1)
- pc = PIXRGB(150, 150, 0);
- else
- pc = PIXRGB(255, 255, 0);
- } else {
- pc = gmenu[parts[i].ctype].colour;
- }
- blendpixel(vid, nx, ny, PIXR(pc), PIXG(pc), PIXB(pc), 255);
- if (cmode==CM_BLOB)
- {
- blendpixel(vid, nx+1, ny, PIXR(pc), PIXG(pc), PIXB(pc), 223);
- blendpixel(vid, nx-1, ny, PIXR(pc), PIXG(pc), PIXB(pc), 223);
- blendpixel(vid, nx, ny+1, PIXR(pc), PIXG(pc), PIXB(pc), 223);
- blendpixel(vid, nx, ny-1, PIXR(pc), PIXG(pc), PIXB(pc), 223);
-
- blendpixel(vid, nx+1, ny-1, PIXR(pc), PIXG(pc), PIXB(pc), 112);
- blendpixel(vid, nx-1, ny-1, PIXR(pc), PIXG(pc), PIXB(pc), 112);
- blendpixel(vid, nx+1, ny+1, PIXR(pc), PIXG(pc), PIXB(pc), 112);
- blendpixel(vid, nx-1, ny+1, PIXR(pc), PIXG(pc), PIXB(pc), 112);
- }
- }
- else if (t==PT_DEUT)
- {
-
- if (parts[i].life>=700&&(cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY))
- {
- x = nx/CELL;
- y = ny/CELL;
- cr = 20;
- cg = 20;
- cb = 20;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cr = PIXR(ptypes[t].pcolors) + parts[i].life*1;
- cg = PIXG(ptypes[t].pcolors) + parts[i].life*2;
- cb = PIXB(ptypes[t].pcolors) + parts[i].life*4;
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
-
- }
-
- }
- else if (t==PT_DUST && parts[i].life >= 1)//dust colors!
- {
- x = nx;
- y = ny;
- cr = parts[i].flags;
- cg = parts[i].tmp;
- cb = parts[i].ctype;
- if (decorations_enable && parts[i].dcolour)
- {
- int a = (parts[i].dcolour>>24)&0xFF;
- cr = (a*((parts[i].dcolour>>16)&0xFF) + (255-a)*cr) >> 8;
- cg = (a*((parts[i].dcolour>>8)&0xFF) + (255-a)*cg) >> 8;
- cb = (a*((parts[i].dcolour)&0xFF) + (255-a)*cb) >> 8;
- }
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cg,cb,cr);//yes i know this pixel is different color than the glow... i don't know why
- cg = cg/4;
- cb = cb/4;
- cr = cr/4;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- blendpixel(vid,x,y,cg,cb,cr,255);
- }
- else if (t==PT_GRAV)
- {
- cr = 20;
- cg = 20;
- cb = 20;
- if (parts[i].vx>0)
- {
- cr += (parts[i].vx)*GRAV_R;
- cg += (parts[i].vx)*GRAV_G;
- cb += (parts[i].vx)*GRAV_B;
- }
- if (parts[i].vy>0)
- {
- cr += (parts[i].vy)*GRAV_G;
- cg += (parts[i].vy)*GRAV_B;
- cb += (parts[i].vy)*GRAV_R;
-
- }
- if (parts[i].vx<0)
- {
- cr -= (parts[i].vx)*GRAV_B;
- cg -= (parts[i].vx)*GRAV_R;
- cb -= (parts[i].vx)*GRAV_G;
-
- }
- if (parts[i].vy<0)
- {
- cr -= (parts[i].vy)*GRAV_R2;
- cg -= (parts[i].vy)*GRAV_G2;
- cb -= (parts[i].vy)*GRAV_B2;
- }
- if (cr>255)
- cr=255;
- if (cr<0)
- cr=0;
- if (cg>255)
- cg=255;
- if (cg<0)
- cg=0;
- if (cb>255)
- cb=255;
- if (cb<0)
- cb=0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
+#endif
}
- else if (t==PT_WIFI)
+ if(pixel_mode & PMODE_BLUR)
{
- float frequency = 0.0628;
- int q = parts[i].tmp;
- cr = sin(frequency*q + 0) * 127 + 128;
- cg = sin(frequency*q + 2) * 127 + 128;
- cb = sin(frequency*q + 4) * 127 + 128;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- if (mousex==(nx) && mousey==(ny) && DEBUG_MODE)//draw lines connecting wifi channels
+#ifdef OGLR
+ blurV[cblurV++] = nx;
+ blurV[cblurV++] = ny;
+ blurC[cblurC++] = ((float)colr)/255.0f;
+ blurC[cblurC++] = ((float)colg)/255.0f;
+ blurC[cblurC++] = ((float)colb)/255.0f;
+ blurC[cblurC++] = 1.0f;
+ cblur++;
+#else
+ for (x=-3; x<4; x++)
{
- int z;
- for (z = 0; z<NPART; z++) {
- if (parts[z].type)
- {
- if (parts[z].type==PT_WIFI&&parts[z].tmp==parts[i].tmp)
- xor_line(nx,ny,(int)(parts[z].x+0.5f),(int)(parts[z].y+0.5f),vid);
- }
- }
- }
- }
- else if (t==PT_PRTI)
- {
- int nxo = 0;
- int nyo = 0;
- int fire_rv = 0;
- float drad = 0.0f;
- float ddist = 0.0f;
- orbitalparts_get(parts[i].life, parts[i].ctype, orbd, orbl);
- for (r = 0; r < 4; r++) {
- ddist = ((float)orbd[r])/16.0f;
- drad = (M_PI * ((float)orbl[r]) / 180.0f)*1.41f;
- nxo = ddist*cos(drad);
- nyo = ddist*sin(drad);
- if (ny+nyo>0 && ny+nyo<YRES && nx+nxo>0 && nx+nxo<XRES) {
- addpixel(vid, nx+nxo, ny+nyo, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors), 255-orbd[r]);
- if (cmode == CM_FIRE && r == 1) {
- fire_rv = fire_r[(ny+nyo)/CELL][(nx+nxo)/CELL];
- fire_rv += 1;
- if (fire_rv>255) fire_rv = 255;
- fire_r[(ny+nyo)/CELL][(nx+nxo)/CELL] = fire_rv;
- }
- }
- addpixel(vid, nx, ny, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors), 200);
- }
- if (DEBUG_MODE) {//draw lines connecting portals
- blendpixel(vid,nx,ny, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors),255);
- if (mousex==(nx) && mousey==(ny))
+ for (y=-3; y<4; y++)
{
- int z;
- for (z = 0; z<NPART; z++) {
- if (parts[z].type)
- {
- if (parts[z].type==PT_PRTO&&parts[z].tmp==parts[i].tmp)
- xor_line(nx,ny,(int)(parts[z].x+0.5f),(int)(parts[z].y+0.5f),vid);
- }
- }
+ if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2))
+ blendpixel(vid, x+nx, y+ny, colr, colg, colb, 30);
+ if (abs(x)+abs(y) <=3 && abs(x)+abs(y))
+ blendpixel(vid, x+nx, y+ny, colr, colg, colb, 20);
+ if (abs(x)+abs(y) == 2)
+ blendpixel(vid, x+nx, y+ny, colr, colg, colb, 10);
}
}
+#endif
}
- else if (t==PT_PRTO)
- {
- int nxo = 0;
- int nyo = 0;
- int fire_bv = 0;
- float drad = 0.0f;
- float ddist = 0.0f;
- orbitalparts_get(parts[i].life, parts[i].ctype, orbd, orbl);
- for (r = 0; r < 4; r++) {
- ddist = ((float)orbd[r])/16.0f;
- drad = (M_PI * ((float)orbl[r]) / 180.0f)*1.41f;
- nxo = ddist*cos(drad);
- nyo = ddist*sin(drad);
- if (ny+nyo>0 && ny+nyo<YRES && nx+nxo>0 && nx+nxo<XRES) {
- addpixel(vid, nx+nxo, ny+nyo, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors), 255-orbd[r]);
- if (cmode == CM_FIRE && r == 1) {
- fire_bv = fire_b[(ny+nyo)/CELL][(nx+nxo)/CELL];
- fire_bv += 1;
- if (fire_bv>255) fire_bv = 255;
- fire_b[(ny+nyo)/CELL][(nx+nxo)/CELL] = fire_bv;
- }
- }
- addpixel(vid, nx, ny, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors), 200);
- }
- if (DEBUG_MODE) {//draw lines connecting portals
- blendpixel(vid,nx,ny, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors),255);
- if (mousex==(nx) && mousey==(ny))
- {
- int z;
- for (z = 0; z<NPART; z++) {
- if (parts[z].type)
- {
- if (parts[z].type==PT_PRTI&&parts[z].tmp==parts[i].tmp)
- xor_line(nx,ny,(int)(parts[z].x+0.5f),(int)(parts[z].y+0.5f),vid);
- }
- }
- }
- }
- }
- else if ((t==PT_BIZR||t==PT_BIZRG||t==PT_BIZRS)&&parts[i].ctype)
- {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- if (fabs(parts[i].vx)+fabs(parts[i].vy)>0 &&(cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)) {
- fg = 0;
- fb = 0;
- fr = 0;
- fg = cg/40 * fabs(parts[i].vx)+fabs(parts[i].vy);
- fb = cb/40 * fabs(parts[i].vx)+fabs(parts[i].vy);
- fr = cr/40 * fabs(parts[i].vx)+fabs(parts[i].vy);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB((int)restrict_flt(cr, 0, 255), (int)restrict_flt(cg, 0, 255), (int)restrict_flt(cb, 0, 255));
- x = nx/CELL;
- y = ny/CELL;
- fg += fire_g[y][x];
- if (fg > 255) fg = 255;
- fire_g[y][x] = fg;
- fb += fire_b[y][x];
- if (fb > 255) fb = 255;
- fire_b[y][x] = fb;
- fr += fire_r[y][x];
- if (fr > 255) fr = 255;
- fire_r[y][x] = fr;
- }
- else
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else if (t==PT_PIPE)
- {
- if (parts[i].ctype==2)
- {
- cr = 50;
- cg = 1;
- cb = 1;
- }
- else if (parts[i].ctype==3)
- {
- cr = 1;
- cg = 50;
- cb = 1;
- }
- else if (parts[i].ctype==4)
- {
- cr = 1;
- cg = 1;
- cb = 50;
- }
- else if (parts[i].temp<272.15&&parts[i].ctype!=1)
- {
- if (parts[i].temp>173.25&&parts[i].temp<273.15)
- {
- cr = 50;
- cg = 1;
- cb = 1;
- }
- if (parts[i].temp>73.25&&parts[i].temp<=173.15)
- {
- cr = 1;
- cg = 50;
- cb = 1;
- }
- if (parts[i].temp>=0&&parts[i].temp<=73.15)
- {
- cr = 1;
- cg = 1;
- cb = 50;
- }
- }
- else
- {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- }
- if ((parts[i].tmp&0xFF)>0 && (parts[i].tmp&0xFF)<PT_NUM)
- {
- cr = PIXR(ptypes[parts[i].tmp&0xFF].pcolors);
- cg = PIXG(ptypes[parts[i].tmp&0xFF].pcolors);
- cb = PIXB(ptypes[parts[i].tmp&0xFF].pcolors);
- }
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
-
-
+ if(pixel_mode & PMODE_SPARK)
+ {
+ flicker = rand()%20;
+#ifdef OGLR
+ //Oh god, this is awful
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx-5;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 1.0f - ((float)flicker)/30;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx+5;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny-5;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 1.0f - ((float)flicker)/30;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny+5;
+ cline++;
+#else
+ gradv = 4*parts[i].life + flicker;
+ for (x = 0; gradv>0.5; x++) {
+ addpixel(vid, nx+x, ny, colr, colg, colb, gradv);
+ addpixel(vid, nx-x, ny, colr, colg, colb, gradv);
- }
- else if (t==PT_INVIS && (pv[ny/CELL][nx/CELL]>4.0f ||pv[ny/CELL][nx/CELL]<-4.0f))
- {
- blendpixel(vid, nx, ny, 15, 0, 150, 100);
- }
- else if (t==PT_ACID)
- {
- if (parts[i].life>75) parts[i].life = 75;
- if (parts[i].life<49) parts[i].life = 49;
- s = (parts[i].life-49)*3;
- if (s==0) s = 1;
- cr = 0x86 + s*4;
- cg = 0x36 + s*1;
- cb = 0x90 + s*2;
-
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
-
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
-
- if (cmode==CM_BLOB)
- {
- blendpixel(vid, nx+1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 223);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 223);
-
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112);
- }
- }
- else if (t==PT_NEUT)
- {
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors;
- cg = 8;
- cb = 12;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
+ addpixel(vid, nx, ny+x, colr, colg, colb, gradv);
+ addpixel(vid, nx, ny-x, colr, colg, colb, gradv);
+ gradv = gradv/1.5f;
}
- else
- {
- cr = 0x20;
- cg = 0xE0;
- cb = 0xFF;
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- }
- else if (t==PT_FILT)
- {
- int temp_bin = (int)((parts[i].temp-273.0f)*0.025f);
- if (temp_bin < 0) temp_bin = 0;
- if (temp_bin > 25) temp_bin = 25;
- parts[i].ctype = 0x1F << temp_bin;
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, 127);
- }
- else if (t==PT_BRAY && parts[i].tmp==0)
- {
- int trans = parts[i].life * 7;
- if (trans>255) trans = 255;
- if (parts[i].ctype) {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, trans);
- } else
- blendpixel(vid, nx, ny, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors), trans);
- }
- else if (t==PT_BRAY && parts[i].tmp==1)
- {
- int trans = parts[i].life/4;
- if (trans>255) trans = 255;
- if (parts[i].ctype) {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- blendpixel(vid, nx, ny, cr, cg, cb, trans);
- } else
- blendpixel(vid, nx, ny, PIXR(ptypes[t].pcolors), PIXG(ptypes[t].pcolors), PIXB(ptypes[t].pcolors), trans);
- }
- else if (t==PT_BRAY && parts[i].tmp==2)
- {
- int trans = parts[i].life*100;
- if (trans>255) trans = 255;
- blendpixel(vid, nx, ny, 255, 150, 50, trans);
- }
- else if (t==PT_PHOT)
- {
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr>255?255:cr,cg>255?255:cg,cb>255?255:cb);
- cr >>= 4;
- cg >>= 4;
- cb >>= 4;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- if(cmode == CM_PERS){
- if(parts[i].pavg[0] && parts[i].pavg[1])
- {
- draw_line(vid, nx, ny, parts[i].pavg[0], parts[i].pavg[1], cr, cg, cb, XRES+BARSIZE);
- }
- else
- {
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr, cg, cb);
- }
- } else {
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- }
- }
- //Life can be 11 too, so don't just check for 10
- else if (t==PT_SWCH && parts[i].life >= 10)
- {
- x = nx;
- y = ny;
- blendpixel(vid,x,y,17,217,24,255);
+#endif
}
- else if (t==PT_SMKE)
- {
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- x = nx/CELL;
- y = ny/CELL;
- cg = 10;
- cb = 10;
- cr = 10;
- cg += fire_g[y][x];
- if (cg > 50) cg = 50;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 50) cb = 50;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 50) cr = 50;
- fire_r[y][x] = cr;
- }
- else
- {
- for (x=-3; x<4; x++)
- {
- for (y=-3; y<4; y++)
- {
- if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2))
- blendpixel(vid,x+nx,y+ny,100,100,100,30);
- if (abs(x)+abs(y) <=3 && abs(x)+abs(y))
- blendpixel(vid,x+nx,y+ny,100,100,100,10);
- if (abs(x)+abs(y) == 2)
- blendpixel(vid,x+nx,y+ny,100,100,100,20);
- }
- }
+ if(pixel_mode & PMODE_FLARE)
+ {
+ flicker = rand()%20;
+#ifdef OGLR
+ //Oh god, this is awful
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx-10;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 1.0f - ((float)flicker)/40;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx+10;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny-10;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 1.0f - ((float)flicker)/30;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny+10;
+ cline++;
+#else
+ gradv = flicker + fabs(parts[i].vx)*17 + fabs(parts[i].vy)*17;
+ blendpixel(vid, nx, ny, colr, colg, colb, (gradv*4)>255?255:(gradv*4) );
+ blendpixel(vid, nx+1, ny, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ blendpixel(vid, nx-1, ny, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ blendpixel(vid, nx, ny+1, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ blendpixel(vid, nx, ny-1, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ if (gradv>255) gradv=255;
+ blendpixel(vid, nx+1, ny-1, colr, colg, colb, gradv);
+ blendpixel(vid, nx-1, ny-1, colr, colg, colb, gradv);
+ blendpixel(vid, nx+1, ny+1, colr, colg, colb, gradv);
+ blendpixel(vid, nx-1, ny+1, colr, colg, colb, gradv);
+ for (x = 1; gradv>0.5; x++) {
+ addpixel(vid, nx+x, ny, colr, colg, colb, gradv);
+ addpixel(vid, nx-x, ny, colr, colg, colb, gradv);
+ addpixel(vid, nx, ny+x, colr, colg, colb, gradv);
+ addpixel(vid, nx, ny-x, colr, colg, colb, gradv);
+ gradv = gradv/1.2f;
}
+#endif
}
- else if (t==PT_WTRV)
- {
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- x = nx/CELL;
- y = ny/CELL;
- cg = PIXG(ptypes[t].pcolors)/3;
- cb = PIXB(ptypes[t].pcolors)/3;
- cr = PIXR(ptypes[t].pcolors)/3;
- cg += fire_g[y][x];
- if (cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2;
- fire_r[y][x] = cr;
- }
- else
- {
- for (x=-3; x<4; x++)
- {
- for (y=-3; y<4; y++)
- {
- if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2))
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30);
- if (abs(x)+abs(y) <=3 && abs(x)+abs(y))
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10);
- if (abs(x)+abs(y) == 2)
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20);
- }
- }
+ if(pixel_mode & PMODE_LFLARE)
+ {
+ flicker = rand()%20;
+#ifdef OGLR
+ //Oh god, this is awful
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx-70;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 1.0f - ((float)flicker)/30;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx+70;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny-70;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 1.0f - ((float)flicker)/50;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny;
+ cline++;
+
+ lineC[clineC++] = ((float)colr)/255.0f;
+ lineC[clineC++] = ((float)colg)/255.0f;
+ lineC[clineC++] = ((float)colb)/255.0f;
+ lineC[clineC++] = 0.0f;
+ lineV[clineV++] = fnx;
+ lineV[clineV++] = fny+70;
+ cline++;
+#else
+ gradv = flicker + fabs(parts[i].vx)*17 + fabs(parts[i].vy)*17;
+ blendpixel(vid, nx, ny, colr, colg, colb, (gradv*4)>255?255:(gradv*4) );
+ blendpixel(vid, nx+1, ny, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ blendpixel(vid, nx-1, ny, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ blendpixel(vid, nx, ny+1, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ blendpixel(vid, nx, ny-1, colr, colg, colb, (gradv*2)>255?255:(gradv*2) );
+ if (gradv>255) gradv=255;
+ blendpixel(vid, nx+1, ny-1, colr, colg, colb, gradv);
+ blendpixel(vid, nx-1, ny-1, colr, colg, colb, gradv);
+ blendpixel(vid, nx+1, ny+1, colr, colg, colb, gradv);
+ blendpixel(vid, nx-1, ny+1, colr, colg, colb, gradv);
+ for (x = 1; gradv>0.5; x++) {
+ addpixel(vid, nx+x, ny, colr, colg, colb, gradv);
+ addpixel(vid, nx-x, ny, colr, colg, colb, gradv);
+ addpixel(vid, nx, ny+x, colr, colg, colb, gradv);
+ addpixel(vid, nx, ny-x, colr, colg, colb, gradv);
+ gradv = gradv/1.01f;
}
+#endif
}
- else if (t==PT_O2)
- {
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- x = nx/CELL;
- y = ny/CELL;
- cg = PIXG(ptypes[t].pcolors)/3;
- cb = PIXB(ptypes[t].pcolors)/3;
- cr = PIXR(ptypes[t].pcolors)/3;
- cg += fire_g[y][x];
- if (cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2;
- fire_r[y][x] = cr;
- }
- else
+ //Fire effects
+ if(firea && (pixel_mode & FIRE_BLEND))
+ {
+#ifdef OGLR
+ smokeV[csmokeV++] = nx;
+ smokeV[csmokeV++] = ny;
+ smokeC[csmokeC++] = ((float)firer)/255.0f;
+ smokeC[csmokeC++] = ((float)fireg)/255.0f;
+ smokeC[csmokeC++] = ((float)fireb)/255.0f;
+ smokeC[csmokeC++] = ((float)firea)/255.0f;
+ csmoke++;
+#else
+ firea /= 8;
+ if(cmode==CM_FIRE || cmode==CM_BLOB || cmode==CM_FANCY)
{
+ fire_r[ny/CELL][nx/CELL] = (firea*firer + (255-firea)*fire_r[ny/CELL][nx/CELL]) >> 8;
+ fire_g[ny/CELL][nx/CELL] = (firea*fireg + (255-firea)*fire_g[ny/CELL][nx/CELL]) >> 8;
+ fire_b[ny/CELL][nx/CELL] = (firea*fireb + (255-firea)*fire_b[ny/CELL][nx/CELL]) >> 8;
+ } else {
+ //This smoke rendering style is horrendously slow, optimise, optimise, optimise!
for (x=-3; x<4; x++)
{
for (y=-3; y<4; y++)
{
if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2))
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30);
+ blendpixel(vid, x+nx, y+ny, firer, fireg, fireb, (30*(firea))>>8);
if (abs(x)+abs(y) <=3 && abs(x)+abs(y))
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10);
+ blendpixel(vid, x+nx, y+ny, firer, fireg, fireb, (20*(firea))>>8);
if (abs(x)+abs(y) == 2)
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20);
+ blendpixel(vid, x+nx, y+ny, firer, fireg, fireb, (10*(firea))>>8);
}
}
}
+#endif
}
- else if (t==PT_H2)
+ if(firea && (pixel_mode & FIRE_ADD))
{
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- x = nx/CELL;
- y = ny/CELL;
- cg = PIXG(ptypes[t].pcolors)/3;
- cb = PIXB(ptypes[t].pcolors)/3;
- cr = PIXR(ptypes[t].pcolors)/3;
- cg += fire_g[y][x];
- if (cg > PIXG(ptypes[t].pcolors)/2) cg = PIXG(ptypes[t].pcolors)/2;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > PIXB(ptypes[t].pcolors)/2) cb = PIXB(ptypes[t].pcolors)/2;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > PIXR(ptypes[t].pcolors)/2) cr = PIXR(ptypes[t].pcolors)/2;
- fire_r[y][x] = cr;
- }
- else
+#ifdef OGLR
+ fireV[cfireV++] = nx;
+ fireV[cfireV++] = ny;
+ fireC[cfireC++] = ((float)firer)/255.0f;
+ fireC[cfireC++] = ((float)fireg)/255.0f;
+ fireC[cfireC++] = ((float)fireb)/255.0f;
+ fireC[cfireC++] = ((float)firea)/255.0f;
+ cfire++;
+#else
+ firea /= 8;
+ if(cmode==CM_FIRE || cmode==CM_BLOB || cmode==CM_FANCY)
{
+ firer = ((firea*firer) >> 8) + fire_r[ny/CELL][nx/CELL];
+ fireg = ((firea*fireg) >> 8) + fire_g[ny/CELL][nx/CELL];
+ fireb = ((firea*fireb) >> 8) + fire_b[ny/CELL][nx/CELL];
+
+ if(firer>255)
+ firer = 255;
+ if(fireg>255)
+ fireg = 255;
+ if(fireb>255)
+ fireb = 255;
+
+ fire_r[ny/CELL][nx/CELL] = firer;
+ fire_g[ny/CELL][nx/CELL] = fireg;
+ fire_b[ny/CELL][nx/CELL] = fireb;
+ } else {
for (x=-3; x<4; x++)
{
for (y=-3; y<4; y++)
{
if (abs(x)+abs(y) <2 && !(abs(x)==2||abs(y)==2))
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 30);
+ addpixel(vid, x+nx, y+ny, firer, fireg, fireb, (175*(firea))>>8);
if (abs(x)+abs(y) <=3 && abs(x)+abs(y))
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 10);
+ addpixel(vid, x+nx, y+ny, firer, fireg, fireb, (100*(firea))>>8);
if (abs(x)+abs(y) == 2)
- blendpixel(vid,x+nx,y+ny, PIXR(ptypes[t].pcolors)/1.6, PIXG(ptypes[t].pcolors)/1.6, PIXB(ptypes[t].pcolors)/1.6, 20);
+ addpixel(vid, x+nx, y+ny, firer, fireg, fireb, (55*(firea))>>8);
}
}
}
+#endif
}
- else if (t==PT_THDR)
- {
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors;
- cg = 16;
- cb = 20;
- cr = 12;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cr = 0xFF;
- cg = 0xFF;
- cb = 0xA0;
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- }
- else if (t==PT_GLOW)
- {
- fr = restrict_flt(parts[i].temp-(275.13f+32.0f), 0, 128)/50.0f;
- fg = restrict_flt(parts[i].ctype, 0, 128)/50.0f;
- fb = restrict_flt(parts[i].tmp, 0, 128)/50.0f;
-
- cr = restrict_flt(64.0f+parts[i].temp-(275.13f+32.0f), 0, 255);
- cg = restrict_flt(64.0f+parts[i].ctype, 0, 255);
- cb = restrict_flt(64.0f+parts[i].tmp, 0, 255);
-
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr, cg, cb);
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- x = nx/CELL;
- y = ny/CELL;
- fg += fire_g[y][x];
- if (fg > 255) fg = 255;
- fire_g[y][x] = fg;
- fb += fire_b[y][x];
- if (fb > 255) fb = 255;
- fire_b[y][x] = fb;
- fr += fire_r[y][x];
- if (fr > 255) fr = 255;
- fire_r[y][x] = fr;
- }
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 223);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 223);
-
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112);
- }
- }
- else if (t==PT_LCRY)
- {
- uint8 GR = 0x50+((parts[i].life>10?10:parts[i].life)*10);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, GR);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, GR, GR, GR, 223);
- blendpixel(vid, nx-1, ny, GR, GR, GR, 223);
- blendpixel(vid, nx, ny+1, GR, GR, GR, 223);
- blendpixel(vid, nx, ny-1, GR, GR, GR, 223);
-
- blendpixel(vid, nx+1, ny-1, GR, GR, GR, 112);
- blendpixel(vid, nx-1, ny-1, GR, GR, GR, 112);
- blendpixel(vid, nx+1, ny+1, GR, GR, GR, 112);
- blendpixel(vid, nx-1, ny+1, GR, GR, GR, 112);
- }
- }
- else if (t==PT_PCLN)
- {
- uint8 GR = 0x3B+((parts[i].life>10?10:parts[i].life)*19);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR, 10);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, GR, GR, 10, 223);
- blendpixel(vid, nx-1, ny, GR, GR, 10, 223);
- blendpixel(vid, nx, ny+1, GR, GR, 10, 223);
- blendpixel(vid, nx, ny-1, GR, GR, 10, 223);
-
- blendpixel(vid, nx+1, ny-1, GR, GR, 10, 112);
- blendpixel(vid, nx-1, ny-1, GR, GR, 10, 112);
- blendpixel(vid, nx+1, ny+1, GR, GR, 10, 112);
- blendpixel(vid, nx-1, ny+1, GR, GR, 10, 112);
- }
- }
- else if (t==PT_PBCN)
- {
- uint8 GR = 0x3B+((parts[i].life>10?10:parts[i].life)*19);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, GR/2, 10);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, GR, GR/2, 10, 223);
- blendpixel(vid, nx-1, ny, GR, GR/2, 10, 223);
- blendpixel(vid, nx, ny+1, GR, GR/2, 10, 223);
- blendpixel(vid, nx, ny-1, GR, GR/2, 10, 223);
-
- blendpixel(vid, nx+1, ny-1, GR, GR/2, 10, 112);
- blendpixel(vid, nx-1, ny-1, GR, GR/2, 10, 112);
- blendpixel(vid, nx+1, ny+1, GR, GR/2, 10, 112);
- blendpixel(vid, nx-1, ny+1, GR, GR/2, 10, 112);
- }
- }
- else if (t==PT_DLAY)
- {
- int stage = (int)(((float)parts[i].life/(parts[i].temp-273.15))*100.0f);
- cr = PIXR(ptypes[t].pcolors)+stage;
- cg = PIXG(ptypes[t].pcolors)+stage;
- cb = PIXB(ptypes[t].pcolors)+stage;
- if(cr>255)
- cr = 255;
- if(cg>255)
- cg = 255;
- if(cb>255)
- cb = 255;
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(cr, cg, cb);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 223);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 223);
-
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112);
- }
- }
- else if (t==PT_HSWC)
- {
- uint8 GR = 0x3B+((parts[i].life>10?10:parts[i].life)*19);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, 10, 10);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, GR, 10, 10, 223);
- blendpixel(vid, nx-1, ny, GR, 10, 10, 223);
- blendpixel(vid, nx, ny+1, GR, 10, 10, 223);
- blendpixel(vid, nx, ny-1, GR, 10, 10, 223);
-
- blendpixel(vid, nx+1, ny-1, GR, 10, 10, 112);
- blendpixel(vid, nx-1, ny-1, GR, 10, 10, 112);
- blendpixel(vid, nx+1, ny+1, GR, 10, 10, 112);
- blendpixel(vid, nx-1, ny+1, GR, 10, 10, 112);
- }
- }
- else if (t==PT_PVOD)
- {
- uint8 GR = 0x3B+((parts[i].life>10?10:parts[i].life)*16);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(GR, 30, 30);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, GR, 30, 30, 223);
- blendpixel(vid, nx-1, ny, GR, 30, 30, 223);
- blendpixel(vid, nx, ny+1, GR, 30, 30, 223);
- blendpixel(vid, nx, ny-1, GR, 30, 30, 223);
-
- blendpixel(vid, nx+1, ny-1, GR, 30, 30, 112);
- blendpixel(vid, nx-1, ny-1, GR, 30, 30, 112);
- blendpixel(vid, nx+1, ny+1, GR, 30, 30, 112);
- blendpixel(vid, nx-1, ny+1, GR, 30, 30, 112);
- }
- }
- else if (t==PT_STOR)
- {
- if(parts[i].tmp){
- vid[ny*(XRES+BARSIZE)+nx] = PIXPACK(0x50DFDF);
- } else {
- vid[ny*(XRES+BARSIZE)+nx] = PIXPACK(0x20AFAF);
- }
- }
- else if (t==PT_PUMP)
- {
- uint8 GR = 0x3B+((parts[i].life>10?10:parts[i].life)*19);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(10, 10, GR);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, 10, 10, GR, 223);
- blendpixel(vid, nx-1, ny, 10, 10, GR, 223);
- blendpixel(vid, nx, ny+1, 10, 10, GR, 223);
- blendpixel(vid, nx, ny-1, 10, 10, GR, 223);
-
- blendpixel(vid, nx+1, ny-1, 10, 10, GR, 112);
- blendpixel(vid, nx-1, ny-1, 10, 10, GR, 112);
- blendpixel(vid, nx+1, ny+1, 10, 10, GR, 112);
- blendpixel(vid, nx-1, ny+1, 10, 10, GR, 112);
- }
- }
- else if (t==PT_GPMP)
- {
- uint8 GR = 0x3B+((parts[i].life>10?10:parts[i].life)*19);
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(10, GR, GR);
- if (cmode == CM_BLOB) {
- blendpixel(vid, nx+1, ny, 10, GR, GR, 223);
- blendpixel(vid, nx-1, ny, 10, GR, GR, 223);
- blendpixel(vid, nx, ny+1, 10, GR, GR, 223);
- blendpixel(vid, nx, ny-1, 10, GR, GR, 223);
-
- blendpixel(vid, nx+1, ny-1, 10, GR, GR, 112);
- blendpixel(vid, nx-1, ny-1, 10, GR, GR, 112);
- blendpixel(vid, nx+1, ny+1, 10, GR, GR, 112);
- blendpixel(vid, nx-1, ny+1, 10, GR, GR, 112);
- }
- }
- else if (t==PT_PLSM)
- {
- float ttemp = (float)parts[i].life;
- int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3);
- uint8 R = plasma_data[caddress];
- uint8 G = plasma_data[caddress+1];
- uint8 B = plasma_data[caddress+2];
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cr = R/8;
- cg = G/8;
- cb = B/8;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cr = R;
- cg = G;
- cb = B;
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- } else if (t==PT_HFLM)
- {
- float ttemp = (float)parts[i].life;
- int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3);
- uint8 R = hflm_data[caddress];
- uint8 G = hflm_data[caddress+1];
- uint8 B = hflm_data[caddress+2];
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cr = R/8;
- cg = G/8;
- cb = B/8;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cr = R;
- cg = G;
- cb = B;
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- } else if (t==PT_FIRW&&parts[i].tmp>=3)
- {
- float ttemp = (float)parts[i].tmp-4;
- int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3);
- uint8 R = firw_data[caddress];
- uint8 G = firw_data[caddress+1];
- uint8 B = firw_data[caddress+2];
- if (decorations_enable && parts[i].dcolour)
- {
- int a = (parts[i].dcolour>>24)&0xFF;
- R = (a*((parts[i].dcolour>>16)&0xFF) + (255-a)*R) >> 8;
- G = (a*((parts[i].dcolour>>8)&0xFF) + (255-a)*G) >> 8;
- B = (a*((parts[i].dcolour)&0xFF) + (255-a)*B) >> 8;
- }
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cr = R/2;
- cg = G/2;
- cb = B/2;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cr = R;
- cg = G;
- cb = B;
- blendpixel(vid, nx, ny, cr, cg, cb, 192);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- }
- else if (t==PT_BOMB)
- {
- if (parts[i].tmp==0) {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- if (cmode != CM_CRACK) {
- int newx = 0;
- float flicker = rand()%20;
- float gradv = flicker + fabs(parts[i].vx)*17 + fabs(parts[i].vy)*17;
- blendpixel(vid, nx, ny, cr, cg, cb, (gradv*4)>255?255:(gradv*4) );
- blendpixel(vid, nx+1, ny, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx-1, ny, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx, ny+1, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx, ny-1, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- if (gradv>255) gradv=255;
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, gradv);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, gradv);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, gradv);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, gradv);
- for (newx = 1; gradv>0.5; newx++) {
- addpixel(vid, nx+newx, ny, cr, cg, cb, gradv);
- addpixel(vid, nx-newx, ny, cr, cg, cb, gradv);
-
- addpixel(vid, nx, ny+newx, cr, cg, cb, gradv);
- addpixel(vid, nx, ny-newx, cr, cg, cb, gradv);
- gradv = gradv/1.2f;
- }
- } else {
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- }
- else if (parts[i].tmp==1) {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- if (cmode != CM_CRACK) {
- int newx = 0;
- float flicker = rand()%20;
- float gradv = 4*parts[i].life + flicker;
- for (newx = 0; gradv>0.5; newx++) {
- addpixel(vid, nx+newx, ny, cr, cg, cb, gradv);
- addpixel(vid, nx-newx, ny, cr, cg, cb, gradv);
-
- addpixel(vid, nx, ny+newx, cr, cg, cb, gradv);
- addpixel(vid, nx, ny-newx, cr, cg, cb, gradv);
- gradv = gradv/1.5f;
- }
- } else {
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- }
- else {
- blendpixel(vid, nx, ny, 255, 255, 255, 255);
- }
-
- }
- else if (t==PT_LIGH)
- {
- uint8 R = 235;
- uint8 G = 245;
- uint8 B = 255;
- float a;
- if (parts[i].tmp2!=3)
- {
- a=0.8*parts[i].life/40;
- if (a>0.8) a=0.8;
- }
- else
- {
- a=1.0;
- }
- blendpixel(vid, nx, ny, R, G, B, 255);
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cr = a*R;
- cg = a*G;
- cb = a*B;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
-
- if (a>0.3)
- {
- int rx, ry;
- for (rx=-1; rx<2; rx++)
- for (ry=-1; ry<2; ry++)
- if (x+rx>=0 && y+ry>=0 && x+rx<XRES/CELL && y+ry<YRES/CELL && (rx || ry))
- {
- cr = R*(a-0.3)/6;
- cg = G*(a-0.3)/6;
- cb = B*(a-0.3)/6;
- cg += fire_g[y+ry][x+rx];
- if (cg > 255) cg = 255;
- fire_g[y+ry][x+rx] = cg;
- cb += fire_b[y+ry][x+rx];
- if (cb > 255) cb = 255;
- fire_b[y+ry][x+rx] = cb;
- cr += fire_r[y+ry][x+rx];
- if (cr > 255) cr = 255;
- fire_r[y+ry][x+rx] = cr;
- }
- }
- }
- else if (cmode!=CM_NOTHING)
- {
- blendpixel(vid, x, y, R, G, B, 255);
-
- blendpixel(vid, x, y-1, R, G, B, 150);
- blendpixel(vid, x-1, y, R, G, B, 150);
- blendpixel(vid, x+1, y, R, G, B, 150);
- blendpixel(vid, x, y+1, R, G, B, 150);
-
- blendpixel(vid, x-1, y-1, R, G, B, 100);
- blendpixel(vid, x+1, y-1, R, G, B, 100);
- blendpixel(vid, x+1, y+1, R, G, B, 100);
- blendpixel(vid, x-1, y+1, R, G, B, 100);
-
- blendpixel(vid, x, y-2, R, G, B, 50);
- blendpixel(vid, x-2, y, R, G, B, 50);
- blendpixel(vid, x+2, y, R, G, B, 50);
- blendpixel(vid, x, y+2, R, G, B, 50);
- }
- }
- else if (t==PT_DEST)
- {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- if (cmode != CM_CRACK) {
- int newx = 0;
- float flicker = rand()%30;
- float gradv = flicker+(parts[i].life==0?20:1)+parts[i].life*8;
- blendpixel(vid, nx, ny, cr, cg, cb, (gradv*4)>255?255:(gradv*4) );
- blendpixel(vid, nx+1, ny, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx-1, ny, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx, ny+1, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx, ny-1, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- if (gradv>255) gradv=255;
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, gradv);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, gradv);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, gradv);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, gradv);
- for (newx = 1; gradv>0.5; newx++) {
- addpixel(vid, nx+newx, ny, cr, cg, cb, gradv);
- addpixel(vid, nx-newx, ny, cr, cg, cb, gradv);
-
- addpixel(vid, nx, ny+newx, cr, cg, cb, gradv);
- addpixel(vid, nx, ny-newx, cr, cg, cb, gradv);
- div_n=1.2f-0.006*parts[i].life;
- if (div_n<1.01f)
- div_n=1.01f;
- gradv = gradv/div_n;
- }
- } else {
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- }
- else if (t==PT_EMP && parts[i].life)
- {
- cr = parts[i].life*1.5;
- cg = parts[i].life*1.5;
- cb = 200-parts[i].life;
- if (cr>255)
- cr = 255;
- if (cg>255)
- cg = 255;
- if (cb>255)
- cb = 255;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else if (t==PT_GBMB)
- {
- if (parts[i].life<=0) {//not yet detonated
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- if (cmode != CM_CRACK) {
- int newx = 0;
- float flicker = rand()%20;
- float gradv = flicker + fabs(parts[i].vx)*17 + fabs(parts[i].vy)*17;
- blendpixel(vid, nx, ny, cr, cg, cb, (gradv*4)>255?255:(gradv*4) );
- blendpixel(vid, nx+1, ny, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx-1, ny, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx, ny+1, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- blendpixel(vid, nx, ny-1, cr, cg, cb, (gradv*2)>255?255:(gradv*2) );
- if (gradv>255) gradv=255;
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, gradv);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, gradv);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, gradv);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, gradv);
- for (newx = 1; gradv>0.5; newx++) {
- addpixel(vid, nx+newx, ny, cr, cg, cb, gradv);
- addpixel(vid, nx-newx, ny, cr, cg, cb, gradv);
-
- addpixel(vid, nx, ny+newx, cr, cg, cb, gradv);
- addpixel(vid, nx, ny-newx, cr, cg, cb, gradv);
- gradv = gradv/1.2f;
- }
- } else {
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- }
- else {//exploding
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- if (cmode != CM_CRACK) {
- int newx = 0;
- float flicker = rand()%20;
- float gradv = 4*parts[i].life + flicker;
- for (newx = 0; gradv>0.5; newx++) {
- addpixel(vid, nx+newx, ny, cr, cg, cb, gradv);
- addpixel(vid, nx-newx, ny, cr, cg, cb, gradv);
-
- addpixel(vid, nx, ny+newx, cr, cg, cb, gradv);
- addpixel(vid, nx, ny-newx, cr, cg, cb, gradv);
- gradv = gradv/1.5f;
- }
- } else {
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- }
- }
- else if (ptypes[t].properties&PROP_HOT_GLOW && parts[i].temp>(ptransitions[t].thv-800.0f))
- {
- float frequency = 3.1415/(2*ptransitions[t].thv-(ptransitions[t].thv-800.0f));
- int q = (parts[i].temp>ptransitions[t].thv)?ptransitions[t].thv-(ptransitions[t].thv-800.0f):parts[i].temp-(ptransitions[t].thv-800.0f);
- cr = sin(frequency*q) * 226 + PIXR(ptypes[t].pcolors);
- cg = sin(frequency*q*4.55 +3.14) * 34 + PIXG(ptypes[t].pcolors);
- cb = sin(frequency*q*2.22 +3.14) * 64 + PIXB(ptypes[t].pcolors);
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- if (cr<=0)
- cr = 0;
- if (cg<=0)
- cg = 0;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else if (t==PT_FIRE && parts[i].life)
- {
- float ttemp = (float)((int)(parts[i].life/2));
- int caddress = restrict_flt(restrict_flt(ttemp, 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3);
- uint8 R = flm_data[caddress];
- uint8 G = flm_data[caddress+1];
- uint8 B = flm_data[caddress+2];
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cr = R/8;
- cg = G/8;
- cb = B/8;
- x = nx/CELL;
- y = ny/CELL;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- }
- else
- {
- cr = parts[i].life * 8;
- cg = parts[i].life * 2;
- cb = parts[i].life;
- if (cr>255) cr = 255;
- if (cg>192) cg = 212;
- if (cb>128) cb = 192;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }
- // Older Code
- /*if(cmode == 3||cmode==4 || cmode==6)
- {
- cr = parts[i].life / 4;
- cg = parts[i].life / 16;
- cb = parts[i].life / 32;
- if(cr>255) cr = 255;
- if(cg>192) cg = 212;
- if(cb>128) cb = 192;
- x = nx/CELL;
- y = ny/CELL;
- cr += fire_r[y][x];
- if(cr > 255) cr = 255;
- fire_r[y][x] = cr;
- cg += fire_g[y][x];
- if(cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if(cb > 255) cb = 255;
- fire_b[y][x] = cb;
- }
- else
- {
- cr = parts[i].life * 8;
- cg = parts[i].life * 2;
- cb = parts[i].life;
- if(cr>255) cr = 255;
- if(cg>192) cg = 212;
- if(cb>128) cb = 192;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 96);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 96);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 96);
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 32);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 32);
- }*/
- }
- else if (t==PT_LAVA && parts[i].life)
- {
- cr = parts[i].life * 2 + 0xE0;
- cg = parts[i].life * 1 + 0x50;
- cb = parts[i].life/2 + 0x10;
- if (cr>255) cr = 255;
- if (cg>192) cg = 192;
- if (cb>128) cb = 128;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- blendpixel(vid, nx+1, ny, cr, cg, cb, 64);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 64);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 64);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 64);
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- cr /= 32;
- cg /= 32;
- cb /= 32;
- x = nx/CELL;
- y = ny/CELL;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- }
- }
- else if (t==PT_LAVA || t==PT_SPRK)
- {
- vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors;
- if (cmode == CM_FIRE||cmode==CM_BLOB || cmode==CM_FANCY)
- {
- if (t == PT_LAVA)
- {
- cr = 3;
- cg = i%2;
- cb = 0;
- }
- else
- {
- cr = 8;
- cg = 12;
- cb = 16;
- }
- x = nx/CELL;
- y = ny/CELL;
- cr += fire_r[y][x];
- if (cr > 255) cr = 255;
- fire_r[y][x] = cr;
- cg += fire_g[y][x];
- if (cg > 255) cg = 255;
- fire_g[y][x] = cg;
- cb += fire_b[y][x];
- if (cb > 255) cb = 255;
- fire_b[y][x] = cb;
- }
- }
- /*else if((t==PT_COAL || t==PT_BCOL) && parts[i].tmp2 > 100.0f-80.0f){
- float frequency = 3.1415/(2*100.0f-(100.0f-80.0f));
- int q = (parts[i].tmp2>100.0f)?100.0f-(100.0f-80.0f):parts[i].tmp2-(100.0f-80.0f);
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
-
- cr += parts[i].tmp2;
- cg += parts[i].tmp2;
- cb += parts[i].tmp2;
-
-
- cr += sin(frequency*q) * 226;
- cg += sin(frequency*q*4.55 +3.14) * 34;
- cb += sin(frequency*q*2.22 +3.14) * 64;
-
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- if (cr<=0)
- cr = 0;
- if (cg<=0)
- cg = 0;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }*/
- else if(t==PT_COAL || t==PT_BCOL){
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- //cb = PIXB(ptypes[t].pcolors);
-
- cr += (parts[i].tmp2-295.15f)/3;
- //cg += (parts[i].tmp2-273.15f)/3;
- //cb += (parts[i].tmp2-273.15f)/3;
- if (cr>=170)
- cr = 170;
- if (cr<=cg)
- cr = cg;
-
- cg = cb = cr;
-
- if((parts[i].temp-295.15f) > 300.0f-200.0f)
- {
- float frequency = 3.1415/(2*300.0f-(300.0f-200.0f));
- int q = ((parts[i].temp-295.15f)>300.0f)?300.0f-(300.0f-200.0f):(parts[i].temp-295.15f)-(300.0f-200.0f);
-
- cr += sin(frequency*q) * 226;
- cg += sin(frequency*q*4.55 +3.14) * 34;
- cb += sin(frequency*q*2.22 +3.14) * 64;
- }
-
- if (cr>=255)
- cr = 255;
- if (cg>=255)
- cg = 255;
- if (cb>=255)
- cb = 255;
- if (cr<=0)
- cr = 0;
- if (cg<=0)
- cg = 0;
- if (cb<=0)
- cb = 0;
- blendpixel(vid, nx, ny, cr, cg, cb, 255);
- }
- else //if no special effect, draw a simple pixel
- vid[ny*(XRES+BARSIZE)+nx] = ptypes[t].pcolors;
}
- else //heat view
- {
- float ttemp = parts[i].temp+(-MIN_TEMP);
- int caddress = restrict_flt((int)( restrict_flt(ttemp, 0.0f, MAX_TEMP+(-MIN_TEMP)) / ((MAX_TEMP+(-MIN_TEMP))/1024) ) *3, 0.0f, (1024.0f*3)-3);
- uint8 R = color_data[caddress];
- uint8 G = color_data[caddress+1];
- uint8 B = color_data[caddress+2];
-
- if (t==PT_STKM) //Stick man should be visible in heat mode
- {
- char buff[10]; //Buffer for HP
-
- if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
- {
- sprintf(buff, "%3d", parts[i].life); //Show HP
- drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
- }
-
- for (r=-2; r<=1; r++)
- {
- s = XRES+BARSIZE;
- vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B);
- vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B);
- vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B);
- vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B);
- }
- draw_line(vid , nx, ny+3, player.legs[0], player.legs[1], R, G, B, s);
- draw_line(vid , player.legs[0], player.legs[1], player.legs[4], player.legs[5], R, G, B, s);
- draw_line(vid , nx, ny+3, player.legs[8], player.legs[9], R, G, B, s);
- draw_line(vid , player.legs[8], player.legs[9], player.legs[12], player.legs[13], R, G, B, s);
- }
- else if (t==PT_STKM2) //Stick man should be visible in heat mode
- {
- char buff[10]; //Buffer for HP
-
- if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
- {
- sprintf(buff, "%3d", parts[i].life); //Show HP
- drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
- }
-
- for (r=-2; r<=1; r++)
- {
- s = XRES+BARSIZE;
- vid[(ny-2)*s+nx+r] = PIXRGB (R, G, B);
- vid[(ny+2)*s+nx+r+1] = PIXRGB (R, G, B);
- vid[(ny+r+1)*s+nx-2] = PIXRGB (R, G, B);
- vid[(ny+r)*s+nx+2] = PIXRGB (R, G, B);
- }
- draw_line(vid , nx, ny+3, player2.legs[0], player2.legs[1], R, G, B, s);
- draw_line(vid , player2.legs[0], player2.legs[1], player2.legs[4], player2.legs[5], R, G, B, s);
- draw_line(vid , nx, ny+3, player2.legs[8], player2.legs[9], R, G, B, s);
- draw_line(vid , player2.legs[8], player2.legs[9], player2.legs[12], player2.legs[13], R, G, B, s);
- }
- else if (t==PT_FIGH) //Fighter should be visible in heat mode
- {
- char buff[10]; //Buffer for HP
- playerst *figh = &fighters[(unsigned char)parts[i].tmp];
-
- if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
- {
- sprintf(buff, "%3d", parts[i].life); //Show HP
- drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
- }
+ }
+ }
+#ifdef OGLR
+
+ //Go into array mode
+ glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ if(cflat)
+ {
+ // -- BEGIN FLAT -- //
+ //Set point size (size of fire texture)
+ glPointSize(1.0f);
+
+ glColorPointer(4, GL_FLOAT, 0, &flatC[0]);
+ glVertexPointer(2, GL_INT, 0, &flatV[0]);
+
+ glDrawArrays(GL_POINTS, 0, cflat);
+
+ //Clear some stuff we set
+ // -- END FLAT -- //
+ }
+
+ if(cblob)
+ {
+ // -- BEGIN BLOB -- //
+ glEnable( GL_POINT_SMOOTH ); //Blobs!
+ glPointSize(2.5f);
+
+ glColorPointer(4, GL_FLOAT, 0, &blobC[0]);
+ glVertexPointer(2, GL_INT, 0, &blobV[0]);
+
+ glDrawArrays(GL_POINTS, 0, cblob);
+
+ //Clear some stuff we set
+ glDisable( GL_POINT_SMOOTH );
+ // -- END BLOB -- //
+ }
+
+ if(cglow || cblur)
+ {
+ // -- BEGIN GLOW -- //
+ //Start and prepare fire program
+ glEnable(GL_TEXTURE_2D);
+ glUseProgram(fireProg);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, glowAlpha);
+ glUniform1i(glGetUniformLocation(fireProg, "fireAlpha"), 0);
+
+ glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);
+
+ //Make sure we can use texture coords on points
+ glEnable(GL_POINT_SPRITE);
+ glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
+ glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
+
+ //Set point size (size of fire texture)
+ glPointSize(11.0f);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
- s = XRES+BARSIZE;
- //head
- draw_line(vid , nx, ny+2, nx+2, ny, R, G, B, s);
- draw_line(vid , nx+2, ny, nx, ny-2, R, G, B, s);
- draw_line(vid , nx, ny-2, nx-2, ny, R, G, B, s);
- draw_line(vid , nx-2, ny, nx, ny+2, R, G, B, s);
- //legs
- draw_line(vid , nx, ny+3, figh->legs[0], figh->legs[1], R, G, B, s);
- draw_line(vid , figh->legs[0], figh->legs[1], figh->legs[4], figh->legs[5], R, G, B, s);
- draw_line(vid , nx, ny+3, figh->legs[8], figh->legs[9], R, G, B, s);
- draw_line(vid , figh->legs[8], figh->legs[9], figh->legs[12], figh->legs[13], R, G, B, s);
- }
- else
- {
- vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B);
- //blendpixel(vid, nx+1, ny, R, G, B, 255);
- }
+ if(cglow)
+ {
+ glColorPointer(4, GL_FLOAT, 0, &glowC[0]);
+ glVertexPointer(2, GL_INT, 0, &glowV[0]);
+
+ glDrawArrays(GL_POINTS, 0, cglow);
}
- //blob view!
- if (cmode == CM_BLOB&&t!=PT_FIRE&&t!=PT_PLSM&&t!=PT_HFLM&&t!=PT_NONE&&t!=PT_ACID&&t!=PT_LCRY&&t!=PT_GLOW&&t!=PT_SWCH&&t!=PT_SMKE&&t!=PT_WTRV&&!(t==PT_FIRW&&parts[i].tmp==3)&&t!=PT_LIFE&&t!=PT_H2&&t!=PT_O2)
+
+ glPointSize(7.0f);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ if(cblur)
{
- if (t==PT_PHOT) {
- cg = 0;
- cb = 0;
- cr = 0;
- for (x=0; x<12; x++) {
- cr += (parts[i].ctype >> (x+18)) & 1;
- cb += (parts[i].ctype >> x) & 1;
- }
- for (x=0; x<12; x++)
- cg += (parts[i].ctype >> (x+9)) & 1;
- x = 624/(cr+cg+cb+1);
- cr *= x;
- cg *= x;
- cb *= x;
- cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;
- } else {
- cr = PIXR(ptypes[t].pcolors);
- cg = PIXG(ptypes[t].pcolors);
- cb = PIXB(ptypes[t].pcolors);
- }
+ 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);
+ glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
+ glUseProgram(0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+ // -- END GLOW -- //
+ }
+
+ if(cline)
+ {
+ // -- BEGIN LINES -- //
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable( GL_LINE_SMOOTH );
+ glColorPointer(4, GL_FLOAT, 0, &lineC[0]);
+ glVertexPointer(2, GL_FLOAT, 0, &lineV[0]);
+
+ glDrawArrays(GL_LINE_STRIP, 0, cline);
+
+ //Clear some stuff we set
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_LINE_SMOOTH);
+ // -- END LINES -- //
+ }
+
+ if(cfire || csmoke)
+ {
+ // -- BEGIN FIRE -- //
+ //Start and prepare fire program
+ glEnable(GL_TEXTURE_2D);
+ glUseProgram(fireProg);
+ //glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, fireAlpha);
+ glUniform1i(glGetUniformLocation(fireProg, "fireAlpha"), 0);
+
+ //Make sure we can use texture coords on points
+ glEnable(GL_POINT_SPRITE);
+ glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
+ glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
+
+ //Set point size (size of fire texture)
+ glPointSize(CELL*3);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
- //if(vid[(ny-1)*YRES+(nx-1)]!=0){
- // blendpixel(vid, nx, ny-1, R, G, B, 46);
- //}
+ if(cfire)
+ {
+ glColorPointer(4, GL_FLOAT, 0, &fireC[0]);
+ glVertexPointer(2, GL_INT, 0, &fireV[0]);
- if (decorations_enable && parts[i].dcolour)
- {
- int a = (parts[i].dcolour>>24)&0xFF;
- cr = (a*((parts[i].dcolour>>16)&0xFF) + (255-a)*cr) >> 8;
- cg = (a*((parts[i].dcolour>>8)&0xFF) + (255-a)*cg) >> 8;
- cb = (a*((parts[i].dcolour)&0xFF) + (255-a)*cb) >> 8;
- }
- blendpixel(vid, nx+1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx-1, ny, cr, cg, cb, 223);
- blendpixel(vid, nx, ny+1, cr, cg, cb, 223);
- blendpixel(vid, nx, ny-1, cr, cg, cb, 223);
-
- blendpixel(vid, nx+1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny-1, cr, cg, cb, 112);
- blendpixel(vid, nx+1, ny+1, cr, cg, cb, 112);
- blendpixel(vid, nx-1, ny+1, cr, cg, cb, 112);
+ glDrawArrays(GL_POINTS, 0, cfire);
}
- if (decorations_enable && cmode!=CM_HEAT && cmode!=CM_LIFE && parts[i].dcolour)
- if(t==PT_LCRY){
- cr = (parts[i].dcolour>>16)&0xFF;
- cg = (parts[i].dcolour>>8)&0xFF;
- cb = (parts[i].dcolour)&0xFF;
-
- if(parts[i].life<10){
- cr /= 10-parts[i].life;
- cg /= 10-parts[i].life;
- cb /= 10-parts[i].life;
- }
-
- /*cr = cr>255?255:cr;
- cg = cg>255?255:cg;
- cb = cb>255?255:cb;*/
- blendpixel(vid, nx, ny, cr, cg, cb, (parts[i].dcolour>>24)&0xFF);
- } else {
- blendpixel(vid, nx, ny, (parts[i].dcolour>>16)&0xFF, (parts[i].dcolour>>8)&0xFF, (parts[i].dcolour)&0xFF, (parts[i].dcolour>>24)&0xFF);
- }
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ if(csmoke)
+ {
+ glColorPointer(4, GL_FLOAT, 0, &smokeC[0]);
+ glVertexPointer(2, GL_INT, 0, &smokeV[0]);
+
+ glDrawArrays(GL_POINTS, 0, csmoke);
+ }
+
+ //Clear some stuff we set
+ glDisable(GL_POINT_SPRITE);
+ glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
+ glUseProgram(0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+ // -- END FIRE -- //
+ }
+
+ glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ //Reset FBO
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ glTranslatef(0, -MENUSIZE, 0);
+
+ //TODO: Do shit on the fbo like gravity lensing or turning stickmen into turds here
+
+ //Drawing the FBO onto the screen sounds like a cool idea now
+ glEnable( GL_TEXTURE_2D );
+ if(cmode==CM_FANCY)
+ {
+ glUseProgram(lensProg);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, partsFboTex);
+ glUniform1i(glGetUniformLocation(lensProg, "pTex"), 0);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, partsTFX);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES, YRES, GL_RED, GL_FLOAT, gravxf);
+ glUniform1i(glGetUniformLocation(lensProg, "tfX"), 1);
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_2D, partsTFY);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES, YRES, GL_GREEN, GL_FLOAT, gravyf);
+ glUniform1i(glGetUniformLocation(lensProg, "tfY"), 2);
+ glActiveTexture(GL_TEXTURE0);
+ //glUniform1f(glGetUniformLocation(lensProg, "xres"), (float)XRES);
+ //glUniform1f(glGetUniformLocation(lensProg, "yres"), (float)YRES);
}
-#endif
- }
-#ifdef OpenGL
- glFlush ();
+ else
+ {
+ glBindTexture(GL_TEXTURE_2D, partsFboTex);
+ glBlendFunc(GL_ONE, GL_ONE);
+ }
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBegin(GL_QUADS);
+ glTexCoord2d(1, 0);
+ glVertex3f(XRES*sdl_scale, (YRES)*sdl_scale, 1.0);
+ glTexCoord2d(0, 0);
+ glVertex3f(0, (YRES)*sdl_scale, 1.0);
+ glTexCoord2d(0, 1);
+ glVertex3f(0, 0, 1.0);
+ glTexCoord2d(1, 1);
+ glVertex3f(XRES*sdl_scale, 0, 1.0);
+ glEnd();
+
+ if(cmode==CM_FANCY)
+ {
+ glUseProgram(0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ glDisable( GL_TEXTURE_2D );
+
+ //Reset coords/offset
+ glTranslatef(0, YRES+MENUSIZE, 0);
+ glScalef(1,-1,1);
+ glBlendFunc(origBlendSrc, origBlendDst);
#endif
}
+
void draw_walls(pixel *vid)
{
int x, y, i, j, cr, cg, cb;
@@ -4455,9 +2943,12 @@ void render_fire(pixel *vid)
void prepare_alpha(int size, float intensity)
{
//TODO: implement size
- int x,y,i,j;
+ int x,y,i,j,c;
float multiplier = 255.0f*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++)
@@ -4467,6 +2958,69 @@ void prepare_alpha(int size, float intensity)
for (x=0; x<CELL*3; x++)
for (y=0; y<CELL*3; y++)
fire_alpha[y][x] = (int)(multiplier*temp[y][x]/(CELL*CELL));
+
+#ifdef OGLR
+ 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));
+ }
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, fireAlpha);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, CELL*3, CELL*3, GL_ALPHA, GL_FLOAT, fire_alphaf);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ memset(glow_alphaf, 0, sizeof(glow_alphaf));
+
+ c = 5;
+
+ glow_alphaf[c][c-1] = 0.4f;
+ glow_alphaf[c][c+1] = 0.4f;
+ glow_alphaf[c-1][c] = 0.4f;
+ glow_alphaf[c+1][c] = 0.4f;
+ for (x = 1; x < 6; x++) {
+ glow_alphaf[c][c-x] += 0.02f;
+ glow_alphaf[c][c+x] += 0.02f;
+ glow_alphaf[c-x][c] += 0.02f;
+ glow_alphaf[c+x][c] += 0.02f;
+ for (y = 1; y < 6; y++) {
+ if(x + y > 7)
+ continue;
+ glow_alphaf[c+x][c-y] += 0.02f;
+ glow_alphaf[c-x][c+y] += 0.02f;
+ glow_alphaf[c+x][c+y] += 0.02f;
+ glow_alphaf[c-x][c-y] += 0.02f;
+ }
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, glowAlpha);
+ 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
}
pixel *render_packed_rgb(void *image, int width, int height, int cmp_size)
@@ -4574,6 +3128,62 @@ void dim_copy_pers(pixel *dst, pixel *src) //for persistent view, reduces rgb sl
void render_zoom(pixel *img) //draws the zoom box
{
+#ifdef OGLR
+ float zcx1, zcx0, zcy1, zcy0, yfactor, xfactor; //X-Factor is shit, btw
+ xfactor = 1.0f/(float)XRES;
+ yfactor = 1.0f/(float)YRES;
+
+ zcx0 = (zoom_x)*xfactor;
+ zcx1 = (zoom_x+ZSIZE)*xfactor;
+ zcy0 = (YRES-zoom_y+1)*yfactor;
+ zcy1 = (YRES-(zoom_y+ZSIZE)+1)*yfactor;
+
+ glEnable(GL_LINE_SMOOTH);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBegin(GL_LINE_STRIP);
+ glVertex3i(zoom_wx-1, YRES+MENUSIZE-zoom_wy, 0);
+ glVertex3i(zoom_wx-1, YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR), 0);
+ glVertex3i(zoom_wx+ZSIZE*ZFACTOR, YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR), 0);
+ glVertex3i(zoom_wx+ZSIZE*ZFACTOR, YRES+MENUSIZE-zoom_wy, 0);
+ glVertex3i(zoom_wx-1, YRES+MENUSIZE-zoom_wy, 0);
+ glEnd();
+ glDisable(GL_LINE_SMOOTH);
+
+ glEnable( GL_TEXTURE_2D );
+ //glReadBuffer(GL_AUX0);
+ glBindTexture(GL_TEXTURE_2D, partsFboTex);
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBegin(GL_QUADS);
+ glTexCoord2d(zcx1, zcy1);
+ glVertex3f(zoom_wx+ZSIZE*ZFACTOR, YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR), 1.0);
+ glTexCoord2d(zcx0, zcy1);
+ glVertex3f(zoom_wx, YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR), 1.0);
+ glTexCoord2d(zcx0, zcy0);
+ glVertex3f(zoom_wx, YRES+MENUSIZE-zoom_wy, 1.0);
+ glTexCoord2d(zcx1, zcy0);
+ glVertex3f(zoom_wx+ZSIZE*ZFACTOR, YRES+MENUSIZE-zoom_wy, 1.0);
+ glEnd();
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable( GL_TEXTURE_2D );
+
+
+ if(zoom_en)
+ {
+ glEnable(GL_COLOR_LOGIC_OP);
+ //glEnable(GL_LINE_SMOOTH);
+ glLogicOp(GL_XOR);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBegin(GL_LINE_STRIP);
+ glVertex3i(zoom_x-1, YRES+MENUSIZE-(zoom_y-1), 0);
+ glVertex3i(zoom_x-1, YRES+MENUSIZE-(zoom_y+ZSIZE), 0);
+ glVertex3i(zoom_x+ZSIZE, YRES+MENUSIZE-(zoom_y+ZSIZE), 0);
+ glVertex3i(zoom_x+ZSIZE, YRES+MENUSIZE-(zoom_y-1), 0);
+ glVertex3i(zoom_x-1, YRES+MENUSIZE-(zoom_y-1), 0);
+ glEnd();
+ glDisable(GL_COLOR_LOGIC_OP);
+ }
+#else
int x, y, i, j;
pixel pix;
drawrect(img, zoom_wx-2, zoom_wy-2, ZSIZE*ZFACTOR+2, ZSIZE*ZFACTOR+2, 192, 192, 192, 255);
@@ -4600,6 +3210,7 @@ void render_zoom(pixel *img) //draws the zoom box
xor_pixel(zoom_x+ZSIZE, zoom_y+j, img);
}
}
+#endif
}
//gets the thumbnail preview for stamps
@@ -4884,6 +3495,41 @@ corrupt:
//draws the cursor
void render_cursor(pixel *vid, int x, int y, int t, int rx, int ry)
{
+#ifdef OGLR
+ int i;
+ if (t<PT_NUM||(t&0xFF)==PT_LIFE||t==SPC_AIR||t==SPC_HEAT||t==SPC_COOL||t==SPC_VACUUM||t==SPC_WIND||t==SPC_PGRV||t==SPC_NGRV)
+ {
+ glEnable(GL_COLOR_LOGIC_OP);
+ glLogicOp(GL_XOR);
+ glBegin(GL_LINE_LOOP);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ if (CURRENT_BRUSH==SQUARE_BRUSH)
+ {
+ glVertex2f(x-rx+1, (YRES+MENUSIZE-y)-ry+1);
+ glVertex2f(x+rx+1, (YRES+MENUSIZE-y)-ry+1);
+ glVertex2f(x+rx+1, (YRES+MENUSIZE-y)+ry+1);
+ glVertex2f(x-rx+1, (YRES+MENUSIZE-y)+ry+1);
+ glVertex2f(x-rx+1, (YRES+MENUSIZE-y)-ry+1);
+ }
+ else if (CURRENT_BRUSH==CIRCLE_BRUSH)
+ {
+ for (i = 0; i < 360; i++)
+ {
+ float degInRad = i*(M_PI/180.0f);
+ glVertex2f((cos(degInRad)*rx)+x, (sin(degInRad)*ry)+YRES+MENUSIZE-y);
+ }
+ }
+ else if (CURRENT_BRUSH==TRI_BRUSH)
+ {
+ glVertex2f(x+1, (YRES+MENUSIZE-y)+ry+1);
+ glVertex2f(x+rx+1, (YRES+MENUSIZE-y)-ry+1);
+ glVertex2f(x-rx+1, (YRES+MENUSIZE-y)-ry+1);
+ glVertex2f(x+1, (YRES+MENUSIZE-y)+ry+1);
+ }
+ glEnd();
+ glDisable(GL_COLOR_LOGIC_OP);
+ }
+#else
int i,j,c;
if (t<PT_NUM||(t&0xFF)==PT_LIFE||t==SPC_AIR||t==SPC_HEAT||t==SPC_COOL||t==SPC_VACUUM||t==SPC_WIND||t==SPC_PGRV||t==SPC_NGRV)
{
@@ -4956,6 +3602,7 @@ void render_cursor(pixel *vid, int x, int y, int t, int rx, int ry)
xor_pixel(x+CELL+c-1, y+i, vid);
}
}
+#endif
}
int sdl_open(void)
@@ -4966,19 +3613,165 @@ int sdl_open(void)
return 0;
}
atexit(SDL_Quit);
-#ifdef OpenGL
+#if defined(OGLR)
sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_OPENGL);
SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
- Enable2D ();
- // glBegin(GL_TRIANGLES);
- // glColor3ub (255, 0, 0);
- // glVertex2d (0, 0);
- // glColor3ub (0, 255, 0);
- // glVertex2d (640,0);
- // glColor3ub (0, 0, 255);
- // glVertex2d (50, 50);
- //glEnd ();
- //glFlush ();
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glOrtho(0, (XRES+BARSIZE)*sdl_scale, 0, (YRES+MENUSIZE)*sdl_scale, -1, 1);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glRasterPos2i(0, (YRES+MENUSIZE));
+ glPixelZoom(sdl_scale, -sdl_scale);
+ //glPixelZoom(1, -1);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ //FBO Texture
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &partsFboTex);
+ glBindTexture(GL_TEXTURE_2D, partsFboTex);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, XRES, YRES, 0, GL_RGBA, GL_FLOAT, NULL);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+
+ //FBO
+ glGenFramebuffers(1, &partsFbo);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glEnable(GL_BLEND);
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, partsFboTex, 0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Reset framebuffer binding
+ glDisable(GL_TEXTURE_2D);
+
+ //Texture for main UI
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &vidBuf);
+ glBindTexture(GL_TEXTURE_2D, vidBuf);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, XRES+BARSIZE, YRES+MENUSIZE, 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);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ //Texture for air to be drawn
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &airBuf);
+ glBindTexture(GL_TEXTURE_2D, airBuf);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 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);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ //Zoom texture
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &zoomTex);
+ glBindTexture(GL_TEXTURE_2D, zoomTex);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 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);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ //Texture for velocity maps for gravity
+ 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);
+
+ 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);
+ glGenTextures(1, &partsTFY);
+ glBindTexture(GL_TEXTURE_2D, partsTFY);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, XRES, YRES, 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);
+
+ 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);
+ glBindTexture(GL_TEXTURE_2D, fireAlpha);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, CELL*3, CELL*3, 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);
+
+ //Glow alpha texture
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &glowAlpha);
+ glBindTexture(GL_TEXTURE_2D, glowAlpha);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 11, 11, 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);
+
+
+ //Blur Alpha texture
+ 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
#ifdef PIX16
if (kiosk_enable)
@@ -5012,7 +3805,57 @@ int sdl_open(void)
#endif
return 1;
}
+#ifdef OGLR
+void loadShaders()
+{
+ GLuint vertexShader, fragmentShader;
+
+ //Particle texture
+ vertexShader = glCreateShader(GL_VERTEX_SHADER);
+ fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+
+ glShaderSource( vertexShader, 1, &fireVertex, NULL);
+ glShaderSource( fragmentShader, 1, &fireFragment, NULL);
+
+ glCompileShader( vertexShader );
+ glCompileShader( fragmentShader );
+
+ fireProg = glCreateProgram();
+ glAttachShader( fireProg, vertexShader );
+ glAttachShader( fireProg, fragmentShader );
+ glLinkProgram( fireProg );
+
+ //Lensing
+ vertexShader = glCreateShader(GL_VERTEX_SHADER);
+ fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+
+ glShaderSource( vertexShader, 1, &lensVertex, NULL);
+ glShaderSource( fragmentShader, 1, &lensFragment, NULL);
+
+ glCompileShader( vertexShader );
+ glCompileShader( fragmentShader );
+
+ lensProg = glCreateProgram();
+ glAttachShader( lensProg, vertexShader );
+ glAttachShader( lensProg, fragmentShader );
+ glLinkProgram( lensProg );
+
+ //Air
+ vertexShader = glCreateShader(GL_VERTEX_SHADER);
+ fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
+
+ glShaderSource( vertexShader, 1, &airVertex, NULL);
+ glShaderSource( fragmentShader, 1, &airFragment, NULL);
+
+ 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];
@@ -5126,35 +3969,3 @@ int draw_debug_info(pixel* vid, int lm, int lx, int ly, int cx, int cy, int line
drawtext(vid, 10, YRES-22, infobuf, 255, 255, 255, 255);
}
}
-
-#ifdef OpenGL
-void Enable2D ()
-{
- int ViewPort[4]; //Holds screen info
-
- glGetIntegerv (GL_VIEWPORT, ViewPort);
-
- glMatrixMode (GL_PROJECTION);
- glPushMatrix ();
- glLoadIdentity ();
-
- glOrtho (0, ViewPort[2], ViewPort[3], 0, -1, 1);
- glMatrixMode (GL_MODELVIEW);
- glPushMatrix ();
- glLoadIdentity ();
-
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glHint( GL_LINE_SMOOTH_HINT, GL_NICEST);
- glHint( GL_POINT_SMOOTH_HINT, GL_NICEST);
-}
-void RenderScene ()
-{
- SDL_GL_SwapBuffers ();
-}
-void ClearScreen()
-{
- glClear(GL_COLOR_BUFFER_BIT);
-}
-#endif