From 063a7a531a66ad1d83e644217a9488682d94b231 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 23 Apr 2010 16:00:12 -0400 Subject: Improved default animations - work in progress --- indra/llcharacter/llmotioncontroller.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index bb9625b2bd..318fac847b 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -392,6 +392,8 @@ LLMotion* LLMotionController::createMotion( const LLUUID &id ) //----------------------------------------------------------------------------- BOOL LLMotionController::startMotion(const LLUUID &id, F32 start_offset) { + llinfos << animationName(id) << llendl; + // do we have an instance of this motion for this character? LLMotion *motion = findMotion(id); @@ -804,6 +806,8 @@ void LLMotionController::updateLoadingMotions() //----------------------------------------------------------------------------- void LLMotionController::updateMotions(bool force_update) { + dumpMotions(); + BOOL use_quantum = (mTimeStep != 0.f); // Always update mPrevTimerElapsed @@ -1032,6 +1036,31 @@ LLMotion* LLMotionController::findMotion(const LLUUID& id) const } } +//----------------------------------------------------------------------------- +// dumpMotions() +//----------------------------------------------------------------------------- +void LLMotionController::dumpMotions() +{ + for (motion_map_t::iterator iter = mAllMotions.begin(); + iter != mAllMotions.end(); iter++) + { + llinfos << "=====================================" << llendl; + LLUUID id = iter->first; + std::string state_string; + LLMotion *motion = iter->second; + if (mLoadingMotions.find(motion) != mLoadingMotions.end()) + state_string += std::string("l"); + if (mLoadedMotions.find(motion) != mLoadedMotions.end()) + state_string += std::string("L"); + if (std::find(mActiveMotions.begin(), mActiveMotions.end(), motion)!=mActiveMotions.end()) + state_string += std::string("A"); + if (mDeprecatedMotions.find(motion) != mDeprecatedMotions.end()) + state_string += std::string("D"); + llinfos << animationName(id) << " " << state_string << llendl; + + } +} + //----------------------------------------------------------------------------- // deactivateAllMotions() //----------------------------------------------------------------------------- -- cgit v1.3 From 2927ae2fa4058f249b8ff1e6bd7ed87b02917d57 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 26 Apr 2010 17:45:32 -0400 Subject: Improved default animations - work in progress --- indra/llcharacter/llmotioncontroller.cpp | 10 +++++++--- indra/llcharacter/llmotioncontroller.h | 1 + indra/newview/llvoavatar.cpp | 10 +++++----- indra/newview/llvoavatarself.cpp | 4 +++- 4 files changed, 16 insertions(+), 9 deletions(-) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 318fac847b..5070f83ed6 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -143,7 +143,8 @@ LLMotionController::LLMotionController() mPauseTime(0.f), mTimeStep(0.f), mTimeStepCount(0), - mLastInterp(0.f) + mLastInterp(0.f), + mIsSelf(FALSE) { } @@ -806,7 +807,10 @@ void LLMotionController::updateLoadingMotions() //----------------------------------------------------------------------------- void LLMotionController::updateMotions(bool force_update) { - dumpMotions(); + if (mIsSelf) + { + dumpMotions(); + } BOOL use_quantum = (mTimeStep != 0.f); @@ -1041,10 +1045,10 @@ LLMotion* LLMotionController::findMotion(const LLUUID& id) const //----------------------------------------------------------------------------- void LLMotionController::dumpMotions() { + llinfos << "=====================================" << llendl; for (motion_map_t::iterator iter = mAllMotions.begin(); iter != mAllMotions.end(); iter++) { - llinfos << "=====================================" << llendl; LLUUID id = iter->first; std::string state_string; LLMotion *motion = iter->second; diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index 83dc2d487a..30ab0cbdc9 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -92,6 +92,7 @@ class LLMotionController public: typedef std::list motion_list_t; typedef std::set motion_set_t; + BOOL mIsSelf; public: // Constructor diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 02baaeae41..62823648b7 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2259,11 +2259,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) idleUpdateRenderCost(); idleUpdateTractorBeam(); - if (isSelf()) - { - dumpAnimationState(this); - } - return TRUE; } @@ -3066,6 +3061,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } } + if (isSelf()) + { + dumpAnimationState(this); + } + if (gNoRender) { // Hack if we're running drones... diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7473adda1f..9bed75c0a6 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -143,7 +143,9 @@ LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id, mRegionCrossingCount(0) { gAgentWearables.setAvatarObject(this); - + + mMotionController.mIsSelf = TRUE; + lldebugs << "Marking avatar as self " << id << llendl; } -- cgit v1.3 From 969a4bf934030fe543cd9b05e3ef1e2da0ba11d1 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 27 Apr 2010 23:01:11 -0400 Subject: work in progress on improved default animations --- indra/llcharacter/llmotioncontroller.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 5070f83ed6..6df72a4d9b 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -449,9 +449,15 @@ BOOL LLMotionController::stopMotionInstance(LLMotion* motion, BOOL stop_immediat return FALSE; } + // If on active list, stop it if (isMotionActive(motion) && !motion->isStopped()) { + if (motion->getID() == ANIM_AGENT_FEMALE_WALK_NEW || motion->getID() == ANIM_AGENT_FEMALE_WALK) + { + llinfos << "stop female walk: " << animationName(motion->getID()) << llendl; + } + motion->setStopTime(mAnimTime); if (stop_immediate) { -- cgit v1.3 From e9effbe73a995b7356ae711a3406f253a779005f Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 29 Apr 2010 15:58:50 -0400 Subject: For EXT-6953: Evaluate and implement Richard's improved default animations. New versions of animations fix looping and other problems, reduced log spam. --- indra/llcharacter/llanimationstates.cpp | 8 ++++---- indra/llcharacter/llmotioncontroller.cpp | 27 ++++++++++++++++++++++++++- indra/newview/llvoavatar.cpp | 2 +- 3 files changed, 31 insertions(+), 6 deletions(-) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp index ef0745fbcc..bcc28cfc8f 100644 --- a/indra/llcharacter/llanimationstates.cpp +++ b/indra/llcharacter/llanimationstates.cpp @@ -94,9 +94,9 @@ const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE = LLUUID("b92ec1a5-e7ce-a76b-2b05-bcd const LLUUID ANIM_AGENT_EXPRESS_WINK = LLUUID("da020525-4d94-59d6-23d7-81fdebf33148"); const LLUUID ANIM_AGENT_EXPRESS_WORRY = LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950"); const LLUUID ANIM_AGENT_FALLDOWN = LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094"); -const LLUUID ANIM_AGENT_FEMALE_RUN_NEW = LLUUID("5c083e7f-6462-a637-8d33-afaefa7a97bc"); +const LLUUID ANIM_AGENT_FEMALE_RUN_NEW = LLUUID("85995026-eade-5d78-d364-94a64512cb66"); const LLUUID ANIM_AGENT_FEMALE_WALK = LLUUID("f5fc7433-043d-e819-8298-f519a119b688"); -const LLUUID ANIM_AGENT_FEMALE_WALK_NEW = LLUUID("14b7b3c8-8987-85ab-9f29-5a5956058e55"); +const LLUUID ANIM_AGENT_FEMALE_WALK_NEW = LLUUID("d60c41d2-7c24-7074-d3fa-6101cea22a51"); const LLUUID ANIM_AGENT_FINGER_WAG = LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f"); const LLUUID ANIM_AGENT_FIST_PUMP = LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a"); const LLUUID ANIM_AGENT_FLY = LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf"); @@ -136,7 +136,7 @@ const LLUUID ANIM_AGENT_RPS_PAPER = LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f const LLUUID ANIM_AGENT_RPS_ROCK = LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f"); const LLUUID ANIM_AGENT_RPS_SCISSORS = LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325"); const LLUUID ANIM_AGENT_RUN = LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445"); -const LLUUID ANIM_AGENT_RUN_NEW = LLUUID("25f649b2-c600-9ae3-a8e7-9eca357a20ce"); +const LLUUID ANIM_AGENT_RUN_NEW = LLUUID("1ab1b236-cd08-21e6-0cbc-0d923fc6eca2"); const LLUUID ANIM_AGENT_SAD = LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a"); const LLUUID ANIM_AGENT_SALUTE = LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104"); const LLUUID ANIM_AGENT_SHOOT_BOW_L = LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8"); @@ -172,7 +172,7 @@ const LLUUID ANIM_AGENT_TURNLEFT = LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf613 const LLUUID ANIM_AGENT_TURNRIGHT = LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30"); const LLUUID ANIM_AGENT_TYPE = LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9"); const LLUUID ANIM_AGENT_WALK = LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0"); -const LLUUID ANIM_AGENT_WALK_NEW = LLUUID("fa1e3197-5e7f-20d1-16d1-f5addc999ce7"); +const LLUUID ANIM_AGENT_WALK_NEW = LLUUID("33339176-7ddc-9397-94a4-bf3403cbc8f5"); const LLUUID ANIM_AGENT_WHISPER = LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f"); const LLUUID ANIM_AGENT_WHISTLE = LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0"); const LLUUID ANIM_AGENT_WINK = LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e"); diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 6df72a4d9b..80d98a1cee 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -552,6 +552,26 @@ void LLMotionController::updateIdleActiveMotions() } } + +void breakWalkIf(LLMotion *motionp, BOOL flag) +{ + if ( + (motionp->getID() == ANIM_AGENT_FEMALE_WALK) || + (motionp->getID() == ANIM_AGENT_FEMALE_WALK_NEW) || + (motionp->getID() == ANIM_AGENT_FEMALE_RUN_NEW) || + (motionp->getID() == ANIM_AGENT_FEMALE_WALK_NEW) || + (motionp->getID() == ANIM_AGENT_WALK) || + (motionp->getID() == ANIM_AGENT_RUN) || + (motionp->getID() == ANIM_AGENT_RUN_NEW) + ) + { + if (flag) + { + llinfos << "break here" << llendl; + } + } +} + //----------------------------------------------------------------------------- // updateMotionsByType() //----------------------------------------------------------------------------- @@ -690,6 +710,7 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty // perform motion update update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature); + breakWalkIf(motionp,!update_result); } //********************** @@ -712,7 +733,9 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty } // perform motion update + breakWalkIf(motionp,TRUE); update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature); + breakWalkIf(motionp,!update_result); } //********************** @@ -735,11 +758,13 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty } // perform motion update update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature); + breakWalkIf(motionp,!update_result); } else { posep->setWeight(0.f); update_result = motionp->onUpdate(0.f, last_joint_signature); + breakWalkIf(motionp,!update_result); } // allow motions to deactivate themselves @@ -815,7 +840,7 @@ void LLMotionController::updateMotions(bool force_update) { if (mIsSelf) { - dumpMotions(); + //dumpMotions(); } BOOL use_quantum = (mTimeStep != 0.f); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 62823648b7..05583c0944 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3063,7 +3063,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) if (isSelf()) { - dumpAnimationState(this); + // dumpAnimationState(this); } if (gNoRender) -- cgit v1.3 From 29740b0e3dee7f124cc8790ec5f1e444b3bcda79 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 30 Apr 2010 17:54:38 -0400 Subject: For EXT-6953: Evaluate and implement Richard's improved default animations. Diagnostic info. --- indra/llcharacter/llkeyframewalkmotion.cpp | 25 ++++++++++++++----------- indra/llcharacter/llmotioncontroller.cpp | 2 +- indra/newview/llvoavatar.cpp | 12 ++++++++++++ 3 files changed, 27 insertions(+), 12 deletions(-) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index 461309bee9..f6c43effdf 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -48,8 +48,9 @@ const F32 MAX_WALK_PLAYBACK_SPEED = 8.f; // max m/s for which we adjust walk cyc const F32 MIN_WALK_SPEED = 0.1f; // minimum speed at which we use velocity for down foot detection const F32 MAX_TIME_DELTA = 2.f; //max two seconds a frame for calculating interpolation -const F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed -const F32 SPEED_ADJUST_MAX_SEC = 3.f; // maximum adjustment to walk animation playback speed for a second +F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed +F32 SPEED_ADJUST_MAX_SEC = 3.f; // maximum adjustment to walk animation playback speed for a second +F32 ANIM_SPEED_MAX = 5.0f; // absolute limit on animation speed const F32 DRIFT_COMP_MAX_TOTAL = 0.07f;//0.55f; // maximum drift compensation overall, in any direction const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out const F32 MAX_ROLL = 0.6f; @@ -300,6 +301,7 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) // and if we're moving backward, we walk backward F32 directional_factor = localVel.mV[VX] * mRelativeDir; + if (speed > 0.1f) { // calculate ratio of desired foot velocity to detected foot velocity @@ -318,15 +320,16 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) } mAnimSpeed = (mAvgSpeed + mSpeedAdjust) * mRelativeDir; -// char debug_text[64]; -// sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); -// mCharacter->addDebugText(debug_text); -// sprintf(debug_text, "Speed: %.2f", mAvgSpeed); -// mCharacter->addDebugText(debug_text); -// sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust); -// mCharacter->addDebugText(debug_text); -// sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); -// mCharacter->addDebugText(debug_text); + mAnimSpeed = llclamp(mAnimSpeed, -ANIM_SPEED_MAX, ANIM_SPEED_MAX); + char debug_text[64]; + sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); + mCharacter->addDebugText(debug_text); + sprintf(debug_text, "Speed: %.2f", mAvgSpeed); + mCharacter->addDebugText(debug_text); + sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust); + mCharacter->addDebugText(debug_text); + sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); + mCharacter->addDebugText(debug_text); mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); // clamp pelvis offset to a 90 degree arc behind the nominal position diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 80d98a1cee..ca10f5f572 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -559,8 +559,8 @@ void breakWalkIf(LLMotion *motionp, BOOL flag) (motionp->getID() == ANIM_AGENT_FEMALE_WALK) || (motionp->getID() == ANIM_AGENT_FEMALE_WALK_NEW) || (motionp->getID() == ANIM_AGENT_FEMALE_RUN_NEW) || - (motionp->getID() == ANIM_AGENT_FEMALE_WALK_NEW) || (motionp->getID() == ANIM_AGENT_WALK) || + (motionp->getID() == ANIM_AGENT_WALK_NEW) || (motionp->getID() == ANIM_AGENT_RUN) || (motionp->getID() == ANIM_AGENT_RUN_NEW) ) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 05583c0944..e9de29ff56 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -95,6 +95,11 @@ #include "llvoiceclient.h" #include "llvoicevisualizer.h" // Ventrella +#include "lldebugmessagebox.h" +extern F32 SPEED_ADJUST_MAX; +extern F32 SPEED_ADJUST_MAX_SEC; +extern F32 ANIM_SPEED_MAX; + #if LL_MSVC // disable boost::lexical_cast warning #pragma warning (disable:4702) @@ -3031,6 +3036,13 @@ void LLVOAvatar::slamPosition() //------------------------------------------------------------------------ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { + if (!LLApp::isExiting()) + { + LLDebugVarMessageBox::show("Adj Max", &SPEED_ADJUST_MAX, 5.0f, 0.1f); + LLDebugVarMessageBox::show("Adj Max Sec", &SPEED_ADJUST_MAX_SEC, 5.0f, 0.1f); + LLDebugVarMessageBox::show("Anim Max", &ANIM_SPEED_MAX, 10.0f, 0.1f); + } + LLMemType mt(LLMemType::MTYPE_AVATAR); // clear debug text -- cgit v1.3 From 6081ad52c3711010e03c26679849921d4e5968bc Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 6 May 2010 19:10:11 -0400 Subject: Improved default animations - work in progress --- indra/llcharacter/llkeyframewalkmotion.cpp | 26 ++++++++++++++++++++++++-- indra/llcharacter/llmotioncontroller.cpp | 2 +- indra/llcharacter/llmotioncontroller.h | 4 +++- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llvoavatar.cpp | 12 +++++++++--- 5 files changed, 48 insertions(+), 7 deletions(-) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index f6c43effdf..3cf4d695dd 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -50,7 +50,8 @@ const F32 MIN_WALK_SPEED = 0.1f; // minimum speed at which we use velocity for d const F32 MAX_TIME_DELTA = 2.f; //max two seconds a frame for calculating interpolation F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed F32 SPEED_ADJUST_MAX_SEC = 3.f; // maximum adjustment to walk animation playback speed for a second -F32 ANIM_SPEED_MAX = 5.0f; // absolute limit on animation speed +F32 ANIM_SPEED_MAX = 10.0f; // absolute upper limit on animation speed +F32 ANIM_SPEED_MIN = 0.0f; // absolute lower limit on animation speed const F32 DRIFT_COMP_MAX_TOTAL = 0.07f;//0.55f; // maximum drift compensation overall, in any direction const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out const F32 MAX_ROLL = 0.6f; @@ -320,7 +321,14 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) } mAnimSpeed = (mAvgSpeed + mSpeedAdjust) * mRelativeDir; - mAnimSpeed = llclamp(mAnimSpeed, -ANIM_SPEED_MAX, ANIM_SPEED_MAX); + if (mAnimSpeed>0) + { + mAnimSpeed = llclamp(mAnimSpeed, ANIM_SPEED_MIN, ANIM_SPEED_MAX); + } + else + { + mAnimSpeed = llclamp(mAnimSpeed, -ANIM_SPEED_MAX, -ANIM_SPEED_MIN); + } char debug_text[64]; sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); mCharacter->addDebugText(debug_text); @@ -331,6 +339,20 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); mCharacter->addDebugText(debug_text); mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); + if (mCharacter->getMotionController().mIsSelf) + { + F32 elapsed = mCharacter->getMotionController().getFrameTimer().getElapsedTimeF32(); + llinfos << "PLOT elapsed: " << elapsed +// << " footSlipVelocity: " << footSlipVelocity +// << " speed: " << speed +// << " mAvgCorrection: " << mAvgCorrection + << " mAvgSpeed: " << mAvgSpeed +// << " mSpeedAdjust: " << mSpeedAdjust + << " mAnimSpeed: " << mAnimSpeed + << " ANIM_SPEED_MAX: " << ANIM_SPEED_MAX + << " ANIM_SPEED_MIN: " << ANIM_SPEED_MIN + << llendl; + } // clamp pelvis offset to a 90 degree arc behind the nominal position F32 drift_comp_max = llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED; diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index ca10f5f572..51a9120cbb 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -567,7 +567,7 @@ void breakWalkIf(LLMotion *motionp, BOOL flag) { if (flag) { - llinfos << "break here" << llendl; +// llinfos << "break here" << llendl; } } } diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index 30ab0cbdc9..f8bf5ac289 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -171,7 +171,9 @@ public: LLMotion *findMotion( const LLUUID& id ) const; void dumpMotions(); - + + const LLFrameTimer& getFrameTimer() { return mTimer; } + protected: // internal operations act on motion instances directly // as there can be duplicate motions per id during blending overlap diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6f08cd7579..fa9dc2d3c1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10194,6 +10194,17 @@ Value 0 + ShowWalkSliders + + Comment + Allow walk params to be adjusted on the fly. + Persist + 1 + Type + Boolean + Value + 0 + UseStartScreen Comment diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index e9de29ff56..3e6ec21017 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -99,6 +99,7 @@ extern F32 SPEED_ADJUST_MAX; extern F32 SPEED_ADJUST_MAX_SEC; extern F32 ANIM_SPEED_MAX; +extern F32 ANIM_SPEED_MIN; #if LL_MSVC // disable boost::lexical_cast warning @@ -3038,9 +3039,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { if (!LLApp::isExiting()) { - LLDebugVarMessageBox::show("Adj Max", &SPEED_ADJUST_MAX, 5.0f, 0.1f); - LLDebugVarMessageBox::show("Adj Max Sec", &SPEED_ADJUST_MAX_SEC, 5.0f, 0.1f); - LLDebugVarMessageBox::show("Anim Max", &ANIM_SPEED_MAX, 10.0f, 0.1f); + BOOL show_walk_sliders = gSavedSettings.getBOOL("ShowWalkSliders"); + if (show_walk_sliders) + { + LLDebugVarMessageBox::show("Adj Max", &SPEED_ADJUST_MAX, 5.0f, 0.1f); + LLDebugVarMessageBox::show("Adj Max Sec", &SPEED_ADJUST_MAX_SEC, 5.0f, 0.1f); + LLDebugVarMessageBox::show("Anim Max", &ANIM_SPEED_MAX, 10.0f, 0.1f); + LLDebugVarMessageBox::show("Anim Min", &ANIM_SPEED_MIN, 10.0f, 0.1f); + } } LLMemType mt(LLMemType::MTYPE_AVATAR); -- cgit v1.3 From 9e5fe84c9e6f6027878d70350c8f60e4c2be7e48 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 7 May 2010 15:10:50 -0400 Subject: For EXT-6953: Evaluate and implement Richard's improved default animations. Cleanup and log spam reduction. --- indra/llcharacter/llanimationstates.cpp | 3 --- indra/llcharacter/llkeyframewalkmotion.cpp | 26 ++++++++++----------- indra/llcharacter/llmotioncontroller.cpp | 37 ------------------------------ indra/newview/llappviewer.cpp | 8 +++---- indra/newview/llvoavatar.cpp | 27 +++++++++++----------- indra/newview/llvoavatar.h | 1 + 6 files changed, 30 insertions(+), 72 deletions(-) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp index bcc28cfc8f..879f97deec 100644 --- a/indra/llcharacter/llanimationstates.cpp +++ b/indra/llcharacter/llanimationstates.cpp @@ -39,9 +39,6 @@ #include "llanimationstates.h" #include "llstring.h" -// Would be nice to be able to toggle at run-time, but not gonna -// happen while we're using const LLUUIDs as keys. - const LLUUID ANIM_AGENT_AFRAID = LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca"); const LLUUID ANIM_AGENT_AIM_BAZOOKA_R = LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef"); const LLUUID ANIM_AGENT_AIM_BOW_L = LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506"); diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index 3cf4d695dd..232b617d69 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -329,25 +329,23 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) { mAnimSpeed = llclamp(mAnimSpeed, -ANIM_SPEED_MAX, -ANIM_SPEED_MIN); } - char debug_text[64]; - sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); - mCharacter->addDebugText(debug_text); - sprintf(debug_text, "Speed: %.2f", mAvgSpeed); - mCharacter->addDebugText(debug_text); - sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust); - mCharacter->addDebugText(debug_text); - sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); - mCharacter->addDebugText(debug_text); - mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); +// char debug_text[64]; +// sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); +// mCharacter->addDebugText(debug_text); +// sprintf(debug_text, "Speed: %.2f", mAvgSpeed); +// mCharacter->addDebugText(debug_text); +// sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust); +// mCharacter->addDebugText(debug_text); +// sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); +// mCharacter->addDebugText(debug_text); + mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); if (mCharacter->getMotionController().mIsSelf) { F32 elapsed = mCharacter->getMotionController().getFrameTimer().getElapsedTimeF32(); llinfos << "PLOT elapsed: " << elapsed -// << " footSlipVelocity: " << footSlipVelocity -// << " speed: " << speed -// << " mAvgCorrection: " << mAvgCorrection + << " footSlipVelocity: " << footSlipVelocity + << " mAvgCorrection: " << mAvgCorrection << " mAvgSpeed: " << mAvgSpeed -// << " mSpeedAdjust: " << mSpeedAdjust << " mAnimSpeed: " << mAnimSpeed << " ANIM_SPEED_MAX: " << ANIM_SPEED_MAX << " ANIM_SPEED_MIN: " << ANIM_SPEED_MIN diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 51a9120cbb..04524dc015 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -393,8 +393,6 @@ LLMotion* LLMotionController::createMotion( const LLUUID &id ) //----------------------------------------------------------------------------- BOOL LLMotionController::startMotion(const LLUUID &id, F32 start_offset) { - llinfos << animationName(id) << llendl; - // do we have an instance of this motion for this character? LLMotion *motion = findMotion(id); @@ -453,11 +451,6 @@ BOOL LLMotionController::stopMotionInstance(LLMotion* motion, BOOL stop_immediat // If on active list, stop it if (isMotionActive(motion) && !motion->isStopped()) { - if (motion->getID() == ANIM_AGENT_FEMALE_WALK_NEW || motion->getID() == ANIM_AGENT_FEMALE_WALK) - { - llinfos << "stop female walk: " << animationName(motion->getID()) << llendl; - } - motion->setStopTime(mAnimTime); if (stop_immediate) { @@ -552,26 +545,6 @@ void LLMotionController::updateIdleActiveMotions() } } - -void breakWalkIf(LLMotion *motionp, BOOL flag) -{ - if ( - (motionp->getID() == ANIM_AGENT_FEMALE_WALK) || - (motionp->getID() == ANIM_AGENT_FEMALE_WALK_NEW) || - (motionp->getID() == ANIM_AGENT_FEMALE_RUN_NEW) || - (motionp->getID() == ANIM_AGENT_WALK) || - (motionp->getID() == ANIM_AGENT_WALK_NEW) || - (motionp->getID() == ANIM_AGENT_RUN) || - (motionp->getID() == ANIM_AGENT_RUN_NEW) - ) - { - if (flag) - { -// llinfos << "break here" << llendl; - } - } -} - //----------------------------------------------------------------------------- // updateMotionsByType() //----------------------------------------------------------------------------- @@ -710,7 +683,6 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty // perform motion update update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature); - breakWalkIf(motionp,!update_result); } //********************** @@ -733,9 +705,7 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty } // perform motion update - breakWalkIf(motionp,TRUE); update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature); - breakWalkIf(motionp,!update_result); } //********************** @@ -758,13 +728,11 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty } // perform motion update update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature); - breakWalkIf(motionp,!update_result); } else { posep->setWeight(0.f); update_result = motionp->onUpdate(0.f, last_joint_signature); - breakWalkIf(motionp,!update_result); } // allow motions to deactivate themselves @@ -838,11 +806,6 @@ void LLMotionController::updateLoadingMotions() //----------------------------------------------------------------------------- void LLMotionController::updateMotions(bool force_update) { - if (mIsSelf) - { - //dumpMotions(); - } - BOOL use_quantum = (mTimeStep != 0.f); // Always update mPrevTimerElapsed diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index b78d968e0e..c013831c83 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3243,11 +3243,11 @@ bool LLAppViewer::initCache() { LLVFile::initClass(); - llinfos << "======= Static VFS listing ========" << llendl; - gStaticVFS->listFiles(); + //llinfos << "======= Static VFS listing ========" << llendl; + //gStaticVFS->listFiles(); - llinfos << "========= regular VFS listing =====" << llendl; - gVFS->listFiles(); + //llinfos << "========= regular VFS listing =====" << llendl; + //gVFS->listFiles(); return true; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 3e6ec21017..b94fc3021c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2137,23 +2137,26 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid) static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar"); static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints"); -void dumpAnimationState(LLVOAvatar *self) +//------------------------------------------------------------------------ +// LLVOAvatar::dumpAnimationState() +//------------------------------------------------------------------------ +void LLVOAvatar::dumpAnimationState() { llinfos << "==============================================" << llendl; - for (LLVOAvatar::AnimIterator it = self->mSignaledAnimations.begin(); it != self->mSignaledAnimations.end(); ++it) + for (LLVOAvatar::AnimIterator it = mSignaledAnimations.begin(); it != mSignaledAnimations.end(); ++it) { LLUUID id = it->first; std::string playtag = ""; - if (self->mPlayingAnimations.find(id) != self->mPlayingAnimations.end()) + if (mPlayingAnimations.find(id) != mPlayingAnimations.end()) { playtag = "*"; } llinfos << animationName(id) << playtag << llendl; } - for (LLVOAvatar::AnimIterator it = self->mPlayingAnimations.begin(); it != self->mPlayingAnimations.end(); ++it) + for (LLVOAvatar::AnimIterator it = mPlayingAnimations.begin(); it != mPlayingAnimations.end(); ++it) { LLUUID id = it->first; - bool is_signaled = self->mSignaledAnimations.find(id) != self->mSignaledAnimations.end(); + bool is_signaled = mSignaledAnimations.find(id) != mSignaledAnimations.end(); if (!is_signaled) { llinfos << animationName(id) << "!S" << llendl; @@ -3079,11 +3082,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } } - if (isSelf()) - { - // dumpAnimationState(this); - } - if (gNoRender) { // Hack if we're running drones... @@ -4491,13 +4489,13 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) { LLMemType mt(LLMemType::MTYPE_AVATAR); - llinfos << "motion requested " << id.asString() << " " << animationName(id) << llendl; + lldebugs << "motion requested " << id.asString() << " " << animationName(id) << llendl; LLUUID remap_id = remapMotionID(id); if (remap_id != id) { - llinfos << "motion resultant " << remap_id.asString() << " " << animationName(remap_id) << llendl; + lldebugs << "motion resultant " << remap_id.asString() << " " << animationName(remap_id) << llendl; } if (isSelf() && remap_id == ANIM_AGENT_AWAY) @@ -4513,17 +4511,18 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) //----------------------------------------------------------------------------- BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate) { - llinfos << "motion requested " << id.asString() << " " << animationName(id) << llendl; + lldebugs << "motion requested " << id.asString() << " " << animationName(id) << llendl; LLUUID remap_id = remapMotionID(id); if (remap_id != id) { - llinfos << "motion resultant " << remap_id.asString() << " " << animationName(remap_id) << llendl; + lldebugs << "motion resultant " << remap_id.asString() << " " << animationName(remap_id) << llendl; } if (isSelf()) { + // BAP - was onAnimStop(id) originally - verify fix. gAgent.onAnimStop(remap_id); } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index f06bb458c5..bf075a199c 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -164,6 +164,7 @@ public: virtual void requestStopMotion(LLMotion* motion); LLMotion* findMotion(const LLUUID& id) const; void startDefaultMotions(); + void dumpAnimationState(); virtual LLJoint* getJoint(const std::string &name); virtual LLJoint* getRootJoint() { return &mRoot; } -- cgit v1.3 From d213946c6c8a3adda488e95e669514f6317beeb7 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 27 May 2010 17:04:48 -0400 Subject: EXT-6953 WIP - pre-push cleanup after review. Accumulated EXT-6953 commits reviewed by Nyx. --- indra/llcharacter/llanimationstates.cpp | 18 +++++++++--------- indra/llcharacter/llanimationstates.h | 7 +++++-- indra/llcharacter/llkeyframewalkmotion.cpp | 2 +- indra/llcharacter/llmotioncontroller.cpp | 2 +- indra/newview/llvoavatar.cpp | 13 ++++++------- 5 files changed, 22 insertions(+), 20 deletions(-) (limited to 'indra/llcharacter/llmotioncontroller.cpp') diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp index 879f97deec..4c24218fc3 100644 --- a/indra/llcharacter/llanimationstates.cpp +++ b/indra/llcharacter/llanimationstates.cpp @@ -412,6 +412,15 @@ void LLAnimationLibrary::animStateSetString( const LLUUID& state, const std::str mAnimMap[state] = mAnimStringTable.addString(name); } +std::string LLAnimationLibrary::animationName( const LLUUID& id ) const +{ + const char *cptr = gAnimLibrary.animStateToString(id); + if (cptr) + return std::string(cptr); + else + return std::string("[") + id.asString() + std::string("]"); +} + // Animation states that the user can trigger as part of a gesture // See struct LLAnimStateEntry in header for label location information const LLAnimStateEntry gUserAnimStates[] = { @@ -489,14 +498,5 @@ const LLAnimStateEntry gUserAnimStates[] = { const S32 gUserAnimStatesCount = LL_ARRAY_SIZE(gUserAnimStates); -std::string animationName( const LLUUID& id ) -{ - const char *cptr = gAnimLibrary.animStateToString(id); - if (cptr) - return std::string(cptr); - else - return std::string("[") + id.asString() + std::string("]"); -} - // End diff --git a/indra/llcharacter/llanimationstates.h b/indra/llcharacter/llanimationstates.h index 8b6052e0f0..59d3a7d789 100644 --- a/indra/llcharacter/llanimationstates.h +++ b/indra/llcharacter/llanimationstates.h @@ -232,6 +232,11 @@ public: // Associate an anim state with a name //----------------------------------------------------------------------------- void animStateSetString( const LLUUID& state, const std::string& name); + + //----------------------------------------------------------------------------- + // Find the name for a given animation, or UUID string if none defined. + //----------------------------------------------------------------------------- + std::string animationName( const LLUUID& id ) const; }; struct LLAnimStateEntry @@ -257,8 +262,6 @@ extern const LLAnimStateEntry gUserAnimStates[]; extern const S32 gUserAnimStatesCount; extern LLAnimationLibrary gAnimLibrary; -std::string animationName( const LLUUID& id ); - #endif // LL_LLANIMATIONSTATES_H diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index 561b26c022..f814618fc1 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -341,7 +341,7 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); if (mCharacter->getMotionController().mIsSelf) { - F32 elapsed = mCharacter->getMotionController().getFrameTimer().getElapsedTimeF32(); +// F32 elapsed = mCharacter->getMotionController().getFrameTimer().getElapsedTimeF32(); // llinfos << "PLOT elapsed: " << elapsed // << " footSlipVelocity: " << footSlipVelocity // << " mAvgCorrection: " << mAvgCorrection diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 04524dc015..78d9398c1d 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -1054,7 +1054,7 @@ void LLMotionController::dumpMotions() state_string += std::string("A"); if (mDeprecatedMotions.find(motion) != mDeprecatedMotions.end()) state_string += std::string("D"); - llinfos << animationName(id) << " " << state_string << llendl; + llinfos << gAnimLibrary.animationName(id) << " " << state_string << llendl; } } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 278bec1927..94fef1c7e5 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2191,7 +2191,7 @@ void LLVOAvatar::dumpAnimationState() { playtag = "*"; } - llinfos << animationName(id) << playtag << llendl; + llinfos << gAnimLibrary.animationName(id) << playtag << llendl; } for (LLVOAvatar::AnimIterator it = mPlayingAnimations.begin(); it != mPlayingAnimations.end(); ++it) { @@ -2199,7 +2199,7 @@ void LLVOAvatar::dumpAnimationState() bool is_signaled = mSignaledAnimations.find(id) != mSignaledAnimations.end(); if (!is_signaled) { - llinfos << animationName(id) << "!S" << llendl; + llinfos << gAnimLibrary.animationName(id) << "!S" << llendl; } } } @@ -4542,13 +4542,13 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) { LLMemType mt(LLMemType::MTYPE_AVATAR); - lldebugs << "motion requested " << id.asString() << " " << animationName(id) << llendl; + lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl; LLUUID remap_id = remapMotionID(id); if (remap_id != id) { - lldebugs << "motion resultant " << remap_id.asString() << " " << animationName(remap_id) << llendl; + lldebugs << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << llendl; } if (isSelf() && remap_id == ANIM_AGENT_AWAY) @@ -4564,18 +4564,17 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) //----------------------------------------------------------------------------- BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate) { - lldebugs << "motion requested " << id.asString() << " " << animationName(id) << llendl; + lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl; LLUUID remap_id = remapMotionID(id); if (remap_id != id) { - lldebugs << "motion resultant " << remap_id.asString() << " " << animationName(remap_id) << llendl; + lldebugs << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << llendl; } if (isSelf()) { - // BAP - was onAnimStop(id) originally - verify fix. gAgent.onAnimStop(remap_id); } -- cgit v1.3