From 395e8862238544e5751d6769ff7dc3de8d003ae4 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Mon, 13 Nov 2023 03:01:30 -0500
Subject: [PATCH] Add camera restore/save feature from FS/Ansa

---
 .../settings_per_account_alchemy.xml          |  43 ++++++++++++++-
 indra/newview/llagentcamera.cpp               |  52 ++++++++++++++++++
 indra/newview/llagentcamera.h                 |   3 +
 indra/newview/llfloatercamera.cpp             |   5 +-
 .../default/textures/icons/Cam_Recall.png     | Bin 0 -> 5713 bytes
 .../skins/default/textures/icons/Cam_Save.png | Bin 0 -> 5705 bytes
 .../skins/default/textures/textures.xml       |   3 +
 .../default/textures/toolbar_icons/view.png   | Bin 1487 -> 4725 bytes
 .../skins/default/xui/en/floater_camera.xml   |  44 ++++++++++++---
 9 files changed, 139 insertions(+), 11 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/icons/Cam_Recall.png
 create mode 100644 indra/newview/skins/default/textures/icons/Cam_Save.png

diff --git a/indra/newview/app_settings/settings_per_account_alchemy.xml b/indra/newview/app_settings/settings_per_account_alchemy.xml
index 1601d974472..5da79d17314 100644
--- a/indra/newview/app_settings/settings_per_account_alchemy.xml
+++ b/indra/newview/app_settings/settings_per_account_alchemy.xml
@@ -66,5 +66,46 @@
       <key>Value</key>
       <real>0.5</real>
     </map>
+    <key>ALStoredCameraPos</key>
+    <map>
+      <key>Comment</key>
+      <string>Stored camera position in camera tools</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Vector3D</string>
+      <key>Value</key>
+      <array>
+        <real>0.0</real>
+        <real>0.0</real>
+        <real>0.0</real>
+      </array>
+    </map>
+    <key>ALStoredCameraFocus</key>
+    <map>
+      <key>Comment</key>
+      <string>Stored camera focus position in camera tools</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Vector3D</string>
+      <key>Value</key>
+      <array>
+        <real>0.0</real>
+        <real>0.0</real>
+        <real>0.0</real>
+      </array>
+    </map>
+    <key>ALStoredCameraFocusObjectId</key>
+    <map>
+      <key>Comment</key>
+      <string>Stored object ID of camera focus in camera tools</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string />
+    </map>
   </map>
-</llsd>
+</llsd>
\ No newline at end of file
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index c2cb41961d3..25731591b54 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -55,6 +55,7 @@
 #include "rlvactions.h"
 #include "rlvhandler.h"
 // [/RLVa:KB]
+#include "llnotificationsutil.h"
 
 using namespace LLAvatarAppearanceDefines;
 
@@ -3199,6 +3200,57 @@ S32 LLAgentCamera::directionToKey(S32 direction)
 	return 0;
 }
 
+void LLAgentCamera::storeCameraPosition()
+{
+	gSavedPerAccountSettings.setVector3d("ALStoredCameraPos", getCameraPositionGlobal());
+
+	// get a vector pointing forward from the camera view manually, getFocusTargetGlobal() will
+	// not return useful values if the camera is in flycam mode or was just switched out of
+	// flycam  mode and not repositioned after
+	LLVector3d forward = LLVector3d(1.0, 0.0, 0.0) * LLViewerCamera::getInstance()->getQuaternion() + getCameraPositionGlobal();
+	gSavedPerAccountSettings.setVector3d("ALStoredCameraFocus", forward);
+
+	LLUUID stored_camera_focus_object_id = LLUUID::null;
+	if (mFocusObject)
+	{
+		stored_camera_focus_object_id = mFocusObject->getID();
+	}
+	gSavedPerAccountSettings.setString("ALStoredCameraFocusObjectId", stored_camera_focus_object_id.asString());
+}
+
+void LLAgentCamera::loadCameraPosition()
+{
+	LLVector3d stored_camera_pos = gSavedPerAccountSettings.getVector3d("ALStoredCameraPos");
+	LLVector3d stored_camera_focus = gSavedPerAccountSettings.getVector3d("ALStoredCameraFocus");
+	LLUUID stored_camera_focus_object_id = LLUUID(gSavedPerAccountSettings.getString("ALStoredCameraFocusObjectId"));
+
+	F32 renderFarClip = gSavedSettings.getF32("RenderFarClip");
+	F32 far_clip_squared = renderFarClip * renderFarClip;
+
+	if (stored_camera_pos.isNull())
+	{
+		LLNotificationsUtil::add("LoadCameraPositionNoneSaved", LLSD());
+		return;
+	}
+
+	if (dist_vec_squared(gAgent.getPositionGlobal(), stored_camera_pos) > far_clip_squared)
+	{
+		LLNotificationsUtil::add("LoadCameraPositionOutsideDrawDistance", LLSD());
+		return;
+	}
+
+	// switch off flycam mode if needed
+	if (LLViewerJoystick::getInstance()->getOverrideCamera())
+	{
+		handle_toggle_flycam();
+
+		// exiting from flycam usually keeps the camera where it is but here we want it to actually move
+		LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true);
+	}
+
+	unlockView();
+	setCameraPosAndFocusGlobal(stored_camera_pos, stored_camera_focus, stored_camera_focus_object_id);
+}
 
 // EOF
 
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index c9d471a3096..0ee26a66ad8 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -448,6 +448,9 @@ class LLAgentCamera
 /**                    Keys
  **                                                                            **
  *******************************************************************************/
+public:
+	void			storeCameraPosition();
+	void			loadCameraPosition();
 };
 
 extern LLAgentCamera gAgentCamera;
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 988a7d48bda..450b942b291 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -356,6 +356,9 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
 	mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
 	mCommitCallbackRegistrar.add("CameraPresets.Save", boost::bind(&LLFloaterCamera::onSavePreset, this));
 	mCommitCallbackRegistrar.add("CameraPresets.ShowPresetsList", boost::bind(&LLFloaterReg::showInstance, "camera_presets", LLSD(), FALSE));
+
+	mCommitCallbackRegistrar.add("Camera.SavePosition", [](LLUICtrl* ctrl, const LLSD& param) { gAgentCamera.storeCameraPosition(); });
+	mCommitCallbackRegistrar.add("Camera.RestorePosition", [](LLUICtrl* ctrl, const LLSD& param) { gAgentCamera.loadCameraPosition(); });
 }
 
 // virtual
@@ -647,5 +650,5 @@ void LLFloaterCamera::collapse()
 	BOOL collapse = gSavedSettings.getBOOL("AlchemyCameraExpanded");
 	mBtnCollapse->setImageOverlay(collapse ? "Conv_toolbar_collapse" : "Conv_toolbar_expand");
 	getChild<LLPanel>("buttons_panel")->setVisible(collapse);
-	reshape(collapse ? 362 : 210, getRect().getHeight(), FALSE);
+	reshape(collapse ? 370 : 210, getRect().getHeight(), FALSE);
 }
diff --git a/indra/newview/skins/default/textures/icons/Cam_Recall.png b/indra/newview/skins/default/textures/icons/Cam_Recall.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd183e19012c81235350be65730d3a95ef6f363f
GIT binary patch
literal 5713
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
DBp(a{

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Cam_Save.png b/indra/newview/skins/default/textures/icons/Cam_Save.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba56b6f275d1074b6499ac0df544bd728d9046eb
GIT binary patch
literal 5705
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

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 7a3289d4906..27dff8b3ee4 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -952,4 +952,7 @@ with the same filename but different name
 
   <texture name="social_discord" file_name="alchemy/discord_32.png" preload="false" />
   <texture name="social_mastodon" file_name="alchemy/mastodon_32.png" preload="false" />
+
+  <texture name="Cam_Recall" file_name="icons/Cam_Recall.png"/>
+  <texture name="Cam_Save" file_name="icons/Cam_Save.png"/>
 </textures>
diff --git a/indra/newview/skins/default/textures/toolbar_icons/view.png b/indra/newview/skins/default/textures/toolbar_icons/view.png
index ddf0df7c26fd9a54a44eb77cc27878aacc3df5b8..d1af6880ef5ab2a47c55f2d53cefa34dad75a4b1 100644
GIT binary patch
literal 4725
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
DNLC!<

literal 1487
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W~g9hqGxDg
zU}<8hqhMrUXrOOsq;FuZYiM9)YHnp<r~m~@K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83
zmzLNn0bL65LT-VtFWlg~VrW1CgG|37u|VHY&p<yn7vwLn>f(~1RD?6IsxA(xEJ)Q4
zN-fSWElLK)N18HBGcfG%TLe-Fbd8mNQ6?}_5_4SglS^|`^GZBjY?XjAdMTMHR!$}s
zCT?yf&Q4B7re+p~hEC2dW){xQ7H+QQrWWQF<}fp`>UDN=F>^AubTM}^HZ*iKa58pw
zwQzMaFahdxax$=h>GjMjE=kNwPKDW<39=WW*8;CzE9aur#FG4?ko^1{SPBTp$S=t+
z&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDokIW@_SOWMN`xZe#%R
zw}rW(o3nwbxq*v|fvb}X(BBZfDddEiKF~4xpu~ZcSYSfH6bNF%lRl6G&pfGlz#LNq
z%o;4St3ntU82@{^IEGZ*Iul~=!IUWS{gjbPOOwKhB@Yx-`jn<mP~ef4SrT<rH%ey7
zqGK%%UIIo^O$)ZoVbSC|-nNNj`k@X3MN@-`KBtX>tk>TcFE5G}<Q262arbfE`}cd_
z*SZ(VsQ(Uk`Wxo{$$zHiD#lgZFW96S!x~ugD(5Wz@pOCVgeBpNFZSHX*(SI7=9<ve
zSEqO_T_hNB?)m5I6FrtZ`217vK{>;B*$*eP4E|@D9$0bv?Y*kDhR0e{PcdK7G2q}~
z<}2_&GR;RVSgbph*Kn`OKU?-njj3M21`;+8D>SEiEf3HwkYP$|&|JVDlfE&cM|gfX
zhbB*)_L)d&4wk+al@+I)E<ULKQ}^G_?xo@M(|4<F<^ju!n)c8_3z^vuqEq~q7dz*8
zEWa!mbnx|8y<(xloiV~krkza-W@_i_4qIL77N#K*l=Qs7qQ+;AaOaVACV?hWrGn8m
za{XPED)%OD)Ojs7d1J&IskLU!^PkwAHpr2k>GRC*Q2)fl>(fs^ebqBzL6XtTXA*6h
zhgSPP+2g@=<Lx(5&q+UDtz=v)@o8p);_=m&Uy2D>B$!A^&RTY|h)<HIP1VzU^`Vd5
z>p5;dN==xvC!tM0V&CBajgrLy8d+bfYOSYjiPxKcT~V!n>72IP$J$$`H0a#4n(!;h
xExbWEW7@I5Pc9klvHLywcKqk)|BKBT*%<6)^#gND^Y4L*SWj0!mvv4FO#lQ#7uf&+

diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 65e959a4963..25de9dd84e6 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -68,14 +68,14 @@
          label=""
          layout="topleft"
          left_delta="0"
-         image_overlay="Icon_Gear"
-         name="gear_btn"
+         image_overlay="Cam_Save"
+         name="save_cam_pos_btn"
          tab_stop="false"
-         tool_tip="My Camera Presets"
+         tool_tip="Save current camera position and focus"
          top_pad="0"
          width="23">
          <button.commit_callback
-         function="CameraPresets.ShowPresetsList"/>
+           function="Camera.SavePosition"/>
         </button>
         <button
          height="28"
@@ -83,15 +83,14 @@
          layout="topleft"
          top_pad="0"
          left_delta="0"
-         image_overlay="PanOrbit_Off"
-         name="pan_btn"
+         image_overlay="Cam_Recall"
+         name="restore_cam_pos_btn"
          tab_stop="false"
          tool_tip="Use precise controls"
          width="23">
          <button.commit_callback
-         function="Floater.Toggle"
-         parameter="prefs_view_advanced"/>
-         </button>
+           function="Camera.RestorePosition"/>
+        </button>
     </panel>
     <panel
      border="false"
@@ -275,6 +274,19 @@
          name="Use preset"
          value="default" />
       </combo_box>
+      <button
+        height="18"
+        width="18"  
+        layout="topleft"
+        mouse_opaque="true"
+        name="gear_btn"
+        tool_tip="Save current camera position and focus"
+        top_delta="2"
+        left_pad="5" 
+        image_overlay="Icon_Gear">
+        <button.commit_callback
+        function="CameraPresets.ShowPresetsList"/>
+      </button>
       <button
         follows="top|left"
         height="23"
@@ -287,5 +299,19 @@
         <button.commit_callback
           function="CameraPresets.Save"/>
       </button>
+      <button
+        height="18"
+        width="18"  
+        layout="topleft"
+        mouse_opaque="true"
+        name="pan_btn"
+        tool_tip="Use precise controls"
+        top_delta="2"
+        left_pad="5" 
+        image_overlay="PanOrbit_Off">
+        <button.commit_callback
+        function="Floater.Toggle"
+        parameter="prefs_view_advanced"/>
+      </button>
   </panel>
 </floater>
-- 
GitLab