dude how do I co-author in Git?
This commit is contained in:
parent
0bc8d2a49d
commit
315f941573
|
@ -118,7 +118,9 @@ FTransform atransform;
|
|||
// Float variants of viewx, viewy, viewz, etc.
|
||||
static float gr_viewx, gr_viewy, gr_viewz;
|
||||
static float gr_viewsin, gr_viewcos;
|
||||
|
||||
static angle_t gr_aimingangle;
|
||||
static float gr_viewludsin, gr_viewludcos;
|
||||
|
||||
static INT32 drawcount = 0;
|
||||
|
||||
|
@ -2938,10 +2940,43 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t
|
|||
}
|
||||
}
|
||||
|
||||
// This is expecting a pointer to an array containing 4 wallVerts for a sprite
|
||||
static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts)
|
||||
{
|
||||
if (cv_grspritebillboarding.value && spr && spr->mobj && wallVerts)
|
||||
{
|
||||
float basey = FIXED_TO_FLOAT(spr->mobj->z);
|
||||
float lowy = wallVerts[0].y;
|
||||
if (P_MobjFlip(spr->mobj) == -1)
|
||||
{
|
||||
basey = FIXED_TO_FLOAT(spr->mobj->z + spr->mobj->height);
|
||||
}
|
||||
// Rotate sprites to fully billboard with the camera
|
||||
// X, Y, AND Z need to be manipulated for the polys to rotate around the
|
||||
// origin, because of how the origin setting works I believe that should
|
||||
// be mobj->z or mobj->z + mobj->height
|
||||
wallVerts[2].y = wallVerts[3].y = (spr->ty - basey) * gr_viewludsin + basey;
|
||||
wallVerts[0].y = wallVerts[1].y = (lowy - basey) * gr_viewludsin + basey;
|
||||
// translate back to be around 0 before translating back
|
||||
wallVerts[3].x += ((spr->ty - basey) * gr_viewludcos) * gr_viewcos;
|
||||
wallVerts[2].x += ((spr->ty - basey) * gr_viewludcos) * gr_viewcos;
|
||||
|
||||
wallVerts[0].x += ((lowy - basey) * gr_viewludcos) * gr_viewcos;
|
||||
wallVerts[1].x += ((lowy - basey) * gr_viewludcos) * gr_viewcos;
|
||||
|
||||
wallVerts[3].z += ((spr->ty - basey) * gr_viewludcos) * gr_viewsin;
|
||||
wallVerts[2].z += ((spr->ty - basey) * gr_viewludcos) * gr_viewsin;
|
||||
|
||||
wallVerts[0].z += ((lowy - basey) * gr_viewludcos) * gr_viewsin;
|
||||
wallVerts[1].z += ((lowy - basey) * gr_viewludcos) * gr_viewsin;
|
||||
}
|
||||
}
|
||||
|
||||
static void HWR_SplitSprite(gr_vissprite_t *spr)
|
||||
{
|
||||
float this_scale = 1.0f;
|
||||
FOutVector wallVerts[4];
|
||||
FOutVector baseWallVerts[4]; // This is what the verts should end up as
|
||||
GLPatch_t *gpatch;
|
||||
FSurfaceInfo Surf;
|
||||
const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES);
|
||||
|
@ -2954,11 +2989,13 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
|||
float realtop, realbot, top, bot;
|
||||
float towtop, towbot, towmult;
|
||||
float bheight;
|
||||
float realheight, heightmult;
|
||||
const sector_t *sector = spr->mobj->subsector->sector;
|
||||
const lightlist_t *list = sector->lightlist;
|
||||
#ifdef ESLOPE
|
||||
float endrealtop, endrealbot, endtop, endbot;
|
||||
float endbheight;
|
||||
float endrealheight;
|
||||
fixed_t temp;
|
||||
fixed_t v1x, v1y, v2x, v2y;
|
||||
#endif
|
||||
|
@ -2987,16 +3024,16 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
|||
HWR_DrawSpriteShadow(spr, gpatch, this_scale);
|
||||
}
|
||||
|
||||
wallVerts[0].x = wallVerts[3].x = spr->x1;
|
||||
wallVerts[2].x = wallVerts[1].x = spr->x2;
|
||||
wallVerts[0].z = wallVerts[3].z = spr->z1;
|
||||
wallVerts[1].z = wallVerts[2].z = spr->z2;
|
||||
baseWallVerts[0].x = baseWallVerts[3].x = spr->x1;
|
||||
baseWallVerts[2].x = baseWallVerts[1].x = spr->x2;
|
||||
baseWallVerts[0].z = baseWallVerts[3].z = spr->z1;
|
||||
baseWallVerts[1].z = baseWallVerts[2].z = spr->z2;
|
||||
|
||||
wallVerts[2].y = wallVerts[3].y = spr->ty;
|
||||
baseWallVerts[2].y = baseWallVerts[3].y = spr->ty;
|
||||
if (spr->mobj && fabsf(this_scale - 1.0f) > 1.0E-36f)
|
||||
wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height * this_scale;
|
||||
baseWallVerts[0].y = baseWallVerts[1].y = spr->ty - gpatch->height * this_scale;
|
||||
else
|
||||
wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height;
|
||||
baseWallVerts[0].y = baseWallVerts[1].y = spr->ty - gpatch->height;
|
||||
|
||||
v1x = FLOAT_TO_FIXED(spr->x1);
|
||||
v1y = FLOAT_TO_FIXED(spr->z1);
|
||||
|
@ -3005,25 +3042,25 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
|||
|
||||
if (spr->flip)
|
||||
{
|
||||
wallVerts[0].s = wallVerts[3].s = gpatch->max_s;
|
||||
wallVerts[2].s = wallVerts[1].s = 0;
|
||||
baseWallVerts[0].s = baseWallVerts[3].s = gpatch->max_s;
|
||||
baseWallVerts[2].s = baseWallVerts[1].s = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
wallVerts[0].s = wallVerts[3].s = 0;
|
||||
wallVerts[2].s = wallVerts[1].s = gpatch->max_s;
|
||||
baseWallVerts[0].s = baseWallVerts[3].s = 0;
|
||||
baseWallVerts[2].s = baseWallVerts[1].s = gpatch->max_s;
|
||||
}
|
||||
|
||||
// flip the texture coords (look familiar?)
|
||||
if (spr->vflip)
|
||||
{
|
||||
wallVerts[3].t = wallVerts[2].t = gpatch->max_t;
|
||||
wallVerts[0].t = wallVerts[1].t = 0;
|
||||
baseWallVerts[3].t = baseWallVerts[2].t = gpatch->max_t;
|
||||
baseWallVerts[0].t = baseWallVerts[1].t = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
wallVerts[3].t = wallVerts[2].t = 0;
|
||||
wallVerts[0].t = wallVerts[1].t = gpatch->max_t;
|
||||
baseWallVerts[3].t = baseWallVerts[2].t = 0;
|
||||
baseWallVerts[0].t = baseWallVerts[1].t = gpatch->max_t;
|
||||
}
|
||||
|
||||
// if it has a dispoffset, push it a little towards the camera
|
||||
|
@ -3031,23 +3068,31 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
|||
{
|
||||
float co = -gr_viewcos*(0.05f*spr->dispoffset);
|
||||
float si = -gr_viewsin*(0.05f*spr->dispoffset);
|
||||
wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si;
|
||||
wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si;
|
||||
wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co;
|
||||
wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co;
|
||||
baseWallVerts[0].z = baseWallVerts[3].z = baseWallVerts[0].z+si;
|
||||
baseWallVerts[1].z = baseWallVerts[2].z = baseWallVerts[1].z+si;
|
||||
baseWallVerts[0].x = baseWallVerts[3].x = baseWallVerts[0].x+co;
|
||||
baseWallVerts[1].x = baseWallVerts[2].x = baseWallVerts[1].x+co;
|
||||
}
|
||||
|
||||
realtop = top = wallVerts[3].y;
|
||||
realbot = bot = wallVerts[0].y;
|
||||
towtop = wallVerts[3].t;
|
||||
towbot = wallVerts[0].t;
|
||||
// Let dispoffset work first since this adjust each vertex
|
||||
HWR_RotateSpritePolyToAim(spr, baseWallVerts);
|
||||
|
||||
realtop = top = baseWallVerts[3].y;
|
||||
realbot = bot = baseWallVerts[0].y;
|
||||
towtop = baseWallVerts[3].t;
|
||||
towbot = baseWallVerts[0].t;
|
||||
towmult = (towbot - towtop) / (top - bot);
|
||||
|
||||
#ifdef ESLOPE
|
||||
endrealtop = endtop = wallVerts[2].y;
|
||||
endrealbot = endbot = wallVerts[1].y;
|
||||
endrealtop = endtop = baseWallVerts[2].y;
|
||||
endrealbot = endbot = baseWallVerts[1].y;
|
||||
#endif
|
||||
|
||||
// copy the contents of baseWallVerts into the drawn wallVerts array
|
||||
// baseWallVerts is used to know the final shape to easily get the vertex
|
||||
// co-ordinates
|
||||
memcpy(wallVerts, baseWallVerts, sizeof(baseWallVerts));
|
||||
|
||||
if (!cv_translucency.value) // translucency disabled
|
||||
{
|
||||
Surf.PolyColor.s.alpha = 0xFF;
|
||||
|
@ -3174,12 +3219,53 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
|||
wallVerts[2].y = endtop;
|
||||
wallVerts[0].y = bot;
|
||||
wallVerts[1].y = endbot;
|
||||
|
||||
// The x and y only need to be adjusted in the case that it's not a papersprite
|
||||
if (cv_grspritebillboarding.value && spr->mobj)
|
||||
{
|
||||
// Get the x and z of the vertices so billboarding draws correctly
|
||||
realheight = realbot - realtop;
|
||||
endrealheight = endrealbot - endrealtop;
|
||||
heightmult = (realtop - top) / realheight;
|
||||
wallVerts[3].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult;
|
||||
wallVerts[3].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult;
|
||||
|
||||
heightmult = (endrealtop - endtop) / endrealheight;
|
||||
wallVerts[2].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult;
|
||||
wallVerts[2].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult;
|
||||
|
||||
heightmult = (realtop - bot) / realheight;
|
||||
wallVerts[0].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult;
|
||||
wallVerts[0].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult;
|
||||
|
||||
heightmult = (endrealtop - endbot) / endrealheight;
|
||||
wallVerts[1].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult;
|
||||
wallVerts[1].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult;
|
||||
}
|
||||
#else
|
||||
wallVerts[3].t = wallVerts[2].t = towtop + ((realtop - top) * towmult);
|
||||
wallVerts[0].t = wallVerts[1].t = towtop + ((realtop - bot) * towmult);
|
||||
|
||||
wallVerts[2].y = wallVerts[3].y = top;
|
||||
wallVerts[0].y = wallVerts[1].y = bot;
|
||||
|
||||
// The x and y only need to be adjusted in the case that it's not a papersprite
|
||||
if (cv_grspritebillboarding.value && spr->mobj)
|
||||
{
|
||||
// Get the x and z of the vertices so billboarding draws correctly
|
||||
realheight = realbot - realtop;
|
||||
heightmult = (realtop - top) / realheight;
|
||||
wallVerts[3].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult;
|
||||
wallVerts[3].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult;
|
||||
wallVerts[2].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult;
|
||||
wallVerts[2].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult;
|
||||
|
||||
heightmult = (realtop - bot) / realheight;
|
||||
wallVerts[0].x = baseWallVerts[3].x + (baseWallVerts[3].x - baseWallVerts[0].x) * heightmult;
|
||||
wallVerts[0].z = baseWallVerts[3].z + (baseWallVerts[3].z - baseWallVerts[0].z) * heightmult;
|
||||
wallVerts[1].x = baseWallVerts[2].x + (baseWallVerts[2].x - baseWallVerts[1].x) * heightmult;
|
||||
wallVerts[1].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (colormap)
|
||||
|
@ -3341,6 +3427,9 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
|
|||
wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co;
|
||||
}
|
||||
|
||||
// Let dispoffset work first since this adjust each vertex
|
||||
HWR_RotateSpritePolyToAim(spr, wallVerts);
|
||||
|
||||
// This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black.
|
||||
// sprite lighting by modulating the RGB components
|
||||
/// \todo coloured
|
||||
|
@ -3422,6 +3511,9 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
|
|||
wallVerts[0].z = wallVerts[3].z = spr->z1;
|
||||
wallVerts[1].z = wallVerts[2].z = spr->z2;
|
||||
|
||||
// Let dispoffset work first since this adjust each vertex
|
||||
HWR_RotateSpritePolyToAim(spr, wallVerts);
|
||||
|
||||
wallVerts[0].s = wallVerts[3].s = 0;
|
||||
wallVerts[2].s = wallVerts[1].s = gpatch->max_s;
|
||||
|
||||
|
@ -4479,6 +4571,9 @@ void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox)
|
|||
atransform.shearing = true;
|
||||
}
|
||||
|
||||
gr_viewludsin = FIXED_TO_FLOAT(FINECOSINE(gr_aimingangle>>ANGLETOFINESHIFT));
|
||||
gr_viewludcos = FIXED_TO_FLOAT(-FINESINE(gr_aimingangle>>ANGLETOFINESHIFT));
|
||||
|
||||
atransform.anglex = (float)(gr_aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||
|
||||
|
|
|
@ -142,6 +142,7 @@ extern consvar_t cv_granisotropicmode;
|
|||
extern consvar_t cv_grcorrecttricks;
|
||||
extern consvar_t cv_grfovchange;
|
||||
extern consvar_t cv_grsolvetjoin;
|
||||
extern consvar_t cv_grspritebillboarding;
|
||||
|
||||
extern CV_PossibleValue_t granisotropicmode_cons_t[];
|
||||
|
||||
|
|
|
@ -1395,6 +1395,7 @@ void R_RegisterEngineStuff(void)
|
|||
CV_RegisterVar(&cv_grsoftwarefog);
|
||||
CV_RegisterVar(&cv_grfogdensity);
|
||||
CV_RegisterVar(&cv_grmd2);
|
||||
CV_RegisterVar(&cv_grspritebillboarding);
|
||||
CV_RegisterVar(&cv_grshearing);
|
||||
CV_RegisterVar(&cv_grshaders);
|
||||
#endif
|
||||
|
|
|
@ -72,10 +72,11 @@ consvar_t cv_grgammagreen = {"gr_gammagreen", "127", CV_SAVE|CV_CALL, grgamma_co
|
|||
consvar_t cv_grgammablue = {"gr_gammablue", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
|
||||
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_grshearing = {"gr_shearing", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}};
|
||||
|
||||
consvar_t cv_grmd2 = {"gr_md2", "Off", CV_SAVE, CV_MD2, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_grshearing = {"gr_shearing", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
#endif
|
||||
|
||||
const UINT8 gammatable[5][256] =
|
||||
|
|
Loading…
Reference in New Issue