diff options
| author | Mnikolenko Productengine <mnikolenko@productengine.com> | 2020-04-20 14:27:22 +0300 | 
|---|---|---|
| committer | Mnikolenko Productengine <mnikolenko@productengine.com> | 2020-04-20 14:27:22 +0300 | 
| commit | 74d6e6b65c9c3e85e8ec84939b35a1e584379e1f (patch) | |
| tree | 594978c1282ff02e37525b6f94f310d4299a1583 | |
| parent | 70d340a1bff2707138ac41fdd1408a5b2e46fc71 (diff) | |
SL-12904 FIXED Camera Preset does not restore correctly when sitting
| -rw-r--r-- | indra/llmath/llquaternion.h | 24 | ||||
| -rw-r--r-- | indra/llxml/llcontrol.cpp | 51 | ||||
| -rw-r--r-- | indra/llxml/llcontrol.h | 15 | ||||
| -rw-r--r-- | indra/llxml/llcontrolgroupreader.h | 1 | ||||
| -rw-r--r-- | indra/newview/app_settings/camera/Front.xml | 16 | ||||
| -rw-r--r-- | indra/newview/app_settings/camera/Rear.xml | 16 | ||||
| -rw-r--r-- | indra/newview/app_settings/camera/Side.xml | 16 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 16 | ||||
| -rw-r--r-- | indra/newview/llagentcamera.cpp | 15 | ||||
| -rw-r--r-- | indra/newview/llagentcamera.h | 4 | ||||
| -rw-r--r-- | indra/newview/llfloatercamera.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llfloatersavecamerapreset.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llfloatersettingsdebug.cpp | 42 | ||||
| -rw-r--r-- | indra/newview/llpresetsmanager.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 3 | 
15 files changed, 232 insertions, 8 deletions
| diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h index aa0b1752f4..95e4c09695 100644 --- a/indra/llmath/llquaternion.h +++ b/indra/llmath/llquaternion.h @@ -28,6 +28,7 @@  #define LLQUATERNION_H  #include <iostream> +#include <llsd.h>  #ifndef LLMATH_H //enforce specific include order to avoid tangling inline dependencies  #error "Please include llmath.h first." @@ -64,6 +65,29 @@ public:  				 const LLVector3 &y_axis,  				 const LLVector3 &z_axis);			// Initializes Quaternion from Matrix3 = [x_axis ; y_axis ; z_axis] +	explicit LLQuaternion(const LLSD& sd) +	{ +		setValue(sd); +	} + +	void setValue(const LLSD& sd) +	{ +		mQ[VX] = (F32) sd[0].asReal(); +		mQ[VY] = (F32) sd[1].asReal(); +		mQ[VZ] = (F32) sd[2].asReal(); +		mQ[VS] = (F32) sd[3].asReal(); +	} + +	LLSD getValue() const +	{ +		LLSD ret; +		ret[0] = mQ[VX]; +		ret[1] = mQ[VY]; +		ret[2] = mQ[VZ]; +		ret[3] = mQ[VS]; +		return ret; +	} +  	BOOL isIdentity() const;  	BOOL isNotIdentity() const;  	BOOL isFinite() const;									// checks to see if all values of LLQuaternion are finite diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index ccf4f3ddf5..80a414d00f 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -40,6 +40,7 @@  #include "v4coloru.h"  #include "v4color.h"  #include "v3color.h" +#include "llquaternion.h"  #include "llrect.h"  #include "llxmltree.h"  #include "llsdserialize.h" @@ -125,6 +126,9 @@ bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)  	case TYPE_VEC3D:  		result = LLVector3d(a) == LLVector3d(b);  		break; +	case TYPE_QUAT: +		result = LLQuaternion(a) == LLQuaternion(b); +		break;  	case TYPE_RECT:  		result = LLRect(a) == LLRect(b);  		break; @@ -361,6 +365,7 @@ const std::string LLControlGroup::mTypeString[TYPE_COUNT] = { "U32"                                                               ,"String"                                                               ,"Vector3"                                                               ,"Vector3D" +                                                             ,"Quaternion"                                                               ,"Rect"                                                               ,"Color4"                                                               ,"Color3" @@ -523,6 +528,11 @@ LLControlVariable* LLControlGroup::declareVec3d(const std::string& name, const L  	return declareControl(name, TYPE_VEC3D, initial_val.getValue(), comment, persist);  } +LLControlVariable* LLControlGroup::declareQuat(const std::string& name, const LLQuaternion &initial_val, const std::string& comment, LLControlVariable::ePersist persist) +{ +	return declareControl(name, TYPE_QUAT, initial_val.getValue(), comment, persist); +} +  LLControlVariable* LLControlGroup::declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, LLControlVariable::ePersist persist)  {  	return declareControl(name, TYPE_RECT, initial_val.getValue(), comment, persist); @@ -600,6 +610,11 @@ LLVector3d LLControlGroup::getVector3d(const std::string& name)  	return get<LLVector3d>(name);  } +LLQuaternion LLControlGroup::getQuaternion(const std::string& name) +{ +	return get<LLQuaternion>(name); +} +  LLRect LLControlGroup::getRect(const std::string& name)  {  	return get<LLRect>(name); @@ -677,6 +692,11 @@ void LLControlGroup::setVector3d(const std::string& name, const LLVector3d &val)  	set(name, val);  } +void LLControlGroup::setQuaternion(const std::string& name, const LLQuaternion &val) +{ +	set(name, val); +} +  void LLControlGroup::setRect(const std::string& name, const LLRect &val)  {  	set(name, val); @@ -859,6 +879,16 @@ U32 LLControlGroup::loadFromFileLegacy(const std::string& filename, BOOL require  				validitems++;  			}  			break; +		case TYPE_QUAT: +			{ +				LLQuaternion quat; + +				child_nodep->getAttributeQuat("value", quat); + +				control->set(quat.getValue()); +				validitems++; +			} +			break;  		case TYPE_RECT:  			{  				//RN: hack to support reading rectangles from a string @@ -1201,6 +1231,11 @@ template <> eControlType get_control_type<LLVector3d>()  	return TYPE_VEC3D;   } +template <> eControlType get_control_type<LLQuaternion>() +{ +	return TYPE_QUAT; +} +  template <> eControlType get_control_type<LLRect>()   {   	return TYPE_RECT;  @@ -1236,6 +1271,10 @@ template <> LLSD convert_to_llsd<LLVector3d>(const LLVector3d& in)  {   	return in.getValue();   } +template <> LLSD convert_to_llsd<LLQuaternion>(const LLQuaternion& in) +{ +	return in.getValue(); +}  template <> LLSD convert_to_llsd<LLRect>(const LLRect& in)   {  @@ -1349,6 +1388,18 @@ LLVector3d convert_from_llsd<LLVector3d>(const LLSD& sd, eControlType type, cons  }  template<> +LLQuaternion convert_from_llsd<LLQuaternion>(const LLSD& sd, eControlType type, const std::string& control_name) +{ +	if (type == TYPE_QUAT) +		return (LLQuaternion)sd; +	else +	{ +		CONTROL_ERRS << "Invalid LLQuaternion value for " << control_name << ": " << LLControlGroup::typeEnumToString(type) << " " << sd << LL_ENDL; +		return LLQuaternion(); +	} +} + +template<>  LLRect convert_from_llsd<LLRect>(const LLSD& sd, eControlType type, const std::string& control_name)  {  	if (type == TYPE_RECT) diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index de0d366492..f136918896 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -67,6 +67,7 @@  class LLVector3;  class LLVector3d; +class LLQuaternion;  class LLColor4;  class LLColor3; @@ -80,6 +81,7 @@ typedef enum e_control_type  	TYPE_STRING,  	TYPE_VEC3,  	TYPE_VEC3D, +	TYPE_QUAT,  	TYPE_RECT,  	TYPE_COL4,  	TYPE_COL3, @@ -220,6 +222,7 @@ public:  	LLControlVariable* declareString(const std::string& name, const std::string &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);  	LLControlVariable* declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment,  LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);  	LLControlVariable* declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); +	LLControlVariable* declareQuat(const std::string& name, const LLQuaternion &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);  	LLControlVariable* declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);  	LLControlVariable* declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);  	LLControlVariable* declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); @@ -234,10 +237,10 @@ public:  	LLWString	getWString(const std::string& name);  	LLVector3	getVector3(const std::string& name); -	LLVector3d	getVector3d(const std::string& name); +	LLVector3d	getVector3d(const std::string& name);	  	LLRect		getRect(const std::string& name);  	LLSD        getLLSD(const std::string& name); - +	LLQuaternion	getQuaternion(const std::string& name);  	LLColor4	getColor(const std::string& name);  	LLColor4	getColor4(const std::string& name); @@ -270,6 +273,7 @@ public:  	void	setString(const std::string&  name, const std::string& val);  	void	setVector3(const std::string& name, const LLVector3 &val);  	void	setVector3d(const std::string& name, const LLVector3d &val); +	void	setQuaternion(const std::string& name, const LLQuaternion &val);  	void	setRect(const std::string& name, const LLRect &val);  	void	setColor4(const std::string& name, const LLColor4 &val);  	void    setLLSD(const std::string& name, const LLSD& val); @@ -436,7 +440,8 @@ template <> eControlType get_control_type<bool>();  //template <> eControlType get_control_type<BOOL> ()   template <> eControlType get_control_type<std::string>();  template <> eControlType get_control_type<LLVector3>(); -template <> eControlType get_control_type<LLVector3d>();  +template <> eControlType get_control_type<LLVector3d>(); +template <> eControlType get_control_type<LLQuaternion>();  template <> eControlType get_control_type<LLRect>();  template <> eControlType get_control_type<LLColor4>();  template <> eControlType get_control_type<LLColor3>(); @@ -444,7 +449,8 @@ template <> eControlType get_control_type<LLSD>();  template <> LLSD convert_to_llsd<U32>(const U32& in);  template <> LLSD convert_to_llsd<LLVector3>(const LLVector3& in); -template <> LLSD convert_to_llsd<LLVector3d>(const LLVector3d& in);  +template <> LLSD convert_to_llsd<LLVector3d>(const LLVector3d& in); +template <> LLSD convert_to_llsd<LLQuaternion>(const LLQuaternion& in);  template <> LLSD convert_to_llsd<LLRect>(const LLRect& in);  template <> LLSD convert_to_llsd<LLColor4>(const LLColor4& in);  template <> LLSD convert_to_llsd<LLColor3>(const LLColor3& in); @@ -453,6 +459,7 @@ template<> std::string convert_from_llsd<std::string>(const LLSD& sd, eControlTy  template<> LLWString convert_from_llsd<LLWString>(const LLSD& sd, eControlType type, const std::string& control_name);  template<> LLVector3 convert_from_llsd<LLVector3>(const LLSD& sd, eControlType type, const std::string& control_name);  template<> LLVector3d convert_from_llsd<LLVector3d>(const LLSD& sd, eControlType type, const std::string& control_name); +template<> LLQuaternion convert_from_llsd<LLQuaternion>(const LLSD& sd, eControlType type, const std::string& control_name);  template<> LLRect convert_from_llsd<LLRect>(const LLSD& sd, eControlType type, const std::string& control_name);  template<> bool convert_from_llsd<bool>(const LLSD& sd, eControlType type, const std::string& control_name);  template<> S32 convert_from_llsd<S32>(const LLSD& sd, eControlType type, const std::string& control_name); diff --git a/indra/llxml/llcontrolgroupreader.h b/indra/llxml/llcontrolgroupreader.h index 6a27a65499..fe77d33fc4 100644 --- a/indra/llxml/llcontrolgroupreader.h +++ b/indra/llxml/llcontrolgroupreader.h @@ -65,6 +65,7 @@ public:  	virtual void		setString(const std::string&  name, const std::string& val) {}  	virtual void		setVector3(const std::string& name, const LLVector3 &val) {}  	virtual void		setVector3d(const std::string& name, const LLVector3d &val) {} +	virtual void		setQuaternion(const std::string& name, const LLQuaternion &val) {}  	virtual void		setRect(const std::string& name, const LLRect &val) {}  	virtual void		setColor4(const std::string& name, const LLColor4 &val) {}  	virtual void    	setLLSD(const std::string& name, const LLSD& val) {} diff --git a/indra/newview/app_settings/camera/Front.xml b/indra/newview/app_settings/camera/Front.xml index 7b5d597fdf..f9f615c4a7 100644 --- a/indra/newview/app_settings/camera/Front.xml +++ b/indra/newview/app_settings/camera/Front.xml @@ -11,6 +11,22 @@          <key>Value</key>              <integer>1</integer>          </map> +    <key>AvatarSitRotation</key> +    <map> +        <key>Comment</key> +        <string>Avatar real sitting rotation used in preset</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Quaternion</string> +        <key>Value</key> +        <array> +          <real>0</real> +          <real>0</real> +          <real>0</real> +          <real>1</real> +        </array> +    </map>      <key>CameraAngle</key>          <map>          <key>Comment</key> diff --git a/indra/newview/app_settings/camera/Rear.xml b/indra/newview/app_settings/camera/Rear.xml index 7aa36c3e59..a084f83bfe 100644 --- a/indra/newview/app_settings/camera/Rear.xml +++ b/indra/newview/app_settings/camera/Rear.xml @@ -11,6 +11,22 @@          <key>Value</key>              <integer>1</integer>          </map> +    <key>AvatarSitRotation</key> +    <map> +        <key>Comment</key> +        <string>Avatar real sitting rotation used in preset</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Quaternion</string> +        <key>Value</key> +        <array> +          <real>0</real> +          <real>0</real> +          <real>0</real> +          <real>1</real> +        </array> +    </map>      <key>CameraAngle</key>          <map>          <key>Comment</key> diff --git a/indra/newview/app_settings/camera/Side.xml b/indra/newview/app_settings/camera/Side.xml index 8890d9cbce..5db5b164bd 100644 --- a/indra/newview/app_settings/camera/Side.xml +++ b/indra/newview/app_settings/camera/Side.xml @@ -11,6 +11,22 @@          <key>Value</key>              <integer>1</integer>          </map> +    <key>AvatarSitRotation</key> +    <map> +        <key>Comment</key> +        <string>Avatar real sitting rotation used in preset</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Quaternion</string> +        <key>Value</key> +        <array> +          <real>0</real> +          <real>0</real> +          <real>0</real> +          <real>1</real> +        </array> +    </map>      <key>CameraAngle</key>          <map>          <key>Comment</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index cc86ba85c1..84448919e1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4397,6 +4397,22 @@          <real>1.0</real>        </array>      </map> +    <key>AvatarSitRotation</key> +    <map> +      <key>Comment</key> +      <string>Avatar real sitting rotation used in preset</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Quaternion</string> +      <key>Value</key> +      <array> +        <real>0</real> +        <real>0</real> +        <real>0</real> +        <real>1</real> +      </array> +    </map>      <key>FocusPosOnLogout</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 5efd614b22..7a82cf2f66 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -1804,8 +1804,8 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)  				at_axis.mV[VZ] = 0.f;  				at_axis.normalize();  				gAgent.resetAxes(at_axis * ~parent_rot); - -				local_camera_offset = local_camera_offset * parent_rot; +				 +				local_camera_offset = local_camera_offset * gAgent.getFrameAgent().getQuaternion() * parent_rot;  			}  			else  			{ @@ -1998,7 +1998,10 @@ LLVector3d LLAgentCamera::getCurrentFocusOffset()  LLQuaternion LLAgentCamera::getCurrentAvatarRotation()  {  	LLViewerObject* sit_object = (LLViewerObject*)gAgentAvatarp->getParent(); -	return sit_object ? sit_object->getRenderRotation() : gAgent.getFrameAgent().getQuaternion(); +	 +	LLQuaternion av_rot = gAgent.getFrameAgent().getQuaternion(); +	LLQuaternion obj_rot = sit_object ? sit_object->getRenderRotation() : LLQuaternion::DEFAULT; +	return av_rot * obj_rot;  }  bool LLAgentCamera::isJoystickCameraUsed() @@ -2828,6 +2831,12 @@ BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object,  	return mPointAt->setPointAt(target_type, object, position);  } +void LLAgentCamera::rotateToInitSitRot() +{ +	gAgent.rotate(~gAgent.getFrameAgent().getQuaternion()); +	gAgent.rotate(mInitSitRot); +} +  void LLAgentCamera::resetCameraZoomFraction()  {   	mCameraZoomFraction = INITIAL_ZOOM_FRACTION;  diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 841b0e353d..ec1ed433d7 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -121,6 +121,8 @@ public:  	LLVector3d getCurrentFocusOffset();  	LLQuaternion getCurrentAvatarRotation();  	bool isJoystickCameraUsed(); +	void setInitSitRot(LLQuaternion sit_rot) { mInitSitRot = sit_rot; }; +	void rotateToInitSitRot();  private:  	/** Determines maximum camera distance from target for mouselook, opposite to LAND_MIN_ZOOM */ @@ -135,6 +137,8 @@ private:  	/** Initial focus offset */  	LLPointer<LLControlVariable> mFocusOffsetInitial; +	LLQuaternion mInitSitRot; +  	//--------------------------------------------------------------------  	// Position  	//-------------------------------------------------------------------- diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index e1e7ee8445..2399e4f495 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -44,6 +44,7 @@  #include "llfirstuse.h"  #include "llhints.h"  #include "lltabcontainer.h" +#include "llvoavatarself.h"  static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item"); @@ -566,6 +567,19 @@ void LLFloaterCamera::switchToPreset(const std::string& name)  		LLPresetsManager::getInstance()->loadPreset(PRESETS_CAMERA, name);  	} +	if (isAgentAvatarValid() && gAgentAvatarp->getParent()) +	{ +		LLQuaternion sit_rot = gSavedSettings.getQuaternion("AvatarSitRotation"); +		if (sit_rot != LLQuaternion()) +		{ +			gAgent.rotate(~gAgent.getFrameAgent().getQuaternion()); +			gAgent.rotate(sit_rot); +		} +		else +		{ +			gAgentCamera.rotateToInitSitRot(); +		} +	}  	gAgentCamera.resetCameraZoomFraction();  	LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance(); diff --git a/indra/newview/llfloatersavecamerapreset.cpp b/indra/newview/llfloatersavecamerapreset.cpp index c02f8f0ea1..5704a7a525 100644 --- a/indra/newview/llfloatersavecamerapreset.cpp +++ b/indra/newview/llfloatersavecamerapreset.cpp @@ -28,6 +28,7 @@  #include "llfloatersavecamerapreset.h" +#include "llagent.h"  #include "llagentcamera.h"  #include "llbutton.h"  #include "llcombobox.h" @@ -38,6 +39,7 @@  #include "llpresetsmanager.h"  #include "llradiogroup.h"  #include "lltrans.h" +#include "llvoavatarself.h"  LLFloaterSaveCameraPreset::LLFloaterSaveCameraPreset(const LLSD &key)  	: LLModalDialog(key) @@ -102,6 +104,10 @@ void LLFloaterSaveCameraPreset::onBtnSave()  	}  	else   	{ +		if (isAgentAvatarValid() && gAgentAvatarp->getParent()) +		{ +			gSavedSettings.setQuaternion("AvatarSitRotation", gAgent.getFrameAgent().getQuaternion()); +		}  		if (gAgentCamera.isJoystickCameraUsed())  		{  			gSavedSettings.setVector3("CameraOffsetRearView", gAgentCamera.getCurrentCameraOffset()); diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index fb202b4c40..186994c857 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -111,6 +111,7 @@ void LLFloaterSettingsDebug::onCommitSettings()  	LLVector3 vector;  	LLVector3d vectord; +	LLQuaternion quat;  	LLRect rect;  	LLColor4 col4;  	LLColor3 col3; @@ -146,6 +147,13 @@ void LLFloaterSettingsDebug::onCommitSettings()  		vectord.mdV[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();  		controlp->set(vectord.getValue());  		break; +	  case TYPE_QUAT: +		quat.mQ[VX] = getChild<LLUICtrl>("val_spinner_1")->getValue().asReal(); +		quat.mQ[VY] = getChild<LLUICtrl>("val_spinner_2")->getValue().asReal(); +		quat.mQ[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal(); +		quat.mQ[VS] = getChild<LLUICtrl>("val_spinner_4")->getValue().asReal();; +		controlp->set(quat.getValue()); +		break;  	  case TYPE_RECT:  		rect.mLeft = getChild<LLUICtrl>("val_spinner_1")->getValue().asInteger();  		rect.mRight = getChild<LLUICtrl>("val_spinner_2")->getValue().asInteger(); @@ -351,6 +359,40 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)  			}  			break;  		  } +		  case TYPE_QUAT: +		  { +			  LLQuaternion q; +			  q.setValue(sd); +			  spinner1->setVisible(TRUE); +			  spinner1->setLabel(std::string("X")); +			  spinner2->setVisible(TRUE); +			  spinner2->setLabel(std::string("Y")); +			  spinner3->setVisible(TRUE); +			  spinner3->setLabel(std::string("Z")); +			  spinner4->setVisible(TRUE); +			  spinner4->setLabel(std::string("S")); +			  if (!spinner1->hasFocus()) +			  { +				  spinner1->setPrecision(4); +				  spinner1->setValue(q.mQ[VX]); +			  } +			  if (!spinner2->hasFocus()) +			  { +				  spinner2->setPrecision(4); +				  spinner2->setValue(q.mQ[VY]); +			  } +			  if (!spinner3->hasFocus()) +			  { +				  spinner3->setPrecision(4); +				  spinner3->setValue(q.mQ[VZ]); +			  } +			  if (!spinner4->hasFocus()) +			  { +				  spinner4->setPrecision(4); +				  spinner4->setValue(q.mQ[VS]); +			  } +			  break; +		  }  		  case TYPE_RECT:  		  {  			LLRect r; diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index 129187ccbd..4dbd6a523d 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -261,6 +261,7 @@ void LLPresetsManager::getControlNames(std::vector<std::string>& names)  		("TrackFocusObject")  		("CameraOffsetRearView")  		("FocusOffsetRearView") +		("AvatarSitRotation")          ;      names = camera_controls;  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b524db478e..7fb4cc6822 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -7336,7 +7336,8 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)  	mRoot->updateWorldMatrixChildren();  	stopMotion(ANIM_AGENT_BODY_NOISE); - +	 +	gAgentCamera.setInitSitRot(gAgent.getFrameAgent().getQuaternion());  }  //----------------------------------------------------------------------------- | 
