#include "quakedef.h"
-#define GL_COLOR_INDEX8_EXT 0x80E5
+//#define GL_COLOR_INDEX8_EXT 0x80E5
cvar_t qsg_version = {"qsg_version", "1"};
cvar_t scr_conalpha = {"scr_conalpha", "1"};
typedef struct
{
int texnum;
- float sl, tl, sh, th;
} glpic_t;
int conbacktexnum;
-/*
-=============================================================================
-
- 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;
-}
-*/
-
//=============================================================================
/* Support Routines */
int pic_texels;
int pic_count;
-extern 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->texnum = GL_LoadTexture (name, p->width, p->height, p->data, false, true, 1);
return p;
}
gl = (glpic_t *)pic->pic.data;
gl->texnum = loadtextureimage(path, 0, 0, false, false);
if (!gl->texnum)
- gl->texnum = GL_LoadPicTexture (dat);
- gl->sl = 0;
- gl->sh = 1;
- gl->tl = 0;
- gl->th = 1;
+ gl->texnum = GL_LoadTexture (path, dat->width, dat->height, dat->data, false, true, 1);
qfree(dat);
===============
*/
void rmain_registercvars();
-extern int buildnumber;
void gl_draw_start()
{
conbacktexnum = loadtextureimage("gfx/conback", 0, 0, false, false);
-// memset(scraptexnum, 0, sizeof(scraptexnum));
-
// get the other pics we need
draw_disc = Draw_PicFromWad ("disc");
}
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);
+ }
}
/*
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, int x, int y, int width, int height)
*/
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;
- if (!r_render.value)
- return;
- 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)->texnum, 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;
- if (!r_render.value)
- return;
- 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)->texnum, 1,1,1,1, x,y,pic->width, pic->height);
}
if (!r_render.value)
return;
Draw_GenericPic (c, 1,1,1,1, x, y, pic->width, pic->height);
- /*
- glBindTexture(GL_TEXTURE_2D, c);
- 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 ();
- */
}
typedef struct
{
int texnum;
- int totaltexels;
+ int texeldatasize;
byte *texels[MAXMIPS];
unsigned short texelsize[MAXMIPS][2];
char identifier[64];
name = "<unnamed>";
while (name[c] && c < 28)
n[c++] = name[c];
- while (c < 28)
- n[c++] = ' ';
+ // no need to pad since the name was moved to last
+// while (c < 28)
+// n[c++] = ' ';
n[c] = 0;
- Con_Printf("%s %5i %04X %s %s\n", n, total, crc, mip ? "yes" : "no ", alpha ? "yes " : "no ");
+ Con_Printf("%5i %04X %s %s %s\n", total, crc, mip ? "yes" : "no ", alpha ? "yes " : "no ", n);
}
void GL_TextureStats_f(void)
{
int i, s = 0, sc = 0, t = 0;
gltexture_t *glt;
- Con_Printf("name kbytes crc mip alpha\n");
+ Con_Printf("kbytes crc mip alpha name\n");
for (i = 0, glt = gltextures;i < numgltextures;i++, glt++)
{
- GL_TextureStats_Print(glt->identifier, ((glt->totaltexels * 4) + 512) >> 10, glt->crc, glt->mipmap, glt->alpha);
- t += glt->totaltexels;
+ GL_TextureStats_Print(glt->identifier, (glt->texeldatasize + 512) >> 10, glt->crc, glt->mipmap, glt->alpha);
+ t += glt->texeldatasize;
if (glt->identifier[0] == '&')
{
sc++;
- s += glt->totaltexels;
+ s += glt->texeldatasize;
}
}
Con_Printf("%i textures, totalling %.3fMB, %i are (usually) unnecessary model skins totalling %.3fMB\n", numgltextures, t / 1048576.0, sc, s / 1048576.0);
gltexture_t *glt;
for (i = 0, glt = gltextures;i < numgltextures;i++, glt++)
{
- t += glt->totaltexels;
+ t += glt->texeldatasize;
if (glt->identifier[0] == '&')
{
sc++;
- s += glt->totaltexels;
+ s += glt->texeldatasize;
}
}
Con_Printf("%i textures, totalling %.3fMB, %i are (usually) unnecessary model skins totalling %.3fMB\n", numgltextures, t / 1048576.0, sc, s / 1048576.0);
}
-extern int buildnumber;
-
char engineversion[40];
void GL_UploadTexture (gltexture_t *glt);
void GL_AllocTexels(gltexture_t *glt, int width, int height, int mipmapped)
{
- int i, w, h, size, done;
+ int i, w, h, size;
if (glt->texels[0])
GL_FreeTexels(glt);
glt->texelsize[0][0] = width;
size = 0;
w = width;h = height;
i = 0;
- done = false;
- for (i = 0;i < MAXMIPS;i++)
+ while (i < MAXMIPS)
{
glt->texelsize[i][0] = w;
glt->texelsize[i][1] = h;
- glt->texels[i] = (void *)size;
+ glt->texels[i++] = (void *)size;
size += w*h*4;
if (w > 1)
{
else if (h > 1)
h >>= 1;
else
- {
- i++;
break;
- }
}
- glt->totaltexels = size;
+ glt->texeldatasize = size;
while (i < MAXMIPS)
glt->texels[i++] = NULL;
glt->texels[0] = qmalloc(size);
else
{
size = width*height*4;
- glt->totaltexels = size;
+ glt->texeldatasize = size;
glt->texels[0] = qmalloc(size);
for (i = 1;i < MAXMIPS;i++)
glt->texels[i] = NULL;
{
Con_DPrintf("GL_LoadTexture: cache mismatch, replacing old texture\n");
goto GL_LoadTexture_setup; // drop out with glt pointing to the texture to replace
- //Sys_Error ("GL_LoadTexture: cache mismatch");
}
if ((gl_lerpimages.value != 0) != glt->lerped)
goto GL_LoadTexture_setup; // drop out with glt pointing to the texture to replace
return glt->texnum;
}
-/*
-================
-GL_LoadPicTexture
-================
-*/
-int GL_LoadPicTexture (qpic_t *pic)
-{
- return GL_LoadTexture ("", pic->width, pic->height, pic->data, false, true, 1);
-}
-
int GL_GetTextureSlots (int count)
{
gltexture_t *glt, *first;
r = cl_dlights[k].radius*cl_dlights[k].radius*LIGHTSCALE;
if (f < r)
{
- brightness = r * 16.0f / f;
+ brightness = r * (256.0f / LIGHTSCALE2) / f;
color[0] += brightness * cl_dlights[k].color[0];
color[1] += brightness * cl_dlights[k].color[1];
color[2] += brightness * cl_dlights[k].color[2];
r = cl_dlights[i].radius*cl_dlights[i].radius*LIGHTSCALE;
if (f < r)
{
- brightness = r * 16.0f / f;
+ brightness = r * (256.0f / LIGHTSCALE2) / f;
if (cl_dlights[i].dark)
brightness = -brightness;
color[0] += brightness * cl_dlights[i].color[0];
nearlight[nearlights].color[0] = cl_dlights[i].color[0] * cl_dlights[i].radius * cl_dlights[i].radius * mod[0];
nearlight[nearlights].color[1] = cl_dlights[i].color[1] * cl_dlights[i].radius * cl_dlights[i].radius * mod[1];
nearlight[nearlights].color[2] = cl_dlights[i].color[2] * cl_dlights[i].radius * cl_dlights[i].radius * mod[2];
- t1 = (128.0f / LIGHTSCALE) / t2;
+ t1 = (128.0f / LIGHTSCALE2) / t2;
basecolor[0] += nearlight[nearlights].color[0] * t1;
basecolor[1] += nearlight[nearlights].color[1] * t1;
basecolor[2] += nearlight[nearlights].color[2] * t1;
dist[0] = cl_dlights[i].color[0] * cl_dlights[i].radius * cl_dlights[i].radius * mod[0];
dist[1] = cl_dlights[i].color[1] * cl_dlights[i].radius * cl_dlights[i].radius * mod[1];
dist[2] = cl_dlights[i].color[2] * cl_dlights[i].radius * cl_dlights[i].radius * mod[2];
- t1 = (192.0f / LIGHTSCALE) / t2;
+ t1 = (224.0f / LIGHTSCALE2) / t2;
basecolor[0] += dist[0] * t1;
basecolor[1] += dist[1] * t1;
basecolor[2] += dist[2] * t1;