diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 43f929e31..146574b9d 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -972,6 +972,26 @@ void LLAgentCamera::cameraZoomIn(const F32 fraction) //----------------------------------------------------------------------------- void LLAgentCamera::cameraOrbitIn(const F32 meters) { +// [RLVa:LF] - @camdistmax, @camdistmin + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMAX)) + { + F32 dist_max(gRlvHandler.camMax(RLV_BHVR_CAMDISTMAX)); + if (0 >= dist_max) + { + if (!cameraMouselook()) + changeCameraToMouselook(); + return; // There's no getting out of mouselook + } + } + + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMIN)) + { + F32 dist_min(gRlvHandler.camMin(RLV_BHVR_CAMDISTMIN)); + if (cameraMouselook() && dist_min > 0) + changeCameraToDefault(); // Just to be sure we're not in mouselook + } +// [/RLVa:LF] + if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) { static const LLCachedControl camera_offset_scale("CameraOffsetScale"); @@ -2011,6 +2031,35 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) // } } +// [RLVa:LF] - @camdistmax, @camdistmin + if (rlv_handler_t::isEnabled() && !cameraMouselook()) + { + // Constrainy stuffs ish based off above code + const LLVector3d agent_pos(gAgent.getPositionGlobal()); + const LLVector3d offset(camera_position_global - agent_pos); + const F32 total_dist(offset.magVec()); + bool rlvConstrained = false; // You Only Constrain Once + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMAX)) + { + F32 max_dist(gRlvHandler.camMax(RLV_BHVR_CAMDISTMAX)); + if (total_dist > max_dist) + { + camera_position_global = agent_pos + (max_dist/total_dist)*offset; + rlvConstrained = isConstrained = true; + } + } + if (!rlvConstrained && gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMIN)) + { + F32 min_dist(gRlvHandler.camMin(RLV_BHVR_CAMDISTMIN)); + if (total_dist < min_dist) + { + camera_position_global = agent_pos + (min_dist/total_dist)*offset; + rlvConstrained = isConstrained = true; + } + } + } +// [/RLVa:LF] + // Don't let camera go underground F32 camera_min_off_ground = getCameraMinOffGround(); @@ -2176,6 +2225,8 @@ void LLAgentCamera::resetCamera() //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToMouselook(BOOL animate) { + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMIN) && gRlvHandler.camMin(RLV_BHVR_CAMDISTMIN) > 0) return; // [RLVa:LF] - @camdistmin + if (!gSavedSettings.getBOOL("EnableMouselook") || LLViewerJoystick::getInstance()->getOverrideCamera()) { @@ -2264,6 +2315,8 @@ void LLAgentCamera::changeCameraToDefault() //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToFollow(BOOL animate) { + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMAX) && 0 >= gRlvHandler.camMax(RLV_BHVR_CAMDISTMAX)) return; // [RLVa:LF] - @camdistmax + if (LLViewerJoystick::getInstance()->getOverrideCamera()) { return; @@ -2322,6 +2375,8 @@ void LLAgentCamera::changeCameraToFollow(BOOL animate) //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) { + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMAX) && 0 >= gRlvHandler.camMax(RLV_BHVR_CAMDISTMAX)) return; // [RLVa:LF] - @camdistmax + if (LLViewerJoystick::getInstance()->getOverrideCamera()) { return; @@ -2405,6 +2460,8 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToCustomizeAvatar() { + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMAX) && 0 >= gRlvHandler.camMax(RLV_BHVR_CAMDISTMAX)) return; // [RLVa:LF] - @camdistmax + if (LLViewerJoystick::getInstance()->getOverrideCamera() || !isAgentAvatarValid()) { return; diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index 479b877ad..8772fd032 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -40,6 +40,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "llfocusmgr.h" +#include "rlvhandler.h" #include @@ -1161,7 +1162,8 @@ void LLViewerJoystick::moveFlycam(bool reset) // ----------------------------------------------------------------------------- bool LLViewerJoystick::toggleFlycam() { - if (!gSavedSettings.getBOOL("JoystickEnabled") || !gSavedSettings.getBOOL("JoystickFlycamEnabled")) + if (gRlvHandler.hasBehaviour(RLV_BHVR_CAMDISTMAX) // [RLVa:LF] - @camdistmax means no going away! + || !gSavedSettings.getBOOL("JoystickEnabled") || !gSavedSettings.getBOOL("JoystickFlycamEnabled")) { mOverrideCamera = false; return false; diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index d0a1a64f4..6fec279bb 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1365,11 +1365,30 @@ ERlvCmdRet RlvHandler::processAddRemCommand(const RlvCommand& rlvCmd) break; } case RLV_BHVR_CAMDISTMAX: // @camdistmax:=n|y - Checked: 2015-05-25 (RLVa:LF) - eRet = RLV_RET_FAILED_UNKNOWN; // Singu TODO: Implement - break; case RLV_BHVR_CAMDISTMIN: // @camdistmin:=n|y - Checked: 2015-05-25 (RLVa:LF) - eRet = RLV_RET_FAILED_UNKNOWN; // Singu TODO: Implement + { + F32 zoom; + LLStringUtil::convertToF32(strOption, zoom); + if (RLV_TYPE_ADD == eType) + addException(rlvCmd.getObjectID(), eBhvr, zoom); + else + removeException(rlvCmd.getObjectID(), eBhvr, zoom); + if (hasBehaviour(eBhvr)) + { + if (eBhvr == RLV_BHVR_CAMDISTMAX && zoom <= 0) + { + if (!gAgentCamera.cameraMouselook()) + gAgentCamera.changeCameraToMouselook(); + } + else + { + if (eBhvr == RLV_BHVR_CAMDISTMIN && zoom > 0 && gAgentCamera.cameraMouselook()) + gAgentCamera.changeCameraToDefault(); + gAgentCamera.cameraPanUp(0); // Hacky, but meh. + } + } break; + } case RLV_BHVR_CAMDRAWMAX: // @camdrawmax:=n|y - Checked: 2015-05-25 (RLVa:LF) eRet = RLV_RET_FAILED_UNKNOWN; // Singu TODO: Implement break;