palette remap per entity for sw
minor change to qclib for hexen2 git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1735 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
054663b990
commit
6dd7ddd353
|
@ -1627,12 +1627,13 @@ void CL_LinkPacketEntities (void)
|
||||||
if (state->colormap && (state->colormap <= MAX_CLIENTS)
|
if (state->colormap && (state->colormap <= MAX_CLIENTS)
|
||||||
&& (gl_nocolors.value == -1 || (ent->model/* && state->modelindex == cl_playerindex*/)))
|
&& (gl_nocolors.value == -1 || (ent->model/* && state->modelindex == cl_playerindex*/)))
|
||||||
{
|
{
|
||||||
ent->colormap = cl.players[state->colormap-1].translations;
|
// TODO: DP colormap/colormod extension?
|
||||||
|
ent->palremap = cl.players[state->colormap-1].palremap;
|
||||||
ent->scoreboard = &cl.players[state->colormap-1];
|
ent->scoreboard = &cl.players[state->colormap-1];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ent->colormap = vid.colormap;
|
ent->palremap = D_IdentityRemap();
|
||||||
ent->scoreboard = NULL;
|
ent->scoreboard = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2196,7 +2197,7 @@ void CL_LinkProjectiles (void)
|
||||||
ent->skinnum = 0;
|
ent->skinnum = 0;
|
||||||
ent->frame = 0;
|
ent->frame = 0;
|
||||||
ent->flags = 0;
|
ent->flags = 0;
|
||||||
ent->colormap = vid.colormap;
|
ent->palremap = D_IdentityRemap();
|
||||||
ent->scoreboard = NULL;
|
ent->scoreboard = NULL;
|
||||||
#ifdef PEXT_SCALE
|
#ifdef PEXT_SCALE
|
||||||
ent->scale = 1;
|
ent->scale = 1;
|
||||||
|
@ -2717,7 +2718,7 @@ void CL_LinkPlayers (void)
|
||||||
else
|
else
|
||||||
ent->lerpfrac = 0;
|
ent->lerpfrac = 0;
|
||||||
|
|
||||||
ent->colormap = info->translations;
|
ent->palremap = info->palremap;
|
||||||
if (state->modelindex == cl_playerindex)
|
if (state->modelindex == cl_playerindex)
|
||||||
ent->scoreboard = info; // use custom skin
|
ent->scoreboard = info; // use custom skin
|
||||||
else
|
else
|
||||||
|
|
|
@ -2230,7 +2230,7 @@ void CL_ParseStatic (int version)
|
||||||
// copy it to the current state
|
// copy it to the current state
|
||||||
ent->model = cl.model_precache[es.modelindex];
|
ent->model = cl.model_precache[es.modelindex];
|
||||||
ent->oldframe = ent->frame = es.frame;
|
ent->oldframe = ent->frame = es.frame;
|
||||||
ent->colormap = vid.colormap;
|
ent->palremap = D_IdentityRemap();
|
||||||
ent->skinnum = es.skinnum;
|
ent->skinnum = es.skinnum;
|
||||||
ent->drawflags = es.hexen2flags;
|
ent->drawflags = es.hexen2flags;
|
||||||
|
|
||||||
|
@ -2560,38 +2560,17 @@ void CL_NewTranslation (int slot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (top > 13 || top < 0)
|
||||||
|
top = 13;
|
||||||
|
if (bottom > 13 || bottom < 0)
|
||||||
|
bottom = 13;
|
||||||
|
|
||||||
if (player->_topcolor != top ||
|
if (player->_topcolor != top ||
|
||||||
player->_bottomcolor != bottom || !player->skin) {
|
player->_bottomcolor != bottom || !player->skin) {
|
||||||
player->_topcolor = top;
|
player->_topcolor = top;
|
||||||
player->_bottomcolor = bottom;
|
player->_bottomcolor = bottom;
|
||||||
|
D_DereferenceRemap(player->palremap);
|
||||||
dest = player->translations;
|
player->palremap = D_GetPaletteRemap(255, 255, 255, false, true, top, bottom);
|
||||||
source = vid.colormap;
|
|
||||||
memcpy (dest, vid.colormap, sizeof(player->translations));
|
|
||||||
// top = player->topcolor;
|
|
||||||
if (top > 13 || top < 0)
|
|
||||||
top = 13;
|
|
||||||
top *= 16;
|
|
||||||
// bottom = player->bottomcolor;
|
|
||||||
if (bottom > 13 || bottom < 0)
|
|
||||||
bottom = 13;
|
|
||||||
bottom *= 16;
|
|
||||||
|
|
||||||
for (i=0 ; i<VID_GRADES ; i++, dest += 256, source+=256)
|
|
||||||
{
|
|
||||||
if (top < 128) // the artists made some backwards ranges. sigh.
|
|
||||||
memcpy (dest + TOP_RANGE, source + top, 16);
|
|
||||||
else
|
|
||||||
for (j=0 ; j<16 ; j++)
|
|
||||||
dest[TOP_RANGE+j] = source[top+15-j];
|
|
||||||
|
|
||||||
if (bottom < 128)
|
|
||||||
memcpy (dest + BOTTOM_RANGE, source + bottom, 16);
|
|
||||||
else
|
|
||||||
for (j=0 ; j<16 ; j++)
|
|
||||||
dest[BOTTOM_RANGE+j] = source[bottom+15-j];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -2311,7 +2311,7 @@ entity_t *CL_NewTempEntity (void)
|
||||||
|
|
||||||
memset (ent, 0, sizeof(*ent));
|
memset (ent, 0, sizeof(*ent));
|
||||||
|
|
||||||
ent->colormap = vid.colormap;
|
ent->palremap = D_IdentityRemap();
|
||||||
#ifdef PEXT_SCALE
|
#ifdef PEXT_SCALE
|
||||||
ent->scale = 1;
|
ent->scale = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,7 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "particles.h"
|
#include "particles.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char name[16];
|
char name[16];
|
||||||
|
@ -152,8 +151,9 @@ typedef struct player_info_s
|
||||||
int _topcolor;
|
int _topcolor;
|
||||||
int _bottomcolor;
|
int _bottomcolor;
|
||||||
|
|
||||||
|
struct palremap_s *palremap;
|
||||||
|
|
||||||
int spectator;
|
int spectator;
|
||||||
qbyte translations[VID_GRADES*256];
|
|
||||||
skin_t *skin;
|
skin_t *skin;
|
||||||
|
|
||||||
struct model_s *model;
|
struct model_s *model;
|
||||||
|
|
|
@ -716,9 +716,9 @@ static qboolean CopyCSQCEdictToEntity(csqcedict_t *in, entity_t *out)
|
||||||
|
|
||||||
if (in->v->colormap > 0 && in->v->colormap <= MAX_CLIENTS)
|
if (in->v->colormap > 0 && in->v->colormap <= MAX_CLIENTS)
|
||||||
{
|
{
|
||||||
out->colormap = cl.players[(int)in->v->colormap-1].translations;
|
out->palremap = cl.players[(int)in->v->colormap-1].palremap;
|
||||||
out->scoreboard = &cl.players[(int)in->v->colormap-1];
|
out->scoreboard = &cl.players[(int)in->v->colormap-1];
|
||||||
}
|
} // TODO: DP COLORMAP extension?
|
||||||
|
|
||||||
if (!in->v->alpha)
|
if (!in->v->alpha)
|
||||||
out->alpha = 1;
|
out->alpha = 1;
|
||||||
|
|
|
@ -20,8 +20,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
// refresh.h -- public interface to refresh functions
|
// refresh.h -- public interface to refresh functions
|
||||||
|
|
||||||
#define TOP_RANGE 16 // soldier uniform colors
|
// default soldier colors
|
||||||
#define BOTTOM_RANGE 96
|
#define TOP_DEFAULT 1
|
||||||
|
#define BOTTOM_DEFAULT 6
|
||||||
|
|
||||||
|
#define TOP_RANGE (TOP_DEFAULT<<4)
|
||||||
|
#define BOTTOM_RANGE (BOTTOM_DEFAULT<<4)
|
||||||
|
|
||||||
struct msurface_s;
|
struct msurface_s;
|
||||||
|
|
||||||
|
@ -63,7 +67,7 @@ typedef struct entity_s
|
||||||
|
|
||||||
struct model_s *model; // NULL = no model
|
struct model_s *model; // NULL = no model
|
||||||
int frame;
|
int frame;
|
||||||
qbyte *colormap;
|
struct palremap_s *palremap;
|
||||||
int skinnum; // for Alias models
|
int skinnum; // for Alias models
|
||||||
|
|
||||||
struct player_info_s *scoreboard; // identify player
|
struct player_info_s *scoreboard; // identify player
|
||||||
|
@ -382,7 +386,8 @@ extern cvar_t gl_finish;
|
||||||
extern cvar_t gl_max_size;
|
extern cvar_t gl_max_size;
|
||||||
extern cvar_t gl_playermip;
|
extern cvar_t gl_playermip;
|
||||||
|
|
||||||
extern cvar_t r_palconvwrite;
|
extern cvar_t d_palconvwrite;
|
||||||
|
extern cvar_t d_palremapsize;
|
||||||
|
|
||||||
extern cvar_t r_lightmap_saturation;
|
extern cvar_t r_lightmap_saturation;
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,8 @@ cvar_t r_drawflat = {"r_drawflat","0", NULL, CVAR_SEMICHEAT};
|
||||||
cvar_t r_wallcolour = {"r_wallcolour","0 0 1"};
|
cvar_t r_wallcolour = {"r_wallcolour","0 0 1"};
|
||||||
cvar_t r_floorcolour = {"r_floorcolour","0.5 0.5 1"};
|
cvar_t r_floorcolour = {"r_floorcolour","0.5 0.5 1"};
|
||||||
|
|
||||||
cvar_t r_palconvwrite = {"r_palconvwrite", "1"};
|
cvar_t d_palconvwrite = {"d_palconvwrite", "1"};
|
||||||
|
cvar_t d_palremapsize = {"d_palremapsize", "64", NULL, CVAR_RENDERERLATCH};
|
||||||
|
|
||||||
cvar_t r_lightmap_saturation = {"r_lightmap_saturation", "1"};
|
cvar_t r_lightmap_saturation = {"r_lightmap_saturation", "1"};
|
||||||
|
|
||||||
|
@ -388,7 +389,8 @@ void SWRenderer_Init(void)
|
||||||
Cvar_Register (&r_ambient, SWRENDEREROPTIONS);
|
Cvar_Register (&r_ambient, SWRENDEREROPTIONS);
|
||||||
Cvar_Register (&r_reportsurfout, SWRENDEREROPTIONS);
|
Cvar_Register (&r_reportsurfout, SWRENDEREROPTIONS);
|
||||||
|
|
||||||
Cvar_Register (&r_palconvwrite, SWRENDEREROPTIONS);
|
Cvar_Register (&d_palconvwrite, SWRENDEREROPTIONS);
|
||||||
|
Cvar_Register (&d_palremapsize, SWRENDEREROPTIONS);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1659,7 +1661,7 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n"));
|
||||||
for (i = 0; i < cl.num_statics; i++) //make the static entities reappear.
|
for (i = 0; i < cl.num_statics; i++) //make the static entities reappear.
|
||||||
{
|
{
|
||||||
cl_static_entities[i].model = cl.model_precache[staticmodelindex[i]];
|
cl_static_entities[i].model = cl.model_precache[staticmodelindex[i]];
|
||||||
cl_static_entities[i].colormap = vid.colormap;
|
cl_static_entities[i].palremap = D_IdentityRemap();
|
||||||
if (staticmodelindex[i]) //make sure it's worthwhile.
|
if (staticmodelindex[i]) //make sure it's worthwhile.
|
||||||
{
|
{
|
||||||
R_AddEfrags(&cl_static_entities[i]);
|
R_AddEfrags(&cl_static_entities[i]);
|
||||||
|
|
|
@ -1184,7 +1184,7 @@ void V_CalcRefdef (int pnum)
|
||||||
else
|
else
|
||||||
view->model = cl.model_precache[cl.stats[pnum][STAT_WEAPON]];
|
view->model = cl.model_precache[cl.stats[pnum][STAT_WEAPON]];
|
||||||
view->frame = view_message?view_message->weaponframe:0;
|
view->frame = view_message?view_message->weaponframe:0;
|
||||||
view->colormap = vid.colormap;
|
view->palremap = D_IdentityRemap();
|
||||||
|
|
||||||
// set up the refresh position
|
// set up the refresh position
|
||||||
r_refdef.viewangles[PITCH] += cl.punchangle[pnum];
|
r_refdef.viewangles[PITCH] += cl.punchangle[pnum];
|
||||||
|
|
|
@ -167,6 +167,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
.extern C(r_affinetridesc)
|
.extern C(r_affinetridesc)
|
||||||
.extern C(acolormap)
|
.extern C(acolormap)
|
||||||
.extern C(d_pcolormap)
|
.extern C(d_pcolormap)
|
||||||
|
.extern C(apalremap)
|
||||||
.extern C(r_affinetridesc)
|
.extern C(r_affinetridesc)
|
||||||
.extern C(d_sfrac)
|
.extern C(d_sfrac)
|
||||||
.extern C(d_ptex)
|
.extern C(d_ptex)
|
||||||
|
|
|
@ -790,8 +790,8 @@ extern int r_pixbytes;
|
||||||
#define WARP_WIDTH 320
|
#define WARP_WIDTH 320
|
||||||
#define WARP_HEIGHT 200
|
#define WARP_HEIGHT 200
|
||||||
|
|
||||||
extern cvar_t r_palconvbits;
|
extern cvar_t d_palconvwrite;
|
||||||
extern cvar_t r_palconvwrite;
|
extern cvar_t d_palremapsize;
|
||||||
|
|
||||||
extern cvar_t r_drawflat;
|
extern cvar_t r_drawflat;
|
||||||
extern int d_spanpixcount;
|
extern int d_spanpixcount;
|
||||||
|
|
|
@ -2098,9 +2098,12 @@ char *SaveEnt (progfuncs_t *progfuncs, char *buf, int *size, struct edict_s *ed)
|
||||||
|
|
||||||
for (i=0 ; i<numfields ; i++)
|
for (i=0 ; i<numfields ; i++)
|
||||||
{
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
d = &field[i];
|
d = &field[i];
|
||||||
name = d->name;
|
name = d->name;
|
||||||
if (name[strlen(name)-2] == '_')
|
len = strlen(name); // should we skip vars with no name?
|
||||||
|
if (len > 2 && name[len-2] == '_')
|
||||||
continue; // skip _x, _y, _z vars
|
continue; // skip _x, _y, _z vars
|
||||||
|
|
||||||
v = (int*)((edictrun_t*)ed)->fields + d->ofs;
|
v = (int*)((edictrun_t*)ed)->fields + d->ofs;
|
||||||
|
|
|
@ -132,7 +132,7 @@ extern int d_con_indirect; // if 0, Quake will draw console directly
|
||||||
extern vec3_t r_pright, r_pup, r_ppn;
|
extern vec3_t r_pright, r_pup, r_ppn;
|
||||||
|
|
||||||
|
|
||||||
void D_Aff8Patch (void *pcolormap);
|
void D_Aff8Patch (void *pcolormap, qbyte *ppalremap);
|
||||||
void GLD_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height);
|
void GLD_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height);
|
||||||
void SWD_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height);
|
void SWD_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height);
|
||||||
void D_DisableBackBufferAccess (void);
|
void D_DisableBackBufferAccess (void);
|
||||||
|
@ -180,6 +180,7 @@ extern qbyte *r_skysource;
|
||||||
#define TRANSPARENT_COLOR 0xFF
|
#define TRANSPARENT_COLOR 0xFF
|
||||||
|
|
||||||
extern void *acolormap; // FIXME: should go away
|
extern void *acolormap; // FIXME: should go away
|
||||||
|
extern qbyte *apalremap;
|
||||||
|
|
||||||
//=======================================================================//
|
//=======================================================================//
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,10 @@ void D_DrawSpans32 (espan_t *pspan);
|
||||||
void D_DrawSpans32From8 (espan_t *pspan);
|
void D_DrawSpans32From8 (espan_t *pspan);
|
||||||
void D_DrawSpans32_Smooth (espan_t *pspan);
|
void D_DrawSpans32_Smooth (espan_t *pspan);
|
||||||
|
|
||||||
|
void D_Shutdown (void)
|
||||||
|
{
|
||||||
|
D_ShutdownTrans();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===============
|
===============
|
||||||
|
|
|
@ -125,12 +125,37 @@ extern void (*d_drawspans) (espan_t *pspan);
|
||||||
#define TRANS_UPPER_CAP (TRANS_MAX / (TRANS_LEVELS + 0.0))
|
#define TRANS_UPPER_CAP (TRANS_MAX / (TRANS_LEVELS + 0.0))
|
||||||
#define TRANS_LOWER_CAP (1.0 / TRANS_LEVELS)
|
#define TRANS_LOWER_CAP (1.0 / TRANS_LEVELS)
|
||||||
|
|
||||||
|
#define REMAP_MAX 64
|
||||||
|
|
||||||
#ifdef _fastcall
|
#ifdef _fastcall
|
||||||
#define FASTCALL _fastcall
|
#define FASTCALL _fastcall
|
||||||
#else
|
#else
|
||||||
#define FASTCALL
|
#define FASTCALL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// palette remap cache
|
||||||
|
typedef struct palremap_s {
|
||||||
|
int r;
|
||||||
|
int g;
|
||||||
|
int b;
|
||||||
|
int key;
|
||||||
|
int references;
|
||||||
|
qbyte pal[256];
|
||||||
|
} palremap_t;
|
||||||
|
|
||||||
|
palremap_t *palremaps;
|
||||||
|
int palremapsize;
|
||||||
|
|
||||||
|
#define fbremapidx(x) palremaps[1].pal[x]
|
||||||
|
|
||||||
|
#define identityremap palremaps[0]
|
||||||
|
#define fullbrightremap palremaps[1]
|
||||||
|
|
||||||
|
palremap_t *D_GetPaletteRemap(int red, int green, int blue, qboolean desaturate, qboolean fullbrights, int topcolor, int bottomcolor);
|
||||||
|
qbyte *D_GetMenuTintPal(void);
|
||||||
|
extern palremap_t *D_IdentityRemap(void);
|
||||||
|
extern void D_DereferenceRemap(palremap_t *palremap);
|
||||||
|
|
||||||
void D_InitTrans(void);
|
void D_InitTrans(void);
|
||||||
// void Set_TransLevelI(int level);
|
// void Set_TransLevelI(int level);
|
||||||
void D_SetTransLevel(float level, blendmode_t blend);
|
void D_SetTransLevel(float level, blendmode_t blend);
|
||||||
|
|
|
@ -17,6 +17,7 @@ along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//
|
//
|
||||||
// d_polysa.s
|
// d_polysa.s
|
||||||
// x86 assembly-language polygon model drawing code
|
// x86 assembly-language polygon model drawing code
|
||||||
|
@ -683,7 +684,7 @@ LDraw:
|
||||||
// *zbuf = z;
|
// *zbuf = z;
|
||||||
movw %dx,(%eax,%ebp,2)
|
movw %dx,(%eax,%ebp,2)
|
||||||
|
|
||||||
// pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
|
// pix = d_pcolormap[apalremap[skintable[new[3]>>16][new[2]>>16]]];
|
||||||
movl 12(%esp),%eax
|
movl 12(%esp),%eax
|
||||||
|
|
||||||
sarl $16,%eax
|
sarl $16,%eax
|
||||||
|
@ -696,6 +697,8 @@ LDraw:
|
||||||
movl 4(%esp),%ebp
|
movl 4(%esp),%ebp
|
||||||
|
|
||||||
movb (%eax,%edx,),%cl
|
movb (%eax,%edx,),%cl
|
||||||
|
|
||||||
|
movb C(apalremap)(%ecx),%cl
|
||||||
movl C(d_pcolormap),%edx
|
movl C(d_pcolormap),%edx
|
||||||
|
|
||||||
movb (%edx,%ecx,),%dl
|
movb (%edx,%ecx,),%dl
|
||||||
|
@ -871,8 +874,10 @@ LDraw8:
|
||||||
cmpw (%ecx),%bp
|
cmpw (%ecx),%bp
|
||||||
jl Lp1
|
jl Lp1
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch8:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,(%ecx)
|
movw %bp,(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch8:
|
LPatch8:
|
||||||
|
@ -889,8 +894,10 @@ LDraw7:
|
||||||
cmpw 2(%ecx),%bp
|
cmpw 2(%ecx),%bp
|
||||||
jl Lp2
|
jl Lp2
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch7:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,2(%ecx)
|
movw %bp,2(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch7:
|
LPatch7:
|
||||||
|
@ -907,8 +914,10 @@ LDraw6:
|
||||||
cmpw 4(%ecx),%bp
|
cmpw 4(%ecx),%bp
|
||||||
jl Lp3
|
jl Lp3
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch6:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,4(%ecx)
|
movw %bp,4(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch6:
|
LPatch6:
|
||||||
|
@ -925,8 +934,10 @@ LDraw5:
|
||||||
cmpw 6(%ecx),%bp
|
cmpw 6(%ecx),%bp
|
||||||
jl Lp4
|
jl Lp4
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch5:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,6(%ecx)
|
movw %bp,6(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch5:
|
LPatch5:
|
||||||
|
@ -943,8 +954,10 @@ LDraw4:
|
||||||
cmpw 8(%ecx),%bp
|
cmpw 8(%ecx),%bp
|
||||||
jl Lp5
|
jl Lp5
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch4:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,8(%ecx)
|
movw %bp,8(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch4:
|
LPatch4:
|
||||||
|
@ -961,8 +974,10 @@ LDraw3:
|
||||||
cmpw 10(%ecx),%bp
|
cmpw 10(%ecx),%bp
|
||||||
jl Lp6
|
jl Lp6
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch3:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,10(%ecx)
|
movw %bp,10(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch3:
|
LPatch3:
|
||||||
|
@ -979,8 +994,10 @@ LDraw2:
|
||||||
cmpw 12(%ecx),%bp
|
cmpw 12(%ecx),%bp
|
||||||
jl Lp7
|
jl Lp7
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch2:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,12(%ecx)
|
movw %bp,12(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch2:
|
LPatch2:
|
||||||
|
@ -997,8 +1014,10 @@ LDraw1:
|
||||||
cmpw 14(%ecx),%bp
|
cmpw 14(%ecx),%bp
|
||||||
jl Lp8
|
jl Lp8
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
movb %dh,%ah
|
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch1:
|
||||||
|
movb %dh,%ah
|
||||||
movw %bp,14(%ecx)
|
movw %bp,14(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch1:
|
LPatch1:
|
||||||
|
@ -1045,10 +1064,12 @@ LExactlyOneLong:
|
||||||
cmpw (%ecx),%bp
|
cmpw (%ecx),%bp
|
||||||
jl LNextSpan
|
jl LNextSpan
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
|
movb (%ebx),%al
|
||||||
|
movb 0x12345678(%eax),%al
|
||||||
|
PPatch9:
|
||||||
movl spanpackage_t_pdest(%esi),%edi
|
movl spanpackage_t_pdest(%esi),%edi
|
||||||
movb spanpackage_t_light+1(%esi),%ah
|
movb spanpackage_t_light+1(%esi),%ah
|
||||||
addl $(spanpackage_t_size),%esi // point to next span
|
addl $(spanpackage_t_size),%esi // point to next span
|
||||||
movb (%ebx),%al
|
|
||||||
movw %bp,(%ecx)
|
movw %bp,(%ecx)
|
||||||
movb 0x12345678(%eax),%al
|
movb 0x12345678(%eax),%al
|
||||||
LPatch9:
|
LPatch9:
|
||||||
|
@ -1061,6 +1082,7 @@ C(D_PolysetAff8End):
|
||||||
|
|
||||||
|
|
||||||
#define pcolormap 4
|
#define pcolormap 4
|
||||||
|
#define ppalremap 8
|
||||||
|
|
||||||
.globl C(D_Aff8Patch)
|
.globl C(D_Aff8Patch)
|
||||||
C(D_Aff8Patch):
|
C(D_Aff8Patch):
|
||||||
|
@ -1074,6 +1096,16 @@ C(D_Aff8Patch):
|
||||||
movl %eax,LPatch7-4
|
movl %eax,LPatch7-4
|
||||||
movl %eax,LPatch8-4
|
movl %eax,LPatch8-4
|
||||||
movl %eax,LPatch9-4
|
movl %eax,LPatch9-4
|
||||||
|
movl ppalremap(%esp),%eax
|
||||||
|
movl %eax,PPatch1-4
|
||||||
|
movl %eax,PPatch2-4
|
||||||
|
movl %eax,PPatch3-4
|
||||||
|
movl %eax,PPatch4-4
|
||||||
|
movl %eax,PPatch5-4
|
||||||
|
movl %eax,PPatch6-4
|
||||||
|
movl %eax,PPatch7-4
|
||||||
|
movl %eax,PPatch8-4
|
||||||
|
movl %eax,PPatch9-4
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -1529,10 +1561,13 @@ LFVLoop:
|
||||||
shrl $16,%edx
|
shrl $16,%edx
|
||||||
movb (%edi,%edx),%dl
|
movb (%edi,%edx),%dl
|
||||||
|
|
||||||
|
// pix = apalremap[pix];
|
||||||
|
andl $0x00FF,%edx
|
||||||
|
movb C(apalremap)(%edx), %dl
|
||||||
|
|
||||||
// pix = ((byte *)acolormap)[pix + (fv->v[4] & 0xFF00)];
|
// pix = ((byte *)acolormap)[pix + (fv->v[4] & 0xFF00)];
|
||||||
movl fv_v+16(%ebx),%edi
|
movl fv_v+16(%ebx),%edi
|
||||||
andl $0xFF00,%edi
|
andl $0xFF00,%edi
|
||||||
andl $0x00FF,%edx
|
|
||||||
addl %edx,%edi
|
addl %edx,%edi
|
||||||
movl C(acolormap),%edx
|
movl C(acolormap),%edx
|
||||||
movb (%edx,%edi,1),%dl
|
movb (%edx,%edi,1),%dl
|
||||||
|
|
|
@ -180,7 +180,7 @@ void D_PolysetDrawFinalVertsTrans (finalvert_t *fv, int numverts)
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
|
pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
|
||||||
pix = ((qbyte *)acolormap)[pix + (fv->v[4] & 0xFF00) ];
|
pix = ((qbyte *)acolormap)[apalremap[pix] + (fv->v[4] & 0xFF00) ];
|
||||||
d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = Trans(d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]], (unsigned char)pix);
|
d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = Trans(d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]], (unsigned char)pix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -316,7 +316,7 @@ split:
|
||||||
int pix;
|
int pix;
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
|
pix = d_pcolormap[apalremap[skintable[new[3]>>16][new[2]>>16]]];
|
||||||
d_viewbuffer[d_scantable[new[1]] + new[0]] = Trans(d_viewbuffer[d_scantable[new[1]] + new[0]], (unsigned char)pix);
|
d_viewbuffer[d_scantable[new[1]] + new[0]] = Trans(d_viewbuffer[d_scantable[new[1]] + new[0]], (unsigned char)pix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,7 +477,7 @@ split:
|
||||||
int pix;
|
int pix;
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
|
pix = d_pcolormap[apalremap[skintable[new[3]>>16][new[2]>>16]]];
|
||||||
((unsigned short *)d_viewbuffer)[d_scantable[new[1]] + new[0]] = pix;//d_8to32table[pix];
|
((unsigned short *)d_viewbuffer)[d_scantable[new[1]] + new[0]] = pix;//d_8to32table[pix];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,7 +529,7 @@ void D_PolysetDrawSpans8Trans (spanpackage_t *pspanpackage)
|
||||||
{
|
{
|
||||||
if ((lzi >> 16) >= *lpz)
|
if ((lzi >> 16) >= *lpz)
|
||||||
{
|
{
|
||||||
*lpdest = Trans(*lpdest, ((qbyte *)acolormap)[*lptex + (llight & 0xFF00)]);
|
*lpdest = Trans(*lpdest, ((qbyte *)acolormap)[apalremap[*lptex] + (llight & 0xFF00)]);
|
||||||
// gel mapping *lpdest = gelmap[*lpdest];
|
// gel mapping *lpdest = gelmap[*lpdest];
|
||||||
*lpz = lzi >> 16;
|
*lpz = lzi >> 16;
|
||||||
}
|
}
|
||||||
|
@ -745,7 +745,7 @@ void D_PolysetDrawSpans16 (spanpackage_t *pspanpackage)
|
||||||
{
|
{
|
||||||
// ((qbyte *)acolormap)[*lptex + (llight & 0xFF00)];
|
// ((qbyte *)acolormap)[*lptex + (llight & 0xFF00)];
|
||||||
lptex = (qbyte *)((unsigned char *)r_affinetridesc.pskin+tex);
|
lptex = (qbyte *)((unsigned char *)r_affinetridesc.pskin+tex);
|
||||||
lpdest[0] = ((unsigned short *)acolormap)[*lptex + (llight & 0xFF00)];
|
lpdest[0] = ((unsigned short *)acolormap)[apalremap[*lptex] + (llight & 0xFF00)];
|
||||||
*lpz = lzi >> 16;
|
*lpz = lzi >> 16;
|
||||||
}
|
}
|
||||||
lpdest++;
|
lpdest++;
|
||||||
|
@ -1123,7 +1123,7 @@ void D_PolysetDrawFinalVertsC (finalvert_t *fv, int numverts)
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
|
pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
|
||||||
pix = ((qbyte *)acolormap)[pix + (fv->v[4] & 0xFF00) ];
|
pix = ((qbyte *)acolormap)[apalremap[pix] + (fv->v[4] & 0xFF00) ];
|
||||||
d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = pix;
|
d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = pix;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1207,7 +1207,7 @@ void D_DrawSubdivC (void)
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = skintable[index0->v[3]>>16][index0->v[2]>>16];
|
pix = skintable[index0->v[3]>>16][index0->v[2]>>16];
|
||||||
pix = ((qbyte *)acolormap)[pix + (index0->v[4] & 0xFF00) ];
|
pix = ((qbyte *)acolormap)[apalremap[pix] + (index0->v[4] & 0xFF00) ];
|
||||||
d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]] = pix;//Trans(d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]], pix);
|
d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]] = pix;//Trans(d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]], pix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1222,7 +1222,7 @@ void D_DrawSubdivC (void)
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = skintable[index1->v[3]>>16][index1->v[2]>>16];
|
pix = skintable[index1->v[3]>>16][index1->v[2]>>16];
|
||||||
pix = ((qbyte *)acolormap)[pix + (index0->v[4] & 0xFF00) ];
|
pix = ((qbyte *)acolormap)[apalremap[pix] + (index0->v[4] & 0xFF00) ];
|
||||||
d_viewbuffer[d_scantable[index1->v[1]] + index1->v[0]] = pix;//Trans(d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]], pix);
|
d_viewbuffer[d_scantable[index1->v[1]] + index1->v[0]] = pix;//Trans(d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]], pix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1237,7 +1237,7 @@ void D_DrawSubdivC (void)
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = skintable[index2->v[3]>>16][index2->v[2]>>16];
|
pix = skintable[index2->v[3]>>16][index2->v[2]>>16];
|
||||||
pix = ((qbyte *)acolormap)[pix + (index0->v[4] & 0xFF00) ];
|
pix = ((qbyte *)acolormap)[apalremap[pix] + (index0->v[4] & 0xFF00) ];
|
||||||
d_viewbuffer[d_scantable[index2->v[1]] + index2->v[0]] = pix;//Trans(d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]], pix);
|
d_viewbuffer[d_scantable[index2->v[1]] + index2->v[0]] = pix;//Trans(d_viewbuffer[d_scantable[index0->v[1]] + index0->v[0]], pix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1442,7 +1442,7 @@ split:
|
||||||
int pix;
|
int pix;
|
||||||
|
|
||||||
*zbuf = z;
|
*zbuf = z;
|
||||||
pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
|
pix = d_pcolormap[apalremap[skintable[new[3]>>16][new[2]>>16]]];
|
||||||
d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
|
d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1756,7 +1756,7 @@ void D_PolysetDrawSpans8C (spanpackage_t *pspanpackage)
|
||||||
{
|
{
|
||||||
if ((lzi >> 16) >= *lpz)
|
if ((lzi >> 16) >= *lpz)
|
||||||
{
|
{
|
||||||
*lpdest = ((qbyte *)acolormap)[*lptex + (llight & 0xFF00)];
|
*lpdest = ((qbyte *)acolormap)[apalremap[*lptex] + (llight & 0xFF00)];
|
||||||
// gel mapping *lpdest = gelmap[*lpdest];
|
// gel mapping *lpdest = gelmap[*lpdest];
|
||||||
*lpz = lzi >> 16;
|
*lpz = lzi >> 16;
|
||||||
}
|
}
|
||||||
|
@ -2557,7 +2557,7 @@ split:
|
||||||
int pix;
|
int pix;
|
||||||
|
|
||||||
d_pzbuffer[ofs] = new[5];
|
d_pzbuffer[ofs] = new[5];
|
||||||
pix = skintable[new[3]>>16][new[2]>>16];
|
pix = apalremap[skintable[new[3]>>16][new[2]>>16]];
|
||||||
// pix = ((qbyte *)acolormap)[pix + (new[4] & 0xFF00)];
|
// pix = ((qbyte *)acolormap)[pix + (new[4] & 0xFF00)];
|
||||||
d_viewbuffer[ofs] = pix;
|
d_viewbuffer[ofs] = pix;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1375,7 +1375,7 @@ void D_DrawSpans8 (espan_t *pspan)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
*((unsigned int *)pdest)++ = *((pbase + (s >> 16) + (t >> 16) * cachewidth))* 0x01010101;
|
*((unsigned int *)pdest)++ = *((pbase + (s >> 16) + (t >> 16) * cachewidth)) * 0x01010101;
|
||||||
s += sstep<<2;
|
s += sstep<<2;
|
||||||
t += tstep<<2;
|
t += tstep<<2;
|
||||||
} while((spancount-=4) > 3);
|
} while((spancount-=4) > 3);
|
||||||
|
|
|
@ -7,32 +7,55 @@
|
||||||
|
|
||||||
void MakeVideoPalette(void);
|
void MakeVideoPalette(void);
|
||||||
void MakeSwizzledPalette(void);
|
void MakeSwizzledPalette(void);
|
||||||
void MakeFullbrightRemap(void);
|
void MakePaletteRemaps(void);
|
||||||
|
|
||||||
int *srctable;
|
int *srctable;
|
||||||
int *dsttable;
|
int *dsttable;
|
||||||
qbyte *pal555to8;
|
qbyte *pal555to8;
|
||||||
|
|
||||||
int swzpal[TRANS_LEVELS][256];
|
int swzpal[TRANS_LEVELS][256];
|
||||||
qbyte nofbremap[256];
|
|
||||||
|
// menutint
|
||||||
|
palremap_t *RebuildMenuTint(void);
|
||||||
|
palremap_t *mtpalremap;
|
||||||
|
|
||||||
|
extern cvar_t r_menutint;
|
||||||
|
int mtmodified;
|
||||||
|
|
||||||
#define palette host_basepal
|
#define palette host_basepal
|
||||||
#define _abs(x) ((x)*(x))
|
#define _abs(x) ((x)*(x))
|
||||||
|
|
||||||
|
void D_ShutdownTrans(void)
|
||||||
|
{
|
||||||
|
if (pal555to8)
|
||||||
|
{
|
||||||
|
BZ_Free(pal555to8);
|
||||||
|
pal555to8 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (palremaps)
|
||||||
|
{
|
||||||
|
BZ_Free(palremaps);
|
||||||
|
palremapsize = 0;
|
||||||
|
palremaps = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mtpalremap = NULL;
|
||||||
|
mtmodified = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void D_InitTrans(void)
|
void D_InitTrans(void)
|
||||||
{
|
{
|
||||||
// create pal555to8 and swizzled palette
|
// create pal555to8 and swizzled palette
|
||||||
MakeVideoPalette();
|
MakeVideoPalette();
|
||||||
MakeSwizzledPalette();
|
MakeSwizzledPalette();
|
||||||
MakeFullbrightRemap();
|
MakePaletteRemaps();
|
||||||
|
|
||||||
srctable = swzpal[0];
|
srctable = swzpal[0];
|
||||||
dsttable = swzpal[TRANS_MAX];
|
dsttable = swzpal[TRANS_MAX];
|
||||||
|
mtpalremap = RebuildMenuTint();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define Trans(p, p2) (t_curlookupp[p][p2])
|
|
||||||
#else
|
|
||||||
// TODO: INLINE THESE FUNCTIONS
|
// TODO: INLINE THESE FUNCTIONS
|
||||||
qbyte FASTCALL Trans(qbyte p, qbyte p2)
|
qbyte FASTCALL Trans(qbyte p, qbyte p2)
|
||||||
{
|
{
|
||||||
|
@ -42,7 +65,6 @@ qbyte FASTCALL Trans(qbyte p, qbyte p2)
|
||||||
return pal555to8[x & (x >> 15)];
|
return pal555to8[x & (x >> 15)];
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
qbyte FASTCALL AddBlend(qbyte p, qbyte p2)
|
qbyte FASTCALL AddBlend(qbyte p, qbyte p2)
|
||||||
{
|
{
|
||||||
|
@ -142,7 +164,7 @@ qbyte GetPalette(int red, int green, int blue)
|
||||||
qbyte GetPaletteNoFB(int red, int green, int blue)
|
qbyte GetPaletteNoFB(int red, int green, int blue)
|
||||||
{
|
{
|
||||||
if (pal555to8) //fast precalculated (but ugly) method
|
if (pal555to8) //fast precalculated (but ugly) method
|
||||||
return nofbremap[FindPalette(red,green,blue)];
|
return fbremapidx(FindPalette(red,green,blue));
|
||||||
else //slow, horrible (but accurate) method.
|
else //slow, horrible (but accurate) method.
|
||||||
return FindIndexFromRGBNoFB(red, green, blue);
|
return FindIndexFromRGBNoFB(red, green, blue);
|
||||||
}
|
}
|
||||||
|
@ -173,7 +195,7 @@ void MakeVideoPalette(void)
|
||||||
FindIndexFromRGB(r<<3|r>>2, g<<3|g>>2, b<<3|b>>2);
|
FindIndexFromRGB(r<<3|r>>2, g<<3|g>>2, b<<3|b>>2);
|
||||||
|
|
||||||
// write palette conversion table
|
// write palette conversion table
|
||||||
if (r_palconvwrite.value)
|
if (d_palconvwrite.value)
|
||||||
COM_WriteFile("pal555.pal", pal555to8, PAL555_SIZE);
|
COM_WriteFile("pal555.pal", pal555to8, PAL555_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,18 +222,45 @@ void MakeSwizzledPalette(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MakeFullbrightRemap(void)
|
// colormap functions
|
||||||
|
void MakePaletteRemaps(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
palremapsize = d_palremapsize.value;
|
||||||
|
|
||||||
|
if (palremapsize < 4)
|
||||||
|
{
|
||||||
|
Con_Printf("Invalid size for d_palremapsize, defaulting to 4.\n");
|
||||||
|
palremapsize = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
palremaps = BZ_Malloc(sizeof(palremap_t)*palremapsize);
|
||||||
|
|
||||||
|
// build identity remap
|
||||||
|
palremaps[0].r = palremaps[0].g = palremaps[0].b = 255;
|
||||||
|
palremaps[0].key = 0x1 ^ 0x4 ^ 0;
|
||||||
|
palremaps[0].references = 999;
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
palremaps[0].pal[i] = i;
|
||||||
|
|
||||||
|
// build fullbright remap
|
||||||
|
palremaps[1].r = palremaps[1].g = palremaps[1].b = 255;
|
||||||
|
palremaps[1].key = 0x1 ^ 0;
|
||||||
|
palremaps[1].references = 999;
|
||||||
for (i = 0; i < 256 - vid.fullbright; i++)
|
for (i = 0; i < 256 - vid.fullbright; i++)
|
||||||
nofbremap[i] = i;
|
palremaps[1].pal[i] = i;
|
||||||
for (i = 256 - vid.fullbright; i < 256; i++)
|
for (i = 256 - vid.fullbright; i < 256; i++)
|
||||||
nofbremap[i] = FindIndexFromRGBNoFB(host_basepal[i*3], host_basepal[i*3+1], host_basepal[i*3+2]);
|
palremaps[1].pal[i] = FindIndexFromRGBNoFB(host_basepal[i*3], host_basepal[i*3+1], host_basepal[i*3+2]);
|
||||||
|
|
||||||
|
for (i = 2; i < palremapsize; i++)
|
||||||
|
{
|
||||||
|
palremaps[i].key = 0;
|
||||||
|
palremaps[i].references = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// colormap functions
|
void BuildModulatedPalette(qbyte *indexes, int red, int green, int blue, qboolean desaturate, qboolean fullbrights, int topcolor, int bottomcolor)
|
||||||
void BuildModulatedColormap(qbyte *indexes, int red, int green, int blue, qboolean desaturate, qboolean fullbrights)
|
|
||||||
{
|
{
|
||||||
qbyte *rgb = host_basepal;
|
qbyte *rgb = host_basepal;
|
||||||
unsigned int r, g, b, x, invmask = 0;
|
unsigned int r, g, b, x, invmask = 0;
|
||||||
|
@ -219,8 +268,7 @@ void BuildModulatedColormap(qbyte *indexes, int red, int green, int blue, qboole
|
||||||
if (red < 0 || green < 0 || blue < 0)
|
if (red < 0 || green < 0 || blue < 0)
|
||||||
invmask = 0xff;
|
invmask = 0xff;
|
||||||
|
|
||||||
// generate colormap
|
// generate palette remap
|
||||||
|
|
||||||
if (desaturate)
|
if (desaturate)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
|
@ -246,6 +294,14 @@ void BuildModulatedColormap(qbyte *indexes, int red, int green, int blue, qboole
|
||||||
rgb += 3;
|
rgb += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (red == 255 && green == 255 && blue == 255)
|
||||||
|
{
|
||||||
|
// identity merge
|
||||||
|
if (fullbrights)
|
||||||
|
memcpy(indexes, identityremap.pal, sizeof(identityremap));
|
||||||
|
else
|
||||||
|
memcpy(indexes, fullbrightremap.pal, sizeof(fullbrightremap));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (x = 0; x < 256; x++)
|
for (x = 0; x < 256; x++)
|
||||||
|
@ -270,6 +326,125 @@ void BuildModulatedColormap(qbyte *indexes, int red, int green, int blue, qboole
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle top/bottom remap
|
||||||
|
if (topcolor == TOP_DEFAULT && bottomcolor == BOTTOM_DEFAULT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
{
|
||||||
|
qbyte topcolors[16];
|
||||||
|
qbyte bottomcolors[16];
|
||||||
|
|
||||||
|
topcolor = topcolor * 16;
|
||||||
|
bottomcolor = bottomcolor * 16;
|
||||||
|
|
||||||
|
for (x = 0; x < 16; x++)
|
||||||
|
{
|
||||||
|
if (topcolor < 128)
|
||||||
|
topcolors[x] = indexes[topcolor + x];
|
||||||
|
else
|
||||||
|
topcolors[x] = indexes[topcolor + 15 - x];
|
||||||
|
|
||||||
|
if (bottomcolor < 128)
|
||||||
|
bottomcolors[x] = indexes[bottomcolor + x];
|
||||||
|
else
|
||||||
|
bottomcolors[x] = indexes[bottomcolor + 15 - x];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x = 0; x < 16; x++)
|
||||||
|
{
|
||||||
|
indexes[TOP_RANGE + x] = topcolors[x];
|
||||||
|
indexes[BOTTOM_RANGE + x] = bottomcolors[x];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
palremap_t *D_GetPaletteRemap(int red, int green, int blue, qboolean desaturate, qboolean fullbrights, int topcolor, int bottomcolor)
|
||||||
|
{
|
||||||
|
int i, key, deref = -1;
|
||||||
|
|
||||||
|
topcolor = topcolor & 0xf;
|
||||||
|
bottomcolor = bottomcolor & 0xf;
|
||||||
|
|
||||||
|
key = 0x1 ^ ((!!desaturate) << 1) ^ ((!!fullbrights) << 2) ^ (topcolor << 3) ^ (bottomcolor << 7);
|
||||||
|
|
||||||
|
for (i = 0; i < palremapsize; i++)
|
||||||
|
{
|
||||||
|
if (palremaps[i].r == red &&
|
||||||
|
palremaps[i].g == green &&
|
||||||
|
palremaps[i].b == blue &&
|
||||||
|
palremaps[i].key == key)
|
||||||
|
{
|
||||||
|
palremaps[i].references++;
|
||||||
|
return palremaps + i;
|
||||||
|
}
|
||||||
|
else if (palremaps[i].references <= 0)
|
||||||
|
deref = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deref < 2) // no remaps found and all maps are referenced
|
||||||
|
return palremaps; // identity remap
|
||||||
|
|
||||||
|
// return non-referenced map
|
||||||
|
BuildModulatedPalette(palremaps[deref].pal, red, green, blue, desaturate, fullbrights, topcolor, bottomcolor);
|
||||||
|
palremaps[deref].references++;
|
||||||
|
palremaps[deref].r = red;
|
||||||
|
palremaps[deref].g = green;
|
||||||
|
palremaps[deref].b = blue;
|
||||||
|
palremaps[deref].key = key;
|
||||||
|
return palremaps + deref;
|
||||||
|
}
|
||||||
|
|
||||||
|
palremap_t *RebuildMenuTint(void)
|
||||||
|
{
|
||||||
|
char *t;
|
||||||
|
int r, g, b;
|
||||||
|
|
||||||
|
r = 255*r_menutint.value;
|
||||||
|
g = 0;
|
||||||
|
b = 0;
|
||||||
|
t = strstr(r_menutint.string, " ");
|
||||||
|
if (t)
|
||||||
|
{
|
||||||
|
g = 255*atof(t+1);
|
||||||
|
t = strstr(t+1, " ");
|
||||||
|
if (t)
|
||||||
|
b = 255*atof(t+1);
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return D_GetPaletteRemap(r, g, b, true, true, TOP_DEFAULT, BOTTOM_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void D_DereferenceRemap(palremap_t *palremap)
|
||||||
|
{
|
||||||
|
if (palremap && palremap >= palremaps+2)
|
||||||
|
palremap->references--;
|
||||||
|
}
|
||||||
|
|
||||||
|
qbyte *D_GetMenuTintPal(void)
|
||||||
|
{
|
||||||
|
if (mtmodified != r_menutint.modified)
|
||||||
|
{
|
||||||
|
if (mtpalremap)
|
||||||
|
D_DereferenceRemap(mtpalremap);
|
||||||
|
|
||||||
|
mtpalremap = RebuildMenuTint();
|
||||||
|
mtmodified = r_menutint.modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mtpalremap && mtpalremap != palremaps)
|
||||||
|
return mtpalremap->pal;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
palremap_t *D_IdentityRemap(void) // TODO: explicitly inline this
|
||||||
|
{
|
||||||
|
return palremaps;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSW_ShowFrame8bit(qbyte *framedata, int inwidth, int inheight, qbyte *palette)
|
void MediaSW_ShowFrame8bit(qbyte *framedata, int inwidth, int inheight, qbyte *palette)
|
||||||
|
|
|
@ -40,7 +40,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
mtriangle_t *ptriangles;
|
mtriangle_t *ptriangles;
|
||||||
affinetridesc_t r_affinetridesc;
|
affinetridesc_t r_affinetridesc;
|
||||||
|
|
||||||
void * acolormap; // FIXME: should go away
|
void *acolormap; // FIXME: should go away
|
||||||
|
qbyte *apalremap;
|
||||||
|
|
||||||
dtrivertx_t *r_apoldverts;
|
dtrivertx_t *r_apoldverts;
|
||||||
dtrivertx_t *r_apnewverts;
|
dtrivertx_t *r_apnewverts;
|
||||||
|
@ -909,8 +910,8 @@ void R_AliasDrawModel (alight_t *plighting)
|
||||||
R_AliasSetupLighting (plighting);
|
R_AliasSetupLighting (plighting);
|
||||||
R_AliasSetupFrame ();
|
R_AliasSetupFrame ();
|
||||||
|
|
||||||
if (!currententity->colormap)
|
if (!currententity->palremap)
|
||||||
currententity->colormap = vid.colormap;
|
currententity->palremap = D_IdentityRemap();
|
||||||
// Sys_Error ("R_AliasDrawModel: !currententity->colormap");
|
// Sys_Error ("R_AliasDrawModel: !currententity->colormap");
|
||||||
|
|
||||||
r_affinetridesc.drawtype = (currententity->trivial_accept == 3) &&
|
r_affinetridesc.drawtype = (currententity->trivial_accept == 3) &&
|
||||||
|
@ -918,6 +919,11 @@ void R_AliasDrawModel (alight_t *plighting)
|
||||||
|
|
||||||
r_affinetridesc.pstverts = (mstvert_t *)((qbyte *)paliashdr + paliashdr->stverts);
|
r_affinetridesc.pstverts = (mstvert_t *)((qbyte *)paliashdr + paliashdr->stverts);
|
||||||
|
|
||||||
|
apalremap = currententity->palremap->pal;
|
||||||
|
acolormap = vid.colormap;
|
||||||
|
if (r_pixbytes == 2)
|
||||||
|
acolormap = vid.colormap16;
|
||||||
|
|
||||||
if (r_affinetridesc.drawtype)
|
if (r_affinetridesc.drawtype)
|
||||||
{
|
{
|
||||||
D_PolysetUpdateTables (); // FIXME: precalc...
|
D_PolysetUpdateTables (); // FIXME: precalc...
|
||||||
|
@ -925,14 +931,10 @@ void R_AliasDrawModel (alight_t *plighting)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if id386
|
#if id386
|
||||||
D_Aff8Patch (currententity->colormap);
|
D_Aff8Patch (acolormap, apalremap);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
acolormap = currententity->colormap;
|
|
||||||
if (r_pixbytes == 2)
|
|
||||||
acolormap = vid.colormap16;
|
|
||||||
|
|
||||||
if (currententity == &cl.viewent[r_refdef.currentplayernum] || currententity->flags & Q2RF_DEPTHHACK)
|
if (currententity == &cl.viewent[r_refdef.currentplayernum] || currententity->flags & Q2RF_DEPTHHACK)
|
||||||
ziscale = (float)0x8000 * (float)0x10000 * 3.0;
|
ziscale = (float)0x8000 * (float)0x10000 * 3.0;
|
||||||
else
|
else
|
||||||
|
|
|
@ -209,6 +209,7 @@ void SWR_DeInit (void)
|
||||||
Cmd_RemoveCommand ("pointfile");
|
Cmd_RemoveCommand ("pointfile");
|
||||||
|
|
||||||
SWDraw_Shutdown();
|
SWDraw_Shutdown();
|
||||||
|
D_Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2379,53 +2379,14 @@ Draw_FadeScreen
|
||||||
|
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
char fscolormap[256];
|
|
||||||
int fsnodraw = 1;
|
|
||||||
int fsmodified;
|
|
||||||
|
|
||||||
void SWDraw_FadeScreen (void)
|
void SWDraw_FadeScreen (void)
|
||||||
{
|
{
|
||||||
int x,y;
|
int x,y;
|
||||||
extern cvar_t r_menutint;
|
|
||||||
|
|
||||||
VID_UnlockBuffer ();
|
VID_UnlockBuffer ();
|
||||||
S_ExtraUpdate ();
|
S_ExtraUpdate ();
|
||||||
VID_LockBuffer ();
|
VID_LockBuffer ();
|
||||||
|
|
||||||
if (fsmodified != r_menutint.modified)
|
|
||||||
{
|
|
||||||
char *t;
|
|
||||||
int r, g, b;
|
|
||||||
|
|
||||||
qbyte *rgb = (qbyte *)host_basepal;
|
|
||||||
|
|
||||||
// parse r_menutint
|
|
||||||
fsnodraw = 0;
|
|
||||||
r = 255*r_menutint.value;
|
|
||||||
g = 0;
|
|
||||||
b = 0;
|
|
||||||
t = strstr(r_menutint.string, " ");
|
|
||||||
if (t)
|
|
||||||
{
|
|
||||||
g = 255*atof(t+1);
|
|
||||||
t = strstr(t+1, " ");
|
|
||||||
if (t)
|
|
||||||
b = 255*atof(t+1);
|
|
||||||
else
|
|
||||||
fsnodraw = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fsnodraw = 1;
|
|
||||||
|
|
||||||
// rebuild colormap here
|
|
||||||
BuildModulatedColormap(fscolormap, r, g, b, true, true);
|
|
||||||
|
|
||||||
fsmodified = r_menutint.modified;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fsnodraw)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (r_pixbytes == 4)
|
if (r_pixbytes == 4)
|
||||||
{
|
{
|
||||||
qbyte *pbuf;
|
qbyte *pbuf;
|
||||||
|
@ -2458,7 +2419,12 @@ void SWDraw_FadeScreen (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qbyte *pbuf;
|
qbyte *pbuf;
|
||||||
|
qbyte *mtpal = D_GetMenuTintPal();
|
||||||
|
|
||||||
|
if (!mtpal)
|
||||||
|
return;
|
||||||
|
|
||||||
for (y=0 ; y<vid.height ; y++)
|
for (y=0 ; y<vid.height ; y++)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -2466,7 +2432,7 @@ void SWDraw_FadeScreen (void)
|
||||||
|
|
||||||
for (x=0 ; x<vid.width ; x++)
|
for (x=0 ; x<vid.width ; x++)
|
||||||
{
|
{
|
||||||
pbuf[x] = fscolormap[pbuf[x]];
|
pbuf[x] = mtpal[pbuf[x]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue