Add Pathfinding UI from v3
Added libpathing to LLPHYSICSEXTENSIONS_INCLUDE_DIRS llviewermenu updated a bit to be closer to v-d/rlva. Best viewed without space changes. Updated llresmgr.cpp from v-d to "handle special case of input value being zero" pipeline update: hideObject, restoreHiddenObject, hideDrawable, and unhideDrawable added. Thanks to Henri Beauchamp for some UI code touchups, thanks to Zi Ree for Rebake notification. Thanks to Mobius Ryba and Ansariel Hiller for the V1-style pathfinding icons. Note: When opening from pie menu object selection is lost, unless the floater is already open.. This provides a more reliable reproduction of the bug we've been having with inspect.
This commit is contained in:
309
indra/newview/llfloaterpathfindingcharacters.cpp
Normal file
309
indra/newview/llfloaterpathfindingcharacters.cpp
Normal file
@@ -0,0 +1,309 @@
|
||||
/**
|
||||
* @file llfloaterpathfindingcharacters.cpp
|
||||
* @brief "Pathfinding characters" floater, allowing for identification of pathfinding characters and their cpu usage.
|
||||
* @author Stinson@lindenlab.com
|
||||
*
|
||||
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2012, 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 "llfloaterpathfindingcharacters.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llfloaterpathfindingobjects.h"
|
||||
#include "llhandle.h"
|
||||
#include "llpathfindingcharacter.h"
|
||||
#include "llpathfindingcharacterlist.h"
|
||||
#include "llpathfindingmanager.h"
|
||||
#include "llpathfindingobject.h"
|
||||
#include "llpathfindingobjectlist.h"
|
||||
#include "llpathinglib.h"
|
||||
#include "llquaternion.h"
|
||||
#include "llsd.h"
|
||||
#include "llui.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "lluuid.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "pipeline.h"
|
||||
#include "v3math.h"
|
||||
#include "v4color.h"
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// LLFloaterPathfindingCharacters
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void LLFloaterPathfindingCharacters::onClose(bool pIsAppQuitting)
|
||||
{
|
||||
// Hide any capsule that might be showing on floater close
|
||||
hideCapsule();
|
||||
LLFloaterPathfindingObjects::onClose( pIsAppQuitting );
|
||||
}
|
||||
|
||||
BOOL LLFloaterPathfindingCharacters::isShowPhysicsCapsule() const
|
||||
{
|
||||
return mShowPhysicsCapsuleCheckBox->get();
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::setShowPhysicsCapsule(BOOL pIsShowPhysicsCapsule)
|
||||
{
|
||||
mShowPhysicsCapsuleCheckBox->set(pIsShowPhysicsCapsule && (LLPathingLib::getInstance() != NULL));
|
||||
}
|
||||
|
||||
BOOL LLFloaterPathfindingCharacters::isPhysicsCapsuleEnabled(LLUUID& id, LLVector3& pos, LLQuaternion& rot) const
|
||||
{
|
||||
id = mSelectedCharacterId;
|
||||
// Physics capsule is enable if the checkbox is enabled and if we can get the required render
|
||||
// parameters for any selected object
|
||||
return (isShowPhysicsCapsule() && getCapsuleRenderData(pos, rot ));
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::openCharactersWithSelectedObjects()
|
||||
{
|
||||
LLFloaterPathfindingCharacters* charactersFloater = getInstance();
|
||||
charactersFloater->showFloaterWithSelectionObjects();
|
||||
}
|
||||
|
||||
LLFloaterPathfindingCharacters::LLFloaterPathfindingCharacters(const LLSD& pSeed)
|
||||
: LLFloaterPathfindingObjects(/*pSeed*/),
|
||||
mShowPhysicsCapsuleCheckBox(NULL),
|
||||
mSelectedCharacterId(),
|
||||
mBeaconColor()
|
||||
{
|
||||
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_pathfinding_characters.xml");
|
||||
}
|
||||
|
||||
LLFloaterPathfindingCharacters::~LLFloaterPathfindingCharacters()
|
||||
{
|
||||
}
|
||||
|
||||
BOOL LLFloaterPathfindingCharacters::postBuild()
|
||||
{
|
||||
mBeaconColor = LLUI::sColorsGroup->getColor("PathfindingCharacterBeaconColor");
|
||||
|
||||
mShowPhysicsCapsuleCheckBox = getChild<LLCheckBoxCtrl>("show_physics_capsule");
|
||||
llassert(mShowPhysicsCapsuleCheckBox != NULL);
|
||||
mShowPhysicsCapsuleCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingCharacters::onShowPhysicsCapsuleClicked, this));
|
||||
mShowPhysicsCapsuleCheckBox->setEnabled(LLPathingLib::getInstance() != NULL);
|
||||
|
||||
return LLFloaterPathfindingObjects::postBuild();
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::requestGetObjects()
|
||||
{
|
||||
LLPathfindingManager::getInstance()->requestGetCharacters(getNewRequestId(), boost::bind(&LLFloaterPathfindingCharacters::handleNewObjectList, this, _1, _2, _3));
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr)
|
||||
{
|
||||
llassert(pObjectListPtr != NULL);
|
||||
llassert(!pObjectListPtr->isEmpty());
|
||||
|
||||
for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin(); objectIter != pObjectListPtr->end(); ++objectIter)
|
||||
{
|
||||
const LLPathfindingObjectPtr objectPtr = objectIter->second;
|
||||
const LLPathfindingCharacter *characterPtr = dynamic_cast<const LLPathfindingCharacter *>(objectPtr.get());
|
||||
llassert(characterPtr != NULL);
|
||||
|
||||
LLSD scrollListItemData = buildCharacterScrollListItemData(characterPtr);
|
||||
addObjectToScrollList(objectPtr, scrollListItemData);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::updateControlsOnScrollListChange()
|
||||
{
|
||||
LLFloaterPathfindingObjects::updateControlsOnScrollListChange();
|
||||
updateStateOnDisplayControls();
|
||||
showSelectedCharacterCapsules();
|
||||
}
|
||||
|
||||
S32 LLFloaterPathfindingCharacters::getNameColumnIndex() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
S32 LLFloaterPathfindingCharacters::getOwnerNameColumnIndex() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
std::string LLFloaterPathfindingCharacters::getOwnerName(const LLPathfindingObject *pObject) const
|
||||
{
|
||||
return (pObject->hasOwner()
|
||||
? (pObject->hasOwnerName()
|
||||
? (pObject->isGroupOwned()
|
||||
? (pObject->getOwnerName() + " " + getString("character_owner_group"))
|
||||
: pObject->getOwnerName())
|
||||
: getString("character_owner_loading"))
|
||||
: getString("character_owner_unknown"));
|
||||
}
|
||||
|
||||
const LLColor4 &LLFloaterPathfindingCharacters::getBeaconColor() const
|
||||
{
|
||||
return mBeaconColor;
|
||||
}
|
||||
|
||||
LLPathfindingObjectListPtr LLFloaterPathfindingCharacters::getEmptyObjectList() const
|
||||
{
|
||||
LLPathfindingObjectListPtr objectListPtr(new LLPathfindingCharacterList());
|
||||
return objectListPtr;
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::onShowPhysicsCapsuleClicked()
|
||||
{
|
||||
if (LLPathingLib::getInstance() == NULL)
|
||||
{
|
||||
if (isShowPhysicsCapsule())
|
||||
{
|
||||
setShowPhysicsCapsule(FALSE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mSelectedCharacterId.notNull() && isShowPhysicsCapsule())
|
||||
{
|
||||
showCapsule();
|
||||
}
|
||||
else
|
||||
{
|
||||
hideCapsule();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLSD LLFloaterPathfindingCharacters::buildCharacterScrollListItemData(const LLPathfindingCharacter *pCharacterPtr) const
|
||||
{
|
||||
LLSD columns = LLSD::emptyArray();
|
||||
|
||||
columns[0]["column"] = "name";
|
||||
columns[0]["value"] = pCharacterPtr->getName();
|
||||
|
||||
columns[1]["column"] = "description";
|
||||
columns[1]["value"] = pCharacterPtr->getDescription();
|
||||
|
||||
columns[2]["column"] = "owner";
|
||||
columns[2]["value"] = getOwnerName(pCharacterPtr);
|
||||
|
||||
S32 cpuTime = llround(pCharacterPtr->getCPUTime());
|
||||
std::string cpuTimeString = llformat("%d", cpuTime);
|
||||
LLStringUtil::format_map_t string_args;
|
||||
string_args["[CPU_TIME]"] = cpuTimeString;
|
||||
|
||||
columns[3]["column"] = "cpu_time";
|
||||
columns[3]["value"] = getString("character_cpu_time", string_args);
|
||||
|
||||
columns[4]["column"] = "altitude";
|
||||
columns[4]["value"] = llformat("%1.0f m", pCharacterPtr->getLocation()[2]);
|
||||
|
||||
return columns;
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::updateStateOnDisplayControls()
|
||||
{
|
||||
int numSelectedItems = getNumSelectedObjects();;
|
||||
bool isEditEnabled = ((numSelectedItems == 1) && (LLPathingLib::getInstance() != NULL));
|
||||
|
||||
mShowPhysicsCapsuleCheckBox->setEnabled(isEditEnabled);
|
||||
if (!isEditEnabled)
|
||||
{
|
||||
setShowPhysicsCapsule(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::showSelectedCharacterCapsules()
|
||||
{
|
||||
// Hide any previous capsule
|
||||
hideCapsule();
|
||||
|
||||
// Get the only selected object, or set the selected object to null if we do not have exactly
|
||||
// one object selected
|
||||
if (getNumSelectedObjects() == 1)
|
||||
{
|
||||
LLPathfindingObjectPtr selectedObjectPtr = getFirstSelectedObject();
|
||||
mSelectedCharacterId = selectedObjectPtr->getUUID();
|
||||
}
|
||||
else
|
||||
{
|
||||
mSelectedCharacterId.setNull();
|
||||
}
|
||||
|
||||
// Show any capsule if enabled
|
||||
showCapsule();
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::showCapsule() const
|
||||
{
|
||||
if (mSelectedCharacterId.notNull() && isShowPhysicsCapsule())
|
||||
{
|
||||
LLPathfindingObjectPtr objectPtr = getFirstSelectedObject();
|
||||
llassert(objectPtr != NULL);
|
||||
if (objectPtr != NULL)
|
||||
{
|
||||
const LLPathfindingCharacter *character = dynamic_cast<const LLPathfindingCharacter *>(objectPtr.get());
|
||||
llassert(mSelectedCharacterId == character->getUUID());
|
||||
if (LLPathingLib::getInstance() != NULL)
|
||||
{
|
||||
LLPathingLib::getInstance()->createPhysicsCapsuleRep(character->getLength(), character->getRadius(),
|
||||
character->isHorizontal(), character->getUUID());
|
||||
}
|
||||
}
|
||||
|
||||
gPipeline.hideObject(mSelectedCharacterId);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingCharacters::hideCapsule() const
|
||||
{
|
||||
if (mSelectedCharacterId.notNull())
|
||||
{
|
||||
gPipeline.restoreHiddenObject(mSelectedCharacterId);
|
||||
}
|
||||
if (LLPathingLib::getInstance() != NULL)
|
||||
{
|
||||
LLPathingLib::getInstance()->cleanupPhysicsCapsuleRepResiduals();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLFloaterPathfindingCharacters::getCapsuleRenderData(LLVector3& pPosition, LLQuaternion& rot) const
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
// If we have a selected object, find the object on the viewer object list and return its
|
||||
// position. Else, return false indicating that we either do not have a selected object
|
||||
// or we cannot find the selected object on the viewer object list
|
||||
if (mSelectedCharacterId.notNull())
|
||||
{
|
||||
LLViewerObject *viewerObject = gObjectList.findObject(mSelectedCharacterId);
|
||||
if ( viewerObject != NULL )
|
||||
{
|
||||
rot = viewerObject->getRotation() ;
|
||||
pPosition = viewerObject->getRenderPosition();
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user