From cea38227ec6b9b0111b22f7d30ba94c9bfe12475 Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Wed, 12 Feb 2020 18:17:08 -0500 Subject: [PATCH] Introduce Cinder's support code for WindLightRefresh on OpenSim --- indra/newview/llagent.cpp | 5 ++++ indra/newview/llagent.h | 2 ++ indra/newview/llenvmanager.cpp | 47 ++++++++++++++++++++++++++++++++++ indra/newview/llenvmanager.h | 4 +++ 4 files changed, 58 insertions(+) diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 2691134aa1..2b6ddc7c5b 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1077,6 +1077,11 @@ void LLAgent::removeRegionChangedCallback(boost::signals2::connection callback) mRegionChangedSignal.disconnect(callback); } +void LLAgent::regionChanged() +{ + mRegionChangedSignal(); +} + //----------------------------------------------------------------------------- // inPrelude() //----------------------------------------------------------------------------- diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 549820ccc3..c7de85ac8b 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -266,6 +266,8 @@ public: // Capability std::string getRegionCapability(const std::string &name); // short hand for if (getRegion()) { getRegion()->getCapability(name) } + void regionChanged(); + /** * Register a boost callback to be called when the agent changes regions * Note that if you need to access a capability for the region, you may need to wait diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index 5c0492ea48..f232f08225 100644 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -734,3 +734,50 @@ void LLEnvManagerNew::onRegionChange() << LL_ENDL; } } + +class WindLightRefresh : public LLHTTPNode +{ + /*virtual*/ void post( + LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + if (!input || !context || !input.isMap() || !input.has("body")) { + LL_INFOS() << "malformed WindLightRefresh!" << LL_ENDL; + return; + } + + //std::string dump = input["body"].asString(); + //LL_WARNS() << dump << LL_ENDL; + + LLSD body = input["body"]; + LLEnvManagerNew* env = LLEnvManagerNew::getInstance(); + + LLViewerRegion* regionp = gAgent.getRegion(); + LLUUID region_uuid = regionp ? regionp->getRegionID() : LLUUID::null; + + env->mNewRegionPrefs.clear(); + env->mCurRegionUUID = region_uuid; + + if(body.has("Interpolate")) { + if(body["Interpolate"].asInteger() == 1) { + env->mInterpNextChangeMessage = true; + } + else { + env->mInterpNextChangeMessage = false; + } + } + else { + env->mInterpNextChangeMessage = true; + } + LL_INFOS() << "Windlight Refresh , interpolate:" << env->mInterpNextChangeMessage << LL_ENDL; + env->requestRegionSettings(); + + // This causes the windlight editor and others to update since the windlight has changed! + gAgent.regionChanged(); + } +}; + +LLHTTPRegistration<WindLightRefresh> +gHTTPRegistrationWindLightRefresh( + "/message/WindLightRefresh"); diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h index 29b8dc15bd..432c284b1c 100644 --- a/indra/newview/llenvmanager.h +++ b/indra/newview/llenvmanager.h @@ -34,6 +34,7 @@ class LLWLParamManager; class LLWaterParamManager; class LLWLAnimator; +class WindLightRefresh; // generic key struct LLEnvKey @@ -324,6 +325,9 @@ private: bool useRegionSky(); bool useRegionWater(); +private: + friend class WindLightRefresh; + bool useDefaultSky(); bool useDefaultWater(); -- GitLab