Some testing with OpenGL

This commit is contained in:
Simon Robertshaw 2011-10-18 21:56:32 +01:00
parent 44a0008d4e
commit 8052c4bfdf
3 changed files with 99 additions and 35 deletions

View File

@ -26,12 +26,12 @@
#define PIXR(x) (((x)>>8)&0xFF) #define PIXR(x) (((x)>>8)&0xFF)
#define PIXG(x) (((x)>>16)&0xFF) #define PIXG(x) (((x)>>16)&0xFF)
#define PIXB(x) (((x)>>24)) #define PIXB(x) (((x)>>24))
#elif defined(PIX32RGBA) #elif defined(PIX32OGL)
#define PIXPACK(x) ((((x)>>16)&0x0000FF)|((x)&0x00FF00)|(((x)<<16)&0xFF0000)) #define PIXPACK(x) (0xFF000000|((x)&0xFFFFFF))
#define PIXRGB(r,g,b) (((b)<<16)|((g)<<8)|((r)))// (((b)<<16)|((g)<<8)|(r)) #define PIXRGB(r,g,b) (0xFF000000|((r)<<16)|((g)<<8)|((b)))// (((b)<<16)|((g)<<8)|(r))
#define PIXR(x) ((x)&0xFF) #define PIXR(x) (((x)>>16)&0xFF)
#define PIXG(x) (((x)>>8)&0xFF) #define PIXG(x) (((x)>>8)&0xFF)
#define PIXB(x) ((x)>>16) #define PIXB(x) ((x)&0xFF)
#else #else
#define PIXPACK(x) (x) #define PIXPACK(x) (x)
#define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b)) #define PIXRGB(r,g,b) (((r)<<16)|((g)<<8)|(b))
@ -183,10 +183,9 @@ 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); int draw_debug_info(pixel* vid, int lm, int lx, int ly, int cx, int cy, int line_x, int line_y);
#ifdef OpenGL #ifdef OGLR
void Enable2D (); void clearScreen(float alpha);
void RenderScene (); void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale);
void ClearScreen();
#endif #endif
#endif #endif

View File

@ -26,6 +26,8 @@ unsigned cmode = CM_FIRE;
SDL_Surface *sdl_scrn; SDL_Surface *sdl_scrn;
int sdl_scale = 1; int sdl_scale = 1;
GLuint vidBuf;
int sandcolour_r = 0; int sandcolour_r = 0;
int sandcolour_g = 0; int sandcolour_g = 0;
int sandcolour_b = 0; int sandcolour_b = 0;
@ -285,26 +287,33 @@ pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f)
} }
#ifdef OGLR #ifdef OGLR
void clearScreen(float alpha)
{
glClearColor(0.0f, 0.0f, 0.0f, alpha);
glClear(GL_COLOR_BUFFER_BIT);
}
void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale) void ogl_blit(int x, int y, int w, int h, pixel *src, int pitch, int scale)
{ {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0 ,XRES*scale, 0, YRES*scale, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//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);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XRES+BARSIZE, YRES+MENUSIZE, GL_BGRA, GL_UNSIGNED_BYTE, src);
glRasterPos2i(0, YRES*scale); glBegin(GL_QUADS);
glPixelZoom(scale, -scale); glTexCoord2d(1, 0);
glVertex3f(XRES+BARSIZE, YRES+MENUSIZE, 1.0);
glDrawPixels(w,h,GL_RGBA,GL_UNSIGNED_BYTE,src); glTexCoord2d(0, 0);
glVertex3f(0, YRES+MENUSIZE, 1.0);
glPopMatrix(); glTexCoord2d(0, 1);
glMatrixMode(GL_PROJECTION); glVertex3f(0, 0, 1.0);
glPopMatrix(); glTexCoord2d(1, 1);
glMatrixMode(GL_MODELVIEW); glVertex3f(XRES+BARSIZE, 0, 1.0);
glEnd();
glDisable( GL_TEXTURE_2D );
glFlush();
SDL_GL_SwapBuffers (); SDL_GL_SwapBuffers ();
} }
#endif #endif
@ -1390,10 +1399,17 @@ void xor_rect(pixel *vid, int x, int y, int w, int h)
} }
//New function for drawing particles //New function for drawing particles
#ifdef OGLR
GLuint va[(YRES*XRES)*2];
GLfloat ca[(YRES*XRES)*3];
#endif
void render_parts(pixel *vid) void render_parts(pixel *vid)
{ {
//TODO: Replace cmode with a set of flags //TODO: Replace cmode with a set of flags
int deca, decr, decg, decb, colr, colg, colb, firea, firer, fireg, fireb, pixel_mode, i, t, nx, ny, x, y, caddress; int deca, decr, decg, decb, colr, colg, colb, firea, firer, fireg, fireb, pixel_mode, i, t, nx, ny, x, y, caddress;
#ifdef OGLR
int cv = 0, cc = 0, pc = 0;
#endif
float gradv, flicker; float gradv, flicker;
for(i = 0; i<=parts_lastActiveIndex; i++) { for(i = 0; i<=parts_lastActiveIndex; i++) {
if (parts[i].type) { if (parts[i].type) {
@ -1453,7 +1469,16 @@ void render_parts(pixel *vid)
if(cmode == CM_NOTHING) if(cmode == CM_NOTHING)
{ {
#ifdef OGLR
va[cv++] = nx;
va[cv++] = ny;
ca[cc++] = ((float)colr)/255.0f;
ca[cc++] = ((float)colg)/255.0f;
ca[cc++] = ((float)colb)/255.0f;
pc++;
#else
vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(colr,colg,colb); vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(colr,colg,colb);
#endif
} }
else else
{ {
@ -1672,6 +1697,22 @@ void render_parts(pixel *vid)
} }
} }
} }
#ifdef OGLR
glScalef(1,-1,1);
glTranslatef(0, -(YRES+MENUSIZE), 0);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(3, GL_FLOAT, 0, &ca[0]);
glVertexPointer(2, GL_INT, 0, &va[0]);
glDrawArrays(GL_POINTS, 0, pc);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glTranslatef(0, YRES+MENUSIZE, 0);
glScalef(1,-1,1);
#endif
} }
void draw_walls(pixel *vid) void draw_walls(pixel *vid)
@ -2681,6 +2722,31 @@ int sdl_open(void)
#if defined(OGLR) #if defined(OGLR)
sdl_scrn=SDL_SetVideoMode(XRES*sdl_scale + BARSIZE*sdl_scale,YRES*sdl_scale + MENUSIZE*sdl_scale,32,SDL_OPENGL); 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); 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)*sdl_scale);
glPixelZoom(sdl_scale, -sdl_scale);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
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);
#else #else
#ifdef PIX16 #ifdef PIX16
if (kiosk_enable) if (kiosk_enable)

View File

@ -1765,9 +1765,6 @@ int main(int argc, char *argv[])
if(aheat_enable) if(aheat_enable)
update_airh(); update_airh();
} }
#ifdef OpenGL
ClearScreen();
#else
if(ngrav_enable && cmode==CM_FANCY) if(ngrav_enable && cmode==CM_FANCY)
{ {
@ -1794,9 +1791,11 @@ int main(int argc, char *argv[])
} }
else //clear screen every frame else //clear screen every frame
{ {
#ifdef OGLR
clearScreen(1.0f);
#endif
memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE); memset(part_vbuf, 0, (XRES+BARSIZE)*YRES*PIXELSIZE);
} }
#endif
//Can't be too sure (Limit the cursor size) //Can't be too sure (Limit the cursor size)
if (bsx>1180) if (bsx>1180)