117 lines
3.6 KiB
C++
117 lines
3.6 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 CRYINCLUDE_CRY3DENGINE_CLOUDSMANAGER_H
|
|
#define CRYINCLUDE_CRY3DENGINE_CLOUDSMANAGER_H
|
|
#pragma once
|
|
|
|
class CCloudRenderNode;
|
|
|
|
typedef std::vector<SCloudParticle*> CloudParticles;
|
|
|
|
struct SCloudQuadTree
|
|
{
|
|
CloudParticles m_particles;
|
|
AABB m_bounds;
|
|
SCloudQuadTree* m_pQuads[4];
|
|
int m_level;
|
|
SCloudQuadTree(int level = 0)
|
|
{
|
|
m_pQuads[0] = 0;
|
|
m_pQuads[1] = 0;
|
|
m_pQuads[2] = 0;
|
|
m_pQuads[3] = 0;
|
|
m_level = level;
|
|
}
|
|
~SCloudQuadTree()
|
|
{
|
|
delete m_pQuads[0];
|
|
delete m_pQuads[1];
|
|
delete m_pQuads[2];
|
|
delete m_pQuads[3];
|
|
m_pQuads[0] = m_pQuads[1] = m_pQuads[2] = m_pQuads[3] = 0;
|
|
}
|
|
void Init(const AABB& bounds, const CloudParticles& particles, int maxlevel = 2);
|
|
bool CheckIntersection(const Vec3& p1, const Vec3& p2);
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// SCloudDescription contains cached representation of the cloud description file.
|
|
//////////////////////////////////////////////////////////////////////////
|
|
struct SCloudDescription
|
|
: public _reference_target_t
|
|
, public Cry3DEngineBase
|
|
{
|
|
string filename;
|
|
int m_textureRows;
|
|
int m_textureCols;
|
|
int m_numSprites;
|
|
|
|
AABB m_bounds;
|
|
Vec3 m_offset;
|
|
|
|
_smart_ptr<IMaterial> m_pMaterial;
|
|
std::vector<SCloudParticle> m_particles;
|
|
SCloudQuadTree* m_pCloudTree;
|
|
|
|
SCloudDescription()
|
|
{
|
|
m_textureRows = 0;
|
|
m_textureCols = 0;
|
|
m_numSprites = 0;
|
|
m_pCloudTree = 0;
|
|
};
|
|
~SCloudDescription();
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CloudsManager is used to manage cloud descriptions loaded from the files.
|
|
// When cloud file is once loaded it caches its content and next time the same
|
|
// cloud file is request, Clients will get the cached content.
|
|
//////////////////////////////////////////////////////////////////////////
|
|
class CCloudsManager
|
|
: public Cry3DEngineBase
|
|
{
|
|
public:
|
|
CCloudsManager() {};
|
|
~CCloudsManager() {};
|
|
|
|
// Loads cloud file and returns cloud description.
|
|
// If cloud was already loaded cached instance is returned.
|
|
// Reference count of the cloud description is incremented,Client must call Release on returned pointer to free cloud description.
|
|
SCloudDescription* LoadCloud(const char* sFilename);
|
|
|
|
// Used to parse xml node and create a cloud description from it.
|
|
void ParseCloudFromXml(XmlNodeRef node, SCloudDescription* pCloud);
|
|
|
|
void AddCloudRenderNode(CCloudRenderNode* pNode);
|
|
void RemoveCloudRenderNode(CCloudRenderNode* pNode);
|
|
bool CheckIntersectClouds(const Vec3& p1, const Vec3& p2);
|
|
void MoveClouds();
|
|
|
|
private:
|
|
friend struct SCloudDescription;
|
|
void Register(SCloudDescription* desc);
|
|
void Unregister(SCloudDescription* desc);
|
|
|
|
private:
|
|
typedef std::map<string, SCloudDescription*, stl::less_stricmp<string> > CloudsMaps;
|
|
|
|
CloudsMaps m_cloudsMap;
|
|
std::vector<CCloudRenderNode*> m_cloudNodes;
|
|
};
|
|
|
|
#endif // CRYINCLUDE_CRY3DENGINE_CLOUDSMANAGER_H
|