diff --git a/indra/newview/ao.cpp b/indra/newview/ao.cpp index f83413ef0d..a5e7513885 100644 --- a/indra/newview/ao.cpp +++ b/indra/newview/ao.cpp @@ -146,6 +146,7 @@ BOOL FloaterAO::postBuild() mMoveUpButton=aoPanel->getChild("ao_move_up"); mMoveDownButton=aoPanel->getChild("ao_move_down"); mTrashButton=aoPanel->getChild("ao_trash"); + mCycleCheckBox=aoPanel->getChild("ao_cycle"); mRandomizeCheckBox=aoPanel->getChild("ao_randomize"); mCycleTimeTextLabel=aoPanel->getChild("ao_cycle_time_seconds_label"); mCycleTimeSpinner=aoPanel->getChild("ao_cycle_time"); @@ -173,6 +174,7 @@ BOOL FloaterAO::postBuild() mMoveUpButton->setCommitCallback(boost::bind(&FloaterAO::onClickMoveUp,this)); mMoveDownButton->setCommitCallback(boost::bind(&FloaterAO::onClickMoveDown,this)); mTrashButton->setCommitCallback(boost::bind(&FloaterAO::onClickTrash,this)); + mCycleCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckCycle,this)); mRandomizeCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckRandomize,this)); mCycleTimeSpinner->setCommitCallback(boost::bind(&FloaterAO::onChangeCycleTime,this)); @@ -205,9 +207,15 @@ void FloaterAO::enableStateControls(BOOL yes) { mStateSelector->setEnabled(yes); mAnimationList->setEnabled(yes); - mRandomizeCheckBox->setEnabled(yes); - mCycleTimeTextLabel->setEnabled(yes); - mCycleTimeSpinner->setEnabled(yes); + mCycleCheckBox->setEnabled(yes); + if(yes) + updateCycleParameters(); + else + { + mRandomizeCheckBox->setEnabled(yes); + mCycleTimeTextLabel->setEnabled(yes); + mCycleTimeSpinner->setEnabled(yes); + } mPreviousButton->setEnabled(yes); mNextButton->setEnabled(yes); mCanDragAndDrop=yes; @@ -285,8 +293,11 @@ void FloaterAO::onSelectState() item->setUserdata(&mSelectedState->mAnimations[index].mInventoryUUID); } + mCycleCheckBox->setValue(mSelectedState->mCycle); mRandomizeCheckBox->setValue(mSelectedState->mRandom); mCycleTimeSpinner->setValue(mSelectedState->mCycleTime); + + updateCycleParameters(); } void FloaterAO::onClickReload() @@ -470,6 +481,24 @@ void FloaterAO::onClickTrash() mAnimationList->deleteSelectedItems(); } +void FloaterAO::updateCycleParameters() +{ + BOOL yes=mCycleCheckBox->getValue().asBoolean(); + mRandomizeCheckBox->setEnabled(yes); + mCycleTimeTextLabel->setEnabled(yes); + mCycleTimeSpinner->setEnabled(yes); +} + +void FloaterAO::onCheckCycle() +{ + if(mSelectedState) + { + BOOL yes=mCycleCheckBox->getValue().asBoolean(); + AOEngine::instance().setCycle(mSelectedState,yes); + updateCycleParameters(); + } +} + void FloaterAO::onCheckRandomize() { if(mSelectedState) diff --git a/indra/newview/ao.h b/indra/newview/ao.h index 603dae0dc1..f5d39a59df 100644 --- a/indra/newview/ao.h +++ b/indra/newview/ao.h @@ -75,12 +75,14 @@ class FloaterAO void onClickMoveUp(); void onClickMoveDown(); void onClickTrash(); + void onCheckCycle(); void onCheckRandomize(); void onChangeCycleTime(); void onClickPrevious(); void onClickNext(); void updateSmart(); + void updateCycleParameters(); void enableSetControls(BOOL yes); void enableStateControls(BOOL yes); @@ -106,6 +108,7 @@ class FloaterAO LLButton* mMoveUpButton; LLButton* mMoveDownButton; LLButton* mTrashButton; + LLCheckBoxCtrl* mCycleCheckBox; LLCheckBoxCtrl* mRandomizeCheckBox; LLTextBox* mCycleTimeTextLabel; LLSpinCtrl* mCycleTimeSpinner; diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp index 52ac3a3d25..55d59cf2bf 100644 --- a/indra/newview/aoengine.cpp +++ b/indra/newview/aoengine.cpp @@ -806,7 +806,12 @@ void AOEngine::update() state->mInventoryUUID=stateCategories->get(index)->getUUID(); for(S32 num=1;nummCycle=TRUE; + lldebugs << "Cycle on" << llendl; + } + else if(params[num]=="RN") { state->mRandom=TRUE; lldebugs << "Random on" << llendl; @@ -976,6 +981,8 @@ void AOEngine::saveState(const AOSet::AOState* state) timeStr << ":CT" << state->mCycleTime; stateParams+=timeStr.str(); } + if(state->mCycle) + stateParams+=":CY"; if(state->mRandom) stateParams+=":RN"; @@ -1103,6 +1110,12 @@ void AOEngine::setDisableStands(AOSet* set,BOOL yes) inMouselook(!mInMouselook); } +void AOEngine::setCycle(AOSet::AOState* state,BOOL yes) +{ + state->mCycle=yes; + state->mDirty=TRUE; +} + void AOEngine::setRandomize(AOSet::AOState* state,BOOL yes) { state->mRandom=yes; diff --git a/indra/newview/aoengine.h b/indra/newview/aoengine.h index cac7e232c2..2abed0c8ac 100644 --- a/indra/newview/aoengine.h +++ b/indra/newview/aoengine.h @@ -137,6 +137,7 @@ class AOEngine void setOverrideSits(AOSet* set,BOOL yes); void setSmart(AOSet* set,BOOL yes); void setDisableStands(AOSet* set,BOOL yes); + void setCycle(AOSet::AOState* set,BOOL yes); void setRandomize(AOSet::AOState* state,BOOL yes); void setCycleTime(AOSet::AOState* state,F32 time); diff --git a/indra/newview/aoset.cpp b/indra/newview/aoset.cpp index f8df56b820..436c53d00e 100644 --- a/indra/newview/aoset.cpp +++ b/indra/newview/aoset.cpp @@ -106,8 +106,9 @@ AOSet::AOSet(const LLUUID inventoryID) mStates[index].mRemapID=stateUUIDs[index]; mStates[index].mInventoryUUID=LLUUID::null; mStates[index].mCurrentAnimationID=LLUUID::null; - mStates[index].mCycleTime=0.0f; + mStates[index].mCycle=FALSE; mStates[index].mRandom=FALSE; + mStates[index].mCycleTime=0.0f; mStates[index].mDirty=FALSE; mStateNames.push_back(stateNames[index]); } @@ -155,24 +156,27 @@ LLUUID AOSet::getAnimationForState(AOState* state) S32 numOfAnimations=state->mAnimations.size(); if(numOfAnimations) { - if(state->mRandom) + if(state->mCycle) { - state->mCurrentAnimation=ll_frand()*numOfAnimations; - lldebugs << "randomly chosen " << state->mCurrentAnimation << " of " << numOfAnimations << llendl; - } - else - { - state->mCurrentAnimation++; - if(state->mCurrentAnimation>=state->mAnimations.size()) - state->mCurrentAnimation=0; - lldebugs << "cycle " << state->mCurrentAnimation << " of " << numOfAnimations << llendl; + if(state->mRandom) + { + state->mCurrentAnimation=ll_frand()*numOfAnimations; + lldebugs << "randomly chosen " << state->mCurrentAnimation << " of " << numOfAnimations << llendl; + } + else + { + state->mCurrentAnimation++; + if(state->mCurrentAnimation>=state->mAnimations.size()) + state->mCurrentAnimation=0; + lldebugs << "cycle " << state->mCurrentAnimation << " of " << numOfAnimations << llendl; + } } return state->mAnimations[state->mCurrentAnimation].mAssetUUID; } else lldebugs << "animation state has no animations assigned" << llendl; } - return LLUUID(); + return LLUUID::null; } void AOSet::startTimer(F32 timeout) diff --git a/indra/newview/aoset.h b/indra/newview/aoset.h index 178410e083..6c4b46e83c 100644 --- a/indra/newview/aoset.h +++ b/indra/newview/aoset.h @@ -78,6 +78,7 @@ class AOSet { std::string mName; LLUUID mRemapID; + BOOL mCycle; BOOL mRandom; S32 mCycleTime; std::vector mAnimations; diff --git a/indra/newview/skins/default/xui/en/panel_ao.xml b/indra/newview/skins/default/xui/en/panel_ao.xml index d67f263d03..991d6334af 100644 --- a/indra/newview/skins/default/xui/en/panel_ao.xml +++ b/indra/newview/skins/default/xui/en/panel_ao.xml @@ -169,12 +169,22 @@ layout="topleft" /> + +