Transitions between skys. 1

meow-7.2.2
Rider Linden 2018-02-05 15:12:23 -08:00
parent 1488567212
commit f07e5ee2a4
3 changed files with 103 additions and 48 deletions

View File

@ -241,7 +241,7 @@ class LLSettingsBlender : public boost::enable_shared_from_this<LLSettingsBlende
{
public:
typedef boost::shared_ptr<LLSettingsBlender> ptr_t;
typedef boost::signals2::signal<void(const ptr_t &)> finish_signal_t;
typedef boost::signals2::signal<void(const ptr_t )> finish_signal_t;
typedef boost::signals2::connection connection_t;
static const F64Seconds DEFAULT_THRESHOLD;

View File

@ -360,26 +360,33 @@ void LLEnvironment::updateEnvironment(F64Seconds transition)
if (mCurrentEnvironment != pinstance)
{
LLSettingsSky::ptr_t psky = mCurrentEnvironment->getSky();
LLSettingsWater::ptr_t pwater = mCurrentEnvironment->getWater();
DayInstance::ptr_t trans = boost::make_shared<DayTransition>(
mCurrentEnvironment->getSky(), mCurrentEnvironment->getWater(), pinstance, transition);
LLSettingsSky::ptr_t ptargetsky = psky->buildClone();
LLSettingsWater::ptr_t ptargetwater = pwater->buildClone();
LLSettingsBlender::ptr_t skyblend = boost::make_shared<LLSettingsBlender>(ptargetsky, psky, pinstance->getSky(), transition);
skyblend->setOnFinished(boost::bind(&LLEnvironment::onTransitionDone, this, _1, true));
LLSettingsBlender::ptr_t waterblend = boost::make_shared<LLSettingsBlender>(ptargetwater, pwater, pinstance->getWater(), transition);
waterblend->setOnFinished(boost::bind(&LLEnvironment::onTransitionDone, this, _1, false));
trans->animate();
pinstance->setBlenders(skyblend, waterblend);
mCurrentEnvironment = pinstance;
mCurrentEnvironment->animate();
mCurrentEnvironment = trans;
//
// LLSettingsSky::ptr_t psky = mCurrentEnvironment->getSky();
// LLSettingsWater::ptr_t pwater = mCurrentEnvironment->getWater();
//
// LLSettingsSky::ptr_t ptargetsky = psky->buildClone();
// LLSettingsWater::ptr_t ptargetwater = pwater->buildClone();
//
// LLSettingsBlender::ptr_t skyblend = boost::make_shared<LLSettingsBlender>(ptargetsky, psky, pinstance->getSky(), transition);
// skyblend->setOnFinished(boost::bind(&LLEnvironment::onTransitionDone, this, _1, true));
// LLSettingsBlender::ptr_t waterblend = boost::make_shared<LLSettingsBlender>(ptargetwater, pwater, pinstance->getWater(), transition);
// waterblend->setOnFinished(boost::bind(&LLEnvironment::onTransitionDone, this, _1, false));
//
// pinstance->setBlenders(skyblend, waterblend);
//
// mCurrentEnvironment = pinstance;
//
// mCurrentEnvironment->animate();
}
}
void LLEnvironment::onTransitionDone(const LLSettingsBlender::ptr_t &blender, bool isSky)
void LLEnvironment::onTransitionDone(const LLSettingsBlender::ptr_t blender, bool isSky)
{
/*TODO: Test for both sky and water*/
mCurrentEnvironment->animate();
@ -394,29 +401,16 @@ void LLEnvironment::update(const LLViewerCamera * cam)
F32Seconds delta(timer.getElapsedTimeAndResetF32());
for (InstanceArray_t::iterator it = mEnvironments.begin(); it != mEnvironments.end(); ++it)
{
if (*it)
(*it)->update(delta);
}
// for (InstanceArray_t::reverse_iterator it = mEnvironments.rbegin(); it != mEnvironments.rend(); ++it)
// {
// if (*it)
// (*it)->update(delta);
// }
mCurrentEnvironment->update(delta);
// update clouds, sun, and general
updateCloudScroll();
// if (mBlenderSky)
// mBlenderSky->update(delta);
// if (mBlenderWater)
// mBlenderWater->update(delta);
//
//
// if (mCurrentDay)
// mCurrentDay->update();
//
// if (mCurrentEnvironment->getSky())
// mCurrentEnvironment->getSky()->update();
// if (mCurrentEnvironment->getWater())
// mCurrentEnvironment->getWater()->update();
F32 camYaw = cam->getYaw();
stop_glerror();
@ -1348,10 +1342,10 @@ void LLEnvironment::DayInstance::update(F64Seconds delta)
if (mBlenderWater)
mBlenderWater->update(delta);
if (mSky)
mSky->update();
if (mWater)
mWater->update();
// if (mSky)
// mSky->update();
// if (mWater)
// mWater->update();
}
void LLEnvironment::DayInstance::setDay(const LLSettingsDay::ptr_t &pday, S64Seconds daylength, S64Seconds dayoffset)
@ -1490,7 +1484,7 @@ void LLEnvironment::DayInstance::animate()
}
}
void LLEnvironment::DayInstance::onTrackTransitionDone(S32 trackno, const LLSettingsBlender::ptr_t &blender)
void LLEnvironment::DayInstance::onTrackTransitionDone(S32 trackno, const LLSettingsBlender::ptr_t blender)
{
LL_WARNS("LAPRAS") << "onTrackTransitionDone for " << trackno << LL_ENDL;
F64Seconds now(LLDate::now().secondsSinceEpoch());
@ -1510,3 +1504,48 @@ void LLEnvironment::DayInstance::onTrackTransitionDone(S32 trackno, const LLSett
blender->reset((*bounds.first).second, (*bounds.second).second, timespan);
}
//-------------------------------------------------------------------------
LLEnvironment::DayTransition::DayTransition(const LLSettingsSky::ptr_t &skystart,
const LLSettingsWater::ptr_t &waterstart, LLEnvironment::DayInstance::ptr_t &end, S64Seconds time) :
DayInstance(),
mStartSky(skystart),
mStartWater(waterstart),
mNextInstance(end),
mTransitionTime(time)
{
}
void LLEnvironment::DayTransition::update(F64Seconds delta)
{
mNextInstance->update(delta);
DayInstance::update(delta);
}
void LLEnvironment::DayTransition::animate()
{
mNextInstance->animate();
mWater = mStartWater->buildClone();
mBlenderWater = boost::make_shared<LLSettingsBlender>(mWater, mStartWater, mNextInstance->getWater(), mTransitionTime);
mBlenderWater->setOnFinished(boost::bind(&LLEnvironment::DayTransition::onTransitonDone, this, LLSettingsDay::TRACK_WATER, _1));
mSky = mStartSky->buildClone();
mBlenderSky = boost::make_shared<LLSettingsBlender>(mSky, mStartSky, mNextInstance->getSky(), mTransitionTime);
mBlenderSky->setOnFinished(boost::bind(&LLEnvironment::DayTransition::onTransitonDone, this, LLSettingsDay::TRACK_MAX, _1));
}
void LLEnvironment::DayTransition::onTransitonDone(S32 trackno, const LLSettingsBlender::ptr_t blender)
{
if (trackno == LLSettingsDay::TRACK_WATER)
mBlenderWater.reset();
else
mBlenderSky.reset();
if (!mBlenderSky && !mBlenderWater)
{
LLEnvironment::instance().mCurrentEnvironment = mNextInstance;
}
}

View File

@ -220,8 +220,9 @@ private:
typedef boost::shared_ptr<DayInstance> ptr_t;
DayInstance();
virtual ~DayInstance() { };
void update(F64Seconds);
virtual void update(F64Seconds);
void setDay(const LLSettingsDay::ptr_t &pday, S64Seconds daylength, S64Seconds dayoffset);
void setSky(const LLSettingsSky::ptr_t &psky);
@ -238,11 +239,11 @@ private:
S64Seconds getDayLength() const { return mDayLength; }
S64Seconds getDayOffset() const { return mDayOffset; }
void animate();
virtual void animate();
void setBlenders(const LLSettingsBlender::ptr_t &skyblend, const LLSettingsBlender::ptr_t &waterblend);
private:
protected:
LLSettingsDay::ptr_t mDayCycle;
LLSettingsSky::ptr_t mSky;
LLSettingsWater::ptr_t mWater;
@ -256,14 +257,31 @@ private:
LLSettingsBlender::ptr_t mBlenderSky;
LLSettingsBlender::ptr_t mBlenderWater;
F64 secondsToKeyframe(S64Seconds seconds);
void onTrackTransitionDone(S32 trackno, const LLSettingsBlender::ptr_t &blender);
void onTrackTransitionDone(S32 trackno, const LLSettingsBlender::ptr_t blender);
};
typedef std::array<DayInstance::ptr_t, ENV_END> InstanceArray_t;
class DayTransition : public DayInstance
{
public:
DayTransition(const LLSettingsSky::ptr_t &skystart, const LLSettingsWater::ptr_t &waterstart, DayInstance::ptr_t &end, S64Seconds time);
virtual ~DayTransition() { };
virtual void update(F64Seconds);
virtual void animate();
protected:
LLSettingsSky::ptr_t mStartSky;
LLSettingsWater::ptr_t mStartWater;
DayInstance::ptr_t mNextInstance;
S64Seconds mTransitionTime;
void onTransitonDone(S32 trackno, const LLSettingsBlender::ptr_t blender);
};
static const F32 SUN_DELTA_YAW;
static const F32 NIGHTTIME_ELEVATION_COS;
@ -283,8 +301,6 @@ private:
LLSettingsBlender::ptr_t mBlenderSky;
LLSettingsBlender::ptr_t mBlenderWater;
LLSettingsDay::ptr_t mCurrentDay;
typedef std::vector<LLSettingsSky::ptr_t> SkyList_t;
typedef std::vector<LLSettingsWater::ptr_t> WaterList_t;
typedef std::vector<LLSettingsDay::ptr_t> DayList_t;
@ -338,7 +354,7 @@ private:
void recordEnvironment(S32 parcel_id, EnvironmentInfo::ptr_t environment);
void onTransitionDone(const LLSettingsBlender::ptr_t &, bool isSky);
void onTransitionDone(const LLSettingsBlender::ptr_t, bool isSky);
//=========================================================================
void legacyLoadAllPresets();
LLSD legacyLoadPreset(const std::string& path);