summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-04-21 21:46:37 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-04-21 21:46:37 (GMT)
commit96506610b276be1b4bc1cbc462d991237750fc62 (patch)
treec05e6d55d2a0aa2ad178cfa30f00041a104d6fed /src
parent75a9460c835f4ebea501a89d23e0c5f46da985cc (diff)
downloadpowder-96506610b276be1b4bc1cbc462d991237750fc62.zip
powder-96506610b276be1b4bc1cbc462d991237750fc62.tar.gz
Clean out graphics, add openGL graphics in seperate file, change brush to use unsigned char rather than boolean for bitmap/outline
Diffstat (limited to 'src')
-rw-r--r--src/Graphics.cpp1978
-rw-r--r--src/Graphics.h124
-rw-r--r--src/OpenGLGraphics.cpp399
-rw-r--r--src/RasterGraphics.cpp380
-rw-r--r--src/Renderer.cpp185
-rw-r--r--src/Renderer.h1
-rw-r--r--src/cat/LuaScriptInterface.cpp24
-rw-r--r--src/console/ConsoleView.cpp4
-rw-r--r--src/game/Brush.h55
-rw-r--r--src/game/EllipseBrush.h16
-rw-r--r--src/game/GameController.cpp5
-rw-r--r--src/game/GameView.cpp6
-rw-r--r--src/interface/Engine.cpp5
-rw-r--r--src/interface/Slider.cpp12
-rw-r--r--src/interface/Slider.h1
-rw-r--r--src/interface/Spinner.cpp2
-rw-r--r--src/simulation/Simulation.cpp14
17 files changed, 1157 insertions, 2054 deletions
diff --git a/src/Graphics.cpp b/src/Graphics.cpp
index e03a699..665da67 100644
--- a/src/Graphics.cpp
+++ b/src/Graphics.cpp
@@ -3,56 +3,134 @@
#include <bzlib.h>
#include <string>
#include "Config.h"
-//#include "simulation/Air.h"
-//#include "simulation/Gravity.h"
-//#include "powder.h"
-//#define INCLUDE_PSTRUCT
-//#include "Simulation.h"
-//#include "Graphics.h"
-//#include "ElementGraphics.h"
+#include "Misc.h"
+#include "Graphics.h"
#define INCLUDE_FONTDATA
#include "font.h"
-#include "Misc.h"
-#include "hmap.h"
-
-//unsigned cmode = CM_FIRE;
-unsigned int *render_modes;
-unsigned int render_mode;
-unsigned int colour_mode;
-unsigned int *display_modes;
-unsigned int display_mode;
-//SDL_Surface *sdl_scrn;
-int sdl_scale = 1;
+TPT_INLINE void VideoBuffer::BlendPixel(int x, int y, int r, int g, int b, int a)
+{
+#ifdef PIX32OGL
+ pixel t;
+ if (x<0 || y<0 || x>=Width || y>=Height)
+ return;
+ if (a!=255)
+ {
+ t = Buffer[y*(Width)+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);
+ }
+ Buffer[y*(Width)+x] = PIXRGBA(r,g,b,a);
+#else
+ pixel t;
+ if (x<0 || y<0 || x>=Width || y>=Height)
+ return;
+ if (a!=255)
+ {
+ t = Buffer[y*(Width)+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;
+ }
+ Buffer[y*(Width)+x] = PIXRGB(r,g,b);
+#endif
+}
-/*#ifdef OGLR
-GLuint zoomTex, vidBuf, airBuf, fireAlpha, glowAlpha, blurAlpha, partsFboTex, partsFbo, partsTFX, partsTFY, airPV, airVY, airVX;
-GLuint fireProg, airProg_Pressure, airProg_Velocity, airProg_Cracker, lensProg;
-#endif*/
+TPT_INLINE void VideoBuffer::SetPixel(int x, int y, int r, int g, int b, int a)
+{
+ if (x<0 || y<0 || x>=Width || y>=Height)
+ return;
+#ifdef PIX32OGL
+ Buffer[y*(Width)+x] = PIXRGBA(r,g,b,a);
+#else
+ Buffer[y*(Width)+x] = PIXRGB(r,g,b);
+#endif
+}
-/*
-int emp_decor = 0;
-int sandcolour_r = 0;
-int sandcolour_g = 0;
-int sandcolour_b = 0;
-int sandcolour_frame = 0;
+TPT_INLINE void VideoBuffer::AddPixel(int x, int y, int r, int g, int b, int a)
+{
+ pixel t;
+ if (x<0 || y<0 || x>=Width || y>=Height)
+ return;
+ t = Buffer[y*(Width)+x];
+ r = (a*r + 255*PIXR(t)) >> 8;
+ g = (a*g + 255*PIXG(t)) >> 8;
+ b = (a*b + 255*PIXB(t)) >> 8;
+ if (r>255)
+ r = 255;
+ if (g>255)
+ g = 255;
+ if (b>255)
+ b = 255;
+ Buffer[y*(Width)+x] = PIXRGB(r,g,b);
+}
-unsigned char fire_r[YRES/CELL][XRES/CELL];
-unsigned char fire_g[YRES/CELL][XRES/CELL];
-unsigned char fire_b[YRES/CELL][XRES/CELL];
+TPT_INLINE int VideoBuffer::SetCharacter(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ for (j=0; j<FONT_H; j++)
+ for (i=0; i<w; i++)
+ {
+ if (!bn)
+ {
+ ba = *(rp++);
+ bn = 8;
+ }
+ SetPixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
+ ba >>= 2;
+ bn -= 2;
+ }
+ return x + w;
+}
-unsigned int fire_alpha[CELL*3][CELL*3];
-pixel *pers_bg;
+TPT_INLINE int VideoBuffer::BlendCharacter(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ for (j=0; j<FONT_H; j++)
+ for (i=0; i<w; i++)
+ {
+ if (!bn)
+ {
+ ba = *(rp++);
+ bn = 8;
+ }
+ BlendPixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
+ ba >>= 2;
+ bn -= 2;
+ }
+ return x + w;
+}
-char * flm_data;
-int flm_data_points = 4;
-pixel flm_data_colours[] = {PIXPACK(0xAF9F0F), PIXPACK(0xDFBF6F), PIXPACK(0x60300F), PIXPACK(0x000000)};
-float flm_data_pos[] = {1.0f, 0.9f, 0.5f, 0.0f};
+TPT_INLINE int VideoBuffer::AddCharacter(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ for (j=0; j<FONT_H; j++)
+ for (i=0; i<w; i++)
+ {
+ if (!bn)
+ {
+ ba = *(rp++);
+ bn = 8;
+ }
+ AddPixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
+ ba >>= 2;
+ bn -= 2;
+ }
+ return x + w;
+}
-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};*/
+/**
+ * Common graphics functions, mostly static methods that provide
+ * encoding/decoding of different formats and font metrics
+ */
char * Graphics::GenerateGradient(pixel * colours, float * points, int pointcount, int size)
{
@@ -227,7 +305,6 @@ pixel *Graphics::resample_img(pixel *src, int sw, int sh, int rw, int rh)
int y, x, fxceil, fyceil;
//int i,j,x,y,w,h,r,g,b,c;
pixel *q = NULL;
- //TODO: Actual resampling, this is just cheap nearest pixel crap
if(rw == sw && rh == sh){
//Don't resample
q = (pixel *)malloc(rw*rh*PIXELSIZE);
@@ -346,556 +423,7 @@ pixel *Graphics::rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f
return q;
}
-#ifdef OGLR
-void clearScreenNP(float alpha)
-{
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
-}
-#endif
-
-//an easy way to draw a blob
-void Graphics::drawblob(int x, int y, unsigned char cr, unsigned char cg, unsigned char cb)
-{
- blendpixel(x+1, y, cr, cg, cb, 112);
- blendpixel(x-1, y, cr, cg, cb, 112);
- blendpixel(x, y+1, cr, cg, cb, 112);
- blendpixel(x, y-1, cr, cg, cb, 112);
-
- blendpixel(x+1, y-1, cr, cg, cb, 64);
- blendpixel(x-1, y-1, cr, cg, cb, 64);
- blendpixel(x+1, y+1, cr, cg, cb, 64);
- blendpixel(x-1, y+1, cr, cg, cb, 64);
-}
-
-//draws walls and elements for menu
-/*int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc)
-{
- int i, j, c;
- pixel gc;
- if (x > XRES-26 || x < 0)
- return 26;
- if ((b&0xFF) == PT_LIFE)
- {
- for (j=1; j<15; j++)
- {
- for (i=1; i<27; i++)
- {
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- }
- c = PIXB(pc) + 3*PIXG(pc) + 2*PIXR(pc);
- if (c<544)
- {
- c = 255;
- }
- else
- {
- c = 0;
- }
- drawtext(vid_buf, x+14-textwidth((char *)gmenu[(b>>8)&0xFF].name)/2, y+4, (char *)gmenu[(b>>8)&0xFF].name, c, c, c, 255);
- }
- else if (b>=UI_WALLSTART)
- {
- int ds = 0;
- if (b-UI_WALLSTART>=0 && b-UI_WALLSTART<UI_WALLCOUNT)
- {
- ds = wtypes[b-UI_WALLSTART].drawstyle;
- gc = wtypes[b-UI_WALLSTART].eglow;
- }
- //x = (2+32*((b-22)/1));
- //y = YRES+2+40;
- if (ds==1)
- {
- 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;
- }
- else if (ds==2)
- {
- for (j=1; j<15; j+=2)
- for (i=1; i<27; i+=2)
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- else if (ds==3)
- {
- for (j=1; j<15; j++)
- for (i=1; i<27; i++)
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- }
- else if (ds==4)
- {
- for (j=1; j<15; j++)
- for (i=1; i<27; i++)
- if(i%CELL == j%CELL)
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc;
- else if (i%CELL == (j%CELL)+1 || (i%CELL == 0 && j%CELL == CELL-1))
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = gc;
- else
- vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x202020);
- }
- else
- switch (b)
- {
- case WL_WALLELEC+100:
- 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 WL_EWALL+100:
- 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 WL_STREAM+100:
- 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 WL_SIGN+100:
- 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 WL_ERASE+100:
- 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 SPC_AIR:
- case SPC_HEAT:
- case SPC_COOL:
- case SPC_VACUUM:
- case SPC_WIND:
- case SPC_PGRV:
- case SPC_NGRV:
- case SPC_PROP:
- 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;
- }
- if (b==SPC_AIR)
- drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255);
- else if (b==SPC_HEAT)
- drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255);
- else if (b==SPC_COOL)
- drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255);
- else if (b==SPC_VACUUM)
- drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255);
- else if (b==SPC_WIND)
- drawtext(vid_buf, x+14-textwidth("WIND")/2, y+4, "WIND", c, c, c, 255);
- else if (b==SPC_PGRV)
- drawtext(vid_buf, x+14-textwidth("PGRV")/2, y+4, "PGRV", c, c, c, 255);
- else if (b==SPC_NGRV)
- drawtext(vid_buf, x+14-textwidth("NGRV")/2, y+4, "NGRV", c, c, c, 255);
- else if (b==SPC_PROP)
- drawtext(vid_buf, x+14-textwidth("PROP")/2, y+4, "PROP", 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==WL_ERASE+100)
- {
- 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);
- }
- return 26;
-}*/
-
-/*void draw_menu(pixel *vid_buf, int i, int hover)
-{
- if (i==SEC&&SEC!=0)
- drawrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 0, 255, 255, 255);
- else
- drawrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255);
- if (hover==i)
- {
- fillrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255);
- drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255);
- }
- else
- {
- drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255);
- }
-}*/
-
-/*void draw_color_menu(pixel *vid_buf, int i, int hover)
-{
- drawrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(DECO_SECTIONS*16), 14, 14, 255, 255, 255, 255);
- if (hover==i)
- {
- fillrect(vid_buf, (XRES+BARSIZE)-16, (i*16)+YRES+MENUSIZE-16-(DECO_SECTIONS*16), 14, 14, 255, 255, 255, 255);
- drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(DECO_SECTIONS*16), colorsections[i].icon, 0, 0, 0, 255);
- }
- else
- {
- drawtext(vid_buf, (XRES+BARSIZE)-13, (i*16)+YRES+MENUSIZE-14-(DECO_SECTIONS*16), colorsections[i].icon, 255, 255, 255, 255);
- }
-}*/
-
-//draws a pixel, identical to blendpixel(), except blendpixel has OpenGL support
-TPT_INLINE void Graphics::drawpixel(int x, int y, int r, int g, int b, int a)
-{
-#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;
- 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;
- }
- vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
-#endif
-}
-
-inline int Graphics::drawchar(int x, int y, int c, int r, int g, int b, int a)
-{
- int i, j, w, bn = 0, ba = 0;
- char *rp = font_data + font_ptrs[c];
- w = *(rp++);
- for (j=0; j<FONT_H; j++)
- for (i=0; i<w; i++)
- {
- if (!bn)
- {
- ba = *(rp++);
- bn = 8;
- }
- drawpixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
- ba >>= 2;
- bn -= 2;
- }
- return x + w;
-}
-
-inline int Graphics::addchar(int x, int y, int c, int r, int g, int b, int a)
-{
- int i, j, w, bn = 0, ba = 0;
- char *rp = font_data + font_ptrs[c];
- w = *(rp++);
- for (j=0; j<FONT_H; j++)
- for (i=0; i<w; i++)
- {
- if (!bn)
- {
- ba = *(rp++);
- bn = 8;
- }
- {
- addpixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
- }
- ba >>= 2;
- bn -= 2;
- }
- return x + w;
-}
-
-int Graphics::drawtext(int x, int y, std::string &s, int r, int g, int b, int a)
-{
- return drawtext(x, y, s.c_str(), r, g, b, a);
-}
-
-int Graphics::drawtext(int x, int y, const char *s, int r, int g, int b, int a)
-{
- int sx = x;
- for (; *s; s++)
- {
- if (*s == '\n')
- {
- x = sx;
- y += FONT_H+2;
- }
- else if (*s == '\b')
- {
- switch (s[1])
- {
- case 'w':
- r = g = b = 255;
- break;
- case 'g':
- r = g = b = 192;
- break;
- case 'o':
- r = 255;
- g = 216;
- b = 32;
- break;
- case 'r':
- r = 255;
- g = b = 0;
- break;
- case 'l':
- r = 255;
- g = b = 75;
- break;
- case 'b':
- r = g = 0;
- b = 255;
- break;
- case 't':
- b = 255;
- g = 170;
- r = 32;
- break;
- }
- s++;
- }
- else
- x = drawchar(x, y, *(unsigned char *)s, r, g, b, a);
- }
- return x;
-}
-
-//Draw text with an outline
-int Graphics::drawtext_outline(int x, int y, const char *s, int r, int g, int b, int a, int olr, int olg, int olb, int ola)
-{
- drawtext(x-1, y-1, s, olr, olg, olb, ola);
- drawtext(x+1, y+1, s, olr, olg, olb, ola);
-
- drawtext(x-1, y+1, s, olr, olg, olb, ola);
- drawtext(x+1, y-1, s, olr, olg, olb, ola);
-
- return drawtext(x, y, s, r, g, b, a);
-}
-int Graphics::drawtextwrap(int x, int y, int w, const char *s, int r, int g, int b, int a)
-{
- int sx = x;
- int rh = 12;
- int rw = 0;
- int cw = x;
- int wordlen;
- int charspace;
- while (*s)
- {
- wordlen = strcspn(s," .,!?\n");
- charspace = textwidthx((char *)s, w-(x-cw));
- if (charspace<wordlen && wordlen && w-(x-cw)<w/3)
- {
- x = sx;
- rw = 0;
- y+=FONT_H+2;
- rh+=FONT_H+2;
- }
- for (; *s && --wordlen>=-1; s++)
- {
- if (*s == '\n')
- {
- x = sx;
- rw = 0;
- y += FONT_H+2;
- }
- else if (*s == '\b')
- {
- switch (s[1])
- {
- case 'w':
- r = g = b = 255;
- break;
- case 'g':
- r = g = b = 192;
- break;
- case 'o':
- r = 255;
- g = 216;
- b = 32;
- break;
- case 'r':
- r = 255;
- g = b = 0;
- break;
- case 'l':
- r = 255;
- g = b = 75;
- break;
- case 'b':
- r = g = 0;
- b = 255;
- break;
- case 't':
- b = 255;
- g = 170;
- r = 32;
- break;
- }
- s++;
- }
- else
- {
-
- if (x-cw>=w)
- {
- x = sx;
- rw = 0;
- y+=FONT_H+2;
- rh+=FONT_H+2;
- }
- x = drawchar(x, y, *(unsigned char *)s, r, g, b, a);
- }
- }
- }
-
- return rh;
-}
-
-//draws a rectange, (x,y) are the top left coords.
-void Graphics::drawrect(int x, int y, int w, int h, int r, int g, int b, int a)
-{
- int i;
- for (i=0; i<=w; i++)
- {
- drawpixel(x+i, y, r, g, b, a);
- drawpixel(x+i, y+h, r, g, b, a);
- }
- for (i=1; i<h; i++)
- {
- drawpixel(x, y+i, r, g, b, a);
- drawpixel(x+w, y+i, r, g, b, a);
- }
-}
-
-//draws a rectangle and fills it in as well.
-void Graphics::fillrect(int x, int y, int w, int h, int r, int g, int b, int a)
-{
- int i,j;
- for (j=1; j<h; j++)
- for (i=1; i<w; i++)
- drawpixel(x+i, y+j, r, g, b, a);
-}
-
-void Graphics::clearrect(int x, int y, int w, int h)
-{
-#ifdef OGLR
- fillrect(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 Graphics::drawdots(int x, int y, int h, int r, int g, int b, int a)
-{
- int i;
- for (i=0; i<=h; i+=2)
- drawpixel(x, y+i, r, g, b, a);
-}
-
-int Graphics::textwidth(char *s)
+int Graphics::textwidth(const char *s)
{
int x = 0;
for (; *s; s++)
@@ -903,22 +431,6 @@ int Graphics::textwidth(char *s)
return x-1;
}
-int Graphics::drawtextmax(int x, int y, int w, char *s, int r, int g, int b, int a)
-{
- int i;
- w += x-5;
- for (; *s; s++)
- {
- if (x+font_data[font_ptrs[(int)(*(unsigned char *)s)]]>=w && x+textwidth(s)>=w+5)
- break;
- x = drawchar(x, y, *(unsigned char *)s, r, g, b, a);
- }
- if (*s)
- for (i=0; i<3; i++)
- x = drawchar(x, y, '.', r, g, b, a);
- return x;
-}
-
int Graphics::textnwidth(char *s, int n)
{
int x = 0;
@@ -1053,35 +565,36 @@ int Graphics::textwrapheight(char *s, int width)
return height;
}
-//the most used function for drawing a pixel, because it has OpenGL support, which is not fully implemented.
-TPT_INLINE void Graphics::blendpixel(int x, int y, int r, int g, int b, int a)
+void Graphics::textsize(const char * s, int & width, int & height)
{
-#ifdef PIXALPHA
- pixel t;
- if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
- return;
- if (a!=255)
+ if(!strlen(s))
{
- 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)
+ width = 0;
+ height = 0;
return;
- if (a!=255)
+ }
+
+ int cHeight = FONT_H+2, cWidth = 0, lWidth = 0;
+ for (; *s; s++)
{
- 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;
+ if (*s == '\n')
+ {
+ cWidth = 0;
+ cHeight += FONT_H+2;
+ }
+ else if (*s == '\b')
+ {
+ s++;
+ }
+ else
+ {
+ cWidth += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
+ if(cWidth>lWidth)
+ lWidth = cWidth;
+ }
}
- vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
-#endif
+ width = lWidth;
+ height = cHeight;
}
void Graphics::draw_icon(int x, int y, Icon icon)
@@ -1140,243 +653,6 @@ void Graphics::draw_icon(int x, int y, Icon icon)
}
}
-void Graphics::draw_line(int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line
-{
- int dx, dy, i, sx, sy, check, e, x, y;
-
- dx = abs(x1-x2);
- dy = abs(y1-y2);
- sx = isign(x2-x1);
- sy = isign(y2-y1);
- x = x1;
- y = y1;
- check = 0;
-
- if (dy>dx)
- {
- dx = dx+dy;
- dy = dx-dy;
- dx = dx-dy;
- check = 1;
- }
-
- e = (dy<<2)-dx;
- for (i=0; i<=dx; i++)
- {
- if (x>=0 && y>=0 && x<a && y<YRES+MENUSIZE)
- vid[x+y*a] =PIXRGB(r, g, b);
- if (e>=0)
- {
- if (check==1)
- x = x+sx;
- else
- y = y+sy;
- e = e-(dx<<2);
- }
- if (check==1)
- y = y+sy;
- else
- x = x+sx;
- e = e+(dy<<2);
- }
-}
-
-//adds color to a pixel, does not overwrite.
-void Graphics::addpixel(int x, int y, int r, int g, int b, int a)
-{
- pixel t;
- if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
- return;
- t = vid[y*(XRES+BARSIZE)+x];
- r = (a*r + 255*PIXR(t)) >> 8;
- g = (a*g + 255*PIXG(t)) >> 8;
- b = (a*b + 255*PIXB(t)) >> 8;
- if (r>255)
- r = 255;
- if (g>255)
- g = 255;
- if (b>255)
- b = 255;
- vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
-}
-
-//draws one of two colors, so that it is always clearly visible
-void Graphics::xor_pixel(int x, int y)
-{
- int c;
- if (x<0 || y<0 || x>=XRES || y>=YRES)
- return;
- c = vid[y*(XRES+BARSIZE)+x];
- c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c);
- if (c<512)
- vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0);
- else
- vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040);
-}
-
-//same as xor_pixel, but draws a line of it
-void Graphics::xor_line(int x1, int y1, int x2, int y2)
-{
- int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
- float e, de;
- if (cp)
- {
- y = x1;
- x1 = y1;
- y1 = y;
- y = x2;
- x2 = y2;
- y2 = y;
- }
- if (x1 > x2)
- {
- y = x1;
- x1 = x2;
- x2 = y;
- y = y1;
- y1 = y2;
- y2 = y;
- }
- dx = x2 - x1;
- dy = abs(y2 - y1);
- e = 0.0f;
- if (dx)
- de = dy/(float)dx;
- else
- de = 0.0f;
- y = y1;
- sy = (y1<y2) ? 1 : -1;
- for (x=x1; x<=x2; x++)
- {
- if (cp)
- xor_pixel(y, x);
- else
- xor_pixel(x, y);
- e += de;
- if (e >= 0.5f)
- {
- y += sy;
- e -= 1.0f;
- }
- }
-}
-
-//same as blend_pixel, but draws a line of it
-void Graphics::blend_line(int x1, int y1, int x2, int y2, int r, int g, int b, int a)
-{
- int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
- float e, de;
- if (cp)
- {
- y = x1;
- x1 = y1;
- y1 = y;
- y = x2;
- x2 = y2;
- y2 = y;
- }
- if (x1 > x2)
- {
- y = x1;
- x1 = x2;
- x2 = y;
- y = y1;
- y1 = y2;
- y2 = y;
- }
- dx = x2 - x1;
- dy = abs(y2 - y1);
- e = 0.0f;
- if (dx)
- de = dy/(float)dx;
- else
- de = 0.0f;
- y = y1;
- sy = (y1<y2) ? 1 : -1;
- for (x=x1; x<=x2; x++)
- {
- if (cp)
- blendpixel(y, x, r, g, b, a);
- else
- blendpixel(x, y, r, g, b, a);
- e += de;
- if (e >= 0.5f)
- {
- y += sy;
- e -= 1.0f;
- }
- }
-}
-
-//same as xor_pixel, but draws a rectangle
-void Graphics::xor_rect(int x, int y, int w, int h)
-{
- int i;
- for (i=0; i<w; i+=2)
- {
- xor_pixel(x+i, y);
- xor_pixel(x+i, y+h-1);
- }
- for (i=2; i<h; i+=2)
- {
- xor_pixel(x, y+i);
- xor_pixel(x+w-1, y+i);
- }
-}
-
-
-/*//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];
-GLuint addV[(YRES*XRES)*2];
-GLfloat addC[(YRES*XRES)*4];
-GLfloat lineV[(((YRES*XRES)*2)*6)];
-GLfloat lineC[(((YRES*XRES)*2)*6)];
-#endif*/
-
-
-//draws the photon colors in the HUD
-void Graphics::draw_wavelengths(int x, int y, int h, int wl)
-{
- int i,cr,cg,cb,j;
- int tmp;
- fillrect(x-1,y-1,30+1,h+1,64,64,64,255); // coords -1 size +1 to work around bug in fillrect - TODO: fix fillrect
- for (i=0; i<30; i++)
- {
- if ((wl>>i)&1)
- {
- // Need a spread of wavelengths to get a smooth spectrum, 5 bits seems to work reasonably well
- if (i>2) tmp = 0x1F << (i-2);
- else tmp = 0x1F >> (2-i);
- cg = 0;
- cb = 0;
- cr = 0;
- for (j=0; j<12; j++) {
- cr += (tmp >> (j+18)) & 1;
- cb += (tmp >> j) & 1;
- }
- for (j=0; j<13; j++)
- cg += (tmp >> (j+9)) & 1;
- tmp = 624/(cr+cg+cb+1);
- cr *= tmp;
- cg *= tmp;
- cb *= tmp;
- for (j=0; j<h; j++) blendpixel(x+29-i,y+j,cr>255?255:cr,cg>255?255:cg,cb>255?255:cb,255);
- }
- }
-}
-
pixel *Graphics::render_packed_rgb(void *image, int width, int height, int cmp_size)
{
unsigned char *tmp;
@@ -1408,968 +684,4 @@ pixel *Graphics::render_packed_rgb(void *image, int width, int height, int cmp_s
return res;
}
-void Graphics::draw_rgba_image(unsigned char *data, int x, int y, float alpha)
-{
- unsigned char w, h;
- int i, j;
- unsigned char r, g, b, a;
- if (!data) return;
- w = *(data++)&0xFF;
- h = *(data++)&0xFF;
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- r = *(data++)&0xFF;
- g = *(data++)&0xFF;
- b = *(data++)&0xFF;
- a = *(data++)&0xFF;
- drawpixel(x+i, y+j, r, g, b, a*alpha);
- }
- }
-}
-
-void Graphics::draw_image(pixel *img, int x, int y, int w, int h, int a)
-{
- int i, j, r, g, b;
- if (!img) return;
- if(y + h > YRES+MENUSIZE) h = (YRES+MENUSIZE)-y; //Adjust height to prevent drawing off the bottom
- if(a >= 255)
- for (j=0; j<h; j++)
- for (i=0; i<w; i++)
- {
- vid[(y+j)*(XRES+BARSIZE)+(x+i)] = *img;
- img++;
- }
- else
- for (j=0; j<h; j++)
- for (i=0; i<w; i++)
- {
- r = PIXR(*img);
- g = PIXG(*img);
- b = PIXB(*img);
- drawpixel(x+i, y+j, r, g, b, a);
- img++;
- }
-}
-
-void Graphics::dim_copy(pixel *dst, pixel *src) //old persistent, unused
-{
- int i,r,g,b;
- for (i=0; i<XRES*YRES; i++)
- {
- r = PIXR(src[i]);
- g = PIXG(src[i]);
- b = PIXB(src[i]);
- if (r>0)
- r--;
- if (g>0)
- g--;
- if (b>0)
- b--;
- dst[i] = PIXRGB(r,g,b);
- }
-}
-
-void Graphics::dim_copy_pers(pixel *dst, pixel *src) //for persistent view, reduces rgb slowly
-{
- int i,r,g,b;
- for (i=0; i<(XRES+BARSIZE)*YRES; i++)
- {
- r = PIXR(src[i]);
- g = PIXG(src[i]);
- b = PIXB(src[i]);
- if (r>0)
- r--;
- if (g>0)
- g--;
- if (b>0)
- b--;
- dst[i] = PIXRGB(r,g,b);
- }
-}
-
-/*void render_zoom(pixel *img) //draws the zoom box
-{
-#ifdef OGLR
- int origBlendSrc, origBlendDst;
- float zcx1, zcx0, zcy1, zcy0, yfactor, xfactor, i; //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 = (zoom_y)*yfactor;
- zcy1 = ((zoom_y+ZSIZE))*yfactor;
-
- glGetIntegerv(GL_BLEND_SRC, &origBlendSrc);
- glGetIntegerv(GL_BLEND_DST, &origBlendDst);
- glBlendFunc(GL_ONE, GL_ZERO);
-
- 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)*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR))*sdl_scale, 1.0);
- glTexCoord2d(zcx0, zcy1);
- glVertex3f(zoom_wx*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR))*sdl_scale, 1.0);
- glTexCoord2d(zcx0, zcy0);
- glVertex3f(zoom_wx*sdl_scale, (YRES+MENUSIZE-zoom_wy)*sdl_scale, 1.0);
- glTexCoord2d(zcx1, zcy0);
- glVertex3f((zoom_wx+ZSIZE*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-zoom_wy)*sdl_scale, 1.0);
- glEnd();
- glBindTexture(GL_TEXTURE_2D, 0);
- glDisable( GL_TEXTURE_2D );
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glLineWidth(sdl_scale);
- glEnable(GL_LINE_SMOOTH);
- glBegin(GL_LINES);
- glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
- for(i = 0; i < ZSIZE; i++)
- {
- glVertex2f((zoom_wx+ZSIZE*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR)+i*ZFACTOR)*sdl_scale);
- glVertex2f(zoom_wx*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR)+i*ZFACTOR)*sdl_scale);
- glVertex2f((zoom_wx+i*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR))*sdl_scale);
- glVertex2f((zoom_wx+i*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-zoom_wy)*sdl_scale);
- }
- glEnd();
-
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- glBegin(GL_LINE_STRIP);
- glVertex3i((zoom_wx-1)*sdl_scale, (YRES+MENUSIZE-zoom_wy)*sdl_scale, 0);
- glVertex3i((zoom_wx-1)*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR))*sdl_scale, 0);
- glVertex3i((zoom_wx+ZSIZE*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoom_wy+ZSIZE*ZFACTOR))*sdl_scale, 0);
- glVertex3i((zoom_wx+ZSIZE*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-zoom_wy)*sdl_scale, 0);
- glVertex3i((zoom_wx-1)*sdl_scale, (YRES+MENUSIZE-zoom_wy)*sdl_scale, 0);
- glEnd();
- glDisable(GL_LINE_SMOOTH);
-
- glDisable(GL_LINE_SMOOTH);
-
- 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)*sdl_scale, (YRES+MENUSIZE-(zoom_y-1))*sdl_scale, 0);
- glVertex3i((zoom_x-1)*sdl_scale, (YRES+MENUSIZE-(zoom_y+ZSIZE))*sdl_scale, 0);
- glVertex3i((zoom_x+ZSIZE)*sdl_scale, (YRES+MENUSIZE-(zoom_y+ZSIZE))*sdl_scale, 0);
- glVertex3i((zoom_x+ZSIZE)*sdl_scale, (YRES+MENUSIZE-(zoom_y-1))*sdl_scale, 0);
- glVertex3i((zoom_x-1)*sdl_scale, (YRES+MENUSIZE-(zoom_y-1))*sdl_scale, 0);
- glEnd();
- glDisable(GL_COLOR_LOGIC_OP);
- }
- glLineWidth(1);
- glBlendFunc(origBlendSrc, origBlendDst);
-#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);
- drawrect(img, zoom_wx-1, zoom_wy-1, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR, 0, 0, 0, 255);
- clearrect(img, zoom_wx, zoom_wy, ZSIZE*ZFACTOR, ZSIZE*ZFACTOR);
- for (j=0; j<ZSIZE; j++)
- for (i=0; i<ZSIZE; i++)
- {
- pix = img[(j+zoom_y)*(XRES+BARSIZE)+(i+zoom_x)];
- for (y=0; y<ZFACTOR-1; y++)
- for (x=0; x<ZFACTOR-1; x++)
- img[(j*ZFACTOR+y+zoom_wy)*(XRES+BARSIZE)+(i*ZFACTOR+x+zoom_wx)] = pix;
- }
- if (zoom_en)
- {
- for (j=-1; j<=ZSIZE; j++)
- {
- xor_pixel(zoom_x+j, zoom_y-1, img);
- xor_pixel(zoom_x+j, zoom_y+ZSIZE, img);
- }
- for (j=0; j<ZSIZE; j++)
- {
- xor_pixel(zoom_x-1, zoom_y+j, img);
- xor_pixel(zoom_x+ZSIZE, zoom_y+j, img);
- }
- }
-#endif
-}*/
-
-/*int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl)
-{
- unsigned char *d, *c = (unsigned char *)thumb;
- int i,j,x,y,a,t,r,g,b,sx,sy;
-
- if (bzip2)
- {
- if (size<16)
- return 1;
- if (c[3]!=0x74 || c[2]!=0x49 || c[1]!=0x68 || c[0]!=0x53)
- return 1;
- if (c[4]>PT_NUM)
- return 2;
- if (c[5]!=CELL || c[6]!=XRES/CELL || c[7]!=YRES/CELL)
- return 3;
- i = XRES*YRES;
- d = (unsigned char *)malloc(i);
- if (!d)
- return 1;
-
- if (BZ2_bzBuffToBuffDecompress((char *)d, (unsigned *)&i, (char *)(c+8), size-8, 0, 0))
- return 1;
- size = i;
- }
- else
- d = c;
-
- if (size < XRES*YRES)
- {
- if (bzip2)
- free(d);
- return 1;
- }
-
- sy = 0;
- for (y=0; y+scl<=YRES; y+=scl)
- {
- sx = 0;
- for (x=0; x+scl<=XRES; x+=scl)
- {
- a = 0;
- r = g = b = 0;
- for (j=0; j<scl; j++)
- for (i=0; i<scl; i++)
- {
- t = d[(y+j)*XRES+(x+i)];
- if (t==0xFF)
- {
- r += 256;
- g += 256;
- b += 256;
- a += 2;
- }
- else if (t)
- {
- if (t>=PT_NUM)
- goto corrupt;
- r += PIXR(ptypes[t].pcolors);
- g += PIXG(ptypes[t].pcolors);
- b += PIXB(ptypes[t].pcolors);
- a ++;
- }
- }
- if (a)
- {
- a = 256/a;
- r = (r*a)>>8;
- g = (g*a)>>8;
- b = (b*a)>>8;
- }
-
- drawpixel(vid_buf, px+sx, py+sy, r, g, b, 255);
- sx++;
- }
- sy++;
- }
-
- if (bzip2)
- free(d);
- return 0;
-
-corrupt:
- if (bzip2)
- free(d);
- return 1;
-}*/
-
-//draws the cursor
-/*void Graphics::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)
- {
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
- glEnable(GL_COLOR_LOGIC_OP);
- glLogicOp(GL_XOR);
- glBegin(GL_LINE_LOOP);
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- y *= sdl_scale;
- x *= sdl_scale;
- ry *= sdl_scale;
- rx *= sdl_scale;
- if (CURRENT_BRUSH==SQUARE_BRUSH)
- {
- glVertex2f(x-rx+1, (y)-ry+1);
- glVertex2f(x+rx+1, (y)-ry+1);
- glVertex2f(x+rx+1, (y)+ry+1);
- glVertex2f(x-rx+1, (y)+ry+1);
- glVertex2f(x-rx+1, (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)+y);
- }
- }
- else if (CURRENT_BRUSH==TRI_BRUSH)
- {
- glVertex2f(x+1, (y)+ry+1);
- glVertex2f(x+rx+1, (y)-ry+1);
- glVertex2f(x-rx+1, (y)-ry+1);
- glVertex2f(x+1, (y)+ry+1);
- }
- glEnd();
- glDisable(GL_COLOR_LOGIC_OP);
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
- }
-#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)
- {
- if (rx<=0)
- xor_pixel(x, y, vid);
- else if (ry<=0)
- xor_pixel(x, y, vid);
- if (rx+ry<=0)
- xor_pixel(x, y, vid);
- else if (CURRENT_BRUSH==SQUARE_BRUSH)
- {
- for (j=0; j<=ry; j++)
- for (i=0; i<=rx; i++)
- if (i*j<=ry*rx && ((i+1)>rx || (j+1)>ry))
- {
- xor_pixel(x+i, y+j, vid);
- xor_pixel(x-i, y-j, vid);
- if (i&&j)xor_pixel(x+i, y-j, vid);
- if (i&&j)xor_pixel(x-i, y+j, vid);
- }
- }
- else if (CURRENT_BRUSH==CIRCLE_BRUSH)
- {
- for (j=0; j<=ry; j++)
- for (i=0; i<=rx; i++)
- if (pow(i,2)*pow(ry,2)+pow(j,2)*pow(rx,2)<=pow(rx,2)*pow(ry,2) &&
- (pow(i+1,2)*pow(ry,2)+pow(j,2)*pow(rx,2)>pow(rx,2)*pow(ry,2) ||
- pow(i,2)*pow(ry,2)+pow(j+1,2)*pow(rx,2)>pow(rx,2)*pow(ry,2)))
- {
- xor_pixel(x+i, y+j, vid);
- if (j) xor_pixel(x+i, y-j, vid);
- if (i) xor_pixel(x-i, y+j, vid);
- if (i&&j) xor_pixel(x-i, y-j, vid);
- }
- }
- else if (CURRENT_BRUSH==TRI_BRUSH)
- {
- for (j=-ry; j<=ry; j++)
- for (i=-rx; i<=0; i++)
- if ((j <= ry ) && ( j >= (((-2.0*ry)/(rx))*i)-ry ) && (j+1>ry || ( j-1 < (((-2.0*ry)/(rx))*i)-ry )) )
- {
- xor_pixel(x+i, y+j, vid);
- if (i) xor_pixel(x-i, y+j, vid);
- }
- }
- }
- else //wall cursor
- {
- int tc;
- c = (rx/CELL) * CELL;
- x = (x/CELL) * CELL;
- y = (y/CELL) * CELL;
-
- tc = !((c%(CELL*2))==0);
-
- x -= c/2;
- y -= c/2;
-
- x += tc*(CELL/2);
- y += tc*(CELL/2);
-
- for (i=0; i<CELL+c; i++)
- {
- xor_pixel(x+i, y, vid);
- xor_pixel(x+i, y+CELL+c-1, vid);
- }
- for (i=1; i<CELL+c-1; i++)
- {
- xor_pixel(x, y+i, vid);
- xor_pixel(x+CELL+c-1, y+i, vid);
- }
- }
-#endif
-}*/
-
-/*int sdl_opened = 0;
-int sdl_open(void)
-{
- int status;
- if (SDL_Init(SDL_INIT_VIDEO)<0)
- {
- fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError());
- return 0;
- }
- atexit(SDL_Quit);
-#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);
-
- if(sdl_opened)
- {
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- glOrtho(0, (XRES+BARSIZE)*sdl_scale, 0, (YRES+MENUSIZE)*sdl_scale, -1, 1);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- else
- {
-#ifdef WIN32
- status = glewInit();
- if(status != GLEW_OK)
- {
- fprintf(stderr, "Initializing Glew: %d\n", status);
- return 0;
- }
-#endif
- 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(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)
- sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_FULLSCREEN|SDL_SWSURFACE);
- else
- sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,16,SDL_SWSURFACE);
-#else
- if (kiosk_enable)
- sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_FULLSCREEN|SDL_SWSURFACE);
- else
- sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_SWSURFACE);
-#endif
-#endif
- if (!sdl_scrn)
- {
- fprintf(stderr, "Creating window: %s\n", SDL_GetError());
- return 0;
- }
- SDL_WM_SetCaption("The Powder Toy", "Powder Toy");
- sdl_seticon();
- SDL_EnableUNICODE(1);
- //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
-#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11)
- SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
- SDL_VERSION(&sdl_wminfo.version);
- SDL_GetWMInfo(&sdl_wminfo);
- sdl_wminfo.info.x11.lock_func();
- XA_CLIPBOARD = XInternAtom(sdl_wminfo.info.x11.display, "CLIPBOARD", 1);
- XA_TARGETS = XInternAtom(sdl_wminfo.info.x11.display, "TARGETS", 1);
- sdl_wminfo.info.x11.unlock_func();
-#endif
- sdl_opened = 1;
- return 1;
-}
-#ifdef OGLR
-void checkShader(GLuint shader, char * shname)
-{
- GLuint status;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
- if (status == GL_FALSE)
- {
- char errorBuf[ GL_INFO_LOG_LENGTH];
- int errLen;
- glGetShaderInfoLog(shader, GL_INFO_LOG_LENGTH, &errLen, errorBuf);
- fprintf(stderr, "Failed to compile %s shader:\n%s\n", shname, errorBuf);
- exit(1);
- }
-}
-void checkProgram(GLuint program, char * progname)
-{
- GLuint status;
- glGetProgramiv(program, GL_LINK_STATUS, &status);
- if (status == GL_FALSE)
- {
- char errorBuf[ GL_INFO_LOG_LENGTH];
- int errLen;
- glGetShaderInfoLog(program, GL_INFO_LOG_LENGTH, &errLen, errorBuf);
- fprintf(stderr, "Failed to link %s program:\n%s\n", progname, errorBuf);
- exit(1);
- }
-}
-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 );
- checkShader(vertexShader, "FV");
- glCompileShader( fragmentShader );
- checkShader(fragmentShader, "FF");
-
- fireProg = glCreateProgram();
- glAttachShader( fireProg, vertexShader );
- glAttachShader( fireProg, fragmentShader );
- glLinkProgram( fireProg );
- checkProgram(fireProg, "F");
-
- //Lensing
- vertexShader = glCreateShader(GL_VERTEX_SHADER);
- fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-
- glShaderSource( vertexShader, 1, &lensVertex, NULL);
- glShaderSource( fragmentShader, 1, &lensFragment, NULL);
-
- glCompileShader( vertexShader );
- checkShader(vertexShader, "LV");
- glCompileShader( fragmentShader );
- checkShader(fragmentShader, "LF");
-
- lensProg = glCreateProgram();
- glAttachShader( lensProg, vertexShader );
- glAttachShader( lensProg, fragmentShader );
- glLinkProgram( lensProg );
- checkProgram(lensProg, "L");
-
- //Air Velocity
- vertexShader = glCreateShader(GL_VERTEX_SHADER);
- fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-
- glShaderSource( vertexShader, 1, &airVVertex, NULL);
- glShaderSource( fragmentShader, 1, &airVFragment, NULL);
-
- glCompileShader( vertexShader );
- checkShader(vertexShader, "AVX");
- glCompileShader( fragmentShader );
- checkShader(fragmentShader, "AVF");
-
- airProg_Velocity = glCreateProgram();
- glAttachShader( airProg_Velocity, vertexShader );
- glAttachShader( airProg_Velocity, fragmentShader );
- glLinkProgram( airProg_Velocity );
- checkProgram(airProg_Velocity, "AV");
-
- //Air Pressure
- vertexShader = glCreateShader(GL_VERTEX_SHADER);
- fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-
- glShaderSource( vertexShader, 1, &airPVertex, NULL);
- glShaderSource( fragmentShader, 1, &airPFragment, NULL);
-
- glCompileShader( vertexShader );
- checkShader(vertexShader, "APV");
- glCompileShader( fragmentShader );
- checkShader(fragmentShader, "APF");
-
- airProg_Pressure = glCreateProgram();
- glAttachShader( airProg_Pressure, vertexShader );
- glAttachShader( airProg_Pressure, fragmentShader );
- glLinkProgram( airProg_Pressure );
- checkProgram(airProg_Pressure, "AP");
-
- //Air cracker
- vertexShader = glCreateShader(GL_VERTEX_SHADER);
- fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-
- glShaderSource( vertexShader, 1, &airCVertex, NULL);
- glShaderSource( fragmentShader, 1, &airCFragment, NULL);
-
- glCompileShader( vertexShader );
- checkShader(vertexShader, "ACV");
- glCompileShader( fragmentShader );
- checkShader(fragmentShader, "ACF");
-
- airProg_Cracker = glCreateProgram();
- glAttachShader( airProg_Cracker, vertexShader );
- glAttachShader( airProg_Cracker, fragmentShader );
- glLinkProgram( airProg_Cracker );
- checkProgram(airProg_Cracker, "AC");
-}
-#endif
-int draw_debug_info(pixel* vid, Simulation * sim, int lm, int lx, int ly, int cx, int cy, int line_x, int line_y)
-{
- Particle * parts = sim->parts;
- char infobuf[256];
- if(debug_flags & DEBUG_PERFORMANCE_FRAME || debug_flags & DEBUG_PERFORMANCE_CALC)
- {
- int t1, t2, x = 0, i = debug_perf_istart;
- float partiavg = 0, frameavg = 0;
- while(i != debug_perf_iend)
- {
- partiavg += abs(debug_perf_partitime[i]/100000);
- frameavg += abs(debug_perf_frametime[i]/100000);
- if(debug_flags & DEBUG_PERFORMANCE_CALC)
- t1 = abs(debug_perf_partitime[i]/100000);
- else
- t1 = 0;
-
- if(debug_flags & DEBUG_PERFORMANCE_FRAME)
- t2 = abs(debug_perf_frametime[i]/100000);
- else
- t2 = 0;
-
- if(t1 > YRES)
- t1 = YRES;
- if(t1+t2 > YRES)
- t2 = YRES-t1;
-
- if(t1>0)
- draw_line(vid, x, YRES, x, YRES-t1, 0, 255, 120, XRES+BARSIZE);
- if(t2>0)
- draw_line(vid, x, YRES-t1, x, YRES-(t1+t2), 255, 120, 0, XRES+BARSIZE);
-
- i++;
- x++;
- i %= DEBUG_PERF_FRAMECOUNT;
- }
-
- if(debug_flags & DEBUG_PERFORMANCE_CALC)
- t1 = abs(partiavg / x);
- else
- t1 = 0;
-
- if(debug_flags & DEBUG_PERFORMANCE_FRAME)
- t2 = abs(frameavg / x);
- else
- t2 = 0;
-
- if(t1 > YRES)
- t1 = YRES;
- if(t1+t2 > YRES)
- t2 = YRES-t1;
-
- if(t1>0)
- fillrect(vid, x, YRES-t1-1, 5, t1+2, 0, 255, 0, 255);
- if(t2>0)
- fillrect(vid, x, (YRES-t1)-t2-1, 5, t2+1, 255, 0, 0, 255);
- }
- if(debug_flags & DEBUG_DRAWTOOL)
- {
- if(lm == 1) //Line tool
- {
- blend_line(vid, 0, line_y, XRES, line_y, 255, 255, 255, 120);
- blend_line(vid, line_x, 0, line_x, YRES, 255, 255, 255, 120);
-
- blend_line(vid, 0, ly, XRES, ly, 255, 255, 255, 120);
- blend_line(vid, lx, 0, lx, YRES, 255, 255, 255, 120);
-
- sprintf(infobuf, "%d x %d", lx, ly);
- drawtext_outline(vid, lx+(lx>line_x?3:-textwidth(infobuf)-3), ly+(ly<line_y?-10:3), infobuf, 255, 255, 255, 200, 0, 0, 0, 120);
-
- sprintf(infobuf, "%d x %d", line_x, line_y);
- drawtext_outline(vid, line_x+(lx<line_x?3:-textwidth(infobuf)-2), line_y+(ly>line_y?-10:3), infobuf, 255, 255, 255, 200, 0, 0, 0, 120);
-
- sprintf(infobuf, "%d", abs(line_x-lx));
- drawtext_outline(vid, (line_x+lx)/2-textwidth(infobuf)/2, line_y+(ly>line_y?-10:3), infobuf, 255, 255, 255, 200, 0, 0, 0, 120);
-
- sprintf(infobuf, "%d", abs(line_y-ly));
- drawtext_outline(vid, line_x+(lx<line_x?3:-textwidth(infobuf)-2), (line_y+ly)/2-3, infobuf, 255, 255, 255, 200, 0, 0, 0, 120);
- }
- }
- if(debug_flags & DEBUG_PARTS)
- {
- int i = 0, x = 0, y = 0, lpx = 0, lpy = 0;
- sprintf(infobuf, "%d/%d (%.2f%%)", sim->parts_lastActiveIndex, NPART, (((float)sim->parts_lastActiveIndex)/((float)NPART))*100.0f);
- for(i = 0; i < NPART; i++){
- if(parts[i].type){
- drawpixel(vid, x, y, 255, 255, 255, 180);
- } else {
- drawpixel(vid, x, y, 0, 0, 0, 180);
- }
- if(i == sim->parts_lastActiveIndex)
- {
- lpx = x;
- lpy = y;
- }
- x++;
- if(x>=XRES){
- y++;
- x = 0;
- }
- }
- draw_line(vid, 0, lpy, XRES, lpy, 0, 255, 120, XRES+BARSIZE);
- draw_line(vid, lpx, 0, lpx, YRES, 0, 255, 120, XRES+BARSIZE);
- drawpixel(vid, lpx, lpy, 255, 50, 50, 220);
-
- drawpixel(vid, lpx+1, lpy, 255, 50, 50, 120);
- drawpixel(vid, lpx-1, lpy, 255, 50, 50, 120);
- drawpixel(vid, lpx, lpy+1, 255, 50, 50, 120);
- drawpixel(vid, lpx, lpy-1, 255, 50, 50, 120);
-
- fillrect(vid, 7, YRES-26, textwidth(infobuf)+5, 14, 0, 0, 0, 180);
- drawtext(vid, 10, YRES-22, infobuf, 255, 255, 255, 255);
- }
-}*/
-
-void Graphics::Clear()
-{
- memset(vid, 0, PIXELSIZE * ((XRES+BARSIZE) * (YRES+MENUSIZE)));
-#ifdef OGLR
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
-#endif
-}
-
-void Graphics::AttachSDLSurface(SDL_Surface * surface)
-{
- sdl_scrn = surface;
-#ifdef OGLR
- SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
- 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(1, -1);
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- //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);
-#endif
-}
-
-void Graphics::Blit()
-{
-#ifndef OGLR
- if(sdl_scrn)
- {
- pixel * dst;
- pixel * src = vid;
- int j, x = 0, y = 0, w = XRES+BARSIZE, h = YRES+MENUSIZE, pitch = XRES+BARSIZE;
- if (SDL_MUSTLOCK(sdl_scrn))
- if (SDL_LockSurface(sdl_scrn)<0)
- return;
- dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x;
- for (j=0; j<h; j++)
- {
- memcpy(dst, src, w*PIXELSIZE);
- dst+=sdl_scrn->pitch/PIXELSIZE;
- src+=pitch;
- }
- if (SDL_MUSTLOCK(sdl_scrn))
- SDL_UnlockSurface(sdl_scrn);
- SDL_UpdateRect(sdl_scrn,0,0,0,0);
- }
-#else
- //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, vid);
- 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
-}
-
-Graphics::Graphics():
- sdl_scrn(NULL)
-{
- vid = (pixel *)malloc(PIXELSIZE * ((XRES+BARSIZE) * (YRES+MENUSIZE)));
-
-#ifdef OGLR
-#ifdef WIN32
- status = glewInit();
- if(status != GLEW_OK)
- {
- fprintf(stderr, "Initializing Glew: %d\n", status);
- return 0;
- }
-#endif
-#endif
-}
-
-Graphics::~Graphics()
-{
- free(vid);
-}
diff --git a/src/Graphics.h b/src/Graphics.h
index 4e6edf6..df7342b 100644
--- a/src/Graphics.h
+++ b/src/Graphics.h
@@ -91,92 +91,84 @@ enum Icon
IconReport
};
+//"Graphics lite" - slightly lower performance due to variable size,
+class VideoBuffer
+{
+public:
+ pixel * Buffer;
+ int Width, Height;
+
+ VideoBuffer(int width, int height): Width(width), Height(height), Buffer((pixel*)calloc(width*height, PIXELSIZE)) { };
+ void BlendPixel(int x, int y, int r, int g, int b, int a);
+ void AddPixel(int x, int y, int r, int g, int b, int a);
+ void SetPixel(int x, int y, int r, int g, int b, int a);
+ int BlendCharacter(int x, int y, int c, int r, int g, int b, int a);
+ int AddCharacter(int x, int y, int c, int r, int g, int b, int a);
+ int SetCharacter(int x, int y, int c, int r, int g, int b, int a);
+ ~VideoBuffer() { free(Buffer); };
+};
+
class Graphics
{
public:
- SDL_Surface * sdl_scrn;
pixel *vid;
- pixel *render_packed_rgb(void *image, int width, int height, int cmp_size);
+ int sdl_scale;
+#ifdef OGLR
+ //OpenGL specific instance variables
+ GLuint vidBuf, textTexture;
+#else
+ SDL_Surface * sdl_scrn;
+#endif
+
+ //Common graphics methods in Graphics.cpp
static char * GenerateGradient(pixel * colours, float * points, int pointcount, int size);
- //void draw_other();
- void draw_rgba_image(unsigned char *data, int x, int y, float a);
+
+ //PTIF methods
static void *ptif_pack(pixel *src, int w, int h, int *result_size);
static pixel *ptif_unpack(void *datain, int size, int *w, int *h);
static pixel *resample_img_nn(pixel *src, int sw, int sh, int rw, int rh);
static pixel *resample_img(pixel *src, int sw, int sh, int rw, int rh);
static pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f);
- //void render_gravlensing(pixel *src, pixel * dst);
- //void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch);
- //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);
- inline void drawblob(int x, int y, unsigned char cr, unsigned char cg, unsigned char cb);
- void draw_tool(int b, int sl, int sr, unsigned pc, unsigned iswall);
- //int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc);
- //void draw_menu(pixel *vid_buf, int i, int hover);
- void drawpixel(int x, int y, int r, int g, int b, int a);
- inline int addchar(int x, int y, int c, int r, int g, int b, int a);
- inline int drawchar(int x, int y, int c, int r, int g, int b, int a);
- int drawtext(int x, int y, std::string &s, int r, int g, int b, int a);
- int drawtext(int x, int y, const char *s, int r, int g, int b, int a);
- int drawtext_outline(int x, int y, const char *s, int r, int g, int b, int a, int olr, int olg, int olb, int ola);
- int drawtextwrap(int x, int y, int w, const char *s, int r, int g, int b, int a);
- void drawrect(int x, int y, int w, int h, int r, int g, int b, int a);
- void fillrect(int x, int y, int w, int h, int r, int g, int b, int a);
- void clearrect(int x, int y, int w, int h);
- void drawdots(int x, int y, int h, int r, int g, int b, int a);
- static int textwidth(char *s);
- int drawtextmax(int x, int y, int w, char *s, int r, int g, int b, int a);
+ static pixel *render_packed_rgb(void *image, int width, int height, int cmp_size);
+
+ //Font/text metrics
static int textnwidth(char *s, int n);
static void textnpos(char *s, int n, int w, int *cx, int *cy);
static int textwidthx(char *s, int w);
static int textposxy(char *s, int width, int w, int h);
static int textwrapheight(char *s, int width);
- inline void blendpixel(int x, int y, int r, int g, int b, int a);
+ static int textwidth(const char *s);
+ static void textsize(const char * s, int & width, int & height);
+
+ void blendpixel(int x, int y, int r, int g, int b, int a);
+ void addpixel(int x, int y, int r, int g, int b, int a);
+
void draw_icon(int x, int y, Icon icon);
- //void draw_air();
- //void draw_grav_zones(pixel *vid);
- //void draw_grav(pixel *vid);
- void draw_line(int x1, int y1, int x2, int y2, int r, int g, int b, int a);
- inline void addpixel(int x, int y, int r, int g, int b, int a);
- void xor_pixel(int x, int y);
- void xor_line(int x1, int y1, int x2, int y2);
- void xor_rect(int x, int y, int w, int h);
- inline void blend_line(int x1, int y1, int x2, int y2, int r, int g, int b, int a);
- //void render_parts(pixel *vid);
-// #ifdef OGLR
-// void draw_parts_fbo();
-// #endif
-// void draw_parts();
-// void draw_walls(pixel *vid);
-// void create_decorations(int x, int y, int rx, int ry, int r, int g, int b, int click, int tool);
-// void create_decoration(int x, int y, int r, int g, int b, int click, int tool);
-// void line_decorations(int x1, int y1, int x2, int y2, int rx, int ry, int r, int g, int b, int click, int tool);
-// void box_decorations(int x1, int y1, int x2, int y2, int r, int g, int b, int click, int tool);
-// void draw_color_menu(pixel *vid_buf, int i, int hover);
- inline void draw_wavelengths(int x, int y, int h, int wl);
- //void render_signs();
-// void render_fire(pixel *dst);
-// void prepare_alpha(int size, float intensity);
- inline void draw_image(pixel *img, int x, int y, int w, int h, int a);
- static void dim_copy(pixel *dst, pixel *src);
- static void dim_copy_pers(pixel *dst, pixel *src);
- //void render_zoom(pixel *img);
- //int render_thumb(void *thumb, int size, int bzip2, pixel *vid_buf, int px, int py, int scl);
- //void render_cursor(pixel *vid, int x, int y, int t, int rx, int ry);
- //int sdl_open(void);
- //int draw_debug_info(pixel* vid, int lm, int lx, int ly, int cx, int cy, int line_x, int line_y);
+
void Clear();
- void Blit();
void AttachSDLSurface(SDL_Surface * surface);
- #ifdef OGLR
- void clearScreen(float alpha);
- void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale);
- #endif
+ void Blit();
+ //
+ int drawtext(int x, int y, const char *s, int r, int g, int b, int a);
+ int drawtext(int x, int y, std::string s, int r, int g, int b, int a);
+ int drawchar(int x, int y, int c, int r, int g, int b, int a);
+ int addchar(int x, int y, int c, int r, int g, int b, int a);
+
+ void xor_pixel(int x, int y);
+ void xor_line(int x, int y, int x2, int y2);
+ void xor_rect(int x, int y, int width, int height);
+ void xor_bitmap(unsigned char * bitmap, int x, int y, int w, int h);
+
+ void draw_line(int x, int y, int x2, int y2, int r, int g, int b, int a);
+ void drawrect(int x, int y, int width, int height, int r, int g, int b, int a);
+ void fillrect(int x, int y, int width, int height, int r, int g, int b, int a);
+ void clearrect(int x, int y, int width, int height);
+ void gradientrect(int x, int y, int width, int height, int r, int g, int b, int a, int r2, int g2, int b2, int a2);
+
+ void draw_image(pixel *img, int x, int y, int w, int h, int a);
+
Graphics();
~Graphics();
-#ifdef OGLR
- GLuint vidBuf;
-#endif
};
#endif
diff --git a/src/OpenGLGraphics.cpp b/src/OpenGLGraphics.cpp
new file mode 100644
index 0000000..ed2b2ab
--- /dev/null
+++ b/src/OpenGLGraphics.cpp
@@ -0,0 +1,399 @@
+#include "Graphics.h"
+#include "font.h"
+
+#ifdef OGLR
+
+Graphics::Graphics():
+sdl_scale(1)
+{
+
+}
+
+Graphics::~Graphics()
+{
+}
+
+void Graphics::Clear()
+{
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void Graphics::AttachSDLSurface(SDL_Surface * surface)
+{
+ //sdl_scrn = surface;
+ SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ //glOrtho(0, (XRES+BARSIZE)*sdl_scale, 0, (YRES+MENUSIZE)*sdl_scale, -1, 1);
+ glOrtho(0, (XRES+BARSIZE)*sdl_scale, (YRES+MENUSIZE)*sdl_scale, 0, -1, 1);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+
+ //glRasterPos2i(0, (YRES+MENUSIZE));
+ glRasterPos2i(0, 0);
+ glPixelZoom(1, 1);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ //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);
+
+ glGenTextures(1, &textTexture);
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ glDisable(GL_TEXTURE_2D);
+}
+
+void Graphics::Blit()
+{
+ //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, vid);
+ 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 ();
+}
+
+int Graphics::drawtext(int x, int y, const char *s, int r, int g, int b, int a)
+{
+ if(!strlen(s))
+ return 0;
+ int width, height;
+ Graphics::textsize(s, width, height);
+ VideoBuffer texture(width, height);
+ int characterX = 0, characterY = 0;
+ int startX = characterX;
+ for (; *s; s++)
+ {
+ if (*s == '\n')
+ {
+ characterX = startX;
+ characterY += FONT_H+2;
+ }
+ else if (*s == '\b')
+ {
+ switch (s[1])
+ {
+ case 'w':
+ r = g = b = 255;
+ break;
+ case 'g':
+ r = g = b = 192;
+ break;
+ case 'o':
+ r = 255;
+ g = 216;
+ b = 32;
+ break;
+ case 'r':
+ r = 255;
+ g = b = 0;
+ break;
+ case 'l':
+ r = 255;
+ g = b = 75;
+ break;
+ case 'b':
+ r = g = 0;
+ b = 255;
+ break;
+ case 't':
+ b = 255;
+ g = 170;
+ r = 32;
+ break;
+ }
+ s++;
+ }
+ else
+ {
+ characterX = texture.SetCharacter(characterX, characterY, *(unsigned char *)s, r, g, b, a);
+ }
+ }
+ glEnable(GL_TEXTURE_2D);
+
+ //Generate texture
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+
+ //Draw texture
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.Width, texture.Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, texture.Buffer);
+
+ //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture.Width, texture.Height, GL_BGRA, GL_UNSIGNED_BYTE, texture.Buffer);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2f(x, y);
+ glTexCoord2d(1, 0);
+ glVertex2f(x+texture.Width, y);
+ glTexCoord2d(1, 1);
+ glVertex2f(x+texture.Width, y+texture.Height);
+ glTexCoord2d(0, 1);
+ glVertex2f(x, y+texture.Height);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ return x;
+}
+
+int Graphics::drawtext(int x, int y, std::string s, int r, int g, int b, int a)
+{
+ return drawtext(x, y, s.c_str(), r, g, b, a);
+}
+
+TPT_INLINE int Graphics::drawchar(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ VideoBuffer texture(w, 12);
+ texture.SetCharacter(0, 0, c, r, g, b, a);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.Width, texture.Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, texture.Buffer);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2f(x, y);
+ glTexCoord2d(1, 0);
+ glVertex2f(x+texture.Width, y);
+ glTexCoord2d(1, 1);
+ glVertex2f(x+texture.Width, y+texture.Height);
+ glTexCoord2d(0, 1);
+ glVertex2f(x, y+texture.Height);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ return x + w;
+}
+
+TPT_INLINE int Graphics::addchar(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ VideoBuffer texture(w, 12);
+ texture.AddCharacter(0, 0, c, r, g, b, a);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+ glBlendFunc(GL_ONE, GL_ONE);
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.Width, texture.Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, texture.Buffer);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2f(x, y);
+ glTexCoord2d(1, 0);
+ glVertex2f(x+texture.Width, y);
+ glTexCoord2d(1, 1);
+ glVertex2f(x+texture.Width, y+texture.Height);
+ glTexCoord2d(0, 1);
+ glVertex2f(x, y+texture.Height);
+ glEnd();
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ return x + w;
+}
+
+TPT_INLINE void Graphics::xor_pixel(int x, int y)
+{
+ //OpenGL doesn't support single pixel manipulation, there are ways around it, but with poor performance
+}
+
+TPT_INLINE void Graphics::blendpixel(int x, int y, int r, int g, int b, int a)
+{
+ //OpenGL doesn't support single pixel manipulation, there are ways around it, but with poor performance
+}
+
+TPT_INLINE void Graphics::addpixel(int x, int y, int r, int g, int b, int a)
+{
+ //OpenGL doesn't support single pixel manipulation, there are ways around it, but with poor performance
+}
+
+void Graphics::xor_line(int x, int y, int x2, int y2)
+{
+ glEnable(GL_COLOR_LOGIC_OP);
+ //glEnable(GL_LINE_SMOOTH);
+ glLogicOp(GL_XOR);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBegin(GL_LINES);
+ glVertex2i(x, y);
+ glVertex2i(x2, y2);
+ glEnd();
+ glDisable(GL_COLOR_LOGIC_OP);
+}
+
+void Graphics::xor_rect(int x, int y, int width, int height)
+{
+ 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);
+ glVertex2i(x, y);
+ glVertex2i(x+width, y);
+ glVertex2i(x+width, y+height);
+ glVertex2i(x, y+height);
+ glVertex2i(x, y);
+ glEnd();
+ glDisable(GL_COLOR_LOGIC_OP);
+}
+
+void Graphics::xor_bitmap(unsigned char * bitmap, int x, int y, int w, int h)
+{
+ //glEnable(GL_COLOR_LOGIC_OP);
+ //glLogicOp(GL_XOR);
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2f(x, y);
+ glTexCoord2d(1, 0);
+ glVertex2f(x+w, y);
+ glTexCoord2d(1, 1);
+ glVertex2f(x+w, y+h);
+ glTexCoord2d(0, 1);
+ glVertex2f(x, y+h);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+ //glDisable(GL_COLOR_LOGIC_OP);
+}
+
+void Graphics::draw_line(int x, int y, int x2, int y2, int r, int g, int b, int a)
+{
+ a = 255;
+ glColor4ub(r, g, b, a);
+ glBegin(GL_LINES);
+ glVertex2i(x, y);
+ glVertex2i(x2, y2);
+ glEnd();
+}
+
+void Graphics::drawrect(int x, int y, int width, int height, int r, int g, int b, int a)
+{
+ x++;
+ glColor4ub(r, g, b, a);
+ glBegin(GL_LINE_STRIP);
+ glVertex2i(x, y);
+ glVertex2i(x+width, y);
+ glVertex2i(x+width, y+height);
+ glVertex2i(x, y+height+1); //+1 is a hack to prevent squares from missing their corners, will make smoothed lines look like SHIT
+ glVertex2i(x, y);
+ glEnd();
+}
+
+void Graphics::fillrect(int x, int y, int width, int height, int r, int g, int b, int a)
+{
+ x++;
+ y++;
+ width-=1;
+ height-=1;
+
+ glColor4ub(r, g, b, a);
+ glBegin(GL_QUADS);
+ glVertex2i(x, y);
+ glVertex2i(x+width, y);
+ glVertex2i(x+width, y+height);
+ glVertex2i(x, y+height);
+ glEnd();
+}
+
+void Graphics::gradientrect(int x, int y, int width, int height, int r, int g, int b, int a, int r2, int g2, int b2, int a2)
+{
+ glBegin(GL_QUADS);
+ glColor4ub(r, g, b, a);
+ glVertex2i(x, y);
+ glColor4ub(r2, g2, b2, a2);
+ glVertex2i(x+width, y);
+ glColor4ub(r2, g2, b2, a2);
+ glVertex2i(x+width, y+height);
+ glColor4ub(r, g, b, a);
+ glVertex2i(x, y+height);
+ glEnd();
+}
+
+void Graphics::clearrect(int x, int y, int width, int height)
+{
+ glColor4ub(0, 0, 0, 255);
+ glBegin(GL_QUADS);
+ glVertex2i(x, y);
+ glVertex2i(x+width, y);
+ glVertex2i(x+width, y+height);
+ glVertex2i(x, y+height);
+ glEnd();
+}
+
+void Graphics::draw_image(pixel *img, int x, int y, int w, int h, int a)
+{
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, img);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2f(x, y);
+ glTexCoord2d(1, 0);
+ glVertex2f(x+w, y);
+ glTexCoord2d(1, 1);
+ glVertex2f(x+w, y+h);
+ glTexCoord2d(0, 1);
+ glVertex2f(x, y+h);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+}
+
+#endif
diff --git a/src/RasterGraphics.cpp b/src/RasterGraphics.cpp
new file mode 100644
index 0000000..472ae3c
--- /dev/null
+++ b/src/RasterGraphics.cpp
@@ -0,0 +1,380 @@
+#include "Graphics.h"
+#include "font.h"
+
+#ifndef OGLR
+
+Graphics::Graphics():
+sdl_scale(1)
+{
+ vid = (pixel *)malloc(PIXELSIZE * ((XRES+BARSIZE) * (YRES+MENUSIZE)));
+
+}
+
+Graphics::~Graphics()
+{
+ free(vid);
+}
+
+void Graphics::Clear()
+{
+ memset(vid, 0, PIXELSIZE * ((XRES+BARSIZE) * (YRES+MENUSIZE)));
+}
+
+void Graphics::AttachSDLSurface(SDL_Surface * surface)
+{
+ sdl_scrn = surface;
+}
+
+void Graphics::Blit()
+{
+ if(sdl_scrn)
+ {
+ pixel * dst;
+ pixel * src = vid;
+ int j, x = 0, y = 0, w = XRES+BARSIZE, h = YRES+MENUSIZE, pitch = XRES+BARSIZE;
+ if (SDL_MUSTLOCK(sdl_scrn))
+ if (SDL_LockSurface(sdl_scrn)<0)
+ return;
+ dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x;
+ for (j=0; j<h; j++)
+ {
+ memcpy(dst, src, w*PIXELSIZE);
+ dst+=sdl_scrn->pitch/PIXELSIZE;
+ src+=pitch;
+ }
+ if (SDL_MUSTLOCK(sdl_scrn))
+ SDL_UnlockSurface(sdl_scrn);
+ SDL_UpdateRect(sdl_scrn,0,0,0,0);
+ }
+}
+
+int Graphics::drawtext(int x, int y, const char *s, int r, int g, int b, int a)
+{
+ if(!strlen(s))
+ return 0;
+ int width, height;
+
+ int characterX = x, characterY = y;
+ int startX = characterX;
+ for (; *s; s++)
+ {
+ if (*s == '\n')
+ {
+ characterX = startX;
+ characterY += FONT_H+2;
+ }
+ else if (*s == '\b')
+ {
+ switch (s[1])
+ {
+ case 'w':
+ r = g = b = 255;
+ break;
+ case 'g':
+ r = g = b = 192;
+ break;
+ case 'o':
+ r = 255;
+ g = 216;
+ b = 32;
+ break;
+ case 'r':
+ r = 255;
+ g = b = 0;
+ break;
+ case 'l':
+ r = 255;
+ g = b = 75;
+ break;
+ case 'b':
+ r = g = 0;
+ b = 255;
+ break;
+ case 't':
+ b = 255;
+ g = 170;
+ r = 32;
+ break;
+ }
+ s++;
+ }
+ else
+ {
+ characterX = drawchar(characterX, characterY, *(unsigned char *)s, r, g, b, a);
+ }
+ }
+ return x;
+}
+
+int Graphics::drawtext(int x, int y, std::string s, int r, int g, int b, int a)
+{
+ return drawtext(x, y, s.c_str(), r, g, b, a);
+}
+
+TPT_INLINE int Graphics::drawchar(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ for (j=0; j<FONT_H; j++)
+ for (i=0; i<w; i++)
+ {
+ if (!bn)
+ {
+ ba = *(rp++);
+ bn = 8;
+ }
+ blendpixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
+ ba >>= 2;
+ bn -= 2;
+ }
+ return x + w;
+}
+
+TPT_INLINE int Graphics::addchar(int x, int y, int c, int r, int g, int b, int a)
+{
+ int i, j, w, bn = 0, ba = 0;
+ char *rp = font_data + font_ptrs[c];
+ w = *(rp++);
+ for (j=0; j<FONT_H; j++)
+ for (i=0; i<w; i++)
+ {
+ if (!bn)
+ {
+ ba = *(rp++);
+ bn = 8;
+ }
+ {
+ addpixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
+ }
+ ba >>= 2;
+ bn -= 2;
+ }
+ return x + w;
+}
+
+TPT_INLINE void Graphics::xor_pixel(int x, int y)
+{
+ int c;
+ if (x<0 || y<0 || x>=XRES || y>=YRES)
+ return;
+ c = vid[y*(XRES+BARSIZE)+x];
+ c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c);
+ if (c<512)
+ vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0);
+ else
+ vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040);
+}
+
+TPT_INLINE void Graphics::blendpixel(int x, int y, int r, int g, int b, int a)
+{
+ 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;
+ }
+ vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
+}
+
+TPT_INLINE void Graphics::addpixel(int x, int y, int r, int g, int b, int a)
+{
+ pixel t;
+ if (x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE)
+ return;
+ t = vid[y*(XRES+BARSIZE)+x];
+ r = (a*r + 255*PIXR(t)) >> 8;
+ g = (a*g + 255*PIXG(t)) >> 8;
+ b = (a*b + 255*PIXB(t)) >> 8;
+ if (r>255)
+ r = 255;
+ if (g>255)
+ g = 255;
+ if (b>255)
+ b = 255;
+ vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
+}
+
+void Graphics::xor_line(int x1, int y1, int x2, int y2)
+{
+ int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
+ float e, de;
+ if (cp)
+ {
+ y = x1;
+ x1 = y1;
+ y1 = y;
+ y = x2;
+ x2 = y2;
+ y2 = y;
+ }
+ if (x1 > x2)
+ {
+ y = x1;
+ x1 = x2;
+ x2 = y;
+ y = y1;
+ y1 = y2;
+ y2 = y;
+ }
+ dx = x2 - x1;
+ dy = abs(y2 - y1);
+ e = 0.0f;
+ if (dx)
+ de = dy/(float)dx;
+ else
+ de = 0.0f;
+ y = y1;
+ sy = (y1<y2) ? 1 : -1;
+ for (x=x1; x<=x2; x++)
+ {
+ if (cp)
+ xor_pixel(y, x);
+ else
+ xor_pixel(x, y);
+ e += de;
+ if (e >= 0.5f)
+ {
+ y += sy;
+ e -= 1.0f;
+ }
+ }
+}
+
+void Graphics::xor_rect(int x, int y, int w, int h)
+{
+ int i;
+ for (i=0; i<w; i+=2)
+ {
+ xor_pixel(x+i, y);
+ xor_pixel(x+i, y+h-1);
+ }
+ for (i=2; i<h; i+=2)
+ {
+ xor_pixel(x, y+i);
+ xor_pixel(x+w-1, y+i);
+ }
+}
+
+void Graphics::xor_bitmap(unsigned char * bitmap, int x, int y, int w, int h)
+{
+ for(int x1 = 0; x1 < w; x1++)
+ {
+ for(int y1 = 0; y1 < h; y1++)
+ {
+ if(bitmap[y1*w+x1])
+ xor_pixel(x+x1, y+y1);
+ }
+ }
+}
+
+void Graphics::draw_line(int x1, int y1, int x2, int y2, int r, int g, int b, int a)
+{
+ int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
+ float e, de;
+ if (cp)
+ {
+ y = x1;
+ x1 = y1;
+ y1 = y;
+ y = x2;
+ x2 = y2;
+ y2 = y;
+ }
+ if (x1 > x2)
+ {
+ y = x1;
+ x1 = x2;
+ x2 = y;
+ y = y1;
+ y1 = y2;
+ y2 = y;
+ }
+ dx = x2 - x1;
+ dy = abs(y2 - y1);
+ e = 0.0f;
+ if (dx)
+ de = dy/(float)dx;
+ else
+ de = 0.0f;
+ y = y1;
+ sy = (y1<y2) ? 1 : -1;
+ for (x=x1; x<=x2; x++)
+ {
+ if (cp)
+ blendpixel(y, x, r, g, b, a);
+ else
+ blendpixel(x, y, r, g, b, a);
+ e += de;
+ if (e >= 0.5f)
+ {
+ y += sy;
+ e -= 1.0f;
+ }
+ }
+}
+
+void Graphics::drawrect(int x, int y, int w, int h, int r, int g, int b, int a)
+{
+ int i;
+ for (i=0; i<=w; i++)
+ {
+ blendpixel(x+i, y, r, g, b, a);
+ blendpixel(x+i, y+h, r, g, b, a);
+ }
+ for (i=1; i<h; i++)
+ {
+ blendpixel(x, y+i, r, g, b, a);
+ blendpixel(x+w, y+i, r, g, b, a);
+ }
+}
+
+void Graphics::fillrect(int x, int y, int w, int h, int r, int g, int b, int a)
+{
+ int i,j;
+ for (j=1; j<h; j++)
+ for (i=1; i<w; i++)
+ blendpixel(x+i, y+j, r, g, b, a);
+}
+
+void Graphics::gradientrect(int x, int y, int width, int height, int r, int g, int b, int a, int r2, int g2, int b2, int a2)
+{
+
+}
+
+void Graphics::clearrect(int x, int y, int w, int h)
+{
+ int i;
+ for (i=1; i<h; i++)
+ memset(vid+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1));
+}
+
+void Graphics::draw_image(pixel *img, int x, int y, int w, int h, int a)
+{
+ int i, j, r, g, b;
+ if (!img) return;
+ if(y + h > YRES+MENUSIZE) h = (YRES+MENUSIZE)-y; //Adjust height to prevent drawing off the bottom
+ if(a >= 255)
+ for (j=0; j<h; j++)
+ for (i=0; i<w; i++)
+ {
+ vid[(y+j)*(XRES+BARSIZE)+(x+i)] = *img;
+ img++;
+ }
+ else
+ for (j=0; j<h; j++)
+ for (i=0; i<w; i++)
+ {
+ r = PIXR(*img);
+ g = PIXG(*img);
+ b = PIXB(*img);
+ blendpixel(x+i, y+j, r, g, b, a);
+ img++;
+ }
+}
+
+#endif
diff --git a/src/Renderer.cpp b/src/Renderer.cpp
index dece4d3..b254e59 100644
--- a/src/Renderer.cpp
+++ b/src/Renderer.cpp
@@ -210,20 +210,25 @@ void Renderer::FinaliseParts()
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2d(1, 0);
- glVertex3f(XRES*sdl_scale, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ //glVertex3f(XRES*sdl_scale, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ glVertex3f(XRES*sdl_scale, YRES*sdl_scale, 1.0);
glTexCoord2d(0, 0);
- glVertex3f(0, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ //glVertex3f(0, (YRES+MENUSIZE)*sdl_scale, 1.0);
+ glVertex3f(0, YRES*sdl_scale, 1.0);
glTexCoord2d(0, 1);
- glVertex3f(0, MENUSIZE*sdl_scale, 1.0);
+ //glVertex3f(0, MENUSIZE*sdl_scale, 1.0);
+ glVertex3f(0, 0, 1.0);
glTexCoord2d(1, 1);
- glVertex3f(XRES*sdl_scale, MENUSIZE*sdl_scale, 1.0);
+ //glVertex3f(XRES*sdl_scale, MENUSIZE*sdl_scale, 1.0);
+ glVertex3f(XRES*sdl_scale, 0, 1.0);
glEnd();
if(display_mode & DISPLAY_WARP)
{
glUseProgram(0);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
}
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable( GL_TEXTURE_2D );
#endif
}
@@ -238,11 +243,12 @@ void Renderer::RenderZoom()
float zcx1, zcx0, zcy1, zcy0, yfactor, xfactor, i; //X-Factor is shit, btw
xfactor = 1.0f/(float)XRES;
yfactor = 1.0f/(float)YRES;
+ yfactor*=-1.0f;
- zcx0 = (zoomScopePosition.X)*xfactor;
- zcx1 = (zoomScopePosition.X+zoomScopeSize)*xfactor;
- zcy0 = (zoomScopePosition.Y)*yfactor;
- zcy1 = ((zoomScopePosition.Y+zoomScopeSize))*yfactor;
+ zcx1 = (zoomScopePosition.X)*xfactor;
+ zcx0 = (zoomScopePosition.X+zoomScopeSize)*xfactor;
+ zcy1 = (zoomScopePosition.Y)*yfactor;
+ zcy0 = ((zoomScopePosition.Y+zoomScopeSize))*yfactor;
glGetIntegerv(GL_BLEND_SRC, &origBlendSrc);
glGetIntegerv(GL_BLEND_DST, &origBlendDst);
@@ -252,46 +258,49 @@ void Renderer::RenderZoom()
//glReadBuffer(GL_AUX0);
glBindTexture(GL_TEXTURE_2D, partsFboTex);
+ //Draw zoomed texture
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2d(zcx1, zcy1);
- glVertex3f((zoomWindowPosition.X+zoomScopeSize*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR))*sdl_scale, 1.0);
+ glVertex2i(zoomWindowPosition.X, zoomWindowPosition.Y);
glTexCoord2d(zcx0, zcy1);
- glVertex3f(zoomWindowPosition.X*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR))*sdl_scale, 1.0);
+ glVertex2i(zoomWindowPosition.X+(zoomScopeSize*ZFACTOR), zoomWindowPosition.Y);
glTexCoord2d(zcx0, zcy0);
- glVertex3f(zoomWindowPosition.X*sdl_scale, (YRES+MENUSIZE-zoomWindowPosition.Y)*sdl_scale, 1.0);
+ glVertex2i(zoomWindowPosition.X+(zoomScopeSize*ZFACTOR), zoomWindowPosition.Y+(zoomScopeSize*ZFACTOR));
glTexCoord2d(zcx1, zcy0);
- glVertex3f((zoomWindowPosition.X+zoomScopeSize*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-zoomWindowPosition.Y)*sdl_scale, 1.0);
+ glVertex2i(zoomWindowPosition.X, zoomWindowPosition.Y+(zoomScopeSize*ZFACTOR));
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable( GL_TEXTURE_2D );
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ //Lines to make the pixels stand out
glLineWidth(sdl_scale);
- glEnable(GL_LINE_SMOOTH);
+ //glEnable(GL_LINE_SMOOTH);
glBegin(GL_LINES);
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
for(i = 0; i < zoomScopeSize; i++)
{
- glVertex2f((zoomWindowPosition.X+zoomScopeSize*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR)+i*ZFACTOR)*sdl_scale);
- glVertex2f(zoomWindowPosition.X*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR)+i*ZFACTOR)*sdl_scale);
- glVertex2f((zoomWindowPosition.X+i*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR))*sdl_scale);
- glVertex2f((zoomWindowPosition.X+i*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-zoomWindowPosition.Y)*sdl_scale);
+ //Across
+ glVertex2i(zoomWindowPosition.X, zoomWindowPosition.Y+(i*ZFACTOR));
+ glVertex2i(zoomWindowPosition.X+(zoomScopeSize*ZFACTOR), zoomWindowPosition.Y+(i*ZFACTOR));
+
+ //Down
+ glVertex2i(zoomWindowPosition.X+(i*ZFACTOR), zoomWindowPosition.Y);
+ glVertex2i(zoomWindowPosition.X+(i*ZFACTOR), zoomWindowPosition.Y+(zoomScopeSize*ZFACTOR));
}
glEnd();
+ //Draw zoom window border
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- glBegin(GL_LINE_STRIP);
- glVertex3i((zoomWindowPosition.X-1)*sdl_scale, (YRES+MENUSIZE-zoomWindowPosition.Y)*sdl_scale, 0);
- glVertex3i((zoomWindowPosition.X-1)*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR))*sdl_scale, 0);
- glVertex3i((zoomWindowPosition.X+zoomScopeSize*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-(zoomWindowPosition.Y+zoomScopeSize*ZFACTOR))*sdl_scale, 0);
- glVertex3i((zoomWindowPosition.X+zoomScopeSize*ZFACTOR)*sdl_scale, (YRES+MENUSIZE-zoomWindowPosition.Y)*sdl_scale, 0);
- glVertex3i((zoomWindowPosition.X-1)*sdl_scale, (YRES+MENUSIZE-zoomWindowPosition.Y)*sdl_scale, 0);
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(zoomWindowPosition.X, zoomWindowPosition.Y);
+ glVertex2i(zoomWindowPosition.X+(zoomScopeSize*ZFACTOR), zoomWindowPosition.Y);
+ glVertex2i(zoomWindowPosition.X+(zoomScopeSize*ZFACTOR), zoomWindowPosition.Y+(zoomScopeSize*ZFACTOR));
+ glVertex2i(zoomWindowPosition.X, zoomWindowPosition.Y+(zoomScopeSize*ZFACTOR));
glEnd();
- glDisable(GL_LINE_SMOOTH);
-
- glDisable(GL_LINE_SMOOTH);
+ //glDisable(GL_LINE_SMOOTH);
if(zoomEnabled)
{
@@ -299,12 +308,16 @@ void Renderer::RenderZoom()
//glEnable(GL_LINE_SMOOTH);
glLogicOp(GL_XOR);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- glBegin(GL_LINE_STRIP);
- glVertex3i((zoomScopePosition.X-1)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y-1))*sdl_scale, 0);
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(zoomScopePosition.X, zoomScopePosition.Y);
+ glVertex2i(zoomScopePosition.X+zoomScopeSize, zoomScopePosition.Y);
+ glVertex2i(zoomScopePosition.X+zoomScopeSize, zoomScopePosition.Y+zoomScopeSize);
+ glVertex2i(zoomScopePosition.X, zoomScopePosition.Y+zoomScopeSize);
+ /*glVertex3i((zoomScopePosition.X-1)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y-1))*sdl_scale, 0);
glVertex3i((zoomScopePosition.X-1)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y+zoomScopeSize))*sdl_scale, 0);
glVertex3i((zoomScopePosition.X+zoomScopeSize)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y+zoomScopeSize))*sdl_scale, 0);
glVertex3i((zoomScopePosition.X+zoomScopeSize)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y-1))*sdl_scale, 0);
- glVertex3i((zoomScopePosition.X-1)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y-1))*sdl_scale, 0);
+ glVertex3i((zoomScopePosition.X-1)*sdl_scale, (YRES+MENUSIZE-(zoomScopePosition.Y-1))*sdl_scale, 0);*/
glEnd();
glDisable(GL_COLOR_LOGIC_OP);
}
@@ -343,6 +356,7 @@ void Renderer::RenderZoom()
void Renderer::DrawWalls()
{
+#ifndef OGLR
int x, y, i, j, cr, cg, cb;
unsigned char wt;
pixel pc;
@@ -447,30 +461,30 @@ void Renderer::DrawWalls()
{
for (j=0; j<CELL; j+=2)
for (i=(j>>1)&1; i<CELL; i+=2)
- g->drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
+ drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
}
else if (wtypes[wt].drawstyle==2)
{
for (j=0; j<CELL; j+=2)
for (i=0; i<CELL; i+=2)
- g->drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
+ drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
}
else if (wtypes[wt].drawstyle==3)
{
for (j=0; j<CELL; j++)
for (i=0; i<CELL; i++)
- g->drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
+ drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
}
else if (wtypes[wt].drawstyle==4)
{
for (j=0; j<CELL; j++)
for (i=0; i<CELL; i++)
if(i == j)
- g->drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
+ drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
else if (i == j+1 || (i == 0 && j == CELL-1))
- g->drawblob((x*CELL+i), (y*CELL+j), PIXR(gc), PIXG(gc), PIXB(gc));
+ drawblob((x*CELL+i), (y*CELL+j), PIXR(gc), PIXG(gc), PIXB(gc));
else
- g->drawblob((x*CELL+i), (y*CELL+j), 0x20, 0x20, 0x20);
+ drawblob((x*CELL+i), (y*CELL+j), 0x20, 0x20, 0x20);
}
if (bmap[y][x]==WL_EWALL)
{
@@ -479,14 +493,14 @@ void Renderer::DrawWalls()
for (j=0; j<CELL; j++)
for (i=0; i<CELL; i++)
if (i&j&1)
- g->drawblob((x*CELL+i), (y*CELL+j), 0x80, 0x80, 0x80);
+ drawblob((x*CELL+i), (y*CELL+j), 0x80, 0x80, 0x80);
}
else
{
for (j=0; j<CELL; j++)
for (i=0; i<CELL; i++)
if (!(i&j&1))
- g->drawblob((x*CELL+i), (y*CELL+j), 0x80, 0x80, 0x80);
+ drawblob((x*CELL+i), (y*CELL+j), 0x80, 0x80, 0x80);
}
}
else if (bmap[y][x]==WL_WALLELEC)
@@ -495,9 +509,9 @@ void Renderer::DrawWalls()
for (i=0; i<CELL; i++)
{
if (!((y*CELL+j)%2) && !((x*CELL+i)%2))
- g->drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
+ drawblob((x*CELL+i), (y*CELL+j), PIXR(pc), PIXG(pc), PIXB(pc));
else
- g->drawblob((x*CELL+i), (y*CELL+j), 0x80, 0x80, 0x80);
+ drawblob((x*CELL+i), (y*CELL+j), 0x80, 0x80, 0x80);
}
}
else if (bmap[y][x]==WL_EHOLE)
@@ -506,7 +520,7 @@ void Renderer::DrawWalls()
{
for (j=0; j<CELL; j++)
for (i=0; i<CELL; i++)
- g->drawblob((x*CELL+i), (y*CELL+j), 0x24, 0x24, 0x24);
+ drawblob((x*CELL+i), (y*CELL+j), 0x24, 0x24, 0x24);
for (j=0; j<CELL; j+=2)
for (i=0; i<CELL; i+=2)
vid[(y*CELL+j)*(XRES+BARSIZE)+(x*CELL+i)] = PIXPACK(0x000000);
@@ -515,7 +529,7 @@ void Renderer::DrawWalls()
{
for (j=0; j<CELL; j+=2)
for (i=0; i<CELL; i+=2)
- g->drawblob((x*CELL+i), (y*CELL+j), 0x24, 0x24, 0x24);
+ drawblob((x*CELL+i), (y*CELL+j), 0x24, 0x24, 0x24);
}
}
}
@@ -535,6 +549,7 @@ void Renderer::DrawWalls()
}
}
+#endif
}
void Renderer::get_sign_pos(int i, int *x0, int *y0, int *w, int *h)
@@ -577,6 +592,10 @@ void Renderer::DrawSigns()
{
int i, j, x, y, w, h, dx, dy,mx,my,b=1,bq;
sign *signs = sim->signs;
+#ifdef OGLR
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glTranslated(0, MENUSIZE, 0);
+#endif
for (i=0; i<MAXSIGNS; i++)
if (signs[i].text[0])
{
@@ -626,12 +645,20 @@ void Renderer::DrawSigns()
y = signs[i].y;
dx = 1 - signs[i].ju;
dy = (signs[i].y > 18) ? -1 : 1;
+#ifdef OGLR
+ glBegin(GL_LINES);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glVertex2i(x, y);
+ glVertex2i(x+(dx*4), y+(dy*4));
+ glEnd();
+#else
for (j=0; j<4; j++)
{
- g->drawpixel(x, y, 192, 192, 192, 255);
+ g->blendpixel(x, y, 192, 192, 192, 255);
x+=dx;
y+=dy;
}
+#endif
/*if (MSIGN==i)
{
bq = b;
@@ -642,10 +669,15 @@ void Renderer::DrawSigns()
signs[i].y = my;
}*/
}
+#ifdef OGLR
+ glTranslated(0, -MENUSIZE, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+#endif
}
void Renderer::render_gravlensing()
{
+#ifndef OGLR
int nx, ny, rx, ry, gx, gy, bx, by, co;
int r, g, b;
pixel t;
@@ -675,27 +707,15 @@ void Renderer::render_gravlensing()
if (b>255)
b = 255;
dst[ny*(XRES+BARSIZE)+nx] = PIXRGB(r,g,b);
- // addpixel(dst, nx, ny, PIXR(src[ry*(XRES+BARSIZE)+rx]), PIXG(src[gy*(XRES+BARSIZE)+gx]), PIXB(src[by*(XRES+BARSIZE)+bx]), 255);
}
-
- /*rx = nx+(gravxf[(ny*XRES)+nx]*0.5f);
- ry = ny+(gravyf[(ny*XRES)+nx]*0.5f);
- gx = nx+(gravxf[(ny*XRES)+nx]*0.75f);
- gy = ny+(gravyf[(ny*XRES)+nx]*0.75f);
- bx = nx+(gravxf[(ny*XRES)+nx]);
- by = ny+(gravyf[(ny*XRES)+nx]);
- if(rx > 0 && rx < XRES && ry > 0 && ry < YRES && gravp[ny/CELL][nx/CELL]*0.5f > -8.0f)
- addpixel(dst, rx, ry, PIXR(src[ry*(XRES+BARSIZE)+rx]), 0, 0, 255);
- if(gx > 0 && gx < XRES && gy > 0 && gy < YRES && gravp[ny/CELL][nx/CELL]*0.75f > -8.0f)
- addpixel(dst, gx, gy, 0, PIXG(src[ry*(XRES+BARSIZE)+rx]), 0, 255);
- if(bx > 0 && bx < XRES && by > 0 && by < YRES && gravp[ny/CELL][nx/CELL] > -8.0f)
- addpixel(dst, bx, by, 0, 0, PIXB(src[ry*(XRES+BARSIZE)+rx]), 255);*/
}
}
+#endif
}
void Renderer::render_fire()
{
+#ifndef OGLR
int i,j,x,y,r,g,b,nx,ny;
for (j=0; j<YRES/CELL; j++)
for (i=0; i<XRES/CELL; i++)
@@ -725,6 +745,7 @@ void Renderer::render_fire()
fire_g[j][i] = g>4 ? g-4 : 0;
fire_b[j][i] = b>4 ? b-4 : 0;
}
+#endif
}
float temp[CELL*3][CELL*3];
@@ -840,6 +861,7 @@ void Renderer::render_parts()
glGetIntegerv(GL_BLEND_DST, &origBlendDst);
//Render to the particle FBO
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glTranslated(0, MENUSIZE, 0);
#else
/*if (GRID_MODE)//draws the grid
{
@@ -878,27 +900,6 @@ void Renderer::render_parts()
decg = (sim->parts[i].dcolour>>8)&0xFF;
decb = (sim->parts[i].dcolour)&0xFF;
- /*if(display_mode == RENDER_NONE)
- {
- if(decorations_enable)
- {
- colr = (deca*decr + (255-deca)*colr) >> 8;
- colg = (deca*decg + (255-deca)*colg) >> 8;
- colb = (deca*decb + (255-deca)*colb) >> 8;
- }
-#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 (graphicscache[t].isready)
{
@@ -1758,10 +1759,9 @@ void Renderer::render_parts()
glDisableClientState(GL_VERTEX_ARRAY);
//Reset FBO
+ glTranslated(0, -MENUSIZE, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
- //Drawing the FBO onto the screen sounds like a cool idea now
-
glBlendFunc(origBlendSrc, origBlendDst);
#endif
}
@@ -1777,6 +1777,8 @@ void Renderer::draw_other() // EMP effect
if (emp_decor>0)
{
#ifdef OGLR
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glTranslated(0, MENUSIZE, 0);
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;
@@ -1791,6 +1793,8 @@ void Renderer::draw_other() // EMP effect
glVertex2f(XRES, YRES+MENUSIZE);
glVertex2f(0, YRES+MENUSIZE);
glEnd();
+ glTranslated(0, -MENUSIZE, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
#else
int r=emp_decor*2.5, g=100+emp_decor*1.5, b=255;
int a=(1.0*emp_decor/110)*255;
@@ -1801,7 +1805,7 @@ void Renderer::draw_other() // EMP effect
for (j=0; j<YRES; j++)
for (i=0; i<XRES; i++)
{
- this->g->drawpixel(i, j, r, g, b, a);
+ this->g->blendpixel(i, j, r, g, b, a);
}
#endif
}
@@ -1926,6 +1930,7 @@ void Renderer::draw_air()
glEnable( GL_TEXTURE_2D );
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glTranslated(0, MENUSIZE, 0);
glUseProgram(airProg);
@@ -1957,6 +1962,7 @@ void Renderer::draw_air()
glUseProgram(0);
glBindTexture(GL_TEXTURE_2D, 0);
+ glTranslated(0, -MENUSIZE, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDisable( GL_TEXTURE_2D );
#endif
@@ -1974,14 +1980,27 @@ void Renderer::draw_grav_zones()
for (j=0; j<CELL; j++)//draws the colors
for (i=0; i<CELL; i++)
if(i == j)
- g->drawpixel(x*CELL+i, y*CELL+j, 255, 200, 0, 120);
+ g->blendpixel(x*CELL+i, y*CELL+j, 255, 200, 0, 120);
else
- g->drawpixel(x*CELL+i, y*CELL+j, 32, 32, 32, 120);
+ g->blendpixel(x*CELL+i, y*CELL+j, 32, 32, 32, 120);
}
}
}
}
+void Renderer::drawblob(int x, int y, unsigned char cr, unsigned char cg, unsigned char cb)
+{
+ g->blendpixel(x+1, y, cr, cg, cb, 112);
+ g->blendpixel(x-1, y, cr, cg, cb, 112);
+ g->blendpixel(x, y+1, cr, cg, cb, 112);
+ g->blendpixel(x, y-1, cr, cg, cb, 112);
+
+ g->blendpixel(x+1, y-1, cr, cg, cb, 64);
+ g->blendpixel(x-1, y-1, cr, cg, cb, 64);
+ g->blendpixel(x+1, y+1, cr, cg, cb, 64);
+ g->blendpixel(x-1, y+1, cr, cg, cb, 64);
+}
+
Renderer::Renderer(Graphics * g, Simulation * sim):
sim(NULL),
g(NULL),
diff --git a/src/Renderer.h b/src/Renderer.h
index b69108a..803a486 100644
--- a/src/Renderer.h
+++ b/src/Renderer.h
@@ -89,6 +89,7 @@ public:
void loadShaders();
#endif
+ void drawblob(int x, int y, unsigned char cr, unsigned char cg, unsigned char cb);
//...
void get_sign_pos(int i, int *x0, int *y0, int *w, int *h);
diff --git a/src/cat/LuaScriptInterface.cpp b/src/cat/LuaScriptInterface.cpp
index 5d07279..a918ff1 100644
--- a/src/cat/LuaScriptInterface.cpp
+++ b/src/cat/LuaScriptInterface.cpp
@@ -1444,7 +1444,7 @@ int luatpt_get_property(lua_State* l)
int luatpt_drawpixel(lua_State* l)
{
- int x, y, r, g, b, a;
+ /*int x, y, r, g, b, a;
x = luaL_optint(l, 1, 0);
y = luaL_optint(l, 2, 0);
r = luaL_optint(l, 3, 255);
@@ -1466,8 +1466,8 @@ int luatpt_drawpixel(lua_State* l)
{
luacon_g->drawpixel(x, y, r, g, b, a);
return 0;
- }
- return luaL_error(l, "Screen buffer does not exist");
+ }*/
+ return luaL_error(l, "Deprecated");
}
int luatpt_drawrect(lua_State* l)
@@ -1496,11 +1496,7 @@ int luatpt_drawrect(lua_State* l)
if (b>255) b = 255;
if (a<0) a = 0;
if (a>255) a = 255;
- if (luacon_g->vid!=NULL)
- {
- luacon_g->drawrect(x, y, w, h, r, g, b, a);
- return 0;
- }
+ luacon_g->drawrect(x, y, w, h, r, g, b, a);
return luaL_error(l, "Screen buffer does not exist");
}
@@ -1530,11 +1526,7 @@ int luatpt_fillrect(lua_State* l)
if (b>255) b = 255;
if (a<0) a = 0;
if (a>255) a = 255;
- if (luacon_g->vid!=NULL)
- {
- luacon_g->fillrect(x, y, w, h, r, g, b, a);
- return 0;
- }
+ luacon_g->fillrect(x, y, w, h, r, g, b, a);
return luaL_error(l, "Screen buffer does not exist");
}
@@ -1559,11 +1551,7 @@ int luatpt_drawline(lua_State* l)
if (b>255) b = 255;
if (a<0) a = 0;
if (a>255) a = 255;
- if (luacon_g->vid!=NULL)
- {
- luacon_g->blend_line(x1, y1, x2, y2, r, g, b, a);
- return 0;
- }
+ luacon_g->draw_line(x1, y1, x2, y2, r, g, b, a);
return luaL_error(l, "Screen buffer does not exist");
}
diff --git a/src/console/ConsoleView.cpp b/src/console/ConsoleView.cpp
index f36a33b..cda871e 100644
--- a/src/console/ConsoleView.cpp
+++ b/src/console/ConsoleView.cpp
@@ -88,8 +88,8 @@ void ConsoleView::OnDraw()
{
Graphics * g = ui::Engine::Ref().g;
g->fillrect(Position.X, Position.Y, Size.X, Size.Y, 0, 0, 0, 110);
- g->blend_line(Position.X, Position.Y+Size.Y-16, Position.X+Size.X, Position.Y+Size.Y-16, 255, 255, 255, 160);
- g->blend_line(Position.X, Position.Y+Size.Y, Position.X+Size.X, Position.Y+Size.Y, 255, 255, 255, 200);
+ g->draw_line(Position.X, Position.Y+Size.Y-16, Position.X+Size.X, Position.Y+Size.Y-16, 255, 255, 255, 160);
+ g->draw_line(Position.X, Position.Y+Size.Y, Position.X+Size.X, Position.Y+Size.Y, 255, 255, 255, 200);
}
ConsoleView::~ConsoleView() {
diff --git a/src/game/Brush.h b/src/game/Brush.h
index 98d1321..656f9f3 100644
--- a/src/game/Brush.h
+++ b/src/game/Brush.h
@@ -8,14 +8,16 @@
#ifndef BRUSH_H_
#define BRUSH_H_
+#include <iostream>
#include "interface/Point.h"
class Brush
{
protected:
- bool * outline;
- bool * bitmap;
+ unsigned char * outline;
+ unsigned char * bitmap;
ui::Point size;
+ ui::Point radius;
void updateOutline()
{
if(!bitmap)
@@ -24,35 +26,35 @@ protected:
return;
if(outline)
free(outline);
- int width = size.X*2;
- int height = size.Y*2;
- outline = (bool *)malloc(sizeof(bool)*((width+1)*(height+1)));
- for(int x = 0; x <= width; x++)
+ outline = (unsigned char *)calloc(size.X*size.Y, sizeof(unsigned char));
+ for(int x = 0; x < size.X; x++)
{
- for(int y = 0; y <= height; y++)
+ for(int y = 0; y < size.Y; y++)
{
- if(bitmap[y*width+x] && (!y || !x || y == height || x == width || !bitmap[y*width+(x+1)] || !bitmap[y*width+(x-1)] || !bitmap[(y-1)*width+x] || !bitmap[(y+1)*width+x]))
- outline[y*width+x] = true;
+ if(bitmap[y*size.X+x] && (!y || !x || y == size.X-1 || x == size.Y-1 || !bitmap[y*size.X+(x+1)] || !bitmap[y*size.X+(x-1)] || !bitmap[(y-1)*size.X+x] || !bitmap[(y+1)*size.X+x]))
+ outline[y*size.X+x] = 255;
else
- outline[y*width+x] = false;
+ outline[y*size.X+x] = 0;
}
}
}
public:
Brush(ui::Point size_):
bitmap(NULL),
- size(size_),
- outline(NULL)
+ outline(NULL),
+ radius(0, 0),
+ size(0, 0)
{
-
+ SetRadius(size_);
};
ui::Point GetRadius()
{
- return size;
+ return radius;
}
- void SetRadius(ui::Point size)
+ void SetRadius(ui::Point radius)
{
- this->size = size;
+ this->radius = radius;
+ this->size = radius+radius+ui::Point(1, 1);
GenerateBitmap();
updateOutline();
}
@@ -93,37 +95,30 @@ public:
updateOutline();
if(!outline)
return;
- for(int x = 0; x <= size.X*2; x++)
- {
- for(int y = 0; y <= size.Y*2; y++)
- {
- if(outline[y*(size.X*2)+x])
- g->xor_pixel(position.X-size.X+x, position.Y-size.Y+y);
- }
- }
+ g->xor_bitmap(outline, position.X-radius.X, position.Y-radius.Y-1, size.X, size.Y);
}
virtual void GenerateBitmap()
{
if(bitmap)
free(bitmap);
- bitmap = (bool *)malloc(sizeof(bool)*(((size.X*2)+1)*((size.Y*2)+1)));
- for(int x = 0; x <= size.X*2; x++)
+ bitmap = (unsigned char *)calloc((size.X*size.Y), sizeof(unsigned char));
+ for(int x = 0; x < size.X; x++)
{
- for(int y = 0; y <= size.Y*2; y++)
+ for(int y = 0; y < size.Y; y++)
{
- bitmap[y*(size.X*2)+x] = true;
+ bitmap[(y*size.X)+x] = 255;
}
}
}
//Get a bitmap for drawing particles
- bool * GetBitmap()
+ unsigned char * GetBitmap()
{
if(!bitmap)
GenerateBitmap();
return bitmap;
}
- bool * GetOutline()
+ unsigned char * GetOutline()
{
if(!outline)
updateOutline();
diff --git a/src/game/EllipseBrush.h b/src/game/EllipseBrush.h
index 0953c01..26b3cf8 100644
--- a/src/game/EllipseBrush.h
+++ b/src/game/EllipseBrush.h
@@ -22,20 +22,20 @@ public:
{
if(bitmap)
free(bitmap);
- bitmap = (bool *)malloc(sizeof(bool)*(((size.X*2)+1)*((size.Y*2)+1)));
- int rx = size.X;
- int ry = size.Y;
- for(int x = 0; x <= size.X*2; x++)
+ bitmap = (unsigned char*)calloc((size.X*size.Y), sizeof(unsigned char));
+ int rx = radius.X;
+ int ry = radius.Y;
+ for(int x = 0; x <= radius.X*2; x++)
{
- for(int y = 0; y <= size.Y*2; y++)
+ for(int y = 0; y <= radius.Y*2; y++)
{
- if((pow(x-size.X,2)*pow(ry,2)+pow(y-size.Y,2)*pow(rx,2)<=pow(rx,2)*pow(ry,2)))
+ if((pow(x-radius.X,2)*pow(ry,2)+pow(y-radius.Y,2)*pow(rx,2)<=pow(rx,2)*pow(ry,2)))
{
- bitmap[y*(size.X*2)+x] = true;
+ bitmap[y*(size.X)+x] = 255;
}
else
{
- bitmap[y*(size.X*2)+x] = false;
+ bitmap[y*(size.X)+x] = 0;
}
}
}
diff --git a/src/game/GameController.cpp b/src/game/GameController.cpp
index f289f49..4f94ab8 100644
--- a/src/game/GameController.cpp
+++ b/src/game/GameController.cpp
@@ -580,6 +580,9 @@ void GameController::ReloadSim()
std::string GameController::ElementResolve(int type)
{
- return std::string(gameModel->GetSimulation()->ptypes[type].name);
+ if(gameModel && gameModel->GetSimulation() && gameModel->GetSimulation()->ptypes && type >= 0 && type < PT_NUM)
+ return std::string(gameModel->GetSimulation()->ptypes[type].name);
+ else
+ return "";
}
diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp
index 219c6ee..7e04c6e 100644
--- a/src/game/GameView.cpp
+++ b/src/game/GameView.cpp
@@ -857,9 +857,8 @@ void GameView::OnDraw()
ren->draw_air();
ren->render_parts();
ren->render_fire();
- //ren->draw_grav();
+ ren->draw_grav();
ren->DrawWalls();
- ren->FinaliseParts();
if(activeBrush && currentMouse.X > 0 && currentMouse.X < XRES && currentMouse.Y > 0 && currentMouse.Y < YRES)
{
if(drawMode==DrawRect && isMouseDown)
@@ -875,8 +874,9 @@ void GameView::OnDraw()
activeBrush->RenderPoint(g, c->PointTranslate(currentMouse));
}
}
- ren->RenderZoom();
ren->DrawSigns();
+ ren->FinaliseParts();
+ ren->RenderZoom();
if(selectMode!=SelectNone)
{
diff --git a/src/interface/Engine.cpp b/src/interface/Engine.cpp
index 751cbcb..aea89e7 100644
--- a/src/interface/Engine.cpp
+++ b/src/interface/Engine.cpp
@@ -74,7 +74,10 @@ void Engine::ShowWindow(Window * window)
prevBuffers.push(lastBuffer);
}
lastBuffer = (pixel*)malloc((width_ * height_) * PIXELSIZE);
+
+#ifndef OGLR
memcpy(lastBuffer, g->vid, (width_ * height_) * PIXELSIZE);
+#endif
windows.push(state_);
}
@@ -167,7 +170,9 @@ void Engine::Draw()
if(lastBuffer && !(state_->Position.X == 0 && state_->Position.Y == 0 && state_->Size.X == width_ && state_->Size.Y == height_))
{
g->Clear();
+#ifndef OGLR
memcpy(g->vid, lastBuffer, (width_ * height_) * PIXELSIZE);
+#endif
}
else
{
diff --git a/src/interface/Slider.cpp b/src/interface/Slider.cpp
index 06d6f87..3430ca1 100644
--- a/src/interface/Slider.cpp
+++ b/src/interface/Slider.cpp
@@ -16,7 +16,9 @@ Slider::Slider(Point position, Point size, int steps):
sliderSteps(steps),
sliderPosition(0),
isMouseDown(false),
- bgGradient(NULL)
+ bgGradient(NULL),
+ col1(0, 0, 0, 0),
+ col2(0, 0, 0, 0)
{
// TODO Auto-generated constructor stub
@@ -79,6 +81,8 @@ void Slider::SetColour(Colour col1, Colour col2)
{
if(bgGradient)
free(bgGradient);
+ this->col1 = col1;
+ this->col2 = col2;
bgGradient = (unsigned char*)Graphics::GenerateGradient(
(pixel[2]){PIXRGB(col1.Red, col1.Green, col1.Blue), PIXRGB(col2.Red, col2.Green, col2.Blue)},
(float[2]){0.0f, 1.0f}, 2, Size.X-6);
@@ -100,9 +104,13 @@ void Slider::Draw(const Point& screenPos)
if(bgGradient)
{
+#ifndef OGLR
for (int j = 3; j < Size.Y-6; j++)
for (int i = 3; i < Size.X-6; i++)
- g->drawpixel(screenPos.X+i+2, screenPos.Y+j+2, bgGradient[(i-3)*3], bgGradient[(i-3)*3+1], bgGradient[(i-3)*3+2], 255);
+ g->blendpixel(screenPos.X+i+2, screenPos.Y+j+2, bgGradient[(i-3)*3], bgGradient[(i-3)*3+1], bgGradient[(i-3)*3+2], 255);
+#else
+ g->gradientrect(screenPos.X+3, screenPos.Y+3, Size.X-6, Size.Y-6, col1.Red, col1.Green, col1.Blue, col1.Alpha, col2.Red, col2.Green, col2.Blue, col2.Alpha);
+#endif
}
g->drawrect(screenPos.X+3, screenPos.Y+3, Size.X-6, Size.Y-6, 255, 255, 255, 255);
diff --git a/src/interface/Slider.h b/src/interface/Slider.h
index 4992f80..21792bc 100644
--- a/src/interface/Slider.h
+++ b/src/interface/Slider.h
@@ -26,6 +26,7 @@ class Slider: public ui::Component {
bool isMouseDown;
unsigned char * bgGradient;
SliderAction * actionCallback;
+ Colour col1, col2;
void updatePosition(int position);
public:
Slider(Point position, Point size, int steps);
diff --git a/src/interface/Spinner.cpp b/src/interface/Spinner.cpp
index 1ecad8d..b988674 100644
--- a/src/interface/Spinner.cpp
+++ b/src/interface/Spinner.cpp
@@ -27,7 +27,7 @@ void Spinner::Draw(const Point& screenPos)
int baseY = screenPos.Y+(Size.Y/2);
for(float t = 0.0f; t < 1.0f; t+=0.05f)
{
- g->drawblob(baseX+(sin(cValue+t)*(Size.X/2)), baseY+(cos(cValue+t)*(Size.X/2)), t*255, t*255, t*255);
+ //g->drawblob(baseX+(sin(cValue+t)*(Size.X/2)), baseY+(cos(cValue+t)*(Size.X/2)), t*255, t*255, t*255);
}
}
Spinner::~Spinner()
diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp
index eabdcfd..9f435f0 100644
--- a/src/simulation/Simulation.cpp
+++ b/src/simulation/Simulation.cpp
@@ -434,7 +434,7 @@ void Simulation::ApplyDecorationPoint(int x, int y, int rx, int ry, int colR, in
return;
}
- bool *bitmap = cBrush->GetBitmap();
+ unsigned char *bitmap = cBrush->GetBitmap();
for (j=-ry; j<=ry; j++)
for (i=-rx; i<=rx; i++)
if(bitmap[(j+ry)*(rx*2)+(i+rx)])
@@ -624,10 +624,10 @@ int Simulation::create_parts(int x, int y, int rx, int ry, int c, int flags, Bru
}
else if(cBrush)
{
- bool *bitmap = cBrush->GetBitmap();
+ unsigned char *bitmap = cBrush->GetBitmap();
for (j=-ry; j<=ry; j++)
for (i=-rx; i<=rx; i++)
- if(bitmap[(j+ry)*(rx*2)+(i+rx)])
+ if(bitmap[(j+ry)*((rx*2)+1)+(i+rx+1)])
delete_part(x+i, y+j, 0);
}
else
@@ -647,10 +647,10 @@ int Simulation::create_parts(int x, int y, int rx, int ry, int c, int flags, Bru
}
else if(cBrush)
{
- bool *bitmap = cBrush->GetBitmap();
+ unsigned char *bitmap = cBrush->GetBitmap();
for (j=-ry; j<=ry; j++)
for (i=-rx; i<=rx; i++)
- if(bitmap[(j+ry)*(rx*2)+(i+rx)])
+ if(bitmap[(j+ry)*((rx*2)+1)+(i+rx+1)])
{
if ( x+i<0 || y+j<0 || x+i>=XRES || y+j>=YRES)
continue;
@@ -678,10 +678,10 @@ int Simulation::create_parts(int x, int y, int rx, int ry, int c, int flags, Bru
}
else if(cBrush)
{
- bool *bitmap = cBrush->GetBitmap();
+ unsigned char *bitmap = cBrush->GetBitmap();
for (j=-ry; j<=ry; j++)
for (i=-rx; i<=rx; i++)
- if(bitmap[(j+ry)*(rx*2)+(i+rx)])
+ if(bitmap[(j+ry)*((rx*2)+1)+(i+rx+1)])
if (create_part_add_props(-2, x+i, y+j, c, rx, ry)==-1)
f = 1;
}