From fb4743300ccfeadfb6601e39c808c4f3b90c1150 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Fri, 15 Apr 2011 16:45:19 -0700
Subject: FIX: STORM-1141.  Win7: 2.6.3 Beta1 crashes on startup if locale
 differs from English. Force LLTextureCache::purgeAllTextures to get called in
 addition to normal cache purging.

---
 indra/newview/llappviewer.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index cfb5853cfd..4985524f00 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3500,10 +3500,10 @@ bool LLAppViewer::initCache()
 	LLAppViewer::getTextureCache()->setReadOnly(read_only) ;
 	LLVOCache::getInstance()->setReadOnly(read_only);
 
-	BOOL texture_cache_mismatch = FALSE ;
+	bool texture_cache_mismatch = false;
 	if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion()) 
 	{
-		texture_cache_mismatch = TRUE ;
+		texture_cache_mismatch = true;
 		if(!read_only) 
 		{
 			gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion());
@@ -3517,7 +3517,9 @@ bool LLAppViewer::initCache()
 			gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
 		{
 			gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
-		mPurgeCache = true;
+			mPurgeCache = true;
+			// STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
+			texture_cache_mismatch = true;
 		}
 	
 		// We have moved the location of the cache directory over time.
-- 
cgit v1.2.3


From 21e37069fe723094bbf3b857acc5c1d494ecb942 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 13 Apr 2011 15:13:10 -0400
Subject: SH-1329 FIXED Physics are "twitchy" for high-FPS machines

Fixed bug that was messing up time slices for physics.
---
 indra/newview/llphysicsmotion.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 1d3c2b72f2..de4ce52351 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -452,7 +452,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         //
 
         const F32 time_delta = time - mLastTime;
-        if (time_delta > 3.0 || time_delta <= 0.01)
+
+	// Don't update too frequently, to avoid precision errors from small time slices.
+	if (time_delta <= .01)
+	{
+		return FALSE;
+	}
+	
+        if (time_delta > 3.0)
         {
                 mLastTime = time;
                 return FALSE;
-- 
cgit v1.2.3


From eaabea67445096d8d6ef6606aa8d06a4bf3913f6 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 13 Apr 2011 15:23:11 -0400
Subject: SH-1364 FIXED Avatar Physics are not updating smoothly even for
 high-performance machines.

"high" graphics settings now give 100% updates, versus 90%.
Changed a simple constant that was acting as a threshold for when physics should be updated (the constant was set way too high, meaning that updates were being skipped).
---
 indra/newview/featuretable.txt    | 2 +-
 indra/newview/llphysicsmotion.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 15ad330418..af2d951bf7 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -132,7 +132,7 @@ list High
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	1.0
-RenderAvatarPhysicsLODFactor 1	0.9
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	128
 RenderFlexTimeFactor		1	1.0
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index de4ce52351..09c9e75f2a 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -656,7 +656,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         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;
+                const F32 min_delta = (1.0001f-lod_factor)*0.4f;
                 if (llabs(position_diff_local) > min_delta)
                 {
                         update_visuals = TRUE;
-- 
cgit v1.2.3


From 0d421c0535181e357d6629f1b2ed139ceda0a2e3 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 14 Apr 2011 14:47:05 -0400
Subject: VWR-25453 FIXED Avatar Physics Spring Needs a Higher Limit

Tripled spring limit for all params.  Very safe change.
---
 indra/newview/character/avatar_lad.xml | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index ec162e3608..6acaa75c32 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -11903,7 +11903,7 @@ render_pass="bump">
      edit_group="physics_breasts_updown"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -11958,7 +11958,7 @@ render_pass="bump">
      edit_group="physics_breasts_inout"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12046,7 +12046,7 @@ render_pass="bump">
      edit_group="physics_belly_updown"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12132,7 +12132,7 @@ render_pass="bump">
      edit_group="physics_butt_updown"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12181,7 +12181,7 @@ render_pass="bump">
      edit_group="physics_butt_leftright"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12231,7 +12231,7 @@ render_pass="bump">
      edit_group="physics_breasts_leftright"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
-- 
cgit v1.2.3


From 461802a5c6cfa27bf942e0da8d606cc3bb71dc6c Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 14 Apr 2011 16:21:49 -0400
Subject: VWR-25445 FIXED breasts... accordions are presented in Edit Physics
 floater for male avatars

Accordions are selectively hidden based on gender.
---
 indra/newview/llpaneleditwearable.cpp | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index cb8fbd66b5..b73d97e4c4 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -1133,7 +1133,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis
         
                         LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
                         LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
-        
+			
                         if (!panel_list)
                         {
                                 llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
@@ -1145,7 +1145,18 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis
                                 llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
                                 continue;
                         }
-        
+
+			// Don't show female subparts if you're not female, etc.
+			if (!(gAgentAvatarp->getSex() & subpart_entry->mSex))
+			{
+				tab->setVisible(FALSE);
+				continue;
+			}
+			else
+			{
+				tab->setVisible(TRUE);
+			}
+			
                         // what edit group do we want to extract params for?
                         const std::string edit_group = subpart_entry->mEditGroup;
         
-- 
cgit v1.2.3


From 469bcbcd8bec6b8e2ffec105083319f088e99719 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 20 Apr 2011 10:42:58 -0400
Subject: cosmetic variable name change

---
 indra/newview/llphysicsmotion.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 09c9e75f2a..23b41a6db0 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -49,7 +49,7 @@
 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;
+#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f;
 
 inline F64 llsgn(const F64 a)
 {
@@ -370,7 +370,7 @@ void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion)
 
 F32 LLPhysicsMotionController::getMinPixelArea() 
 {
-        return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION;
+        return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION;
 }
 
 // Local space means "parameter space".
-- 
cgit v1.2.3


From f4683a11bb4026b8b52f4ad9504824523e4a0827 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 20 Apr 2011 11:30:00 -0400
Subject: SH-1384 FIXED AvatarPhysicsTest debug setting does not work

Took out setting, no longer needed.  Was formely restricted to gods.
---
 indra/newview/app_settings/settings.xml | 11 -----------
 indra/newview/llphysicsmotion.cpp       |  2 +-
 2 files changed, 1 insertion(+), 12 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index dd85c5cb86..898d89b17d 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -652,17 +652,6 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-  <key>AvatarPhysicsTest</key>
-  <map>
-    <key>Comment</key>
-    <string>Simulate continuous physics behavior on all nearby avatars.</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Boolean</string>
-    <key>Value</key>
-    <integer>0</integer>
-  </map>
     <key>AvatarSex</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 23b41a6db0..6a7c28357e 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -481,7 +481,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         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();
+        const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts.
         
         F32 behavior_maxeffect = getParamValue("MaxEffect");
         if (physics_test)
-- 
cgit v1.2.3


From 943d3e902c6c83a0f141896fd8c8057e237627ff Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 20 Apr 2011 11:33:14 -0400
Subject: SH-1380 FIXED User can wear several physics objects

Changed this to be expected behavior, where top wearable's characteristics are used.
---
 indra/newview/llwearabletype.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp
index 9e95604712..c090ab5c3d 100644
--- a/indra/newview/llwearabletype.cpp
+++ b/indra/newview/llwearabletype.cpp
@@ -80,7 +80,7 @@ LLWearableDictionary::LLWearableDictionary()
 	addEntry(LLWearableType::WT_ALPHA,        new WearableEntry("alpha",       "New Alpha",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE));
 	addEntry(LLWearableType::WT_TATTOO,       new WearableEntry("tattoo",      "New Tattoo",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE));
 
-	addEntry(LLWearableType::WT_PHYSICS,      new WearableEntry("physics",     "New Physics",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, FALSE));
+	addEntry(LLWearableType::WT_PHYSICS,      new WearableEntry("physics",     "New Physics",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE));
 
 	addEntry(LLWearableType::WT_INVALID,      new WearableEntry("invalid",     "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE));
 	addEntry(LLWearableType::WT_NONE,      	  new WearableEntry("none",        "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE));
-- 
cgit v1.2.3


From fd97e6dcba7e856e2e018222d9b5aa628de5ab87 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 20 Apr 2011 11:36:49 -0400
Subject: SH-1388 FIXED Graphics Quality slider has no effect on avatar physics
 SH-1387 Class0 video cards default avatar physics to high

Added appropriate featuretable entries.
---
 indra/newview/featuretable_linux.txt | 5 +++++
 indra/newview/featuretable_mac.txt   | 5 +++++
 indra/newview/featuretable_xp.txt    | 5 +++++
 3 files changed, 15 insertions(+)

(limited to 'indra/newview')

diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index a2cd4b834c..5da1495da9 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -26,6 +26,7 @@ list all
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxVisible      1   12
 RenderAvatarVP				1	1
 RenderCubeMap				1	1
@@ -70,6 +71,7 @@ list Low
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0
+RenderAvatarPhysicsLODFactor 1	0
 RenderAvatarMaxVisible      1   3
 RenderAvatarVP				1	0
 RenderFarClip				1	64
@@ -100,6 +102,7 @@ list Mid
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0.5
+RenderAvatarPhysicsLODFactor 1	0.75
 RenderAvatarVP				1	1
 RenderFarClip				1	96
 RenderFlexTimeFactor		1	1.0
@@ -128,6 +131,7 @@ list High
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	128
 RenderFlexTimeFactor		1	1.0
@@ -156,6 +160,7 @@ list Ultra
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	256
 RenderFlexTimeFactor		1	1.0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 3ad7f4e892..421f9c0973 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -26,6 +26,7 @@ list all
 RenderAnisotropic				1	0
 RenderAvatarCloth				0	0
 RenderAvatarLODFactor			1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxVisible          1   12
 RenderAvatarVP					1	0
 RenderCubeMap					1	1
@@ -70,6 +71,7 @@ list Low
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0
+RenderAvatarPhysicsLODFactor 1	0
 RenderAvatarMaxVisible      1   3
 RenderAvatarVP				1	0
 RenderFarClip				1	64
@@ -99,6 +101,7 @@ list Mid
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0.5
+RenderAvatarPhysicsLODFactor 1	0.75
 RenderAvatarVP				1	1
 RenderFarClip				1	96
 RenderFlexTimeFactor		1	1.0
@@ -126,6 +129,7 @@ list High
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	128
 RenderFlexTimeFactor		1	1.0
@@ -153,6 +157,7 @@ list Ultra
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	256
 RenderFlexTimeFactor		1	1.0
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 38e6bb1e5e..c2e5dfff9f 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -26,6 +26,7 @@ list all
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxVisible      1   12
 RenderAvatarVP				1	1
 RenderCubeMap				1	1
@@ -71,6 +72,7 @@ list Low
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0
+RenderAvatarPhysicsLODFactor 1	0
 RenderAvatarMaxVisible      1   3
 RenderAvatarVP				1	0
 RenderFarClip				1	64
@@ -101,6 +103,7 @@ list Mid
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0.5
+RenderAvatarPhysicsLODFactor 1	0.75
 RenderAvatarVP				1	1
 RenderFarClip				1	96
 RenderFlexTimeFactor		1	1.0
@@ -129,6 +132,7 @@ list High
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	128
 RenderFlexTimeFactor		1	1.0
@@ -157,6 +161,7 @@ list Ultra
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarVP				1	1
 RenderFarClip				1	256
 RenderFlexTimeFactor		1	1.0
-- 
cgit v1.2.3


From dcb79b5b6e8a79ef171e09de8972433bc7489978 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 20 Apr 2011 12:37:44 -0400
Subject: SH-1381 FIXED avatar physics behavior is tightly tied to viewer
 framerate

Breaking up physics into smaller integration steps.
---
 indra/newview/llphysicsmotion.cpp | 354 ++++++++++++++++++++------------------
 1 file changed, 184 insertions(+), 170 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 6a7c28357e..c9d355b3b5 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -49,7 +49,8 @@
 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_AVATAR_PHYSICS_MOTION 0.f;
+#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f
+#define TIME_ITERATION_STEP 0.1f
 
 inline F64 llsgn(const F64 a)
 {
@@ -459,7 +460,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 		return FALSE;
 	}
 	
-        if (time_delta > 3.0)
+	// If less than 1FPS, we don't want to be spending time updating physics at all.
+        if (time_delta > 1.0)
         {
                 mLastTime = time;
                 return FALSE;
@@ -487,195 +489,207 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         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.
-        //
+	BOOL update_visuals = FALSE; 
+	// Break up the physics into a bunch of iterations so that differing framerates will show
+	// roughly the same behavior.
+	for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
+	{
+		F32 time_iteration_step = TIME_ITERATION_STEP;
+		if (time_iteration + TIME_ITERATION_STEP > time_delta)
+		{
+			time_iteration_step = time_delta;
+		}
+		
+
+		// 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);
+		const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
+		const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step);
 
-        //
-        // End velocity and acceleration
-        ////////////////////////////////////////////////////////////////////////////////
+		//
+		// End velocity and acceleration
+		////////////////////////////////////////////////////////////////////////////////
 
 
-        ////////////////////////////////////////////////////////////////////////////////
-        // Calculate the total force 
-        //
+		////////////////////////////////////////////////////////////////////////////////
+		// 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;
+		// 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);
+		// 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);
+		// 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;
+		// 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);
+		// 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);
+		const F32 force_net = (force_accel + 
+				       force_gravity +
+				       force_spring + 
+				       force_damping + 
+				       force_drag);
 
-        //
-        // End total force
-        ////////////////////////////////////////////////////////////////////////////////
+		//
+		// 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);
+		////////////////////////////////////////////////////////////////////////////////
+		// 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;
-        }
+		// 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_iteration_step;
+		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);
-                }
-        }
+		// 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
-        ////////////////////////////////////////////////////////////////////////////////
+		//
+		// End calculate new params
+		////////////////////////////////////////////////////////////////////////////////
 
-        ////////////////////////////////////////////////////////////////////////////////
-        // Conditionally update the visual 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.
+		// 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());
+		// 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.0001f-lod_factor)*0.4f;
-                if (llabs(position_diff_local) > min_delta)
-                {
-                        update_visuals = TRUE;
-                        mPositionLastUpdate_local = position_new_local;
-                }
-        }
+		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.0001f-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();
 
-        //
-        // 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;
+	}
+	mLastTime = time;
 
         /*
           // Write out debugging info into a spreadsheet.
-- 
cgit v1.2.3


From 7a330c0e3fd4a3e190e6327deb769b595bc91342 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 21 Apr 2011 19:49:03 -0400
Subject: SH-1381 Avatar Physics behavior is tightly tied to viewer framerate

Changed physics algorithm to perform integration over several steps if framerate is slow.
Fixed a fundamental issue in the algorithm where timestep wasn't being used to calculate velocity changes.
Had to change around some parameter ranges since the physics are calculated slightly differently now.
---
 indra/newview/character/avatar_lad.xml | 72 +++++++++++++-------------
 indra/newview/llphysicsmotion.cpp      | 94 ++++++++++++++++------------------
 2 files changed, 79 insertions(+), 87 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 6acaa75c32..5d6b10c047 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -4352,8 +4352,8 @@
      wearable="shape"
      edit_group="driven"
      value_default="0"
-     value_min="-1.5"
-     value_max="1.5">
+     value_min="-1.25"
+     value_max="1.25">
       <param_morph />
     </param>
 
@@ -11875,7 +11875,7 @@ render_pass="bump">
      edit_group="physics_advanced"
      value_default="0"
      value_min="0"
-     value_max=".1">
+     value_max="30">
 	 <param_driver />
     </param>
 
@@ -11887,9 +11887,9 @@ render_pass="bump">
      label="Breast Physics Drag"
      wearable="physics"
      edit_group="physics_advanced"
-     value_default=".15"
+     value_default="1"
      value_min="0"
-     value_max=".5">
+     value_max="10">
 	 <param_driver />
     </param>
 
@@ -11914,9 +11914,9 @@ render_pass="bump">
      label="Breast Physics UpDown Spring"
      wearable="physics"
      edit_group="physics_breasts_updown"
-     value_default=".1"
+     value_default="10"
      value_min="0"
-     value_max="3">
+     value_max="100">
 	 <param_driver />
     </param>
     <param
@@ -11940,11 +11940,9 @@ render_pass="bump">
      label="Breast Physics UpDown Damping"
      wearable="physics"
      edit_group="physics_breasts_updown"
-     value_default=".05"
+     value_default=".2"
      value_min="0"
-     value_max=".1"
-     camera_elevation=".3"
-     camera_distance=".8">
+     value_max="1">
 	 <param_driver />
     </param>
 
@@ -11969,9 +11967,9 @@ render_pass="bump">
      label="Breast Physics InOut Spring"
      wearable="physics"
      edit_group="physics_breasts_inout"
-     value_default=".1"
+     value_default="10"
      value_min="0"
-     value_max="3">
+     value_max="100">
 	 <param_driver />
     </param>
     <param
@@ -11995,9 +11993,9 @@ render_pass="bump">
      label="Breast Physics InOut Damping"
      wearable="physics"
      edit_group="physics_breasts_inout"
-     value_default=".05"
+     value_default=".2"
      value_min="0"
-     value_max=".1">
+     value_max="1">
 	 <param_driver />
     </param>
 
@@ -12022,7 +12020,7 @@ render_pass="bump">
      edit_group="physics_advanced"
      value_default="0"
      value_min="0"
-     value_max=".1">
+     value_max="30">
 	 <param_driver />
     </param>
    <param
@@ -12032,9 +12030,9 @@ render_pass="bump">
      label="Belly Physics Drag"
      wearable="physics"
      edit_group="physics_advanced"
-     value_default=".15"
+     value_default="1"
      value_min="0"
-     value_max=".5">
+     value_max="10">
 	 <param_driver />
     </param>
    <param
@@ -12056,9 +12054,9 @@ render_pass="bump">
      label="Belly Physics UpDown Spring"
      wearable="physics"
      edit_group="physics_belly_updown"
-     value_default=".1"
+     value_default="10"
      value_min="0"
-     value_max="3">
+     value_max="100">
 	 <param_driver />
     </param>
     <param
@@ -12080,9 +12078,9 @@ render_pass="bump">
      label="Belly Physics UpDown Damping"
      wearable="physics"
      edit_group="physics_belly_updown"
-     value_default=".05"
+     value_default=".2"
      value_min="0"
-     value_max=".1">
+     value_max="1">
 	 <param_driver />
     </param>
 
@@ -12107,7 +12105,7 @@ render_pass="bump">
      edit_group="physics_advanced"
      value_default="0"
      value_min="0"
-     value_max=".1">
+     value_max="30">
 	 <param_driver />
     </param>
    <param
@@ -12117,9 +12115,9 @@ render_pass="bump">
      label="Butt Physics Drag"
      wearable="physics"
      edit_group="physics_advanced"
-     value_default=".15"
+     value_default="1"
      value_min="0"
-     value_max=".5">
+     value_max="10">
 	 <param_driver />
     </param>
 
@@ -12142,9 +12140,9 @@ render_pass="bump">
      label="Butt Physics UpDown Spring"
      wearable="physics"
      edit_group="physics_butt_updown"
-     value_default=".1"
+     value_default="10"
      value_min="0"
-     value_max="3">
+     value_max="100">
 	 <param_driver />
     </param>
     <param
@@ -12166,9 +12164,9 @@ render_pass="bump">
      label="Butt Physics UpDown Damping"
      wearable="physics"
      edit_group="physics_butt_updown"
-     value_default=".05"
+     value_default=".2"
      value_min="0"
-     value_max=".1">
+     value_max="1">
 	 <param_driver />
     </param>
 
@@ -12191,9 +12189,9 @@ render_pass="bump">
      label="Butt Physics LeftRight Spring"
      wearable="physics"
      edit_group="physics_butt_leftright"
-     value_default=".1"
+     value_default="10"
      value_min="0"
-     value_max="3">
+     value_max="100">
 	 <param_driver />
     </param>
     <param
@@ -12215,9 +12213,9 @@ render_pass="bump">
      label="Butt Physics LeftRight Damping"
      wearable="physics"
      edit_group="physics_butt_leftright"
-     value_default=".05"
+     value_default=".2"
      value_min="0"
-     value_max=".1">
+     value_max="1">
 	 <param_driver />
     </param>
 
@@ -12242,9 +12240,9 @@ render_pass="bump">
      label="Breast Physics LeftRight Spring"
      wearable="physics"
      edit_group="physics_breasts_leftright"
-     value_default=".1"
+     value_default="10"
      value_min="0"
-     value_max="3">
+     value_max="100">
 	 <param_driver />
     </param>
     <param
@@ -12268,9 +12266,9 @@ render_pass="bump">
      label="Breast Physics LeftRight Damping"
      wearable="physics"
      edit_group="physics_breasts_leftright"
-     value_default=".05"
+     value_default=".2"
      value_min="0"
-     value_max=".1">
+     value_max="1">
 	 <param_driver />
     </param>
 
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index c9d355b3b5..7d862848b5 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -132,9 +132,8 @@ protected:
 						   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);
+        F32 calculateVelocity_local();
+        F32 calculateAcceleration_local(F32 velocity_local);
 private:
         const std::string mParamDriverName;
         const std::string mParamControllerName;
@@ -385,19 +384,20 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world)
         return world * dir_world;
 }
 
-F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta)
+F32 LLPhysicsMotion::calculateVelocity_local()
 {
+	const F32 world_to_model_scale = 10.0f;
         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 LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale;
+        const LLVector3 velocity_world = positionchange_world;
         const F32 velocity_local = toLocal(velocity_world);
         return velocity_local;
 }
 
-F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local,
-                                                 const F32 time_delta)
+F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local)
 {
 //        const F32 smoothing = getParamValue("Smoothing");
         static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary
@@ -489,7 +489,31 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         if (physics_test)
                 behavior_maxeffect = 1.0f;
 
-	BOOL update_visuals = FALSE; 
+	// 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.
+	const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
+       	
+	//
+	// End parameters and settings
+	////////////////////////////////////////////////////////////////////////////////
+	
+	
+	////////////////////////////////////////////////////////////////////////////////
+	// Calculate velocity and acceleration in parameter space.
+	//
+        
+	//const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
+	const F32 velocity_joint_local = calculateVelocity_local();
+	const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local);
+	
+	//
+	// End velocity and acceleration
+	////////////////////////////////////////////////////////////////////////////////
+	
+	BOOL update_visuals = FALSE;
+	
 	// Break up the physics into a bunch of iterations so that differing framerates will show
 	// roughly the same behavior.
 	for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
@@ -497,46 +521,20 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 		F32 time_iteration_step = TIME_ITERATION_STEP;
 		if (time_iteration + TIME_ITERATION_STEP > time_delta)
 		{
-			time_iteration_step = time_delta;
+			time_iteration_step = time_delta-time_iteration;
 		}
 		
-
 		// 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());
-
+		const F32 position_current_local = llclamp(mPosition_local,
+							   0.0f,
+							   1.0f);
 		// 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;
+			return update_visuals;
 		}
 
-		//
-		// End parameters and settings
-		////////////////////////////////////////////////////////////////////////////////
-
-
-		////////////////////////////////////////////////////////////////////////////////
-		// Calculate velocity and acceleration in parameter space.
-		//
-        
-		const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
-		const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step);
-
-		//
-		// End velocity and acceleration
-		////////////////////////////////////////////////////////////////////////////////
-
-
 		////////////////////////////////////////////////////////////////////////////////
 		// Calculate the total force 
 		//
@@ -553,7 +551,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 		// 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);
+		const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass);
                 
 		// Damping is a restoring force that opposes the current velocity.
 		// F = -kv
@@ -581,10 +579,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 		// 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;
+		static const F32 max_velocity = 100.0f; // magic number, used to be customizable.
+		F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step;
 		velocity_new_local = llclamp(velocity_new_local, 
-					     -max_acceleration, max_acceleration);
+					     -max_velocity, max_velocity);
         
 		// Temporary debugging setting to cause all avatars to move, for profiling purposes.
 		if (physics_test)
@@ -610,8 +608,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 		    (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;
@@ -680,16 +676,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 		// 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;
+	mPosition_world = joint->getWorldPosition();
+	mVelocityJoint_local = velocity_joint_local;
+
 
         /*
           // Write out debugging info into a spreadsheet.
-- 
cgit v1.2.3


From f227e8ec01c99e09df7f362b934d57d80702a882 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 21 Apr 2011 20:30:38 -0400
Subject: SH-1381 FIXED Avatar Physics behavior is tightly tied to viewer
 framerate

Changed range of gain; previous range was too small.
---
 indra/newview/llphysicsmotion.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 7d862848b5..e6a7212a47 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -386,7 +386,7 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world)
 
 F32 LLPhysicsMotion::calculateVelocity_local()
 {
-	const F32 world_to_model_scale = 10.0f;
+	const F32 world_to_model_scale = 100.0f;
         LLJoint *joint = mJointState->getJoint();
         const LLVector3 position_world = joint->getWorldPosition();
         const LLQuaternion rotation_world = joint->getWorldRotation();
-- 
cgit v1.2.3


From 175f12350d351570712db03e15c1bc89af677ad8 Mon Sep 17 00:00:00 2001
From: Vadim ProductEngine <vsavchuk@productengine.com>
Date: Fri, 22 Apr 2011 19:07:15 +0300
Subject: STORM-1093 FIX "Dock" icon is still shown after a side panel has been
 docked with Ctrl+Shift+W.

Reason:
When an undocked side tray tab floater got closed with Ctrl+Shift+W,
LLSideTray::setTabDocked() was called. It docked the floater but didn't update
the dock/undock icon.

Fix:
Made setTabDocked() a general purpose method, not a hack suitable for using
only as a floater close callback in the basic viewer mode.
It now updates the dock/undock icon.

Other changes:
* Replaced numerous calls to toggleTabDocked with setDocked(),
  that is safer because does exactly what you want.
* Got rid of a duplicated floater close callback.
---
 indra/newview/llfloatersidetraytab.cpp |  3 +-
 indra/newview/llsidetray.cpp           | 61 ++++++++++++----------------------
 indra/newview/llsidetray.h             |  2 +-
 3 files changed, 24 insertions(+), 42 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
index 94407e6da0..9f15e62d84 100644
--- a/indra/newview/llfloatersidetraytab.cpp
+++ b/indra/newview/llfloatersidetraytab.cpp
@@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
 
 void LLFloaterSideTrayTab::onClose(bool app_quitting)
 {
-	LLSideTray::getInstance()->setTabDocked(getName(), true);
+	// The floater is already being closed, so don't toggle it once more (that may crash viewer).
+	LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false);
 }
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 4f18ee1da2..615899d49f 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -127,8 +127,6 @@ protected:
 	void			undock(LLFloater* floater_tab);
 
 	LLSideTray*		getSideTray();
-
-	void			onFloaterClose(LLSD::Boolean app_quitting);
 	
 public:
 	virtual ~LLSideTrayTab();
@@ -146,7 +144,7 @@ public:
 	
 	void			onOpen		(const LLSD& key);
 	
-	void			toggleTabDocked();
+	void			toggleTabDocked(bool toggle_floater = true);
 	void			setDocked(bool dock);
 	bool			isDocked() const;
 
@@ -160,7 +158,6 @@ private:
 	std::string	mDescription;
 	
 	LLView*	mMainPanel;
-	boost::signals2::connection mFloaterCloseConn;
 };
 
 LLSideTrayTab::LLSideTrayTab(const Params& p)
@@ -196,8 +193,8 @@ BOOL LLSideTrayTab::postBuild()
 	
 	title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
 
-	getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
-	getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
+	getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false));
+	getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true));
 
 	return true;
 }
@@ -253,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray()
 	return side_tray;
 }
 
-void LLSideTrayTab::toggleTabDocked()
+void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */)
 {
+	// *FIX: Calling this method twice per frame would crash the viewer.
+
 	std::string tab_name = getName();
 
 	LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
 	if (!floater_tab) return;
 
-	bool docking = LLFloater::isShown(floater_tab);
+	bool docking = !isDocked();
 
 	// Hide the "Tear Off" button when a tab gets undocked
 	// and show "Dock" button instead.
@@ -278,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked()
 
 	// Open/close the floater *after* we reparent the tab panel,
 	// so that it doesn't receive redundant visibility change notifications.
-	LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
+	if (toggle_floater)
+	{
+		LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
+	}
 }
 
 // Same as toggleTabDocked() apart from making sure that we do exactly what we want.
@@ -298,18 +300,6 @@ bool LLSideTrayTab::isDocked() const
 	return dynamic_cast<LLSideTray*>(getParent()) != NULL;
 }
 
-void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
-{
-	// If user presses Ctrl-Shift-W, handle that gracefully by docking all
-	// undocked tabs before their floaters get destroyed (STORM-1016).
-
-	// Don't dock on quit for the current dock state to be correctly saved.
-	if (app_quitting) return;
-
-	lldebugs << "Forcibly docking tab " << getName() << llendl;
-	setDocked(true);
-}
-
 BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
 	// Let children handle the event
@@ -333,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
 		return;
 	}
 
-	mFloaterCloseConn.disconnect();
 	setRect(side_tray->getLocalRect());
 	reshape(getRect().getWidth(), getRect().getHeight());
 
@@ -382,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
 	}
 
 	floater_tab->addChild(this);
-	mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
 	floater_tab->setTitle(mTabTitle);
 	floater_tab->setName(getName());
 
@@ -510,7 +498,7 @@ public:
 			LLSideTrayTab* tab = side_tray->getTab(getName());
 			if (!tab) return FALSE;
 
-			tab->toggleTabDocked();
+			tab->setDocked(false);
 
 			LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
 			if (!floater_tab) return FALSE;
@@ -681,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
 
 	if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
 	{
-		tab->toggleTabDocked();
+		tab->setDocked(false);
 		tab_attached = false;
 	}
 
@@ -1102,7 +1090,7 @@ void LLSideTray::detachTabs()
 		if (!is_visible) continue;
 
 		llassert(isTabAttached(tab->getName()));
-		tab->toggleTabDocked();
+		tab->setDocked(false);
 	}
 }
 
@@ -1327,8 +1315,9 @@ bool		LLSideTray::isPanelActive(const std::string& panel_name)
 	return (panel->getName() == panel_name);
 }
 
-void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
+void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/)
 {
+	// Lookup tab by name.
 	LLSideTrayTab* tab = getTab(tab_name);
 	if (!tab)
 	{	// not a docked tab, look through detached tabs
@@ -1345,20 +1334,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
 
 	}
 
-	if (tab)
-	{
-		bool tab_attached = isTabAttached(tab_name);
-		LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
-		if (!floater_tab) return;
+	llassert(tab != NULL);
 
-		if (dock && !tab_attached)
-		{
-			tab->dock(floater_tab);
-		}
-		else if (!dock && tab_attached)
-		{
-			tab->undock(floater_tab);
-		}
+	// Toggle its dock state.
+	if (tab && tab->isDocked() != dock)
+	{
+		tab->toggleTabDocked(toggle_floater);
 	}
 }
 
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 1dddd9e9bc..57e4264247 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -121,7 +121,7 @@ public:
     LLPanel*	getActivePanel	();
     bool		isPanelActive	(const std::string& panel_name);
 
-	void		setTabDocked(const std::string& tab_name, bool dock);
+	void		setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true);
 
 	/*
 	 * get the panel of given type T (don't show it or do anything else with it)
-- 
cgit v1.2.3


From 154a465bdaff58023c43bed12b4a049ae72a55df Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 22 Apr 2011 13:17:44 -0400
Subject: dos2unix line ending fix for llphysicsmotion.cpp

---
 indra/newview/llphysicsmotion.cpp | 1476 ++++++++++++++++++-------------------
 1 file changed, 738 insertions(+), 738 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index e6a7212a47..ef0c1a3558 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -1,738 +1,738 @@
-/** 
- * @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_AVATAR_PHYSICS_MOTION 0.f
-#define TIME_ITERATION_STEP 0.1f
-
-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 &param_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();
-        F32 calculateAcceleration_local(F32 velocity_local);
-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_AVATAR_PHYSICS_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 world_to_model_scale = 100.0f;
-        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 positionchange_world = (position_world-last_position_world) * world_to_model_scale;
-        const LLVector3 velocity_world = positionchange_world;
-        const F32 velocity_local = toLocal(velocity_world);
-        return velocity_local;
-}
-
-F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local)
-{
-//        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;
-
-	// Don't update too frequently, to avoid precision errors from small time slices.
-	if (time_delta <= .01)
-	{
-		return FALSE;
-	}
-	
-	// If less than 1FPS, we don't want to be spending time updating physics at all.
-        if (time_delta > 1.0)
-        {
-                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 = FALSE; // Enable this to simulate bouncing on all parts.
-        
-        F32 behavior_maxeffect = getParamValue("MaxEffect");
-        if (physics_test)
-                behavior_maxeffect = 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.
-	const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
-       	
-	//
-	// End parameters and settings
-	////////////////////////////////////////////////////////////////////////////////
-	
-	
-	////////////////////////////////////////////////////////////////////////////////
-	// Calculate velocity and acceleration in parameter space.
-	//
-        
-	//const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
-	const F32 velocity_joint_local = calculateVelocity_local();
-	const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local);
-	
-	//
-	// End velocity and acceleration
-	////////////////////////////////////////////////////////////////////////////////
-	
-	BOOL update_visuals = FALSE;
-	
-	// Break up the physics into a bunch of iterations so that differing framerates will show
-	// roughly the same behavior.
-	for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
-	{
-		F32 time_iteration_step = TIME_ITERATION_STEP;
-		if (time_iteration + TIME_ITERATION_STEP > time_delta)
-		{
-			time_iteration_step = time_delta-time_iteration;
-		}
-		
-		// mPositon_local should be in normalized 0,1 range already.  Just making sure...
-		const F32 position_current_local = llclamp(mPosition_local,
-							   0.0f,
-							   1.0f);
-		// 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 update_visuals;
-		}
-
-		////////////////////////////////////////////////////////////////////////////////
-		// 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 = (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_velocity = 100.0f; // magic number, used to be customizable.
-		F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step;
-		velocity_new_local = llclamp(velocity_new_local, 
-					     -max_velocity, max_velocity);
-        
-		// 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_iteration_step;
-		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;
-			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.
-        
-		// 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.0001f-lod_factor)*0.4f;
-			if (llabs(position_diff_local) > min_delta)
-			{
-				update_visuals = TRUE;
-				mPositionLastUpdate_local = position_new_local;
-			}
-		}
-
-		//
-		// End update visual params
-		////////////////////////////////////////////////////////////////////////////////
-
-		mVelocity_local = velocity_new_local;
-		mAccelerationJoint_local = acceleration_joint_local;
-		mPosition_local = position_new_local;
-	}
-	mLastTime = time;
-	mPosition_world = joint->getWorldPosition();
-	mVelocityJoint_local = velocity_joint_local;
-
-
-        /*
-          // 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=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_AVATAR_PHYSICS_MOTION 0.f
+#define TIME_ITERATION_STEP 0.1f
+
+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 &param_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();
+        F32 calculateAcceleration_local(F32 velocity_local);
+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_AVATAR_PHYSICS_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 world_to_model_scale = 100.0f;
+        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 positionchange_world = (position_world-last_position_world) * world_to_model_scale;
+        const LLVector3 velocity_world = positionchange_world;
+        const F32 velocity_local = toLocal(velocity_world);
+        return velocity_local;
+}
+
+F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local)
+{
+//        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;
+
+	// Don't update too frequently, to avoid precision errors from small time slices.
+	if (time_delta <= .01)
+	{
+		return FALSE;
+	}
+	
+	// If less than 1FPS, we don't want to be spending time updating physics at all.
+        if (time_delta > 1.0)
+        {
+                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 = FALSE; // Enable this to simulate bouncing on all parts.
+        
+        F32 behavior_maxeffect = getParamValue("MaxEffect");
+        if (physics_test)
+                behavior_maxeffect = 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.
+	const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
+       	
+	//
+	// End parameters and settings
+	////////////////////////////////////////////////////////////////////////////////
+	
+	
+	////////////////////////////////////////////////////////////////////////////////
+	// Calculate velocity and acceleration in parameter space.
+	//
+        
+	//const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
+	const F32 velocity_joint_local = calculateVelocity_local();
+	const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local);
+	
+	//
+	// End velocity and acceleration
+	////////////////////////////////////////////////////////////////////////////////
+	
+	BOOL update_visuals = FALSE;
+	
+	// Break up the physics into a bunch of iterations so that differing framerates will show
+	// roughly the same behavior.
+	for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
+	{
+		F32 time_iteration_step = TIME_ITERATION_STEP;
+		if (time_iteration + TIME_ITERATION_STEP > time_delta)
+		{
+			time_iteration_step = time_delta-time_iteration;
+		}
+		
+		// mPositon_local should be in normalized 0,1 range already.  Just making sure...
+		const F32 position_current_local = llclamp(mPosition_local,
+							   0.0f,
+							   1.0f);
+		// 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 update_visuals;
+		}
+
+		////////////////////////////////////////////////////////////////////////////////
+		// 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 = (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_velocity = 100.0f; // magic number, used to be customizable.
+		F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step;
+		velocity_new_local = llclamp(velocity_new_local, 
+					     -max_velocity, max_velocity);
+        
+		// 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_iteration_step;
+		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;
+			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.
+        
+		// 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.0001f-lod_factor)*0.4f;
+			if (llabs(position_diff_local) > min_delta)
+			{
+				update_visuals = TRUE;
+				mPositionLastUpdate_local = position_new_local;
+			}
+		}
+
+		//
+		// End update visual params
+		////////////////////////////////////////////////////////////////////////////////
+
+		mVelocity_local = velocity_new_local;
+		mAccelerationJoint_local = acceleration_joint_local;
+		mPosition_local = position_new_local;
+	}
+	mLastTime = time;
+	mPosition_world = joint->getWorldPosition();
+	mVelocityJoint_local = velocity_joint_local;
+
+
+        /*
+          // 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);
+}
-- 
cgit v1.2.3


From d4b9db012e2b5195759f694792c392770112b42d Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Tue, 26 Apr 2011 15:04:22 -0700
Subject: FIX VWR-25609: crash on shutdown in LLGLNamePool::sInstances
 destructor

---
 indra/newview/llspatialpartition.cpp | 2 --
 1 file changed, 2 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8adb8c30e0..94784f3f49 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -1635,8 +1635,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
 	mSlopRatio = 0.25f;
 	mInfiniteFarClip = FALSE;
 
-	LLGLNamePool::registerPool(&sQueryPool);
-
 	mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0), 
 											LLVector3d(1,1,1), 
 											NULL);
-- 
cgit v1.2.3


From 5b29bd3660852cdca3416ba779fbfdc032f8f222 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Mon, 2 May 2011 17:12:16 -0700
Subject: sync up with viewer-development

---
 .../skins/default/xui/en/widgets/avatar_icon.xml       |  1 +
 .../skins/default/xui/en/widgets/scroll_bar.xml        | 18 +++++++++++-------
 2 files changed, 12 insertions(+), 7 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
index a1e32e44de..4d69dda7eb 100644
--- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 
 <avatar_icon
+    name="avatar_icon"
     default_icon_name="Generic_Person_Large"
     use_draw_context_alpha="false">
 </avatar_icon>
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
index 830ea12e41..e6d4bff8b5 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
@@ -6,20 +6,24 @@
 			track_color="ScrollbarTrackColor"
             thumb_color="ScrollbarThumbColor"
             thickness="15">
-  <up_button image_unselected="ScrollArrow_Up"
+  <up_button name="up_button"
+             image_unselected="ScrollArrow_Up"
              image_selected="ScrollArrow_Up"
              scale_image="true"
              hover_glow_amount="0.35"/>
-  <down_button image_unselected="ScrollArrow_Down"
+  <down_button name="down_button"
+               image_unselected="ScrollArrow_Down"
                image_selected="ScrollArrow_Down"
                scale_image="true"
                hover_glow_amount="0.35"/>
-  <left_button image_unselected="ScrollArrow_Left"
+  <left_button name="left_button" 
+               image_unselected="ScrollArrow_Left"
                image_selected="ScrollArrow_Left"
                scale_image="true"
                hover_glow_amount="0.35"/>
-  <right_button image_unselected="ScrollArrow_Right"
-               image_selected="ScrollArrow_Right"
-               scale_image="true"
-               hover_glow_amount="0.35"/>
+  <right_button name="right_button"
+                image_unselected="ScrollArrow_Right"
+                image_selected="ScrollArrow_Right"
+                scale_image="true"
+                hover_glow_amount="0.35"/>
 </scroll_bar>
-- 
cgit v1.2.3


From 6431f7fb287d357f9800aac7ce5496c7a7cd063f Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Mon, 2 May 2011 17:14:53 -0700
Subject: WIP VWR-25074 add missing string in English, pending actual Danish
 translation

---
 indra/newview/skins/default/xui/da/notifications.xml | 1 +
 1 file changed, 1 insertion(+)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index a3c4897ee1..376538872f 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -748,6 +748,7 @@ Prøv venligst igen senere.
 		[OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME].
 	</notification>
 	<notification name="OfferTeleport">
+		Offer a teleport to your location with the following message?
 		<form name="form">
 			<input name="message">
 				Mød mig i [REGION]
-- 
cgit v1.2.3


From 8f720b59d35d172b0a34ff73c7724d9bae258aa2 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Mon, 2 May 2011 20:49:47 -0400
Subject: CHOP-599: if build.sh creates summary.json, package it with viewer.
 Recent versions of the viewer's build-dependent build.sh create and upload a
 summary.json file in the top level of the source repository checkout. Bundle
 that into the viewer installer. This is the one file that contains the
 viewer's version.

---
 indra/newview/viewer_manifest.py | 10 ++++++++++
 1 file changed, 10 insertions(+)

(limited to 'indra/newview')

diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index f671c770ea..450d274fd7 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -114,6 +114,16 @@ class ViewerManifest(LLManifest):
             # Files in the newview/ directory
             self.path("gpu_table.txt")
 
+            # The summary.json file gets left in the base checkout dir by
+            # build.sh. It's only created for a build.sh build, therefore we
+            # have to check whether it exists.  :-P
+            summary_json = "summary.json"
+            summary_json_path = os.path.join(os.pardir, os.pardir, summary_json)
+            if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)):
+                self.path(summary_json_path, summary_json)
+            else:
+                print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path)
+
     def login_channel(self):
         """Channel reported for login and upgrade purposes ONLY;
         used for A/B testing"""
-- 
cgit v1.2.3


From 76221ab9b3d5e4a185dfdfeb39719724739566ab Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Tue, 3 May 2011 11:55:21 -0700
Subject: FIX VWR-25074 add missing Danish translation

---
 indra/newview/skins/default/xui/da/notifications.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 376538872f..30b54d3eb2 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -748,7 +748,7 @@ Prøv venligst igen senere.
 		[OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME].
 	</notification>
 	<notification name="OfferTeleport">
-		Offer a teleport to your location with the following message?
+		Tilbyd en teleport til din position med følgende besked?
 		<form name="form">
 			<input name="message">
 				Mød mig i [REGION]
-- 
cgit v1.2.3


From af6a5b1f40ff0f0a8f0d10f609fa27da7e40959d Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Tue, 3 May 2011 16:37:12 -0700
Subject: FIX VWR-22337 translation (in utf-8) for "loading terms of service"
 string

---
 indra/newview/skins/default/xui/da/floater_tos.xml | 2 +-
 indra/newview/skins/default/xui/de/floater_tos.xml | 2 +-
 indra/newview/skins/default/xui/es/floater_tos.xml | 2 +-
 indra/newview/skins/default/xui/fr/floater_tos.xml | 2 +-
 indra/newview/skins/default/xui/pl/floater_tos.xml | 2 +-
 indra/newview/skins/default/xui/pt/floater_tos.xml | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 760f60c996..af9ee0bd06 100644
--- a/indra/newview/skins/default/xui/da/floater_tos.xml
+++ b/indra/newview/skins/default/xui/da/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Fortsæt" label_selected="Fortsæt" name="Continue"/>
 	<button label="Annullér" label_selected="Annullér" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml
index 1f3ef2f0b4..ba329371f8 100644
--- a/indra/newview/skins/default/xui/de/floater_tos.xml
+++ b/indra/newview/skins/default/xui/de/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Weiter" label_selected="Weiter" name="Continue"/>
 	<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index f4a0897d73..89092201d9 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Continuar" label_selected="Continuar" name="Continue"/>
 	<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml
index 8a2a1e1d25..6d58cf77ca 100644
--- a/indra/newview/skins/default/xui/fr/floater_tos.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Continuer" label_selected="Continuer" name="Continue"/>
 	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml
index bb2de773f0..8cdf267f4b 100644
--- a/indra/newview/skins/default/xui/pl/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Ładowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/>
 	<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 2675979783..c4954cb61f 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Continuar" label_selected="Continuar" name="Continue"/>
 	<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
-- 
cgit v1.2.3


From 36938bd6e28b76a845b05d10231b4f9f9f8a1b96 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Wed, 4 May 2011 14:53:22 -0700
Subject: FIX VWR-19022 ES linguistic

---
 indra/newview/skins/default/xui/es/menu_favorites.xml             | 2 +-
 indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml   | 2 +-
 indra/newview/skins/default/xui/es/menu_teleport_history_item.xml | 2 +-
 indra/newview/skins/minimal/xui/es/menu_favorites.xml             | 2 +-
 indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml   | 2 +-
 indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml
index c8a7858ddb..85210d5c49 100644
--- a/indra/newview/skins/default/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="Popup">
-	<menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+	<menu_item_call label="Teleportar" name="Teleport To Landmark"/>
 	<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
 	<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
 	<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
index bee4c61da2..82fc8ddd39 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -4,7 +4,7 @@
 	<menu_item_call label="Añadir como amigo" name="add_friend"/>
 	<menu_item_call label="MI" name="im"/>
 	<menu_item_call label="Llamada" name="call"/>
-	<menu_item_call label="Teleportarse" name="teleport"/>
+	<menu_item_call label="Teleportar" name="teleport"/>
 	<menu_item_call label="Invitar al grupo" name="invite_to_group"/>
 	<menu_item_call label="Ignorar" name="block"/>
 	<menu_item_call label="Designorar" name="unblock"/>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
index ed33c55aca..c482907812 100644
--- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <context_menu name="Teleport History Item Context Menu">
-	<menu_item_call label="Teleportarse" name="Teleport"/>
+	<menu_item_call label="Teleportar" name="Teleport"/>
 	<menu_item_call label="Más información" name="More Information"/>
 	<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
 </context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
index c8a7858ddb..85210d5c49 100644
--- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="Popup">
-	<menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+	<menu_item_call label="Teleportar" name="Teleport To Landmark"/>
 	<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
 	<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
 	<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
index ebe33cea11..b4b964d096 100644
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
@@ -3,7 +3,7 @@
 	<menu_item_call label="Ver el perfil" name="view_profile"/>
 	<menu_item_call label="Añadir como amigo" name="add_friend"/>
 	<menu_item_call label="MI" name="im"/>
-	<menu_item_call label="Teleportarse" name="teleport"/>
+	<menu_item_call label="Teleportar" name="teleport"/>
 	<menu_item_call label="Ignorar" name="block"/>
 	<menu_item_call label="Designorar" name="unblock"/>
 	<menu_item_call label="Denunciar" name="report"/>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
index ed33c55aca..c482907812 100644
--- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <context_menu name="Teleport History Item Context Menu">
-	<menu_item_call label="Teleportarse" name="Teleport"/>
+	<menu_item_call label="Teleportar" name="Teleport"/>
 	<menu_item_call label="Más información" name="More Information"/>
 	<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
 </context_menu>
-- 
cgit v1.2.3


From 343ffb9d512702fff76e542575a0eff79ea62204 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Thu, 5 May 2011 19:23:55 -0400
Subject: Remove Pth library from viewer build. This library was only needed on
 the Mac, and only with the OS X 10.4 SDK. As of October 2010, we no longer
 build the viewer with that SDK. The 10.5 SDK we're currently using directly
 supports the functionality for which we originally brought in Pth.

---
 indra/newview/licenses-mac.txt                     | 510 ---------------------
 .../newview/skins/default/xui/en/floater_about.xml |   1 -
 2 files changed, 511 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt
index 1324fa1a86..af80bff5d9 100644
--- a/indra/newview/licenses-mac.txt
+++ b/indra/newview/licenses-mac.txt
@@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young
 Hudson (tjh@cryptsoft.com).
 
 
-===========
-Pth License
-===========
-   ____  _   _
-  |  _ \| |_| |__               ``Ian Fleming was a UNIX fan!
-  | |_) | __| '_ \                How do I know? Well, James Bond
-  |  __/| |_| | | |               had the (license to kill) number 007,
-  |_|    \__|_| |_|               i.e., he could execute anyone!''
-
-  GNU Pth - The GNU Portable Threads
-
-  LICENSE
-  =======
-
-  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; either version 2.1 of the
-  License, or (at your option) any later version.
-
-  For some people, it is not clear, what is the real intention of the
-  author by using the GNU Lesser General Public License (LGPL) as the
-  distribution license for GNU Pth. This is, because the LGPL and the
-  GPL can be (and are often) interpreted very differently and some
-  interpretations seem to be not compatible with others. So an explicit
-  clarification for the use of the LGPL for GNU Pth from the authors
-  point of view might be useful.
-
-  The author places this library under the LGPL to make sure that it
-  can be used both commercially and non-commercially provided that
-  modifications to the code base are always donated back to the official
-  code base under the same license conditions. Please keep in mind that
-  especially using this library in code not staying under the GPL or
-  the LGPL _is_ allowed and that any taint or license creap into code
-  that uses the library is not the authors intention. It is just the
-  case that _including_ this library into the source tree of other
-  applications is a little bit more inconvinient because of the LGPL.
-  But it has to be this way for good reasons. And keep in mind that
-  inconvinient doesn't mean not allowed or even impossible.
-
-  Even if you want to use this library in some BSD-style licensed
-  packages, this _is_ possible as long as you are a little bit
-  carefully. Usually this means you have to make sure that the code is
-  still clearly separated into the source tree and that modifications to
-  this source area are done under the conditions of the LGPL. Read below
-  for more details on the conditions. Contact the author if you have
-  more questions.
-
-  The license text of the GNU Lesser General Public License follows:
-  __________________________________________________________________________
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                            NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-
 =======================
 Original SSLeay License
 =======================
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index f5365be11f..6a1a600696 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -150,7 +150,6 @@ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (U
 jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
 ogg/vorbis Copyright (C) 2001, Xiphophorus
 OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
 SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
 SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-- 
cgit v1.2.3


From 165c72d576812c7adcf4cb7b2d1d359a60e14d06 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Thu, 5 May 2011 17:32:42 -0700
Subject: FIX VWR-22356 ES layout

---
 indra/newview/skins/default/xui/es/panel_region_terrain.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
index 903b826a0b..98b10e4895 100644
--- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
@@ -8,7 +8,7 @@
 	</text>
 	<spinner label="Nivel del agua" name="water_height_spin"/>
 	<button label="?" name="water_height_help"/>
-	<spinner label="Límite de elevación del &#10;terreno" name="terrain_raise_spin"/>
+	<spinner label="Límite de elevación &#10;del terreno" name="terrain_raise_spin"/>
 	<button label="?" name="terrain_raise_help"/>
 	<spinner label="Límite de bajada del &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
 	<button label="?" name="terrain_lower_help"/>
-- 
cgit v1.2.3


From 099d1795e567636baa273b3411d6c264b7524964 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Fri, 6 May 2011 15:34:01 -0700
Subject: FIX VWR-23615 en_xui_change es it resizing

---
 .../skins/default/xui/en/floater_preview_gesture.xml   |  4 ++--
 .../skins/default/xui/es/floater_preview_gesture.xml   | 18 +++++++++---------
 .../skins/default/xui/it/floater_preview_gesture.xml   |  4 ++--
 3 files changed, 13 insertions(+), 13 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index a17cf8eea8..9f6199fada 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -120,14 +120,14 @@
      font.style="BOLD"
      name="key_label"
      top_pad="10"
-     width="150">
+     width="130">
         Shortcut Key:
     </text>
     <combo_box
      height="20"
      label="None"
      layout="topleft"
-     left_delta="154"
+     left_delta="135"
      name="modifier_combo"
      top_delta="-4"
      width="55" />
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
index c58eb227aa..bd13262dcd 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
@@ -30,15 +30,15 @@
 	<text name="trigger_label">
 		Palabra clave:
 	</text>
-	<text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
+	<text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
 		Reemplazar por:
 	</text>
 	<line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto."/>
 	<text name="key_label">
 		Atajo de teclado:
 	</text>
-	<combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/>
-	<combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/>
+	<combo_box label="Ninguno" name="modifier_combo" width="76"/>
+	<combo_box label="Ninguno" name="key_combo" width="50"/>
 	<text name="library_label">
 		Biblioteca:
 	</text>
@@ -55,20 +55,20 @@
 	<button label="Arriba" name="up_btn"/>
 	<button label="Abajo" name="down_btn"/>
 	<button label="Quitar" name="delete_btn"/>
-	<text left="230" name="options_text" width="200">
+	<text name="options_text" width="200">
 		(opciones)
 	</text>
 	<radio_group name="animation_trigger_type">
 		<radio_item label="Empezar" name="start"/>
 		<radio_item label="Parar" name="stop"/>
 	</radio_group>
-	<check_box bottom_delta="34" label="hasta que las animaciones  estén hechas" name="wait_anim_check"/>
-	<check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/>
-	<line_editor left_delta="130" name="wait_time_editor"/>
+	<check_box label="hasta que las animaciones  estén hechas" name="wait_anim_check"/>
+	<check_box label="tiempo en segundos:" name="wait_time_check"/>
+	<line_editor name="wait_time_editor"/>
 	<text name="help_label">
 		Todos los pasos suceden a la vez, a menos que añadas pasos de espera.
 	</text>
-	<check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
-	<button label="Vista previa" name="preview_btn" width="85"/>
+	<check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
+	<button label="Vista previa" name="preview_btn" width="82"/>
 	<button label="Guardar" name="save_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
index 7e29db6336..2172b9848b 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
@@ -34,10 +34,10 @@
 		Sostituisci con:
 	</text>
 	<line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave &apos;salve&apos; con &apos;ciao&apos; modificherà la chat &apos;Volevo solo dire salve&apos; in &apos;Volevo solo dire ciao&apos; e avvierà la gesture!"/>
-	<text name="key_label">
+	<text name="key_label" width="147">
 		Scorciatoia da tastiera:
 	</text>
-	<combo_box label="Nessuno" name="modifier_combo" />
+	<combo_box left_delta="150" label="Nessuno" name="modifier_combo" />
 	<combo_box label="Nessuno" name="key_combo" />
 	<text name="library_label">
 		Libreria:
-- 
cgit v1.2.3


From e0849adec775e5d73d2e3fc068fe8ba54cea443f Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Fri, 6 May 2011 16:29:40 -0700
Subject: WIP VWR-23688

---
 indra/newview/skins/default/xui/pt/notifications.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 4adfe8e37f..0786a62f13 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -2730,7 +2730,7 @@ O botão será exibido quando houver espaço suficente.
 		Selecione os residentes com quem compartilhar.
 	</notification>
 	<notification name="ShareItemsConfirmation">
-		Tem certeza de que quer compartilhar os items abaixo?
+		Tem certeza de que quer compartilhar os itens abaixo?
 
 &lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
 
-- 
cgit v1.2.3


From bb781cbef7e8ce0925d57b158438270572921c9a Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Fri, 6 May 2011 17:27:50 -0700
Subject: FIX VWR-23696 remove old parameter overrides

---
 indra/newview/skins/default/xui/pt/floater_pay.xml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 26d5710c4a..8094ad376c 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -6,18 +6,18 @@
 	<string name="payee_resident">
 		Pagar residente
 	</string>
-	<text left="5" name="payee_label" width="110">
+	<text left="5" name="payee_label">
 		Pagar:
 	</text>
 	<icon name="icon_person" tool_tip="Pessoa"/>
-	<text left="115" name="payee_name">
+	<text name="payee_name">
 		Test Name That Is Extremely Long To Check Clipping
 	</text>
-	<button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/>
+	<button label="L$1" label_selected="L$1" name="fastpay 1"/>
 	<button label="L$5" label_selected="L$5" name="fastpay 5"/>
-	<button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/>
+	<button label="L$10" label_selected="L$10" name="fastpay 10"/>
 	<button label="L$20" label_selected="L$20" name="fastpay 20"/>
-	<text left="4" name="amount text">
+	<text name="amount text">
 		Outro valor:
 	</text>
 	<button label="Pagar" label_selected="Pagar" name="pay btn"/>
-- 
cgit v1.2.3


From 5544c184664b8604204f6a5cf2cd7b151b79a69e Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Fri, 6 May 2011 17:54:58 -0700
Subject: WIP VWR-24160 en_xui_change accommodate longest string

---
 indra/newview/skins/default/xui/en/panel_preferences_chat.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

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 404537e1f2..cdc462109c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -150,7 +150,7 @@
      top_pad="20" 
      left="30" 
      height="10"
-     width="180">
+     width="400">
       Enable incoming chat popups:
       </text>
     <check_box
-- 
cgit v1.2.3