/** * @file llsculptidsize.cpp * @brief LLSculptIDSize class implementation * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llsculptidsize.h" #include "llvovolume.h" #include "lldrawable.h" #include "llvoavatar.h" //........... extern LLControlGroup gSavedSettings; //........... typedef std::pair pair_iter_iter_BY_SCULPT_ID_t; //........... void _nothing_to_do_func(int) { /*nothing todo here because of the size it's a shared member*/ } void LLSculptIDSize::inc(const LLDrawable *pdrawable, int sz) { llassert(sz >= 0); if (!pdrawable) return; LLVOVolume* vvol = pdrawable->getVOVolume(); if (!vvol) return; if (!vvol->isAttachment()) return; if (!vvol->getAvatar()) return; if (vvol->getAvatar()->isSelf()) return; LLVolume *vol = vvol->getVolume(); if (!vol) return; const LLUUID &sculptId = vol->getParams().getSculptID(); if (sculptId.isNull()) return; unsigned int total_size = 0; pair_iter_iter_BY_SCULPT_ID_t itLU = mSizeInfo.get().equal_range(sculptId); if (itLU.first == itLU.second) { //register //llassert(mSizeInfo.get().end() == mSizeInfo.get().find(pdrawable)); mSizeInfo.get().insert(Info(pdrawable, sz, std::make_shared(sz), sculptId)); total_size = sz; } else { //update + register Info &nfo = const_cast(*itLU.first); //calc new size total_size = nfo.getSizeSum() + sz; nfo.mSharedSizeSum->mSizeSum = total_size; nfo.mSize = sz; //update size for all LLDrwable in range of sculptId for (pair_iter_iter_BY_SCULPT_ID_t::first_type it = itLU.first; it != itLU.second; ++it) { mSizeInfo.get().modify_key(mSizeInfo.project(it), boost::bind(&_nothing_to_do_func, _1)); } //trying insert the LLDrawable mSizeInfo.get().insert(Info(pdrawable, sz, nfo.mSharedSizeSum, sculptId)); } } void LLSculptIDSize::dec(const LLDrawable *pdrawable) { container_BY_DRAWABLE_view::iterator it = mSizeInfo.get().find(pdrawable); if (mSizeInfo.get().end() == it) return; unsigned int size = it->getSizeSum() - it->getSize(); if (0 == size) { mSizeInfo.get().erase(it->getSculptId()); } else { Info &nfo = const_cast(*it); nfo.mSize = 0; pair_iter_iter_BY_SCULPT_ID_t itLU = mSizeInfo.get().equal_range(it->getSculptId()); it->mSharedSizeSum->mSizeSum = size; for (pair_iter_iter_BY_SCULPT_ID_t::first_type it = itLU.first; it != itLU.second; ++it) { mSizeInfo.get().modify_key(mSizeInfo.project(it), boost::bind(&_nothing_to_do_func, _1)); } } } void LLSculptIDSize::rem(const LLUUID &sculptId) { mSizeInfo.get().erase(sculptId); } void LLSculptIDSize::resetSizeSum(const LLUUID &sculptId) { const pair_iter_iter_BY_SCULPT_ID_t itLU = mSizeInfo.get().equal_range(sculptId); if (itLU.first != itLU.second) { itLU.first->mSharedSizeSum->mSizeSum = 0; } for (pair_iter_iter_BY_SCULPT_ID_t::first_type it = itLU.first, itE = itLU.second; it != itE; ++it) { mSizeInfo.get().modify_key(mSizeInfo.project(it), boost::bind(&_nothing_to_do_func, _1)); } }