diff --git a/include/QF/render.h b/include/QF/render.h index aa5695bf0..20a484608 100644 --- a/include/QF/render.h +++ b/include/QF/render.h @@ -77,7 +77,6 @@ typedef struct entity_s { vec_t full_transform[4 * 4]; struct model_s *model; // NULL = no model int frame; - byte *colormap; int skinnum; // for Alias models struct skin_s *skin; diff --git a/include/QF/skin.h b/include/QF/skin.h index 0c8174366..537aa7b4f 100644 --- a/include/QF/skin.h +++ b/include/QF/skin.h @@ -30,6 +30,7 @@ #define _SKIN_H #include "QF/qtypes.h" +#include "QF/vid.h" #include "QF/zone.h" #define MAX_CACHED_SKINS 128 @@ -38,18 +39,23 @@ #define RSSHOT_WIDTH 320 #define RSSHOT_HEIGHT 200 +typedef struct translation_s { + byte top[VID_GRADES][16]; + byte bottom[VID_GRADES][16]; +} translation_t; + typedef struct skin_s { - char name[MAX_SKIN_LENGTH]; - qboolean failedload; // the name isn't a valid skin - union { - cache_user_t cache; - struct tex_s *texels; - } data; - int texture; - int fb_texture; - int numfb; + const char *name; + qboolean valid; // the skin was found + struct tex_s *texels; + byte *colormap; + int texnum; + int auxtex; } skin_t; +skin_t *Skin_SetColormap (skin_t *skin, int cmap); +void Skin_SetTranslation (int cmap, int top, int bottom); + extern byte player_8bit_texels[640 * 400]; extern skin_t skin_cache[MAX_CACHED_SKINS]; extern int skin_textures; @@ -68,7 +74,7 @@ int Skin_Init_Textures (int base); void Skin_Init (void); void Skin_Init_Cvars (void); void Skin_Init_Translation (void); -void Skin_Set_Translate (int top, int bottom, void *_dest); +void Skin_Set_Translate (int top, int bottom, translation_t *trans); void Skin_Do_Translation (skin_t *player_skin, int slot, skin_t *skin); void Skin_Do_Translation_Model (struct model_s *model, int skinnum, int slot, skin_t *skin); diff --git a/include/QF/sys.h b/include/QF/sys.h index c9c5d6859..f78d6d8a8 100644 --- a/include/QF/sys.h +++ b/include/QF/sys.h @@ -89,6 +89,7 @@ void Sys_MaskPrintf (int mask, const char *fmt, ...) __attribute__((format(print #define SYS_SND (1|512) #define SYS_GLT (1|1024) #define SYS_GLSL (1|2048) +#define SYS_SKIN (1|4096) int Sys_CheckInput (int idle, int net_socket); const char *Sys_ConsoleInput (void); diff --git a/libs/models/Makefile.am b/libs/models/Makefile.am index 4f8248379..0e74c6912 100644 --- a/libs/models/Makefile.am +++ b/libs/models/Makefile.am @@ -7,7 +7,7 @@ INCLUDES= -I$(top_srcdir)/include lib_LTLIBRARIES= libQFmodels.la @VID_MODEL_TARGETS@ EXTRA_LTLIBRARIES= libQFmodels_gl.la libQFmodels_glsl.la libQFmodels_sw.la -models_sources = clip_hull.c model.c portal.c trace.c winding.c +models_sources = clip_hull.c model.c portal.c skin.c trace.c winding.c libQFmodels_la_LDFLAGS= -version-info $(QUAKE_LIBRARY_VERSION_INFO) -no-undefined libQFmodels_la_LIBADD= brush/libbrush.la $(top_builddir)/libs/util/libQFutil.la diff --git a/libs/models/skin.c b/libs/models/skin.c new file mode 100644 index 000000000..81a015aff --- /dev/null +++ b/libs/models/skin.c @@ -0,0 +1,102 @@ +/* + skin.c + + Skin support + + Copyright (C) 2012 Bill Currie + + Author: Bill Currie + Date: 2012/1/23 + + 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: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +static __attribute__ ((used)) const char rcsid[] = "$Id$"; + +#ifdef HAVE_STRING_H +# include "string.h" +#endif +#ifdef HAVE_STRINGS_H +# include "strings.h" +#endif + +#include + +#include "QF/image.h" +#include "QF/model.h" +#include "QF/skin.h" +#include "QF/sys.h" + +#include "QF/GLSL/funcs.h" + +// if more than 32 clients are to be supported, then this will need to be +// updated +#define MAX_TRANSLATIONS 32 +static byte translations[MAX_TRANSLATIONS][VID_GRADES * 256]; + +static skin_t * +new_skin (void) +{ + return calloc (1, sizeof (skin_t)); +} + +VISIBLE void +Skin_SetTranslation (int cmap, int top, int bottom) +{ +#if 0 + int i, j; + byte *source; + + top = bound (0, top, 13) * 16; + bottom = bound (0, bottom, 13) * 16; + + source = vid.colormap8; + + for (i = 0; i < VID_GRADES; i++, source += 256) { + if (top < 128) // the artists made some backwards ranges. + memcpy (trans->top[i], source + top, 16); + else + for (j = 0; j < 16; j++) + trans->top[i][j] = source[top + 15 - j]; + + if (bottom < 128) + memcpy (trans->bottom[i], source + bottom, 16); + else + for (j = 0; j < 16; j++) + trans->bottom[i][j] = source[bottom + 15 - j]; + } +#endif +} + +skin_t * +Skin_SetColormap (skin_t *skin, int cmap) +{ + if (!skin) + skin = new_skin (); + skin->colormap = 0; + if (cmap < 0 || cmap > MAX_TRANSLATIONS) + Sys_MaskPrintf (SYS_SKIN, "invalid skin slot: %d\n", cmap); + if (cmap > 0 && cmap <= MAX_TRANSLATIONS) + skin->colormap = translations[cmap - 1]; + return skin; +} diff --git a/libs/video/renderer/gl/Makefile.am b/libs/video/renderer/gl/Makefile.am index 82cf583ae..fae8ff517 100644 --- a/libs/video/renderer/gl/Makefile.am +++ b/libs/video/renderer/gl/Makefile.am @@ -12,7 +12,7 @@ endif gl_src = \ gl_draw.c gl_dyn_lights.c gl_dyn_part.c gl_dyn_textures.c \ gl_fog.c gl_graph.c gl_lightmap.c gl_mod_alias.c gl_mod_sprite.c \ - gl_rmain.c gl_rmisc.c gl_rsurf.c gl_screen.c gl_skin.c gl_sky.c \ + gl_rmain.c gl_rmisc.c gl_rsurf.c gl_screen.c gl_sky.c \ gl_sky_clip.c gl_textures.c gl_warp.c libgl_la_SOURCES= $(gl_src) diff --git a/libs/video/renderer/gl/gl_mod_alias.c b/libs/video/renderer/gl/gl_mod_alias.c index 413c664f9..f9350283c 100644 --- a/libs/video/renderer/gl/gl_mod_alias.c +++ b/libs/video/renderer/gl/gl_mod_alias.c @@ -522,12 +522,12 @@ R_DrawAliasModel (entity_t *e) // if the model has a colorised/external skin, use it, otherwise use // the skin embedded in the model data - if (e->skin && !gl_nocolors->int_val) { + if (e->skin && e->skin->texnum && !gl_nocolors->int_val) { skin_t *skin = e->skin; - texture = skin->texture; + texture = skin->texnum; if (gl_fb_models->int_val) { - fb_texture = skin->fb_texture; + fb_texture = skin->auxtex; } } else { maliasskindesc_t *skindesc; diff --git a/libs/video/renderer/gl/gl_rmisc.c b/libs/video/renderer/gl/gl_rmisc.c index 5659fd09f..d9903cb32 100644 --- a/libs/video/renderer/gl/gl_rmisc.c +++ b/libs/video/renderer/gl/gl_rmisc.c @@ -152,7 +152,7 @@ R_Init (void) texture_extension_number = R_InitGraphTextures (texture_extension_number); - texture_extension_number = Skin_Init_Textures (texture_extension_number); + //FIXME texture_extension_number = Skin_Init_Textures (texture_extension_number); r_init = 1; R_InitParticles (); diff --git a/libs/video/renderer/gl/gl_skin.c b/libs/video/renderer/gl/gl_skin.c deleted file mode 100644 index c82629f47..000000000 --- a/libs/video/renderer/gl/gl_skin.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - gl_skin.c - - (description) - - Copyright (C) 1996-1997 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static __attribute__ ((used)) const char rcsid[] = - "$Id$"; - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "QF/cvar.h" -#include "QF/image.h" -#include "QF/render.h" -#include "QF/skin.h" -#include "QF/sys.h" -#include "QF/GL/defines.h" -#include "QF/GL/funcs.h" -#include "QF/GL/qf_textures.h" - -#include "compat.h" -#include "r_cvar.h" - -static byte translate[256]; -static unsigned int translate32[256]; - -static int player_width = 296; -static int player_height = 194; - -VISIBLE void -Skin_Set_Translate (int top, int bottom, void *_dest) -{ - int i; - - top = bound (0, top, 13) << 4; - bottom = bound (0, bottom, 13) << 4; - - if (VID_Is8bit ()) { // 8bit texture upload - for (i = 0; i < 16; i++) { - // the artists made some backwards ranges. sigh. - if (top < 128) - translate[TOP_RANGE + i] = top + i; - else - translate[TOP_RANGE + i] = top + 15 - i; - - if (bottom < 128) - translate[BOTTOM_RANGE + i] = bottom + i; - else - translate[BOTTOM_RANGE + i] = bottom + 15 - i; - } - } else { - if (top < 128) - memcpy (translate32 + TOP_RANGE, d_8to24table + top, - 16 * sizeof (unsigned int)); - else - for (i = 0; i < 16; i++) - translate32[TOP_RANGE + i] = d_8to24table[top + 15 - i]; - - if (bottom < 128) - memcpy (translate32 + BOTTOM_RANGE, d_8to24table + bottom, - 16 * sizeof (unsigned int)); - else - for (i = 0; i < 16; i++) - translate32[BOTTOM_RANGE + i] = d_8to24table[bottom + 15 - i]; - } -} - -static void -build_skin_8 (byte * original, int tinwidth, int tinheight, - unsigned int scaled_width, unsigned int scaled_height, - int inwidth, qboolean alpha) -{ - // Improvements should be mirrored in GL_ResampleTexture in gl_textures.c - byte *inrow; - byte pixels[512 * 256], *out; - unsigned int i, j; - unsigned int frac, fracstep; - - out = pixels; - memset (pixels, 0, sizeof (pixels)); - fracstep = tinwidth * 0x10000 / scaled_width; - for (i = 0; i < scaled_height; i++, out += scaled_width) { - inrow = original + inwidth * (i * tinheight / scaled_height); - frac = fracstep >> 1; - for (j = 0; j < scaled_width; j++) { - out[j] = translate[inrow[frac >> 16]]; - frac += fracstep; - } - } - - GL_Upload8_EXT ((byte *) pixels, scaled_width, scaled_height, false, - alpha); -} - -static void -build_skin_32 (byte * original, int tinwidth, int tinheight, - unsigned int scaled_width, unsigned int scaled_height, - int inwidth, qboolean alpha) -{ - // Improvements should be mirrored in GL_ResampleTexture in gl_textures.c - byte *inrow; - unsigned int i, j; - int samples = alpha ? gl_alpha_format : gl_solid_format; - unsigned int frac, fracstep; - unsigned int pixels[512 * 256], *out; - - out = pixels; - memset (pixels, 0, sizeof (pixels)); - fracstep = tinwidth * 0x10000 / scaled_width; - for (i = 0; i < scaled_height; i++, out += scaled_width) { - inrow = original + inwidth * (i * tinheight / scaled_height); - frac = fracstep >> 1; - for (j = 0; j < scaled_width; j++) { - out[j] = translate32[inrow[frac >> 16]]; - frac += fracstep; - } - } - - qfglTexImage2D (GL_TEXTURE_2D, 0, samples, scaled_width, scaled_height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, pixels); - - qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - if (Anisotropy) - qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, - aniso); -} - -static void -build_skin (int texnum, byte *ptexels, int width, int height, - int owidth, int oheight, qboolean alpha) -{ - unsigned int scaled_width, scaled_height; - - // because this happens during gameplay, do it fast - // instead of sending it through GL_Upload8() - qfglBindTexture (GL_TEXTURE_2D, texnum); - - // FIXME deek: This 512x256 limit sucks! - scaled_width = min (gl_max_size->int_val, 512); - scaled_height = min (gl_max_size->int_val, 256); - - // allow users to crunch sizes down even more if they want - scaled_width >>= gl_playermip->int_val; - scaled_height >>= gl_playermip->int_val; - - if (VID_Is8bit ()) { // 8bit texture upload - build_skin_8 (ptexels, owidth, oheight, scaled_width, scaled_height, - width, alpha); - } else { - build_skin_32 (ptexels, owidth, oheight, scaled_width, scaled_height, - width, alpha); - } -} - -VISIBLE void -Skin_Do_Translation (skin_t *player_skin, int slot, skin_t *skin) -{ - byte *original; - int inwidth, inheight; - int texnum = skin->texture; - tex_t *skin_texels; - - if ((skin_texels = (tex_t *) Skin_Cache (player_skin)) != NULL) { - // skin data width - inwidth = 320; - inheight = 200; - original = skin_texels->data; - } else { - original = player_8bit_texels; - inwidth = player_width; - inheight = player_height; - } - build_skin (texnum, original, inwidth, inheight, - player_width, player_height, false); -} - -VISIBLE void -Skin_Do_Translation_Model (model_t *model, int skinnum, int slot, skin_t *skin) -{ - byte *original; - int inwidth, inheight; - int texnum = skin->texture; - aliashdr_t *paliashdr; - maliasskindesc_t *pskindesc; - - if (!model) // player doesn't have a model yet - return; - if (model->type != mod_alias) // translate skins only on alias models - return; - - paliashdr = Cache_Get (&model->cache); - if (skinnum < 0 - || skinnum >= paliashdr->mdl.numskins) { - Sys_MaskPrintf (SYS_DEV, "(%d): Invalid player skin #%d\n", slot, - skinnum); - skinnum = 0; - } - pskindesc = ((maliasskindesc_t *) - ((byte *) paliashdr + paliashdr->skindesc)) + skinnum; - //FIXME: broken for skin groups - original = (byte *) paliashdr + pskindesc->skin; - - inwidth = paliashdr->mdl.skinwidth; - inheight = paliashdr->mdl.skinheight; - - build_skin (texnum, original, inwidth, inheight, inwidth, inheight, false); - - Cache_Release (&model->cache); -} - -VISIBLE void -Skin_Player_Model (model_t *model) -{ - aliashdr_t *paliashdr; - - player_width = 296; - player_height = 194; - if (!model) // player doesn't have a model yet - return; - if (model->type != mod_alias) // translate skins only on alias models - return; - - paliashdr = Cache_Get (&model->cache); - player_width = paliashdr->mdl.skinwidth; - player_height = paliashdr->mdl.skinheight; - Cache_Release (&model->cache); -} - -VISIBLE void -Skin_Init_Translation (void) -{ - int i; - - for (i = 0; i < 256; i++) { - translate[i] = i; - translate32[i] = d_8to24table[i]; - } -} - -VISIBLE void -Skin_Process (skin_t *skin, tex_t *tex) -{ - int pixels = tex->width * tex->height; - byte *ptexels = Hunk_TempAlloc (pixels); - - skin->fb_texture = 0; - if (Mod_CalcFullbright (tex->data, ptexels, pixels)) { - skin->fb_texture = skin_fb_textures + (skin - skin_cache); - build_skin (skin->fb_texture, ptexels, tex->width, tex->height, - 296, 194, true); - } -} diff --git a/libs/video/renderer/glsl/Makefile.am b/libs/video/renderer/glsl/Makefile.am index 851ed86ea..6c89c3272 100644 --- a/libs/video/renderer/glsl/Makefile.am +++ b/libs/video/renderer/glsl/Makefile.am @@ -15,7 +15,7 @@ shader_gen= \ glsl_src = \ glsl_alias.c glsl_bsp.c glsl_draw.c glsl_lightmap.c glsl_main.c \ - glsl_particles.c glsl_screen.c glsl_skin.c glsl_sprite.c glsl_textures.c + glsl_particles.c glsl_screen.c glsl_sprite.c glsl_textures.c if BUILD_GLSL noinst_LTLIBRARIES= libglsl.la diff --git a/libs/video/renderer/glsl/glsl_alias.c b/libs/video/renderer/glsl/glsl_alias.c index b63c81ad7..139ed57d9 100644 --- a/libs/video/renderer/glsl/glsl_alias.c +++ b/libs/video/renderer/glsl/glsl_alias.c @@ -228,7 +228,7 @@ R_DrawAlias (void) if (ent->skin) { skin_t *skin = ent->skin; - skin_tex = skin->texture; + skin_tex = skin->texnum; } else { maliasskindesc_t *skindesc; skindesc = R_AliasGetSkindesc (ent->skinnum, hdr); diff --git a/libs/video/renderer/glsl/glsl_skin.c b/libs/video/renderer/glsl/glsl_skin.c deleted file mode 100644 index 9e70a13cd..000000000 --- a/libs/video/renderer/glsl/glsl_skin.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - glsl_skin.c - - GLSL rendering - - Copyright (C) 2012 Bill Currie - - Author: Bill Currie - Date: 2012/1/13 - - 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static __attribute__ ((used)) const char rcsid[] = "$Id$"; - -#include "QF/image.h" -#include "QF/model.h" -#include "QF/skin.h" - -VISIBLE void -Skin_Player_Model (model_t *model) -{ -} - -VISIBLE void -Skin_Set_Translate (int top, int bottom, void *_dest) -{ -} - -VISIBLE void -Skin_Do_Translation (skin_t *player_skin, int slot, skin_t *skin) -{ -} - -VISIBLE void -Skin_Do_Translation_Model (model_t *model, int skinnum, int slot, - skin_t *skin) -{ -} - -VISIBLE void -Skin_Process (skin_t *skin, tex_t *tex) -{ -} - -VISIBLE void -Skin_Init_Translation (void) -{ -} - diff --git a/libs/video/renderer/sw/Makefile.am b/libs/video/renderer/sw/Makefile.am index 333a16db8..9bdc50305 100644 --- a/libs/video/renderer/sw/Makefile.am +++ b/libs/video/renderer/sw/Makefile.am @@ -26,7 +26,7 @@ sw_src= \ d_sky.c d_sprite.c d_surf.c d_vars.c d_zpoint.c draw.c fpu.c nonintel.c \ screen.c sw_fog.c sw_graph.c sw_raclip.c sw_ralias.c sw_rbsp.c sw_rdraw.c \ sw_redge.c sw_rmain.c sw_rmisc.c sw_rpart.c sw_rsky.c sw_rsprite.c \ - sw_rsurf.c sw_skin.c + sw_rsurf.c libasm_la_LDFLAGS= @STATIC@ libasm_la_SOURCES= $(asm_src) diff --git a/libs/video/renderer/sw/sw_ralias.c b/libs/video/renderer/sw/sw_ralias.c index 24e5b8dbb..edea6d802 100644 --- a/libs/video/renderer/sw/sw_ralias.c +++ b/libs/video/renderer/sw/sw_ralias.c @@ -568,15 +568,17 @@ R_AliasSetupSkin (void) r_affinetridesc.seamfixupX16 = (a_skinwidth >> 1) << 16; r_affinetridesc.skinheight = pmdl->skinheight; + acolormap = vid.colormap8; if (currententity->skin) { tex_t *base; - base = currententity->skin->data.texels; + base = currententity->skin->texels; if (base) { r_affinetridesc.pskin = base->data; r_affinetridesc.skinwidth = base->width; r_affinetridesc.skinheight = base->height; } + acolormap = currententity->skin->colormap; } } @@ -653,9 +655,6 @@ R_AliasDrawModel (alight_t *plighting) R_AliasSetupLighting (plighting); R_AliasSetupFrame (); - if (!currententity->colormap) - Sys_Error ("R_AliasDrawModel: !currententity->colormap"); - r_affinetridesc.drawtype = (currententity->trivial_accept == 3) && r_recursiveaffinetriangles; @@ -667,7 +666,8 @@ R_AliasDrawModel (alight_t *plighting) #endif } - acolormap = currententity->colormap; + if (!acolormap) + acolormap = vid.colormap8; if (currententity != r_view_model) ziscale = (float) 0x8000 *(float) 0x10000; diff --git a/libs/video/renderer/sw/sw_skin.c b/libs/video/renderer/sw/sw_skin.c deleted file mode 100644 index 9c1cad03b..000000000 --- a/libs/video/renderer/sw/sw_skin.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - sw_skin.c - - (description) - - Copyright (C) 1996-1997 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static __attribute__ ((used)) const char rcsid[] = - "$Id$"; - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "QF/model.h" -#include "QF/render.h" -#include "QF/skin.h" - -#include "compat.h" - - -void -Skin_Set_Translate (int top, int bottom, void *_dest) -{ - int i, j; - byte *source; - - byte *dest = (byte *) _dest; - - top = bound (0, top, 13) * 16; - bottom = bound (0, bottom, 13) * 16; - - source = vid.colormap8; - memcpy (dest, vid.colormap8, VID_GRADES*256); - - 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]; - } -} - - -void -Skin_Do_Translation (skin_t *player_skin, int slot, skin_t *skin) -{ -} - - -void -Skin_Do_Translation_Model (model_t *model, int skinnum, int slot, skin_t *skin) -{ -} - - -void -Skin_Player_Model (model_t *model) -{ -} - - -void -Skin_Init_Translation (void) -{ -} - - -void -Skin_Process (skin_t *skin, struct tex_s *tex) -{ -} diff --git a/libs/video/renderer/sw32/Makefile.am b/libs/video/renderer/sw32/Makefile.am index b79d19b63..1329d4693 100644 --- a/libs/video/renderer/sw32/Makefile.am +++ b/libs/video/renderer/sw32/Makefile.am @@ -14,7 +14,7 @@ sw32_src= \ d_sky.c d_sprite.c d_surf.c d_vars.c d_zpoint.c draw.c screen.c \ sw32_fog.c sw32_graph.c sw32_raclip.c sw32_ralias.c sw32_rbsp.c \ sw32_rdraw.c sw32_redge.c sw32_rmain.c sw32_rmisc.c sw32_rpart.c \ - sw32_rsky.c sw32_rsprite.c sw32_rsurf.c sw32_skin.c + sw32_rsky.c sw32_rsprite.c sw32_rsurf.c libsw32_la_SOURCES= $(sw32_src) diff --git a/libs/video/renderer/sw32/sw32_ralias.c b/libs/video/renderer/sw32/sw32_ralias.c index c10a947bf..b94b2e5c8 100644 --- a/libs/video/renderer/sw32/sw32_ralias.c +++ b/libs/video/renderer/sw32/sw32_ralias.c @@ -561,15 +561,17 @@ R_AliasSetupSkin (void) r_affinetridesc.seamfixupX16 = (a_skinwidth >> 1) << 16; r_affinetridesc.skinheight = pmdl->skinheight; + acolormap = vid.colormap8; if (currententity->skin) { tex_t *base; - base = currententity->skin->data.texels; + base = currententity->skin->texels; if (base) { r_affinetridesc.pskin = base->data; r_affinetridesc.skinwidth = base->width; r_affinetridesc.skinheight = base->height; } + acolormap = currententity->skin->colormap; } } @@ -646,10 +648,8 @@ R_AliasDrawModel (alight_t *plighting) R_AliasSetupLighting (plighting); R_AliasSetupFrame (); - if (!currententity->colormap) - Sys_Error ("R_AliasDrawModel: !currententity->colormap"); - - acolormap = currententity->colormap; + if (!acolormap) + acolormap = vid.colormap8; if (acolormap == &vid.colormap8 && r_pixbytes != 1) { if (r_pixbytes == 2) diff --git a/libs/video/renderer/sw32/sw32_skin.c b/libs/video/renderer/sw32/sw32_skin.c deleted file mode 100644 index 19736bc80..000000000 --- a/libs/video/renderer/sw32/sw32_skin.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - sw32_skin.c - - (description) - - Copyright (C) 1996-1997 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static __attribute__ ((used)) const char rcsid[] = - "$Id$"; - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "QF/model.h" -#include "QF/render.h" -#include "QF/skin.h" -#include "QF/sys.h" - -#include "compat.h" -#include "d_iface.h" - -VISIBLE void -Skin_Set_Translate (int top, int bottom, void *_dest) -{ - int i, j; - - top = bound (0, top, 13) * 16; - bottom = bound (0, bottom, 13) * 16; - - switch(r_pixbytes) { - case 1: - { - byte *source; - byte *dest = (byte *) _dest; - - source = vid.colormap8; - memcpy (dest, vid.colormap8, VID_GRADES * 256); - - for (i = 0; i < VID_GRADES; i++, dest += 256, source += 256) { - if (top < 128) // the artists made some backwards ranges. - 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]; - } - } - break; - case 2: - { - unsigned short *source; - unsigned short *dest = (unsigned short *) _dest; - - source = vid.colormap16; - memcpy (dest, vid.colormap16, 2 * VID_GRADES * 256); - - for (i = 0; i < VID_GRADES; i++, dest += 256, source += 256) { - if (top < 128) - { - for (j = 0; j < 16; j++) - dest[TOP_RANGE + j] = source[top + j]; - } - else - { - for (j = 0; j < 16; j++) - dest[TOP_RANGE + j] = source[top + 15 - j]; - } - - if (bottom < 128) - { - for (j = 0; j < 16; j++) - dest[BOTTOM_RANGE + j] = source[bottom + j]; - } - else - { - for (j = 0; j < 16; j++) - dest[BOTTOM_RANGE + j] = source[bottom + 15 - j]; - } - } - } - break; - case 4: - { - unsigned int *source; - unsigned int *dest = (unsigned int *) _dest; - - source = vid.colormap32; - memcpy (dest, vid.colormap32, 4 * VID_GRADES * 256); - - for (i = 0; i < VID_GRADES; i++, dest += 256, source += 256) { - if (top < 128) - { - for (j = 0; j < 16; j++) - dest[TOP_RANGE + j] = source[top + j]; - } - else - { - for (j = 0; j < 16; j++) - dest[TOP_RANGE + j] = source[top + 15 - j]; - } - - if (bottom < 128) - { - for (j = 0; j < 16; j++) - dest[BOTTOM_RANGE + j] = source[bottom + j]; - } - else - { - for (j = 0; j < 16; j++) - dest[BOTTOM_RANGE + j] = source[bottom + 15 - j]; - } - } - } - break; - default: - Sys_Error("Skin_Set_Translate: unsupported r_pixbytes %i", - r_pixbytes); - } -/* - dest2 = (byte *) _dest; - - for (j = 0;j < 256;j++) - dest2[j] = d_8to24table[j]; - - if (top < 128) { - for (j = 0;j < 16;j++) - dest2[TOP_RANGE + j] = d_8to24table[top + j]; - } else { - for (j = 0; j < 16; j++) - dest2[TOP_RANGE + j] = d_8to24table[top + 15 - j]; - } - - if (bottom < 128) { - for (j = 0;j < 16;j++) - dest2[BOTTOM_RANGE + j] = d_8to24table[bottom + j]; - } else { - for (j = 0; j < 16; j++) - dest2[BOTTOM_RANGE + j] = d_8to24table[bottom + 15 - j]; - } -*/ -} - -VISIBLE void -Skin_Do_Translation (skin_t *player_skin, int slot, skin_t *skin) -{ -} - - -VISIBLE void -Skin_Do_Translation_Model (model_t *model, int skinnum, int slot, skin_t *skin) -{ -} - - -VISIBLE void -Skin_Player_Model (model_t *model) -{ -} - -VISIBLE void -Skin_Init_Translation (void) -{ -} - - -VISIBLE void -Skin_Process (skin_t *skin, struct tex_s *tex) -{ -} diff --git a/nq/include/client.h b/nq/include/client.h index 5690f92cc..aa0965f8e 100644 --- a/nq/include/client.h +++ b/nq/include/client.h @@ -61,7 +61,6 @@ typedef struct int frags; int colors; // two 4 bit fields int _colors; - byte translations[4*VID_GRADES*256]; // space for colormap32 } scoreboard_t; #define NAME_LENGTH 64 diff --git a/nq/source/Makefile.am b/nq/source/Makefile.am index a3bbd8236..d9e5e025b 100644 --- a/nq/source/Makefile.am +++ b/nq/source/Makefile.am @@ -77,8 +77,7 @@ server_LIB_DEPS=$(server_LIBFILES) $(common_LIBFILES) libnq_client_a_SOURCES= \ cl_cam.c cl_cmd.c cl_demo.c cl_ents.c cl_input.c cl_main.c \ - cl_screen.c cl_parse.c cl_skin.c cl_tent.c cl_view.c skin.c \ - sbar.c + cl_screen.c cl_parse.c cl_tent.c cl_view.c sbar.c libnq_server_a_SOURCES= \ host.c host_cmd.c sv_cl_phys.c sv_cvar.c sv_main.c \ diff --git a/nq/source/cl_main.c b/nq/source/cl_main.c index 6fe834814..f79bb790b 100644 --- a/nq/source/cl_main.c +++ b/nq/source/cl_main.c @@ -64,6 +64,7 @@ byte *vid_colormap; // these two are not intended to be set directly cvar_t *cl_name; +cvar_t *cl_color; cvar_t *cl_writecfg; @@ -131,7 +132,6 @@ void CL_InitCvars (void) { Chase_Init_Cvars (); - CL_Skin_Init_Cvars (); IN_Init_Cvars (); VID_Init_Cvars (); S_Init_Cvars (); @@ -212,8 +212,6 @@ CL_ClearState (void) SZ_Clear (&cls.message); - Skin_ClearTempSkins (); - CL_ClearTEnts (); R_ClearState (); @@ -529,7 +527,6 @@ CL_Init (cbuf_t *cbuf) IN_Init (); CL_SetState (ca_disconnected); - CL_Skin_Init (); SZ_Alloc (&cls.message, 1024); CL_Input_Init (); diff --git a/nq/source/cl_parse.c b/nq/source/cl_parse.c index 1876b2af6..ad96e8a0c 100644 --- a/nq/source/cl_parse.c +++ b/nq/source/cl_parse.c @@ -155,7 +155,6 @@ CL_EntityNum (int num) while (cl.num_entities <= num) { cl_baselines[cl.num_entities].ent = &cl_entities[cl.num_entities]; - cl_entities[cl.num_entities].colormap = vid.colormap8; cl.num_entities++; } } @@ -523,13 +522,9 @@ CL_ParseUpdate (int bits) i = MSG_ReadByte (net_message); else i = state->baseline.colormap; - if (!i) - ent->colormap = vid.colormap8; - else { - if (i > cl.maxclients) - Sys_Error ("i >= cl.maxclients"); - ent->colormap = cl.scores[i - 1].translations; - } + if (i > cl.maxclients) + Sys_Error ("i > cl.maxclients"); + ent->skin = Skin_SetColormap (ent->skin, i); if (bits & U_SKIN) skin = MSG_ReadByte (net_message); @@ -537,11 +532,10 @@ CL_ParseUpdate (int bits) skin = state->baseline.skin; if (skin != ent->skinnum) { ent->skinnum = skin; - if (num > 0 && num <= cl.maxclients) { - if (!ent->skin) - ent->skin = Skin_NewTempSkin (); - if (ent->skin) - CL_NewTranslation (num - 1, ent->skin); + if (num <= cl.maxclients) { + ent->skin = Skin_SetColormap (ent->skin, num); + Skin_SetTranslation (num, cl.scores[num].colors >> 4, + cl.scores[num].colors & 0xf); } } @@ -617,10 +611,9 @@ CL_ParseUpdate (int bits) } else forcelink = true; // hack to make null model players work if (num > 0 && num <= cl.maxclients) { - if (!ent->skin) - ent->skin = Skin_NewTempSkin (); - if (ent->skin) - CL_NewTranslation (num - 1, ent->skin); + ent->skin = Skin_SetColormap (ent->skin, num); + Skin_SetTranslation (num, cl.scores[num].colors >> 4, + cl.scores[num].colors & 0xf); } } @@ -824,7 +817,7 @@ CL_ParseStatic (int version) //FIXME alpha & lerp ent->model = cl.model_precache[state.baseline.modelindex]; ent->frame = state.baseline.frame; - ent->colormap = vid.colormap8; + ent->skin = 0; ent->skinnum = state.baseline.skin; if (state.baseline.colormod == 255) { ent->colormod[0] = ent->colormod[1] = ent->colormod[2] = 1.0; @@ -1028,10 +1021,9 @@ CL_ParseServerMessage (void) } else { entity_t *ent = &cl_entities[i+1]; cl.scores[i].colors = MSG_ReadByte (net_message); - if (!ent->skin) - ent->skin = Skin_NewTempSkin (); - if (ent->skin) - CL_NewTranslation (i, ent->skin); + ent->skin = Skin_SetColormap (ent->skin, i); + Skin_SetTranslation (i, cl.scores[i].colors >> 4, + cl.scores[i].colors & 0xf); } break; diff --git a/nq/source/cl_skin.c b/nq/source/cl_skin.c deleted file mode 100644 index 66f470a4d..000000000 --- a/nq/source/cl_skin.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - skin.c - - (description) - - Copyright (C) 1996-1997 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static __attribute__ ((used)) const char rcsid[] = - "$Id$"; - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "QF/cmd.h" -#include "QF/cvar.h" -#include "QF/msg.h" -#include "QF/screen.h" -#include "QF/skin.h" -#include "QF/sys.h" -#include "QF/va.h" - -#include "compat.h" -#include "cl_skin.h" -#include "client.h" -#include "server.h" - -cvar_t *noskins; //XXX FIXME -cvar_t *skin; -cvar_t *topcolor; -cvar_t *bottomcolor; -cvar_t *cl_color; - - - -static void -CL_Color_f (void) -{ - int top, bottom; - char playercolor; - - if (Cmd_Argc () == 1) { - Sys_Printf ("\"color\" is \"%d %d\"\n", (cl_color->int_val) >> 4, - (cl_color->int_val) & 0x0f); - Sys_Printf ("color <0-13> [0-13]\n"); - return; - } - - if (Cmd_Argc () == 2) - top = bottom = atoi (Cmd_Argv (1)); - else { - top = atoi (Cmd_Argv (1)); - bottom = atoi (Cmd_Argv (2)); - } - - top = min (top & 15, 13); - bottom = min (bottom & 15, 13); - - playercolor = top * 16 + bottom; - - if (cmd_source == src_command) { - Cvar_SetValue (cl_color, playercolor); - if (cls.state == ca_connected) - CL_Cmd_ForwardToServer (); - return; - } - - host_client->colors = playercolor; - SVfloat (host_client->edict, team) = bottom + 1; - - // send notification to all clients - MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors); - MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients); - MSG_WriteByte (&sv.reliable_datagram, host_client->colors); -} - - -void -CL_Skin_Init (void) -{ - Skin_Init (); - Cmd_AddCommand ("color", CL_Color_f, "The pant and shirt color (color " - "shirt pants) Note that if only shirt color is given, " - "pants will match"); -} - - -void -CL_Skin_Init_Cvars (void) -{ - Skin_Init_Cvars (); - cl_color = Cvar_Get ("_cl_color", "0", CVAR_ARCHIVE, NULL, "Player color"); -} - - -void -CL_NewTranslation (int slot, skin_t *skin) -{ - scoreboard_t *player; - int top, bottom; - byte *dest; - model_t *model; - cl_entity_state_t *state; - int skinnum; - - if (slot > cl.maxclients) - Sys_Error ("CL_NewTranslation: slot > cl.maxclients"); - - player = &cl.scores[slot]; - dest = player->translations; - top = (player->colors & 0xf0) >> 4; - bottom = player->colors & 15; - state = &cl_baselines[1 + slot]; - model = state->ent->model; - skinnum = state->ent->skinnum; - - memset (skin, 0, sizeof (*skin)); //XXX external skins not yet supported - - if (!model) - return; - - skin->texture = skin_textures + slot; //FIXME - skin->data.texels = 0; //FIXME - - if (player->colors == player->_colors - && model == state->model - && skinnum == state->skinnum) - return; - - player->_colors = player->colors; - state->model = model; - state->skinnum = skinnum; - - Skin_Set_Translate (top, bottom, dest); - Skin_Do_Translation_Model (model, skinnum, slot, skin); -} diff --git a/nq/source/cl_tent.c b/nq/source/cl_tent.c index f5cced8c0..69b203b7e 100644 --- a/nq/source/cl_tent.c +++ b/nq/source/cl_tent.c @@ -135,7 +135,7 @@ CL_Init_Entity (entity_t *ent) { memset (ent, 0, sizeof (*ent)); - ent->colormap = vid.colormap8; + ent->skin = 0; QuatSet (1.0, 1.0, 1.0, 1.0, ent->colormod); ent->scale = 1.0; ent->pose1 = ent->pose2 = -1; diff --git a/nq/source/cl_view.c b/nq/source/cl_view.c index e3304f247..cfb8fa43b 100644 --- a/nq/source/cl_view.c +++ b/nq/source/cl_view.c @@ -666,7 +666,7 @@ V_CalcRefdef (void) view->model = cl.model_precache[cl.stats[STAT_WEAPON]]; view->frame = cl.stats[STAT_WEAPONFRAME]; - view->colormap = vid.colormap8; + view->skin = 0; // set up the refresh position VectorAdd (r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); diff --git a/qw/include/cl_skin.h b/qw/include/cl_skin.h index e14c43e9b..26c4a09ae 100644 --- a/qw/include/cl_skin.h +++ b/qw/include/cl_skin.h @@ -26,16 +26,10 @@ $Id$ */ -#ifndef _CL_SKIN_H -#define _CL_SKIN_H +#ifndef __cl_skin_h +#define __cl_skin_h -#include "QF/qtypes.h" -#include "QF/skin.h" - -void CL_Skins_f (void); -void CL_AllSkins_f (void); void Skin_NextDownload (void); void CL_Skin_Init (void); -void CL_Skin_Init_Cvars (void); -#endif +#endif//__cl_skin_h diff --git a/qw/include/client.h b/qw/include/client.h index e10db48f6..28884ec52 100644 --- a/qw/include/client.h +++ b/qw/include/client.h @@ -86,9 +86,6 @@ typedef struct player_info_s int _bottomcolor; int spectator; - byte translations[4*VID_GRADES*256]; // space for colormap32 - int translationcolor[256]; - struct skin_s *skin; int stats[MAX_CL_STATS]; // health, etc int prevcount; } player_info_t; diff --git a/qw/source/Makefile.am b/qw/source/Makefile.am index b05c86da4..d7e6105ed 100644 --- a/qw/source/Makefile.am +++ b/qw/source/Makefile.am @@ -110,7 +110,7 @@ libqw_client_a_SOURCES= \ cl_cam.c cl_chat.c cl_cmd.c cl_cvar.c cl_demo.c cl_entparse.c \ cl_ents.c cl_http.c cl_input.c cl_main.c cl_ngraph.c cl_parse.c \ cl_pred.c cl_screen.c cl_skin.c cl_slist.c cl_tent.c cl_view.c \ - locs.c sbar.c skin.c teamplay.c + locs.c sbar.c teamplay.c # Software-rendering clients diff --git a/qw/source/cl_ents.c b/qw/source/cl_ents.c index 87294cd78..ca5bd0a72 100644 --- a/qw/source/cl_ents.c +++ b/qw/source/cl_ents.c @@ -202,13 +202,13 @@ CL_TransformEntity (entity_t *ent, const vec3_t angles, qboolean force) static void CL_LinkPacketEntities (void) { - int pnum, i; + int pnum; dlight_t *dl; entity_t *ent; entity_state_t *s1; model_t *model; packet_entities_t *pack; - player_info_t *info; + //player_info_t *info; pack = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK].packet_entities; @@ -246,25 +246,24 @@ CL_LinkPacketEntities (void) if (s1->colormap && (s1->colormap <= MAX_CLIENTS) && cl.players[s1->colormap - 1].name[0] && !strcmp (ent->model->name, "progs/player.mdl")) { - ent->colormap = cl.players[s1->colormap - 1].translations; - info = &cl.players[s1->colormap - 1]; + ent->skin = Skin_SetColormap (ent->skin, s1->colormap); + //info = &cl.players[s1->colormap - 1]; } else { - ent->colormap = vid.colormap8; - info = NULL; + ent->skin = Skin_SetColormap (ent->skin, 0); + //info = NULL; } - +#if 0 //XXX if (info && info->skinname && !info->skin) Skin_Find (info); if (info && info->skin) { ent->skin = Skin_NewTempSkin (); if (ent->skin) { - i = s1->colormap - 1; - CL_NewTranslation (i, ent->skin); + CL_NewTranslation (s1->colormap - 1, ent->skin); } } else { ent->skin = NULL; } - +#endif // LordHavoc: cleaned up Endy's coding style, and fixed Endy's bugs // Ender: Extend (Colormod) [QSG - Begin] // N.B: All messy code below is the sole fault of LordHavoc and @@ -485,7 +484,7 @@ CL_LinkPlayers (void) ent->model = cl.model_precache[state->pls.modelindex]; ent->frame = state->pls.frame; - ent->colormap = info->translations; + ent->skin = Skin_SetColormap (ent->skin, j + 1); ent->skinnum = state->pls.skinnum; CL_TransformEntity (ent, ang, false); @@ -495,6 +494,7 @@ CL_LinkPlayers (void) if (state->pls.modelindex == cl_playerindex) { //XXX // use custom skin +#if 0 if (!info->skin) Skin_Find (info); if (info && info->skin) { @@ -505,7 +505,7 @@ CL_LinkPlayers (void) } else { ent->skin = NULL; } - +#endif ent->min_light = min (cl.fbskins, cl_fb_players->value); if (ent->min_light >= 1.0) @@ -539,8 +539,6 @@ CL_EmitEntities (void) if (!cl.validsequence) return; - Skin_ClearTempSkins (); - CL_LinkPlayers (); CL_LinkPacketEntities (); CL_UpdateTEnts (); diff --git a/qw/source/cl_main.c b/qw/source/cl_main.c index 61d4c67dc..dfefb4762 100644 --- a/qw/source/cl_main.c +++ b/qw/source/cl_main.c @@ -1741,7 +1741,6 @@ Host_Init (void) CL_Cam_Init_Cvars (); CL_Input_Init_Cvars (); - CL_Skin_Init_Cvars (); CL_Init_Cvars (); CL_Prediction_Init_Cvars (); Game_Init_Cvars (); diff --git a/qw/source/cl_parse.c b/qw/source/cl_parse.c index b62ea3429..b18548494 100644 --- a/qw/source/cl_parse.c +++ b/qw/source/cl_parse.c @@ -59,6 +59,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "QF/qfplist.h" #include "QF/quakeio.h" #include "QF/screen.h" +#include "QF/skin.h" #include "QF/sound.h" #include "QF/sys.h" #include "QF/teamplay.h" @@ -365,7 +366,7 @@ Model_NextDownload (void) if (strequal (cl.model_name[i], "progs/player.mdl") && cl.model_precache[i]->type == mod_alias) { info_key = pmodel_name; - Skin_Player_Model (cl.model_precache[i]); + //XXX Skin_Player_Model (cl.model_precache[i]); } if (strequal (cl.model_name[i], "progs/eyes.mdl") && cl.model_precache[i]->type == mod_alias) @@ -1111,8 +1112,8 @@ CL_ProcessUserInfo (int slot, player_info_t *player) else player->spectator = false; - if (cls.state == ca_active) - Skin_Find (player); + //XXX if (cls.state == ca_active) + //XXX Skin_Find (player); Sbar_Changed (); } diff --git a/qw/source/cl_skin.c b/qw/source/cl_skin.c index 936732532..ebb9295f8 100644 --- a/qw/source/cl_skin.c +++ b/qw/source/cl_skin.c @@ -76,11 +76,11 @@ Skin_NextDownload (void) sc = &cl.players[cls.downloadnumber]; if (!sc->name[0]) continue; - Skin_Find (sc); + //XXX Skin_Find (sc); if (noskins->int_val) //XXX FIXME continue; - if (!CL_CheckOrDownloadFile (va ("skins/%s.pcx", sc->skin->name))) - return; // started a download + //XXX if (!CL_CheckOrDownloadFile (va ("skins/%s.pcx", sc->skin->name))) + //XXX return; // started a download } cls.downloadtype = dl_none; @@ -90,9 +90,9 @@ Skin_NextDownload (void) sc = &cl.players[i]; if (!sc->name[0]) continue; - Skin_Find (sc); - Skin_Cache (sc->skin); - sc->skin = NULL; + //XXX Skin_Find (sc); + //XXX Skin_Cache (sc->skin); + //XXX sc->skin = NULL; } if (cls.state != ca_active) { @@ -112,10 +112,10 @@ Skin_NextDownload (void) Refind all skins, downloading if needed. */ -void +static void CL_Skins_f (void) { - Skin_Flush (); + //XXX Skin_Flush (); if (cls.state == ca_disconnected) return; @@ -130,14 +130,14 @@ CL_Skins_f (void) Sets all skins to one specific one */ -void +static void CL_AllSkins_f (void) { if (Cmd_Argc () == 2) { - strcpy (allskins, Cmd_Argv (1)); + //XXX strcpy (allskins, Cmd_Argv (1)); } else if (Cmd_Argc () == 1) { Sys_Printf ("clearing allskins\n"); - allskins[0] = 0; + //XXX allskins[0] = 0; } else { Sys_Printf ("Usage: allskins [name]\n"); return; @@ -180,19 +180,6 @@ CL_Color_f (void) Cvar_Set (bottomcolor, num); } -void -CL_Skin_Init (void) -{ - Skin_Init (); - Cmd_AddCommand ("skins", CL_Skins_f, "Download all skins that are " - "currently in use"); - Cmd_AddCommand ("allskins", CL_AllSkins_f, "Force all player skins to " - "one skin"); - Cmd_AddCommand ("color", CL_Color_f, "The pant and shirt color (color " - "shirt pants) Note that if only shirt color is given, " - "pants will match"); -} - static void skin_f (cvar_t *var) { @@ -203,9 +190,18 @@ skin_f (cvar_t *var) } void -CL_Skin_Init_Cvars (void) +CL_Skin_Init (void) { - Skin_Init_Cvars (); + //Skin_Init (); + //Skin_Init_Cvars (); + Cmd_AddCommand ("skins", CL_Skins_f, "Download all skins that are " + "currently in use"); + Cmd_AddCommand ("allskins", CL_AllSkins_f, "Force all player skins to " + "one skin"); + Cmd_AddCommand ("color", CL_Color_f, "The pant and shirt color (color " + "shirt pants) Note that if only shirt color is given, " + "pants will match"); + noskins = Cvar_Get ("noskins", "0", CVAR_ARCHIVE, NULL, //XXX FIXME "set to 1 to not download new skins"); skin = Cvar_Get ("skin", "", CVAR_ARCHIVE | CVAR_USERINFO, skin_f, @@ -215,39 +211,3 @@ CL_Skin_Init_Cvars (void) bottomcolor = Cvar_Get ("bottomcolor", "0", CVAR_ARCHIVE | CVAR_USERINFO, Cvar_Info, "Players color on bottom"); } - -void -CL_NewTranslation (int slot, skin_t *skin) -{ - player_info_t *player; - - if (slot > MAX_CLIENTS) - Host_Error ("CL_NewTranslation: slot > MAX_CLIENTS"); - - player = &cl.players[slot]; - if (!player->name[0]) - return; - - if (player->skin && !strequal (player->skinname->value, player->skin->name)) - player->skin = NULL; - - if (player->_topcolor != player->topcolor || - player->_bottomcolor != player->bottomcolor || !player->skin) { - player->_topcolor = player->topcolor; - player->_bottomcolor = player->bottomcolor; - Skin_Set_Translate (player->topcolor, player->bottomcolor, - player->translations); - if (!player->skin) - Skin_Find (player); - memcpy (skin, player->skin, sizeof (*skin)); - skin->texture = skin_textures + slot; // FIXME - skin->data.texels = Skin_Cache (player->skin); - // FIXME: breaks cache ownership - Skin_Do_Translation (player->skin, slot, skin); - } else { - memcpy (skin, player->skin, sizeof (*skin)); - skin->texture = skin_textures + slot; // FIXME - skin->data.texels = Skin_Cache (player->skin); - // FIXME: breaks cache ownership - } -} diff --git a/qw/source/cl_tent.c b/qw/source/cl_tent.c index dbd7093fe..76da8994d 100644 --- a/qw/source/cl_tent.c +++ b/qw/source/cl_tent.c @@ -141,7 +141,7 @@ CL_Init_Entity (entity_t *ent) { memset (ent, 0, sizeof (*ent)); - ent->colormap = vid.colormap8; + ent->skin = 0; QuatSet (1.0, 1.0, 1.0, 1.0, ent->colormod); ent->scale = 1.0; ent->pose1 = ent->pose2 = -1; @@ -642,7 +642,7 @@ CL_ParseProjectiles (qboolean nail2) pr = &tent->ent; pr->model = cl.model_precache[cl_spikeindex]; - pr->colormap = vid.colormap8; + pr->skin = 0; pr->origin[0] = ((bits[0] + ((bits[1] & 15) << 8)) << 1) - 4096; pr->origin[1] = (((bits[1] >> 4) + (bits[2] << 4)) << 1) - 4096; pr->origin[2] = ((bits[3] + ((bits[4] & 15) << 8)) << 1) - 4096; diff --git a/qw/source/cl_view.c b/qw/source/cl_view.c index 55b625318..1908311bf 100644 --- a/qw/source/cl_view.c +++ b/qw/source/cl_view.c @@ -671,7 +671,7 @@ V_CalcRefdef (void) else view->model = cl.model_precache[cl.stats[STAT_WEAPON]]; view->frame = view_message->pls.weaponframe; - view->colormap = vid.colormap8; + view->skin = 0; // set up the refresh position r_refdef.viewangles[PITCH] += cl.punchangle; diff --git a/qw/source/skin.c b/qw/source/skin.c deleted file mode 100644 index 8f3d96614..000000000 --- a/qw/source/skin.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - skin.c - - (description) - - Copyright (C) 1996-1997 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: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA - -*/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static __attribute__ ((used)) const char rcsid[] = - "$Id$"; - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "QF/cvar.h" -#include "QF/hash.h" -#include "QF/image.h" -#include "QF/pcx.h" -#include "QF/quakefs.h" -#include "QF/skin.h" -#include "QF/sys.h" - -#include "client.h" -#include "compat.h" -#include "skin_stencil.h" - -#define MAX_TEMP_SKINS 64 //XXX dynamic? - -extern cvar_t *noskins; //FIXME shouldn't be here - -cvar_t *baseskin; - -char allskins[128]; - -skin_t skin_cache[MAX_CACHED_SKINS]; -static hashtab_t *skin_hash; -static int numskins; -static skin_t temp_skins[MAX_TEMP_SKINS]; -static int num_temp_skins; -static int fullfb; - -int skin_textures; -int skin_fb_textures; - -static const char * -skin_get_key (void *_skin, void *unused) -{ - skin_t *skin = (skin_t*)_skin; - return skin->name; -} - - -/* - Skin_Find - - Determines the best skin for the given scoreboard - slot, and sets scoreboard->skin -*/ -void -Skin_Find (player_info_t *sc) -{ - skin_t *skin; - char name[128]; - const char *s = NULL; - - if (allskins[0]) { - strncpy (name, allskins, sizeof (name)); - } else { - if ((s = sc->skinname->value) && s[0]) - strncpy (name, s, sizeof (name)); - else - strncpy (name, baseskin->string, sizeof (name)); - } - - if (strstr (name, "..") || *name == '.') - strcpy (name, "base"); - - if (!allskins[0] && (!s || !strcaseequal (name, s))) - Info_SetValueForKey (sc->userinfo, "skin", name, 1); - - QFS_StripExtension (name, name); - - skin = Hash_Find (skin_hash, name); - if (skin) { - sc->skin = skin; - Skin_Cache (sc->skin); - return; - } - - if (numskins == MAX_CACHED_SKINS) { - // ran out of spots, so flush everything - Skin_Flush (); - return; - } - - skin = &skin_cache[numskins]; - sc->skin = skin; - numskins++; - - memset (skin, 0, sizeof (*skin)); - strncpy (skin->name, name, sizeof (skin->name) - 1); - - Hash_Add (skin_hash, skin); -} - -/* - Skin_Cache - - Returns a pointer to the skin bitmap, or NULL to use the default -*/ -tex_t * -Skin_Cache (skin_t *skin) -{ - char name[1024]; - tex_t *out; - QFile *file; - tex_t *tex; - int pixels; - byte *ipix, *opix; - int i, numfb; - - if (cls.downloadtype == dl_skin) // use base until downloaded - return NULL; - // NOSKINS > 1 will show skins, but not download new ones. - if (noskins->int_val == 1) //XXX FIXME - return NULL; - - if (skin->failedload) - return NULL; - - out = Cache_Check (&skin->data.cache); - if (out) - return out; - - // load the pic from disk - snprintf (name, sizeof (name), "skins/%s.pcx", skin->name); - QFS_FOpenFile (name, &file); - if (!file) { - Sys_Printf ("Couldn't load skin %s\n", name); - snprintf (name, sizeof (name), "skins/%s.pcx", baseskin->string); - QFS_FOpenFile (name, &file); - if (!file) { - skin->failedload = true; - return NULL; - } - } - - pixels = 320 * 200; - out = Cache_Alloc (&skin->data.cache, field_offset (tex_t, data[pixels]), - skin->name); - if (!out) - Sys_Error ("Skin_Cache: couldn't allocate"); - - tex = LoadPCX (file, 0, vid.palette); - Qclose (file); - - if (!tex || tex->width > 320 || tex->height > 200) { - skin->failedload = true; - Sys_Printf ("Bad skin %s\n", name); - return NULL; - } - - opix = out->data; - out->width = 320; - out->height = 200; - out->palette = tex->palette; //FIXME assumes 0 or vid.palette - memset (opix, 0, pixels); - for (i = 0, ipix = tex->data; i < tex->height; - i++, opix += 320, ipix += tex->width) - memcpy (opix, ipix, tex->width); - - Skin_Process (skin, out); - - skin->failedload = false; - - for (i = 0,numfb = 0; i < 320*200; i++) - if (skin_stencil[i] && out->data[i] >= 256 - 32) - numfb++; - skin->numfb = numfb; - return out; -} - - -void -Skin_Flush (void) -{ - int i; - - for (i = 0; i < numskins; i++) { - if (skin_cache[i].data.cache.data) - Cache_Free (&skin_cache[i].data.cache); - } - numskins = 0; - Hash_FlushTable (skin_hash); -} - -skin_t * -Skin_NewTempSkin (void) -{ - if (num_temp_skins == MAX_TEMP_SKINS) - return 0; // ran out - return &temp_skins[num_temp_skins++]; -} - -void -Skin_ClearTempSkins (void) -{ - num_temp_skins = 0; -} - - -int -Skin_Init_Textures (int base) -{ - skin_textures = base; - base += MAX_TEMP_SKINS; - skin_fb_textures = base; - base += MAX_TEMP_SKINS; - return base; -} - - -void -Skin_Init (void) -{ - int i; - - skin_hash = Hash_NewTable (1021, skin_get_key, 0, 0); - Skin_Init_Translation (); - for (i = 0, fullfb = 0; i < 320*200; i++) - fullfb += skin_stencil[i]; -} - - -void -Skin_Init_Cvars (void) -{ - baseskin = Cvar_Get ("baseskin", "base", CVAR_NONE, NULL, - "default base skin name"); -} - -int -Skin_FbPercent (const char *skin_name) -{ - int i, totalfb = 0; - skin_t *skin = 0; - - if (skin_name) { - skin = Hash_Find (skin_hash, skin_name); - if (skin) - return skin->numfb * 1000 / fullfb; - return -1; - } - for (i = 0; i < numskins; i++) - totalfb += skin_cache[i].numfb; - return totalfb * 1000 / (numskins * fullfb); -} diff --git a/qw/source/teamplay.c b/qw/source/teamplay.c index 44294de8c..21c3c3f6f 100644 --- a/qw/source/teamplay.c +++ b/qw/source/teamplay.c @@ -160,6 +160,7 @@ Team_ParseSay (const char *s) case 'S': bracket = 0; t1 = skin->string; + t1 = "FIXME"; break; case 'd': bracket = 0; @@ -451,13 +452,15 @@ Team_F_Skins (char *args) for (l = 0; args[l] && !isspace ((byte) args[l]); l++); if (l == 0) { - totalfb = Skin_FbPercent (0); + //XXXtotalfb = Skin_FbPercent (0); + totalfb = 0; return va ("say Player models have %f%% brightness\n" "say Average percent fullbright for all loaded skins is " "%d.%d%%", allfb * 100, totalfb / 10, totalfb % 10); } - totalfb = Skin_FbPercent (args); + //XXX totalfb = Skin_FbPercent (args); + totalfb = 0; if (totalfb >= 0) return va ("say \"Skin %s is %d.%d%% fullbright\"", args, totalfb / 10,