SL-12288 Enhancement for Rotate and Track camera controls
parent
716552a0c0
commit
f4d4fb2ad0
|
|
@ -184,6 +184,9 @@ LLAgentCamera::LLAgentCamera() :
|
|||
clearGeneralKeys();
|
||||
clearOrbitKeys();
|
||||
clearPanKeys();
|
||||
|
||||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
}
|
||||
|
||||
// Requires gSavedSettings to be initialized.
|
||||
|
|
@ -343,7 +346,8 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
|
|||
|
||||
mCameraFOVZoomFactor = 0.f;
|
||||
}
|
||||
|
||||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
mHUDTargetZoom = 1.f;
|
||||
}
|
||||
|
||||
|
|
@ -822,6 +826,7 @@ void LLAgentCamera::cameraOrbitAround(const F32 radians)
|
|||
}
|
||||
else
|
||||
{
|
||||
mOrbitAroundRadians += radians;
|
||||
mCameraFocusOffsetTarget.rotVec(radians, 0.f, 0.f, 1.f);
|
||||
|
||||
cameraZoomIn(1.f);
|
||||
|
|
@ -853,12 +858,34 @@ void LLAgentCamera::cameraOrbitOver(const F32 angle)
|
|||
LLVector3d left_axis;
|
||||
left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
|
||||
F32 new_angle = llclamp(angle_from_up - angle, 1.f * DEG_TO_RAD, 179.f * DEG_TO_RAD);
|
||||
mOrbitOverAngle += angle_from_up - new_angle;
|
||||
mCameraFocusOffsetTarget.rotVec(angle_from_up - new_angle, left_axis);
|
||||
|
||||
cameraZoomIn(1.f);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAgentCamera::resetCameraOrbit()
|
||||
{
|
||||
LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
|
||||
camera_offset_unit.normalize();
|
||||
|
||||
LLVector3d left_axis;
|
||||
left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
|
||||
mCameraFocusOffsetTarget.rotVec(-mOrbitOverAngle, left_axis);
|
||||
|
||||
mCameraFocusOffsetTarget.rotVec(-mOrbitAroundRadians, 0.f, 0.f, 1.f);
|
||||
|
||||
cameraZoomIn(1.f);
|
||||
resetOrbitDiff();
|
||||
}
|
||||
|
||||
void LLAgentCamera::resetOrbitDiff()
|
||||
{
|
||||
mOrbitAroundRadians = 0;
|
||||
mOrbitOverAngle = 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// cameraZoomIn()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -997,6 +1024,8 @@ void LLAgentCamera::cameraPanIn(F32 meters)
|
|||
LLVector3d at_axis;
|
||||
at_axis.setVec(LLViewerCamera::getInstance()->getAtAxis());
|
||||
|
||||
mPanFocusDiff += meters * at_axis;
|
||||
|
||||
mFocusTargetGlobal += meters * at_axis;
|
||||
mFocusGlobal = mFocusTargetGlobal;
|
||||
// don't enforce zoom constraints as this is the only way for users to get past them easily
|
||||
|
|
@ -1013,6 +1042,8 @@ void LLAgentCamera::cameraPanLeft(F32 meters)
|
|||
LLVector3d left_axis;
|
||||
left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
|
||||
|
||||
mPanFocusDiff += meters * left_axis;
|
||||
|
||||
mFocusTargetGlobal += meters * left_axis;
|
||||
mFocusGlobal = mFocusTargetGlobal;
|
||||
|
||||
|
|
@ -1033,6 +1064,8 @@ void LLAgentCamera::cameraPanUp(F32 meters)
|
|||
LLVector3d up_axis;
|
||||
up_axis.setVec(LLViewerCamera::getInstance()->getUpAxis());
|
||||
|
||||
mPanFocusDiff += meters * up_axis;
|
||||
|
||||
mFocusTargetGlobal += meters * up_axis;
|
||||
mFocusGlobal = mFocusTargetGlobal;
|
||||
|
||||
|
|
@ -1045,6 +1078,26 @@ void LLAgentCamera::cameraPanUp(F32 meters)
|
|||
mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
|
||||
}
|
||||
|
||||
void LLAgentCamera::resetCameraPan()
|
||||
{
|
||||
mFocusTargetGlobal -= mPanFocusDiff;
|
||||
|
||||
mFocusGlobal = mFocusTargetGlobal;
|
||||
mCameraSmoothingStop = true;
|
||||
|
||||
cameraZoomIn(1.f);
|
||||
updateFocusOffset();
|
||||
|
||||
mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
|
||||
|
||||
resetPanDiff();
|
||||
}
|
||||
|
||||
void LLAgentCamera::resetPanDiff()
|
||||
{
|
||||
mPanFocusDiff.clear();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// updateLookAt()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -2330,6 +2383,9 @@ void LLAgentCamera::switchCameraPreset(ECameraPreset preset)
|
|||
|
||||
mCameraPreset = preset;
|
||||
|
||||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
|
||||
gSavedSettings.setU32("CameraPreset", mCameraPreset);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -262,7 +262,8 @@ 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
|
||||
|
||||
void resetCameraOrbit();
|
||||
void resetOrbitDiff();
|
||||
//--------------------------------------------------------------------
|
||||
// Zoom
|
||||
//--------------------------------------------------------------------
|
||||
|
|
@ -279,8 +280,9 @@ public:
|
|||
public:
|
||||
void cameraPanIn(const F32 meters);
|
||||
void cameraPanLeft(const F32 meters);
|
||||
void cameraPanUp(const F32 meters);
|
||||
|
||||
void cameraPanUp(const F32 meters);
|
||||
void resetCameraPan();
|
||||
void resetPanDiff();
|
||||
//--------------------------------------------------------------------
|
||||
// View
|
||||
//--------------------------------------------------------------------
|
||||
|
|
@ -367,6 +369,9 @@ private:
|
|||
F32 mOrbitInKey;
|
||||
F32 mOrbitOutKey;
|
||||
|
||||
F32 mOrbitAroundRadians;
|
||||
F32 mOrbitOverAngle;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Pan
|
||||
//--------------------------------------------------------------------
|
||||
|
|
@ -394,6 +399,8 @@ private:
|
|||
F32 mPanInKey;
|
||||
F32 mPanOutKey;
|
||||
|
||||
LLVector3d mPanFocusDiff;
|
||||
|
||||
/** Keys
|
||||
** **
|
||||
*******************************************************************************/
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "llui.h"
|
||||
#include "llagent.h"
|
||||
#include "llagentcamera.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llviewertexture.h"
|
||||
#include "llviewertexturelist.h"
|
||||
#include "llviewerwindow.h"
|
||||
|
|
@ -54,6 +55,8 @@ static LLDefaultChildRegistry::Register<LLJoystickCameraTrack> r5("joystick_trac
|
|||
const F32 NUDGE_TIME = 0.25f; // in seconds
|
||||
const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
|
||||
|
||||
const S32 CENTER_DOT_RADIUS = 7;
|
||||
|
||||
//
|
||||
// Public Methods
|
||||
//
|
||||
|
|
@ -138,9 +141,25 @@ bool LLJoystick::pointInCircle(S32 x, S32 y) const
|
|||
//center is x and y coordinates of center of joystick circle, and also its radius
|
||||
int center = this->getLocalRect().getHeight()/2;
|
||||
bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
|
||||
|
||||
return in_circle;
|
||||
}
|
||||
|
||||
bool LLJoystick::pointInCenterDot(S32 x, S32 y, S32 radius) const
|
||||
{
|
||||
if (this->getLocalRect().getHeight() != this->getLocalRect().getWidth())
|
||||
{
|
||||
LL_WARNS() << "Joystick shape is not square" << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
S32 center = this->getLocalRect().getHeight() / 2;
|
||||
|
||||
bool in_center_circle = (x - center) * (x - center) + (y - center) * (y - center) <= radius * radius;
|
||||
|
||||
return in_center_circle;
|
||||
}
|
||||
|
||||
BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
//LL_INFOS() << "joystick mouse down " << x << ", " << y << LL_ENDL;
|
||||
|
|
@ -403,8 +422,11 @@ LLJoystickCameraRotate::LLJoystickCameraRotate(const LLJoystickCameraRotate::Par
|
|||
mInLeft( FALSE ),
|
||||
mInTop( FALSE ),
|
||||
mInRight( FALSE ),
|
||||
mInBottom( FALSE )
|
||||
{ }
|
||||
mInBottom( FALSE ),
|
||||
mInCenter( FALSE )
|
||||
{
|
||||
mCenterImageName = "Cam_Rotate_Center";
|
||||
}
|
||||
|
||||
|
||||
void LLJoystickCameraRotate::updateSlop()
|
||||
|
|
@ -434,7 +456,16 @@ BOOL LLJoystickCameraRotate::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
S32 dx = x - horiz_center;
|
||||
S32 dy = y - vert_center;
|
||||
|
||||
if (dy > dx && dy > -dx)
|
||||
if (pointInCenterDot(x, y, CENTER_DOT_RADIUS))
|
||||
{
|
||||
mInitialOffset.mX = 0;
|
||||
mInitialOffset.mY = 0;
|
||||
mInitialQuadrant = JQ_ORIGIN;
|
||||
mInCenter = TRUE;
|
||||
|
||||
resetJoystickCamera();
|
||||
}
|
||||
else if (dy > dx && dy > -dx)
|
||||
{
|
||||
// top
|
||||
mInitialOffset.mX = 0;
|
||||
|
|
@ -469,9 +500,20 @@ BOOL LLJoystickCameraRotate::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
BOOL LLJoystickCameraRotate::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
gAgent.setMovementLocked(FALSE);
|
||||
mInCenter = FALSE;
|
||||
return LLJoystick::handleMouseUp(x, y, mask);
|
||||
}
|
||||
|
||||
BOOL LLJoystickCameraRotate::handleHover(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if (!pointInCenterDot(x, y, CENTER_DOT_RADIUS))
|
||||
{
|
||||
mInCenter = FALSE;
|
||||
}
|
||||
|
||||
return LLJoystick::handleHover(x, y, mask);
|
||||
}
|
||||
|
||||
void LLJoystickCameraRotate::onHeldDown()
|
||||
{
|
||||
updateSlop();
|
||||
|
|
@ -504,6 +546,11 @@ void LLJoystickCameraRotate::onHeldDown()
|
|||
}
|
||||
}
|
||||
|
||||
void LLJoystickCameraRotate::resetJoystickCamera()
|
||||
{
|
||||
gAgentCamera.resetCameraOrbit();
|
||||
}
|
||||
|
||||
F32 LLJoystickCameraRotate::getOrbitRate()
|
||||
{
|
||||
F32 time = getElapsedHeldDownTime();
|
||||
|
|
@ -536,24 +583,31 @@ void LLJoystickCameraRotate::draw()
|
|||
getImageUnselected()->draw( 0, 0 );
|
||||
LLPointer<LLUIImage> image = getImageSelected();
|
||||
|
||||
if( mInTop )
|
||||
if (mInCenter)
|
||||
{
|
||||
drawRotatedImage( getImageSelected(), 0 );
|
||||
drawRotatedImage(LLUI::getUIImage(mCenterImageName), 0);
|
||||
}
|
||||
|
||||
if( mInRight )
|
||||
else
|
||||
{
|
||||
drawRotatedImage( getImageSelected(), 1 );
|
||||
}
|
||||
if (mInTop)
|
||||
{
|
||||
drawRotatedImage(getImageSelected(), 0);
|
||||
}
|
||||
|
||||
if( mInBottom )
|
||||
{
|
||||
drawRotatedImage( getImageSelected(), 2 );
|
||||
}
|
||||
if (mInRight)
|
||||
{
|
||||
drawRotatedImage(getImageSelected(), 1);
|
||||
}
|
||||
|
||||
if( mInLeft )
|
||||
{
|
||||
drawRotatedImage( getImageSelected(), 3 );
|
||||
if (mInBottom)
|
||||
{
|
||||
drawRotatedImage(getImageSelected(), 2);
|
||||
}
|
||||
|
||||
if (mInLeft)
|
||||
{
|
||||
drawRotatedImage(getImageSelected(), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -613,7 +667,9 @@ LLJoystickCameraTrack::Params::Params()
|
|||
|
||||
LLJoystickCameraTrack::LLJoystickCameraTrack(const LLJoystickCameraTrack::Params& p)
|
||||
: LLJoystickCameraRotate(p)
|
||||
{}
|
||||
{
|
||||
mCenterImageName = "Cam_Tracking_Center";
|
||||
}
|
||||
|
||||
|
||||
void LLJoystickCameraTrack::onHeldDown()
|
||||
|
|
@ -646,3 +702,8 @@ void LLJoystickCameraTrack::onHeldDown()
|
|||
gAgentCamera.setPanDownKey(getOrbitRate());
|
||||
}
|
||||
}
|
||||
|
||||
void LLJoystickCameraTrack::resetJoystickCamera()
|
||||
{
|
||||
gAgentCamera.resetCameraPan();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,7 +79,8 @@ public:
|
|||
* Image containing circle is square and this square has adherent points with joystick
|
||||
* circle. Make sure to change method according to shape other than square.
|
||||
*/
|
||||
bool pointInCircle(S32 x, S32 y) const;
|
||||
bool pointInCircle(S32 x, S32 y) const;
|
||||
bool pointInCenterDot(S32 x, S32 y, S32 radius) const;
|
||||
|
||||
static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
|
||||
static EJoystickQuadrant quadrantFromName(const std::string& name);
|
||||
|
|
@ -147,7 +148,9 @@ public:
|
|||
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
|
||||
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
|
||||
virtual void onHeldDown();
|
||||
virtual void resetJoystickCamera();
|
||||
virtual void draw();
|
||||
|
||||
protected:
|
||||
|
|
@ -160,6 +163,9 @@ protected:
|
|||
BOOL mInTop;
|
||||
BOOL mInRight;
|
||||
BOOL mInBottom;
|
||||
BOOL mInCenter;
|
||||
|
||||
std::string mCenterImageName;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -176,6 +182,7 @@ public:
|
|||
|
||||
LLJoystickCameraTrack(const LLJoystickCameraTrack::Params&);
|
||||
virtual void onHeldDown();
|
||||
virtual void resetJoystickCamera();
|
||||
};
|
||||
|
||||
#endif // LL_LLJOYSTICKBUTTON_H
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -113,8 +113,10 @@ with the same filename but different name
|
|||
|
||||
<texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" />
|
||||
<texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
|
||||
<texture name="Cam_Rotate_Center" file_name="bottomtray/Cam_Rotate_Center.png" preload="false" />
|
||||
<texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
|
||||
<texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" />
|
||||
<texture name="Cam_Tracking_Center" file_name="bottomtray/Cam_Tracking_Center.png" preload="false" />
|
||||
|
||||
<texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
|
||||
<texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue