123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- /*
- Copyright (C) 1997-2001 Id Software, Inc.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- // draw.c
- #include "gl_local.h"
- image_t *draw_chars;
- extern qboolean scrap_dirty;
- void Scrap_Upload (void);
- /*
- ===============
- Draw_InitLocal
- ===============
- */
- void Draw_InitLocal (void)
- {
- // load console characters (don't bilerp characters)
- draw_chars = GL_FindImage ("pics/conchars.pcx", it_pic);
- GL_Bind( draw_chars->texnum );
- qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- }
- /*
- ================
- Draw_Char
- Draws one 8*8 graphics character with 0 being transparent.
- It can be clipped to the top of the screen to allow the console to be
- smoothly scrolled off.
- ================
- */
- void Draw_Char (int x, int y, int num)
- {
- int row, col;
- float frow, fcol, size;
- num &= 255;
-
- if ( (num&127) == 32 )
- return; // space
- if (y <= -8)
- return; // totally off screen
- row = num>>4;
- col = num&15;
- frow = row*0.0625;
- fcol = col*0.0625;
- size = 0.0625;
- GL_Bind (draw_chars->texnum);
- qglBegin (GL_QUADS);
- qglTexCoord2f (fcol, frow);
- qglVertex2f (x, y);
- qglTexCoord2f (fcol + size, frow);
- qglVertex2f (x+8, y);
- qglTexCoord2f (fcol + size, frow + size);
- qglVertex2f (x+8, y+8);
- qglTexCoord2f (fcol, frow + size);
- qglVertex2f (x, y+8);
- qglEnd ();
- }
- /*
- =============
- Draw_FindPic
- =============
- */
- image_t *Draw_FindPic (char *name)
- {
- image_t *gl;
- char fullname[MAX_QPATH];
- if (name[0] != '/' && name[0] != '\\')
- {
- Com_sprintf (fullname, sizeof(fullname), "pics/%s.pcx", name);
- gl = GL_FindImage (fullname, it_pic);
- }
- else
- gl = GL_FindImage (name+1, it_pic);
- return gl;
- }
- /*
- =============
- Draw_GetPicSize
- =============
- */
- void Draw_GetPicSize (int *w, int *h, char *pic)
- {
- image_t *gl;
- gl = Draw_FindPic (pic);
- if (!gl)
- {
- *w = *h = -1;
- return;
- }
- *w = gl->width;
- *h = gl->height;
- }
- /*
- =============
- Draw_StretchPic
- =============
- */
- void Draw_StretchPic (int x, int y, int w, int h, char *pic)
- {
- image_t *gl;
- gl = Draw_FindPic (pic);
- if (!gl)
- {
- ri.Con_Printf (PRINT_ALL, "Can't find pic: %s\n", pic);
- return;
- }
- if (scrap_dirty)
- Scrap_Upload ();
- if ( ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) ) && !gl->has_alpha)
- qglDisable (GL_ALPHA_TEST);
- GL_Bind (gl->texnum);
- qglBegin (GL_QUADS);
- qglTexCoord2f (gl->sl, gl->tl);
- qglVertex2f (x, y);
- qglTexCoord2f (gl->sh, gl->tl);
- qglVertex2f (x+w, y);
- qglTexCoord2f (gl->sh, gl->th);
- qglVertex2f (x+w, y+h);
- qglTexCoord2f (gl->sl, gl->th);
- qglVertex2f (x, y+h);
- qglEnd ();
- if ( ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) ) && !gl->has_alpha)
- qglEnable (GL_ALPHA_TEST);
- }
- /*
- =============
- Draw_Pic
- =============
- */
- void Draw_Pic (int x, int y, char *pic)
- {
- image_t *gl;
- gl = Draw_FindPic (pic);
- if (!gl)
- {
- ri.Con_Printf (PRINT_ALL, "Can't find pic: %s\n", pic);
- return;
- }
- if (scrap_dirty)
- Scrap_Upload ();
- if ( ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) ) && !gl->has_alpha)
- qglDisable (GL_ALPHA_TEST);
- GL_Bind (gl->texnum);
- qglBegin (GL_QUADS);
- qglTexCoord2f (gl->sl, gl->tl);
- qglVertex2f (x, y);
- qglTexCoord2f (gl->sh, gl->tl);
- qglVertex2f (x+gl->width, y);
- qglTexCoord2f (gl->sh, gl->th);
- qglVertex2f (x+gl->width, y+gl->height);
- qglTexCoord2f (gl->sl, gl->th);
- qglVertex2f (x, y+gl->height);
- qglEnd ();
- if ( ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) ) && !gl->has_alpha)
- qglEnable (GL_ALPHA_TEST);
- }
- /*
- =============
- Draw_TileClear
- This repeats a 64*64 tile graphic to fill the screen around a sized down
- refresh window.
- =============
- */
- void Draw_TileClear (int x, int y, int w, int h, char *pic)
- {
- image_t *image;
- image = Draw_FindPic (pic);
- if (!image)
- {
- ri.Con_Printf (PRINT_ALL, "Can't find pic: %s\n", pic);
- return;
- }
- if ( ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) ) && !image->has_alpha)
- qglDisable (GL_ALPHA_TEST);
- GL_Bind (image->texnum);
- qglBegin (GL_QUADS);
- qglTexCoord2f (x/64.0, y/64.0);
- qglVertex2f (x, y);
- qglTexCoord2f ( (x+w)/64.0, y/64.0);
- qglVertex2f (x+w, y);
- qglTexCoord2f ( (x+w)/64.0, (y+h)/64.0);
- qglVertex2f (x+w, y+h);
- qglTexCoord2f ( x/64.0, (y+h)/64.0 );
- qglVertex2f (x, y+h);
- qglEnd ();
- if ( ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) ) && !image->has_alpha)
- qglEnable (GL_ALPHA_TEST);
- }
- /*
- =============
- Draw_Fill
- Fills a box of pixels with a single color
- =============
- */
- void Draw_Fill (int x, int y, int w, int h, int c)
- {
- union
- {
- unsigned c;
- byte v[4];
- } color;
- if ( (unsigned)c > 255)
- ri.Sys_Error (ERR_FATAL, "Draw_Fill: bad color");
- qglDisable (GL_TEXTURE_2D);
- color.c = d_8to24table[c];
- qglColor3f (color.v[0]/255.0,
- color.v[1]/255.0,
- color.v[2]/255.0);
- qglBegin (GL_QUADS);
- qglVertex2f (x,y);
- qglVertex2f (x+w, y);
- qglVertex2f (x+w, y+h);
- qglVertex2f (x, y+h);
- qglEnd ();
- qglColor3f (1,1,1);
- qglEnable (GL_TEXTURE_2D);
- }
- //=============================================================================
- /*
- ================
- Draw_FadeScreen
- ================
- */
- void Draw_FadeScreen (void)
- {
- qglEnable (GL_BLEND);
- qglDisable (GL_TEXTURE_2D);
- qglColor4f (0, 0, 0, 0.8);
- qglBegin (GL_QUADS);
- qglVertex2f (0,0);
- qglVertex2f (vid.width, 0);
- qglVertex2f (vid.width, vid.height);
- qglVertex2f (0, vid.height);
- qglEnd ();
- qglColor4f (1,1,1,1);
- qglEnable (GL_TEXTURE_2D);
- qglDisable (GL_BLEND);
- }
- //====================================================================
- /*
- =============
- Draw_StretchRaw
- =============
- */
- extern unsigned r_rawpalette[256];
- void Draw_StretchRaw (int x, int y, int w, int h, int cols, int rows, byte *data)
- {
- unsigned image32[256*256];
- unsigned char image8[256*256];
- int i, j, trows;
- byte *source;
- int frac, fracstep;
- float hscale;
- int row;
- float t;
- GL_Bind (0);
- if (rows<=256)
- {
- hscale = 1;
- trows = rows;
- }
- else
- {
- hscale = rows/256.0;
- trows = 256;
- }
- t = rows*hscale / 256;
- if ( !qglColorTableEXT )
- {
- unsigned *dest;
- for (i=0 ; i<trows ; i++)
- {
- row = (int)(i*hscale);
- if (row > rows)
- break;
- source = data + cols*row;
- dest = &image32[i*256];
- fracstep = cols*0x10000/256;
- frac = fracstep >> 1;
- for (j=0 ; j<256 ; j++)
- {
- dest[j] = r_rawpalette[source[frac>>16]];
- frac += fracstep;
- }
- }
- qglTexImage2D (GL_TEXTURE_2D, 0, gl_tex_solid_format, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, image32);
- }
- else
- {
- unsigned char *dest;
- for (i=0 ; i<trows ; i++)
- {
- row = (int)(i*hscale);
- if (row > rows)
- break;
- source = data + cols*row;
- dest = &image8[i*256];
- fracstep = cols*0x10000/256;
- frac = fracstep >> 1;
- for (j=0 ; j<256 ; j++)
- {
- dest[j] = source[frac>>16];
- frac += fracstep;
- }
- }
- qglTexImage2D( GL_TEXTURE_2D,
- 0,
- GL_COLOR_INDEX8_EXT,
- 256, 256,
- 0,
- GL_COLOR_INDEX,
- GL_UNSIGNED_BYTE,
- image8 );
- }
- qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- if ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) )
- qglDisable (GL_ALPHA_TEST);
- qglBegin (GL_QUADS);
- qglTexCoord2f (0, 0);
- qglVertex2f (x, y);
- qglTexCoord2f (1, 0);
- qglVertex2f (x+w, y);
- qglTexCoord2f (1, t);
- qglVertex2f (x+w, y+h);
- qglTexCoord2f (0, t);
- qglVertex2f (x, y+h);
- qglEnd ();
- if ( ( gl_config.renderer == GL_RENDERER_MCD ) || ( gl_config.renderer & GL_RENDERER_RENDITION ) )
- qglEnable (GL_ALPHA_TEST);
- }
|