diff options
author | Todd Stinson <stinson@lindenlab.com> | 2012-02-13 17:58:19 -0800 |
---|---|---|
committer | Todd Stinson <stinson@lindenlab.com> | 2012-02-13 17:58:19 -0800 |
commit | 16fa78b1499b6bb68f5038c124953046af690d6c (patch) | |
tree | 722026f483d27cab444dc1377a41a47743464dd1 /indra/newview | |
parent | 06ec2607ce9db7cecee7c76b52cca5f263ef7402 (diff) |
PATH-284: Implementing the functionality for the new path generation of the new pathfinding console floater design.
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llfloaterpathfindingconsole.cpp | 967 | ||||
-rw-r--r-- | indra/newview/llfloaterpathfindingconsole.h | 31 | ||||
-rw-r--r-- | indra/newview/llviewerwindow.cpp | 25 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_pathfinding_console.xml | 3 |
4 files changed, 533 insertions, 493 deletions
diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp index ca39463b24..47bba82293 100644 --- a/indra/newview/llfloaterpathfindingconsole.cpp +++ b/indra/newview/llfloaterpathfindingconsole.cpp @@ -1,465 +1,502 @@ -/** -* @file llfloaterpathfindingconsole.cpp -* @author William Todd Stinson -* @brief "Pathfinding console" 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$ -*/ - -#include "llviewerprecompiledheaders.h" -#include "llfloaterpathfindingconsole.h" -#include "llfloaterpathfindinglinksets.h" - -#include "llsd.h" -#include "llagent.h" -#include "llbutton.h" -#include "llradiogroup.h" -#include "llsliderctrl.h" -#include "lllineeditor.h" -#include "lltextbase.h" -#include "lltextvalidate.h" -#include "llnavmeshstation.h" -#include "llviewerregion.h" - -#include "LLPathingLib.h" - -#define XUI_CHARACTER_TYPE_A 1 -#define XUI_CHARACTER_TYPE_B 2 -#define XUI_CHARACTER_TYPE_C 3 -#define XUI_CHARACTER_TYPE_D 4 - -const int CURRENT_REGION = 99; -const int MAX_OBSERVERS = 10; -//--------------------------------------------------------------------------- -// LLFloaterPathfindingConsole -//--------------------------------------------------------------------------- - -BOOL LLFloaterPathfindingConsole::postBuild() -{ - childSetAction("view_and_edit_linksets", boost::bind(&LLFloaterPathfindingConsole::onViewEditLinksetClicked, this)); - - mShowNavMeshCheckBox = findChild<LLCheckBoxCtrl>("show_navmesh"); - llassert(mShowNavMeshCheckBox != NULL); - mShowNavMeshCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowNavMeshToggle, this)); - - mShowWalkablesCheckBox = findChild<LLCheckBoxCtrl>("show_walkables"); - llassert(mShowWalkablesCheckBox != NULL); - mShowWalkablesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWalkablesToggle, this)); - - mShowStaticObstaclesCheckBox = findChild<LLCheckBoxCtrl>("show_static_obstacles"); - llassert(mShowStaticObstaclesCheckBox != NULL); - mShowStaticObstaclesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowStaticObstaclesToggle, this)); - - mShowMaterialVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_material_volumes"); - llassert(mShowMaterialVolumesCheckBox != NULL); - mShowMaterialVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowMaterialVolumesToggle, this)); - - mShowExclusionVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_exclusion_volumes"); - llassert(mShowExclusionVolumesCheckBox != NULL); - mShowExclusionVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowExclusionVolumesToggle, this)); - - mShowWorldCheckBox = findChild<LLCheckBoxCtrl>("show_world"); - llassert(mShowWorldCheckBox != NULL); - mShowWorldCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldToggle, this)); - - mPathfindingStatus = findChild<LLTextBase>("pathfinding_status"); - llassert(mPathfindingStatus != NULL); - - mCharacterWidthSlider = findChild<LLSliderCtrl>("character_width"); - llassert(mCharacterWidthSlider != NULL); - mCharacterWidthSlider->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterWidthSet, this)); - - mCharacterTypeRadioGroup = findChild<LLRadioGroup>("character_type"); - llassert(mCharacterTypeRadioGroup != NULL); - mCharacterTypeRadioGroup->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterTypeSwitch, this)); - - return LLFloater::postBuild(); -} - -F32 LLFloaterPathfindingConsole::getCharacterWidth() const -{ - return mCharacterWidthSlider->getValueF32(); -} - -void LLFloaterPathfindingConsole::setCharacterWidth(F32 pCharacterWidth) -{ - mCharacterWidthSlider->setValue(LLSD(pCharacterWidth)); -} - -LLFloaterPathfindingConsole::ECharacterType LLFloaterPathfindingConsole::getCharacterType() const -{ - ECharacterType characterType; - - switch (mCharacterTypeRadioGroup->getValue().asInteger()) - { - case XUI_CHARACTER_TYPE_A : - characterType = kCharacterTypeA; - break; - case XUI_CHARACTER_TYPE_B : - characterType = kCharacterTypeB; - break; - case XUI_CHARACTER_TYPE_C : - characterType = kCharacterTypeC; - break; - case XUI_CHARACTER_TYPE_D : - characterType = kCharacterTypeD; - break; - default : - characterType = kCharacterTypeA; - llassert(0); - break; - } - - return characterType; -} - -void LLFloaterPathfindingConsole::setCharacterType(ECharacterType pCharacterType) -{ - LLSD radioGroupValue; - - switch (pCharacterType) - { - case kCharacterTypeA : - radioGroupValue = XUI_CHARACTER_TYPE_A; - break; - case kCharacterTypeB : - radioGroupValue = XUI_CHARACTER_TYPE_B; - break; - case kCharacterTypeC : - radioGroupValue = XUI_CHARACTER_TYPE_C; - break; - case kCharacterTypeD : - radioGroupValue = XUI_CHARACTER_TYPE_D; - break; - default : - radioGroupValue = XUI_CHARACTER_TYPE_A; - llassert(0); - break; - } - - mCharacterTypeRadioGroup->setValue(radioGroupValue); -} - -void LLFloaterPathfindingConsole::setHasNavMeshReceived() -{ - std::string str = getString("navmesh_fetch_complete_available"); - mPathfindingStatus->setText((LLStringExplicit)str); - //check to see if all regions are done loading and they are then stitch the navmeshes together - --mNavMeshCnt; - if ( mNavMeshCnt == 0 ) - { - LLPathingLib::getInstance()->stitchNavMeshes(); - } -} - -void LLFloaterPathfindingConsole::setHasNoNavMesh() -{ - std::string str = getString("navmesh_fetch_complete_none"); - mPathfindingStatus->setText((LLStringExplicit)str); -} - -LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed) - : LLFloater(pSeed), - mShowNavMeshCheckBox(NULL), - mShowWalkablesCheckBox(NULL), - mShowStaticObstaclesCheckBox(NULL), - mShowMaterialVolumesCheckBox(NULL), - mShowExclusionVolumesCheckBox(NULL), - mShowWorldCheckBox(NULL), - mCharacterWidthSlider(NULL), - mCharacterTypeRadioGroup(NULL), - mPathfindingStatus(NULL), - mNavMeshCnt(0), - mHasStartPoint(false), - mHasEndPoint(false) -{ - for (int i=0;i<MAX_OBSERVERS;++i) - { - mNavMeshDownloadObserver[i].setPathfindingConsole(this); - } -} - -LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole() -{ -} - -void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey) -{ - //make sure we have a pathing system - if ( !LLPathingLib::getInstance() ) - { - LLPathingLib::initSystem(); - } - if ( LLPathingLib::getInstance() == NULL ) - { - std::string str = getString("navmesh_library_not_implemented"); - LLStyle::Params styleParams; - styleParams.color = LLUIColorTable::instance().getColor("DrYellow"); - mPathfindingStatus->setText((LLStringExplicit)str, styleParams); - llwarns <<"Errror: cannout find pathing library implementation."<<llendl; - } - else - { - LLPathingLib::getInstance()->cleanupResidual(); - - mCurrentMDO = 0; - mNavMeshCnt = 0; - - //make sure the region is essentially enabled for navmesh support - std::string capability = "RetrieveNavMeshSrc"; - - //prep# neighboring navmesh support proto - LLViewerRegion* pCurrentRegion = gAgent.getRegion(); - std::vector<LLViewerRegion*> regions; - regions.push_back( pCurrentRegion ); - pCurrentRegion->getNeighboringRegions( regions ); - - std::vector<int> shift; - shift.push_back( CURRENT_REGION ); - pCurrentRegion->getNeighboringRegionsStatus( shift ); - - //If the navmesh shift ops and the total region counts do not match - use the current region, only. - if ( shift.size() != regions.size() ) - { - shift.clear();regions.clear(); - regions.push_back( pCurrentRegion ); - shift.push_back( CURRENT_REGION ); - } - int regionCnt = regions.size(); - mNavMeshCnt = regionCnt; - for ( int i=0; i<regionCnt; ++i ) - { - std::string url = regions[i]->getCapability( capability ); - - if ( !url.empty() ) - { - std::string str = getString("navmesh_fetch_inprogress"); - mPathfindingStatus->setText((LLStringExplicit)str); - LLNavMeshStation::getInstance()->setNavMeshDownloadURL( url ); - int dir = shift[i]; - LLNavMeshStation::getInstance()->downloadNavMeshSrc( mNavMeshDownloadObserver[mCurrentMDO].getObserverHandle(), dir ); - ++mCurrentMDO; - } - else - { - --mNavMeshCnt; - std::string str = getString("navmesh_region_not_enabled"); - LLStyle::Params styleParams; - styleParams.color = LLUIColorTable::instance().getColor("DrYellow"); - mPathfindingStatus->setText((LLStringExplicit)str, styleParams); - llinfos<<"Region has does not required caps of type ["<<capability<<"]"<<llendl; - } - } - LLPathingLib::getInstance()->setRenderPath(true); - } -} - -void LLFloaterPathfindingConsole::onClose(bool app_quitting) -{ - //make sure we have a pathing system - if ( !LLPathingLib::getInstance() ) - { - LLPathingLib::getInstance()->setRenderPath(false); - } -} - -void LLFloaterPathfindingConsole::onShowNavMeshToggle() -{ - BOOL checkBoxValue = mShowNavMeshCheckBox->get(); - - LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance(); - if (llPathingLibInstance != NULL) - { - llPathingLibInstance->setRenderNavMesh(checkBoxValue); - } - else - { - mShowNavMeshCheckBox->set(FALSE); - llwarns << "cannot find LLPathingLib instance" << llendl; - } -} - -void LLFloaterPathfindingConsole::onShowWalkablesToggle() -{ - BOOL checkBoxValue = mShowWalkablesCheckBox->get(); - - LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance(); - if (llPathingLibInstance != NULL) - { - //llPathingLibInstance->setRenderNavMesh(checkBoxValue); - llwarns << "functionality has not yet been implemented to set walkables to " - << (checkBoxValue ? "TRUE" : "FALSE") << llendl; - - } - else - { - mShowWalkablesCheckBox->set(FALSE); - llwarns << "cannot find LLPathingLib instance" << llendl; - } -} - -void LLFloaterPathfindingConsole::onShowStaticObstaclesToggle() -{ - BOOL checkBoxValue = mShowStaticObstaclesCheckBox->get(); - - LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance(); - if (llPathingLibInstance != NULL) - { - //llPathingLibInstance->setRenderNavMesh(checkBoxValue); - llwarns << "functionality has not yet been implemented to set static obstacles to " - << (checkBoxValue ? "TRUE" : "FALSE") << llendl; - } - else - { - mShowStaticObstaclesCheckBox->set(FALSE); - llwarns << "cannot find LLPathingLib instance" << llendl; - } -} - -void LLFloaterPathfindingConsole::onShowMaterialVolumesToggle() -{ - BOOL checkBoxValue = mShowMaterialVolumesCheckBox->get(); - - LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance(); - if (llPathingLibInstance != NULL) - { - //llPathingLibInstance->setRenderNavMesh(checkBoxValue); - llwarns << "functionality has not yet been implemented to set material volumes to " - << (checkBoxValue ? "TRUE" : "FALSE") << llendl; - } - else - { - mShowMaterialVolumesCheckBox->set(FALSE); - llwarns << "cannot find LLPathingLib instance" << llendl; - } -} - -void LLFloaterPathfindingConsole::onShowExclusionVolumesToggle() -{ - BOOL checkBoxValue = mShowExclusionVolumesCheckBox->get(); - - LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance(); - if (llPathingLibInstance != NULL) - { - llPathingLibInstance->setRenderShapes(checkBoxValue); - } - else - { - mShowExclusionVolumesCheckBox->set(FALSE); - llwarns << "cannot find LLPathingLib instance" << llendl; - } -} - -void LLFloaterPathfindingConsole::onShowWorldToggle() -{ - BOOL checkBoxValue = mShowWorldCheckBox->get(); - - LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance(); - if (llPathingLibInstance != NULL) - { - llPathingLibInstance->setRenderOverlayMode(checkBoxValue); - } - else - { - mShowWorldCheckBox->set(FALSE); - llwarns << "cannot find LLPathingLib instance" << llendl; - } -} - -void LLFloaterPathfindingConsole::onCharacterWidthSet() -{ - generatePath(); -} - -void LLFloaterPathfindingConsole::onCharacterTypeSwitch() -{ - switch (getCharacterType()) - { - case kCharacterTypeA : - llwarns << "functionality has not yet been implemented to toggle '" - << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeA" - << llendl; - break; - case kCharacterTypeB : - llwarns << "functionality has not yet been implemented to toggle '" - << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeB" - << llendl; - break; - case kCharacterTypeC : - llwarns << "functionality has not yet been implemented to toggle '" - << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeC" - << llendl; - break; - case kCharacterTypeD : - llwarns << "functionality has not yet been implemented to toggle '" - << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeD" - << llendl; - break; - default : - llassert(0); - break; - } - -} - -void LLFloaterPathfindingConsole::onViewEditLinksetClicked() -{ - LLFloaterPathfindingLinksets::openLinksetsEditor(); -} - - -void LLFloaterPathfindingConsole::providePathingData( const LLVector3& point1, const LLVector3& point2 ) -{ -#if 0 - switch (getPathSelectionState()) - { - case kPathSelectNone : - break; - - case kPathSelectStartPoint : - mPathData.mStartPointA = point1; - mPathData.mEndPointA = point2; - mHasStartPoint = true; - break; - - case kPathSelectEndPoint : - mPathData.mStartPointB = point1; - mPathData.mEndPointB = point2; - mHasEndPoint = true; - break; - - default : - llassert(0); - break; - } -#endif - generatePath(); -} - -void LLFloaterPathfindingConsole::generatePath() -{ - if (mHasStartPoint && mHasEndPoint) - { - mPathData.mCharacterWidth = getCharacterWidth(); - LLPathingLib::getInstance()->generatePath(mPathData); - } -} +/**
+* @file llfloaterpathfindingconsole.cpp
+* @author William Todd Stinson
+* @brief "Pathfinding console" 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$
+*/
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterpathfindingconsole.h"
+#include "llfloaterpathfindinglinksets.h"
+
+#include "llsd.h"
+#include "llhandle.h"
+#include "llagent.h"
+#include "llbutton.h"
+#include "llradiogroup.h"
+#include "llsliderctrl.h"
+#include "lllineeditor.h"
+#include "lltextbase.h"
+#include "lltabcontainer.h"
+#include "llnavmeshstation.h"
+#include "llfloaterreg.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llviewercamera.h"
+
+#include "LLPathingLib.h"
+
+#define XUI_CHARACTER_TYPE_A 1
+#define XUI_CHARACTER_TYPE_B 2
+#define XUI_CHARACTER_TYPE_C 3
+#define XUI_CHARACTER_TYPE_D 4
+
+const int CURRENT_REGION = 99;
+const int MAX_OBSERVERS = 10;
+
+LLHandle<LLFloaterPathfindingConsole> LLFloaterPathfindingConsole::sInstanceHandle;
+
+//---------------------------------------------------------------------------
+// LLFloaterPathfindingConsole
+//---------------------------------------------------------------------------
+
+BOOL LLFloaterPathfindingConsole::postBuild()
+{
+ childSetAction("view_and_edit_linksets", boost::bind(&LLFloaterPathfindingConsole::onViewEditLinksetClicked, this));
+
+ mShowNavMeshCheckBox = findChild<LLCheckBoxCtrl>("show_navmesh");
+ llassert(mShowNavMeshCheckBox != NULL);
+ mShowNavMeshCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowNavMeshToggle, this));
+
+ mShowWalkablesCheckBox = findChild<LLCheckBoxCtrl>("show_walkables");
+ llassert(mShowWalkablesCheckBox != NULL);
+ mShowWalkablesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWalkablesToggle, this));
+
+ mShowStaticObstaclesCheckBox = findChild<LLCheckBoxCtrl>("show_static_obstacles");
+ llassert(mShowStaticObstaclesCheckBox != NULL);
+ mShowStaticObstaclesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowStaticObstaclesToggle, this));
+
+ mShowMaterialVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_material_volumes");
+ llassert(mShowMaterialVolumesCheckBox != NULL);
+ mShowMaterialVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowMaterialVolumesToggle, this));
+
+ mShowExclusionVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_exclusion_volumes");
+ llassert(mShowExclusionVolumesCheckBox != NULL);
+ mShowExclusionVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowExclusionVolumesToggle, this));
+
+ mShowWorldCheckBox = findChild<LLCheckBoxCtrl>("show_world");
+ llassert(mShowWorldCheckBox != NULL);
+ mShowWorldCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldToggle, this));
+
+ mPathfindingStatus = findChild<LLTextBase>("pathfinding_status");
+ llassert(mPathfindingStatus != NULL);
+
+ mEditTestTabContainer = findChild<LLTabContainer>("edit_test_tab_container");
+ llassert(mEditTestTabContainer != NULL);
+
+ mCharacterWidthSlider = findChild<LLSliderCtrl>("character_width");
+ llassert(mCharacterWidthSlider != NULL);
+ mCharacterWidthSlider->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterWidthSet, this));
+
+ mCharacterTypeRadioGroup = findChild<LLRadioGroup>("character_type");
+ llassert(mCharacterTypeRadioGroup != NULL);
+ mCharacterTypeRadioGroup->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterTypeSwitch, this));
+
+ return LLFloater::postBuild();
+}
+
+BOOL LLFloaterPathfindingConsole::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
+{
+ if (down && (clicktype == LLMouseHandler::CLICK_LEFT) &&
+ (((mask & MASK_CONTROL) && !(mask & (~MASK_CONTROL))) ||
+ ((mask & MASK_SHIFT) && !(mask & (~MASK_SHIFT)))))
+ {
+ LLVector3 dv = gViewerWindow->mouseDirectionGlobal(x, y);
+ LLVector3 mousePos = LLViewerCamera::getInstance()->getOrigin();
+ LLVector3 rayStart = mousePos;
+ LLVector3 rayEnd = mousePos + dv * 150;
+
+ if (mask & MASK_CONTROL)
+ {
+ mPathData.mStartPointA = rayStart;
+ mPathData.mEndPointA = rayEnd;
+ mHasStartPoint = true;
+ }
+ else if (mask & MASK_SHIFT)
+ {
+ mPathData.mStartPointB = rayStart;
+ mPathData.mEndPointB = rayEnd;
+ mHasEndPoint = true;
+ }
+ generatePath();
+
+ return TRUE;
+ }
+ else
+ {
+ return LLFloater::handleAnyMouseClick(x, y, mask, clicktype, down);
+ }
+}
+
+BOOL LLFloaterPathfindingConsole::isGeneratePathMode() const
+{
+ return (getVisible() && (mEditTestTabContainer->getCurrentPanelIndex() == 1));
+}
+
+LLHandle<LLFloaterPathfindingConsole> LLFloaterPathfindingConsole::getInstanceHandle()
+{
+ if (sInstanceHandle.isDead())
+ {
+ LLFloaterPathfindingConsole *floaterInstance = LLFloaterReg::getTypedInstance<LLFloaterPathfindingConsole>("pathfinding_console");
+ if (floaterInstance != NULL)
+ {
+ sInstanceHandle = floaterInstance->mSelfHandle;
+ }
+ }
+
+ return sInstanceHandle;
+}
+
+F32 LLFloaterPathfindingConsole::getCharacterWidth() const
+{
+ return mCharacterWidthSlider->getValueF32();
+}
+
+void LLFloaterPathfindingConsole::setCharacterWidth(F32 pCharacterWidth)
+{
+ mCharacterWidthSlider->setValue(LLSD(pCharacterWidth));
+}
+
+LLFloaterPathfindingConsole::ECharacterType LLFloaterPathfindingConsole::getCharacterType() const
+{
+ ECharacterType characterType;
+
+ switch (mCharacterTypeRadioGroup->getValue().asInteger())
+ {
+ case XUI_CHARACTER_TYPE_A :
+ characterType = kCharacterTypeA;
+ break;
+ case XUI_CHARACTER_TYPE_B :
+ characterType = kCharacterTypeB;
+ break;
+ case XUI_CHARACTER_TYPE_C :
+ characterType = kCharacterTypeC;
+ break;
+ case XUI_CHARACTER_TYPE_D :
+ characterType = kCharacterTypeD;
+ break;
+ default :
+ characterType = kCharacterTypeA;
+ llassert(0);
+ break;
+ }
+
+ return characterType;
+}
+
+void LLFloaterPathfindingConsole::setCharacterType(ECharacterType pCharacterType)
+{
+ LLSD radioGroupValue;
+
+ switch (pCharacterType)
+ {
+ case kCharacterTypeA :
+ radioGroupValue = XUI_CHARACTER_TYPE_A;
+ break;
+ case kCharacterTypeB :
+ radioGroupValue = XUI_CHARACTER_TYPE_B;
+ break;
+ case kCharacterTypeC :
+ radioGroupValue = XUI_CHARACTER_TYPE_C;
+ break;
+ case kCharacterTypeD :
+ radioGroupValue = XUI_CHARACTER_TYPE_D;
+ break;
+ default :
+ radioGroupValue = XUI_CHARACTER_TYPE_A;
+ llassert(0);
+ break;
+ }
+
+ mCharacterTypeRadioGroup->setValue(radioGroupValue);
+}
+
+void LLFloaterPathfindingConsole::setHasNavMeshReceived()
+{
+ std::string str = getString("navmesh_fetch_complete_available");
+ mPathfindingStatus->setText((LLStringExplicit)str);
+ //check to see if all regions are done loading and they are then stitch the navmeshes together
+ --mNavMeshCnt;
+ if ( mNavMeshCnt == 0 )
+ {
+ LLPathingLib::getInstance()->stitchNavMeshes();
+ }
+}
+
+void LLFloaterPathfindingConsole::setHasNoNavMesh()
+{
+ std::string str = getString("navmesh_fetch_complete_none");
+ mPathfindingStatus->setText((LLStringExplicit)str);
+}
+
+LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)
+ : LLFloater(pSeed),
+ mSelfHandle(),
+ mShowNavMeshCheckBox(NULL),
+ mShowWalkablesCheckBox(NULL),
+ mShowStaticObstaclesCheckBox(NULL),
+ mShowMaterialVolumesCheckBox(NULL),
+ mShowExclusionVolumesCheckBox(NULL),
+ mShowWorldCheckBox(NULL),
+ mPathfindingStatus(NULL),
+ mEditTestTabContainer(NULL),
+ mCharacterWidthSlider(NULL),
+ mCharacterTypeRadioGroup(NULL),
+ mNavMeshCnt(0),
+ mHasStartPoint(false),
+ mHasEndPoint(false)
+{
+ mSelfHandle.bind(this);
+
+ for (int i=0;i<MAX_OBSERVERS;++i)
+ {
+ mNavMeshDownloadObserver[i].setPathfindingConsole(this);
+ }
+}
+
+LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole()
+{
+}
+
+void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey)
+{
+ //make sure we have a pathing system
+ if ( !LLPathingLib::getInstance() )
+ {
+ LLPathingLib::initSystem();
+ }
+ if ( LLPathingLib::getInstance() == NULL )
+ {
+ std::string str = getString("navmesh_library_not_implemented");
+ LLStyle::Params styleParams;
+ styleParams.color = LLUIColorTable::instance().getColor("DrYellow");
+ mPathfindingStatus->setText((LLStringExplicit)str, styleParams);
+ llwarns <<"Errror: cannout find pathing library implementation."<<llendl;
+ }
+ else
+ {
+ LLPathingLib::getInstance()->cleanupResidual();
+
+ mCurrentMDO = 0;
+ mNavMeshCnt = 0;
+
+ //make sure the region is essentially enabled for navmesh support
+ std::string capability = "RetrieveNavMeshSrc";
+
+ //prep# neighboring navmesh support proto
+ LLViewerRegion* pCurrentRegion = gAgent.getRegion();
+ std::vector<LLViewerRegion*> regions;
+ regions.push_back( pCurrentRegion );
+ pCurrentRegion->getNeighboringRegions( regions );
+
+ std::vector<int> shift;
+ shift.push_back( CURRENT_REGION );
+ pCurrentRegion->getNeighboringRegionsStatus( shift );
+
+ //If the navmesh shift ops and the total region counts do not match - use the current region, only.
+ if ( shift.size() != regions.size() )
+ {
+ shift.clear();regions.clear();
+ regions.push_back( pCurrentRegion );
+ shift.push_back( CURRENT_REGION );
+ }
+ int regionCnt = regions.size();
+ mNavMeshCnt = regionCnt;
+ for ( int i=0; i<regionCnt; ++i )
+ {
+ std::string url = regions[i]->getCapability( capability );
+
+ if ( !url.empty() )
+ {
+ std::string str = getString("navmesh_fetch_inprogress");
+ mPathfindingStatus->setText((LLStringExplicit)str);
+ LLNavMeshStation::getInstance()->setNavMeshDownloadURL( url );
+ int dir = shift[i];
+ LLNavMeshStation::getInstance()->downloadNavMeshSrc( mNavMeshDownloadObserver[mCurrentMDO].getObserverHandle(), dir );
+ ++mCurrentMDO;
+ }
+ else
+ {
+ --mNavMeshCnt;
+ std::string str = getString("navmesh_region_not_enabled");
+ LLStyle::Params styleParams;
+ styleParams.color = LLUIColorTable::instance().getColor("DrYellow");
+ mPathfindingStatus->setText((LLStringExplicit)str, styleParams);
+ llinfos<<"Region has does not required caps of type ["<<capability<<"]"<<llendl;
+ }
+ }
+ LLPathingLib::getInstance()->setRenderPath(true);
+ }
+}
+
+void LLFloaterPathfindingConsole::onClose(bool app_quitting)
+{
+ //make sure we have a pathing system
+ if ( !LLPathingLib::getInstance() )
+ {
+ LLPathingLib::getInstance()->setRenderPath(false);
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowNavMeshToggle()
+{
+ BOOL checkBoxValue = mShowNavMeshCheckBox->get();
+
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if (llPathingLibInstance != NULL)
+ {
+ llPathingLibInstance->setRenderNavMesh(checkBoxValue);
+ }
+ else
+ {
+ mShowNavMeshCheckBox->set(FALSE);
+ llwarns << "cannot find LLPathingLib instance" << llendl;
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowWalkablesToggle()
+{
+ BOOL checkBoxValue = mShowWalkablesCheckBox->get();
+
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if (llPathingLibInstance != NULL)
+ {
+ //llPathingLibInstance->setRenderNavMesh(checkBoxValue);
+ llwarns << "functionality has not yet been implemented to set walkables to "
+ << (checkBoxValue ? "TRUE" : "FALSE") << llendl;
+
+ }
+ else
+ {
+ mShowWalkablesCheckBox->set(FALSE);
+ llwarns << "cannot find LLPathingLib instance" << llendl;
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowStaticObstaclesToggle()
+{
+ BOOL checkBoxValue = mShowStaticObstaclesCheckBox->get();
+
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if (llPathingLibInstance != NULL)
+ {
+ //llPathingLibInstance->setRenderNavMesh(checkBoxValue);
+ llwarns << "functionality has not yet been implemented to set static obstacles to "
+ << (checkBoxValue ? "TRUE" : "FALSE") << llendl;
+ }
+ else
+ {
+ mShowStaticObstaclesCheckBox->set(FALSE);
+ llwarns << "cannot find LLPathingLib instance" << llendl;
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowMaterialVolumesToggle()
+{
+ BOOL checkBoxValue = mShowMaterialVolumesCheckBox->get();
+
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if (llPathingLibInstance != NULL)
+ {
+ //llPathingLibInstance->setRenderNavMesh(checkBoxValue);
+ llwarns << "functionality has not yet been implemented to set material volumes to "
+ << (checkBoxValue ? "TRUE" : "FALSE") << llendl;
+ }
+ else
+ {
+ mShowMaterialVolumesCheckBox->set(FALSE);
+ llwarns << "cannot find LLPathingLib instance" << llendl;
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowExclusionVolumesToggle()
+{
+ BOOL checkBoxValue = mShowExclusionVolumesCheckBox->get();
+
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if (llPathingLibInstance != NULL)
+ {
+ llPathingLibInstance->setRenderShapes(checkBoxValue);
+ }
+ else
+ {
+ mShowExclusionVolumesCheckBox->set(FALSE);
+ llwarns << "cannot find LLPathingLib instance" << llendl;
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowWorldToggle()
+{
+ BOOL checkBoxValue = mShowWorldCheckBox->get();
+
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if (llPathingLibInstance != NULL)
+ {
+ llPathingLibInstance->setRenderOverlayMode(checkBoxValue);
+ }
+ else
+ {
+ mShowWorldCheckBox->set(FALSE);
+ llwarns << "cannot find LLPathingLib instance" << llendl;
+ }
+}
+
+void LLFloaterPathfindingConsole::onCharacterWidthSet()
+{
+ generatePath();
+}
+
+void LLFloaterPathfindingConsole::onCharacterTypeSwitch()
+{
+ switch (getCharacterType())
+ {
+ case kCharacterTypeA :
+ llwarns << "functionality has not yet been implemented to toggle '"
+ << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeA"
+ << llendl;
+ break;
+ case kCharacterTypeB :
+ llwarns << "functionality has not yet been implemented to toggle '"
+ << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeB"
+ << llendl;
+ break;
+ case kCharacterTypeC :
+ llwarns << "functionality has not yet been implemented to toggle '"
+ << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeC"
+ << llendl;
+ break;
+ case kCharacterTypeD :
+ llwarns << "functionality has not yet been implemented to toggle '"
+ << mCharacterTypeRadioGroup->getName() << "' to CharacterTypeD"
+ << llendl;
+ break;
+ default :
+ llassert(0);
+ break;
+ }
+
+}
+
+void LLFloaterPathfindingConsole::onViewEditLinksetClicked()
+{
+ LLFloaterPathfindingLinksets::openLinksetsEditor();
+}
+
+void LLFloaterPathfindingConsole::generatePath()
+{
+ if (mHasStartPoint && mHasEndPoint)
+ {
+ mPathData.mCharacterWidth = getCharacterWidth();
+ LLPathingLib::getInstance()->generatePath(mPathData);
+ }
+}
diff --git a/indra/newview/llfloaterpathfindingconsole.h b/indra/newview/llfloaterpathfindingconsole.h index a2e247c1c9..5a7edeb126 100644 --- a/indra/newview/llfloaterpathfindingconsole.h +++ b/indra/newview/llfloaterpathfindingconsole.h @@ -29,6 +29,7 @@ #define LL_LLFLOATERPATHFINDINGCONSOLE_H #include "llfloater.h" +#include "llhandle.h" #include "llnavmeshstation.h" #include "LLPathingLib.h" @@ -38,6 +39,7 @@ class LLSliderCtrl; class LLLineEditor; class LLTextBase; class LLCheckBoxCtrl; +class LLTabContainer; class LLFloaterPathfindingConsole : public LLFloater @@ -54,8 +56,11 @@ public: } ECharacterType; virtual BOOL postBuild(); - //Populates a data packet that is forwarded onto the LLPathingSystem - void providePathingData( const LLVector3& point1, const LLVector3& point2 ); + virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down); + + BOOL isGeneratePathMode() const; + + static LLHandle<LLFloaterPathfindingConsole> getInstanceHandle(); F32 getCharacterWidth() const; void setCharacterWidth(F32 pCharacterWidth); @@ -88,15 +93,17 @@ private: void onViewEditLinksetClicked(); void generatePath(); - LLCheckBoxCtrl *mShowNavMeshCheckBox; - LLCheckBoxCtrl *mShowWalkablesCheckBox; - LLCheckBoxCtrl *mShowStaticObstaclesCheckBox; - LLCheckBoxCtrl *mShowMaterialVolumesCheckBox; - LLCheckBoxCtrl *mShowExclusionVolumesCheckBox; - LLCheckBoxCtrl *mShowWorldCheckBox; - LLSliderCtrl *mCharacterWidthSlider; - LLRadioGroup *mCharacterTypeRadioGroup; - LLTextBase *mPathfindingStatus; + LLRootHandle<LLFloaterPathfindingConsole> mSelfHandle; + LLCheckBoxCtrl *mShowNavMeshCheckBox; + LLCheckBoxCtrl *mShowWalkablesCheckBox; + LLCheckBoxCtrl *mShowStaticObstaclesCheckBox; + LLCheckBoxCtrl *mShowMaterialVolumesCheckBox; + LLCheckBoxCtrl *mShowExclusionVolumesCheckBox; + LLCheckBoxCtrl *mShowWorldCheckBox; + LLTextBase *mPathfindingStatus; + LLTabContainer *mEditTestTabContainer; + LLSliderCtrl *mCharacterWidthSlider; + LLRadioGroup *mCharacterTypeRadioGroup; LLNavMeshDownloadObserver mNavMeshDownloadObserver[10]; int mCurrentMDO; @@ -106,6 +113,8 @@ private: LLPathingLib::PathingPacket mPathData; bool mHasStartPoint; bool mHasEndPoint; + + static LLHandle<LLFloaterPathfindingConsole> sInstanceHandle; }; #endif // LL_LLFLOATERPATHFINDINGCONSOLE_H diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 33d959f8de..e60bc66e82 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -952,25 +952,19 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK } } - //Determine if we have a pathing system and subsequently provide any mouse input - if ( LLPathingLib::getInstance() && mLeftMouseDown == down ) + if ((LLPathingLib::getInstance() != NULL) && + (clicktype == LLMouseHandler::CLICK_LEFT) && down && + (((mask & MASK_CONTROL) && !(mask & (~MASK_CONTROL))) || + ((mask & MASK_SHIFT) && !(mask & (~MASK_SHIFT))))) { - LLVector3 dv = mouseDirectionGlobal(x,y); - LLVector3 mousePos = LLViewerCamera::getInstance()->getOrigin(); - LLVector3 rayStart = mousePos; - LLVector3 rayEnd = mousePos + dv * 150; - - //Determine if alt is being held in conjunction with a lmb click, if alt is being held - //then do not provide any input to the pathingLib console - MASK currentKeyMask = gKeyboard->currentMask(TRUE); - if ( !(currentKeyMask & MASK_ALT) ) + LLHandle<LLFloaterPathfindingConsole> pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle(); + if (!pathfindingConsoleHandle.isDead()) { - LLFloaterPathfindingConsole* pFloater = LLFloaterReg::getTypedInstance<LLFloaterPathfindingConsole>("pathfinding_console"); - if ( pFloater ) + LLFloaterPathfindingConsole *pathfindingConsoleFloater = pathfindingConsoleHandle.get(); + if (pathfindingConsoleFloater->isGeneratePathMode()) { - //The floater takes care of determining what stage - essentially where the data goes into the pathing packet(start or end) - pFloater->providePathingData( rayStart, rayEnd ); + return pathfindingConsoleFloater->handleAnyMouseClick(x, y, mask, clicktype, down); } } } @@ -981,7 +975,6 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK return TRUE; } - // If we got this far on a down-click, it wasn't handled. // Up-clicks, though, are always handled as far as the OS is concerned. BOOL default_rtn = !down; diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml index c0588c9931..7822d0afcb 100644 --- a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml @@ -127,6 +127,7 @@ follows="left|top" layout="topleft" tab_position="top" + name="edit_test_tab_container" left="220" top="20" height="230" @@ -349,7 +350,7 @@ layout="topleft" top_pad="5" width="190"> - Alt-click to select start point. + Shift-click to select end point. </text> <text height="14" |