1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
4 #include <CryRenderer/RenderElements/CREWaterVolume.h>
6 #define CYCLE_BUFFERS_NUM 4
8 class COcean final
: public IRenderNode
, public Cry3DEngineBase
11 COcean(IMaterial
* pMat
);
14 void Create(const SRenderingPassInfo
& passInfo
);
15 void Update(const SRenderingPassInfo
& passInfo
);
16 void Render(const SRenderingPassInfo
& passInfo
);
18 bool IsVisible(const SRenderingPassInfo
& passInfo
);
20 void SetLastFov(float fLastFov
) { m_fLastFov
= fLastFov
; }
21 static void SetTimer(ITimer
* pTimer
);
23 static float GetWave(const Vec3
& pPosition
, int32 nFrameID
);
24 static uint32
GetVisiblePixelsCount();
25 int32
GetMemoryUsage();
27 // fake IRenderNode implementation
28 virtual EERType
GetRenderNodeType() const override
{ return eERType_WaterVolume
; }
29 virtual const char* GetEntityClassName(void) const override
{ return "Ocean"; }
30 virtual const char* GetName(void) const override
{ return "Ocean"; }
31 virtual Vec3
GetPos(bool) const override
;
32 virtual void Render(const SRendParams
&, const SRenderingPassInfo
& passInfo
) override
{}
33 virtual IPhysicalEntity
* GetPhysics(void) const override
{ return 0; }
34 virtual void SetPhysics(IPhysicalEntity
*) override
{}
35 virtual void SetMaterial(IMaterial
* pMat
) override
{ m_pMaterial
= pMat
; }
36 virtual IMaterial
* GetMaterial(Vec3
* pHitPos
= NULL
) const override
;
37 virtual IMaterial
* GetMaterialOverride() const override
{ return m_pMaterial
; }
38 virtual float GetMaxViewDist() const override
{ return 1000000.f
; }
39 virtual void GetMemoryUsage(ICrySizer
* pSizer
) const override
{}
40 virtual const AABB
GetBBox() const override
{ return AABB(Vec3(-1000000.f
, -1000000.f
, -1000000.f
), Vec3(1000000.f
, 1000000.f
, 1000000.f
)); }
41 virtual void SetBBox(const AABB
& WSBBox
) override
{}
42 virtual void FillBBox(AABB
& aabb
) const override
{ aabb
= GetBBox(); }
43 virtual void OffsetPosition(const Vec3
& delta
) override
;
47 void RenderFog(const SRenderingPassInfo
& passInfo
);
48 void RenderBottomCap(const SRenderingPassInfo
& passInfo
);
53 IMaterial
* m_pMaterial
;
57 uint32 m_nIndicesCount
;
59 int32 m_nTessellationType
;
60 int32 m_nTessellationTiles
;
62 // Ocean bottom cap data
63 _smart_ptr
<IMaterial
> m_pBottomCapMaterial
;
64 _smart_ptr
<IRenderMesh
> m_pBottomCapRenderMesh
;
66 PodArray
<SVF_P3F_C4B_T2F
> m_pBottomCapVerts
;
67 PodArray
<vtx_idx
> m_pBottomCapIndices
;
71 class CREOcclusionQuery
* m_pREOcclusionQueries
[CYCLE_BUFFERS_NUM
];
72 IShader
* m_pShaderOcclusionQuery
;
74 float m_fLastVisibleFrameTime
;
75 int32 m_nLastVisibleFrameId
;
76 static uint32 m_nVisiblePixelsCount
;
78 float m_fRECustomData
[12]; // used for passing data to renderer
79 float m_fREOceanBottomCustomData
[8]; // used for passing data to renderer
82 // Ocean fog related members
83 CREWaterVolume::SParams m_wvParams
[RT_COMMAND_BUF_COUNT
];
84 CREWaterVolume::SOceanParams m_wvoParams
[RT_COMMAND_BUF_COUNT
];
86 _smart_ptr
<IMaterial
> m_pFogIntoMat
;
87 _smart_ptr
<IMaterial
> m_pFogOutofMat
;
88 _smart_ptr
<IMaterial
> m_pFogIntoMatLowSpec
;
89 _smart_ptr
<IMaterial
> m_pFogOutofMatLowSpec
;
91 CREWaterVolume
* m_pWVRE
[RT_COMMAND_BUF_COUNT
];
92 std::vector
<SVF_P3F_C4B_T2F
> m_wvVertices
[RT_COMMAND_BUF_COUNT
];
93 std::vector
<uint16
> m_wvIndices
[RT_COMMAND_BUF_COUNT
];
95 static ITimer
* m_pOceanTimer
;
96 static CREWaterOcean
* m_pOceanRE
;