diff options
author | Loren Shih <seraph@lindenlab.com> | 2010-03-25 15:06:48 -0400 |
---|---|---|
committer | Loren Shih <seraph@lindenlab.com> | 2010-03-25 15:06:48 -0400 |
commit | 504cf0870d964de5b286621a44098af6afdf13cd (patch) | |
tree | a9faa28bec2c8d8964725e593a365de88d87e5d1 | |
parent | cc4a9b5640f4295c8af78efd4271a251434e39c6 (diff) |
EXT-2959 : Pull out camera functions from llagent to llagentcamera
#3 checkin.
Took out llagent "friend llagentcamera" and added accessors instead.
Did some superficial formatting cleanup.
-rw-r--r-- | indra/newview/llagent.cpp | 99 | ||||
-rw-r--r-- | indra/newview/llagent.h | 15 | ||||
-rw-r--r-- | indra/newview/llagentcamera.cpp | 449 | ||||
-rw-r--r-- | indra/newview/llagentcamera.h | 9 | ||||
-rw-r--r-- | indra/newview/llappviewer.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llstartup.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llviewermenu.cpp | 2 |
7 files changed, 301 insertions, 277 deletions
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 5dd4215206..68b5a3401e 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -296,7 +296,6 @@ void LLAgent::cleanup() { mAvatarObject = NULL; mRegionp = NULL; - gAgentCamera.cleanup(); } //----------------------------------------------------------------------------- @@ -1645,24 +1644,8 @@ void LLAgent::setAvatarObject(LLVOAvatarSelf *avatar) llinfos << "Setting LLAgent::mAvatarObject to NULL" << llendl; return; } - - if (!gAgentCamera.mLookAt) - { - gAgentCamera.mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); - } - if (!gAgentCamera.mPointAt) - { - gAgentCamera.mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); - } - if (!gAgentCamera.mLookAt.isNull()) - { - gAgentCamera.mLookAt->setSourceObject(avatar); - } - if (!gAgentCamera.mPointAt.isNull()) - { - gAgentCamera.mPointAt->setSourceObject(avatar); - } + gAgentCamera.setCameraAvatarObject(avatar); } // TRUE if your own avatar needs to be rendered. Usually only @@ -1863,8 +1846,7 @@ void LLAgent::endAnimationUpdateUI() } } } - else - if(gAgentCamera.mLastCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR) + else if(gAgentCamera.mLastCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR) { // make sure we ask to save changes @@ -2028,83 +2010,6 @@ void LLAgent::heardChat(const LLUUID& id) mChatTimer.reset(); } -//----------------------------------------------------------------------------- -// lookAtLastChat() -//----------------------------------------------------------------------------- -void LLAgent::lookAtLastChat() -{ - // Block if camera is animating or not in normal third person camera mode - if (gAgentCamera.mCameraAnimating || !gAgentCamera.cameraThirdPerson()) - { - return; - } - - LLViewerObject *chatter = gObjectList.findObject(mLastChatterID); - if (chatter) - { - LLVector3 delta_pos; - if (chatter->isAvatar()) - { - LLVOAvatar *chatter_av = (LLVOAvatar*)chatter; - if (mAvatarObject.notNull() && chatter_av->mHeadp) - { - delta_pos = chatter_av->mHeadp->getWorldPosition() - mAvatarObject->mHeadp->getWorldPosition(); - } - else - { - delta_pos = chatter->getPositionAgent() - getPositionAgent(); - } - delta_pos.normalize(); - - setControlFlags(AGENT_CONTROL_STOP); - - gAgentCamera.changeCameraToThirdPerson(); - - LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition(); - LLVector3 left = delta_pos % LLVector3::z_axis; - left.normalize(); - LLVector3 up = left % delta_pos; - up.normalize(); - new_camera_pos -= delta_pos * 0.4f; - new_camera_pos += left * 0.3f; - new_camera_pos += up * 0.2f; - if (chatter_av->mHeadp) - { - gAgentCamera.setFocusGlobal(getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), mLastChatterID); - gAgentCamera.mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()); - } - else - { - gAgentCamera.setFocusGlobal(chatter->getPositionGlobal(), mLastChatterID); - gAgentCamera.mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); - } - gAgentCamera.setFocusOnAvatar(FALSE, TRUE); - } - else - { - delta_pos = chatter->getRenderPosition() - getPositionAgent(); - delta_pos.normalize(); - - setControlFlags(AGENT_CONTROL_STOP); - - gAgentCamera.changeCameraToThirdPerson(); - - LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition(); - LLVector3 left = delta_pos % LLVector3::z_axis; - left.normalize(); - LLVector3 up = left % delta_pos; - up.normalize(); - new_camera_pos -= delta_pos * 0.4f; - new_camera_pos += left * 0.3f; - new_camera_pos += up * 0.2f; - - gAgentCamera.setFocusGlobal(chatter->getPositionGlobal(), mLastChatterID); - gAgentCamera.mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); - gAgentCamera.setFocusOnAvatar(FALSE, TRUE); - } - } -} - const F32 SIT_POINT_EXTENTS = 0.2f; LLSD ll_sdmap_from_vector3(const LLVector3& vec) diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 1b378ef7b2..891ce799d2 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -95,7 +95,6 @@ class LLAgent : public LLOldEvents::LLObservable public: friend class LLAgentDropGroupViewerNode; - friend class LLAgentCamera; /******************************************************************************** ** ** @@ -261,6 +260,10 @@ private: public: S32 getRegionsVisited() const; F64 getDistanceTraveled() const; + void setDistanceTraveled(F64 dist) { mDistanceTraveled = dist; } + + const LLVector3d &getLastPositionGlobal() const { return mLastPositionGlobal; } + void setLastPositionGlobal(const LLVector3d &pos) { mLastPositionGlobal = pos; } private: std::set<U64> mRegionsVisited; // Stat - what distinct regions has the avatar been to? F64 mDistanceTraveled; // Stat - how far has the avatar moved? @@ -303,7 +306,6 @@ public: //-------------------------------------------------------------------- public: void heardChat(const LLUUID& id); - void lookAtLastChat(); F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); } LLUUID getLastChatter() const { return mLastChatterID; } F32 getNearChatRadius() { return mNearChatRadius; } @@ -412,6 +414,8 @@ public: // Send message to simulator to force grabbed controls to be // released, in case of a poorly written script. void forceReleaseControls(); + void setFlagsDirty() { mbFlagsDirty = TRUE; } + private: S32 mControlsTakenCount[TOTAL_CONTROLS]; S32 mControlsTakenPassedOnCount[TOTAL_CONTROLS]; @@ -429,6 +433,10 @@ public: void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request); void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request); void endAnimationUpdateUI(); + void unpauseAnimation() { mPauseRequest = NULL; } + BOOL getCustomAnim() const { return mCustomAnim; } + void setCustomAnim(BOOL anim) { mCustomAnim = anim; } + private: BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ? LLAnimPauseRequest mPauseRequest; @@ -656,6 +664,9 @@ public: LLQuaternion getHeadRotation(); BOOL needsRenderAvatar(); // TRUE when camera mode is such that your own avatar should draw BOOL needsRenderHead(); + void setShowAvatar(BOOL show) { mShowAvatar = show; } + BOOL getShowAvatar() const { return mShowAvatar; } + private: BOOL mShowAvatar; // Should we render the avatar? U32 mAppearanceSerialNum; diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index c51edbaf4b..07757c2025 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -256,6 +256,27 @@ void LLAgentCamera::cleanup() setFocusObject(NULL); } +void LLAgentCamera::setCameraAvatarObject(LLVOAvatarSelf* avatar) +{ + if (!mLookAt) + { + mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); + } + if (!mPointAt) + { + mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); + } + + if (!mLookAt.isNull()) + { + mLookAt->setSourceObject(avatar); + } + if (!mPointAt.isNull()) + { + mPointAt->setSourceObject(avatar); + } +} + //----------------------------------------------------------------------------- // LLAgent() //----------------------------------------------------------------------------- @@ -273,7 +294,7 @@ LLAgentCamera::~LLAgentCamera() //----------------------------------------------------------------------------- void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera) { - if (gAgent.mAutoPilot) + if (gAgent.getAutoPilot()) { gAgent.stopAutoPilot(TRUE); } @@ -351,9 +372,10 @@ void LLAgentCamera::unlockView() { if (getFocusOnAvatar()) { - if (gAgent.mAvatarObject.notNull()) + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if (avatarp) { - setFocusGlobal( LLVector3d::zero, gAgent.mAvatarObject->mID ); + setFocusGlobal(LLVector3d::zero, avatarp->mID); } setFocusOnAvatar(FALSE, FALSE); // no animation } @@ -830,7 +852,7 @@ void LLAgentCamera::cameraOrbitAround(const F32 radians) } else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON || mCameraMode == CAMERA_MODE_FOLLOW)) { - gAgent.mFrameAgent.rotate(radians, gAgent.getReferenceUpVector()); + gAgent.getFrameAgent().rotate(radians, gAgent.getReferenceUpVector()); } else { @@ -1070,29 +1092,30 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y) { static LLVector3 last_at_axis; + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); - if (gAgent.mAvatarObject.isNull()) + if (!avatarp) { return; } - LLQuaternion av_inv_rot = ~gAgent.mAvatarObject->mRoot.getWorldRotation(); - LLVector3 root_at = LLVector3::x_axis * gAgent.mAvatarObject->mRoot.getWorldRotation(); + LLQuaternion av_inv_rot = ~avatarp->mRoot.getWorldRotation(); + LLVector3 root_at = LLVector3::x_axis * avatarp->mRoot.getWorldRotation(); if ((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) && - (root_at * last_at_axis > 0.95f )) + (root_at * last_at_axis > 0.95f)) { - LLVector3 vel = gAgent.mAvatarObject->getVelocity(); + LLVector3 vel = avatarp->getVelocity(); if (vel.magVecSquared() > 4.f) { - setLookAt(LOOKAT_TARGET_IDLE, gAgent.mAvatarObject, vel * av_inv_rot); + setLookAt(LOOKAT_TARGET_IDLE, avatarp, vel * av_inv_rot); } else { // *FIX: rotate mframeagent by sit object's rotation? - LLQuaternion look_rotation = gAgent.mAvatarObject->isSitting() ? gAgent.mAvatarObject->getRenderRotation() : gAgent.mFrameAgent.getQuaternion(); // use camera's current rotation + LLQuaternion look_rotation = avatarp->isSitting() ? avatarp->getRenderRotation() : gAgent.getFrameAgent().getQuaternion(); // use camera's current rotation LLVector3 look_offset = LLVector3(2.f, 0.f, 0.f) * look_rotation * av_inv_rot; - setLookAt(LOOKAT_TARGET_IDLE, gAgent.mAvatarObject, look_offset); + setLookAt(LOOKAT_TARGET_IDLE, avatarp, look_offset); } last_at_axis = root_at; return; @@ -1102,7 +1125,7 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y) if (CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode()) { - setLookAt(LOOKAT_TARGET_NONE, gAgent.mAvatarObject, LLVector3(-2.f, 0.f, 0.f)); + setLookAt(LOOKAT_TARGET_NONE, avatarp, LLVector3(-2.f, 0.f, 0.f)); } else { @@ -1131,7 +1154,7 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y) headLookAxis = frameCamera.getAtAxis(); // RN: we use world-space offset for mouselook and freelook //headLookAxis = headLookAxis * av_inv_rot; - setLookAt(lookAtType, gAgent.mAvatarObject, headLookAxis); + setLookAt(lookAtType, avatarp, headLookAxis); } } @@ -1152,13 +1175,15 @@ void LLAgentCamera::updateCamera() validateFocusObject(); - if (gAgent.mAvatarObject.notNull() && - gAgent.mAvatarObject->isSitting() && + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + + if (avatarp && + avatarp->isSitting() && camera_mode == CAMERA_MODE_MOUSELOOK) { //Ventrella //changed camera_skyward to the new global "mCameraUpVector" - mCameraUpVector = mCameraUpVector * gAgent.mAvatarObject->getRenderRotation(); + mCameraUpVector = mCameraUpVector * avatarp->getRenderRotation(); //end Ventrella } @@ -1266,7 +1291,7 @@ void LLAgentCamera::updateCamera() //Ventrella if ( mCameraMode == CAMERA_MODE_FOLLOW ) { - if ( gAgent.mAvatarObject.notNull() ) + if (avatarp) { //-------------------------------------------------------------------------------- // this is where the avatar's position and rotation are given to followCam, and @@ -1274,13 +1299,13 @@ void LLAgentCamera::updateCamera() // (2) focus, and (3) upvector. They can then be queried elsewhere in llAgent. //-------------------------------------------------------------------------------- // *TODO: use combined rotation of frameagent and sit object - LLQuaternion avatarRotationForFollowCam = gAgent.mAvatarObject->isSitting() ? gAgent.mAvatarObject->getRenderRotation() : gAgent.mFrameAgent.getQuaternion(); + LLQuaternion avatarRotationForFollowCam = avatarp->isSitting() ? avatarp->getRenderRotation() : gAgent.getFrameAgent().getQuaternion(); LLFollowCamParams* current_cam = LLFollowCamMgr::getActiveFollowCamParams(); if (current_cam) { mFollowCam.copyParams(*current_cam); - mFollowCam.setSubjectPositionAndRotation( gAgent.mAvatarObject->getRenderPosition(), avatarRotationForFollowCam ); + mFollowCam.setSubjectPositionAndRotation( avatarp->getRenderPosition(), avatarRotationForFollowCam ); mFollowCam.update(); LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); } @@ -1302,7 +1327,7 @@ void LLAgentCamera::updateCamera() mCameraFOVZoomFactor = calcCameraFOVZoomFactor(); camera_target_global = focus_target_global + (camera_target_global - focus_target_global) * (1.f + mCameraFOVZoomFactor); - gAgent.mShowAvatar = TRUE; // can see avatar by default + gAgent.setShowAvatar(TRUE); // can see avatar by default // Adjust position for animation if (mCameraAnimating) @@ -1335,7 +1360,7 @@ void LLAgentCamera::updateCamera() { if (fraction_of_animation < animation_start_fraction || fraction_of_animation > animation_finish_fraction ) { - gAgent.mShowAvatar = FALSE; + gAgent.setShowAvatar(FALSE); } // ...adjust position for animation @@ -1352,19 +1377,19 @@ void LLAgentCamera::updateCamera() mFocusGlobal = focus_target_global; gAgent.endAnimationUpdateUI(); - gAgent.mShowAvatar = TRUE; + gAgent.setShowAvatar(TRUE); } - if (gAgent.getAvatarObject() && mCameraMode != CAMERA_MODE_MOUSELOOK) + if (avatarp && (mCameraMode != CAMERA_MODE_MOUSELOOK)) { - gAgent.getAvatarObject()->updateAttachmentVisibility(mCameraMode); + avatarp->updateAttachmentVisibility(mCameraMode); } } else { camera_pos_global = camera_target_global; mFocusGlobal = focus_target_global; - gAgent.mShowAvatar = TRUE; + gAgent.setShowAvatar(TRUE); } // smoothing @@ -1448,47 +1473,47 @@ void LLAgentCamera::updateCamera() // this isn't directly related to the camera // but this seemed like the best place to do this LLVector3d global_pos = gAgent.getPositionGlobal(); - if (! gAgent.mLastPositionGlobal.isExactlyZero()) + if (!gAgent.getLastPositionGlobal().isExactlyZero()) { - LLVector3d delta = global_pos - gAgent.mLastPositionGlobal; - gAgent.mDistanceTraveled += delta.magVec(); + LLVector3d delta = global_pos - gAgent.getLastPositionGlobal(); + gAgent.setDistanceTraveled(gAgent.getDistanceTraveled() + delta.magVec()); } - gAgent.mLastPositionGlobal = global_pos; + gAgent.setLastPositionGlobal(global_pos); - if (LLVOAvatar::sVisibleInFirstPerson && gAgent.mAvatarObject.notNull() && !gAgent.mAvatarObject->isSitting() && cameraMouselook()) + if (LLVOAvatar::sVisibleInFirstPerson && avatarp && !avatarp->isSitting() && cameraMouselook()) { - LLVector3 head_pos = gAgent.mAvatarObject->mHeadp->getWorldPosition() + - LLVector3(0.08f, 0.f, 0.05f) * gAgent.mAvatarObject->mHeadp->getWorldRotation() + - LLVector3(0.1f, 0.f, 0.f) * gAgent.mAvatarObject->mPelvisp->getWorldRotation(); + LLVector3 head_pos = avatarp->mHeadp->getWorldPosition() + + LLVector3(0.08f, 0.f, 0.05f) * avatarp->mHeadp->getWorldRotation() + + LLVector3(0.1f, 0.f, 0.f) * avatarp->mPelvisp->getWorldRotation(); LLVector3 diff = mCameraPositionAgent - head_pos; - diff = diff * ~gAgent.mAvatarObject->mRoot.getWorldRotation(); + diff = diff * ~avatarp->mRoot.getWorldRotation(); - LLJoint* torso_joint = gAgent.mAvatarObject->mTorsop; - LLJoint* chest_joint = gAgent.mAvatarObject->mChestp; + LLJoint* torso_joint = avatarp->mTorsop; + LLJoint* chest_joint = avatarp->mChestp; LLVector3 torso_scale = torso_joint->getScale(); LLVector3 chest_scale = chest_joint->getScale(); // shorten avatar skeleton to avoid foot interpenetration - if (!gAgent.mAvatarObject->mInAir) + if (!avatarp->mInAir) { LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation(); F32 z_compensate = llclamp(-diff.mV[VZ], -0.2f, 1.f); F32 scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / chest_offset.mV[VZ]), 0.5f, 1.2f); torso_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); - LLJoint* neck_joint = gAgent.mAvatarObject->mNeckp; + LLJoint* neck_joint = avatarp->mNeckp; LLVector3 neck_offset = LLVector3(0.f, 0.f, neck_joint->getPosition().mV[VZ]) * chest_joint->getWorldRotation(); scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / neck_offset.mV[VZ]), 0.5f, 1.2f); chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); diff.mV[VZ] = 0.f; } - gAgent.mAvatarObject->mPelvisp->setPosition(gAgent.mAvatarObject->mPelvisp->getPosition() + diff); + avatarp->mPelvisp->setPosition(avatarp->mPelvisp->getPosition() + diff); - gAgent.mAvatarObject->mRoot.updateWorldMatrixChildren(); + avatarp->mRoot.updateWorldMatrixChildren(); - for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.mAvatarObject->mAttachmentPoints.begin(); - iter != gAgent.mAvatarObject->mAttachmentPoints.end(); ) + for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); + iter != avatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -1525,7 +1550,7 @@ void LLAgentCamera::updateFocusOffset() void LLAgentCamera::validateFocusObject() { if (mFocusObject.notNull() && - (mFocusObject->isDead())) + mFocusObject->isDead()) { mFocusObjectOffset.clearVec(); clearFocusObject(); @@ -1536,11 +1561,11 @@ void LLAgentCamera::validateFocusObject() //----------------------------------------------------------------------------- // calcCustomizeAvatarUIOffset() //----------------------------------------------------------------------------- -F32 LLAgentCamera::calcCustomizeAvatarUIOffset( const LLVector3d& camera_pos_global ) +F32 LLAgentCamera::calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global) { F32 ui_offset = 0.f; - if( gFloaterCustomize ) + if (gFloaterCustomize) { const LLRect& rect = gFloaterCustomize->getRect(); @@ -1575,8 +1600,10 @@ LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal() clearFocusObject(); } + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + // Ventrella - if ( mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar ) + if (mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar) { mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedFocus()); return mFocusTargetGlobal; @@ -1584,13 +1611,13 @@ LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal() else if (mCameraMode == CAMERA_MODE_MOUSELOOK) { LLVector3d at_axis(1.0, 0.0, 0.0); - LLQuaternion agent_rot = gAgent.mFrameAgent.getQuaternion(); - if (gAgent.mAvatarObject.notNull() && gAgent.mAvatarObject->getParent()) + LLQuaternion agent_rot = gAgent.getFrameAgent().getQuaternion(); + if (avatarp && avatarp->getParent()) { - LLViewerObject* root_object = (LLViewerObject*)gAgent.mAvatarObject->getRoot(); + LLViewerObject* root_object = (LLViewerObject*)avatarp->getRoot(); if (!root_object->flagCameraDecoupled()) { - agent_rot *= ((LLViewerObject*)(gAgent.mAvatarObject->getParent()))->getRenderRotation(); + agent_rot *= ((LLViewerObject*)(avatarp->getParent()))->getRenderRotation(); } } at_axis = at_axis * agent_rot; @@ -1640,7 +1667,7 @@ LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal() } return mFocusTargetGlobal; } - else if (mSitCameraEnabled && gAgent.mAvatarObject.notNull() && gAgent.mAvatarObject->isSitting() && mSitCameraReferenceObject.notNull()) + else if (mSitCameraEnabled && avatarp && avatarp->isSitting() && mSitCameraReferenceObject.notNull()) { // sit camera LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition(); @@ -1660,10 +1687,11 @@ LLVector3d LLAgentCamera::calcThirdPersonFocusOffset() // ...offset from avatar LLVector3d focus_offset; - LLQuaternion agent_rot = gAgent.mFrameAgent.getQuaternion(); - if (!gAgent.mAvatarObject.isNull() && gAgent.mAvatarObject->getParent()) + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + LLQuaternion agent_rot = gAgent.getFrameAgent().getQuaternion(); + if (avatarp && avatarp->getParent()) { - agent_rot *= ((LLViewerObject*)(gAgent.mAvatarObject->getParent()))->getRenderRotation(); + agent_rot *= ((LLViewerObject*)(avatarp->getParent()))->getRenderRotation(); } focus_offset = mFocusOffsetInitial[mCameraPreset] * agent_rot; @@ -1672,12 +1700,14 @@ LLVector3d LLAgentCamera::calcThirdPersonFocusOffset() void LLAgentCamera::setupSitCamera() { + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + // agent frame entering this function is in world coordinates - if (gAgent.mAvatarObject.notNull() && gAgent.mAvatarObject->getParent()) + if (avatarp && avatarp->getParent()) { - LLQuaternion parent_rot = ((LLViewerObject*)gAgent.mAvatarObject->getParent())->getRenderRotation(); + LLQuaternion parent_rot = ((LLViewerObject*)avatarp->getParent())->getRenderRotation(); // slam agent coordinate frame to proper parent local version - LLVector3 at_axis = gAgent.mFrameAgent.getAtAxis(); + LLVector3 at_axis = gAgent.getFrameAgent().getAtAxis(); at_axis.mV[VZ] = 0.f; at_axis.normalize(); gAgent.resetAxes(at_axis * ~parent_rot); @@ -1738,11 +1768,14 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor() //----------------------------------------------------------------------------- LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) { + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + // Compute base camera position and look-at points. F32 camera_land_height; - LLVector3d frame_center_global = gAgent.mAvatarObject.isNull() ? gAgent.getPositionGlobal() - : gAgent.getPosGlobalFromAgent(gAgent.mAvatarObject->mRoot.getWorldPosition()); - + LLVector3d frame_center_global = !avatarp ? + gAgent.getPositionGlobal() : + gAgent.getPosGlobalFromAgent(avatarp->mRoot.getWorldPosition()); + BOOL isConstrained = FALSE; LLVector3d head_offset; head_offset.setVec(mThirdPersonHeadOffset); @@ -1750,38 +1783,38 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) LLVector3d camera_position_global; // Ventrella - if ( mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar ) + if (mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar) { camera_position_global = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedPosition()); }// End Ventrella else if (mCameraMode == CAMERA_MODE_MOUSELOOK) { - if (gAgent.mAvatarObject.isNull() || gAgent.mAvatarObject->mDrawable.isNull()) + if (!avatarp || avatarp->mDrawable.isNull()) { llwarns << "Null avatar drawable!" << llendl; return LLVector3d::zero; } head_offset.clearVec(); - if (gAgent.mAvatarObject->isSitting() && gAgent.mAvatarObject->getParent()) + if (avatarp->isSitting() && avatarp->getParent()) { - gAgent.mAvatarObject->updateHeadOffset(); - head_offset.mdV[VX] = gAgent.mAvatarObject->mHeadOffset.mV[VX]; - head_offset.mdV[VY] = gAgent.mAvatarObject->mHeadOffset.mV[VY]; - head_offset.mdV[VZ] = gAgent.mAvatarObject->mHeadOffset.mV[VZ] + 0.1f; - const LLMatrix4& mat = ((LLViewerObject*) gAgent.mAvatarObject->getParent())->getRenderMatrix(); + avatarp->updateHeadOffset(); + head_offset.mdV[VX] = avatarp->mHeadOffset.mV[VX]; + head_offset.mdV[VY] = avatarp->mHeadOffset.mV[VY]; + head_offset.mdV[VZ] = avatarp->mHeadOffset.mV[VZ] + 0.1f; + const LLMatrix4& mat = ((LLViewerObject*) avatarp->getParent())->getRenderMatrix(); camera_position_global = gAgent.getPosGlobalFromAgent - ((gAgent.mAvatarObject->getPosition()+ - LLVector3(head_offset)*gAgent.mAvatarObject->getRotation()) * mat); + ((avatarp->getPosition()+ + LLVector3(head_offset)*avatarp->getRotation()) * mat); } else { - head_offset.mdV[VZ] = gAgent.mAvatarObject->mHeadOffset.mV[VZ]; - if (gAgent.mAvatarObject->isSitting()) + head_offset.mdV[VZ] = avatarp->mHeadOffset.mV[VZ]; + if (avatarp->isSitting()) { head_offset.mdV[VZ] += 0.1; } - camera_position_global = gAgent.getPosGlobalFromAgent(gAgent.mAvatarObject->getRenderPosition());//frame_center_global; - head_offset = head_offset * gAgent.mAvatarObject->getRenderRotation(); + camera_position_global = gAgent.getPosGlobalFromAgent(avatarp->getRenderPosition());//frame_center_global; + head_offset = head_offset * avatarp->getRenderRotation(); camera_position_global = camera_position_global + head_offset; } } @@ -1791,8 +1824,8 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) F32 camera_distance = 0.f; if (mSitCameraEnabled - && gAgent.mAvatarObject.notNull() - && gAgent.mAvatarObject->isSitting() + && avatarp + && avatarp->isSitting() && mSitCameraReferenceObject.notNull()) { // sit camera @@ -1808,23 +1841,23 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale"); // are we sitting down? - if (gAgent.mAvatarObject.notNull() && gAgent.mAvatarObject->getParent()) + if (avatarp && avatarp->getParent()) { - LLQuaternion parent_rot = ((LLViewerObject*)gAgent.mAvatarObject->getParent())->getRenderRotation(); + LLQuaternion parent_rot = ((LLViewerObject*)avatarp->getParent())->getRenderRotation(); // slam agent coordinate frame to proper parent local version - LLVector3 at_axis = gAgent.mFrameAgent.getAtAxis() * parent_rot; + LLVector3 at_axis = gAgent.getFrameAgent().getAtAxis() * parent_rot; at_axis.mV[VZ] = 0.f; at_axis.normalize(); gAgent.resetAxes(at_axis * ~parent_rot); - local_camera_offset = local_camera_offset * gAgent.mFrameAgent.getQuaternion() * parent_rot; + local_camera_offset = local_camera_offset * gAgent.getFrameAgent().getQuaternion() * parent_rot; } else { - local_camera_offset = gAgent.mFrameAgent.rotateToAbsolute( local_camera_offset ); + local_camera_offset = gAgent.getFrameAgent().rotateToAbsolute( local_camera_offset ); } - if (!mCameraCollidePlane.isExactlyZero() && (gAgent.mAvatarObject.isNull() || !gAgent.mAvatarObject->isSitting())) + if (!mCameraCollidePlane.isExactlyZero() && (!avatarp || !avatarp->isSitting())) { LLVector3 plane_normal; plane_normal.setVec(mCameraCollidePlane.mV); @@ -1877,11 +1910,11 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) // set the global camera position LLVector3d camera_offset; - LLVector3 av_pos = gAgent.mAvatarObject.isNull() ? LLVector3::zero : gAgent.mAvatarObject->getRenderPosition(); + LLVector3 av_pos = !avatarp ? LLVector3::zero : avatarp->getRenderPosition(); camera_offset.setVec( local_camera_offset ); camera_position_global = frame_center_global + head_offset + camera_offset; - if (gAgent.mAvatarObject.notNull()) + if (avatarp) { LLVector3d camera_lag_d; F32 lag_interp = LLCriticalDamp::getInterpolant(CAMERA_LAG_HALF_LIFE); @@ -1889,10 +1922,10 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) LLVector3 vel = gAgent.getVelocity(); // lag by appropriate amount for flying - F32 time_in_air = gAgent.mAvatarObject->mTimeInAir.getElapsedTimeF32(); - if(!mCameraAnimating && gAgent.mAvatarObject->mInAir && time_in_air > GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) + F32 time_in_air = avatarp->mTimeInAir.getElapsedTimeF32(); + if(!mCameraAnimating && avatarp->mInAir && time_in_air > GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) { - LLVector3 frame_at_axis = gAgent.mFrameAgent.getAtAxis(); + LLVector3 frame_at_axis = gAgent.getFrameAgent().getAtAxis(); frame_at_axis -= projected_vec(frame_at_axis, gAgent.getReferenceUpVector()); frame_at_axis.normalize(); @@ -1902,7 +1935,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) lag_interp *= u; - if (gViewerWindow->getLeftMouseDown() && gViewerWindow->getLastPick().mObjectID == gAgent.mAvatarObject->getID()) + if (gViewerWindow->getLeftMouseDown() && gViewerWindow->getLastPick().mObjectID == avatarp->getID()) { // disable camera lag when using mouse-directed steering target_lag.clearVec(); @@ -1946,8 +1979,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) if (!gSavedSettings.getBOOL("DisableCameraConstraints") && !gAgent.isGodlike()) { - LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal( - camera_position_global); + LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global); bool constrain = true; if(regionp && regionp->canManageEstate()) { @@ -1955,17 +1987,14 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) } if(constrain) { - F32 max_dist = ( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) ? - APPEARANCE_MAX_ZOOM : mDrawDistance; + F32 max_dist = (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode) ? APPEARANCE_MAX_ZOOM : mDrawDistance; - LLVector3d camera_offset = camera_position_global - - gAgent.getPositionGlobal(); + LLVector3d camera_offset = camera_position_global - gAgent.getPositionGlobal(); F32 camera_distance = (F32)camera_offset.magVec(); if(camera_distance > max_dist) { - camera_position_global = gAgent.getPositionGlobal() + - (max_dist / camera_distance) * camera_offset; + camera_position_global = gAgent.getPositionGlobal() + (max_dist/camera_distance)*camera_offset; isConstrained = TRUE; } } @@ -2013,12 +2042,12 @@ LLVector3 LLAgentCamera::getCameraOffsetInitial() //----------------------------------------------------------------------------- void LLAgentCamera::handleScrollWheel(S32 clicks) { - if ( mCameraMode == CAMERA_MODE_FOLLOW && getFocusOnAvatar()) + if (mCameraMode == CAMERA_MODE_FOLLOW && getFocusOnAvatar()) { - if ( ! mFollowCam.getPositionLocked() ) // not if the followCam position is locked in place + if (!mFollowCam.getPositionLocked()) // not if the followCam position is locked in place { - mFollowCam.zoom( clicks ); - if ( mFollowCam.isZoomedToMinimumDistance() ) + mFollowCam.zoom(clicks); + if (mFollowCam.isZoomedToMinimumDistance()) { changeCameraToMouselook(FALSE); } @@ -2040,7 +2069,7 @@ void LLAgentCamera::handleScrollWheel(S32 clicks) F32 zoom_factor = (F32)pow(0.8, -clicks); cameraZoomIn(zoom_factor); } - else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) + else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON)) { F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec(); @@ -2087,7 +2116,7 @@ F32 LLAgentCamera::getCameraMinOffGround() void LLAgentCamera::resetCamera() { // Remove any pitch from the avatar - LLVector3 at = gAgent.mFrameAgent.getAtAxis(); + LLVector3 at = gAgent.getFrameAgent().getAtAxis(); at.mV[VZ] = 0.f; at.normalize(); gAgent.resetAxes(at); @@ -2107,18 +2136,20 @@ void LLAgentCamera::changeCameraToMouselook(BOOL animate) return; } + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + // visibility changes at end of animation gViewerWindow->getWindow()->resetBusyCount(); // unpause avatar animation - gAgent.mPauseRequest = NULL; + gAgent.unpauseAnimation(); LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset); - if (gAgent.mAvatarObject.notNull()) + if (avatarp) { - gAgent.mAvatarObject->stopMotion( ANIM_AGENT_BODY_NOISE ); - gAgent.mAvatarObject->stopMotion( ANIM_AGENT_BREATHE_ROT ); + avatarp->stopMotion(ANIM_AGENT_BODY_NOISE); + avatarp->stopMotion(ANIM_AGENT_BREATHE_ROT); } //gViewerWindow->stopGrab(); @@ -2126,17 +2157,17 @@ void LLAgentCamera::changeCameraToMouselook(BOOL animate) gViewerWindow->hideCursor(); gViewerWindow->moveCursorToCenter(); - if( mCameraMode != CAMERA_MODE_MOUSELOOK ) + if (mCameraMode != CAMERA_MODE_MOUSELOOK) { - gFocusMgr.setKeyboardFocus( NULL ); + gFocusMgr.setKeyboardFocus(NULL); mLastCameraMode = mCameraMode; mCameraMode = CAMERA_MODE_MOUSELOOK; - U32 old_flags = gAgent.mControlFlags; + const U32 old_flags = gAgent.getControlFlags(); gAgent.setControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != gAgent.mControlFlags) + if (old_flags != gAgent.getControlFlags()) { - gAgent.mbFlagsDirty = TRUE; + gAgent.setFlagsDirty(); } if (animate) @@ -2184,7 +2215,7 @@ void LLAgentCamera::changeCameraToFollow(BOOL animate) return; } - if( mCameraMode != CAMERA_MODE_FOLLOW ) + if(mCameraMode != CAMERA_MODE_FOLLOW) { if (mCameraMode == CAMERA_MODE_MOUSELOOK) { @@ -2196,28 +2227,29 @@ void LLAgentCamera::changeCameraToFollow(BOOL animate) mCameraMode = CAMERA_MODE_FOLLOW; // bang-in the current focus, position, and up vector of the follow cam - mFollowCam.reset( mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis ); + mFollowCam.reset(mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis); if (gBasicToolset) { LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); } - if (gAgent.mAvatarObject.notNull()) + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if (avatarp) { - gAgent.mAvatarObject->mPelvisp->setPosition(LLVector3::zero); - gAgent.mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE ); - gAgent.mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT ); + avatarp->mPelvisp->setPosition(LLVector3::zero); + avatarp->startMotion( ANIM_AGENT_BODY_NOISE ); + avatarp->startMotion( ANIM_AGENT_BREATHE_ROT ); } // unpause avatar animation - gAgent.mPauseRequest = NULL; + gAgent.unpauseAnimation(); - U32 old_flags = gAgent.mControlFlags; + const U32 old_flags = gAgent.getControlFlags(); gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != gAgent.mControlFlags) + if (old_flags != gAgent.getControlFlags()) { - gAgent.mbFlagsDirty = TRUE; + gAgent.setFlagsDirty(); } if (animate) @@ -2246,22 +2278,23 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) mCameraZoomFraction = INITIAL_ZOOM_FRACTION; - if (gAgent.mAvatarObject.notNull()) + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if (avatarp) { - if (!gAgent.mAvatarObject->isSitting()) + if (!avatarp->isSitting()) { - gAgent.mAvatarObject->mPelvisp->setPosition(LLVector3::zero); + avatarp->mPelvisp->setPosition(LLVector3::zero); } - gAgent.mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE ); - gAgent.mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT ); + avatarp->startMotion(ANIM_AGENT_BODY_NOISE); + avatarp->startMotion(ANIM_AGENT_BREATHE_ROT); } LLVector3 at_axis; // unpause avatar animation - gAgent.mPauseRequest = NULL; + gAgent.unpauseAnimation(); - if( mCameraMode != CAMERA_MODE_THIRD_PERSON ) + if (mCameraMode != CAMERA_MODE_THIRD_PERSON) { if (gBasicToolset) { @@ -2277,19 +2310,19 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) } mLastCameraMode = mCameraMode; mCameraMode = CAMERA_MODE_THIRD_PERSON; - U32 old_flags = gAgent.mControlFlags; + const U32 old_flags = gAgent.getControlFlags(); gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != gAgent.mControlFlags) + if (old_flags != gAgent.getControlFlags()) { - gAgent.mbFlagsDirty = TRUE; + gAgent.setFlagsDirty(); } } // Remove any pitch from the avatar - if (gAgent.mAvatarObject.notNull() && gAgent.mAvatarObject->getParent()) + if (avatarp && avatarp->getParent()) { - LLQuaternion obj_rot = ((LLViewerObject*)gAgent.mAvatarObject->getParent())->getRenderRotation(); + LLQuaternion obj_rot = ((LLViewerObject*)avatarp->getParent())->getRenderRotation(); at_axis = LLViewerCamera::getInstance()->getAtAxis(); at_axis.mV[VZ] = 0.f; at_axis.normalize(); @@ -2297,7 +2330,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) } else { - at_axis = gAgent.mFrameAgent.getAtAxis(); + at_axis = gAgent.getFrameAgent().getAtAxis(); at_axis.mV[VZ] = 0.f; at_axis.normalize(); gAgent.resetAxes(at_axis); @@ -2339,20 +2372,20 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came } // Remove any pitch from the avatar - //LLVector3 at = gAgent.mFrameAgent.getAtAxis(); + //LLVector3 at = gAgent.getFrameAgent().getAtAxis(); //at.mV[VZ] = 0.f; //at.normalize(); //gAgent.resetAxes(at); - if( mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR ) + if (mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR) { mLastCameraMode = mCameraMode; mCameraMode = CAMERA_MODE_CUSTOMIZE_AVATAR; - U32 old_flags = gAgent.mControlFlags; + const U32 old_flags = gAgent.getControlFlags(); gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != gAgent.mControlFlags) + if (old_flags != gAgent.getControlFlags()) { - gAgent.mbFlagsDirty = TRUE; + gAgent.setFlagsDirty(); } gFocusMgr.setKeyboardFocus( NULL ); @@ -2361,20 +2394,21 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came LLVOAvatarSelf::onCustomizeStart(); } - if (gAgent.mAvatarObject.notNull()) + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if (avatarp) { if(avatar_animate) { // Remove any pitch from the avatar - LLVector3 at = gAgent.mFrameAgent.getAtAxis(); + LLVector3 at = gAgent.getFrameAgent().getAtAxis(); at.mV[VZ] = 0.f; at.normalize(); gAgent.resetAxes(at); gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); - gAgent.mCustomAnim = TRUE; - gAgent.mAvatarObject->startMotion(ANIM_AGENT_CUSTOMIZE); - LLMotion* turn_motion = gAgent.mAvatarObject->findMotion(ANIM_AGENT_CUSTOMIZE); + gAgent.setCustomAnim(TRUE); + avatarp->startMotion(ANIM_AGENT_CUSTOMIZE); + LLMotion* turn_motion = avatarp->findMotion(ANIM_AGENT_CUSTOMIZE); if (turn_motion) { @@ -2386,9 +2420,6 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came mAnimationDuration = gSavedSettings.getF32("ZoomTime"); } } - - - setFocusGlobal(LLVector3d::zero); } else @@ -2396,7 +2427,6 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came mCameraAnimating = FALSE; gAgent.endAnimationUpdateUI(); } - } @@ -2481,15 +2511,16 @@ void LLAgentCamera::setFocusGlobal(const LLVector3d& focus, const LLUUID &object setFocusObject(gObjectList.findObject(object_id)); LLVector3d old_focus = mFocusTargetGlobal; LLViewerObject *focus_obj = mFocusObject; + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); // if focus has changed if (old_focus != focus) { if (focus.isExactlyZero()) { - if (gAgent.mAvatarObject.notNull()) + if (avatarp) { - mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(gAgent.mAvatarObject->mHeadp->getWorldPosition()); + mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(avatarp->mHeadp->getWorldPosition()); } else { @@ -2532,9 +2563,9 @@ void LLAgentCamera::setFocusGlobal(const LLVector3d& focus, const LLUUID &object { if (focus.isExactlyZero()) { - if (gAgent.mAvatarObject.notNull()) + if (avatarp) { - mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(gAgent.mAvatarObject->mHeadp->getWorldPosition()); + mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(avatarp->mHeadp->getWorldPosition()); } else { @@ -2550,8 +2581,7 @@ void LLAgentCamera::setFocusGlobal(const LLVector3d& focus, const LLUUID &object // for attachments, make offset relative to avatar, not the attachment if (mFocusObject->isAttachment()) { - while (mFocusObject.notNull() // DEV-29123 - can crash with a messed-up attachment - && !mFocusObject->isAvatar()) + while (mFocusObject.notNull() && !mFocusObject->isAvatar()) { mFocusObject = (LLViewerObject*) mFocusObject->getParent(); } @@ -2571,11 +2601,11 @@ void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, con F64 focus_delta_squared = (old_focus - focus).magVecSquared(); const F64 ANIM_EPSILON_SQUARED = 0.0001; - if( focus_delta_squared > ANIM_EPSILON_SQUARED ) + if (focus_delta_squared > ANIM_EPSILON_SQUARED) { startCameraAnimation(); - if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) + if (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode) { // Compensate for the fact that the camera has already been offset to make room for LLFloaterCustomize. mAnimationCameraStartGlobal -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * calcCustomizeAvatarUIOffset( mAnimationCameraStartGlobal )); @@ -2604,7 +2634,7 @@ void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, con setLookAt(LOOKAT_TARGET_FOCUS, NULL, gAgent.getPosAgentFromGlobal(mFocusTargetGlobal)); } - if( mCameraAnimating ) + if (mCameraAnimating) { const F64 ANIM_METERS_PER_SECOND = 10.0; const F64 MIN_ANIM_SECONDS = 0.5; @@ -2672,9 +2702,10 @@ void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate) if (mCameraMode == CAMERA_MODE_THIRD_PERSON) { LLVector3 at_axis; - if (gAgent.mAvatarObject.notNull() && gAgent.mAvatarObject->getParent()) + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if (avatarp && avatarp->getParent()) { - LLQuaternion obj_rot = ((LLViewerObject*)gAgent.mAvatarObject->getParent())->getRenderRotation(); + LLQuaternion obj_rot = ((LLViewerObject*)avatarp->getParent())->getRenderRotation(); at_axis = LLViewerCamera::getInstance()->getAtAxis(); at_axis.mV[VZ] = 0.f; at_axis.normalize(); @@ -2702,15 +2733,16 @@ void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate) BOOL LLAgentCamera::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position) { + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); if(object && object->isAttachment()) { LLViewerObject* parent = object; while(parent) { - if (parent == gAgent.mAvatarObject) + if (parent == avatarp) { // looking at an attachment on ourselves, which we don't want to do - object = gAgent.mAvatarObject; + object = avatarp; position.clearVec(); } parent = (LLViewerObject*)parent->getParent(); @@ -2719,12 +2751,92 @@ BOOL LLAgentCamera::setLookAt(ELookAtType target_type, LLViewerObject *object, L if(!mLookAt || mLookAt->isDead()) { mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); - mLookAt->setSourceObject(gAgent.mAvatarObject); + mLookAt->setSourceObject(avatarp); } return mLookAt->setLookAt(target_type, object, position); } +//----------------------------------------------------------------------------- +// lookAtLastChat() +//----------------------------------------------------------------------------- +void LLAgentCamera::lookAtLastChat() +{ + // Block if camera is animating or not in normal third person camera mode + if (mCameraAnimating || !cameraThirdPerson()) + { + return; + } + + LLViewerObject *chatter = gObjectList.findObject(gAgent.getLastChatter()); + if (!chatter) + { + return; + } + + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + LLVector3 delta_pos; + if (chatter->isAvatar()) + { + LLVOAvatar *chatter_av = (LLVOAvatar*)chatter; + if (avatarp && chatter_av->mHeadp) + { + delta_pos = chatter_av->mHeadp->getWorldPosition() - avatarp->mHeadp->getWorldPosition(); + } + else + { + delta_pos = chatter->getPositionAgent() - gAgent.getPositionAgent(); + } + delta_pos.normalize(); + + gAgent.setControlFlags(AGENT_CONTROL_STOP); + + changeCameraToThirdPerson(); + + LLVector3 new_camera_pos = avatarp->mHeadp->getWorldPosition(); + LLVector3 left = delta_pos % LLVector3::z_axis; + left.normalize(); + LLVector3 up = left % delta_pos; + up.normalize(); + new_camera_pos -= delta_pos * 0.4f; + new_camera_pos += left * 0.3f; + new_camera_pos += up * 0.2f; + if (chatter_av->mHeadp) + { + setFocusGlobal(gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), gAgent.getLastChatter()); + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()); + } + else + { + setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter()); + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); + } + setFocusOnAvatar(FALSE, TRUE); + } + else + { + delta_pos = chatter->getRenderPosition() - gAgent.getPositionAgent(); + delta_pos.normalize(); + + gAgent.setControlFlags(AGENT_CONTROL_STOP); + + changeCameraToThirdPerson(); + + LLVector3 new_camera_pos = avatarp->mHeadp->getWorldPosition(); + LLVector3 left = delta_pos % LLVector3::z_axis; + left.normalize(); + LLVector3 up = left % delta_pos; + up.normalize(); + new_camera_pos -= delta_pos * 0.4f; + new_camera_pos += left * 0.3f; + new_camera_pos += up * 0.2f; + + setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter()); + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); + setFocusOnAvatar(FALSE, TRUE); + } +} + BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position) { // disallow pointing at attachments and avatars @@ -2732,23 +2844,21 @@ BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, { return FALSE; } - - if(!mPointAt || mPointAt->isDead()) + if (!mPointAt || mPointAt->isDead()) { mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); - mPointAt->setSourceObject(gAgent.mAvatarObject); + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + mPointAt->setSourceObject(avatarp); } - return mPointAt->setPointAt(target_type, object, position); } ELookAtType LLAgentCamera::getLookAtType() -{ +{ if (mLookAt) { return mLookAt->getLookAtType(); } - return LOOKAT_TARGET_NONE; } @@ -2758,7 +2868,6 @@ EPointAtType LLAgentCamera::getPointAtType() { return mPointAt->getPointAtType(); } - return POINTAT_TARGET_NONE; } diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 0b55b917d0..f45cf1f5bb 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -94,11 +94,6 @@ class LLAgentCamera public: friend class LLAgent; -/******************************************************************************** - ** ** - ** INITIALIZATION - **/ - //-------------------------------------------------------------------- // Constructors / Destructors //-------------------------------------------------------------------- @@ -107,9 +102,11 @@ public: virtual ~LLAgentCamera(); void init(); void cleanup(); + void setCameraAvatarObject(LLVOAvatarSelf* avatar); private: BOOL mInitialized; + //-------------------------------------------------------------------- // Mode //-------------------------------------------------------------------- @@ -148,7 +145,6 @@ private: /** Initial focus offsets */ std::map<ECameraPreset, LLVector3d> mFocusOffsetInitial; - //-------------------------------------------------------------------- // Position //-------------------------------------------------------------------- @@ -291,6 +287,7 @@ public: void updateLookAt(const S32 mouse_x, const S32 mouse_y); BOOL setLookAt(ELookAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero); ELookAtType getLookAtType(); + void lookAtLastChat(); void slamLookAt(const LLVector3 &look_at); // Set the physics data BOOL setPointAt(EPointAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero); EPointAtType getPointAtType(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 80c32399ce..82c6492850 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4093,7 +4093,7 @@ void LLAppViewer::disconnectViewer() LLFloaterInventory::cleanup(); gAgentWearables.cleanup(); - + gAgentCamera.cleanup(); // Also writes cached agent settings to gSavedSettings gAgent.cleanup(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index c440a1b285..edd03dc836 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2721,6 +2721,8 @@ void LLStartUp::postStartupState() void reset_login() { + gAgentWearables.cleanup(); + gAgentCamera.cleanup(); gAgent.cleanup(); LLWorld::getInstance()->destroyClass(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 6294800428..37566befb8 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3751,7 +3751,7 @@ class LLViewLookAtLastChatter : public view_listener_t { bool handleEvent(const LLSD& userdata) { - gAgent.lookAtLastChat(); + gAgentCamera.lookAtLastChat(); return true; } }; |