diff options
| author | Oz Linden <oz@lindenlab.com> | 2011-04-14 15:09:03 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2011-04-14 15:09:03 -0400 | 
| commit | 648d3e5b462b600d4f3af0c289c2e18e7730bf96 (patch) | |
| tree | ea1197864944c2ce6216f84aa4e0fb223b58d03f /indra/newview | |
| parent | fa785d9cf4638233586ecd6566a7d78dad51bb35 (diff) | |
| parent | 88a7262340f2fc5085f4ac6600790518d01292d6 (diff) | |
merge back additional 2.6.3 beta 2 fixes
Diffstat (limited to 'indra/newview')
134 files changed, 2161 insertions, 1865 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 32d3a31786..b1cb10665b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -416,6 +416,7 @@ set(viewer_SOURCE_FILES      llsidepaneliteminfo.cpp      llsidepaneltaskinfo.cpp      llsidetray.cpp +    llsidetraylistener.cpp      llsidetraypanelcontainer.cpp      llsky.cpp      llslurl.cpp @@ -954,6 +955,7 @@ set(viewer_HEADER_FILES      llsidepaneliteminfo.h      llsidepaneltaskinfo.h      llsidetray.h +    llsidetraylistener.h      llsidetraypanelcontainer.h      llsky.h      llslurl.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index dd85c5cb86..d98f0da1c2 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2623,10 +2623,10 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>DisableRendering</key> +    <key>HeadlessClient</key>      <map>        <key>Comment</key> -      <string>Disable GL rendering and GUI (load testing)</string> +      <string>Run in headless mode by disabling GL rendering, keyboard, etc</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -3232,14 +3232,14 @@    <map>      <key>Comment</key>      <string>Specifies that you have not logged in with the viewer since you performed a clean install</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>1</integer> -  </map> -  <key>FirstSelectedDisabledPopups</key> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>FirstSelectedDisabledPopups</key>      <map>        <key>Comment</key>        <string>Return false if there is not disabled popup selected in the list of floater preferences popups</string> @@ -9557,7 +9557,7 @@      <key>ShowNetStats</key>      <map>        <key>Comment</key> -      <string>Show the Search Bar in the Status Overlay</string> +      <string>Show the Status Indicators for the Viewer and Network Usage in the Status Overlay</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -11926,6 +11926,33 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>WaterFogColor</key> +    <map> +      <key>Comment</key> +      <string>Water fog color</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0863</real> +        <real>0.168</real> +        <real>0.212</real> +        <real>0</real> +      </array> +    </map> +    <key>WaterFogDensity</key> +    <map> +      <key>Comment</key> +      <string>Water fog density</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>16.0</real> +    </map>      <key>WaterGLFogDensityScale</key>      <map>        <key>Comment</key> @@ -12641,5 +12668,27 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>GenericErrorPageURL</key> +    <map> +      <key>Comment</key> +      <string>URL to set as a property on LLMediaControl to navigate to if the a page completes with a 400-499 HTTP status code</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string> +    </map> +    <key>DestinationsAndAvatarsVisibility</key> +    <map> +      <key>Comment</key> +      <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>  </map>  </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 03656f2a53..490da2c9d4 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -61,7 +61,7 @@          <key>Type</key>              <string>String</string>          <key>Value</key> -            <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/howto/index.html?topic=[TOPIC]</string> +            <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/howto/index.html?topic=[TOPIC]</string>          </map>      <key>PreferredMaturity</key>          <map> @@ -345,7 +345,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/guide.html</string> +      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/guide.html</string>      </map>      <key>AvatarPickerURL</key>      <map> @@ -356,7 +356,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/avatars.html</string> +      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/avatars.html</string>      </map>      <key>LogInventoryDecline</key>      <map> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7d908df5ce..7d491a7774 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1119,12 +1119,6 @@ void LLAgent::resetControlFlags()  //-----------------------------------------------------------------------------  void LLAgent::setAFK()  { -	// Drones can't go AFK -	if (gNoRender) -	{ -		return; -	} -  	if (!gAgent.getRegion())  	{  		// Don't set AFK if we're not talking to a region yet. @@ -1684,11 +1678,6 @@ void LLAgent::clearRenderState(U8 clearstate)  //-----------------------------------------------------------------------------  U8 LLAgent::getRenderState()  { -	if (gNoRender || gKeyboard == NULL) -	{ -		return 0; -	} -  	// *FIX: don't do stuff in a getter!  This is infinite loop city!  	if ((mTypingTimer.getElapsedTimeF32() > TYPING_TIMEOUT_SECS)   		&& (mRenderState & AGENT_STATE_TYPING)) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index f01d5ff1f5..6c5c3bcdab 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -282,25 +282,22 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)  		gAgent.stopAutoPilot(TRUE);  	} -	if (!gNoRender) -	{ -		LLSelectMgr::getInstance()->unhighlightAll(); +	LLSelectMgr::getInstance()->unhighlightAll(); -		// By popular request, keep land selection while walking around. JC -		// LLViewerParcelMgr::getInstance()->deselectLand(); +	// By popular request, keep land selection while walking around. JC +	// LLViewerParcelMgr::getInstance()->deselectLand(); -		// force deselect when walking and attachment is selected -		// this is so people don't wig out when their avatar moves without animating -		if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) -		{ -			LLSelectMgr::getInstance()->deselectAll(); -		} +	// force deselect when walking and attachment is selected +	// this is so people don't wig out when their avatar moves without animating +	if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) +	{ +		LLSelectMgr::getInstance()->deselectAll(); +	} -		if (gMenuHolder != NULL) -		{ -			// Hide all popup menus -			gMenuHolder->hideMenus(); -		} +	if (gMenuHolder != NULL) +	{ +		// Hide all popup menus +		gMenuHolder->hideMenus();  	}  	if (change_camera && !gSavedSettings.getBOOL("FreezeTime")) diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index d520debc31..ed24febf41 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -37,6 +37,8 @@  #include "llviewerobject.h"  #include "llviewerobjectlist.h"  #include "llviewerregion.h" +#include "llsdutil.h" +#include "llsdutil_math.h"  LLAgentListener::LLAgentListener(LLAgent &agent)    : LLEventAPI("LLAgent", @@ -53,6 +55,15 @@ LLAgentListener::LLAgentListener(LLAgent &agent)  	add("requestStand",          "Ask to stand up",          &LLAgentListener::requestStand); +    add("resetAxes", +        "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])", +        &LLAgentListener::resetAxes); +    add("getAxes", +        "Send information about the agent's orientation on [\"reply\"]:\n" +        "[\"euler\"]: map of {roll, pitch, yaw}\n" +        "[\"quat\"]:  array of [x, y, z, w] quaternion values", +        &LLAgentListener::getAxes, +        LLSDMap("reply", LLSD()));  }  void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -64,7 +75,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const  		params.append(event_data["x"]);  		params.append(event_data["y"]);  		params.append(event_data["z"]); -		LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true); +		LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true);  		// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"  		// should we just compose LLCommandHandler and LLDispatchListener?  	} @@ -74,7 +85,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const  								  LLVector3(event_data["x"].asReal(),   											event_data["y"].asReal(),   											event_data["z"].asReal())).getSLURLString(); -		LLURLDispatcher::dispatch(url, NULL, false); +		LLURLDispatcher::dispatch(url, "clicked", NULL, false);  	}  } @@ -104,3 +115,28 @@ void LLAgentListener::requestStand(LLSD const & event_data) const  	mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);  } +void LLAgentListener::resetAxes(const LLSD& event) const +{ +    if (event.has("lookat")) +    { +        mAgent.resetAxes(ll_vector3_from_sd(event["lookat"])); +    } +    else +    { +        // no "lookat", default call +        mAgent.resetAxes(); +    } +} + +void LLAgentListener::getAxes(const LLSD& event) const +{ +    LLQuaternion quat(mAgent.getQuat()); +    F32 roll, pitch, yaw; +    quat.getEulerAngles(&roll, &pitch, &yaw); +    // The official query API for LLQuaternion's [x, y, z, w] values is its +    // public member mQ... +    sendReply(LLSDMap +              ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ))) +              ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)), +              event); +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index 9b585152f4..0aa58d0b16 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -44,6 +44,8 @@ private:  	void requestTeleport(LLSD const & event_data) const;  	void requestSit(LLSD const & event_data) const;  	void requestStand(LLSD const & event_data) const; +	void resetAxes(const LLSD& event) const; +	void getAxes(const LLSD& event) const;  private:  	LLAgent & mAgent; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index cfb5853cfd..cbd996f909 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -78,7 +78,6 @@  #include "llvoicechannel.h"  #include "llvoavatarself.h"  #include "llsidetray.h" -#include "llfeaturemanager.h"  #include "llurlmatch.h"  #include "lltextutil.h"  #include "lllogininstance.h" @@ -756,7 +755,7 @@ bool LLAppViewer::init()  	//  	// Various introspection concerning the libs we're using - particularly -        // the libs involved in getting to a full login screen. +	// the libs involved in getting to a full login screen.  	//  	LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;  	LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL; @@ -925,7 +924,7 @@ bool LLAppViewer::init()  	}  	// If we don't have the right GL requirements, exit. -	if (!gGLManager.mHasRequirements && !gNoRender) +	if (!gGLManager.mHasRequirements)  	{	  		// can't use an alert here since we're exiting and  		// all hell breaks lose. @@ -1215,7 +1214,8 @@ bool LLAppViewer::mainLoop()  				}  				// Render scene. -				if (!LLApp::isExiting()) +				// *TODO: Should we run display() even during gHeadlessClient?  DK 2011-02-18 +				if (!LLApp::isExiting() && !gHeadlessClient)  				{  					pingMainloopTimeout("Main:Display");  					gGLActive = TRUE; @@ -1243,8 +1243,7 @@ bool LLAppViewer::mainLoop()  				}  				// yield cooperatively when not running as foreground window -				if (   gNoRender -					   || (gViewerWindow && !gViewerWindow->mWindow->getVisible()) +				if (   (gViewerWindow && !gViewerWindow->mWindow->getVisible())  						|| !gFocusMgr.getAppHasFocus())  				{  					// Sleep if we're not rendering, or the window is minimized. @@ -2732,12 +2731,26 @@ void LLAppViewer::checkForCrash(void)  } +// +// This function decides whether the client machine meets the minimum requirements to +// run in a maximized window, per the consensus of davep, boa and nyx on 3/30/2011. +// +bool LLAppViewer::meetsRequirementsForMaximizedStart() +{ +	bool maximizedOk = (LLFeatureManager::getInstance()->getGPUClass() >= GPU_CLASS_2); + +	const U32 one_gigabyte_kb = 1024 * 1024; +	maximizedOk &= (gSysMemory.getPhysicalMemoryKB() >= one_gigabyte_kb); + +	return maximizedOk; +} +  bool LLAppViewer::initWindow()  {  	LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL;  	// store setting in a global for easy access and modification -	gNoRender = gSavedSettings.getBOOL("DisableRendering"); +	gHeadlessClient = gSavedSettings.getBOOL("HeadlessClient");  	// always start windowed  	BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); @@ -2751,7 +2764,8 @@ bool LLAppViewer::initWindow()  	const S32 NEVER_SUBMIT_REPORT = 2;  	bool use_watchdog = false;  	int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); -	if(watchdog_enabled_setting == -1){ +	if(watchdog_enabled_setting == -1) +	{  		use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");  	}  	else @@ -2773,28 +2787,25 @@ bool LLAppViewer::initWindow()  		gViewerWindow->mWindow->maximize();  	} -	if (!gNoRender) +	// +	// Initialize GL stuff +	// + +	if (mForceGraphicsDetail)  	{ -		// -		// Initialize GL stuff -		// +		LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false); +	} +			 +	// Set this flag in case we crash while initializing GL +	gSavedSettings.setBOOL("RenderInitError", TRUE); +	gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); -		if (mForceGraphicsDetail) -		{ -			LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false); -		} -				 -		// Set this flag in case we crash while initializing GL -		gSavedSettings.setBOOL("RenderInitError", TRUE); -		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); -	 -		gPipeline.init(); -		stop_glerror(); -		gViewerWindow->initGLDefaults(); +	gPipeline.init(); +	stop_glerror(); +	gViewerWindow->initGLDefaults(); -		gSavedSettings.setBOOL("RenderInitError", FALSE); -		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); -	} +	gSavedSettings.setBOOL("RenderInitError", FALSE); +	gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );  	//If we have a startup crash, it's usually near GL initialization, so simulate that.  	if(gCrashOnStartup) @@ -2802,6 +2813,21 @@ bool LLAppViewer::initWindow()  		LLAppViewer::instance()->forceErrorLLError();  	} +	// +	// Determine if the window should start maximized on initial run based +	// on graphics capability +	// +	if (gSavedSettings.getBOOL("FirstLoginThisInstall") && meetsRequirementsForMaximizedStart()) +	{ +		LL_INFOS("AppInit") << "This client met the requirements for a maximized initial screen." << LL_ENDL; +		gSavedSettings.setBOOL("WindowMaximized", TRUE); +	} + +	if (gSavedSettings.getBOOL("WindowMaximized")) +	{ +		gViewerWindow->mWindow->maximize(); +	} +  	LLUI::sWindow = gViewerWindow->getWindow();  	// Show watch cursor @@ -2836,12 +2862,9 @@ void LLAppViewer::cleanupSavedSettings()  	gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates); -	if (!gNoRender) +	if (gDebugView)  	{ -		if (gDebugView) -		{ -			gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); -		} +		gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible());  	}  	// save window position if not maximized @@ -3822,7 +3845,7 @@ void LLAppViewer::badNetworkHandler()  // is destroyed.  void LLAppViewer::saveFinalSnapshot()  { -	if (!mSavedFinalSnapshot && !gNoRender) +	if (!mSavedFinalSnapshot)  	{  		gSavedSettings.setVector3d("FocusPosOnLogout", gAgentCamera.calcFocusPositionTargetGlobal());  		gSavedSettings.setVector3d("CameraPosOnLogout", gAgentCamera.calcCameraPositionTargetGlobal()); @@ -4226,34 +4249,31 @@ void LLAppViewer::idle()  	//  	// Update weather effects  	// -	if (!gNoRender) -	{ -		LLWorld::getInstance()->updateClouds(gFrameDTClamped); -		gSky.propagateHeavenlyBodies(gFrameDTClamped);				// moves sun, moon, and planets +	LLWorld::getInstance()->updateClouds(gFrameDTClamped); +	gSky.propagateHeavenlyBodies(gFrameDTClamped);				// moves sun, moon, and planets -		// Update wind vector  -		LLVector3 wind_position_region; -		static LLVector3 average_wind; +	// Update wind vector  +	LLVector3 wind_position_region; +	static LLVector3 average_wind; -		LLViewerRegion *regionp; -		regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal());	// puts agent's local coords into wind_position	 -		if (regionp) -		{ -			gWindVec = regionp->mWind.getVelocity(wind_position_region); +	LLViewerRegion *regionp; +	regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal());	// puts agent's local coords into wind_position	 +	if (regionp) +	{ +		gWindVec = regionp->mWind.getVelocity(wind_position_region); -			// Compute average wind and use to drive motion of water -			 -			average_wind = regionp->mWind.getAverage(); -			F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); -			 -			gSky.setCloudDensityAtAgent(cloud_density); -			gSky.setWind(average_wind); -			//LLVOWater::setWind(average_wind); -		} -		else -		{ -			gWindVec.setVec(0.0f, 0.0f, 0.0f); -		} +		// Compute average wind and use to drive motion of water +		 +		average_wind = regionp->mWind.getAverage(); +		F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); +		 +		gSky.setCloudDensityAtAgent(cloud_density); +		gSky.setWind(average_wind); +		//LLVOWater::setWind(average_wind); +	} +	else +	{ +		gWindVec.setVec(0.0f, 0.0f, 0.0f);  	}  	////////////////////////////////////// @@ -4262,13 +4282,10 @@ void LLAppViewer::idle()  	// Here, particles are updated and drawables are moved.  	// -	if (!gNoRender) -	{ -		LLFastTimer t(FTM_WORLD_UPDATE); -		gPipeline.updateMove(); +	LLFastTimer t(FTM_WORLD_UPDATE); +	gPipeline.updateMove(); -		LLWorld::getInstance()->updateParticles(); -	} +	LLWorld::getInstance()->updateParticles();  	if (LLViewerJoystick::getInstance()->getOverrideCamera())  	{ @@ -4634,12 +4651,9 @@ void LLAppViewer::disconnectViewer()  	gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() );  	// Un-minimize all windows so they don't get saved minimized -	if (!gNoRender) +	if (gFloaterView)  	{ -		if (gFloaterView) -		{ -			gFloaterView->restoreAll(); -		} +		gFloaterView->restoreAll();  	}  	if (LLSelectMgr::getInstance()) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0226211735..61ee6a7cf1 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -187,6 +187,7 @@ protected:  	virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this. +	virtual bool meetsRequirementsForMaximizedStart(); // Used on first login to decide to launch maximized  private: diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 898cc1c0ba..523c2e3adf 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -233,7 +233,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ  	std::string url = slurl;  	LLMediaCtrl* web = NULL;  	const bool trusted_browser = false; -	if (LLURLDispatcher::dispatch(url, web, trusted_browser)) +	if (LLURLDispatcher::dispatch(url, "", web, trusted_browser))  	{  		// bring window to foreground, as it has just been "launched" from a URL  		// todo: hmm, how to get there from here? diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 1cd80986d8..c2916717bd 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -500,7 +500,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)  		LLMediaCtrl* web = NULL;  		const bool trusted_browser = false; -		LLURLDispatcher::dispatch(url, web, trusted_browser); +		LLURLDispatcher::dispatch(url, "", web, trusted_browser);  	}  	return(result); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index afa8b62c74..ca7ec7cc30 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -279,7 +279,7 @@ bool LLAvatarActions::isCalling(const LLUUID &id)  //static  bool LLAvatarActions::canCall()  { -		return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); +	return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();  }  // static @@ -300,40 +300,21 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids)  	make_ui_sound("UISndStartIM");  } +static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name) +{ +	llinfos << "opening web profile for " << av_name.mUsername << llendl;		 +	std::string url = getProfileURL(av_name.mUsername); + +	// PROFILES: open in webkit window +	LLWeb::loadWebURLInternal(url, "", agent_id.asString()); +} +  // static  void LLAvatarActions::showProfile(const LLUUID& id)  {  	if (id.notNull())  	{ -		LLSD params; -		params["id"] = id; -		params["open_tab_name"] = "panel_profile"; - -		// PROFILES: open in webkit window -		std::string full_name; -		if (gCacheName->getFullName(id,full_name)) -		{ -			std::string agent_name = LLCacheName::buildUsername(full_name); -			llinfos << "opening web profile for " << agent_name << llendl;		 -			std::string url = getProfileURL(agent_name); -			LLWeb::loadWebURLInternal(url, "", id.asString()); -		} -		else -		{ -			llwarns << "no name info for agent id " << id << llendl; -		} -#if 0 -		//Show own profile -		if(gAgent.getID() == id) -		{ -			LLSideTray::getInstance()->showPanel("panel_me", params); -		} -		//Show other user profile -		else -		{ -			LLSideTray::getInstance()->showPanel("panel_profile_view", params); -		} -#endif +		LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_show_profile, _1, _2));  	}  } diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 99aeb4cbad..b1cd83a1fb 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -160,6 +160,12 @@ void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& ava  void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props)  { +	if (!gAgent.isInitialized() || (gAgent.getID() == LLUUID::null)) +	{ +		llwarns << "Sending avatarinfo update DENIED - invalid agent" << llendl; +		return; +	} +  	llinfos << "Sending avatarinfo update" << llendl;  	// This value is required by sendAvatarPropertiesUpdate method. @@ -168,20 +174,21 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData*  	LLMessageSystem *msg = gMessageSystem; -	msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(	_PREHASH_AgentID,		gAgent.getID() ); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); -	msg->nextBlockFast(_PREHASH_PropertiesData); +	msg->newMessageFast	(_PREHASH_AvatarPropertiesUpdate); +	msg->nextBlockFast	(_PREHASH_AgentData); +	msg->addUUIDFast		(_PREHASH_AgentID,		gAgent.getID() ); +	msg->addUUIDFast		(_PREHASH_SessionID,	gAgent.getSessionID() ); +	msg->nextBlockFast	(_PREHASH_PropertiesData); -	msg->addUUIDFast(	_PREHASH_ImageID,	avatar_props->image_id); -	msg->addUUIDFast(	_PREHASH_FLImageID,		avatar_props->fl_image_id); -	msg->addStringFast(	_PREHASH_AboutText,		avatar_props->about_text); -	msg->addStringFast(	_PREHASH_FLAboutText,	avatar_props->fl_about_text); +	msg->addUUIDFast		(_PREHASH_ImageID,		avatar_props->image_id); +	msg->addUUIDFast		(_PREHASH_FLImageID,	avatar_props->fl_image_id); +	msg->addStringFast	(_PREHASH_AboutText,	avatar_props->about_text); +	msg->addStringFast	(_PREHASH_FLAboutText,	avatar_props->fl_about_text);  	msg->addBOOL(_PREHASH_AllowPublish, avatar_props->allow_publish);  	msg->addBOOL(_PREHASH_MaturePublish, mature);  	msg->addString(_PREHASH_ProfileURL, avatar_props->profile_url); +  	gAgent.sendReliableMessage();  } diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp index 7c205a8b9f..9a8cd5ceae 100644 --- a/indra/newview/llbreastmotion.cpp +++ b/indra/newview/llbreastmotion.cpp @@ -2,31 +2,25 @@   * @file llbreastmotion.cpp   * @brief Implementation of LLBreastMotion class.   * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - *  - * Copyright (c) 2001-2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h index 8578d4ad1a..aa0fdf9f8b 100644 --- a/indra/newview/llbreastmotion.h +++ b/indra/newview/llbreastmotion.h @@ -2,31 +2,25 @@   * @file llbreastmotion.h   * @brief Implementation of LLBreastMotion class.   * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - *  - * Copyright (c) 2001-2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp index 5744d055a9..586f45fd8f 100644 --- a/indra/newview/llcommanddispatcherlistener.cpp +++ b/indra/newview/llcommanddispatcherlistener.cpp @@ -65,7 +65,7 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const          trusted_browser = params["trusted"].asBoolean();      }      LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL, -                                  trusted_browser); +                                  "clicked", trusted_browser);  }  void LLCommandDispatcherListener::enumerate(const LLSD& params) const diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index 1b6ba02aac..19dba3f917 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -35,7 +35,7 @@  // system includes  #include <boost/tokenizer.hpp> -#define THROTTLE_PERIOD    5    // required secs between throttled commands +#define THROTTLE_PERIOD    5    // required seconds between throttled commands  static LLCommandDispatcherListener sCommandDispatcherListener; @@ -59,6 +59,7 @@ public:  				  const LLSD& params,  				  const LLSD& query_map,  				  LLMediaCtrl* web, +				  const std::string& nav_type,  				  bool trusted_browser);  private: @@ -91,6 +92,7 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,  										const LLSD& params,  										const LLSD& query_map,  										LLMediaCtrl* web, +										const std::string& nav_type,  										bool trusted_browser)  {  	static bool slurl_blocked = false; @@ -120,11 +122,19 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,  			return true;  		case LLCommandHandler::UNTRUSTED_THROTTLE: +			// if users actually click on a link, we don't need to throttle it +			// (throttling mechanism is used to prevent an avalanche of clicks via +			// javascript +			if ( nav_type == "clicked" ) +			{ +				break; +			} +  			cur_time = LLTimer::getElapsedSeconds();  			if (cur_time < last_throttle_time + THROTTLE_PERIOD)  			{  				// block request from external browser if it happened -				// within THROTTLE_PERIOD secs of the last command +				// within THROTTLE_PERIOD seconds of the last command  				LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;  				if (! slurl_throttled)  				{ @@ -166,10 +176,11 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,  								   const LLSD& params,  								   const LLSD& query_map,  								   LLMediaCtrl* web, +								   const std::string& nav_type,  								   bool trusted_browser)  {  	return LLCommandHandlerRegistry::instance().dispatch( -		cmd, params, query_map, web, trusted_browser); +		cmd, params, query_map, web, nav_type, trusted_browser);  }  static std::string lookup(LLCommandHandler::EUntrustedAccess value); diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h index 1e65b6de23..1e0895565a 100644 --- a/indra/newview/llcommandhandler.h +++ b/indra/newview/llcommandhandler.h @@ -95,6 +95,7 @@ public:  						 const LLSD& params,  						 const LLSD& query_map,  						 LLMediaCtrl* web, +						 const std::string& nav_type,  						 bool trusted_browser);  		// Execute a command registered via the above mechanism,  		// passing string parameters. diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 5e10f60aba..5501b8c2ac 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -123,10 +123,7 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle  {  	LLTextEditor::reshape(width, height, called_from_parent); -	if (getTextPixelHeight() > getRect().getHeight()) -	{ -		showExpandText(); -	} +	hideOrShowExpandTextAsNeeded();  }  void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params) @@ -136,17 +133,7 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons  	mExpanderVisible = false;  	LLTextEditor::setText(text, input_params); -	// text contents have changed, segments are cleared out -	// so hide the expander and determine if we need it -	//mExpanderVisible = false; -	if (getTextPixelHeight() > getRect().getHeight()) -	{ -		showExpandText(); -	} -	else -	{ -		hideExpandText(); -	} +	hideOrShowExpandTextAsNeeded();  } @@ -200,6 +187,22 @@ S32 LLExpandableTextBox::LLTextBoxEx::getTextPixelHeight()  	return getTextBoundingRect().getHeight();  } +void LLExpandableTextBox::LLTextBoxEx::hideOrShowExpandTextAsNeeded() +{ +	// Restore the text box contents to calculate the text height properly, +	// otherwise if a part of the text is hidden under "More" link +	// getTextPixelHeight() returns only the height of currently visible text +	// including the "More" link. See STORM-250. +	hideExpandText(); + +	// Show the expander a.k.a. "More" link if we need it, depending on text +	// contents height. If not, keep it hidden. +	if (getTextPixelHeight() > getRect().getHeight()) +	{ +		showExpandText(); +	} +} +  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index bce77225c4..f75ef954ff 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -77,6 +77,12 @@ protected:  		 */  		void hideExpandText(); +		/** +		 * Shows the "More" link if the text is too high to be completely +		 * visible without expanding the text box. Hides that link otherwise. +		 */ +		void hideOrShowExpandTextAsNeeded(); +  	protected:  		LLTextBoxEx(const Params& p); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index d63685e1af..2c4153688a 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -121,7 +121,11 @@ void LLFirstUse::notMoving(bool enable)  {  	// fire off 2 notifications and rely on filtering to select the relevant one  	firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); -	firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("target", "bottom_tray").with("direction", "top").with("hint_image", "arrow_keys.png").with("down_arrow", "")); +	firstUseNotification("FirstNotMoving", enable, "HintMoveClick", LLSD(), LLSD() +		.with("target", "nav_bar") +		.with("direction", "bottom") +		.with("hint_image", "click_to_move.png") +		.with("up_arrow", ""));  }  // static diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index 61cf4dad93..eeb81085bb 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -38,13 +38,11 @@  ///----------------------------------------------------------------------------  /// Class LLFloaterBump  ///---------------------------------------------------------------------------- -extern BOOL gNoRender;  // Default constructor  LLFloaterBump::LLFloaterBump(const LLSD& key)   :	LLFloater(key)  { -	if(gNoRender) return;  } diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp index a650886d89..627defd006 100644 --- a/indra/newview/llfloaterhelpbrowser.cpp +++ b/indra/newview/llfloaterhelpbrowser.cpp @@ -50,6 +50,7 @@ BOOL LLFloaterHelpBrowser::postBuild()  {  	mBrowser = getChild<LLMediaCtrl>("browser");  	mBrowser->addObserver(this); +	mBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));  	childSetAction("open_browser", onClickOpenWebBrowser, this); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ffbb0efad3..1a9d0af9af 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -285,6 +285,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mGotPersonalInfo(false),  	mOriginalIMViaEmail(false),  	mLanguageChanged(false), +	mAvatarDataInitialized(false),  	mDoubleClickActionDirty(false),  	mFavoritesRecordMayExist(false)  { @@ -343,7 +344,7 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t  	if ( APT_PROPERTIES == type )  	{  		const LLAvatarData* pAvatarData = static_cast<const LLAvatarData*>( pData ); -		if( pAvatarData && gAgent.getID() == pAvatarData->avatar_id ) +		if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null))  		{  			storeAvatarProperties( pAvatarData );  			processProfileProperties( pAvatarData ); @@ -353,14 +354,19 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t  void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData )  { -	mAvatarProperties.avatar_id		= gAgent.getID(); -	mAvatarProperties.image_id		= pAvatarData->image_id; -	mAvatarProperties.fl_image_id   = pAvatarData->fl_image_id; -	mAvatarProperties.about_text	= pAvatarData->about_text; -	mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; -	mAvatarProperties.profile_url   = pAvatarData->profile_url; -	mAvatarProperties.flags		    = pAvatarData->flags; -	mAvatarProperties.allow_publish	= pAvatarData->flags & AVATAR_ALLOW_PUBLISH; +	if (LLStartUp::getStartupState() == STATE_STARTED) +	{ +		mAvatarProperties.avatar_id		= pAvatarData->avatar_id; +		mAvatarProperties.image_id		= pAvatarData->image_id; +		mAvatarProperties.fl_image_id   = pAvatarData->fl_image_id; +		mAvatarProperties.about_text	= pAvatarData->about_text; +		mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; +		mAvatarProperties.profile_url   = pAvatarData->profile_url; +		mAvatarProperties.flags		    = pAvatarData->flags; +		mAvatarProperties.allow_publish	= pAvatarData->flags & AVATAR_ALLOW_PUBLISH; + +		mAvatarDataInitialized = true; +	}  }  void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarData ) @@ -370,15 +376,31 @@ void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarDa  void LLFloaterPreference::saveAvatarProperties( void )  { -	mAvatarProperties.allow_publish = getChild<LLUICtrl>("online_searchresults")->getValue(); -	if ( mAvatarProperties.allow_publish ) +	const BOOL allowPublish = getChild<LLUICtrl>("online_searchresults")->getValue(); + +	if (allowPublish)  	{  		mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH;  	} -	 -	LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); -} +	// +	// NOTE: We really don't want to send the avatar properties unless we absolutely +	//       need to so we can avoid the accidental profile reset bug, so, if we're +	//       logged in, the avatar data has been initialized and we have a state change +	//       for the "allow publish" flag, then set the flag to its new value and send +	//       the properties update. +	// +	// NOTE: The only reason we can not remove this update altogether is because of the +	//       "allow publish" flag, the last remaining profile setting in the viewer +	//       that doesn't exist in the web profile. +	// +	if ((LLStartUp::getStartupState() == STATE_STARTED) && mAvatarDataInitialized && (allowPublish != mAvatarProperties.allow_publish)) +	{ +		mAvatarProperties.allow_publish = allowPublish; + +		LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); +	} +}  BOOL LLFloaterPreference::postBuild()  { @@ -1355,6 +1377,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  		mOriginalHideOnlineStatus = true;  	} +	getChild<LLUICtrl>("online_searchresults")->setEnabled(TRUE); +  	getChildView("include_im_in_chat_history")->setEnabled(TRUE);  	getChildView("show_timestamps_check_im")->setEnabled(TRUE);  	getChildView("friends_online_notify_checkbox")->setEnabled(TRUE); @@ -1734,7 +1758,6 @@ void LLPanelPreferenceGraphics::draw()  		bool enable = hasDirtyChilds();  		button_apply->setEnabled(enable); -  	}  }  bool LLPanelPreferenceGraphics::hasDirtyChilds() diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 46014804ec..5d5e066ec5 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -169,6 +169,7 @@ private:  	bool mGotPersonalInfo;  	bool mOriginalIMViaEmail;  	bool mLanguageChanged; +	bool mAvatarDataInitialized;  	bool mOriginalHideOnlineStatus;  	// Record of current user's favorites may be stored in file on disk. diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index c4dcaf11f9..e15862e2a4 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -191,6 +191,8 @@ BOOL LLHintPopup::postBuild()  	LLRect text_bounds = hint_text.getTextBoundingRect();  	S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight();  	reshape(getRect().getWidth(), getRect().getHeight() + delta_height); +	hint_text.reshape(hint_text.getRect().getWidth(), hint_text.getRect().getHeight() + delta_height); +//	hint_text.translate(0, -delta_height);  	return TRUE;  } @@ -211,6 +213,24 @@ void LLHintPopup::draw()  		alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f);  	} +	LLIconCtrl* hint_icon = findChild<LLIconCtrl>("hint_image"); + +	if (hint_icon) +	{ +		LLUIImagePtr hint_image = hint_icon->getImage(); +		S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); +		S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); + +		LLView* layout_stack = hint_icon->getParent()->getParent(); +		S32 delta_height = image_height - layout_stack->getRect().getHeight(); +		hint_icon->getParent()->reshape(image_width, hint_icon->getParent()->getRect().getHeight()); +		layout_stack->reshape(layout_stack->getRect().getWidth(), image_height); +		layout_stack->translate(0, -delta_height); + +		LLRect hint_rect = getLocalRect(); +		reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); +	} +  	{	LLViewDrawContext context(alpha);   		if (mTarget.empty()) diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 8cf7d23f88..72f64752d6 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -587,11 +587,6 @@ void LLHUDEffectLookAt::update()   */  bool LLHUDEffectLookAt::calcTargetPosition()  { -	if (gNoRender) -	{ -		return false; -	} -  	LLViewerObject *target_obj = (LLViewerObject *)mTargetObject;  	LLVector3 local_offset; diff --git a/indra/newview/llhudmanager.cpp b/indra/newview/llhudmanager.cpp index 5f3178b955..8f14b53db0 100644 --- a/indra/newview/llhudmanager.cpp +++ b/indra/newview/llhudmanager.cpp @@ -38,8 +38,6 @@  #include "llviewercontrol.h"  #include "llviewerobjectlist.h" -extern BOOL gNoRender; -  // These are loaded from saved settings.  LLColor4 LLHUDManager::sParentColor;  LLColor4 LLHUDManager::sChildColor; @@ -150,11 +148,6 @@ LLHUDEffect *LLHUDManager::createViewerEffect(const U8 type, BOOL send_to_sim, B  //static  void LLHUDManager::processViewerEffect(LLMessageSystem *mesgsys, void **user_data)  { -	if (gNoRender) -	{ -		return; -	} -  	LLHUDEffect *effectp = NULL;  	LLUUID effect_id;  	U8 effect_type = 0; diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index f74ae92a7b..50a9c56518 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -56,6 +56,7 @@  #include "llrootview.h"  #include "llspeakers.h"  #include "llsidetray.h" +#include "llviewerchat.h"  static const S32 RECT_PADDING_NOT_INIT = -1; @@ -266,7 +267,9 @@ BOOL LLIMFloater::postBuild()  	mInputEditor->setMaxTextLength(1023);  	// enable line history support for instant message bar  	mInputEditor->setEnableLineHistory(TRUE); -	 + +	LLFontGL* font = LLViewerChat::getChatFont(); +	mInputEditor->setFont(font);	  	mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );  	mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) ); @@ -891,6 +894,7 @@ void LLIMFloater::updateChatHistoryStyle()  void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)  { +	LLFontGL* font = LLViewerChat::getChatFont();  	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");  	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();  		 iter != inst_list.end(); ++iter) @@ -899,6 +903,7 @@ void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)  		if (floater)  		{  			floater->updateChatHistoryStyle(); +			floater->mInputEditor->setFont(font);  		}  	} diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 0ef502b81b..ec3fe48151 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3183,10 +3183,6 @@ public:  			//just like a normal IM  			//this is just replicated code from process_improved_im  			//and should really go in it's own function -jwolk -			if (gNoRender) -			{ -				return; -			}  			LLChat chat;  			std::string message = message_params["message"].asString(); @@ -3263,11 +3259,6 @@ public:  		} //end if invitation has instant message  		else if ( input["body"].has("voice") )  		{ -			if (gNoRender) -			{ -				return; -			} -			  			if(!LLVoiceClient::getInstance()->voiceEnabled() || !LLVoiceClient::getInstance()->isVoiceWorking())  			{  				// Don't display voice invites unless the user has voice enabled. diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 33e051bfab..abcd8588dc 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -480,10 +480,12 @@ LLLoginInstance::LLLoginInstance() :  {  	mLoginModule->getEventPump().listen("lllogininstance",   		boost::bind(&LLLoginInstance::handleLoginEvent, this, _1)); -	mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1)); -	mDispatcher.add("connect",    boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1)); -	mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1)); -	mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1)); +	// This internal use of LLEventDispatcher doesn't really need +	// per-function descriptions. +	mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1)); +	mDispatcher.add("connect",    "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1)); +	mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1)); +	mDispatcher.add("indeterminate", "", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));  }  LLLoginInstance::~LLLoginInstance() @@ -625,11 +627,7 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)  	// Call the method registered in constructor, if any, for more specific  	// handling -	LLEventDispatcher::Callable method(mDispatcher.get(event["change"])); -	if (! method.empty()) -	{ -		method(event); -	} +	mDispatcher.try_call(event);  	return false;  } diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 9493fddf50..5007f1c17a 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -44,6 +44,7 @@  #include "llslurl.h"  #include "lluictrlfactory.h"	// LLDefaultChildRegistry  #include "llkeyboard.h" +#include "llviewermenu.h"  // linden library includes  #include "llfocusmgr.h" @@ -73,6 +74,7 @@ LLMediaCtrl::Params::Params()  	texture_height("texture_height", 1024),  	caret_color("caret_color"),  	initial_mime_type("initial_mime_type"), +	error_page_url("error_page_url"),  	media_id("media_id"),  	trusted_content("trusted_content", false),  	focus_on_click("focus_on_click", true) @@ -102,9 +104,11 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  	mTextureHeight ( 1024 ),  	mClearCache(false),  	mHomePageMimeType(p.initial_mime_type), +	mErrorPageURL(p.error_page_url),  	mTrusted(p.trusted_content),  	mWindowShade(NULL), -	mHoverTextChanged(false) +	mHoverTextChanged(false), +	mContextMenu(NULL)  {  	{  		LLColor4 color = p.caret_color().get(); @@ -149,7 +153,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  LLMediaCtrl::~LLMediaCtrl()  { -  	if (mMediaSource)  	{  		mMediaSource->remObserver( this ); @@ -304,10 +307,12 @@ BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask )  BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )  {  	if (LLPanel::handleRightMouseDown(x, y, mask)) return TRUE; -	convertInputCoords(x, y); + +	S32 media_x = x, media_y = y; +	convertInputCoords(media_x, media_y);  	if (mMediaSource) -		mMediaSource->mouseDown(x, y, mask, 1); +		mMediaSource->mouseDown(media_x, media_y, mask, 1);  	gFocusMgr.setMouseCapture( this ); @@ -316,6 +321,12 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )  		setFocus( TRUE );  	} +	if (mContextMenu) +	{ +		mContextMenu->show(x, y); +		LLMenuGL::showPopup(this, mContextMenu, x, y); +	} +  	return TRUE;  } @@ -378,6 +389,8 @@ void LLMediaCtrl::onFocusLost()  //  BOOL LLMediaCtrl::postBuild ()  { +	mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( +		"menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());  	setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));  	return TRUE;  } @@ -503,22 +516,6 @@ bool LLMediaCtrl::canNavigateForward()  ////////////////////////////////////////////////////////////////////////////////  // -void LLMediaCtrl::set404RedirectUrl( std::string redirect_url ) -{ -	if(mMediaSource && mMediaSource->hasMedia()) -		mMediaSource->getMediaPlugin()->set_status_redirect( 404, redirect_url ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLMediaCtrl::clr404RedirectUrl() -{ -	if(mMediaSource && mMediaSource->hasMedia()) -		mMediaSource->getMediaPlugin()->set_status_redirect(404, ""); -} - -//////////////////////////////////////////////////////////////////////////////// -//  void LLMediaCtrl::clearCache()  {  	if(mMediaSource) @@ -626,6 +623,16 @@ void LLMediaCtrl::setTarget(const std::string& target)  	}  } +void LLMediaCtrl::setErrorPageURL(const std::string& url) +{ +	mErrorPageURL = url; +} + +const std::string& LLMediaCtrl::getErrorPageURL() +{ +	return mErrorPageURL; +} +  ////////////////////////////////////////////////////////////////////////////////  //  bool LLMediaCtrl::setCaretColor(unsigned int red, unsigned int green, unsigned int blue) @@ -976,6 +983,16 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)  		};  		break; +		case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: +		{ +			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; +			if ( mErrorPageURL.length() > 0 ) +			{ +				navigateTo(mErrorPageURL, "text/html"); +			}; +		}; +		break; +  		case MEDIA_EVENT_CLICK_LINK_HREF:  		{  			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 38a74f90d3..28666e620f 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -34,6 +34,7 @@  class LLViewBorder;  class LLUICtrlFactory; +class LLContextMenu;  ////////////////////////////////////////////////////////////////////////////////  // @@ -63,6 +64,7 @@ public:  		Optional<std::string>	initial_mime_type;  		Optional<std::string>	media_id; +		Optional<std::string>	error_page_url;  		Params();  	}; @@ -113,10 +115,9 @@ public:  		void setTarget(const std::string& target); -		// set/clear URL to visit when a 404 page is reached -		void set404RedirectUrl( std::string redirect_url ); -		void clr404RedirectUrl(); -		 +		void setErrorPageURL(const std::string& url); +		const std::string& getErrorPageURL(); +  		// Clear the browser cache when the instance gets loaded  		void clearCache(); @@ -179,6 +180,7 @@ public:  		std::string mHomePageUrl;  		std::string mHomePageMimeType;  		std::string mCurrentNavUrl; +		std::string mErrorPageURL;  		std::string mTarget;  		bool mIgnoreUIScale;  		bool mAlwaysRefresh; @@ -194,6 +196,7 @@ public:  		bool mClearCache;  		class LLWindowShade* mWindowShade;  		bool mHoverTextChanged; +		LLContextMenu* mContextMenu;  };  #endif // LL_LLMediaCtrl_H diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 3b160ddc8e..b8832dfd8e 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -57,6 +57,7 @@  #include "llviewercontrol.h"  #include "llfloatermediabrowser.h"  #include "llweb.h" +#include "llhints.h"  #include "llinventorymodel.h"  #include "lllandmarkactions.h" @@ -324,6 +325,8 @@ BOOL LLNavigationBar::postBuild()  	LLTeleportHistory::getInstance()->setHistoryChangedCallback(  			boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this)); +	LLHints::registerHintTarget("nav_bar", LLView::getHandle()); +  	return TRUE;  } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 903cf4780d..7820ac3ecd 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -214,7 +214,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	}  	updateLocationCombo(false); -	gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange)); +	LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo"); +	mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile")); +	mode_combo.setCommitCallback(boost::bind(&LLPanelLogin::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2));  	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");  	server_choice_combo->setCommitCallback(onSelectServer, NULL); @@ -1159,23 +1161,26 @@ void LLPanelLogin::updateLoginPanelLinks()  	sInstance->getChildView("forgot_password_text")->setVisible( system_grid);  } -//static -void LLPanelLogin::onModeChange() +void LLPanelLogin::onModeChange(const LLSD& original_value, const LLSD& new_value)  { -	LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2)); +	if (original_value.asString() != new_value.asString()) +	{ +		LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLPanelLogin::onModeChangeConfirm, this, original_value, new_value, _1, _2)); +	}  } -//static -void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response) +void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch (option)  	{  	case 0: -		LLAppViewer::instance()->requestQuit(); +		gSavedSettings.getControl("SessionSettingsFile")->set(new_value); +		LLAppViewer::instance()->forceQuit();  		break;  	case 1: -		// do nothing +		// revert to original value +		getChild<LLUICtrl>("mode_combo")->setValue(original_value);  		break;  	default:  		break; diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 1430bec832..9cc5e3456a 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -98,8 +98,8 @@ private:  	static void onServerComboLostFocus(LLFocusableElement*);  	static void updateServerCombo();  	static void updateStartSLURL(); -	static void onModeChange(); -	static void onModeChangeConfirm(const LLSD& notification, const LLSD& response); +	void onModeChange(const LLSD& original_value, const LLSD& new_value); +	void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response);  	static void updateLoginPanelLinks(); diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index d3c9c3e131..1347a02a52 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -67,8 +67,6 @@ BOOL LLPanelMe::postBuild()  {  	LLPanelProfile::postBuild(); -	getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this); -  	return TRUE;  } @@ -135,7 +133,11 @@ void LLPanelMe::buildEditPanel()  	if (NULL == mEditPanel)  	{  		mEditPanel = new LLPanelMyProfileEdit(); -		mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); + +		// Note: Remove support for editing profile through this method. +		//       All profile editing should go through the web. +		//mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); +  		mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this);  	}  } @@ -147,22 +149,6 @@ void LLPanelMe::onEditProfileClicked()  	togglePanel(mEditPanel, getAvatarId()); // open  } -void LLPanelMe::onSaveChangesClicked() -{ -	LLAvatarData data = LLAvatarData(); -	data.avatar_id = gAgent.getID(); -	data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID(); -	data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID(); -	data.about_text = mEditPanel->getChild<LLUICtrl>("sl_description_edit")->getValue().asString(); -	data.fl_about_text = mEditPanel->getChild<LLUICtrl>("fl_description_edit")->getValue().asString(); -	data.profile_url = mEditPanel->getChild<LLUICtrl>("homepage_edit")->getValue().asString(); -	data.allow_publish = mEditPanel->getChild<LLUICtrl>("show_in_search_checkbox")->getValue(); - -	LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data); -	togglePanel(mEditPanel); // close -	onOpen(getAvatarId()); -} -  void LLPanelMe::onCancelClicked()  {  	togglePanel(mEditPanel); // close diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index d5b2fee869..f27f5a268e 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -58,7 +58,6 @@ private:  	void buildEditPanel();  	void onEditProfileClicked(); -	void onSaveChangesClicked();  	void onCancelClicked();  	LLPanelMyProfileEdit *  mEditPanel; diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 1d3c2b72f2..23fa0cbd9c 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -1,723 +1,717 @@ -/** 
 - * @file llphysicsmotion.cpp
 - * @brief Implementation of LLPhysicsMotion class.
 - *
 - * $LicenseInfo:firstyear=2001&license=viewergpl$
 - * 
 - * Copyright (c) 2001-2009, Linden Research, Inc.
 - * 
 - * Second Life Viewer Source Code
 - * The source code in this file ("Source Code") is provided by Linden Lab
 - * to you under the terms of the GNU General Public License, version 2.0
 - * ("GPL"), unless you have obtained a separate licensing agreement
 - * ("Other License"), formally executed by you and Linden Lab.  Terms of
 - * the GPL can be found in doc/GPL-license.txt in this distribution, or
 - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 - * 
 - * There are special exceptions to the terms and conditions of the GPL as
 - * it is applied to this Source Code. View the full text of the exception
 - * in the file doc/FLOSS-exception.txt in this software distribution, or
 - * online at
 - * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 - * 
 - * By copying, modifying or distributing this software, you acknowledge
 - * that you have read and understood your obligations described above,
 - * and agree to abide by those obligations.
 - * 
 - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 - * COMPLETENESS OR PERFORMANCE.
 - * $/LicenseInfo$
 - */
 -
 -//-----------------------------------------------------------------------------
 -// Header Files
 -//-----------------------------------------------------------------------------
 -#include "llviewerprecompiledheaders.h"
 -#include "linden_common.h"
 -
 -#include "m3math.h"
 -#include "v3dmath.h"
 -
 -#include "llphysicsmotion.h"
 -#include "llagent.h"
 -#include "llcharacter.h"
 -#include "llviewercontrol.h"
 -#include "llviewervisualparam.h"
 -#include "llvoavatarself.h"
 -
 -typedef std::map<std::string, std::string> controller_map_t;
 -typedef std::map<std::string, F32> default_controller_map_t;
 -
 -#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f;
 -
 -inline F64 llsgn(const F64 a)
 -{
 -        if (a >= 0)
 -                return 1;
 -        return -1;
 -}
 -
 -/* 
 -   At a high level, this works by setting temporary parameters that are not stored
 -   in the avatar's list of params, and are not conveyed to other users.  We accomplish
 -   this by creating some new temporary driven params inside avatar_lad that are then driven
 -   by the actual params that the user sees and sets.  For example, in the old system,
 -   the user sets a param called breast bouyancy, which controls the Z value of the breasts.
 -   In our new system, the user still sets the breast bouyancy, but that param is redefined
 -   as a driver param so that affects a new temporary driven param that the bounce is applied
 -   to.
 -*/
 -
 -class LLPhysicsMotion
 -{
 -public:
 -        /*
 -          param_driver_name: The param that controls the params that are being affected by the physics.
 -          joint_name: The joint that the body part is attached to.  The joint is
 -          used to determine the orientation (rotation) of the body part.
 -
 -          character: The avatar that this physics affects.
 -
 -          motion_direction_vec: The direction (in world coordinates) that determines the
 -          motion.  For example, (0,0,1) is up-down, and means that up-down motion is what
 -          determines how this joint moves.
 -
 -          controllers: The various settings (e.g. spring force, mass) that determine how
 -          the body part behaves.
 -        */
 -        LLPhysicsMotion(const std::string ¶m_driver_name, 
 -                        const std::string &joint_name,
 -                        LLCharacter *character,
 -                        const LLVector3 &motion_direction_vec,
 -                        const controller_map_t &controllers) :
 -                mParamDriverName(param_driver_name),
 -                mJointName(joint_name),
 -                mMotionDirectionVec(motion_direction_vec),
 -                mParamDriver(NULL),
 -                mParamControllers(controllers),
 -                mCharacter(character),
 -                mLastTime(0),
 -                mPosition_local(0),
 -                mVelocityJoint_local(0),
 -                mPositionLastUpdate_local(0)
 -        {
 -                mJointState = new LLJointState;
 -        }
 -
 -        BOOL initialize();
 -
 -        ~LLPhysicsMotion() {}
 -
 -        BOOL onUpdate(F32 time);
 -
 -        LLPointer<LLJointState> getJointState() 
 -        {
 -                return mJointState;
 -        }
 -protected:
 -        F32 getParamValue(const std::string& controller_key)
 -        {
 -                const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key);
 -                if (entry == mParamControllers.end())
 -                {
 -                        return sDefaultController[controller_key];
 -                }
 -                const std::string& param_name = (*entry).second.c_str();
 -                return mCharacter->getVisualParamWeight(param_name.c_str());
 -        }
 -        void setParamValue(LLViewerVisualParam *param,
 -                           const F32 new_value_local,
 -						   F32 behavior_maxeffect);
 -
 -        F32 toLocal(const LLVector3 &world);
 -        F32 calculateVelocity_local(const F32 time_delta);
 -        F32 calculateAcceleration_local(F32 velocity_local,
 -                                        const F32 time_delta);
 -private:
 -        const std::string mParamDriverName;
 -        const std::string mParamControllerName;
 -        const LLVector3 mMotionDirectionVec;
 -        const std::string mJointName;
 -
 -        F32 mPosition_local;
 -        F32 mVelocityJoint_local; // How fast the joint is moving
 -        F32 mAccelerationJoint_local; // Acceleration on the joint
 -
 -        F32 mVelocity_local; // How fast the param is moving
 -        F32 mPositionLastUpdate_local;
 -        LLVector3 mPosition_world;
 -
 -        LLViewerVisualParam *mParamDriver;
 -        const controller_map_t mParamControllers;
 -        
 -        LLPointer<LLJointState> mJointState;
 -        LLCharacter *mCharacter;
 -
 -        F32 mLastTime;
 -        
 -        static default_controller_map_t sDefaultController;
 -};
 -
 -default_controller_map_t initDefaultController()
 -{
 -        default_controller_map_t controller;
 -        controller["Mass"] = 0.2f;
 -        controller["Gravity"] = 0.0f;
 -        controller["Damping"] = .05f;
 -        controller["Drag"] = 0.15f;
 -        controller["MaxEffect"] = 0.1f;
 -        controller["Spring"] = 0.1f;
 -        controller["Gain"] = 10.0f;
 -        return controller;
 -}
 -
 -default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController();
 -
 -BOOL LLPhysicsMotion::initialize()
 -{
 -        if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str())))
 -                return FALSE;
 -        mJointState->setUsage(LLJointState::ROT);
 -
 -        mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str());
 -        if (mParamDriver == NULL)
 -        {
 -                llinfos << "Failure reading in  [ " << mParamDriverName << " ]" << llendl;
 -                return FALSE;
 -        }
 -
 -        return TRUE;
 -}
 -
 -LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : 
 -        LLMotion(id),
 -        mCharacter(NULL)
 -{
 -        mName = "breast_motion";
 -}
 -
 -LLPhysicsMotionController::~LLPhysicsMotionController()
 -{
 -        for (motion_vec_t::iterator iter = mMotions.begin();
 -             iter != mMotions.end();
 -             ++iter)
 -        {
 -                delete (*iter);
 -        }
 -}
 -
 -BOOL LLPhysicsMotionController::onActivate() 
 -{ 
 -        return TRUE; 
 -}
 -
 -void LLPhysicsMotionController::onDeactivate() 
 -{
 -}
 -
 -LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character)
 -{
 -        mCharacter = character;
 -
 -        mMotions.clear();
 -
 -        // Breast Cleavage
 -        {
 -                controller_map_t controller;
 -                controller["Mass"] = "Breast_Physics_Mass";
 -                controller["Gravity"] = "Breast_Physics_Gravity";
 -                controller["Drag"] = "Breast_Physics_Drag";
 -                controller["Damping"] = "Breast_Physics_InOut_Damping";
 -                controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect";
 -                controller["Spring"] = "Breast_Physics_InOut_Spring";
 -                controller["Gain"] = "Breast_Physics_InOut_Gain";
 -                LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller",
 -                                                                                                          "mChest",
 -                                                                                                          character,
 -                                                                                                          LLVector3(-1,0,0),
 -                                                                                                          controller);
 -                if (!motion->initialize())
 -                {
 -                        llassert_always(FALSE);
 -                        return STATUS_FAILURE;
 -                }
 -                addMotion(motion);
 -        }
 -
 -        // Breast Bounce
 -        {
 -                controller_map_t controller;
 -                controller["Mass"] = "Breast_Physics_Mass";
 -                controller["Gravity"] = "Breast_Physics_Gravity";
 -                controller["Drag"] = "Breast_Physics_Drag";
 -                controller["Damping"] = "Breast_Physics_UpDown_Damping";
 -                controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect";
 -                controller["Spring"] = "Breast_Physics_UpDown_Spring";
 -                controller["Gain"] = "Breast_Physics_UpDown_Gain";
 -                LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller",
 -                                                                                                          "mChest",
 -                                                                                                          character,
 -                                                                                                          LLVector3(0,0,1),
 -                                                                                                          controller);
 -                if (!motion->initialize())
 -                {
 -                        llassert_always(FALSE);
 -                        return STATUS_FAILURE;
 -                }
 -                addMotion(motion);
 -        }
 -
 -        // Breast Sway
 -        {
 -                controller_map_t controller;
 -                controller["Mass"] = "Breast_Physics_Mass";
 -                controller["Gravity"] = "Breast_Physics_Gravity";
 -                controller["Drag"] = "Breast_Physics_Drag";
 -                controller["Damping"] = "Breast_Physics_LeftRight_Damping";
 -                controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect";
 -                controller["Spring"] = "Breast_Physics_LeftRight_Spring";
 -                controller["Gain"] = "Breast_Physics_LeftRight_Gain";
 -                LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller",
 -                                                                                                          "mChest",
 -                                                                                                          character,
 -                                                                                                          LLVector3(0,-1,0),
 -                                                                                                          controller);
 -                if (!motion->initialize())
 -                {
 -                        llassert_always(FALSE);
 -                        return STATUS_FAILURE;
 -                }
 -                addMotion(motion);
 -        }
 -        // Butt Bounce
 -        {
 -                controller_map_t controller;
 -                controller["Mass"] = "Butt_Physics_Mass";
 -                controller["Gravity"] = "Butt_Physics_Gravity";
 -                controller["Drag"] = "Butt_Physics_Drag";
 -                controller["Damping"] = "Butt_Physics_UpDown_Damping";
 -                controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect";
 -                controller["Spring"] = "Butt_Physics_UpDown_Spring";
 -                controller["Gain"] = "Butt_Physics_UpDown_Gain";
 -                LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller",
 -                                                                                                          "mPelvis",
 -                                                                                                          character,
 -                                                                                                          LLVector3(0,0,-1),
 -                                                                                                          controller);
 -                if (!motion->initialize())
 -                {
 -                        llassert_always(FALSE);
 -                        return STATUS_FAILURE;
 -                }
 -                addMotion(motion);
 -        }
 -
 -        // Butt LeftRight
 -        {
 -                controller_map_t controller;
 -                controller["Mass"] = "Butt_Physics_Mass";
 -                controller["Gravity"] = "Butt_Physics_Gravity";
 -                controller["Drag"] = "Butt_Physics_Drag";
 -                controller["Damping"] = "Butt_Physics_LeftRight_Damping";
 -                controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect";
 -                controller["Spring"] = "Butt_Physics_LeftRight_Spring";
 -                controller["Gain"] = "Butt_Physics_LeftRight_Gain";
 -                LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller",
 -                                                                                                          "mPelvis",
 -                                                                                                          character,
 -                                                                                                          LLVector3(0,-1,0),
 -                                                                                                          controller);
 -                if (!motion->initialize())
 -                {
 -                        llassert_always(FALSE);
 -                        return STATUS_FAILURE;
 -                }
 -                addMotion(motion);
 -        }
 -
 -        // Belly Bounce
 -        {
 -                controller_map_t controller;
 -                controller["Mass"] = "Belly_Physics_Mass";
 -                controller["Gravity"] = "Belly_Physics_Gravity";
 -                controller["Drag"] = "Belly_Physics_Drag";
 -                controller["Damping"] = "Belly_Physics_UpDown_Damping";
 -                controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect";
 -                controller["Spring"] = "Belly_Physics_UpDown_Spring";
 -                controller["Gain"] = "Belly_Physics_UpDown_Gain";
 -                LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller",
 -                                                                                                          "mPelvis",
 -                                                                                                          character,
 -                                                                                                          LLVector3(0,0,-1),
 -                                                                                                          controller);
 -                if (!motion->initialize())
 -                {
 -                        llassert_always(FALSE);
 -                        return STATUS_FAILURE;
 -                }
 -                addMotion(motion);
 -        }
 -        
 -        return STATUS_SUCCESS;
 -}
 -
 -void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion)
 -{
 -        addJointState(motion->getJointState());
 -        mMotions.push_back(motion);
 -}
 -
 -F32 LLPhysicsMotionController::getMinPixelArea() 
 -{
 -        return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION;
 -}
 -
 -// Local space means "parameter space".
 -F32 LLPhysicsMotion::toLocal(const LLVector3 &world)
 -{
 -        LLJoint *joint = mJointState->getJoint();
 -        const LLQuaternion rotation_world = joint->getWorldRotation();
 -        
 -        LLVector3 dir_world = mMotionDirectionVec * rotation_world;
 -        dir_world.normalize();
 -        return world * dir_world;
 -}
 -
 -F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta)
 -{
 -        LLJoint *joint = mJointState->getJoint();
 -        const LLVector3 position_world = joint->getWorldPosition();
 -        const LLQuaternion rotation_world = joint->getWorldRotation();
 -        const LLVector3 last_position_world = mPosition_world;
 -        const LLVector3 velocity_world = (position_world-last_position_world) / time_delta;
 -        const F32 velocity_local = toLocal(velocity_world);
 -        return velocity_local;
 -}
 -
 -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local,
 -                                                 const F32 time_delta)
 -{
 -//        const F32 smoothing = getParamValue("Smoothing");
 -        static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary
 -        const F32 acceleration_local = velocity_local - mVelocityJoint_local;
 -        
 -        const F32 smoothed_acceleration_local = 
 -                acceleration_local * 1.0/smoothing + 
 -                mAccelerationJoint_local * (smoothing-1.0)/smoothing;
 -        
 -        return smoothed_acceleration_local;
 -}
 -
 -BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask)
 -{
 -        // Skip if disabled globally.
 -        if (!gSavedSettings.getBOOL("AvatarPhysics"))
 -        {
 -                return TRUE;
 -        }
 -        
 -        BOOL update_visuals = FALSE;
 -        for (motion_vec_t::iterator iter = mMotions.begin();
 -             iter != mMotions.end();
 -             ++iter)
 -        {
 -                LLPhysicsMotion *motion = (*iter);
 -                update_visuals |= motion->onUpdate(time);
 -        }
 -                
 -        if (update_visuals)
 -                mCharacter->updateVisualParams();
 -        
 -        return TRUE;
 -}
 -
 -
 -// Return TRUE if character has to update visual params.
 -BOOL LLPhysicsMotion::onUpdate(F32 time)
 -{
 -        // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w");
 -        
 -        if (!mParamDriver)
 -                return FALSE;
 -
 -        if (!mLastTime)
 -        {
 -                mLastTime = time;
 -                return FALSE;
 -        }
 -
 -        ////////////////////////////////////////////////////////////////////////////////
 -        // Get all parameters and settings
 -        //
 -
 -        const F32 time_delta = time - mLastTime;
 -        if (time_delta > 3.0 || time_delta <= 0.01)
 -        {
 -                mLastTime = time;
 -                return FALSE;
 -        }
 -
 -        // Higher LOD is better.  This controls the granularity
 -        // and frequency of updates for the motions.
 -        const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor;
 -        if (lod_factor == 0)
 -        {
 -                return TRUE;
 -        }
 -
 -        LLJoint *joint = mJointState->getJoint();
 -
 -        const F32 behavior_mass = getParamValue("Mass");
 -        const F32 behavior_gravity = getParamValue("Gravity");
 -        const F32 behavior_spring = getParamValue("Spring");
 -        const F32 behavior_gain = getParamValue("Gain");
 -        const F32 behavior_damping = getParamValue("Damping");
 -        const F32 behavior_drag = getParamValue("Drag");
 -        const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike();
 -        
 -        F32 behavior_maxeffect = getParamValue("MaxEffect");
 -        if (physics_test)
 -                behavior_maxeffect = 1.0f;
 -
 -        // mPositon_local should be in normalized 0,1 range already.  Just making sure...
 -        F32 position_current_local = llclamp(mPosition_local,
 -                                             0.0f,
 -                                             1.0f);
 -
 -        // Normalize the param position to be from [0,1].
 -        // We have to use normalized values because there may be more than one driven param,
 -        // and each of these driven params may have its own range.
 -        // This means we'll do all our calculations in normalized [0,1] local coordinates.
 -        F32 position_user_local = mParamDriver->getWeight();
 -        position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
 -
 -        // If the effect is turned off then don't process unless we need one more update
 -        // to set the position to the default (i.e. user) position.
 -        if ((behavior_maxeffect == 0) && (position_current_local == position_user_local))
 -        {
 -            return FALSE;
 -        }
 -
 -        //
 -        // End parameters and settings
 -        ////////////////////////////////////////////////////////////////////////////////
 -
 -
 -        ////////////////////////////////////////////////////////////////////////////////
 -        // Calculate velocity and acceleration in parameter space.
 -        //
 -        
 -        const F32 velocity_joint_local = calculateVelocity_local(time_delta);
 -        const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta);
 -
 -        //
 -        // End velocity and acceleration
 -        ////////////////////////////////////////////////////////////////////////////////
 -
 -
 -        ////////////////////////////////////////////////////////////////////////////////
 -        // Calculate the total force 
 -        //
 -
 -        // Spring force is a restoring force towards the original user-set breast position.
 -        // F = kx
 -        const F32 spring_length = position_current_local - position_user_local;
 -        const F32 force_spring = -spring_length * behavior_spring;
 -
 -        // Acceleration is the force that comes from the change in velocity of the torso.
 -        // F = ma
 -        const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass);
 -
 -        // Gravity always points downward in world space.
 -        // F = mg
 -        const LLVector3 gravity_world(0,0,1);
 -        const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass);
 -                
 -        // Damping is a restoring force that opposes the current velocity.
 -        // F = -kv
 -        const F32 force_damping = -behavior_damping * mVelocity_local;
 -                
 -        // Drag is a force imparted by velocity (intuitively it is similar to wind resistance)
 -        // F = .5kv^2
 -        const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local);
 -
 -        const F32 force_net = (force_accel + 
 -                               force_gravity +
 -                               force_spring + 
 -                               force_damping + 
 -                               force_drag);
 -
 -        //
 -        // End total force
 -        ////////////////////////////////////////////////////////////////////////////////
 -
 -        
 -        ////////////////////////////////////////////////////////////////////////////////
 -        // Calculate new params
 -        //
 -
 -        // Calculate the new acceleration based on the net force.
 -        // a = F/m
 -        const F32 acceleration_new_local = force_net / behavior_mass;
 -        static const F32 max_acceleration = 10.0f; // magic number, used to be customizable.
 -        F32 velocity_new_local = mVelocity_local + acceleration_new_local;
 -        velocity_new_local = llclamp(velocity_new_local, 
 -                                     -max_acceleration, max_acceleration);
 -        
 -        // Temporary debugging setting to cause all avatars to move, for profiling purposes.
 -        if (physics_test)
 -        {
 -                velocity_new_local = sin(time*4.0);
 -        }
 -        // Calculate the new parameters, or remain unchanged if max speed is 0.
 -        F32 position_new_local = position_current_local + velocity_new_local*time_delta;
 -        if (behavior_maxeffect == 0)
 -            position_new_local = position_user_local;
 -
 -        // Zero out the velocity if the param is being pushed beyond its limits.
 -        if ((position_new_local < 0 && velocity_new_local < 0) || 
 -            (position_new_local > 1 && velocity_new_local > 0))
 -        {
 -                velocity_new_local = 0;
 -        }
 -	
 -	// Check for NaN values.  A NaN value is detected if the variables doesn't equal itself.  
 -	// If NaN, then reset everything.
 -	if ((mPosition_local != mPosition_local) ||
 -	    (mVelocity_local != mVelocity_local) ||
 -	    (position_new_local != position_new_local))
 -	{
 -		position_new_local = 0;
 -		position_current_local = 0;
 -		position_user_local = 0;
 -		mVelocity_local = 0;
 -		mVelocityJoint_local = 0;
 -		mAccelerationJoint_local = 0;
 -		mPosition_local = 0;
 -		mPosition_world = LLVector3(0,0,0);
 -	}
 -
 -        const F32 position_new_local_clamped = llclamp(position_new_local,
 -						       0.0f,
 -						       1.0f);
 -
 -        LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
 -        llassert_always(driver_param);
 -        if (driver_param)
 -        {
 -                // If this is one of our "hidden" driver params, then make sure it's
 -                // the default value.
 -                if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) &&
 -                    (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT))
 -                {
 -                        mCharacter->setVisualParamWeight(driver_param,
 -                                                         0,
 -                                                         FALSE);
 -                }
 -                for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin();
 -                     iter != driver_param->mDriven.end();
 -                     ++iter)
 -                {
 -                        LLDrivenEntry &entry = (*iter);
 -                        LLViewerVisualParam *driven_param = entry.mParam;
 -                        setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);
 -                }
 -        }
 -        
 -        //
 -        // End calculate new params
 -        ////////////////////////////////////////////////////////////////////////////////
 -
 -        ////////////////////////////////////////////////////////////////////////////////
 -        // Conditionally update the visual params
 -        //
 -        
 -        // Updating the visual params (i.e. what the user sees) is fairly expensive.
 -        // So only update if the params have changed enough, and also take into account
 -        // the graphics LOD settings.
 -        
 -        BOOL update_visuals = FALSE;
 -
 -        // For non-self, if the avatar is small enough visually, then don't update.
 -        const F32 area_for_max_settings = 0.0;
 -        const F32 area_for_min_settings = 1400.0;
 -        const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor);
 -        const F32 pixel_area = fsqrtf(mCharacter->getPixelArea());
 -        
 -        const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL);
 -        if ((pixel_area > area_for_this_setting) || is_self)
 -        {
 -                const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped);
 -                const F32 min_delta = (1.01f-lod_factor)*0.4f;
 -                if (llabs(position_diff_local) > min_delta)
 -                {
 -                        update_visuals = TRUE;
 -                        mPositionLastUpdate_local = position_new_local;
 -                }
 -        }
 -
 -        //
 -        // End update visual params
 -        ////////////////////////////////////////////////////////////////////////////////
 -
 -        mVelocityJoint_local = velocity_joint_local;
 -
 -        mVelocity_local = velocity_new_local;
 -        mAccelerationJoint_local = acceleration_joint_local;
 -        mPosition_local = position_new_local;
 -
 -        mPosition_world = joint->getWorldPosition();
 -        mLastTime = time;
 -
 -        /*
 -          // Write out debugging info into a spreadsheet.
 -          if (mFileWrite != NULL && is_self)
 -          {
 -          fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n",
 -          position_new_local,
 -          velocity_new_local,
 -          acceleration_new_local,
 -
 -          time_delta,
 -
 -          mPosition_world[0],
 -          mPosition_world[1],
 -          mPosition_world[2],
 -
 -          force_net,
 -          force_spring,
 -          force_accel,
 -          force_damping,
 -          force_drag,
 -
 -          spring_length,
 -          velocity_joint_local,
 -          acceleration_joint_local
 -          );
 -          }
 -        */
 -
 -        return update_visuals;
 -}
 -
 -// Range of new_value_local is assumed to be [0 , 1] normalized.
 -void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param,
 -                                    F32 new_value_normalized,
 -				    F32 behavior_maxeffect)
 -{
 -        const F32 value_min_local = param->getMinWeight();
 -        const F32 value_max_local = param->getMaxWeight();
 -        const F32 min_val = 0.5f-behavior_maxeffect/2.0;
 -        const F32 max_val = 0.5f+behavior_maxeffect/2.0;
 -
 -	// Scale from [0,1] to [min_val,max_val]
 -	const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized;
 -	
 -	// Scale from [0,1] to [value_min_local,value_max_local]
 -        const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled;
 -
 -        mCharacter->setVisualParamWeight(param,
 -                                         new_value_local,
 -                                         FALSE);
 -}
 +/**  + * @file llphysicsmotion.cpp + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include "llviewerprecompiledheaders.h" +#include "linden_common.h" + +#include "m3math.h" +#include "v3dmath.h" + +#include "llphysicsmotion.h" +#include "llagent.h" +#include "llcharacter.h" +#include "llviewercontrol.h" +#include "llviewervisualparam.h" +#include "llvoavatarself.h" + +typedef std::map<std::string, std::string> controller_map_t; +typedef std::map<std::string, F32> default_controller_map_t; + +#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f; + +inline F64 llsgn(const F64 a) +{ +        if (a >= 0) +                return 1; +        return -1; +} + +/*  +   At a high level, this works by setting temporary parameters that are not stored +   in the avatar's list of params, and are not conveyed to other users.  We accomplish +   this by creating some new temporary driven params inside avatar_lad that are then driven +   by the actual params that the user sees and sets.  For example, in the old system, +   the user sets a param called breast bouyancy, which controls the Z value of the breasts. +   In our new system, the user still sets the breast bouyancy, but that param is redefined +   as a driver param so that affects a new temporary driven param that the bounce is applied +   to. +*/ + +class LLPhysicsMotion +{ +public: +        /* +          param_driver_name: The param that controls the params that are being affected by the physics. +          joint_name: The joint that the body part is attached to.  The joint is +          used to determine the orientation (rotation) of the body part. + +          character: The avatar that this physics affects. + +          motion_direction_vec: The direction (in world coordinates) that determines the +          motion.  For example, (0,0,1) is up-down, and means that up-down motion is what +          determines how this joint moves. + +          controllers: The various settings (e.g. spring force, mass) that determine how +          the body part behaves. +        */ +        LLPhysicsMotion(const std::string ¶m_driver_name,  +                        const std::string &joint_name, +                        LLCharacter *character, +                        const LLVector3 &motion_direction_vec, +                        const controller_map_t &controllers) : +                mParamDriverName(param_driver_name), +                mJointName(joint_name), +                mMotionDirectionVec(motion_direction_vec), +                mParamDriver(NULL), +                mParamControllers(controllers), +                mCharacter(character), +                mLastTime(0), +                mPosition_local(0), +                mVelocityJoint_local(0), +                mPositionLastUpdate_local(0) +        { +                mJointState = new LLJointState; +        } + +        BOOL initialize(); + +        ~LLPhysicsMotion() {} + +        BOOL onUpdate(F32 time); + +        LLPointer<LLJointState> getJointState()  +        { +                return mJointState; +        } +protected: +        F32 getParamValue(const std::string& controller_key) +        { +                const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); +                if (entry == mParamControllers.end()) +                { +                        return sDefaultController[controller_key]; +                } +                const std::string& param_name = (*entry).second.c_str(); +                return mCharacter->getVisualParamWeight(param_name.c_str()); +        } +        void setParamValue(LLViewerVisualParam *param, +                           const F32 new_value_local, +						   F32 behavior_maxeffect); + +        F32 toLocal(const LLVector3 &world); +        F32 calculateVelocity_local(const F32 time_delta); +        F32 calculateAcceleration_local(F32 velocity_local, +                                        const F32 time_delta); +private: +        const std::string mParamDriverName; +        const std::string mParamControllerName; +        const LLVector3 mMotionDirectionVec; +        const std::string mJointName; + +        F32 mPosition_local; +        F32 mVelocityJoint_local; // How fast the joint is moving +        F32 mAccelerationJoint_local; // Acceleration on the joint + +        F32 mVelocity_local; // How fast the param is moving +        F32 mPositionLastUpdate_local; +        LLVector3 mPosition_world; + +        LLViewerVisualParam *mParamDriver; +        const controller_map_t mParamControllers; +         +        LLPointer<LLJointState> mJointState; +        LLCharacter *mCharacter; + +        F32 mLastTime; +         +        static default_controller_map_t sDefaultController; +}; + +default_controller_map_t initDefaultController() +{ +        default_controller_map_t controller; +        controller["Mass"] = 0.2f; +        controller["Gravity"] = 0.0f; +        controller["Damping"] = .05f; +        controller["Drag"] = 0.15f; +        controller["MaxEffect"] = 0.1f; +        controller["Spring"] = 0.1f; +        controller["Gain"] = 10.0f; +        return controller; +} + +default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); + +BOOL LLPhysicsMotion::initialize() +{ +        if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) +                return FALSE; +        mJointState->setUsage(LLJointState::ROT); + +        mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); +        if (mParamDriver == NULL) +        { +                llinfos << "Failure reading in  [ " << mParamDriverName << " ]" << llendl; +                return FALSE; +        } + +        return TRUE; +} + +LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) :  +        LLMotion(id), +        mCharacter(NULL) +{ +        mName = "breast_motion"; +} + +LLPhysicsMotionController::~LLPhysicsMotionController() +{ +        for (motion_vec_t::iterator iter = mMotions.begin(); +             iter != mMotions.end(); +             ++iter) +        { +                delete (*iter); +        } +} + +BOOL LLPhysicsMotionController::onActivate()  +{  +        return TRUE;  +} + +void LLPhysicsMotionController::onDeactivate()  +{ +} + +LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) +{ +        mCharacter = character; + +        mMotions.clear(); + +        // Breast Cleavage +        { +                controller_map_t controller; +                controller["Mass"] = "Breast_Physics_Mass"; +                controller["Gravity"] = "Breast_Physics_Gravity"; +                controller["Drag"] = "Breast_Physics_Drag"; +                controller["Damping"] = "Breast_Physics_InOut_Damping"; +                controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; +                controller["Spring"] = "Breast_Physics_InOut_Spring"; +                controller["Gain"] = "Breast_Physics_InOut_Gain"; +                LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", +                                                                                                          "mChest", +                                                                                                          character, +                                                                                                          LLVector3(-1,0,0), +                                                                                                          controller); +                if (!motion->initialize()) +                { +                        llassert_always(FALSE); +                        return STATUS_FAILURE; +                } +                addMotion(motion); +        } + +        // Breast Bounce +        { +                controller_map_t controller; +                controller["Mass"] = "Breast_Physics_Mass"; +                controller["Gravity"] = "Breast_Physics_Gravity"; +                controller["Drag"] = "Breast_Physics_Drag"; +                controller["Damping"] = "Breast_Physics_UpDown_Damping"; +                controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; +                controller["Spring"] = "Breast_Physics_UpDown_Spring"; +                controller["Gain"] = "Breast_Physics_UpDown_Gain"; +                LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", +                                                                                                          "mChest", +                                                                                                          character, +                                                                                                          LLVector3(0,0,1), +                                                                                                          controller); +                if (!motion->initialize()) +                { +                        llassert_always(FALSE); +                        return STATUS_FAILURE; +                } +                addMotion(motion); +        } + +        // Breast Sway +        { +                controller_map_t controller; +                controller["Mass"] = "Breast_Physics_Mass"; +                controller["Gravity"] = "Breast_Physics_Gravity"; +                controller["Drag"] = "Breast_Physics_Drag"; +                controller["Damping"] = "Breast_Physics_LeftRight_Damping"; +                controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; +                controller["Spring"] = "Breast_Physics_LeftRight_Spring"; +                controller["Gain"] = "Breast_Physics_LeftRight_Gain"; +                LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", +                                                                                                          "mChest", +                                                                                                          character, +                                                                                                          LLVector3(0,-1,0), +                                                                                                          controller); +                if (!motion->initialize()) +                { +                        llassert_always(FALSE); +                        return STATUS_FAILURE; +                } +                addMotion(motion); +        } +        // Butt Bounce +        { +                controller_map_t controller; +                controller["Mass"] = "Butt_Physics_Mass"; +                controller["Gravity"] = "Butt_Physics_Gravity"; +                controller["Drag"] = "Butt_Physics_Drag"; +                controller["Damping"] = "Butt_Physics_UpDown_Damping"; +                controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; +                controller["Spring"] = "Butt_Physics_UpDown_Spring"; +                controller["Gain"] = "Butt_Physics_UpDown_Gain"; +                LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", +                                                                                                          "mPelvis", +                                                                                                          character, +                                                                                                          LLVector3(0,0,-1), +                                                                                                          controller); +                if (!motion->initialize()) +                { +                        llassert_always(FALSE); +                        return STATUS_FAILURE; +                } +                addMotion(motion); +        } + +        // Butt LeftRight +        { +                controller_map_t controller; +                controller["Mass"] = "Butt_Physics_Mass"; +                controller["Gravity"] = "Butt_Physics_Gravity"; +                controller["Drag"] = "Butt_Physics_Drag"; +                controller["Damping"] = "Butt_Physics_LeftRight_Damping"; +                controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; +                controller["Spring"] = "Butt_Physics_LeftRight_Spring"; +                controller["Gain"] = "Butt_Physics_LeftRight_Gain"; +                LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", +                                                                                                          "mPelvis", +                                                                                                          character, +                                                                                                          LLVector3(0,-1,0), +                                                                                                          controller); +                if (!motion->initialize()) +                { +                        llassert_always(FALSE); +                        return STATUS_FAILURE; +                } +                addMotion(motion); +        } + +        // Belly Bounce +        { +                controller_map_t controller; +                controller["Mass"] = "Belly_Physics_Mass"; +                controller["Gravity"] = "Belly_Physics_Gravity"; +                controller["Drag"] = "Belly_Physics_Drag"; +                controller["Damping"] = "Belly_Physics_UpDown_Damping"; +                controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; +                controller["Spring"] = "Belly_Physics_UpDown_Spring"; +                controller["Gain"] = "Belly_Physics_UpDown_Gain"; +                LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", +                                                                                                          "mPelvis", +                                                                                                          character, +                                                                                                          LLVector3(0,0,-1), +                                                                                                          controller); +                if (!motion->initialize()) +                { +                        llassert_always(FALSE); +                        return STATUS_FAILURE; +                } +                addMotion(motion); +        } +         +        return STATUS_SUCCESS; +} + +void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) +{ +        addJointState(motion->getJointState()); +        mMotions.push_back(motion); +} + +F32 LLPhysicsMotionController::getMinPixelArea()  +{ +        return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; +} + +// Local space means "parameter space". +F32 LLPhysicsMotion::toLocal(const LLVector3 &world) +{ +        LLJoint *joint = mJointState->getJoint(); +        const LLQuaternion rotation_world = joint->getWorldRotation(); +         +        LLVector3 dir_world = mMotionDirectionVec * rotation_world; +        dir_world.normalize(); +        return world * dir_world; +} + +F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) +{ +        LLJoint *joint = mJointState->getJoint(); +        const LLVector3 position_world = joint->getWorldPosition(); +        const LLQuaternion rotation_world = joint->getWorldRotation(); +        const LLVector3 last_position_world = mPosition_world; +        const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; +        const F32 velocity_local = toLocal(velocity_world); +        return velocity_local; +} + +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, +                                                 const F32 time_delta) +{ +//        const F32 smoothing = getParamValue("Smoothing"); +        static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary +        const F32 acceleration_local = velocity_local - mVelocityJoint_local; +         +        const F32 smoothed_acceleration_local =  +                acceleration_local * 1.0/smoothing +  +                mAccelerationJoint_local * (smoothing-1.0)/smoothing; +         +        return smoothed_acceleration_local; +} + +BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) +{ +        // Skip if disabled globally. +        if (!gSavedSettings.getBOOL("AvatarPhysics")) +        { +                return TRUE; +        } +         +        BOOL update_visuals = FALSE; +        for (motion_vec_t::iterator iter = mMotions.begin(); +             iter != mMotions.end(); +             ++iter) +        { +                LLPhysicsMotion *motion = (*iter); +                update_visuals |= motion->onUpdate(time); +        } +                 +        if (update_visuals) +                mCharacter->updateVisualParams(); +         +        return TRUE; +} + + +// Return TRUE if character has to update visual params. +BOOL LLPhysicsMotion::onUpdate(F32 time) +{ +        // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); +         +        if (!mParamDriver) +                return FALSE; + +        if (!mLastTime) +        { +                mLastTime = time; +                return FALSE; +        } + +        //////////////////////////////////////////////////////////////////////////////// +        // Get all parameters and settings +        // + +        const F32 time_delta = time - mLastTime; +        if (time_delta > 3.0 || time_delta <= 0.01) +        { +                mLastTime = time; +                return FALSE; +        } + +        // Higher LOD is better.  This controls the granularity +        // and frequency of updates for the motions. +        const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; +        if (lod_factor == 0) +        { +                return TRUE; +        } + +        LLJoint *joint = mJointState->getJoint(); + +        const F32 behavior_mass = getParamValue("Mass"); +        const F32 behavior_gravity = getParamValue("Gravity"); +        const F32 behavior_spring = getParamValue("Spring"); +        const F32 behavior_gain = getParamValue("Gain"); +        const F32 behavior_damping = getParamValue("Damping"); +        const F32 behavior_drag = getParamValue("Drag"); +        const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike(); +         +        F32 behavior_maxeffect = getParamValue("MaxEffect"); +        if (physics_test) +                behavior_maxeffect = 1.0f; + +        // mPositon_local should be in normalized 0,1 range already.  Just making sure... +        F32 position_current_local = llclamp(mPosition_local, +                                             0.0f, +                                             1.0f); + +        // Normalize the param position to be from [0,1]. +        // We have to use normalized values because there may be more than one driven param, +        // and each of these driven params may have its own range. +        // This means we'll do all our calculations in normalized [0,1] local coordinates. +        F32 position_user_local = mParamDriver->getWeight(); +        position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + +        // If the effect is turned off then don't process unless we need one more update +        // to set the position to the default (i.e. user) position. +        if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) +        { +            return FALSE; +        } + +        // +        // End parameters and settings +        //////////////////////////////////////////////////////////////////////////////// + + +        //////////////////////////////////////////////////////////////////////////////// +        // Calculate velocity and acceleration in parameter space. +        // +         +        const F32 velocity_joint_local = calculateVelocity_local(time_delta); +        const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta); + +        // +        // End velocity and acceleration +        //////////////////////////////////////////////////////////////////////////////// + + +        //////////////////////////////////////////////////////////////////////////////// +        // Calculate the total force  +        // + +        // Spring force is a restoring force towards the original user-set breast position. +        // F = kx +        const F32 spring_length = position_current_local - position_user_local; +        const F32 force_spring = -spring_length * behavior_spring; + +        // Acceleration is the force that comes from the change in velocity of the torso. +        // F = ma +        const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + +        // Gravity always points downward in world space. +        // F = mg +        const LLVector3 gravity_world(0,0,1); +        const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); +                 +        // Damping is a restoring force that opposes the current velocity. +        // F = -kv +        const F32 force_damping = -behavior_damping * mVelocity_local; +                 +        // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) +        // F = .5kv^2 +        const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + +        const F32 force_net = (force_accel +  +                               force_gravity + +                               force_spring +  +                               force_damping +  +                               force_drag); + +        // +        // End total force +        //////////////////////////////////////////////////////////////////////////////// + +         +        //////////////////////////////////////////////////////////////////////////////// +        // Calculate new params +        // + +        // Calculate the new acceleration based on the net force. +        // a = F/m +        const F32 acceleration_new_local = force_net / behavior_mass; +        static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. +        F32 velocity_new_local = mVelocity_local + acceleration_new_local; +        velocity_new_local = llclamp(velocity_new_local,  +                                     -max_acceleration, max_acceleration); +         +        // Temporary debugging setting to cause all avatars to move, for profiling purposes. +        if (physics_test) +        { +                velocity_new_local = sin(time*4.0); +        } +        // Calculate the new parameters, or remain unchanged if max speed is 0. +        F32 position_new_local = position_current_local + velocity_new_local*time_delta; +        if (behavior_maxeffect == 0) +            position_new_local = position_user_local; + +        // Zero out the velocity if the param is being pushed beyond its limits. +        if ((position_new_local < 0 && velocity_new_local < 0) ||  +            (position_new_local > 1 && velocity_new_local > 0)) +        { +                velocity_new_local = 0; +        } +	 +	// Check for NaN values.  A NaN value is detected if the variables doesn't equal itself.   +	// If NaN, then reset everything. +	if ((mPosition_local != mPosition_local) || +	    (mVelocity_local != mVelocity_local) || +	    (position_new_local != position_new_local)) +	{ +		position_new_local = 0; +		position_current_local = 0; +		position_user_local = 0; +		mVelocity_local = 0; +		mVelocityJoint_local = 0; +		mAccelerationJoint_local = 0; +		mPosition_local = 0; +		mPosition_world = LLVector3(0,0,0); +	} + +        const F32 position_new_local_clamped = llclamp(position_new_local, +						       0.0f, +						       1.0f); + +        LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver); +        llassert_always(driver_param); +        if (driver_param) +        { +                // If this is one of our "hidden" driver params, then make sure it's +                // the default value. +                if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && +                    (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) +                { +                        mCharacter->setVisualParamWeight(driver_param, +                                                         0, +                                                         FALSE); +                } +                for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); +                     iter != driver_param->mDriven.end(); +                     ++iter) +                { +                        LLDrivenEntry &entry = (*iter); +                        LLViewerVisualParam *driven_param = entry.mParam; +                        setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); +                } +        } +         +        // +        // End calculate new params +        //////////////////////////////////////////////////////////////////////////////// + +        //////////////////////////////////////////////////////////////////////////////// +        // Conditionally update the visual params +        // +         +        // Updating the visual params (i.e. what the user sees) is fairly expensive. +        // So only update if the params have changed enough, and also take into account +        // the graphics LOD settings. +         +        BOOL update_visuals = FALSE; + +        // For non-self, if the avatar is small enough visually, then don't update. +        const F32 area_for_max_settings = 0.0; +        const F32 area_for_min_settings = 1400.0; +        const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); +        const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); +         +        const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL); +        if ((pixel_area > area_for_this_setting) || is_self) +        { +                const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); +                const F32 min_delta = (1.01f-lod_factor)*0.4f; +                if (llabs(position_diff_local) > min_delta) +                { +                        update_visuals = TRUE; +                        mPositionLastUpdate_local = position_new_local; +                } +        } + +        // +        // End update visual params +        //////////////////////////////////////////////////////////////////////////////// + +        mVelocityJoint_local = velocity_joint_local; + +        mVelocity_local = velocity_new_local; +        mAccelerationJoint_local = acceleration_joint_local; +        mPosition_local = position_new_local; + +        mPosition_world = joint->getWorldPosition(); +        mLastTime = time; + +        /* +          // Write out debugging info into a spreadsheet. +          if (mFileWrite != NULL && is_self) +          { +          fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", +          position_new_local, +          velocity_new_local, +          acceleration_new_local, + +          time_delta, + +          mPosition_world[0], +          mPosition_world[1], +          mPosition_world[2], + +          force_net, +          force_spring, +          force_accel, +          force_damping, +          force_drag, + +          spring_length, +          velocity_joint_local, +          acceleration_joint_local +          ); +          } +        */ + +        return update_visuals; +} + +// Range of new_value_local is assumed to be [0 , 1] normalized. +void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, +                                    F32 new_value_normalized, +				    F32 behavior_maxeffect) +{ +        const F32 value_min_local = param->getMinWeight(); +        const F32 value_max_local = param->getMaxWeight(); +        const F32 min_val = 0.5f-behavior_maxeffect/2.0; +        const F32 max_val = 0.5f+behavior_maxeffect/2.0; + +	// Scale from [0,1] to [min_val,max_val] +	const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; +	 +	// Scale from [0,1] to [value_min_local,value_max_local] +        const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; + +        mCharacter->setVisualParamWeight(param, +                                         new_value_local, +                                         FALSE); +} diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h index 0c0087d269..b246fa99bb 100644 --- a/indra/newview/llphysicsmotion.h +++ b/indra/newview/llphysicsmotion.h @@ -1,124 +1,118 @@ -/** 
 - * @file llphysicsmotion.h
 - * @brief Implementation of LLPhysicsMotion class.
 - *
 - * $LicenseInfo:firstyear=2001&license=viewergpl$
 - * 
 - * Copyright (c) 2001-2009, Linden Research, Inc.
 - * 
 - * Second Life Viewer Source Code
 - * The source code in this file ("Source Code") is provided by Linden Lab
 - * to you under the terms of the GNU General Public License, version 2.0
 - * ("GPL"), unless you have obtained a separate licensing agreement
 - * ("Other License"), formally executed by you and Linden Lab.  Terms of
 - * the GPL can be found in doc/GPL-license.txt in this distribution, or
 - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 - * 
 - * There are special exceptions to the terms and conditions of the GPL as
 - * it is applied to this Source Code. View the full text of the exception
 - * in the file doc/FLOSS-exception.txt in this software distribution, or
 - * online at
 - * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 - * 
 - * By copying, modifying or distributing this software, you acknowledge
 - * that you have read and understood your obligations described above,
 - * and agree to abide by those obligations.
 - * 
 - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 - * COMPLETENESS OR PERFORMANCE.
 - * $/LicenseInfo$
 - */
 -
 -#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H
 -#define LL_LLPHYSICSMOTIONCONTROLLER_H
 -
 -//-----------------------------------------------------------------------------
 -// Header files
 -//-----------------------------------------------------------------------------
 -#include "llmotion.h"
 -#include "llframetimer.h"
 -
 -#define PHYSICS_MOTION_FADEIN_TIME 1.0f
 -#define PHYSICS_MOTION_FADEOUT_TIME 1.0f
 -
 -class LLPhysicsMotion;
 -
 -//-----------------------------------------------------------------------------
 -// class LLPhysicsMotion
 -//-----------------------------------------------------------------------------
 -class LLPhysicsMotionController :
 -	public LLMotion
 -{
 -public:
 -	// Constructor
 -	LLPhysicsMotionController(const LLUUID &id);
 -
 -	// Destructor
 -	virtual ~LLPhysicsMotionController();
 -
 -public:
 -	//-------------------------------------------------------------------------
 -	// functions to support MotionController and MotionRegistry
 -	//-------------------------------------------------------------------------
 -
 -	// static constructor
 -	// all subclasses must implement such a function and register it
 -	static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); }
 -
 -public:
 -	//-------------------------------------------------------------------------
 -	// animation callbacks to be implemented by subclasses
 -	//-------------------------------------------------------------------------
 -
 -	// motions must specify whether or not they loop
 -	virtual BOOL getLoop() { return TRUE; }
 -
 -	// motions must report their total duration
 -	virtual F32 getDuration() { return 0.0; }
 -
 -	// motions must report their "ease in" duration
 -	virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; }
 -
 -	// motions must report their "ease out" duration.
 -	virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; }
 -
 -	// called to determine when a motion should be activated/deactivated based on avatar pixel coverage
 -	virtual F32 getMinPixelArea();
 -
 -	// motions must report their priority
 -	virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
 -
 -	virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
 -
 -	// run-time (post constructor) initialization,
 -	// called after parameters have been set
 -	// must return true to indicate success and be available for activation
 -	virtual LLMotionInitStatus onInitialize(LLCharacter *character);
 -
 -	// called when a motion is activated
 -	// must return TRUE to indicate success, or else
 -	// it will be deactivated
 -	virtual BOOL onActivate();
 -
 -	// called per time step
 -	// must return TRUE while it is active, and
 -	// must return FALSE when the motion is completed.
 -	virtual BOOL onUpdate(F32 time, U8* joint_mask);
 -
 -	// called when a motion is deactivated
 -	virtual void onDeactivate();
 -
 -	LLCharacter* getCharacter() { return mCharacter; }
 -
 -protected:
 -	void addMotion(LLPhysicsMotion *motion);
 -private:
 -	LLCharacter*		mCharacter;
 -
 -	typedef std::vector<LLPhysicsMotion *> motion_vec_t;
 -	motion_vec_t mMotions;
 -};
 -
 -#endif // LL_LLPHYSICSMOTION_H
 -
 +/**  + * @file llphysicsmotion.h + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H +#define LL_LLPHYSICSMOTIONCONTROLLER_H + +//----------------------------------------------------------------------------- +// Header files +//----------------------------------------------------------------------------- +#include "llmotion.h" +#include "llframetimer.h" + +#define PHYSICS_MOTION_FADEIN_TIME 1.0f +#define PHYSICS_MOTION_FADEOUT_TIME 1.0f + +class LLPhysicsMotion; + +//----------------------------------------------------------------------------- +// class LLPhysicsMotion +//----------------------------------------------------------------------------- +class LLPhysicsMotionController : +	public LLMotion +{ +public: +	// Constructor +	LLPhysicsMotionController(const LLUUID &id); + +	// Destructor +	virtual ~LLPhysicsMotionController(); + +public: +	//------------------------------------------------------------------------- +	// functions to support MotionController and MotionRegistry +	//------------------------------------------------------------------------- + +	// static constructor +	// all subclasses must implement such a function and register it +	static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } + +public: +	//------------------------------------------------------------------------- +	// animation callbacks to be implemented by subclasses +	//------------------------------------------------------------------------- + +	// motions must specify whether or not they loop +	virtual BOOL getLoop() { return TRUE; } + +	// motions must report their total duration +	virtual F32 getDuration() { return 0.0; } + +	// motions must report their "ease in" duration +	virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; } + +	// motions must report their "ease out" duration. +	virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; } + +	// called to determine when a motion should be activated/deactivated based on avatar pixel coverage +	virtual F32 getMinPixelArea(); + +	// motions must report their priority +	virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } + +	virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } + +	// run-time (post constructor) initialization, +	// called after parameters have been set +	// must return true to indicate success and be available for activation +	virtual LLMotionInitStatus onInitialize(LLCharacter *character); + +	// called when a motion is activated +	// must return TRUE to indicate success, or else +	// it will be deactivated +	virtual BOOL onActivate(); + +	// called per time step +	// must return TRUE while it is active, and +	// must return FALSE when the motion is completed. +	virtual BOOL onUpdate(F32 time, U8* joint_mask); + +	// called when a motion is deactivated +	virtual void onDeactivate(); + +	LLCharacter* getCharacter() { return mCharacter; } + +protected: +	void addMotion(LLPhysicsMotion *motion); +private: +	LLCharacter*		mCharacter; + +	typedef std::vector<LLPhysicsMotion *> motion_vec_t; +	motion_vec_t mMotions; +}; + +#endif // LL_LLPHYSICSMOTION_H + diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 50bc0b4a98..87a2008e2b 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -517,17 +517,15 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)  {  	BOOL object_found = FALSE;  	LLTool *tool = NULL; -	if (!gNoRender) -	{ -		tool = LLToolMgr::getInstance()->getCurrentTool(); -		// It's possible that the tool is editing an object that is not selected -		LLViewerObject* tool_editing_object = tool->getEditingObject(); -		if( tool_editing_object && tool_editing_object->mID == id) -		{ -			tool->stopEditing(); -			object_found = TRUE; -		} +	tool = LLToolMgr::getInstance()->getCurrentTool(); + +	// It's possible that the tool is editing an object that is not selected +	LLViewerObject* tool_editing_object = tool->getEditingObject(); +	if( tool_editing_object && tool_editing_object->mID == id) +	{ +		tool->stopEditing(); +		object_found = TRUE;  	}  	// Iterate through selected objects list and kill the object diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index fcd200d24a..4f18ee1da2 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -53,6 +53,8 @@  #include "llsidepanelappearance.h" +#include "llsidetraylistener.h" +  //#include "llscrollcontainer.h"  using namespace std; @@ -71,6 +73,8 @@ static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title";  LLSideTray* LLSideTray::sInstance = 0; +static LLSideTrayListener sSideTrayListener(LLSideTray::getInstance); +  // static  LLSideTray* LLSideTray::getInstance()  { @@ -454,6 +458,11 @@ LLSideTrayTab*  LLSideTrayTab::createInstance	()  	return tab;  } +// Now that we know the definition of LLSideTrayTab, we can implement +// tab_cast. +template <> +LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab) { return tab; } +  //////////////////////////////////////////////////////////////////////////////  // LLSideTrayButton  // Side Tray tab button with "tear off" handling. @@ -567,6 +576,8 @@ LLSideTray::LLSideTray(const Params& params)  	// register handler function to process data from the xml.   	// panel_name should be specified via "parameter" attribute.  	commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null)); +	commit.add("SideTray.Toggle", boost::bind(&LLSideTray::onToggleCollapse, this)); +	commit.add("SideTray.Collapse", boost::bind(&LLSideTray::collapseSideBar, this));  	LLTransientFloaterMgr::getInstance()->addControlView(this);  	LLView* side_bar_tabs  = gViewerWindow->getRootView()->getChildView("side_bar_tabs");  	if (side_bar_tabs != NULL) diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 2516b5689f..1dddd9e9bc 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -33,6 +33,13 @@  class LLAccordionCtrl;  class LLSideTrayTab; +// Deal with LLSideTrayTab being opaque. Generic do-nothing cast... +template <class T> +T tab_cast(LLSideTrayTab* tab) { return tab; } +// specialized for implementation in presence of LLSideTrayTab definition +template <> +LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab); +  // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions   // while disconnecting viewer in LLAppViewer::disconnectViewer().  // LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245. @@ -221,6 +228,9 @@ private:  	}  private: +	// Since we provide no public way to query mTabs and mDetachedTabs, give +	// LLSideTrayListener friend access. +	friend class LLSideTrayListener;  	LLPanel*						mButtonsPanel;  	typedef std::map<std::string,LLButton*> button_map_t;  	button_map_t					mTabButtons; diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp new file mode 100644 index 0000000000..6db13e517d --- /dev/null +++ b/indra/newview/llsidetraylistener.cpp @@ -0,0 +1,162 @@ +/** + * @file   llsidetraylistener.cpp + * @author Nat Goodspeed + * @date   2011-02-15 + * @brief  Implementation for llsidetraylistener. + *  + * $LicenseInfo:firstyear=2011&license=lgpl$ + * Copyright (c) 2011, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llsidetraylistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llsidetray.h" +#include "llsdutil.h" + +LLSideTrayListener::LLSideTrayListener(const Getter& getter): +    LLEventAPI("LLSideTray", +               "Operations on side tray (e.g. query state, query tabs)"), +    mGetter(getter) +{ +    add("getCollapsed", "Send on [\"reply\"] an [\"open\"] Boolean", +        &LLSideTrayListener::getCollapsed, LLSDMap("reply", LLSD())); +    add("getTabs", +        "Send on [\"reply\"] a map of tab names and info about them", +        &LLSideTrayListener::getTabs, LLSDMap("reply", LLSD())); +    add("getPanels", +        "Send on [\"reply\"] data about panels available with SideTray.ShowPanel", +        &LLSideTrayListener::getPanels, LLSDMap("reply", LLSD())); +} + +void LLSideTrayListener::getCollapsed(const LLSD& event) const +{ +    sendReply(LLSDMap("open", ! mGetter()->getCollapsed()), event); +} + +void LLSideTrayListener::getTabs(const LLSD& event) const +{ +    LLSD reply; + +    LLSideTray* tray = mGetter(); +    LLSD::Integer ord(0); +    for (LLSideTray::child_list_const_iter_t chi(tray->beginChild()), chend(tray->endChild()); +         chi != chend; ++chi, ++ord) +    { +        LLView* child = *chi; +        // How much info is important? Toss in as much as seems reasonable for +        // each tab. But to me, at least for the moment, the most important +        // item is the tab name. +        LLSD info; +        // I like the idea of returning a map keyed by tab name. But as +        // compared to an array of maps, that loses sequence information. +        // Address that by indicating the original order in each map entry. +        info["ord"] = ord; +        info["visible"] = bool(child->getVisible()); +        info["enabled"] = bool(child->getEnabled()); +        info["available"] = child->isAvailable(); +        reply[child->getName()] = info; +    } + +    sendReply(reply, event); +} + +static LLSD getTabInfo(LLPanel* tab) +{ +    LLSD panels; +    for (LLPanel::tree_iterator_t ti(tab->beginTreeDFS()), tend(tab->endTreeDFS()); +         ti != tend; ++ti) +    { +        // *ti is actually an LLView*, which had better not be NULL +        LLView* view(*ti); +        if (! view) +        { +            LL_ERRS("LLSideTrayListener") << "LLSideTrayTab '" << tab->getName() +                                          << "' has a NULL child LLView*" << LL_ENDL; +        } + +        // The logic we use to decide what "panel" names to return is heavily +        // based on LLSideTray::showPanel(): the function that actually +        // implements the "SideTray.ShowPanel" operation. showPanel(), in +        // turn, depends on LLSideTray::openChildPanel(): when +        // openChildPanel() returns non-NULL, showPanel() stops searching +        // attached and detached LLSideTrayTab tabs. + +        // For each LLSideTrayTab, openChildPanel() first calls +        // findChildView(panel_name, true). In other words, panel_name need +        // not be a direct LLSideTrayTab child, it's sought recursively. +        // That's why we use (begin|end)TreeDFS() in this loop. + +        // But this tree_iterator_t loop will actually traverse every widget +        // in every panel. Returning all those names will not help our caller: +        // passing most such names to openChildPanel() would not do what we +        // want. Even though the code suggests that passing ANY valid +        // side-panel widget name to openChildPanel() will open the tab +        // containing that widget, results could get confusing since followup +        // (onOpen()) logic wouldn't be invoked, and showPanel() wouldn't stop +        // searching because openChildPanel() would return NULL. + +        // We must filter these LLView items, using logic that (sigh!) mirrors +        // openChildPanel()'s own. + +        // openChildPanel() returns a non-NULL LLPanel* when either: +        // - the LLView is a direct child of an LLSideTrayPanelContainer +        // - the LLView is itself an LLPanel. +        // But as LLSideTrayPanelContainer can directly contain LLView items +        // that are NOT themselves LLPanels (e.g. "sidebar_me" contains an +        // LLButton called "Jump Right Arrow"), we'd better focus only on +        // LLSideTrayPanelContainer children that are themselves LLPanel +        // items. Which means that the second test completely subsumes the +        // first. +        LLPanel* panel(dynamic_cast<LLPanel*>(view)); +        if (panel) +        { +            // Maybe it's overkill to construct an LLSD::Map for each panel, but +            // the possibility remains that we might want to deliver more info +            // about each panel than just its name. +            panels.append(LLSDMap("name", panel->getName())); +        } +    } + +    return LLSDMap("panels", panels); +} + +void LLSideTrayListener::getPanels(const LLSD& event) const +{ +    LLSD reply; + +    LLSideTray* tray = mGetter(); +    // Iterate through the attached tabs. +    LLSD::Integer ord(0); +    for (LLSideTray::child_vector_t::const_iterator +             ati(tray->mTabs.begin()), atend(tray->mTabs.end()); +         ati != atend; ++ati) +    { +        // We don't have access to LLSideTrayTab: the class definition is +        // hidden in llsidetray.cpp. But as LLSideTrayTab isa LLPanel, use the +        // LLPanel API. Unfortunately, without the LLSideTrayTab definition, +        // the compiler doesn't even know this LLSideTrayTab* is an LLPanel*. +        // Persuade it. +        LLPanel* tab(tab_cast<LLPanel*>(*ati)); +        reply[tab->getName()] = getTabInfo(tab).with("attached", true).with("ord", ord); +    } + +    // Now iterate over the detached tabs. These can also be opened via +    // SideTray.ShowPanel. +    ord = 0; +    for (LLSideTray::child_vector_t::const_iterator +             dti(tray->mDetachedTabs.begin()), dtend(tray->mDetachedTabs.end()); +         dti != dtend; ++dti) +    { +        LLPanel* tab(tab_cast<LLPanel*>(*dti)); +        reply[tab->getName()] = getTabInfo(tab).with("attached", false).with("ord", ord); +    } + +    sendReply(reply, event); +} diff --git a/indra/newview/llsidetraylistener.h b/indra/newview/llsidetraylistener.h new file mode 100644 index 0000000000..0dd2067433 --- /dev/null +++ b/indra/newview/llsidetraylistener.h @@ -0,0 +1,36 @@ +/** + * @file   llsidetraylistener.h + * @author Nat Goodspeed + * @date   2011-02-15 + * @brief   + *  + * $LicenseInfo:firstyear=2011&license=lgpl$ + * Copyright (c) 2011, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLSIDETRAYLISTENER_H) +#define LL_LLSIDETRAYLISTENER_H + +#include "lleventapi.h" +#include <boost/function.hpp> + +class LLSideTray; +class LLSD; + +class LLSideTrayListener: public LLEventAPI +{ +    typedef boost::function<LLSideTray*()> Getter; + +public: +    LLSideTrayListener(const Getter& getter); + +private: +    void getCollapsed(const LLSD& event) const; +    void getTabs(const LLSD& event) const; +    void getPanels(const LLSD& event) const; + +    Getter mGetter; +}; + +#endif /* ! defined(LL_LLSIDETRAYLISTENER_H) */ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8fccb35886..ca908ef822 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -354,11 +354,8 @@ bool idle_startup()  	LLStringUtil::setLocale (LLTrans::getString(system)); -	if (!gNoRender) -	{ -		//note: Removing this line will cause incorrect button size in the login screen. -- bao. -		gTextureList.updateImages(0.01f) ; -	} +	//note: Removing this line will cause incorrect button size in the login screen. -- bao. +	gTextureList.updateImages(0.01f) ;  	if ( STATE_FIRST == LLStartUp::getStartupState() )  	{ @@ -673,6 +670,7 @@ bool idle_startup()  		{  			gUserCredential = gLoginHandler.initializeLoginInfo();  		} +		// Previous initializeLoginInfo may have generated user credentials.  Re-check them.  		if (gUserCredential.isNull())  		{  			show_connect_box = TRUE; @@ -722,6 +720,8 @@ bool idle_startup()  		timeout_count = 0; +		initialize_edit_menu(); +  		if (show_connect_box)  		{  			// Load all the name information out of the login view @@ -731,15 +731,13 @@ bool idle_startup()  			{                                                                                                        				gUserCredential = gLoginHandler.initializeLoginInfo();                   			}      -			if (gNoRender) +			if (gHeadlessClient)  			{ -				LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL; +				LL_WARNS("AppInit") << "Waiting at connection box in headless client.  Did you mean to add autologin params?" << LL_ENDL;  			}  			// Make sure the process dialog doesn't hide things  			gViewerWindow->setShowProgress(FALSE); -			initialize_edit_menu(); -  			// Show the login dialog  			login_show();  			// connect dialog is already shown, so fill in the names @@ -940,10 +938,7 @@ bool idle_startup()  		gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT); -		if (!gNoRender) -		{ -			init_start_screen(agent_location_id); -		} +		init_start_screen(agent_location_id);  		// Display the startup progress bar.  		gViewerWindow->setShowProgress(TRUE); @@ -974,11 +969,6 @@ bool idle_startup()  		// Setting initial values...  		LLLoginInstance* login = LLLoginInstance::getInstance();  		login->setNotificationsInterface(LLNotifications::getInstance()); -		if(gNoRender) -		{ -			// HACK, skip optional updates if you're running drones -			login->setSkipOptionalUpdate(true); -		}  		login->setSerialNumber(LLAppViewer::instance()->getSerialNumber());  		login->setLastExecEvent(gLastExecEvent); @@ -1264,14 +1254,11 @@ bool idle_startup()  		gLoginMenuBarView->setVisible( FALSE );  		gLoginMenuBarView->setEnabled( FALSE ); -		if (!gNoRender) -		{ -			// direct logging to the debug console's line buffer -			LLError::logToFixedBuffer(gDebugView->mDebugConsolep); -			 -			// set initial visibility of debug console -			gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); -		} +		// direct logging to the debug console's line buffer +		LLError::logToFixedBuffer(gDebugView->mDebugConsolep); +		 +		// set initial visibility of debug console +		gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));  		//  		// Set message handlers @@ -1299,7 +1286,7 @@ bool idle_startup()  		//gCacheName is required for nearby chat history loading  		//so I just moved nearby history loading a few states further -		if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) +		if (gSavedPerAccountSettings.getBOOL("LogShowHistory"))  		{  			LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();  			if (nearby_chat) nearby_chat->loadHistory(); @@ -1351,18 +1338,15 @@ bool idle_startup()  		gAgentCamera.resetCamera();  		// Initialize global class data needed for surfaces (i.e. textures) -		if (!gNoRender) -		{ -			LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; -			// Initialize all of the viewer object classes for the first time (doing things like texture fetches. -			LLGLState::checkStates(); -			LLGLState::checkTextureChannels(); +		LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; +		// Initialize all of the viewer object classes for the first time (doing things like texture fetches. +		LLGLState::checkStates(); +		LLGLState::checkTextureChannels(); -			gSky.init(initial_sun_direction); +		gSky.init(initial_sun_direction); -			LLGLState::checkStates(); -			LLGLState::checkTextureChannels(); -		} +		LLGLState::checkStates(); +		LLGLState::checkTextureChannels();  		LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL;  		// For all images pre-loaded into viewer cache, decode them. @@ -1722,46 +1706,43 @@ bool idle_startup()  			LLUIColorTable::instance().saveUserSettings();  		}; -		if (!gNoRender) -		{ -			// JC: Initializing audio requests many sounds for download. -			init_audio(); - -			// JC: Initialize "active" gestures.  This may also trigger -			// many gesture downloads, if this is the user's first -			// time on this machine or -purge has been run. -			LLSD gesture_options  -				= LLLoginInstance::getInstance()->getResponse("gestures"); -			if (gesture_options.isDefined()) +		// JC: Initializing audio requests many sounds for download. +		init_audio(); + +		// JC: Initialize "active" gestures.  This may also trigger +		// many gesture downloads, if this is the user's first +		// time on this machine or -purge has been run. +		LLSD gesture_options  +			= LLLoginInstance::getInstance()->getResponse("gestures"); +		if (gesture_options.isDefined()) +		{ +			LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() +				<< LL_ENDL; +			uuid_vec_t item_ids; +			for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), +				end = gesture_options.endArray(); resp_it != end; ++resp_it)  			{ -				LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() -					<< LL_ENDL; -				uuid_vec_t item_ids; -				for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), -					end = gesture_options.endArray(); resp_it != end; ++resp_it) -				{ -					// If the id is not specifed in the LLSD, -					// the LLSD operator[]() will return a null LLUUID.  -					LLUUID item_id = (*resp_it)["item_id"]; -					LLUUID asset_id = (*resp_it)["asset_id"]; +				// If the id is not specifed in the LLSD, +				// the LLSD operator[]() will return a null LLUUID.  +				LLUUID item_id = (*resp_it)["item_id"]; +				LLUUID asset_id = (*resp_it)["asset_id"]; -					if (item_id.notNull() && asset_id.notNull()) -					{ -						// Could schedule and delay these for later. -						const BOOL no_inform_server = FALSE; -						const BOOL no_deactivate_similar = FALSE; -						LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, -											 no_inform_server, -											 no_deactivate_similar); -						// We need to fetch the inventory items for these gestures -						// so we have the names to populate the UI. -						item_ids.push_back(item_id); -					} +				if (item_id.notNull() && asset_id.notNull()) +				{ +					// Could schedule and delay these for later. +					const BOOL no_inform_server = FALSE; +					const BOOL no_deactivate_similar = FALSE; +					LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, +										 no_inform_server, +										 no_deactivate_similar); +					// We need to fetch the inventory items for these gestures +					// so we have the names to populate the UI. +					item_ids.push_back(item_id);  				} -				// no need to add gesture to inventory observer, it's already made in constructor  -				LLGestureMgr::instance().setFetchIDs(item_ids); -				LLGestureMgr::instance().startFetch();  			} +			// no need to add gesture to inventory observer, it's already made in constructor  +			LLGestureMgr::instance().setFetchIDs(item_ids); +			LLGestureMgr::instance().startFetch();  		}  		gDisplaySwapBuffers = TRUE; @@ -1782,13 +1763,6 @@ bool idle_startup()  		// JC - 7/20/2002  		gViewerWindow->sendShapeToSim(); -		 -		// Ignore stipend information for now.  Money history is on the web site. -		// if needed, show the L$ history window -		//if (stipend_since_login && !gNoRender) -		//{ -		//} -  		// The reason we show the alert is because we want to  		// reduce confusion for when you log in and your provided  		// location is not your expected location. So, if this is @@ -2717,7 +2691,7 @@ bool LLStartUp::dispatchURL()  			|| (dx*dx > SLOP*SLOP)  			|| (dy*dy > SLOP*SLOP) )  		{ -			LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(),  +			LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), "clicked",  						  NULL, false);  		}  		return true; @@ -3214,7 +3188,7 @@ bool process_login_success_response()  void transition_back_to_login_panel(const std::string& emsg)  { -	if (gNoRender) +	if (gHeadlessClient && gSavedSettings.getBOOL("AutoLogin"))  	{  		LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL;  		LL_WARNS("AppInit") << emsg << LL_ENDL; diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 6fc8153b77..bccabe21a8 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -340,11 +340,6 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)  	S32 i;  	LLSurfacePatch *patchp, *neighbor_patchp; -	if (gNoRender) -	{ -		return; -	} -  	mNeighbors[direction] = neighborp;  	neighborp->mNeighbors[gDirOpposite[direction]] = this; diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp index dd35d5cf83..f820ae65df 100644 --- a/indra/newview/lltexturestats.cpp +++ b/indra/newview/lltexturestats.cpp @@ -37,7 +37,7 @@ void send_texture_stats_to_sim(const LLSD &texture_stats)  {  	LLSD texture_stats_report;  	// Only send stats if the agent is connected to a region. -	if (!gAgent.getRegion() || gNoRender) +	if (!gAgent.getRegion())  	{  		return;  	} diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 8b2f066d41..0f337825e9 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -220,7 +220,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  	}  	static LLUIColor alert_caution_text_color = LLUIColorTable::instance().getColor("AlertCautionTextColor"); -	static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor");  	if (mCaution)  	{  		LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance()); @@ -233,10 +232,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  		msg_x += 32 + HPAD;  		msg_box->setColor( alert_caution_text_color );  	} -	else -	{ -		msg_box->setColor( alert_text_color ); -	}  	LLRect rect;  	rect.setLeftTopAndSize( msg_x, msg_y, text_rect.getWidth(), text_rect.getHeight() ); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 1c745906aa..ba243f258a 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1386,6 +1386,10 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL  			worn = TRUE;  		}  		break; +	case LLAssetType::AT_CALLINGCARD: +		// Calling Cards in object are disabled for now +		// because of incomplete LSL support. See STORM-1117. +		return ACCEPT_NO;  	default:  			break;  	} diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9549f180df..95bd210ae3 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -37,7 +37,7 @@  #include "llavatarnamecache.h"  #include "llviewercontrol.h"  #include "llfocusmgr.h" -//#include "llfirstuse.h" +#include "llfirstuse.h"  #include "llfloaterland.h"  #include "llfloaterreg.h"  #include "llfloaterscriptdebug.h" @@ -528,42 +528,17 @@ void LLToolPie::selectionPropertiesReceived()  BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)  { -	if (!mMouseOutsideSlop  -		&& mMouseButtonDown  -		&& gSavedSettings.getBOOL("ClickToWalk")) -	{ -		S32 delta_x = x - mMouseDownX; -		S32 delta_y = y - mMouseDownY; -		S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold"); -		if (delta_x * delta_x + delta_y * delta_y > threshold * threshold) -		{ -			startCameraSteering(); -		} -	} -  	mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE); - -	if (inCameraSteerMode()) -	{ -		steerCameraWithMouse(x, y); -		gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); -		return TRUE; -	} - -	// perform a separate pick that detects transparent objects since they respond to 1-click actions -	LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); - -	// Show screen-space highlight glow effect -	bool show_highlight = false;  	LLViewerObject *parent = NULL;  	LLViewerObject *object = mHoverPick.getObject(); -  	if (object)  	{  		parent = object->getRootEdit();  	} -	LLViewerObject* click_action_object = click_action_pick.getObject(); +	// Show screen-space highlight glow effect +	bool show_highlight = false; +  	if (handleMediaHover(mHoverPick))  	{  		// *NOTE: If you think the hover glow conflicts with the media outline, you @@ -572,39 +547,70 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)  		// cursor set by media object  		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;  	} -	else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) +	else if (!mMouseOutsideSlop  +		&& mMouseButtonDown  +		&& gSavedSettings.getBOOL("ClickToWalk"))  	{ -		show_highlight = true; -		ECursorType cursor = cursorFromObject(click_action_object); -		gViewerWindow->setCursor(cursor); -		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; +		S32 delta_x = x - mMouseDownX; +		S32 delta_y = y - mMouseDownY; +		S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold"); +		if (delta_x * delta_x + delta_y * delta_y > threshold * threshold) +		{ +			startCameraSteering(); +			steerCameraWithMouse(x, y); +			gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); +		} +		else +		{ +			gViewerWindow->setCursor(UI_CURSOR_ARROW); +		}  	} -	 -	else if ((object && !object->isAvatar() && object->usePhysics())  -			 || (parent && !parent->isAvatar() && parent->usePhysics())) +	else if (inCameraSteerMode())  	{ -		show_highlight = true; +		steerCameraWithMouse(x, y);  		gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); -		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; -	} -	else if ( (object && object->flagHandleTouch())  -			  || (parent && parent->flagHandleTouch())) -	{ -		show_highlight = true; -		gViewerWindow->setCursor(UI_CURSOR_HAND); -		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;  	}  	else  	{ -		gViewerWindow->setCursor(UI_CURSOR_ARROW); -		lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; +		// perform a separate pick that detects transparent objects since they respond to 1-click actions +		LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); + +		LLViewerObject* click_action_object = click_action_pick.getObject(); -		if(!object) +		if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) +		{ +			show_highlight = true; +			ECursorType cursor = cursorFromObject(click_action_object); +			gViewerWindow->setCursor(cursor); +			lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; +		} +		 +		else if ((object && !object->isAvatar() && object->usePhysics())  +				 || (parent && !parent->isAvatar() && parent->usePhysics())) +		{ +			show_highlight = true; +			gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); +			lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; +		} +		else if ( (object && object->flagHandleTouch())  +				  || (parent && parent->flagHandleTouch())) +		{ +			show_highlight = true; +			gViewerWindow->setCursor(UI_CURSOR_HAND); +			lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; +		} +		else  		{ -			LLViewerMediaFocus::getInstance()->clearHover(); +			gViewerWindow->setCursor(UI_CURSOR_ARROW); +			lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;  		}  	} +	if(!object) +	{ +		LLViewerMediaFocus::getInstance()->clearHover(); +	} +  	static LLCachedControl<bool> enable_highlight(  		gSavedSettings, "RenderHoverGlowEnable", false);  	LLDrawable* drawable = NULL; @@ -662,6 +668,8 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)  		mAutoPilotDestination->setDuration(3.f);  		handle_go_to(); +		LLFirstUse::notMoving(false); +  		mBlockClickToWalk = false;  		return TRUE; @@ -1430,6 +1438,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)  		{  			// Make sure keyboard focus is set to the media focus object.  			gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); +			LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl();  			media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE));  			mMediaMouseCaptureID = mep->getMediaID(); @@ -1709,8 +1718,13 @@ void LLToolPie::showVisualContextMenuEffect()  	effectp->setDuration(0.25f);  } +typedef enum e_near_far +{ +	NEAR_INTERSECTION, +	FAR_INTERSECTION +} ENearFar; -bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, LLVector3& intersection_pt) +bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, e_near_far near_far, LLVector3& intersection_pt)  {  	// do ray/sphere intersection by solving quadratic equation  	LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center; @@ -1718,10 +1732,11 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di  	F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius);  	F32 discriminant = B*B - 4.f*C; -	if (discriminant > 0.f) +	if (discriminant >= 0.f)  	{	// intersection detected, now find closest one  		F32 t0 = (-B - sqrtf(discriminant)) / 2.f; -		if (t0 > 0.f) + +		if (t0 > 0.f && near_far == NEAR_INTERSECTION)  		{  			intersection_pt = ray_pt + ray_dir * t0;  		} @@ -1732,12 +1747,15 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di  		}  		return true;  	} - -	return false; +	else +	{	// no intersection +		return false; +	}  }  void LLToolPie::startCameraSteering()  { +	LLFirstUse::notMoving(false);  	mMouseOutsideSlop = true;  	mBlockClickToWalk = true; @@ -1786,64 +1804,80 @@ void LLToolPie::startCameraSteering()  void LLToolPie::steerCameraWithMouse(S32 x, S32 y)  { -	const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f; - +	const LLViewerCamera& camera = LLViewerCamera::instance(); +	const LLCoordFrame& rotation_frame = gAgent.getFrameAgent();  	const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal); -	const LLVector3 rotation_center = gAgent.getFrameAgent().getOrigin(); -	// FIXME: get this to work with camera tilt (i.e. sitting on a rotating object) -	const LLVector3 rotation_up_axis(LLVector3::z_axis); - -	LLVector3 object_rotation_center = rotation_center + parallel_component(pick_pos - rotation_center, rotation_up_axis); -	F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(rotation_center, LLViewerCamera::instance().getOrigin());; -	F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, object_rotation_center), min_rotation_radius, F32_MAX); +	const LLVector3 pick_rotation_center = rotation_frame.getOrigin() + parallel_component(pick_pos - rotation_frame.getOrigin(), rotation_frame.getUpAxis()); +	const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f; +	const F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(pick_rotation_center, camera.getOrigin());; +	const F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, pick_rotation_center), min_rotation_radius, F32_MAX); +	const LLVector3 camera_to_rotation_center = pick_rotation_center - camera.getOrigin(); +	const LLVector3 adjusted_camera_pos = LLViewerCamera::instance().getOrigin() + projected_vec(camera_to_rotation_center, rotation_frame.getUpAxis()); +	const F32 camera_distance_from_rotation_center = dist_vec(adjusted_camera_pos, pick_rotation_center); -	LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_up_axis); +	LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_frame.getUpAxis());  	mouse_ray.normalize(); -	LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_up_axis); +	LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_frame.getUpAxis());  	old_mouse_ray.normalize(); -	LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent(); -	LLVector3 camera_to_rotation_center = object_rotation_center - camera_pos; -	LLVector3 adjusted_camera_pos = camera_pos + projected_vec(camera_to_rotation_center, rotation_up_axis); -	LLVector3 rotation_fwd_axis = LLViewerCamera::instance().getAtAxis() - projected_vec(LLViewerCamera::instance().getAtAxis(), rotation_up_axis); -	rotation_fwd_axis.normalize(); -	F32 pick_dist = dist_vec(pick_pos, adjusted_camera_pos); - +	F32 yaw_angle; +	F32 old_yaw_angle;  	LLVector3 mouse_on_sphere; -	bool mouse_hit_sphere = intersect_ray_with_sphere(adjusted_camera_pos + (mouse_ray * pick_dist * 1.1f), -		-1.f * mouse_ray, -		object_rotation_center, -		pick_distance_from_rotation_center,  -		mouse_on_sphere); -  	LLVector3 old_mouse_on_sphere; -	intersect_ray_with_sphere(adjusted_camera_pos + (old_mouse_ray * pick_dist * 1.1f), -		-1.f * old_mouse_ray, -		object_rotation_center, -		pick_distance_from_rotation_center, -		old_mouse_on_sphere); -	if (mouse_hit_sphere) +	if (intersect_ray_with_sphere( +			adjusted_camera_pos, +			mouse_ray, +			pick_rotation_center, +			pick_distance_from_rotation_center,  +			FAR_INTERSECTION, +			mouse_on_sphere))  	{ -		// calculate rotation frame in screen space -		LLVector3 screen_rotation_up_axis = orthogonal_component(rotation_up_axis, LLViewerCamera::instance().getAtAxis()); -		screen_rotation_up_axis.normalize(); - -		LLVector3 screen_rotation_left_axis = screen_rotation_up_axis % LLViewerCamera::instance().getAtAxis(); +		LLVector3 mouse_sphere_offset = mouse_on_sphere - pick_rotation_center; +		yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis()); +	} +	else +	{ +		yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center); +		if (mouse_ray * rotation_frame.getLeftAxis() < 0.f) +		{ +			yaw_angle *= -1.f; +		} +	} -		LLVector3 rotation_furthest_pt = object_rotation_center + pick_distance_from_rotation_center * rotation_fwd_axis; -		F32 mouse_lateral_distance = llclamp(((mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f); -		F32 old_mouse_lateral_distance = llclamp(((old_mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f); +	if (intersect_ray_with_sphere( +			adjusted_camera_pos, +			old_mouse_ray, +			pick_rotation_center, +			pick_distance_from_rotation_center, +			FAR_INTERSECTION, +			old_mouse_on_sphere)) +	{ +		LLVector3 mouse_sphere_offset = old_mouse_on_sphere - pick_rotation_center; +		old_yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis()); +	} +	else +	{ +		old_yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center); -		F32 yaw_angle = asinf(mouse_lateral_distance); -		F32 old_yaw_angle = asinf(old_mouse_lateral_distance); +		if (mouse_ray * rotation_frame.getLeftAxis() < 0.f) +		{ +			old_yaw_angle *= -1.f; +		} +	} -		F32 delta_angle = yaw_angle - old_yaw_angle; -		if (!mClockwise) delta_angle *= -1.f; +	const F32 delta_angle = yaw_angle - old_yaw_angle; +	if (mClockwise) +	{  		gAgent.yaw(delta_angle); -		mMouseSteerX = x; -		mMouseSteerY = y;  	} +	else +	{ +		gAgent.yaw(-delta_angle); +	} + +	mMouseSteerX = x; +	mMouseSteerY = y;  } diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index 4d6eac4958..6b2cd71d40 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -34,9 +34,11 @@  // std headers  // external library headers  // other Linden headers +#include "llui.h" // getRootView(), resolvePath()  #include "lluictrl.h"  #include "llerror.h" +  LLUIListener::LLUIListener():      LLEventAPI("UI",                 "LLUICtrl::CommitCallbackRegistry listener.\n" @@ -47,6 +49,12 @@ LLUIListener::LLUIListener():          "as if from a user gesture on a menu -- or a button click.",          &LLUIListener::call,          LLSD().with("function", LLSD())); + +    add("getValue", +        "For the UI control identified by the path in [\"path\"], return the control's\n" +        "current value as [\"value\"] reply.", +        &LLUIListener::getValue, +        LLSDMap("path", LLSD())("reply", LLSD()));  }  void LLUIListener::call(const LLSD& event) const @@ -71,3 +79,23 @@ void LLUIListener::call(const LLSD& event) const          (*func)(NULL, event["parameter"]);      }  } + +void LLUIListener::getValue(const LLSD&event) const +{ +    LLSD reply = LLSD::emptyMap(); + +    const LLView* root = LLUI::getRootView(); +    const LLView* view = LLUI::resolvePath(root, event["path"].asString()); +    const LLUICtrl* ctrl(dynamic_cast<const LLUICtrl*>(view)); + +    if (ctrl)  +    { +        reply["value"] = ctrl->getValue(); +    } +    else +    { +        // *TODO: ??? return something indicating failure to resolve +    } +     +    sendReply(reply, event); +} diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h index e7847f01e8..08724024dc 100644 --- a/indra/newview/lluilistener.h +++ b/indra/newview/lluilistener.h @@ -41,6 +41,7 @@ public:  private:      void call(const LLSD& event) const; +    void getValue(const LLSD&event) const;  };  #endif /* ! defined(LL_LLUILISTENER_H) */ diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index ebbb045f0a..ed4d278e90 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -53,6 +53,7 @@ class LLURLDispatcherImpl  {  public:  	static bool dispatch(const LLSLURL& slurl, +						 const std::string& nav_type,  						 LLMediaCtrl* web,  						 bool trusted_browser);  		// returns true if handled or explicitly blocked. @@ -61,6 +62,7 @@ public:  private:  	static bool dispatchCore(const LLSLURL& slurl,  +							 const std::string& nav_type,  							 bool right_mouse,  							 LLMediaCtrl* web,  							 bool trusted_browser); @@ -71,6 +73,7 @@ private:  		// Returns true if handled.  	static bool dispatchApp(const LLSLURL& slurl, +							const std::string& nav_type,  							bool right_mouse,  							LLMediaCtrl* web,  							bool trusted_browser); @@ -78,7 +81,7 @@ private:  		// by showing panel in Search floater.  		// Returns true if handled or explicitly blocked. -	static bool dispatchRegion(const LLSLURL& slurl, bool right_mouse); +	static bool dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse);  		// handles secondlife://Ahern/123/45/67/  		// Returns true if handled. @@ -97,6 +100,7 @@ private:  // static  bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, +									   const std::string& nav_type,  									   bool right_mouse,  									   LLMediaCtrl* web,  									   bool trusted_browser) @@ -105,9 +109,9 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl,  	switch(slurl.getType())  	{  		case LLSLURL::APP:  -			return dispatchApp(slurl, right_mouse, web, trusted_browser); +			return dispatchApp(slurl, nav_type, right_mouse, web, trusted_browser);  		case LLSLURL::LOCATION: -			return dispatchRegion(slurl, right_mouse); +			return dispatchRegion(slurl, nav_type, right_mouse);  		default:  			return false;  	} @@ -122,11 +126,12 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl,  // static  bool LLURLDispatcherImpl::dispatch(const LLSLURL& slurl, +								   const std::string& nav_type,  								   LLMediaCtrl* web,  								   bool trusted_browser)  {  	const bool right_click = false; -	return dispatchCore(slurl, right_click, web, trusted_browser); +	return dispatchCore(slurl, nav_type, right_click, web, trusted_browser);  }  // static @@ -135,11 +140,12 @@ bool LLURLDispatcherImpl::dispatchRightClick(const LLSLURL& slurl)  	const bool right_click = true;  	LLMediaCtrl* web = NULL;  	const bool trusted_browser = false; -	return dispatchCore(slurl, right_click, web, trusted_browser); +	return dispatchCore(slurl, "clicked", right_click, web, trusted_browser);  }  // static  bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,  +									  const std::string& nav_type,  									  bool right_mouse,  									  LLMediaCtrl* web,  									  bool trusted_browser) @@ -147,7 +153,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,  	llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl;  	const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery());  	bool handled = LLCommandDispatcher::dispatch( -			slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser); +			slurl.getAppCmd(), slurl.getAppPath(), query_map, web, nav_type, trusted_browser);  	// alert if we didn't handle this secondlife:///app/ SLURL  	// (but still return true because it is a valid app SLURL) @@ -159,7 +165,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,  }  // static -bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse) +bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse)  {    if(slurl.getType() != LLSLURL::LOCATION)      { @@ -287,10 +293,11 @@ LLTeleportHandler gTeleportHandler;  // static  bool LLURLDispatcher::dispatch(const std::string& slurl, +							   const std::string& nav_type,  							   LLMediaCtrl* web,  							   bool trusted_browser)  { -	return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); +	return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), nav_type, web, trusted_browser);  }  // static @@ -310,7 +317,7 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl)  	// *TODO: Make this trust model more refined.  JC  	const bool trusted_browser = true;  	LLMediaCtrl* web = NULL; -	return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); +	return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_browser);  } diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h index b07db4da3f..6309a97af5 100644 --- a/indra/newview/llurldispatcher.h +++ b/indra/newview/llurldispatcher.h @@ -33,6 +33,7 @@ class LLURLDispatcher  public:  	static bool dispatch(const std::string& slurl, +						 const std::string& nav_type,  						 LLMediaCtrl* web,  						 bool trusted_browser);	  		// At startup time and on clicks in internal web browsers, @@ -41,6 +42,8 @@ public:  		//   secondlife://RegionName/123/45/67/  		//   secondlife:///app/agent/3d6181b0-6a4b-97ef-18d8-722652995cf1/show  		//   sl://app/foo/bar +		// @param nav_type +		//   type of navigation type (see LLQtWebKit::LLWebPage::acceptNavigationRequest)  		// @param web  		//	 Pointer to LLMediaCtrl sending URL, can be NULL  		// @param trusted_browser diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp index d0441d7bfa..c7b9afafef 100644 --- a/indra/newview/llurldispatcherlistener.cpp +++ b/indra/newview/llurldispatcherlistener.cpp @@ -61,7 +61,7 @@ void LLURLDispatcherListener::dispatch(const LLSD& params) const          // But for testing, allow a caller to specify untrusted.          trusted_browser = params["trusted"].asBoolean();      } -    LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser); +    LLURLDispatcher::dispatch(params["url"], "clicked", NULL, trusted_browser);  }  void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 41b7c13826..8593c4cf79 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -115,8 +115,7 @@ void display_startup()  {  	if (   !gViewerWindow->getActive()  		|| !gViewerWindow->mWindow->getVisible()  -		|| gViewerWindow->mWindow->getMinimized() -		|| gNoRender ) +		|| gViewerWindow->mWindow->getMinimized() )  	{  		return;   	} @@ -294,7 +293,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	// Logic for forcing window updates if we're in drone mode.  	// -	if (gNoRender)  +	// *TODO: Investigate running display() during gHeadlessClient.  See if this early exit is needed DK 2011-02-18 +	if (gHeadlessClient)   	{  #if LL_WINDOWS  		static F32 last_update_time = 0.f; @@ -1066,8 +1066,8 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat  		F32 scale_y = (F32)gViewerWindow->getWorldViewHeightScaled() / (F32)screen_region.getHeight();  		mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f));  		mat.set_translate( -			glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), -					   clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), +			glh::vec3f(clamp_rescale((F32)(screen_region.getCenterX() - screen_region.mLeft), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), +					   clamp_rescale((F32)(screen_region.getCenterY() - screen_region.mBottom), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),  					   0.f));  		proj *= mat; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 499165135a..037e22584f 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2543,23 +2543,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)  		// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...  		if( MASK_CONTROL & mask )  		{ -			if( 'C' == key ) -			{ -				mMediaSource->copy(); -				result = true; -			} -			else -			if( 'V' == key ) -			{ -				mMediaSource->paste(); -				result = true; -			} -			else -			if( 'X' == key ) -			{ -				mMediaSource->cut(); -				result = true; -			} +			result = true;  		}  		if(!result) @@ -3000,7 +2984,8 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  		{  			LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL;   			std::string url = plugin->getClickURL(); -			LLURLDispatcher::dispatch(url, NULL, mTrustedBrowser); +			std::string nav_type = plugin->getClickNavType(); +			LLURLDispatcher::dispatch(url, nav_type, NULL, mTrustedBrowser);  		}  		break;  		case MEDIA_EVENT_CLICK_LINK_HREF: diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index de52aa17d1..4543a1ba9a 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -113,6 +113,11 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac  		media_impl->focus(true);  		gFocusMgr.setKeyboardFocus(this); +		LLViewerMediaImpl* impl = getFocusedMediaImpl(); +		if (impl) +		{ +			LLEditMenuHandler::gEditMenuHandler = impl; +		}  		// We must do this before  processing the media HUD zoom, or it may zoom to the wrong face.   		update(); @@ -139,6 +144,13 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac  		{  			gFocusMgr.setKeyboardFocus(NULL);  		} + +		LLViewerMediaImpl* impl = getFocusedMediaImpl(); +		if (LLEditMenuHandler::gEditMenuHandler == impl) +		{ +			LLEditMenuHandler::gEditMenuHandler = NULL; +		} +  		mFocusedImplID = LLUUID::null;  		if (objectp.notNull()) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index bd46ee1b67..5a3baf2650 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -856,40 +856,36 @@ void toggle_destination_and_avatar_picker(const LLSD& show)  	LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn");  	LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn"); -	switch(panel_idx) -	{ -	case 0: -		if (!destinations->getVisible()) -		{ -			container->setVisible(true); -			destinations->setVisible(true); -			avatar_picker->setVisible(false); -			LLFirstUse::notUsingDestinationGuide(false); -			avatar_btn->setToggleState(false); -			destination_btn->setToggleState(true); -			return; -		} -		break; -	case 1: -		if (!avatar_picker->getVisible()) -		{	 -			container->setVisible(true); -			destinations->setVisible(false); -			avatar_picker->setVisible(true); -			avatar_btn->setToggleState(true); -			destination_btn->setToggleState(false); -			return; -		} -		break; -	default: -		break; +	if (panel_idx == 0 +		&& !destinations->getVisible()) +	{	// opening destinations guide +		container->setVisible(true); +		destinations->setVisible(true); +		avatar_picker->setVisible(false); +		LLFirstUse::notUsingDestinationGuide(false); +		avatar_btn->setToggleState(false); +		destination_btn->setToggleState(true); +		gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 0); +	} +	else if (panel_idx == 1  +		&& !avatar_picker->getVisible()) +	{	// opening avatar picker +		container->setVisible(true); +		destinations->setVisible(false); +		avatar_picker->setVisible(true); +		avatar_btn->setToggleState(true); +		destination_btn->setToggleState(false); +		gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 1); +	} +	else +	{	// toggling off dest guide or avatar picker +		container->setVisible(false); +		destinations->setVisible(false); +		avatar_picker->setVisible(false); +		avatar_btn->setToggleState(false); +		destination_btn->setToggleState(false); +		gSavedSettings.setS32("DestinationsAndAvatarsVisibility", -1);  	} - -	container->setVisible(false); -	destinations->setVisible(false); -	avatar_picker->setVisible(false); -	avatar_btn->setToggleState(false); -	destination_btn->setToggleState(false);  }; @@ -6416,12 +6412,12 @@ class LLToolsSelectedScriptAction : public view_listener_t  		else if (action == "start")  		{  			name = "start_queue"; -			msg = "Running"; +			msg = "SetRunning";  		}  		else if (action == "stop")  		{  			name = "stop_queue"; -			msg = "RunningNot"; +			msg = "SetRunningNot";  		}  		LLUUID id; id.generate(); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8b52d478e6..9641a0901c 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -343,12 +343,6 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)  {  	LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); -	if (!regionp || gNoRender) -	{ -		return; -	} - -  	S32 size;  	S8 type; @@ -2168,10 +2162,6 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m  void process_improved_im(LLMessageSystem *msg, void **user_data)  { -	if (gNoRender) -	{ -		return; -	}  	LLUUID from_id;  	BOOL from_group;  	LLUUID to_id; @@ -3960,7 +3950,9 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)  	// LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't  	// trigger a control event.  	U32 control_flags = gAgent.getControlFlags(); +  	MASK	key_mask = gKeyboard->currentMask(TRUE); +  	if (key_mask & MASK_ALT || key_mask & MASK_CONTROL)  	{  		control_flags &= ~(	AGENT_CONTROL_LBUTTON_DOWN | @@ -4279,7 +4271,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)  	gSky.setSunPhase(phase);  	gSky.setSunTargetDirection(sun_direction, sun_ang_velocity); -	if (!gNoRender && !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun())) +	if ( !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun()) )  	{  		gSky.setSunDirection(sun_direction, sun_ang_velocity);  	} @@ -5541,21 +5533,12 @@ time_t								gLastDisplayedTime = 0;  void handle_show_mean_events(void *)  { -	if (gNoRender) -	{ -		return; -	}  	LLFloaterReg::showInstance("bumps");  	//LLFloaterBump::showInstance();  }  void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_group)  { -	if (gNoRender) -	{ -		return; -	} -  	static const U32 max_collision_list_size = 20;  	if (gMeanCollisionList.size() > max_collision_list_size)  	{ diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 32cd8dbb39..e8828e63a9 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -469,11 +469,6 @@ void LLViewerObject::initVOClasses()  	// Initialized shared class stuff first.  	LLVOAvatar::initClass();  	LLVOTree::initClass(); -	if (gNoRender) -	{ -		// Don't init anything else in drone mode -		return; -	}  	llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl;  	LLVOGrass::initClass();  	LLVOWater::initClass(); @@ -2150,12 +2145,6 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  		}  	} -	if (gNoRender) -	{ -		// Skip drawable stuff if not rendering. -		return TRUE; -	} -  	updateDrawable(FALSE);  	return TRUE; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 979d91cfcb..da95bacc41 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -636,19 +636,16 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)  	} -	if (!gNoRender) +	// Slam priorities for textures that we care about (hovered, selected, and focused) +	// Hovered +	// Assumes only one level deep of parenting +	LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode(); +	if (nodep)  	{ -		// Slam priorities for textures that we care about (hovered, selected, and focused) -		// Hovered -		// Assumes only one level deep of parenting -		LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode(); -		if (nodep) +		objectp = nodep->getObject(); +		if (objectp)  		{ -			objectp = nodep->getObject(); -			if (objectp) -			{ -				objectp->boostTexturePriority(); -			} +			objectp->boostTexturePriority();  		}  	} @@ -1100,7 +1097,7 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)  	// We need to update many object caches, I'll document this more as I dig through the code  	// cleaning things out... -	if (gNoRender || 0 == offset.magVecSquared()) +	if (0 == offset.magVecSquared())  	{  		return;  	} @@ -1568,11 +1565,6 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip  void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)  { -	if (gNoRender) -	{ -		return; -	} -  	if (objectp->isDead())  	{  		llwarns << "Trying to find orphans for dead obj " << objectp->mID  diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 40f0b43313..dfa35edef4 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -539,6 +539,12 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent  		};  		break; +		case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: +		{ +			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; +		}; +		break; +  		case MEDIA_EVENT_CLICK_LINK_HREF:  		{  			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index fccd1156d3..e84e4a859a 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1383,11 +1383,6 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)  // static  void LLViewerParcelMgr::processParcelOverlay(LLMessageSystem *msg, void **user)  { -	if (gNoRender) -	{ -		return; -	} -  	// Extract the packed overlay information  	S32 packed_overlay_size = msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_Data); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index e1d3e8a0b3..c53fdc3393 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -73,8 +73,6 @@  	#pragma warning(disable:4355)  #endif -extern BOOL gNoRender; -  const F32 WATER_TEXTURE_SCALE = 8.f;			//  Number of times to repeat the water texture across a region  const S16 MAX_MAP_DIST = 10; @@ -111,7 +109,7 @@ public:  		}  		// Process the SLapp as if it was a secondlife://{PLACE} SLurl -		LLURLDispatcher::dispatch(url, web, true); +		LLURLDispatcher::dispatch(url, "clicked", web, true);  		return true;  	}  }; @@ -235,28 +233,19 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	updateRenderMatrix();  	mLandp = new LLSurface('l', NULL); -	if (!gNoRender) -	{ -		// Create the composition layer for the surface -		mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); -		mCompositionp->setSurface(mLandp); - -		// Create the surfaces -		mLandp->setRegion(this); -		mLandp->create(grids_per_region_edge, -						grids_per_patch_edge, -						mOriginGlobal, -						mWidth); -	} -	if (!gNoRender) -	{ -		mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); -	} -	else -	{ -		mParcelOverlay = NULL; -	} +	// Create the composition layer for the surface +	mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); +	mCompositionp->setSurface(mLandp); + +	// Create the surfaces +	mLandp->setRegion(this); +	mLandp->create(grids_per_region_edge, +					grids_per_patch_edge, +					mOriginGlobal, +					mWidth); + +	mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters);  	setOriginGlobal(from_region_handle(handle));  	calculateCenterGlobal(); diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 874519a59f..fa60e572ac 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -711,7 +711,7 @@ void send_stats()  	// but that day is not today.  	// Only send stats if the agent is connected to a region. -	if (!gAgent.getRegion() || gNoRender) +	if (!gAgent.getRegion())  	{  		return;  	} diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index cf7f3f80ad..f5fb074992 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1415,63 +1415,61 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)  // 						mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize())  // 			<< mID.getString() << llendl;  	BOOL res = TRUE; -	if (!gNoRender) -	{ -		// store original size only for locally-sourced images -		if (mUrl.compare(0, 7, "file://") == 0) -		{ -			mOrigWidth = mRawImage->getWidth(); -			mOrigHeight = mRawImage->getHeight(); -			// leave black border, do not scale image content -			mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); -			 -			mFullWidth = mRawImage->getWidth(); -			mFullHeight = mRawImage->getHeight(); -			setTexelsPerImage(); -		} -		else -		{ -			mOrigWidth = mFullWidth; -			mOrigHeight = mFullHeight; -		} +	// store original size only for locally-sourced images +	if (mUrl.compare(0, 7, "file://") == 0) +	{ +		mOrigWidth = mRawImage->getWidth(); +		mOrigHeight = mRawImage->getHeight(); -		bool size_okay = true; +		// leave black border, do not scale image content +		mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); -		U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; -		U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; -		if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) -		{ -			llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; -			size_okay = false; -		} -		 -		if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) -		{ -			// A non power-of-two image was uploaded (through a non standard client) -			llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; -			size_okay = false; -		} -		 -		if( !size_okay ) -		{ -			// An inappropriately-sized image was uploaded (through a non standard client) -			// We treat these images as missing assets which causes them to -			// be renderd as 'missing image' and to stop requesting data -			setIsMissingAsset(); -			destroyRawImage(); -			return FALSE; -		} -		 -		if(!(res = insertToAtlas())) -		{ -			res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); -			resetFaceAtlas() ; -		} -		setActive() ; +		mFullWidth = mRawImage->getWidth(); +		mFullHeight = mRawImage->getHeight(); +		setTexelsPerImage(); +	} +	else +	{ +		mOrigWidth = mFullWidth; +		mOrigHeight = mFullHeight; +	} + +	bool size_okay = true; +	 +	U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; +	U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; +	if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) +	{ +		llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; +		size_okay = false; +	} +	 +	if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) +	{ +		// A non power-of-two image was uploaded (through a non standard client) +		llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; +		size_okay = false; +	} +	 +	if( !size_okay ) +	{ +		// An inappropriately-sized image was uploaded (through a non standard client) +		// We treat these images as missing assets which causes them to +		// be renderd as 'missing image' and to stop requesting data +		setIsMissingAsset(); +		destroyRawImage(); +		return FALSE; +	} +	 +	if(!(res = insertToAtlas())) +	{ +		res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); +		resetFaceAtlas() ;  	} +	setActive() ; -	if (!mForceToSaveRawImage) +	if (!needsToSaveRawImage())  	{  		mNeedsAux = FALSE;  		destroyRawImage(); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 10126219f8..06f6ff23c2 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -91,11 +91,6 @@ void LLViewerTextureList::init()  	sNumImages = 0;  	mMaxResidentTexMemInMegaBytes = 0;  	mMaxTotalTextureMemInMegaBytes = 0 ; -	if (gNoRender) -	{ -		// Don't initialize GL stuff if we're not rendering. -		return; -	}  	mUpdateStats = TRUE; @@ -345,13 +340,6 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&  												   LLGLenum primary_format,   												   const LLUUID& force_id)  { -	if (gNoRender) -	{ -		// Never mind that this ignores image_set_id; -		// getImage() will handle that later. -		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); -	} -  	// generate UUID based on hash of filename  	LLUUID new_id;  	if (force_id.notNull()) @@ -741,7 +729,7 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create Images");  F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)  { -	if (gNoRender || gGLManager.mIsDisabled) return 0.0f; +	if (gGLManager.mIsDisabled) return 0.0f;  	//  	// Create GL textures for all textures that need them (images which have been @@ -876,7 +864,6 @@ void LLViewerTextureList::updateImagesUpdateStats()  void LLViewerTextureList::decodeAllImages(F32 max_time)  {  	LLTimer timer; -	if(gNoRender) return;  	// Update texture stats and priorities  	std::vector<LLPointer<LLViewerFetchedTexture> > image_list; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8e049e76df..4305349ea2 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -925,7 +925,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi  					{  						if (drop)  						{ -							LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), NULL, true ); +							LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), "clicked", NULL, true );  							return LLWindowCallbacks::DND_MOVE;  						}  						return LLWindowCallbacks::DND_COPY; @@ -1251,8 +1251,9 @@ void LLViewerWindow::handleMenuSelect(LLWindow *window,  S32 menu_item)  BOOL LLViewerWindow::handlePaint(LLWindow *window,  S32 x,  S32 y, S32 width,  S32 height)  { +	// *TODO: Enable similar information output for other platforms?  DK 2011-02-18  #if LL_WINDOWS -	if (gNoRender) +	if (gHeadlessClient)  	{  		HWND window_handle = (HWND)window->getPlatformWindow();  		PAINTSTRUCT ps;  @@ -1282,7 +1283,7 @@ BOOL LLViewerWindow::handlePaint(LLWindow *window,  S32 x,  S32 y, S32 width,  S  		len = temp_str.length();  		TextOutA(hdc, 0, 25, temp_str.c_str(), len);  -		TextOutA(hdc, 0, 50, "Set \"DisableRendering FALSE\" in settings.ini file to reenable", 61); +		TextOutA(hdc, 0, 50, "Set \"HeadlessClient FALSE\" in settings.ini file to reenable", 61);  		EndPaint(window_handle, &ps);   		return TRUE;  	} @@ -1316,7 +1317,8 @@ void LLViewerWindow::handleDataCopy(LLWindow *window, S32 data_type, void *data)  		std::string url = (const char*)data;  		LLMediaCtrl* web = NULL;  		const bool trusted_browser = false; -		if (LLURLDispatcher::dispatch(url, web, trusted_browser)) +		// don't treat slapps coming from external browsers as "clicks" as this would bypass throttling +		if (LLURLDispatcher::dispatch(url, "", web, trusted_browser))  		{  			// bring window to foreground, as it has just been "launched" from a URL  			mWindow->bringToFront(); @@ -1430,9 +1432,9 @@ LLViewerWindow::LLViewerWindow(  	mWindow = LLWindowManager::createWindow(this,  		title, name, x, y, width, height, 0,  		fullscreen,  -		gNoRender, +		gHeadlessClient,  		gSavedSettings.getBOOL("DisableVerticalSync"), -		!gNoRender, +		!gHeadlessClient,  		ignore_pixel_depth,  		gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled @@ -1801,19 +1803,18 @@ void LLViewerWindow::initWorldUI()  	LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents");  	if (destinations)  	{ +		destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));  		destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html");  	}  	if (avatar_picker)  	{ +		avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));  		avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html");  	} -	if (gSavedSettings.getBOOL("FirstLoginThisInstall")) -	{ -		toggle_destination_and_avatar_picker(0); -		gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE); -	} +	// show destinations by default +	toggle_destination_and_avatar_picker(gSavedSettings.getS32("DestinationsAndAvatarsVisibility"));  }  // Destroy the UI @@ -1895,11 +1896,8 @@ void LLViewerWindow::shutdownGL()  	LLVertexBuffer::cleanupClass();  	llinfos << "Stopping GL during shutdown" << llendl; -	if (!gNoRender) -	{ -		stopGL(FALSE); -		stop_glerror(); -	} +	stopGL(FALSE); +	stop_glerror();  	gGL.shutdown();  } @@ -1963,11 +1961,6 @@ void LLViewerWindow::reshape(S32 width, S32 height)  	// may have been destructed.  	if (!LLApp::isExiting())  	{ -		if (gNoRender) -		{ -			return; -		} -  		gWindowResized = TRUE;  		// update our window rectangle @@ -2604,12 +2597,8 @@ void LLViewerWindow::updateUI()  	S32 x = mCurrentMousePoint.mX;  	S32 y = mCurrentMousePoint.mY; -	MASK mask = gKeyboard->currentMask(TRUE); -	if (gNoRender) -	{ -		return; -	} +	MASK	mask = gKeyboard->currentMask(TRUE);  	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))  	{ @@ -3000,7 +2989,8 @@ void LLViewerWindow::updateLayout()  			}  			// Update the location of the blue box tool popup  			LLCoordGL select_center_screen; -			gFloaterTools->updatePopup( select_center_screen, gKeyboard->currentMask(TRUE) ); +			MASK	mask = gKeyboard->currentMask(TRUE); +			gFloaterTools->updatePopup( select_center_screen, mask );  		}  		else  		{ @@ -3126,7 +3116,8 @@ void LLViewerWindow::updateKeyboardFocus()  		// sync all floaters with their focus state  		gFloaterView->highlightFocusedFloater();  		gSnapshotFloaterView->highlightFocusedFloater(); -		if ((gKeyboard->currentMask(TRUE) & MASK_CONTROL) == 0) +		MASK	mask = gKeyboard->currentMask(TRUE); +		if ((mask & MASK_CONTROL) == 0)  		{  			// control key no longer held down, finish cycle mode  			gFloaterView->setCycleMode(FALSE); @@ -3439,11 +3430,6 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe  void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent)  { -	if (gNoRender) -	{ -		return; -	} -	  	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");  	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)  	{ @@ -3479,11 +3465,6 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)  void LLViewerWindow::performPick()  { -	if (gNoRender) -	{ -		return; -	} -  	if (!mPicks.empty())  	{  		std::vector<LLPickInfo>::iterator pick_it; @@ -3515,11 +3496,6 @@ void LLViewerWindow::returnEmptyPicks()  // Performs the GL object/land pick.  LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent)  { -	if (gNoRender) -	{ -		return LLPickInfo(); -	} -  	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");  	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)  	{ @@ -3529,7 +3505,8 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans  	}  	// shortcut queueing in mPicks and just update mLastPick in place -	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), gKeyboard->currentMask(TRUE), pick_transparent, TRUE, NULL); +	MASK	key_mask = gKeyboard->currentMask(TRUE); +	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL);  	mLastPick.fetchResults();  	return mLastPick; @@ -4785,12 +4762,9 @@ bool LLViewerWindow::onAlert(const LLSD& notify)  {  	LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); -	if (gNoRender) +	if (gHeadlessClient)  	{  		llinfos << "Alert: " << notification->getName() << llendl; -		notification->respond(LLSD::emptyMap()); -		LLNotifications::instance().cancel(notification); -		return false;  	}  	// If we're in mouselook, the mouse is hidden and so the user can't click  diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index 0b52948680..1fe5fc9800 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -65,7 +65,6 @@ LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow):  void LLViewerWindowListener::saveSnapshot(const LLSD& event) const  { -    LLReqID reqid(event);      typedef std::map<LLSD::String, LLViewerWindow::ESnapshotType> TypeMap;      TypeMap types;  #define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name @@ -98,9 +97,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const          type = found->second;      }      bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, rebuild, type); -    LLSD response(reqid.makeResponse()); -    response["ok"] = ok; -    LLEventPumps::instance().obtain(event["reply"]).post(response); +    sendReply(LLSDMap("ok", ok), event);  }  void LLViewerWindowListener::requestReshape(LLSD const & event_data) const diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 2c5e728c87..f1934933b5 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1302,18 +1302,8 @@ void LLVOAvatar::initInstance(void)  	} -	if (gNoRender) -	{ -		return; -	} -	  	buildCharacter(); -	if (gNoRender) -	{ -		return; -	} -	  	// preload specific motions here  	createMotion( ANIM_AGENT_CUSTOMIZE);  	createMotion( ANIM_AGENT_CUSTOMIZE_DONE); @@ -1755,12 +1745,6 @@ void LLVOAvatar::buildCharacter()  	BOOL status = loadAvatar();  	stop_glerror(); -	if (gNoRender) -	{ -		// Still want to load the avatar skeleton so visual parameters work. -		return; -	} -  // 	gPrintMessagesThisFrame = TRUE;  	lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl; @@ -2231,7 +2215,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	setPixelAreaAndAngle(gAgent);  	// force asynchronous drawable update -	if(mDrawable.notNull() && !gNoRender) +	if(mDrawable.notNull())  	{	  		LLFastTimer t(FTM_JOINT_UPDATE); @@ -2288,11 +2272,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	LLVector3 root_pos_last = mRoot.getWorldPosition();  	BOOL detailed_update = updateCharacter(agent); -	if (gNoRender) -	{ -		return TRUE; -	} -  	static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);  	bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) &&  						 LLVoiceClient::getInstance()->getVoiceEnabled(mID); @@ -3265,17 +3244,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		}  	} -	if (gNoRender) -	{ -		// Hack if we're running drones... -		if (isSelf()) -		{ -			gAgent.setPositionAgent(getPositionAgent()); -		} -		return FALSE; -	} - -  	LLVector3d root_pos_global;  	if (!mIsBuilt) @@ -4202,7 +4170,7 @@ void LLVOAvatar::updateTextures()  {  	BOOL render_avatar = TRUE; -	if (mIsDummy || gNoRender) +	if (mIsDummy)  	{  		return;  	} @@ -4476,11 +4444,6 @@ void LLVOAvatar::processAnimationStateChanges()  {  	LLMemType mt(LLMemType::MTYPE_AVATAR); -	if (gNoRender) -	{ -		return; -	} -  	if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) )  	{  		startMotion(ANIM_AGENT_WALK_ADJUST); @@ -4875,7 +4838,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age  	LLVector3d z_vec(0.0f, 0.0f, 1.0f);  	LLVector3d p0_global, p1_global; -	if (gNoRender || mIsDummy) +	if (mIsDummy)  	{  		outNorm.setVec(z_vec);  		out_pos_agent = in_pos_agent; @@ -5447,11 +5410,6 @@ BOOL LLVOAvatar::loadLayersets()  //-----------------------------------------------------------------------------  void LLVOAvatar::updateVisualParams()  { -	if (gNoRender) -	{ -		return; -	} -  	setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE );  	LLCharacter::updateVisualParams(); @@ -6182,8 +6140,6 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const  void LLVOAvatar::updateMeshTextures()  {      // llinfos << "updateMeshTextures" << llendl; -	if (gNoRender) return; -  	// if user has never specified a texture, assign the default  	for (U32 i=0; i < getNumTEs(); i++)  	{ @@ -6837,11 +6793,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		}  	} -	if (gNoRender) -	{ -		return; -	} -  	ESex old_sex = getSex();  //	llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 799ed433d7..3b4066e3ca 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2513,10 +2513,6 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const  //------------------------------------------------------------------------  BOOL LLVOAvatarSelf::needsRenderBeam()  { -	if (gNoRender) -	{ -		return FALSE; -	}  	LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();  	BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing()); diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index d239347810..4b3a9a4dc3 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -72,6 +72,8 @@ LLWaterParamManager::LLWaterParamManager() :  	mWave1Dir(.5f, .5f, "wave1Dir"),  	mWave2Dir(.5f, .5f, "wave2Dir"),  	mDensitySliderValue(1.0f), +	mPrevFogDensity(16.0f), // 2^4 +	mPrevFogColor(22.f/255.f, 43.f/255.f, 54.f/255.f, 0.0f),  	mWaterFogKS(1.0f)  {  } @@ -265,6 +267,20 @@ void LLWaterParamManager::update(LLViewerCamera * cam)  	// update the shaders and the menu  	propagateParameters(); +	// If water fog color has been changed, save it. +	if (mPrevFogColor != mFogColor) +	{ +		gSavedSettings.setColor4("WaterFogColor", mFogColor); +		mPrevFogColor = mFogColor; +	} + +	// If water fog density has been changed, save it. +	if (mPrevFogDensity != mFogDensity) +	{ +		gSavedSettings.setF32("WaterFogDensity", mFogDensity); +		mPrevFogDensity = mFogDensity; +	} +	  	// sync menus if they exist  	LLFloaterWater* waterfloater = LLFloaterReg::findTypedInstance<LLFloaterWater>("env_water");  	if(waterfloater)  @@ -449,7 +465,24 @@ LLWaterParamManager * LLWaterParamManager::instance()  		sInstance->loadAllPresets(LLStringUtil::null);  		sInstance->getParamSet("Default", sInstance->mCurParams); +		sInstance->initOverrides();  	}  	return sInstance;  } + +void LLWaterParamManager::initOverrides() +{ +	// Override fog color from the current preset with the saved setting. +	LLColor4 fog_color_override = gSavedSettings.getColor4("WaterFogColor"); +	mFogColor = fog_color_override; +	mPrevFogColor = fog_color_override; +	mCurParams.set("waterFogColor", fog_color_override); + +	// Do the same with fog density. +	F32 fog_density = gSavedSettings.getF32("WaterFogDensity"); +	mPrevFogDensity = fog_density; +	mFogDensity = fog_density; +	mCurParams.set("waterFogDensity", fog_density); +	setDensitySliderValue(mFogDensity.mExp); +} diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h index c479f1861c..f465034c39 100644 --- a/indra/newview/llwaterparammanager.h +++ b/indra/newview/llwaterparammanager.h @@ -284,6 +284,9 @@ public:  	// singleton pattern implementation  	static LLWaterParamManager * instance(); +private: +	void initOverrides(); +	  public:  	LLWaterParamSet mCurParams; @@ -314,6 +317,9 @@ private:  	LLVector4 mWaterPlane;  	F32 mWaterFogKS; +	LLColor4 mPrevFogColor; +	F32      mPrevFogDensity; +  	// our parameter manager singleton instance  	static LLWaterParamManager * sInstance;  }; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8f7197c607..6b2af1f8b7 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -98,11 +98,6 @@ LLWorld::LLWorld() :  		mEdgeWaterObjects[i] = NULL;  	} -	if (gNoRender) -	{ -		return; -	} -  	LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,4);  	U8 *default_texture = raw->getData();  	*(default_texture++) = MAX_WATER_COLOR.mV[0]; @@ -626,10 +621,7 @@ void LLWorld::updateVisibilities()  		if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))  		{  			regionp->calculateCameraDistance(); -			if (!gNoRender) -			{ -				regionp->getLand().updatePatchVisibilities(gAgent); -			} +			regionp->getLand().updatePatchVisibilities(gAgent);  		}  		else  		{ @@ -1454,59 +1446,52 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi  	{  		positions->clear();  	} -	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); -		iter != LLWorld::getInstance()->getRegionList().end(); ++iter) +	// get the list of avatars from the character list first, so distances are correct +	// when agent is above 1020m and other avatars are nearby +	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); +		iter != LLCharacter::sInstances.end(); ++iter)  	{ -		LLViewerRegion* regionp = *iter; -		const LLVector3d& origin_global = regionp->getOriginGlobal(); -		S32 count = regionp->mMapAvatars.count(); -		for (S32 i = 0; i < count; i++) +		LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; +		if(!pVOAvatar->isDead() && !pVOAvatar->isSelf())  		{ -			LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); -			if(dist_vec(pos_global, relative_to) <= radius) +			LLUUID uuid = pVOAvatar->getID(); +			if(!uuid.isNull())  			{ -				if(positions != NULL) +				LLVector3d pos_global = pVOAvatar->getPositionGlobal(); +				if(dist_vec(pos_global, relative_to) <= radius)  				{ -					positions->push_back(pos_global); -				} -				if(avatar_ids != NULL) -				{ -					avatar_ids->push_back(regionp->mMapAvatarIDs.get(i)); +					if(positions != NULL) +					{ +						positions->push_back(pos_global); +					} +					if(avatar_ids !=NULL) +					{ +						avatar_ids->push_back(uuid); +					}  				}  			}  		}  	} -	// retrieve the list of close avatars from viewer objects as well -	// for when we are above 1000m, only do this when we are retrieving -	// uuid's too as there could be duplicates -	if(avatar_ids != NULL) +	// region avatars added for situations where radius is greater than RenderFarClip +	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); +		iter != LLWorld::getInstance()->getRegionList().end(); ++iter)  	{ -		for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); -			iter != LLCharacter::sInstances.end(); ++iter) +		LLViewerRegion* regionp = *iter; +		const LLVector3d& origin_global = regionp->getOriginGlobal(); +		S32 count = regionp->mMapAvatars.count(); +		for (S32 i = 0; i < count; i++)  		{ -			LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; -			if(pVOAvatar->isDead() || pVOAvatar->isSelf()) -				continue; -			LLUUID uuid = pVOAvatar->getID(); -			if(uuid.isNull()) -				continue; -			LLVector3d pos_global = pVOAvatar->getPositionGlobal(); +			LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global);  			if(dist_vec(pos_global, relative_to) <= radius)  			{ -				bool found = false; -				uuid_vec_t::iterator sel_iter = avatar_ids->begin(); -				for (; sel_iter != avatar_ids->end(); sel_iter++) -				{ -					if(*sel_iter == uuid) -					{ -						found = true; -						break; -					} -				} -				if(!found) +				LLUUID uuid = regionp->mMapAvatarIDs.get(i); +				// if this avatar doesn't already exist in the list, add it +				if(uuid.notNull() && avatar_ids!=NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end())  				{  					if(positions != NULL) +					{  						positions->push_back(pos_global); +					}  					avatar_ids->push_back(uuid);  				}  			} diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 8ef3a3b839..8cdb615686 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1745,7 +1745,7 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )  				// Invoke the event details floater if someone is clicking on an event.  				LLSD params(LLSD::emptyArray());  				params.append(event_id); -				LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true); +				LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, "clicked", true);  				break;  			}  		case MAP_ITEM_LAND_FOR_SALE: diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 58dc90ccd9..6dc8f28265 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1228,10 +1228,6 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)  U32 LLPipeline::addObject(LLViewerObject *vobj)  {  	LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT); -	if (gNoRender) -	{ -		return 0; -	}  	if (gSavedSettings.getBOOL("RenderDelayCreation"))  	{ diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 75aec21f93..72a4dd7f63 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -115,9 +115,6 @@       name="AlertCautionTextColor"       reference="LtYellow" />      <color -     name="AlertTextColor" -     value="0.58 0.66 0.84 1" /> -    <color       name="AvatarListItemIconDefaultColor"       reference="White" />      <color diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 3705a5902a..ed499619f6 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -29,7 +29,8 @@  	<check_box label="IM chats" name="EnableIMChatPopups" tool_tip="Vælg for at se popup vindue når personlige beskeder (IM) modtages"/>  	<spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/>  	<spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> -	<check_box label="Benyt maskin-oversættelse ved chat (håndteret af Google)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Benyt maskin-oversættelse ved chat (håndteret af Google)</text>  	<text name="translate_language_text" width="110">  		Oversæt chat til :  	</text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 5810cc21e7..067463be02 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -4,7 +4,8 @@  		Midterste museknap  	</panel.string>  	<slider label="Generel" name="System Volume"/> -	<check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Sluk lyd når minimeret</text>  	<slider label="Knapper" name="UI Volume"/>  	<slider label="Omgivelser" name="Wind Volume"/>  	<slider label="Lyd effekter" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 8086128dd7..8c8cdd31fe 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -29,7 +29,8 @@  	<check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/>  	<spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/>  	<spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> -	<check_box label="Bei Chat Maschinenübersetzung verwenden (Service von Google)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Bei Chat Maschinenübersetzung verwenden (Service von Google)</text>  	<text name="translate_language_text">  		Chat übersetzen in:  	</text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 0f029d8664..07631b6a91 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -4,7 +4,8 @@  		Mittlere Maustaste  	</panel.string>  	<slider label="Master-Lautstärke" name="System Volume"/> -	<check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Stummschalten, wenn minimiert</text>  	<slider label="Schaltflächen" name="UI Volume"/>  	<slider label="Umgebung" name="Wind Volume"/>  	<slider label="Soundeffekte" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 8eee8f44b5..dcfa8bc060 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -45,7 +45,7 @@       name="pref core"       tab_group="1"       tab_position="left" -     tab_width="115" +     tab_width="140"       tab_padding_right="0"       top="21"       width="658"> @@ -96,7 +96,7 @@           filename="panel_preferences_colors.xml"           label="Colors"           layout="topleft" -         help_topic="preferences_im_tab" +         help_topic="preferences_colors_tab"           name="colors" />          <panel  		 class="panel_preference" diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml new file mode 100644 index 0000000000..c39c26f25f --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + name="media ctrl context menu"> +  <menu_item_call +   label="Cut" +   layout="topleft" +   name="Cut"> +    <menu_item_call.on_click +     function="Edit.Cut" /> +    <menu_item_call.on_enable +     function="Edit.EnableCut" /> +  </menu_item_call> +  <menu_item_call +   label="Copy" +   layout="topleft" +   name="Copy"> +    <menu_item_call.on_click +     function="Edit.Copy" /> +    <menu_item_call.on_enable +     function="Edit.EnableCopy" /> +  </menu_item_call> +  <menu_item_call +   label="Paste" +   layout="topleft" +   name="Paste"> +    <menu_item_call.on_click +     function="Edit.Paste" /> +    <menu_item_call.on_enable +     function="Edit.EnablePaste" /> +  </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml index ecd96088e7..fe8489166b 100644 --- a/indra/newview/skins/default/xui/en/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml @@ -4,8 +4,7 @@    <menu_item_call     label="Cut"     layout="topleft" -   name="Cut" -   shortcut="control|X"> +   name="Cut">      <menu_item_call.on_click       function="Edit.Cut" />      <menu_item_call.on_enable @@ -14,8 +13,7 @@    <menu_item_call     label="Copy"     layout="topleft" -   name="Copy" -   shortcut="control|C"> +   name="Copy">      <menu_item_call.on_click       function="Edit.Copy" />      <menu_item_call.on_enable @@ -24,8 +22,7 @@    <menu_item_call     label="Paste"     layout="topleft" -   name="Paste" -   shortcut="control|V"> +   name="Paste">      <menu_item_call.on_click       function="Edit.Paste" />      <menu_item_call.on_enable @@ -34,8 +31,7 @@    <menu_item_call     label="Delete"     layout="topleft" -   name="Delete" -   shortcut="Del"> +   name="Delete">      <menu_item_call.on_click       function="Edit.Delete" />      <menu_item_call.on_enable @@ -44,8 +40,7 @@    <menu_item_call     label="Select All"     layout="topleft" -   name="Select All" -   shortcut="control|A"> +   name="Select All">      <menu_item_call.on_click       function="Edit.SelectAll" />      <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 433f623273..318bc9251f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7022,22 +7022,27 @@ Hiding the Speak button will disable the voice feature.    </notification>    <notification -  name="HintDisplayName" -  label="Display Name" +  name="HintMoveClick" +  label=""    type="hint"    unique="true"> -    Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. +1. Click to Walk +Click anywhere on the ground to walk to that spot. + +2. Click and Drag to Rotate View +Click and drag anywhere on the world to rotate your view +    <tag>custom_skin</tag>    </notification>    <notification -  name="HintMoveArrows" -  label="Move" +  name="HintDisplayName" +  label="Display Name"    type="hint"    unique="true"> -    To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. -    <tag>custom_skin</tag> +    Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences.    </notification> +    <notification    name="HintView"    label="View" diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index e2e9d0aef0..f7434f0330 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   width="205" - height="100"> + height="34">    <text name="hint_title"          font="SansSerifMedium"           left="8" @@ -15,8 +15,8 @@          left="8"          right="197"          top="26" -        bottom="92" -        follows="all"  +        bottom="26" +        follows="left|right|bottom"           text_color="Black"          wrap="true"/>    <button right="197"  diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index 00b6e42497..df05d50dc5 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -1,33 +1,43 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - width="205" - height="140" + width="305" + height="40"   layout="topleft">    <text name="hint_title"          font="SansSerifMedium"           left="8" -        right="180" +        right="290"          top="8"          bottom="20"          follows="left|right|top"          text_color="Black"          wrap="false"/> -  <icon name="hint_image" -        left="42" -        top="25" -        width="115" -        height="86" -        image_name="arrow_keys.png" -        /> +  <layout_stack left="0" +                top="25" +                width="305" +                height="0" +                follows="left|top|right" +                orientation="horizontal"> +    <layout_panel auto_resize="true" width="100"/> +    <layout_panel auto_resize="true" width="0"> +      <icon name="hint_image" +       top="0" +       left="0" +       height="0" +       width="0" +       follows="all"/> +    </layout_panel> +      <layout_panel auto_resize="true" width="100"/> +    </layout_stack>    <text name="hint_text"          left="8" -        right="197" -        top_pad="5" -        bottom="120" -        follows="all"  +        right="297" +        top="30" +        bottom="30" +        follows="left|right|bottom"           text_color="Black"          wrap="true"/> -  <button right="197"  +  <button right="297"             top="8"            width="16"             height="16" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 4c2faddfe4..8d0f1437e6 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -133,7 +133,6 @@ label="Remember password"    max_chars="128"    tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."    top_pad="0" -  control_name="SessionSettingsFile"    name="mode_combo"    width="110">  <combo_box.item diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 559df5bec9..714dca7fac 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -67,7 +67,7 @@       image_overlay="Arrow_Up"       hover_glow_amount="0.15"       layout="topleft" -     left="180" +     left="200"       name="enable_this_popup"       top_pad="5"       width="40"> @@ -81,7 +81,7 @@       image_overlay="Arrow_Down"       hover_glow_amount="0.15"       layout="topleft" -     left_pad="40" +     left_pad="20"       name="disable_this_popup"       top_delta="0"       width="40"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index a1082d9c32..404537e1f2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -208,15 +208,27 @@      <check_box       control_name="TranslateChat"       enabled="true" -     height="16" -     label="Use machine translation while chatting (powered by Google)" +     height="16"            layout="topleft"       left="30"       name="translate_chat_checkbox" -     bottom_delta="30" +     top_pad="5"       width="400" /> +     <!-- *HACK  +     	After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "translate_chat_checkbox" check_box's label.--> +     <text +      follows="top|left" +      height="15" +      layout="topleft" +      left="50" +      name="translate_chb_label" +      top_delta="1" +      width="450" +      wrap="true"> +      Use machine translation while chatting (powered by Google) +     </text>      <text -     bottom_delta="30" +     top_pad="20"       name="translate_language_text"       follows="left|top"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 36f8f99178..9c718fdb87 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -307,17 +307,6 @@  	 tool_tip="Check to use display names in chat, IM, name tags, etc."  	 top_pad="3"/> -	<check_box -	 control_name="EnableUIHints" -	 follows="top|left" -	 height="16" -	 label="Enable Viewer UI Hints" -	 layout="topleft" -	 left="27" -	 name="viewer_hints_check" -	 top_pad="5" -	 width="237"/> -	   	<text  	 type="string"  	 length="1" @@ -326,7 +315,7 @@  	 layout="topleft"  	 left="30"  	 name="inworld_typing_rg_label" -	 top_pad="6" +	 top_pad="1"  	 width="400">         Pressing letter keys:     </text> @@ -348,9 +337,9 @@           width="150" />          <radio_item           label="Affects movement (i.e. WASD)" -         left_pad="0" +         left="0"           layout="topleft" -         top_delta="0"  +         top="18"            height="16"            name="radio_move"           value="0" @@ -365,7 +354,7 @@       layout="topleft"       left="30"       name="title_afk_text" -     top_pad="4"  +     top_pad="15"        width="190">      	Away timeout:      </text> @@ -408,7 +397,7 @@       left="30"       mouse_opaque="false"       name="text_box3" -     top_pad="5" +     top_pad="3"       width="240">         Busy mode response:      </text> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index d2fc6ea09a..04412bdb9c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -120,12 +120,13 @@     type="string"     length="1"     follows="left|top" -   height="10" +   height="15"     layout="topleft"     left_delta="3"     name=" Mouse Sensitivity"     top_pad="10" -   width="160"> +   width="160" +   wrap="true">      Mouselook mouse sensitivity:    </text>    <slider @@ -139,7 +140,7 @@     max_val="15"     name="mouse_sensitivity"     top_delta="-1" -   width="145" /> +   width="115" />    <check_box     control_name="InvertMouse"     height="16" @@ -158,7 +159,7 @@     left="78"     name="arrow_keys_move_avatar_check"     width="237" -   top_pad="1"/> +   top_pad="10"/>    <check_box     control_name="AllowTapTapHoldRun"     follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index ef25588ca3..30be5bc853 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -42,7 +42,7 @@      </text>      <check_box  	 height="16" -     enabled="true" +     enabled="false"       label="Show me in Search results"       layout="topleft"       left="30" @@ -82,8 +82,8 @@       control_name="ShowFavoritesOnLogin"       enabled="false"        height="16" -     label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)"       layout="topleft" +     label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)"       left="30"       name="favorites_on_login_check"       top_pad="10" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 26af8dc29d..f89494da72 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -50,12 +50,24 @@       control_name="MuteWhenMinimized"       height="15"       initial_value="true" -     label="Mute when minimized"       layout="topleft"       name="mute_when_minimized"  	   top_delta="3"       left_pad="5" -     width="235" /> +     width="20" /> +     <!-- *HACK  +     	After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.--> +     <text +      follows="top|left" +      height="15" +      layout="topleft" +      left_pad="0" +      name="mute_chb_label" +      top_delta="0" +      width="150" +      wrap="true"> +      Mute when minimized +     </text>  	<slider  		control_name="AudioLevelUI"  		disabled_control="MuteAudio" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index d36220385d..cb701e03da 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -453,23 +453,6 @@  				</layout_panel>  		</layout_stack>        </layout_panel> -      <layout_panel -         follows="bottom|left" -         height="30" -         layout="topleft" -         name="profile_me_buttons_panel" -         visible="false" -	       width="313"> -        <button -         follows="bottom|right" -         height="23" -         left="20" -         top="0" -         label="Edit Profile" -         name="edit_profile_btn" -         tool_tip="Edit your personal information" -         width="130" /> -        </layout_panel>       </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 0b304fe287..aba85f9ff1 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -29,7 +29,8 @@  	<check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/>  	<spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/>  	<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> -	<check_box label="Usar la traducción automática (con Google) en el chat" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Usar la traducción automática (con Google) en el chat</text>  	<text name="translate_language_text">  		Traducir el chat al:  	</text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index db3659abcd..2bc82307a8 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -4,7 +4,8 @@  		Botón medio del ratón  	</panel.string>  	<slider label="Volumen general" name="System Volume"/> -	<check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Silenciar cuando minimice</text>  	<slider label="Botones" name="UI Volume"/>  	<slider label="Ambiental" name="Wind Volume"/>  	<slider label="Efectos de sonido" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 4b3fc35150..d5cecfc698 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -29,7 +29,8 @@  	<check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/>  	<spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/>  	<spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> -	<check_box label="Utiliser la traduction automatique lors des chats (fournie par Google)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Utiliser la traduction automatique lors des chats (fournie par Google)</text>  	<text name="translate_language_text">  		Traduire le chat en :  	</text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index 48630918d7..ac7f72d367 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -4,7 +4,8 @@  		Bouton central de la souris  	</panel.string>  	<slider label="Volume principal" name="System Volume"/> -	<check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Couper quand minimisé</text>  	<slider label="Boutons" name="UI Volume"/>  	<slider label="Ambiant" name="Wind Volume"/>  	<slider label="Effets sonores" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 4a1bbdf64a..208dd5ed28 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -56,7 +56,8 @@  		<radio_item label="Finestre separate" name="radio" value="0"/>  		<radio_item label="Schede" name="radio2" value="1"/>  	</radio_group> -	<check_box label="Usa la traduzione meccanica durante le chat (tecnologia Google)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Usa la traduzione meccanica durante le chat (tecnologia Google)</text>  	<text name="translate_language_text" width="110">  		Traduci chat in:  	</text> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index 6e70a314c5..e2332b63d0 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -1,7 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel label="Suoni" name="Preference Media panel">  	<slider label="Vol. principale" name="System Volume"/> -	<check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/> +	<check_box initial_value="true" label="" name="mute_when_minimized"/> +	<text name="mute_chb_label">Disatt. se a icona</text>  	<slider label="Pulsanti" name="UI Volume"/>  	<slider label="Ambiente" name="Wind Volume"/>  	<slider label="Effetti sonori" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index c260cebef8..ce2a0f35e4 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -56,7 +56,8 @@  		<radio_item label="別々のウィンドウ" name="radio" value="0"/>  		<radio_item label="タブ" name="radio2" value="1"/>  	</radio_group> -	<check_box label="チャット中に内容を機械翻訳する(Google翻訳)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >チャット中に内容を機械翻訳する(Google翻訳)</text>  	<text name="translate_language_text">  		翻訳する言語:  	</text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 9fbbd46220..74696a3b35 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -1,7 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel label="サウンド" name="Preference Media panel">  	<slider label="全体の音量" name="System Volume"/> -	<check_box initial_value="true" label="最小化でミュート" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">最小化でミュート</text>  	<slider label="ボタン" name="UI Volume"/>  	<slider label="風" name="Wind Volume"/>  	<slider label="効果音" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml index 2b709bde40..5ded015868 100644 --- a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml @@ -1,7 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel label="Geluid" name="Preference Media panel">  	<slider label="Hoofd volume" name="System Volume"/> -	<check_box initial_value="true" label="Dempen indien geminimaliseerd" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Dempen indien geminimaliseerd</text>  	<slider label="Omliggend" name="Wind Volume"/>  	<slider label="Knoppen" name="UI Volume"/>  	<slider label="Media" name="Media Volume"/> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index c7142c8419..4a4e6509ab 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -29,7 +29,8 @@  	<check_box label="Czat IM" name="EnableIMChatPopups" tool_tip="Zaznacz aby widzieć wyskakujące okienka kiedy IM się pojawia"/>  	<spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/>  	<spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/> -	<check_box label="Używaj translatora podczas rozmowy (wspierany przez Google)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Używaj translatora podczas rozmowy (wspierany przez Google)</text>  	<text name="translate_language_text">  		Przetłumacz czat na:  	</text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index ac93949a1b..692f24715b 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -4,7 +4,8 @@  		Środkowy przycisk myszy  	</panel.string>  	<slider label="Główny" name="System Volume"/> -	<check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Wycisz podczas minimalizacji</text>  	<slider label="Interfejs" name="UI Volume"/>  	<slider label="Otoczenie" name="Wind Volume"/>  	<slider label="Efekty dźwiękowe" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 368c474ee9..412bdbb13e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -29,7 +29,8 @@  	<check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/>  	<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/>  	<spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> -	<check_box label="Traduzir bate-papo automaticamente (via Google)" name="translate_chat_checkbox"/> +	<check_box name="translate_chat_checkbox"/> +	<text name="translate_chb_label" >Traduzir bate-papo automaticamente (via Google)</text>  	<text name="translate_language_text">  		Traduzir bate-papo para:  	</text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 3846bfb377..6053deb5b1 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -4,7 +4,8 @@  		Botão do meio do mouse  	</panel.string>  	<slider label="Volume principal" name="System Volume"/> -	<check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/> +	<check_box initial_value="true" name="mute_when_minimized"/> +	<text name="mute_chb_label">Silenciar ao minimizar</text>  	<slider label="Botões" name="UI Volume"/>  	<slider label="Ambiente" name="Wind Volume"/>  	<slider label="Efeitos sonoros" name="SFX Volume"/> diff --git a/indra/newview/skins/minimal/textures/click_to_move.png b/indra/newview/skins/minimal/textures/click_to_move.pngBinary files differ new file mode 100644 index 0000000000..74e3faa8ff --- /dev/null +++ b/indra/newview/skins/minimal/textures/click_to_move.png diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml index 3e2f5cd397..b4848a0619 100644 --- a/indra/newview/skins/minimal/textures/textures.xml +++ b/indra/newview/skins/minimal/textures/textures.xml @@ -2,6 +2,7 @@  <textures version="101">    <texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" />    <texture name="arrow_keys.png"/> +  <texture name="click_to_move" file_name="click_to_move.png"/>    <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />    <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />    <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" /> diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_favorites.xml b/indra/newview/skins/minimal/xui/en/menu_favorites.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_favorites.xml +++ b/indra/newview/skins/minimal/xui/en/menu_favorites.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml +++ b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_inventory.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inventory.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inventory.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml +++ b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_navbar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_navbar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_navbar.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml +++ b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml +++ b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml +++ b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml +++ b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_slurl.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_slurl.xml +++ b/indra/newview/skins/minimal/xui/en/menu_slurl.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 0145de8be9..d0a77e8c2a 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -163,7 +163,7 @@  			layout="topleft"  			left="0"  			name="destination_btn" -			tool_tip="Shows people window" +			tool_tip="Shows destinations"  			top="5"  			is_toggle="true"  			use_ellipses="true" diff --git a/indra/newview/skins/minimal/xui/en/panel_login.xml b/indra/newview/skins/minimal/xui/en/panel_login.xml index ef058e5567..3903658e71 100644 --- a/indra/newview/skins/minimal/xui/en/panel_login.xml +++ b/indra/newview/skins/minimal/xui/en/panel_login.xml @@ -134,7 +134,6 @@ top="20"    max_chars="128"    top_pad="0"    tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." -  control_name="SessionSettingsFile"    name="mode_combo"    width="120">  <combo_box.item | 
