165 lines
6.6 KiB
C++
165 lines
6.6 KiB
C++
// 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
|