Override sun direction from sky dome [breaks packed sheets]

This commit is contained in:
kaetemi 2014-12-12 21:17:13 +01:00
parent d7ea4033f7
commit 00156b1d59
5 changed files with 56 additions and 1 deletions

View file

@ -24,6 +24,7 @@ CSkySheet::CSkySheet()
Type = SKY;
WaterEnvMapCameraHeight = 0.f;
WaterEnvMapAlpha = 255;
SunClipZ = -1.0f;
}
// *****************************************************************************************************
@ -53,6 +54,8 @@ void CSkySheet::build(const NLGEORGES::UFormElm &item, const std::string &prefix
item.getValueByName(FogColorBitmap, (prefix + "FogColorBitmap").c_str());
item.getValueByName(WaterEnvMapCameraHeight, (prefix + "WaterEnvMapCameraHeight").c_str());
item.getValueByName(WaterEnvMapAlpha, (prefix + "WaterEnvMapAlpha").c_str());
item.getValueByName(SunSource, (prefix + "SunSource").c_str());
item.getValueByName(SunClipZ, (prefix + "SunClipZ").c_str());
}
// *****************************************************************************************************
@ -67,6 +70,8 @@ void CSkySheet::serial(class NLMISC::IStream &f) throw(NLMISC::EStream)
f.serial(FogColorBitmap);
f.serial(WaterEnvMapCameraHeight);
f.serial(WaterEnvMapAlpha);
f.serial(SunSource);
f.serial(SunClipZ);
}
// *****************************************************************************************************

View file

@ -39,6 +39,9 @@ public:
// Water env map (computed from sky scene)
float WaterEnvMapCameraHeight;
uint8 WaterEnvMapAlpha;
// Sun direction override
std::string SunSource;
float SunClipZ;
public:
// ctor
CSkySheet();

View file

@ -477,7 +477,15 @@ void CLightCycleManager::setDirLight(const CDirLightSetup &setup0, const CDirLig
scene.setSunAmbient (resultSetup.Ambiant);
scene.setSunDiffuse (resultSetup.Diffuse);
scene.setSunSpecular (resultSetup.Specular);
scene.setSunDirection(resultSetup.Direction);
CSky &sky = ContinentMngr.cur()->CurrentSky;
if (sky.overrideSunDirection())
{
scene.setSunDirection(sky.calculateSunDirection());
}
else
{
scene.setSunDirection(resultSetup.Direction);
}
}
//-----------------------------------------------

View file

@ -48,6 +48,8 @@ CSky::CSky()
_FogColor = NULL;
_WaterEnvMapCameraHeight = 0.f;
_WaterEnvMapAlpha = 255;
_SunSource = -1;
_SunClipZ = -1.0f;
}
// *************************************************************************************************
@ -217,6 +219,39 @@ void CSky::init(UDriver *drv, const CSkySheet &sheet, bool forceFallbackVersion
_NumHourInDay = numHourInDay;
_WaterEnvMapCameraHeight = sheet.WaterEnvMapCameraHeight;
_WaterEnvMapAlpha= sheet.WaterEnvMapAlpha;
//
// Find sun source
std::string sunSource = NLMISC::toLower(sheet.SunSource);
_SunSource = -1;
if (sunSource.size())
{
uint numObjects = (uint)_Objects.size();
for (uint k = 0; k < numObjects; ++k)
{
if (NLMISC::toLower(_Objects[k].Name) == sunSource)
{
nldebug("Found sun source: '%s'", sunSource.c_str());
_SunSource = k;
}
}
}
_SunClipZ = sheet.SunClipZ;
}
// *************************************************************************************************
bool CSky::overrideSunDirection() const
{
return (_SunSource >= 0)
&& (_Objects[_SunSource].Instance.getLastClippedState());
}
// *************************************************************************************************
NLMISC::CVector CSky::calculateSunDirection() const
{
CVector sunPos = _Objects[_SunSource].Instance.getLastWorldMatrixComputed().getPos();
CVector baseDir = (-sunPos).normed();
baseDir.z = std::max(_SunClipZ, baseDir.z);
return baseDir.normed();
}
// *************************************************************************************************

View file

@ -63,6 +63,8 @@ public:
NLMISC::CRGBA computeFogColor(const CClientDate &date, float weatherLevel) const;
float getWaterEnvMapCameraHeight() const { return _WaterEnvMapCameraHeight; }
uint8 getWaterEnvMapAlpha() const { return _WaterEnvMapAlpha; }
bool overrideSunDirection() const;
NLMISC::CVector calculateSunDirection() const;
private:
std::vector<CSkyObject> _Objects; // all the object in the sky
std::vector<NLMISC::CBitmap *> _Bitmaps; // all the bitmaps for the color lookups
@ -80,6 +82,8 @@ private:
NLMISC::CBitmap *_FogColor;
float _WaterEnvMapCameraHeight;
uint8 _WaterEnvMapAlpha;
sint _SunSource;
float _SunClipZ;
};