From 03b24043f7637fc0182f079375db409720da84a9 Mon Sep 17 00:00:00 2001 From: ZiRee Date: Mon, 25 Apr 2011 07:27:58 +0200 Subject: [PATCH] Animation switchover to swimming when avatar goes under water. --- indra/newview/aoengine.cpp | 40 +++++++++++++++++++++++++++++++++++- indra/newview/aoengine.h | 5 +++++ indra/newview/llvoavatar.cpp | 5 +++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp index c2166b8e06..a6c847b66a 100644 --- a/indra/newview/aoengine.cpp +++ b/indra/newview/aoengine.cpp @@ -55,6 +55,7 @@ AOEngine::AOEngine() : mDefaultSet(0), mEnabled(FALSE), mInMouselook(FALSE), + mUnderWater(FALSE), mImportSet(0), mImportCategory(LLUUID::null), mAOFolder(LLUUID::null), @@ -133,6 +134,37 @@ BOOL AOEngine::foreignAnimations() return FALSE; } +LLUUID AOEngine::mapSwimming(LLUUID motion) +{ + S32 stateNum; +llwarns << __LINE__ << llendl; + if(motion==ANIM_AGENT_HOVER) + stateNum=AOSet::Floating; + else if(motion==ANIM_AGENT_FLY) + stateNum=AOSet::SwimmingForward; + else if(motion==ANIM_AGENT_HOVER_UP) + stateNum=AOSet::SwimmingUp; + else if(motion==ANIM_AGENT_HOVER_DOWN) + stateNum=AOSet::SwimmingDown; + else + return LLUUID::null; +llwarns << __LINE__ << " " << stateNum << llendl; + + AOSet::AOState* state=mCurrentSet->getState(stateNum); +llwarns << __LINE__ << " " << state->mName << llendl; + return mCurrentSet->getAnimationForState(state); +} + +void AOEngine::checkBelowWater(BOOL yes) +{ + if(mUnderWater==yes) + return; + + gAgent.sendAnimationRequest(override(mLastOverriddenMotion,FALSE),ANIM_REQUEST_STOP); + mUnderWater=yes; + gAgent.sendAnimationRequest(override(mLastOverriddenMotion,TRUE),ANIM_REQUEST_START); +} + void AOEngine::enable(BOOL yes) { lldebugs << "using " << mLastMotion << " enable " << yes << llendl; @@ -297,7 +329,13 @@ const LLUUID AOEngine::override(const LLUUID pMotion,BOOL start) if(motion!=ANIM_AGENT_TYPE) mCurrentSet->setMotion(motion); - animation=mCurrentSet->getAnimationForState(state); + mUnderWater=gAgentAvatarp->mBelowWater; + if(mUnderWater) + animation=mapSwimming(motion); + + if(animation.isNull()) + animation=mCurrentSet->getAnimationForState(state); + state->mCurrentAnimationID=animation; lldebugs << "overriding " << gAnimLibrary.animStateToString(motion) << " with " << animation diff --git a/indra/newview/aoengine.h b/indra/newview/aoengine.h index 2abed0c8ac..64776bfed9 100644 --- a/indra/newview/aoengine.h +++ b/indra/newview/aoengine.h @@ -111,6 +111,7 @@ class AOEngine BOOL addAnimation(const AOSet* set,AOSet::AOState* state,const LLInventoryItem* item,BOOL reload=TRUE); BOOL removeAnimation(const AOSet* set,AOSet::AOState* state,S32 index); void checkSitCancel(); + void checkBelowWater(BOOL yes); BOOL importNotecard(const LLInventoryItem* item); void processImport(); @@ -156,6 +157,7 @@ class AOEngine void stopAllSitVariants(); BOOL foreignAnimations(); + LLUUID mapSwimming(LLUUID motion); void updateSortOrder(AOSet::AOState* state); void saveSet(const AOSet* set); @@ -175,9 +177,12 @@ class AOEngine BOOL mEnabled; BOOL mInMouselook; + BOOL mUnderWater; + LLUUID mAOFolder; LLUUID mLastMotion; LLUUID mLastOverriddenMotion; + std::vector mSets; AOSet* mCurrentSet; AOSet* mDefaultSet; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c82a0a39e4..04be1255f2 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3296,7 +3296,12 @@ void LLVOAvatar::idleUpdateBelowWater() F32 water_height; water_height = getRegion()->getWaterHeight(); + BOOL wasBelowWater = mBelowWater; // ## Zi: Animation Overrider mBelowWater = avatar_height < water_height; + // ## Zi: Animation Overrider + if (wasBelowWater != mBelowWater) + AOEngine::instance().checkBelowWater(mBelowWater); + // ## Zi: Animation Overrider } void LLVOAvatar::slamPosition()