159 lines
5.6 KiB
C++
159 lines
5.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_LIGHT_CYCLE_MANAGER_H
|
|
#define CL_LIGHT_CYCLE_MANAGER_H
|
|
|
|
/////////////
|
|
// INCLUDE //
|
|
/////////////
|
|
// Misc.
|
|
#include "nel/misc/types_nl.h"
|
|
#include "nel/misc/rgba.h"
|
|
// 3D Interface.
|
|
#include "nel/3d/u_driver.h"
|
|
#include "nel/3d/u_light.h"
|
|
|
|
#include "game_share/dir_light_setup.h"
|
|
#include "ig_enum.h"
|
|
|
|
///////////
|
|
// USING //
|
|
///////////
|
|
|
|
namespace NL3D
|
|
{
|
|
class UScene;
|
|
}
|
|
|
|
|
|
/// Description of the hours for days / night
|
|
struct CLightCycleDesc
|
|
{
|
|
float RealDayLength; // real length of the day, in seconds
|
|
float NumHours; // number of ryzom hours in a day
|
|
float NightTransitionStartHour; // start of night transition
|
|
float NightTransitionEndHour; // end of night transition
|
|
float DuskRatio; // ratio for dusk transition. e.g. when set to 0.5f, that means that the dusk colors are taken when the day->night transition is at its half
|
|
float DawnTransitionStartHour; // start of dawn transition
|
|
float DawnTransitionEndHour; // end of dawn transition
|
|
uint MaxNumColorSteps; // the max number of color steps
|
|
//
|
|
float getNightTransitionLength() const;
|
|
float getDawnTransitionLength() const;
|
|
};
|
|
|
|
|
|
class CWeatherManagerClient;
|
|
|
|
/**
|
|
* This class manage the weather and the time.
|
|
* \author Guillaume PUZIN
|
|
* \author Nicolas Vizerie
|
|
* \author Nevrax France
|
|
* \date 2001
|
|
*/
|
|
class CLightCycleManager : public IIGObserver
|
|
{
|
|
public:
|
|
enum TLightState { Day = 0, Night, DayToNight, NightToDay, StateUnknown };
|
|
public:
|
|
/// ctor
|
|
CLightCycleManager();
|
|
/** Set the description of the light cycle
|
|
* This also reset the hour to 0
|
|
* \param desc description of lighting intervals
|
|
* \return true If the desc was valid (not overlapping transitions..)
|
|
*/
|
|
bool setLightDesc(const CLightCycleDesc &desc);
|
|
// get the current light desc
|
|
const CLightCycleDesc &getLightDesc() const { return _Desc; }
|
|
/** Set the current hour, and change color if necessary.
|
|
* The caller can provide an additionnal lightning color if he want
|
|
* NB : the weather manager is needed if the lighting needs to be overriden in case of bad weather
|
|
*/
|
|
void setHour(float hour, const CWeatherManagerClient &wm, NLMISC::CRGBA lightningColor);
|
|
//
|
|
float getHour() const { return _Hour; }
|
|
// Get the last computed light level in a call to setHour (from 0 fro day to 1 for night)
|
|
float getLightLevel() const { return _LightLevel; }
|
|
/// Create driver directionnal light light
|
|
void create();
|
|
/** Touch the light setup.
|
|
* The landscape patch are recomputed
|
|
*/
|
|
void touch();
|
|
/// Get needed landscape update freq (or 0 if the setupped lightDesc was not valid)
|
|
float getLandscapePatchUpdateFreq() const;
|
|
|
|
/// Returns a string that describ the current state (day, night, ...)
|
|
std::string getStateString() const;
|
|
|
|
// Returns an enum that describe the current state
|
|
TLightState getState() const
|
|
{
|
|
return _State;
|
|
}
|
|
|
|
/// Test if a day->night or night->day transition is currently occuring
|
|
bool isInTransition() const;
|
|
|
|
/// From IIGObserver
|
|
virtual void instanceGroupLoaded(NL3D::UInstanceGroup * /* ig */) { }
|
|
virtual void instanceGroupAdded(NL3D::UInstanceGroup *ig);
|
|
virtual void instanceGroupRemoved(NL3D::UInstanceGroup * /* ig */) { }
|
|
|
|
/// get the light level at the given hour
|
|
float getLightLevel(float hour) const;
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
private:
|
|
float _Hour;
|
|
bool _Touched;
|
|
bool _ValidDesc;
|
|
NLMISC::CRGBA _LastDiffuse, _LastAmbient;
|
|
CLightCycleDesc _Desc;
|
|
float _LightLevel;
|
|
float _WeatherLighting, _LastWeatherLighting;
|
|
float _UpdateFreq;
|
|
TLightState _State;
|
|
TLightState _PrevState;
|
|
private:
|
|
void getLandscapeLightColor(NLMISC::CRGBA &diffuse, NLMISC::CRGBA &ambiant);
|
|
static bool isInInterval(float start, float end, float value);
|
|
static bool isInDayInterval(float startHour, float endHour, float dayDuration, float hour, float &ratio);
|
|
void setDirLight(const CDirLightSetup &setup0, const CDirLightSetup &setup1, float level, float intensity, NL3D::UScene &scene);
|
|
// get the number of hours for a landscape patch update
|
|
float getUpdateDuration() const;
|
|
/// Set the light to render the canopy or the sky
|
|
void setupCanopyLight(float intensity);
|
|
/// Set the light to render the main scene
|
|
void setupMainLight(float intensity);
|
|
// Setup light for canopy or main scene
|
|
void setupDayToNightLight(NL3D::UScene &scene, const CDirLightSetup &dayLight, const CDirLightSetup &duskLight, const CDirLightSetup &nightLight, float lightIntensity);
|
|
// Update the '_State' field
|
|
void updateState();
|
|
};
|
|
|
|
|
|
#endif // LIGHT_CYCLE_MANAGER
|
|
|
|
/* End of weather.h */
|