diff --git a/indra/newview/llfloaterexploreanimations.cpp b/indra/newview/llfloaterexploreanimations.cpp new file mode 100644 index 000000000..ec9856c18 --- /dev/null +++ b/indra/newview/llfloaterexploreanimations.cpp @@ -0,0 +1,310 @@ +// + +#include "llviewerprecompiledheaders.h" +#include "llfloaterexploreanimations.h" +#include "lluictrlfactory.h" +#include "llscrolllistctrl.h" +#include "llfloateranimpreview.h" +#include "llvoavatar.h" +#include "lllocalinventory.h" +// +#include "llfloatertools.h" +#include "llselectmgr.h" +// + +std::map> LLFloaterExploreAnimations::animHistory; +LLFloaterExploreAnimations* LLFloaterExploreAnimations::sInstance; + + +LLAnimHistoryItem::LLAnimHistoryItem(LLUUID assetid) +{ + mAssetID = assetid; +} + +LLFloaterExploreAnimations::LLFloaterExploreAnimations(LLUUID avatarid) +: LLFloater() +{ + LLFloaterExploreAnimations::sInstance = this; + mAvatarID = avatarid; + mAnimPreview = new LLPreviewAnimation(256, 256); + mAnimPreview->setZoom(2.0f); + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_explore_animations.xml"); +} + +void LLFloaterExploreAnimations::close(bool app_quitting) +{ + LLFloater::close(app_quitting); +} + +LLFloaterExploreAnimations::~LLFloaterExploreAnimations() +{ + delete mAnimPreview; + LLFloaterExploreAnimations::sInstance = NULL; +} + +BOOL LLFloaterExploreAnimations::postBuild(void) +{ + childSetCommitCallback("anim_list", onSelectAnimation, this); + childSetAction("copy_uuid_btn", onClickCopyUUID, this); + childSetAction("open_btn", onClickOpen, this); + childSetAction("jelly_roll_btn", onClickJellyRoll, this); + update(); + return TRUE; +} + +void LLFloaterExploreAnimations::update() +{ + LLScrollListCtrl* list = getChild("anim_list"); + LLUUID selection = list->getSelectedValue().asUUID(); + list->clearRows(); // do this differently probably + + std::list history = animHistory[mAvatarID]; + std::list::iterator iter = history.begin(); + std::list::iterator end = history.end(); + for( ; iter != end; ++iter) + { + LLAnimHistoryItem* item = (*iter); + + LLSD element; + element["id"] = item->mAssetID; + + LLSD& name_column = element["columns"][0]; + name_column["column"] = "name"; + name_column["value"] = item->mAssetID.asString(); + + LLSD& info_column = element["columns"][1]; + info_column["column"] = "info"; + if(item->mPlaying) + info_column["value"] = "Playing"; + else + info_column["value"] = llformat("%.1f min ago", (LLTimer::getElapsedSeconds() - item->mTimeStopped) / 60.f); + + list->addElement(element, ADD_BOTTOM); + } + + list->selectByID(selection); +} + +void LLFloaterExploreAnimations::draw() +{ + LLFloater::draw(); + + LLRect r = getRect(); + + gGL.color3f(1.f, 1.f, 1.f); + + gGL.getTexUnit(0)->bind(mAnimPreview->getTexture()); + + gGL.begin( LLRender::QUADS ); + { + gGL.texCoord2f(0.f, 1.f); + gGL.vertex2i(r.getWidth() - 266, r.getHeight() - 25); + gGL.texCoord2f(0.f, 0.f); + gGL.vertex2i(r.getWidth() - 266, r.getHeight() - 256); + gGL.texCoord2f(1.f, 0.f); + gGL.vertex2i(r.getWidth() - 10, r.getHeight() - 256); + gGL.texCoord2f(1.f, 1.f); + gGL.vertex2i(r.getWidth() - 10, r.getHeight() - 25); + } + gGL.end(); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + //LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar(); + //if (!avatarp->areAnimationsPaused()) + //{ + // mAnimPreview->requestUpdate(); + //} +} + + + + + +// static +void LLFloaterExploreAnimations::startAnim(LLUUID avatarid, LLUUID assetid) +{ + std::string asset_str = assetid.asString(); + if(asset_str.find("17132261-c061") != std::string::npos) return; // dog1 + else if(asset_str.find("fea558cb-8b9b") != std::string::npos) return; // dog2 + else if(asset_str.find("50cb5750-0743") != std::string::npos) return; // dog3 + else if(asset_str.find("-dead-") != std::string::npos) return; // emo + + LLAnimHistoryItem* item = NULL; + + std::list history = animHistory[avatarid]; + std::list::iterator iter = history.begin(); + std::list::iterator end = history.end(); + for( ; iter != end; ++iter) + { + if((*iter)->mAssetID == assetid) + { + item = (*iter); + break; + } + } + if(!item) + { + item = new LLAnimHistoryItem(assetid); + item->mAvatarID = avatarid; + item->mTimeStarted = LLTimer::getElapsedSeconds(); + } + item->mPlaying = true; + history.push_back(item); + animHistory[avatarid] = history; // is this really necessary? + handleHistoryChange(); +} + +// static +void LLFloaterExploreAnimations::stopAnim(LLUUID avatarid, LLUUID assetid) +{ + std::string asset_str = assetid.asString(); + if(asset_str.find("17132261-c061") != std::string::npos) return; // dog1 + else if(asset_str.find("fea558cb-8b9b") != std::string::npos) return; // dog2 + else if(asset_str.find("50cb5750-0743") != std::string::npos) return; // dog3 + else if(asset_str.find("-dead-") != std::string::npos) return; // emo + + LLAnimHistoryItem* item = NULL; + + std::list history = animHistory[avatarid]; + std::list::iterator iter = history.begin(); + std::list::iterator end = history.end(); + for( ; iter != end; ++iter) + { + if((*iter)->mAssetID == assetid) + { + item = (*iter); + break; + } + } + if(!item) + { + item = new LLAnimHistoryItem(assetid); + item->mAvatarID = avatarid; + item->mTimeStarted = LLTimer::getElapsedSeconds(); + history.push_back(item); + } + item->mPlaying = false; + item->mTimeStopped = LLTimer::getElapsedSeconds(); + handleHistoryChange(); +} + +class LLAnimHistoryItemCompare +{ +public: + bool operator() (LLAnimHistoryItem* first, LLAnimHistoryItem* second) + { + if(first->mPlaying) + { + if(second->mPlaying) + { + return (first->mTimeStarted > second->mTimeStarted); + } + else + { + return true; + } + } + else if(second->mPlaying) + { + return false; + } + else + { + return (first->mTimeStopped > second->mTimeStopped); + } + } +}; + +// static +void LLFloaterExploreAnimations::handleHistoryChange() +{ + std::map>::iterator av_iter = animHistory.begin(); + std::map>::iterator av_end = animHistory.end(); + for( ; av_iter != av_end; ++av_iter) + { + std::list history = (*av_iter).second; + + // Sort it + LLAnimHistoryItemCompare c; + history.sort(c); + + // Remove dupes + history.unique(); + + // Trim it + if(history.size() > 32) + { + history.resize(32); + } + + animHistory[(*av_iter).first] = history; + } + + // Update floater + if(LLFloaterExploreAnimations::sInstance) + LLFloaterExploreAnimations::sInstance->update(); +} + + + + + +// static +void LLFloaterExploreAnimations::onSelectAnimation(LLUICtrl* ctrl, void* user_data) +{ + LLFloaterExploreAnimations* floater = (LLFloaterExploreAnimations*)user_data; + LLPreviewAnimation* preview = (LLPreviewAnimation*)floater->mAnimPreview; + LLScrollListCtrl* list = floater->getChild("anim_list"); + LLUUID selection = list->getSelectedValue().asUUID(); + + preview->getDummyAvatar()->deactivateAllMotions(); + preview->getDummyAvatar()->startMotion(selection, 0.f); + preview->setZoom(2.0f); +} + +// static +void LLFloaterExploreAnimations::onClickCopyUUID(void* data) +{ + LLFloaterExploreAnimations* floater = (LLFloaterExploreAnimations*)data; + LLScrollListCtrl* list = floater->getChild("anim_list"); + LLUUID selection = list->getSelectedValue().asUUID(); + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(selection.asString())); +} + +void LLFloaterExploreAnimations::onClickOpen(void* data) +{ + LLFloaterExploreAnimations* floater = (LLFloaterExploreAnimations*)data; + LLScrollListCtrl* list = floater->getChild("anim_list"); + LLUUID selection = list->getSelectedValue().asUUID(); + LLUUID item = LLLocalInventory::addItem(selection.asString(), LLAssetType::AT_ANIMATION, selection, true); +} + +void LLFloaterExploreAnimations::onClickJellyRoll(void* data) +{ + std::string hover_text; + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + LLObjectSelection::valid_iterator sel_it = selection->valid_begin(); + LLObjectSelection::valid_iterator sel_end = selection->valid_end(); + for( ; sel_it != sel_end; ++sel_it) + { + LLViewerObject* objectp = (*sel_it)->getObject(); + hover_text = objectp->getDebugText(); + if(hover_text != "") + { + break; + } + } + + LLFloaterExploreAnimations* floater = (LLFloaterExploreAnimations*)data; + LLScrollListCtrl* list = floater->getChild("anim_list"); + LLUUID anim_id = list->getSelectedValue().asUUID(); + + LLFloaterNewLocalInventory* createy = new LLFloaterNewLocalInventory(); + createy->childSetText("name_line", hover_text); + createy->childSetText("asset_id_line", anim_id.asString()); + createy->childSetValue("type_combo", "animatn"); + createy->childSetText("creator_id_line", LLFloaterNewLocalInventory::sLastCreatorId.asString()); +} + +// diff --git a/indra/newview/llfloaterexploreanimations.h b/indra/newview/llfloaterexploreanimations.h new file mode 100644 index 000000000..2c1070f93 --- /dev/null +++ b/indra/newview/llfloaterexploreanimations.h @@ -0,0 +1,58 @@ +// +#ifndef LL_LLFLOATEREXPLOREANIMATIONS_H +#define LL_LLFLOATEREXPLOREANIMATIONS_H + +#include "llfloater.h" +#include "llfloateranimpreview.h" +#include "llviewerwindow.h" // gViewerWindow + +class LLAnimHistoryItem +{ +public: + LLAnimHistoryItem(LLUUID assetid); + + LLUUID mAvatarID; + LLUUID mAssetID; + bool mPlaying; + F64 mTimeStarted; + F64 mTimeStopped; +}; + +class LLFloaterExploreAnimations +: public LLFloater +{ +public: + LLFloaterExploreAnimations(LLUUID avatarid); + BOOL postBuild(void); + void close(bool app_quitting); + + void update(); + + LLUUID mAvatarID; + LLPreviewAnimation* mAnimPreview; + +private: + virtual ~LLFloaterExploreAnimations(); + + +// static stuff! +public: + static void onSelectAnimation(LLUICtrl* ctrl, void* user_data); + static void onClickCopyUUID(void* data); + static void onClickOpen(void* data); + static void onClickJellyRoll(void* data); + + static void startAnim(LLUUID avatarid, LLUUID assetid); + static void stopAnim(LLUUID avatarid, LLUUID assetid); + + static std::map> animHistory; + static LLFloaterExploreAnimations* sInstance; +private: + static void handleHistoryChange(); + +protected: + void draw(); +}; + +#endif +// diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 555efc114..b8a49ed4b 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3715,8 +3715,6 @@ std::string LLObjectBridge::getLabelSuffix() const LLStringUtil::toLower(attachment_point_name); return LLItemBridge::getLabelSuffix() + std::string(" (worn on ") + attachment_point_name + std::string(")"); } - else - { else { // testzone attachpt diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 578fdd823..936c99bde 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -59,6 +59,10 @@ #include "llviewercontrol.h" #include "llvoavatar.h" #include "llsdutil.h" +// +#include "llimportobject.h" +#include "llappviewer.h" // gLostItemsRoot +// #include //#define DIFF_INVENTORY_FILES @@ -207,6 +211,14 @@ BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id, while(obj) { const LLUUID& parent_id = obj->getParentUUID(); + // + if(parent_id == obj->getUUID()) + { + // infinite loop... same thing as having no parent, hopefully. + llwarns << "This shit has itself as parent! " << parent_id.asString() << ", " << obj->getName() << llendl; + return FALSE; + } + // if( parent_id.isNull() ) { return FALSE; @@ -823,12 +835,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id) // folders, items, etc in a fairly efficient manner. void LLInventoryModel::purgeDescendentsOf(const LLUUID& id) { - EHasChildren children = categoryHasChildren(id); - if(children == CHILDREN_NO) - { - llinfos << "Not purging descendents of " << id << llendl; - return; - } + // "Deliberately disobeying you" derf derf + //EHasChildren children = categoryHasChildren(id); + //if(children == CHILDREN_NO) + //{ + // llinfos << "Not purging descendents of " << id << llendl; + // return; + //} + // LLPointer cat = getCategory(id); if(cat.notNull()) { @@ -1383,41 +1397,48 @@ void LLInventoryModel::bulkFetch(std::string url) if (cat) { - if ( LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) - { - LLSD folder_sd; - folder_sd["folder_id"] = cat->getUUID(); - folder_sd["owner_id"] = cat->getOwnerID(); - folder_sd["sort_order"] = (LLSD::Integer)sort_order; - folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted; - folder_sd["fetch_items"] = (LLSD::Boolean)TRUE; - - LL_DEBUGS("Inventory") << " fetching "<getUUID()<<" with cat owner "<getOwnerID()<<" and agent" << gAgent.getID() << LL_ENDL; - //OGPX if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) - // for OGP it really doesnt make sense to have the decision about whether to fetch - // from the library or user cap be determined by a hard coded UUID. - // if it isnt an item that belongs to the agent, then fetch from the library - if (gAgent.getID() != cat->getOwnerID()) //if i am not the owner, it must be in the library - body_lib["folders"].append(folder_sd); - else - body["folders"].append(folder_sd); - folder_count++; - } - if (sFullFetchStarted) - { //Already have this folder but append child folders to list. - // add all children to queue - parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID()); - if (cat_it != gInventory.mParentChildCategoryTree.end()) - { - cat_array_t* child_categories = cat_it->second; - - for (S32 child_num = 0; child_num < child_categories->count(); child_num++) - { - sFetchQueue.push_back(child_categories->get(child_num)->getUUID()); - } - } - - } + // Pre-emptive strike + if(!(gInventory.isObjectDescendentOf(cat->getUUID(), gLocalInventoryRoot))) + { + // + if ( LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) + { + LLSD folder_sd; + folder_sd["folder_id"] = cat->getUUID(); + folder_sd["owner_id"] = cat->getOwnerID(); + folder_sd["sort_order"] = (LLSD::Integer)sort_order; + folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted; + folder_sd["fetch_items"] = (LLSD::Boolean)TRUE; + + LL_DEBUGS("Inventory") << " fetching "<getUUID()<<" with cat owner "<getOwnerID()<<" and agent" << gAgent.getID() << LL_ENDL; + //OGPX if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) + // for OGP it really doesnt make sense to have the decision about whether to fetch + // from the library or user cap be determined by a hard coded UUID. + // if it isnt an item that belongs to the agent, then fetch from the library + if (gAgent.getID() != cat->getOwnerID()) //if i am not the owner, it must be in the library + body_lib["folders"].append(folder_sd); + else + body["folders"].append(folder_sd); + folder_count++; + } + if (sFullFetchStarted) + { //Already have this folder but append child folders to list. + // add all children to queue + parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID()); + if (cat_it != gInventory.mParentChildCategoryTree.end()) + { + cat_array_t* child_categories = cat_it->second; + + for (S32 child_num = 0; child_num < child_categories->count(); child_num++) + { + sFetchQueue.push_back(child_categories->get(child_num)->getUUID()); + } + } + + } + // + } + // } } sFetchQueue.pop_front(); @@ -1718,7 +1739,10 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) if(item) { mItemMap[item->getUUID()] = item; - //mInventory[item->getUUID()] = item; + // + if(LLXmlImport::sImportInProgress) + LLXmlImport::onNewItem(item); + // } } @@ -1903,6 +1927,11 @@ bool LLInventoryModel::isCategoryComplete(const LLUUID& cat_id) const return true; } } + + // + if((cat_id == gLocalInventoryRoot) || gInventory.isObjectDescendentOf(cat_id, gLocalInventoryRoot)) return true; + // + return false; } @@ -3457,9 +3486,11 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* ite switch(item->getType()) { - case LLAssetType::AT_CALLINGCARD: - // not allowed - break; + { + // I don't even think changing this did anything + //case LLAssetType::AT_CALLINGCARD: + // // not allowed + // break; case LLAssetType::AT_OBJECT: my_avatar = gAgent.getAvatarObject(); diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 06ee98dff..e4cd1b24b 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -385,8 +385,14 @@ protected: // the internal data structures are consistent. These methods // should be passed pointers of newly created objects, and the // instance will take over the memory management from there. +// +public: +// void addCategory(LLViewerInventoryCategory* category); void addItem(LLViewerInventoryItem* item); +// +protected: +// // Internal method which looks for a category with the specified // preferred type. Returns LLUUID::null if not found @@ -402,12 +408,18 @@ protected: //void recalculateCloneInformation(); // file import/export. +// +public: +// static bool loadFromFile(const std::string& filename, cat_array_t& categories, item_array_t& items); static bool saveToFile(const std::string& filename, const cat_array_t& categories, const item_array_t& items); +// +protected: +// // message handling functionality //static void processUseCachedInventory(LLMessageSystem* msg, void**); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 8f77c4f45..ee8833004 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -83,6 +83,11 @@ #include "llvoiceclient.h" #include "llvoicevisualizer.h" // Ventrella +// +#include "llfloaterexploreanimations.h" +//#include "llao.h" +// + #if LL_MSVC // disable boost::lexical_cast warning #pragma warning (disable:4702) @@ -747,7 +752,14 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mNeedsSkin(FALSE), mUpdatePeriod(1), mFullyLoadedInitialized(FALSE), - mHasBakedHair( FALSE ) + mHasBakedHair( FALSE ), + // + mNametagSaysIdle(false), + mIdleForever(true), + mIdleMinutes(0), + mFocusObject(LLUUID::null), + mFocusVector(LLVector3d::zero) + // { LLMemType mt(LLMemType::MTYPE_AVATAR); //VTResume(); // VTune @@ -3061,9 +3073,11 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) new_name = TRUE; } - LLColor4 avatar_name_color = gColors.getColor( "AvatarNameColor" ); - avatar_name_color.setAlpha(alpha); - mNameText->setColor(avatar_name_color); + } + + // + //LLColor4 avatar_name_color = gColors.getColor( "AvatarNameColor" ); + //avatar_name_color.setAlpha(alpha); LLQuaternion root_rot = mRoot.getWorldRotation(); mNameText->setUsePixelSize(TRUE); @@ -3144,6 +3158,108 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) line += lastname->getString(); BOOL need_comma = FALSE; + BOOL need_comma = FALSE; + + // + if(getTEImage(TEX_HEAD_BODYPAINT)->isMissingAsset()) + { + mNameText->setColor(LLColor4(1.f, 1.0f, 1.0f)); + strcat(line, " (Unknown viewer)"); + } + else + { + std::string uuid_str = getTEImage(TEX_HEAD_BODYPAINT)->getID().asString(); + + if(uuid_str == "ccda2b3b-e72c-a112-e126-fee238b67218") + { + // textures other than head are 4934f1bf-3b1f-cf4f-dbdf-a72550d05bc6 + mNameText->setColor(LLColor4(0.f, 1.0f, 0.0f)); + strcat(line, " (Emerald)"); + } + else if(uuid_str == "0bcd5f5d-a4ce-9ea4-f9e8-15132653b3d8") + { + mNameText->setColor(LLColor4(1.0f, 0.3f, 0.5f)); + strcat(line, " (MoyMix)"); + } + else if(uuid_str == "5855f37d-63e5-3918-1404-8ffa3820eb6d") + { + mNameText->setColor(LLColor4(1.0f, 0.3f, 0.5f)); + strcat(line, " (MoyMix/B)"); + } + else if(uuid_str == "9ba526b6-f43d-6b60-42de-ce62a25ee7fb") + { + mNameText->setColor(LLColor4(1.0f, 0.3f, 0.5f)); + strcat(line, " (MoyMix/nolife)"); + } + //else if(uuid_str == "abbca853-30ba-49c1-a1e7-2a5b9a70573f") + //{ + // mNameText->setColor(LLColor4(0.5f, 0.75f, 1.0f)); + // strcat(line, " (CryoLife/" + "A)"); + //} + else if(uuid_str == "0f6723d2-5b23-6b58-08ab-308112b33786") + { + mNameText->setColor(LLColor4(0.5f, 0.75f, 1.0f)); + strcat(line, " (CryoLife)"); + } + else if(uuid_str == "2c9c1e0b-e5d1-263e-16b1-7fc6d169f3d6") + { + mNameText->setColor(LLColor4(0.5f, 0.75f, 1.0f)); + strcat(line, " (Phoxy SL)"); + } + else if(uuid_str == "c252d89d-6f7c-7d90-f430-d140d2e3fbbe") + { + mNameText->setColor(LLColor4(0.7f, 0.7f, 0.7f)); + strcat(line, " (VLife)"); + } + else if(uuid_str == "5aa5c70d-d787-571b-0495-4fc1bdef1500") + { + mNameText->setColor(LLColor4(1.f, 0.0f, 0.0f)); + strcat(line, " (GridProxy/LordGregGreg)"); + } + else if(uuid_str == "8183e823-c443-2142-6eb6-2ab763d4f81c") + { + mNameText->setColor(LLColor4(1.f, 1.f, 0.0f)); + strcat(line, " (GridProxy/DayOh)"); + } + else if(uuid_str == "f3fd74a6-fee7-4b2f-93ae-ddcb5991da04") + { + mNameText->setColor(LLColor4(1.0f, 0.0f, 1.0f)); + strcat(line, " (PSL/A)"); + } + else if(uuid_str == "77662f23-c77a-9b4d-5558-26b757b2144c") + { + mNameText->setColor(LLColor4(1.0f, 0.0f, 1.0f)); + strcat(line, " (PSL/B)"); + } + else if(uuid_str == "1c29480c-c608-df87-28bb-964fb64c5366") + { + mNameText->setColor(LLColor4(1.f, 1.0f, 1.0f)); + strcat(line, " (Emerald/GEMINI)"); + } + else if(uuid_str == "5262d71a-88f7-ef40-3b15-00ea148ab4b5") + { + mNameText->setColor(LLColor4(0.9f, 0.9f, 0.9f)); + strcat(line, " (GEMINI Bot)"); + } + else if(uuid_str == "adcbe893-7643-fd12-f61c-0b39717e2e32") + { + mNameText->setColor(LLColor4(1.0f, 0.5f, 0.4f)); + strcat(line, " (tyk3n)"); + } + else if(uuid_str == "f5a48821-9a98-d09e-8d6a-50cc08ba9a47") + { + mNameText->setColor(gColors.getColor( "AvatarNameColor" )); + strcat(line, " (NeilLife)"); + } + + else + { + LLColor4 avatar_name_color = gColors.getColor( "AvatarNameColor" ); + avatar_name_color.setAlpha(1.f); + mNameText->setColor(avatar_name_color); + } + } + // if (is_away || is_muted || is_busy) { line += " ("; @@ -3301,6 +3417,14 @@ void LLVOAvatar::idleUpdateTractorBeam() { return; } + + // + if(gSavedSettings.getBOOL("DisablePointAtAndBeam")) + { + return; + } + // + const LLPickInfo& pick = gViewerWindow->getLastPick(); // No beam for media textures @@ -4729,6 +4853,9 @@ void LLVOAvatar::processAnimationStateChanges() if (found_anim == mSignaledAnimations.end()) { processSingleAnimationStateChange(anim_it->first, FALSE); + // + LLFloaterExploreAnimations::stopAnim(getID(), anim_it->first); + // mPlayingAnimations.erase(anim_it++); continue; } @@ -4744,6 +4871,9 @@ void LLVOAvatar::processAnimationStateChanges() // signaled but not playing, or different sequence id, start motion if (found_anim == mPlayingAnimations.end() || found_anim->second != anim_it->second) { + // + LLFloaterExploreAnimations::startAnim(getID(), anim_it->first); + // if (processSingleAnimationStateChange(anim_it->first, TRUE)) { mPlayingAnimations[anim_it->first] = anim_it->second; @@ -5983,9 +6113,43 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi // attachObject() //----------------------------------------------------------------------------- BOOL LLVOAvatar::attachObject(LLViewerObject *viewer_object) -{ - LLViewerJointAttachment* attachment = getTargetAttachmentPoint(viewer_object); - +{ + LLViewerJointAttachment* attachment = getTargetAttachmentPoint(viewer_object); + + // testzone attachpt + if(!attachment) + { + S32 attachmentID = ATTACHMENT_ID_FROM_STATE(viewer_object->getState()); + LLUUID item_id; + LLNameValue* item_id_nv = viewer_object->getNVPair("AttachItemID"); + if( item_id_nv ) + { + const char* s = item_id_nv->getString(); + if(s) + item_id.set(s); + } + if(!item_id.isNull()) + { + mUnsupportedAttachmentPoints[attachmentID] = item_id; + if (viewer_object->isSelected()) + { + LLSelectMgr::getInstance()->updateSelectionCenter(); + LLSelectMgr::getInstance()->updatePointAt(); + } + + if (mIsSelf) + { + updateAttachmentVisibility(gAgent.getCameraMode()); + + // Then make sure the inventory is in sync with the avatar. + gInventory.addChangedMask( LLInventoryObserver::LABEL, item_id ); + gInventory.notifyObservers(); + } + } + else + llwarns << "No item ID" << llendl; + } + // if (!attachment || !attachment->addObject(viewer_object)) { return FALSE; @@ -6094,8 +6258,57 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) } return TRUE; } - } - + } + + // testzone attachpt + LLUUID item_id; + LLNameValue* item_id_nv = viewer_object->getNVPair("AttachItemID"); + if( item_id_nv ) + { + const char* s = item_id_nv->getString(); + if(s) + item_id.set(s); + } + if(!item_id.isNull()) + { + std::map::iterator iter = mUnsupportedAttachmentPoints.begin(); + std::map::iterator end = mUnsupportedAttachmentPoints.end(); + for( ; iter != end; ++iter) + { + if((*iter).second == item_id) + { + mUnsupportedAttachmentPoints.erase((*iter).first); + if (mIsSelf) + { + // the simulator should automatically handle + // permission revocation + + stopMotionFromSource(viewer_object->getID()); + LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE); + + LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child_objectp = *iter; + // the simulator should automatically handle + // permissions revocation + + stopMotionFromSource(child_objectp->getID()); + LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE); + } + // Then make sure the inventory is in sync with the avatar. + gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + gInventory.notifyObservers(); + } + return TRUE; + } + } + llwarns << "Not found" << llendl; + } + else + llwarns << "No item ID" << llendl; + // return FALSE; } @@ -6257,8 +6470,16 @@ BOOL LLVOAvatar::isWearingAttachment( const LLUUID& inv_item_id ) } } return FALSE; -} - +} + +// testzone attachpt +BOOL LLVOAvatar::isWearingUnsupportedAttachment( const LLUUID& inv_item_id ) +{ + std::map::iterator end = mUnsupportedAttachmentPoints.end(); + for(std::map::iterator iter = mUnsupportedAttachmentPoints.begin(); iter != end; ++iter) + if((*iter).second == inv_item_id) + return TRUE; + return FALSE; //----------------------------------------------------------------------------- // getWornAttachment() //----------------------------------------------------------------------------- @@ -8508,8 +8729,11 @@ void LLVOAvatar::dumpLocalTextures() llinfos << "LocTex " << name << ": " << "Discard " << image->getDiscardLevel() << ", " - << "(" << image->getWidth() << ", " << image->getHeight() << ") " -#if !LL_RELEASE_FOR_DOWNLOAD + << "(" << image->getWidth() << ", " << image->getHeight() << ") " +// +//#if !LL_RELEASE_FOR_DOWNLOAD +#if 1 +// // End users don't get to trivially see avatar texture IDs, // makes textures easier to steal << image->getID() << " " diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index d4417ea7b..d116fb58f 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -283,6 +283,9 @@ public: void getOffObject(); BOOL isWearingAttachment( const LLUUID& inv_item_id ); + // testzone attachpt + BOOL isWearingUnsupportedAttachment( const LLUUID& inv_item_id ); + // LLViewerObject* getWornAttachment( const LLUUID& inv_item_id ); const std::string getAttachedPointName(const LLUUID& inv_item_id); @@ -578,6 +581,10 @@ private: const static LLUUID sStepSounds[LL_MCODE_END]; const static LLUUID sStepSoundOnLand; + // + std::map mUnsupportedAttachmentPoints; + // + // Xml parse tree of avatar config file static LLXmlTree sXMLTree; // Xml parse tree of avatar skeleton file @@ -678,32 +685,15 @@ protected: S32 getLocalDiscardLevel(LLVOAvatarDefines::ETextureIndex index); public: static void updateFreezeCounter(S32 counter = 0 ); -private: - static S32 sFreezeCounter; - - //----------------------------------------------------------------------------------------------- - // Avatar skeleton setup. - //----------------------------------------------------------------------------------------------- -private: - BOOL loadAvatar(); - BOOL setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 ¤t_volume_num, S32 ¤t_joint_num); - BOOL buildSkeleton(const LLVOAvatarSkeletonInfo *info); - - //----------------------------------------------------------------------------------------------- - // Per-avatar information about texture data. - // To-do: Move this to private implementation class - //----------------------------------------------------------------------------------------------- -private: - struct BakedTextureData - { - LLUUID mLastTextureIndex; - LLTexLayerSet* mTexLayerSet; - bool mIsLoaded; - bool mIsUsed; - LLVOAvatarDefines::ETextureIndex mTextureIndex; - U32 mMaskTexName; - // Stores pointers to the joint meshes that this baked texture deals with - std::vector< LLViewerJointMesh * > mMeshes; // std::vector mJoints[i]->mMeshParts +// + //bool mNametagSaysIdle; + //bool mIdleForever; + //LLFrameTimer mIdleTimer; + //U32 mIdleMinutes; + LLUUID mFocusObject; + LLVector3d mFocusVector; + //void resetIdleTime(); +// }; typedef std::vector bakedtexturedata_vec_t; bakedtexturedata_vec_t mBakedTextureData;