llappearance merge
This commit is contained in:
@@ -489,25 +489,6 @@ void LLAvatarAppearance::computeBodySize()
|
|||||||
mAvatarOffset.mV[VX] = 0.0f;
|
mAvatarOffset.mV[VX] = 0.0f;
|
||||||
mAvatarOffset.mV[VY] = 0.0f;
|
mAvatarOffset.mV[VY] = 0.0f;
|
||||||
|
|
||||||
// Certain configurations of avatars can force the overall height (with offset) to go negative.
|
|
||||||
// Enforce a constraint to make sure we don't go below 0.1 meters.
|
|
||||||
// Camera positioning and other things start to break down when your avatar is "walking" while being fully underground
|
|
||||||
if (new_body_size.mV[VZ] + mAvatarOffset.mV[VZ] < 0.1f)
|
|
||||||
{
|
|
||||||
mAvatarOffset.mV[VZ] = -(new_body_size.mV[VZ] - 0.11f); // avoid floating point rounding making the above check continue to fail.
|
|
||||||
|
|
||||||
llassert(new_body_size.mV[VZ] + mAvatarOffset.mV[VZ] >= 0.1f);
|
|
||||||
|
|
||||||
if (mWearableData && isSelf())
|
|
||||||
{
|
|
||||||
LLWearable* shape = mWearableData->getWearable(LLWearableType::WT_SHAPE, 0);
|
|
||||||
if (shape)
|
|
||||||
{
|
|
||||||
shape->setVisualParamWeight(AVATAR_HOVER, mAvatarOffset.mV[VZ], false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_body_size != mBodySize || old_offset != mAvatarOffset)
|
if (new_body_size != mBodySize || old_offset != mAvatarOffset)
|
||||||
{
|
{
|
||||||
mBodySize = new_body_size;
|
mBodySize = new_body_size;
|
||||||
|
|||||||
@@ -212,6 +212,7 @@ LLAvatarAppearanceDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,
|
|||||||
LLWearableType::EType t = (LLWearableType::EType)va_arg(argp,int);
|
LLWearableType::EType t = (LLWearableType::EType)va_arg(argp,int);
|
||||||
mWearables.push_back(t);
|
mWearables.push_back(t);
|
||||||
}
|
}
|
||||||
|
va_end(argp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
|
|||||||
@@ -680,8 +680,8 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
|
|||||||
if (!mMorphData)
|
if (!mMorphData)
|
||||||
{
|
{
|
||||||
const std::string driven_tag = "_Driven";
|
const std::string driven_tag = "_Driven";
|
||||||
U32 pos = morph_param_name.find(driven_tag);
|
size_t pos = morph_param_name.find(driven_tag);
|
||||||
if (pos > 0)
|
if (pos != std::string::npos)
|
||||||
{
|
{
|
||||||
morph_param_name = morph_param_name.substr(0,pos);
|
morph_param_name = morph_param_name.substr(0,pos);
|
||||||
mMorphData = mMesh->getMorphData(morph_param_name);
|
mMorphData = mMesh->getMorphData(morph_param_name);
|
||||||
|
|||||||
@@ -1557,13 +1557,13 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
|||||||
}
|
}
|
||||||
|
|
||||||
U32 cache_index = alpha_mask_crc.getCRC();
|
U32 cache_index = alpha_mask_crc.getCRC();
|
||||||
U8* alpha_data = NULL;//get_if_there(mAlphaCache,cache_index,(U8*)NULL);
|
U8* alpha_data = NULL;
|
||||||
// We believe we need to generate morph masks, do not assume that the cached version is accurate.
|
// We believe we need to generate morph masks, do not assume that the cached version is accurate.
|
||||||
// We can get bad morph masks during login, on minimize, and occasional gl errors.
|
// We can get bad morph masks during login, on minimize, and occasional gl errors.
|
||||||
// We should only be doing this when we believe something has changed with respect to the user's appearance.
|
// We should only be doing this when we believe something has changed with respect to the user's appearance.
|
||||||
//if (!alpha_data)
|
|
||||||
{
|
{
|
||||||
// clear out a slot if we have filled our cache
|
LL_DEBUGS("Avatar") << "gl alpha cache of morph mask not found, doing readback: " << getName() << LL_ENDL;
|
||||||
|
// clear out a slot if we have filled our cache
|
||||||
S32 max_cache_entries = getTexLayerSet()->getAvatarAppearance()->isSelf() ? 4 : 1;
|
S32 max_cache_entries = getTexLayerSet()->getAvatarAppearance()->isSelf() ? 4 : 1;
|
||||||
while ((S32)mAlphaCache.size() >= max_cache_entries)
|
while ((S32)mAlphaCache.size() >= max_cache_entries)
|
||||||
{
|
{
|
||||||
@@ -1573,8 +1573,12 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
|||||||
mAlphaCache.erase(iter2);
|
mAlphaCache.erase(iter2);
|
||||||
}
|
}
|
||||||
alpha_data = new U8[width * height];
|
alpha_data = new U8[width * height];
|
||||||
|
U8* pixels_tmp = new U8[width * height * 4];
|
||||||
|
glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels_tmp);
|
||||||
|
for (int i = 0; i < width * height; ++i)
|
||||||
|
alpha_data[i] = pixels_tmp[i * 4 + 3];
|
||||||
|
delete[] pixels_tmp;
|
||||||
mAlphaCache[cache_index] = alpha_data;
|
mAlphaCache[cache_index] = alpha_data;
|
||||||
glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTexLayerSet()->getAvatarAppearance()->dirtyMesh();
|
getTexLayerSet()->getAvatarAppearance()->dirtyMesh();
|
||||||
@@ -1783,13 +1787,11 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const
|
|||||||
/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
|
/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
|
||||||
{
|
{
|
||||||
U32 num_wearables = updateWearableCache();
|
U32 num_wearables = updateWearableCache();
|
||||||
for (U32 i = 0; i < num_wearables; i++)
|
U32 i = num_wearables - 1; // For rendering morph masks, we only want to use the top wearable
|
||||||
|
LLTexLayer *layer = getLayer(i);
|
||||||
|
if (layer)
|
||||||
{
|
{
|
||||||
LLTexLayer *layer = getLayer(i);
|
layer->addAlphaMask(data, originX, originY, width, height);
|
||||||
if (layer)
|
|
||||||
{
|
|
||||||
layer->addAlphaMask(data, originX, originY, width, height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -178,8 +178,9 @@ bool LLWearableData::swapWearables(const LLWearableType::EType type, U32 index_a
|
|||||||
}
|
}
|
||||||
|
|
||||||
wearableentry_vec_t& wearable_vec = wearable_iter->second;
|
wearableentry_vec_t& wearable_vec = wearable_iter->second;
|
||||||
if (0 > index_a || index_a >= wearable_vec.size()) return false;
|
// removed 0 > index_a and index_b comparisions - can never be true
|
||||||
if (0 > index_b || index_b >= wearable_vec.size()) return false;
|
if (index_a >= wearable_vec.size()) return false;
|
||||||
|
if (index_b >= wearable_vec.size()) return false;
|
||||||
|
|
||||||
LLWearable* wearable = wearable_vec[index_a];
|
LLWearable* wearable = wearable_vec[index_a];
|
||||||
wearable_vec[index_a] = wearable_vec[index_b];
|
wearable_vec[index_a] = wearable_vec[index_b];
|
||||||
|
|||||||
Reference in New Issue
Block a user