Override sun direction from sky dome [breaks packed sheets]
This commit is contained in:
parent
d7ea4033f7
commit
00156b1d59
5 changed files with 56 additions and 1 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
// *****************************************************************************************************
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
// *************************************************************************************************
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue