Add camera roll buttons to the Firestorm Camera floater. The code comes mostly unchanged from the Alchemy viewer source code which is released under the GNU Lesser General Public License.
Signed-off-by: chanayane <chanayane83@gmail.com>master
parent
5f4f981a3e
commit
b1c37cac7e
|
|
@ -1072,6 +1072,19 @@
|
|||
<real>0.0</real>
|
||||
</array>
|
||||
</map>
|
||||
<!-- <FS:Chanayane> Camera roll (from Alchemy) -->
|
||||
<key>ALStoredCameraRoll</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Stored camera roll in camera tools</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.0</real>
|
||||
</map>
|
||||
<!-- </FS:Chanayane> -->
|
||||
<key>FSStoredCameraFocusObjectId</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -189,7 +189,10 @@ LLAgentCamera::LLAgentCamera() :
|
|||
mPanRightKey(0.f),
|
||||
mPanInKey(0.f),
|
||||
mPanOutKey(0.f),
|
||||
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
mRollLeftKey(0.f),
|
||||
mRollRightKey(0.f),
|
||||
// </FS:Chanayane>
|
||||
mPointAtObject(NULL)
|
||||
{
|
||||
mFollowCam.setMaxCameraDistantFromSubject( MAX_CAMERA_DISTANCE_FROM_AGENT );
|
||||
|
|
@ -200,6 +203,9 @@ LLAgentCamera::LLAgentCamera() :
|
|||
|
||||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
resetCameraRoll();
|
||||
// </FS:Chanayane>
|
||||
}
|
||||
|
||||
// Requires gSavedSettings to be initialized.
|
||||
|
|
@ -381,6 +387,9 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera, BOOL moveme
|
|||
setFocusOnAvatar(TRUE, ANIMATE);
|
||||
|
||||
mCameraFOVZoomFactor = 0.f;
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
resetCameraRoll();
|
||||
// </FS:Chanayane>
|
||||
}
|
||||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
|
|
@ -937,6 +946,20 @@ void LLAgentCamera::cameraOrbitOver(const F32 angle)
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
//-----------------------------------------------------------------------------
|
||||
// cameraRollOver()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLAgentCamera::cameraRollOver(const F32 angle)
|
||||
{
|
||||
mRollAngle += fmodf(angle, F_TWO_PI);
|
||||
}
|
||||
|
||||
void LLAgentCamera::resetCameraRoll()
|
||||
{
|
||||
mRollAngle = 0.f;
|
||||
}
|
||||
// </FS:Chanayane>
|
||||
void LLAgentCamera::resetCameraOrbit()
|
||||
{
|
||||
LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
|
||||
|
|
@ -950,6 +973,9 @@ void LLAgentCamera::resetCameraOrbit()
|
|||
|
||||
cameraZoomIn(1.f);
|
||||
resetOrbitDiff();
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
resetCameraRoll();
|
||||
// </FS:Chanayane>
|
||||
}
|
||||
|
||||
void LLAgentCamera::resetOrbitDiff()
|
||||
|
|
@ -1356,6 +1382,9 @@ void LLAgentCamera::updateCamera()
|
|||
const F32 ORBIT_OVER_RATE = 90.f * DEG_TO_RAD; // radians per second
|
||||
const F32 ORBIT_AROUND_RATE = 90.f * DEG_TO_RAD; // radians per second
|
||||
const F32 PAN_RATE = 5.f; // meters per second
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
const F32 ROLL_RATE = 45.f * DEG_TO_RAD; // radians per second
|
||||
// </FS:Chanayane>
|
||||
|
||||
if (gAgentCamera.getOrbitUpKey() || gAgentCamera.getOrbitDownKey())
|
||||
{
|
||||
|
|
@ -1397,6 +1426,14 @@ void LLAgentCamera::updateCamera()
|
|||
cameraPanUp(input_rate * PAN_RATE / gFPSClamped );
|
||||
}
|
||||
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
if (getRollLeftKey() || getRollRightKey())
|
||||
{
|
||||
F32 input_rate = getRollRightKey() - getRollLeftKey();
|
||||
cameraRollOver(input_rate * ROLL_RATE / gFPSClamped);
|
||||
}
|
||||
// </FS:Chanayane>
|
||||
|
||||
// Clear camera keyboard keys.
|
||||
gAgentCamera.clearOrbitKeys();
|
||||
gAgentCamera.clearPanKeys();
|
||||
|
|
@ -1641,7 +1678,20 @@ void LLAgentCamera::updateCamera()
|
|||
torso_joint->setScale(torso_scale);
|
||||
chest_joint->setScale(chest_scale);
|
||||
}
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
// We have do this at the very end to make sure it takes all previous calculations into
|
||||
// account and then applies our roll on top of it, besides it wouldn't even work otherwise.
|
||||
LLQuaternion rot_quat = LLViewerCamera::getInstance()->getQuaternion();
|
||||
LLMatrix3 rot_mat(mRollAngle, 0.f, 0.f);
|
||||
rot_quat = LLQuaternion(rot_mat)*rot_quat;
|
||||
|
||||
LLMatrix3 mat(rot_quat);
|
||||
|
||||
LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]);
|
||||
LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]);
|
||||
LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]);
|
||||
}
|
||||
// </FS:Chanayane>
|
||||
|
||||
void LLAgentCamera::updateLastCamera()
|
||||
{
|
||||
|
|
@ -2756,6 +2806,9 @@ void LLAgentCamera::switchCameraPreset(ECameraPreset preset)
|
|||
|
||||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
resetCameraRoll();
|
||||
// </FS:Chanayane>
|
||||
|
||||
gSavedSettings.setU32("CameraPresetType", mCameraPreset);
|
||||
}
|
||||
|
|
@ -3260,6 +3313,10 @@ void LLAgentCamera::clearOrbitKeys()
|
|||
mOrbitDownKey = 0.f;
|
||||
mOrbitInKey = 0.f;
|
||||
mOrbitOutKey = 0.f;
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
mRollLeftKey = 0.f;
|
||||
mRollRightKey = 0.f;
|
||||
// </FS:Chanayane>
|
||||
}
|
||||
|
||||
void LLAgentCamera::clearPanKeys()
|
||||
|
|
@ -3290,6 +3347,9 @@ void LLAgentCamera::storeCameraPosition()
|
|||
// flycam mode and not repositioned after
|
||||
LLVector3d forward = LLVector3d(1.0, 0.0, 0.0) * LLViewerCamera::getInstance()->getQuaternion() + getCameraPositionGlobal();
|
||||
gSavedPerAccountSettings.setVector3d("FSStoredCameraFocus", forward);
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
gSavedPerAccountSettings.setF32("ALStoredCameraRoll", mRollAngle);
|
||||
// </FS:Chanayane>
|
||||
|
||||
LLUUID stored_camera_focus_object_id = LLUUID::null;
|
||||
if (mFocusObject)
|
||||
|
|
@ -3303,6 +3363,9 @@ void LLAgentCamera::loadCameraPosition()
|
|||
{
|
||||
LLVector3d stored_camera_pos = gSavedPerAccountSettings.getVector3d("FSStoredCameraPos");
|
||||
LLVector3d stored_camera_focus = gSavedPerAccountSettings.getVector3d("FSStoredCameraFocus");
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
F32 stored_camera_roll = gSavedPerAccountSettings.getF32("ALStoredCameraRoll");
|
||||
// </FS:Chanayane>
|
||||
LLUUID stored_camera_focus_object_id = LLUUID(gSavedPerAccountSettings.getString("FSStoredCameraFocusObjectId"));
|
||||
|
||||
F32 renderFarClip = gSavedSettings.getF32("RenderFarClip");
|
||||
|
|
@ -3331,6 +3394,9 @@ void LLAgentCamera::loadCameraPosition()
|
|||
|
||||
unlockView();
|
||||
setCameraPosAndFocusGlobal(stored_camera_pos, stored_camera_focus, stored_camera_focus_object_id);
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
mRollAngle = stored_camera_roll;
|
||||
// </FS:Chanayane>
|
||||
}
|
||||
// </FS:Ansariel> FIRE-7758: Save/load camera position feature
|
||||
|
||||
|
|
|
|||
|
|
@ -300,8 +300,14 @@ public:
|
|||
void cameraOrbitAround(const F32 radians); // Rotate camera CCW radians about build focus point
|
||||
void cameraOrbitOver(const F32 radians); // Rotate camera forward radians over build focus point
|
||||
void cameraOrbitIn(const F32 meters); // Move camera in toward build focus point
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
void cameraRollOver(const F32 radians); // Roll the camera
|
||||
// </FS:Chanayane>
|
||||
void resetCameraOrbit();
|
||||
void resetOrbitDiff();
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
void resetCameraRoll();
|
||||
// </FS:Chanayane>
|
||||
//--------------------------------------------------------------------
|
||||
// Zoom
|
||||
//--------------------------------------------------------------------
|
||||
|
|
@ -409,6 +415,10 @@ public:
|
|||
F32 getOrbitDownKey() const { return mOrbitDownKey; }
|
||||
F32 getOrbitInKey() const { return mOrbitInKey; }
|
||||
F32 getOrbitOutKey() const { return mOrbitOutKey; }
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
F32 getRollLeftKey() const { return mRollLeftKey; }
|
||||
F32 getRollRightKey() const { return mRollRightKey; }
|
||||
// </FS:Chanayane>
|
||||
|
||||
void setOrbitLeftKey(F32 mag) { mOrbitLeftKey = mag; }
|
||||
void setOrbitRightKey(F32 mag) { mOrbitRightKey = mag; }
|
||||
|
|
@ -416,6 +426,10 @@ public:
|
|||
void setOrbitDownKey(F32 mag) { mOrbitDownKey = mag; }
|
||||
void setOrbitInKey(F32 mag) { mOrbitInKey = mag; }
|
||||
void setOrbitOutKey(F32 mag) { mOrbitOutKey = mag; }
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
void setRollLeftKey(F32 mag) { mRollLeftKey = mag; }
|
||||
void setRollRightKey(F32 mag) { mRollRightKey = mag; }
|
||||
// </FS:Chanayane>
|
||||
|
||||
void clearOrbitKeys();
|
||||
private:
|
||||
|
|
@ -429,6 +443,12 @@ private:
|
|||
F32 mOrbitAroundRadians;
|
||||
F32 mOrbitOverAngle;
|
||||
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
F32 mRollLeftKey;
|
||||
F32 mRollRightKey;
|
||||
F32 mRollAngle = 0.f;
|
||||
// </FS:Chanayane>
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Pan
|
||||
//--------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -88,11 +88,17 @@ protected:
|
|||
void onCameraTrack();
|
||||
void onCameraRotate();
|
||||
F32 getOrbitRate(F32 time);
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
void onRollLeftHeldDown();
|
||||
void onRollRightHeldDown();
|
||||
// </FS:Chanayane>
|
||||
|
||||
private:
|
||||
LLButton* mPlusBtn { nullptr };
|
||||
LLButton* mMinusBtn{ nullptr };
|
||||
LLSlider* mSlider{ nullptr };
|
||||
LLButton* mRollLeft{ nullptr };
|
||||
LLButton* mRollRight{ nullptr };
|
||||
|
||||
friend class LLUICtrlFactory;
|
||||
};
|
||||
|
|
@ -177,6 +183,10 @@ void LLPanelCameraZoom::onCreate()
|
|||
mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
|
||||
mCommitCallbackRegistrar.add("Camera.track", boost::bind(&LLPanelCameraZoom::onCameraTrack, this));
|
||||
mCommitCallbackRegistrar.add("Camera.rotate", boost::bind(&LLPanelCameraZoom::onCameraRotate, this));
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
mCommitCallbackRegistrar.add("Camera.roll_left", boost::bind(&LLPanelCameraZoom::onRollLeftHeldDown, this));
|
||||
mCommitCallbackRegistrar.add("Camera.roll_right", boost::bind(&LLPanelCameraZoom::onRollRightHeldDown, this));
|
||||
// </FS:Chanayane>
|
||||
}
|
||||
|
||||
BOOL LLPanelCameraZoom::postBuild()
|
||||
|
|
@ -184,6 +194,10 @@ BOOL LLPanelCameraZoom::postBuild()
|
|||
mPlusBtn = getChild<LLButton>("zoom_plus_btn");
|
||||
mMinusBtn = getChild<LLButton>("zoom_minus_btn");
|
||||
mSlider = getChild<LLSlider>("zoom_slider");
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
mRollLeft = getChild<LLButton>("roll_left");
|
||||
mRollRight = getChild<LLButton>("roll_right");
|
||||
// </FS:Chanayane>
|
||||
return LLPanel::postBuild();
|
||||
}
|
||||
|
||||
|
|
@ -213,6 +227,22 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()
|
|||
gAgentCamera.setOrbitOutKey(getOrbitRate(time));
|
||||
}
|
||||
|
||||
// <FS:Chanayane> Camera roll (from Alchemy)
|
||||
void LLPanelCameraZoom::onRollLeftHeldDown()
|
||||
{
|
||||
F32 time = mRollLeft->getHeldDownTime();
|
||||
gAgentCamera.unlockView();
|
||||
gAgentCamera.setRollLeftKey(getOrbitRate(time));
|
||||
}
|
||||
|
||||
void LLPanelCameraZoom::onRollRightHeldDown()
|
||||
{
|
||||
F32 time = mRollRight->getHeldDownTime();
|
||||
gAgentCamera.unlockView();
|
||||
gAgentCamera.setRollRightKey(getOrbitRate(time));
|
||||
}
|
||||
// </FS:Chanayane>
|
||||
|
||||
void LLPanelCameraZoom::onCameraTrack()
|
||||
{
|
||||
// EXP-202 when camera panning activated, remove the hint
|
||||
|
|
|
|||
|
|
@ -71,6 +71,36 @@
|
|||
tool_tip="Orbit camera around focus"
|
||||
top="25"
|
||||
width="78" />
|
||||
<!-- <FS:Chanayane> Camera roll (from Alchemy) -->
|
||||
<button
|
||||
follows="bottom|left"
|
||||
width="16"
|
||||
height="16"
|
||||
image_selected="VirtualTrackball_Rotate_Left_Active"
|
||||
image_unselected="VirtualTrackball_Rotate_Left"
|
||||
layout="topleft"
|
||||
top="89"
|
||||
left="2"
|
||||
name="roll_left"
|
||||
tool_tip="Roll camera Left">
|
||||
<commit_callback function="Camera.roll_left" />
|
||||
<mouse_held_callback function="Camera.roll_left" />
|
||||
</button>
|
||||
<button
|
||||
follows="top|left"
|
||||
width="16"
|
||||
height="16"
|
||||
image_selected="VirtualTrackball_Rotate_Right_Active"
|
||||
image_unselected="VirtualTrackball_Rotate_Right"
|
||||
layout="topleft"
|
||||
top="89"
|
||||
left="64"
|
||||
name="roll_right"
|
||||
tool_tip="Roll camera Right">
|
||||
<commit_callback function="Camera.roll_right" />
|
||||
<mouse_held_callback function="Camera.roll_right" />
|
||||
</button>
|
||||
<!-- </FS:Chanayane> -->
|
||||
<button
|
||||
follows="top|left"
|
||||
height="18"
|
||||
|
|
|
|||
|
|
@ -155,6 +155,36 @@
|
|||
tool_tip="Orbit camera around focus"
|
||||
held_down_delay.seconds="0.0"
|
||||
top="0" />
|
||||
<!-- <FS:Chanayane> Camera roll (from Alchemy) -->
|
||||
<button
|
||||
follows="bottom|left"
|
||||
width="12"
|
||||
height="12"
|
||||
image_selected="VirtualTrackball_Rotate_Left_Active"
|
||||
image_unselected="VirtualTrackball_Rotate_Left"
|
||||
layout="topleft"
|
||||
top_delta="68"
|
||||
left_delta="0"
|
||||
name="roll_left"
|
||||
tool_tip="Roll camera Left">
|
||||
<commit_callback function="Camera.roll_left" />
|
||||
<mouse_held_callback function="Camera.roll_left" />
|
||||
</button>
|
||||
<button
|
||||
follows="bottom|right"
|
||||
width="12"
|
||||
height="12"
|
||||
image_selected="VirtualTrackball_Rotate_Right_Active"
|
||||
image_unselected="VirtualTrackball_Rotate_Right"
|
||||
layout="topleft"
|
||||
top_delta="0"
|
||||
left_delta="68"
|
||||
name="roll_right"
|
||||
tool_tip="Roll camera Right">
|
||||
<commit_callback function="Camera.roll_right" />
|
||||
<mouse_held_callback function="Camera.roll_right" />
|
||||
</button>
|
||||
<!-- </FS:Chanayane> -->
|
||||
</layout_panel>
|
||||
|
||||
<layout_panel
|
||||
|
|
|
|||
|
|
@ -96,6 +96,36 @@ free_mode_title
|
|||
tool_tip="Orbit camera around focus"
|
||||
held_down_delay.seconds="0.0"
|
||||
top="0" />
|
||||
<!-- <FS:Chanayane> Camera roll (from Alchemy) -->
|
||||
<button
|
||||
follows="bottom|left"
|
||||
width="12"
|
||||
height="12"
|
||||
image_selected="VirtualTrackball_Rotate_Left_Active"
|
||||
image_unselected="VirtualTrackball_Rotate_Left"
|
||||
layout="topleft"
|
||||
top_delta="68"
|
||||
left_delta="0"
|
||||
name="roll_left"
|
||||
tool_tip="Roll camera Left">
|
||||
<commit_callback function="Camera.roll_left" />
|
||||
<mouse_held_callback function="Camera.roll_left" />
|
||||
</button>
|
||||
<button
|
||||
follows="bottom|right"
|
||||
width="12"
|
||||
height="12"
|
||||
image_selected="VirtualTrackball_Rotate_Right_Active"
|
||||
image_unselected="VirtualTrackball_Rotate_Right"
|
||||
layout="topleft"
|
||||
top_delta="0"
|
||||
left_delta="68"
|
||||
name="roll_right"
|
||||
tool_tip="Roll camera Right">
|
||||
<commit_callback function="Camera.roll_right" />
|
||||
<mouse_held_callback function="Camera.roll_right" />
|
||||
</button>
|
||||
<!-- </FS:Chanayane> -->
|
||||
</layout_panel>
|
||||
|
||||
<layout_panel
|
||||
|
|
|
|||
Loading…
Reference in New Issue