SL-10093: Client code to support experiences changing an environment. Handle generic messages with "commands" to be executed.
parent
1d022e86c8
commit
29130c5483
|
|
@ -61,6 +61,10 @@
|
|||
#include "roles_constants.h"
|
||||
#include "llestateinfomodel.h"
|
||||
|
||||
#include "lldispatcher.h"
|
||||
#include "llviewergenericmessage.h"
|
||||
#include "llexperiencelog.h"
|
||||
|
||||
//=========================================================================
|
||||
namespace
|
||||
{
|
||||
|
|
@ -77,6 +81,21 @@ namespace
|
|||
const std::string KEY_REGIONID("region_id");
|
||||
const std::string KEY_TRACKALTS("track_altitudes");
|
||||
|
||||
const std::string MESSAGE_PUSHENVIRONMENT("PushExpEnvironment");
|
||||
|
||||
const std::string ACTION_CLEARENVIRONMENT("ClearEnvironment");
|
||||
const std::string ACTION_PUSHFULLENVIRONMENT("PushFullEnvironment");
|
||||
const std::string ACTION_PUSHPARTIALENVIRONMENT("PushPartialEnvironment");
|
||||
|
||||
const std::string KEY_ASSETID("asset_id");
|
||||
const std::string KEY_TRANSITIONTIME("transition_time");
|
||||
const std::string KEY_ACTION("action");
|
||||
const std::string KEY_ACTIONDATA("action_data");
|
||||
const std::string KEY_EXPERIENCEID("public_id");
|
||||
const std::string KEY_OBJECTNAME("ObjectName"); // some of these do not conform to the '_' format.
|
||||
const std::string KEY_PARCELNAME("ParcelName"); // But changing these would also alter the Experience Log requirements.
|
||||
const std::string KEY_COUNT("Count");
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
LLTrace::BlockTimerStatHandle FTM_ENVIRONMENT_UPDATE("Update Environment Tick");
|
||||
LLTrace::BlockTimerStatHandle FTM_SHADER_PARAM_UPDATE("Update Shader Parameters");
|
||||
|
|
@ -254,6 +273,47 @@ namespace
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
class LLEnvironmentPushDispatchHandler : public LLDispatchHandler
|
||||
{
|
||||
public:
|
||||
virtual bool operator()(const LLDispatcher *, const std::string& key, const LLUUID& invoice, const sparam_t& strings) override
|
||||
{
|
||||
LLSD message;
|
||||
|
||||
sparam_t::const_iterator it = strings.begin();
|
||||
|
||||
if (it != strings.end())
|
||||
{
|
||||
const std::string& llsdRaw = *it++;
|
||||
std::istringstream llsdData(llsdRaw);
|
||||
if (!LLSDSerialize::deserialize(message, llsdData, llsdRaw.length()))
|
||||
{
|
||||
LL_WARNS() << "LLExperienceLogDispatchHandler: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL;
|
||||
}
|
||||
}
|
||||
message[KEY_EXPERIENCEID] = invoice;
|
||||
|
||||
// Object Name
|
||||
if (it != strings.end())
|
||||
{
|
||||
message[KEY_OBJECTNAME] = *it++;
|
||||
}
|
||||
|
||||
// parcel Name
|
||||
if (it != strings.end())
|
||||
{
|
||||
message[KEY_PARCELNAME] = *it++;
|
||||
}
|
||||
message[KEY_COUNT] = 1;
|
||||
|
||||
LLEnvironment::instance().handleEnvironmentPush(message);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
LLEnvironmentPushDispatchHandler environment_push_dispatch_handler;
|
||||
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
|
|
@ -301,9 +361,15 @@ void LLEnvironment::initSingleton()
|
|||
|
||||
//TODO: This frequently results in one more request than we need. It isn't breaking, but should be nicer.
|
||||
LLRegionInfoModel::instance().setUpdateCallback([this]() { requestRegion(); });
|
||||
gAgent.addRegionChangedCallback([this]() { requestRegion(); });
|
||||
gAgent.addRegionChangedCallback([this]() { onRegionChange(); });
|
||||
|
||||
gAgent.whenPositionChanged([this](const LLVector3 &localpos, const LLVector3d &) { onAgentPositionHasChanged(localpos); });
|
||||
|
||||
if (!gGenericDispatcher.isHandlerPresent(MESSAGE_PUSHENVIRONMENT))
|
||||
{
|
||||
gGenericDispatcher.addHandler(MESSAGE_PUSHENVIRONMENT, &environment_push_dispatch_handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
LLEnvironment::~LLEnvironment()
|
||||
|
|
@ -410,6 +476,12 @@ bool LLEnvironment::isInventoryEnabled() const
|
|||
!gAgent.getRegionCapability("UpdateSettingsTaskInventory").empty());
|
||||
}
|
||||
|
||||
void LLEnvironment::onRegionChange()
|
||||
{
|
||||
clearEnvironment(ENV_PUSH);
|
||||
requestRegion();
|
||||
}
|
||||
|
||||
void LLEnvironment::onParcelChange()
|
||||
{
|
||||
S32 parcel_id(INVALID_PARCEL_ID);
|
||||
|
|
@ -584,10 +656,13 @@ void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId)
|
|||
void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset)
|
||||
{
|
||||
LLSettingsVOBase::getSettingsAsset(assetId,
|
||||
[this, env, daylength, dayoffset](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onSetEnvAssetLoaded(env, asset_id, settings, daylength, dayoffset, status); });
|
||||
[this, env, daylength, dayoffset](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat)
|
||||
{
|
||||
onSetEnvAssetLoaded(env, asset_id, settings, daylength, dayoffset, TRANSITION_DEFAULT, status);
|
||||
});
|
||||
}
|
||||
|
||||
void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 status)
|
||||
void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, LLSettingsBase::Seconds transition, S32 status)
|
||||
{
|
||||
if (!settings || status)
|
||||
{
|
||||
|
|
@ -598,7 +673,7 @@ void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLS
|
|||
}
|
||||
|
||||
setEnvironment(env, settings);
|
||||
updateEnvironment();
|
||||
updateEnvironment(transition);
|
||||
}
|
||||
|
||||
void LLEnvironment::clearEnvironment(LLEnvironment::EnvSelection_t env)
|
||||
|
|
@ -719,7 +794,6 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::getSelectedEnvironmentInstance(
|
|||
return mEnvironments[ENV_DEFAULT];
|
||||
}
|
||||
|
||||
|
||||
void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool forced)
|
||||
{
|
||||
DayInstance::ptr_t pinstance = getSelectedEnvironmentInstance();
|
||||
|
|
@ -1562,8 +1636,6 @@ void LLEnvironment::onAgentPositionHasChanged(const LLVector3 &localpos)
|
|||
if (trackno == mCurrentTrack)
|
||||
return;
|
||||
|
||||
LL_WARNS("LAPRAS") << "Wants to switch to track #" << trackno << LL_ENDL;
|
||||
|
||||
mCurrentTrack = trackno;
|
||||
for (S32 env = ENV_LOCAL; env < ENV_DEFAULT; ++env)
|
||||
{
|
||||
|
|
@ -1584,6 +1656,98 @@ S32 LLEnvironment::calculateSkyTrackForAltitude(F64 altitude)
|
|||
return std::min(static_cast<S32>(std::distance(mTrackAltitudes.begin(), it)), 4);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
void LLEnvironment::handleEnvironmentPush(LLSD &message)
|
||||
{
|
||||
// Log the experience message
|
||||
LLExperienceLog::instance().handleExperienceMessage(message);
|
||||
|
||||
std::string action = message[KEY_ACTION].asString();
|
||||
LLUUID experience_id = message[KEY_EXPERIENCEID].asUUID();
|
||||
LLSD action_data = message[KEY_ACTIONDATA];
|
||||
F32 transition_time = action_data[KEY_TRANSITIONTIME].asReal();
|
||||
|
||||
//TODO: Check here that the viewer thinks the experience is still valid.
|
||||
|
||||
|
||||
if (action == ACTION_CLEARENVIRONMENT)
|
||||
{
|
||||
handleEnvironmentPushClear(experience_id, action_data, transition_time);
|
||||
}
|
||||
else if (action == ACTION_PUSHFULLENVIRONMENT)
|
||||
{
|
||||
handleEnvironmentPushFull(experience_id, action_data, transition_time);
|
||||
}
|
||||
else if (action == ACTION_PUSHPARTIALENVIRONMENT)
|
||||
{
|
||||
handleEnvironmentPushPartial(experience_id, action_data, transition_time);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("ENVIRONMENT", "GENERICMESSAGES") << "Unknown environment push action '" << action << "'" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLEnvironment::handleEnvironmentPushClear(LLUUID experience_id, LLSD &message, F32 transition)
|
||||
{
|
||||
clearExperienceEnvironment(experience_id, transition);
|
||||
}
|
||||
|
||||
void LLEnvironment::handleEnvironmentPushFull(LLUUID experience_id, LLSD &message, F32 transition)
|
||||
{
|
||||
LLUUID asset_id(message[KEY_ASSETID].asUUID());
|
||||
|
||||
setExperienceEnvironment(experience_id, asset_id, LLSettingsBase::Seconds(transition));
|
||||
}
|
||||
|
||||
void LLEnvironment::handleEnvironmentPushPartial(LLUUID experience_id, LLSD &message, F32 transition)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void LLEnvironment::clearExperienceEnvironment(LLUUID experience_id, F32 transition_time)
|
||||
{
|
||||
bool update_env(false);
|
||||
|
||||
if (mPushEnvironmentExpId == experience_id)
|
||||
{
|
||||
mPushEnvironmentExpId.setNull();
|
||||
|
||||
if (hasEnvironment(ENV_PUSH))
|
||||
{
|
||||
update_env |= true;
|
||||
clearEnvironment(ENV_PUSH);
|
||||
updateEnvironment(LLSettingsBase::Seconds(transition_time));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// clear the override queue too.
|
||||
// update |= true;
|
||||
|
||||
|
||||
if (update_env)
|
||||
updateEnvironment(LLSettingsBase::Seconds(transition_time));
|
||||
}
|
||||
|
||||
void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLUUID asset_id, F32 transition_time)
|
||||
{
|
||||
LLSettingsVOBase::getSettingsAsset(asset_id,
|
||||
[this, experience_id, transition_time](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat)
|
||||
{
|
||||
mPushEnvironmentExpId = experience_id;
|
||||
onSetEnvAssetLoaded(ENV_PUSH, asset_id, settings,
|
||||
LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET,
|
||||
LLSettingsBase::Seconds(transition_time), status);
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLSD data, F32 transition_time)
|
||||
{
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
LLEnvironment::DayInstance::DayInstance() :
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ public:
|
|||
{
|
||||
ENV_EDIT = 0,
|
||||
ENV_LOCAL,
|
||||
ENV_PUSH,
|
||||
ENV_PARCEL,
|
||||
ENV_REGION,
|
||||
ENV_DEFAULT,
|
||||
|
|
@ -213,6 +214,8 @@ public:
|
|||
|
||||
const altitude_list_t & getRegionAltitudes() const { return mTrackAltitudes; }
|
||||
|
||||
void handleEnvironmentPush(LLSD &message);
|
||||
|
||||
protected:
|
||||
virtual void initSingleton();
|
||||
|
||||
|
|
@ -278,6 +281,17 @@ private:
|
|||
};
|
||||
typedef std::array<DayInstance::ptr_t, ENV_END> InstanceArray_t;
|
||||
|
||||
struct ExpEnvironmentEntry
|
||||
{
|
||||
typedef std::shared_ptr<ExpEnvironmentEntry> ptr_t;
|
||||
|
||||
S32Seconds mTime;
|
||||
LLUUID mExperienceId;
|
||||
LLSD mEnvironmentOverrides;
|
||||
};
|
||||
typedef std::deque<ExpEnvironmentEntry::ptr_t> mPushOverrides;
|
||||
|
||||
LLUUID mPushEnvironmentExpId;
|
||||
|
||||
class DayTransition : public DayInstance
|
||||
{
|
||||
|
|
@ -324,6 +338,7 @@ private:
|
|||
|
||||
void updateCloudScroll();
|
||||
|
||||
void onRegionChange();
|
||||
void onParcelChange();
|
||||
|
||||
struct UpdateInfo
|
||||
|
|
@ -364,9 +379,16 @@ private:
|
|||
|
||||
void onAgentPositionHasChanged(const LLVector3 &localpos);
|
||||
|
||||
void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 status);
|
||||
void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, LLSettingsBase::Seconds transition, S32 status);
|
||||
void onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset, altitudes_vect_t altitudes);
|
||||
|
||||
void handleEnvironmentPushClear(LLUUID experience_id, LLSD &message, F32 transition);
|
||||
void handleEnvironmentPushFull(LLUUID experience_id, LLSD &message, F32 transition);
|
||||
void handleEnvironmentPushPartial(LLUUID experience_id, LLSD &message, F32 transition);
|
||||
|
||||
void clearExperienceEnvironment(LLUUID experience_id, F32 transition_time);
|
||||
void setExperienceEnvironment(LLUUID experience_id, LLUUID asset_id, F32 transition_time);
|
||||
void setExperienceEnvironment(LLUUID experience_id, LLSD environment, F32 transition_time);
|
||||
};
|
||||
|
||||
class LLTrackBlenderLoopingManual : public LLSettingsBlender
|
||||
|
|
|
|||
|
|
@ -62,10 +62,9 @@ public:
|
|||
static std::string getPermissionString(const LLSD& message, const std::string& base);
|
||||
void setEventsToSave(LLSD new_events){mEventsToSave = new_events; }
|
||||
bool isNotExpired(std::string& date);
|
||||
protected:
|
||||
void handleExperienceMessage(LLSD& message);
|
||||
|
||||
|
||||
protected:
|
||||
void loadEvents();
|
||||
void saveEvents();
|
||||
void eraseExpired();
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
55df2c7135733c5da64ef8f01859b83a433a3a09
|
||||
e492dec0fcdb4e234f94ddc32f4d7af0290ca72b
|
||||
Loading…
Reference in New Issue