Commits

leyla_linden committed fac3331 Merge

hg merge

  • Participants
  • Parent commits 14f3f9d, 479fed4

Comments (0)

Files changed (300)

 74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start
 f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start
 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
+ce588bc1ae8e3a90ee5e1f5de71a346886a9fd8b 2.6.7-start
                   <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
                   <string>-DWORD_SIZE:STRING=32</string>
                   <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
                 </array>
               </map>
               <key>name</key>
                   <string>-DWORD_SIZE:STRING=32</string>
                   <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
-                  <string>-DLL_RELEASE_FOR_DOWNLOAD:BOOL=YES</string>
                 </array>
                 <key>arguments</key>
                 <array>

doc/contributions.txt

 	SNOW-624
 	SNOW-737
 	STORM-318
+	STORM-1182
 	VWR-233
 	VWR-20583
 	VWR-20891
 Cron Stardust
 	VWR-10579
 	VWR-25120
+	STORM-1075
 Cypren Christenson
 	STORM-417
 Dale Glass
 	STORM-1094
 	STORM-1077
 	STORM-953
+	STORM-1128
+	STORM-956
 	STORM-1095
 Kage Pixel
 	VWR-11
 	STORM-960
 	STORM-1019
 	STORM-1095
+	STORM-1128
 	VWR-2488
 	VWR-9557
 	VWR-10579
 	VWR-13483
 	VWR-13947
 	VWR-24420
+	STORM-956
 	STORM-1147
 Thraxis Epsilon
 	SVC-371

indra/llcharacter/llbvhloader.cpp

 
 #define INCHES_TO_METERS 0.02540005f
 
-const F32 POSITION_KEYFRAME_THRESHOLD = 0.03f;
+const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f;
 const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f;
 
-const F32 POSITION_MOTION_THRESHOLD = 0.001f;
+const F32 POSITION_MOTION_THRESHOLD_SQUARED = 0.001f * 0.001f;
 const F32 ROTATION_MOTION_THRESHOLD = 0.001f;
 
 char gInFile[1024];		/* Flawfinder: ignore */
 				if (ki_prev == ki_last_good_pos)
 				{
 					joint->mNumPosKeys++;
-					if (dist_vec(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD)
+					if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED)
 					{
 						pos_changed = TRUE;
 					}
 					LLVector3 current_pos(ki->mPos);
 					LLVector3 interp_pos = lerp(current_pos, last_good_pos, 1.f / (F32)numPosFramesConsidered);
 
-					if (dist_vec(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD)
+					if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED)
 					{
 						pos_changed = TRUE;
 					}
 
-					if (dist_vec(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD)
+					if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD_SQUARED)
 					{
 						ki_prev->mIgnorePos = TRUE;
 						numPosFramesConsidered++;

indra/llcommon/indra_constants.h

 const F32 CHAT_MAX_RADIUS = CHAT_SHOUT_RADIUS;
 const F32 CHAT_MAX_RADIUS_BY_TWO = CHAT_MAX_RADIUS / 2.f;
 
+// squared editions of the above for distance checks
+const F32 CHAT_WHISPER_RADIUS_SQUARED = CHAT_WHISPER_RADIUS * CHAT_WHISPER_RADIUS;
+const F32 CHAT_NORMAL_RADIUS_SQUARED = CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS;
+const F32 CHAT_SHOUT_RADIUS_SQUARED = CHAT_SHOUT_RADIUS * CHAT_SHOUT_RADIUS;
+const F32 CHAT_MAX_RADIUS_SQUARED = CHAT_SHOUT_RADIUS_SQUARED;
+const F32 CHAT_MAX_RADIUS_BY_TWO_SQUARED = CHAT_MAX_RADIUS_BY_TWO * CHAT_MAX_RADIUS_BY_TWO;
+
+
 // this times above gives barely audible radius
 const F32 CHAT_BARELY_AUDIBLE_FACTOR = 2.0f;
 

indra/llcommon/llversionviewer.h

 
 const S32 LL_VERSION_MAJOR = 2;
 const S32 LL_VERSION_MINOR = 6;
-const S32 LL_VERSION_PATCH = 7;
+const S32 LL_VERSION_PATCH = 8;
 const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Developer";

indra/llmath/tests/llbbox_test.cpp

 
 
 #define ANGLE                (3.14159265f / 2.0f)
-#define APPROX_EQUAL(a, b)   dist_vec((a),(b)) < 1e-5
+#define APPROX_EQUAL(a, b)   (dist_vec_squared((a),(b)) < 1e-10)
 
 namespace tut
 {

indra/llmessage/llassetstorage.cpp

 bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type,
 													  LLGetAssetCallback callback, void *user_data)
 {
+	if (user_data)
+	{
+		// The *user_data should not be passed without a callback to clean it up.
+		llassert(callback != NULL)
+	}
+
 	BOOL exists = mStaticVFS->getExists(uuid, type);
 	if (exists)
 	{
 
 	llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
 
+	if (user_data)
+	{
+		// The *user_data should not be passed without a callback to clean it up.
+		llassert(callback != NULL)
+	}
+
 	if (mShutDown)
 	{
 		llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
-		return; // don't get the asset or do any callbacks, we are shutting down
+
+		if (callback)
+		{
+			callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_FAILED, LL_EXSTAT_NONE);
+		}
+		return;
 	}
-		
+
 	if (uuid.isNull())
 	{
-		// Special case early out for NULL uuid
+		// Special case early out for NULL uuid and for shutting down
 		if (callback)
 		{
 			callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE, LL_EXSTAT_NULL_UUID);

indra/llui/lltexteditor.cpp

 			}
 		}
 
+		// Disabling parsing on the fly to avoid updating text segments
+		// until all indentation commands are executed.
+		mParseOnTheFly = FALSE;
+
 		// Find each start-of-line and indent it
 		do
 		{
 		}
 		while( cur < right );
 
+		mParseOnTheFly = TRUE;
+
 		if( (right < getLength()) && (text[right] == '\n') )
 		{
 			right++;

indra/llvfs/lldir_linux.cpp

 #else
 	mAppRODataDir = tmp_str;
 #endif
-    std::string::size_type indra_pos = mExecutableDir.find("/indra");
-    if (indra_pos != std::string::npos)
+    std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-linux-");
+    if (build_dir_pos != std::string::npos)
     {
 		// ...we're in a dev checkout
-		mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + "/indra/newview/skins";
+		mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins";
 		llinfos << "Running in dev checkout with mSkinBaseDir "
 		 << mSkinBaseDir << llendl;
     }

indra/llvfs/lldir_mac.cpp

 		CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef);
 		CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true);
 		
-		U32 indra_pos = mExecutableDir.find("/indra");
-		if (indra_pos != std::string::npos)
+		U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-");
+		if (build_dir_pos != std::string::npos)
 		{
 			// ...we're in a dev checkout
-			mSkinBaseDir = mExecutableDir.substr(0, indra_pos)
+			mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos)
 				+ "/indra/newview/skins";
 			llinfos << "Running in dev checkout with mSkinBaseDir "
 				<< mSkinBaseDir << llendl;

indra/newview/llagent.cpp

 		//NB: auto pilot can terminate for a reason other than reaching the destination
 		if (mAutoPilotFinishedCallback)
 		{
-			mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+			mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData);
 		}
 		mLeaderID = LLUUID::null;
 

indra/newview/llfloaterchat.cpp

 		if (!chat.mPosAgent.isExactlyZero())
 		{
 			LLVector3 pos_agent = gAgent.getPositionAgent();
-			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
-			if (distance > gAgent.getNearChatRadius())
+			F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+			F32 dist_near_chat = gAgent.getNearChatRadius();
+			if (distance_squared > dist_near_chat * dist_near_chat)
 			{
 				// diminish far-off chat
 				text_color.mV[VALPHA] = 0.8f;

indra/newview/llfloaterworldmap.cpp

 #include "llslider.h"
 #include "message.h"
 #include "llwindow.h"			// copyTextToClipboard()
+#include <algorithm>
 
 //---------------------------------------------------------------------------
 // Constants
 // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
 static const S32 MAX_VISIBLE_REGIONS = 512;
 
+// It would be more logical to have this inside the method where it is used but to compile under gcc this
+// struct has to be here.
+struct SortRegionNames
+{
+	inline bool operator ()(std::pair <U64, LLSimInfo*> const& _left, std::pair <U64, LLSimInfo*> const& _right)
+	{
+		return(LLStringUtil::compareInsensitive(_left.second->getName(), _right.second->getName()) < 0);
+	}
+};
+
 enum EPanDirection
 {
 	PAN_UP,
 	S32 name_length = mCompletingRegionName.length();
 	
 	LLSD match;
-	
+
 	S32 num_results = 0;
-	std::map<U64, LLSimInfo*>::const_iterator it;
-	for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
+
+	std::vector<std::pair <U64, LLSimInfo*> > sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end());
+	std::sort(sim_info_vec.begin(), sim_info_vec.end(), SortRegionNames());
+
+	for (std::vector<std::pair <U64, LLSimInfo*> >::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it)
 	{
 		LLSimInfo* info = it->second;
 		std::string sim_name_lower = info->getName();

indra/newview/llfolderview.cpp

 	return FALSE;
 }
 
-void LLFolderView::checkTreeResortForModelChanged()
-{
-	if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME))
-	{
-		// This is the case where something got added or removed.  If we are date sorting
-		// everything including folders, then we need to rebuild the whole tree.
-		// Just set to something not SO_DATE to force the folder most resent date resort.
-		mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE;
-		setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE);
-	}
-}
-
 static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory");
 
 void LLFolderView::setSortOrder(U32 order)

indra/newview/llfolderview.h

 	// FolderViews default to sort by name.  This will change that,
 	// and resort the items if necessary.
 	void setSortOrder(U32 order);
-	void checkTreeResortForModelChanged();
 	void setFilterPermMask(PermissionMask filter_perm_mask);
 	void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
 	

indra/newview/llfolderviewitem.cpp

 		return;
 	}
 
-	// Propegate this change to sub folders
+	// Propagate this change to sub folders
 	for (folders_t::iterator iter = mFolders.begin();
 		iter != mFolders.end();)
 	{

indra/newview/llgesturemgr.cpp

 #include <algorithm>
 
 // library
+#include "llaudioengine.h"
 #include "lldatapacker.h"
 #include "llinventory.h"
+#include "llkeyframemotion.h"
 #include "llmultigesture.h"
 #include "llnotificationsutil.h"
 #include "llstl.h"
 	gesture->mPlaying = TRUE;
 	mPlaying.push_back(gesture);
 
+	// Load all needed assets to minimize the delays
+	// when gesture is playing.
+	for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin();
+		 steps_it != gesture->mSteps.end();
+		 ++steps_it)
+	{
+		LLGestureStep* step = *steps_it;
+		switch(step->getType())
+		{
+		case STEP_ANIMATION:
+			{
+				LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
+				const LLUUID& anim_id = anim_step->mAnimAssetID;
+
+				// Don't request the animation if this step stops it or if it is already in Static VFS
+				if (!(anim_id.isNull()
+					  || anim_step->mFlags & ANIM_FLAG_STOP
+					  || gAssetStorage->hasLocalAsset(anim_id, LLAssetType::AT_ANIMATION)))
+				{
+					mLoadingAssets.insert(anim_id);
+
+					LLUUID* id = new LLUUID(gAgentID);
+					gAssetStorage->getAssetData(anim_id,
+									LLAssetType::AT_ANIMATION,
+									onAssetLoadComplete,
+									(void *)id,
+									TRUE);
+				}
+				break;
+			}
+		case STEP_SOUND:
+			{
+				LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
+				const LLUUID& sound_id = sound_step->mSoundAssetID;
+				if (!(sound_id.isNull()
+					  || gAssetStorage->hasLocalAsset(sound_id, LLAssetType::AT_SOUND)))
+				{
+					mLoadingAssets.insert(sound_id);
+
+					gAssetStorage->getAssetData(sound_id,
+									LLAssetType::AT_SOUND,
+									onAssetLoadComplete,
+									NULL,
+									TRUE);
+				}
+				break;
+			}
+		case STEP_CHAT:
+		case STEP_WAIT:
+		case STEP_EOF:
+			{
+				break;
+			}
+		default:
+			{
+				llwarns << "Unknown gesture step type: " << step->getType() << llendl;
+			}
+		}
+	}
+
 	// And get it going
 	stepGesture(gesture);
 
 	{
 		return;
 	}
-	if (!isAgentAvatarValid()) return;
+	if (!isAgentAvatarValid() || hasLoadingAssets(gesture)) return;
 
 	// Of the ones that started playing, have any stopped?
 
 	}
 }
 
+// static
+void LLGestureMgr::onAssetLoadComplete(LLVFS *vfs,
+									   const LLUUID& asset_uuid,
+									   LLAssetType::EType type,
+									   void* user_data, S32 status, LLExtStat ext_status)
+{
+	LLGestureMgr& self = LLGestureMgr::instance();
+
+	// Complete the asset loading process depending on the type and
+	// remove the asset id from pending downloads list.
+	switch(type)
+	{
+	case LLAssetType::AT_ANIMATION:
+		{
+			LLKeyframeMotion::onLoadComplete(vfs, asset_uuid, type, user_data, status, ext_status);
+
+			self.mLoadingAssets.erase(asset_uuid);
+
+			break;
+		}
+	case LLAssetType::AT_SOUND:
+		{
+			LLAudioEngine::assetCallback(vfs, asset_uuid, type, user_data, status, ext_status);
+
+			self.mLoadingAssets.erase(asset_uuid);
+
+			break;
+		}
+	default:
+		{
+			llwarns << "Unexpected asset type: " << type << llendl;
+
+			// We don't want to return from this callback without
+			// an animation or sound callback being fired
+			// and *user_data handled to avoid memory leaks.
+			llassert(type == LLAssetType::AT_ANIMATION || type == LLAssetType::AT_SOUND);
+		}
+	}
+}
+
+// static
+bool LLGestureMgr::hasLoadingAssets(LLMultiGesture* gesture)
+{
+	LLGestureMgr& self = LLGestureMgr::instance();
+
+	for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin();
+		 steps_it != gesture->mSteps.end();
+		 ++steps_it)
+	{
+		LLGestureStep* step = *steps_it;
+		switch(step->getType())
+		{
+		case STEP_ANIMATION:
+			{
+				LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
+				const LLUUID& anim_id = anim_step->mAnimAssetID;
+
+				if (!(anim_id.isNull()
+					  || anim_step->mFlags & ANIM_FLAG_STOP
+					  || self.mLoadingAssets.find(anim_id) == self.mLoadingAssets.end()))
+				{
+					return true;
+				}
+				break;
+			}
+		case STEP_SOUND:
+			{
+				LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
+				const LLUUID& sound_id = sound_step->mSoundAssetID;
+
+				if (!(sound_id.isNull()
+					  || self.mLoadingAssets.find(sound_id) == self.mLoadingAssets.end()))
+				{
+					return true;
+				}
+				break;
+			}
+		case STEP_CHAT:
+		case STEP_WAIT:
+		case STEP_EOF:
+			{
+				break;
+			}
+		default:
+			{
+				llwarns << "Unknown gesture step type: " << step->getType() << llendl;
+			}
+		}
+	}
+
+	return false;
+}
 
 void LLGestureMgr::stopGesture(LLMultiGesture* gesture)
 {

indra/newview/llgesturemgr.h

 
 	// Used by loadGesture
 	static void onLoadComplete(LLVFS *vfs,
-						   const LLUUID& asset_uuid,
-						   LLAssetType::EType type,
-						   void* user_data, S32 status, LLExtStat ext_status);
+							   const LLUUID& asset_uuid,
+							   LLAssetType::EType type,
+							   void* user_data, S32 status, LLExtStat ext_status);
+
+	// Used by playGesture to load an asset file
+	// required to play a gesture step
+	static void onAssetLoadComplete(LLVFS *vfs,
+									const LLUUID& asset_uuid,
+									LLAssetType::EType type,
+									void* user_data, S32 status, LLExtStat ext_status);
+
+	// Checks whether all animation and sound assets
+	// needed to play a gesture are loaded.
+	static bool hasLoadingAssets(LLMultiGesture* gesture);
 
 private:
 	// Active gestures.
 	callback_map_t mCallbackMap;
 	std::vector<LLMultiGesture*> mPlaying;	
 	BOOL mValid;
+
+	std::set<LLUUID> mLoadingAssets;
 };
 
 #endif

indra/newview/llhudeffectlookat.cpp

 // throttle
 const F32 MAX_SENDS_PER_SEC = 4.f;
 
-const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f;
+const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f;
 const F32 MIN_TARGET_OFFSET_SQUARED = 0.0001f;
 
 
 	BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject);
 
 	// lookat position has moved a certain amount and we haven't just sent an update
-	lookAtChanged = lookAtChanged || ((dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) && 
+	lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) && 
 		((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
 
 	if (lookAtChanged)

indra/newview/llhudeffectpointat.cpp

 // throttle
 const F32 MAX_SENDS_PER_SEC = 4.f;
 
-const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f;
+const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f;
 
 // timeouts
 // can't use actual F32_MAX, because we add this to the current frametime
 	BOOL targetTypeChanged = (target_type != mTargetType) ||
 		(object != mTargetObject);
 
-	BOOL targetPosChanged = (dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) && 
+	BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) && 
 		((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC));
 
 	if (targetTypeChanged || targetPosChanged)

indra/newview/llinventoryfilter.h

 		FILTERLINK_ONLY_LINKS		// only show links
 	};
 
-	// REFACTOR: Change this to an enum.
-	static const U32 SO_DATE = 1;
-	static const U32 SO_FOLDERS_BY_NAME = 2;
-	static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4;
+	enum ESortOrderType
+	{
+		SO_NAME = 0,						// Sort inventory by name
+		SO_DATE = 0x1,						// Sort inventory by date
+		SO_FOLDERS_BY_NAME = 0x1 << 1,		// Force folder sort by name
+		SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2	// Force system folders to be on top
+	};
 
 	LLInventoryFilter(const std::string& name);
 	virtual ~LLInventoryFilter();

indra/newview/llmaniprotate.cpp

 			if (gSavedSettings.getBOOL("LimitSelectDistance"))
 			{
 				F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
-				if (dist_vec(gAgent.getPositionAgent(), center) > max_select_distance)
+				if (dist_vec_squared(gAgent.getPositionAgent(), center) > (max_select_distance * max_select_distance))
 				{
 					visible = FALSE;
 				}

indra/newview/llmanipscale.cpp

 		
 		LLVector3 center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal());
 
-		F32 range;
-		F32 range_from_agent;
 		if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
 		{
 			mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
 		}
 		else
 		{
-			range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent);
-			range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent);
+			F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent);
+			F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent);
 
 			// Don't draw manip if object too far away
 			if (gSavedSettings.getBOOL("LimitSelectDistance"))
 			{
 				F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
-				if (range_from_agent > max_select_distance)
+				if (range_from_agent_squared > max_select_distance * max_select_distance)
 				{
 					return;
 				}
 			}
 
-			if (range > 0.001f)
+			if (range_squared > 0.001f * 0.001f)
 			{
 				// range != zero
 				F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
 				F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView();  // radians
-				mBoxHandleSize = range * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
+				mBoxHandleSize = fsqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
 			}
 			else
 			{

indra/newview/llnetmap.cpp

 		//localMouse(&local_mouse_x, &local_mouse_y);
 		LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
 		mClosestAgentToCursor.setNull();
-		F32 closest_dist = F32_MAX;
-		F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE; 
+		F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop
+		F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE);
 
 		// Draw avatars
 		for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
 					}
 				}
 
-				F32	dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+				F32	dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
 											  LLVector2(local_mouse_x,local_mouse_y));
-				if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+				if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
 				{
-					closest_dist = dist_to_cursor;
+					closest_dist_squared = dist_to_cursor_squared;
 					mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i);
 				}
 			}
 					  dot_width,
 					  dot_width);
 
-			F32	dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+			F32	dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
 										  LLVector2(local_mouse_x,local_mouse_y));
-			if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+			if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
 			{
 				mClosestAgentToCursor = gAgent.getID();
 			}

indra/newview/llpanelmaininventory.cpp

 		mActivePanel->getFilter()->markDefault();
 		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
 		mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+		mResortActivePanel = true;
 	}
 	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
 	if (recent_items_panel)
 	{
 		mFilterEditor->setText(mFilterSubString);
 	}	
+	if (mActivePanel && mResortActivePanel)
+	{
+		// EXP-756: Force resorting of the list the first time we draw the list: 
+		// In the case of date sorting, we don't have enough information at initialization time
+		// to correctly sort the folders. Later manual resort doesn't do anything as the order value is 
+		// set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order.
+		U32 order = mActivePanel->getSortOrder();
+		mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME);
+		mActivePanel->setSortOrder(order);
+		mResortActivePanel = false;
+	}
 	LLPanel::draw();
 	updateItemcountText();
 }

indra/newview/llpanelmaininventory.h

 	LLTabContainer*				mFilterTabs;
 	LLHandle<LLFloater>			mFinderHandle;
 	LLInventoryPanel*			mActivePanel;
+	bool						mResortActivePanel;
 	LLSaveFolderState*			mSavedFolderState;
 	std::string					mFilterText;
 	std::string					mFilterSubString;

indra/newview/llpanelpeople.cpp

 		const LLVector3d& me_pos = gAgent.getPositionGlobal();
 		const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second;
 		const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second;
-		F32 dist1 = dist_vec(item1_pos, me_pos);
-		F32 dist2 = dist_vec(item2_pos, me_pos);
-		return dist1 < dist2;
+		
+		return dist_vec_squared(item1_pos, me_pos) < dist_vec_squared(item2_pos, me_pos);
 	}
 private:
 	id_to_pos_map_t mAvatarsPositions;

indra/newview/llselectmgr.cpp

 	if (update_position)
 	{
 		// calculate the distance of the object closest to the camera origin
-		F32 min_dist = 1e+30f;
+		F32 min_dist_squared = F32_MAX; // value will be overridden in the loop
+		
 		LLVector3 obj_pos;
 		for (LLObjectSelection::root_iterator it = getSelection()->root_begin();
 			 it != getSelection()->root_end(); ++it)
 		{
 			obj_pos = (*it)->getObject()->getPositionEdit();
 			
-			F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin());
-			if (obj_dist < min_dist)
+			F32 obj_dist_squared = dist_vec_squared(obj_pos, LLViewerCamera::getInstance()->getOrigin());
+			if (obj_dist_squared < min_dist_squared)
 			{
-				min_dist = obj_dist;
+				min_dist_squared = obj_dist_squared;
 			}
 		}
 		
-		// factor the distance inside the displacement vector. This will get us
+		// factor the distance into the displacement vector. This will get us
 		// equally visible movements for both close and far away selections.
-		min_dist = sqrt(min_dist) / 2;
-		displ_global.setVec(displ.mV[0]*min_dist, 
-							displ.mV[1]*min_dist, 
-							displ.mV[2]*min_dist);
+		F32 min_dist = sqrt(fsqrtf(min_dist_squared)) / 2;
+		displ_global.setVec(displ.mV[0] * min_dist,
+							displ.mV[1] * min_dist,
+							displ.mV[2] * min_dist);
 
 		// equates to: Displ_global = Displ * M_cam_axes_in_global_frame
 		displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global);

indra/newview/llspeakers.cpp

 		if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
 		{
 			LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id);
-			if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS)
+			if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS_SQUARED)
 			{
 				setSpeakerNotInChannel(speakerp);
 			}

indra/newview/llviewerchat.cpp

 		if (!chat.mPosAgent.isExactlyZero())
 		{
 			LLVector3 pos_agent = gAgent.getPositionAgent();
-			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
-			if (distance > gAgent.getNearChatRadius())
+			F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+			F32 dist_near_chat = gAgent.getNearChatRadius();
+			if (distance_squared > dist_near_chat * dist_near_chat)
 			{
 				// diminish far-off chat
 				r_color.mV[VALPHA] = 0.8f;
 		if (!chat.mPosAgent.isExactlyZero())
 		{
 			LLVector3 pos_agent = gAgent.getPositionAgent();
-			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
-			if (distance > gAgent.getNearChatRadius())
+			F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+			F32 dist_near_chat = gAgent.getNearChatRadius();
+			if (distance_squared > dist_near_chat * dist_near_chat)
 			{
 				// diminish far-off chat
 				r_color_alpha = 0.8f; 

indra/newview/llviewermessage.cpp

 //
 const F32 BIRD_AUDIBLE_RADIUS = 32.0f;
 const F32 SIT_DISTANCE_FROM_TARGET = 0.25f;
+const F32 CAMERA_POSITION_THRESHOLD_SQUARED = 0.001f * 0.001f;
 static const F32 LOGOUT_REPLY_TIME = 3.f;	// Wait this long after LogoutReply before quitting.
 
 // Determine how quickly residents' scripts can issue question dialogs
 	BOOL force_mouselook;
 	mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook);
 
-	if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f)
+	if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > CAMERA_POSITION_THRESHOLD_SQUARED)
 	{
 		gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at);
 	}
 	LLSD payload;
 
 	LLUUID object_id;
+    LLUUID owner_id;
+
 	msg->getUUID("Data", "ObjectID", object_id);
-
-	if (LLMuteList::getInstance()->isMuted(object_id))
+    msg->getUUID("OwnerData", "OwnerID", owner_id);
+
+	if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id))
 	{
 		return;
 	}

indra/newview/llviewerparceloverlay.cpp

 	U8* colorp;
 	bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
 
-	const F32 PROPERTY_LINE_CLIP_DIST = 256.f;
+	const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
 
 	for (i = 0; i < mVertexCount; i += vertex_per_edge)
 	{
 		vertex.mV[VY] = *(vertexp+1);
 		vertex.mV[VZ] = *(vertexp+2);
 
-		if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST*PROPERTY_LINE_CLIP_DIST)
+		if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED)
 		{
 			continue;
 		}

indra/newview/llvoicevivox.cpp

 		}
 	}
 	
-	if(dist_vec(mCameraPosition, tethered) > 0.1)
+	if(dist_vec_squared(mCameraPosition, tethered) > 0.01)
 	{
 		mCameraPosition = tethered;
 		mSpatialCoordsDirty = true;
 
 void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
 {
-	if(dist_vec(mAvatarPosition, position) > 0.1)
+	if(dist_vec_squared(mAvatarPosition, position) > 0.01)
 	{
 		mAvatarPosition = position;
 		mSpatialCoordsDirty = true;

indra/newview/llworld.cpp

 
 void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
 {
+	F32 radius_squared = radius * radius;
+	
 	if(avatar_ids != NULL)
 	{
 		avatar_ids->clear();
 			if(!uuid.isNull())
 			{
 				LLVector3d pos_global = pVOAvatar->getPositionGlobal();
-				if(dist_vec(pos_global, relative_to) <= radius)
+				if(dist_vec_squared(pos_global, relative_to) <= radius_squared)
 				{
 					if(positions != NULL)
 					{
 		for (S32 i = 0; i < count; i++)
 		{
 			LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global);
-			if(dist_vec(pos_global, relative_to) <= radius)
+			if(dist_vec_squared(pos_global, relative_to) <= radius_squared)
 			{
 				LLUUID uuid = regionp->mMapAvatarIDs.get(i);
 				// if this avatar doesn't already exist in the list, add it

indra/newview/skins/default/xui/de/floater_beacons.xml

 		<check_box label="Nur berühren" name="touch_only"/>
 		<check_box label="Soundquellen" name="sounds"/>
 		<check_box label="Partikelquellen" name="particles"/>
+		<check_box label="Medienquellen" name="moapbeacon"/>
 	</panel>
 </floater>

indra/newview/skins/default/xui/de/menu_avatar_self.xml

 			<menu_item_call label="Unterhemd" name="Self Undershirt"/>
 			<menu_item_call label="Unterhose" name="Self Underpants"/>
 			<menu_item_call label="Tätowierung" name="Self Tattoo"/>
+			<menu_item_call label="Physik" name="Self Physics"/>
 			<menu_item_call label="Alpha" name="Self Alpha"/>
 			<menu_item_call label="Alle Kleider" name="All Clothes"/>
 		</context_menu>

indra/newview/skins/default/xui/de/menu_bottomtray.xml

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="hide_camera_move_controls_menu">
-	<menu_item_check label="Voice aktiviert" name="EnableVoiceChat"/>
+	<menu_item_check label="Schaltfläche „Sprechen“" name="EnableVoiceChat"/>
 	<menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
 	<menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
 	<menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>

indra/newview/skins/default/xui/de/menu_inventory.xml

 		<menu_item_call label="Neue Unterhose" name="New Underpants"/>
 		<menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/>
 		<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+		<menu_item_call label="Neue Physik" name="New Physics"/>
 	</menu>
 	<menu label="Neue Körperteile" name="New Body Parts">
 		<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>

indra/newview/skins/default/xui/de/menu_inventory_add.xml

 		<menu_item_call label="Neue Unterhose" name="New Underpants"/>
 		<menu_item_call label="Neues Alpha" name="New Alpha"/>
 		<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+		<menu_item_call label="Neue Physik" name="New Physics"/>
 	</menu>
 	<menu label="Neue Körperteile" name="New Body Parts">
 		<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>

indra/newview/skins/default/xui/de/menu_media_ctrl.xml

+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+	<menu_item_call label="Ausschneiden" name="Cut"/>
+	<menu_item_call label="Kopieren" name="Copy"/>
+	<menu_item_call label="Einfügen" name="Paste"/>
+</context_menu>

indra/newview/skins/default/xui/de/menu_outfit_gear.xml

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
 	<menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
 	<menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
 	<menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
 		<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
 		<menu_item_call label="Neue Unterhose" name="New Underpants"/>
 		<menu_item_call label="Neues Alpha" name="New Alpha"/>
+		<menu_item_call label="Neue Physik" name="New Physics"/>
 		<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
 	</menu>
 	<menu label="Neue Körperteile" name="New Body Parts">
 	</menu>
 	<menu_item_call label="Outfit neu benennen" name="rename"/>
 	<menu_item_call label="Outfit löschen" name="delete_outfit"/>
-</menu>
+</toggleable_menu>

indra/newview/skins/default/xui/de/menu_viewer.xml

 			<menu_item_call label="Rock" name="Skirt"/>
 			<menu_item_call label="Alpha" name="Alpha"/>
 			<menu_item_call label="Tätowierung" name="Tattoo"/>
+			<menu_item_call label="Physik" name="Physics"/>
 			<menu_item_call label="Alle Kleider" name="All Clothes"/>
 		</menu>
 		<menu label="Hilfe" name="Help">

indra/newview/skins/default/xui/de/notifications.xml

 	<notification label="Stehen" name="HintSit">
 		Um aufzustehen, klicken Sie auf die Schaltfläche „Stehen“.
 	</notification>
+	<notification label="Sprechen" name="HintSpeak">
+		Auf Schaltfläche „Sprechen“ klicken, um das Mikrofon ein- und auszuschalten.
+
+Auf den Pfeil nach oben klicken, um die Sprachsteuerung zu sehen.
+
+Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deaktiviert.
+	</notification>
 	<notification label="Welt erkunden" name="HintDestinationGuide">
 		Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“.
 	</notification>
 	<notification label="Bewegen" name="HintMove">
 		Um zu gehen oder zu rennen, öffnen Sie das Bedienfeld „Bewegen“ und klicken Sie auf die Pfeile. Sie können auch die Pfeiltasten auf Ihrer Tastatur verwenden.
 	</notification>
+	<notification label="" name="HintMoveClick">
+		1. Zum Gehen klicken: Auf beliebige Stelle am Boden klicken, um zu dieser Stelle zu gehen.
+
+2. Zum Drehen der Anzeige klicken und ziehen: Auf beliebige Stelle in der Welt klicken und ziehen, um Ihre Ansicht zu ändern.
+	</notification>
 	<notification label="Anzeigename" name="HintDisplayName">
 		Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird.
 	</notification>
-	<notification label="Bewegen" name="HintMoveArrows">
-		Verwenden Sie zum Gehen die Pfeiltasten auf Ihrer Tastatur. Drücken Sie die Nach-oben-Taste zweimal, um zu rennen.
-	</notification>
 	<notification label="Ansicht" name="HintView">
 		Um die Kameraansicht zu ändern, verwenden Sie die Schwenk- und Kreissteuerungen. Um die Ansicht zurückzusetzen, drücken Sie die Esc-Taste oder laufen Sie einfach.
 	</notification>

indra/newview/skins/default/xui/de/panel_edit_physics.xml

+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+	<panel label="" name="accordion_panel">
+		<accordion name="physics_accordion">
+			<accordion_tab name="physics_breasts_updown_tab" title="Brust – Hüpfen"/>
+			<accordion_tab name="physics_breasts_inout_tab" title="Brust – Dekolleté"/>
+			<accordion_tab name="physics_breasts_leftright_tab" title="Brust – Schwingen"/>
+			<accordion_tab name="physics_belly_tab" title="Bauch – Hüpfen"/>
+			<accordion_tab name="physics_butt_tab" title="Po – Hüpfen"/>
+			<accordion_tab name="physics_butt_leftright_tab" title="Po – Wiegen"/>
+			<accordion_tab name="physics_advanced_tab" title="Erweiterte Parameter"/>
+		</accordion>
+	</panel>
+</panel>

indra/newview/skins/default/xui/de/panel_edit_wearable.xml

 	<string name="edit_tattoo_title">
 		Tätowierung bearbeiten
 	</string>
+	<string name="edit_physics_title">
+		Physik bearbeiten
+	</string>
 	<string name="shape_desc_text">
 		Form:
 	</string>
 	<string name="tattoo_desc_text">
 		Tätowierung:
 	</string>
+	<string name="physics_desc_text">
+		Physik:
+	</string>
 	<labeled_back_button label="Speichern" name="back_btn" tool_tip="Zurück zu Outfit bearbeiten"/>
 	<text name="edit_wearable_title" value="Form bearbeiten"/>
 	<panel label="Hemd" name="wearable_type_panel">

indra/newview/skins/default/xui/de/panel_preferences_chat.xml

 	<spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/>
 	<spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/>
 	<check_box name="translate_chat_checkbox"/>
-	<text name="translate_chb_label" >Bei Chat Maschinenübersetzung verwenden (Service von Google)</text>
+	<text name="translate_chb_label">
+		Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt)
+	</text>
 	<text name="translate_language_text">
 		Chat übersetzen in:
 	</text>

indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml

 			<combo_box.item label="Alle Avatare und Objekte" name="3"/>
 			<combo_box.item label="Alles" name="4"/>
 		</combo_box>
+		<slider label="Avatar-Physik:" name="AvatarPhysicsDetail"/>
+		<text name="AvatarPhysicsDetailText">
+			Niedrig
+		</text>
 		<slider label="Sichtweite:" name="DrawDistance"/>
 		<text name="DrawDistanceMeterText2">
 			m

indra/newview/skins/default/xui/de/panel_preferences_sound.xml

 	</panel.string>
 	<slider label="Master-Lautstärke" name="System Volume"/>
 	<check_box initial_value="true" name="mute_when_minimized"/>
-	<text name="mute_chb_label">Stummschalten, wenn minimiert</text>
+	<text name="mute_chb_label">
+		Stummschalten, wenn minimiert
+	</text>
 	<slider label="Schaltflächen" name="UI Volume"/>
 	<slider label="Umgebung" name="Wind Volume"/>
 	<slider label="Soundeffekte" name="SFX Volume"/>

indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml

+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+	<slider label="[BESCHR]" name="param slider"/>
+</panel>

indra/newview/skins/default/xui/de/strings.xml

 	<string name="tattoo">
 		Tätowierung
 	</string>
+	<string name="physics">
+		Physik
+	</string>
 	<string name="invalid">
 		ungültig
 	</string>
 	<string name="tattoo_not_worn">
 		Tätowierung nicht getragen
 	</string>
+	<string name="physics_not_worn">
+		Physik nicht getragen
+	</string>
 	<string name="invalid_not_worn">
 		ungültig
 	</string>
 	<string name="create_new_tattoo">
 		Neue Tätowierung erstellen
 	</string>
+	<string name="create_new_physics">
+		Neue Physik erstellen
+	</string>
 	<string name="create_new_invalid">
 		ungültig
 	</string>
 	<string name="Bulbous Nose">
 		Knollennase
 	</string>
+	<string name="Breast Physics Mass">
+		Brust – Masse
+	</string>
+	<string name="Breast Physics Smoothing">
+		Brust – Glättung
+	</string>
+	<string name="Breast Physics Gravity">
+		Brust – Schwerkraft
+	</string>
+	<string name="Breast Physics Drag">
+		Brust – Luftwiderstand
+	</string>
+	<string name="Breast Physics InOut Max Effect">
+		Max. Effekt
+	</string>
+	<string name="Breast Physics InOut Spring">
+		Federn
+	</string>
+	<string name="Breast Physics InOut Gain">
+		Verstärkung
+	</string>
+	<string name="Breast Physics InOut Damping">
+		Dämpfung
+	</string>
+	<string name="Breast Physics UpDown Max Effect">
+		Max. Effekt
+	</string>
+	<string name="Breast Physics UpDown Spring">
+		Federn
+	</string>
+	<string name="Breast Physics UpDown Gain">
+		Verstärkung
+	</string>
+	<string name="Breast Physics UpDown Damping">
+		Dämpfung
+	</string>
+	<string name="Breast Physics LeftRight Max Effect">
+		Max. Effekt
+	</string>
+	<string name="Breast Physics LeftRight Spring">
+		Federn
+	</string>
+	<string name="Breast Physics LeftRight Gain">
+		Verstärkung
+	</string>
+	<string name="Breast Physics LeftRight Damping">
+		Dämpfung
+	</string>
+	<string name="Belly Physics Mass">
+		Bauch – Masse
+	</string>
+	<string name="Belly Physics Smoothing">
+		Bauch – Glättung
+	</string>
+	<string name="Belly Physics Gravity">
+		Bauch – Schwerkraft
+	</string>
+	<string name="Belly Physics Drag">
+		Bauch – Luftwiderstand
+	</string>
+	<string name="Belly Physics UpDown Max Effect">
+		Max. Effekt
+	</string>
+	<string name="Belly Physics UpDown Spring">
+		Federn
+	</string>
+	<string name="Belly Physics UpDown Gain">
+		Verstärkung
+	</string>
+	<string name="Belly Physics UpDown Damping">
+		Dämpfung
+	</string>
+	<string name="Butt Physics Mass">
+		Po – Masse
+	</string>
+	<string name="Butt Physics Smoothing">
+		Po – Glättung
+	</string>
+	<string name="Butt Physics Gravity">
+		Po – Schwerkraft
+	</string>
+	<string name="Butt Physics Drag">
+		Po – Luftwiderstand
+	</string>
+	<string name="Butt Physics UpDown Max Effect">
+		Max. Effekt
+	</string>
+	<string name="Butt Physics UpDown Spring">
+		Federn
+	</string>
+	<string name="Butt Physics UpDown Gain">
+		Verstärkung
+	</string>
+	<string name="Butt Physics UpDown Damping">
+		Dämpfung
+	</string>
+	<string name="Butt Physics LeftRight Max Effect">
+		Max. Effekt
+	</string>
+	<string name="Butt Physics LeftRight Spring">
+		Federn
+	</string>
+	<string name="Butt Physics LeftRight Gain">
+		Verstärkung
+	</string>
+	<string name="Butt Physics LeftRight Damping">
+		Dämpfung
+	</string>
 	<string name="Bushy Eyebrows">
 		Buschige Augenbrauen
 	</string>
 	<string name="Butt Size">
 		Hintern, Größe
 	</string>
+	<string name="Butt Gravity">
+		Po – Schwerkraft
+	</string>
 	<string name="bustle skirt">
 		Tournürenrock
 	</string>
 	<string name="New Tattoo">
 		Neue Tätowierung
 	</string>
+	<string name="New Physics">
+		Neue Physik
+	</string>
 	<string name="Invalid Wearable">
 		Ungültiges Objekt
 	</string>

indra/newview/skins/default/xui/en/floater_preferences.xml

File contents unchanged.

indra/newview/skins/default/xui/en/menu_avatar_self.xml

File contents unchanged.

indra/newview/skins/default/xui/en/menu_media_ctrl.xml

File contents unchanged.

indra/newview/skins/default/xui/en/menu_outfit_gear.xml

File contents unchanged.

indra/newview/skins/default/xui/en/menu_viewer.xml

File contents unchanged.

indra/newview/skins/default/xui/en/notifications.xml

    yestext="Quit"
    notext="Don't Quit"/>
   </notification>
-  
+
   <notification
  name="NoPlaceInfo"
  label=""

indra/newview/skins/default/xui/en/panel_bottomtray.xml

  top="28"
  width="1310">
   <string
-   name="DragIndicationImageName"
-   value="Accordion_ArrowOpened_Off" />
+     name="DragIndicationImageName"
+     value="Accordion_ArrowOpened_Off" />
   <string
-   name="SpeakBtnToolTip"
-   value="Turns microphone on/off" />
+     name="SpeakBtnToolTip"
+     value="Turns microphone on/off" />
   <string
-   name="VoiceControlBtnToolTip"
-   value="Shows/hides voice control panel" />
+     name="VoiceControlBtnToolTip"
+     value="Shows/hides voice control panel" />
   <layout_stack
-   border_size="0"
-   clip="false"
-   follows="all"
-   height="28"
+     border_size="0"
+     clip="false"
+     follows="all"
+     height="28"
    layout="topleft"
    left="0"
-   mouse_opaque="false"
-   name="toolbar_stack"
-   orientation="horizontal"
-   top="0"
-   width="1310">
+     mouse_opaque="false"
+     name="toolbar_stack"
+     orientation="horizontal"
+     top="0"
+     width="1310">
     <layout_panel
-     auto_resize="false"
-     user_resize="false"
-     min_width="2"
-     width="2" />
+         auto_resize="false"
+         user_resize="false"
+         min_width="2"
+         width="2" />
     <layout_panel
          auto_resize="false"
          layout="topleft"
 		 name="chat_bar_layout_panel"
          user_resize="true"
      width="310" >
-      <panel
-		   name="chat_bar"
-			  filename="panel_nearby_chat_bar.xml"
-			  left="0"
-			  height="28"
+          <panel
+            name="chat_bar"
+            filename="panel_nearby_chat_bar.xml"
+            left="0"
+            height="28"
         width="308"
-			  top="0"
-			  mouse_opaque="false"
-			  follows="left|right"
+            top="0"
+            mouse_opaque="false"
+            follows="left|right"
           />
     </layout_panel>
     <!--
        width="5" />
     </layout_panel>
     <layout_panel
-     auto_resize="false"
-     follows="left|right"
-     height="28"
-     layout="topleft"
-     min_height="28"
-     min_width="59"
-     mouse_opaque="false"
-     name="speak_panel"
-     top_delta="0"
-     user_resize="false"
-     width="108">
+        auto_resize="false"
+        follows="left|right"
+        height="28"
+        layout="topleft"
+        min_height="28"
+        min_width="59"
+        mouse_opaque="false"
+        name="speak_panel"
+        top_delta="0"
+        user_resize="false"
+        width="108">
       <talk_button
        follows="left|right"
        height="23"
       </talk_button>
     </layout_panel>
     <layout_panel