#include "quakedef.h"
-#define GL_COLOR_INDEX8_EXT 0x80E5
+//#define GL_COLOR_INDEX8_EXT 0x80E5
-extern unsigned char d_15to8table[65536];
-
-cvar_t qsg_version = {"qsg_version", "1"};
cvar_t scr_conalpha = {"scr_conalpha", "1"};
byte *draw_chars; // 8*8 graphic characters
qpic_t *draw_disc;
-//int translate_texture;
-int char_texture;
+rtexture_t *char_texture;
typedef struct
{
- int texnum;
- float sl, tl, sh, th;
+ rtexture_t *tex;
} glpic_t;
-byte conback_buffer[sizeof(qpic_t) + sizeof(glpic_t)];
-qpic_t *conback = (qpic_t *)&conback_buffer;
-
-/*
-=============================================================================
-
- scrap allocation
-
- Allocate all the little status bar obejcts into a single texture
- to crutch up stupid hardware / drivers
-
-=============================================================================
-*/
-
-#define MAX_SCRAPS 2
-#define BLOCK_WIDTH 256
-#define BLOCK_HEIGHT 256
-
-int scrap_allocated[MAX_SCRAPS][BLOCK_WIDTH];
-byte scrap_texels[MAX_SCRAPS][BLOCK_WIDTH*BLOCK_HEIGHT*4];
-qboolean scrap_dirty;
-
-// returns a texture number and the position inside it
-int Scrap_AllocBlock (int w, int h, int *x, int *y)
-{
- int i, j;
- int best, best2;
- int texnum;
-
- for (texnum=0 ; texnum<MAX_SCRAPS ; texnum++)
- {
- best = BLOCK_HEIGHT;
-
- for (i=0 ; i<BLOCK_WIDTH-w ; i++)
- {
- best2 = 0;
-
- for (j=0 ; j<w ; j++)
- {
- if (scrap_allocated[texnum][i+j] >= best)
- break;
- if (scrap_allocated[texnum][i+j] > best2)
- best2 = scrap_allocated[texnum][i+j];
- }
- if (j == w)
- { // this is a valid spot
- *x = i;
- *y = best = best2;
- }
- }
-
- if (best + h > BLOCK_HEIGHT)
- continue;
-
- for (i=0 ; i<w ; i++)
- scrap_allocated[texnum][*x + i] = best + h;
-
- return texnum;
- }
-
- Sys_Error ("Scrap_AllocBlock: full");
- return 0;
-}
-
-int scrap_uploads;
-int scraptexnum[MAX_SCRAPS];
-
-void Scrap_Upload (void)
-{
- int texnum;
-
- scrap_uploads++;
-
- for (texnum=0 ; texnum<MAX_SCRAPS ; texnum++)
- scraptexnum[texnum] = GL_LoadTexture (va("scrapslot%d", texnum), BLOCK_WIDTH, BLOCK_HEIGHT, scrap_texels[texnum], false, true, 1);
- scrap_dirty = false;
-}
+rtexture_t *conbacktex;
//=============================================================================
/* Support Routines */
int pic_texels;
int pic_count;
-int GL_LoadPicTexture (qpic_t *pic);
-
qpic_t *Draw_PicFromWad (char *name)
{
qpic_t *p;
p = W_GetLumpName (name);
gl = (glpic_t *)p->data;
- // load little ones into the scrap
- if (p->width < 64 && p->height < 64)
- {
- int x, y;
- int i, j, k;
- int texnum;
-
- texnum = Scrap_AllocBlock (p->width, p->height, &x, &y);
- scrap_dirty = true;
- k = 0;
- for (i=0 ; i<p->height ; i++)
- for (j=0 ; j<p->width ; j++, k++)
- scrap_texels[texnum][(y+i)*BLOCK_WIDTH + x + j] = p->data[k];
- if (!scraptexnum[texnum])
- scraptexnum[texnum] = GL_LoadTexture (va("scrapslot%d", texnum), BLOCK_WIDTH, BLOCK_HEIGHT, scrap_texels[texnum], false, true, 1);
- gl->texnum = scraptexnum[texnum];
- gl->sl = (x+0.01)/(float)BLOCK_WIDTH;
- gl->sh = (x+p->width-0.01)/(float)BLOCK_WIDTH;
- gl->tl = (y+0.01)/(float)BLOCK_WIDTH;
- gl->th = (y+p->height-0.01)/(float)BLOCK_WIDTH;
-
- pic_count++;
- pic_texels += p->width*p->height;
- }
- else
- {
- gl->texnum = GL_LoadPicTexture (p);
- gl->sl = 0;
- gl->sh = 1;
- gl->tl = 0;
- gl->th = 1;
- }
+ gl->tex = R_LoadTexture (name, p->width, p->height, p->data, TEXF_ALPHA | TEXF_PRECACHE);
return p;
}
//
// load the pic from disk
//
- dat = (qpic_t *)COM_LoadTempFile (path, false);
+ dat = (qpic_t *)COM_LoadMallocFile (path, false);
if (!dat)
Sys_Error ("Draw_CachePic: failed to load %s", path);
SwapPic (dat);
pic->pic.height = dat->height;
gl = (glpic_t *)pic->pic.data;
- gl->texnum = GL_LoadPicTexture (dat);
- gl->sl = 0;
- gl->sh = 1;
- gl->tl = 0;
- gl->th = 1;
+ gl->tex = loadtextureimage(path, 0, 0, false, false, true);
+ if (!gl->tex)
+ gl->tex = R_LoadTexture (path, dat->width, dat->height, dat->data, TEXF_ALPHA | TEXF_PRECACHE);
- return &pic->pic;
-}
-
-/*
-void Draw_CharToConback (int num, byte *dest)
-{
- int row, col;
- byte *source;
- int drawline;
- int x;
-
- row = num>>4;
- col = num&15;
- source = draw_chars + (row<<10) + (col<<3);
-
- drawline = 8;
-
- while (drawline--)
- {
- for (x=0 ; x<8 ; x++)
- if (source[x] != 255)
- dest[x] = 0x60 + source[x];
- source += 128;
- dest += 320;
- }
+ qfree(dat);
+ return &pic->pic;
}
-*/
-
-extern void LoadSky_f(void);
-
-extern char *QSG_EXTENSIONS;
/*
===============
Draw_Init
===============
*/
-void rmain_registercvars();
-extern int buildnumber;
-
-void gl_draw_start()
+void gl_draw_start(void)
{
int i;
- glpic_t *gl;
- // load the console background and the charset
- // by hand, because we need to write the version
- // string into the background before turning
- // it into a texture
- char_texture = loadtextureimage ("conchars", 0, 0, false, false);
+ char_texture = loadtextureimage ("conchars", 0, 0, false, false, true);
if (!char_texture)
{
draw_chars = W_GetLumpName ("conchars");
- for (i=0 ; i<256*64 ; i++)
+ for (i=0 ; i<128*128 ; i++)
if (draw_chars[i] == 0)
draw_chars[i] = 255; // proper transparent color
// now turn them into textures
- char_texture = GL_LoadTexture ("charset", 128, 128, draw_chars, false, true, 1);
+ char_texture = R_LoadTexture ("charset", 128, 128, draw_chars, TEXF_ALPHA | TEXF_PRECACHE);
}
- gl = (glpic_t *)conback->data;
- gl->texnum = loadtextureimage("gfx/conback", 0, 0, false, false);
- gl->sl = 0;
- gl->sh = 1;
- gl->tl = 0;
- gl->th = 1;
- conback->width = vid.width;
- conback->height = vid.height;
-
- memset(scraptexnum, 0, sizeof(scraptexnum));
+ conbacktex = loadtextureimage("gfx/conback", 0, 0, false, false, true);
// get the other pics we need
draw_disc = Draw_PicFromWad ("disc");
}
-void gl_draw_shutdown()
+void gl_draw_shutdown(void)
+{
+}
+
+void gl_draw_newmap(void)
{
}
char engineversion[40];
int engineversionx, engineversiony;
-extern void GL_Textures_Init();
+extern void R_Textures_Init();
void GL_Draw_Init (void)
{
int i;
- Cvar_RegisterVariable (&qsg_version);
Cvar_RegisterVariable (&scr_conalpha);
Cmd_AddCommand ("loadsky", &LoadSky_f);
-#ifdef NEHAHRA
-#if defined(__linux__)
- sprintf (engineversion, "DPNehahra Linux GL %.2f build %3i", (float) VERSION, buildnumber);
-#elif defined(WIN32)
- sprintf (engineversion, "DPNehahra Windows GL %.2f build %3i", (float) VERSION, buildnumber);
-#else
- sprintf (engineversion, "DPNehahra Unknown GL %.2f build %3i", (float) VERSION, buildnumber);
-#endif
-#else
#if defined(__linux__)
sprintf (engineversion, "DarkPlaces Linux GL %.2f build %3i", (float) VERSION, buildnumber);
#elif defined(WIN32)
sprintf (engineversion, "DarkPlaces Windows GL %.2f build %3i", (float) VERSION, buildnumber);
#else
sprintf (engineversion, "DarkPlaces Unknown GL %.2f build %3i", (float) VERSION, buildnumber);
-#endif
#endif
for (i = 0;i < 40 && engineversion[i];i++)
engineversion[i] += 0x80; // shift to orange
engineversionx = vid.width - strlen(engineversion) * 8 - 8;
engineversiony = vid.height - 8;
- GL_Textures_Init();
- R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown);
+ R_Textures_Init();
+ R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap);
}
/*
fcol = col*0.0625;
size = 0.0625;
- glBindTexture(GL_TEXTURE_2D, char_texture);
+ if (!r_render.value)
+ return;
+ glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture));
// LordHavoc: NEAREST mode on text if not scaling up
- if ((int) vid.width < glwidth)
+ if (glwidth <= (int) vid.width)
{
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
+ else
+ {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ }
- glColor3f(1,1,1);
+ if (lighthalf)
+ glColor3f(0.5f,0.5f,0.5f);
+ else
+ glColor3f(1.0f,1.0f,1.0f);
glBegin (GL_QUADS);
glTexCoord2f (fcol, frow);
glVertex2f (x, y);
glEnd ();
// LordHavoc: revert to LINEAR mode
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+// if (glwidth < (int) vid.width)
+// {
+// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+// }
}
/*
{
int num;
float frow, fcol;
+ if (!r_render.value)
+ return;
if (y <= -8 || y >= (int) vid.height || x >= (int) vid.width || *str == 0) // completely offscreen or no text to print
return;
if (maxlen < 1)
maxlen = strlen(str);
else if (maxlen > (int) strlen(str))
maxlen = strlen(str);
- glBindTexture(GL_TEXTURE_2D, char_texture);
+ glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture));
// LordHavoc: NEAREST mode on text if not scaling up
- if ((int) vid.width < glwidth)
+ if (glwidth <= (int) vid.width)
{
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
+ else
+ {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ }
- glColor3f(1,1,1);
+ if (lighthalf)
+ glColor3f(0.5f,0.5f,0.5f);
+ else
+ glColor3f(1.0f,1.0f,1.0f);
glBegin (GL_QUADS);
while (maxlen-- && x < (int) vid.width) // stop rendering when out of characters or room
{
{
frow = (float) ((int) num >> 4)*0.0625;
fcol = (float) ((int) num & 15)*0.0625;
- glTexCoord2f (fcol, frow);
- glVertex2f (x, y);
- glTexCoord2f (fcol + 0.0625, frow);
- glVertex2f (x+8, y);
- glTexCoord2f (fcol + 0.0625, frow + 0.0625);
- glVertex2f (x+8, y+8);
- glTexCoord2f (fcol, frow + 0.0625);
- glVertex2f (x, y+8);
+ glTexCoord2f (fcol , frow );glVertex2f (x, y);
+ glTexCoord2f (fcol + 0.0625, frow );glVertex2f (x+8, y);
+ glTexCoord2f (fcol + 0.0625, frow + 0.0625);glVertex2f (x+8, y+8);
+ glTexCoord2f (fcol , frow + 0.0625);glVertex2f (x, y+8);
}
x += 8;
}
glEnd ();
// LordHavoc: revert to LINEAR mode
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+// if (glwidth < (int) vid.width)
+// {
+// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+// }
}
-void Draw_GenericPic (int texnum, float red, float green, float blue, float alpha, float x, float y, float width, float height)
+void Draw_GenericPic (rtexture_t *tex, float red, float green, float blue, float alpha, int x, int y, int width, int height)
{
- glDisable(GL_ALPHA_TEST);
-// glEnable (GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-// glCullFace(GL_FRONT);
- glColor4f(red,green,blue,alpha);
- glBindTexture(GL_TEXTURE_2D, texnum);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ if (!r_render.value)
+ return;
+ if (lighthalf)
+ glColor4f(red * 0.5f, green * 0.5f, blue * 0.5f, alpha);
+ else
+ glColor4f(red, green, blue, alpha);
+ glBindTexture(GL_TEXTURE_2D, R_GetTexture(tex));
glBegin (GL_QUADS);
- glTexCoord2f (0, 0);
- glVertex2f (x, y);
- glTexCoord2f (1, 0);
- glVertex2f (x+width, y);
- glTexCoord2f (1, 1);
- glVertex2f (x+width, y+height);
- glTexCoord2f (0, 1);
- glVertex2f (x, y+height);
+ glTexCoord2f (0, 0);glVertex2f (x, y);
+ glTexCoord2f (1, 0);glVertex2f (x+width, y);
+ glTexCoord2f (1, 1);glVertex2f (x+width, y+height);
+ glTexCoord2f (0, 1);glVertex2f (x, y+height);
glEnd ();
- glColor3f(1,1,1);
-// glEnable(GL_ALPHA_TEST);
-// glDisable (GL_BLEND);
}
/*
*/
void Draw_AlphaPic (int x, int y, qpic_t *pic, float alpha)
{
- glpic_t *gl;
-
- if (scrap_dirty)
- Scrap_Upload ();
- gl = (glpic_t *)pic->data;
- glColor4f(1,1,1,alpha);
- glBindTexture(GL_TEXTURE_2D, gl->texnum);
- glBegin (GL_QUADS);
- glTexCoord2f (gl->sl, gl->tl);
- glVertex2f (x, y);
- glTexCoord2f (gl->sh, gl->tl);
- glVertex2f (x+pic->width, y);
- glTexCoord2f (gl->sh, gl->th);
- glVertex2f (x+pic->width, y+pic->height);
- glTexCoord2f (gl->sl, gl->th);
- glVertex2f (x, y+pic->height);
- glEnd ();
+ Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,alpha, x,y,pic->width, pic->height);
}
*/
void Draw_Pic (int x, int y, qpic_t *pic)
{
- glpic_t *gl;
-
- if (scrap_dirty)
- Scrap_Upload ();
- gl = (glpic_t *)pic->data;
- glColor3f(1,1,1);
- glBindTexture(GL_TEXTURE_2D, gl->texnum);
- glBegin (GL_QUADS);
- glTexCoord2f (gl->sl, gl->tl);
- glVertex2f (x, y);
- glTexCoord2f (gl->sh, gl->tl);
- glVertex2f (x+pic->width, y);
- glTexCoord2f (gl->sh, gl->th);
- glVertex2f (x+pic->width, y+pic->height);
- glTexCoord2f (gl->sl, gl->th);
- glVertex2f (x, y+pic->height);
- glEnd ();
+ Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,1, x,y,pic->width, pic->height);
}
{
int i, c;
byte *trans, *src, *dest;
+ rtexture_t *rt;
c = pic->width * pic->height;
src = menuplyr_pixels;
- dest = trans = malloc(c);
+ dest = trans = qmalloc(c);
for (i = 0;i < c;i++)
*dest++ = translation[*src++];
- glBindTexture(GL_TEXTURE_2D, GL_LoadTexture ("translatedplayerpic", pic->width, pic->height, trans, false, true, 1));
- free(trans);
+ rt = R_LoadTexture ("translatedplayerpic", pic->width, pic->height, trans, TEXF_ALPHA | TEXF_PRECACHE);
+ qfree(trans);
- glColor3f(1,1,1);
- glBegin (GL_QUADS);
- glTexCoord2f (0, 0);
- glVertex2f (x, y);
- glTexCoord2f (1, 0);
- glVertex2f (x+pic->width, y);
- glTexCoord2f (1, 1);
- glVertex2f (x+pic->width, y+pic->height);
- glTexCoord2f (0, 1);
- glVertex2f (x, y+pic->height);
- glEnd ();
+ if (!r_render.value)
+ return;
+ Draw_GenericPic (rt, 1,1,1,1, x, y, pic->width, pic->height);
}
*/
void Draw_ConsoleBackground (int lines)
{
- // LordHavoc: changed alpha
- //int y = (vid.height >> 1);
-
- if (lines >= (int) vid.height)
- Draw_Pic(0, lines - vid.height, conback);
- else
- Draw_AlphaPic (0, lines - vid.height, conback, scr_conalpha.value*lines/vid.height);
- // Draw_AlphaPic (0, lines - vid.height, conback, (float)(1.2 * lines)/y);
+ Draw_GenericPic (conbacktex, 1,1,1,scr_conalpha.value*lines/vid.height, 0, lines - vid.height, vid.width, vid.height);
// LordHavoc: draw version
Draw_String(engineversionx, lines - vid.height + engineversiony, engineversion, 9999);
}
*/
void Draw_Fill (int x, int y, int w, int h, int c)
{
+ if (!r_render.value)
+ return;
glDisable (GL_TEXTURE_2D);
- glColor3f (host_basepal[c*3]/255.0, host_basepal[c*3+1]/255.0, host_basepal[c*3+2]/255.0);
+ if (lighthalf)
+ {
+ byte *tempcolor = (byte *)&d_8to24table[c];
+ glColor4ub ((byte) (tempcolor[0] >> 1), (byte) (tempcolor[1] >> 1), (byte) (tempcolor[2] >> 1), tempcolor[3]);
+ }
+ else
+ glColor4ubv ((byte *)&d_8to24table[c]);
glBegin (GL_QUADS);
*/
void GL_Set2D (void)
{
+ if (!r_render.value)
+ return;
glViewport (glx, gly, glwidth, glheight);
glMatrixMode(GL_PROJECTION);
glDisable (GL_DEPTH_TEST);
glDisable (GL_CULL_FACE);
- glEnable (GL_BLEND); // was Disable
-// glEnable (GL_ALPHA_TEST);
+ glEnable (GL_BLEND);
glDisable (GL_ALPHA_TEST);
glEnable(GL_TEXTURE_2D);
showlmp_t showlmp[SHOWLMP_MAXLABELS];
-void SHOWLMP_decodehide()
+void SHOWLMP_decodehide(void)
{
int i;
byte *lmplabel;
}
}
-void SHOWLMP_decodeshow()
+void SHOWLMP_decodeshow(void)
{
int i, k;
byte lmplabel[256], picname[256];
float x, y;
strcpy(lmplabel,MSG_ReadString());
strcpy(picname, MSG_ReadString());
- x = MSG_ReadByte();
- y = MSG_ReadByte();
+ if (nehahra) // LordHavoc: nasty old legacy junk
+ {
+ x = MSG_ReadByte();
+ y = MSG_ReadByte();
+ }
+ else
+ {
+ x = MSG_ReadShort();
+ y = MSG_ReadShort();
+ }
k = -1;
for (i = 0;i < SHOWLMP_MAXLABELS;i++)
if (showlmp[i].isactive)
showlmp[k].y = y;
}
-void SHOWLMP_drawall()
+void SHOWLMP_drawall(void)
{
int i;
for (i = 0;i < SHOWLMP_MAXLABELS;i++)
Draw_Pic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic));
}
-void SHOWLMP_clear()
+void SHOWLMP_clear(void)
{
int i;
for (i = 0;i < SHOWLMP_MAXLABELS;i++)