// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // 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 <http://www.gnu.org/licenses/>. #ifndef CL_SKY_OBJECT_H #define CL_SKY_OBJECT_H #include "nel/misc/bitmap.h" // #include "nel/3d/u_instance.h" #include "nel/3d/u_particle_system_instance.h" // #include "client_sheets/sky_object_sheet.h" // #include "time_client.h" namespace NL3D { class UAnimationSet; class UPlayListManager; class UPlayManager; } class CSkyObject { public: //////////////////////////////////////////////// // tells how a color is computed in the shape // //////////////////////////////////////////////// class CColorInfo { public: NLMISC::CBitmap *Map; // color computed from a map depending on hour & weather (NULL if color is unseted) TSkyColorMode Mode; // how the color is to be used public: CColorInfo() : Map(NULL) {} /** Init color map from its name. Eventually load the bitmap if itsn't found in the map * \param bitmapByName already build bitmap, sorted by their name * \param buildBitmap list of used bitmap (to be completed if required bitmap id not in "bitmapByName") */ void init(const CSkyObjectSheet::CColorInfoSheet &ci, std::map<std::string, NLMISC::CBitmap *> &bitmapByName, std::vector<NLMISC::CBitmap *> &buildBitmap); // compute color depending on hour & weather & fog color NLMISC::CRGBA computeColor(float dayPart, float weatherLevel, NLMISC::CRGBA fogColor); }; //////////////////////////////////////////////////////////////////////////////// // tells how a color gradient is computed in the shape (-> sky dome gradient) // //////////////////////////////////////////////////////////////////////////////// class CColorGradientInfo { public: sint32 TargetTextureStage; // the texture stage to which the gradient must be applied. /** each bitmap in the following list gives the gradient depending on light level. The V coordinate gives the gradient values, end U gives the light level * each bitmap match a weather state. First bitmap maps to weather value = 0 and last bitmap maps to weather value = 1 * for intermediary weather values, the two nearest bitmap are blended to get the value of the gradient */ std::vector<NLMISC::CBitmap *> WeatherToGradient; NLMISC::CBitmap Slice0[2]; // 2 column for slice 0 NLMISC::CBitmap Slice1[2]; // 2 columns for slice 1 NLMISC::CBitmap Final; public: // ctor CColorGradientInfo() : TargetTextureStage(0) {} /** Init from a sheet. * Init color gradient from its bitmap names. Eventually load the bitmap if itsn't found in the map * \param bitmapByName already build bitmap, sorted by their name * \param buildBitmap list of used bitmap (to be completed if required bitmaps are not in "bitmapByName") */ void init(const CSkyObjectSheet::CColorGradientInfoSheet &cgi, std::map<std::string, NLMISC::CBitmap *> &bitmapByName, std::vector<NLMISC::CBitmap *> &buildBitmap); void setup(NL3D::UInstance instance, float dayPart, float weatherLevel, NLMISC::CBitmap &gradientCache, NLMISC::CBitmap &gradientCacheBlurred); }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// NL3D::UInstance Instance; // Instance of object to be displayed NL3D::UParticleSystemInstance PS; // If the object is also a particle system, keep a pointer on it. // CColorInfo DiffuseColor; // map for diffuse color (or fx color), depending on light level and weather CColorInfo ParticleEmitters; // map whose R channel control emitters activation CColorInfo ConstantColor[SKY_MAX_NUM_STAGE]; // map for constant color at each stage CColorGradientInfo ColorGradient; TSkyRefColor RefColor; // tells which color info is used to test if object is visible (when alpha is 0, the object must be hidden) // cache last colors NLMISC::CRGBA LastDiffuseColor; NLMISC::CRGBA LastParticleEmittersColor; NLMISC::CRGBA LastConstantColor[SKY_MAX_NUM_STAGE]; // cache last gradient NLMISC::CBitmap GradientCache; NLMISC::CBitmap GradientCacheBlurred; NLMISC::CUV TexPanner[SKY_MAX_NUM_STAGE]; NLMISC::CUV OffsetFactor[SKY_MAX_NUM_STAGE]; NLMISC::CBitmap *FXUserParams[SKY_MAX_NUM_FX_USER_PARAMS]; // texture scaling depending on weather and time NLMISC::CBitmap *OffsetUBitmap[SKY_MAX_NUM_STAGE]; NLMISC::CBitmap *OffsetVBitmap[SKY_MAX_NUM_STAGE]; std::string Name; bool Active; // bool VisibleInMainScene; bool VisibleInEnvMap; public: // ctor CSkyObject() : Instance(NULL), PS(NULL), Active(false), VisibleInMainScene(true), VisibleInEnvMap(true) { LastDiffuseColor.set(0, 0, 0, 0); LastParticleEmittersColor.set(0, 0, 0, 0); for(uint k = 0; k < SKY_MAX_NUM_STAGE; ++k) { LastConstantColor[k].set(0, 0, 0, 0); OffsetUBitmap[k] = NULL; OffsetVBitmap[k] = NULL; TexPanner[k].set(0.f, 0.f); OffsetFactor[k].set(1.f, 1.f); } for(uint k = 0; k < SKY_MAX_NUM_FX_USER_PARAMS; ++k) { FXUserParams[k] = NULL; } } // dtor ~CSkyObject(); /** Init sky object from a sheet (main or fallback version) * \param sheet to init from * \param instance Instance of the object in the scene * \param bitmapByName already build bitmap, sorted by their name * \param buildBitmap list of used bitmap (to be completed if required bitmap id not in "bitmapByName") */ void init(const CSkyObjectSheet::CVersionSheet &sheet, NL3D::UInstance instance, std::map<std::string, NLMISC::CBitmap *> &bitmapByName, std::vector<NLMISC::CBitmap *> &builtBitmaps, bool visibleInMainScene, bool visibleInEnvMap ); /** setup the given instance to reflect the given hour & weather * \param duskSetup true if the setup os for the dusk (dawn otherwise) * \return true if the object is visible */ bool setup(const CClientDate &date, const CClientDate &animationDate, float numHoursInDay, float weatherLevel, NLMISC::CRGBA fogColor, bool envMapScene); }; #endif