00001 
00032 
00033 
00034 
00035 #include "linden_common.h"
00036 
00037 #include "llvisualparam.h"
00038 
00039 
00040 
00041 
00042 LLVisualParamInfo::LLVisualParamInfo()
00043         :
00044         mID( -1 ),
00045         mGroup( VISUAL_PARAM_GROUP_TWEAKABLE ),
00046         mMinWeight( 0.f ),
00047         mMaxWeight( 1.f ),
00048         mDefaultWeight( 0.f ),
00049         mSex( SEX_BOTH )
00050 {
00051 }
00052 
00053 
00054 
00055 
00056 BOOL LLVisualParamInfo::parseXml(LLXmlTreeNode *node)
00057 {
00058         
00059         static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id");
00060         node->getFastAttributeS32( id_string, mID );
00061         
00062         
00063         U32 group = 0;
00064         static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group");
00065         if( node->getFastAttributeU32( group_string, group ) )
00066         {
00067                 if( group < NUM_VISUAL_PARAM_GROUPS )
00068                 {
00069                         mGroup = (EVisualParamGroup)group;
00070                 }
00071         }
00072 
00073         
00074         static LLStdStringHandle value_min_string = LLXmlTree::addAttributeString("value_min");
00075         static LLStdStringHandle value_max_string = LLXmlTree::addAttributeString("value_max");
00076         node->getFastAttributeF32( value_min_string, mMinWeight );
00077         node->getFastAttributeF32( value_max_string, mMaxWeight );
00078 
00079         
00080         F32 default_weight = 0;
00081         static LLStdStringHandle value_default_string = LLXmlTree::addAttributeString("value_default");
00082         if( node->getFastAttributeF32( value_default_string, default_weight ) )
00083         {
00084                 mDefaultWeight = llclamp( default_weight, mMinWeight, mMaxWeight );
00085                 if( default_weight != mDefaultWeight )
00086                 {
00087                         llwarns << "value_default attribute is out of range in node " << mName << " " << default_weight << llendl;
00088                 }
00089         }
00090         
00091         
00092         LLString sex = "both";
00093         static LLStdStringHandle sex_string = LLXmlTree::addAttributeString("sex");
00094         node->getFastAttributeString( sex_string, sex ); 
00095         if( sex == "both" )
00096         {
00097                 mSex = SEX_BOTH;
00098         }
00099         else if( sex == "male" )
00100         {
00101                 mSex = SEX_MALE;
00102         }
00103         else if( sex == "female" )
00104         {
00105                 mSex = SEX_FEMALE;
00106         }
00107         else
00108         {
00109                 llwarns << "Avatar file: <param> has invalid sex attribute: " << sex << llendl;
00110                 return FALSE;
00111         }
00112         
00113         
00114         static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
00115         if( !node->getFastAttributeString( name_string, mName ) )
00116         {
00117                 llwarns << "Avatar file: <param> is missing name attribute" << llendl;
00118                 return FALSE;
00119         }
00120 
00121         
00122         static LLStdStringHandle label_string = LLXmlTree::addAttributeString("label");
00123         if( !node->getFastAttributeString( label_string, mDisplayName ) )
00124         {
00125                 mDisplayName = mName;
00126         }
00127 
00128         
00129         
00130         LLString::toLower(mName);
00131 
00132         
00133         static LLStdStringHandle label_min_string = LLXmlTree::addAttributeString("label_min");
00134         if( !node->getFastAttributeString( label_min_string, mMinName ) )
00135         {
00136                 mMinName = "Less";
00137         }
00138 
00139         
00140         static LLStdStringHandle label_max_string = LLXmlTree::addAttributeString("label_max");
00141         if( !node->getFastAttributeString( label_max_string, mMaxName ) )
00142         {
00143                 mMaxName = "More";
00144         }
00145 
00146         return TRUE;
00147 }
00148 
00149 
00150 
00151 
00152 LLVisualParam::LLVisualParam()  
00153         :
00154         mCurWeight( 0.f ),
00155         mLastWeight( 0.f ),
00156         mNext( NULL ),
00157         mTargetWeight( 0.f ),
00158         mIsAnimating( FALSE ),
00159         mID( -1 ),
00160         mInfo( 0 )
00161 {
00162 }
00163 
00164 
00165 
00166 
00167 LLVisualParam::~LLVisualParam()
00168 {
00169         delete mNext;
00170 }
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 void LLVisualParam::setWeight(F32 weight, BOOL set_by_user)
00212 {
00213         if (mIsAnimating)
00214         {
00215                 
00216                 mCurWeight = weight;
00217         }
00218         else if (mInfo)
00219         {
00220                 mCurWeight = llclamp(weight, mInfo->mMinWeight, mInfo->mMaxWeight);
00221         }
00222         else
00223         {
00224                 mCurWeight = weight;
00225         }
00226         
00227         if (mNext)
00228         {
00229                 mNext->setWeight(weight, set_by_user);
00230         }
00231 }
00232 
00233 
00234 
00235 
00236 void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
00237 {
00238         if (mInfo)
00239         {
00240                 if (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
00241                 {
00242                         mTargetWeight = llclamp(target_value, mInfo->mMinWeight, mInfo->mMaxWeight);
00243                 }
00244         }
00245         else
00246         {
00247                 mTargetWeight = target_value;
00248         }
00249         mIsAnimating = TRUE;
00250 
00251         if (mNext)
00252         {
00253                 mNext->setAnimationTarget(target_value, set_by_user);
00254         }
00255 }
00256 
00257 
00258 
00259 
00260 void LLVisualParam::setNextParam( LLVisualParam *next )
00261 {
00262         llassert(!mNext);
00263 
00264         mNext = next;
00265 }
00266 
00267 
00268 
00269 
00270 void LLVisualParam::animate( F32 delta, BOOL set_by_user )
00271 {
00272         if (mIsAnimating)
00273         {
00274                 F32 new_weight = ((mTargetWeight - mCurWeight) * delta) + mCurWeight;
00275                 setWeight(new_weight, set_by_user);
00276         }
00277 }
00278 
00279 
00280 
00281 
00282 void LLVisualParam::stopAnimating(BOOL set_by_user)
00283 { 
00284         if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
00285         {
00286                 mIsAnimating = FALSE; 
00287                 setWeight(mTargetWeight, set_by_user);
00288         }
00289 }