diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 2813568c19..86c073582b 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -98,12 +98,18 @@ LLViewerCamera::LLViewerCamera() : LLCamera()
mAverageSpeed = 0.f;
mAverageAngularSpeed = 0.f;
- mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
+ // add a way to disconnect/reconnect the "CameraAngle" changed signal
+ // mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
+ connectCameraAngleSignal();
+ //
}
LLViewerCamera::~LLViewerCamera()
{
- mCameraAngleChangedSignal.disconnect();
+ // add a way to disconnect/reconnect the "CameraAngle" changed signal
+ // mCameraAngleChangedSignal.disconnect();
+ disconnectCameraAngleSignal();
+ //
}
void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest)
@@ -920,3 +926,19 @@ void LLViewerCamera::updateCameraAngle(const LLSD& value)
setDefaultFOV(value.asReal());
}
+// add a way to disconnect/reconnect the "CameraAngle" changed signal
+void LLViewerCamera::connectCameraAngleSignal()
+{
+ if (mCameraAngleChangedSignal.connected())
+ {
+ mCameraAngleChangedSignal.disconnect();
+ }
+
+ mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
+}
+
+void LLViewerCamera::disconnectCameraAngleSignal()
+{
+ mCameraAngleChangedSignal.disconnect();
+}
+//
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 9394d20dfb..f21738c828 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -129,6 +129,12 @@ protected:
boost::signals2::connection mCameraAngleChangedSignal;
public:
+ // Enable external classes to disconnect and connect the "CameraAngle" settings
+ // changed signal, so classes can copy and overwrite the camera class and restore
+ // the signal handler
+ void connectCameraAngleSignal();
+ void disconnectCameraAngleSignal();
+ //
};
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 515c8d3721..3f2fe3eb7b 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -6549,6 +6549,8 @@ BOOL LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea
glh::matrix4f saved_proj = get_current_projection();
glh::matrix4f saved_mod = get_current_modelview();
+ camera->disconnectCameraAngleSignal(); // disconnect the "CameraAngle" changed signal
+
// camera constants for the square, cube map capture image
camera->setAspect(1.0); // must set aspect ratio first to avoid undesirable clamping of vertical FoV
camera->setViewNoBroadcast(F_PI_BY_TWO);
@@ -6683,6 +6685,8 @@ BOOL LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea
setup3DViewport();
LLPipeline::sUseOcclusion = old_occlusion;
+ camera->connectCameraAngleSignal(); // reconnect the "CameraAngle" changed signal so mouselook zoom keeps working
+
// ====================================================
return true;
}