From 27c855149e657cebda863e279c8545f7816e1c18 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 23 Aug 2010 13:36:28 -0400
Subject: First pass commit for breast physics.

---
 indra/llmath/v3math.cpp                            |  15 +
 indra/llmath/v3math.h                              |   1 +
 indra/newview/character/avatar_lad.xml             | 292 ++++++++++++++-
 indra/newview/llagentcamera.cpp                    |   1 +
 indra/newview/llpaneleditwearable.cpp              |  19 +-
 indra/newview/llpaneleditwearable.h                |  10 +-
 indra/newview/llpolymesh.cpp                       |   6 +
 indra/newview/llpolymorph.cpp                      |  16 +-
 indra/newview/llsidepanelappearance.cpp            |  22 +-
 indra/newview/llsidepanelappearance.h              |   5 +-
 indra/newview/llviewermenu.cpp                     |  16 +
 indra/newview/llvoavatar.cpp                       | 395 ++++++++++++++++++++-
 indra/newview/llvoavatar.h                         |   1 +
 .../skins/default/xui/en/menu_attachment_self.xml  |   8 +
 .../skins/default/xui/en/menu_avatar_self.xml      |   8 +
 .../skins/default/xui/en/panel_edit_shape.xml      |  14 +
 indra/newview/skins/default/xui/en/strings.xml     |  14 +
 17 files changed, 807 insertions(+), 36 deletions(-)

(limited to 'indra')

diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp
index fd08df02d8..18b15e08c4 100644
--- a/indra/llmath/v3math.cpp
+++ b/indra/llmath/v3math.cpp
@@ -134,6 +134,21 @@ BOOL LLVector3::clampLength( F32 length_limit )
 	return changed;
 }
 
+BOOL LLVector3::clamp(const LLVector3 &min_vec, const LLVector3 &max_vec)
+{
+	BOOL ret = FALSE;
+
+	if (mV[0] < min_vec[0]) { mV[0] = min_vec[0]; ret = TRUE; }
+	if (mV[1] < min_vec[1]) { mV[1] = min_vec[1]; ret = TRUE; }
+	if (mV[2] < min_vec[2]) { mV[2] = min_vec[2]; ret = TRUE; }
+
+	if (mV[0] > max_vec[0]) { mV[0] = max_vec[0]; ret = TRUE; }
+	if (mV[1] > max_vec[1]) { mV[1] = max_vec[1]; ret = TRUE; }
+	if (mV[2] > max_vec[2]) { mV[2] = max_vec[2]; ret = TRUE; }
+
+	return ret;
+}
+
 
 // Sets all values to absolute value of their original values
 // Returns TRUE if data changed
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index dbd38c1c3f..d3fc6fcb2f 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -69,6 +69,7 @@ class LLVector3
 
 		inline BOOL isFinite() const;									// checks to see if all values of LLVector3 are finite
 		BOOL		clamp(F32 min, F32 max);		// Clamps all values to (min,max), returns TRUE if data changed
+		BOOL		clamp(const LLVector3 &min_vec, const LLVector3 &max_vec); // Scales vector by another vector
 		BOOL		clampLength( F32 length_limit );					// Scales vector to limit length to a value
 
 		void		quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz);	// changes the vector to reflect quatization
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index a9b4ff02c5..cdb3684034 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -612,7 +612,7 @@
      id="36"
      group="0"
      name="Shoulders"
-   label="Shoulders"
+     label="Shoulders"
      wearable="shape"
      edit_group="shape_torso"
      edit_group_order="4"
@@ -4047,11 +4047,10 @@
      id="507"
      group="0"
      sex="female"
-     name="Breast_Gravity"
+     name="Breast_Gravity_Driven"
      label="Breast Buoyancy"
      wearable="shape"
-     edit_group="shape_torso"
-     edit_group_order="7"
+     edit_group="driven"
      label_min="Less Gravity"
      label_max="More Gravity"
      value_default="0"
@@ -4116,11 +4115,10 @@
      id="684"
      group="0"
      sex="female"
-     name="Breast_Female_Cleavage"
+     name="Breast_Female_Cleavage_Driven"
      label="Breast Cleavage"
      wearable="shape"
-     edit_group="shape_torso"
-     edit_group_order="8"
+     edit_group="driven"
      label_min="Separate"
      label_max="Join"
      value_default="0"
@@ -9074,12 +9072,290 @@ render_pass="bump">
 
   <!-- =========================================================== -->
   <driver_parameters>
+
+    <param
+     id="1074"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Mass"
+     label="Breast Physics Mass"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="1"
+     value_min="1"
+     value_max="5"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1075"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Smoothing"
+     label="Breast Physics Smoothing"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="2"
+     value_min="1"
+     value_max="10"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1076"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Gravity"
+     label="Breast Physics Gravity"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="2"
+     value_min="0"
+     value_max="10"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1077"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Side_Spring"
+     label="Breast Physics Side Spring"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="3"
+     value_min="0"
+     value_max="5"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1078"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Side_Bounce"
+     label="Breast Physics Side Bounce"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="10"
+     value_min="0"
+     value_max="100"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1079"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Side_Damping"
+     label="Breast Physics Side Damping"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default=".5"
+     value_min="0"
+     value_max="1"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+   <param
+     id="1080"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Side_Drag"
+     label="Breast Physics Side Drag"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default=".1"
+     value_min="0"
+     value_max="1"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+   <param
+     id="1081"
+     group="0"
+     sex="female"
+     name="Breast_Physics_Side_Range"
+     label="Breast Physics Side Range"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="10"
+     value_min="0"
+     value_max="100"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+
+    <param
+     id="1082"
+     group="0"
+     sex="female"
+     name="Breast_Physics_UpDown_Spring"
+     label="Breast Physics UpDown Spring"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="1.5"
+     value_min="0"
+     value_max="5"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1083"
+     group="0"
+     sex="female"
+     name="Breast_Physics_UpDown_Bounce"
+     label="Breast Physics UpDown Bounce"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="50"
+     value_min="0"
+     value_max="100"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+    <param
+     id="1084"
+     group="0"
+     sex="female"
+     name="Breast_Physics_UpDown_Damping"
+     label="Breast Physics UpDown Damping"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default=".1"
+     value_min="0"
+     value_max="1"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+   <param
+     id="1085"
+     group="0"
+     sex="female"
+     name="Breast_Physics_UpDown_Drag"
+     label="Breast Physics UpDown Drag"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default=".1"
+     value_min="0"
+     value_max="1"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+   <param
+     id="1086"
+     group="0"
+     sex="female"
+     name="Breast_Physics_UpDown_Range"
+     label="Breast Physics UpDown Range"
+     wearable="shape"
+     edit_group="shape_physics"
+     label_min="Less"
+     label_max="More"
+     value_default="10"
+     value_min="0"
+     value_max="100"
+     camera_elevation=".3"
+     camera_distance=".8">
+	 <param_driver />
+    </param>
+
+   <param
+     id="1087"
+     group="0"
+     sex="female"
+     name="Breast_Female_Cleavage"
+     label="Breast Cleavage"
+     wearable="shape"
+     edit_group="shape_torso"
+     label_min="Less"
+     label_max="More"
+     value_default="10"
+     value_min="-.3"
+     value_max="1.3"
+     camera_elevation=".3"
+     camera_distance=".8">
+      <param_driver>
+        <driven
+         id="684" />
+	</param_driver>
+    </param>
+
+   <param
+     id="1088"
+     group="0"
+     sex="female"
+     name="Breast_Gravity"
+     label="Breast Buoyancy"
+     wearable="shape"
+     edit_group="shape_torso"
+     label_min="Less"
+     label_max="More"
+     value_default="10"
+     value_min="-1.5"
+     value_max="2"
+     camera_elevation=".3"
+     camera_distance=".8">
+      <param_driver>
+        <driven
+         id="507" />
+	</param_driver>
+    </param>
+
     <param
      id="828"
      group="0"
      name="Loose Upper Clothing"
      label="Shirt Fit"
-   show_simple="true"
+	 show_simple="true"
      wearable="shirt"
      edit_group="shirt"
      edit_group_order="4"
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 68e408d3e4..01a4cce700 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -277,6 +277,7 @@ LLAgentCamera::~LLAgentCamera()
 //-----------------------------------------------------------------------------
 void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
 {
+	if (TRUE) return; // SERAPH DON'T CHECKIN
 	if (gAgent.getAutoPilot())
 	{
 		gAgent.stopAutoPilot(TRUE);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 90ed8b9e58..bfe3aa0e61 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -72,6 +72,7 @@ enum ESubpart {
 	SUBPART_SHAPE_MOUTH,
 	SUBPART_SHAPE_CHIN,
 	SUBPART_SHAPE_TORSO,
+	SUBPART_SHAPE_PHYSICS,
 	SUBPART_SHAPE_LEGS,
 	SUBPART_SHAPE_WHOLE,
 	SUBPART_SHAPE_DETAIL,
@@ -218,7 +219,7 @@ LLEditWearableDictionary::Wearables::Wearables()
 	// note the subpart that is listed first is treated as "default", regardless of what order is in enum.
 	// Please match the order presented in XUI. -Nyx
 	// this will affect what camera angle is shown when first editing a wearable
-	addEntry(LLWearableType::WT_SHAPE, 		new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9,	SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD,	SUBPART_SHAPE_EYES,	SUBPART_SHAPE_EARS,	SUBPART_SHAPE_NOSE,	SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS ));
+	addEntry(LLWearableType::WT_SHAPE, 		new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,10,	SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD,	SUBPART_SHAPE_EYES,	SUBPART_SHAPE_EARS,	SUBPART_SHAPE_NOSE,	SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_PHYSICS));
 	addEntry(LLWearableType::WT_SKIN, 		new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
 	addEntry(LLWearableType::WT_HAIR, 		new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR,	SUBPART_HAIR_STYLE,	SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
 	addEntry(LLWearableType::WT_EYES, 		new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES));
@@ -278,6 +279,7 @@ LLEditWearableDictionary::Subparts::Subparts()
 	addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
 	addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
 	addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+	addEntry(SUBPART_SHAPE_PHYSICS, new SubpartEntry(SUBPART_SHAPE_PHYSICS, "mTorso", "shape_physics", "shape_physics_param_list", "shape_physics_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_FEMALE));
 	addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
 
 	addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
@@ -847,11 +849,11 @@ void LLPanelEditWearable::setVisible(BOOL visible)
 	LLPanel::setVisible(visible);
 }
 
-void LLPanelEditWearable::setWearable(LLWearable *wearable)
+void LLPanelEditWearable::setWearable(LLWearable *wearable, BOOL disable_camera_switch)
 {
-	showWearable(mWearablePtr, FALSE);
+	showWearable(mWearablePtr, FALSE, disable_camera_switch);
 	mWearablePtr = wearable;
-	showWearable(mWearablePtr, TRUE);
+	showWearable(mWearablePtr, TRUE, disable_camera_switch);
 }
 
 
@@ -1051,7 +1053,7 @@ void LLPanelEditWearable::revertChanges()
 	gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE);
 }
 
-void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
+void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch)
 {
 	if (!wearable)
 	{
@@ -1146,7 +1148,10 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
 	
 			updateScrollingPanelUI();
 		}
-		showDefaultSubpart();
+		if (!disable_camera_switch)
+		{
+			showDefaultSubpart();
+		}
 
 		updateVerbs();
 	}
@@ -1154,7 +1159,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
 
 void LLPanelEditWearable::showDefaultSubpart()
 {
-	changeCamera(0);
+	changeCamera(3);
 }
 
 void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index)
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 43513d8ab3..623101d835 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -55,8 +55,11 @@ public:
 	/*virtual*/ BOOL		isDirty() const;	// LLUICtrl
 	/*virtual*/ void		draw();	
 
+	// changes camera angle to default for selected subpart
+	void				changeCamera(U8 subpart);
+
 	LLWearable* 		getWearable() { return mWearablePtr; }
-	void				setWearable(LLWearable *wearable);
+	void				setWearable(LLWearable *wearable, BOOL disable_camera_switch = FALSE);
 
 	void				saveChanges(bool force_save_as = false);
 	void				revertChanges();
@@ -77,7 +80,7 @@ public:
 private:
 	typedef std::map<F32, LLViewerVisualParam*> value_map_t;
 
-	void				showWearable(LLWearable* wearable, BOOL show);
+	void				showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE);
 	void				updateScrollingPanelUI();
 	LLPanel*			getPanel(LLWearableType::EType type);
 	void				getSortedParams(value_map_t &sorted_params, const std::string &edit_group);
@@ -91,9 +94,6 @@ private:
 	void				toggleTypeSpecificControls(LLWearableType::EType type);
 	void				updateTypeSpecificControls(LLWearableType::EType type);
 
-	// changes camera angle to default for selected subpart
-	void				changeCamera(U8 subpart);
-
 	//alpha mask checkboxes
 	void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name);
 	void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te);
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 363b0b8e9d..2942f4befb 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -602,6 +602,12 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName )
 				}
 
 				mMorphData.insert(morph_data);
+				/*
+				if (std::string(morphName) == "Breast_Gravity")
+				{
+					LLPolyMorphData *morph_data_clone = new LLPolyMorphData(std::string(morphName));
+				}
+				*/
 			}
 
 			S32 numRemaps;
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 0ffe1c635f..ec41ef08f5 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -287,10 +287,22 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
 		}
 	}
 
-	mMorphData = mMesh->getMorphData(getInfo()->mMorphName);
+	std::string morph_param_name = getInfo()->mMorphName;
+	
+	mMorphData = mMesh->getMorphData(morph_param_name);
+	if (!mMorphData)
+	{
+		const std::string driven_tag = "_Driven";
+		U32 pos = morph_param_name.find(driven_tag);
+		if (pos > 0)
+		{
+			morph_param_name = morph_param_name.substr(0,pos);
+			mMorphData = mMesh->getMorphData(morph_param_name);
+		}
+	}
 	if (!mMorphData)
 	{
-		llwarns << "No morph target named " << getInfo()->mMorphName << " found in mesh." << llendl;
+		llwarns << "No morph target named " << morph_param_name << " found in mesh." << llendl;
 		return FALSE;  // Continue, ignoring this tag
 	}
 	return TRUE;
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 7206e4fcaf..333a463844 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -176,6 +176,11 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
 		{
 			showWearableEditPanel();
 		}
+		else if (type == "edit_physics")
+		{
+			showPhysicsEditPanel();
+		}
+
 	}
 
 	mOpened = true;
@@ -281,7 +286,7 @@ void LLSidepanelAppearance::showOutfitsInventoryPanel()
 {
 	toggleWearableEditPanel(FALSE);
 	toggleOutfitEditPanel(FALSE);
-	togglMyOutfitsPanel(TRUE);
+	toggleMyOutfitsPanel(TRUE);
 }
 
 void LLSidepanelAppearance::showOutfitEditPanel()
@@ -295,19 +300,24 @@ void LLSidepanelAppearance::showOutfitEditPanel()
 		mOutfitEdit->resetAccordionState();
 	}
 
-	togglMyOutfitsPanel(FALSE);
+	toggleMyOutfitsPanel(FALSE);
 	toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode
 	toggleOutfitEditPanel(TRUE);
 }
 
-void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/)
+void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/, BOOL disable_camera_switch)
 {
-	togglMyOutfitsPanel(FALSE);
+	toggleMyOutfitsPanel(FALSE);
 	toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode
-	toggleWearableEditPanel(TRUE, wearable);
+	toggleWearableEditPanel(TRUE, wearable, disable_camera_switch);
+}
+
+void LLSidepanelAppearance::showPhysicsEditPanel(LLWearable *wearable /* = NULL*/)
+{
+	showWearableEditPanel(wearable, TRUE);
 }
 
-void LLSidepanelAppearance::togglMyOutfitsPanel(BOOL visible)
+void LLSidepanelAppearance::toggleMyOutfitsPanel(BOOL visible)
 {
 	if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible)
 	{
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index f28cdfa49a..022280132e 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -59,7 +59,8 @@ public:
 
 	void showOutfitsInventoryPanel();
 	void showOutfitEditPanel();
-	void showWearableEditPanel(LLWearable *wearable = NULL);
+	void showWearableEditPanel(LLWearable *wearable = NULL, BOOL disable_camera_switch = FALSE);
+	void showPhysicsEditPanel(LLWearable *wearable = NULL);
 	void setWearablesLoading(bool val);
 	void showDefaultSubpart();
 	void updateScrollingPanelList();
@@ -71,7 +72,7 @@ private:
 	void onOpenOutfitButtonClicked();
 	void onEditAppearanceButtonClicked();
 
-	void togglMyOutfitsPanel(BOOL visible);
+	void toggleMyOutfitsPanel(BOOL visible);
 	void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE);
 	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE);
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c275068028..285cc857fb 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3650,6 +3650,15 @@ class LLEnableEditShape : public view_listener_t
 	}
 };
 
+class LLEnableEditPhysics : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		//return gAgentWearables.isWearableModifiable(LLWearableType::WT_SHAPE, 0);
+		return TRUE;
+	}
+};
+
 bool is_object_sittable()
 {
 	LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
@@ -5608,6 +5617,11 @@ void handle_edit_shape()
 	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape"));
 }
 
+void handle_edit_physics()
+{
+	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_physics"));
+}
+
 void handle_report_abuse()
 {
 	// Prevent menu from appearing in screen shot.
@@ -7843,9 +7857,11 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
 	view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
 	view_listener_t::addMenu(new LLEnableEditShape(), "Edit.EnableEditShape");
+	view_listener_t::addMenu(new LLEnableEditPhysics(), "Edit.EnableEditPhysics");
 	commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar));
 	commit.add("EditOutfit", boost::bind(&handle_edit_outfit));
 	commit.add("EditShape", boost::bind(&handle_edit_shape));
+	commit.add("EditPhysics", boost::bind(&handle_edit_physics));
 
 	// View menu
 	view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook");
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 9af1198df1..f595a05a28 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -103,6 +103,8 @@ extern F32 ANIM_SPEED_MIN;
 
 #include <boost/lexical_cast.hpp>
 
+#define OUTPUT_BREAST_DATA
+
 using namespace LLVOAvatarDefines;
 
 //-----------------------------------------------------------------------------
@@ -118,6 +120,7 @@ const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"
 const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b");  //"pelvis_fix"
 const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55");  //"target"
 const LLUUID ANIM_AGENT_WALK_ADJUST	= LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d");  //"walk_adjust"
+const LLUUID ANIM_AGENT_BREAST_MOTION = LLUUID("ce52c2b2-b62a-1e90-6152-7cd1efe2fd60");  //"breast_motion"
 
 
 //-----------------------------------------------------------------------------
@@ -573,6 +576,387 @@ private:
 	LLCharacter*		mCharacter;
 };
 
+//-----------------------------------------------------------------------------
+// class LLBreatheMotionRot
+//-----------------------------------------------------------------------------
+class LLBreastMotion :
+	public LLMotion
+{
+public:
+	// Constructor
+	LLBreastMotion(const LLUUID &id) :
+		LLMotion(id),
+		mCharacter(NULL),
+		mFileWrite(NULL)
+	{
+		mName = "breast_motion";
+		mChestState = new LLJointState;
+
+		mBreastMassParam = (F32)1.0;
+		mBreastDragParam = LLVector3((F32)0.1, (F32)0.1, (F32)0.1);
+		mBreastSmoothingParam = (U32)2;
+		mBreastGravityParam = (F32)0.0;
+
+		mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0);
+		mBreastAccelerationParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0);
+		mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3);
+		mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0);
+
+		mBreastParamsUser[0] = mBreastParamsUser[1] = mBreastParamsUser[2] = NULL;
+		mBreastParamsDriven[0] = mBreastParamsDriven[1] = mBreastParamsDriven[2] = NULL;
+
+		mCharLastPosition_world_pt = LLVector3(0,0,0);
+		mCharLastVelocity_local_vec = LLVector3(0,0,0);
+		mCharLastAcceleration_local_vec = LLVector3(0,0,0);
+		mBreastLastPosition_local_pt = LLVector3(0,0,0);
+		mBreastVelocity_local_vec = LLVector3(0,0,0);
+	}
+
+	// Destructor
+	virtual ~LLBreastMotion() {}
+
+public:
+	//-------------------------------------------------------------------------
+	// functions to support MotionController and MotionRegistry
+	//-------------------------------------------------------------------------
+	// static constructor
+	// all subclasses must implement such a function and register it
+	static LLMotion *create(const LLUUID &id) { return new LLBreastMotion(id); }
+
+public:
+	//-------------------------------------------------------------------------
+	// animation callbacks to be implemented by subclasses
+	//-------------------------------------------------------------------------
+
+	// motions must specify whether or not they loop
+	virtual BOOL getLoop() { return TRUE; }
+
+	// motions must report their total duration
+	virtual F32 getDuration() { return 0.0; }
+
+	// motions must report their "ease in" duration
+	virtual F32 getEaseInDuration() { return 0.0; }
+
+	// motions must report their "ease out" duration.
+	virtual F32 getEaseOutDuration() { return 0.0; }
+
+	// motions must report their priority
+	virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
+
+	virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
+
+	// called to determine when a motion should be activated/deactivated based on avatar pixel coverage
+	virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREATHE; }
+
+	// run-time (post constructor) initialization,
+	// called after parameters have been set
+	// must return true to indicate success and be available for activation
+	virtual LLMotionInitStatus onInitialize(LLCharacter *character)
+	{		
+		mCharacter = character;
+		BOOL success = true;
+
+		if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; }
+
+		if (!success)
+		{
+			return STATUS_FAILURE;
+		}
+		
+		mChestState->setUsage(LLJointState::ROT);
+		addJointState( mChestState );
+
+		// User-set params
+		static const std::string breast_param_names_user[3] =
+			{
+				"Breast_Female_Cleavage",
+				"",
+				"Breast_Gravity"
+			};
+
+		// Params driven by this algorithm
+		static const std::string breast_param_names_driven[3] =
+			{
+				"Breast_Female_Cleavage_Driven",
+				"",
+				"Breast_Gravity_Driven"
+			};
+		
+		for (U32 i=0; i < 3; i++)
+		{
+			mBreastParamsUser[i] = NULL;
+			mBreastParamsDriven[i] = NULL;
+			mBreastParamsMin[i] = 0;
+			mBreastParamsMax[i] = 0;
+			if (breast_param_names_user[i] != "" && breast_param_names_driven[i] != "")
+			{
+				mBreastParamsUser[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_user[i].c_str());
+				mBreastParamsDriven[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_driven[i].c_str());
+				if (mBreastParamsDriven[i])
+				{
+					mBreastParamsMin[i] = mBreastParamsDriven[i]->getMinWeight();
+					mBreastParamsMax[i] = mBreastParamsDriven[i]->getMaxWeight();
+				}
+			}
+		}
+
+#ifdef OUTPUT_BREAST_DATA
+		//if (mCharacter->getSex() == SEX_FEMALE)
+		if (dynamic_cast<LLVOAvatarSelf *>(mCharacter))
+		{
+			mFileWrite = fopen("c:\\temp\\data.txt","w");
+			if (mFileWrite != NULL)
+			{
+				fprintf(mFileWrite,"Pos\tParam\tNet\tVel\t\tAccel\tSpring\tDamp\n");
+			}
+		}
+#endif
+
+		mTimer.reset();
+		return STATUS_SUCCESS;
+	}
+
+	// called when a motion is activated
+	// must return TRUE to indicate success, or else
+	// it will be deactivated
+	virtual BOOL onActivate() { return TRUE; }
+
+	F32 calculateTimeDelta()
+	{
+		const F32 time = mTimer.getElapsedTimeF32();
+		const F32 time_delta = time - mLastTime;
+
+		mLastTime = time;
+
+		return time_delta;
+	}
+
+	LLVector3 toLocal(const LLVector3 &world_vector)
+	{
+		LLVector3 local_vec(0,0,0);
+
+		LLJoint *chest_joint = mChestState->getJoint();
+		const LLQuaternion world_rot = chest_joint->getWorldRotation();
+		
+		// -1 because cleavage param changes opposite to direction.
+		LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot;
+		breast_dir_world_vec.normalize();
+		local_vec[0] = world_vector * breast_dir_world_vec;
+
+		LLVector3 breast_up_dir_world_vec = LLVector3(0,0,1) * world_rot;
+		breast_up_dir_world_vec.normalize();
+		local_vec[2] = world_vector * breast_up_dir_world_vec;
+
+		/*
+		{
+			llinfos << "Dir: " << breast_dir_world_vec << "V: " << world_vector << "DP: " << local_vec[0] << " time: " << llendl;
+		}
+		*/
+
+		return local_vec;
+	}
+
+	LLVector3 calculateVelocity_local(const F32 time_delta)
+	{
+		LLJoint *chest_joint = mChestState->getJoint();
+		const LLVector3 world_pos_pt = chest_joint->getWorldPosition();
+		const LLQuaternion world_rot = chest_joint->getWorldRotation();
+		const LLVector3 last_world_pos_pt = mCharLastPosition_world_pt;
+		const LLVector3 char_velocity_world_vec = (world_pos_pt-last_world_pos_pt) / time_delta;
+		const LLVector3 char_velocity_local_vec = toLocal(char_velocity_world_vec);
+
+		return char_velocity_local_vec;
+	}
+
+	LLVector3 calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec,
+										  const F32 time_delta)
+	{
+		LLVector3 char_acceleration_local_vec = new_char_velocity_local_vec - mCharLastVelocity_local_vec;
+		
+		char_acceleration_local_vec = 
+			char_acceleration_local_vec * 1.0/mBreastSmoothingParam + 
+			mCharLastAcceleration_local_vec * (mBreastSmoothingParam-1.0)/mBreastSmoothingParam;
+
+		mCharLastAcceleration_local_vec = char_acceleration_local_vec;
+
+		char_acceleration_local_vec *= mBreastAccelerationParam;
+		return char_acceleration_local_vec;
+	}
+
+	// called per time step
+	// must return TRUE while it is active, and
+	// must return FALSE when the motion is completed.
+	virtual BOOL onUpdate(F32 time, U8* joint_mask)
+	{
+		/*
+		FILE *fread = fopen("c:\\temp\\breast_data.txt","r");
+		if (fread)
+		{
+			char dummy_str[255];
+			fscanf(fread,"%s %f\n",dummy_str, &mBreastMassParam);
+			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastSpringParam[0],&mBreastSpringParam[1],&mBreastSpringParam[2]);
+			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastAccelerationParam[0],&mBreastAccelerationParam[1],&mBreastAccelerationParam[2]);
+			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDampingParam[0],&mBreastDampingParam[1],&mBreastDampingParam[2]);
+			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastMaxVelocityParam[0],&mBreastMaxVelocityParam[1],&mBreastMaxVelocityParam[2]);
+			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDragParam[0], &mBreastDragParam[1], &mBreastDragParam[2]);
+			fscanf(fread,"%s %d\n",dummy_str, &mBreastSmoothingParam);
+		}
+		fclose(fread);
+		*/
+		
+		/* TEST:
+		   1. Change outfits
+		   2. FPS effect
+		   3. Add disable
+		   4. Disappearing chests
+		   5. Overwrites breast params
+		   6. Threshold for not setting param
+		*/
+
+		mBreastMassParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Mass"))->getWeight();
+		mBreastSmoothingParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Smoothing"))->getWeight();
+		mBreastGravityParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Gravity"))->getWeight();
+
+		mBreastSpringParam[0] =       ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Spring"))->getWeight();
+		mBreastAccelerationParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Bounce"))->getWeight();
+		mBreastDampingParam[0] =      ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Damping"))->getWeight();
+		mBreastMaxVelocityParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Range"))->getWeight();
+		mBreastDragParam[0] =        ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Drag"))->getWeight();
+
+		mBreastSpringParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Spring"))->getWeight();
+		mBreastAccelerationParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Bounce"))->getWeight();
+		mBreastDampingParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Damping"))->getWeight();
+		mBreastMaxVelocityParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Range"))->getWeight();
+		mBreastDragParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Drag"))->getWeight();
+
+		if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
+		const F32 time_delta = calculateTimeDelta();
+		if (time_delta < .01 || time_delta > 10.0) return TRUE;
+
+		
+		LLVector3 breast_user_local_pt(0,0,0);
+		
+		for (U32 i=0; i < 3; i++)
+		{
+			if (mBreastParamsUser[i] != NULL)
+			{
+				breast_user_local_pt[i] = mBreastParamsUser[i]->getWeight();
+			}
+		}
+		
+		LLVector3 breast_current_local_pt = mBreastLastPosition_local_pt;
+		
+		const LLVector3 char_velocity_local_vec = calculateVelocity_local(time_delta);
+		const LLVector3 char_acceleration_local_vec = calculateAcceleration_local(char_velocity_local_vec, time_delta);
+		mCharLastVelocity_local_vec = char_velocity_local_vec;
+
+		LLJoint *chest_joint = mChestState->getJoint();
+		mCharLastPosition_world_pt = chest_joint->getWorldPosition();
+		
+
+		const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt;
+		LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam;
+		const LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
+		
+		const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam;
+
+		LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec;
+
+		LLVector3 force_drag_local_vec = .5*char_velocity_local_vec; // should square char_velocity_vec
+		force_drag_local_vec[0] *= mBreastDragParam[0];
+		force_drag_local_vec[1] *= mBreastDragParam[1];
+		force_drag_local_vec[2] *= mBreastDragParam[2];
+
+		const LLVector3 force_net_local_vec = 
+			force_accel_local_vec + 
+			force_gravity_local_vec +
+			force_spring_local_vec + 
+			force_damping_local_vec + 
+			force_drag_local_vec;
+
+		LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
+		mBreastVelocity_local_vec += acceleration_local_vec;
+		mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam);
+
+		LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
+		new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
+		
+		for (U32 i=0; i < 3; i++)
+		{
+			if (mBreastParamsDriven[i])
+			{
+				mCharacter->setVisualParamWeight(mBreastParamsDriven[i],
+												 new_local_pt[i],
+												 FALSE);
+			}
+		}
+
+		if (mFileWrite != NULL)
+		{
+			fprintf(mFileWrite,"%f\t%f\t%f\t%f\t\t%f\t%f\t%f\t \t%f\t%f\t%f\t%f\t%f\t%f\n",
+					mCharLastPosition_world_pt[2],
+					breast_current_local_pt[2],
+					acceleration_local_vec[2],
+					mBreastVelocity_local_vec[2],
+					
+					force_accel_local_vec[2],
+					force_spring_local_vec[2],
+					force_damping_local_vec[2],
+					
+					force_accel_local_vec[2],
+					force_damping_local_vec[2],
+					force_drag_local_vec[2],
+					force_net_local_vec[2],
+					time_delta,
+					mBreastMassParam
+					);
+		}
+		
+		mBreastLastPosition_local_pt = new_local_pt;
+		mCharacter->updateVisualParams();
+		return TRUE;
+	}
+	
+	// called when a motion is deactivated
+	virtual void onDeactivate() {}
+
+private:
+	//-------------------------------------------------------------------------
+	// joint states to be animated
+	//-------------------------------------------------------------------------
+	LLPointer<LLJointState> mChestState;
+	LLCharacter*		mCharacter;
+
+	LLViewerVisualParam *mBreastParamsUser[3];
+	LLViewerVisualParam *mBreastParamsDriven[3];
+	LLVector3           mBreastParamsMin;
+	LLVector3           mBreastParamsMax;
+
+	LLVector3           mCharLastPosition_world_pt; // Last position of the avatar
+	LLVector3			mCharLastVelocity_local_vec; // How fast the character is moving
+	LLVector3           mCharLastAcceleration_local_vec; // Change in character velocity
+
+	LLVector3           mBreastLastPosition_local_pt; // Last parameters for breast
+	LLVector3           mBreastVelocity_local_vec; // How fast the breast params are moving
+
+
+	F32 mBreastMassParam;
+	F32 mBreastGravityParam;
+	U32 mBreastSmoothingParam;
+
+	LLVector3 mBreastSpringParam;
+	LLVector3 mBreastDampingParam;
+	LLVector3 mBreastAccelerationParam;
+	LLVector3 mBreastMaxVelocityParam;
+	LLVector3 mBreastDragParam;
+
+	LLFrameTimer	mTimer;
+	F32             mLastTime;
+	
+	FILE           *mFileWrite;
+	U32            mFileTicks;
+};
+
 /**
  **
  ** End LLVOAvatar Support classes
@@ -1137,6 +1521,7 @@ void LLVOAvatar::initClass()
 
 	gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise");
 	gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot");
+	gAnimLibrary.animStateSetString(ANIM_AGENT_BREAST_MOTION,"breast_motion");
 	gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing");
 	gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye");
 	gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust");
@@ -1275,6 +1660,7 @@ void LLVOAvatar::initInstance(void)
 		// motions without a start/stop bit
 		registerMotion( ANIM_AGENT_BODY_NOISE,				LLBodyNoiseMotion::create );
 		registerMotion( ANIM_AGENT_BREATHE_ROT,				LLBreatheMotionRot::create );
+		registerMotion( ANIM_AGENT_BREAST_MOTION,			LLBreastMotion::create );
 		registerMotion( ANIM_AGENT_EDITING,					LLEditingMotion::create	);
 		registerMotion( ANIM_AGENT_EYE,						LLEyeMotion::create	);
 		registerMotion( ANIM_AGENT_FEMALE_WALK,				LLKeyframeWalkMotion::create );
@@ -1688,6 +2074,7 @@ void LLVOAvatar::startDefaultMotions()
 	startMotion( ANIM_AGENT_EYE );
 	startMotion( ANIM_AGENT_BODY_NOISE );
 	startMotion( ANIM_AGENT_BREATHE_ROT );
+	startMotion( ANIM_AGENT_BREAST_MOTION );
 	startMotion( ANIM_AGENT_HAND_MOTION );
 	startMotion( ANIM_AGENT_PELVIS_FIX );
 
@@ -6097,14 +6484,10 @@ void LLVOAvatar::updateMeshTextures()
 			// When an avatar is changing clothes and not in Appearance mode,
 			// use the last-known good baked texture until it finish the first
 			// render of the new layerset.
-
-			const BOOL layerset_invalid = !mBakedTextureDatas[i].mTexLayerSet 
-										  || !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized()
-										  || !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable();
-
 			use_lkg_baked_layer[i] = (!is_layer_baked[i] 
 									  && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR) 
-									  && layerset_invalid);
+									  && mBakedTextureDatas[i].mTexLayerSet 
+									  && !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized());
 			if (use_lkg_baked_layer[i])
 			{
 				mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE);
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 6d9424c8be..c522af7d55 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -48,6 +48,7 @@
 
 extern const LLUUID ANIM_AGENT_BODY_NOISE;
 extern const LLUUID ANIM_AGENT_BREATHE_ROT;
+extern const LLUUID ANIM_AGENT_BREAST_MOTION;
 extern const LLUUID ANIM_AGENT_EDITING;
 extern const LLUUID ANIM_AGENT_EYE;
 extern const LLUUID ANIM_AGENT_FLY_ADJUST;
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index e2348375d5..acdecbad31 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -80,6 +80,14 @@ name="Edit Outfit">
     <menu_item_call.on_enable
      function="Edit.EnableEditShape" />
   </menu_item_call>
+  <menu_item_call label="Edit My Physics"
+  layout="topleft"
+  name="Edit My Physics">
+    <menu_item_call.on_click
+     function="EditPhysics" />
+    <menu_item_call.on_enable
+     function="Edit.EnableEditPhysics" />
+  </menu_item_call>
   <menu_item_call
     label="My Friends"
     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index d5b993152a..71b8eea94c 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -206,6 +206,14 @@
         function="EditShape" />
        <menu_item_call.on_enable
         function="Edit.EnableEditShape" />
+   </menu_item_call>
+    <menu_item_call label="Edit My Physics" 
+    layout="topleft"
+    name="Edit My Physics">
+       <menu_item_call.on_click
+        function="EditPhysics" />
+       <menu_item_call.on_enable
+        function="Edit.EnableEditPhysics" />
    </menu_item_call>
    <menu_item_call
      label="My Friends"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
index d295f5fe4a..a7563d6f96 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
@@ -175,6 +175,20 @@
 				top="0"
 				width="303" />
 		</accordion_tab>
+		<accordion_tab
+			layout="topleft"
+			min_height="150"
+			name="shape_physics_tab"
+            fit_panel="false"
+			title="Physics">
+           <scrolling_panel_list
+                layout="topleft"
+				follows="all"
+				left="0"
+				name="shape_physics_param_list"
+				top="0"
+				width="303" />
+		</accordion_tab>
 	</accordion>
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 676bef2d0b..e16bbfa5a5 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2471,6 +2471,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Bulbous">Bulbous</string>
 <string name="Bulbous Nose">Bulbous Nose</string>
 
+<string name="Breast Physics Mass">Breast Mass</string>
+<string name="Breast Physics Smoothing">Breast Smoothing</string>
+
+<string name="Breast Physics Side Spring">Breast Side Spring</string>
+<string name="Breast Physics Side Bounce">Breast Side Bounce</string>
+<string name="Breast Physics Side Damping">Breast Side Damping</string>
+<string name="Breast Physics Side Drag">Breast Side Drag</string>
+<string name="Breast Physics Side Range">Breast Side Max</string>
+
+<string name="Breast Physics UpDown Spring">Breast UpDown Spring</string>
+<string name="Breast Physics UpDown Bounce">Breast UpDown Bounce</string>
+<string name="Breast Physics UpDown Damping">Breast UpDown Damping</string>
+<string name="Breast Physics UpDown Drag">Breast UpDown Drag</string>
+<string name="Breast Physics UpDown Range">Breast UpDown Range</string>
 
 <string name="Bushy Eyebrows">Bushy Eyebrows</string>
 <string name="Bushy Hair">Bushy Hair</string>
-- 
cgit v1.2.3


From 78538f4f618bebbdb4b441dc2b1e23877c0d3cb9 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 23 Aug 2010 14:15:17 -0400
Subject: Changed Acceleration to gain. Changed behavior of gain. Changed names
 of Driver/Driven params.

---
 indra/newview/character/avatar_lad.xml         | 24 ++++++++++-----------
 indra/newview/llvoavatar.cpp                   | 30 +++++++++++++++-----------
 indra/newview/skins/default/xui/en/strings.xml |  5 +++--
 3 files changed, 32 insertions(+), 27 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index cdb3684034..4f64d669f5 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -4047,7 +4047,7 @@
      id="507"
      group="0"
      sex="female"
-     name="Breast_Gravity_Driven"
+     name="Breast_Gravity"
      label="Breast Buoyancy"
      wearable="shape"
      edit_group="driven"
@@ -4115,7 +4115,7 @@
      id="684"
      group="0"
      sex="female"
-     name="Breast_Female_Cleavage_Driven"
+     name="Breast_Female_Cleavage"
      label="Breast Cleavage"
      wearable="shape"
      edit_group="driven"
@@ -9119,9 +9119,9 @@ render_pass="bump">
      edit_group="shape_physics"
      label_min="Less"
      label_max="More"
-     value_default="2"
+     value_default="0"
      value_min="0"
-     value_max="10"
+     value_max="2"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9149,14 +9149,14 @@ render_pass="bump">
      id="1078"
      group="0"
      sex="female"
-     name="Breast_Physics_Side_Bounce"
-     label="Breast Physics Side Bounce"
+     name="Breast_Physics_Side_Gain"
+     label="Breast Physics Side Gain"
      wearable="shape"
      edit_group="shape_physics"
      label_min="Less"
      label_max="More"
      value_default="10"
-     value_min="0"
+     value_min="1"
      value_max="100"
      camera_elevation=".3"
      camera_distance=".8">
@@ -9240,14 +9240,14 @@ render_pass="bump">
      id="1083"
      group="0"
      sex="female"
-     name="Breast_Physics_UpDown_Bounce"
-     label="Breast Physics UpDown Bounce"
+     name="Breast_Physics_UpDown_Gain"
+     label="Breast Physics UpDown Gain"
      wearable="shape"
      edit_group="shape_physics"
      label_min="Less"
      label_max="More"
      value_default="50"
-     value_min="0"
+     value_min="1"
      value_max="100"
      camera_elevation=".3"
      camera_distance=".8">
@@ -9312,7 +9312,7 @@ render_pass="bump">
      id="1087"
      group="0"
      sex="female"
-     name="Breast_Female_Cleavage"
+     name="Breast_Female_Cleavage_Driver"
      label="Breast Cleavage"
      wearable="shape"
      edit_group="shape_torso"
@@ -9333,7 +9333,7 @@ render_pass="bump">
      id="1088"
      group="0"
      sex="female"
-     name="Breast_Gravity"
+     name="Breast_Gravity_Driver"
      label="Breast Buoyancy"
      wearable="shape"
      edit_group="shape_torso"
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f595a05a28..0f5df8ce12 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -598,7 +598,7 @@ public:
 		mBreastGravityParam = (F32)0.0;
 
 		mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0);
-		mBreastAccelerationParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0);
+		mBreastGainParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0);
 		mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3);
 		mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0);
 
@@ -669,17 +669,17 @@ public:
 		// User-set params
 		static const std::string breast_param_names_user[3] =
 			{
-				"Breast_Female_Cleavage",
+				"Breast_Female_Cleavage_Driver",
 				"",
-				"Breast_Gravity"
+				"Breast_Gravity_Driver"
 			};
 
 		// Params driven by this algorithm
 		static const std::string breast_param_names_driven[3] =
 			{
-				"Breast_Female_Cleavage_Driven",
+				"Breast_Female_Cleavage",
 				"",
-				"Breast_Gravity_Driven"
+				"Breast_Gravity"
 			};
 		
 		for (U32 i=0; i < 3; i++)
@@ -779,7 +779,6 @@ public:
 
 		mCharLastAcceleration_local_vec = char_acceleration_local_vec;
 
-		char_acceleration_local_vec *= mBreastAccelerationParam;
 		return char_acceleration_local_vec;
 	}
 
@@ -795,7 +794,7 @@ public:
 			char dummy_str[255];
 			fscanf(fread,"%s %f\n",dummy_str, &mBreastMassParam);
 			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastSpringParam[0],&mBreastSpringParam[1],&mBreastSpringParam[2]);
-			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastAccelerationParam[0],&mBreastAccelerationParam[1],&mBreastAccelerationParam[2]);
+			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastGainParam[0],&mBreastGainParam[1],&mBreastGainParam[2]);
 			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDampingParam[0],&mBreastDampingParam[1],&mBreastDampingParam[2]);
 			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastMaxVelocityParam[0],&mBreastMaxVelocityParam[1],&mBreastMaxVelocityParam[2]);
 			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDragParam[0], &mBreastDragParam[1], &mBreastDragParam[2]);
@@ -818,13 +817,13 @@ public:
 		mBreastGravityParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Gravity"))->getWeight();
 
 		mBreastSpringParam[0] =       ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Spring"))->getWeight();
-		mBreastAccelerationParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Bounce"))->getWeight();
+		mBreastGainParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Gain"))->getWeight();
 		mBreastDampingParam[0] =      ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Damping"))->getWeight();
 		mBreastMaxVelocityParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Range"))->getWeight();
 		mBreastDragParam[0] =        ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Drag"))->getWeight();
 
 		mBreastSpringParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Spring"))->getWeight();
-		mBreastAccelerationParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Bounce"))->getWeight();
+		mBreastGainParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Gain"))->getWeight();
 		mBreastDampingParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Damping"))->getWeight();
 		mBreastMaxVelocityParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Range"))->getWeight();
 		mBreastDragParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Drag"))->getWeight();
@@ -856,9 +855,13 @@ public:
 
 		const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt;
 		LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam;
-		const LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
-		
+
+		LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
 		const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam;
+		force_accel_local_vec += force_gravity_local_vec;
+		force_accel_local_vec[0] *= mBreastGainParam[0];
+		force_accel_local_vec[1] *= mBreastGainParam[1];
+		force_accel_local_vec[2] *= mBreastGainParam[2];
 
 		LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec;
 
@@ -867,13 +870,14 @@ public:
 		force_drag_local_vec[1] *= mBreastDragParam[1];
 		force_drag_local_vec[2] *= mBreastDragParam[2];
 
-		const LLVector3 force_net_local_vec = 
+		LLVector3 force_net_local_vec = 
 			force_accel_local_vec + 
 			force_gravity_local_vec +
 			force_spring_local_vec + 
 			force_damping_local_vec + 
 			force_drag_local_vec;
 
+
 		LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
 		mBreastVelocity_local_vec += acceleration_local_vec;
 		mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam);
@@ -946,7 +950,7 @@ private:
 
 	LLVector3 mBreastSpringParam;
 	LLVector3 mBreastDampingParam;
-	LLVector3 mBreastAccelerationParam;
+	LLVector3 mBreastGainParam;
 	LLVector3 mBreastMaxVelocityParam;
 	LLVector3 mBreastDragParam;
 
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e16bbfa5a5..7a010697ac 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2473,15 +2473,16 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 
 <string name="Breast Physics Mass">Breast Mass</string>
 <string name="Breast Physics Smoothing">Breast Smoothing</string>
+<string name="Breast Physics Gravity">Breast Gravity</string>
 
 <string name="Breast Physics Side Spring">Breast Side Spring</string>
-<string name="Breast Physics Side Bounce">Breast Side Bounce</string>
+<string name="Breast Physics Side Gain">Breast Side Gain</string>
 <string name="Breast Physics Side Damping">Breast Side Damping</string>
 <string name="Breast Physics Side Drag">Breast Side Drag</string>
 <string name="Breast Physics Side Range">Breast Side Max</string>
 
 <string name="Breast Physics UpDown Spring">Breast UpDown Spring</string>
-<string name="Breast Physics UpDown Bounce">Breast UpDown Bounce</string>
+<string name="Breast Physics UpDown Gain">Breast UpDown Gain</string>
 <string name="Breast Physics UpDown Damping">Breast UpDown Damping</string>
 <string name="Breast Physics UpDown Drag">Breast UpDown Drag</string>
 <string name="Breast Physics UpDown Range">Breast UpDown Range</string>
-- 
cgit v1.2.3


From 981a43b355e44daa7e1b4065b896ea4cd2fec3a2 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 23 Aug 2010 16:13:10 -0400
Subject: Created new wearable type. Added debug setting for disabling physics.
 Added disable-multiwear and disable-camera-reset to wearabletype.

---
 indra/newview/app_settings/settings.xml            |   13 +
 indra/newview/character/avatar_lad.xml             |   54 +-
 indra/newview/llagentwearables.cpp                 |    4 +-
 indra/newview/llinventorybridge.cpp                |    5 +
 indra/newview/llinventoryicon.cpp                  |    2 +
 indra/newview/llinventoryicon.h                    |    4 +-
 indra/newview/llpaneleditwearable.cpp              |   15 +-
 indra/newview/llpaneleditwearable.h                |    1 +
 indra/newview/llpaneloutfitedit.cpp                |    1 +
 indra/newview/llpaneloutfitedit.h                  |    1 +
 indra/newview/llsidepanelappearance.cpp            |    4 +-
 indra/newview/llsidepanelappearance.h              |    2 +-
 indra/newview/llviewerinventory.cpp                |    1 +
 indra/newview/llvoavatar.cpp                       |    7 +-
 indra/newview/llwearableitemslist.cpp              |    1 +
 indra/newview/llwearabletype.cpp                   |   81 +-
 indra/newview/llwearabletype.h                     |    5 +-
 indra/newview/skins/default/textures/textures.xml  |    1 +
 .../skins/default/xui/en/floater_customize.xml     | 3389 --------------------
 .../skins/default/xui/en/menu_attachment_self.xml  |    8 -
 .../skins/default/xui/en/menu_avatar_self.xml      |   20 +-
 .../skins/default/xui/en/menu_inventory.xml        |    8 +
 .../skins/default/xui/en/menu_inventory_add.xml    |    8 +
 .../skins/default/xui/en/menu_outfit_gear.xml      |    8 +
 indra/newview/skins/default/xui/en/menu_viewer.xml |   10 +
 .../skins/default/xui/en/panel_edit_physics.xml    |   51 +
 .../skins/default/xui/en/panel_edit_wearable.xml   |   18 +
 indra/newview/skins/default/xui/en/strings.xml     |    4 +
 28 files changed, 254 insertions(+), 3472 deletions(-)
 delete mode 100644 indra/newview/skins/default/xui/en/floater_customize.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_edit_physics.xml

(limited to 'indra')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 07418d1b5e..8310c50b1e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -619,6 +619,19 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+
+    <key>AvatarPhysics</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable avatar physics, such as breast physics.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+
     <key>BackgroundYieldTime</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 4f64d669f5..7dd15c67c7 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9079,8 +9079,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Mass"
      label="Breast Physics Mass"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="1"
@@ -9097,8 +9097,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Smoothing"
      label="Breast Physics Smoothing"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="2"
@@ -9115,8 +9115,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Gravity"
      label="Breast Physics Gravity"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="0"
@@ -9133,8 +9133,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Side_Spring"
      label="Breast Physics Side Spring"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="3"
@@ -9151,8 +9151,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Side_Gain"
      label="Breast Physics Side Gain"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="10"
@@ -9169,8 +9169,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Side_Damping"
      label="Breast Physics Side Damping"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default=".5"
@@ -9187,8 +9187,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Side_Drag"
      label="Breast Physics Side Drag"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default=".1"
@@ -9205,8 +9205,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_Side_Range"
      label="Breast Physics Side Range"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="10"
@@ -9224,8 +9224,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_UpDown_Spring"
      label="Breast Physics UpDown Spring"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="1.5"
@@ -9242,8 +9242,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_UpDown_Gain"
      label="Breast Physics UpDown Gain"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="50"
@@ -9260,8 +9260,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_UpDown_Damping"
      label="Breast Physics UpDown Damping"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default=".1"
@@ -9278,8 +9278,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_UpDown_Drag"
      label="Breast Physics UpDown Drag"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default=".1"
@@ -9296,8 +9296,8 @@ render_pass="bump">
      sex="female"
      name="Breast_Physics_UpDown_Range"
      label="Breast Physics UpDown Range"
-     wearable="shape"
-     edit_group="shape_physics"
+     wearable="physics"
+     edit_group="physics"
      label_min="Less"
      label_max="More"
      value_default="10"
@@ -9308,6 +9308,8 @@ render_pass="bump">
 	 <param_driver />
     </param>
 
+
+
    <param
      id="1087"
      group="0"
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 4c2caae2c6..91a09cd886 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1717,6 +1717,7 @@ void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
 		gAgentWearables.removeWearable(LLWearableType::WT_SKIRT,true,0);
 		gAgentWearables.removeWearable(LLWearableType::WT_ALPHA,true,0);
 		gAgentWearables.removeWearable(LLWearableType::WT_TATTOO,true,0);
+		gAgentWearables.removeWearable(LLWearableType::WT_PHYSICS,true,0);
 	}
 }
 
@@ -2042,8 +2043,9 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)
 		return;
 	}
 
+	const BOOL disable_camera_switch = LLWearableType::getDisableCameraSwitch(wearable->getType());
 	LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance");
-	LLSidepanelAppearance::editWearable(wearable, panel);
+	LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch);
 }
 
 // Request editing the item after it gets worn.
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index aff0bc4099..a564059b87 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4496,6 +4496,11 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 						disabled_items.push_back(std::string("Take Off"));
 						disabled_items.push_back(std::string("Wearable Edit"));
 					}
+					if (gAgentWearables.isWearingWearableType(mWearableType) &&
+						!LLWearableType::getAllowMultiwear(mWearableType))
+					{
+						disabled_items.push_back(std::string("Wearable Add"));
+					}
 					break;
 				default:
 					break;
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index 021790648d..0574f0efe5 100644
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -82,6 +82,8 @@ LLIconDictionary::LLIconDictionary()
 	addEntry(LLInventoryIcon::ICONNAME_ANIMATION, 				new IconEntry("Inv_Animation"));
 	addEntry(LLInventoryIcon::ICONNAME_GESTURE, 				new IconEntry("Inv_Gesture"));
 
+	addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, 		new IconEntry("Inv_Physics"));
+
 	addEntry(LLInventoryIcon::ICONNAME_LINKITEM, 				new IconEntry("Inv_LinkItem"));
 	addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, 				new IconEntry("Inv_LinkItem"));
 
diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h
index 3c7ac7f609..ea00206ba1 100644
--- a/indra/newview/llinventoryicon.h
+++ b/indra/newview/llinventoryicon.h
@@ -66,9 +66,11 @@ public:
 		ICONNAME_CLOTHING_SKIRT,
 		ICONNAME_CLOTHING_ALPHA,
 		ICONNAME_CLOTHING_TATTOO,
-		
+
 		ICONNAME_ANIMATION,
 		ICONNAME_GESTURE,
+
+		ICONNAME_CLOTHING_PHYSICS,
 		
 		ICONNAME_LINKITEM,
 		ICONNAME_LINKFOLDER,
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index bfe3aa0e61..baccb9a807 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -72,7 +72,6 @@ enum ESubpart {
 	SUBPART_SHAPE_MOUTH,
 	SUBPART_SHAPE_CHIN,
 	SUBPART_SHAPE_TORSO,
-	SUBPART_SHAPE_PHYSICS,
 	SUBPART_SHAPE_LEGS,
 	SUBPART_SHAPE_WHOLE,
 	SUBPART_SHAPE_DETAIL,
@@ -95,7 +94,8 @@ enum ESubpart {
 	SUBPART_UNDERPANTS,
 	SUBPART_SKIRT,
 	SUBPART_ALPHA,
-	SUBPART_TATTOO
+	SUBPART_TATTOO,
+	SUBPART_PHYSICS
  };
 
 using namespace LLVOAvatarDefines;
@@ -219,7 +219,7 @@ LLEditWearableDictionary::Wearables::Wearables()
 	// note the subpart that is listed first is treated as "default", regardless of what order is in enum.
 	// Please match the order presented in XUI. -Nyx
 	// this will affect what camera angle is shown when first editing a wearable
-	addEntry(LLWearableType::WT_SHAPE, 		new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,10,	SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD,	SUBPART_SHAPE_EYES,	SUBPART_SHAPE_EARS,	SUBPART_SHAPE_NOSE,	SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_PHYSICS));
+	addEntry(LLWearableType::WT_SHAPE, 		new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9,	SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD,	SUBPART_SHAPE_EYES,	SUBPART_SHAPE_EARS,	SUBPART_SHAPE_NOSE,	SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS));
 	addEntry(LLWearableType::WT_SKIN, 		new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
 	addEntry(LLWearableType::WT_HAIR, 		new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR,	SUBPART_HAIR_STYLE,	SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
 	addEntry(LLWearableType::WT_EYES, 		new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES));
@@ -234,6 +234,7 @@ LLEditWearableDictionary::Wearables::Wearables()
 	addEntry(LLWearableType::WT_SKIRT, 		new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT));
 	addEntry(LLWearableType::WT_ALPHA, 		new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA));
 	addEntry(LLWearableType::WT_TATTOO, 	new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO));
+	addEntry(LLWearableType::WT_PHYSICS, 	new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,1, SUBPART_PHYSICS));
 }
 
 LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type,
@@ -279,7 +280,6 @@ LLEditWearableDictionary::Subparts::Subparts()
 	addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
 	addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
 	addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
-	addEntry(SUBPART_SHAPE_PHYSICS, new SubpartEntry(SUBPART_SHAPE_PHYSICS, "mTorso", "shape_physics", "shape_physics_param_list", "shape_physics_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_FEMALE));
 	addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
 
 	addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
@@ -305,6 +305,7 @@ LLEditWearableDictionary::Subparts::Subparts()
 	addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
 	addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
 	addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+	addEntry(SUBPART_PHYSICS, new SubpartEntry(SUBPART_PHYSICS, "mTorso", "physics", "physics_main_param_list", "physics_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_FEMALE));
 }
 
 LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part,
@@ -741,6 +742,7 @@ BOOL LLPanelEditWearable::postBuild()
 	mPanelSkirt = getChild<LLPanel>("edit_skirt_panel");
 	mPanelAlpha = getChild<LLPanel>("edit_alpha_panel");
 	mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel");
+	mPanelPhysics = getChild<LLPanel>("edit_physics_panel");
 
 	mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height");
 
@@ -1360,6 +1362,11 @@ LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type)
 		case LLWearableType::WT_TATTOO:
 			return mPanelTattoo;
 			break;
+
+		case LLWearableType::WT_PHYSICS:
+			return mPanelPhysics;
+			break;
+
 		default:
 			break;
 	}
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 623101d835..692a7ce90f 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -163,6 +163,7 @@ private:
 	LLPanel *mPanelSkirt;
 	LLPanel *mPanelAlpha;
 	LLPanel *mPanelTattoo;
+	LLPanel *mPanelPhysics;
 
 	typedef std::map<std::string, LLVOAvatarDefines::ETextureIndex> string_texture_index_map_t;
 	string_texture_index_map_t mAlphaCheckbox2Index;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index c9380bf6e6..4a87249257 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -466,6 +466,7 @@ BOOL LLPanelOutfitEdit::postBuild()
 	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT)));
 	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA)));
 	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO)));
+	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("physics"), new LLFindActualWearablesOfType(LLWearableType::WT_PHYSICS)));
 
 	mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name"); 
 	mStatus = getChild<LLTextBox>("status");
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 2dca986e33..f420930acd 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -96,6 +96,7 @@ public:
 		LVIT_SKIRT,
 		LVIT_ALPHA,
 		LVIT_TATTOO,
+		LVIT_PHYSICS,
 		NUM_LIST_VIEW_ITEM_TYPES
 	} EListViewItemType; 
 
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 333a463844..cd6f87f615 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -434,14 +434,14 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
 }
 
 //static
-void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data)
+void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch)
 {
 	LLSideTray::getInstance()->showPanel("sidepanel_appearance");
 
 	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);
 	if (panel)
 	{
-		panel->showWearableEditPanel(wearable);
+		panel->showWearableEditPanel(wearable, disable_camera_switch);
 	}
 }
 
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 022280132e..70c8b7b797 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -51,7 +51,7 @@ public:
 
 	void refreshCurrentOutfitName(const std::string& name = "");
 
-	static void editWearable(LLWearable *wearable, LLView *data);
+	static void editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE);
 
 	void fetchInventory();
 	void inventoryFetched();
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 75a5b14154..fc9f3aecf3 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -85,6 +85,7 @@ public:
 		mInventoryItemsDict["New Skirt"]		= LLTrans::getString("New Skirt");
 		mInventoryItemsDict["New Alpha"]		= LLTrans::getString("New Alpha");
 		mInventoryItemsDict["New Tattoo"]		= LLTrans::getString("New Tattoo");
+		mInventoryItemsDict["New Physics"]		= LLTrans::getString("New Physics");
 		mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
 
 		mInventoryItemsDict["New Gesture"]		= LLTrans::getString("New Gesture");
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 0f5df8ce12..80b10cc05e 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -103,7 +103,7 @@ extern F32 ANIM_SPEED_MIN;
 
 #include <boost/lexical_cast.hpp>
 
-#define OUTPUT_BREAST_DATA
+// #define OUTPUT_BREAST_DATA
 
 using namespace LLVOAvatarDefines;
 
@@ -787,6 +787,11 @@ public:
 	// must return FALSE when the motion is completed.
 	virtual BOOL onUpdate(F32 time, U8* joint_mask)
 	{
+		if (!gSavedSettings.getBOOL("AvatarPhysics"))
+		{
+			return FALSE;
+		}
+
 		/*
 		FILE *fread = fopen("c:\\temp\\breast_data.txt","r");
 		if (fread)
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index a49dc1b59d..b777885f79 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -443,6 +443,7 @@ clothing_to_string_map_t init_clothing_string_map()
 	w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn"));
 	w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn"));
 	w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn"));
+	w_map.insert(std::make_pair(LLWearableType::WT_PHYSICS, "physics_not_worn"));
 	return w_map;
 }
 
diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp
index d2e62c86ab..bb1ed61f40 100644
--- a/indra/newview/llwearabletype.cpp
+++ b/indra/newview/llwearabletype.cpp
@@ -34,25 +34,27 @@ struct WearableEntry : public LLDictionaryEntry
 	WearableEntry(const std::string &name,
 				  const std::string& default_new_name,
 				  LLAssetType::EType assetType,
-				  LLInventoryIcon::EIconName iconName);
+				  LLInventoryIcon::EIconName iconName,
+				  BOOL disable_camera_switch = FALSE,
+				  BOOL allow_multiwear = TRUE) :
+		LLDictionaryEntry(name),
+		mAssetType(assetType),
+		mDefaultNewName(default_new_name),
+		mLabel(LLTrans::getString(name)),
+		mIconName(iconName),
+		mDisableCameraSwitch(disable_camera_switch),
+		mAllowMultiwear(allow_multiwear)
+	{
+		
+	}
 	const LLAssetType::EType mAssetType;
 	const std::string mLabel;
 	const std::string mDefaultNewName; //keep mLabel for backward compatibility
 	LLInventoryIcon::EIconName mIconName;
+	BOOL mDisableCameraSwitch;
+	BOOL mAllowMultiwear;
 };
 
-WearableEntry::WearableEntry(const std::string &name,
-							 const std::string& default_new_name,
-							 LLAssetType::EType assetType,
-							 LLInventoryIcon::EIconName iconName) :
-	LLDictionaryEntry(name),
-	mAssetType(assetType),
-	mDefaultNewName(default_new_name),
-	mLabel(LLTrans::getString(name)),
-	mIconName(iconName)
-{
-}
-
 class LLWearableDictionary : public LLSingleton<LLWearableDictionary>,
 							 public LLDictionary<LLWearableType::EType, WearableEntry>
 {
@@ -62,23 +64,26 @@ public:
 
 LLWearableDictionary::LLWearableDictionary()
 {
-	addEntry(LLWearableType::WT_SHAPE,        new WearableEntry("shape",       "New Shape",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_SHAPE));
-	addEntry(LLWearableType::WT_SKIN,         new WearableEntry("skin",        "New Skin",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_SKIN));
-	addEntry(LLWearableType::WT_HAIR,         new WearableEntry("hair",        "New Hair",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_HAIR));
-	addEntry(LLWearableType::WT_EYES,         new WearableEntry("eyes",        "New Eyes",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_EYES));
-	addEntry(LLWearableType::WT_SHIRT,        new WearableEntry("shirt",       "New Shirt",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SHIRT));
-	addEntry(LLWearableType::WT_PANTS,        new WearableEntry("pants",       "New Pants",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_PANTS));
-	addEntry(LLWearableType::WT_SHOES,        new WearableEntry("shoes",       "New Shoes",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SHOES));
-	addEntry(LLWearableType::WT_SOCKS,        new WearableEntry("socks",       "New Socks",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SOCKS));
-	addEntry(LLWearableType::WT_JACKET,       new WearableEntry("jacket",      "New Jacket",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_JACKET));
-	addEntry(LLWearableType::WT_GLOVES,       new WearableEntry("gloves",      "New Gloves",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_GLOVES));
-	addEntry(LLWearableType::WT_UNDERSHIRT,   new WearableEntry("undershirt",  "New Undershirt",	LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT));
-	addEntry(LLWearableType::WT_UNDERPANTS,   new WearableEntry("underpants",  "New Underpants",	LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS));
-	addEntry(LLWearableType::WT_SKIRT,        new WearableEntry("skirt",       "New Skirt",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SKIRT));
-	addEntry(LLWearableType::WT_ALPHA,        new WearableEntry("alpha",       "New Alpha",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_ALPHA));
-	addEntry(LLWearableType::WT_TATTOO,       new WearableEntry("tattoo",      "New Tattoo",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_TATTOO));
-	addEntry(LLWearableType::WT_INVALID,      new WearableEntry("invalid",     "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryIcon::ICONNAME_NONE));
-	addEntry(LLWearableType::WT_NONE,      	  new WearableEntry("none",        "Invalid Wearable", 	LLAssetType::AT_NONE, 		LLInventoryIcon::ICONNAME_NONE));
+	addEntry(LLWearableType::WT_SHAPE,        new WearableEntry("shape",       "New Shape",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_SHAPE, FALSE, FALSE));
+	addEntry(LLWearableType::WT_SKIN,         new WearableEntry("skin",        "New Skin",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_SKIN, FALSE, FALSE));
+	addEntry(LLWearableType::WT_HAIR,         new WearableEntry("hair",        "New Hair",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_HAIR, FALSE, FALSE));
+	addEntry(LLWearableType::WT_EYES,         new WearableEntry("eyes",        "New Eyes",			LLAssetType::AT_BODYPART, 	LLInventoryIcon::ICONNAME_BODYPART_EYES, FALSE, FALSE));
+	addEntry(LLWearableType::WT_SHIRT,        new WearableEntry("shirt",       "New Shirt",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE));
+	addEntry(LLWearableType::WT_PANTS,        new WearableEntry("pants",       "New Pants",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_PANTS, FALSE, TRUE));
+	addEntry(LLWearableType::WT_SHOES,        new WearableEntry("shoes",       "New Shoes",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SHOES, FALSE, TRUE));
+	addEntry(LLWearableType::WT_SOCKS,        new WearableEntry("socks",       "New Socks",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE));
+	addEntry(LLWearableType::WT_JACKET,       new WearableEntry("jacket",      "New Jacket",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_JACKET, FALSE, TRUE));
+	addEntry(LLWearableType::WT_GLOVES,       new WearableEntry("gloves",      "New Gloves",		LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE));
+	addEntry(LLWearableType::WT_UNDERSHIRT,   new WearableEntry("undershirt",  "New Undershirt",	LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE));
+	addEntry(LLWearableType::WT_UNDERPANTS,   new WearableEntry("underpants",  "New Underpants",	LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE));
+	addEntry(LLWearableType::WT_SKIRT,        new WearableEntry("skirt",       "New Skirt",			LLAssetType::AT_CLOTHING, 	LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE));
+	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_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));
 }
 
 // static
@@ -129,3 +134,19 @@ LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType typ
 	return entry->mIconName;
 }
 
+// static 
+BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type)
+{
+	const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+	const WearableEntry *entry = dict->lookup(type);
+	return entry->mDisableCameraSwitch;
+}
+
+// static 
+BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type)
+{
+	const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+	const WearableEntry *entry = dict->lookup(type);
+	return entry->mAllowMultiwear;
+}
+
diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h
index 3bbf8ba0bd..d633b4807e 100644
--- a/indra/newview/llwearabletype.h
+++ b/indra/newview/llwearabletype.h
@@ -52,7 +52,8 @@ public:
 		WT_SKIRT	  = 12,
 		WT_ALPHA	  = 13,
 		WT_TATTOO	  = 14,
-		WT_COUNT	  = 15,
+		WT_PHYSICS	  = 15,
+		WT_COUNT	  = 16,
 
 		WT_INVALID	  = 255,
 		WT_NONE		  = -1,
@@ -64,6 +65,8 @@ public:
 	static LLAssetType::EType 			getAssetType(EType type);
 	static EType 						typeNameToType(const std::string& type_name);
 	static LLInventoryIcon::EIconName 	getIconName(EType type);
+	static BOOL 						getDisableCameraSwitch(EType type);
+	static BOOL 						getAllowMultiwear(EType type);
 
 protected:
 	LLWearableType() {}
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 082b37d80b..65d86403f2 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -223,6 +223,7 @@ with the same filename but different name
   <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
   <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
   <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
+  <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" />
   <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
   <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
   <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
deleted file mode 100644
index 01bced81d0..0000000000
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ /dev/null
@@ -1,3389 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_minimize="false"
- follows="left|top"
- height="583"
- layout="topleft"
- left_delta="-3"
- name="floater customize"
- help_topic="floater_customize"
- save_rect="true"
- title="APPEARANCE"
- top_delta="-185"
- width="600">
-    <tab_container
-     height="517"
-     layout="topleft"
-     left="10"
-     name="customize tab container"
-     tab_min_width="96"
-     tab_position="left"
-     tab_height="50"
-     top="26"
-     width="580">
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="5"
-             name="body_parts_placeholder"
-	     font="SansSerifSmallBold"
-             top="10"
-             width="100">
-                Body Parts
-            </text>
-	    <placeholder />
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Shape"
-         layout="topleft"
-         name="Shape"
-         help_topic="customize_shape_tab"
-         width="400">
-            <icon
-             follows="top|right"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="315"
-             mouse_opaque="true"
-             name="square"
-             top="4"
-             width="18" />
-            <icon
-             height="16"
-	     top="10"
-	     left="10"
-             layout="topleft"
-             mouse_opaque="true"
-             width="16" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Shape"
-             label_selected="Create New Shape"
-             layout="topleft"
-             left="10"
-             name="Create New"
-             top="104"
-             width="160" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Body"
-             label_selected="Body"
-             layout="topleft"
-             left="10"
-             name="Body"
-             top="63"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Head"
-             label_selected="Head"
-             layout="topleft"
-             left_delta="0"
-             name="Head"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Eyes"
-             label_selected="Eyes"
-             layout="topleft"
-             left_delta="0"
-             name="Eyes"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Ears"
-             label_selected="Ears"
-             layout="topleft"
-             left_delta="0"
-             name="Ears"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Nose"
-             label_selected="Nose"
-             layout="topleft"
-             left_delta="0"
-             name="Nose"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Mouth"
-             label_selected="Mouth"
-             layout="topleft"
-             left_delta="0"
-             name="Mouth"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Chin"
-             label_selected="Chin"
-             layout="topleft"
-             left_delta="0"
-             name="Chin"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Torso"
-             label_selected="Torso"
-             layout="topleft"
-             left_delta="0"
-             name="Torso"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Legs"
-             label_selected="Legs"
-             layout="topleft"
-             left_delta="0"
-             name="Legs"
-             top_pad="4"
-             width="82" />
-            <radio_group
-             control_name="AvatarSex"
-             height="34"
-             layout="topleft"
-             name="sex radio"
-	     top_pad="10"
-             width="82">
-                <radio_item
-                 height="16"
-                 label="Female"
-                 layout="topleft"
-                 name="radio"
-                 value="0"
-                 width="82" />
-                <radio_item
-                 height="16"
-                 label="Male"
-                 layout="topleft"
-                 name="radio2"
-                 value="1"
-                 width="82" />
-            </radio_group>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new shape by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <text
-             type="string"
-             length="1"
-             top="488"
-             follows="left|top"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="topleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Shape:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             name="Save"
-             left_pad="2"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             name="Save As"
-             top="477"
-             left_pad="3"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Skin"
-         layout="topleft"
-         name="Skin"
-         help_topic="customize_skin_tab"
-         width="400">
-            <icon
-             follows="top|right"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="315"
-             mouse_opaque="true"
-             name="square"
-             top="4"
-             width="18" />
-            <icon
-             height="16"
-	     top="10"
-	     left="10"
-             layout="topleft"
-             mouse_opaque="true"
-             width="16" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Skin"
-             label_selected="Create New Skin"
-             layout="topleft"
-             left_delta="0"
-             name="Create New"
-             top_delta="-249"
-             width="160" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Skin Color"
-             label_selected="Skin Color"
-             layout="topleft"
-             left="10"
-             name="Skin Color"
-             top="63"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Face Detail"
-             label_selected="Face Detail"
-             layout="topleft"
-             left_delta="0"
-             name="Face Detail"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Makeup"
-             label_selected="Makeup"
-             layout="topleft"
-             left_delta="0"
-             name="Makeup"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Body Detail"
-             label_selected="Body Detail"
-             layout="topleft"
-             left_delta="0"
-             name="Body Detail"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new skin by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             allow_no_texture="true"
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Head Tattoos"
-             layout="topleft"
-             left="10"
-             name="Head Tattoos"
-             tool_tip="Click to choose a picture"
-             top="176"
-             width="82" />
-            <texture_picker
-             allow_no_texture="true"
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Upper Tattoos"
-             layout="topleft"
-             left_delta="0"
-             name="Upper Tattoos"
-             tool_tip="Click to choose a picture"
-             top_delta="102"
-             width="82" />
-            <texture_picker
-             allow_no_texture="true"
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Lower Tattoos"
-             layout="topleft"
-             left_delta="0"
-             name="Lower Tattoos"
-             tool_tip="Click to choose a picture"
-             top_delta="102"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             top="488"
-             follows="left|top"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="topleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Skin:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Hair"
-         layout="topleft"
-         name="Hair"
-         help_topic="customize_hair_tab"
-         width="400">
-            <icon
-             follows="top|right"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="315"
-             mouse_opaque="true"
-             name="square"
-             top="4"
-             width="18" />
-            <icon
-             height="16"
-	     top="10"
-	     left="10"
-             layout="topleft"
-             mouse_opaque="true"
-             width="16" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Color"
-             label_selected="Color"
-             layout="topleft"
-             left="10"
-             name="Color"
-             top="63"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Style"
-             label_selected="Style"
-             layout="topleft"
-             left_delta="0"
-             name="Style"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Eyebrows"
-             label_selected="Eyebrows"
-             layout="topleft"
-             name="Eyebrows"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Facial"
-             label_selected="Facial"
-             layout="topleft"
-             name="Facial"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new hair by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Texture"
-             layout="topleft"
-             left="10"
-             name="Texture"
-             tool_tip="Click to choose a picture"
-             top="176"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Hair"
-             label_selected="Create New Hair"
-             layout="topleft"
-             left_delta="0"
-             name="Create New"
-             top_delta="-89"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             top="488"
-             follows="left|top"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="topleft"
-             name="Item Action Label"
-             left="10"
-             width="130">
-                Hair:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Eyes"
-         layout="topleft"
-         name="Eyes"
-         help_topic="customize_eyes_tab"
-         width="400">
-            <icon
-             follows="top|right"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="315"
-             mouse_opaque="true"
-             name="square"
-             top="4"
-             width="18" />
-            <icon
-             height="16"
-	     top="10"
-	     left="10"
-             layout="topleft"
-             mouse_opaque="true"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new set of eyes by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Iris"
-             layout="topleft"
-             left="10"
-             name="Iris"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Eyes"
-             label_selected="Create New Eyes"
-             layout="topleft"
-             name="Create New"
-             top="66"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             name="Item Action Label"
-             left="10"
-             width="130">
-                Eyes:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="5"
-             name="clothes_placeholder"
-	     font="SansSerifSmallBold"
-             top="125"
-             width="100">
-                Clothes
-            </text>
-	    <placeholder />
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Shirt"
-         layout="topleft"
-         name="Shirt"
-         help_topic="customize_shirt_tab"
-         top_delta="0"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-	     top="10"
-	     left="10"
-             layout="topleft"
-             mouse_opaque="true"
-             width="16" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Shirt"
-             label_selected="Create New Shirt"
-             layout="topleft"
-             name="Create New"
-             top="66"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             name="Item Action Label"
-             left="10"
-             width="130">
-                Shirt:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new shirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Pants"
-         layout="topleft"
-         name="Pants"
-         help_topic="customize_pants_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Pants"
-             label_selected="Create New Pants"
-             layout="topleft"
-             name="Create New"
-             top="66"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             name="Item Action Label"
-             left="10"
-             width="130">
-                Pants:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on new pants by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Shoes"
-         layout="topleft"
-         name="Shoes"
-         help_topic="customize_shoes_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new pair of shoes by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Shoes"
-             label_selected="Create New Shoes"
-             layout="topleft"
-             name="Create New"
-             top_pad="18"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Shoes:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Socks"
-         layout="topleft"
-         name="Socks"
-         help_topic="customize_socks_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on new socks by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Socks"
-             label_selected="Create New Socks"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Socks:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Jacket"
-         layout="topleft"
-         name="Jacket"
-         help_topic="customize_jacket_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new jacket by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Jacket"
-             label_selected="Create New Jacket"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Upper Fabric"
-             layout="topleft"
-             left="10"
-             name="Upper Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Lower Fabric"
-             layout="topleft"
-             name="Lower Fabric"
-             tool_tip="Click to choose a picture"
-             top_delta="102"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Jacket:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Gloves"
-         layout="topleft"
-         name="Gloves"
-         help_topic="customize_gloves_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on new gloves by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Gloves"
-             label_selected="Create New Gloves"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Gloves:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Undershirt"
-         layout="topleft"
-         name="Undershirt"
-         help_topic="customize_undershirt_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new undershirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Undershirt"
-             label_selected="Create New Undershirt"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Undershirt:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Underpants"
-         layout="topleft"
-         name="Underpants"
-         help_topic="customize_underpants_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on new underpants by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Underpants"
-             label_selected="Create New Underpants"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Underpants:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Skirt"
-         layout="topleft"
-         name="Skirt"
-         help_topic="customize_skirt_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new skirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Skirt"
-             label_selected="Create New Skirt"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Fabric"
-             layout="topleft"
-             left="10"
-             name="Fabric"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="108"
-             label="Color/Tint"
-             layout="topleft"
-             name="Color/Tint"
-             tool_tip="Click to open color picker"
-             top_delta="102"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Skirt:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Tattoo"
-         layout="topleft"
-         name="Tattoo"
-         help_topic="customize_tattoo_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new tattoo by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Tattoo"
-             label_selected="Create New Tattoo"
-             layout="topleft"
-             name="Create New"
-             top_pad="7"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Head Tattoo"
-             layout="topleft"
-             left="10"
-             name="Head Tattoo"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Upper Tattoo"
-             layout="topleft"
-             name="Upper Tattoo"
-             tool_tip="Click to choose a picture"
-             left_delta="90"
-             width="82" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Lower Tattoo"
-             layout="topleft"
-             name="Lower Tattoo"
-             tool_tip="Click to choose a picture"
-             left_delta="90"
-             width="82" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             top_pad="4"
-             left="10"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Tattoo:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-        <panel
-         border="false"
- background_visible="true"
- bg_alpha_color="DkGray2"
-         follows="left|top|right|bottom"
-         height="508"
-         label="Alpha"
-         layout="topleft"
-         name="Alpha"
-         help_topic="customize_alpha_tab"
-         width="400">
-            <icon
-             follows="top|left"
-             height="18"
-             image_name="Lock"
-             layout="topleft"
-             left="10"
-             mouse_opaque="true"
-             name="square"
-             top="10"
-             width="18" />
-            <icon
-             height="16"
-             layout="topleft"
-	     left="10"
-             mouse_opaque="true"
-	     top="10"
-             width="16" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title"
-             top="10"
-             width="355">
-                [DESC]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_no_modify"
-             top="10"
-             width="355">
-                [DESC]: cannot modify
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_loading"
-             top="10"
-             width="355">
-                [DESC]: loading...
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             font="SansSerif"
-             height="16"
-             layout="topleft"
-             left="31"
-             name="title_not_worn"
-             top="10"
-             width="355">
-                [DESC]: not worn
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="14"
-             layout="topleft"
-             left="10"
-             name="path"
-             top="36"
-             width="373">
-                Located in [PATH]
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="not worn instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                Put on a new alpha mask by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
-            </text>
-            <button
-             follows="left|top"
-             height="23"
-             label="Create New Alpha"
-             label_selected="Create New Alpha"
-             layout="topleft"
-             name="Create New"
-             top_pad="18"
-             width="160" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top|right"
-             height="28"
-             layout="topleft"
-             left="10"
-             name="no modify instructions"
-             top="31"
-             word_wrap="true"
-             width="373">
-                You do not have permission to modify this wearable.
-            </text>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Lower Alpha"
-             layout="topleft"
-             left="10"
-             name="Lower Alpha"
-             tool_tip="Click to choose a picture"
-             top="66"
-             width="82" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Upper Alpha"
-             layout="topleft"
-             name="Upper Alpha"
-             tool_tip="Click to choose a picture"
-             left_delta="90"
-             width="82" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Head Alpha"
-             layout="topleft"
-             name="Head Alpha"
-             tool_tip="Click to choose a picture"
-             left_delta="90"
-             width="82" />
-            <check_box
-             control_name="LowerAlphaTextureInvisible"
-             follows="left"
-             height="16"
-             layout="topleft"
-             left="43"
-             name="lower alpha texture invisible"
-             top_delta="96"
-             width="16" />
-            <check_box
-             control_name="UpperAlphaTextureInvisible"
-             follows="left"
-             height="16"
-             layout="topleft"
-             left_pad="72"
-             name="upper alpha texture invisible"
-             width="16" />
-            <check_box
-             control_name="HeadAlphaTextureInvisible"
-             follows="left"
-             height="16"
-             layout="topleft"
-             left_pad="72"
-             name="head alpha texture invisible"
-             width="16" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Eye Alpha"
-             layout="topleft"
-             name="Eye Alpha"
-             tool_tip="Click to choose a picture"
-             left="10"
-             top_pad="20"
-             width="82" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="108"
-             label="Hair Alpha"
-             layout="topleft"
-             name="Hair Alpha"
-             left_delta="90"
-             tool_tip="Click to choose a picture"
-             width="82" />
-            <check_box
-             control_name="Eye AlphaTextureInvisible"
-             follows="left"
-             height="16"
-             layout="topleft"
-             left="43"
-             name="eye alpha texture invisible"
-             top_delta="96"
-             width="16" />
-            <check_box
-             control_name="HairAlphaTextureInvisible"
-             follows="left"
-             height="16"
-             layout="topleft"
-             left_pad="72"
-             name="hair alpha texture invisible"
-             width="16" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Take Off"
-             label_selected="Take Off"
-             layout="topleft"
-             name="Take Off"
-             left="10"
-             top_pad="20"
-             width="82" />
-            <text
-             type="string"
-             length="1"
-             bottom="4"
-             follows="left|bottom"
-             font="SansSerif"
-             halign="right"
-             height="23"
-             layout="bottomleft"
-             left="10"
-             name="Item Action Label"
-             width="130">
-                Alpha:
-            </text>
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save"
-             label_selected="Save"
-             layout="topleft"
-             left_pad="2"
-             name="Save"
-             top="477"
-             width="82" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Save As..."
-             label_selected="Save As..."
-             layout="topleft"
-             left_pad="3"
-             name="Save As"
-             top="477"
-             width="115" />
-            <button
-             follows="left|bottom"
-             height="23"
-             label="Revert"
-             label_selected="Revert"
-             layout="topleft"
-             left_pad="3"
-             name="Revert"
-             top="477"
-             width="120" />
-        </panel>
-    </tab_container>
-    <scroll_container
-     follows="left|top|right|bottom"
-     height="409"
-     layout="topleft"
-     left="247"
-     mouse_opaque="false"
-     name="panel_container"
-     top="92"
-     width="330">
-        <scrolling_panel_list
-         follows="left|bottom"
-         layout="topleft"
-         name="panel_list" />
-    </scroll_container>
-    <button
-     bottom="460"
-     follows="right|left"
-     height="23"
-     label="Script Info"
-     label_selected="Script Info"
-     layout="topleft"
-     name="script_info"
-     tool_tip="Show scripts attached to your avatar"
-     left="13"
-     width="90" ></button>
-    <button
-     bottom="574"
-     follows="right|bottom"
-     height="23"
-     label="Make Outfit"
-     label_selected="Make Outfit"
-     layout="topleft"
-     name="make_outfit_btn"
-     right="-218"
-     width="120" />
-    <button
-     bottom="574"
-     follows="right|bottom"
-     height="23"
-     label="Cancel"
-     label_selected="Cancel"
-     layout="topleft"
-     name="Cancel"
-     right="-10"
-     width="100" />
-    <button
-     bottom="574"
-     follows="right|bottom"
-     height="23"
-     label="OK"
-     label_selected="OK"
-     layout="topleft"
-     name="Ok"
-     right="-114"
-     width="100" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index acdecbad31..e2348375d5 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -80,14 +80,6 @@ name="Edit Outfit">
     <menu_item_call.on_enable
      function="Edit.EnableEditShape" />
   </menu_item_call>
-  <menu_item_call label="Edit My Physics"
-  layout="topleft"
-  name="Edit My Physics">
-    <menu_item_call.on_click
-     function="EditPhysics" />
-    <menu_item_call.on_enable
-     function="Edit.EnableEditPhysics" />
-  </menu_item_call>
   <menu_item_call
     label="My Friends"
     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index 71b8eea94c..83bc4d0720 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -140,6 +140,18 @@
                      function="Edit.EnableTakeOff"
                      parameter="tattoo" />
                 </menu_item_call>
+               <menu_item_call
+                 enabled="false"
+                 label="Physics"
+                 layout="topleft"
+                 name="Self Physics">
+                    <menu_item_call.on_click
+                     function="Edit.TakeOff"
+                     parameter="physics" />
+                    <menu_item_call.on_enable
+                     function="Edit.EnableTakeOff"
+                     parameter="physics" />
+                </menu_item_call>
                <menu_item_call
                  enabled="false"
                  label="Alpha"
@@ -206,14 +218,6 @@
         function="EditShape" />
        <menu_item_call.on_enable
         function="Edit.EnableEditShape" />
-   </menu_item_call>
-    <menu_item_call label="Edit My Physics" 
-    layout="topleft"
-    name="Edit My Physics">
-       <menu_item_call.on_click
-        function="EditPhysics" />
-       <menu_item_call.on_enable
-        function="Edit.EnableEditPhysics" />
    </menu_item_call>
    <menu_item_call
      label="My Friends"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index c0046d8e28..e91f4458ae 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -200,6 +200,14 @@
              function="Inventory.DoCreate"
              parameter="tattoo" />
         </menu_item_call>
+        <menu_item_call
+         label="New Physics"
+         layout="topleft"
+         name="New Physics">
+            <menu_item_call.on_click
+             function="Inventory.DoCreate"
+             parameter="physics" />
+        </menu_item_call>
     </menu>
     <menu
      label="New Body Parts"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index ae98abf4fb..90e8db3709 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -188,6 +188,14 @@
                      function="Inventory.DoCreate"
                      parameter="tattoo" />
                 </menu_item_call>
+                <menu_item_call
+                 label="New Physics"
+                 layout="topleft"
+                 name="New Physics">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="physics" />
+                </menu_item_call>
             </menu>
             <menu
              height="85"
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 732b8a788d..cba1804a5e 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -132,6 +132,14 @@
                      function="Gear.Create"
                      parameter="alpha" />
                 </menu_item_call>
+                <menu_item_call
+                 label="New Physics"
+                 layout="topleft"
+                 name="New Physics">
+                    <menu_item_call.on_click
+                     function="Gear.Create"
+                     parameter="physics" />
+                </menu_item_call>
                 <menu_item_call
                  label="New Tattoo"
                  layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 0b85074eb6..72f68c41e3 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3305,6 +3305,16 @@
                  function="Edit.EnableTakeOff"
                  parameter="tattoo" />
             </menu_item_call>
+            <menu_item_call
+             label="Physics"
+             name="Physics">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="physics" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="physics" />
+            </menu_item_call>
             <menu_item_call
              label="All Clothes"
              name="All Clothes">
diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml
new file mode 100644
index 0000000000..4e781e2360
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+     background_visible="true"
+	 follows="all"
+	 height="400"
+	 layout="topleft"
+	 left="0"
+	 name="edit_physics_panel"
+	 top_pad="10"
+	 width="333" >
+	 <panel
+         border="false"
+         bg_alpha_color="DkGray2"
+         bg_opaque_color="DkGray2"
+         background_visible="true"
+         background_opaque="true"
+         follows="all"
+         height="300"
+         layout="topleft"
+         left="10"
+         name="accordion_panel"
+         top_pad="10"
+         width="313">
+     <accordion
+        fit_parent="true"
+        follows="all"
+        height ="300"
+        layout="topleft"
+        left="0"
+        name="wearable_accordion"
+        single_expansion="true"
+        top="0"
+        width="313">
+		<accordion_tab
+			layout="topleft"
+            fit_panel="false"
+			min_height="150"
+			name="physics_main_tab"
+			title="Physics">
+			<scrolling_panel_list
+				follows="all"
+                layout="topleft"
+				left="0"
+				name="physics_main_param_list"
+				top="0"
+				width="303" />
+		</accordion_tab>
+	</accordion>
+    </panel>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index 9fb777e0e7..aa540cdfe0 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -71,6 +71,10 @@
      name="edit_tattoo_title">
         Editing Tattoo
     </string>
+    <string
+     name="edit_physics_title">
+        Editing Physics
+    </string>
     <string
      name="shape_desc_text">
         Shape:
@@ -131,6 +135,10 @@
      name="tattoo_desc_text">
         Tattoo:
     </string>
+    <string
+     name="physics_desc_text">
+        Physics:
+    </string>
     <!-- Default width of the button should be to show it without label.
      Button will be extedned in code to show whole label when wearable is being changed.
     -->
@@ -407,6 +415,16 @@
          top="8"
          visible="false"
          width="333" />
+        <panel
+         filename="panel_edit_physics.xml"
+         follows="all"
+         height="425"
+         layout="topleft"
+         left="0"
+         name="edit_physics_panel"
+         top="8"
+         visible="false"
+         width="333" />
     </panel>
     <panel
      follows="bottom|left|right"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 7a010697ac..532a4a2e6d 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1813,6 +1813,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="skirt">Skirt</string>
 	<string name="alpha">Alpha</string>
 	<string name="tattoo">Tattoo</string>
+  <string name="physics">Physics</string>
   <string name="invalid">invalid</string>
   <string name="none">none</string>
   
@@ -1828,6 +1829,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="skirt_not_worn">Skirt not worn</string>
 	<string name="alpha_not_worn">Alpha not worn</string>
 	<string name="tattoo_not_worn">Tattoo not worn</string>
+  <string name="physics_not_worn">Physics not worn</string>
 	<string name="invalid_not_worn">invalid</string>
 
 	<!-- Create new wearable of the specified type -->
@@ -1846,6 +1848,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="create_new_skirt">Create new skirt</string>
 	<string name="create_new_alpha">Create new alpha</string>
 	<string name="create_new_tattoo">Create new tattoo</string>
+  <string name="create_new_physics">Create new physics</string>
 	<string name="create_new_invalid">invalid</string>
 
   <!-- Wearable List-->
@@ -3186,6 +3189,7 @@ Abuse Report</string>
   <string name="New Skirt">New Skirt</string>
   <string name="New Alpha">New Alpha</string>
   <string name="New Tattoo">New Tattoo</string>
+  <string name="New Physics">New Physics</string>
   <string name="Invalid Wearable">Invalid Wearable</string>
   <string name="New Gesture">New Gesture</string>
   <string name="New Script">New Script</string>
-- 
cgit v1.2.3


From 782a0cf81190449dbeaff6372cacc5d9b34fdcfa Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 23 Aug 2010 17:12:10 -0400
Subject: Fixed backwards compatibility so that orig Breast params are
 preserved. Cleaned up some code. Removed "Add" from right-click when
 multiwear is not permitted.

---
 indra/newview/character/avatar_lad.xml | 78 +++++++++++++++++-----------------
 indra/newview/llinventorybridge.cpp    | 11 +++--
 indra/newview/llvoavatar.cpp           | 32 +++++++-------
 3 files changed, 62 insertions(+), 59 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 7dd15c67c7..e37ff1833d 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -4044,7 +4044,7 @@
     </param>
 
     <param
-     id="507"
+     id="1087"
      group="0"
      sex="female"
      name="Breast_Gravity"
@@ -4061,6 +4061,24 @@
       <param_morph />
     </param>
 
+    <param
+     id="1088"
+     group="0"
+     sex="female"
+     name="Breast_Female_Cleavage"
+     label="Breast Cleavage"
+     wearable="shape"
+     edit_group="driven"
+     label_min="Separate"
+     label_max="Join"
+     value_default="0"
+     value_min="-.3"
+     value_max="1.3"
+     camera_elevation=".3"
+     camera_distance=".8">
+      <param_morph />
+    </param>
+
     <param
      id="628"
      group="1"
@@ -4111,24 +4129,6 @@
       </param_morph>
     </param>
 
-    <param
-     id="684"
-     group="0"
-     sex="female"
-     name="Breast_Female_Cleavage"
-     label="Breast Cleavage"
-     wearable="shape"
-     edit_group="driven"
-     label_min="Separate"
-     label_max="Join"
-     value_default="0"
-     value_min="-.3"
-     value_max="1.3"
-     camera_elevation=".3"
-     camera_distance=".8">
-      <param_morph />
-    </param>
-
     <param
      id="685"
      group="0"
@@ -9083,7 +9083,7 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="1"
+     value_default="2"
      value_min="1"
      value_max="5"
      camera_elevation=".3"
@@ -9121,7 +9121,7 @@ render_pass="bump">
      label_max="More"
      value_default="0"
      value_min="0"
-     value_max="2"
+     value_max="1"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9209,9 +9209,9 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="10"
+     value_default="0"
      value_min="0"
-     value_max="100"
+     value_max="10"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9300,55 +9300,55 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="10"
+     value_default="0"
      value_min="0"
-     value_max="100"
+     value_max="10"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
     </param>
 
-
-
    <param
-     id="1087"
+     id="507"
      group="0"
      sex="female"
-     name="Breast_Female_Cleavage_Driver"
-     label="Breast Cleavage"
+     name="Breast_Gravity_Driver"
+     label="Breast Buoyancy"
      wearable="shape"
      edit_group="shape_torso"
+     edit_group_order="7"
      label_min="Less"
      label_max="More"
      value_default="10"
-     value_min="-.3"
-     value_max="1.3"
+     value_min="-1.5"
+     value_max="2"
      camera_elevation=".3"
      camera_distance=".8">
       <param_driver>
         <driven
-         id="684" />
+         id="1087" />
 	</param_driver>
     </param>
 
    <param
-     id="1088"
+     id="684"
      group="0"
      sex="female"
-     name="Breast_Gravity_Driver"
-     label="Breast Buoyancy"
+     name="Breast_Female_Cleavage_Driver"
+     label="Breast Cleavage"
      wearable="shape"
      edit_group="shape_torso"
+     edit_group_order="7"
      label_min="Less"
      label_max="More"
      value_default="10"
-     value_min="-1.5"
-     value_max="2"
+     value_min="-.3"
+     value_max="1.3"
      camera_elevation=".3"
      camera_distance=".8">
       <param_driver>
         <driven
-         id="507" />
+         id="1088" />
 	</param_driver>
     </param>
 
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index a564059b87..27a01dd94f 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4492,14 +4492,17 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 					else
 					{
 						items.push_back(std::string("Wearable And Object Wear"));
-						items.push_back(std::string("Wearable Add"));
 						disabled_items.push_back(std::string("Take Off"));
 						disabled_items.push_back(std::string("Wearable Edit"));
 					}
-					if (gAgentWearables.isWearingWearableType(mWearableType) &&
-						!LLWearableType::getAllowMultiwear(mWearableType))
+
+					if (LLWearableType::getAllowMultiwear(mWearableType))
 					{
-						disabled_items.push_back(std::string("Wearable Add"));
+						items.push_back(std::string("Wearable Add"));
+						if (gAgentWearables.getWearableCount(mWearableType) > 0)
+						{
+							disabled_items.push_back(std::string("Wearable Add"));
+						}
 					}
 					break;
 				default:
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 80b10cc05e..ac1af83959 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -789,7 +789,7 @@ public:
 	{
 		if (!gSavedSettings.getBOOL("AvatarPhysics"))
 		{
-			return FALSE;
+			return TRUE;
 		}
 
 		/*
@@ -817,21 +817,21 @@ public:
 		   6. Threshold for not setting param
 		*/
 
-		mBreastMassParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Mass"))->getWeight();
-		mBreastSmoothingParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Smoothing"))->getWeight();
-		mBreastGravityParam = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Gravity"))->getWeight();
-
-		mBreastSpringParam[0] =       ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Spring"))->getWeight();
-		mBreastGainParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Gain"))->getWeight();
-		mBreastDampingParam[0] =      ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Damping"))->getWeight();
-		mBreastMaxVelocityParam[0] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Range"))->getWeight();
-		mBreastDragParam[0] =        ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_Side_Drag"))->getWeight();
-
-		mBreastSpringParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Spring"))->getWeight();
-		mBreastGainParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Gain"))->getWeight();
-		mBreastDampingParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Damping"))->getWeight();
-		mBreastMaxVelocityParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Range"))->getWeight();
-		mBreastDragParam[2] = ((LLViewerVisualParam*)mCharacter->getVisualParam("Breast_Physics_UpDown_Drag"))->getWeight();
+		mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
+		mBreastSmoothingParam = mCharacter->getVisualParamWeight("Breast_Physics_Smoothing");
+		mBreastGravityParam = mCharacter->getVisualParamWeight("Breast_Physics_Gravity");
+
+		mBreastSpringParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Spring");
+		mBreastGainParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Gain");
+		mBreastDampingParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Damping");
+		mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Range");
+		mBreastDragParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Drag");
+
+		mBreastSpringParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
+		mBreastGainParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
+		mBreastDampingParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
+		mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Range");
+		mBreastDragParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
 
 		if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
 		const F32 time_delta = calculateTimeDelta();
-- 
cgit v1.2.3


From 2c6a9dd47e617c79ab3df4d758cd9f2e6b77c21a Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 23 Aug 2010 17:38:31 -0400
Subject: Changed "Range" to "Max Velocity" Changed logic to reset to user
 params if velocity is 0. Code cleanup. Took out extraneous "Physics"
 accordions from previous implementation.

---
 indra/newview/character/avatar_lad.xml             | 10 ++++-----
 indra/newview/llsidepanelappearance.cpp            | 10 ---------
 indra/newview/llsidepanelappearance.h              |  1 -
 indra/newview/llvoavatar.cpp                       | 25 ++++++----------------
 .../skins/default/xui/en/panel_edit_shape.xml      | 14 ------------
 indra/newview/skins/default/xui/en/strings.xml     |  4 ++--
 6 files changed, 14 insertions(+), 50 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index e37ff1833d..9609e58918 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9203,8 +9203,8 @@ render_pass="bump">
      id="1081"
      group="0"
      sex="female"
-     name="Breast_Physics_Side_Range"
-     label="Breast Physics Side Range"
+     name="Breast_Physics_Side_Max_Velocity"
+     label="Breast Physics Side Max Speed"
      wearable="physics"
      edit_group="physics"
      label_min="Less"
@@ -9294,8 +9294,8 @@ render_pass="bump">
      id="1086"
      group="0"
      sex="female"
-     name="Breast_Physics_UpDown_Range"
-     label="Breast Physics UpDown Range"
+     name="Breast_Physics_UpDown_Max_Velocity"
+     label="Breast Physics UpDown Max Speed"
      wearable="physics"
      edit_group="physics"
      label_min="Less"
@@ -9338,7 +9338,7 @@ render_pass="bump">
      label="Breast Cleavage"
      wearable="shape"
      edit_group="shape_torso"
-     edit_group_order="7"
+     edit_group_order="8"
      label_min="Less"
      label_max="More"
      value_default="10"
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index cd6f87f615..e8733bf3e4 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -176,11 +176,6 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
 		{
 			showWearableEditPanel();
 		}
-		else if (type == "edit_physics")
-		{
-			showPhysicsEditPanel();
-		}
-
 	}
 
 	mOpened = true;
@@ -312,11 +307,6 @@ void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL
 	toggleWearableEditPanel(TRUE, wearable, disable_camera_switch);
 }
 
-void LLSidepanelAppearance::showPhysicsEditPanel(LLWearable *wearable /* = NULL*/)
-{
-	showWearableEditPanel(wearable, TRUE);
-}
-
 void LLSidepanelAppearance::toggleMyOutfitsPanel(BOOL visible)
 {
 	if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible)
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 70c8b7b797..1a200e255c 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -60,7 +60,6 @@ public:
 	void showOutfitsInventoryPanel();
 	void showOutfitEditPanel();
 	void showWearableEditPanel(LLWearable *wearable = NULL, BOOL disable_camera_switch = FALSE);
-	void showPhysicsEditPanel(LLWearable *wearable = NULL);
 	void setWearablesLoading(bool val);
 	void showDefaultSubpart();
 	void updateScrollingPanelList();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index ac1af83959..c9e47d8996 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -792,22 +792,6 @@ public:
 			return TRUE;
 		}
 
-		/*
-		FILE *fread = fopen("c:\\temp\\breast_data.txt","r");
-		if (fread)
-		{
-			char dummy_str[255];
-			fscanf(fread,"%s %f\n",dummy_str, &mBreastMassParam);
-			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastSpringParam[0],&mBreastSpringParam[1],&mBreastSpringParam[2]);
-			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastGainParam[0],&mBreastGainParam[1],&mBreastGainParam[2]);
-			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDampingParam[0],&mBreastDampingParam[1],&mBreastDampingParam[2]);
-			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastMaxVelocityParam[0],&mBreastMaxVelocityParam[1],&mBreastMaxVelocityParam[2]);
-			fscanf(fread,"%s %f %f %f\n",dummy_str, &mBreastDragParam[0], &mBreastDragParam[1], &mBreastDragParam[2]);
-			fscanf(fread,"%s %d\n",dummy_str, &mBreastSmoothingParam);
-		}
-		fclose(fread);
-		*/
-		
 		/* TEST:
 		   1. Change outfits
 		   2. FPS effect
@@ -824,13 +808,13 @@ public:
 		mBreastSpringParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Spring");
 		mBreastGainParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Gain");
 		mBreastDampingParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Damping");
-		mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Range");
+		mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Max_Velocity");
 		mBreastDragParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Drag");
 
 		mBreastSpringParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
 		mBreastGainParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
 		mBreastDampingParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
-		mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Range");
+		mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
 		mBreastDragParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
 
 		if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
@@ -890,8 +874,13 @@ public:
 		LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
 		new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
 		
+		
 		for (U32 i=0; i < 3; i++)
 		{
+			if (mBreastMaxVelocityParam[0] == 0)
+			{
+				new_local_pt[i] = breast_user_local_pt[i];
+			}
 			if (mBreastParamsDriven[i])
 			{
 				mCharacter->setVisualParamWeight(mBreastParamsDriven[i],
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
index a7563d6f96..d295f5fe4a 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
@@ -175,20 +175,6 @@
 				top="0"
 				width="303" />
 		</accordion_tab>
-		<accordion_tab
-			layout="topleft"
-			min_height="150"
-			name="shape_physics_tab"
-            fit_panel="false"
-			title="Physics">
-           <scrolling_panel_list
-                layout="topleft"
-				follows="all"
-				left="0"
-				name="shape_physics_param_list"
-				top="0"
-				width="303" />
-		</accordion_tab>
 	</accordion>
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 532a4a2e6d..9fbb1ed045 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2482,13 +2482,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Breast Physics Side Gain">Breast Side Gain</string>
 <string name="Breast Physics Side Damping">Breast Side Damping</string>
 <string name="Breast Physics Side Drag">Breast Side Drag</string>
-<string name="Breast Physics Side Range">Breast Side Max</string>
+<string name="Breast Physics Side Max Velocity">Breast Side Max</string>
 
 <string name="Breast Physics UpDown Spring">Breast UpDown Spring</string>
 <string name="Breast Physics UpDown Gain">Breast UpDown Gain</string>
 <string name="Breast Physics UpDown Damping">Breast UpDown Damping</string>
 <string name="Breast Physics UpDown Drag">Breast UpDown Drag</string>
-<string name="Breast Physics UpDown Range">Breast UpDown Range</string>
+<string name="Breast Physics UpDown Max Velocity">Breast UpDown Range</string>
 
 <string name="Bushy Eyebrows">Bushy Eyebrows</string>
 <string name="Bushy Hair">Bushy Hair</string>
-- 
cgit v1.2.3


From 8c95027334b24130dfdc1a51b3020156f371d538 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 24 Aug 2010 11:54:22 -0400
Subject: Moved BreastMotion class to its own separate file out of llvoavatar.
 Changed range of some breast motion params. Updated icon.

---
 indra/newview/CMakeLists.txt                   |   2 +
 indra/newview/character/avatar_lad.xml         |   8 +-
 indra/newview/llbreastmotion.cpp               | 360 +++++++++++++++++++++++
 indra/newview/llbreastmotion.h                 | 161 +++++++++++
 indra/newview/llvoavatar.cpp                   | 382 +------------------------
 indra/newview/skins/default/xui/en/strings.xml |   4 +-
 6 files changed, 531 insertions(+), 386 deletions(-)
 create mode 100644 indra/newview/llbreastmotion.cpp
 create mode 100644 indra/newview/llbreastmotion.h

(limited to 'indra')

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 630902c48f..fa65ca0aaa 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -91,6 +91,7 @@ set(viewer_SOURCE_FILES
     llbottomtray.cpp
     llbox.cpp
     llbreadcrumbview.cpp
+    llbreastmotion.cpp
     llbuycurrencyhtml.cpp
     llcallbacklist.cpp
     llcallfloater.cpp
@@ -613,6 +614,7 @@ set(viewer_HEADER_FILES
     llbottomtray.h
     llbox.h
     llbreadcrumbview.h
+    llbreastmotion.h
     llbuycurrencyhtml.h
     llcallbacklist.h
     llcallfloater.h
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 9609e58918..54794b849f 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9139,7 +9139,7 @@ render_pass="bump">
      label_max="More"
      value_default="3"
      value_min="0"
-     value_max="5"
+     value_max="10"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9209,7 +9209,7 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="0"
+     value_default="5"
      value_min="0"
      value_max="10"
      camera_elevation=".3"
@@ -9230,7 +9230,7 @@ render_pass="bump">
      label_max="More"
      value_default="1.5"
      value_min="0"
-     value_max="5"
+     value_max="10"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9300,7 +9300,7 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="0"
+     value_default="5"
      value_min="0"
      value_max="10"
      camera_elevation=".3"
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
new file mode 100644
index 0000000000..c773655f35
--- /dev/null
+++ b/indra/newview/llbreastmotion.cpp
@@ -0,0 +1,360 @@
+/** 
+ * @file llbreastmotion.cpp
+ * @brief Implementation of LLBreastMotion 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 "llbreastmotion.h"
+#include "llcharacter.h"
+#include "llviewercontrol.h"
+#include "llviewervisualparam.H"
+
+// #define OUTPUT_BREAST_DATA
+
+//-----------------------------------------------------------------------------
+// LLBreastMotion()
+// Class Constructor
+//-----------------------------------------------------------------------------
+LLBreastMotion::LLBreastMotion(const LLUUID &id) : 
+	LLMotion(id),
+	mCharacter(NULL),
+	mFileWrite(NULL)
+{
+	mName = "breast_motion";
+	mChestState = new LLJointState;
+
+	mBreastMassParam = (F32)1.0;
+	mBreastDragParam = LLVector3((F32)0.1, (F32)0.1, (F32)0.1);
+	mBreastSmoothingParam = (U32)2;
+	mBreastGravityParam = (F32)0.0;
+
+	mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0);
+	mBreastGainParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0);
+	mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3);
+	mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0);
+
+	mBreastParamsUser[0] = mBreastParamsUser[1] = mBreastParamsUser[2] = NULL;
+	mBreastParamsDriven[0] = mBreastParamsDriven[1] = mBreastParamsDriven[2] = NULL;
+
+	mCharLastPosition_world_pt = LLVector3(0,0,0);
+	mCharLastVelocity_local_vec = LLVector3(0,0,0);
+	mCharLastAcceleration_local_vec = LLVector3(0,0,0);
+	mBreastLastPosition_local_pt = LLVector3(0,0,0);
+	mBreastVelocity_local_vec = LLVector3(0,0,0);
+}
+
+
+
+//-----------------------------------------------------------------------------
+// ~LLBreastMotion()
+// Class Destructor
+//-----------------------------------------------------------------------------
+LLBreastMotion::~LLBreastMotion()
+{
+}
+
+BOOL LLBreastMotion::onActivate() 
+{ 
+	return TRUE; 
+}
+
+void LLBreastMotion::onDeactivate() 
+{
+}
+
+LLMotion::LLMotionInitStatus LLBreastMotion::onInitialize(LLCharacter *character)
+{
+	mCharacter = character;
+	BOOL success = true;
+
+	if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; }
+
+	if (!success)
+	{
+		return STATUS_FAILURE;
+	}
+		
+	mChestState->setUsage(LLJointState::ROT);
+	addJointState( mChestState );
+
+	// User-set params
+	static const std::string breast_param_names_user[3] =
+		{
+			"Breast_Female_Cleavage_Driver",
+			"",
+			"Breast_Gravity_Driver"
+		};
+
+	// Params driven by this algorithm
+	static const std::string breast_param_names_driven[3] =
+		{
+			"Breast_Female_Cleavage",
+			"",
+			"Breast_Gravity"
+		};
+		
+	for (U32 i=0; i < 3; i++)
+	{
+		mBreastParamsUser[i] = NULL;
+		mBreastParamsDriven[i] = NULL;
+		mBreastParamsMin[i] = 0;
+		mBreastParamsMax[i] = 0;
+		if (breast_param_names_user[i] != "" && breast_param_names_driven[i] != "")
+		{
+			mBreastParamsUser[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_user[i].c_str());
+			mBreastParamsDriven[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_driven[i].c_str());
+			if (mBreastParamsDriven[i])
+			{
+				mBreastParamsMin[i] = mBreastParamsDriven[i]->getMinWeight();
+				mBreastParamsMax[i] = mBreastParamsDriven[i]->getMaxWeight();
+			}
+		}
+	}
+
+#ifdef OUTPUT_BREAST_DATA
+	//if (mCharacter->getSex() == SEX_FEMALE)
+	if (dynamic_cast<LLVOAvatarSelf *>(mCharacter))
+	{
+		mFileWrite = fopen("c:\\temp\\data.txt","w");
+		if (mFileWrite != NULL)
+		{
+			fprintf(mFileWrite,"Pos\tParam\tNet\tVel\t\tAccel\tSpring\tDamp\n");
+		}
+	}
+#endif
+
+	mTimer.reset();
+	return STATUS_SUCCESS;
+}
+
+
+
+F32 LLBreastMotion::calculateTimeDelta()
+{
+	const F32 time = mTimer.getElapsedTimeF32();
+	const F32 time_delta = time - mLastTime;
+
+	mLastTime = time;
+
+	return time_delta;
+}
+
+LLVector3 LLBreastMotion::toLocal(const LLVector3 &world_vector)
+{
+	LLVector3 local_vec(0,0,0);
+
+	LLJoint *chest_joint = mChestState->getJoint();
+	const LLQuaternion world_rot = chest_joint->getWorldRotation();
+		
+	// -1 because cleavage param changes opposite to direction.
+	LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot;
+	breast_dir_world_vec.normalize();
+	local_vec[0] = world_vector * breast_dir_world_vec;
+
+	LLVector3 breast_up_dir_world_vec = LLVector3(0,0,1) * world_rot;
+	breast_up_dir_world_vec.normalize();
+	local_vec[2] = world_vector * breast_up_dir_world_vec;
+
+	/*
+	  {
+	  llinfos << "Dir: " << breast_dir_world_vec << "V: " << world_vector << "DP: " << local_vec[0] << " time: " << llendl;
+	  }
+	*/
+
+	return local_vec;
+}
+
+LLVector3 LLBreastMotion::calculateVelocity_local(const F32 time_delta)
+{
+	LLJoint *chest_joint = mChestState->getJoint();
+	const LLVector3 world_pos_pt = chest_joint->getWorldPosition();
+	const LLQuaternion world_rot = chest_joint->getWorldRotation();
+	const LLVector3 last_world_pos_pt = mCharLastPosition_world_pt;
+	const LLVector3 char_velocity_world_vec = (world_pos_pt-last_world_pos_pt) / time_delta;
+	const LLVector3 char_velocity_local_vec = toLocal(char_velocity_world_vec);
+
+	return char_velocity_local_vec;
+}
+
+LLVector3 LLBreastMotion::calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec,
+													  const F32 time_delta)
+{
+	LLVector3 char_acceleration_local_vec = new_char_velocity_local_vec - mCharLastVelocity_local_vec;
+		
+	char_acceleration_local_vec = 
+		char_acceleration_local_vec * 1.0/mBreastSmoothingParam + 
+		mCharLastAcceleration_local_vec * (mBreastSmoothingParam-1.0)/mBreastSmoothingParam;
+
+	mCharLastAcceleration_local_vec = char_acceleration_local_vec;
+
+	return char_acceleration_local_vec;
+}
+
+// called per time step
+// must return TRUE while it is active, and
+// must return FALSE when the motion is completed.
+BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
+{
+	if (!gSavedSettings.getBOOL("AvatarPhysics"))
+	{
+		return TRUE;
+	}
+
+	/* TEST:
+	   1. Change outfits
+	   2. FPS effect
+	   3. Add disable
+	   4. Disappearing chests
+	   5. Overwrites breast params
+	   6. Threshold for not setting param
+	   7. Switch params or take off wearable makes breasts jump
+	*/
+
+	mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
+	mBreastSmoothingParam = mCharacter->getVisualParamWeight("Breast_Physics_Smoothing");
+	mBreastGravityParam = mCharacter->getVisualParamWeight("Breast_Physics_Gravity");
+
+	mBreastSpringParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Spring");
+	mBreastGainParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Gain");
+	mBreastDampingParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Damping");
+	mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Max_Velocity");
+	mBreastDragParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Drag");
+
+	mBreastSpringParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
+	mBreastGainParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
+	mBreastDampingParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
+	mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
+	mBreastDragParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
+
+	if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
+	const F32 time_delta = calculateTimeDelta();
+	if (time_delta < .01 || time_delta > 10.0) return TRUE;
+
+		
+	LLVector3 breast_user_local_pt(0,0,0);
+		
+	for (U32 i=0; i < 3; i++)
+	{
+		if (mBreastParamsUser[i] != NULL)
+		{
+			breast_user_local_pt[i] = mBreastParamsUser[i]->getWeight();
+		}
+	}
+		
+	LLVector3 breast_current_local_pt = mBreastLastPosition_local_pt;
+		
+	const LLVector3 char_velocity_local_vec = calculateVelocity_local(time_delta);
+	const LLVector3 char_acceleration_local_vec = calculateAcceleration_local(char_velocity_local_vec, time_delta);
+	mCharLastVelocity_local_vec = char_velocity_local_vec;
+
+	LLJoint *chest_joint = mChestState->getJoint();
+	mCharLastPosition_world_pt = chest_joint->getWorldPosition();
+		
+
+	const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt;
+	LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam;
+
+	LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
+	const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam;
+	force_accel_local_vec += force_gravity_local_vec;
+	force_accel_local_vec[0] *= mBreastGainParam[0];
+	force_accel_local_vec[1] *= mBreastGainParam[1];
+	force_accel_local_vec[2] *= mBreastGainParam[2];
+
+	LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec;
+
+	LLVector3 force_drag_local_vec = .5*char_velocity_local_vec; // should square char_velocity_vec
+	force_drag_local_vec[0] *= mBreastDragParam[0];
+	force_drag_local_vec[1] *= mBreastDragParam[1];
+	force_drag_local_vec[2] *= mBreastDragParam[2];
+
+	LLVector3 force_net_local_vec = 
+		force_accel_local_vec + 
+		force_gravity_local_vec +
+		force_spring_local_vec + 
+		force_damping_local_vec + 
+		force_drag_local_vec;
+
+
+	LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
+	mBreastVelocity_local_vec += acceleration_local_vec;
+	mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam);
+
+	LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
+	new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
+		
+		
+	for (U32 i=0; i < 3; i++)
+	{
+		if (mBreastMaxVelocityParam[0] == 0)
+		{
+			new_local_pt[i] = breast_user_local_pt[i];
+		}
+		if (mBreastParamsDriven[i])
+		{
+			mCharacter->setVisualParamWeight(mBreastParamsDriven[i],
+											 new_local_pt[i],
+											 FALSE);
+		}
+	}
+
+	if (mFileWrite != NULL)
+	{
+		fprintf(mFileWrite,"%f\t%f\t%f\t%f\t\t%f\t%f\t%f\t \t%f\t%f\t%f\t%f\t%f\t%f\n",
+				mCharLastPosition_world_pt[2],
+				breast_current_local_pt[2],
+				acceleration_local_vec[2],
+				mBreastVelocity_local_vec[2],
+					
+				force_accel_local_vec[2],
+				force_spring_local_vec[2],
+				force_damping_local_vec[2],
+					
+				force_accel_local_vec[2],
+				force_damping_local_vec[2],
+				force_drag_local_vec[2],
+				force_net_local_vec[2],
+				time_delta,
+				mBreastMassParam
+			);
+	}
+		
+	mBreastLastPosition_local_pt = new_local_pt;
+	mCharacter->updateVisualParams();
+	return TRUE;
+}
diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h
new file mode 100644
index 0000000000..7dbe604a76
--- /dev/null
+++ b/indra/newview/llbreastmotion.h
@@ -0,0 +1,161 @@
+/** 
+ * @file llbreastmotion.h
+ * @brief Implementation of LLBreastMotion class.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBREASTMOTION_H
+#define LL_LLBREASTMOTION_H
+
+//-----------------------------------------------------------------------------
+// Header files
+//-----------------------------------------------------------------------------
+#include "llmotion.h"
+#include "llframetimer.h"
+
+#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 500.f;
+#define BREAST_MOTION_FADEIN_TIME 1.0f
+#define BREAST_MOTION_FADEOUT_TIME 1.0f
+
+class LLViewerVisualParam;
+
+//-----------------------------------------------------------------------------
+// class LLBreastMotion
+//-----------------------------------------------------------------------------
+class LLBreastMotion :
+	public LLMotion
+{
+public:
+	// Constructor
+	LLBreastMotion(const LLUUID &id);
+
+	// Destructor
+	virtual ~LLBreastMotion();
+
+public:
+	//-------------------------------------------------------------------------
+	// functions to support MotionController and MotionRegistry
+	//-------------------------------------------------------------------------
+
+	// static constructor
+	// all subclasses must implement such a function and register it
+	static LLMotion *create(const LLUUID &id) { return new LLBreastMotion(id); }
+
+public:
+	//-------------------------------------------------------------------------
+	// animation callbacks to be implemented by subclasses
+	//-------------------------------------------------------------------------
+
+	// motions must specify whether or not they loop
+	virtual BOOL getLoop() { return TRUE; }
+
+	// motions must report their total duration
+	virtual F32 getDuration() { return 0.0; }
+
+	// motions must report their "ease in" duration
+	virtual F32 getEaseInDuration() { return BREAST_MOTION_FADEIN_TIME; }
+
+	// motions must report their "ease out" duration.
+	virtual F32 getEaseOutDuration() { return BREAST_MOTION_FADEOUT_TIME; }
+
+	// called to determine when a motion should be activated/deactivated based on avatar pixel coverage
+	virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; }
+
+	// motions must report their priority
+	virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
+
+	virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
+
+	// run-time (post constructor) initialization,
+	// called after parameters have been set
+	// must return true to indicate success and be available for activation
+	virtual LLMotionInitStatus onInitialize(LLCharacter *character);
+
+	// called when a motion is activated
+	// must return TRUE to indicate success, or else
+	// it will be deactivated
+	virtual BOOL onActivate();
+
+	// called per time step
+	// must return TRUE while it is active, and
+	// must return FALSE when the motion is completed.
+	virtual BOOL onUpdate(F32 time, U8* joint_mask);
+
+	// called when a motion is deactivated
+	virtual void onDeactivate();
+
+protected:
+	LLVector3 toLocal(const LLVector3 &world_vector);
+	LLVector3 calculateVelocity_local(const F32 time_delta);
+	LLVector3 calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec,
+										  const F32 time_delta);
+	F32 calculateTimeDelta();
+private:
+	//-------------------------------------------------------------------------
+	// joint states to be animated
+	//-------------------------------------------------------------------------
+	LLPointer<LLJointState> mChestState;
+	LLCharacter*		mCharacter;
+
+
+	//-------------------------------------------------------------------------
+	// miscellaneous parameters
+	//-------------------------------------------------------------------------
+	LLViewerVisualParam *mBreastParamsUser[3];
+	LLViewerVisualParam *mBreastParamsDriven[3];
+	LLVector3           mBreastParamsMin;
+	LLVector3           mBreastParamsMax;
+
+	LLVector3           mCharLastPosition_world_pt; // Last position of the avatar
+	LLVector3			mCharLastVelocity_local_vec; // How fast the character is moving
+	LLVector3           mCharLastAcceleration_local_vec; // Change in character velocity
+
+	LLVector3           mBreastLastPosition_local_pt; // Last parameters for breast
+	LLVector3           mBreastVelocity_local_vec; // How fast the breast params are moving
+
+
+	F32 mBreastMassParam;
+	F32 mBreastGravityParam;
+	U32 mBreastSmoothingParam;
+
+	LLVector3 mBreastSpringParam;
+	LLVector3 mBreastDampingParam;
+	LLVector3 mBreastGainParam;
+	LLVector3 mBreastMaxVelocityParam;
+	LLVector3 mBreastDragParam;
+
+	LLFrameTimer	mTimer;
+	F32             mLastTime;
+	
+	FILE           *mFileWrite;
+	U32            mFileTicks;
+};
+
+#endif // LL_LLBREASTMOTION_H
+
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index c9e47d8996..b98c64310d 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -46,6 +46,7 @@
 #include "llagentwearables.h"
 #include "llanimationstates.h"
 #include "llavatarpropertiesprocessor.h"
+#include "llbreastmotion.h"
 #include "llviewercontrol.h"
 #include "lldrawpoolavatar.h"
 #include "lldriverparam.h"
@@ -120,7 +121,7 @@ const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"
 const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b");  //"pelvis_fix"
 const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55");  //"target"
 const LLUUID ANIM_AGENT_WALK_ADJUST	= LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d");  //"walk_adjust"
-const LLUUID ANIM_AGENT_BREAST_MOTION = LLUUID("ce52c2b2-b62a-1e90-6152-7cd1efe2fd60");  //"breast_motion"
+const LLUUID ANIM_AGENT_BREAST_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987");  //"breast_motion"
 
 
 //-----------------------------------------------------------------------------
@@ -576,385 +577,6 @@ private:
 	LLCharacter*		mCharacter;
 };
 
-//-----------------------------------------------------------------------------
-// class LLBreatheMotionRot
-//-----------------------------------------------------------------------------
-class LLBreastMotion :
-	public LLMotion
-{
-public:
-	// Constructor
-	LLBreastMotion(const LLUUID &id) :
-		LLMotion(id),
-		mCharacter(NULL),
-		mFileWrite(NULL)
-	{
-		mName = "breast_motion";
-		mChestState = new LLJointState;
-
-		mBreastMassParam = (F32)1.0;
-		mBreastDragParam = LLVector3((F32)0.1, (F32)0.1, (F32)0.1);
-		mBreastSmoothingParam = (U32)2;
-		mBreastGravityParam = (F32)0.0;
-
-		mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0);
-		mBreastGainParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0);
-		mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3);
-		mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0);
-
-		mBreastParamsUser[0] = mBreastParamsUser[1] = mBreastParamsUser[2] = NULL;
-		mBreastParamsDriven[0] = mBreastParamsDriven[1] = mBreastParamsDriven[2] = NULL;
-
-		mCharLastPosition_world_pt = LLVector3(0,0,0);
-		mCharLastVelocity_local_vec = LLVector3(0,0,0);
-		mCharLastAcceleration_local_vec = LLVector3(0,0,0);
-		mBreastLastPosition_local_pt = LLVector3(0,0,0);
-		mBreastVelocity_local_vec = LLVector3(0,0,0);
-	}
-
-	// Destructor
-	virtual ~LLBreastMotion() {}
-
-public:
-	//-------------------------------------------------------------------------
-	// functions to support MotionController and MotionRegistry
-	//-------------------------------------------------------------------------
-	// static constructor
-	// all subclasses must implement such a function and register it
-	static LLMotion *create(const LLUUID &id) { return new LLBreastMotion(id); }
-
-public:
-	//-------------------------------------------------------------------------
-	// animation callbacks to be implemented by subclasses
-	//-------------------------------------------------------------------------
-
-	// motions must specify whether or not they loop
-	virtual BOOL getLoop() { return TRUE; }
-
-	// motions must report their total duration
-	virtual F32 getDuration() { return 0.0; }
-
-	// motions must report their "ease in" duration
-	virtual F32 getEaseInDuration() { return 0.0; }
-
-	// motions must report their "ease out" duration.
-	virtual F32 getEaseOutDuration() { return 0.0; }
-
-	// motions must report their priority
-	virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
-
-	virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
-
-	// called to determine when a motion should be activated/deactivated based on avatar pixel coverage
-	virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREATHE; }
-
-	// run-time (post constructor) initialization,
-	// called after parameters have been set
-	// must return true to indicate success and be available for activation
-	virtual LLMotionInitStatus onInitialize(LLCharacter *character)
-	{		
-		mCharacter = character;
-		BOOL success = true;
-
-		if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; }
-
-		if (!success)
-		{
-			return STATUS_FAILURE;
-		}
-		
-		mChestState->setUsage(LLJointState::ROT);
-		addJointState( mChestState );
-
-		// User-set params
-		static const std::string breast_param_names_user[3] =
-			{
-				"Breast_Female_Cleavage_Driver",
-				"",
-				"Breast_Gravity_Driver"
-			};
-
-		// Params driven by this algorithm
-		static const std::string breast_param_names_driven[3] =
-			{
-				"Breast_Female_Cleavage",
-				"",
-				"Breast_Gravity"
-			};
-		
-		for (U32 i=0; i < 3; i++)
-		{
-			mBreastParamsUser[i] = NULL;
-			mBreastParamsDriven[i] = NULL;
-			mBreastParamsMin[i] = 0;
-			mBreastParamsMax[i] = 0;
-			if (breast_param_names_user[i] != "" && breast_param_names_driven[i] != "")
-			{
-				mBreastParamsUser[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_user[i].c_str());
-				mBreastParamsDriven[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_driven[i].c_str());
-				if (mBreastParamsDriven[i])
-				{
-					mBreastParamsMin[i] = mBreastParamsDriven[i]->getMinWeight();
-					mBreastParamsMax[i] = mBreastParamsDriven[i]->getMaxWeight();
-				}
-			}
-		}
-
-#ifdef OUTPUT_BREAST_DATA
-		//if (mCharacter->getSex() == SEX_FEMALE)
-		if (dynamic_cast<LLVOAvatarSelf *>(mCharacter))
-		{
-			mFileWrite = fopen("c:\\temp\\data.txt","w");
-			if (mFileWrite != NULL)
-			{
-				fprintf(mFileWrite,"Pos\tParam\tNet\tVel\t\tAccel\tSpring\tDamp\n");
-			}
-		}
-#endif
-
-		mTimer.reset();
-		return STATUS_SUCCESS;
-	}
-
-	// called when a motion is activated
-	// must return TRUE to indicate success, or else
-	// it will be deactivated
-	virtual BOOL onActivate() { return TRUE; }
-
-	F32 calculateTimeDelta()
-	{
-		const F32 time = mTimer.getElapsedTimeF32();
-		const F32 time_delta = time - mLastTime;
-
-		mLastTime = time;
-
-		return time_delta;
-	}
-
-	LLVector3 toLocal(const LLVector3 &world_vector)
-	{
-		LLVector3 local_vec(0,0,0);
-
-		LLJoint *chest_joint = mChestState->getJoint();
-		const LLQuaternion world_rot = chest_joint->getWorldRotation();
-		
-		// -1 because cleavage param changes opposite to direction.
-		LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot;
-		breast_dir_world_vec.normalize();
-		local_vec[0] = world_vector * breast_dir_world_vec;
-
-		LLVector3 breast_up_dir_world_vec = LLVector3(0,0,1) * world_rot;
-		breast_up_dir_world_vec.normalize();
-		local_vec[2] = world_vector * breast_up_dir_world_vec;
-
-		/*
-		{
-			llinfos << "Dir: " << breast_dir_world_vec << "V: " << world_vector << "DP: " << local_vec[0] << " time: " << llendl;
-		}
-		*/
-
-		return local_vec;
-	}
-
-	LLVector3 calculateVelocity_local(const F32 time_delta)
-	{
-		LLJoint *chest_joint = mChestState->getJoint();
-		const LLVector3 world_pos_pt = chest_joint->getWorldPosition();
-		const LLQuaternion world_rot = chest_joint->getWorldRotation();
-		const LLVector3 last_world_pos_pt = mCharLastPosition_world_pt;
-		const LLVector3 char_velocity_world_vec = (world_pos_pt-last_world_pos_pt) / time_delta;
-		const LLVector3 char_velocity_local_vec = toLocal(char_velocity_world_vec);
-
-		return char_velocity_local_vec;
-	}
-
-	LLVector3 calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec,
-										  const F32 time_delta)
-	{
-		LLVector3 char_acceleration_local_vec = new_char_velocity_local_vec - mCharLastVelocity_local_vec;
-		
-		char_acceleration_local_vec = 
-			char_acceleration_local_vec * 1.0/mBreastSmoothingParam + 
-			mCharLastAcceleration_local_vec * (mBreastSmoothingParam-1.0)/mBreastSmoothingParam;
-
-		mCharLastAcceleration_local_vec = char_acceleration_local_vec;
-
-		return char_acceleration_local_vec;
-	}
-
-	// called per time step
-	// must return TRUE while it is active, and
-	// must return FALSE when the motion is completed.
-	virtual BOOL onUpdate(F32 time, U8* joint_mask)
-	{
-		if (!gSavedSettings.getBOOL("AvatarPhysics"))
-		{
-			return TRUE;
-		}
-
-		/* TEST:
-		   1. Change outfits
-		   2. FPS effect
-		   3. Add disable
-		   4. Disappearing chests
-		   5. Overwrites breast params
-		   6. Threshold for not setting param
-		*/
-
-		mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
-		mBreastSmoothingParam = mCharacter->getVisualParamWeight("Breast_Physics_Smoothing");
-		mBreastGravityParam = mCharacter->getVisualParamWeight("Breast_Physics_Gravity");
-
-		mBreastSpringParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Spring");
-		mBreastGainParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Gain");
-		mBreastDampingParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Damping");
-		mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Max_Velocity");
-		mBreastDragParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Drag");
-
-		mBreastSpringParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
-		mBreastGainParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
-		mBreastDampingParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
-		mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
-		mBreastDragParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
-
-		if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
-		const F32 time_delta = calculateTimeDelta();
-		if (time_delta < .01 || time_delta > 10.0) return TRUE;
-
-		
-		LLVector3 breast_user_local_pt(0,0,0);
-		
-		for (U32 i=0; i < 3; i++)
-		{
-			if (mBreastParamsUser[i] != NULL)
-			{
-				breast_user_local_pt[i] = mBreastParamsUser[i]->getWeight();
-			}
-		}
-		
-		LLVector3 breast_current_local_pt = mBreastLastPosition_local_pt;
-		
-		const LLVector3 char_velocity_local_vec = calculateVelocity_local(time_delta);
-		const LLVector3 char_acceleration_local_vec = calculateAcceleration_local(char_velocity_local_vec, time_delta);
-		mCharLastVelocity_local_vec = char_velocity_local_vec;
-
-		LLJoint *chest_joint = mChestState->getJoint();
-		mCharLastPosition_world_pt = chest_joint->getWorldPosition();
-		
-
-		const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt;
-		LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam;
-
-		LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
-		const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam;
-		force_accel_local_vec += force_gravity_local_vec;
-		force_accel_local_vec[0] *= mBreastGainParam[0];
-		force_accel_local_vec[1] *= mBreastGainParam[1];
-		force_accel_local_vec[2] *= mBreastGainParam[2];
-
-		LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec;
-
-		LLVector3 force_drag_local_vec = .5*char_velocity_local_vec; // should square char_velocity_vec
-		force_drag_local_vec[0] *= mBreastDragParam[0];
-		force_drag_local_vec[1] *= mBreastDragParam[1];
-		force_drag_local_vec[2] *= mBreastDragParam[2];
-
-		LLVector3 force_net_local_vec = 
-			force_accel_local_vec + 
-			force_gravity_local_vec +
-			force_spring_local_vec + 
-			force_damping_local_vec + 
-			force_drag_local_vec;
-
-
-		LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
-		mBreastVelocity_local_vec += acceleration_local_vec;
-		mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam);
-
-		LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
-		new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
-		
-		
-		for (U32 i=0; i < 3; i++)
-		{
-			if (mBreastMaxVelocityParam[0] == 0)
-			{
-				new_local_pt[i] = breast_user_local_pt[i];
-			}
-			if (mBreastParamsDriven[i])
-			{
-				mCharacter->setVisualParamWeight(mBreastParamsDriven[i],
-												 new_local_pt[i],
-												 FALSE);
-			}
-		}
-
-		if (mFileWrite != NULL)
-		{
-			fprintf(mFileWrite,"%f\t%f\t%f\t%f\t\t%f\t%f\t%f\t \t%f\t%f\t%f\t%f\t%f\t%f\n",
-					mCharLastPosition_world_pt[2],
-					breast_current_local_pt[2],
-					acceleration_local_vec[2],
-					mBreastVelocity_local_vec[2],
-					
-					force_accel_local_vec[2],
-					force_spring_local_vec[2],
-					force_damping_local_vec[2],
-					
-					force_accel_local_vec[2],
-					force_damping_local_vec[2],
-					force_drag_local_vec[2],
-					force_net_local_vec[2],
-					time_delta,
-					mBreastMassParam
-					);
-		}
-		
-		mBreastLastPosition_local_pt = new_local_pt;
-		mCharacter->updateVisualParams();
-		return TRUE;
-	}
-	
-	// called when a motion is deactivated
-	virtual void onDeactivate() {}
-
-private:
-	//-------------------------------------------------------------------------
-	// joint states to be animated
-	//-------------------------------------------------------------------------
-	LLPointer<LLJointState> mChestState;
-	LLCharacter*		mCharacter;
-
-	LLViewerVisualParam *mBreastParamsUser[3];
-	LLViewerVisualParam *mBreastParamsDriven[3];
-	LLVector3           mBreastParamsMin;
-	LLVector3           mBreastParamsMax;
-
-	LLVector3           mCharLastPosition_world_pt; // Last position of the avatar
-	LLVector3			mCharLastVelocity_local_vec; // How fast the character is moving
-	LLVector3           mCharLastAcceleration_local_vec; // Change in character velocity
-
-	LLVector3           mBreastLastPosition_local_pt; // Last parameters for breast
-	LLVector3           mBreastVelocity_local_vec; // How fast the breast params are moving
-
-
-	F32 mBreastMassParam;
-	F32 mBreastGravityParam;
-	U32 mBreastSmoothingParam;
-
-	LLVector3 mBreastSpringParam;
-	LLVector3 mBreastDampingParam;
-	LLVector3 mBreastGainParam;
-	LLVector3 mBreastMaxVelocityParam;
-	LLVector3 mBreastDragParam;
-
-	LLFrameTimer	mTimer;
-	F32             mLastTime;
-	
-	FILE           *mFileWrite;
-	U32            mFileTicks;
-};
-
 /**
  **
  ** End LLVOAvatar Support classes
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 9fbb1ed045..8b5389fd90 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2482,13 +2482,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Breast Physics Side Gain">Breast Side Gain</string>
 <string name="Breast Physics Side Damping">Breast Side Damping</string>
 <string name="Breast Physics Side Drag">Breast Side Drag</string>
-<string name="Breast Physics Side Max Velocity">Breast Side Max</string>
+<string name="Breast Physics Side Max Speed">Breast Side Max Speed</string>
 
 <string name="Breast Physics UpDown Spring">Breast UpDown Spring</string>
 <string name="Breast Physics UpDown Gain">Breast UpDown Gain</string>
 <string name="Breast Physics UpDown Damping">Breast UpDown Damping</string>
 <string name="Breast Physics UpDown Drag">Breast UpDown Drag</string>
-<string name="Breast Physics UpDown Max Velocity">Breast UpDown Range</string>
+<string name="Breast Physics UpDown Max Speed">Breast UpDown Max Speed</string>
 
 <string name="Bushy Eyebrows">Bushy Eyebrows</string>
 <string name="Bushy Hair">Bushy Hair</string>
-- 
cgit v1.2.3


From a8f40db04955df76eb91d7a5eaecee939c877f21 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 26 Aug 2010 11:59:19 -0400
Subject: EXT-8751 FIXED "Create new" in Edit Outfit doesn't actually check if
 you can legally create a new item

Create New now makes sure you haven't exceeded max wearables.
Also took out debug camera hack.
---
 indra/newview/llwearableitemslist.cpp | 5 +++++
 1 file changed, 5 insertions(+)

(limited to 'indra')

diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index b777885f79..858c86b13d 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -889,6 +889,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
 	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1);
 	setMenuItemVisible(menu, "create_new",			mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
+	setMenuItemEnabled(menu, "create_new",			canAddWearable(ids.front()));
 	setMenuItemVisible(menu, "show_original",		!standalone);
 	setMenuItemEnabled(menu, "show_original",		n_items == 1 && n_links == n_items);
 	setMenuItemVisible(menu, "take_off",			mask == MASK_CLOTHING && n_worn == n_items);
@@ -1039,6 +1040,10 @@ bool LLWearableItemsList::ContextMenu::canAddWearables(const uuid_vec_t& item_id
 		U32 n_clothes					= m_it->second;
 
 		U32 wearable_count = gAgentWearables.getWearableCount(w_type);
+		if ((wearable_count > 0) && !LLWearableType::getAllowMultiwear(w_type))
+		{
+			return false;
+		}
 		if ((wearable_count + n_clothes) > LLAgentWearables::MAX_CLOTHING_PER_TYPE)
 		{
 			return false;
-- 
cgit v1.2.3


From d52913bdbfdffd7ce4b1b2ace0b6eecd28a5ae43 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 24 Aug 2010 17:18:45 -0400
Subject: Fixed bug where wrong max velocity param was being used.

---
 indra/newview/llbreastmotion.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra')

diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index c773655f35..8d3571e83d 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -321,7 +321,7 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		
 	for (U32 i=0; i < 3; i++)
 	{
-		if (mBreastMaxVelocityParam[0] == 0)
+		if (mBreastMaxVelocityParam[i] == 0)
 		{
 			new_local_pt[i] = breast_user_local_pt[i];
 		}
-- 
cgit v1.2.3


From 5e110169701c8438a2c8191f03d3c5a4f080728c Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 25 Aug 2010 17:51:01 -0400
Subject: Fixed an issue where you go into appearance pose when editing physics
 if you were formerly in edit outfit. Miscellaneous code cleanup.

---
 indra/newview/llagentwearables.cpp      |  2 +-
 indra/newview/llagentwearables.h        |  2 +-
 indra/newview/llbreastmotion.cpp        |  3 ++-
 indra/newview/llsidepanelappearance.cpp | 18 +++++++++++++-----
 4 files changed, 17 insertions(+), 8 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 91a09cd886..c1aae867ef 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -821,7 +821,7 @@ void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index)
 	}
 }
 
-U32	LLAgentWearables::getWearableIndex(LLWearable *wearable)
+U32	LLAgentWearables::getWearableIndex(const LLWearable *wearable) const
 {
 	if (wearable == NULL)
 	{
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index d7e77a5a5b..3ef50f14da 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -124,7 +124,7 @@ public:
 	void			setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove);
 	void			setWearableName(const LLUUID& item_id, const std::string& new_name);
 	void			addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
-	U32				getWearableIndex(LLWearable *wearable);
+	U32				getWearableIndex(const LLWearable *wearable) const;
 
 protected:
 	void			setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append = false);
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index 8d3571e83d..036aa2ff39 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -42,7 +42,8 @@
 #include "llbreastmotion.h"
 #include "llcharacter.h"
 #include "llviewercontrol.h"
-#include "llviewervisualparam.H"
+#include "llviewervisualparam.h"
+#include "llvoavatarself.h"
 
 // #define OUTPUT_BREAST_DATA
 
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index e8733bf3e4..1422971b52 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -185,18 +185,26 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
 {
 	if (new_visibility.asBoolean())
 	{
-		bool is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible();
-		bool is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible();
+		const BOOL is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible();
+		const BOOL is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible();
 
 		if (is_outfit_edit_visible || is_wearable_edit_visible)
 		{
-			if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
+			const LLWearable *wearable_ptr = mEditWearable->getWearable();
+			if (!wearable_ptr)
+			{
+				llwarns << "Visibility change to invalid wearable" << llendl;
+				return;
+			}
+			const BOOL disable_camera_motion = LLWearableType::getDisableCameraSwitch(wearable_ptr->getType());
+			if (!gAgentCamera.cameraCustomizeAvatar() && 
+				!disable_camera_motion &&
+				gSavedSettings.getBOOL("AppearanceCameraMovement"))
 			{
 				gAgentCamera.changeCameraToCustomizeAvatar();
 			}
 			if (is_wearable_edit_visible)
 			{
-				LLWearable *wearable_ptr = mEditWearable->getWearable();
 				if (gAgentWearables.getWearableIndex(wearable_ptr) == LLAgentWearables::MAX_CLOTHING_PER_TYPE)
 				{
 					// we're no longer wearing the wearable we were last editing, switch back to outfit editor
@@ -380,7 +388,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 		{
 			gAgentCamera.changeCameraToCustomizeAvatar();
 		}
-		mEditWearable->setWearable(wearable);
+		mEditWearable->setWearable(wearable, disable_camera_switch);
 		mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency
 	}
 	else
-- 
cgit v1.2.3


From 391e2bab555d391a0e1bdb248482d5de5c0d6724 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 25 Aug 2010 17:53:37 -0400
Subject: Increased max velocity in avatar_lad.xml

---
 indra/newview/character/avatar_lad.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 54794b849f..6fa1111223 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9211,7 +9211,7 @@ render_pass="bump">
      label_max="More"
      value_default="5"
      value_min="0"
-     value_max="10"
+     value_max="1000"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9302,7 +9302,7 @@ render_pass="bump">
      label_max="More"
      value_default="5"
      value_min="0"
-     value_max="10"
+     value_max="1000"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
-- 
cgit v1.2.3


From 635128f353758e59c1ae158b2f01d291b0cea30f Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 26 Aug 2010 11:44:08 -0400
Subject: Added graphics preference setting for physics.

---
 indra/newview/app_settings/high_graphics.xml       |  2 ++
 indra/newview/app_settings/low_graphics.xml        |  2 ++
 indra/newview/app_settings/mid_graphics.xml        |  2 ++
 indra/newview/app_settings/settings.xml            | 20 +++++++++---
 indra/newview/app_settings/ultra_graphics.xml      |  2 ++
 indra/newview/llappviewer.cpp                      |  1 +
 indra/newview/llbreastmotion.cpp                   | 23 +++++++++++--
 indra/newview/llbreastmotion.h                     |  1 +
 indra/newview/llfloaterpreference.cpp              |  1 +
 indra/newview/llviewercontrol.cpp                  |  7 ++++
 indra/newview/llvoavatar.cpp                       |  1 +
 indra/newview/llvoavatar.h                         |  1 +
 .../default/xui/en/panel_preferences_graphics1.xml | 38 +++++++++++++++++++---
 13 files changed, 90 insertions(+), 11 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml
index 587b2f2a89..45236284f4 100644
--- a/indra/newview/app_settings/high_graphics.xml
+++ b/indra/newview/app_settings/high_graphics.xml
@@ -4,6 +4,8 @@
 	<RenderAvatarCloth value="FALSE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="1.0"/>
+  <!--Default for now-->
+  <RenderAvatarPhysicsLODFactor value=".9"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml
index a5bbdfc1d0..ad0073dfac 100644
--- a/indra/newview/app_settings/low_graphics.xml
+++ b/indra/newview/app_settings/low_graphics.xml
@@ -5,6 +5,8 @@
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="0.5"/>
   <!--Default for now-->
+  <RenderAvatarPhysicsLODFactor value="0.0"/>
+  <!--Default for now-->
   <RenderAvatarMaxVisible value="3"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="FALSE"/>
diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml
index a1430a58f9..d9d8682055 100644
--- a/indra/newview/app_settings/mid_graphics.xml
+++ b/indra/newview/app_settings/mid_graphics.xml
@@ -4,6 +4,8 @@
 	<RenderAvatarCloth value="FALSE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="0.5"/>
+  <!--Default for now-->
+  <RenderAvatarPhysicsLODFactor value=".75"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8310c50b1e..d190ac7136 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -607,7 +607,17 @@
       <key>Value</key>
       <integer>10</integer>
     </map>
-
+    <key>AvatarPhysics</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable avatar physics, such as breast physics.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>AvatarSex</key>
     <map>
       <key>Comment</key>
@@ -620,16 +630,16 @@
       <integer>0</integer>
     </map>
 
-    <key>AvatarPhysics</key>
+    <key>RenderAvatarPhysicsLODFactor</key>
     <map>
       <key>Comment</key>
-      <string>Enable avatar physics, such as breast physics.</string>
+      <string>Controls level of detail of avatar physics (such as breast physics).</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
-      <string>Boolean</string>
+      <string>F32</string>
       <key>Value</key>
-      <integer>1</integer>
+      <integer>1.0</integer>
     </map>
 
     <key>BackgroundYieldTime</key>
diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml
index f741089ca2..3d588cf57d 100644
--- a/indra/newview/app_settings/ultra_graphics.xml
+++ b/indra/newview/app_settings/ultra_graphics.xml
@@ -4,6 +4,8 @@
 	<RenderAvatarCloth value="TRUE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="1.0"/>
+  <!--Default for now-->
+  <RenderAvatarPhysicsLODFactor value="1.0"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bfe3e52657..15e91b57fa 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -443,6 +443,7 @@ static void settings_to_globals()
 	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
 	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor");
 	LLVOAvatar::sLODFactor				= gSavedSettings.getF32("RenderAvatarLODFactor");
+	LLVOAvatar::sPhysicsLODFactor		= gSavedSettings.getF32("RenderAvatarPhysicsLODFactor");
 	LLVOAvatar::sMaxVisible				= (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
 	LLVOAvatar::sVisibleInFirstPerson	= gSavedSettings.getBOOL("FirstPersonAvatarVisible");
 	// clamp auto-open time to some minimum usable value
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index 036aa2ff39..2c8a38710a 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -76,6 +76,7 @@ LLBreastMotion::LLBreastMotion(const LLUUID &id) :
 	mCharLastVelocity_local_vec = LLVector3(0,0,0);
 	mCharLastAcceleration_local_vec = LLVector3(0,0,0);
 	mBreastLastPosition_local_pt = LLVector3(0,0,0);
+	mBreastLastUpdatePosition_local_pt = LLVector3(0,0,0);
 	mBreastVelocity_local_vec = LLVector3(0,0,0);
 }
 
@@ -236,6 +237,12 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		return TRUE;
 	}
 
+	const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor;
+	if (lod_factor == 0)
+	{
+		return TRUE;
+	}
+
 	/* TEST:
 	   1. Change outfits
 	   2. FPS effect
@@ -354,8 +361,20 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 				mBreastMassParam
 			);
 	}
-		
+	
+	LLVector3 position_diff = mBreastLastUpdatePosition_local_pt-new_local_pt;
+	for (U32 i=0; i < 3; i++)
+	{
+		const F32 min_delta = (1.0-lod_factor)*(mBreastParamsMax[i]-mBreastParamsMin[i])/2.0;
+		if (llabs(position_diff[i]) > min_delta)
+		{
+			mCharacter->updateVisualParams();
+			mBreastLastUpdatePosition_local_pt = new_local_pt;
+			break;
+		}
+	}
+
 	mBreastLastPosition_local_pt = new_local_pt;
-	mCharacter->updateVisualParams();
+
 	return TRUE;
 }
diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h
index 7dbe604a76..6a2e3788ad 100644
--- a/indra/newview/llbreastmotion.h
+++ b/indra/newview/llbreastmotion.h
@@ -138,6 +138,7 @@ private:
 
 	LLVector3           mBreastLastPosition_local_pt; // Last parameters for breast
 	LLVector3           mBreastVelocity_local_vec; // How fast the breast params are moving
+	LLVector3           mBreastLastUpdatePosition_local_pt; // Last parameters when visual update was sent
 
 
 	F32 mBreastMassParam;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 3804a1b858..dbc50ddbea 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1064,6 +1064,7 @@ void LLFloaterPreference::refresh()
 	updateSliderText(getChild<LLSliderCtrl>("FlexibleMeshDetail",	true), getChild<LLTextBox>("FlexibleMeshDetailText",	true));
 	updateSliderText(getChild<LLSliderCtrl>("TreeMeshDetail",		true), getChild<LLTextBox>("TreeMeshDetailText",		true));
 	updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail",		true), getChild<LLTextBox>("AvatarMeshDetailText",		true));
+	updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail",	true), getChild<LLTextBox>("AvatarPhysicsDetailText",		true));
 	updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail",	true), getChild<LLTextBox>("TerrainMeshDetailText",		true));
 	updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess",	true), getChild<LLTextBox>("PostProcessText",			true));
 	updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail",		true), getChild<LLTextBox>("SkyMeshDetailText",			true));
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 522b5a7dfa..df5a376631 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -144,6 +144,12 @@ static bool handleAvatarLODChanged(const LLSD& newvalue)
 	return true;
 }
 
+static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue)
+{
+	LLVOAvatar::sPhysicsLODFactor = (F32) newvalue.asReal();
+	return true;
+}
+
 static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue)
 {
 	LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger();
@@ -509,6 +515,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
 	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
 	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
+	gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));
 	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
 	gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2));
 	gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2));
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b98c64310d..be55c5b5c2 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -619,6 +619,7 @@ BOOL LLVOAvatar::sShowAnimationDebug = FALSE;
 BOOL LLVOAvatar::sShowFootPlane = FALSE;
 BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
 F32 LLVOAvatar::sLODFactor = 1.f;
+F32 LLVOAvatar::sPhysicsLODFactor = 1.f;
 BOOL LLVOAvatar::sUseImpostors = FALSE;
 BOOL LLVOAvatar::sJointDebug = FALSE;
 
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index c522af7d55..4417e37abb 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -230,6 +230,7 @@ public:
 	static BOOL		sDebugInvisible;
 	static BOOL		sShowAttachmentPoints;
 	static F32		sLODFactor; // user-settable LOD factor
+	static F32		sPhysicsLODFactor; // user-settable physics LOD factor
 	static BOOL		sJointDebug; // output total number of joints being touched for each avatar
 	static BOOL		sDebugAvatarRotation;
 
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 113d5fb6dc..23024cd0eb 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -2,7 +2,7 @@
 <panel
  border="true"
  follows="left|top|right|bottom"
- height="408"
+ height="418"
  label="Graphics"
  layout="topleft"
  left="102"
@@ -482,6 +482,24 @@
             parameter="AvatarMeshDetailText" />
         </slider>
         <slider
+        control_name="RenderAvatarPhysicsLODFactor"
+        follows="left|top"
+        height="16"
+        increment="0.125"
+        initial_value="160"
+        label="  Avatar Physics:"
+        label_width="185"
+        layout="topleft"
+        left_delta="0"
+        name="AvatarPhysicsDetail"
+        show_text="false"
+        top_pad="4"
+        width="264">
+           <slider.commit_callback
+            function="Pref.UpdateSliderText"
+            parameter="AvatarPhysicsDetailText" />
+        </slider>
+        <slider
         control_name="RenderTerrainLODFactor"
         follows="left|top"
         height="16"
@@ -590,6 +608,18 @@
         height="12"
         layout="topleft"
         left_delta="0"
+        name="AvatarPhysicsDetailText"
+        top_pad="8"
+        width="128">
+           Low
+        </text>
+        <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="12"
+        layout="topleft"
+        left_delta="0"
         name="TerrainMeshDetailText"
         top_pad="8"
         width="128">
@@ -662,7 +692,7 @@
         left="358"
         left_pad="-30"
         name="TerrainDetailText"
-        top="226"
+        top="250"
         width="155">
            Terrain detail:
         </text>
@@ -700,7 +730,7 @@
      layout="topleft"
      left="10"
      name="Apply"
-     top="383"
+     top="390"
      width="115"
       >
         <button.commit_callback
@@ -713,7 +743,7 @@
      layout="topleft"
      left_pad="3"
      name="Defaults"
-     top="383"
+     top="390"
      width="115">
         <button.commit_callback
          function="Pref.HardwareDefaults" />
-- 
cgit v1.2.3


From 63c504e4b08d28d31f7e8e2b5cda977c7b81215d Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 26 Aug 2010 12:37:43 -0400
Subject: Fix for bad merge error.

---
 indra/newview/llwearableitemslist.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra')

diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 858c86b13d..4373eec02a 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -889,7 +889,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
 	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1);
 	setMenuItemVisible(menu, "create_new",			mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
-	setMenuItemEnabled(menu, "create_new",			canAddWearable(ids.front()));
+	setMenuItemEnabled(menu, "create_new",			canAddWearables(ids));
 	setMenuItemVisible(menu, "show_original",		!standalone);
 	setMenuItemEnabled(menu, "show_original",		n_items == 1 && n_links == n_items);
 	setMenuItemVisible(menu, "take_off",			mask == MASK_CLOTHING && n_worn == n_items);
-- 
cgit v1.2.3


From a37057717d243596b92108590d56a0d3021ad840 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 26 Aug 2010 14:02:51 -0400
Subject: Miscellaneous fixes for how we're doing graphics settings for the
 avatar physics. Fixed a cast issue that was causing a linux compile error.

---
 indra/newview/app_settings/high_graphics.xml       |  2 +-
 indra/newview/app_settings/mid_graphics.xml        |  2 +-
 indra/newview/app_settings/settings.xml            | 23 ++++----
 indra/newview/featuretable.txt                     |  4 ++
 indra/newview/llagentcamera.cpp                    |  2 +-
 indra/newview/llbreastmotion.cpp                   |  2 +-
 .../default/xui/en/panel_preferences_graphics1.xml | 64 +++++++++++-----------
 7 files changed, 52 insertions(+), 47 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml
index 45236284f4..f1862f9d72 100644
--- a/indra/newview/app_settings/high_graphics.xml
+++ b/indra/newview/app_settings/high_graphics.xml
@@ -5,7 +5,7 @@
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="1.0"/>
   <!--Default for now-->
-  <RenderAvatarPhysicsLODFactor value=".9"/>
+  <RenderAvatarPhysicsLODFactor value="0.9"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml
index d9d8682055..6c4afbd7f0 100644
--- a/indra/newview/app_settings/mid_graphics.xml
+++ b/indra/newview/app_settings/mid_graphics.xml
@@ -5,7 +5,7 @@
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="0.5"/>
   <!--Default for now-->
-  <RenderAvatarPhysicsLODFactor value=".75"/>
+  <RenderAvatarPhysicsLODFactor value="0.75"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index d190ac7136..ecb36273ec 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -630,18 +630,6 @@
       <integer>0</integer>
     </map>
 
-    <key>RenderAvatarPhysicsLODFactor</key>
-    <map>
-      <key>Comment</key>
-      <string>Controls level of detail of avatar physics (such as breast physics).</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>F32</string>
-      <key>Value</key>
-      <integer>1.0</integer>
-    </map>
-
     <key>BackgroundYieldTime</key>
     <map>
       <key>Comment</key>
@@ -6646,6 +6634,17 @@
       <key>Value</key>
       <integer>12</integer>
     </map>
+    <key>RenderAvatarPhysicsLODFactor</key>
+    <map>
+      <key>Comment</key>
+      <string>Controls level of detail of avatar physics (such as breast physics).</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <integer>1.0</integer>
+    </map>
     <key>RenderAvatarVP</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 9440e877df..5f843ad912 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.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
@@ -69,6 +70,7 @@ list Low
 RenderAnisotropic			1	0
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	0
+RenderAvatarPhysicsLODFactor 1	0
 RenderAvatarMaxVisible      1   3
 RenderAvatarVP				1	0
 RenderFarClip				1	64
@@ -98,6 +100,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
@@ -125,6 +128,7 @@ list High
 RenderAnisotropic			1	1
 RenderAvatarCloth			1	0
 RenderAvatarLODFactor		1	1.0
+RenderAvatarPhysicsLODFactor 1	0.9
 RenderAvatarVP				1	1
 RenderFarClip				1	128
 RenderFlexTimeFactor		1	1.0
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 01a4cce700..f0ab8bd311 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -277,7 +277,7 @@ LLAgentCamera::~LLAgentCamera()
 //-----------------------------------------------------------------------------
 void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
 {
-	if (TRUE) return; // SERAPH DON'T CHECKIN
+	if (TRUE) return; // Disabling reset for avatar physics demo-ing.
 	if (gAgent.getAutoPilot())
 	{
 		gAgent.stopAutoPilot(TRUE);
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index 2c8a38710a..902c5af892 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -254,7 +254,7 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 	*/
 
 	mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
-	mBreastSmoothingParam = mCharacter->getVisualParamWeight("Breast_Physics_Smoothing");
+	mBreastSmoothingParam = (U32)(mCharacter->getVisualParamWeight("Breast_Physics_Smoothing"));
 	mBreastGravityParam = mCharacter->getVisualParamWeight("Breast_Physics_Gravity");
 
 	mBreastSpringParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Spring");
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 23024cd0eb..bd5473e7bf 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -317,6 +317,37 @@
         value="4"/>
       </combo_box>
     
+        <slider
+        control_name="RenderAvatarPhysicsLODFactor"
+        follows="left|top"
+        height="16"
+        increment="0.125"
+        initial_value="160"
+        label="  Avatar Physics:"
+        label_width="85"
+        layout="topleft"
+        left_delta="-6"
+        name="AvatarPhysicsDetail"
+        show_text="false"
+        top_pad="12"
+        width="154">
+           <slider.commit_callback
+            function="Pref.UpdateSliderText"
+            parameter="AvatarPhysicsDetailText" />
+        </slider>
+        <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="12"
+        layout="topleft"
+        left_delta="160"
+        name="AvatarPhysicsDetailText"
+        top_pad="-16"
+        width="128">
+           Low
+        </text>
+
 		<slider
 		control_name="RenderFarClip"
 		decimal_digits="0"
@@ -482,24 +513,6 @@
             parameter="AvatarMeshDetailText" />
         </slider>
         <slider
-        control_name="RenderAvatarPhysicsLODFactor"
-        follows="left|top"
-        height="16"
-        increment="0.125"
-        initial_value="160"
-        label="  Avatar Physics:"
-        label_width="185"
-        layout="topleft"
-        left_delta="0"
-        name="AvatarPhysicsDetail"
-        show_text="false"
-        top_pad="4"
-        width="264">
-           <slider.commit_callback
-            function="Pref.UpdateSliderText"
-            parameter="AvatarPhysicsDetailText" />
-        </slider>
-        <slider
         control_name="RenderTerrainLODFactor"
         follows="left|top"
         height="16"
@@ -608,18 +621,6 @@
         height="12"
         layout="topleft"
         left_delta="0"
-        name="AvatarPhysicsDetailText"
-        top_pad="8"
-        width="128">
-           Low
-        </text>
-        <text
-        type="string"
-        length="1"
-        follows="left|top"
-        height="12"
-        layout="topleft"
-        left_delta="0"
         name="TerrainMeshDetailText"
         top_pad="8"
         width="128">
@@ -638,6 +639,7 @@
         width="128">
            Low
         </text>
+
       <text
       type="string"
       length="1"
@@ -648,7 +650,7 @@
       name="AvatarRenderingText"
         top_pad="18"
       width="128">
-        Avatar rendering:
+        Avatar Rendering:
       </text>
       <check_box
       control_name="RenderUseImpostors"
-- 
cgit v1.2.3


From 0c21ba1e76eb189bdf43b7f2c81b3bf2b211578f Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 26 Aug 2010 14:03:56 -0400
Subject: Adding physics icon.

---
 .../newview/skins/default/textures/icons/Inv_Physics.png  | Bin 0 -> 616 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/icons/Inv_Physics.png

(limited to 'indra')

diff --git a/indra/newview/skins/default/textures/icons/Inv_Physics.png b/indra/newview/skins/default/textures/icons/Inv_Physics.png
new file mode 100644
index 0000000000..ddd36b446b
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Inv_Physics.png differ
-- 
cgit v1.2.3


From 93404eca1a447f9412eb8ae2d5c4149ff9436dc7 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 26 Aug 2010 16:05:43 -0400
Subject: Changed parameter scale for max velocity so it's easier to turn off
 various physics.

---
 indra/newview/character/avatar_lad.xml | 8 ++++----
 indra/newview/llbreastmotion.cpp       | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 6fa1111223..453ed1baf7 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9209,9 +9209,9 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="5"
+     value_default="0"
      value_min="0"
-     value_max="1000"
+     value_max="10"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
@@ -9300,9 +9300,9 @@ render_pass="bump">
      edit_group="physics"
      label_min="Less"
      label_max="More"
-     value_default="5"
+     value_default="1"
      value_min="0"
-     value_max="1000"
+     value_max="10"
      camera_elevation=".3"
      camera_distance=".8">
 	 <param_driver />
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index 902c5af892..5bbab8a0a6 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -321,7 +321,7 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 
 	LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
 	mBreastVelocity_local_vec += acceleration_local_vec;
-	mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam, mBreastMaxVelocityParam);
+	mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam*100.0, mBreastMaxVelocityParam*100.0);
 
 	LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
 	new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
-- 
cgit v1.2.3


From c859923cf63fc66d4f73b04ec57d56a2e4fe6955 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 31 Aug 2010 14:42:09 -0400
Subject: Physics no longer perform for avatars that are smaller than some
 certain screenspace metric. Physics no longer removed when outfits changed.

---
 indra/newview/llagentwearables.cpp |  1 -
 indra/newview/llbreastmotion.cpp   | 63 ++++++++++++++++++++++----------------
 indra/newview/llbreastmotion.h     |  3 +-
 3 files changed, 38 insertions(+), 29 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index c1aae867ef..34f7e2578f 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1717,7 +1717,6 @@ void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
 		gAgentWearables.removeWearable(LLWearableType::WT_SKIRT,true,0);
 		gAgentWearables.removeWearable(LLWearableType::WT_ALPHA,true,0);
 		gAgentWearables.removeWearable(LLWearableType::WT_TATTOO,true,0);
-		gAgentWearables.removeWearable(LLWearableType::WT_PHYSICS,true,0);
 	}
 }
 
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index 5bbab8a0a6..d4d0a78543 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -45,12 +45,10 @@
 #include "llviewervisualparam.h"
 #include "llvoavatarself.h"
 
+#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 1000.f;
+
 // #define OUTPUT_BREAST_DATA
 
-//-----------------------------------------------------------------------------
-// LLBreastMotion()
-// Class Constructor
-//-----------------------------------------------------------------------------
 LLBreastMotion::LLBreastMotion(const LLUUID &id) : 
 	LLMotion(id),
 	mCharacter(NULL),
@@ -80,12 +78,6 @@ LLBreastMotion::LLBreastMotion(const LLUUID &id) :
 	mBreastVelocity_local_vec = LLVector3(0,0,0);
 }
 
-
-
-//-----------------------------------------------------------------------------
-// ~LLBreastMotion()
-// Class Destructor
-//-----------------------------------------------------------------------------
 LLBreastMotion::~LLBreastMotion()
 {
 }
@@ -164,7 +156,11 @@ LLMotion::LLMotionInitStatus LLBreastMotion::onInitialize(LLCharacter *character
 	return STATUS_SUCCESS;
 }
 
-
+F32 LLBreastMotion::getMinPixelArea() 
+{
+	return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION;
+}
+	
 
 F32 LLBreastMotion::calculateTimeDelta()
 {
@@ -243,15 +239,17 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		return TRUE;
 	}
 
-	/* TEST:
-	   1. Change outfits
-	   2. FPS effect
-	   3. Add disable
-	   4. Disappearing chests
-	   5. Overwrites breast params
-	   6. Threshold for not setting param
-	   7. Switch params or take off wearable makes breasts jump
-	*/
+	if (!dynamic_cast<LLVOAvatarSelf *>(mCharacter))
+	{
+		static int ticks=0;
+		ticks = (ticks + 1) % 10;
+		if (!ticks)
+			llinfos << "Pixel Area: " << mCharacter->getPixelArea() << " rt: " << fsqrtf(mCharacter->getPixelArea()) <<  llendl;
+	}
+
+	if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
+	const F32 time_delta = calculateTimeDelta();
+	if (time_delta < .01 || time_delta > 10.0) return TRUE;
 
 	mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
 	mBreastSmoothingParam = (U32)(mCharacter->getVisualParamWeight("Breast_Physics_Smoothing"));
@@ -269,11 +267,9 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 	mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
 	mBreastDragParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
 
-	if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
-	const F32 time_delta = calculateTimeDelta();
-	if (time_delta < .01 || time_delta > 10.0) return TRUE;
 
-		
+	const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(this) != NULL);
+
 	LLVector3 breast_user_local_pt(0,0,0);
 		
 	for (U32 i=0; i < 3; i++)
@@ -361,7 +357,23 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 				mBreastMassParam
 			);
 	}
+
+	mBreastLastPosition_local_pt = new_local_pt;
 	
+	if (!is_self)
+	{
+		const F32 area_for_max_settings = 300.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());
+		if (pixel_area < area_for_this_setting)
+		{
+			return TRUE;
+		}
+	}
+
+
 	LLVector3 position_diff = mBreastLastUpdatePosition_local_pt-new_local_pt;
 	for (U32 i=0; i < 3; i++)
 	{
@@ -370,11 +382,10 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		{
 			mCharacter->updateVisualParams();
 			mBreastLastUpdatePosition_local_pt = new_local_pt;
-			break;
+			return TRUE;
 		}
 	}
 
-	mBreastLastPosition_local_pt = new_local_pt;
 
 	return TRUE;
 }
diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h
index 6a2e3788ad..da71962453 100644
--- a/indra/newview/llbreastmotion.h
+++ b/indra/newview/llbreastmotion.h
@@ -39,7 +39,6 @@
 #include "llmotion.h"
 #include "llframetimer.h"
 
-#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 500.f;
 #define BREAST_MOTION_FADEIN_TIME 1.0f
 #define BREAST_MOTION_FADEOUT_TIME 1.0f
 
@@ -85,7 +84,7 @@ public:
 	virtual F32 getEaseOutDuration() { return BREAST_MOTION_FADEOUT_TIME; }
 
 	// called to determine when a motion should be activated/deactivated based on avatar pixel coverage
-	virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION; }
+	virtual F32 getMinPixelArea();
 
 	// motions must report their priority
 	virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
-- 
cgit v1.2.3


From 9039af33723382058cd422a360cda535c28ebc84 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 31 Aug 2010 15:45:43 -0400
Subject: Code cleanup.

---
 indra/newview/llbreastmotion.cpp | 227 ++++++++++++++++++++-------------------
 indra/newview/llbreastmotion.h   |   1 -
 2 files changed, 116 insertions(+), 112 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index d4d0a78543..b38e818dbd 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -47,12 +47,27 @@
 
 #define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 1000.f;
 
-// #define OUTPUT_BREAST_DATA
+#define N_PARAMS 2
+
+// User-set params
+static const std::string breast_param_names_user[N_PARAMS] =
+{
+	"Breast_Female_Cleavage_Driver",
+	"Breast_Gravity_Driver"
+};
+
+// Params driven by this algorithm
+static const std::string breast_param_names_driven[N_PARAMS] =
+{
+	"Breast_Female_Cleavage",
+	"Breast_Gravity"
+};
+
+
 
 LLBreastMotion::LLBreastMotion(const LLUUID &id) : 
 	LLMotion(id),
-	mCharacter(NULL),
-	mFileWrite(NULL)
+	mCharacter(NULL)
 {
 	mName = "breast_motion";
 	mChestState = new LLJointState;
@@ -94,35 +109,16 @@ void LLBreastMotion::onDeactivate()
 LLMotion::LLMotionInitStatus LLBreastMotion::onInitialize(LLCharacter *character)
 {
 	mCharacter = character;
-	BOOL success = true;
-
-	if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; }
 
-	if (!success)
+	if (!mChestState->setJoint(character->getJoint("mChest")))
 	{
 		return STATUS_FAILURE;
 	}
-		
+
 	mChestState->setUsage(LLJointState::ROT);
 	addJointState( mChestState );
-
-	// User-set params
-	static const std::string breast_param_names_user[3] =
-		{
-			"Breast_Female_Cleavage_Driver",
-			"",
-			"Breast_Gravity_Driver"
-		};
-
-	// Params driven by this algorithm
-	static const std::string breast_param_names_driven[3] =
-		{
-			"Breast_Female_Cleavage",
-			"",
-			"Breast_Gravity"
-		};
-		
-	for (U32 i=0; i < 3; i++)
+	
+	for (U32 i=0; i < N_PARAMS; i++)
 	{
 		mBreastParamsUser[i] = NULL;
 		mBreastParamsDriven[i] = NULL;
@@ -139,19 +135,7 @@ LLMotion::LLMotionInitStatus LLBreastMotion::onInitialize(LLCharacter *character
 			}
 		}
 	}
-
-#ifdef OUTPUT_BREAST_DATA
-	//if (mCharacter->getSex() == SEX_FEMALE)
-	if (dynamic_cast<LLVOAvatarSelf *>(mCharacter))
-	{
-		mFileWrite = fopen("c:\\temp\\data.txt","w");
-		if (mFileWrite != NULL)
-		{
-			fprintf(mFileWrite,"Pos\tParam\tNet\tVel\t\tAccel\tSpring\tDamp\n");
-		}
-	}
-#endif
-
+	
 	mTimer.reset();
 	return STATUS_SUCCESS;
 }
@@ -166,33 +150,27 @@ F32 LLBreastMotion::calculateTimeDelta()
 {
 	const F32 time = mTimer.getElapsedTimeF32();
 	const F32 time_delta = time - mLastTime;
-
 	mLastTime = time;
-
 	return time_delta;
 }
 
+// Local space means "parameter space".
 LLVector3 LLBreastMotion::toLocal(const LLVector3 &world_vector)
 {
 	LLVector3 local_vec(0,0,0);
 
 	LLJoint *chest_joint = mChestState->getJoint();
 	const LLQuaternion world_rot = chest_joint->getWorldRotation();
-		
-	// -1 because cleavage param changes opposite to direction.
-	LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot;
+	
+	// Cleavage
+	LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot; // -1 b/c cleavage param changes opposite to direction
 	breast_dir_world_vec.normalize();
 	local_vec[0] = world_vector * breast_dir_world_vec;
-
+	
+	// Up-Down Bounce
 	LLVector3 breast_up_dir_world_vec = LLVector3(0,0,1) * world_rot;
 	breast_up_dir_world_vec.normalize();
-	local_vec[2] = world_vector * breast_up_dir_world_vec;
-
-	/*
-	  {
-	  llinfos << "Dir: " << breast_dir_world_vec << "V: " << world_vector << "DP: " << local_vec[0] << " time: " << llendl;
-	  }
-	*/
+	local_vec[1] = world_vector * breast_up_dir_world_vec;
 
 	return local_vec;
 }
@@ -213,7 +191,7 @@ LLVector3 LLBreastMotion::calculateAcceleration_local(const LLVector3 &new_char_
 													  const F32 time_delta)
 {
 	LLVector3 char_acceleration_local_vec = new_char_velocity_local_vec - mCharLastVelocity_local_vec;
-		
+	
 	char_acceleration_local_vec = 
 		char_acceleration_local_vec * 1.0/mBreastSmoothingParam + 
 		mCharLastAcceleration_local_vec * (mBreastSmoothingParam-1.0)/mBreastSmoothingParam;
@@ -223,34 +201,31 @@ LLVector3 LLBreastMotion::calculateAcceleration_local(const LLVector3 &new_char_
 	return char_acceleration_local_vec;
 }
 
-// called per time step
-// must return TRUE while it is active, and
-// must return FALSE when the motion is completed.
 BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 {
+	// Skip if disabled globally.
 	if (!gSavedSettings.getBOOL("AvatarPhysics"))
 	{
 		return TRUE;
 	}
 
+	// 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;
 	}
-
-	if (!dynamic_cast<LLVOAvatarSelf *>(mCharacter))
-	{
-		static int ticks=0;
-		ticks = (ticks + 1) % 10;
-		if (!ticks)
-			llinfos << "Pixel Area: " << mCharacter->getPixelArea() << " rt: " << fsqrtf(mCharacter->getPixelArea()) <<  llendl;
-	}
-
+	
 	if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
 	const F32 time_delta = calculateTimeDelta();
 	if (time_delta < .01 || time_delta > 10.0) return TRUE;
 
+
+	////////////////////////////////////////////////////////////////////////////////
+	// Get all parameters and settings
+	//
+
 	mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
 	mBreastSmoothingParam = (U32)(mCharacter->getVisualParamWeight("Breast_Physics_Smoothing"));
 	mBreastGravityParam = mCharacter->getVisualParamWeight("Breast_Physics_Gravity");
@@ -261,51 +236,72 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 	mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Max_Velocity");
 	mBreastDragParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Drag");
 
-	mBreastSpringParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
-	mBreastGainParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
-	mBreastDampingParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
-	mBreastMaxVelocityParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
-	mBreastDragParam[2] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
+	mBreastSpringParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
+	mBreastGainParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
+	mBreastDampingParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
+	mBreastMaxVelocityParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
+	mBreastDragParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
 
 
-	const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(this) != NULL);
-
+	// Get the current morph parameters.
 	LLVector3 breast_user_local_pt(0,0,0);
-		
-	for (U32 i=0; i < 3; i++)
+	for (U32 i=0; i < N_PARAMS; i++)
 	{
 		if (mBreastParamsUser[i] != NULL)
 		{
 			breast_user_local_pt[i] = mBreastParamsUser[i]->getWeight();
 		}
 	}
-		
+	
 	LLVector3 breast_current_local_pt = mBreastLastPosition_local_pt;
-		
+
+	//
+	// End parameters and settings
+	////////////////////////////////////////////////////////////////////////////////
+
+
+	////////////////////////////////////////////////////////////////////////////////
+	// Calculate velocity and acceleration in parameter space.
+	//
+
 	const LLVector3 char_velocity_local_vec = calculateVelocity_local(time_delta);
 	const LLVector3 char_acceleration_local_vec = calculateAcceleration_local(char_velocity_local_vec, time_delta);
 	mCharLastVelocity_local_vec = char_velocity_local_vec;
 
 	LLJoint *chest_joint = mChestState->getJoint();
 	mCharLastPosition_world_pt = chest_joint->getWorldPosition();
-		
 
+	//
+	// End velocity and acceleration
+	////////////////////////////////////////////////////////////////////////////////
+
+
+	////////////////////////////////////////////////////////////////////////////////
+	// Calculate the total force 
+	//
+
+	// Spring force is a restoring force towards the original user-set breast position.
+	// F = kx
 	const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt;
 	LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam;
 
+	// Acceleration is the force that comes from the change in velocity of the torso.
+	// F = ma + mg
 	LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
 	const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam;
 	force_accel_local_vec += force_gravity_local_vec;
-	force_accel_local_vec[0] *= mBreastGainParam[0];
-	force_accel_local_vec[1] *= mBreastGainParam[1];
-	force_accel_local_vec[2] *= mBreastGainParam[2];
-
-	LLVector3 force_damping_local_vec = -mBreastDampingParam; force_damping_local_vec *= mBreastVelocity_local_vec;
+	force_accel_local_vec *= mBreastGainParam;
 
-	LLVector3 force_drag_local_vec = .5*char_velocity_local_vec; // should square char_velocity_vec
-	force_drag_local_vec[0] *= mBreastDragParam[0];
-	force_drag_local_vec[1] *= mBreastDragParam[1];
-	force_drag_local_vec[2] *= mBreastDragParam[2];
+	// Damping is a restoring force that opposes the current velocity.
+	// F = -kv
+	LLVector3 force_damping_local_vec = -mBreastDampingParam; 
+	force_damping_local_vec *= mBreastVelocity_local_vec;
+	
+	// Drag is a force imparted by velocity, intuitively it is similar to wind resistance.
+	// F = .5v*v
+	LLVector3 force_drag_local_vec = .5*char_velocity_local_vec;
+	force_drag_local_vec *= char_velocity_local_vec;
+	force_drag_local_vec *= mBreastDragParam[0];
 
 	LLVector3 force_net_local_vec = 
 		force_accel_local_vec + 
@@ -314,17 +310,29 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		force_damping_local_vec + 
 		force_drag_local_vec;
 
+	//
+	// End total force
+	////////////////////////////////////////////////////////////////////////////////
+
+	
+	////////////////////////////////////////////////////////////////////////////////
+	// Calculate new params
+	//
 
+	// Calculate the new acceleration based on the net force.
+	// a = F/m
 	LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
 	mBreastVelocity_local_vec += acceleration_local_vec;
 	mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam*100.0, mBreastMaxVelocityParam*100.0);
 
+	// Calculate the new parameters and clamp them to the min/max ranges.
 	LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
 	new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
 		
-		
+	// Set the new parameters.
 	for (U32 i=0; i < 3; i++)
 	{
+		// If the param is disabled, just set the param to the user value.
 		if (mBreastMaxVelocityParam[i] == 0)
 		{
 			new_local_pt[i] = breast_user_local_pt[i];
@@ -337,32 +345,26 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		}
 	}
 
-	if (mFileWrite != NULL)
-	{
-		fprintf(mFileWrite,"%f\t%f\t%f\t%f\t\t%f\t%f\t%f\t \t%f\t%f\t%f\t%f\t%f\t%f\n",
-				mCharLastPosition_world_pt[2],
-				breast_current_local_pt[2],
-				acceleration_local_vec[2],
-				mBreastVelocity_local_vec[2],
-					
-				force_accel_local_vec[2],
-				force_spring_local_vec[2],
-				force_damping_local_vec[2],
-					
-				force_accel_local_vec[2],
-				force_damping_local_vec[2],
-				force_drag_local_vec[2],
-				force_net_local_vec[2],
-				time_delta,
-				mBreastMassParam
-			);
-	}
-
 	mBreastLastPosition_local_pt = new_local_pt;
 	
+	//
+	// 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 BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(this) != NULL);
 	if (!is_self)
 	{
-		const F32 area_for_max_settings = 300.0;
+		const F32 area_for_max_settings = 200.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);
@@ -373,7 +375,7 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 		}
 	}
 
-
+	// If the parameter hasn't changed enough, then don't update.
 	LLVector3 position_diff = mBreastLastUpdatePosition_local_pt-new_local_pt;
 	for (U32 i=0; i < 3; i++)
 	{
@@ -385,7 +387,10 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 			return TRUE;
 		}
 	}
-
+	
+	//
+	// End update visual params
+	////////////////////////////////////////////////////////////////////////////////
 
 	return TRUE;
 }
diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h
index da71962453..8578d4ad1a 100644
--- a/indra/newview/llbreastmotion.h
+++ b/indra/newview/llbreastmotion.h
@@ -153,7 +153,6 @@ private:
 	LLFrameTimer	mTimer;
 	F32             mLastTime;
 	
-	FILE           *mFileWrite;
 	U32            mFileTicks;
 };
 
-- 
cgit v1.2.3


From db28075a8db2f1eff8f318688e57ae0c76931508 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 31 Aug 2010 18:06:03 -0400
Subject: Added debug setting for profiling.

---
 indra/newview/app_settings/settings.xml | 13 ++++++++++++-
 indra/newview/llbreastmotion.cpp        |  6 ++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

(limited to 'indra')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index ecb36273ec..58ed998ba0 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -610,7 +610,7 @@
     <key>AvatarPhysics</key>
     <map>
       <key>Comment</key>
-      <string>Enable avatar physics, such as breast physics.</string>
+      <string>Enable avatar physics.</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -618,6 +618,17 @@
       <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/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index b38e818dbd..57dc169ff3 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -325,6 +325,12 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 	mBreastVelocity_local_vec += acceleration_local_vec;
 	mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam*100.0, mBreastMaxVelocityParam*100.0);
 
+	// Temporary debugging setting to cause all avatars to move, for profiling purposes.
+	if (gSavedSettings.getBOOL("AvatarPhysicsTest"))
+	{
+		mBreastVelocity_local_vec[0] = sin(mTimer.getElapsedTimeF32()*4.0)*5.0;
+		mBreastVelocity_local_vec[1] = sin(mTimer.getElapsedTimeF32()*3.0)*5.0;
+	}
 	// Calculate the new parameters and clamp them to the min/max ranges.
 	LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
 	new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
-- 
cgit v1.2.3


From 45639aa0d1889a6cbd9223e987740d25d96ed8fd Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 31 Aug 2010 18:19:42 -0400
Subject: Removed min pixel area for debugging performance.

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

(limited to 'indra')

diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
index 57dc169ff3..7c205a8b9f 100644
--- a/indra/newview/llbreastmotion.cpp
+++ b/indra/newview/llbreastmotion.cpp
@@ -45,7 +45,7 @@
 #include "llviewervisualparam.h"
 #include "llvoavatarself.h"
 
-#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 1000.f;
+#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f;
 
 #define N_PARAMS 2
 
@@ -370,7 +370,7 @@ BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
 	const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(this) != NULL);
 	if (!is_self)
 	{
-		const F32 area_for_max_settings = 200.0;
+		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);
-- 
cgit v1.2.3


From 9ea172a8e21913b115e676a022e80e784dfd5142 Mon Sep 17 00:00:00 2001
From: Oz Linden <oz@lindenlab.com>
Date: Wed, 15 Dec 2010 08:58:15 -0500
Subject: correct merge error in llvoavatar

---
 indra/newview/llvoavatar.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f86c4321c4..49d4da71ff 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -6249,8 +6249,7 @@ void LLVOAvatar::updateMeshTextures()
 										  || !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable() );
 			use_lkg_baked_layer[i] = (!is_layer_baked[i] 
 									  && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR) 
-									  && mBakedTextureDatas[i].mTexLayerSet 
-									  && !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized());
+									  && layerset_invalid);
 			if (use_lkg_baked_layer[i])
 			{
 				mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE);
-- 
cgit v1.2.3