phoenix-firestorm/indra/newview/llfloaterpathfindingconsole...

215 lines
7.1 KiB
C++

/**
* @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 "llcheckboxctrl.h"
#include "llradiogroup.h"
#include "llnavmeshstation.h"
#include "llviewerregion.h"
#include "llpathinglib.h"
//---------------------------------------------------------------------------
// LLFloaterPathfindingConsole
//---------------------------------------------------------------------------
BOOL LLFloaterPathfindingConsole::postBuild()
{
childSetAction("view_and_edit_linksets", boost::bind(&LLFloaterPathfindingConsole::onViewEditLinksetClicked, this));
mShowNavmeshCheckBox = findChild<LLCheckBoxCtrl>("show_navmesh_overlay");
llassert(mShowNavmeshCheckBox != NULL);
mShowNavmeshCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowNavmeshToggle, this));
mShowExcludeVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_exclusion_volumes");
llassert(mShowExcludeVolumesCheckBox != NULL);
mShowExcludeVolumesCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowExcludeVolumesToggle, this));
mShowPathCheckBox = findChild<LLCheckBoxCtrl>("show_path");
llassert(mShowPathCheckBox != NULL);
mShowPathCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowPathToggle, this));
mShowWaterPlaneCheckBox = findChild<LLCheckBoxCtrl>("show_water_plane");
llassert(mShowWaterPlaneCheckBox != NULL);
mShowWaterPlaneCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWaterPlaneToggle, this));
mRegionOverlayDisplayRadioGroup = findChild<LLRadioGroup>("region_overlay_display");
llassert(mRegionOverlayDisplayRadioGroup != NULL);
mRegionOverlayDisplayRadioGroup->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onRegionOverlayDisplaySwitch, this));
return LLFloater::postBuild();
}
LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)
: LLFloater(pSeed),
mShowNavmeshCheckBox(NULL),
mShowExcludeVolumesCheckBox(NULL),
mShowPathCheckBox(NULL),
mShowWaterPlaneCheckBox(NULL),
mRegionOverlayDisplayRadioGroup(NULL),
mNavmeshDownloadObserver()
{
}
LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole()
{
}
void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey)
{
//make sure we have a pathing system
if ( !LLPathingLib::getInstance() )
{
LLPathingLib::initSystem();
}
//prep# test remove
//LLSD content;
//LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD( content );
//return true;
//prep# end test
if ( LLPathingLib::getInstance() == NULL )
{
llinfos<<"No implementation of pathing library."<<llendl;
}
else
{
//make sure the region is essentially enabled for navmesh support
std::string capability = "RetrieveNavMeshSrc";
std::string url = gAgent.getRegion()->getCapability( capability );
if ( !url.empty() )
{
llinfos<<"Region has required caps of type ["<<capability<<"]"<<llendl;
LLNavMeshStation::getInstance()->setNavMeshDownloadURL( url );
LLNavMeshStation::getInstance()->downloadNavMeshSrc( mNavmeshDownloadObserver.getObserverHandle() );
}
else
{
llinfos<<"Region has does not required caps of type ["<<capability<<"]"<<llendl;
}
}
}
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::onShowExcludeVolumesToggle()
{
BOOL checkBoxValue = mShowExcludeVolumesCheckBox->get();
LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
if (llPathingLibInstance != NULL)
{
llPathingLibInstance->setRenderNavMeshandShapes(checkBoxValue);
}
else
{
mShowExcludeVolumesCheckBox->set(FALSE);
llwarns << "cannot find LLPathingLib instance" << llendl;
}
}
void LLFloaterPathfindingConsole::onShowPathToggle()
{
BOOL checkBoxValue = mShowPathCheckBox->get();
llwarns << "functionality has not yet been implemented to toggle '"
<< mShowPathCheckBox->getLabel() << "' to "
<< (checkBoxValue ? "ON" : "OFF") << llendl;
}
void LLFloaterPathfindingConsole::onShowWaterPlaneToggle()
{
BOOL checkBoxValue = mShowWaterPlaneCheckBox->get();
llwarns << "functionality has not yet been implemented to toggle '"
<< mShowWaterPlaneCheckBox->getLabel() << "' to "
<< (checkBoxValue ? "ON" : "OFF") << llendl;
}
void LLFloaterPathfindingConsole::onRegionOverlayDisplaySwitch()
{
switch (getRegionOverlayDisplay())
{
case kRenderOverlayOnFixedPhysicsGeometry :
llwarns << "functionality has not yet been implemented to toggle '"
<< mRegionOverlayDisplayRadioGroup->getName() << "' to RenderOverlayOnFixedPhysicsGeometry"
<< llendl;
break;
case kRenderOverlayOnAllRenderableGeometry :
llwarns << "functionality has not yet been implemented to toggle '"
<< mRegionOverlayDisplayRadioGroup->getName() << "' to RenderOverlayOnAllRenderableGeometry"
<< llendl;
break;
default :
llassert(0);
break;
}
}
void LLFloaterPathfindingConsole::onViewEditLinksetClicked()
{
LLFloaterPathfindingLinksets::openLinksetsEditor();
}
LLFloaterPathfindingConsole::ERegionOverlayDisplay LLFloaterPathfindingConsole::getRegionOverlayDisplay() const
{
ERegionOverlayDisplay regionOverlayDisplay;
switch (mRegionOverlayDisplayRadioGroup->getSelectedIndex())
{
case 0 :
regionOverlayDisplay = kRenderOverlayOnFixedPhysicsGeometry;
break;
case 1:
regionOverlayDisplay = kRenderOverlayOnAllRenderableGeometry;
break;
default :
regionOverlayDisplay = kRenderOverlayOnFixedPhysicsGeometry;
break;
}
return regionOverlayDisplay;
}