From 435117e8121f09bf43c80900fed13856a3a85825 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 67bb139a5e..4f6b155fa0 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -451,7 +451,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 cf5b96bdededdac0dd00e88ce045ab6f32878869 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 13 Apr 2011 15:21:16 -0400
Subject: SH-1365 FIXED Avatar Physics don't behave well for less than 100% max
 effect

This change looks more complicated than it actually is.  I basically turned max effect into a scaling parameter, versus a clamping parameter.  Piece of cake, just moved some code around and made minor logic changes.
---
 indra/newview/llphysicsmotion.cpp | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index 4f6b155fa0..de4ce52351 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -127,7 +127,8 @@ protected:
                 return mCharacter->getVisualParamWeight(param_name.c_str());
         }
         void setParamValue(LLViewerVisualParam *param,
-                           const F32 new_value_local);
+                           const F32 new_value_local,
+						   F32 behavior_maxeffect);
 
         F32 toLocal(const LLVector3 &world);
         F32 calculateVelocity_local(const F32 time_delta);
@@ -485,9 +486,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         F32 behavior_maxeffect = getParamValue("MaxEffect");
         if (physics_test)
                 behavior_maxeffect = 1.0f;
-        // Maximum effect is [0,1] range.
-        const F32 min_val = 0.5f-behavior_maxeffect/2.0;
-        const F32 max_val = 0.5f+behavior_maxeffect/2.0;
 
         // mPositon_local should be in normalized 0,1 range already.  Just making sure...
         F32 position_current_local = llclamp(mPosition_local,
@@ -585,12 +583,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
             position_new_local = position_user_local;
 
         // Zero out the velocity if the param is being pushed beyond its limits.
-        if ((position_new_local < min_val && velocity_new_local < 0) || 
-            (position_new_local > max_val && velocity_new_local > 0))
+        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) ||
@@ -608,8 +606,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 	}
 
         const F32 position_new_local_clamped = llclamp(position_new_local,
-						       min_val,
-						       max_val);
+						       0.0f,
+						       1.0f);
 
         LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
         llassert_always(driver_param);
@@ -630,7 +628,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
                 {
                         LLDrivenEntry &entry = (*iter);
                         LLViewerVisualParam *driven_param = entry.mParam;
-                        setParamValue(driven_param,position_new_local_clamped);
+                        setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);
                 }
         }
         
@@ -712,12 +710,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 
 // Range of new_value_local is assumed to be [0 , 1] normalized.
 void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param,
-                                    F32 new_value_normalized)
+                                    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;
 
-        const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized;
+	// 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,
-- 
cgit v1.2.3


From 172bca783f94489fbf3ec68dfdc5f7851910b337 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 b85eb8ce332083adcfe2fe704b78f82695d0e512 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 f8460e059d..ec162e3608 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -11916,7 +11916,7 @@ render_pass="bump">
      edit_group="physics_breasts_updown"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -11971,7 +11971,7 @@ render_pass="bump">
      edit_group="physics_breasts_inout"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12058,7 +12058,7 @@ render_pass="bump">
      edit_group="physics_belly_updown"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12144,7 +12144,7 @@ render_pass="bump">
      edit_group="physics_butt_updown"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12193,7 +12193,7 @@ render_pass="bump">
      edit_group="physics_butt_leftright"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12244,7 +12244,7 @@ render_pass="bump">
      edit_group="physics_breasts_leftright"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
-- 
cgit v1.2.3


From 5354ad68d3709f9475be7f559942b9124609394c 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 dab937ef5b18547ecdaf0abb7a0e86ba0fa0ad0e 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 6715603b6a991f822274b000e5d8fb9b8d405464 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 958a0601729dc154dfeb0bd3d54c7aa8e2d5379a 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 d98f0da1c2..cac7df56e4 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 6c2c4e5b10..5c4d006288 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -475,7 +475,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 abc3558f18189e1bda7016ef39ddcd9b17075266 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 91409d40cb4171815b7ef9f767dc5c5e8d5f3e44 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 8b0640704d58984efd0d54e3350d21e9f5845c85 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 5c4d006288..e4335d968f 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -43,7 +43,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)
 {
@@ -453,7 +454,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;
@@ -481,195 +483,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 9c6dd947bd94a863d3c3d6e6bd38fa7d06bfc924 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 ec162e3608..ce15c4b8f7 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 e4335d968f..7c199085c0 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -126,9 +126,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;
@@ -379,19 +378,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
@@ -483,7 +483,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)
@@ -491,46 +515,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 
 		//
@@ -547,7 +545,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
@@ -575,10 +573,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)
@@ -604,8 +602,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;
@@ -674,16 +670,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 af6f2c8b2291a3ac43de899b8520a89e5ecc2657 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 7c199085c0..6851e7bb1a 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -380,7 +380,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