Start working on the new GL skin code.

This commit is contained in:
Bill Currie 2012-01-24 23:06:07 +09:00
parent 695b38e5e5
commit df87cffe15
5 changed files with 71 additions and 8 deletions

View file

@ -64,6 +64,9 @@ void Skin_SetupSkin (skin_t *skin, int cmap);
void Skin_SetTranslation (int cmap, int top, int bottom);
void Skin_ProcessTranslation (int cmap, const byte *translation);
void Skin_InitTranslations (void);
int Skin_Init_Textures (int base); // only GL
void Skin_SetPlayerSkin (int width, int height, const byte *data); // only GL
void Skin_Init (void);
#endif

View file

@ -52,7 +52,6 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$";
#include "compat.h"
VISIBLE byte player_8bit_texels[640 * 400];
int alias_cache = 1;
void *
@ -70,11 +69,9 @@ Mod_LoadSkin (byte * skin, int skinsize, int snum, int gnum, qboolean group,
Mod_FloodFillSkin (pskin, pheader->mdl.skinwidth, pheader->mdl.skinheight);
// save 8 bit texels for the player model to remap
if (strequal (loadmodel->name, "progs/player.mdl")) {
if (skinsize > (int) sizeof (player_8bit_texels))
Sys_Error ("Player skin too large");
memcpy (player_8bit_texels, pskin, skinsize);
}
if (strequal (loadmodel->name, "progs/player.mdl"))
Skin_SetPlayerSkin (pheader->mdl.skinwidth, pheader->mdl.skinheight,
pskin);
QFS_StripExtension (loadmodel->name, modname);

View file

@ -50,17 +50,64 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$";
#include "QF/GL/defines.h"
#include "QF/GL/funcs.h"
static int skin_textures;
static int skin_fb_textures;
static byte skin_cmap[MAX_TRANSLATIONS][256];
static tex_t *skin_tex[MAX_TRANSLATIONS];
static tex_t *player_tex;
void
Skin_SetPlayerSkin (int width, int height, const byte *data)
{
int size = width * height;
player_tex = realloc (player_tex, field_offset(tex_t, data[size]));
player_tex->width = width;
player_tex->height = height;
player_tex->format = tex_palette;
player_tex->palette = vid.palette;
memcpy (player_tex->data, data, size);
}
void
Skin_ProcessTranslation (int cmap, const byte *translation)
{
int changed;
// simplify cmap usage (texture offset/array index)
cmap--;
// skip over the colormap (GL can't use it) to the translated palette
translation += VID_GRADES * 256;
changed = memcmp (skin_cmap[cmap], translation, 256);
memcpy (skin_cmap[cmap], translation, 256);
if (!changed)
return;
}
void
Skin_SetupSkin (skin_t *skin, int cmap)
{
int changed;
// simplify cmap usage (texture offset/array index)
cmap--;
changed = (skin_tex[cmap] != skin->texels);
skin_tex[cmap] = skin->texels;
if (!changed)
return;
}
void
Skin_InitTranslations (void)
{
}
int
Skin_Init_Textures (int base)
{
skin_textures = base;
base += MAX_TRANSLATIONS;
skin_fb_textures = base;
base += MAX_TRANSLATIONS;
return base;
}

View file

@ -59,7 +59,9 @@ typedef struct skinbank_s {
int users;
} skinbank_t;
static byte translations[MAX_TRANSLATIONS][VID_GRADES * 256];
// each translation has one extra line for palette (vs colormap) based
// translation (for 32bit rendering)
static byte translations[MAX_TRANSLATIONS][(VID_GRADES + 1) * 256];
static hashtab_t *skin_cache;
static skin_t *
@ -102,6 +104,20 @@ Skin_SetTranslation (int cmap, int top, int bottom)
for (j = 0; j < 16; j++)
dest[BOTTOM_RANGE + j] = source[bottom + 15 - j];
}
// set up the palette translation
// dest currently points to the palette line
for (i = 0; i < 256; i++)
dest[i] = i;
for (i = 0; i < 16; i++) {
if (top < 128)
dest[TOP_RANGE + i] = top + i;
else
dest[TOP_RANGE + i] = top + 15 - i;
if (bottom < 128)
dest[BOTTOM_RANGE + i] = bottom + i;
else
dest[BOTTOM_RANGE + i] = bottom + 15 - i;
}
Skin_ProcessTranslation (cmap, translations[cmap - 1]);
}

View file

@ -152,7 +152,7 @@ R_Init (void)
texture_extension_number = R_InitGraphTextures (texture_extension_number);
//FIXME texture_extension_number = Skin_Init_Textures (texture_extension_number);
texture_extension_number = Skin_Init_Textures (texture_extension_number);
r_init = 1;
R_InitParticles ();