Merge branch 'software-dropshadows' into 'next'
Software dropshadows See merge request STJr/SRB2!660
This commit is contained in:
commit
9a1cb0e30e
|
@ -88,7 +88,8 @@ enum mobj_e {
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
mobj_standingslope,
|
mobj_standingslope,
|
||||||
#endif
|
#endif
|
||||||
mobj_colorized
|
mobj_colorized,
|
||||||
|
mobj_shadowscale
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const mobj_opt[] = {
|
static const char *const mobj_opt[] = {
|
||||||
|
@ -156,6 +157,7 @@ static const char *const mobj_opt[] = {
|
||||||
"standingslope",
|
"standingslope",
|
||||||
#endif
|
#endif
|
||||||
"colorized",
|
"colorized",
|
||||||
|
"shadowscale",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
||||||
|
@ -390,6 +392,9 @@ static int mobj_get(lua_State *L)
|
||||||
case mobj_colorized:
|
case mobj_colorized:
|
||||||
lua_pushboolean(L, mo->colorized);
|
lua_pushboolean(L, mo->colorized);
|
||||||
break;
|
break;
|
||||||
|
case mobj_shadowscale:
|
||||||
|
lua_pushfixed(L, mo->shadowscale);
|
||||||
|
break;
|
||||||
default: // extra custom variables in Lua memory
|
default: // extra custom variables in Lua memory
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
@ -719,6 +724,9 @@ static int mobj_set(lua_State *L)
|
||||||
case mobj_colorized:
|
case mobj_colorized:
|
||||||
mo->colorized = luaL_checkboolean(L, 3);
|
mo->colorized = luaL_checkboolean(L, 3);
|
||||||
break;
|
break;
|
||||||
|
case mobj_shadowscale:
|
||||||
|
mo->shadowscale = luaL_checkfixed(L, 3);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
|
|
@ -1869,6 +1869,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
|
|
||||||
S_StartSound(toucher, special->info->deathsound); // was NULL, but changed to player so you could hear others pick up rings
|
S_StartSound(toucher, special->info->deathsound); // was NULL, but changed to player so you could hear others pick up rings
|
||||||
P_KillMobj(special, NULL, toucher, 0);
|
P_KillMobj(special, NULL, toucher, 0);
|
||||||
|
special->shadowscale = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Prints death messages relating to a dying or hit player.
|
/** Prints death messages relating to a dying or hit player.
|
||||||
|
|
20
src/p_mobj.c
20
src/p_mobj.c
|
@ -3902,11 +3902,15 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||||
mobj->z += mobj->momz;
|
mobj->z += mobj->momz;
|
||||||
P_SetThingPosition(mobj);
|
P_SetThingPosition(mobj);
|
||||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||||
|
mobj->floorz = tmfloorz;
|
||||||
|
mobj->ceilingz = tmceilingz;
|
||||||
goto animonly;
|
goto animonly;
|
||||||
}
|
}
|
||||||
else if (mobj->player->powers[pw_carry] == CR_MACESPIN)
|
else if (mobj->player->powers[pw_carry] == CR_MACESPIN)
|
||||||
{
|
{
|
||||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||||
|
mobj->floorz = tmfloorz;
|
||||||
|
mobj->ceilingz = tmceilingz;
|
||||||
goto animonly;
|
goto animonly;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10553,6 +10557,22 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
else
|
else
|
||||||
mobj->z = z;
|
mobj->z = z;
|
||||||
|
|
||||||
|
// Set shadowscale here, before spawn hook so that Lua can change it
|
||||||
|
if (
|
||||||
|
type == MT_PLAYER ||
|
||||||
|
type == MT_ROLLOUTROCK ||
|
||||||
|
type == MT_EGGMOBILE4_MACE ||
|
||||||
|
(type >= MT_SMALLMACE && type <= MT_REDSPRINGBALL) ||
|
||||||
|
(mobj->flags & (MF_ENEMY|MF_BOSS))
|
||||||
|
)
|
||||||
|
mobj->shadowscale = FRACUNIT;
|
||||||
|
else if (
|
||||||
|
type >= MT_RING && type <= MT_FLINGEMERALD && type != MT_EMERALDSPAWN
|
||||||
|
)
|
||||||
|
mobj->shadowscale = 2*FRACUNIT/3;
|
||||||
|
else
|
||||||
|
mobj->shadowscale = 0;
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
// DANGER! This can cause P_SpawnMobj to return NULL!
|
// DANGER! This can cause P_SpawnMobj to return NULL!
|
||||||
// Avoid using P_RemoveMobj on the newly created mobj in "MobjSpawn" Lua hooks!
|
// Avoid using P_RemoveMobj on the newly created mobj in "MobjSpawn" Lua hooks!
|
||||||
|
|
|
@ -375,6 +375,7 @@ typedef struct mobj_s
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
boolean colorized; // Whether the mobj uses the rainbow colormap
|
boolean colorized; // Whether the mobj uses the rainbow colormap
|
||||||
|
fixed_t shadowscale; // If this object casts a shadow, and the size relative to radius
|
||||||
|
|
||||||
// WARNING: New fields must be added separately to savegame and Lua.
|
// WARNING: New fields must be added separately to savegame and Lua.
|
||||||
} mobj_t;
|
} mobj_t;
|
||||||
|
|
|
@ -128,9 +128,7 @@ consvar_t cv_chasecam2 = {"chasecam2", "On", CV_CALL, CV_OnOff, ChaseCam2_OnChan
|
||||||
consvar_t cv_flipcam = {"flipcam", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_flipcam = {"flipcam", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_flipcam2 = {"flipcam2", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam2_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_flipcam2 = {"flipcam2", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam2_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#if defined(FLOORSPLATS) || defined(GLBADSHADOWS)
|
consvar_t cv_shadow = {"shadow", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_shadow = {"shadow", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
#endif //#if defined(FLOORSPLATS) || defined(GLBADSHADOWS)
|
|
||||||
#ifdef GLBADSHADOWS
|
#ifdef GLBADSHADOWS
|
||||||
consvar_t cv_shadowoffs = {"offsetshadows", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_shadowoffs = {"offsetshadows", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
#endif //#ifdef GLBADSHADOWS
|
#endif //#ifdef GLBADSHADOWS
|
||||||
|
@ -1223,9 +1221,7 @@ void R_RegisterEngineStuff(void)
|
||||||
|
|
||||||
CV_RegisterVar(&cv_chasecam);
|
CV_RegisterVar(&cv_chasecam);
|
||||||
CV_RegisterVar(&cv_chasecam2);
|
CV_RegisterVar(&cv_chasecam2);
|
||||||
#if defined(FLOORSPLATS) || defined(GLBADSHADOWS)
|
|
||||||
CV_RegisterVar(&cv_shadow);
|
CV_RegisterVar(&cv_shadow);
|
||||||
#endif //#if defined(FLOORSPLATS) || defined(GLBADSHADOWS)
|
|
||||||
#ifdef GLBADSHADOWS
|
#ifdef GLBADSHADOWS
|
||||||
CV_RegisterVar(&cv_shadowoffs);
|
CV_RegisterVar(&cv_shadowoffs);
|
||||||
#endif //#ifdef GLBADSHADOWS
|
#endif //#ifdef GLBADSHADOWS
|
||||||
|
|
|
@ -76,9 +76,7 @@ extern consvar_t cv_showhud, cv_translucenthud;
|
||||||
extern consvar_t cv_homremoval;
|
extern consvar_t cv_homremoval;
|
||||||
extern consvar_t cv_chasecam, cv_chasecam2;
|
extern consvar_t cv_chasecam, cv_chasecam2;
|
||||||
extern consvar_t cv_flipcam, cv_flipcam2;
|
extern consvar_t cv_flipcam, cv_flipcam2;
|
||||||
#if defined(FLOORSPLATS) || defined(GLBADSHADOWS)
|
|
||||||
extern consvar_t cv_shadow;
|
extern consvar_t cv_shadow;
|
||||||
#endif
|
|
||||||
#ifdef GLBADSHADOWS
|
#ifdef GLBADSHADOWS
|
||||||
extern conscar_t cv_shadowoffs;
|
extern conscar_t cv_shadowoffs;
|
||||||
#endif //#ifdef GLBADSHADOWS
|
#endif //#ifdef GLBADSHADOWS
|
||||||
|
|
281
src/r_things.c
281
src/r_things.c
|
@ -889,6 +889,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
if (!(vis->scalestep))
|
if (!(vis->scalestep))
|
||||||
{
|
{
|
||||||
sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale);
|
sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale);
|
||||||
|
sprtopscreen += vis->shear.tan * vis->shear.offset;
|
||||||
dc_iscale = FixedDiv(FRACUNIT, vis->scale);
|
dc_iscale = FixedDiv(FRACUNIT, vis->scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -934,7 +935,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Non-paper drawing loop
|
// Non-paper drawing loop
|
||||||
for (dc_x = vis->x1; dc_x <= vis->x2; dc_x++, frac += vis->xiscale)
|
for (dc_x = vis->x1; dc_x <= vis->x2; dc_x++, frac += vis->xiscale, sprtopscreen += vis->shear.tan)
|
||||||
{
|
{
|
||||||
#ifdef RANGECHECK
|
#ifdef RANGECHECK
|
||||||
texturecolumn = frac>>FRACBITS;
|
texturecolumn = frac>>FRACBITS;
|
||||||
|
@ -1107,6 +1108,265 @@ static void R_SplitSprite(vissprite_t *sprite)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_GetShadowZ(thing, shadowslope)
|
||||||
|
// Get the first visible floor below the object for shadows
|
||||||
|
// shadowslope is filled with the floor's slope, if provided
|
||||||
|
//
|
||||||
|
fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope)
|
||||||
|
{
|
||||||
|
fixed_t z, floorz = INT32_MIN;
|
||||||
|
pslope_t *slope, *floorslope = NULL;
|
||||||
|
msecnode_t *node;
|
||||||
|
sector_t *sector;
|
||||||
|
ffloor_t *rover;
|
||||||
|
|
||||||
|
for (node = thing->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
|
{
|
||||||
|
sector = node->m_sector;
|
||||||
|
|
||||||
|
slope = (sector->heightsec != -1) ? NULL : sector->f_slope;
|
||||||
|
z = slope ? P_GetZAt(slope, thing->x, thing->y) : (
|
||||||
|
(sector->heightsec != -1) ? sectors[sector->heightsec].floorheight : sector->floorheight
|
||||||
|
);
|
||||||
|
|
||||||
|
if (z < thing->z+thing->height/2 && z > floorz)
|
||||||
|
{
|
||||||
|
floorz = z;
|
||||||
|
floorslope = slope;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sector->ffloors)
|
||||||
|
for (rover = sector->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES) || (rover->alpha < 90 && !(rover->flags & FF_SWIMMABLE)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
z = *rover->t_slope ? P_GetZAt(*rover->t_slope, thing->x, thing->y) : *rover->topheight;
|
||||||
|
if (z < thing->z+thing->height/2 && z > floorz)
|
||||||
|
{
|
||||||
|
floorz = z;
|
||||||
|
floorslope = *rover->t_slope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing->floorz > floorz + (!floorslope ? 0 : FixedMul(abs(floorslope->zdelta), thing->radius*3/2)))
|
||||||
|
{
|
||||||
|
floorz = thing->floorz;
|
||||||
|
floorslope = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 // Unfortunately, this drops CEZ2 down to sub-17 FPS on my i7.
|
||||||
|
//#ifdef POLYOBJECTS
|
||||||
|
// Check polyobjects and see if floorz needs to be altered, for rings only because they don't update floorz
|
||||||
|
if (thing->type == MT_RING)
|
||||||
|
{
|
||||||
|
INT32 xl, xh, yl, yh, bx, by;
|
||||||
|
|
||||||
|
xl = (unsigned)(thing->x - thing->radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
xh = (unsigned)(thing->x + thing->radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
yl = (unsigned)(thing->y - thing->radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
yh = (unsigned)(thing->y + thing->radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
|
||||||
|
BMBOUNDFIX(xl, xh, yl, yh);
|
||||||
|
|
||||||
|
validcount++;
|
||||||
|
|
||||||
|
for (by = yl; by <= yh; by++)
|
||||||
|
for (bx = xl; bx <= xh; bx++)
|
||||||
|
{
|
||||||
|
INT32 offset;
|
||||||
|
polymaplink_t *plink; // haleyjd 02/22/06
|
||||||
|
|
||||||
|
if (bx < 0 || by < 0 || bx >= bmapwidth || by >= bmapheight)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
offset = by*bmapwidth + bx;
|
||||||
|
|
||||||
|
// haleyjd 02/22/06: consider polyobject lines
|
||||||
|
plink = polyblocklinks[offset];
|
||||||
|
|
||||||
|
while (plink)
|
||||||
|
{
|
||||||
|
polyobj_t *po = plink->po;
|
||||||
|
|
||||||
|
if (po->validcount != validcount) // if polyobj hasn't been checked
|
||||||
|
{
|
||||||
|
po->validcount = validcount;
|
||||||
|
|
||||||
|
if (!P_MobjInsidePolyobj(po, thing) || !(po->flags & POF_RENDERPLANES))
|
||||||
|
{
|
||||||
|
plink = (polymaplink_t *)(plink->link.next);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're inside it! Yess...
|
||||||
|
z = po->lines[0]->backsector->ceilingheight;
|
||||||
|
|
||||||
|
if (z < thing->z+thing->height/2 && z > floorz)
|
||||||
|
{
|
||||||
|
floorz = z;
|
||||||
|
floorslope = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plink = (polymaplink_t *)(plink->link.next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (shadowslope != NULL)
|
||||||
|
*shadowslope = floorslope;
|
||||||
|
|
||||||
|
return floorz;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, fixed_t tx, fixed_t tz)
|
||||||
|
{
|
||||||
|
vissprite_t *shadow;
|
||||||
|
patch_t *patch;
|
||||||
|
fixed_t xscale, yscale, shadowxscale, shadowyscale, shadowskew, x1, x2;
|
||||||
|
INT32 light = 0;
|
||||||
|
fixed_t scalemul; UINT8 trans;
|
||||||
|
fixed_t floordiff;
|
||||||
|
fixed_t floorz;
|
||||||
|
pslope_t *floorslope;
|
||||||
|
|
||||||
|
floorz = R_GetShadowZ(thing, &floorslope);
|
||||||
|
|
||||||
|
if (abs(floorz-viewz)/tz > 4) return; // Prevent stretchy shadows and possible crashes
|
||||||
|
|
||||||
|
floordiff = abs(thing->z - floorz);
|
||||||
|
|
||||||
|
trans = floordiff / (100*FRACUNIT) + 3;
|
||||||
|
if (trans >= 9) return;
|
||||||
|
|
||||||
|
scalemul = FixedMul(FRACUNIT - floordiff/640, scale);
|
||||||
|
|
||||||
|
patch = W_CachePatchName("DSHADOW", PU_CACHE);
|
||||||
|
xscale = FixedDiv(projection, tz);
|
||||||
|
yscale = FixedDiv(projectiony, tz);
|
||||||
|
shadowxscale = FixedMul(thing->radius*2, scalemul);
|
||||||
|
shadowyscale = FixedMul(FixedMul(thing->radius*2, scalemul), FixedDiv(abs(floorz - viewz), tz));
|
||||||
|
shadowyscale = min(shadowyscale, shadowxscale) / patch->height;
|
||||||
|
shadowxscale /= patch->width;
|
||||||
|
shadowskew = 0;
|
||||||
|
|
||||||
|
if (floorslope)
|
||||||
|
{
|
||||||
|
// haha let's try some dumb stuff
|
||||||
|
fixed_t xslope, zslope;
|
||||||
|
angle_t sloperelang = (R_PointToAngle(thing->x, thing->y) - floorslope->xydirection) >> ANGLETOFINESHIFT;
|
||||||
|
|
||||||
|
xslope = FixedMul(FINESINE(sloperelang), floorslope->zdelta);
|
||||||
|
zslope = FixedMul(FINECOSINE(sloperelang), floorslope->zdelta);
|
||||||
|
|
||||||
|
//CONS_Printf("Shadow is sloped by %d %d\n", xslope, zslope);
|
||||||
|
|
||||||
|
if (viewz < floorz)
|
||||||
|
shadowyscale += FixedMul(FixedMul(thing->radius*2 / patch->height, scalemul), zslope);
|
||||||
|
else
|
||||||
|
shadowyscale -= FixedMul(FixedMul(thing->radius*2 / patch->height, scalemul), zslope);
|
||||||
|
|
||||||
|
shadowyscale = abs(shadowyscale);
|
||||||
|
|
||||||
|
shadowskew = xslope;
|
||||||
|
}
|
||||||
|
|
||||||
|
tx -= patch->width * shadowxscale/2;
|
||||||
|
x1 = (centerxfrac + FixedMul(tx,xscale))>>FRACBITS;
|
||||||
|
if (x1 >= viewwidth) return;
|
||||||
|
|
||||||
|
tx += patch->width * shadowxscale;
|
||||||
|
x2 = ((centerxfrac + FixedMul(tx,xscale))>>FRACBITS); x2--;
|
||||||
|
if (x2 < 0 || x2 <= x1) return;
|
||||||
|
|
||||||
|
if (shadowyscale < FRACUNIT/patch->height) return; // fix some crashes?
|
||||||
|
|
||||||
|
shadow = R_NewVisSprite();
|
||||||
|
shadow->patch = patch;
|
||||||
|
shadow->heightsec = vis->heightsec;
|
||||||
|
|
||||||
|
shadow->thingheight = FRACUNIT;
|
||||||
|
shadow->pz = floorz;
|
||||||
|
shadow->pzt = shadow->pz + shadow->thingheight;
|
||||||
|
|
||||||
|
shadow->mobjflags = 0;
|
||||||
|
shadow->sortscale = vis->sortscale;
|
||||||
|
shadow->dispoffset = vis->dispoffset - 5;
|
||||||
|
shadow->gx = thing->x;
|
||||||
|
shadow->gy = thing->y;
|
||||||
|
shadow->gzt = shadow->pz + shadow->patch->height * shadowyscale / 2;
|
||||||
|
shadow->gz = shadow->gzt - shadow->patch->height * shadowyscale;
|
||||||
|
shadow->texturemid = FixedMul(thing->scale, FixedDiv(shadow->gzt - viewz, shadowyscale));
|
||||||
|
if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES)
|
||||||
|
shadow->texturemid = FixedMul(shadow->texturemid, ((skin_t *)thing->skin)->highresscale);
|
||||||
|
shadow->scalestep = 0;
|
||||||
|
shadow->shear.tan = shadowskew; // repurposed variable
|
||||||
|
|
||||||
|
shadow->mobj = thing; // Easy access! Tails 06-07-2002
|
||||||
|
|
||||||
|
shadow->x1 = x1 < 0 ? 0 : x1;
|
||||||
|
shadow->x2 = x2 >= viewwidth ? viewwidth-1 : x2;
|
||||||
|
|
||||||
|
// PORTAL SEMI-CLIPPING
|
||||||
|
if (portalrender)
|
||||||
|
{
|
||||||
|
if (shadow->x1 < portalclipstart)
|
||||||
|
shadow->x1 = portalclipstart;
|
||||||
|
if (shadow->x2 >= portalclipend)
|
||||||
|
shadow->x2 = portalclipend-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
shadow->xscale = FixedMul(xscale, shadowxscale); //SoM: 4/17/2000
|
||||||
|
shadow->scale = FixedMul(yscale, shadowyscale);
|
||||||
|
shadow->sector = vis->sector;
|
||||||
|
shadow->szt = (INT16)((centeryfrac - FixedMul(shadow->gzt - viewz, yscale))>>FRACBITS);
|
||||||
|
shadow->sz = (INT16)((centeryfrac - FixedMul(shadow->gz - viewz, yscale))>>FRACBITS);
|
||||||
|
shadow->cut = SC_ISSCALED|SC_SHADOW; //check this
|
||||||
|
|
||||||
|
shadow->startfrac = 0;
|
||||||
|
//shadow->xiscale = 0x7ffffff0 / (shadow->xscale/2);
|
||||||
|
shadow->xiscale = (patch->width<<FRACBITS)/(x2-x1+1); // fuck it
|
||||||
|
|
||||||
|
if (shadow->x1 > x1)
|
||||||
|
shadow->startfrac += shadow->xiscale*(shadow->x1-x1);
|
||||||
|
|
||||||
|
// reusing x1 variable
|
||||||
|
x1 += (x2-x1)/2;
|
||||||
|
shadow->shear.offset = shadow->x1-x1;
|
||||||
|
|
||||||
|
if (thing->subsector->sector->numlights)
|
||||||
|
{
|
||||||
|
INT32 lightnum;
|
||||||
|
#ifdef ESLOPE // R_GetPlaneLight won't work on sloped lights!
|
||||||
|
light = thing->subsector->sector->numlights - 1;
|
||||||
|
|
||||||
|
for (lightnum = 1; lightnum < thing->subsector->sector->numlights; lightnum++) {
|
||||||
|
fixed_t h = thing->subsector->sector->lightlist[lightnum].slope ? P_GetZAt(thing->subsector->sector->lightlist[lightnum].slope, thing->x, thing->y)
|
||||||
|
: thing->subsector->sector->lightlist[lightnum].height;
|
||||||
|
if (h <= shadow->gzt) {
|
||||||
|
light = lightnum - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
light = R_GetPlaneLight(thing->subsector->sector, shadow->gzt, false);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing->subsector->sector->numlights)
|
||||||
|
shadow->extra_colormap = *thing->subsector->sector->lightlist[light].extra_colormap;
|
||||||
|
else
|
||||||
|
shadow->extra_colormap = thing->subsector->sector->extra_colormap;
|
||||||
|
|
||||||
|
shadow->transmap = transtables + (trans<<FF_TRANSSHIFT);
|
||||||
|
shadow->colormap = scalelight[0][0]; // full dark!
|
||||||
|
|
||||||
|
objectsdrawn++;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_ProjectSprite
|
// R_ProjectSprite
|
||||||
// Generates a vissprite for a thing
|
// Generates a vissprite for a thing
|
||||||
|
@ -1144,6 +1404,8 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
fixed_t scalestep;
|
fixed_t scalestep;
|
||||||
fixed_t offset, offset2;
|
fixed_t offset, offset2;
|
||||||
|
|
||||||
|
fixed_t basetx; // drop shadows
|
||||||
|
|
||||||
boolean papersprite = !!(thing->frame & FF_PAPERSPRITE);
|
boolean papersprite = !!(thing->frame & FF_PAPERSPRITE);
|
||||||
fixed_t paperoffset = 0, paperdistance = 0; angle_t centerangle = 0;
|
fixed_t paperoffset = 0, paperdistance = 0; angle_t centerangle = 0;
|
||||||
|
|
||||||
|
@ -1178,7 +1440,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
|
|
||||||
gxt = -FixedMul(tr_x, viewsin);
|
gxt = -FixedMul(tr_x, viewsin);
|
||||||
gyt = FixedMul(tr_y, viewcos);
|
gyt = FixedMul(tr_y, viewcos);
|
||||||
tx = -(gyt + gxt);
|
basetx = tx = -(gyt + gxt);
|
||||||
|
|
||||||
// too far off the side?
|
// too far off the side?
|
||||||
if (!papersprite && abs(tx) > tz<<2) // papersprite clipping is handled later
|
if (!papersprite && abs(tx) > tz<<2) // papersprite clipping is handled later
|
||||||
|
@ -1548,6 +1810,8 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
vis->paperoffset = paperoffset;
|
vis->paperoffset = paperoffset;
|
||||||
vis->paperdistance = paperdistance;
|
vis->paperdistance = paperdistance;
|
||||||
vis->centerangle = centerangle;
|
vis->centerangle = centerangle;
|
||||||
|
vis->shear.tan = 0;
|
||||||
|
vis->shear.offset = 0;
|
||||||
|
|
||||||
vis->mobj = thing; // Easy access! Tails 06-07-2002
|
vis->mobj = thing; // Easy access! Tails 06-07-2002
|
||||||
|
|
||||||
|
@ -1640,6 +1904,9 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
if (thing->subsector->sector->numlights)
|
if (thing->subsector->sector->numlights)
|
||||||
R_SplitSprite(vis);
|
R_SplitSprite(vis);
|
||||||
|
|
||||||
|
if (oldthing->shadowscale && cv_shadow.value)
|
||||||
|
R_ProjectDropShadow(oldthing, vis, oldthing->shadowscale, basetx, tz);
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
++objectsdrawn;
|
++objectsdrawn;
|
||||||
}
|
}
|
||||||
|
@ -1763,6 +2030,9 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||||
vis->pzt = vis->pz + vis->thingheight;
|
vis->pzt = vis->pz + vis->thingheight;
|
||||||
vis->texturemid = vis->gzt - viewz;
|
vis->texturemid = vis->gzt - viewz;
|
||||||
vis->scalestep = 0;
|
vis->scalestep = 0;
|
||||||
|
vis->paperdistance = 0;
|
||||||
|
vis->shear.tan = 0;
|
||||||
|
vis->shear.offset = 0;
|
||||||
|
|
||||||
vis->x1 = x1 < 0 ? 0 : x1;
|
vis->x1 = x1 < 0 ? 0 : x1;
|
||||||
vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2;
|
vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2;
|
||||||
|
@ -1955,6 +2225,9 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e
|
||||||
if (!(ds->cut & SC_LINKDRAW))
|
if (!(ds->cut & SC_LINKDRAW))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (ds->cut & SC_SHADOW)
|
||||||
|
continue;
|
||||||
|
|
||||||
// reuse dsfirst...
|
// reuse dsfirst...
|
||||||
for (dsfirst = unsorted.prev; dsfirst != &unsorted; dsfirst = dsfirst->prev)
|
for (dsfirst = unsorted.prev; dsfirst != &unsorted; dsfirst = dsfirst->prev)
|
||||||
{
|
{
|
||||||
|
@ -1962,6 +2235,10 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e
|
||||||
if (dsfirst->cut & SC_LINKDRAW)
|
if (dsfirst->cut & SC_LINKDRAW)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// don't connect to your shadow!
|
||||||
|
if (dsfirst->cut & SC_SHADOW)
|
||||||
|
continue;
|
||||||
|
|
||||||
// don't connect if it's not the tracer
|
// don't connect if it's not the tracer
|
||||||
if (dsfirst->mobj != ds->mobj)
|
if (dsfirst->mobj != ds->mobj)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -51,6 +51,8 @@ void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight);
|
||||||
// (only sprites from namelist are added or replaced)
|
// (only sprites from namelist are added or replaced)
|
||||||
void R_AddSpriteDefs(UINT16 wadnum);
|
void R_AddSpriteDefs(UINT16 wadnum);
|
||||||
|
|
||||||
|
fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope);
|
||||||
|
|
||||||
//SoM: 6/5/2000: Light sprites correctly!
|
//SoM: 6/5/2000: Light sprites correctly!
|
||||||
void R_AddSprites(sector_t *sec, INT32 lightlevel);
|
void R_AddSprites(sector_t *sec, INT32 lightlevel);
|
||||||
void R_InitSprites(void);
|
void R_InitSprites(void);
|
||||||
|
@ -149,7 +151,8 @@ typedef enum
|
||||||
SC_LINKDRAW = 1<<3,
|
SC_LINKDRAW = 1<<3,
|
||||||
SC_FULLBRIGHT = 1<<4,
|
SC_FULLBRIGHT = 1<<4,
|
||||||
SC_VFLIP = 1<<5,
|
SC_VFLIP = 1<<5,
|
||||||
SC_ISSCALED = 1>>6,
|
SC_ISSCALED = 1<<6,
|
||||||
|
SC_SHADOW = 1<<7,
|
||||||
// masks
|
// masks
|
||||||
SC_CUTMASK = SC_TOP|SC_BOTTOM,
|
SC_CUTMASK = SC_TOP|SC_BOTTOM,
|
||||||
SC_FLAGMASK = ~SC_CUTMASK
|
SC_FLAGMASK = ~SC_CUTMASK
|
||||||
|
@ -182,6 +185,11 @@ typedef struct vissprite_s
|
||||||
|
|
||||||
angle_t centerangle; // for paper sprites
|
angle_t centerangle; // for paper sprites
|
||||||
|
|
||||||
|
struct {
|
||||||
|
fixed_t tan; // The amount to shear the sprite vertically per row
|
||||||
|
INT32 offset; // The center of the shearing location offset from x1
|
||||||
|
} shear;
|
||||||
|
|
||||||
fixed_t texturemid;
|
fixed_t texturemid;
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue