// NeL - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef NL_CLOUD_SCAPE_H #define NL_CLOUD_SCAPE_H // ------------------------------------------------------------------------------------------------ #include "nel/3d/material.h" #include "nel/3d/texture.h" #include "nel/3d/texture_mem.h" #include "nel/3d/vertex_buffer.h" #include "nel/misc/smart_ptr.h" #include "nel/misc/geom_ext.h" #include "nel/misc/value_smoother.h" #include "nel/3d/cloud.h" #include "nel/3d/noise_3d.h" #include "nel/3d/u_cloud_scape.h" namespace NL3D { // ------------------------------------------------------------------------------------------------ struct SCloudTexture3D { uint32 Width, Height, Depth; uint32 NbW, NbH; // Number of slice in width and height (NbW*NbH = Depth) uint8 *Mem; uint8 *Mem2; uint8 *MemBuffer; NLMISC::CSmartPtr Tex; NLMISC::CSmartPtr Tex2; NLMISC::CSmartPtr TexBuffer; NL3D::CMaterial ToLightRGB; NL3D::CMaterial ToLightAlpha; NL3D::CMaterial ToBill; NL3D::CMaterial MatCopy; SCloudTexture3D (); void init (uint32 nWidth, uint32 nHeight, uint32 nDepth); }; // ------------------------------------------------------------------------------------------------ struct SCloudTextureClamp { uint32 Width, Height, Depth; uint32 NbW, NbH; // Number of slice in width and height (NbW*NbH = Depth) uint8 *Mem; NLMISC::CSmartPtr Tex; NL3D::CMaterial ToClamp; SCloudTextureClamp (); void init (uint32 nWidth, uint32 nHeight, uint32 nDepth, const std::string &filename); }; // ------------------------------------------------------------------------------------------------ class CCloudScape { public: CCloudScape (NL3D::IDriver *pDriver); ~CCloudScape (); void init (SCloudScapeSetup *pCSS = NULL, NL3D::CCamera *pCamera = NULL); void set (SCloudScapeSetup &css); // Function that make cloud scape (work with screeen as temp buffer) void anim (double dt, NL3D::CCamera *pCamera); // Render all clouds to the screen void render (); uint32 getMemSize(); void setQuality (float threshold) { _LODQualityThreshold = threshold; } void setNbCloudToUpdateIn80ms (uint32 n) { _NbHalfCloudToUpdate = n; } bool isDebugQuadEnabled () { return _DebugQuad; } void setDebugQuad (bool b) { _DebugQuad = b; } private: void makeHalfCloud (); private: uint32 _NbHalfCloudToUpdate; // In 40 ms double _GlobalTime; double _DeltaTime; double _DTRest; NLMISC::CValueSmoother _AverageFrameRate; bool _Generate; // or light ? CCloud *_CurrentCloudInProcess; // Current cloud that is processing double _CurrentCloudInProcessFuturTime; std::vector _CloudPower; std::vector _ShouldProcessCloud; SCloudScapeSetup _CurrentCSS; SCloudScapeSetup _NewCSS; SCloudScapeSetup _OldCSS; double _TimeNewCSS; bool _IsIncomingCSS; SCloudScapeSetup _IncomingCSS; CNoise3d _Noise3D; std::vector _AllClouds; // Cloud scheduler struct SCloudSchedulerEntry { sint32 CloudIndex; sint32 DeltaNextCalc; uint32 Frame; NLMISC::CRGBA Ambient; NLMISC::CRGBA Diffuse; uint8 Power; SCloudSchedulerEntry() { CloudIndex = DeltaNextCalc = -1; } }; struct SCloudSchedulerAccel { bool ValidPos; std::list::iterator Pos; // uint32 Frame; SCloudSchedulerAccel() { ValidPos = false; } }; // std::deque _CloudScheduler; std::list _CloudScheduler; uint32 _CloudSchedulerSize; std::vector _CloudSchedulerLastAdded; uint32 _FrameCounter; std::vector _ExtrapolatedPriorities; // Cloud sort struct SSortedCloudEntry { CCloud *Cloud; float Distance; }; std::vector _SortedClouds; float _LODQualityThreshold; bool _DebugQuad; NL3D::IDriver *_Driver; NL3D::CVertexBuffer _VertexBuffer; NL3D::CMaterial _MatClear; NL3D::CMaterial _MatBill; NL3D::CCamera *_ViewerCam; SCloudTexture3D Tex3DTemp; SCloudTextureClamp TexClamp; // Driver reset counter initial value uint _ResetCounter; friend class CCloud; double _LastAnimRenderTime; double _MaxDeltaTime; }; // ------------------------------------------------------------------------------------------------ } // namespace NL3D #endif // NL_CLOUD_SCAPE_H