From 98a21e2d491fc12808751db7edc960810226bccd Mon Sep 17 00:00:00 2001
From: McCabe Maxsted
Date: Thu, 27 May 2010 02:46:02 -0700
Subject: Added checkbox in Preferences > Input and Camera to disable the
 minimum zoom in distance (DisableMinZoomDist)

---
 linden/indra/newview/app_settings/settings.xml     | 11 ++++++
 linden/indra/newview/llagent.cpp                   | 43 +++++++++++++---------
 linden/indra/newview/llpanelinput.cpp              |  5 +++
 .../default/xui/en-us/panel_preferences_input.xml  |  7 +++-
 4 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 670de2b..952efc7 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -70,6 +70,17 @@
     <key>Value</key>
     <integer>0</integer>
   </map>
+  <key>DisableMinZoomDist</key>
+  <map>
+    <key>Comment</key>
+    <string>Disable minimum zoom distance limits</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
   <key>DisableTeleportScreens</key>
   <map>
     <key>Comment</key>
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 4753bc8..e2be0d0 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -1780,12 +1780,12 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
 	// 0.f -> camera zoomed all the way out
 	// 1.f -> camera zoomed all the way in
 	LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
-
+	BOOL disable_min = gSavedSettings.getBOOL("DisableMinZoomDist");
 	if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
 	{
 		mHUDTargetZoom = fraction;
 	}
-	else if (mFocusOnAvatar && cameraThirdPerson())
+	else if (mFocusOnAvatar && cameraThirdPerson() && !disable_min)
 	{
 		mCameraZoomFraction = rescale(fraction, 0.f, 1.f, MAX_ZOOM_FRACTION, MIN_ZOOM_FRACTION);
 	}
@@ -1802,7 +1802,7 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
 							LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
 							MAX_CAMERA_DISTANCE_FROM_AGENT);
 
-		if (mFocusObject.notNull())
+		if (!disable_min)
 		{
 			if (mFocusObject.notNull())
 			{
@@ -1816,6 +1816,10 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
 				}
 			}
 		}
+		else
+		{
+			min_zoom = 0.f;
+		}
 
 		LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
 		camera_offset_dir.normalize();
@@ -1906,30 +1910,34 @@ void LLAgent::cameraZoomIn(const F32 fraction)
 
 	LLVector3d	camera_offset(mCameraFocusOffsetTarget);
 	LLVector3d	camera_offset_unit(mCameraFocusOffsetTarget);
-	F32 min_zoom = LAND_MIN_ZOOM;
+	F32 min_zoom = 0.f;//LAND_MIN_ZOOM;
 	F32 current_distance = (F32)camera_offset_unit.normalize();
 	F32 new_distance = current_distance * fraction;
 
 	// Don't move through focus point
-	if (mFocusObject)
+	
+	if (!gSavedSettings.getBOOL("DisableMinZoomDist"))
 	{
-		LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]);
-
-		if (mFocusObject->isAvatar())
-		{
-			calcCameraMinDistance(min_zoom);
-		}
-		else
+		if (mFocusObject)
 		{
-			min_zoom = OBJECT_MIN_ZOOM;
+			LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]);
+			if (mFocusObject->isAvatar())
+			{
+				calcCameraMinDistance(min_zoom);
+			}
+			else
+			{
+				min_zoom = OBJECT_MIN_ZOOM;
+			}
 		}
+		new_distance = llmax(new_distance, min_zoom);
 	}
 
 	// Don't zoom too far back
 	// Actually, let's when disable camera constraints is active -- McCabe
 	if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
 	{
-		new_distance = llmax(new_distance, min_zoom);
+		//new_distance = llmax(new_distance, min_zoom);
 
 		F32 max_distance = llmin(mDrawDistance - DIST_FUDGE, 
 								 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
@@ -1947,7 +1955,7 @@ void LLAgent::cameraZoomIn(const F32 fraction)
 			*/
 		}
 
-		if( cameraCustomizeAvatar() )
+		if( cameraCustomizeAvatar() && !gSavedSettings.getBOOL("DisableMinZoomDist"))
 		{
 			new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
 		}
@@ -3679,7 +3687,8 @@ F32	LLAgent::calcCameraFOVZoomFactor()
 		// don't FOV zoom on mostly transparent objects
 		LLVector3 focus_offset = mFocusObjectOffset;
 		F32 obj_min_dist = 0.f;
-		calcCameraMinDistance(obj_min_dist);
+		if (!gSavedSettings.getBOOL("DisableMinZoomDist"))
+			calcCameraMinDistance(obj_min_dist);
 		F32 current_distance = llmax(0.001f, camera_offset_dir.magVec());
 
 		mFocusObjectDist = obj_min_dist - current_distance;
@@ -3825,7 +3834,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
 				camera_distance = local_camera_offset.normalize();
 			}
 
-			mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE);
+			mTargetCameraDistance = (gSavedSettings.getBOOL("DisableMinZoomDist")) ? camera_distance : llmax(camera_distance, MIN_CAMERA_DISTANCE);
 
 			if (mTargetCameraDistance != mCurrentCameraDistance)
 			{
diff --git a/linden/indra/newview/llpanelinput.cpp b/linden/indra/newview/llpanelinput.cpp
index d530d67..32c4af3 100644
--- a/linden/indra/newview/llpanelinput.cpp
+++ b/linden/indra/newview/llpanelinput.cpp
@@ -77,6 +77,9 @@ BOOL LLPanelInput::postBuild()
 	childSetValue("double_click_action", gSavedSettings.getString("DoubleClickAction"));
 	childSetValue("go_action", gSavedSettings.getString("GoAction"));
 
+	childSetValue("Disable camera constraints", gSavedSettings.getBOOL("DisableCameraConstraints"));
+	childSetValue("disable_min_zoom_check", gSavedSettings.getBOOL("DisableMinZoomDist"));
+
 	return TRUE;
 }
 
@@ -104,6 +107,8 @@ void LLPanelInput::apply()
 	gSavedSettings.setString("DoubleClickAction", childGetValue("double_click_action"));
 	gSavedSettings.setString("GoAction", childGetValue("go_action"));
 
+	gSavedSettings.setBOOL("DisableCameraConstraints", childGetValue("Disable camera constraints"));
+	gSavedSettings.setBOOL("DisableMinZoomDist", childGetValue("disable_min_zoom_check"));
 }
 
 void LLPanelInput::cancel()
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
index fa4f3a5..7a5f22d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
@@ -89,11 +89,16 @@
 	     label="Automatic Appearance Camera Movement" left="148" mouse_opaque="true"
 	     name="appearance_camera_movement" radio_style="false"
 	     tool_tip="Use automatic camera positioning while in edit mode" width="242" />
-	<check_box bottom_delta="-18" control_name="DisableCameraConstraints" enabled="true"
+	<check_box bottom_delta="-18" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Disable camera constraints" left="148" mouse_opaque="true"
 	     name="Disable camera constraints" radio_style="false"
 	     tool_tip="Disables camera limits such as distance and terrain" width="242" />
+  <check_box bottom_delta="-18" enabled="true"
+       follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
+       label="Disable minimum zoom distance" left="168" mouse_opaque="true"
+       name="disable_min_zoom_check" radio_style="false"
+       tool_tip="Disables minimum zoom distance for prims and avatars" width="242" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom_delta="-32" drop_shadow_visible="true" enabled="true" follows="left|top"
 	     font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
-- 
cgit v1.1