shadow fixes

This commit is contained in:
Fire-Head 2020-08-03 01:25:29 +03:00
parent 4b614333c6
commit 90689a1717
2 changed files with 34 additions and 42 deletions

View file

@ -458,7 +458,7 @@ CShadows::StoreShadowForCar(CAutomobile *pCar)
if ( CTimeCycle::GetShadowStrength() != 0 )
{
CVector CarPos = pCar->GetPosition();
float fDistToCamSqr = (CarPos - TheCamera.GetPosition()).MagnitudeSqr();
float fDistToCamSqr = (CarPos - TheCamera.GetPosition()).MagnitudeSqr2D();
if ( CCutsceneMgr::IsRunning() )
fDistToCamSqr /= SQR(TheCamera.LODDistMultiplier) * 4.0f;
@ -1578,40 +1578,41 @@ CStaticShadow::Free(void)
void
CShadows::CalcPedShadowValues(CVector vecLightDir,
float *pfDisplacementX, float *pfDisplacementY,
float *pfFrontX, float *pfFrontY,
float *pfSideX, float *pfSideY)
float *pfSideX, float *pfSideY,
float *pfDisplacementX, float *pfDisplacementY)
{
ASSERT(pfDisplacementX != NULL);
ASSERT(pfDisplacementY != NULL);
ASSERT(pfFrontX != NULL);
ASSERT(pfFrontY != NULL);
ASSERT(pfSideX != NULL);
ASSERT(pfSideY != NULL);
ASSERT(pfFrontX != nil);
ASSERT(pfFrontY != nil);
ASSERT(pfSideX != nil);
ASSERT(pfSideY != nil);
ASSERT(pfDisplacementX != nil);
ASSERT(pfDisplacementY != nil);
*pfFrontX = -vecLightDir.x;
*pfFrontY = -vecLightDir.y;
float fDist = Sqrt(*pfFrontY * *pfFrontY + *pfFrontX * *pfFrontX);
float fMult = (fDist + 1.0f) / fDist;
*pfFrontX *= fMult;
*pfFrontY *= fMult;
*pfSideX = -vecLightDir.y / fDist;
*pfSideY = vecLightDir.x / fDist;
*pfDisplacementX = -vecLightDir.x;
*pfDisplacementY = -vecLightDir.y;
float fDist = Sqrt(*pfDisplacementY * *pfDisplacementY + *pfDisplacementX * *pfDisplacementX);
float fMult = (fDist + 1.0f) / fDist;
*pfDisplacementX *= fMult;
*pfDisplacementY *= fMult;
*pfFrontX = -vecLightDir.y / fDist;
*pfFrontY = vecLightDir.x / fDist;
*pfSideX = -vecLightDir.x;
*pfSideY = -vecLightDir.y;
*pfDisplacementX /= 2;
*pfDisplacementY /= 2;
*pfFrontX /= 2;
*pfFrontY /= 2;
*pfSideX /= 2;
*pfSideY /= 2;
*pfDisplacementX /= 2;
*pfDisplacementY /= 2;
}
void
@ -1656,22 +1657,22 @@ CShadows::RenderExtraPlayerShadows(void)
vecLight.y *= fInv;
vecLight.z *= fInv;
float fDisplacementX, fDisplacementY, fFrontX, fFrontY, fSideX, fSideY;
float fFrontX, fFrontY, fSideX, fSideY, fDisplacementX, fDisplacementY;
CalcPedShadowValues(vecLight,
&fDisplacementX, &fDisplacementY,
&fFrontX, &fFrontY,
&fSideX, &fSideY);
&fSideX, &fSideY,
&fDisplacementX, &fDisplacementY);
CVector shadowPos = FindPlayerCoors();
shadowPos.x += fSideX;
shadowPos.y += fSideY;
shadowPos.x += fDisplacementX;
shadowPos.y += fDisplacementY;
StoreShadowToBeRendered(SHADOWTYPE_DARK, gpShadowPedTex, &shadowPos,
fDisplacementX, fDisplacementY,
fFrontX, fFrontY,
fSideX, fSideY,
nColorStrength, 0, 0, 0,
4.0f, false, 1.0f);
}
@ -1768,7 +1769,7 @@ CShadows::RenderIndicatorShadow(uint32 nID, uint8 ShadowType, RwTexture *pTextur
{
ASSERT(pPosn != NULL);
C3dMarkers::PlaceMarkerSet(nID, _TODOCONST(4), *pPosn, Max(fFrontX, -fSideY),
C3dMarkers::PlaceMarkerSet(nID, MARKERTYPE_CYLINDER, *pPosn, Max(fFrontX, -fSideY),
0, 128, 255, 128,
2048, 0.2f, 0);
}

View file

@ -128,21 +128,12 @@ class CPed;
class CShadows
{
public:
#if 1
static int16 ShadowsStoredToBeRendered;
static CStoredShadow asShadowsStored [MAX_STOREDSHADOWS];
static CPolyBunch aPolyBunches [MAX_POLYBUNCHES];
static CStaticShadow aStaticShadows [MAX_STATICSHADOWS];
static CPolyBunch *pEmptyBunchList;
static CPermanentShadow aPermanentShadows[MAX_PERMAMENTSHADOWS];
#else
static int16 &ShadowsStoredToBeRendered;
static CStoredShadow (&asShadowsStored) [MAX_STOREDSHADOWS];
static CPolyBunch (&aPolyBunches) [MAX_POLYBUNCHES];
static CStaticShadow (&aStaticShadows) [MAX_STATICSHADOWS];
static CPolyBunch *&pEmptyBunchList;
static CPermanentShadow (&aPermanentShadows)[MAX_PERMAMENTSHADOWS];
#endif
static void Init (void);
static void Shutdown (void);
@ -166,7 +157,7 @@ public:
CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, CPolyBunch **ppPolyBunch);
static void UpdateStaticShadows (void);
static void UpdatePermanentShadows (void);
static void CalcPedShadowValues (CVector vecLightDir, float *pfDisplacementX, float *pfDisplacementY, float *pfFrontX, float *pfFrontY, float *pfSideX, float *pfSideY);
static void CalcPedShadowValues (CVector vecLightDir, float *pfFrontX, float *pfFrontY, float *pfSideX, float *pfSideY, float *pfDisplacementX, float *pfDisplacementY);
static void RenderExtraPlayerShadows (void);
static void TidyUpShadows (void);
static void RenderIndicatorShadow (uint32 nID, uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity);