From 76c8494525b8e2b17bbe61f0bde61645b825bb66 Mon Sep 17 00:00:00 2001 From: Armin Weatherwax Date: Sat, 29 Jan 2011 15:50:28 +0100 Subject: Update: Henri Beauchamp: Port of SG-2.0 alpha and tattoo layers v6->v9 issue tattoo tinting does not work --- linden/indra/llcharacter/llcharacter.cpp | 4 +- linden/indra/llcharacter/llcharacter.h | 14 +++++++ linden/indra/llcharacter/llvisualparam.cpp | 4 +- linden/indra/llcharacter/llvisualparam.h | 2 + linden/indra/newview/llagent.cpp | 2 +- linden/indra/newview/llfloatercustomize.cpp | 8 ++-- linden/indra/newview/lltexlayer.cpp | 45 ++++++++-------------- linden/indra/newview/llvoavatar.cpp | 29 +++++++------- linden/indra/newview/llwearable.cpp | 14 +++---- .../skins/default/xui/en-us/floater_customize.xml | 6 ++- .../xui/en-us/floater_new_outfit_dialog.xml | 4 +- 11 files changed, 70 insertions(+), 62 deletions(-) (limited to 'linden') diff --git a/linden/indra/llcharacter/llcharacter.cpp b/linden/indra/llcharacter/llcharacter.cpp index 46ac326..72cef83 100644 --- a/linden/indra/llcharacter/llcharacter.cpp +++ b/linden/indra/llcharacter/llcharacter.cpp @@ -379,7 +379,7 @@ void LLCharacter::clearVisualParamWeights() param; param = getNextVisualParam()) { - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (param->isTweakable()) { param->setWeight( param->getDefaultWeight(), FALSE ); } @@ -395,7 +395,7 @@ BOOL LLCharacter::visualParamWeightsAreDefault() param; param = getNextVisualParam()) { - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (param->isTweakable()) { if (param->getWeight() != param->getDefaultWeight()) return false; diff --git a/linden/indra/llcharacter/llcharacter.h b/linden/indra/llcharacter/llcharacter.h index d91124b..7630760 100644 --- a/linden/indra/llcharacter/llcharacter.h +++ b/linden/indra/llcharacter/llcharacter.h @@ -231,6 +231,20 @@ public: return (mCurIterator++)->second; } + S32 getVisualParamCountInGroup(EVisualParamGroup group) + { + S32 rtn = 0; + VisualParamIndexMap_t::iterator iter; + for (iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++) + { + if (iter->second->getGroup() == group) + { + rtn++; + } + } + return rtn; + } + LLVisualParam* getVisualParam(S32 id) { VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.find(id); diff --git a/linden/indra/llcharacter/llvisualparam.cpp b/linden/indra/llcharacter/llvisualparam.cpp index d7a144e..9579ff8 100644 --- a/linden/indra/llcharacter/llvisualparam.cpp +++ b/linden/indra/llcharacter/llvisualparam.cpp @@ -238,7 +238,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user) { if (mInfo) { - if (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (isTweakable()) { mTargetWeight = llclamp(target_value, mInfo->mMinWeight, mInfo->mMaxWeight); } @@ -282,7 +282,7 @@ void LLVisualParam::animate( F32 delta, BOOL set_by_user ) //----------------------------------------------------------------------------- void LLVisualParam::stopAnimating(BOOL set_by_user) { - if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (mIsAnimating && isTweakable()) { mIsAnimating = FALSE; setWeight(mTargetWeight, set_by_user); diff --git a/linden/indra/llcharacter/llvisualparam.h b/linden/indra/llcharacter/llvisualparam.h index 3a0c1bb..8ec5497 100644 --- a/linden/indra/llcharacter/llvisualparam.h +++ b/linden/indra/llcharacter/llvisualparam.h @@ -51,6 +51,7 @@ enum EVisualParamGroup { VISUAL_PARAM_GROUP_TWEAKABLE, VISUAL_PARAM_GROUP_ANIMATABLE, + VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT, NUM_VISUAL_PARAM_GROUPS }; @@ -140,6 +141,7 @@ public: virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating; } BOOL getAnimating() { return mIsAnimating; } + BOOL isTweakable() { return (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) || (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT); } protected: F32 mCurWeight; // current weight diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp index 5a1700a..515d588 100644 --- a/linden/indra/newview/llagent.cpp +++ b/linden/indra/newview/llagent.cpp @@ -7488,7 +7488,7 @@ void LLAgent::sendAgentSetAppearance() param; param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam()) { - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) // do not transmit params of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT { msg->nextBlockFast(_PREHASH_VisualParam ); diff --git a/linden/indra/newview/llfloatercustomize.cpp b/linden/indra/newview/llfloatercustomize.cpp index db51556..21dfc36 100644 --- a/linden/indra/newview/llfloatercustomize.cpp +++ b/linden/indra/newview/llfloatercustomize.cpp @@ -448,9 +448,7 @@ LLPanelEditWearable::LLPanelEditWearable( EWearableType type ) BOOL LLPanelEditWearable::postBuild() { LLAssetType::EType asset_type = LLWearable::typeToAssetType( mType ); - std::string icon_name = (asset_type == LLAssetType::AT_CLOTHING ? - "inv_item_clothing.tga" : - "inv_item_skin.tga" ); + std::string icon_name = get_item_icon_name(asset_type, LLInventoryType::IT_WEARABLE, mType, FALSE); childSetValue("icon", icon_name); childSetAction("Create New", LLPanelEditWearable::onBtnCreateNew, this ); @@ -553,7 +551,7 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart ) param = (LLViewerVisualParam *)avatar->getNextVisualParam()) { if (param->getID() == -1 - || param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE + || !param->isTweakable() || param->getEditGroup() != part->mEditGroup || !(param->getSex() & avatar_sex)) { @@ -763,7 +761,6 @@ void LLPanelEditWearable::onColorCommit( LLUICtrl* ctrl, void* userdata ) } } - void LLPanelEditWearable::initPreviousTextureList() { initPreviousTextureListEntry(TEX_LOWER_ALPHA); @@ -2338,6 +2335,7 @@ void LLFloaterCustomize::initWearablePanels() panel->addTextureDropTarget(TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE); + panel->addColorSwatch(TEX_LOWER_TATTOO, "Color/Tint"); } } diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp index c8e1298..139b1b0 100644 --- a/linden/indra/newview/lltexlayer.cpp +++ b/linden/indra/newview/lltexlayer.cpp @@ -211,8 +211,9 @@ void LLTexLayerSetBuffer::popProjection() BOOL LLTexLayerSetBuffer::needsRender() { LLVOAvatar* avatar = mTexLayerSet->getAvatar(); - BOOL upload_now = needsUploadNow(); + BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal() && gAgent.mNumPendingQueries == 0; BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating; + if (needs_update) { BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT); @@ -275,16 +276,14 @@ BOOL LLTexLayerSetBuffer::render() } else { - // mUploadPending = FALSE;//see... - // mNeedsUpload = FALSE;// ...below... + mUploadPending = FALSE; + mNeedsUpload = FALSE; LLVOAvatar* avatar = mTexLayerSet->getAvatar(); if (avatar) { avatar->setNewBakedTexture(avatar->getBakedTE(mTexLayerSet), IMG_INVISIBLE); llinfos << "Invisible baked texture set for " << mTexLayerSet->getBodyRegion() << llendl; } - readBackAndUpload(); //... here: Opensim is not happy if we don't - //TODO: find out if SL is happy if we do } } } @@ -350,12 +349,11 @@ void LLTexLayerSetBuffer::readBackAndUpload() // writes into baked_color_data const char* comment_text = NULL; - S32 baked_image_components = 5; // red green blue bump clothing + S32 baked_image_components = 5; // red green blue bump clothing LLPointer baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components ); U8* baked_image_data = baked_image->getData(); comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask - S32 i = 0; for (S32 u = 0; u < mWidth; u++) { @@ -458,7 +456,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (avatar && !avatar->isDead() && + if (0 == result && avatar && !avatar->isDead() && baked_upload_data && baked_upload_data->mAvatar == avatar && // Sanity check: only the user's avatar should be uploading textures. baked_upload_data->mLayerSet->hasComposite()) @@ -492,22 +490,11 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user avatar->setNewBakedTexture(baked_te, uuid); } else - { - ++failures; - llinfos << "Baked upload failed (attempt " << failures << "/" << MAX_BAKE_UPLOAD_ATTEMPTS << "), "; - if (failures >= MAX_BAKE_UPLOAD_ATTEMPTS) - { - llcont << "giving up."; - } - else - { - const F32 delay = 5.f; - llcont << llformat("retrying in %.2f seconds.", delay); - layerset_buffer->mUploadFailCount = failures; - layerset_buffer->requestDelayedUpload((U64)(delay * 1000000)); - } - llcont << llendl; - } + { + // Avatar appearance is changing, ignore the upload results + llinfos << "Baked upload failed. Reason: " << result << llendl; + // *FIX: retry upload after n seconds, asset server could be busy + } } else { @@ -1412,7 +1399,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); - gGL.getTexUnit(0)->bind(image_gl); + gGL.getTexUnit(0)->bind(image_gl, TRUE); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gl_rect_2d_simple_tex( width, height ); @@ -1430,7 +1417,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); if( image_gl ) { - gGL.getTexUnit(0)->bind(image_gl); + gGL.getTexUnit(0)->bind(image_gl, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -1656,7 +1643,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); - gGL.getTexUnit(0)->bind(image_gl); + gGL.getTexUnit(0)->bind(image_gl, TRUE); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gl_rect_2d_simple_tex( width, height ); @@ -1678,7 +1665,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) { LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(image_gl); + gGL.getTexUnit(0)->bind(image_gl, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -2146,7 +2133,7 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height ) } LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(mCachedProcessedImageGL); + gGL.getTexUnit(0)->bind(mCachedProcessedImageGL, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); stop_glerror(); diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp index d68c587..90fb936 100644 --- a/linden/indra/newview/llvoavatar.cpp +++ b/linden/indra/newview/llvoavatar.cpp @@ -2890,7 +2890,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation() param; param = getNextVisualParam()) { - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (param->isTweakable()) { param->stopAnimating(mAppearanceAnimSetByUser); } @@ -2922,7 +2922,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation() param; param = getNextVisualParam()) { - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + if (param->isTweakable()) { // so boobs don't go spastic when a shape's changed, but still seems buggy //if(param->getID() != 507) @@ -4875,6 +4875,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked && !LLDrawPoolAvatar::sSkipTransparent; + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); if (should_alpha_mask) @@ -4990,7 +4991,6 @@ U32 LLVOAvatar::renderRigid() && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked && !LLDrawPoolAvatar::sSkipTransparent; - LLGLState test(GL_ALPHA_TEST, should_alpha_mask); if (should_alpha_mask) @@ -8202,6 +8202,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] ) param_name[2] = "skirt_blue"; break; + case TEX_HEAD_TATTOO: + case TEX_LOWER_TATTOO: + case TEX_UPPER_TATTOO: + param_name[0] = "tattoo_red"; + param_name[1] = "tattoo_green"; + param_name[2] = "tattoo_blue"; + break; + default: llassert(0); return FALSE; @@ -8661,7 +8669,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) { for( S32 i = 0; i < num_blocks; i++ ) { - while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) + while (param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE)) // should not be any of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT { param = getNextVisualParam(); } @@ -8710,14 +8718,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } } - while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) + S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT + if (num_blocks != expected_tweakable_count) { - param = getNextVisualParam(); - } - if( param ) - { - llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; - return; + llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. Object: " << getID() << llendl; } if (params_changed) @@ -8988,8 +8992,7 @@ void LLVOAvatar::dumpArchetypeXML( void* ) for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) { LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; - if( (viewer_param->getWearableType() == type) && - (viewer_param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) ) + if (viewer_param->getWearableType() == type && viewer_param->isTweakable()) { apr_file_printf( file, "\t\t\n", viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight() ); diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp index b74ef02..f8123bb 100644 --- a/linden/indra/newview/llwearable.cpp +++ b/linden/indra/newview/llwearable.cpp @@ -535,7 +535,7 @@ BOOL LLWearable::isOldVersion() param; param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) { - if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (param->getWearableType() == mType && param->isTweakable()) { param_count++; if( !is_in_map(mVisualParamMap, param->getID() ) ) @@ -591,7 +591,7 @@ BOOL LLWearable::isDirty() param; param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) { - if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (param->getWearableType() == mType && param->isTweakable()) { F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight()); weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); @@ -690,7 +690,7 @@ void LLWearable::setParamsToDefaults() mVisualParamMap.clear(); for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) { - if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable()) { mVisualParamMap[param->getID()] = param->getDefaultWeight(); } @@ -724,7 +724,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user ) // Pull params for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) { - if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable()) { S32 param_id = param->getID(); F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight()); @@ -825,7 +825,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) // Pull params for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) { - if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (((LLViewerVisualParam*)param)->getWearableType() == type && param->isTweakable()) { S32 param_id = param->getID(); avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user ); @@ -873,7 +873,7 @@ void LLWearable::readFromAvatar() mVisualParamMap.clear(); for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) { - if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable()) { //pretty sure is right @@ -938,7 +938,7 @@ void LLWearable::copyDataFrom( LLWearable* src ) param; param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) { - if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) + if (param->getWearableType() == mType && param->isTweakable()) { S32 id = param->getID(); F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() ); diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml index a0dd938..d5b61a7 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml @@ -1172,11 +1172,15 @@ scratch and wear it. +