You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/CryEngine/RenderDll/Common/RendElements/CRECloud.h

174 lines
5.7 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#ifndef __CRECLOUD_H__
#define __CRECLOUD_H__
//=============================================================
#define FCEF_OLD 0x1000
class CRECloud
: public CREBaseCloud
{
friend class CREImposter;
protected: // datatypes
typedef std::vector<SCloudParticle*> ParticleArray;
typedef ParticleArray::iterator ParticleIterator;
typedef ParticleArray::const_iterator ParticleConstIterator;
typedef std::vector<Vec3> DirectionArray;
typedef DirectionArray::iterator DirectionIterator;
class ParticleAwayComparator
{
public:
bool operator()(SCloudParticle* pA, SCloudParticle* pB)
{
return ((*pA) < (*pB));
}
};
class ParticleTowardComparator
{
public:
bool operator()(SCloudParticle* pA, SCloudParticle* pB)
{
return ((*pA) > (*pB));
}
};
protected: // data
enum ESortDirection
{
eSort_TOWARD,
eSort_AWAY
};
ParticleArray m_particles; // cloud particles
// particle sorting functors for STL sort.
ParticleTowardComparator m_towardComparator;
ParticleAwayComparator m_awayComparator;
DirectionArray m_lightDirections;// light directions in cloud space (cached)
SMinMaxBox m_boundingBox; // bounds
bool m_bUseAnisoLighting;
Vec3 m_vLastSortViewDir;
Vec3 m_vLastSortCamPos;
Vec3 m_vSortPos;
float m_fSplitDistance;
bool m_bReshadeCloud;
bool m_bEnabled;
float m_fScale;
CTexture* m_pTexParticle;
uint32 m_nNumPlanes;
uint32 m_nNumColorGradients;
ColorF m_CurSpecColor;
ColorF m_CurDiffColor;
float m_fCloudColorScale; // needed for HDR (>=1)
static uint32 m_siShadeResolution;// the resolution of the viewport used for shading
static float m_sfAlbedo; // the cloud albedo
static float m_sfExtinction; // the extinction of the clouds
static float m_sfTransparency;// the transparency of the clouds
static float m_sfScatterFactor;// How much the clouds scatter
static float m_sfSortAngleErrorTolerance;// how far the view must turn to cause a resort.
static float m_sfSortSquareDistanceTolerance;// how far the view must move to cause a resort.
protected:
void SortParticles(const Vec3& vViewDir, const Vec3& vSortPoint, ESortDirection eDir);
void GetIllumParams(ColorF& specColor, ColorF& diffColor);
void ShadeCloud(Vec3 vPos);
void IlluminateCloud(Vec3 vLightPos, Vec3 vObjPos, ColorF cLightColor, ColorF cAmbColor, bool bReset);
void DisplayWithoutImpostor(const CameraViewParameters& camera);
bool mfDisplay(bool bDisplayFrontOfSplit);
void UpdateWorldSpaceBounds(CRenderObject* pObj);
inline float GetScale() { return m_fScale; }
bool UpdateImposter(CRenderObject* pObj);
bool mfLoadCloud(const string& name, float fScale, bool bLocal);
void ClearParticles()
{
size_t size = m_particles.size();
for (size_t i(0); i < size; ++i)
{
delete m_particles[i];
}
m_particles.resize(0);
}
public:
CRECloud()
: CREBaseCloud()
, m_bUseAnisoLighting(true)
, m_bReshadeCloud(true)
, m_bEnabled(true)
, m_fScale(1.0f)
, m_vLastSortViewDir(Vec3(0, 0, 0))
, m_vLastSortCamPos(Vec3(0, 0, 0))
, m_CurSpecColor(Col_White)
, m_CurDiffColor(Col_White)
, m_pTexParticle(NULL)
, m_nNumPlanes(0)
, m_nNumColorGradients(0)
, m_fCloudColorScale(1)
{
mfSetType(eDATA_Cloud);
mfSetFlags(FCEF_TRANSFORM);
}
virtual ~CRECloud()
{
ClearParticles();
}
virtual bool mfCompile(CParserBin& Parser, SParserFrame& Frame);
virtual void mfPrepare(bool bCheckOverflow);
virtual bool mfDraw(CShader* ef, SShaderPass* sl);
virtual void SetParticles(SCloudParticle* pParticles, int nNumParticles)
{
m_bReshadeCloud = true;
m_boundingBox.Clear();
ClearParticles();
m_particles.reserve(nNumParticles);
for (int i = 0; i < nNumParticles; i++)
{
SCloudParticle* pPart = new SCloudParticle;
*pPart = pParticles[i];
float rx = pPart->GetRadiusX();
Vec3 vMin = pPart->GetPosition() - Vec3(rx, rx, rx);
Vec3 vMax = pPart->GetPosition() + Vec3(rx, rx, rx);
m_boundingBox.AddPoint(vMin);
m_boundingBox.AddPoint(vMax);
m_particles.push_back(pPart);
}
}
bool GenerateCloudImposter(CShader* pShader, CShaderResources* pRes, CRenderObject* pObject);
};
#endif // __CRECLOUD_H__