void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake) { if (mIsAnimating) { return; } const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo(); F32 min_weight = getMinWeight(); F32 max_weight = getMaxWeight(); F32 new_weight = llclamp(weight, min_weight, max_weight); U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight); U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight); if (cur_u8 != new_u8) { mCurWeight = new_weight; if (info->mNumColors <= 0) { // This will happen when we set the default weight the first time. return; } if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. { onGlobalColorChanged(upload_bake); if (mTexLayer) { mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); } } // llinfos << "param " << mName << " = " << new_weight << llendl; } }
void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake) { if (mIsAnimating || mTexLayer == NULL) { return; } F32 min_weight = getMinWeight(); F32 max_weight = getMaxWeight(); F32 new_weight = llclamp(weight, min_weight, max_weight); U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight); U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight); if (cur_u8 != new_u8) { mCurWeight = new_weight; if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. { if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) { upload_bake = FALSE; } mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); mTexLayer->invalidateMorphMasks(); } } }
//----------------------------------------------------------------------------- // getDrivenWeight() //----------------------------------------------------------------------------- F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight) { F32 min_weight = getMinWeight(); F32 max_weight = getMaxWeight(); const LLDrivenEntryInfo* info = driven->mInfo; F32 driven_weight = 0.f; F32 driven_min = driven->mParam->getMinWeight(); F32 driven_max = driven->mParam->getMaxWeight(); if( input_weight <= info->mMin1 ) { if( info->mMin1 == info->mMax1 && info->mMin1 <= min_weight) { driven_weight = driven_max; } else { driven_weight = driven_min; } } else if( input_weight <= info->mMax1 ) { F32 t = (input_weight - info->mMin1) / (info->mMax1 - info->mMin1 ); driven_weight = driven_min + t * (driven_max - driven_min); } else if( input_weight <= info->mMax2 ) { driven_weight = driven_max; } else if( input_weight <= info->mMin2 ) { F32 t = (input_weight - info->mMax2) / (info->mMin2 - info->mMax2 ); driven_weight = driven_max + t * (driven_min - driven_max); } else { if (info->mMax2 >= max_weight) { driven_weight = driven_max; } else { driven_weight = driven_min; } } return driven_weight; }
void LLDriverParam::setWeight(F32 weight, bool upload_bake) { F32 min_weight = getMinWeight(); F32 max_weight = getMaxWeight(); if (mIsAnimating) { // allow overshoot when animating mCurWeight = weight; } else { mCurWeight = llclamp(weight, min_weight, max_weight); } // driven ________ // ^ /| |\ ^ // | / | | \ | // | / | | \ | // | / | | \ | // | / | | \ | //-------|----|-------|----|-------> driver // | min1 max1 max2 min2 for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) { LLDrivenEntry* driven = &(*iter); LLDrivenEntryInfo* info = driven->mInfo; F32 driven_weight = 0.f; F32 driven_min = driven->mParam->getMinWeight(); F32 driven_max = driven->mParam->getMaxWeight(); if (mIsAnimating) { // driven param doesn't interpolate (textures, for example) if (!driven->mParam->getAnimating()) { continue; } if( mCurWeight < info->mMin1 ) { if (info->mMin1 == min_weight) { if (info->mMin1 == info->mMax1) { driven_weight = driven_max; } else { //up slope extrapolation F32 t = (mCurWeight - info->mMin1) / (info->mMax1 - info->mMin1 ); driven_weight = driven_min + t * (driven_max - driven_min); } } else { driven_weight = driven_min; } setDrivenWeight(driven,driven_weight,upload_bake); continue; } else if ( mCurWeight > info->mMin2 ) { if (info->mMin2 == max_weight) { if (info->mMin2 == info->mMax2) { driven_weight = driven_max; } else { //down slope extrapolation F32 t = (mCurWeight - info->mMax2) / (info->mMin2 - info->mMax2 ); driven_weight = driven_max + t * (driven_min - driven_max); } } else { driven_weight = driven_min; } setDrivenWeight(driven,driven_weight,upload_bake); continue; } } driven_weight = getDrivenWeight(driven, mCurWeight); setDrivenWeight(driven,driven_weight,upload_bake); } }