From f36b2612139d12f0a6853b02784b40614b7aacf0 Mon Sep 17 00:00:00 2001 From: Todd Stinson Date: Tue, 10 Jan 2012 11:06:15 -0800 Subject: PATH-142: Implementing some basic distance from viewer calculation per linksets. Note that this does not return all distances because some objects are in the region but the viewer is not aware of yet. --- indra/newview/llfloaterpathfindinglinksets.cpp | 121 ++++++++++-------- indra/newview/llfloaterpathfindinglinksets.h | 166 ++++++++++++------------- 2 files changed, 152 insertions(+), 135 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfloaterpathfindinglinksets.cpp b/indra/newview/llfloaterpathfindinglinksets.cpp index 0cce1277b0..78c0d342b2 100644 --- a/indra/newview/llfloaterpathfindinglinksets.cpp +++ b/indra/newview/llfloaterpathfindinglinksets.cpp @@ -36,26 +36,29 @@ #include "llviewerregion.h" #include "llhttpclient.h" #include "lltextbase.h" +#include "lluuid.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" //--------------------------------------------------------------------------- // NavmeshDataGetResponder //--------------------------------------------------------------------------- - -class NavmeshDataGetResponder : public LLHTTPClient::Responder -{ -public: - NavmeshDataGetResponder(const std::string& pNavmeshDataGetURL, LLFloaterPathfindingLinksets *pLinksetsFloater); - virtual ~NavmeshDataGetResponder(); - - virtual void result(const LLSD& pContent); - virtual void error(U32 pStatus, const std::string& pReason); - -private: - NavmeshDataGetResponder(const NavmeshDataGetResponder& pOther); - - std::string mNavmeshDataGetURL; - LLFloaterPathfindingLinksets *mLinksetsFloater; -}; + +class NavmeshDataGetResponder : public LLHTTPClient::Responder +{ +public: + NavmeshDataGetResponder(const std::string& pNavmeshDataGetURL, LLFloaterPathfindingLinksets *pLinksetsFloater); + virtual ~NavmeshDataGetResponder(); + + virtual void result(const LLSD& pContent); + virtual void error(U32 pStatus, const std::string& pReason); + +private: + NavmeshDataGetResponder(const NavmeshDataGetResponder& pOther); + + std::string mNavmeshDataGetURL; + LLFloaterPathfindingLinksets *mLinksetsFloater; +}; //--------------------------------------------------------------------------- // LLFloaterPathfindingLinksets @@ -90,10 +93,10 @@ void LLFloaterPathfindingLinksets::openLinksetsEditor() LLFloaterReg::toggleInstanceOrBringToFront("pathfinding_linksets"); } -LLFloaterPathfindingLinksets::EFetchState LLFloaterPathfindingLinksets::getFetchState() const -{ - return mFetchState; -} +LLFloaterPathfindingLinksets::EFetchState LLFloaterPathfindingLinksets::getFetchState() const +{ + return mFetchState; +} BOOL LLFloaterPathfindingLinksets::isFetchInProgress() const { @@ -140,22 +143,22 @@ void LLFloaterPathfindingLinksets::sendNavmeshDataGetRequest() setFetchState(kFetchStarting); clearLinksetsList(); - LLViewerRegion* region = gAgent.getRegion(); - if (region != NULL) - { - std::string navmeshDataURL = region->getCapability("ObjectNavmesh"); - if (navmeshDataURL.empty()) - { + LLViewerRegion* region = gAgent.getRegion(); + if (region != NULL) + { + std::string navmeshDataURL = region->getCapability("ObjectNavmesh"); + if (navmeshDataURL.empty()) + { setFetchState(kFetchComplete); - llwarns << "cannot query navmesh data from current region '" << region->getName() << "'" << llendl; - } - else - { + llwarns << "cannot query navmesh data from current region '" << region->getName() << "'" << llendl; + } + else + { setFetchState(kFetchInProgress); - LLHTTPClient::get(navmeshDataURL, new NavmeshDataGetResponder(navmeshDataURL, this)); - } - } - } + LLHTTPClient::get(navmeshDataURL, new NavmeshDataGetResponder(navmeshDataURL, this)); + } + } + } } void LLFloaterPathfindingLinksets::handleNavmeshDataGetReply(const LLSD& pNavmeshData) @@ -168,7 +171,7 @@ void LLFloaterPathfindingLinksets::handleNavmeshDataGetReply(const LLSD& pNavmes for (LLSD::map_const_iterator itemsIter = pNavmeshData.beginMap(); itemsIter != pNavmeshData.endMap(); ++itemsIter) { - const std::string& uuid = itemsIter->first; + LLUUID uuid(itemsIter->first); const LLSD& itemData = itemsIter->second; const LLSD::String& itemName = itemData.get("name").asString(); @@ -182,9 +185,16 @@ void LLFloaterPathfindingLinksets::handleNavmeshDataGetReply(const LLSD& pNavmes LLSD::Real itemC = itemData.get("C").asReal(); LLSD::Real itemD = itemData.get("D").asReal(); - F32 location_x = 50.0f, location_y = 50.0f, location_z = 50.0f; // XXX stinson: use real location later - LLVector3 itemLocation(location_x, location_y, location_z); - F32 itemDistance = dist_vec(avatarPosition, itemLocation); + // XXX stinson: get a better way to get all objects locations in the region as the + // following calculation only returns objects of which the viewer is aware. + LLViewerObject *viewerObject = gObjectList.findObject(uuid); + bool hasDistance = (viewerObject != NULL); + F32 itemDistance = -999.0f; + if (hasDistance) + { + const LLVector3& itemLocation = viewerObject->getPositionAgent(); + itemDistance = dist_vec(avatarPosition, itemLocation); + } LLSD columns; @@ -197,11 +207,18 @@ void LLFloaterPathfindingLinksets::handleNavmeshDataGetReply(const LLSD& pNavmes columns[1]["font"] = "SANSSERIF"; columns[2]["column"] = "land_impact"; - columns[2]["value"] = llformat("%1d m", itemLandImpact); + columns[2]["value"] = llformat("%1d", itemLandImpact); columns[2]["font"] = "SANSSERIF"; columns[3]["column"] = "dist_from_you"; - columns[3]["value"] = llformat("%1.0f m", itemDistance); + if (hasDistance) + { + columns[3]["value"] = llformat("%1.0f m", itemDistance); + } + else + { + columns[3]["value"] = "--"; + } columns[3]["font"] = "SANSSERIF"; columns[4]["column"] = "is_fixed"; @@ -242,18 +259,18 @@ void LLFloaterPathfindingLinksets::handleNavmeshDataGetReply(const LLSD& pNavmes setFetchState(kFetchComplete); } -void LLFloaterPathfindingLinksets::handleNavmeshDataGetError(const std::string& pURL, const std::string& pErrorReason) -{ +void LLFloaterPathfindingLinksets::handleNavmeshDataGetError(const std::string& pURL, const std::string& pErrorReason) +{ setFetchState(kFetchError); clearLinksetsList(); - llwarns << "Error fetching navmesh data from URL '" << pURL << "' because " << pErrorReason << llendl; -} - -void LLFloaterPathfindingLinksets::setFetchState(EFetchState pFetchState) -{ - mFetchState = pFetchState; - updateLinksetsStatusMessage(); -} + llwarns << "Error fetching navmesh data from URL '" << pURL << "' because " << pErrorReason << llendl; +} + +void LLFloaterPathfindingLinksets::setFetchState(EFetchState pFetchState) +{ + mFetchState = pFetchState; + updateLinksetsStatusMessage(); +} void LLFloaterPathfindingLinksets::onLinksetsSelectionChange() { @@ -347,8 +364,8 @@ void LLFloaterPathfindingLinksets::updateLinksetsStatusMessage() mLinksetsStatus->setText((LLStringExplicit)statusText, styleParams); } - -NavmeshDataGetResponder::NavmeshDataGetResponder(const std::string& pNavmeshDataGetURL, LLFloaterPathfindingLinksets *pLinksetsFloater) + +NavmeshDataGetResponder::NavmeshDataGetResponder(const std::string& pNavmeshDataGetURL, LLFloaterPathfindingLinksets *pLinksetsFloater) : mNavmeshDataGetURL(pNavmeshDataGetURL), mLinksetsFloater(pLinksetsFloater) { diff --git a/indra/newview/llfloaterpathfindinglinksets.h b/indra/newview/llfloaterpathfindinglinksets.h index 9a54468d58..66472beb99 100644 --- a/indra/newview/llfloaterpathfindinglinksets.h +++ b/indra/newview/llfloaterpathfindinglinksets.h @@ -1,45 +1,45 @@ -/** - * @file llfloaterpathfindinglinksets.h - * @author William Todd Stinson - * @brief "Pathfinding linksets" floater, allowing manipulation of the Havok AI pathfinding settings. - * - * $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$ - */ - -#ifndef LL_LLFLOATERPATHFINDINGLINKSETS_H -#define LL_LLFLOATERPATHFINDINGLINKSETS_H - -#include "llfloater.h" - -class LLSD; -class LLTextBase; -class LLScrollListCtrl; - -class LLFloaterPathfindingLinksets -: public LLFloater -{ - friend class LLFloaterReg; - friend class NavmeshDataGetResponder; - +/** + * @file llfloaterpathfindinglinksets.h + * @author William Todd Stinson + * @brief "Pathfinding linksets" floater, allowing manipulation of the Havok AI pathfinding settings. + * + * $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$ + */ + +#ifndef LL_LLFLOATERPATHFINDINGLINKSETS_H +#define LL_LLFLOATERPATHFINDINGLINKSETS_H + +#include "llfloater.h" + +class LLSD; +class LLTextBase; +class LLScrollListCtrl; + +class LLFloaterPathfindingLinksets +: public LLFloater +{ + friend class LLFloaterReg; + friend class NavmeshDataGetResponder; + typedef enum { kFetchInitial, @@ -50,44 +50,44 @@ class LLFloaterPathfindingLinksets kFetchError, kFetchComplete } EFetchState; - -public: - virtual BOOL postBuild(); - virtual void onOpen(const LLSD& pKey); - - static void openLinksetsEditor(); - - EFetchState getFetchState() const; - BOOL isFetchInProgress() const; - -protected: - -private: - EFetchState mFetchState; - LLScrollListCtrl *mLinksetsScrollList; - LLTextBase *mLinksetsStatus; - - // Does its own instance management, so clients not allowed - // to allocate or destroy. - LLFloaterPathfindingLinksets(const LLSD& pSeed); - virtual ~LLFloaterPathfindingLinksets(); - - void sendNavmeshDataGetRequest(); - void handleNavmeshDataGetReply(const LLSD& pNavmeshData); - void handleNavmeshDataGetError(const std::string& pURL, const std::string& pErrorReason); - - void setFetchState(EFetchState pFetchState); - - void onLinksetsSelectionChange(); - void onRefreshLinksetsClicked(); - void onSelectAllLinksetsClicked(); - void onSelectNoneLinksetsClicked(); - - void clearLinksetsList(); - void selectAllLinksets(); - void selectNoneLinksets(); - - void updateLinksetsStatusMessage(); -}; - -#endif // LL_LLFLOATERPATHFINDINGLINKSETS_H + +public: + virtual BOOL postBuild(); + virtual void onOpen(const LLSD& pKey); + + static void openLinksetsEditor(); + + EFetchState getFetchState() const; + BOOL isFetchInProgress() const; + +protected: + +private: + EFetchState mFetchState; + LLScrollListCtrl *mLinksetsScrollList; + LLTextBase *mLinksetsStatus; + + // Does its own instance management, so clients not allowed + // to allocate or destroy. + LLFloaterPathfindingLinksets(const LLSD& pSeed); + virtual ~LLFloaterPathfindingLinksets(); + + void sendNavmeshDataGetRequest(); + void handleNavmeshDataGetReply(const LLSD& pNavmeshData); + void handleNavmeshDataGetError(const std::string& pURL, const std::string& pErrorReason); + + void setFetchState(EFetchState pFetchState); + + void onLinksetsSelectionChange(); + void onRefreshLinksetsClicked(); + void onSelectAllLinksetsClicked(); + void onSelectNoneLinksetsClicked(); + + void clearLinksetsList(); + void selectAllLinksets(); + void selectNoneLinksets(); + + void updateLinksetsStatusMessage(); +}; + +#endif // LL_LLFLOATERPATHFINDINGLINKSETS_H -- cgit v1.2.3