Files
FC1/RenderDll/XRenderNULL/NULL_REOcean.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

105 lines
2.4 KiB
C++

/*=============================================================================
PS2_REOcean.cpp : implementation of the Ocean Rendering.
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
Revision history:
* Created by Honitch Andrey
=============================================================================*/
#include "RenderPCH.h"
#include "NULL_Renderer.h"
#include "I3dengine.h"
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
//=======================================================================
void CREOcean::mfReset()
{
}
bool CREOcean::mfPreDraw(SShaderPass *sl)
{
return true;
}
void CREOcean::UpdateTexture()
{
}
void CREOcean::DrawOceanSector(SOceanIndicies *oi)
{
}
static _inline int Compare(SOceanSector *& p1, SOceanSector *& p2)
{
if(p1->m_Flags > p2->m_Flags)
return 1;
else
if(p1->m_Flags < p2->m_Flags)
return -1;
return 0;
}
static _inline float sCalcSplash(SSplash *spl, float fX, float fY)
{
CNULLRenderer *r = gcpNULL;
float fDeltaTime = r->m_RP.m_RealTime - spl->m_fStartTime;
float fScaleFactor = 1.0f / (r->m_RP.m_RealTime - spl->m_fLastTime + 1.0f);
float vDelt[2];
// Calculate 2D distance
vDelt[0] = spl->m_Pos[0] - fX; vDelt[1] = spl->m_Pos[1] - fY;
float fSqDist = vDelt[0]*vDelt[0] + vDelt[1]*vDelt[1];
// Inverse square root
unsigned int *n1 = (unsigned int *)&fSqDist;
unsigned int nn = 0x5f3759df - (*n1 >> 1);
float *n2 = (float *)&nn;
float fDistSplash = 1.0f / ((1.5f - (fSqDist * 0.5f) * *n2 * *n2) * *n2);
// Emulate sin waves
float fDistFactor = fDeltaTime*10.0f - fDistSplash + 4.0f;
fDistFactor = CLAMP(fDistFactor, 0.0f, 1.0f);
float fRad = (fDistSplash - fDeltaTime*10) * 0.4f / 3.1416f * 1024.0f;
float fSin = gRenDev->m_RP.m_tSinTable[QRound(fRad)&0x3ff] * fDistFactor;
return fSin * fScaleFactor * spl->m_fForce;
}
float *CREOcean::mfFillAdditionalBuffer(SOceanSector *os, int nSplashes, SSplash *pSplashes[], int& nCurSize, int nLod, float fSize)
{
return NULL;
}
void CREOcean::mfDrawOceanSectors()
{
}
void CREOcean::mfDrawOceanScreenLod()
{
}
bool CREOcean::mfDraw(SShader *ef, SShaderPass *sfm)
{
double time0 = 0;
ticks(time0);
if (CRenderer::CV_r_oceanrendtype == 0)
mfDrawOceanSectors();
else
mfDrawOceanScreenLod();
unticks(time0);
m_RS.m_StatsTimeRendOcean = (float)(time0*1000.0*g_SecondsPerCycle);
return true;
}