BOOL LLDriverParam::setInfo(LLDriverParamInfo *info) { llassert(mInfo == NULL); if (info->mID < 0) return FALSE; mInfo = info; mID = info->mID; setWeight(getDefaultWeight(), FALSE ); LLDriverParamInfo::entry_info_list_t::iterator iter; mDriven.reserve(getInfo()->mDrivenInfoList.size()); for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); iter++) { LLDrivenEntryInfo *driven_info = &(*iter); S32 driven_id = driven_info->mDrivenID; LLViewerVisualParam* param = (LLViewerVisualParam*)mAvatarp->getVisualParam( driven_id ); if (param) { mDriven.push_back(LLDrivenEntry( param, driven_info )); } else { llerrs << "<driven> Unable to resolve driven parameter: " << driven_id << llendl; mInfo = NULL; return FALSE; } } return TRUE; }
/*virtual*/ BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params) { BOOL success = TRUE; LLDriverParamInfo::entry_info_list_t::iterator iter; for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); ++iter) { LLDrivenEntryInfo *driven_info = &(*iter); S32 driven_id = driven_info->mDrivenID; // check for already existing links. Do not overwrite. BOOL found = FALSE; for (entry_list_t::iterator driven_iter = mDriven.begin(); driven_iter != mDriven.end() && !found; ++driven_iter) { if (driven_iter->mInfo->mDrivenID == driven_id) { found = TRUE; } } if (!found) { LLViewerVisualParam* param = (LLViewerVisualParam*)mapper(driven_id); if (param) param->setParamLocation(this->getParamLocation()); bool push = param && (!only_cross_params || param->getCrossWearable()); if (push) { mDriven.push_back(LLDrivenEntry( param, driven_info )); } else { success = FALSE; } } } return success; }