From 16fa78b1499b6bb68f5038c124953046af690d6c Mon Sep 17 00:00:00 2001 From: Todd Stinson Date: Mon, 13 Feb 2012 17:58:19 -0800 Subject: PATH-284: Implementing the functionality for the new path generation of the new pathfinding console floater design. --- indra/newview/llfloaterpathfindingconsole.cpp | 967 +++++++++++---------- indra/newview/llfloaterpathfindingconsole.h | 31 +- indra/newview/llviewerwindow.cpp | 25 +- .../default/xui/en/floater_pathfinding_console.xml | 3 +- 4 files changed, 533 insertions(+), 493 deletions(-) (limited to 'indra') 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("show_navmesh"); - llassert(mShowNavMeshCheckBox != NULL); - mShowNavMeshCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowNavMeshToggle, this)); - - mShowWalkablesCheckBox = findChild("show_walkables"); - llassert(mShowWalkablesCheckBox != NULL); - mShowWalkablesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWalkablesToggle, this)); - - mShowStaticObstaclesCheckBox = findChild("show_static_obstacles"); - llassert(mShowStaticObstaclesCheckBox != NULL); - mShowStaticObstaclesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowStaticObstaclesToggle, this)); - - mShowMaterialVolumesCheckBox = findChild("show_material_volumes"); - llassert(mShowMaterialVolumesCheckBox != NULL); - mShowMaterialVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowMaterialVolumesToggle, this)); - - mShowExclusionVolumesCheckBox = findChild("show_exclusion_volumes"); - llassert(mShowExclusionVolumesCheckBox != NULL); - mShowExclusionVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowExclusionVolumesToggle, this)); - - mShowWorldCheckBox = findChild("show_world"); - llassert(mShowWorldCheckBox != NULL); - mShowWorldCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldToggle, this)); - - mPathfindingStatus = findChild("pathfinding_status"); - llassert(mPathfindingStatus != NULL); - - mCharacterWidthSlider = findChild("character_width"); - llassert(mCharacterWidthSlider != NULL); - mCharacterWidthSlider->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterWidthSet, this)); - - mCharacterTypeRadioGroup = findChild("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;isetText((LLStringExplicit)str, styleParams); - llwarns <<"Errror: cannout find pathing library implementation."<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 regions; - regions.push_back( pCurrentRegion ); - pCurrentRegion->getNeighboringRegions( regions ); - - std::vector 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; igetCapability( 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 ["<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::sInstanceHandle; + +//--------------------------------------------------------------------------- +// LLFloaterPathfindingConsole +//--------------------------------------------------------------------------- + +BOOL LLFloaterPathfindingConsole::postBuild() +{ + childSetAction("view_and_edit_linksets", boost::bind(&LLFloaterPathfindingConsole::onViewEditLinksetClicked, this)); + + mShowNavMeshCheckBox = findChild("show_navmesh"); + llassert(mShowNavMeshCheckBox != NULL); + mShowNavMeshCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowNavMeshToggle, this)); + + mShowWalkablesCheckBox = findChild("show_walkables"); + llassert(mShowWalkablesCheckBox != NULL); + mShowWalkablesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWalkablesToggle, this)); + + mShowStaticObstaclesCheckBox = findChild("show_static_obstacles"); + llassert(mShowStaticObstaclesCheckBox != NULL); + mShowStaticObstaclesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowStaticObstaclesToggle, this)); + + mShowMaterialVolumesCheckBox = findChild("show_material_volumes"); + llassert(mShowMaterialVolumesCheckBox != NULL); + mShowMaterialVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowMaterialVolumesToggle, this)); + + mShowExclusionVolumesCheckBox = findChild("show_exclusion_volumes"); + llassert(mShowExclusionVolumesCheckBox != NULL); + mShowExclusionVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowExclusionVolumesToggle, this)); + + mShowWorldCheckBox = findChild("show_world"); + llassert(mShowWorldCheckBox != NULL); + mShowWorldCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldToggle, this)); + + mPathfindingStatus = findChild("pathfinding_status"); + llassert(mPathfindingStatus != NULL); + + mEditTestTabContainer = findChild("edit_test_tab_container"); + llassert(mEditTestTabContainer != NULL); + + mCharacterWidthSlider = findChild("character_width"); + llassert(mCharacterWidthSlider != NULL); + mCharacterWidthSlider->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterWidthSet, this)); + + mCharacterTypeRadioGroup = findChild("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::getInstanceHandle() +{ + if (sInstanceHandle.isDead()) + { + LLFloaterPathfindingConsole *floaterInstance = LLFloaterReg::getTypedInstance("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;isetText((LLStringExplicit)str, styleParams); + llwarns <<"Errror: cannout find pathing library implementation."<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 regions; + regions.push_back( pCurrentRegion ); + pCurrentRegion->getNeighboringRegions( regions ); + + std::vector 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; igetCapability( 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 ["<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 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 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 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 pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle(); + if (!pathfindingConsoleHandle.isDead()) { - LLFloaterPathfindingConsole* pFloater = LLFloaterReg::getTypedInstance("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.