diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index 8b30a3468..2cfb43a96 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -74,6 +74,8 @@ typedef struct gl_vissprite_s float spritexscale, spriteyscale; float spritexoffset, spriteyoffset; + skincolornum_t color; + UINT32 renderflags; UINT8 rotateflags; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index a6b08812b..4400c5476 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5370,6 +5370,10 @@ static void HWR_ProjectSprite(mobj_t *thing) vis->gpatch = (patch_t *)W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE); vis->mobj = thing; + if ((thing->flags2 & MF2_LINKDRAW) && thing->tracer && thing->color == SKINCOLOR_NONE) + vis->color = thing->tracer->color; + else + vis->color = thing->color; //Hurdler: 25/04/2000: now support colormap in hardware mode if ((vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash" @@ -5379,13 +5383,13 @@ static void HWR_ProjectSprite(mobj_t *thing) else if (vis->mobj->type == MT_METALSONIC_BATTLE) vis->colormap = R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE); else - vis->colormap = R_GetTranslationColormap(TC_BOSS, vis->mobj->color, GTC_CACHE); + vis->colormap = R_GetTranslationColormap(TC_BOSS, vis->color, GTC_CACHE); } - else if (thing->color) + else if (vis->color) { // New colormap stuff for skins Tails 06-07-2002 if (thing->colorized) - vis->colormap = R_GetTranslationColormap(TC_RAINBOW, thing->color, GTC_CACHE); + vis->colormap = R_GetTranslationColormap(TC_RAINBOW, vis->color, GTC_CACHE); else if (thing->player && thing->player->dashmode >= DASHMODE_THRESHOLD && (thing->player->charflags & SF_DASHMODE) && ((leveltime/2) & 1)) @@ -5393,15 +5397,15 @@ static void HWR_ProjectSprite(mobj_t *thing) if (thing->player->charflags & SF_MACHINE) vis->colormap = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); else - vis->colormap = R_GetTranslationColormap(TC_RAINBOW, thing->color, GTC_CACHE); + vis->colormap = R_GetTranslationColormap(TC_RAINBOW, vis->color, GTC_CACHE); } else if (thing->skin && thing->sprite == SPR_PLAY) // This thing is a player! { size_t skinnum = (skin_t*)thing->skin-skins; - vis->colormap = R_GetTranslationColormap((INT32)skinnum, thing->color, GTC_CACHE); + vis->colormap = R_GetTranslationColormap((INT32)skinnum, vis->color, GTC_CACHE); } else - vis->colormap = R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); + vis->colormap = R_GetTranslationColormap(TC_DEFAULT, vis->color ? vis->color : SKINCOLOR_CYAN, GTC_CACHE); } else vis->colormap = NULL; @@ -5511,6 +5515,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) vis->gpatch = (patch_t *)W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE); vis->flip = flip; vis->mobj = (mobj_t *)thing; + vis->color = SKINCOLOR_NONE; vis->colormap = NULL; diff --git a/src/r_things.c b/src/r_things.c index db4263a6a..343a80f95 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -754,13 +754,13 @@ UINT8 *R_GetSpriteTranslation(vissprite_t *vis) else if (vis->mobj->type == MT_METALSONIC_BATTLE) return R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE); else - return R_GetTranslationColormap(TC_BOSS, vis->mobj->color, GTC_CACHE); + return R_GetTranslationColormap(TC_BOSS, vis->color, GTC_CACHE); } - else if (vis->mobj->color) + else if (vis->color) { // New colormap stuff for skins Tails 06-07-2002 if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) - return R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); + return R_GetTranslationColormap(TC_RAINBOW, vis->color, GTC_CACHE); else if (!(vis->cut & SC_PRECIP) && vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD && (vis->mobj->player->charflags & SF_DASHMODE) @@ -769,15 +769,15 @@ UINT8 *R_GetSpriteTranslation(vissprite_t *vis) if (vis->mobj->player->charflags & SF_MACHINE) return R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); else - return R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); + return R_GetTranslationColormap(TC_RAINBOW, vis->color, GTC_CACHE); } else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! { size_t skinnum = (skin_t*)vis->mobj->skin-skins; - return R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE); + return R_GetTranslationColormap((INT32)skinnum, vis->color, GTC_CACHE); } else // Use the defaults - return R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color, GTC_CACHE); + return R_GetTranslationColormap(TC_DEFAULT, vis->color, GTC_CACHE); } else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome. return R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE); @@ -822,7 +822,7 @@ static void R_DrawVisSprite(vissprite_t *vis) if (R_SpriteIsFlashing(vis)) // Bosses "flash" colfunc = colfuncs[COLDRAWFUNC_TRANS]; // translate certain pixels to white - else if (vis->mobj->color && vis->transmap) // Color mapping + else if (vis->color && vis->transmap) // Color mapping { colfunc = colfuncs[COLDRAWFUNC_TRANSTRANS]; dc_transmap = vis->transmap; @@ -832,7 +832,7 @@ static void R_DrawVisSprite(vissprite_t *vis) colfunc = colfuncs[COLDRAWFUNC_FUZZY]; dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table } - else if (vis->mobj->color) // translate green skin to another color + else if (vis->color) // translate green skin to another color colfunc = colfuncs[COLDRAWFUNC_TRANS]; else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome. colfunc = colfuncs[COLDRAWFUNC_TRANS]; @@ -1356,6 +1356,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, shadow->shear.tan = shadowskew; // repurposed variable shadow->mobj = thing; // Easy access! Tails 06-07-2002 + shadow->color = thing->color; shadow->x1 = x1 < portalclipstart ? portalclipstart : x1; shadow->x2 = x2 >= portalclipend ? portalclipend-1 : x2; @@ -2015,6 +2016,10 @@ static void R_ProjectSprite(mobj_t *thing) vis->viewpoint.angle = viewangle; vis->mobj = thing; // Easy access! Tails 06-07-2002 + if ((oldthing->flags2 & MF2_LINKDRAW) && oldthing->tracer && oldthing->color == SKINCOLOR_NONE) + vis->color = oldthing->tracer->color; + else + vis->color = oldthing->color; vis->x1 = x1 < portalclipstart ? portalclipstart : x1; vis->x2 = x2 >= portalclipend ? portalclipend-1 : x2; @@ -2268,6 +2273,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) vis->cut = SC_PRECIP; vis->extra_colormap = thing->subsector->sector->extra_colormap; vis->heightsec = thing->subsector->sector->heightsec; + vis->color = SKINCOLOR_NONE; // Fullbright vis->colormap = colormaps; diff --git a/src/r_things.h b/src/r_things.h index 857b03b24..f0a5751e8 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -207,6 +207,8 @@ typedef struct vissprite_s fixed_t shadowscale; + skincolornum_t color; + INT16 clipbot[MAXVIDWIDTH], cliptop[MAXVIDWIDTH]; INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing